PrestaShop Architecture
prestashop · whole model (11 arch files)
Diagram
Context mapContext map of prestashop · blueprint v2.8 covering the whole model (11 arch files): 12 bounded contexts, 0 outside the selection, 16 dependencies, 12 of them carrying derived contract traffic over 12 service-to-service edges. 12 cross-context policy binding(s), 4 of them named in the hover of 3 edge(s); 8 in no hover because no edge makes the owning context downstream of the trigger's - a model inconsistency: Modules reacts to Content (3), Catalog reacts to Checkout (2), Shop reacts to Catalog (2), Catalog reacts to Orders (1).Context mapprestashopwhole model · 11 arch file(s) · 12 context(s) · 13 service(s) · 16 dependencies · 0 outsideNot shown: 2 of 12 edge labels had no free spot beside their edge.customer-supplier · Prices every product through International's tax model in the same process: Product::priceCalculation asks TaxManagerFactory::getManager for the product's tax rules group (classes/Product.php:3727). Customer-supplier because Catalog consumes the tax and currency classes International publishes and changes nothing in them.open-host-service · IN-PROC ×1 operation(s) · Publishes its hook names for any module to subscribe to: Product::update fires actionProductSave and actionProductUpdate through Hook::exec (classes/Product.php:811-812). Open-host-service because the hook name is a published protocol that Catalog fires for every module alike and negotiates with none. The coupling is the in-process contract below, so none is declared here.conformist · STORE ×1 operation(s) · Scopes its own queries by the store context Shop decides: Product::getProducts joins product_shop through Shop::addSqlAssociation('product', 'p') (classes/Product.php:1634). Conformist because Shop owns the multi-store association and is never asked, so Catalog takes it in whatever shape it is in. The coupling is the shared-data contract below.customer-supplier · Reads its cart lines straight out of Catalog's tables: Cart::getProducts joins product, product_shop and product_attribute in its own SQL (classes/Cart.php:735-794), and prices each line by calling Product::getPriceStatic in-process (Cart::getCartPriceFromCatalog, classes/Cart.php:1176). Customer-supplier because the cart consumes the catalog's data and pricing and writes nothing back. · policy "Strip the deleted product out of every cart that still holds it, so no shopper can check out a line whose product no longer exists" (owned by Checkout) reacts to ProductDeleted from Catalogcustomer-supplier · Loads the cart's customer and their groups in the same process: Cart::__construct builds a Customer (classes/Cart.php:215) and CartRule::getCustomerCartRules calls Customer::getGroupsStatic (classes/CartRule.php:469). Customer-supplier because cart rules consume the customer's groups and never change them.customer-supplier · Computes cart totals with International's tax and currency classes in the same process: Cart::findTaxRulesGroupId calls TaxManagerFactory::getManager (classes/Cart.php:2546) and Cart::calculateWrappingFees calls Currency::getCurrencyInstance (classes/Cart.php:2619). Customer-supplier because the cart consumes the rates and converts nothing back.shared-kernel · IN-PROC ×1 operation(s) · Cart and order share one calculation and one pair of tables, and each side calls the other. Placement reads the cart: PaymentModule::validateOrder takes its totals from Cart::getOrderTotal (classes/PaymentModule.php:289), and an edited order recomputes its totals through the same method (OrderAmountUpdater::updateOrderTotals, src/Adapter/Order/OrderAmountUpdater.php:259). The cart reads the orders table: Cart::orderExists counts orders by id_cart (classes/Cart.php:1924). Shared-kernel because both contexts depend on the cart total calculation and the cart-to-order key, stated once here for the pair rather than from both ends. · policy "Issue the refund as a voucher the customer can spend, when the merchant chose credit rather than money back" (owned by Checkout) reacts to OrderRefunded from Orderscustomer-supplier · Renders mail templates per installed language through International's language repository in the same process: GenerateThemeMailTemplatesHandler takes a LanguageRepositoryInterface (src/Core/Domain/MailTemplate/CommandHandler/GenerateThemeMailTemplatesHandler.php:48), and CMS pages store their text per language id in cms_lang (classes/CMS.php:124). Customer-supplier because Content consumes the language list and adds no language. · policy "A language that is right-to-left has its stylesheets regenerated on every edit" (owned by Content) reacts to LanguageUpdated from International · policy "A right-to-left language brings right-to-left stylesheets with it" (owned by Content) reacts to LanguageCreated from Internationalcustomer-supplier · Validates and labels addresses with International's country model in the same process: EditCustomerAddressHandler builds a Country from the command (src/Adapter/Address/CommandHandler/EditCustomerAddressHandler.php:107), and Address::__construct calls Country::getNameById (classes/Address.php:157). Customer-supplier because addresses consume countries and states and define none.customer-supplier · Asks Admin's access control whether an employee may manage a module, in the same process: Module::getPermissionStatic calls Access::isGranted with the employee's profile (classes/module/Module.php:2808). Module::install also writes the module's permission rows into Admin's authorization_role and module_access tables directly (classes/module/Module.php:474-482). Customer-supplier because Modules consumes Admin's profile model and adds rows to it in Admin's own shape.customer-supplier · Prices order lines and takes their stock inside the placing request: PaymentModule::validateOrder calls Product::getPriceStatic for each line (classes/PaymentModule.php:472), and OrderDetail::updateProductQuantityInStock calls StockAvailable::updateQuantity (classes/order/OrderDetail.php:532). Customer-supplier because the order consumes Catalog's prices and decrements its stock through Catalog's own class.customer-supplier · Loads the customer and addresses and writes the order's customer message inside the placing request: PaymentModule::validateOrder builds a Customer (classes/PaymentModule.php:221), an Address (classes/PaymentModule.php:654) and a CustomerThread (classes/PaymentModule.php:581). Customer-supplier because the order consumes the customer model and adds to the thread in Customers' shape.customer-supplier · Takes the delivery option and carrier inside the placing request: PaymentModule::validateOrder reads Cart::getDeliveryOptionList (classes/PaymentModule.php:260) and builds the order's Carrier (classes/PaymentModule.php:658). Customer-supplier because the order consumes the carrier and its cost and changes neither.customer-supplier · XFER ×1 operation(s) · Fixes the order's currency and conversion rate at placement: PaymentModule::validateOrder builds a Currency for the cart's currency (classes/PaymentModule.php:229). Customer-supplier because the order consumes the rate and stores a copy. The coupling is the exchange-rates contract below, so none is declared here.customer-supplier · Selects carriers and their prices by International's zones in its own SQL: Carrier::getCarriers joins the zone table (classes/Carrier.php:567) and Carrier::getZones joins carrier_zone to zone (classes/Carrier.php:866). Customer-supplier because Shipping consumes the zone hierarchy and defines no zone.shared-kernel · Shop and International write and read the same store-association tables: Shop::copyShopData copies lang_shop, currency_shop and country_shop rows when a store is created (classes/shop/Shop.php:1259, tables listed at classes/shop/Shop.php:153-160), and International's own reads join them, as Language::loadLanguages does with lang_shop (classes/Language.php:1048). Shared-kernel because both contexts depend on those tables and neither owns them alone.unclassified · HTTP ×2 operation(s)unclassified · HTTP ×2 operation(s)unclassified · HTTP ×1 operation(s)unclassified · IN-PROC ×2 operation(s)unclassified · IN-PROC ×4 operation(s)unclassified · IN-PROC ×2 operation(s)unclassified · IN-PROC ×13 operation(s)unclassified · IN-PROC ×7 operation(s)prestashop.BC001prestashop.BC001GENERICowned by team Platform Security Team (TM009), declared on the contextAdmincrud▸ commodity+3AdminServiceservices 1inbound 1outbound 0prestashop.BC002prestashop.BC002COREowned by team Catalog Team (TM002), declared on the contextCatalogtransformation▸ product+4CatalogServiceservices 1inbound 2outbound 3prestashop.BC003prestashop.BC003COREowned by team Checkout & Payments Team (TM003), declared on the contextCheckoutconcurrency▸ product+3CheckoutServiceservices 1inbound 0outbound 4prestashop.BC004prestashop.BC004SUPPORTowned by team Content & Design Team (TM007), declared on the contextContentcrud▸ commodity+3ContentServiceservices 1inbound 0outbound 1prestashop.BC005prestashop.BC005SUPPORTowned by team Customer Experience Team (TM004), declared on the contextCustomerscrud▸ commodity+3CustomerServiceservices 1inbound 2outbound 1prestashop.BC006prestashop.BC006SUPPORTowned by team International & Localization Team (TM006), declared on the contextInternationaltransformation▸ product+3InternationalServiceservices 1inbound 7outbound 0prestashop.BC007prestashop.BC007GENERIC?11 open risk or inquiry names context Modules (prestashop.BC007): modules.INQ001 (Should module-hook position management be modeled as a CQRS operation?) - inquiry, investigatingowned by team Module Ecosystem Team (TM008), declared on the contextModulesintegration▸ custom+4ModuleManagerservices 1inbound 1outbound 1prestashop.BC008prestashop.BC008COREowned by team Order Platform Team (TM001), declared on the contextOrdersconcurrency▸ product+3OrderServiceservices 1inbound 1outbound 4prestashop.BC010prestashop.BC010SUPPORTowned by team Logistics Team (TM005), declared on the contextShippingintegration▸ product+3ShippingServiceservices 1inbound 1outbound 1prestashop.BC011prestashop.BC011GENERIC?11 open risk or inquiry names context Shop (prestashop.BC011): shop.INQ001 (Should multi-store configuration (maintenance mode, domain, SSL) be migrated to the CQRS domain layer?) - inquiry, investigatingowned by team Core Platform Team (TM010), declared on the contextShopcrud▸ commodity+3ShopServiceservices 1inbound 1outbound 1prestashop.BC009prestashop.BC009GENERICExternalApiConsumersintegration▸ commodity+2AdminApiClientservices 1inbound 0outbound 0prestashop.BC012prestashop.BC012GENERICPlatformKernelintegration▸ commodity+3HookDispatcherInProcessConsumersservices 2inbound 0outbound 0UDUDUDUDUDUDUDUDUDUDUDUDUDUDIN-PROC ×1IN-PROC ×1HTTP ×2HTTP ×2HTTP ×1IN-PROC ×2IN-PROC ×4IN-PROC ×2IN-PROC ×13IN-PROC ×7
Integration map12 of 13 service(s) · 19 link(s) · 0 channel(s) · implementation: 10 as-is · 0 wip · 0 to-be · 1 unclear · 1 unstated of 12. Scope: whole model (11 arch files). 27 operation(s) on 7 service(s) face outward with no consumer in this selection; 1 of 13 service(s) not shown: HookDispatcher - counts are relative to the selection, not to the system.Integration mapprestashop12 of 13 service(s) · 19 link(s) · 0 channel(s) · implementation: 10 as-is · 0 wip · 0 to-be · 1 unclear · 1 unstated of 12Scope: whole model (11 arch files). 27 operation(s) on 7 service(s) face outward with no consumer in this selection; 1 of 13 service(s) not shown: HookDispatcher - counts are relative to the selection, not to the system.HTTP (inferred) · 2 operation(s): AddEmployee [Task type not stated], EditProfile [Task type not stated]HTTP (inferred) · 2 operation(s): AddProduct - POST /products [Task type not stated], UpdateProduct - PATCH /products/{productId} [Task type not stated]HTTP (inferred) · 4 operation(s): AddCustomer - POST /customers [Task type not stated], EditCustomer - PATCH /customers/{customerId} [Task type not stated], AddCustomerAddress - POST /addresses/customers [Task type not stated], GetCustomerForViewing - GET /customers/{customerId}/details [Task type not stated]HTTP (inferred) · 4 operation(s): GetCurrencyForEditing [Task type not stated], GetLanguageForEditing [Task type not stated], GetCountryForEditing - GET /countries/{countryId} [Task type not stated], GetTaxRulesGroupForEditing - GET /tax-rules-groups/{taxRulesGroupId} [Task type not stated]HTTP (inferred) · 12 operation(s): InstallModule - PUT /modules/{technicalName}/install [Task type not stated], UninstallModule - PUT /modules/{technicalName}/uninstall [Task type not stated], UpdateModuleStatus - PUT /modules/{technicalName}/status [Task type not stated], BulkToggleModuleStatus - PUT /modules/bulk-update-status [Task type not stated], BulkUninstallModule - PUT /modules/bulk-uninstall [Task type not stated], ResetModule - PATCH /modules/{technicalName}/reset [Task type not stated], UpgradeModule - PUT /modules/{technicalName}/upgrade [Task type not stated], UploadModule [Task type not stated], UpdateHookStatus - PUT /hooks/{hookId}/status [Task type not stated], GetModuleInfos - GET /modules/{technicalName} [Task type not stated], GetHook - GET /hooks/{hookId} [Task type not stated], GetHookStatus - GET /hooks/{hookId}/status [Task type not stated]HTTP (inferred) · 1 operation(s): GetAvailableCarriers - GET /carriers/search-compatible-carriers [Task type not stated]HTTP (inferred) · 2 operation(s): EditContact - PATCH /contacts/{contactId} [Task type not stated], GetStoreForEditing - GET /stores/{storeId} [Task type not stated]IN-PROC · 1 operation(s): ExecuteHook [Task type not stated]STORE · 1 operation(s): ShopContextRecordIN-PROC · 1 operation(s): OrderPlacedXFER · 1 operation(s): ExchangeRateSnapshotHTTP · 2 operation(s): AddApiClient - POST /api-clients [Task type not stated], GetEmployeeForEditing [Task type not stated]HTTP · 2 operation(s): SearchProducts - GET /products/search [Task type not stated], GetProductForEditing - GET /products/{productId} [Task type not stated]HTTP · 1 operation(s): UpdateOrderReturnState - PATCH /order-returns/{orderReturnId} [User decision]IN-PROC · 2 operation(s): ProductCreated, ProductUpdatedIN-PROC · 4 operation(s): AddProductToCart [Task type not stated], RemoveProductFromCart [Task type not stated], CartProductsUpdated, GetCartForViewing [Task type not stated]IN-PROC · 2 operation(s): AddCmsPage [Task type not stated], EditCmsPage [Task type not stated]IN-PROC · 13 operation(s): RenderDisplayHook [Task type not stated], HookModule [Task type not stated], EditHookedModule [Task type not stated], ModuleInstalled, ModuleUninstalled, ModuleStatusUpdated, ModuleReset, ModuleUpgraded, ModuleUploaded, HookStatusUpdated, ModuleHookedOnHook, HookedModuleMoved, GetPossibleHooksForModule [Task type not stated]IN-PROC · 7 operation(s): PlaceOrder [Task type not stated], CancelOrder [Task type not stated], IssueStandardRefund [Task type not stated], OrderCancelled, OrderRefunded, OrderShipped, GetOrderForViewing [Task type not stated]external consumersinferredinferred - 27 operation(s) on 7 service(s) are exposed and no service in this selection calls them. The model does declare a consumer-only context (ExternalApiConsumers), but nothing there calls these.implementation: as-is⇄ apiprestashop.SVC001prestashop.SVC001AdminService?11 open risk or inquiry names service AdminService (prestashop.SVC001): admin.INQ001 (Should the Admin API implement rate limiting per API client?) - inquiry, investigatingopenapi 4▲AdminService - REST API for employee, security, and configuration management.implementation: as-is⇄ apiprestashop.SVC002prestashop.SVC002CatalogServiceopenapi 4▲inprocess 2▲ 1▼shareddata 1▼CatalogService - REST API for product and category management.implementation: as-is◆ serviceprestashop.SVC003prestashop.SVC003CheckoutServiceinprocess 4▲ 1▼CheckoutService - In-process cart commands, queries and local hooks within the PrestaShop monolith.implementation: as-is◆ serviceprestashop.SVC004prestashop.SVC004ContentServiceinprocess 2▲ContentService - In-process CMS page commands within the PrestaShop monolith.implementation: as-is⇄ apiprestashop.SVC005prestashop.SVC005CustomerServiceopenapi 4▲CustomerService - REST API for customer account and address management.implementation: as-is⇄ apiprestashop.SVC006prestashop.SVC006InternationalServiceopenapi 4▲scheduledtransfer 1▲InternationalService - REST API for currency, tax, country, and language management.implementation: as-is◆ serviceprestashop.SVC007prestashop.SVC007ModuleManageropenapi 12▲inprocess 14▲ModuleManager - Module lifecycle orchestrator with hook execution pipeline.implementation: as-is◆ serviceprestashop.SVC008prestashop.SVC008OrderServiceopenapi 1▲inprocess 8▲scheduledtransfer 1▼OrderService - In-process order commands, queries and local hooks within the PrestaShop monolith.⇄ apiprestashop.SVC009prestashop.SVC009AdminApiClienthttpClient 5▼AdminApiClient - External API consumer using PrestaShop Admin REST API with OAuth2 authentication.implementation: as-is⇄ apiprestashop.SVC010prestashop.SVC010ShippingServiceopenapi 1▲ShippingService - REST API for carrier management and shipping cost calculation.implementation: as-is⇄ apiprestashop.SVC011prestashop.SVC011ShopServiceopenapi 2▲shareddata 1▲ShopService - REST API for multi-store and shop configuration.◆ serviceprestashop.SVC013prestashop.SVC013InProcessConsumersinprocess 28▼InProcessConsumers - The callers and hook listeners inside the PrestaShop process that use these operations, stated as one group because no individual caller is modelled from the code yet.HTTP ×2HTTP ×2HTTP ×4 · 3 commands, 1 queryHTTP ×4HTTP ×12 · 9 commands, 3 queriesHTTP ×1HTTP ×2 · 1 command, 1 queryIN-PROC ×1STORE ×1IN-PROC ×1XFER ×1HTTP ×2 · 1 command, 1 queryHTTP ×2HTTP ×1IN-PROC ×2IN-PROC ×4 · 2 commands, 1 event, 1 queryIN-PROC ×2IN-PROC ×13 · 3 commands, 9 events, 1 queryIN-PROC ×7 · 3 commands, 3 events, 1 query
Strategy grid12 context(s) · 12 placed across 5 of 16 cells. Scope: whole model (11 arch files). All 12 context(s) carry an evolution stage and are plotted.Strategy gridprestashop12 context(s) · 12 placed across 5 of 16 cellsScope: whole model (11 arch files). All 12 context(s) carry an evolution stage and are plotted.coregeneric-coresupportgenericgenesisnovel, uncertaincustombuilt for usproductbought, configuredcommodityutility, invisiblekind ↓evolution →Catalog$Catalog - core · product · revenue-generatorCheckout$Checkout - core · product · revenue-generatorOrders$Orders - core · product · revenue-generatorInternational§International - support · product · compliance-enforcerShipping$Shipping - support · product · revenue-generatorContent◎Content - support · commodity · engagement-creatorCustomers◎Customers - support · commodity · engagement-creatorModules◎Modules - generic · custom · engagement-creatorAdmin§Admin - generic · commodity · compliance-enforcerExternalApiConsumers◎ExternalApiConsumers - generic · commodity · engagement-creatorPlatformKernel◎PlatformKernel - generic · commodity · engagement-creatorShop◎Shop - generic · commodity · engagement-creator
Domain map10 domain(s) · 16 aggregated dependency(ies) · 9 crossing(s). 10 of 12 context(s) placed across 10 declared domain(s). Not shown: 2 of 12 contexts belong to no declared domain (ExternalApiConsumers, PlatformKernel); 6 of 16 edge labels had no free spot beside their edge - each is in that edge's tooltip.Domain map10 domain(s) · 16 aggregated dependency(ies) · 9 crossing(s)prestashop10 of 12 context(s) placed across 10 declared domain(s). Not shown: 2 of 12 contexts belong to no declared domain (ExternalApiConsumers, PlatformKernel); 6 of 16 edgelabels had no free spot beside their edge - each is in that edge's tooltip.1 dep · customer-supplier1 dep · conformist1 dep · customer-supplier1 dep · customer-supplier1 dep · customer-supplier1 dep · shared-kernel1 dep · customer-supplier1 dep · customer-supplier1 dep · shared-kernel1 dep · customer-supplier1 dep · open-host-service1 dep · customer-supplier1 dep · customer-supplier1 dep · customer-supplier1 dep · customer-supplier1 dep · customer-supplierDOMAIN · 1 contextadminAdminadmin - 1 context(s)DOMAIN · 1 contextcatalogCatalogcatalog - 1 context(s)DOMAIN · 1 contextcheckoutCheckoutcheckout - 1 context(s)DOMAIN · 1 contextcontentContentcontent - 1 context(s)DOMAIN · 1 contextcustomersCustomerscustomers - 1 context(s)DOMAIN · 1 contextinternationalInternationalinternational - 1 context(s)DOMAIN · 1 contextmodulesModulesmodules - 1 context(s)DOMAIN · 1 contextordersOrdersorders - 1 context(s)DOMAIN · 1 contextshippingShippingshipping - 1 context(s)DOMAIN · 1 contextshopShopshop - 1 context(s)1 dep · customer-supplier1 dep · conformist1 dep · customer-supplier1 dep · customer-supplier1 dep · shared-kernel1 dep · shared-kernel1 dep · open-host-service1 dep · customer-supplier1 dep · customer-supplier1 dep · customer-supplier
OwnershipOwnership view of prestashop · blueprint v2.8 covering the whole model (11 arch files): 12 bounded contexts in 11 frames, one per owner (10) and one for the 2 that state no owner; 0 inherit their owner from the file default. 16 of 16 declared dependencies cross from one frame to another and are drawn; 0 join two contexts of one frame and are counted in its footer.Ownershipprestashopwhole model · 11 arch file(s) · 12 contexts · 10 owners · 16 cross-owner dependencies · 2 with no owner statedNot shown: 8 of 8 contract-traffic pairs cross owners with no declared dependency; the context map draws them.team Order Platform Team (TM001) owns 1 contextteam Order Platform Team (TM001) owns 1 contextOrder Platform Teamteam Catalog Team (TM002) owns 1 contextteam Catalog Team (TM002) owns 1 contextCatalog Teamteam Checkout & Payments Team (TM003) owns 1 contextteam Checkout & Payments Team (TM003) owns 1 contextCheckout & Payments Teamteam Customer Experience Team (TM004) owns 1 contextteam Customer Experience Team (TM004) owns 1 contextCustomer Experience Teamteam Logistics Team (TM005) owns 1 contextteam Logistics Team (TM005) owns 1 contextLogistics Teamteam International & Localization Team (TM006) owns 1 contextteam International & Localization Team (TM006) owns 1 contextInternational & Localization Teamteam Content & Design Team (TM007) owns 1 contextteam Content & Design Team (TM007) owns 1 contextContent & Design Teamteam Module Ecosystem Team (TM008) owns 1 contextteam Module Ecosystem Team (TM008) owns 1 contextModule Ecosystem Teamteam Platform Security Team (TM009) owns 1 contextteam Platform Security Team (TM009) owns 1 contextPlatform Security Teamteam Core Platform Team (TM010) owns 1 contextteam Core Platform Team (TM010) owns 1 contextCore Platform TeamNo owner stated: 2 contexts state no owned_by and inherit noneNo owner statedno dependency insidecustomer-supplier · Prices every product through International's tax model in the same process: Product::priceCalculation asks TaxManagerFactory::getManager for the product's tax rules group (classes/Product.php:3727). Customer-supplier because Catalog consumes the tax and currency classes International publishes and changes nothing in them.open-host-service · IN-PROC ×1 operation(s) · Publishes its hook names for any module to subscribe to: Product::update fires actionProductSave and actionProductUpdate through Hook::exec (classes/Product.php:811-812). Open-host-service because the hook name is a published protocol that Catalog fires for every module alike and negotiates with none. The coupling is the in-process contract below, so none is declared here.conformist · STORE ×1 operation(s) · Scopes its own queries by the store context Shop decides: Product::getProducts joins product_shop through Shop::addSqlAssociation('product', 'p') (classes/Product.php:1634). Conformist because Shop owns the multi-store association and is never asked, so Catalog takes it in whatever shape it is in. The coupling is the shared-data contract below.customer-supplier · Reads its cart lines straight out of Catalog's tables: Cart::getProducts joins product, product_shop and product_attribute in its own SQL (classes/Cart.php:735-794), and prices each line by calling Product::getPriceStatic in-process (Cart::getCartPriceFromCatalog, classes/Cart.php:1176). Customer-supplier because the cart consumes the catalog's data and pricing and writes nothing back. · policy "Strip the deleted product out of every cart that still holds it, so no shopper can check out a line whose product no longer exists" (owned by Checkout) reacts to ProductDeleted from Catalogcustomer-supplier · Loads the cart's customer and their groups in the same process: Cart::__construct builds a Customer (classes/Cart.php:215) and CartRule::getCustomerCartRules calls Customer::getGroupsStatic (classes/CartRule.php:469). Customer-supplier because cart rules consume the customer's groups and never change them.customer-supplier · Computes cart totals with International's tax and currency classes in the same process: Cart::findTaxRulesGroupId calls TaxManagerFactory::getManager (classes/Cart.php:2546) and Cart::calculateWrappingFees calls Currency::getCurrencyInstance (classes/Cart.php:2619). Customer-supplier because the cart consumes the rates and converts nothing back.shared-kernel · IN-PROC ×1 operation(s) · Cart and order share one calculation and one pair of tables, and each side calls the other. Placement reads the cart: PaymentModule::validateOrder takes its totals from Cart::getOrderTotal (classes/PaymentModule.php:289), and an edited order recomputes its totals through the same method (OrderAmountUpdater::updateOrderTotals, src/Adapter/Order/OrderAmountUpdater.php:259). The cart reads the orders table: Cart::orderExists counts orders by id_cart (classes/Cart.php:1924). Shared-kernel because both contexts depend on the cart total calculation and the cart-to-order key, stated once here for the pair rather than from both ends. · policy "Issue the refund as a voucher the customer can spend, when the merchant chose credit rather than money back" (owned by Checkout) reacts to OrderRefunded from Orderscustomer-supplier · Renders mail templates per installed language through International's language repository in the same process: GenerateThemeMailTemplatesHandler takes a LanguageRepositoryInterface (src/Core/Domain/MailTemplate/CommandHandler/GenerateThemeMailTemplatesHandler.php:48), and CMS pages store their text per language id in cms_lang (classes/CMS.php:124). Customer-supplier because Content consumes the language list and adds no language. · policy "A language that is right-to-left has its stylesheets regenerated on every edit" (owned by Content) reacts to LanguageUpdated from International · policy "A right-to-left language brings right-to-left stylesheets with it" (owned by Content) reacts to LanguageCreated from Internationalcustomer-supplier · Validates and labels addresses with International's country model in the same process: EditCustomerAddressHandler builds a Country from the command (src/Adapter/Address/CommandHandler/EditCustomerAddressHandler.php:107), and Address::__construct calls Country::getNameById (classes/Address.php:157). Customer-supplier because addresses consume countries and states and define none.customer-supplier · Asks Admin's access control whether an employee may manage a module, in the same process: Module::getPermissionStatic calls Access::isGranted with the employee's profile (classes/module/Module.php:2808). Module::install also writes the module's permission rows into Admin's authorization_role and module_access tables directly (classes/module/Module.php:474-482). Customer-supplier because Modules consumes Admin's profile model and adds rows to it in Admin's own shape.customer-supplier · Prices order lines and takes their stock inside the placing request: PaymentModule::validateOrder calls Product::getPriceStatic for each line (classes/PaymentModule.php:472), and OrderDetail::updateProductQuantityInStock calls StockAvailable::updateQuantity (classes/order/OrderDetail.php:532). Customer-supplier because the order consumes Catalog's prices and decrements its stock through Catalog's own class.customer-supplier · Loads the customer and addresses and writes the order's customer message inside the placing request: PaymentModule::validateOrder builds a Customer (classes/PaymentModule.php:221), an Address (classes/PaymentModule.php:654) and a CustomerThread (classes/PaymentModule.php:581). Customer-supplier because the order consumes the customer model and adds to the thread in Customers' shape.customer-supplier · Takes the delivery option and carrier inside the placing request: PaymentModule::validateOrder reads Cart::getDeliveryOptionList (classes/PaymentModule.php:260) and builds the order's Carrier (classes/PaymentModule.php:658). Customer-supplier because the order consumes the carrier and its cost and changes neither.customer-supplier · XFER ×1 operation(s) · Fixes the order's currency and conversion rate at placement: PaymentModule::validateOrder builds a Currency for the cart's currency (classes/PaymentModule.php:229). Customer-supplier because the order consumes the rate and stores a copy. The coupling is the exchange-rates contract below, so none is declared here.customer-supplier · Selects carriers and their prices by International's zones in its own SQL: Carrier::getCarriers joins the zone table (classes/Carrier.php:567) and Carrier::getZones joins carrier_zone to zone (classes/Carrier.php:866). Customer-supplier because Shipping consumes the zone hierarchy and defines no zone.shared-kernel · Shop and International write and read the same store-association tables: Shop::copyShopData copies lang_shop, currency_shop and country_shop rows when a store is created (classes/shop/Shop.php:1259, tables listed at classes/shop/Shop.php:153-160), and International's own reads join them, as Language::loadLanguages does with lang_shop (classes/Language.php:1048). Shared-kernel because both contexts depend on those tables and neither owns them alone.prestashop.BC008prestashop.BC008COREowned by team Order Platform Team (TM001), declared on the contextOrdersconcurrency▸ product+3OrderServiceservices 1inbound 1outbound 4prestashop.BC002prestashop.BC002COREowned by team Catalog Team (TM002), declared on the contextCatalogtransformation▸ product+4CatalogServiceservices 1inbound 2outbound 3prestashop.BC003prestashop.BC003COREowned by team Checkout & Payments Team (TM003), declared on the contextCheckoutconcurrency▸ product+3CheckoutServiceservices 1inbound 0outbound 4prestashop.BC005prestashop.BC005SUPPORTowned by team Customer Experience Team (TM004), declared on the contextCustomerscrud▸ commodity+3CustomerServiceservices 1inbound 2outbound 1prestashop.BC010prestashop.BC010SUPPORTowned by team Logistics Team (TM005), declared on the contextShippingintegration▸ product+3ShippingServiceservices 1inbound 1outbound 1prestashop.BC006prestashop.BC006SUPPORTowned by team International & Localization Team (TM006), declared on the contextInternationaltransformation▸ product+3InternationalServiceservices 1inbound 7outbound 0prestashop.BC004prestashop.BC004SUPPORTowned by team Content & Design Team (TM007), declared on the contextContentcrud▸ commodity+3ContentServiceservices 1inbound 0outbound 1prestashop.BC007prestashop.BC007GENERIC?11 open risk or inquiry names context Modules (prestashop.BC007): modules.INQ001 (Should module-hook position management be modeled as a CQRS operation?) - inquiry, investigatingowned by team Module Ecosystem Team (TM008), declared on the contextModulesintegration▸ custom+4ModuleManagerservices 1inbound 1outbound 1prestashop.BC001prestashop.BC001GENERICowned by team Platform Security Team (TM009), declared on the contextAdmincrud▸ commodity+3AdminServiceservices 1inbound 1outbound 0prestashop.BC011prestashop.BC011GENERIC?11 open risk or inquiry names context Shop (prestashop.BC011): shop.INQ001 (Should multi-store configuration (maintenance mode, domain, SSL) be migrated to the CQRS domain layer?) - inquiry, investigatingowned by team Core Platform Team (TM010), declared on the contextShopcrud▸ commodity+3ShopServiceservices 1inbound 1outbound 1prestashop.BC009prestashop.BC009GENERICExternalApiConsumersintegration▸ commodity+2AdminApiClientservices 1inbound 0outbound 0prestashop.BC012prestashop.BC012GENERICPlatformKernelintegration▸ commodity+3HookDispatcherInProcessConsumersservices 2inbound 0outbound 0UDUDUDUDUDUDUDUDUDUDUDUDUDUD

Printed whole to fit the sheet. The report and the PDF delivered beside this page print it at reading size.

Context Map

  • shared-kernel
  • open-host-service
  • customer-supplier
  • conformist
  • contract traffic · not declared
  • U upstream (supplies) · D downstream (consumes)
  • HTTP·IN-PROC·STORE·XFER ×n - derived from contracts
  • context kind - core · support · generic
  • complexity
  • ▸ evolution
  • • business role
  • model trait
  • PrestaShop (11)
  • ApiIntegrators (2)
  • open risks and inquiries whose affects names the card
  • open: risk identified or open; inquiry open, investigating or deferred; no status is not open

Owners

  • Order Platform Team
  • Catalog Team
  • Checkout & Payments Team
  • Customer Experience Team
  • Logistics Team
  • International & Localization Team
  • Content & Design Team
  • Module Ecosystem Team
  • Platform Security Team
  • Core Platform Team
scroll to zoom · drag to pan