product.spp
product/product.spp
Download original file · Petstore source contents
1domain product;23Entity Product {4business("Product catalogue number") String productCode;5String name;6String category;7String description;8BigDecimal(9, 2) cost;9}1011Role CatalogProduct {12business("Catalogue lookup number, identical to the product catalogue number") String sku;13boolean active;14}1516take Product as CatalogProduct {17takeall;18String sku = productCode;19}2021Contract ProductCatalogueOpeningAgreement {22CatalogProduct[] products;23}2425Contract ProductRevisionAgreement {26Product product;27String name;28String category;29String description;30BigDecimal(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[]) {48for (CatalogProduct product : CatalogProduct[]) {49switch (product.sku) {50case "CAT-001":51product.category = CAT_CATEGORY;52product.name = CAT_NAME;53product.description = CAT_DESCRIPTION;54break;55case "FOOD-001":56product.category = FOOD_CATEGORY;57product.name = FOOD_NAME;58product.description = FOOD_DESCRIPTION;59break;60case "TOY-001":61product.category = TOY_CATEGORY;62product.name = TOY_NAME;63product.description = TOY_DESCRIPTION;64break;65case "DOG-001":66product.category = DOG_CATEGORY;67product.name = DOG_NAME;68product.description = DOG_DESCRIPTION;69break;70}71}72}7374atomic calculate configureCatalogueSelection(CatalogProduct) {75CatalogProduct.active = true;76}7778atomic calculate initializeProductCatalogue(CatalogProduct[], Product[], ProductCatalogueOpeningAgreement) {79CatalogProduct[] = new CatalogProduct[] {80new CatalogProduct(),81new CatalogProduct(),82new CatalogProduct(),83new CatalogProduct()84};85int index = 0;86for (CatalogProduct product : CatalogProduct[]) {87product.active = true;88switch (index) {89case 0:90product.sku = "CAT-001";91product.name = CAT_NAME;92product.category = CAT_CATEGORY;93product.description = CAT_DESCRIPTION;94product.cost = 800;95break;96case 1:97product.sku = "FOOD-001";98product.name = FOOD_NAME;99product.category = FOOD_CATEGORY;100product.description = FOOD_DESCRIPTION;101product.cost = 20;102break;103case 2:104product.sku = "TOY-001";105product.name = TOY_NAME;106product.category = TOY_CATEGORY;107product.description = TOY_DESCRIPTION;108product.cost = 8;109break;110default:111product.sku = "DOG-001";112product.name = DOG_NAME;113product.category = DOG_CATEGORY;114product.description = DOG_DESCRIPTION;115product.cost = 1200;116}117index++;118}119Product[] = new Product[] {120new Product(),121new Product(),122new Product(),123new Product()124};125126index = 0;127for (Product root : Product[]) {128switch (index) {129case 0:130root.productCode = "CAT-001";131break;132case 1:133root.productCode = "FOOD-001";134break;135case 2:136root.productCode = "TOY-001";137break;138default:139root.productCode = "DOG-001";140}141for (CatalogProduct product : CatalogProduct[]) {142if (product.sku == root.productCode) {143root.name = product.name;144root.category = product.category;145root.description = product.description;146root.cost = product.cost;147}148}149index++;150}151ProductCatalogueOpeningAgreement.products = CatalogProduct[];152}153154Scenario serial initializeProductDomain(155CatalogProduct,156CatalogProduct[],157Product[],158ProductCatalogueOpeningAgreement159) {160configureCatalogueSelection;161listCatalogue;162if (CatalogProduct[].length == 0) {163initializeProductCatalogue;164transaction {165insertProduct;166insertCatalogProduct(CatalogProduct[]);167}168}169}170171atomic calculate applyProductRevision(Product, ProductRevisionAgreement) {172Product.name = ProductRevisionAgreement.name;173Product.category = ProductRevisionAgreement.category;174Product.description = ProductRevisionAgreement.description;175Product.cost = ProductRevisionAgreement.cost;176ProductRevisionAgreement.product = Product;177}178179atomic check checkProductFacts(Product) {180require(Product.cost >= 0, "INVALID_PRODUCT_COST");181require(Product.name != null && Product.name != "", "PRODUCT_NAME_REQUIRED");182}183184Scenario serial reviseProduct(Product, ProductRevisionAgreement) {185findProduct;186identify(Product);187applyProductRevision;188checkProductFacts;189transaction {190updateProduct;191}192}