S++Business systems language
DEMO SOURCE · SPP / APP / PHYRead the book

product.spp

product/product.spp

Download original file · Petstore source contents

1domain product;23Entity Product {4    business("Product catalogue number") String productCode;5    String name;6    String category;7    String description;8    BigDecimal(9, 2) cost;9}1011Role CatalogProduct {12    business("Catalogue lookup number, identical to the product catalogue number") String sku;13    boolean active;14}1516take Product as CatalogProduct {17    takeall;18    String sku = productCode;19}2021Contract ProductCatalogueOpeningAgreement {22    CatalogProduct[] products;23}2425Contract ProductRevisionAgreement {26    Product product;27    String name;28    String category;29    String description;30    BigDecimal(9, 2) cost;31}3233atomic query listCatalogue(CatalogProduct, CatalogProduct[]);34const String CAT_CATEGORY = "Cats";35const String CAT_NAME = "British Shorthair";36const String CAT_DESCRIPTION = "Health checked; adoption handover is arranged by the shop";37const String FOOD_CATEGORY = "Food";38const String FOOD_NAME = "Everyday cat food";39const String FOOD_DESCRIPTION = "Everyday pet food; demo price USD 29.90";40const String TOY_CATEGORY = "Accessories";41const String TOY_NAME = "Cat teaser wand";42const String TOY_DESCRIPTION = "Interactive toy for a multi-product shopping cart";43const String DOG_CATEGORY = "Dogs";44const String DOG_NAME = "Corgi puppy";45const String DOG_DESCRIPTION = "Shop handover; limited demo stock";4647atomic calculate localizeProductLabels(CatalogProduct[]) {48    for (CatalogProduct product : CatalogProduct[]) {49        switch (product.sku) {50            case "CAT-001":51                product.category = CAT_CATEGORY;52                product.name = CAT_NAME;53                product.description = CAT_DESCRIPTION;54                break;55            case "FOOD-001":56                product.category = FOOD_CATEGORY;57                product.name = FOOD_NAME;58                product.description = FOOD_DESCRIPTION;59                break;60            case "TOY-001":61                product.category = TOY_CATEGORY;62                product.name = TOY_NAME;63                product.description = TOY_DESCRIPTION;64                break;65            case "DOG-001":66                product.category = DOG_CATEGORY;67                product.name = DOG_NAME;68                product.description = DOG_DESCRIPTION;69                break;70        }71    }72}7374atomic calculate configureCatalogueSelection(CatalogProduct) {75    CatalogProduct.active = true;76}7778atomic calculate initializeProductCatalogue(CatalogProduct[], Product[], ProductCatalogueOpeningAgreement) {79    CatalogProduct[] = new CatalogProduct[] {80        new CatalogProduct(),81        new CatalogProduct(),82        new CatalogProduct(),83        new CatalogProduct()84    };85    int index = 0;86    for (CatalogProduct product : CatalogProduct[]) {87        product.active = true;88        switch (index) {89            case 0:90                product.sku = "CAT-001";91                product.name = CAT_NAME;92                product.category = CAT_CATEGORY;93                product.description = CAT_DESCRIPTION;94                product.cost = 800;95                break;96            case 1:97                product.sku = "FOOD-001";98                product.name = FOOD_NAME;99                product.category = FOOD_CATEGORY;100                product.description = FOOD_DESCRIPTION;101                product.cost = 20;102                break;103            case 2:104                product.sku = "TOY-001";105                product.name = TOY_NAME;106                product.category = TOY_CATEGORY;107                product.description = TOY_DESCRIPTION;108                product.cost = 8;109                break;110            default:111                product.sku = "DOG-001";112                product.name = DOG_NAME;113                product.category = DOG_CATEGORY;114                product.description = DOG_DESCRIPTION;115                product.cost = 1200;116        }117        index++;118    }119    Product[] = new Product[] {120        new Product(),121        new Product(),122        new Product(),123        new Product()124    };125126    index = 0;127    for (Product root : Product[]) {128        switch (index) {129            case 0:130                root.productCode = "CAT-001";131                break;132            case 1:133                root.productCode = "FOOD-001";134                break;135            case 2:136                root.productCode = "TOY-001";137                break;138            default:139                root.productCode = "DOG-001";140        }141        for (CatalogProduct product : CatalogProduct[]) {142            if (product.sku == root.productCode) {143                root.name = product.name;144                root.category = product.category;145                root.description = product.description;146                root.cost = product.cost;147            }148        }149        index++;150    }151    ProductCatalogueOpeningAgreement.products = CatalogProduct[];152}153154Scenario serial initializeProductDomain(155    CatalogProduct,156    CatalogProduct[],157    Product[],158    ProductCatalogueOpeningAgreement159) {160    configureCatalogueSelection;161    listCatalogue;162    if (CatalogProduct[].length == 0) {163        initializeProductCatalogue;164        transaction {165            insertProduct;166            insertCatalogProduct(CatalogProduct[]);167        }168    }169}170171atomic calculate applyProductRevision(Product, ProductRevisionAgreement) {172    Product.name = ProductRevisionAgreement.name;173    Product.category = ProductRevisionAgreement.category;174    Product.description = ProductRevisionAgreement.description;175    Product.cost = ProductRevisionAgreement.cost;176    ProductRevisionAgreement.product = Product;177}178179atomic check checkProductFacts(Product) {180    require(Product.cost >= 0, "INVALID_PRODUCT_COST");181    require(Product.name != null && Product.name != "", "PRODUCT_NAME_REQUIRED");182}183184Scenario serial reviseProduct(Product, ProductRevisionAgreement) {185    findProduct;186    identify(Product);187    applyProductRevision;188    checkProductFacts;189    transaction {190        updateProduct;191    }192}