[{"data":1,"prerenderedAt":16473},["ShallowReactive",2],{"navigation":3,"/advanced-and-expert-topics/domain-driven-design-with-django":1016,"/advanced-and-expert-topics/domain-driven-design-with-django-surround":16468},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":811,"body":1018,"description":1028,"extension":16463,"links":16464,"meta":16465,"navigation":1173,"path":812,"seo":16466,"stem":813,"__hash__":16467},"docs/22.advanced-and-expert-topics/03.domain-driven-design-with-django.md",{"type":1019,"value":1020,"toc":16448},"minimark",[1021,1025,1029,1034,1037,1042,1048,1064,1069,1083,1088,1102,1106,3963,3967,3970,6633,6637,6640,8408,8412,8415,13213,13217,13220,14529,14533,14536,15156,15160,15164,15172,15176,16359,16363,16368,16382,16387,16401,16405,16419,16424,16438,16441,16444],[1022,1023,811],"h1",{"id":1024},"domain-driven-design-with-django",[1026,1027,1028],"p",{},"Domain Driven Design (DDD) is a software development approach that focuses on creating a rich model of the business domain. When applied to Django applications, DDD helps create maintainable, expressive code that closely reflects business requirements and enables effective communication between developers and domain experts.",[1030,1031,1033],"h2",{"id":1032},"understanding-domain-driven-design","Understanding Domain Driven Design",[1026,1035,1036],{},"DDD emphasizes modeling the business domain accurately and placing business logic at the center of the application. This approach leads to more maintainable code, better communication with stakeholders, and systems that evolve naturally with business requirements.",[1038,1039,1041],"h3",{"id":1040},"core-ddd-concepts","Core DDD Concepts",[1026,1043,1044],{},[1045,1046,1047],"strong",{},"Ubiquitous Language",[1049,1050,1051,1055,1058,1061],"ul",{},[1052,1053,1054],"li",{},"Shared vocabulary between developers and domain experts",[1052,1056,1057],{},"Used consistently in code, documentation, and conversations",[1052,1059,1060],{},"Reduces translation errors and misunderstandings",[1052,1062,1063],{},"Evolves with deeper domain understanding",[1026,1065,1066],{},[1045,1067,1068],{},"Bounded Context",[1049,1070,1071,1074,1077,1080],{},[1052,1072,1073],{},"Explicit boundaries where domain models apply",[1052,1075,1076],{},"Different contexts may have different models for same concepts",[1052,1078,1079],{},"Prevents model corruption and confusion",[1052,1081,1082],{},"Enables independent evolution of different parts",[1026,1084,1085],{},[1045,1086,1087],{},"Domain Model",[1049,1089,1090,1093,1096,1099],{},[1052,1091,1092],{},"Rich objects that encapsulate business logic",[1052,1094,1095],{},"Express business rules and invariants",[1052,1097,1098],{},"Go beyond simple data containers",[1052,1100,1101],{},"Reflect the mental model of domain experts",[1038,1103,1105],{"id":1104},"ddd-building-blocks","DDD Building Blocks",[1107,1108,1113],"pre",{"className":1109,"code":1110,"language":1111,"meta":1112,"style":1112},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Value Objects - Immutable objects defined by their attributes\nfrom dataclasses import dataclass\nfrom decimal import Decimal\nfrom typing import Optional\n\n@dataclass(frozen=True)\nclass Money:\n    \"\"\"Value object for monetary amounts\"\"\"\n    amount: Decimal\n    currency: str = 'USD'\n    \n    def __post_init__(self):\n        if self.amount \u003C 0:\n            raise ValueError(\"Money amount cannot be negative\")\n        \n        if not self.currency or len(self.currency) != 3:\n            raise ValueError(\"Currency must be a 3-letter code\")\n    \n    def add(self, other: 'Money') -> 'Money':\n        \"\"\"Add two money amounts\"\"\"\n        if self.currency != other.currency:\n            raise ValueError(\"Cannot add different currencies\")\n        \n        return Money(self.amount + other.amount, self.currency)\n    \n    def multiply(self, factor: Decimal) -> 'Money':\n        \"\"\"Multiply money by a factor\"\"\"\n        return Money(self.amount * factor, self.currency)\n    \n    def is_zero(self) -> bool:\n        \"\"\"Check if amount is zero\"\"\"\n        return self.amount == 0\n\n@dataclass(frozen=True)\nclass Address:\n    \"\"\"Value object for addresses\"\"\"\n    street: str\n    city: str\n    state: str\n    postal_code: str\n    country: str = 'US'\n    \n    def __post_init__(self):\n        if not all([self.street, self.city, self.state, self.postal_code]):\n            raise ValueError(\"All address fields are required\")\n    \n    def is_same_city(self, other: 'Address') -> bool:\n        \"\"\"Check if addresses are in the same city\"\"\"\n        return (self.city == other.city and \n                self.state == other.state and \n                self.country == other.country)\n\n@dataclass(frozen=True)\nclass Email:\n    \"\"\"Value object for email addresses\"\"\"\n    value: str\n    \n    def __post_init__(self):\n        if not self._is_valid_email(self.value):\n            raise ValueError(f\"Invalid email address: {self.value}\")\n    \n    def _is_valid_email(self, email: str) -> bool:\n        \"\"\"Basic email validation\"\"\"\n        import re\n        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'\n        return re.match(pattern, email) is not None\n    \n    def domain(self) -> str:\n        \"\"\"Get email domain\"\"\"\n        return self.value.split('@')[1]\n\n# Entities - Objects with identity that can change over time\nclass Customer:\n    \"\"\"Customer entity with business logic\"\"\"\n    \n    def __init__(self, customer_id: int, email: Email, name: str):\n        self.id = customer_id\n        self.email = email\n        self.name = name\n        self.addresses = []\n        self.is_active = True\n        self.created_at = timezone.now()\n        self.credit_limit = Money(Decimal('1000.00'))\n        self.current_balance = Money(Decimal('0.00'))\n    \n    def add_address(self, address: Address, is_primary: bool = False):\n        \"\"\"Add address with business rules\"\"\"\n        if is_primary:\n            # Only one primary address allowed\n            for addr_info in self.addresses:\n                addr_info['is_primary'] = False\n        \n        self.addresses.append({\n            'address': address,\n            'is_primary': is_primary,\n            'added_at': timezone.now()\n        })\n    \n    def get_primary_address(self) -> Optional[Address]:\n        \"\"\"Get primary address\"\"\"\n        for addr_info in self.addresses:\n            if addr_info['is_primary']:\n                return addr_info['address']\n        return None\n    \n    def change_email(self, new_email: Email):\n        \"\"\"Change email with business validation\"\"\"\n        if new_email == self.email:\n            return  # No change needed\n        \n        # Business rule: email change requires verification\n        self.email = new_email\n        self.is_active = False  # Deactivate until email verified\n    \n    def increase_credit_limit(self, amount: Money):\n        \"\"\"Increase credit limit with business rules\"\"\"\n        if amount.amount \u003C= 0:\n            raise ValueError(\"Credit limit increase must be positive\")\n        \n        # Business rule: credit limit increases require approval for large amounts\n        if amount.amount > 5000:\n            raise BusinessRuleError(\"Large credit increases require manual approval\")\n        \n        self.credit_limit = self.credit_limit.add(amount)\n    \n    def can_make_purchase(self, amount: Money) -> bool:\n        \"\"\"Check if customer can make a purchase\"\"\"\n        if not self.is_active:\n            return False\n        \n        total_after_purchase = self.current_balance.add(amount)\n        return total_after_purchase.amount \u003C= self.credit_limit.amount\n    \n    def make_purchase(self, amount: Money):\n        \"\"\"Make a purchase with business validation\"\"\"\n        if not self.can_make_purchase(amount):\n            raise BusinessRuleError(\"Purchase exceeds credit limit\")\n        \n        self.current_balance = self.current_balance.add(amount)\n\nclass Product:\n    \"\"\"Product entity with business logic\"\"\"\n    \n    def __init__(self, product_id: int, name: str, price: Money):\n        self.id = product_id\n        self.name = name\n        self.price = price\n        self.is_active = True\n        self.created_at = timezone.now()\n        self.category_id = None\n        self.inventory_count = 0\n    \n    def change_price(self, new_price: Money):\n        \"\"\"Change product price with business rules\"\"\"\n        if new_price.amount \u003C= 0:\n            raise ValueError(\"Product price must be positive\")\n        \n        # Business rule: price changes > 50% require approval\n        if abs(new_price.amount - self.price.amount) / self.price.amount > 0.5:\n            raise BusinessRuleError(\"Large price changes require approval\")\n        \n        self.price = new_price\n    \n    def is_available(self) -> bool:\n        \"\"\"Check if product is available for purchase\"\"\"\n        return self.is_active and self.inventory_count > 0\n    \n    def reserve_inventory(self, quantity: int):\n        \"\"\"Reserve inventory with business validation\"\"\"\n        if quantity \u003C= 0:\n            raise ValueError(\"Quantity must be positive\")\n        \n        if quantity > self.inventory_count:\n            raise BusinessRuleError(\"Insufficient inventory\")\n        \n        self.inventory_count -= quantity\n    \n    def release_inventory(self, quantity: int):\n        \"\"\"Release reserved inventory\"\"\"\n        if quantity \u003C= 0:\n            raise ValueError(\"Quantity must be positive\")\n        \n        self.inventory_count += quantity\n","python","",[1114,1115,1116,1125,1142,1155,1168,1175,1203,1217,1231,1242,1268,1274,1293,1320,1341,1347,1388,1406,1411,1453,1464,1485,1503,1508,1544,1549,1583,1593,1623,1628,1649,1659,1676,1681,1698,1708,1718,1729,1739,1749,1759,1778,1783,1796,1846,1864,1869,1902,1912,1940,1962,1982,1987,2004,2014,2024,2034,2039,2052,2077,2109,2114,2143,2153,2162,2225,2257,2262,2282,2292,2325,2330,2336,2346,2356,2361,2402,2418,2433,2448,2463,2478,2501,2532,2561,2566,2603,2613,2622,2628,2648,2670,2675,2692,2710,2725,2745,2751,2756,2782,2792,2810,2829,2847,2854,2859,2882,2892,2911,2920,2925,2931,2945,2961,2966,2989,2999,3017,3035,3040,3046,3065,3084,3089,3117,3122,3150,3160,3175,3182,3187,3211,3236,3241,3263,3273,3293,3311,3316,3343,3348,3358,3368,3373,3412,3426,3439,3454,3467,3486,3500,3514,3519,3542,3552,3569,3587,3592,3598,3650,3668,3673,3687,3692,3712,3722,3745,3750,3773,3783,3798,3816,3821,3839,3857,3862,3877,3882,3904,3914,3927,3944,3949],"code",{"__ignoreMap":1112},[1117,1118,1121],"span",{"class":1119,"line":1120},"line",1,[1117,1122,1124],{"class":1123},"s9Tkl","# Value Objects - Immutable objects defined by their attributes\n",[1117,1126,1128,1132,1136,1139],{"class":1119,"line":1127},2,[1117,1129,1131],{"class":1130},"siDh9","from",[1117,1133,1135],{"class":1134},"sftqT"," dataclasses ",[1117,1137,1138],{"class":1130},"import",[1117,1140,1141],{"class":1134}," dataclass\n",[1117,1143,1145,1147,1150,1152],{"class":1119,"line":1144},3,[1117,1146,1131],{"class":1130},[1117,1148,1149],{"class":1134}," decimal ",[1117,1151,1138],{"class":1130},[1117,1153,1154],{"class":1134}," Decimal\n",[1117,1156,1158,1160,1163,1165],{"class":1119,"line":1157},4,[1117,1159,1131],{"class":1130},[1117,1161,1162],{"class":1134}," typing ",[1117,1164,1138],{"class":1130},[1117,1166,1167],{"class":1134}," Optional\n",[1117,1169,1171],{"class":1119,"line":1170},5,[1117,1172,1174],{"emptyLinePlaceholder":1173},true,"\n",[1117,1176,1178,1182,1186,1189,1193,1196,1200],{"class":1119,"line":1177},6,[1117,1179,1181],{"class":1180},"soVBu","@",[1117,1183,1185],{"class":1184},"sljsM","dataclass",[1117,1187,1188],{"class":1180},"(",[1117,1190,1192],{"class":1191},"sqOPj","frozen",[1117,1194,1195],{"class":1180},"=",[1117,1197,1199],{"class":1198},"s8XtY","True",[1117,1201,1202],{"class":1180},")\n",[1117,1204,1206,1210,1214],{"class":1119,"line":1205},7,[1117,1207,1209],{"class":1208},"s5Kfy","class",[1117,1211,1213],{"class":1212},"sD-vU"," Money",[1117,1215,1216],{"class":1180},":\n",[1117,1218,1220,1224,1228],{"class":1119,"line":1219},8,[1117,1221,1223],{"class":1222},"sm7ve","    \"\"\"",[1117,1225,1227],{"class":1226},"sVyVU","Value object for monetary amounts",[1117,1229,1230],{"class":1222},"\"\"\"\n",[1117,1232,1234,1237,1240],{"class":1119,"line":1233},9,[1117,1235,1236],{"class":1134},"    amount",[1117,1238,1239],{"class":1180},":",[1117,1241,1154],{"class":1134},[1117,1243,1245,1248,1250,1254,1257,1261,1265],{"class":1119,"line":1244},10,[1117,1246,1247],{"class":1134},"    currency",[1117,1249,1239],{"class":1180},[1117,1251,1253],{"class":1252},"sa2tF"," str",[1117,1255,1256],{"class":1180}," =",[1117,1258,1260],{"class":1259},"sbYkP"," '",[1117,1262,1264],{"class":1263},"sTbE_","USD",[1117,1266,1267],{"class":1259},"'\n",[1117,1269,1271],{"class":1119,"line":1270},11,[1117,1272,1273],{"class":1134},"    \n",[1117,1275,1277,1280,1284,1286,1290],{"class":1119,"line":1276},12,[1117,1278,1279],{"class":1208},"    def",[1117,1281,1283],{"class":1282},"s131V"," __post_init__",[1117,1285,1188],{"class":1180},[1117,1287,1289],{"class":1288},"sRjD_","self",[1117,1291,1292],{"class":1180},"):\n",[1117,1294,1296,1299,1303,1306,1310,1314,1318],{"class":1119,"line":1295},13,[1117,1297,1298],{"class":1130},"        if",[1117,1300,1302],{"class":1301},"se3Ec"," self",[1117,1304,1305],{"class":1180},".",[1117,1307,1309],{"class":1308},"sBPpx","amount",[1117,1311,1313],{"class":1312},"sVsLi"," \u003C",[1117,1315,1317],{"class":1316},"s7CZa"," 0",[1117,1319,1216],{"class":1180},[1117,1321,1323,1326,1329,1331,1334,1337,1339],{"class":1119,"line":1322},14,[1117,1324,1325],{"class":1130},"            raise",[1117,1327,1328],{"class":1252}," ValueError",[1117,1330,1188],{"class":1180},[1117,1332,1333],{"class":1259},"\"",[1117,1335,1336],{"class":1263},"Money amount cannot be negative",[1117,1338,1333],{"class":1259},[1117,1340,1202],{"class":1180},[1117,1342,1344],{"class":1119,"line":1343},15,[1117,1345,1346],{"class":1134},"        \n",[1117,1348,1350,1352,1355,1357,1359,1362,1365,1369,1371,1373,1375,1377,1380,1383,1386],{"class":1119,"line":1349},16,[1117,1351,1298],{"class":1130},[1117,1353,1354],{"class":1312}," not",[1117,1356,1302],{"class":1301},[1117,1358,1305],{"class":1180},[1117,1360,1361],{"class":1308},"currency",[1117,1363,1364],{"class":1312}," or",[1117,1366,1368],{"class":1367},"sJdAF"," len",[1117,1370,1188],{"class":1180},[1117,1372,1289],{"class":1301},[1117,1374,1305],{"class":1180},[1117,1376,1361],{"class":1308},[1117,1378,1379],{"class":1180},")",[1117,1381,1382],{"class":1312}," !=",[1117,1384,1385],{"class":1316}," 3",[1117,1387,1216],{"class":1180},[1117,1389,1391,1393,1395,1397,1399,1402,1404],{"class":1119,"line":1390},17,[1117,1392,1325],{"class":1130},[1117,1394,1328],{"class":1252},[1117,1396,1188],{"class":1180},[1117,1398,1333],{"class":1259},[1117,1400,1401],{"class":1263},"Currency must be a 3-letter code",[1117,1403,1333],{"class":1259},[1117,1405,1202],{"class":1180},[1117,1407,1409],{"class":1119,"line":1408},18,[1117,1410,1273],{"class":1134},[1117,1412,1414,1416,1419,1421,1423,1426,1430,1432,1434,1437,1440,1442,1445,1447,1449,1451],{"class":1119,"line":1413},19,[1117,1415,1279],{"class":1208},[1117,1417,1418],{"class":1184}," add",[1117,1420,1188],{"class":1180},[1117,1422,1289],{"class":1288},[1117,1424,1425],{"class":1180},",",[1117,1427,1429],{"class":1428},"sCyAa"," other",[1117,1431,1239],{"class":1180},[1117,1433,1260],{"class":1259},[1117,1435,1436],{"class":1263},"Money",[1117,1438,1439],{"class":1259},"'",[1117,1441,1379],{"class":1180},[1117,1443,1444],{"class":1180}," ->",[1117,1446,1260],{"class":1259},[1117,1448,1436],{"class":1263},[1117,1450,1439],{"class":1259},[1117,1452,1216],{"class":1180},[1117,1454,1456,1459,1462],{"class":1119,"line":1455},20,[1117,1457,1458],{"class":1222},"        \"\"\"",[1117,1460,1461],{"class":1226},"Add two money amounts",[1117,1463,1230],{"class":1222},[1117,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483],{"class":1119,"line":1466},21,[1117,1468,1298],{"class":1130},[1117,1470,1302],{"class":1301},[1117,1472,1305],{"class":1180},[1117,1474,1361],{"class":1308},[1117,1476,1382],{"class":1312},[1117,1478,1429],{"class":1134},[1117,1480,1305],{"class":1180},[1117,1482,1361],{"class":1308},[1117,1484,1216],{"class":1180},[1117,1486,1488,1490,1492,1494,1496,1499,1501],{"class":1119,"line":1487},22,[1117,1489,1325],{"class":1130},[1117,1491,1328],{"class":1252},[1117,1493,1188],{"class":1180},[1117,1495,1333],{"class":1259},[1117,1497,1498],{"class":1263},"Cannot add different currencies",[1117,1500,1333],{"class":1259},[1117,1502,1202],{"class":1180},[1117,1504,1506],{"class":1119,"line":1505},23,[1117,1507,1346],{"class":1134},[1117,1509,1511,1514,1517,1519,1521,1523,1525,1528,1530,1532,1534,1536,1538,1540,1542],{"class":1119,"line":1510},24,[1117,1512,1513],{"class":1130},"        return",[1117,1515,1213],{"class":1516},"siWMO",[1117,1518,1188],{"class":1180},[1117,1520,1289],{"class":1301},[1117,1522,1305],{"class":1180},[1117,1524,1309],{"class":1308},[1117,1526,1527],{"class":1312}," +",[1117,1529,1429],{"class":1516},[1117,1531,1305],{"class":1180},[1117,1533,1309],{"class":1308},[1117,1535,1425],{"class":1180},[1117,1537,1302],{"class":1301},[1117,1539,1305],{"class":1180},[1117,1541,1361],{"class":1308},[1117,1543,1202],{"class":1180},[1117,1545,1547],{"class":1119,"line":1546},25,[1117,1548,1273],{"class":1134},[1117,1550,1552,1554,1557,1559,1561,1563,1566,1568,1571,1573,1575,1577,1579,1581],{"class":1119,"line":1551},26,[1117,1553,1279],{"class":1208},[1117,1555,1556],{"class":1184}," multiply",[1117,1558,1188],{"class":1180},[1117,1560,1289],{"class":1288},[1117,1562,1425],{"class":1180},[1117,1564,1565],{"class":1428}," factor",[1117,1567,1239],{"class":1180},[1117,1569,1570],{"class":1134}," Decimal",[1117,1572,1379],{"class":1180},[1117,1574,1444],{"class":1180},[1117,1576,1260],{"class":1259},[1117,1578,1436],{"class":1263},[1117,1580,1439],{"class":1259},[1117,1582,1216],{"class":1180},[1117,1584,1586,1588,1591],{"class":1119,"line":1585},27,[1117,1587,1458],{"class":1222},[1117,1589,1590],{"class":1226},"Multiply money by a factor",[1117,1592,1230],{"class":1222},[1117,1594,1596,1598,1600,1602,1604,1606,1608,1611,1613,1615,1617,1619,1621],{"class":1119,"line":1595},28,[1117,1597,1513],{"class":1130},[1117,1599,1213],{"class":1516},[1117,1601,1188],{"class":1180},[1117,1603,1289],{"class":1301},[1117,1605,1305],{"class":1180},[1117,1607,1309],{"class":1308},[1117,1609,1610],{"class":1312}," *",[1117,1612,1565],{"class":1516},[1117,1614,1425],{"class":1180},[1117,1616,1302],{"class":1301},[1117,1618,1305],{"class":1180},[1117,1620,1361],{"class":1308},[1117,1622,1202],{"class":1180},[1117,1624,1626],{"class":1119,"line":1625},29,[1117,1627,1273],{"class":1134},[1117,1629,1631,1633,1636,1638,1640,1642,1644,1647],{"class":1119,"line":1630},30,[1117,1632,1279],{"class":1208},[1117,1634,1635],{"class":1184}," is_zero",[1117,1637,1188],{"class":1180},[1117,1639,1289],{"class":1288},[1117,1641,1379],{"class":1180},[1117,1643,1444],{"class":1180},[1117,1645,1646],{"class":1252}," bool",[1117,1648,1216],{"class":1180},[1117,1650,1652,1654,1657],{"class":1119,"line":1651},31,[1117,1653,1458],{"class":1222},[1117,1655,1656],{"class":1226},"Check if amount is zero",[1117,1658,1230],{"class":1222},[1117,1660,1662,1664,1666,1668,1670,1673],{"class":1119,"line":1661},32,[1117,1663,1513],{"class":1130},[1117,1665,1302],{"class":1301},[1117,1667,1305],{"class":1180},[1117,1669,1309],{"class":1308},[1117,1671,1672],{"class":1312}," ==",[1117,1674,1675],{"class":1316}," 0\n",[1117,1677,1679],{"class":1119,"line":1678},33,[1117,1680,1174],{"emptyLinePlaceholder":1173},[1117,1682,1684,1686,1688,1690,1692,1694,1696],{"class":1119,"line":1683},34,[1117,1685,1181],{"class":1180},[1117,1687,1185],{"class":1184},[1117,1689,1188],{"class":1180},[1117,1691,1192],{"class":1191},[1117,1693,1195],{"class":1180},[1117,1695,1199],{"class":1198},[1117,1697,1202],{"class":1180},[1117,1699,1701,1703,1706],{"class":1119,"line":1700},35,[1117,1702,1209],{"class":1208},[1117,1704,1705],{"class":1212}," Address",[1117,1707,1216],{"class":1180},[1117,1709,1711,1713,1716],{"class":1119,"line":1710},36,[1117,1712,1223],{"class":1222},[1117,1714,1715],{"class":1226},"Value object for addresses",[1117,1717,1230],{"class":1222},[1117,1719,1721,1724,1726],{"class":1119,"line":1720},37,[1117,1722,1723],{"class":1134},"    street",[1117,1725,1239],{"class":1180},[1117,1727,1728],{"class":1252}," str\n",[1117,1730,1732,1735,1737],{"class":1119,"line":1731},38,[1117,1733,1734],{"class":1134},"    city",[1117,1736,1239],{"class":1180},[1117,1738,1728],{"class":1252},[1117,1740,1742,1745,1747],{"class":1119,"line":1741},39,[1117,1743,1744],{"class":1134},"    state",[1117,1746,1239],{"class":1180},[1117,1748,1728],{"class":1252},[1117,1750,1752,1755,1757],{"class":1119,"line":1751},40,[1117,1753,1754],{"class":1134},"    postal_code",[1117,1756,1239],{"class":1180},[1117,1758,1728],{"class":1252},[1117,1760,1762,1765,1767,1769,1771,1773,1776],{"class":1119,"line":1761},41,[1117,1763,1764],{"class":1134},"    country",[1117,1766,1239],{"class":1180},[1117,1768,1253],{"class":1252},[1117,1770,1256],{"class":1180},[1117,1772,1260],{"class":1259},[1117,1774,1775],{"class":1263},"US",[1117,1777,1267],{"class":1259},[1117,1779,1781],{"class":1119,"line":1780},42,[1117,1782,1273],{"class":1134},[1117,1784,1786,1788,1790,1792,1794],{"class":1119,"line":1785},43,[1117,1787,1279],{"class":1208},[1117,1789,1283],{"class":1282},[1117,1791,1188],{"class":1180},[1117,1793,1289],{"class":1288},[1117,1795,1292],{"class":1180},[1117,1797,1799,1801,1803,1806,1809,1811,1813,1816,1818,1820,1822,1825,1827,1829,1831,1834,1836,1838,1840,1843],{"class":1119,"line":1798},44,[1117,1800,1298],{"class":1130},[1117,1802,1354],{"class":1312},[1117,1804,1805],{"class":1367}," all",[1117,1807,1808],{"class":1180},"([",[1117,1810,1289],{"class":1301},[1117,1812,1305],{"class":1180},[1117,1814,1815],{"class":1308},"street",[1117,1817,1425],{"class":1180},[1117,1819,1302],{"class":1301},[1117,1821,1305],{"class":1180},[1117,1823,1824],{"class":1308},"city",[1117,1826,1425],{"class":1180},[1117,1828,1302],{"class":1301},[1117,1830,1305],{"class":1180},[1117,1832,1833],{"class":1308},"state",[1117,1835,1425],{"class":1180},[1117,1837,1302],{"class":1301},[1117,1839,1305],{"class":1180},[1117,1841,1842],{"class":1308},"postal_code",[1117,1844,1845],{"class":1180},"]):\n",[1117,1847,1849,1851,1853,1855,1857,1860,1862],{"class":1119,"line":1848},45,[1117,1850,1325],{"class":1130},[1117,1852,1328],{"class":1252},[1117,1854,1188],{"class":1180},[1117,1856,1333],{"class":1259},[1117,1858,1859],{"class":1263},"All address fields are required",[1117,1861,1333],{"class":1259},[1117,1863,1202],{"class":1180},[1117,1865,1867],{"class":1119,"line":1866},46,[1117,1868,1273],{"class":1134},[1117,1870,1872,1874,1877,1879,1881,1883,1885,1887,1889,1892,1894,1896,1898,1900],{"class":1119,"line":1871},47,[1117,1873,1279],{"class":1208},[1117,1875,1876],{"class":1184}," is_same_city",[1117,1878,1188],{"class":1180},[1117,1880,1289],{"class":1288},[1117,1882,1425],{"class":1180},[1117,1884,1429],{"class":1428},[1117,1886,1239],{"class":1180},[1117,1888,1260],{"class":1259},[1117,1890,1891],{"class":1263},"Address",[1117,1893,1439],{"class":1259},[1117,1895,1379],{"class":1180},[1117,1897,1444],{"class":1180},[1117,1899,1646],{"class":1252},[1117,1901,1216],{"class":1180},[1117,1903,1905,1907,1910],{"class":1119,"line":1904},48,[1117,1906,1458],{"class":1222},[1117,1908,1909],{"class":1226},"Check if addresses are in the same city",[1117,1911,1230],{"class":1222},[1117,1913,1915,1917,1920,1922,1924,1926,1928,1930,1932,1934,1937],{"class":1119,"line":1914},49,[1117,1916,1513],{"class":1130},[1117,1918,1919],{"class":1180}," (",[1117,1921,1289],{"class":1301},[1117,1923,1305],{"class":1180},[1117,1925,1824],{"class":1308},[1117,1927,1672],{"class":1312},[1117,1929,1429],{"class":1134},[1117,1931,1305],{"class":1180},[1117,1933,1824],{"class":1308},[1117,1935,1936],{"class":1312}," and",[1117,1938,1939],{"class":1134}," \n",[1117,1941,1943,1946,1948,1950,1952,1954,1956,1958,1960],{"class":1119,"line":1942},50,[1117,1944,1945],{"class":1301},"                self",[1117,1947,1305],{"class":1180},[1117,1949,1833],{"class":1308},[1117,1951,1672],{"class":1312},[1117,1953,1429],{"class":1134},[1117,1955,1305],{"class":1180},[1117,1957,1833],{"class":1308},[1117,1959,1936],{"class":1312},[1117,1961,1939],{"class":1134},[1117,1963,1965,1967,1969,1972,1974,1976,1978,1980],{"class":1119,"line":1964},51,[1117,1966,1945],{"class":1301},[1117,1968,1305],{"class":1180},[1117,1970,1971],{"class":1308},"country",[1117,1973,1672],{"class":1312},[1117,1975,1429],{"class":1134},[1117,1977,1305],{"class":1180},[1117,1979,1971],{"class":1308},[1117,1981,1202],{"class":1180},[1117,1983,1985],{"class":1119,"line":1984},52,[1117,1986,1174],{"emptyLinePlaceholder":1173},[1117,1988,1990,1992,1994,1996,1998,2000,2002],{"class":1119,"line":1989},53,[1117,1991,1181],{"class":1180},[1117,1993,1185],{"class":1184},[1117,1995,1188],{"class":1180},[1117,1997,1192],{"class":1191},[1117,1999,1195],{"class":1180},[1117,2001,1199],{"class":1198},[1117,2003,1202],{"class":1180},[1117,2005,2007,2009,2012],{"class":1119,"line":2006},54,[1117,2008,1209],{"class":1208},[1117,2010,2011],{"class":1212}," Email",[1117,2013,1216],{"class":1180},[1117,2015,2017,2019,2022],{"class":1119,"line":2016},55,[1117,2018,1223],{"class":1222},[1117,2020,2021],{"class":1226},"Value object for email addresses",[1117,2023,1230],{"class":1222},[1117,2025,2027,2030,2032],{"class":1119,"line":2026},56,[1117,2028,2029],{"class":1134},"    value",[1117,2031,1239],{"class":1180},[1117,2033,1728],{"class":1252},[1117,2035,2037],{"class":1119,"line":2036},57,[1117,2038,1273],{"class":1134},[1117,2040,2042,2044,2046,2048,2050],{"class":1119,"line":2041},58,[1117,2043,1279],{"class":1208},[1117,2045,1283],{"class":1282},[1117,2047,1188],{"class":1180},[1117,2049,1289],{"class":1288},[1117,2051,1292],{"class":1180},[1117,2053,2055,2057,2059,2061,2063,2066,2068,2070,2072,2075],{"class":1119,"line":2054},59,[1117,2056,1298],{"class":1130},[1117,2058,1354],{"class":1312},[1117,2060,1302],{"class":1301},[1117,2062,1305],{"class":1180},[1117,2064,2065],{"class":1516},"_is_valid_email",[1117,2067,1188],{"class":1180},[1117,2069,1289],{"class":1301},[1117,2071,1305],{"class":1180},[1117,2073,2074],{"class":1308},"value",[1117,2076,1292],{"class":1180},[1117,2078,2080,2082,2084,2086,2089,2092,2096,2098,2100,2102,2105,2107],{"class":1119,"line":2079},60,[1117,2081,1325],{"class":1130},[1117,2083,1328],{"class":1252},[1117,2085,1188],{"class":1180},[1117,2087,2088],{"class":1208},"f",[1117,2090,2091],{"class":1263},"\"Invalid email address: ",[1117,2093,2095],{"class":2094},"s3h35","{",[1117,2097,1289],{"class":1301},[1117,2099,1305],{"class":1180},[1117,2101,2074],{"class":1308},[1117,2103,2104],{"class":2094},"}",[1117,2106,1333],{"class":1263},[1117,2108,1202],{"class":1180},[1117,2110,2112],{"class":1119,"line":2111},61,[1117,2113,1273],{"class":1134},[1117,2115,2117,2119,2122,2124,2126,2128,2131,2133,2135,2137,2139,2141],{"class":1119,"line":2116},62,[1117,2118,1279],{"class":1208},[1117,2120,2121],{"class":1184}," _is_valid_email",[1117,2123,1188],{"class":1180},[1117,2125,1289],{"class":1288},[1117,2127,1425],{"class":1180},[1117,2129,2130],{"class":1428}," email",[1117,2132,1239],{"class":1180},[1117,2134,1253],{"class":1252},[1117,2136,1379],{"class":1180},[1117,2138,1444],{"class":1180},[1117,2140,1646],{"class":1252},[1117,2142,1216],{"class":1180},[1117,2144,2146,2148,2151],{"class":1119,"line":2145},63,[1117,2147,1458],{"class":1222},[1117,2149,2150],{"class":1226},"Basic email validation",[1117,2152,1230],{"class":1222},[1117,2154,2156,2159],{"class":1119,"line":2155},64,[1117,2157,2158],{"class":1130},"        import",[1117,2160,2161],{"class":1134}," re\n",[1117,2163,2165,2168,2170,2173,2175,2179,2183,2187,2190,2194,2197,2199,2202,2204,2206,2210,2212,2215,2217,2220,2223],{"class":1119,"line":2164},65,[1117,2166,2167],{"class":1134},"        pattern ",[1117,2169,1195],{"class":1180},[1117,2171,2172],{"class":1208}," r",[1117,2174,1439],{"class":1259},[1117,2176,2178],{"class":2177},"sRJPX","^",[1117,2180,2182],{"class":2181},"sETVe","[",[1117,2184,2186],{"class":2185},"sz9Cv","a-zA-Z0-9._%+-",[1117,2188,2189],{"class":2181},"]",[1117,2191,2193],{"class":2192},"sGuSu","+",[1117,2195,1181],{"class":2196},"s27EL",[1117,2198,2182],{"class":2181},[1117,2200,2201],{"class":2185},"a-zA-Z0-9.-",[1117,2203,2189],{"class":2181},[1117,2205,2193],{"class":2192},[1117,2207,2209],{"class":2208},"sk0MF","\\.",[1117,2211,2182],{"class":2181},[1117,2213,2214],{"class":2185},"a-zA-Z",[1117,2216,2189],{"class":2181},[1117,2218,2219],{"class":2192},"{2,}",[1117,2221,2222],{"class":2177},"$",[1117,2224,1267],{"class":1259},[1117,2226,2228,2230,2233,2235,2238,2240,2243,2245,2247,2249,2252,2254],{"class":1119,"line":2227},66,[1117,2229,1513],{"class":1130},[1117,2231,2232],{"class":1134}," re",[1117,2234,1305],{"class":1180},[1117,2236,2237],{"class":1516},"match",[1117,2239,1188],{"class":1180},[1117,2241,2242],{"class":1516},"pattern",[1117,2244,1425],{"class":1180},[1117,2246,2130],{"class":1516},[1117,2248,1379],{"class":1180},[1117,2250,2251],{"class":1312}," is",[1117,2253,1354],{"class":1312},[1117,2255,2256],{"class":1198}," None\n",[1117,2258,2260],{"class":1119,"line":2259},67,[1117,2261,1273],{"class":1134},[1117,2263,2265,2267,2270,2272,2274,2276,2278,2280],{"class":1119,"line":2264},68,[1117,2266,1279],{"class":1208},[1117,2268,2269],{"class":1184}," domain",[1117,2271,1188],{"class":1180},[1117,2273,1289],{"class":1288},[1117,2275,1379],{"class":1180},[1117,2277,1444],{"class":1180},[1117,2279,1253],{"class":1252},[1117,2281,1216],{"class":1180},[1117,2283,2285,2287,2290],{"class":1119,"line":2284},69,[1117,2286,1458],{"class":1222},[1117,2288,2289],{"class":1226},"Get email domain",[1117,2291,1230],{"class":1222},[1117,2293,2295,2297,2299,2301,2303,2305,2308,2310,2312,2314,2316,2319,2322],{"class":1119,"line":2294},70,[1117,2296,1513],{"class":1130},[1117,2298,1302],{"class":1301},[1117,2300,1305],{"class":1180},[1117,2302,2074],{"class":1308},[1117,2304,1305],{"class":1180},[1117,2306,2307],{"class":1516},"split",[1117,2309,1188],{"class":1180},[1117,2311,1439],{"class":1259},[1117,2313,1181],{"class":1263},[1117,2315,1439],{"class":1259},[1117,2317,2318],{"class":1180},")[",[1117,2320,2321],{"class":1316},"1",[1117,2323,2324],{"class":1180},"]\n",[1117,2326,2328],{"class":1119,"line":2327},71,[1117,2329,1174],{"emptyLinePlaceholder":1173},[1117,2331,2333],{"class":1119,"line":2332},72,[1117,2334,2335],{"class":1123},"# Entities - Objects with identity that can change over time\n",[1117,2337,2339,2341,2344],{"class":1119,"line":2338},73,[1117,2340,1209],{"class":1208},[1117,2342,2343],{"class":1212}," Customer",[1117,2345,1216],{"class":1180},[1117,2347,2349,2351,2354],{"class":1119,"line":2348},74,[1117,2350,1223],{"class":1222},[1117,2352,2353],{"class":1226},"Customer entity with business logic",[1117,2355,1230],{"class":1222},[1117,2357,2359],{"class":1119,"line":2358},75,[1117,2360,1273],{"class":1134},[1117,2362,2364,2366,2369,2371,2373,2375,2378,2380,2383,2385,2387,2389,2391,2393,2396,2398,2400],{"class":1119,"line":2363},76,[1117,2365,1279],{"class":1208},[1117,2367,2368],{"class":1367}," __init__",[1117,2370,1188],{"class":1180},[1117,2372,1289],{"class":1288},[1117,2374,1425],{"class":1180},[1117,2376,2377],{"class":1428}," customer_id",[1117,2379,1239],{"class":1180},[1117,2381,2382],{"class":1252}," int",[1117,2384,1425],{"class":1180},[1117,2386,2130],{"class":1428},[1117,2388,1239],{"class":1180},[1117,2390,2011],{"class":1134},[1117,2392,1425],{"class":1180},[1117,2394,2395],{"class":1428}," name",[1117,2397,1239],{"class":1180},[1117,2399,1253],{"class":1252},[1117,2401,1292],{"class":1180},[1117,2403,2405,2408,2410,2413,2415],{"class":1119,"line":2404},77,[1117,2406,2407],{"class":1301},"        self",[1117,2409,1305],{"class":1180},[1117,2411,2412],{"class":1308},"id",[1117,2414,1256],{"class":1180},[1117,2416,2417],{"class":1134}," customer_id\n",[1117,2419,2421,2423,2425,2428,2430],{"class":1119,"line":2420},78,[1117,2422,2407],{"class":1301},[1117,2424,1305],{"class":1180},[1117,2426,2427],{"class":1308},"email",[1117,2429,1256],{"class":1180},[1117,2431,2432],{"class":1134}," email\n",[1117,2434,2436,2438,2440,2443,2445],{"class":1119,"line":2435},79,[1117,2437,2407],{"class":1301},[1117,2439,1305],{"class":1180},[1117,2441,2442],{"class":1308},"name",[1117,2444,1256],{"class":1180},[1117,2446,2447],{"class":1134}," name\n",[1117,2449,2451,2453,2455,2458,2460],{"class":1119,"line":2450},80,[1117,2452,2407],{"class":1301},[1117,2454,1305],{"class":1180},[1117,2456,2457],{"class":1308},"addresses",[1117,2459,1256],{"class":1180},[1117,2461,2462],{"class":1180}," []\n",[1117,2464,2466,2468,2470,2473,2475],{"class":1119,"line":2465},81,[1117,2467,2407],{"class":1301},[1117,2469,1305],{"class":1180},[1117,2471,2472],{"class":1308},"is_active",[1117,2474,1256],{"class":1180},[1117,2476,2477],{"class":1198}," True\n",[1117,2479,2481,2483,2485,2488,2490,2493,2495,2498],{"class":1119,"line":2480},82,[1117,2482,2407],{"class":1301},[1117,2484,1305],{"class":1180},[1117,2486,2487],{"class":1308},"created_at",[1117,2489,1256],{"class":1180},[1117,2491,2492],{"class":1134}," timezone",[1117,2494,1305],{"class":1180},[1117,2496,2497],{"class":1516},"now",[1117,2499,2500],{"class":1180},"()\n",[1117,2502,2504,2506,2508,2511,2513,2515,2517,2520,2522,2524,2527,2529],{"class":1119,"line":2503},83,[1117,2505,2407],{"class":1301},[1117,2507,1305],{"class":1180},[1117,2509,2510],{"class":1308},"credit_limit",[1117,2512,1256],{"class":1180},[1117,2514,1213],{"class":1516},[1117,2516,1188],{"class":1180},[1117,2518,2519],{"class":1516},"Decimal",[1117,2521,1188],{"class":1180},[1117,2523,1439],{"class":1259},[1117,2525,2526],{"class":1263},"1000.00",[1117,2528,1439],{"class":1259},[1117,2530,2531],{"class":1180},"))\n",[1117,2533,2535,2537,2539,2542,2544,2546,2548,2550,2552,2554,2557,2559],{"class":1119,"line":2534},84,[1117,2536,2407],{"class":1301},[1117,2538,1305],{"class":1180},[1117,2540,2541],{"class":1308},"current_balance",[1117,2543,1256],{"class":1180},[1117,2545,1213],{"class":1516},[1117,2547,1188],{"class":1180},[1117,2549,2519],{"class":1516},[1117,2551,1188],{"class":1180},[1117,2553,1439],{"class":1259},[1117,2555,2556],{"class":1263},"0.00",[1117,2558,1439],{"class":1259},[1117,2560,2531],{"class":1180},[1117,2562,2564],{"class":1119,"line":2563},85,[1117,2565,1273],{"class":1134},[1117,2567,2569,2571,2574,2576,2578,2580,2583,2585,2587,2589,2592,2594,2596,2598,2601],{"class":1119,"line":2568},86,[1117,2570,1279],{"class":1208},[1117,2572,2573],{"class":1184}," add_address",[1117,2575,1188],{"class":1180},[1117,2577,1289],{"class":1288},[1117,2579,1425],{"class":1180},[1117,2581,2582],{"class":1428}," address",[1117,2584,1239],{"class":1180},[1117,2586,1705],{"class":1134},[1117,2588,1425],{"class":1180},[1117,2590,2591],{"class":1428}," is_primary",[1117,2593,1239],{"class":1180},[1117,2595,1646],{"class":1252},[1117,2597,1256],{"class":1180},[1117,2599,2600],{"class":1198}," False",[1117,2602,1292],{"class":1180},[1117,2604,2606,2608,2611],{"class":1119,"line":2605},87,[1117,2607,1458],{"class":1222},[1117,2609,2610],{"class":1226},"Add address with business rules",[1117,2612,1230],{"class":1222},[1117,2614,2616,2618,2620],{"class":1119,"line":2615},88,[1117,2617,1298],{"class":1130},[1117,2619,2591],{"class":1134},[1117,2621,1216],{"class":1180},[1117,2623,2625],{"class":1119,"line":2624},89,[1117,2626,2627],{"class":1123},"            # Only one primary address allowed\n",[1117,2629,2631,2634,2637,2640,2642,2644,2646],{"class":1119,"line":2630},90,[1117,2632,2633],{"class":1130},"            for",[1117,2635,2636],{"class":1134}," addr_info ",[1117,2638,2639],{"class":1130},"in",[1117,2641,1302],{"class":1301},[1117,2643,1305],{"class":1180},[1117,2645,2457],{"class":1308},[1117,2647,1216],{"class":1180},[1117,2649,2651,2654,2656,2658,2661,2663,2665,2667],{"class":1119,"line":2650},91,[1117,2652,2653],{"class":1134},"                addr_info",[1117,2655,2182],{"class":1180},[1117,2657,1439],{"class":1259},[1117,2659,2660],{"class":1263},"is_primary",[1117,2662,1439],{"class":1259},[1117,2664,2189],{"class":1180},[1117,2666,1256],{"class":1180},[1117,2668,2669],{"class":1198}," False\n",[1117,2671,2673],{"class":1119,"line":2672},92,[1117,2674,1346],{"class":1134},[1117,2676,2678,2680,2682,2684,2686,2689],{"class":1119,"line":2677},93,[1117,2679,2407],{"class":1301},[1117,2681,1305],{"class":1180},[1117,2683,2457],{"class":1308},[1117,2685,1305],{"class":1180},[1117,2687,2688],{"class":1516},"append",[1117,2690,2691],{"class":1180},"({\n",[1117,2693,2695,2698,2701,2703,2705,2707],{"class":1119,"line":2694},94,[1117,2696,2697],{"class":1259},"            '",[1117,2699,2700],{"class":1263},"address",[1117,2702,1439],{"class":1259},[1117,2704,1239],{"class":1180},[1117,2706,2582],{"class":1516},[1117,2708,2709],{"class":1180},",\n",[1117,2711,2713,2715,2717,2719,2721,2723],{"class":1119,"line":2712},95,[1117,2714,2697],{"class":1259},[1117,2716,2660],{"class":1263},[1117,2718,1439],{"class":1259},[1117,2720,1239],{"class":1180},[1117,2722,2591],{"class":1516},[1117,2724,2709],{"class":1180},[1117,2726,2728,2730,2733,2735,2737,2739,2741,2743],{"class":1119,"line":2727},96,[1117,2729,2697],{"class":1259},[1117,2731,2732],{"class":1263},"added_at",[1117,2734,1439],{"class":1259},[1117,2736,1239],{"class":1180},[1117,2738,2492],{"class":1516},[1117,2740,1305],{"class":1180},[1117,2742,2497],{"class":1516},[1117,2744,2500],{"class":1180},[1117,2746,2748],{"class":1119,"line":2747},97,[1117,2749,2750],{"class":1180},"        })\n",[1117,2752,2754],{"class":1119,"line":2753},98,[1117,2755,1273],{"class":1134},[1117,2757,2759,2761,2764,2766,2768,2770,2772,2775,2777,2779],{"class":1119,"line":2758},99,[1117,2760,1279],{"class":1208},[1117,2762,2763],{"class":1184}," get_primary_address",[1117,2765,1188],{"class":1180},[1117,2767,1289],{"class":1288},[1117,2769,1379],{"class":1180},[1117,2771,1444],{"class":1180},[1117,2773,2774],{"class":1134}," Optional",[1117,2776,2182],{"class":1180},[1117,2778,1891],{"class":1134},[1117,2780,2781],{"class":1180},"]:\n",[1117,2783,2785,2787,2790],{"class":1119,"line":2784},100,[1117,2786,1458],{"class":1222},[1117,2788,2789],{"class":1226},"Get primary address",[1117,2791,1230],{"class":1222},[1117,2793,2795,2798,2800,2802,2804,2806,2808],{"class":1119,"line":2794},101,[1117,2796,2797],{"class":1130},"        for",[1117,2799,2636],{"class":1134},[1117,2801,2639],{"class":1130},[1117,2803,1302],{"class":1301},[1117,2805,1305],{"class":1180},[1117,2807,2457],{"class":1308},[1117,2809,1216],{"class":1180},[1117,2811,2813,2816,2819,2821,2823,2825,2827],{"class":1119,"line":2812},102,[1117,2814,2815],{"class":1130},"            if",[1117,2817,2818],{"class":1134}," addr_info",[1117,2820,2182],{"class":1180},[1117,2822,1439],{"class":1259},[1117,2824,2660],{"class":1263},[1117,2826,1439],{"class":1259},[1117,2828,2781],{"class":1180},[1117,2830,2832,2835,2837,2839,2841,2843,2845],{"class":1119,"line":2831},103,[1117,2833,2834],{"class":1130},"                return",[1117,2836,2818],{"class":1134},[1117,2838,2182],{"class":1180},[1117,2840,1439],{"class":1259},[1117,2842,2700],{"class":1263},[1117,2844,1439],{"class":1259},[1117,2846,2324],{"class":1180},[1117,2848,2850,2852],{"class":1119,"line":2849},104,[1117,2851,1513],{"class":1130},[1117,2853,2256],{"class":1198},[1117,2855,2857],{"class":1119,"line":2856},105,[1117,2858,1273],{"class":1134},[1117,2860,2862,2864,2867,2869,2871,2873,2876,2878,2880],{"class":1119,"line":2861},106,[1117,2863,1279],{"class":1208},[1117,2865,2866],{"class":1184}," change_email",[1117,2868,1188],{"class":1180},[1117,2870,1289],{"class":1288},[1117,2872,1425],{"class":1180},[1117,2874,2875],{"class":1428}," new_email",[1117,2877,1239],{"class":1180},[1117,2879,2011],{"class":1134},[1117,2881,1292],{"class":1180},[1117,2883,2885,2887,2890],{"class":1119,"line":2884},107,[1117,2886,1458],{"class":1222},[1117,2888,2889],{"class":1226},"Change email with business validation",[1117,2891,1230],{"class":1222},[1117,2893,2895,2897,2900,2903,2905,2907,2909],{"class":1119,"line":2894},108,[1117,2896,1298],{"class":1130},[1117,2898,2899],{"class":1134}," new_email ",[1117,2901,2902],{"class":1312},"==",[1117,2904,1302],{"class":1301},[1117,2906,1305],{"class":1180},[1117,2908,2427],{"class":1308},[1117,2910,1216],{"class":1180},[1117,2912,2914,2917],{"class":1119,"line":2913},109,[1117,2915,2916],{"class":1130},"            return",[1117,2918,2919],{"class":1123},"  # No change needed\n",[1117,2921,2923],{"class":1119,"line":2922},110,[1117,2924,1346],{"class":1134},[1117,2926,2928],{"class":1119,"line":2927},111,[1117,2929,2930],{"class":1123},"        # Business rule: email change requires verification\n",[1117,2932,2934,2936,2938,2940,2942],{"class":1119,"line":2933},112,[1117,2935,2407],{"class":1301},[1117,2937,1305],{"class":1180},[1117,2939,2427],{"class":1308},[1117,2941,1256],{"class":1180},[1117,2943,2944],{"class":1134}," new_email\n",[1117,2946,2948,2950,2952,2954,2956,2958],{"class":1119,"line":2947},113,[1117,2949,2407],{"class":1301},[1117,2951,1305],{"class":1180},[1117,2953,2472],{"class":1308},[1117,2955,1256],{"class":1180},[1117,2957,2600],{"class":1198},[1117,2959,2960],{"class":1123},"  # Deactivate until email verified\n",[1117,2962,2964],{"class":1119,"line":2963},114,[1117,2965,1273],{"class":1134},[1117,2967,2969,2971,2974,2976,2978,2980,2983,2985,2987],{"class":1119,"line":2968},115,[1117,2970,1279],{"class":1208},[1117,2972,2973],{"class":1184}," increase_credit_limit",[1117,2975,1188],{"class":1180},[1117,2977,1289],{"class":1288},[1117,2979,1425],{"class":1180},[1117,2981,2982],{"class":1428}," amount",[1117,2984,1239],{"class":1180},[1117,2986,1213],{"class":1134},[1117,2988,1292],{"class":1180},[1117,2990,2992,2994,2997],{"class":1119,"line":2991},116,[1117,2993,1458],{"class":1222},[1117,2995,2996],{"class":1226},"Increase credit limit with business rules",[1117,2998,1230],{"class":1222},[1117,3000,3002,3004,3006,3008,3010,3013,3015],{"class":1119,"line":3001},117,[1117,3003,1298],{"class":1130},[1117,3005,2982],{"class":1134},[1117,3007,1305],{"class":1180},[1117,3009,1309],{"class":1308},[1117,3011,3012],{"class":1312}," \u003C=",[1117,3014,1317],{"class":1316},[1117,3016,1216],{"class":1180},[1117,3018,3020,3022,3024,3026,3028,3031,3033],{"class":1119,"line":3019},118,[1117,3021,1325],{"class":1130},[1117,3023,1328],{"class":1252},[1117,3025,1188],{"class":1180},[1117,3027,1333],{"class":1259},[1117,3029,3030],{"class":1263},"Credit limit increase must be positive",[1117,3032,1333],{"class":1259},[1117,3034,1202],{"class":1180},[1117,3036,3038],{"class":1119,"line":3037},119,[1117,3039,1346],{"class":1134},[1117,3041,3043],{"class":1119,"line":3042},120,[1117,3044,3045],{"class":1123},"        # Business rule: credit limit increases require approval for large amounts\n",[1117,3047,3049,3051,3053,3055,3057,3060,3063],{"class":1119,"line":3048},121,[1117,3050,1298],{"class":1130},[1117,3052,2982],{"class":1134},[1117,3054,1305],{"class":1180},[1117,3056,1309],{"class":1308},[1117,3058,3059],{"class":1312}," >",[1117,3061,3062],{"class":1316}," 5000",[1117,3064,1216],{"class":1180},[1117,3066,3068,3070,3073,3075,3077,3080,3082],{"class":1119,"line":3067},122,[1117,3069,1325],{"class":1130},[1117,3071,3072],{"class":1516}," BusinessRuleError",[1117,3074,1188],{"class":1180},[1117,3076,1333],{"class":1259},[1117,3078,3079],{"class":1263},"Large credit increases require manual approval",[1117,3081,1333],{"class":1259},[1117,3083,1202],{"class":1180},[1117,3085,3087],{"class":1119,"line":3086},123,[1117,3088,1346],{"class":1134},[1117,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3111,3113,3115],{"class":1119,"line":3091},124,[1117,3093,2407],{"class":1301},[1117,3095,1305],{"class":1180},[1117,3097,2510],{"class":1308},[1117,3099,1256],{"class":1180},[1117,3101,1302],{"class":1301},[1117,3103,1305],{"class":1180},[1117,3105,2510],{"class":1308},[1117,3107,1305],{"class":1180},[1117,3109,3110],{"class":1516},"add",[1117,3112,1188],{"class":1180},[1117,3114,1309],{"class":1516},[1117,3116,1202],{"class":1180},[1117,3118,3120],{"class":1119,"line":3119},125,[1117,3121,1273],{"class":1134},[1117,3123,3125,3127,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148],{"class":1119,"line":3124},126,[1117,3126,1279],{"class":1208},[1117,3128,3129],{"class":1184}," can_make_purchase",[1117,3131,1188],{"class":1180},[1117,3133,1289],{"class":1288},[1117,3135,1425],{"class":1180},[1117,3137,2982],{"class":1428},[1117,3139,1239],{"class":1180},[1117,3141,1213],{"class":1134},[1117,3143,1379],{"class":1180},[1117,3145,1444],{"class":1180},[1117,3147,1646],{"class":1252},[1117,3149,1216],{"class":1180},[1117,3151,3153,3155,3158],{"class":1119,"line":3152},127,[1117,3154,1458],{"class":1222},[1117,3156,3157],{"class":1226},"Check if customer can make a purchase",[1117,3159,1230],{"class":1222},[1117,3161,3163,3165,3167,3169,3171,3173],{"class":1119,"line":3162},128,[1117,3164,1298],{"class":1130},[1117,3166,1354],{"class":1312},[1117,3168,1302],{"class":1301},[1117,3170,1305],{"class":1180},[1117,3172,2472],{"class":1308},[1117,3174,1216],{"class":1180},[1117,3176,3178,3180],{"class":1119,"line":3177},129,[1117,3179,2916],{"class":1130},[1117,3181,2669],{"class":1198},[1117,3183,3185],{"class":1119,"line":3184},130,[1117,3186,1346],{"class":1134},[1117,3188,3190,3193,3195,3197,3199,3201,3203,3205,3207,3209],{"class":1119,"line":3189},131,[1117,3191,3192],{"class":1134},"        total_after_purchase ",[1117,3194,1195],{"class":1180},[1117,3196,1302],{"class":1301},[1117,3198,1305],{"class":1180},[1117,3200,2541],{"class":1308},[1117,3202,1305],{"class":1180},[1117,3204,3110],{"class":1516},[1117,3206,1188],{"class":1180},[1117,3208,1309],{"class":1516},[1117,3210,1202],{"class":1180},[1117,3212,3214,3216,3219,3221,3223,3225,3227,3229,3231,3233],{"class":1119,"line":3213},132,[1117,3215,1513],{"class":1130},[1117,3217,3218],{"class":1134}," total_after_purchase",[1117,3220,1305],{"class":1180},[1117,3222,1309],{"class":1308},[1117,3224,3012],{"class":1312},[1117,3226,1302],{"class":1301},[1117,3228,1305],{"class":1180},[1117,3230,2510],{"class":1308},[1117,3232,1305],{"class":1180},[1117,3234,3235],{"class":1308},"amount\n",[1117,3237,3239],{"class":1119,"line":3238},133,[1117,3240,1273],{"class":1134},[1117,3242,3244,3246,3249,3251,3253,3255,3257,3259,3261],{"class":1119,"line":3243},134,[1117,3245,1279],{"class":1208},[1117,3247,3248],{"class":1184}," make_purchase",[1117,3250,1188],{"class":1180},[1117,3252,1289],{"class":1288},[1117,3254,1425],{"class":1180},[1117,3256,2982],{"class":1428},[1117,3258,1239],{"class":1180},[1117,3260,1213],{"class":1134},[1117,3262,1292],{"class":1180},[1117,3264,3266,3268,3271],{"class":1119,"line":3265},135,[1117,3267,1458],{"class":1222},[1117,3269,3270],{"class":1226},"Make a purchase with business validation",[1117,3272,1230],{"class":1222},[1117,3274,3276,3278,3280,3282,3284,3287,3289,3291],{"class":1119,"line":3275},136,[1117,3277,1298],{"class":1130},[1117,3279,1354],{"class":1312},[1117,3281,1302],{"class":1301},[1117,3283,1305],{"class":1180},[1117,3285,3286],{"class":1516},"can_make_purchase",[1117,3288,1188],{"class":1180},[1117,3290,1309],{"class":1516},[1117,3292,1292],{"class":1180},[1117,3294,3296,3298,3300,3302,3304,3307,3309],{"class":1119,"line":3295},137,[1117,3297,1325],{"class":1130},[1117,3299,3072],{"class":1516},[1117,3301,1188],{"class":1180},[1117,3303,1333],{"class":1259},[1117,3305,3306],{"class":1263},"Purchase exceeds credit limit",[1117,3308,1333],{"class":1259},[1117,3310,1202],{"class":1180},[1117,3312,3314],{"class":1119,"line":3313},138,[1117,3315,1346],{"class":1134},[1117,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337,3339,3341],{"class":1119,"line":3318},139,[1117,3320,2407],{"class":1301},[1117,3322,1305],{"class":1180},[1117,3324,2541],{"class":1308},[1117,3326,1256],{"class":1180},[1117,3328,1302],{"class":1301},[1117,3330,1305],{"class":1180},[1117,3332,2541],{"class":1308},[1117,3334,1305],{"class":1180},[1117,3336,3110],{"class":1516},[1117,3338,1188],{"class":1180},[1117,3340,1309],{"class":1516},[1117,3342,1202],{"class":1180},[1117,3344,3346],{"class":1119,"line":3345},140,[1117,3347,1174],{"emptyLinePlaceholder":1173},[1117,3349,3351,3353,3356],{"class":1119,"line":3350},141,[1117,3352,1209],{"class":1208},[1117,3354,3355],{"class":1212}," Product",[1117,3357,1216],{"class":1180},[1117,3359,3361,3363,3366],{"class":1119,"line":3360},142,[1117,3362,1223],{"class":1222},[1117,3364,3365],{"class":1226},"Product entity with business logic",[1117,3367,1230],{"class":1222},[1117,3369,3371],{"class":1119,"line":3370},143,[1117,3372,1273],{"class":1134},[1117,3374,3376,3378,3380,3382,3384,3386,3389,3391,3393,3395,3397,3399,3401,3403,3406,3408,3410],{"class":1119,"line":3375},144,[1117,3377,1279],{"class":1208},[1117,3379,2368],{"class":1367},[1117,3381,1188],{"class":1180},[1117,3383,1289],{"class":1288},[1117,3385,1425],{"class":1180},[1117,3387,3388],{"class":1428}," product_id",[1117,3390,1239],{"class":1180},[1117,3392,2382],{"class":1252},[1117,3394,1425],{"class":1180},[1117,3396,2395],{"class":1428},[1117,3398,1239],{"class":1180},[1117,3400,1253],{"class":1252},[1117,3402,1425],{"class":1180},[1117,3404,3405],{"class":1428}," price",[1117,3407,1239],{"class":1180},[1117,3409,1213],{"class":1134},[1117,3411,1292],{"class":1180},[1117,3413,3415,3417,3419,3421,3423],{"class":1119,"line":3414},145,[1117,3416,2407],{"class":1301},[1117,3418,1305],{"class":1180},[1117,3420,2412],{"class":1308},[1117,3422,1256],{"class":1180},[1117,3424,3425],{"class":1134}," product_id\n",[1117,3427,3429,3431,3433,3435,3437],{"class":1119,"line":3428},146,[1117,3430,2407],{"class":1301},[1117,3432,1305],{"class":1180},[1117,3434,2442],{"class":1308},[1117,3436,1256],{"class":1180},[1117,3438,2447],{"class":1134},[1117,3440,3442,3444,3446,3449,3451],{"class":1119,"line":3441},147,[1117,3443,2407],{"class":1301},[1117,3445,1305],{"class":1180},[1117,3447,3448],{"class":1308},"price",[1117,3450,1256],{"class":1180},[1117,3452,3453],{"class":1134}," price\n",[1117,3455,3457,3459,3461,3463,3465],{"class":1119,"line":3456},148,[1117,3458,2407],{"class":1301},[1117,3460,1305],{"class":1180},[1117,3462,2472],{"class":1308},[1117,3464,1256],{"class":1180},[1117,3466,2477],{"class":1198},[1117,3468,3470,3472,3474,3476,3478,3480,3482,3484],{"class":1119,"line":3469},149,[1117,3471,2407],{"class":1301},[1117,3473,1305],{"class":1180},[1117,3475,2487],{"class":1308},[1117,3477,1256],{"class":1180},[1117,3479,2492],{"class":1134},[1117,3481,1305],{"class":1180},[1117,3483,2497],{"class":1516},[1117,3485,2500],{"class":1180},[1117,3487,3489,3491,3493,3496,3498],{"class":1119,"line":3488},150,[1117,3490,2407],{"class":1301},[1117,3492,1305],{"class":1180},[1117,3494,3495],{"class":1308},"category_id",[1117,3497,1256],{"class":1180},[1117,3499,2256],{"class":1198},[1117,3501,3503,3505,3507,3510,3512],{"class":1119,"line":3502},151,[1117,3504,2407],{"class":1301},[1117,3506,1305],{"class":1180},[1117,3508,3509],{"class":1308},"inventory_count",[1117,3511,1256],{"class":1180},[1117,3513,1675],{"class":1316},[1117,3515,3517],{"class":1119,"line":3516},152,[1117,3518,1273],{"class":1134},[1117,3520,3522,3524,3527,3529,3531,3533,3536,3538,3540],{"class":1119,"line":3521},153,[1117,3523,1279],{"class":1208},[1117,3525,3526],{"class":1184}," change_price",[1117,3528,1188],{"class":1180},[1117,3530,1289],{"class":1288},[1117,3532,1425],{"class":1180},[1117,3534,3535],{"class":1428}," new_price",[1117,3537,1239],{"class":1180},[1117,3539,1213],{"class":1134},[1117,3541,1292],{"class":1180},[1117,3543,3545,3547,3550],{"class":1119,"line":3544},154,[1117,3546,1458],{"class":1222},[1117,3548,3549],{"class":1226},"Change product price with business rules",[1117,3551,1230],{"class":1222},[1117,3553,3555,3557,3559,3561,3563,3565,3567],{"class":1119,"line":3554},155,[1117,3556,1298],{"class":1130},[1117,3558,3535],{"class":1134},[1117,3560,1305],{"class":1180},[1117,3562,1309],{"class":1308},[1117,3564,3012],{"class":1312},[1117,3566,1317],{"class":1316},[1117,3568,1216],{"class":1180},[1117,3570,3572,3574,3576,3578,3580,3583,3585],{"class":1119,"line":3571},156,[1117,3573,1325],{"class":1130},[1117,3575,1328],{"class":1252},[1117,3577,1188],{"class":1180},[1117,3579,1333],{"class":1259},[1117,3581,3582],{"class":1263},"Product price must be positive",[1117,3584,1333],{"class":1259},[1117,3586,1202],{"class":1180},[1117,3588,3590],{"class":1119,"line":3589},157,[1117,3591,1346],{"class":1134},[1117,3593,3595],{"class":1119,"line":3594},158,[1117,3596,3597],{"class":1123},"        # Business rule: price changes > 50% require approval\n",[1117,3599,3601,3603,3606,3608,3611,3613,3615,3618,3620,3622,3624,3626,3628,3630,3633,3635,3637,3639,3641,3643,3645,3648],{"class":1119,"line":3600},159,[1117,3602,1298],{"class":1130},[1117,3604,3605],{"class":1367}," abs",[1117,3607,1188],{"class":1180},[1117,3609,3610],{"class":1516},"new_price",[1117,3612,1305],{"class":1180},[1117,3614,1309],{"class":1308},[1117,3616,3617],{"class":1312}," -",[1117,3619,1302],{"class":1301},[1117,3621,1305],{"class":1180},[1117,3623,3448],{"class":1308},[1117,3625,1305],{"class":1180},[1117,3627,1309],{"class":1308},[1117,3629,1379],{"class":1180},[1117,3631,3632],{"class":1312}," /",[1117,3634,1302],{"class":1301},[1117,3636,1305],{"class":1180},[1117,3638,3448],{"class":1308},[1117,3640,1305],{"class":1180},[1117,3642,1309],{"class":1308},[1117,3644,3059],{"class":1312},[1117,3646,3647],{"class":1316}," 0.5",[1117,3649,1216],{"class":1180},[1117,3651,3653,3655,3657,3659,3661,3664,3666],{"class":1119,"line":3652},160,[1117,3654,1325],{"class":1130},[1117,3656,3072],{"class":1516},[1117,3658,1188],{"class":1180},[1117,3660,1333],{"class":1259},[1117,3662,3663],{"class":1263},"Large price changes require approval",[1117,3665,1333],{"class":1259},[1117,3667,1202],{"class":1180},[1117,3669,3671],{"class":1119,"line":3670},161,[1117,3672,1346],{"class":1134},[1117,3674,3676,3678,3680,3682,3684],{"class":1119,"line":3675},162,[1117,3677,2407],{"class":1301},[1117,3679,1305],{"class":1180},[1117,3681,3448],{"class":1308},[1117,3683,1256],{"class":1180},[1117,3685,3686],{"class":1134}," new_price\n",[1117,3688,3690],{"class":1119,"line":3689},163,[1117,3691,1273],{"class":1134},[1117,3693,3695,3697,3700,3702,3704,3706,3708,3710],{"class":1119,"line":3694},164,[1117,3696,1279],{"class":1208},[1117,3698,3699],{"class":1184}," is_available",[1117,3701,1188],{"class":1180},[1117,3703,1289],{"class":1288},[1117,3705,1379],{"class":1180},[1117,3707,1444],{"class":1180},[1117,3709,1646],{"class":1252},[1117,3711,1216],{"class":1180},[1117,3713,3715,3717,3720],{"class":1119,"line":3714},165,[1117,3716,1458],{"class":1222},[1117,3718,3719],{"class":1226},"Check if product is available for purchase",[1117,3721,1230],{"class":1222},[1117,3723,3725,3727,3729,3731,3733,3735,3737,3739,3741,3743],{"class":1119,"line":3724},166,[1117,3726,1513],{"class":1130},[1117,3728,1302],{"class":1301},[1117,3730,1305],{"class":1180},[1117,3732,2472],{"class":1308},[1117,3734,1936],{"class":1312},[1117,3736,1302],{"class":1301},[1117,3738,1305],{"class":1180},[1117,3740,3509],{"class":1308},[1117,3742,3059],{"class":1312},[1117,3744,1675],{"class":1316},[1117,3746,3748],{"class":1119,"line":3747},167,[1117,3749,1273],{"class":1134},[1117,3751,3753,3755,3758,3760,3762,3764,3767,3769,3771],{"class":1119,"line":3752},168,[1117,3754,1279],{"class":1208},[1117,3756,3757],{"class":1184}," reserve_inventory",[1117,3759,1188],{"class":1180},[1117,3761,1289],{"class":1288},[1117,3763,1425],{"class":1180},[1117,3765,3766],{"class":1428}," quantity",[1117,3768,1239],{"class":1180},[1117,3770,2382],{"class":1252},[1117,3772,1292],{"class":1180},[1117,3774,3776,3778,3781],{"class":1119,"line":3775},169,[1117,3777,1458],{"class":1222},[1117,3779,3780],{"class":1226},"Reserve inventory with business validation",[1117,3782,1230],{"class":1222},[1117,3784,3786,3788,3791,3794,3796],{"class":1119,"line":3785},170,[1117,3787,1298],{"class":1130},[1117,3789,3790],{"class":1134}," quantity ",[1117,3792,3793],{"class":1312},"\u003C=",[1117,3795,1317],{"class":1316},[1117,3797,1216],{"class":1180},[1117,3799,3801,3803,3805,3807,3809,3812,3814],{"class":1119,"line":3800},171,[1117,3802,1325],{"class":1130},[1117,3804,1328],{"class":1252},[1117,3806,1188],{"class":1180},[1117,3808,1333],{"class":1259},[1117,3810,3811],{"class":1263},"Quantity must be positive",[1117,3813,1333],{"class":1259},[1117,3815,1202],{"class":1180},[1117,3817,3819],{"class":1119,"line":3818},172,[1117,3820,1346],{"class":1134},[1117,3822,3824,3826,3828,3831,3833,3835,3837],{"class":1119,"line":3823},173,[1117,3825,1298],{"class":1130},[1117,3827,3790],{"class":1134},[1117,3829,3830],{"class":1312},">",[1117,3832,1302],{"class":1301},[1117,3834,1305],{"class":1180},[1117,3836,3509],{"class":1308},[1117,3838,1216],{"class":1180},[1117,3840,3842,3844,3846,3848,3850,3853,3855],{"class":1119,"line":3841},174,[1117,3843,1325],{"class":1130},[1117,3845,3072],{"class":1516},[1117,3847,1188],{"class":1180},[1117,3849,1333],{"class":1259},[1117,3851,3852],{"class":1263},"Insufficient inventory",[1117,3854,1333],{"class":1259},[1117,3856,1202],{"class":1180},[1117,3858,3860],{"class":1119,"line":3859},175,[1117,3861,1346],{"class":1134},[1117,3863,3865,3867,3869,3871,3874],{"class":1119,"line":3864},176,[1117,3866,2407],{"class":1301},[1117,3868,1305],{"class":1180},[1117,3870,3509],{"class":1308},[1117,3872,3873],{"class":1180}," -=",[1117,3875,3876],{"class":1134}," quantity\n",[1117,3878,3880],{"class":1119,"line":3879},177,[1117,3881,1273],{"class":1134},[1117,3883,3885,3887,3890,3892,3894,3896,3898,3900,3902],{"class":1119,"line":3884},178,[1117,3886,1279],{"class":1208},[1117,3888,3889],{"class":1184}," release_inventory",[1117,3891,1188],{"class":1180},[1117,3893,1289],{"class":1288},[1117,3895,1425],{"class":1180},[1117,3897,3766],{"class":1428},[1117,3899,1239],{"class":1180},[1117,3901,2382],{"class":1252},[1117,3903,1292],{"class":1180},[1117,3905,3907,3909,3912],{"class":1119,"line":3906},179,[1117,3908,1458],{"class":1222},[1117,3910,3911],{"class":1226},"Release reserved inventory",[1117,3913,1230],{"class":1222},[1117,3915,3917,3919,3921,3923,3925],{"class":1119,"line":3916},180,[1117,3918,1298],{"class":1130},[1117,3920,3790],{"class":1134},[1117,3922,3793],{"class":1312},[1117,3924,1317],{"class":1316},[1117,3926,1216],{"class":1180},[1117,3928,3930,3932,3934,3936,3938,3940,3942],{"class":1119,"line":3929},181,[1117,3931,1325],{"class":1130},[1117,3933,1328],{"class":1252},[1117,3935,1188],{"class":1180},[1117,3937,1333],{"class":1259},[1117,3939,3811],{"class":1263},[1117,3941,1333],{"class":1259},[1117,3943,1202],{"class":1180},[1117,3945,3947],{"class":1119,"line":3946},182,[1117,3948,1346],{"class":1134},[1117,3950,3952,3954,3956,3958,3961],{"class":1119,"line":3951},183,[1117,3953,2407],{"class":1301},[1117,3955,1305],{"class":1180},[1117,3957,3509],{"class":1308},[1117,3959,3960],{"class":1180}," +=",[1117,3962,3876],{"class":1134},[1022,3964,3966],{"id":3965},"aggregates-consistency-boundaries","Aggregates - Consistency Boundaries",[1026,3968,3969],{},"Aggregates are clusters of domain objects that are treated as a single unit for data changes. They enforce business invariants and maintain consistency.",[1107,3971,3973],{"className":1109,"code":3972,"language":1111,"meta":1112,"style":1112},"# Aggregate Root - The only entry point to the aggregate\nclass Order:\n    \"\"\"Order aggregate root\"\"\"\n    \n    def __init__(self, order_id: int, customer_id: int):\n        self.id = order_id\n        self.customer_id = customer_id\n        self.items = []\n        self.status = OrderStatus.DRAFT\n        self.total = Money(Decimal('0.00'))\n        self.shipping_address = None\n        self.created_at = timezone.now()\n        self.confirmed_at = None\n    \n    def add_item(self, product: Product, quantity: int) -> 'OrderItem':\n        \"\"\"Add item to order with business validation\"\"\"\n        if self.status != OrderStatus.DRAFT:\n            raise BusinessRuleError(\"Cannot modify confirmed order\")\n        \n        if not product.is_available():\n            raise BusinessRuleError(\"Product is not available\")\n        \n        if quantity \u003C= 0:\n            raise ValueError(\"Quantity must be positive\")\n        \n        # Check if item already exists\n        existing_item = self._find_item(product.id)\n        if existing_item:\n            existing_item.increase_quantity(quantity)\n            item = existing_item\n        else:\n            item = OrderItem(product.id, product.name, product.price, quantity)\n            self.items.append(item)\n        \n        # Reserve inventory\n        product.reserve_inventory(quantity)\n        \n        # Recalculate total\n        self._recalculate_total()\n        \n        return item\n    \n    def remove_item(self, product_id: int):\n        \"\"\"Remove item from order\"\"\"\n        if self.status != OrderStatus.DRAFT:\n            raise BusinessRuleError(\"Cannot modify confirmed order\")\n        \n        item = self._find_item(product_id)\n        if not item:\n            raise ValueError(\"Item not found in order\")\n        \n        self.items.remove(item)\n        self._recalculate_total()\n    \n    def set_shipping_address(self, address: Address):\n        \"\"\"Set shipping address with validation\"\"\"\n        if self.status not in [OrderStatus.DRAFT, OrderStatus.CONFIRMED]:\n            raise BusinessRuleError(\"Cannot change address for shipped orders\")\n        \n        self.shipping_address = address\n    \n    def confirm(self):\n        \"\"\"Confirm order with business validation\"\"\"\n        if self.status != OrderStatus.DRAFT:\n            raise BusinessRuleError(\"Can only confirm draft orders\")\n        \n        if not self.items:\n            raise BusinessRuleError(\"Cannot confirm empty order\")\n        \n        if not self.shipping_address:\n            raise BusinessRuleError(\"Shipping address is required\")\n        \n        if self.total.is_zero():\n            raise BusinessRuleError(\"Order total must be greater than zero\")\n        \n        self.status = OrderStatus.CONFIRMED\n        self.confirmed_at = timezone.now()\n        \n        # Raise domain event\n        DomainEvents.raise_event(OrderConfirmedEvent(self))\n    \n    def cancel(self):\n        \"\"\"Cancel order with business rules\"\"\"\n        if self.status not in [OrderStatus.DRAFT, OrderStatus.CONFIRMED]:\n            raise BusinessRuleError(\"Cannot cancel order in current status\")\n        \n        # Release reserved inventory\n        for item in self.items:\n            # This would need to be handled by a domain service\n            # that has access to the product repository\n            pass\n        \n        self.status = OrderStatus.CANCELLED\n        \n        # Raise domain event\n        DomainEvents.raise_event(OrderCancelledEvent(self))\n    \n    def ship(self, tracking_number: str):\n        \"\"\"Ship order with validation\"\"\"\n        if self.status != OrderStatus.CONFIRMED:\n            raise BusinessRuleError(\"Can only ship confirmed orders\")\n        \n        if not tracking_number:\n            raise ValueError(\"Tracking number is required\")\n        \n        self.status = OrderStatus.SHIPPED\n        self.tracking_number = tracking_number\n        \n        # Raise domain event\n        DomainEvents.raise_event(OrderShippedEvent(self, tracking_number))\n    \n    def _find_item(self, product_id: int) -> Optional['OrderItem']:\n        \"\"\"Find order item by product ID\"\"\"\n        return next((item for item in self.items if item.product_id == product_id), None)\n    \n    def _recalculate_total(self):\n        \"\"\"Recalculate order total\"\"\"\n        total_amount = sum(item.total().amount for item in self.items)\n        self.total = Money(total_amount)\n\nclass OrderItem:\n    \"\"\"Order item entity (part of Order aggregate)\"\"\"\n    \n    def __init__(self, product_id: int, product_name: str, unit_price: Money, quantity: int):\n        self.product_id = product_id\n        self.product_name = product_name\n        self.unit_price = unit_price\n        self.quantity = quantity\n    \n    def increase_quantity(self, additional_quantity: int):\n        \"\"\"Increase item quantity\"\"\"\n        if additional_quantity \u003C= 0:\n            raise ValueError(\"Additional quantity must be positive\")\n        \n        self.quantity += additional_quantity\n    \n    def change_quantity(self, new_quantity: int):\n        \"\"\"Change item quantity\"\"\"\n        if new_quantity \u003C= 0:\n            raise ValueError(\"Quantity must be positive\")\n        \n        self.quantity = new_quantity\n    \n    def total(self) -> Money:\n        \"\"\"Calculate item total\"\"\"\n        return self.unit_price.multiply(Decimal(self.quantity))\n\n# Order Status Enum\nfrom enum import Enum\n\nclass OrderStatus(Enum):\n    DRAFT = \"draft\"\n    CONFIRMED = \"confirmed\"\n    SHIPPED = \"shipped\"\n    DELIVERED = \"delivered\"\n    CANCELLED = \"cancelled\"\n\n# Domain Events\nclass DomainEvent:\n    \"\"\"Base class for domain events\"\"\"\n    \n    def __init__(self, aggregate_root):\n        self.aggregate_root = aggregate_root\n        self.occurred_at = timezone.now()\n\nclass OrderConfirmedEvent(DomainEvent):\n    \"\"\"Event raised when order is confirmed\"\"\"\n    \n    def __init__(self, order: Order):\n        super().__init__(order)\n        self.order_id = order.id\n        self.customer_id = order.customer_id\n        self.total = order.total\n\nclass OrderCancelledEvent(DomainEvent):\n    \"\"\"Event raised when order is cancelled\"\"\"\n    \n    def __init__(self, order: Order):\n        super().__init__(order)\n        self.order_id = order.id\n        self.customer_id = order.customer_id\n\nclass OrderShippedEvent(DomainEvent):\n    \"\"\"Event raised when order is shipped\"\"\"\n    \n    def __init__(self, order: Order, tracking_number: str):\n        super().__init__(order)\n        self.order_id = order.id\n        self.customer_id = order.customer_id\n        self.tracking_number = tracking_number\n\n# Domain Events Manager\nclass DomainEvents:\n    \"\"\"Manager for domain events\"\"\"\n    \n    _events = []\n    \n    @classmethod\n    def raise_event(cls, event: DomainEvent):\n        \"\"\"Raise a domain event\"\"\"\n        cls._events.append(event)\n    \n    @classmethod\n    def get_events(cls) -> list:\n        \"\"\"Get all raised events\"\"\"\n        return cls._events.copy()\n    \n    @classmethod\n    def clear_events(cls):\n        \"\"\"Clear all events\"\"\"\n        cls._events.clear()\n",[1114,3974,3975,3980,3989,3998,4002,4031,4044,4057,4070,4090,4117,4130,4148,4161,4165,4206,4215,4236,4253,4257,4273,4290,4294,4306,4322,4326,4331,4356,4365,4382,4392,4399,4438,4458,4462,4467,4483,4487,4492,4503,4507,4514,4518,4539,4548,4568,4584,4588,4608,4619,4636,4640,4659,4669,4673,4694,4703,4739,4756,4760,4773,4777,4790,4799,4819,4836,4840,4854,4871,4875,4889,4906,4910,4927,4944,4948,4965,4983,4987,4992,5013,5017,5030,5039,5071,5088,5092,5097,5114,5119,5124,5129,5133,5150,5154,5158,5177,5181,5203,5212,5232,5249,5253,5263,5280,5284,5301,5315,5319,5323,5346,5350,5385,5394,5441,5445,5458,5467,5505,5524,5528,5536,5545,5549,5595,5607,5621,5635,5647,5651,5673,5682,5695,5712,5716,5729,5733,5755,5764,5777,5793,5797,5810,5814,5833,5842,5871,5875,5880,5892,5896,5910,5926,5940,5954,5968,5982,5986,5991,6000,6009,6013,6030,6044,6063,6067,6081,6090,6094,6115,6132,6150,6167,6184,6188,6201,6210,6214,6234,6248,6264,6280,6284,6297,6307,6312,6341,6356,6373,6390,6403,6408,6414,6424,6434,6439,6449,6454,6463,6487,6497,6519,6524,6531,6552,6562,6581,6586,6593,6607,6617],{"__ignoreMap":1112},[1117,3976,3977],{"class":1119,"line":1120},[1117,3978,3979],{"class":1123},"# Aggregate Root - The only entry point to the aggregate\n",[1117,3981,3982,3984,3987],{"class":1119,"line":1127},[1117,3983,1209],{"class":1208},[1117,3985,3986],{"class":1212}," Order",[1117,3988,1216],{"class":1180},[1117,3990,3991,3993,3996],{"class":1119,"line":1144},[1117,3992,1223],{"class":1222},[1117,3994,3995],{"class":1226},"Order aggregate root",[1117,3997,1230],{"class":1222},[1117,3999,4000],{"class":1119,"line":1157},[1117,4001,1273],{"class":1134},[1117,4003,4004,4006,4008,4010,4012,4014,4017,4019,4021,4023,4025,4027,4029],{"class":1119,"line":1170},[1117,4005,1279],{"class":1208},[1117,4007,2368],{"class":1367},[1117,4009,1188],{"class":1180},[1117,4011,1289],{"class":1288},[1117,4013,1425],{"class":1180},[1117,4015,4016],{"class":1428}," order_id",[1117,4018,1239],{"class":1180},[1117,4020,2382],{"class":1252},[1117,4022,1425],{"class":1180},[1117,4024,2377],{"class":1428},[1117,4026,1239],{"class":1180},[1117,4028,2382],{"class":1252},[1117,4030,1292],{"class":1180},[1117,4032,4033,4035,4037,4039,4041],{"class":1119,"line":1177},[1117,4034,2407],{"class":1301},[1117,4036,1305],{"class":1180},[1117,4038,2412],{"class":1308},[1117,4040,1256],{"class":1180},[1117,4042,4043],{"class":1134}," order_id\n",[1117,4045,4046,4048,4050,4053,4055],{"class":1119,"line":1205},[1117,4047,2407],{"class":1301},[1117,4049,1305],{"class":1180},[1117,4051,4052],{"class":1308},"customer_id",[1117,4054,1256],{"class":1180},[1117,4056,2417],{"class":1134},[1117,4058,4059,4061,4063,4066,4068],{"class":1119,"line":1219},[1117,4060,2407],{"class":1301},[1117,4062,1305],{"class":1180},[1117,4064,4065],{"class":1308},"items",[1117,4067,1256],{"class":1180},[1117,4069,2462],{"class":1180},[1117,4071,4072,4074,4076,4079,4081,4084,4086],{"class":1119,"line":1233},[1117,4073,2407],{"class":1301},[1117,4075,1305],{"class":1180},[1117,4077,4078],{"class":1308},"status",[1117,4080,1256],{"class":1180},[1117,4082,4083],{"class":1134}," OrderStatus",[1117,4085,1305],{"class":1180},[1117,4087,4089],{"class":4088},"sFGJz","DRAFT\n",[1117,4091,4092,4094,4096,4099,4101,4103,4105,4107,4109,4111,4113,4115],{"class":1119,"line":1244},[1117,4093,2407],{"class":1301},[1117,4095,1305],{"class":1180},[1117,4097,4098],{"class":1308},"total",[1117,4100,1256],{"class":1180},[1117,4102,1213],{"class":1516},[1117,4104,1188],{"class":1180},[1117,4106,2519],{"class":1516},[1117,4108,1188],{"class":1180},[1117,4110,1439],{"class":1259},[1117,4112,2556],{"class":1263},[1117,4114,1439],{"class":1259},[1117,4116,2531],{"class":1180},[1117,4118,4119,4121,4123,4126,4128],{"class":1119,"line":1270},[1117,4120,2407],{"class":1301},[1117,4122,1305],{"class":1180},[1117,4124,4125],{"class":1308},"shipping_address",[1117,4127,1256],{"class":1180},[1117,4129,2256],{"class":1198},[1117,4131,4132,4134,4136,4138,4140,4142,4144,4146],{"class":1119,"line":1276},[1117,4133,2407],{"class":1301},[1117,4135,1305],{"class":1180},[1117,4137,2487],{"class":1308},[1117,4139,1256],{"class":1180},[1117,4141,2492],{"class":1134},[1117,4143,1305],{"class":1180},[1117,4145,2497],{"class":1516},[1117,4147,2500],{"class":1180},[1117,4149,4150,4152,4154,4157,4159],{"class":1119,"line":1295},[1117,4151,2407],{"class":1301},[1117,4153,1305],{"class":1180},[1117,4155,4156],{"class":1308},"confirmed_at",[1117,4158,1256],{"class":1180},[1117,4160,2256],{"class":1198},[1117,4162,4163],{"class":1119,"line":1322},[1117,4164,1273],{"class":1134},[1117,4166,4167,4169,4172,4174,4176,4178,4181,4183,4185,4187,4189,4191,4193,4195,4197,4199,4202,4204],{"class":1119,"line":1343},[1117,4168,1279],{"class":1208},[1117,4170,4171],{"class":1184}," add_item",[1117,4173,1188],{"class":1180},[1117,4175,1289],{"class":1288},[1117,4177,1425],{"class":1180},[1117,4179,4180],{"class":1428}," product",[1117,4182,1239],{"class":1180},[1117,4184,3355],{"class":1134},[1117,4186,1425],{"class":1180},[1117,4188,3766],{"class":1428},[1117,4190,1239],{"class":1180},[1117,4192,2382],{"class":1252},[1117,4194,1379],{"class":1180},[1117,4196,1444],{"class":1180},[1117,4198,1260],{"class":1259},[1117,4200,4201],{"class":1263},"OrderItem",[1117,4203,1439],{"class":1259},[1117,4205,1216],{"class":1180},[1117,4207,4208,4210,4213],{"class":1119,"line":1349},[1117,4209,1458],{"class":1222},[1117,4211,4212],{"class":1226},"Add item to order with business validation",[1117,4214,1230],{"class":1222},[1117,4216,4217,4219,4221,4223,4225,4227,4229,4231,4234],{"class":1119,"line":1390},[1117,4218,1298],{"class":1130},[1117,4220,1302],{"class":1301},[1117,4222,1305],{"class":1180},[1117,4224,4078],{"class":1308},[1117,4226,1382],{"class":1312},[1117,4228,4083],{"class":1134},[1117,4230,1305],{"class":1180},[1117,4232,4233],{"class":4088},"DRAFT",[1117,4235,1216],{"class":1180},[1117,4237,4238,4240,4242,4244,4246,4249,4251],{"class":1119,"line":1408},[1117,4239,1325],{"class":1130},[1117,4241,3072],{"class":1516},[1117,4243,1188],{"class":1180},[1117,4245,1333],{"class":1259},[1117,4247,4248],{"class":1263},"Cannot modify confirmed order",[1117,4250,1333],{"class":1259},[1117,4252,1202],{"class":1180},[1117,4254,4255],{"class":1119,"line":1413},[1117,4256,1346],{"class":1134},[1117,4258,4259,4261,4263,4265,4267,4270],{"class":1119,"line":1455},[1117,4260,1298],{"class":1130},[1117,4262,1354],{"class":1312},[1117,4264,4180],{"class":1134},[1117,4266,1305],{"class":1180},[1117,4268,4269],{"class":1516},"is_available",[1117,4271,4272],{"class":1180},"():\n",[1117,4274,4275,4277,4279,4281,4283,4286,4288],{"class":1119,"line":1466},[1117,4276,1325],{"class":1130},[1117,4278,3072],{"class":1516},[1117,4280,1188],{"class":1180},[1117,4282,1333],{"class":1259},[1117,4284,4285],{"class":1263},"Product is not available",[1117,4287,1333],{"class":1259},[1117,4289,1202],{"class":1180},[1117,4291,4292],{"class":1119,"line":1487},[1117,4293,1346],{"class":1134},[1117,4295,4296,4298,4300,4302,4304],{"class":1119,"line":1505},[1117,4297,1298],{"class":1130},[1117,4299,3790],{"class":1134},[1117,4301,3793],{"class":1312},[1117,4303,1317],{"class":1316},[1117,4305,1216],{"class":1180},[1117,4307,4308,4310,4312,4314,4316,4318,4320],{"class":1119,"line":1510},[1117,4309,1325],{"class":1130},[1117,4311,1328],{"class":1252},[1117,4313,1188],{"class":1180},[1117,4315,1333],{"class":1259},[1117,4317,3811],{"class":1263},[1117,4319,1333],{"class":1259},[1117,4321,1202],{"class":1180},[1117,4323,4324],{"class":1119,"line":1546},[1117,4325,1346],{"class":1134},[1117,4327,4328],{"class":1119,"line":1551},[1117,4329,4330],{"class":1123},"        # Check if item already exists\n",[1117,4332,4333,4336,4338,4340,4342,4345,4347,4350,4352,4354],{"class":1119,"line":1585},[1117,4334,4335],{"class":1134},"        existing_item ",[1117,4337,1195],{"class":1180},[1117,4339,1302],{"class":1301},[1117,4341,1305],{"class":1180},[1117,4343,4344],{"class":1516},"_find_item",[1117,4346,1188],{"class":1180},[1117,4348,4349],{"class":1516},"product",[1117,4351,1305],{"class":1180},[1117,4353,2412],{"class":1308},[1117,4355,1202],{"class":1180},[1117,4357,4358,4360,4363],{"class":1119,"line":1595},[1117,4359,1298],{"class":1130},[1117,4361,4362],{"class":1134}," existing_item",[1117,4364,1216],{"class":1180},[1117,4366,4367,4370,4372,4375,4377,4380],{"class":1119,"line":1625},[1117,4368,4369],{"class":1134},"            existing_item",[1117,4371,1305],{"class":1180},[1117,4373,4374],{"class":1516},"increase_quantity",[1117,4376,1188],{"class":1180},[1117,4378,4379],{"class":1516},"quantity",[1117,4381,1202],{"class":1180},[1117,4383,4384,4387,4389],{"class":1119,"line":1630},[1117,4385,4386],{"class":1134},"            item ",[1117,4388,1195],{"class":1180},[1117,4390,4391],{"class":1134}," existing_item\n",[1117,4393,4394,4397],{"class":1119,"line":1651},[1117,4395,4396],{"class":1130},"        else",[1117,4398,1216],{"class":1180},[1117,4400,4401,4403,4405,4408,4410,4412,4414,4416,4418,4420,4422,4424,4426,4428,4430,4432,4434,4436],{"class":1119,"line":1661},[1117,4402,4386],{"class":1134},[1117,4404,1195],{"class":1180},[1117,4406,4407],{"class":1516}," OrderItem",[1117,4409,1188],{"class":1180},[1117,4411,4349],{"class":1516},[1117,4413,1305],{"class":1180},[1117,4415,2412],{"class":1308},[1117,4417,1425],{"class":1180},[1117,4419,4180],{"class":1516},[1117,4421,1305],{"class":1180},[1117,4423,2442],{"class":1308},[1117,4425,1425],{"class":1180},[1117,4427,4180],{"class":1516},[1117,4429,1305],{"class":1180},[1117,4431,3448],{"class":1308},[1117,4433,1425],{"class":1180},[1117,4435,3766],{"class":1516},[1117,4437,1202],{"class":1180},[1117,4439,4440,4443,4445,4447,4449,4451,4453,4456],{"class":1119,"line":1678},[1117,4441,4442],{"class":1301},"            self",[1117,4444,1305],{"class":1180},[1117,4446,4065],{"class":1308},[1117,4448,1305],{"class":1180},[1117,4450,2688],{"class":1516},[1117,4452,1188],{"class":1180},[1117,4454,4455],{"class":1516},"item",[1117,4457,1202],{"class":1180},[1117,4459,4460],{"class":1119,"line":1683},[1117,4461,1346],{"class":1134},[1117,4463,4464],{"class":1119,"line":1700},[1117,4465,4466],{"class":1123},"        # Reserve inventory\n",[1117,4468,4469,4472,4474,4477,4479,4481],{"class":1119,"line":1710},[1117,4470,4471],{"class":1134},"        product",[1117,4473,1305],{"class":1180},[1117,4475,4476],{"class":1516},"reserve_inventory",[1117,4478,1188],{"class":1180},[1117,4480,4379],{"class":1516},[1117,4482,1202],{"class":1180},[1117,4484,4485],{"class":1119,"line":1720},[1117,4486,1346],{"class":1134},[1117,4488,4489],{"class":1119,"line":1731},[1117,4490,4491],{"class":1123},"        # Recalculate total\n",[1117,4493,4494,4496,4498,4501],{"class":1119,"line":1741},[1117,4495,2407],{"class":1301},[1117,4497,1305],{"class":1180},[1117,4499,4500],{"class":1516},"_recalculate_total",[1117,4502,2500],{"class":1180},[1117,4504,4505],{"class":1119,"line":1751},[1117,4506,1346],{"class":1134},[1117,4508,4509,4511],{"class":1119,"line":1761},[1117,4510,1513],{"class":1130},[1117,4512,4513],{"class":1134}," item\n",[1117,4515,4516],{"class":1119,"line":1780},[1117,4517,1273],{"class":1134},[1117,4519,4520,4522,4525,4527,4529,4531,4533,4535,4537],{"class":1119,"line":1785},[1117,4521,1279],{"class":1208},[1117,4523,4524],{"class":1184}," remove_item",[1117,4526,1188],{"class":1180},[1117,4528,1289],{"class":1288},[1117,4530,1425],{"class":1180},[1117,4532,3388],{"class":1428},[1117,4534,1239],{"class":1180},[1117,4536,2382],{"class":1252},[1117,4538,1292],{"class":1180},[1117,4540,4541,4543,4546],{"class":1119,"line":1798},[1117,4542,1458],{"class":1222},[1117,4544,4545],{"class":1226},"Remove item from order",[1117,4547,1230],{"class":1222},[1117,4549,4550,4552,4554,4556,4558,4560,4562,4564,4566],{"class":1119,"line":1848},[1117,4551,1298],{"class":1130},[1117,4553,1302],{"class":1301},[1117,4555,1305],{"class":1180},[1117,4557,4078],{"class":1308},[1117,4559,1382],{"class":1312},[1117,4561,4083],{"class":1134},[1117,4563,1305],{"class":1180},[1117,4565,4233],{"class":4088},[1117,4567,1216],{"class":1180},[1117,4569,4570,4572,4574,4576,4578,4580,4582],{"class":1119,"line":1866},[1117,4571,1325],{"class":1130},[1117,4573,3072],{"class":1516},[1117,4575,1188],{"class":1180},[1117,4577,1333],{"class":1259},[1117,4579,4248],{"class":1263},[1117,4581,1333],{"class":1259},[1117,4583,1202],{"class":1180},[1117,4585,4586],{"class":1119,"line":1871},[1117,4587,1346],{"class":1134},[1117,4589,4590,4593,4595,4597,4599,4601,4603,4606],{"class":1119,"line":1904},[1117,4591,4592],{"class":1134},"        item ",[1117,4594,1195],{"class":1180},[1117,4596,1302],{"class":1301},[1117,4598,1305],{"class":1180},[1117,4600,4344],{"class":1516},[1117,4602,1188],{"class":1180},[1117,4604,4605],{"class":1516},"product_id",[1117,4607,1202],{"class":1180},[1117,4609,4610,4612,4614,4617],{"class":1119,"line":1914},[1117,4611,1298],{"class":1130},[1117,4613,1354],{"class":1312},[1117,4615,4616],{"class":1134}," item",[1117,4618,1216],{"class":1180},[1117,4620,4621,4623,4625,4627,4629,4632,4634],{"class":1119,"line":1942},[1117,4622,1325],{"class":1130},[1117,4624,1328],{"class":1252},[1117,4626,1188],{"class":1180},[1117,4628,1333],{"class":1259},[1117,4630,4631],{"class":1263},"Item not found in order",[1117,4633,1333],{"class":1259},[1117,4635,1202],{"class":1180},[1117,4637,4638],{"class":1119,"line":1964},[1117,4639,1346],{"class":1134},[1117,4641,4642,4644,4646,4648,4650,4653,4655,4657],{"class":1119,"line":1984},[1117,4643,2407],{"class":1301},[1117,4645,1305],{"class":1180},[1117,4647,4065],{"class":1308},[1117,4649,1305],{"class":1180},[1117,4651,4652],{"class":1516},"remove",[1117,4654,1188],{"class":1180},[1117,4656,4455],{"class":1516},[1117,4658,1202],{"class":1180},[1117,4660,4661,4663,4665,4667],{"class":1119,"line":1989},[1117,4662,2407],{"class":1301},[1117,4664,1305],{"class":1180},[1117,4666,4500],{"class":1516},[1117,4668,2500],{"class":1180},[1117,4670,4671],{"class":1119,"line":2006},[1117,4672,1273],{"class":1134},[1117,4674,4675,4677,4680,4682,4684,4686,4688,4690,4692],{"class":1119,"line":2016},[1117,4676,1279],{"class":1208},[1117,4678,4679],{"class":1184}," set_shipping_address",[1117,4681,1188],{"class":1180},[1117,4683,1289],{"class":1288},[1117,4685,1425],{"class":1180},[1117,4687,2582],{"class":1428},[1117,4689,1239],{"class":1180},[1117,4691,1705],{"class":1134},[1117,4693,1292],{"class":1180},[1117,4695,4696,4698,4701],{"class":1119,"line":2026},[1117,4697,1458],{"class":1222},[1117,4699,4700],{"class":1226},"Set shipping address with validation",[1117,4702,1230],{"class":1222},[1117,4704,4705,4707,4709,4711,4713,4715,4718,4721,4724,4726,4728,4730,4732,4734,4737],{"class":1119,"line":2036},[1117,4706,1298],{"class":1130},[1117,4708,1302],{"class":1301},[1117,4710,1305],{"class":1180},[1117,4712,4078],{"class":1308},[1117,4714,1354],{"class":1312},[1117,4716,4717],{"class":1312}," in",[1117,4719,4720],{"class":1180}," [",[1117,4722,4723],{"class":1134},"OrderStatus",[1117,4725,1305],{"class":1180},[1117,4727,4233],{"class":4088},[1117,4729,1425],{"class":1180},[1117,4731,4083],{"class":1134},[1117,4733,1305],{"class":1180},[1117,4735,4736],{"class":4088},"CONFIRMED",[1117,4738,2781],{"class":1180},[1117,4740,4741,4743,4745,4747,4749,4752,4754],{"class":1119,"line":2041},[1117,4742,1325],{"class":1130},[1117,4744,3072],{"class":1516},[1117,4746,1188],{"class":1180},[1117,4748,1333],{"class":1259},[1117,4750,4751],{"class":1263},"Cannot change address for shipped orders",[1117,4753,1333],{"class":1259},[1117,4755,1202],{"class":1180},[1117,4757,4758],{"class":1119,"line":2054},[1117,4759,1346],{"class":1134},[1117,4761,4762,4764,4766,4768,4770],{"class":1119,"line":2079},[1117,4763,2407],{"class":1301},[1117,4765,1305],{"class":1180},[1117,4767,4125],{"class":1308},[1117,4769,1256],{"class":1180},[1117,4771,4772],{"class":1134}," address\n",[1117,4774,4775],{"class":1119,"line":2111},[1117,4776,1273],{"class":1134},[1117,4778,4779,4781,4784,4786,4788],{"class":1119,"line":2116},[1117,4780,1279],{"class":1208},[1117,4782,4783],{"class":1184}," confirm",[1117,4785,1188],{"class":1180},[1117,4787,1289],{"class":1288},[1117,4789,1292],{"class":1180},[1117,4791,4792,4794,4797],{"class":1119,"line":2145},[1117,4793,1458],{"class":1222},[1117,4795,4796],{"class":1226},"Confirm order with business validation",[1117,4798,1230],{"class":1222},[1117,4800,4801,4803,4805,4807,4809,4811,4813,4815,4817],{"class":1119,"line":2155},[1117,4802,1298],{"class":1130},[1117,4804,1302],{"class":1301},[1117,4806,1305],{"class":1180},[1117,4808,4078],{"class":1308},[1117,4810,1382],{"class":1312},[1117,4812,4083],{"class":1134},[1117,4814,1305],{"class":1180},[1117,4816,4233],{"class":4088},[1117,4818,1216],{"class":1180},[1117,4820,4821,4823,4825,4827,4829,4832,4834],{"class":1119,"line":2164},[1117,4822,1325],{"class":1130},[1117,4824,3072],{"class":1516},[1117,4826,1188],{"class":1180},[1117,4828,1333],{"class":1259},[1117,4830,4831],{"class":1263},"Can only confirm draft orders",[1117,4833,1333],{"class":1259},[1117,4835,1202],{"class":1180},[1117,4837,4838],{"class":1119,"line":2227},[1117,4839,1346],{"class":1134},[1117,4841,4842,4844,4846,4848,4850,4852],{"class":1119,"line":2259},[1117,4843,1298],{"class":1130},[1117,4845,1354],{"class":1312},[1117,4847,1302],{"class":1301},[1117,4849,1305],{"class":1180},[1117,4851,4065],{"class":1308},[1117,4853,1216],{"class":1180},[1117,4855,4856,4858,4860,4862,4864,4867,4869],{"class":1119,"line":2264},[1117,4857,1325],{"class":1130},[1117,4859,3072],{"class":1516},[1117,4861,1188],{"class":1180},[1117,4863,1333],{"class":1259},[1117,4865,4866],{"class":1263},"Cannot confirm empty order",[1117,4868,1333],{"class":1259},[1117,4870,1202],{"class":1180},[1117,4872,4873],{"class":1119,"line":2284},[1117,4874,1346],{"class":1134},[1117,4876,4877,4879,4881,4883,4885,4887],{"class":1119,"line":2294},[1117,4878,1298],{"class":1130},[1117,4880,1354],{"class":1312},[1117,4882,1302],{"class":1301},[1117,4884,1305],{"class":1180},[1117,4886,4125],{"class":1308},[1117,4888,1216],{"class":1180},[1117,4890,4891,4893,4895,4897,4899,4902,4904],{"class":1119,"line":2327},[1117,4892,1325],{"class":1130},[1117,4894,3072],{"class":1516},[1117,4896,1188],{"class":1180},[1117,4898,1333],{"class":1259},[1117,4900,4901],{"class":1263},"Shipping address is required",[1117,4903,1333],{"class":1259},[1117,4905,1202],{"class":1180},[1117,4907,4908],{"class":1119,"line":2332},[1117,4909,1346],{"class":1134},[1117,4911,4912,4914,4916,4918,4920,4922,4925],{"class":1119,"line":2338},[1117,4913,1298],{"class":1130},[1117,4915,1302],{"class":1301},[1117,4917,1305],{"class":1180},[1117,4919,4098],{"class":1308},[1117,4921,1305],{"class":1180},[1117,4923,4924],{"class":1516},"is_zero",[1117,4926,4272],{"class":1180},[1117,4928,4929,4931,4933,4935,4937,4940,4942],{"class":1119,"line":2348},[1117,4930,1325],{"class":1130},[1117,4932,3072],{"class":1516},[1117,4934,1188],{"class":1180},[1117,4936,1333],{"class":1259},[1117,4938,4939],{"class":1263},"Order total must be greater than zero",[1117,4941,1333],{"class":1259},[1117,4943,1202],{"class":1180},[1117,4945,4946],{"class":1119,"line":2358},[1117,4947,1346],{"class":1134},[1117,4949,4950,4952,4954,4956,4958,4960,4962],{"class":1119,"line":2363},[1117,4951,2407],{"class":1301},[1117,4953,1305],{"class":1180},[1117,4955,4078],{"class":1308},[1117,4957,1256],{"class":1180},[1117,4959,4083],{"class":1134},[1117,4961,1305],{"class":1180},[1117,4963,4964],{"class":4088},"CONFIRMED\n",[1117,4966,4967,4969,4971,4973,4975,4977,4979,4981],{"class":1119,"line":2404},[1117,4968,2407],{"class":1301},[1117,4970,1305],{"class":1180},[1117,4972,4156],{"class":1308},[1117,4974,1256],{"class":1180},[1117,4976,2492],{"class":1134},[1117,4978,1305],{"class":1180},[1117,4980,2497],{"class":1516},[1117,4982,2500],{"class":1180},[1117,4984,4985],{"class":1119,"line":2420},[1117,4986,1346],{"class":1134},[1117,4988,4989],{"class":1119,"line":2435},[1117,4990,4991],{"class":1123},"        # Raise domain event\n",[1117,4993,4994,4997,4999,5002,5004,5007,5009,5011],{"class":1119,"line":2450},[1117,4995,4996],{"class":1134},"        DomainEvents",[1117,4998,1305],{"class":1180},[1117,5000,5001],{"class":1516},"raise_event",[1117,5003,1188],{"class":1180},[1117,5005,5006],{"class":1516},"OrderConfirmedEvent",[1117,5008,1188],{"class":1180},[1117,5010,1289],{"class":1301},[1117,5012,2531],{"class":1180},[1117,5014,5015],{"class":1119,"line":2465},[1117,5016,1273],{"class":1134},[1117,5018,5019,5021,5024,5026,5028],{"class":1119,"line":2480},[1117,5020,1279],{"class":1208},[1117,5022,5023],{"class":1184}," cancel",[1117,5025,1188],{"class":1180},[1117,5027,1289],{"class":1288},[1117,5029,1292],{"class":1180},[1117,5031,5032,5034,5037],{"class":1119,"line":2503},[1117,5033,1458],{"class":1222},[1117,5035,5036],{"class":1226},"Cancel order with business rules",[1117,5038,1230],{"class":1222},[1117,5040,5041,5043,5045,5047,5049,5051,5053,5055,5057,5059,5061,5063,5065,5067,5069],{"class":1119,"line":2534},[1117,5042,1298],{"class":1130},[1117,5044,1302],{"class":1301},[1117,5046,1305],{"class":1180},[1117,5048,4078],{"class":1308},[1117,5050,1354],{"class":1312},[1117,5052,4717],{"class":1312},[1117,5054,4720],{"class":1180},[1117,5056,4723],{"class":1134},[1117,5058,1305],{"class":1180},[1117,5060,4233],{"class":4088},[1117,5062,1425],{"class":1180},[1117,5064,4083],{"class":1134},[1117,5066,1305],{"class":1180},[1117,5068,4736],{"class":4088},[1117,5070,2781],{"class":1180},[1117,5072,5073,5075,5077,5079,5081,5084,5086],{"class":1119,"line":2563},[1117,5074,1325],{"class":1130},[1117,5076,3072],{"class":1516},[1117,5078,1188],{"class":1180},[1117,5080,1333],{"class":1259},[1117,5082,5083],{"class":1263},"Cannot cancel order in current status",[1117,5085,1333],{"class":1259},[1117,5087,1202],{"class":1180},[1117,5089,5090],{"class":1119,"line":2568},[1117,5091,1346],{"class":1134},[1117,5093,5094],{"class":1119,"line":2605},[1117,5095,5096],{"class":1123},"        # Release reserved inventory\n",[1117,5098,5099,5101,5104,5106,5108,5110,5112],{"class":1119,"line":2615},[1117,5100,2797],{"class":1130},[1117,5102,5103],{"class":1134}," item ",[1117,5105,2639],{"class":1130},[1117,5107,1302],{"class":1301},[1117,5109,1305],{"class":1180},[1117,5111,4065],{"class":1308},[1117,5113,1216],{"class":1180},[1117,5115,5116],{"class":1119,"line":2624},[1117,5117,5118],{"class":1123},"            # This would need to be handled by a domain service\n",[1117,5120,5121],{"class":1119,"line":2630},[1117,5122,5123],{"class":1123},"            # that has access to the product repository\n",[1117,5125,5126],{"class":1119,"line":2650},[1117,5127,5128],{"class":1130},"            pass\n",[1117,5130,5131],{"class":1119,"line":2672},[1117,5132,1346],{"class":1134},[1117,5134,5135,5137,5139,5141,5143,5145,5147],{"class":1119,"line":2677},[1117,5136,2407],{"class":1301},[1117,5138,1305],{"class":1180},[1117,5140,4078],{"class":1308},[1117,5142,1256],{"class":1180},[1117,5144,4083],{"class":1134},[1117,5146,1305],{"class":1180},[1117,5148,5149],{"class":4088},"CANCELLED\n",[1117,5151,5152],{"class":1119,"line":2694},[1117,5153,1346],{"class":1134},[1117,5155,5156],{"class":1119,"line":2712},[1117,5157,4991],{"class":1123},[1117,5159,5160,5162,5164,5166,5168,5171,5173,5175],{"class":1119,"line":2727},[1117,5161,4996],{"class":1134},[1117,5163,1305],{"class":1180},[1117,5165,5001],{"class":1516},[1117,5167,1188],{"class":1180},[1117,5169,5170],{"class":1516},"OrderCancelledEvent",[1117,5172,1188],{"class":1180},[1117,5174,1289],{"class":1301},[1117,5176,2531],{"class":1180},[1117,5178,5179],{"class":1119,"line":2747},[1117,5180,1273],{"class":1134},[1117,5182,5183,5185,5188,5190,5192,5194,5197,5199,5201],{"class":1119,"line":2753},[1117,5184,1279],{"class":1208},[1117,5186,5187],{"class":1184}," ship",[1117,5189,1188],{"class":1180},[1117,5191,1289],{"class":1288},[1117,5193,1425],{"class":1180},[1117,5195,5196],{"class":1428}," tracking_number",[1117,5198,1239],{"class":1180},[1117,5200,1253],{"class":1252},[1117,5202,1292],{"class":1180},[1117,5204,5205,5207,5210],{"class":1119,"line":2758},[1117,5206,1458],{"class":1222},[1117,5208,5209],{"class":1226},"Ship order with validation",[1117,5211,1230],{"class":1222},[1117,5213,5214,5216,5218,5220,5222,5224,5226,5228,5230],{"class":1119,"line":2784},[1117,5215,1298],{"class":1130},[1117,5217,1302],{"class":1301},[1117,5219,1305],{"class":1180},[1117,5221,4078],{"class":1308},[1117,5223,1382],{"class":1312},[1117,5225,4083],{"class":1134},[1117,5227,1305],{"class":1180},[1117,5229,4736],{"class":4088},[1117,5231,1216],{"class":1180},[1117,5233,5234,5236,5238,5240,5242,5245,5247],{"class":1119,"line":2794},[1117,5235,1325],{"class":1130},[1117,5237,3072],{"class":1516},[1117,5239,1188],{"class":1180},[1117,5241,1333],{"class":1259},[1117,5243,5244],{"class":1263},"Can only ship confirmed orders",[1117,5246,1333],{"class":1259},[1117,5248,1202],{"class":1180},[1117,5250,5251],{"class":1119,"line":2812},[1117,5252,1346],{"class":1134},[1117,5254,5255,5257,5259,5261],{"class":1119,"line":2831},[1117,5256,1298],{"class":1130},[1117,5258,1354],{"class":1312},[1117,5260,5196],{"class":1134},[1117,5262,1216],{"class":1180},[1117,5264,5265,5267,5269,5271,5273,5276,5278],{"class":1119,"line":2849},[1117,5266,1325],{"class":1130},[1117,5268,1328],{"class":1252},[1117,5270,1188],{"class":1180},[1117,5272,1333],{"class":1259},[1117,5274,5275],{"class":1263},"Tracking number is required",[1117,5277,1333],{"class":1259},[1117,5279,1202],{"class":1180},[1117,5281,5282],{"class":1119,"line":2856},[1117,5283,1346],{"class":1134},[1117,5285,5286,5288,5290,5292,5294,5296,5298],{"class":1119,"line":2861},[1117,5287,2407],{"class":1301},[1117,5289,1305],{"class":1180},[1117,5291,4078],{"class":1308},[1117,5293,1256],{"class":1180},[1117,5295,4083],{"class":1134},[1117,5297,1305],{"class":1180},[1117,5299,5300],{"class":4088},"SHIPPED\n",[1117,5302,5303,5305,5307,5310,5312],{"class":1119,"line":2884},[1117,5304,2407],{"class":1301},[1117,5306,1305],{"class":1180},[1117,5308,5309],{"class":1308},"tracking_number",[1117,5311,1256],{"class":1180},[1117,5313,5314],{"class":1134}," tracking_number\n",[1117,5316,5317],{"class":1119,"line":2894},[1117,5318,1346],{"class":1134},[1117,5320,5321],{"class":1119,"line":2913},[1117,5322,4991],{"class":1123},[1117,5324,5325,5327,5329,5331,5333,5336,5338,5340,5342,5344],{"class":1119,"line":2922},[1117,5326,4996],{"class":1134},[1117,5328,1305],{"class":1180},[1117,5330,5001],{"class":1516},[1117,5332,1188],{"class":1180},[1117,5334,5335],{"class":1516},"OrderShippedEvent",[1117,5337,1188],{"class":1180},[1117,5339,1289],{"class":1301},[1117,5341,1425],{"class":1180},[1117,5343,5196],{"class":1516},[1117,5345,2531],{"class":1180},[1117,5347,5348],{"class":1119,"line":2927},[1117,5349,1273],{"class":1134},[1117,5351,5352,5354,5357,5359,5361,5363,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383],{"class":1119,"line":2933},[1117,5353,1279],{"class":1208},[1117,5355,5356],{"class":1184}," _find_item",[1117,5358,1188],{"class":1180},[1117,5360,1289],{"class":1288},[1117,5362,1425],{"class":1180},[1117,5364,3388],{"class":1428},[1117,5366,1239],{"class":1180},[1117,5368,2382],{"class":1252},[1117,5370,1379],{"class":1180},[1117,5372,1444],{"class":1180},[1117,5374,2774],{"class":1134},[1117,5376,2182],{"class":1180},[1117,5378,1439],{"class":1259},[1117,5380,4201],{"class":1263},[1117,5382,1439],{"class":1259},[1117,5384,2781],{"class":1180},[1117,5386,5387,5389,5392],{"class":1119,"line":2947},[1117,5388,1458],{"class":1222},[1117,5390,5391],{"class":1226},"Find order item by product ID",[1117,5393,1230],{"class":1222},[1117,5395,5396,5398,5401,5404,5407,5410,5412,5414,5416,5418,5420,5423,5425,5427,5429,5431,5433,5436,5439],{"class":1119,"line":2963},[1117,5397,1513],{"class":1130},[1117,5399,5400],{"class":1367}," next",[1117,5402,5403],{"class":1180},"((",[1117,5405,5406],{"class":1516},"item ",[1117,5408,5409],{"class":1130},"for",[1117,5411,5103],{"class":1516},[1117,5413,2639],{"class":1130},[1117,5415,1302],{"class":1301},[1117,5417,1305],{"class":1180},[1117,5419,4065],{"class":1308},[1117,5421,5422],{"class":1130}," if",[1117,5424,4616],{"class":1516},[1117,5426,1305],{"class":1180},[1117,5428,4605],{"class":1308},[1117,5430,1672],{"class":1312},[1117,5432,3388],{"class":1516},[1117,5434,5435],{"class":1180},"),",[1117,5437,5438],{"class":1198}," None",[1117,5440,1202],{"class":1180},[1117,5442,5443],{"class":1119,"line":2968},[1117,5444,1273],{"class":1134},[1117,5446,5447,5449,5452,5454,5456],{"class":1119,"line":2991},[1117,5448,1279],{"class":1208},[1117,5450,5451],{"class":1184}," _recalculate_total",[1117,5453,1188],{"class":1180},[1117,5455,1289],{"class":1288},[1117,5457,1292],{"class":1180},[1117,5459,5460,5462,5465],{"class":1119,"line":3001},[1117,5461,1458],{"class":1222},[1117,5463,5464],{"class":1226},"Recalculate order total",[1117,5466,1230],{"class":1222},[1117,5468,5469,5472,5474,5477,5479,5481,5483,5485,5488,5490,5493,5495,5497,5499,5501,5503],{"class":1119,"line":3019},[1117,5470,5471],{"class":1134},"        total_amount ",[1117,5473,1195],{"class":1180},[1117,5475,5476],{"class":1367}," sum",[1117,5478,1188],{"class":1180},[1117,5480,4455],{"class":1516},[1117,5482,1305],{"class":1180},[1117,5484,4098],{"class":1516},[1117,5486,5487],{"class":1180},"().",[1117,5489,1309],{"class":1308},[1117,5491,5492],{"class":1130}," for",[1117,5494,5103],{"class":1516},[1117,5496,2639],{"class":1130},[1117,5498,1302],{"class":1301},[1117,5500,1305],{"class":1180},[1117,5502,4065],{"class":1308},[1117,5504,1202],{"class":1180},[1117,5506,5507,5509,5511,5513,5515,5517,5519,5522],{"class":1119,"line":3037},[1117,5508,2407],{"class":1301},[1117,5510,1305],{"class":1180},[1117,5512,4098],{"class":1308},[1117,5514,1256],{"class":1180},[1117,5516,1213],{"class":1516},[1117,5518,1188],{"class":1180},[1117,5520,5521],{"class":1516},"total_amount",[1117,5523,1202],{"class":1180},[1117,5525,5526],{"class":1119,"line":3042},[1117,5527,1174],{"emptyLinePlaceholder":1173},[1117,5529,5530,5532,5534],{"class":1119,"line":3048},[1117,5531,1209],{"class":1208},[1117,5533,4407],{"class":1212},[1117,5535,1216],{"class":1180},[1117,5537,5538,5540,5543],{"class":1119,"line":3067},[1117,5539,1223],{"class":1222},[1117,5541,5542],{"class":1226},"Order item entity (part of Order aggregate)",[1117,5544,1230],{"class":1222},[1117,5546,5547],{"class":1119,"line":3086},[1117,5548,1273],{"class":1134},[1117,5550,5551,5553,5555,5557,5559,5561,5563,5565,5567,5569,5572,5574,5576,5578,5581,5583,5585,5587,5589,5591,5593],{"class":1119,"line":3091},[1117,5552,1279],{"class":1208},[1117,5554,2368],{"class":1367},[1117,5556,1188],{"class":1180},[1117,5558,1289],{"class":1288},[1117,5560,1425],{"class":1180},[1117,5562,3388],{"class":1428},[1117,5564,1239],{"class":1180},[1117,5566,2382],{"class":1252},[1117,5568,1425],{"class":1180},[1117,5570,5571],{"class":1428}," product_name",[1117,5573,1239],{"class":1180},[1117,5575,1253],{"class":1252},[1117,5577,1425],{"class":1180},[1117,5579,5580],{"class":1428}," unit_price",[1117,5582,1239],{"class":1180},[1117,5584,1213],{"class":1134},[1117,5586,1425],{"class":1180},[1117,5588,3766],{"class":1428},[1117,5590,1239],{"class":1180},[1117,5592,2382],{"class":1252},[1117,5594,1292],{"class":1180},[1117,5596,5597,5599,5601,5603,5605],{"class":1119,"line":3119},[1117,5598,2407],{"class":1301},[1117,5600,1305],{"class":1180},[1117,5602,4605],{"class":1308},[1117,5604,1256],{"class":1180},[1117,5606,3425],{"class":1134},[1117,5608,5609,5611,5613,5616,5618],{"class":1119,"line":3124},[1117,5610,2407],{"class":1301},[1117,5612,1305],{"class":1180},[1117,5614,5615],{"class":1308},"product_name",[1117,5617,1256],{"class":1180},[1117,5619,5620],{"class":1134}," product_name\n",[1117,5622,5623,5625,5627,5630,5632],{"class":1119,"line":3152},[1117,5624,2407],{"class":1301},[1117,5626,1305],{"class":1180},[1117,5628,5629],{"class":1308},"unit_price",[1117,5631,1256],{"class":1180},[1117,5633,5634],{"class":1134}," unit_price\n",[1117,5636,5637,5639,5641,5643,5645],{"class":1119,"line":3162},[1117,5638,2407],{"class":1301},[1117,5640,1305],{"class":1180},[1117,5642,4379],{"class":1308},[1117,5644,1256],{"class":1180},[1117,5646,3876],{"class":1134},[1117,5648,5649],{"class":1119,"line":3177},[1117,5650,1273],{"class":1134},[1117,5652,5653,5655,5658,5660,5662,5664,5667,5669,5671],{"class":1119,"line":3184},[1117,5654,1279],{"class":1208},[1117,5656,5657],{"class":1184}," increase_quantity",[1117,5659,1188],{"class":1180},[1117,5661,1289],{"class":1288},[1117,5663,1425],{"class":1180},[1117,5665,5666],{"class":1428}," additional_quantity",[1117,5668,1239],{"class":1180},[1117,5670,2382],{"class":1252},[1117,5672,1292],{"class":1180},[1117,5674,5675,5677,5680],{"class":1119,"line":3189},[1117,5676,1458],{"class":1222},[1117,5678,5679],{"class":1226},"Increase item quantity",[1117,5681,1230],{"class":1222},[1117,5683,5684,5686,5689,5691,5693],{"class":1119,"line":3213},[1117,5685,1298],{"class":1130},[1117,5687,5688],{"class":1134}," additional_quantity ",[1117,5690,3793],{"class":1312},[1117,5692,1317],{"class":1316},[1117,5694,1216],{"class":1180},[1117,5696,5697,5699,5701,5703,5705,5708,5710],{"class":1119,"line":3238},[1117,5698,1325],{"class":1130},[1117,5700,1328],{"class":1252},[1117,5702,1188],{"class":1180},[1117,5704,1333],{"class":1259},[1117,5706,5707],{"class":1263},"Additional quantity must be positive",[1117,5709,1333],{"class":1259},[1117,5711,1202],{"class":1180},[1117,5713,5714],{"class":1119,"line":3243},[1117,5715,1346],{"class":1134},[1117,5717,5718,5720,5722,5724,5726],{"class":1119,"line":3265},[1117,5719,2407],{"class":1301},[1117,5721,1305],{"class":1180},[1117,5723,4379],{"class":1308},[1117,5725,3960],{"class":1180},[1117,5727,5728],{"class":1134}," additional_quantity\n",[1117,5730,5731],{"class":1119,"line":3275},[1117,5732,1273],{"class":1134},[1117,5734,5735,5737,5740,5742,5744,5746,5749,5751,5753],{"class":1119,"line":3295},[1117,5736,1279],{"class":1208},[1117,5738,5739],{"class":1184}," change_quantity",[1117,5741,1188],{"class":1180},[1117,5743,1289],{"class":1288},[1117,5745,1425],{"class":1180},[1117,5747,5748],{"class":1428}," new_quantity",[1117,5750,1239],{"class":1180},[1117,5752,2382],{"class":1252},[1117,5754,1292],{"class":1180},[1117,5756,5757,5759,5762],{"class":1119,"line":3313},[1117,5758,1458],{"class":1222},[1117,5760,5761],{"class":1226},"Change item quantity",[1117,5763,1230],{"class":1222},[1117,5765,5766,5768,5771,5773,5775],{"class":1119,"line":3318},[1117,5767,1298],{"class":1130},[1117,5769,5770],{"class":1134}," new_quantity ",[1117,5772,3793],{"class":1312},[1117,5774,1317],{"class":1316},[1117,5776,1216],{"class":1180},[1117,5778,5779,5781,5783,5785,5787,5789,5791],{"class":1119,"line":3345},[1117,5780,1325],{"class":1130},[1117,5782,1328],{"class":1252},[1117,5784,1188],{"class":1180},[1117,5786,1333],{"class":1259},[1117,5788,3811],{"class":1263},[1117,5790,1333],{"class":1259},[1117,5792,1202],{"class":1180},[1117,5794,5795],{"class":1119,"line":3350},[1117,5796,1346],{"class":1134},[1117,5798,5799,5801,5803,5805,5807],{"class":1119,"line":3360},[1117,5800,2407],{"class":1301},[1117,5802,1305],{"class":1180},[1117,5804,4379],{"class":1308},[1117,5806,1256],{"class":1180},[1117,5808,5809],{"class":1134}," new_quantity\n",[1117,5811,5812],{"class":1119,"line":3370},[1117,5813,1273],{"class":1134},[1117,5815,5816,5818,5821,5823,5825,5827,5829,5831],{"class":1119,"line":3375},[1117,5817,1279],{"class":1208},[1117,5819,5820],{"class":1184}," total",[1117,5822,1188],{"class":1180},[1117,5824,1289],{"class":1288},[1117,5826,1379],{"class":1180},[1117,5828,1444],{"class":1180},[1117,5830,1213],{"class":1134},[1117,5832,1216],{"class":1180},[1117,5834,5835,5837,5840],{"class":1119,"line":3414},[1117,5836,1458],{"class":1222},[1117,5838,5839],{"class":1226},"Calculate item total",[1117,5841,1230],{"class":1222},[1117,5843,5844,5846,5848,5850,5852,5854,5857,5859,5861,5863,5865,5867,5869],{"class":1119,"line":3428},[1117,5845,1513],{"class":1130},[1117,5847,1302],{"class":1301},[1117,5849,1305],{"class":1180},[1117,5851,5629],{"class":1308},[1117,5853,1305],{"class":1180},[1117,5855,5856],{"class":1516},"multiply",[1117,5858,1188],{"class":1180},[1117,5860,2519],{"class":1516},[1117,5862,1188],{"class":1180},[1117,5864,1289],{"class":1301},[1117,5866,1305],{"class":1180},[1117,5868,4379],{"class":1308},[1117,5870,2531],{"class":1180},[1117,5872,5873],{"class":1119,"line":3441},[1117,5874,1174],{"emptyLinePlaceholder":1173},[1117,5876,5877],{"class":1119,"line":3456},[1117,5878,5879],{"class":1123},"# Order Status Enum\n",[1117,5881,5882,5884,5887,5889],{"class":1119,"line":3469},[1117,5883,1131],{"class":1130},[1117,5885,5886],{"class":1134}," enum ",[1117,5888,1138],{"class":1130},[1117,5890,5891],{"class":1134}," Enum\n",[1117,5893,5894],{"class":1119,"line":3488},[1117,5895,1174],{"emptyLinePlaceholder":1173},[1117,5897,5898,5900,5902,5904,5908],{"class":1119,"line":3502},[1117,5899,1209],{"class":1208},[1117,5901,4083],{"class":1212},[1117,5903,1188],{"class":1180},[1117,5905,5907],{"class":5906},"sYn-s","Enum",[1117,5909,1292],{"class":1180},[1117,5911,5912,5915,5917,5920,5923],{"class":1119,"line":3516},[1117,5913,5914],{"class":1301},"    DRAFT",[1117,5916,1256],{"class":1180},[1117,5918,5919],{"class":1259}," \"",[1117,5921,5922],{"class":1263},"draft",[1117,5924,5925],{"class":1259},"\"\n",[1117,5927,5928,5931,5933,5935,5938],{"class":1119,"line":3521},[1117,5929,5930],{"class":1301},"    CONFIRMED",[1117,5932,1256],{"class":1180},[1117,5934,5919],{"class":1259},[1117,5936,5937],{"class":1263},"confirmed",[1117,5939,5925],{"class":1259},[1117,5941,5942,5945,5947,5949,5952],{"class":1119,"line":3544},[1117,5943,5944],{"class":1301},"    SHIPPED",[1117,5946,1256],{"class":1180},[1117,5948,5919],{"class":1259},[1117,5950,5951],{"class":1263},"shipped",[1117,5953,5925],{"class":1259},[1117,5955,5956,5959,5961,5963,5966],{"class":1119,"line":3554},[1117,5957,5958],{"class":1301},"    DELIVERED",[1117,5960,1256],{"class":1180},[1117,5962,5919],{"class":1259},[1117,5964,5965],{"class":1263},"delivered",[1117,5967,5925],{"class":1259},[1117,5969,5970,5973,5975,5977,5980],{"class":1119,"line":3571},[1117,5971,5972],{"class":1301},"    CANCELLED",[1117,5974,1256],{"class":1180},[1117,5976,5919],{"class":1259},[1117,5978,5979],{"class":1263},"cancelled",[1117,5981,5925],{"class":1259},[1117,5983,5984],{"class":1119,"line":3589},[1117,5985,1174],{"emptyLinePlaceholder":1173},[1117,5987,5988],{"class":1119,"line":3594},[1117,5989,5990],{"class":1123},"# Domain Events\n",[1117,5992,5993,5995,5998],{"class":1119,"line":3600},[1117,5994,1209],{"class":1208},[1117,5996,5997],{"class":1212}," DomainEvent",[1117,5999,1216],{"class":1180},[1117,6001,6002,6004,6007],{"class":1119,"line":3652},[1117,6003,1223],{"class":1222},[1117,6005,6006],{"class":1226},"Base class for domain events",[1117,6008,1230],{"class":1222},[1117,6010,6011],{"class":1119,"line":3670},[1117,6012,1273],{"class":1134},[1117,6014,6015,6017,6019,6021,6023,6025,6028],{"class":1119,"line":3675},[1117,6016,1279],{"class":1208},[1117,6018,2368],{"class":1367},[1117,6020,1188],{"class":1180},[1117,6022,1289],{"class":1288},[1117,6024,1425],{"class":1180},[1117,6026,6027],{"class":1428}," aggregate_root",[1117,6029,1292],{"class":1180},[1117,6031,6032,6034,6036,6039,6041],{"class":1119,"line":3689},[1117,6033,2407],{"class":1301},[1117,6035,1305],{"class":1180},[1117,6037,6038],{"class":1308},"aggregate_root",[1117,6040,1256],{"class":1180},[1117,6042,6043],{"class":1134}," aggregate_root\n",[1117,6045,6046,6048,6050,6053,6055,6057,6059,6061],{"class":1119,"line":3694},[1117,6047,2407],{"class":1301},[1117,6049,1305],{"class":1180},[1117,6051,6052],{"class":1308},"occurred_at",[1117,6054,1256],{"class":1180},[1117,6056,2492],{"class":1134},[1117,6058,1305],{"class":1180},[1117,6060,2497],{"class":1516},[1117,6062,2500],{"class":1180},[1117,6064,6065],{"class":1119,"line":3714},[1117,6066,1174],{"emptyLinePlaceholder":1173},[1117,6068,6069,6071,6074,6076,6079],{"class":1119,"line":3724},[1117,6070,1209],{"class":1208},[1117,6072,6073],{"class":1212}," OrderConfirmedEvent",[1117,6075,1188],{"class":1180},[1117,6077,6078],{"class":5906},"DomainEvent",[1117,6080,1292],{"class":1180},[1117,6082,6083,6085,6088],{"class":1119,"line":3747},[1117,6084,1223],{"class":1222},[1117,6086,6087],{"class":1226},"Event raised when order is confirmed",[1117,6089,1230],{"class":1222},[1117,6091,6092],{"class":1119,"line":3752},[1117,6093,1273],{"class":1134},[1117,6095,6096,6098,6100,6102,6104,6106,6109,6111,6113],{"class":1119,"line":3775},[1117,6097,1279],{"class":1208},[1117,6099,2368],{"class":1367},[1117,6101,1188],{"class":1180},[1117,6103,1289],{"class":1288},[1117,6105,1425],{"class":1180},[1117,6107,6108],{"class":1428}," order",[1117,6110,1239],{"class":1180},[1117,6112,3986],{"class":1134},[1117,6114,1292],{"class":1180},[1117,6116,6117,6120,6122,6125,6127,6130],{"class":1119,"line":3785},[1117,6118,6119],{"class":1252},"        super",[1117,6121,5487],{"class":1180},[1117,6123,6124],{"class":1367},"__init__",[1117,6126,1188],{"class":1180},[1117,6128,6129],{"class":1516},"order",[1117,6131,1202],{"class":1180},[1117,6133,6134,6136,6138,6141,6143,6145,6147],{"class":1119,"line":3800},[1117,6135,2407],{"class":1301},[1117,6137,1305],{"class":1180},[1117,6139,6140],{"class":1308},"order_id",[1117,6142,1256],{"class":1180},[1117,6144,6108],{"class":1134},[1117,6146,1305],{"class":1180},[1117,6148,6149],{"class":1308},"id\n",[1117,6151,6152,6154,6156,6158,6160,6162,6164],{"class":1119,"line":3818},[1117,6153,2407],{"class":1301},[1117,6155,1305],{"class":1180},[1117,6157,4052],{"class":1308},[1117,6159,1256],{"class":1180},[1117,6161,6108],{"class":1134},[1117,6163,1305],{"class":1180},[1117,6165,6166],{"class":1308},"customer_id\n",[1117,6168,6169,6171,6173,6175,6177,6179,6181],{"class":1119,"line":3823},[1117,6170,2407],{"class":1301},[1117,6172,1305],{"class":1180},[1117,6174,4098],{"class":1308},[1117,6176,1256],{"class":1180},[1117,6178,6108],{"class":1134},[1117,6180,1305],{"class":1180},[1117,6182,6183],{"class":1308},"total\n",[1117,6185,6186],{"class":1119,"line":3841},[1117,6187,1174],{"emptyLinePlaceholder":1173},[1117,6189,6190,6192,6195,6197,6199],{"class":1119,"line":3859},[1117,6191,1209],{"class":1208},[1117,6193,6194],{"class":1212}," OrderCancelledEvent",[1117,6196,1188],{"class":1180},[1117,6198,6078],{"class":5906},[1117,6200,1292],{"class":1180},[1117,6202,6203,6205,6208],{"class":1119,"line":3864},[1117,6204,1223],{"class":1222},[1117,6206,6207],{"class":1226},"Event raised when order is cancelled",[1117,6209,1230],{"class":1222},[1117,6211,6212],{"class":1119,"line":3879},[1117,6213,1273],{"class":1134},[1117,6215,6216,6218,6220,6222,6224,6226,6228,6230,6232],{"class":1119,"line":3884},[1117,6217,1279],{"class":1208},[1117,6219,2368],{"class":1367},[1117,6221,1188],{"class":1180},[1117,6223,1289],{"class":1288},[1117,6225,1425],{"class":1180},[1117,6227,6108],{"class":1428},[1117,6229,1239],{"class":1180},[1117,6231,3986],{"class":1134},[1117,6233,1292],{"class":1180},[1117,6235,6236,6238,6240,6242,6244,6246],{"class":1119,"line":3906},[1117,6237,6119],{"class":1252},[1117,6239,5487],{"class":1180},[1117,6241,6124],{"class":1367},[1117,6243,1188],{"class":1180},[1117,6245,6129],{"class":1516},[1117,6247,1202],{"class":1180},[1117,6249,6250,6252,6254,6256,6258,6260,6262],{"class":1119,"line":3916},[1117,6251,2407],{"class":1301},[1117,6253,1305],{"class":1180},[1117,6255,6140],{"class":1308},[1117,6257,1256],{"class":1180},[1117,6259,6108],{"class":1134},[1117,6261,1305],{"class":1180},[1117,6263,6149],{"class":1308},[1117,6265,6266,6268,6270,6272,6274,6276,6278],{"class":1119,"line":3929},[1117,6267,2407],{"class":1301},[1117,6269,1305],{"class":1180},[1117,6271,4052],{"class":1308},[1117,6273,1256],{"class":1180},[1117,6275,6108],{"class":1134},[1117,6277,1305],{"class":1180},[1117,6279,6166],{"class":1308},[1117,6281,6282],{"class":1119,"line":3946},[1117,6283,1174],{"emptyLinePlaceholder":1173},[1117,6285,6286,6288,6291,6293,6295],{"class":1119,"line":3951},[1117,6287,1209],{"class":1208},[1117,6289,6290],{"class":1212}," OrderShippedEvent",[1117,6292,1188],{"class":1180},[1117,6294,6078],{"class":5906},[1117,6296,1292],{"class":1180},[1117,6298,6300,6302,6305],{"class":1119,"line":6299},184,[1117,6301,1223],{"class":1222},[1117,6303,6304],{"class":1226},"Event raised when order is shipped",[1117,6306,1230],{"class":1222},[1117,6308,6310],{"class":1119,"line":6309},185,[1117,6311,1273],{"class":1134},[1117,6313,6315,6317,6319,6321,6323,6325,6327,6329,6331,6333,6335,6337,6339],{"class":1119,"line":6314},186,[1117,6316,1279],{"class":1208},[1117,6318,2368],{"class":1367},[1117,6320,1188],{"class":1180},[1117,6322,1289],{"class":1288},[1117,6324,1425],{"class":1180},[1117,6326,6108],{"class":1428},[1117,6328,1239],{"class":1180},[1117,6330,3986],{"class":1134},[1117,6332,1425],{"class":1180},[1117,6334,5196],{"class":1428},[1117,6336,1239],{"class":1180},[1117,6338,1253],{"class":1252},[1117,6340,1292],{"class":1180},[1117,6342,6344,6346,6348,6350,6352,6354],{"class":1119,"line":6343},187,[1117,6345,6119],{"class":1252},[1117,6347,5487],{"class":1180},[1117,6349,6124],{"class":1367},[1117,6351,1188],{"class":1180},[1117,6353,6129],{"class":1516},[1117,6355,1202],{"class":1180},[1117,6357,6359,6361,6363,6365,6367,6369,6371],{"class":1119,"line":6358},188,[1117,6360,2407],{"class":1301},[1117,6362,1305],{"class":1180},[1117,6364,6140],{"class":1308},[1117,6366,1256],{"class":1180},[1117,6368,6108],{"class":1134},[1117,6370,1305],{"class":1180},[1117,6372,6149],{"class":1308},[1117,6374,6376,6378,6380,6382,6384,6386,6388],{"class":1119,"line":6375},189,[1117,6377,2407],{"class":1301},[1117,6379,1305],{"class":1180},[1117,6381,4052],{"class":1308},[1117,6383,1256],{"class":1180},[1117,6385,6108],{"class":1134},[1117,6387,1305],{"class":1180},[1117,6389,6166],{"class":1308},[1117,6391,6393,6395,6397,6399,6401],{"class":1119,"line":6392},190,[1117,6394,2407],{"class":1301},[1117,6396,1305],{"class":1180},[1117,6398,5309],{"class":1308},[1117,6400,1256],{"class":1180},[1117,6402,5314],{"class":1134},[1117,6404,6406],{"class":1119,"line":6405},191,[1117,6407,1174],{"emptyLinePlaceholder":1173},[1117,6409,6411],{"class":1119,"line":6410},192,[1117,6412,6413],{"class":1123},"# Domain Events Manager\n",[1117,6415,6417,6419,6422],{"class":1119,"line":6416},193,[1117,6418,1209],{"class":1208},[1117,6420,6421],{"class":1212}," DomainEvents",[1117,6423,1216],{"class":1180},[1117,6425,6427,6429,6432],{"class":1119,"line":6426},194,[1117,6428,1223],{"class":1222},[1117,6430,6431],{"class":1226},"Manager for domain events",[1117,6433,1230],{"class":1222},[1117,6435,6437],{"class":1119,"line":6436},195,[1117,6438,1273],{"class":1134},[1117,6440,6442,6445,6447],{"class":1119,"line":6441},196,[1117,6443,6444],{"class":1134},"    _events ",[1117,6446,1195],{"class":1180},[1117,6448,2462],{"class":1180},[1117,6450,6452],{"class":1119,"line":6451},197,[1117,6453,1273],{"class":1134},[1117,6455,6457,6460],{"class":1119,"line":6456},198,[1117,6458,6459],{"class":1180},"    @",[1117,6461,6462],{"class":1252},"classmethod\n",[1117,6464,6466,6468,6471,6473,6476,6478,6481,6483,6485],{"class":1119,"line":6465},199,[1117,6467,1279],{"class":1208},[1117,6469,6470],{"class":1184}," raise_event",[1117,6472,1188],{"class":1180},[1117,6474,6475],{"class":1428},"cls",[1117,6477,1425],{"class":1180},[1117,6479,6480],{"class":1428}," event",[1117,6482,1239],{"class":1180},[1117,6484,5997],{"class":1134},[1117,6486,1292],{"class":1180},[1117,6488,6490,6492,6495],{"class":1119,"line":6489},200,[1117,6491,1458],{"class":1222},[1117,6493,6494],{"class":1226},"Raise a domain event",[1117,6496,1230],{"class":1222},[1117,6498,6500,6503,6505,6508,6510,6512,6514,6517],{"class":1119,"line":6499},201,[1117,6501,6502],{"class":1301},"        cls",[1117,6504,1305],{"class":1180},[1117,6506,6507],{"class":1308},"_events",[1117,6509,1305],{"class":1180},[1117,6511,2688],{"class":1516},[1117,6513,1188],{"class":1180},[1117,6515,6516],{"class":1516},"event",[1117,6518,1202],{"class":1180},[1117,6520,6522],{"class":1119,"line":6521},202,[1117,6523,1273],{"class":1134},[1117,6525,6527,6529],{"class":1119,"line":6526},203,[1117,6528,6459],{"class":1180},[1117,6530,6462],{"class":1252},[1117,6532,6534,6536,6539,6541,6543,6545,6547,6550],{"class":1119,"line":6533},204,[1117,6535,1279],{"class":1208},[1117,6537,6538],{"class":1184}," get_events",[1117,6540,1188],{"class":1180},[1117,6542,6475],{"class":1428},[1117,6544,1379],{"class":1180},[1117,6546,1444],{"class":1180},[1117,6548,6549],{"class":1252}," list",[1117,6551,1216],{"class":1180},[1117,6553,6555,6557,6560],{"class":1119,"line":6554},205,[1117,6556,1458],{"class":1222},[1117,6558,6559],{"class":1226},"Get all raised events",[1117,6561,1230],{"class":1222},[1117,6563,6565,6567,6570,6572,6574,6576,6579],{"class":1119,"line":6564},206,[1117,6566,1513],{"class":1130},[1117,6568,6569],{"class":1301}," cls",[1117,6571,1305],{"class":1180},[1117,6573,6507],{"class":1308},[1117,6575,1305],{"class":1180},[1117,6577,6578],{"class":1516},"copy",[1117,6580,2500],{"class":1180},[1117,6582,6584],{"class":1119,"line":6583},207,[1117,6585,1273],{"class":1134},[1117,6587,6589,6591],{"class":1119,"line":6588},208,[1117,6590,6459],{"class":1180},[1117,6592,6462],{"class":1252},[1117,6594,6596,6598,6601,6603,6605],{"class":1119,"line":6595},209,[1117,6597,1279],{"class":1208},[1117,6599,6600],{"class":1184}," clear_events",[1117,6602,1188],{"class":1180},[1117,6604,6475],{"class":1428},[1117,6606,1292],{"class":1180},[1117,6608,6610,6612,6615],{"class":1119,"line":6609},210,[1117,6611,1458],{"class":1222},[1117,6613,6614],{"class":1226},"Clear all events",[1117,6616,1230],{"class":1222},[1117,6618,6620,6622,6624,6626,6628,6631],{"class":1119,"line":6619},211,[1117,6621,6502],{"class":1301},[1117,6623,1305],{"class":1180},[1117,6625,6507],{"class":1308},[1117,6627,1305],{"class":1180},[1117,6629,6630],{"class":1516},"clear",[1117,6632,2500],{"class":1180},[1030,6634,6636],{"id":6635},"domain-services","Domain Services",[1026,6638,6639],{},"Domain services contain business logic that doesn't naturally fit within a single entity or value object. They operate on multiple domain objects and encapsulate complex business rules.",[1107,6641,6643],{"className":1109,"code":6642,"language":1111,"meta":1112,"style":1112},"# Domain Services - Business logic that spans multiple entities\nclass PricingService:\n    \"\"\"Domain service for pricing calculations\"\"\"\n    \n    def __init__(self, discount_repo: 'DiscountRepository'):\n        self.discount_repo = discount_repo\n    \n    def calculate_order_total(self, order: Order, customer: Customer) -> Money:\n        \"\"\"Calculate order total with discounts and taxes\"\"\"\n        subtotal = sum(item.total().amount for item in order.items)\n        subtotal_money = Money(subtotal)\n        \n        # Apply customer discounts\n        discount = self._calculate_customer_discount(customer, subtotal_money)\n        discounted_total = subtotal_money.add(discount.multiply(Decimal('-1')))\n        \n        # Apply taxes\n        tax = self._calculate_tax(discounted_total, order.shipping_address)\n        \n        return discounted_total.add(tax)\n    \n    def _calculate_customer_discount(self, customer: Customer, subtotal: Money) -> Money:\n        \"\"\"Calculate customer-specific discounts\"\"\"\n        # VIP customers get 10% discount\n        if self._is_vip_customer(customer):\n            return subtotal.multiply(Decimal('0.10'))\n        \n        # First-time customers get $50 off orders over $200\n        if self._is_first_time_customer(customer) and subtotal.amount > 200:\n            return Money(Decimal('50.00'))\n        \n        return Money(Decimal('0.00'))\n    \n    def _calculate_tax(self, amount: Money, address: Address) -> Money:\n        \"\"\"Calculate tax based on shipping address\"\"\"\n        # Simplified tax calculation\n        tax_rates = {\n            'CA': Decimal('0.0875'),  # California\n            'NY': Decimal('0.08'),    # New York\n            'TX': Decimal('0.0625'),  # Texas\n        }\n        \n        tax_rate = tax_rates.get(address.state, Decimal('0.05'))  # Default 5%\n        return amount.multiply(tax_rate)\n    \n    def _is_vip_customer(self, customer: Customer) -> bool:\n        \"\"\"Check if customer is VIP\"\"\"\n        # Business rule: VIP customers have spent over $10,000\n        return customer.lifetime_spent.amount > 10000\n    \n    def _is_first_time_customer(self, customer: Customer) -> bool:\n        \"\"\"Check if customer is making first purchase\"\"\"\n        return customer.order_count == 0\n\nclass InventoryService:\n    \"\"\"Domain service for inventory management\"\"\"\n    \n    def __init__(self, product_repo: 'ProductRepository'):\n        self.product_repo = product_repo\n    \n    def reserve_items_for_order(self, order: Order) -> bool:\n        \"\"\"Reserve inventory for all items in order\"\"\"\n        # Check availability first\n        for item in order.items:\n            product = self.product_repo.get_by_id(item.product_id)\n            if not product or product.inventory_count \u003C item.quantity:\n                return False\n        \n        # Reserve all items\n        for item in order.items:\n            product = self.product_repo.get_by_id(item.product_id)\n            product.reserve_inventory(item.quantity)\n            self.product_repo.save(product)\n        \n        return True\n    \n    def release_items_for_order(self, order: Order):\n        \"\"\"Release reserved inventory for cancelled order\"\"\"\n        for item in order.items:\n            product = self.product_repo.get_by_id(item.product_id)\n            if product:\n                product.release_inventory(item.quantity)\n                self.product_repo.save(product)\n    \n    def check_low_inventory(self, threshold: int = 10) -> list:\n        \"\"\"Find products with low inventory\"\"\"\n        return self.product_repo.find_by_inventory_below(threshold)\n\nclass OrderFulfillmentService:\n    \"\"\"Domain service for order fulfillment\"\"\"\n    \n    def __init__(self, \n                 shipping_service: 'ShippingService',\n                 inventory_service: InventoryService,\n                 notification_service: 'NotificationService'):\n        self.shipping_service = shipping_service\n        self.inventory_service = inventory_service\n        self.notification_service = notification_service\n    \n    def fulfill_order(self, order: Order) -> bool:\n        \"\"\"Fulfill confirmed order\"\"\"\n        if order.status != OrderStatus.CONFIRMED:\n            raise BusinessRuleError(\"Can only fulfill confirmed orders\")\n        \n        # Check inventory availability\n        if not self.inventory_service.reserve_items_for_order(order):\n            raise BusinessRuleError(\"Insufficient inventory to fulfill order\")\n        \n        try:\n            # Create shipping label\n            tracking_number = self.shipping_service.create_shipment(\n                order.shipping_address,\n                order.items\n            )\n            \n            # Update order status\n            order.ship(tracking_number)\n            \n            # Send notification\n            self.notification_service.send_shipping_notification(\n                order.customer_id,\n                order.id,\n                tracking_number\n            )\n            \n            return True\n            \n        except Exception as e:\n            # Release inventory if fulfillment fails\n            self.inventory_service.release_items_for_order(order)\n            raise FulfillmentError(f\"Order fulfillment failed: {e}\")\n",[1114,6644,6645,6650,6659,6668,6672,6698,6712,6716,6752,6761,6796,6812,6816,6821,6847,6885,6889,6894,6923,6927,6945,6949,6985,6994,6999,7016,7041,7045,7050,7082,7103,7107,7127,7131,7166,7175,7180,7190,7217,7244,7271,7276,7280,7322,7339,7343,7370,7379,7384,7404,7408,7435,7444,7459,7463,7472,7481,7485,7511,7525,7529,7556,7565,7570,7586,7614,7642,7648,7652,7657,7673,7699,7718,7737,7741,7747,7751,7772,7781,7797,7823,7831,7851,7869,7873,7906,7915,7937,7941,7950,7959,7963,7977,7993,8004,8020,8034,8048,8062,8066,8093,8102,8122,8139,8143,8148,8171,8188,8192,8199,8204,8225,8236,8245,8250,8255,8260,8276,8280,8285,8300,8310,8320,8325,8329,8333,8339,8343,8359,8364,8383],{"__ignoreMap":1112},[1117,6646,6647],{"class":1119,"line":1120},[1117,6648,6649],{"class":1123},"# Domain Services - Business logic that spans multiple entities\n",[1117,6651,6652,6654,6657],{"class":1119,"line":1127},[1117,6653,1209],{"class":1208},[1117,6655,6656],{"class":1212}," PricingService",[1117,6658,1216],{"class":1180},[1117,6660,6661,6663,6666],{"class":1119,"line":1144},[1117,6662,1223],{"class":1222},[1117,6664,6665],{"class":1226},"Domain service for pricing calculations",[1117,6667,1230],{"class":1222},[1117,6669,6670],{"class":1119,"line":1157},[1117,6671,1273],{"class":1134},[1117,6673,6674,6676,6678,6680,6682,6684,6687,6689,6691,6694,6696],{"class":1119,"line":1170},[1117,6675,1279],{"class":1208},[1117,6677,2368],{"class":1367},[1117,6679,1188],{"class":1180},[1117,6681,1289],{"class":1288},[1117,6683,1425],{"class":1180},[1117,6685,6686],{"class":1428}," discount_repo",[1117,6688,1239],{"class":1180},[1117,6690,1260],{"class":1259},[1117,6692,6693],{"class":1263},"DiscountRepository",[1117,6695,1439],{"class":1259},[1117,6697,1292],{"class":1180},[1117,6699,6700,6702,6704,6707,6709],{"class":1119,"line":1177},[1117,6701,2407],{"class":1301},[1117,6703,1305],{"class":1180},[1117,6705,6706],{"class":1308},"discount_repo",[1117,6708,1256],{"class":1180},[1117,6710,6711],{"class":1134}," discount_repo\n",[1117,6713,6714],{"class":1119,"line":1205},[1117,6715,1273],{"class":1134},[1117,6717,6718,6720,6723,6725,6727,6729,6731,6733,6735,6737,6740,6742,6744,6746,6748,6750],{"class":1119,"line":1219},[1117,6719,1279],{"class":1208},[1117,6721,6722],{"class":1184}," calculate_order_total",[1117,6724,1188],{"class":1180},[1117,6726,1289],{"class":1288},[1117,6728,1425],{"class":1180},[1117,6730,6108],{"class":1428},[1117,6732,1239],{"class":1180},[1117,6734,3986],{"class":1134},[1117,6736,1425],{"class":1180},[1117,6738,6739],{"class":1428}," customer",[1117,6741,1239],{"class":1180},[1117,6743,2343],{"class":1134},[1117,6745,1379],{"class":1180},[1117,6747,1444],{"class":1180},[1117,6749,1213],{"class":1134},[1117,6751,1216],{"class":1180},[1117,6753,6754,6756,6759],{"class":1119,"line":1233},[1117,6755,1458],{"class":1222},[1117,6757,6758],{"class":1226},"Calculate order total with discounts and taxes",[1117,6760,1230],{"class":1222},[1117,6762,6763,6766,6768,6770,6772,6774,6776,6778,6780,6782,6784,6786,6788,6790,6792,6794],{"class":1119,"line":1244},[1117,6764,6765],{"class":1134},"        subtotal ",[1117,6767,1195],{"class":1180},[1117,6769,5476],{"class":1367},[1117,6771,1188],{"class":1180},[1117,6773,4455],{"class":1516},[1117,6775,1305],{"class":1180},[1117,6777,4098],{"class":1516},[1117,6779,5487],{"class":1180},[1117,6781,1309],{"class":1308},[1117,6783,5492],{"class":1130},[1117,6785,5103],{"class":1516},[1117,6787,2639],{"class":1130},[1117,6789,6108],{"class":1516},[1117,6791,1305],{"class":1180},[1117,6793,4065],{"class":1308},[1117,6795,1202],{"class":1180},[1117,6797,6798,6801,6803,6805,6807,6810],{"class":1119,"line":1270},[1117,6799,6800],{"class":1134},"        subtotal_money ",[1117,6802,1195],{"class":1180},[1117,6804,1213],{"class":1516},[1117,6806,1188],{"class":1180},[1117,6808,6809],{"class":1516},"subtotal",[1117,6811,1202],{"class":1180},[1117,6813,6814],{"class":1119,"line":1276},[1117,6815,1346],{"class":1134},[1117,6817,6818],{"class":1119,"line":1295},[1117,6819,6820],{"class":1123},"        # Apply customer discounts\n",[1117,6822,6823,6826,6828,6830,6832,6835,6837,6840,6842,6845],{"class":1119,"line":1322},[1117,6824,6825],{"class":1134},"        discount ",[1117,6827,1195],{"class":1180},[1117,6829,1302],{"class":1301},[1117,6831,1305],{"class":1180},[1117,6833,6834],{"class":1516},"_calculate_customer_discount",[1117,6836,1188],{"class":1180},[1117,6838,6839],{"class":1516},"customer",[1117,6841,1425],{"class":1180},[1117,6843,6844],{"class":1516}," subtotal_money",[1117,6846,1202],{"class":1180},[1117,6848,6849,6852,6854,6856,6858,6860,6862,6865,6867,6869,6871,6873,6875,6877,6880,6882],{"class":1119,"line":1343},[1117,6850,6851],{"class":1134},"        discounted_total ",[1117,6853,1195],{"class":1180},[1117,6855,6844],{"class":1134},[1117,6857,1305],{"class":1180},[1117,6859,3110],{"class":1516},[1117,6861,1188],{"class":1180},[1117,6863,6864],{"class":1516},"discount",[1117,6866,1305],{"class":1180},[1117,6868,5856],{"class":1516},[1117,6870,1188],{"class":1180},[1117,6872,2519],{"class":1516},[1117,6874,1188],{"class":1180},[1117,6876,1439],{"class":1259},[1117,6878,6879],{"class":1263},"-1",[1117,6881,1439],{"class":1259},[1117,6883,6884],{"class":1180},")))\n",[1117,6886,6887],{"class":1119,"line":1349},[1117,6888,1346],{"class":1134},[1117,6890,6891],{"class":1119,"line":1390},[1117,6892,6893],{"class":1123},"        # Apply taxes\n",[1117,6895,6896,6899,6901,6903,6905,6908,6910,6913,6915,6917,6919,6921],{"class":1119,"line":1408},[1117,6897,6898],{"class":1134},"        tax ",[1117,6900,1195],{"class":1180},[1117,6902,1302],{"class":1301},[1117,6904,1305],{"class":1180},[1117,6906,6907],{"class":1516},"_calculate_tax",[1117,6909,1188],{"class":1180},[1117,6911,6912],{"class":1516},"discounted_total",[1117,6914,1425],{"class":1180},[1117,6916,6108],{"class":1516},[1117,6918,1305],{"class":1180},[1117,6920,4125],{"class":1308},[1117,6922,1202],{"class":1180},[1117,6924,6925],{"class":1119,"line":1413},[1117,6926,1346],{"class":1134},[1117,6928,6929,6931,6934,6936,6938,6940,6943],{"class":1119,"line":1455},[1117,6930,1513],{"class":1130},[1117,6932,6933],{"class":1134}," discounted_total",[1117,6935,1305],{"class":1180},[1117,6937,3110],{"class":1516},[1117,6939,1188],{"class":1180},[1117,6941,6942],{"class":1516},"tax",[1117,6944,1202],{"class":1180},[1117,6946,6947],{"class":1119,"line":1466},[1117,6948,1273],{"class":1134},[1117,6950,6951,6953,6956,6958,6960,6962,6964,6966,6968,6970,6973,6975,6977,6979,6981,6983],{"class":1119,"line":1487},[1117,6952,1279],{"class":1208},[1117,6954,6955],{"class":1184}," _calculate_customer_discount",[1117,6957,1188],{"class":1180},[1117,6959,1289],{"class":1288},[1117,6961,1425],{"class":1180},[1117,6963,6739],{"class":1428},[1117,6965,1239],{"class":1180},[1117,6967,2343],{"class":1134},[1117,6969,1425],{"class":1180},[1117,6971,6972],{"class":1428}," subtotal",[1117,6974,1239],{"class":1180},[1117,6976,1213],{"class":1134},[1117,6978,1379],{"class":1180},[1117,6980,1444],{"class":1180},[1117,6982,1213],{"class":1134},[1117,6984,1216],{"class":1180},[1117,6986,6987,6989,6992],{"class":1119,"line":1505},[1117,6988,1458],{"class":1222},[1117,6990,6991],{"class":1226},"Calculate customer-specific discounts",[1117,6993,1230],{"class":1222},[1117,6995,6996],{"class":1119,"line":1510},[1117,6997,6998],{"class":1123},"        # VIP customers get 10% discount\n",[1117,7000,7001,7003,7005,7007,7010,7012,7014],{"class":1119,"line":1546},[1117,7002,1298],{"class":1130},[1117,7004,1302],{"class":1301},[1117,7006,1305],{"class":1180},[1117,7008,7009],{"class":1516},"_is_vip_customer",[1117,7011,1188],{"class":1180},[1117,7013,6839],{"class":1516},[1117,7015,1292],{"class":1180},[1117,7017,7018,7020,7022,7024,7026,7028,7030,7032,7034,7037,7039],{"class":1119,"line":1551},[1117,7019,2916],{"class":1130},[1117,7021,6972],{"class":1134},[1117,7023,1305],{"class":1180},[1117,7025,5856],{"class":1516},[1117,7027,1188],{"class":1180},[1117,7029,2519],{"class":1516},[1117,7031,1188],{"class":1180},[1117,7033,1439],{"class":1259},[1117,7035,7036],{"class":1263},"0.10",[1117,7038,1439],{"class":1259},[1117,7040,2531],{"class":1180},[1117,7042,7043],{"class":1119,"line":1585},[1117,7044,1346],{"class":1134},[1117,7046,7047],{"class":1119,"line":1595},[1117,7048,7049],{"class":1123},"        # First-time customers get $50 off orders over $200\n",[1117,7051,7052,7054,7056,7058,7061,7063,7065,7067,7069,7071,7073,7075,7077,7080],{"class":1119,"line":1625},[1117,7053,1298],{"class":1130},[1117,7055,1302],{"class":1301},[1117,7057,1305],{"class":1180},[1117,7059,7060],{"class":1516},"_is_first_time_customer",[1117,7062,1188],{"class":1180},[1117,7064,6839],{"class":1516},[1117,7066,1379],{"class":1180},[1117,7068,1936],{"class":1312},[1117,7070,6972],{"class":1134},[1117,7072,1305],{"class":1180},[1117,7074,1309],{"class":1308},[1117,7076,3059],{"class":1312},[1117,7078,7079],{"class":1316}," 200",[1117,7081,1216],{"class":1180},[1117,7083,7084,7086,7088,7090,7092,7094,7096,7099,7101],{"class":1119,"line":1630},[1117,7085,2916],{"class":1130},[1117,7087,1213],{"class":1516},[1117,7089,1188],{"class":1180},[1117,7091,2519],{"class":1516},[1117,7093,1188],{"class":1180},[1117,7095,1439],{"class":1259},[1117,7097,7098],{"class":1263},"50.00",[1117,7100,1439],{"class":1259},[1117,7102,2531],{"class":1180},[1117,7104,7105],{"class":1119,"line":1651},[1117,7106,1346],{"class":1134},[1117,7108,7109,7111,7113,7115,7117,7119,7121,7123,7125],{"class":1119,"line":1661},[1117,7110,1513],{"class":1130},[1117,7112,1213],{"class":1516},[1117,7114,1188],{"class":1180},[1117,7116,2519],{"class":1516},[1117,7118,1188],{"class":1180},[1117,7120,1439],{"class":1259},[1117,7122,2556],{"class":1263},[1117,7124,1439],{"class":1259},[1117,7126,2531],{"class":1180},[1117,7128,7129],{"class":1119,"line":1678},[1117,7130,1273],{"class":1134},[1117,7132,7133,7135,7138,7140,7142,7144,7146,7148,7150,7152,7154,7156,7158,7160,7162,7164],{"class":1119,"line":1683},[1117,7134,1279],{"class":1208},[1117,7136,7137],{"class":1184}," _calculate_tax",[1117,7139,1188],{"class":1180},[1117,7141,1289],{"class":1288},[1117,7143,1425],{"class":1180},[1117,7145,2982],{"class":1428},[1117,7147,1239],{"class":1180},[1117,7149,1213],{"class":1134},[1117,7151,1425],{"class":1180},[1117,7153,2582],{"class":1428},[1117,7155,1239],{"class":1180},[1117,7157,1705],{"class":1134},[1117,7159,1379],{"class":1180},[1117,7161,1444],{"class":1180},[1117,7163,1213],{"class":1134},[1117,7165,1216],{"class":1180},[1117,7167,7168,7170,7173],{"class":1119,"line":1700},[1117,7169,1458],{"class":1222},[1117,7171,7172],{"class":1226},"Calculate tax based on shipping address",[1117,7174,1230],{"class":1222},[1117,7176,7177],{"class":1119,"line":1710},[1117,7178,7179],{"class":1123},"        # Simplified tax calculation\n",[1117,7181,7182,7185,7187],{"class":1119,"line":1720},[1117,7183,7184],{"class":1134},"        tax_rates ",[1117,7186,1195],{"class":1180},[1117,7188,7189],{"class":1180}," {\n",[1117,7191,7192,7194,7197,7199,7201,7203,7205,7207,7210,7212,7214],{"class":1119,"line":1731},[1117,7193,2697],{"class":1259},[1117,7195,7196],{"class":1263},"CA",[1117,7198,1439],{"class":1259},[1117,7200,1239],{"class":1180},[1117,7202,1570],{"class":1516},[1117,7204,1188],{"class":1180},[1117,7206,1439],{"class":1259},[1117,7208,7209],{"class":1263},"0.0875",[1117,7211,1439],{"class":1259},[1117,7213,5435],{"class":1180},[1117,7215,7216],{"class":1123},"  # California\n",[1117,7218,7219,7221,7224,7226,7228,7230,7232,7234,7237,7239,7241],{"class":1119,"line":1741},[1117,7220,2697],{"class":1259},[1117,7222,7223],{"class":1263},"NY",[1117,7225,1439],{"class":1259},[1117,7227,1239],{"class":1180},[1117,7229,1570],{"class":1516},[1117,7231,1188],{"class":1180},[1117,7233,1439],{"class":1259},[1117,7235,7236],{"class":1263},"0.08",[1117,7238,1439],{"class":1259},[1117,7240,5435],{"class":1180},[1117,7242,7243],{"class":1123},"    # New York\n",[1117,7245,7246,7248,7251,7253,7255,7257,7259,7261,7264,7266,7268],{"class":1119,"line":1751},[1117,7247,2697],{"class":1259},[1117,7249,7250],{"class":1263},"TX",[1117,7252,1439],{"class":1259},[1117,7254,1239],{"class":1180},[1117,7256,1570],{"class":1516},[1117,7258,1188],{"class":1180},[1117,7260,1439],{"class":1259},[1117,7262,7263],{"class":1263},"0.0625",[1117,7265,1439],{"class":1259},[1117,7267,5435],{"class":1180},[1117,7269,7270],{"class":1123},"  # Texas\n",[1117,7272,7273],{"class":1119,"line":1761},[1117,7274,7275],{"class":1180},"        }\n",[1117,7277,7278],{"class":1119,"line":1780},[1117,7279,1346],{"class":1134},[1117,7281,7282,7285,7287,7290,7292,7295,7297,7299,7301,7303,7305,7307,7309,7311,7314,7316,7319],{"class":1119,"line":1785},[1117,7283,7284],{"class":1134},"        tax_rate ",[1117,7286,1195],{"class":1180},[1117,7288,7289],{"class":1134}," tax_rates",[1117,7291,1305],{"class":1180},[1117,7293,7294],{"class":1516},"get",[1117,7296,1188],{"class":1180},[1117,7298,2700],{"class":1516},[1117,7300,1305],{"class":1180},[1117,7302,1833],{"class":1308},[1117,7304,1425],{"class":1180},[1117,7306,1570],{"class":1516},[1117,7308,1188],{"class":1180},[1117,7310,1439],{"class":1259},[1117,7312,7313],{"class":1263},"0.05",[1117,7315,1439],{"class":1259},[1117,7317,7318],{"class":1180},"))",[1117,7320,7321],{"class":1123},"  # Default 5%\n",[1117,7323,7324,7326,7328,7330,7332,7334,7337],{"class":1119,"line":1798},[1117,7325,1513],{"class":1130},[1117,7327,2982],{"class":1134},[1117,7329,1305],{"class":1180},[1117,7331,5856],{"class":1516},[1117,7333,1188],{"class":1180},[1117,7335,7336],{"class":1516},"tax_rate",[1117,7338,1202],{"class":1180},[1117,7340,7341],{"class":1119,"line":1848},[1117,7342,1273],{"class":1134},[1117,7344,7345,7347,7350,7352,7354,7356,7358,7360,7362,7364,7366,7368],{"class":1119,"line":1866},[1117,7346,1279],{"class":1208},[1117,7348,7349],{"class":1184}," _is_vip_customer",[1117,7351,1188],{"class":1180},[1117,7353,1289],{"class":1288},[1117,7355,1425],{"class":1180},[1117,7357,6739],{"class":1428},[1117,7359,1239],{"class":1180},[1117,7361,2343],{"class":1134},[1117,7363,1379],{"class":1180},[1117,7365,1444],{"class":1180},[1117,7367,1646],{"class":1252},[1117,7369,1216],{"class":1180},[1117,7371,7372,7374,7377],{"class":1119,"line":1871},[1117,7373,1458],{"class":1222},[1117,7375,7376],{"class":1226},"Check if customer is VIP",[1117,7378,1230],{"class":1222},[1117,7380,7381],{"class":1119,"line":1904},[1117,7382,7383],{"class":1123},"        # Business rule: VIP customers have spent over $10,000\n",[1117,7385,7386,7388,7390,7392,7395,7397,7399,7401],{"class":1119,"line":1914},[1117,7387,1513],{"class":1130},[1117,7389,6739],{"class":1134},[1117,7391,1305],{"class":1180},[1117,7393,7394],{"class":1308},"lifetime_spent",[1117,7396,1305],{"class":1180},[1117,7398,1309],{"class":1308},[1117,7400,3059],{"class":1312},[1117,7402,7403],{"class":1316}," 10000\n",[1117,7405,7406],{"class":1119,"line":1942},[1117,7407,1273],{"class":1134},[1117,7409,7410,7412,7415,7417,7419,7421,7423,7425,7427,7429,7431,7433],{"class":1119,"line":1964},[1117,7411,1279],{"class":1208},[1117,7413,7414],{"class":1184}," _is_first_time_customer",[1117,7416,1188],{"class":1180},[1117,7418,1289],{"class":1288},[1117,7420,1425],{"class":1180},[1117,7422,6739],{"class":1428},[1117,7424,1239],{"class":1180},[1117,7426,2343],{"class":1134},[1117,7428,1379],{"class":1180},[1117,7430,1444],{"class":1180},[1117,7432,1646],{"class":1252},[1117,7434,1216],{"class":1180},[1117,7436,7437,7439,7442],{"class":1119,"line":1984},[1117,7438,1458],{"class":1222},[1117,7440,7441],{"class":1226},"Check if customer is making first purchase",[1117,7443,1230],{"class":1222},[1117,7445,7446,7448,7450,7452,7455,7457],{"class":1119,"line":1989},[1117,7447,1513],{"class":1130},[1117,7449,6739],{"class":1134},[1117,7451,1305],{"class":1180},[1117,7453,7454],{"class":1308},"order_count",[1117,7456,1672],{"class":1312},[1117,7458,1675],{"class":1316},[1117,7460,7461],{"class":1119,"line":2006},[1117,7462,1174],{"emptyLinePlaceholder":1173},[1117,7464,7465,7467,7470],{"class":1119,"line":2016},[1117,7466,1209],{"class":1208},[1117,7468,7469],{"class":1212}," InventoryService",[1117,7471,1216],{"class":1180},[1117,7473,7474,7476,7479],{"class":1119,"line":2026},[1117,7475,1223],{"class":1222},[1117,7477,7478],{"class":1226},"Domain service for inventory management",[1117,7480,1230],{"class":1222},[1117,7482,7483],{"class":1119,"line":2036},[1117,7484,1273],{"class":1134},[1117,7486,7487,7489,7491,7493,7495,7497,7500,7502,7504,7507,7509],{"class":1119,"line":2041},[1117,7488,1279],{"class":1208},[1117,7490,2368],{"class":1367},[1117,7492,1188],{"class":1180},[1117,7494,1289],{"class":1288},[1117,7496,1425],{"class":1180},[1117,7498,7499],{"class":1428}," product_repo",[1117,7501,1239],{"class":1180},[1117,7503,1260],{"class":1259},[1117,7505,7506],{"class":1263},"ProductRepository",[1117,7508,1439],{"class":1259},[1117,7510,1292],{"class":1180},[1117,7512,7513,7515,7517,7520,7522],{"class":1119,"line":2054},[1117,7514,2407],{"class":1301},[1117,7516,1305],{"class":1180},[1117,7518,7519],{"class":1308},"product_repo",[1117,7521,1256],{"class":1180},[1117,7523,7524],{"class":1134}," product_repo\n",[1117,7526,7527],{"class":1119,"line":2079},[1117,7528,1273],{"class":1134},[1117,7530,7531,7533,7536,7538,7540,7542,7544,7546,7548,7550,7552,7554],{"class":1119,"line":2111},[1117,7532,1279],{"class":1208},[1117,7534,7535],{"class":1184}," reserve_items_for_order",[1117,7537,1188],{"class":1180},[1117,7539,1289],{"class":1288},[1117,7541,1425],{"class":1180},[1117,7543,6108],{"class":1428},[1117,7545,1239],{"class":1180},[1117,7547,3986],{"class":1134},[1117,7549,1379],{"class":1180},[1117,7551,1444],{"class":1180},[1117,7553,1646],{"class":1252},[1117,7555,1216],{"class":1180},[1117,7557,7558,7560,7563],{"class":1119,"line":2116},[1117,7559,1458],{"class":1222},[1117,7561,7562],{"class":1226},"Reserve inventory for all items in order",[1117,7564,1230],{"class":1222},[1117,7566,7567],{"class":1119,"line":2145},[1117,7568,7569],{"class":1123},"        # Check availability first\n",[1117,7571,7572,7574,7576,7578,7580,7582,7584],{"class":1119,"line":2155},[1117,7573,2797],{"class":1130},[1117,7575,5103],{"class":1134},[1117,7577,2639],{"class":1130},[1117,7579,6108],{"class":1134},[1117,7581,1305],{"class":1180},[1117,7583,4065],{"class":1308},[1117,7585,1216],{"class":1180},[1117,7587,7588,7591,7593,7595,7597,7599,7601,7604,7606,7608,7610,7612],{"class":1119,"line":2164},[1117,7589,7590],{"class":1134},"            product ",[1117,7592,1195],{"class":1180},[1117,7594,1302],{"class":1301},[1117,7596,1305],{"class":1180},[1117,7598,7519],{"class":1308},[1117,7600,1305],{"class":1180},[1117,7602,7603],{"class":1516},"get_by_id",[1117,7605,1188],{"class":1180},[1117,7607,4455],{"class":1516},[1117,7609,1305],{"class":1180},[1117,7611,4605],{"class":1308},[1117,7613,1202],{"class":1180},[1117,7615,7616,7618,7620,7623,7626,7628,7630,7632,7634,7636,7638,7640],{"class":1119,"line":2227},[1117,7617,2815],{"class":1130},[1117,7619,1354],{"class":1312},[1117,7621,7622],{"class":1134}," product ",[1117,7624,7625],{"class":1312},"or",[1117,7627,4180],{"class":1134},[1117,7629,1305],{"class":1180},[1117,7631,3509],{"class":1308},[1117,7633,1313],{"class":1312},[1117,7635,4616],{"class":1134},[1117,7637,1305],{"class":1180},[1117,7639,4379],{"class":1308},[1117,7641,1216],{"class":1180},[1117,7643,7644,7646],{"class":1119,"line":2259},[1117,7645,2834],{"class":1130},[1117,7647,2669],{"class":1198},[1117,7649,7650],{"class":1119,"line":2264},[1117,7651,1346],{"class":1134},[1117,7653,7654],{"class":1119,"line":2284},[1117,7655,7656],{"class":1123},"        # Reserve all items\n",[1117,7658,7659,7661,7663,7665,7667,7669,7671],{"class":1119,"line":2294},[1117,7660,2797],{"class":1130},[1117,7662,5103],{"class":1134},[1117,7664,2639],{"class":1130},[1117,7666,6108],{"class":1134},[1117,7668,1305],{"class":1180},[1117,7670,4065],{"class":1308},[1117,7672,1216],{"class":1180},[1117,7674,7675,7677,7679,7681,7683,7685,7687,7689,7691,7693,7695,7697],{"class":1119,"line":2327},[1117,7676,7590],{"class":1134},[1117,7678,1195],{"class":1180},[1117,7680,1302],{"class":1301},[1117,7682,1305],{"class":1180},[1117,7684,7519],{"class":1308},[1117,7686,1305],{"class":1180},[1117,7688,7603],{"class":1516},[1117,7690,1188],{"class":1180},[1117,7692,4455],{"class":1516},[1117,7694,1305],{"class":1180},[1117,7696,4605],{"class":1308},[1117,7698,1202],{"class":1180},[1117,7700,7701,7704,7706,7708,7710,7712,7714,7716],{"class":1119,"line":2332},[1117,7702,7703],{"class":1134},"            product",[1117,7705,1305],{"class":1180},[1117,7707,4476],{"class":1516},[1117,7709,1188],{"class":1180},[1117,7711,4455],{"class":1516},[1117,7713,1305],{"class":1180},[1117,7715,4379],{"class":1308},[1117,7717,1202],{"class":1180},[1117,7719,7720,7722,7724,7726,7728,7731,7733,7735],{"class":1119,"line":2338},[1117,7721,4442],{"class":1301},[1117,7723,1305],{"class":1180},[1117,7725,7519],{"class":1308},[1117,7727,1305],{"class":1180},[1117,7729,7730],{"class":1516},"save",[1117,7732,1188],{"class":1180},[1117,7734,4349],{"class":1516},[1117,7736,1202],{"class":1180},[1117,7738,7739],{"class":1119,"line":2348},[1117,7740,1346],{"class":1134},[1117,7742,7743,7745],{"class":1119,"line":2358},[1117,7744,1513],{"class":1130},[1117,7746,2477],{"class":1198},[1117,7748,7749],{"class":1119,"line":2363},[1117,7750,1273],{"class":1134},[1117,7752,7753,7755,7758,7760,7762,7764,7766,7768,7770],{"class":1119,"line":2404},[1117,7754,1279],{"class":1208},[1117,7756,7757],{"class":1184}," release_items_for_order",[1117,7759,1188],{"class":1180},[1117,7761,1289],{"class":1288},[1117,7763,1425],{"class":1180},[1117,7765,6108],{"class":1428},[1117,7767,1239],{"class":1180},[1117,7769,3986],{"class":1134},[1117,7771,1292],{"class":1180},[1117,7773,7774,7776,7779],{"class":1119,"line":2420},[1117,7775,1458],{"class":1222},[1117,7777,7778],{"class":1226},"Release reserved inventory for cancelled order",[1117,7780,1230],{"class":1222},[1117,7782,7783,7785,7787,7789,7791,7793,7795],{"class":1119,"line":2435},[1117,7784,2797],{"class":1130},[1117,7786,5103],{"class":1134},[1117,7788,2639],{"class":1130},[1117,7790,6108],{"class":1134},[1117,7792,1305],{"class":1180},[1117,7794,4065],{"class":1308},[1117,7796,1216],{"class":1180},[1117,7798,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821],{"class":1119,"line":2450},[1117,7800,7590],{"class":1134},[1117,7802,1195],{"class":1180},[1117,7804,1302],{"class":1301},[1117,7806,1305],{"class":1180},[1117,7808,7519],{"class":1308},[1117,7810,1305],{"class":1180},[1117,7812,7603],{"class":1516},[1117,7814,1188],{"class":1180},[1117,7816,4455],{"class":1516},[1117,7818,1305],{"class":1180},[1117,7820,4605],{"class":1308},[1117,7822,1202],{"class":1180},[1117,7824,7825,7827,7829],{"class":1119,"line":2465},[1117,7826,2815],{"class":1130},[1117,7828,4180],{"class":1134},[1117,7830,1216],{"class":1180},[1117,7832,7833,7836,7838,7841,7843,7845,7847,7849],{"class":1119,"line":2480},[1117,7834,7835],{"class":1134},"                product",[1117,7837,1305],{"class":1180},[1117,7839,7840],{"class":1516},"release_inventory",[1117,7842,1188],{"class":1180},[1117,7844,4455],{"class":1516},[1117,7846,1305],{"class":1180},[1117,7848,4379],{"class":1308},[1117,7850,1202],{"class":1180},[1117,7852,7853,7855,7857,7859,7861,7863,7865,7867],{"class":1119,"line":2503},[1117,7854,1945],{"class":1301},[1117,7856,1305],{"class":1180},[1117,7858,7519],{"class":1308},[1117,7860,1305],{"class":1180},[1117,7862,7730],{"class":1516},[1117,7864,1188],{"class":1180},[1117,7866,4349],{"class":1516},[1117,7868,1202],{"class":1180},[1117,7870,7871],{"class":1119,"line":2534},[1117,7872,1273],{"class":1134},[1117,7874,7875,7877,7880,7882,7884,7886,7889,7891,7893,7895,7898,7900,7902,7904],{"class":1119,"line":2563},[1117,7876,1279],{"class":1208},[1117,7878,7879],{"class":1184}," check_low_inventory",[1117,7881,1188],{"class":1180},[1117,7883,1289],{"class":1288},[1117,7885,1425],{"class":1180},[1117,7887,7888],{"class":1428}," threshold",[1117,7890,1239],{"class":1180},[1117,7892,2382],{"class":1252},[1117,7894,1256],{"class":1180},[1117,7896,7897],{"class":1316}," 10",[1117,7899,1379],{"class":1180},[1117,7901,1444],{"class":1180},[1117,7903,6549],{"class":1252},[1117,7905,1216],{"class":1180},[1117,7907,7908,7910,7913],{"class":1119,"line":2568},[1117,7909,1458],{"class":1222},[1117,7911,7912],{"class":1226},"Find products with low inventory",[1117,7914,1230],{"class":1222},[1117,7916,7917,7919,7921,7923,7925,7927,7930,7932,7935],{"class":1119,"line":2605},[1117,7918,1513],{"class":1130},[1117,7920,1302],{"class":1301},[1117,7922,1305],{"class":1180},[1117,7924,7519],{"class":1308},[1117,7926,1305],{"class":1180},[1117,7928,7929],{"class":1516},"find_by_inventory_below",[1117,7931,1188],{"class":1180},[1117,7933,7934],{"class":1516},"threshold",[1117,7936,1202],{"class":1180},[1117,7938,7939],{"class":1119,"line":2615},[1117,7940,1174],{"emptyLinePlaceholder":1173},[1117,7942,7943,7945,7948],{"class":1119,"line":2624},[1117,7944,1209],{"class":1208},[1117,7946,7947],{"class":1212}," OrderFulfillmentService",[1117,7949,1216],{"class":1180},[1117,7951,7952,7954,7957],{"class":1119,"line":2630},[1117,7953,1223],{"class":1222},[1117,7955,7956],{"class":1226},"Domain service for order fulfillment",[1117,7958,1230],{"class":1222},[1117,7960,7961],{"class":1119,"line":2650},[1117,7962,1273],{"class":1134},[1117,7964,7965,7967,7969,7971,7973,7975],{"class":1119,"line":2672},[1117,7966,1279],{"class":1208},[1117,7968,2368],{"class":1367},[1117,7970,1188],{"class":1180},[1117,7972,1289],{"class":1288},[1117,7974,1425],{"class":1180},[1117,7976,1939],{"class":1134},[1117,7978,7979,7982,7984,7986,7989,7991],{"class":1119,"line":2677},[1117,7980,7981],{"class":1428},"                 shipping_service",[1117,7983,1239],{"class":1180},[1117,7985,1260],{"class":1259},[1117,7987,7988],{"class":1263},"ShippingService",[1117,7990,1439],{"class":1259},[1117,7992,2709],{"class":1180},[1117,7994,7995,7998,8000,8002],{"class":1119,"line":2694},[1117,7996,7997],{"class":1428},"                 inventory_service",[1117,7999,1239],{"class":1180},[1117,8001,7469],{"class":1134},[1117,8003,2709],{"class":1180},[1117,8005,8006,8009,8011,8013,8016,8018],{"class":1119,"line":2712},[1117,8007,8008],{"class":1428},"                 notification_service",[1117,8010,1239],{"class":1180},[1117,8012,1260],{"class":1259},[1117,8014,8015],{"class":1263},"NotificationService",[1117,8017,1439],{"class":1259},[1117,8019,1292],{"class":1180},[1117,8021,8022,8024,8026,8029,8031],{"class":1119,"line":2727},[1117,8023,2407],{"class":1301},[1117,8025,1305],{"class":1180},[1117,8027,8028],{"class":1308},"shipping_service",[1117,8030,1256],{"class":1180},[1117,8032,8033],{"class":1134}," shipping_service\n",[1117,8035,8036,8038,8040,8043,8045],{"class":1119,"line":2747},[1117,8037,2407],{"class":1301},[1117,8039,1305],{"class":1180},[1117,8041,8042],{"class":1308},"inventory_service",[1117,8044,1256],{"class":1180},[1117,8046,8047],{"class":1134}," inventory_service\n",[1117,8049,8050,8052,8054,8057,8059],{"class":1119,"line":2753},[1117,8051,2407],{"class":1301},[1117,8053,1305],{"class":1180},[1117,8055,8056],{"class":1308},"notification_service",[1117,8058,1256],{"class":1180},[1117,8060,8061],{"class":1134}," notification_service\n",[1117,8063,8064],{"class":1119,"line":2758},[1117,8065,1273],{"class":1134},[1117,8067,8068,8070,8073,8075,8077,8079,8081,8083,8085,8087,8089,8091],{"class":1119,"line":2784},[1117,8069,1279],{"class":1208},[1117,8071,8072],{"class":1184}," fulfill_order",[1117,8074,1188],{"class":1180},[1117,8076,1289],{"class":1288},[1117,8078,1425],{"class":1180},[1117,8080,6108],{"class":1428},[1117,8082,1239],{"class":1180},[1117,8084,3986],{"class":1134},[1117,8086,1379],{"class":1180},[1117,8088,1444],{"class":1180},[1117,8090,1646],{"class":1252},[1117,8092,1216],{"class":1180},[1117,8094,8095,8097,8100],{"class":1119,"line":2794},[1117,8096,1458],{"class":1222},[1117,8098,8099],{"class":1226},"Fulfill confirmed order",[1117,8101,1230],{"class":1222},[1117,8103,8104,8106,8108,8110,8112,8114,8116,8118,8120],{"class":1119,"line":2812},[1117,8105,1298],{"class":1130},[1117,8107,6108],{"class":1134},[1117,8109,1305],{"class":1180},[1117,8111,4078],{"class":1308},[1117,8113,1382],{"class":1312},[1117,8115,4083],{"class":1134},[1117,8117,1305],{"class":1180},[1117,8119,4736],{"class":4088},[1117,8121,1216],{"class":1180},[1117,8123,8124,8126,8128,8130,8132,8135,8137],{"class":1119,"line":2831},[1117,8125,1325],{"class":1130},[1117,8127,3072],{"class":1516},[1117,8129,1188],{"class":1180},[1117,8131,1333],{"class":1259},[1117,8133,8134],{"class":1263},"Can only fulfill confirmed orders",[1117,8136,1333],{"class":1259},[1117,8138,1202],{"class":1180},[1117,8140,8141],{"class":1119,"line":2849},[1117,8142,1346],{"class":1134},[1117,8144,8145],{"class":1119,"line":2856},[1117,8146,8147],{"class":1123},"        # Check inventory availability\n",[1117,8149,8150,8152,8154,8156,8158,8160,8162,8165,8167,8169],{"class":1119,"line":2861},[1117,8151,1298],{"class":1130},[1117,8153,1354],{"class":1312},[1117,8155,1302],{"class":1301},[1117,8157,1305],{"class":1180},[1117,8159,8042],{"class":1308},[1117,8161,1305],{"class":1180},[1117,8163,8164],{"class":1516},"reserve_items_for_order",[1117,8166,1188],{"class":1180},[1117,8168,6129],{"class":1516},[1117,8170,1292],{"class":1180},[1117,8172,8173,8175,8177,8179,8181,8184,8186],{"class":1119,"line":2884},[1117,8174,1325],{"class":1130},[1117,8176,3072],{"class":1516},[1117,8178,1188],{"class":1180},[1117,8180,1333],{"class":1259},[1117,8182,8183],{"class":1263},"Insufficient inventory to fulfill order",[1117,8185,1333],{"class":1259},[1117,8187,1202],{"class":1180},[1117,8189,8190],{"class":1119,"line":2894},[1117,8191,1346],{"class":1134},[1117,8193,8194,8197],{"class":1119,"line":2913},[1117,8195,8196],{"class":1130},"        try",[1117,8198,1216],{"class":1180},[1117,8200,8201],{"class":1119,"line":2922},[1117,8202,8203],{"class":1123},"            # Create shipping label\n",[1117,8205,8206,8209,8211,8213,8215,8217,8219,8222],{"class":1119,"line":2927},[1117,8207,8208],{"class":1134},"            tracking_number ",[1117,8210,1195],{"class":1180},[1117,8212,1302],{"class":1301},[1117,8214,1305],{"class":1180},[1117,8216,8028],{"class":1308},[1117,8218,1305],{"class":1180},[1117,8220,8221],{"class":1516},"create_shipment",[1117,8223,8224],{"class":1180},"(\n",[1117,8226,8227,8230,8232,8234],{"class":1119,"line":2933},[1117,8228,8229],{"class":1516},"                order",[1117,8231,1305],{"class":1180},[1117,8233,4125],{"class":1308},[1117,8235,2709],{"class":1180},[1117,8237,8238,8240,8242],{"class":1119,"line":2947},[1117,8239,8229],{"class":1516},[1117,8241,1305],{"class":1180},[1117,8243,8244],{"class":1308},"items\n",[1117,8246,8247],{"class":1119,"line":2963},[1117,8248,8249],{"class":1180},"            )\n",[1117,8251,8252],{"class":1119,"line":2968},[1117,8253,8254],{"class":1134},"            \n",[1117,8256,8257],{"class":1119,"line":2991},[1117,8258,8259],{"class":1123},"            # Update order status\n",[1117,8261,8262,8265,8267,8270,8272,8274],{"class":1119,"line":3001},[1117,8263,8264],{"class":1134},"            order",[1117,8266,1305],{"class":1180},[1117,8268,8269],{"class":1516},"ship",[1117,8271,1188],{"class":1180},[1117,8273,5309],{"class":1516},[1117,8275,1202],{"class":1180},[1117,8277,8278],{"class":1119,"line":3019},[1117,8279,8254],{"class":1134},[1117,8281,8282],{"class":1119,"line":3037},[1117,8283,8284],{"class":1123},"            # Send notification\n",[1117,8286,8287,8289,8291,8293,8295,8298],{"class":1119,"line":3042},[1117,8288,4442],{"class":1301},[1117,8290,1305],{"class":1180},[1117,8292,8056],{"class":1308},[1117,8294,1305],{"class":1180},[1117,8296,8297],{"class":1516},"send_shipping_notification",[1117,8299,8224],{"class":1180},[1117,8301,8302,8304,8306,8308],{"class":1119,"line":3048},[1117,8303,8229],{"class":1516},[1117,8305,1305],{"class":1180},[1117,8307,4052],{"class":1308},[1117,8309,2709],{"class":1180},[1117,8311,8312,8314,8316,8318],{"class":1119,"line":3067},[1117,8313,8229],{"class":1516},[1117,8315,1305],{"class":1180},[1117,8317,2412],{"class":1308},[1117,8319,2709],{"class":1180},[1117,8321,8322],{"class":1119,"line":3086},[1117,8323,8324],{"class":1516},"                tracking_number\n",[1117,8326,8327],{"class":1119,"line":3091},[1117,8328,8249],{"class":1180},[1117,8330,8331],{"class":1119,"line":3119},[1117,8332,8254],{"class":1134},[1117,8334,8335,8337],{"class":1119,"line":3124},[1117,8336,2916],{"class":1130},[1117,8338,2477],{"class":1198},[1117,8340,8341],{"class":1119,"line":3152},[1117,8342,8254],{"class":1134},[1117,8344,8345,8348,8351,8354,8357],{"class":1119,"line":3162},[1117,8346,8347],{"class":1130},"        except",[1117,8349,8350],{"class":1252}," Exception",[1117,8352,8353],{"class":1130}," as",[1117,8355,8356],{"class":1134}," e",[1117,8358,1216],{"class":1180},[1117,8360,8361],{"class":1119,"line":3177},[1117,8362,8363],{"class":1123},"            # Release inventory if fulfillment fails\n",[1117,8365,8366,8368,8370,8372,8374,8377,8379,8381],{"class":1119,"line":3184},[1117,8367,4442],{"class":1301},[1117,8369,1305],{"class":1180},[1117,8371,8042],{"class":1308},[1117,8373,1305],{"class":1180},[1117,8375,8376],{"class":1516},"release_items_for_order",[1117,8378,1188],{"class":1180},[1117,8380,6129],{"class":1516},[1117,8382,1202],{"class":1180},[1117,8384,8385,8387,8390,8392,8394,8397,8399,8402,8404,8406],{"class":1119,"line":3189},[1117,8386,1325],{"class":1130},[1117,8388,8389],{"class":1516}," FulfillmentError",[1117,8391,1188],{"class":1180},[1117,8393,2088],{"class":1208},[1117,8395,8396],{"class":1263},"\"Order fulfillment failed: ",[1117,8398,2095],{"class":2094},[1117,8400,8401],{"class":1516},"e",[1117,8403,2104],{"class":2094},[1117,8405,1333],{"class":1263},[1117,8407,1202],{"class":1180},[1030,8409,8411],{"id":8410},"repositories-data-access-abstraction","Repositories - Data Access Abstraction",[1026,8413,8414],{},"Repositories provide a collection-like interface for accessing domain objects, abstracting away data persistence details.",[1107,8416,8418],{"className":1109,"code":8417,"language":1111,"meta":1112,"style":1112},"# Repository Interfaces\nfrom abc import ABC, abstractmethod\nfrom typing import List, Optional\n\nclass CustomerRepository(ABC):\n    \"\"\"Abstract repository for customer aggregate\"\"\"\n    \n    @abstractmethod\n    def get_by_id(self, customer_id: int) -> Optional[Customer]:\n        pass\n    \n    @abstractmethod\n    def get_by_email(self, email: Email) -> Optional[Customer]:\n        pass\n    \n    @abstractmethod\n    def save(self, customer: Customer) -> Customer:\n        pass\n    \n    @abstractmethod\n    def find_vip_customers(self) -> List[Customer]:\n        pass\n\nclass OrderRepository(ABC):\n    \"\"\"Abstract repository for order aggregate\"\"\"\n    \n    @abstractmethod\n    def get_by_id(self, order_id: int) -> Optional[Order]:\n        pass\n    \n    @abstractmethod\n    def save(self, order: Order) -> Order:\n        pass\n    \n    @abstractmethod\n    def find_by_customer(self, customer_id: int) -> List[Order]:\n        pass\n    \n    @abstractmethod\n    def find_pending_orders(self) -> List[Order]:\n        pass\n\nclass ProductRepository(ABC):\n    \"\"\"Abstract repository for product aggregate\"\"\"\n    \n    @abstractmethod\n    def get_by_id(self, product_id: int) -> Optional[Product]:\n        pass\n    \n    @abstractmethod\n    def save(self, product: Product) -> Product:\n        pass\n    \n    @abstractmethod\n    def find_by_category(self, category_id: int) -> List[Product]:\n        pass\n    \n    @abstractmethod\n    def find_by_inventory_below(self, threshold: int) -> List[Product]:\n        pass\n\n# Django Repository Implementations\nclass DjangoCustomerRepository(CustomerRepository):\n    \"\"\"Django ORM implementation of customer repository\"\"\"\n    \n    def get_by_id(self, customer_id: int) -> Optional[Customer]:\n        \"\"\"Get customer by ID\"\"\"\n        try:\n            django_customer = CustomerModel.objects.get(id=customer_id)\n            return self._to_domain_object(django_customer)\n        except CustomerModel.DoesNotExist:\n            return None\n    \n    def get_by_email(self, email: Email) -> Optional[Customer]:\n        \"\"\"Get customer by email\"\"\"\n        try:\n            django_customer = CustomerModel.objects.get(email=email.value)\n            return self._to_domain_object(django_customer)\n        except CustomerModel.DoesNotExist:\n            return None\n    \n    def save(self, customer: Customer) -> Customer:\n        \"\"\"Save customer to database\"\"\"\n        try:\n            django_customer = CustomerModel.objects.get(id=customer.id)\n            # Update existing customer\n            django_customer.email = customer.email.value\n            django_customer.name = customer.name\n            django_customer.is_active = customer.is_active\n            django_customer.credit_limit = customer.credit_limit.amount\n            django_customer.current_balance = customer.current_balance.amount\n        except CustomerModel.DoesNotExist:\n            # Create new customer\n            django_customer = CustomerModel(\n                id=customer.id,\n                email=customer.email.value,\n                name=customer.name,\n                is_active=customer.is_active,\n                credit_limit=customer.credit_limit.amount,\n                current_balance=customer.current_balance.amount,\n                created_at=customer.created_at\n            )\n        \n        django_customer.save()\n        \n        # Save addresses\n        self._save_addresses(customer, django_customer)\n        \n        return customer\n    \n    def find_vip_customers(self) -> List[Customer]:\n        \"\"\"Find VIP customers\"\"\"\n        django_customers = CustomerModel.objects.filter(\n            lifetime_spent__gt=10000,\n            is_active=True\n        )\n        \n        return [self._to_domain_object(dc) for dc in django_customers]\n    \n    def _to_domain_object(self, django_customer) -> Customer:\n        \"\"\"Convert Django model to domain object\"\"\"\n        customer = Customer(\n            customer_id=django_customer.id,\n            email=Email(django_customer.email),\n            name=django_customer.name\n        )\n        \n        customer.is_active = django_customer.is_active\n        customer.created_at = django_customer.created_at\n        customer.credit_limit = Money(django_customer.credit_limit)\n        customer.current_balance = Money(django_customer.current_balance)\n        \n        # Load addresses\n        for addr_model in django_customer.addresses.all():\n            address = Address(\n                street=addr_model.street,\n                city=addr_model.city,\n                state=addr_model.state,\n                postal_code=addr_model.postal_code,\n                country=addr_model.country\n            )\n            customer.add_address(address, addr_model.is_primary)\n        \n        return customer\n    \n    def _save_addresses(self, customer: Customer, django_customer):\n        \"\"\"Save customer addresses\"\"\"\n        # Clear existing addresses\n        django_customer.addresses.all().delete()\n        \n        # Save current addresses\n        for addr_info in customer.addresses:\n            CustomerAddressModel.objects.create(\n                customer=django_customer,\n                street=addr_info['address'].street,\n                city=addr_info['address'].city,\n                state=addr_info['address'].state,\n                postal_code=addr_info['address'].postal_code,\n                country=addr_info['address'].country,\n                is_primary=addr_info['is_primary'],\n                added_at=addr_info['added_at']\n            )\n\nclass DjangoOrderRepository(OrderRepository):\n    \"\"\"Django ORM implementation of order repository\"\"\"\n    \n    def get_by_id(self, order_id: int) -> Optional[Order]:\n        \"\"\"Get order by ID\"\"\"\n        try:\n            django_order = OrderModel.objects.prefetch_related('items').get(id=order_id)\n            return self._to_domain_object(django_order)\n        except OrderModel.DoesNotExist:\n            return None\n    \n    def save(self, order: Order) -> Order:\n        \"\"\"Save order to database\"\"\"\n        with transaction.atomic():\n            try:\n                django_order = OrderModel.objects.get(id=order.id)\n                # Update existing order\n                django_order.status = order.status.value\n                django_order.total = order.total.amount\n                django_order.confirmed_at = order.confirmed_at\n            except OrderModel.DoesNotExist:\n                # Create new order\n                django_order = OrderModel(\n                    id=order.id,\n                    customer_id=order.customer_id,\n                    status=order.status.value,\n                    total=order.total.amount,\n                    created_at=order.created_at,\n                    confirmed_at=order.confirmed_at\n                )\n            \n            django_order.save()\n            \n            # Save shipping address\n            if order.shipping_address:\n                self._save_shipping_address(order, django_order)\n            \n            # Save order items\n            self._save_order_items(order, django_order)\n        \n        return order\n    \n    def find_by_customer(self, customer_id: int) -> List[Order]:\n        \"\"\"Find orders by customer\"\"\"\n        django_orders = OrderModel.objects.filter(\n            customer_id=customer_id\n        ).prefetch_related('items').order_by('-created_at')\n        \n        return [self._to_domain_object(do) for do in django_orders]\n    \n    def find_pending_orders(self) -> List[Order]:\n        \"\"\"Find orders pending fulfillment\"\"\"\n        django_orders = OrderModel.objects.filter(\n            status=OrderStatus.CONFIRMED.value\n        ).prefetch_related('items')\n        \n        return [self._to_domain_object(do) for do in django_orders]\n    \n    def _to_domain_object(self, django_order) -> Order:\n        \"\"\"Convert Django model to domain object\"\"\"\n        order = Order(django_order.id, django_order.customer_id)\n        order.status = OrderStatus(django_order.status)\n        order.total = Money(django_order.total)\n        order.created_at = django_order.created_at\n        order.confirmed_at = django_order.confirmed_at\n        \n        # Load shipping address\n        if hasattr(django_order, 'shipping_address') and django_order.shipping_address:\n            addr = django_order.shipping_address\n            order.shipping_address = Address(\n                street=addr.street,\n                city=addr.city,\n                state=addr.state,\n                postal_code=addr.postal_code,\n                country=addr.country\n            )\n        \n        # Load order items\n        for item_model in django_order.items.all():\n            item = OrderItem(\n                product_id=item_model.product_id,\n                product_name=item_model.product_name,\n                unit_price=Money(item_model.unit_price),\n                quantity=item_model.quantity\n            )\n            order.items.append(item)\n        \n        return order\n    \n    def _save_shipping_address(self, order: Order, django_order):\n        \"\"\"Save shipping address\"\"\"\n        addr = order.shipping_address\n        OrderShippingAddressModel.objects.update_or_create(\n            order=django_order,\n            defaults={\n                'street': addr.street,\n                'city': addr.city,\n                'state': addr.state,\n                'postal_code': addr.postal_code,\n                'country': addr.country\n            }\n        )\n    \n    def _save_order_items(self, order: Order, django_order):\n        \"\"\"Save order items\"\"\"\n        # Clear existing items\n        django_order.items.all().delete()\n        \n        # Save current items\n        for item in order.items:\n            OrderItemModel.objects.create(\n                order=django_order,\n                product_id=item.product_id,\n                product_name=item.product_name,\n                unit_price=item.unit_price.amount,\n                quantity=item.quantity\n            )\n\n# Django Models for Persistence\nclass CustomerModel(models.Model):\n    \"\"\"Django model for customer persistence\"\"\"\n    \n    email = models.EmailField(unique=True)\n    name = models.CharField(max_length=200)\n    is_active = models.BooleanField(default=True)\n    credit_limit = models.DecimalField(max_digits=10, decimal_places=2, default=1000)\n    current_balance = models.DecimalField(max_digits=10, decimal_places=2, default=0)\n    lifetime_spent = models.DecimalField(max_digits=12, decimal_places=2, default=0)\n    order_count = models.IntegerField(default=0)\n    created_at = models.DateTimeField(auto_now_add=True)\n\nclass CustomerAddressModel(models.Model):\n    \"\"\"Django model for customer addresses\"\"\"\n    \n    customer = models.ForeignKey(CustomerModel, related_name='addresses', on_delete=models.CASCADE)\n    street = models.CharField(max_length=200)\n    city = models.CharField(max_length=100)\n    state = models.CharField(max_length=50)\n    postal_code = models.CharField(max_length=20)\n    country = models.CharField(max_length=50, default='US')\n    is_primary = models.BooleanField(default=False)\n    added_at = models.DateTimeField(auto_now_add=True)\n\nclass OrderModel(models.Model):\n    \"\"\"Django model for order persistence\"\"\"\n    \n    customer_id = models.IntegerField()\n    status = models.CharField(max_length=20, default='draft')\n    total = models.DecimalField(max_digits=10, decimal_places=2, default=0)\n    created_at = models.DateTimeField(auto_now_add=True)\n    confirmed_at = models.DateTimeField(null=True, blank=True)\n    tracking_number = models.CharField(max_length=100, blank=True)\n\nclass OrderItemModel(models.Model):\n    \"\"\"Django model for order items\"\"\"\n    \n    order = models.ForeignKey(OrderModel, related_name='items', on_delete=models.CASCADE)\n    product_id = models.IntegerField()\n    product_name = models.CharField(max_length=200)\n    unit_price = models.DecimalField(max_digits=10, decimal_places=2)\n    quantity = models.IntegerField()\n\nclass OrderShippingAddressModel(models.Model):\n    \"\"\"Django model for order shipping address\"\"\"\n    \n    order = models.OneToOneField(OrderModel, related_name='shipping_address', on_delete=models.CASCADE)\n    street = models.CharField(max_length=200)\n    city = models.CharField(max_length=100)\n    state = models.CharField(max_length=50)\n    postal_code = models.CharField(max_length=20)\n    country = models.CharField(max_length=50, default='US')\n",[1114,8419,8420,8425,8442,8457,8461,8475,8484,8488,8495,8527,8532,8536,8542,8573,8577,8581,8587,8614,8618,8622,8628,8651,8655,8659,8672,8681,8685,8691,8722,8726,8730,8736,8762,8766,8770,8776,8807,8811,8815,8821,8844,8848,8852,8865,8874,8878,8884,8915,8919,8923,8929,8955,8959,8963,8969,9001,9005,9009,9015,9046,9050,9054,9059,9073,9082,9086,9116,9125,9131,9160,9178,9191,9197,9201,9231,9240,9246,9276,9292,9304,9310,9314,9340,9349,9355,9385,9390,9412,9429,9446,9466,9486,9498,9503,9513,9528,9547,9562,9577,9596,9615,9629,9633,9637,9648,9652,9657,9677,9681,9688,9692,9714,9723,9743,9755,9765,9770,9774,9805,9809,9832,9841,9852,9867,9888,9901,9905,9909,9926,9942,9964,9986,9990,9995,10017,10028,10044,10059,10074,10089,10103,10107,10132,10136,10142,10146,10171,10180,10185,10204,10208,10213,10229,10245,10256,10280,10302,10324,10346,10368,10388,10407,10411,10415,10429,10438,10442,10472,10481,10487,10529,10546,10558,10564,10568,10594,10603,10618,10625,10656,10661,10682,10702,10719,10732,10737,10747,10762,10777,10796,10815,10830,10843,10848,10852,10863,10867,10872,10884,10904,10908,10913,10932,10936,10943,10947,10977,10986,11005,11013,11044,11048,11080,11085,11108,11118,11137,11155,11172,11177,11206,11211,11234,11243,11271,11295,11318,11335,11352,11357,11363,11395,11410,11425,11441,11456,11471,11486,11499,11504,11509,11515,11537,11548,11565,11581,11601,11616,11621,11640,11645,11652,11657,11683,11693,11707,11724,11735,11744,11765,11784,11803,11822,11839,11845,11850,11855,11881,11891,11897,11917,11922,11928,11945,11961,11972,11987,12002,12021,12034,12039,12044,12050,12069,12079,12084,12111,12138,12164,12211,12252,12293,12318,12344,12349,12367,12377,12382,12431,12455,12480,12505,12530,12566,12591,12615,12620,12637,12647,12652,12668,12704,12744,12767,12801,12833,12838,12856,12866,12871,12916,12932,12956,12988,13004,13009,13027,13037,13042,13086,13109,13132,13155,13178],{"__ignoreMap":1112},[1117,8421,8422],{"class":1119,"line":1120},[1117,8423,8424],{"class":1123},"# Repository Interfaces\n",[1117,8426,8427,8429,8432,8434,8437,8439],{"class":1119,"line":1127},[1117,8428,1131],{"class":1130},[1117,8430,8431],{"class":1134}," abc ",[1117,8433,1138],{"class":1130},[1117,8435,8436],{"class":1301}," ABC",[1117,8438,1425],{"class":1180},[1117,8440,8441],{"class":1134}," abstractmethod\n",[1117,8443,8444,8446,8448,8450,8453,8455],{"class":1119,"line":1144},[1117,8445,1131],{"class":1130},[1117,8447,1162],{"class":1134},[1117,8449,1138],{"class":1130},[1117,8451,8452],{"class":1134}," List",[1117,8454,1425],{"class":1180},[1117,8456,1167],{"class":1134},[1117,8458,8459],{"class":1119,"line":1157},[1117,8460,1174],{"emptyLinePlaceholder":1173},[1117,8462,8463,8465,8468,8470,8473],{"class":1119,"line":1170},[1117,8464,1209],{"class":1208},[1117,8466,8467],{"class":1212}," CustomerRepository",[1117,8469,1188],{"class":1180},[1117,8471,8472],{"class":1301},"ABC",[1117,8474,1292],{"class":1180},[1117,8476,8477,8479,8482],{"class":1119,"line":1177},[1117,8478,1223],{"class":1222},[1117,8480,8481],{"class":1226},"Abstract repository for customer aggregate",[1117,8483,1230],{"class":1222},[1117,8485,8486],{"class":1119,"line":1205},[1117,8487,1273],{"class":1134},[1117,8489,8490,8492],{"class":1119,"line":1219},[1117,8491,6459],{"class":1180},[1117,8493,8494],{"class":1184},"abstractmethod\n",[1117,8496,8497,8499,8502,8504,8506,8508,8510,8512,8514,8516,8518,8520,8522,8525],{"class":1119,"line":1233},[1117,8498,1279],{"class":1208},[1117,8500,8501],{"class":1184}," get_by_id",[1117,8503,1188],{"class":1180},[1117,8505,1289],{"class":1288},[1117,8507,1425],{"class":1180},[1117,8509,2377],{"class":1428},[1117,8511,1239],{"class":1180},[1117,8513,2382],{"class":1252},[1117,8515,1379],{"class":1180},[1117,8517,1444],{"class":1180},[1117,8519,2774],{"class":1134},[1117,8521,2182],{"class":1180},[1117,8523,8524],{"class":1134},"Customer",[1117,8526,2781],{"class":1180},[1117,8528,8529],{"class":1119,"line":1244},[1117,8530,8531],{"class":1130},"        pass\n",[1117,8533,8534],{"class":1119,"line":1270},[1117,8535,1273],{"class":1134},[1117,8537,8538,8540],{"class":1119,"line":1276},[1117,8539,6459],{"class":1180},[1117,8541,8494],{"class":1184},[1117,8543,8544,8546,8549,8551,8553,8555,8557,8559,8561,8563,8565,8567,8569,8571],{"class":1119,"line":1295},[1117,8545,1279],{"class":1208},[1117,8547,8548],{"class":1184}," get_by_email",[1117,8550,1188],{"class":1180},[1117,8552,1289],{"class":1288},[1117,8554,1425],{"class":1180},[1117,8556,2130],{"class":1428},[1117,8558,1239],{"class":1180},[1117,8560,2011],{"class":1134},[1117,8562,1379],{"class":1180},[1117,8564,1444],{"class":1180},[1117,8566,2774],{"class":1134},[1117,8568,2182],{"class":1180},[1117,8570,8524],{"class":1134},[1117,8572,2781],{"class":1180},[1117,8574,8575],{"class":1119,"line":1322},[1117,8576,8531],{"class":1130},[1117,8578,8579],{"class":1119,"line":1343},[1117,8580,1273],{"class":1134},[1117,8582,8583,8585],{"class":1119,"line":1349},[1117,8584,6459],{"class":1180},[1117,8586,8494],{"class":1184},[1117,8588,8589,8591,8594,8596,8598,8600,8602,8604,8606,8608,8610,8612],{"class":1119,"line":1390},[1117,8590,1279],{"class":1208},[1117,8592,8593],{"class":1184}," save",[1117,8595,1188],{"class":1180},[1117,8597,1289],{"class":1288},[1117,8599,1425],{"class":1180},[1117,8601,6739],{"class":1428},[1117,8603,1239],{"class":1180},[1117,8605,2343],{"class":1134},[1117,8607,1379],{"class":1180},[1117,8609,1444],{"class":1180},[1117,8611,2343],{"class":1134},[1117,8613,1216],{"class":1180},[1117,8615,8616],{"class":1119,"line":1408},[1117,8617,8531],{"class":1130},[1117,8619,8620],{"class":1119,"line":1413},[1117,8621,1273],{"class":1134},[1117,8623,8624,8626],{"class":1119,"line":1455},[1117,8625,6459],{"class":1180},[1117,8627,8494],{"class":1184},[1117,8629,8630,8632,8635,8637,8639,8641,8643,8645,8647,8649],{"class":1119,"line":1466},[1117,8631,1279],{"class":1208},[1117,8633,8634],{"class":1184}," find_vip_customers",[1117,8636,1188],{"class":1180},[1117,8638,1289],{"class":1288},[1117,8640,1379],{"class":1180},[1117,8642,1444],{"class":1180},[1117,8644,8452],{"class":1134},[1117,8646,2182],{"class":1180},[1117,8648,8524],{"class":1134},[1117,8650,2781],{"class":1180},[1117,8652,8653],{"class":1119,"line":1487},[1117,8654,8531],{"class":1130},[1117,8656,8657],{"class":1119,"line":1505},[1117,8658,1174],{"emptyLinePlaceholder":1173},[1117,8660,8661,8663,8666,8668,8670],{"class":1119,"line":1510},[1117,8662,1209],{"class":1208},[1117,8664,8665],{"class":1212}," OrderRepository",[1117,8667,1188],{"class":1180},[1117,8669,8472],{"class":1301},[1117,8671,1292],{"class":1180},[1117,8673,8674,8676,8679],{"class":1119,"line":1546},[1117,8675,1223],{"class":1222},[1117,8677,8678],{"class":1226},"Abstract repository for order aggregate",[1117,8680,1230],{"class":1222},[1117,8682,8683],{"class":1119,"line":1551},[1117,8684,1273],{"class":1134},[1117,8686,8687,8689],{"class":1119,"line":1585},[1117,8688,6459],{"class":1180},[1117,8690,8494],{"class":1184},[1117,8692,8693,8695,8697,8699,8701,8703,8705,8707,8709,8711,8713,8715,8717,8720],{"class":1119,"line":1595},[1117,8694,1279],{"class":1208},[1117,8696,8501],{"class":1184},[1117,8698,1188],{"class":1180},[1117,8700,1289],{"class":1288},[1117,8702,1425],{"class":1180},[1117,8704,4016],{"class":1428},[1117,8706,1239],{"class":1180},[1117,8708,2382],{"class":1252},[1117,8710,1379],{"class":1180},[1117,8712,1444],{"class":1180},[1117,8714,2774],{"class":1134},[1117,8716,2182],{"class":1180},[1117,8718,8719],{"class":1134},"Order",[1117,8721,2781],{"class":1180},[1117,8723,8724],{"class":1119,"line":1625},[1117,8725,8531],{"class":1130},[1117,8727,8728],{"class":1119,"line":1630},[1117,8729,1273],{"class":1134},[1117,8731,8732,8734],{"class":1119,"line":1651},[1117,8733,6459],{"class":1180},[1117,8735,8494],{"class":1184},[1117,8737,8738,8740,8742,8744,8746,8748,8750,8752,8754,8756,8758,8760],{"class":1119,"line":1661},[1117,8739,1279],{"class":1208},[1117,8741,8593],{"class":1184},[1117,8743,1188],{"class":1180},[1117,8745,1289],{"class":1288},[1117,8747,1425],{"class":1180},[1117,8749,6108],{"class":1428},[1117,8751,1239],{"class":1180},[1117,8753,3986],{"class":1134},[1117,8755,1379],{"class":1180},[1117,8757,1444],{"class":1180},[1117,8759,3986],{"class":1134},[1117,8761,1216],{"class":1180},[1117,8763,8764],{"class":1119,"line":1678},[1117,8765,8531],{"class":1130},[1117,8767,8768],{"class":1119,"line":1683},[1117,8769,1273],{"class":1134},[1117,8771,8772,8774],{"class":1119,"line":1700},[1117,8773,6459],{"class":1180},[1117,8775,8494],{"class":1184},[1117,8777,8778,8780,8783,8785,8787,8789,8791,8793,8795,8797,8799,8801,8803,8805],{"class":1119,"line":1710},[1117,8779,1279],{"class":1208},[1117,8781,8782],{"class":1184}," find_by_customer",[1117,8784,1188],{"class":1180},[1117,8786,1289],{"class":1288},[1117,8788,1425],{"class":1180},[1117,8790,2377],{"class":1428},[1117,8792,1239],{"class":1180},[1117,8794,2382],{"class":1252},[1117,8796,1379],{"class":1180},[1117,8798,1444],{"class":1180},[1117,8800,8452],{"class":1134},[1117,8802,2182],{"class":1180},[1117,8804,8719],{"class":1134},[1117,8806,2781],{"class":1180},[1117,8808,8809],{"class":1119,"line":1720},[1117,8810,8531],{"class":1130},[1117,8812,8813],{"class":1119,"line":1731},[1117,8814,1273],{"class":1134},[1117,8816,8817,8819],{"class":1119,"line":1741},[1117,8818,6459],{"class":1180},[1117,8820,8494],{"class":1184},[1117,8822,8823,8825,8828,8830,8832,8834,8836,8838,8840,8842],{"class":1119,"line":1751},[1117,8824,1279],{"class":1208},[1117,8826,8827],{"class":1184}," find_pending_orders",[1117,8829,1188],{"class":1180},[1117,8831,1289],{"class":1288},[1117,8833,1379],{"class":1180},[1117,8835,1444],{"class":1180},[1117,8837,8452],{"class":1134},[1117,8839,2182],{"class":1180},[1117,8841,8719],{"class":1134},[1117,8843,2781],{"class":1180},[1117,8845,8846],{"class":1119,"line":1761},[1117,8847,8531],{"class":1130},[1117,8849,8850],{"class":1119,"line":1780},[1117,8851,1174],{"emptyLinePlaceholder":1173},[1117,8853,8854,8856,8859,8861,8863],{"class":1119,"line":1785},[1117,8855,1209],{"class":1208},[1117,8857,8858],{"class":1212}," ProductRepository",[1117,8860,1188],{"class":1180},[1117,8862,8472],{"class":1301},[1117,8864,1292],{"class":1180},[1117,8866,8867,8869,8872],{"class":1119,"line":1798},[1117,8868,1223],{"class":1222},[1117,8870,8871],{"class":1226},"Abstract repository for product aggregate",[1117,8873,1230],{"class":1222},[1117,8875,8876],{"class":1119,"line":1848},[1117,8877,1273],{"class":1134},[1117,8879,8880,8882],{"class":1119,"line":1866},[1117,8881,6459],{"class":1180},[1117,8883,8494],{"class":1184},[1117,8885,8886,8888,8890,8892,8894,8896,8898,8900,8902,8904,8906,8908,8910,8913],{"class":1119,"line":1871},[1117,8887,1279],{"class":1208},[1117,8889,8501],{"class":1184},[1117,8891,1188],{"class":1180},[1117,8893,1289],{"class":1288},[1117,8895,1425],{"class":1180},[1117,8897,3388],{"class":1428},[1117,8899,1239],{"class":1180},[1117,8901,2382],{"class":1252},[1117,8903,1379],{"class":1180},[1117,8905,1444],{"class":1180},[1117,8907,2774],{"class":1134},[1117,8909,2182],{"class":1180},[1117,8911,8912],{"class":1134},"Product",[1117,8914,2781],{"class":1180},[1117,8916,8917],{"class":1119,"line":1904},[1117,8918,8531],{"class":1130},[1117,8920,8921],{"class":1119,"line":1914},[1117,8922,1273],{"class":1134},[1117,8924,8925,8927],{"class":1119,"line":1942},[1117,8926,6459],{"class":1180},[1117,8928,8494],{"class":1184},[1117,8930,8931,8933,8935,8937,8939,8941,8943,8945,8947,8949,8951,8953],{"class":1119,"line":1964},[1117,8932,1279],{"class":1208},[1117,8934,8593],{"class":1184},[1117,8936,1188],{"class":1180},[1117,8938,1289],{"class":1288},[1117,8940,1425],{"class":1180},[1117,8942,4180],{"class":1428},[1117,8944,1239],{"class":1180},[1117,8946,3355],{"class":1134},[1117,8948,1379],{"class":1180},[1117,8950,1444],{"class":1180},[1117,8952,3355],{"class":1134},[1117,8954,1216],{"class":1180},[1117,8956,8957],{"class":1119,"line":1984},[1117,8958,8531],{"class":1130},[1117,8960,8961],{"class":1119,"line":1989},[1117,8962,1273],{"class":1134},[1117,8964,8965,8967],{"class":1119,"line":2006},[1117,8966,6459],{"class":1180},[1117,8968,8494],{"class":1184},[1117,8970,8971,8973,8976,8978,8980,8982,8985,8987,8989,8991,8993,8995,8997,8999],{"class":1119,"line":2016},[1117,8972,1279],{"class":1208},[1117,8974,8975],{"class":1184}," find_by_category",[1117,8977,1188],{"class":1180},[1117,8979,1289],{"class":1288},[1117,8981,1425],{"class":1180},[1117,8983,8984],{"class":1428}," category_id",[1117,8986,1239],{"class":1180},[1117,8988,2382],{"class":1252},[1117,8990,1379],{"class":1180},[1117,8992,1444],{"class":1180},[1117,8994,8452],{"class":1134},[1117,8996,2182],{"class":1180},[1117,8998,8912],{"class":1134},[1117,9000,2781],{"class":1180},[1117,9002,9003],{"class":1119,"line":2026},[1117,9004,8531],{"class":1130},[1117,9006,9007],{"class":1119,"line":2036},[1117,9008,1273],{"class":1134},[1117,9010,9011,9013],{"class":1119,"line":2041},[1117,9012,6459],{"class":1180},[1117,9014,8494],{"class":1184},[1117,9016,9017,9019,9022,9024,9026,9028,9030,9032,9034,9036,9038,9040,9042,9044],{"class":1119,"line":2054},[1117,9018,1279],{"class":1208},[1117,9020,9021],{"class":1184}," find_by_inventory_below",[1117,9023,1188],{"class":1180},[1117,9025,1289],{"class":1288},[1117,9027,1425],{"class":1180},[1117,9029,7888],{"class":1428},[1117,9031,1239],{"class":1180},[1117,9033,2382],{"class":1252},[1117,9035,1379],{"class":1180},[1117,9037,1444],{"class":1180},[1117,9039,8452],{"class":1134},[1117,9041,2182],{"class":1180},[1117,9043,8912],{"class":1134},[1117,9045,2781],{"class":1180},[1117,9047,9048],{"class":1119,"line":2079},[1117,9049,8531],{"class":1130},[1117,9051,9052],{"class":1119,"line":2111},[1117,9053,1174],{"emptyLinePlaceholder":1173},[1117,9055,9056],{"class":1119,"line":2116},[1117,9057,9058],{"class":1123},"# Django Repository Implementations\n",[1117,9060,9061,9063,9066,9068,9071],{"class":1119,"line":2145},[1117,9062,1209],{"class":1208},[1117,9064,9065],{"class":1212}," DjangoCustomerRepository",[1117,9067,1188],{"class":1180},[1117,9069,9070],{"class":5906},"CustomerRepository",[1117,9072,1292],{"class":1180},[1117,9074,9075,9077,9080],{"class":1119,"line":2155},[1117,9076,1223],{"class":1222},[1117,9078,9079],{"class":1226},"Django ORM implementation of customer repository",[1117,9081,1230],{"class":1222},[1117,9083,9084],{"class":1119,"line":2164},[1117,9085,1273],{"class":1134},[1117,9087,9088,9090,9092,9094,9096,9098,9100,9102,9104,9106,9108,9110,9112,9114],{"class":1119,"line":2227},[1117,9089,1279],{"class":1208},[1117,9091,8501],{"class":1184},[1117,9093,1188],{"class":1180},[1117,9095,1289],{"class":1288},[1117,9097,1425],{"class":1180},[1117,9099,2377],{"class":1428},[1117,9101,1239],{"class":1180},[1117,9103,2382],{"class":1252},[1117,9105,1379],{"class":1180},[1117,9107,1444],{"class":1180},[1117,9109,2774],{"class":1134},[1117,9111,2182],{"class":1180},[1117,9113,8524],{"class":1134},[1117,9115,2781],{"class":1180},[1117,9117,9118,9120,9123],{"class":1119,"line":2259},[1117,9119,1458],{"class":1222},[1117,9121,9122],{"class":1226},"Get customer by ID",[1117,9124,1230],{"class":1222},[1117,9126,9127,9129],{"class":1119,"line":2264},[1117,9128,8196],{"class":1130},[1117,9130,1216],{"class":1180},[1117,9132,9133,9136,9138,9141,9143,9146,9148,9150,9152,9154,9156,9158],{"class":1119,"line":2284},[1117,9134,9135],{"class":1134},"            django_customer ",[1117,9137,1195],{"class":1180},[1117,9139,9140],{"class":1134}," CustomerModel",[1117,9142,1305],{"class":1180},[1117,9144,9145],{"class":1308},"objects",[1117,9147,1305],{"class":1180},[1117,9149,7294],{"class":1516},[1117,9151,1188],{"class":1180},[1117,9153,2412],{"class":1191},[1117,9155,1195],{"class":1180},[1117,9157,4052],{"class":1516},[1117,9159,1202],{"class":1180},[1117,9161,9162,9164,9166,9168,9171,9173,9176],{"class":1119,"line":2294},[1117,9163,2916],{"class":1130},[1117,9165,1302],{"class":1301},[1117,9167,1305],{"class":1180},[1117,9169,9170],{"class":1516},"_to_domain_object",[1117,9172,1188],{"class":1180},[1117,9174,9175],{"class":1516},"django_customer",[1117,9177,1202],{"class":1180},[1117,9179,9180,9182,9184,9186,9189],{"class":1119,"line":2327},[1117,9181,8347],{"class":1130},[1117,9183,9140],{"class":1134},[1117,9185,1305],{"class":1180},[1117,9187,9188],{"class":1308},"DoesNotExist",[1117,9190,1216],{"class":1180},[1117,9192,9193,9195],{"class":1119,"line":2332},[1117,9194,2916],{"class":1130},[1117,9196,2256],{"class":1198},[1117,9198,9199],{"class":1119,"line":2338},[1117,9200,1273],{"class":1134},[1117,9202,9203,9205,9207,9209,9211,9213,9215,9217,9219,9221,9223,9225,9227,9229],{"class":1119,"line":2348},[1117,9204,1279],{"class":1208},[1117,9206,8548],{"class":1184},[1117,9208,1188],{"class":1180},[1117,9210,1289],{"class":1288},[1117,9212,1425],{"class":1180},[1117,9214,2130],{"class":1428},[1117,9216,1239],{"class":1180},[1117,9218,2011],{"class":1134},[1117,9220,1379],{"class":1180},[1117,9222,1444],{"class":1180},[1117,9224,2774],{"class":1134},[1117,9226,2182],{"class":1180},[1117,9228,8524],{"class":1134},[1117,9230,2781],{"class":1180},[1117,9232,9233,9235,9238],{"class":1119,"line":2358},[1117,9234,1458],{"class":1222},[1117,9236,9237],{"class":1226},"Get customer by email",[1117,9239,1230],{"class":1222},[1117,9241,9242,9244],{"class":1119,"line":2363},[1117,9243,8196],{"class":1130},[1117,9245,1216],{"class":1180},[1117,9247,9248,9250,9252,9254,9256,9258,9260,9262,9264,9266,9268,9270,9272,9274],{"class":1119,"line":2404},[1117,9249,9135],{"class":1134},[1117,9251,1195],{"class":1180},[1117,9253,9140],{"class":1134},[1117,9255,1305],{"class":1180},[1117,9257,9145],{"class":1308},[1117,9259,1305],{"class":1180},[1117,9261,7294],{"class":1516},[1117,9263,1188],{"class":1180},[1117,9265,2427],{"class":1191},[1117,9267,1195],{"class":1180},[1117,9269,2427],{"class":1516},[1117,9271,1305],{"class":1180},[1117,9273,2074],{"class":1308},[1117,9275,1202],{"class":1180},[1117,9277,9278,9280,9282,9284,9286,9288,9290],{"class":1119,"line":2420},[1117,9279,2916],{"class":1130},[1117,9281,1302],{"class":1301},[1117,9283,1305],{"class":1180},[1117,9285,9170],{"class":1516},[1117,9287,1188],{"class":1180},[1117,9289,9175],{"class":1516},[1117,9291,1202],{"class":1180},[1117,9293,9294,9296,9298,9300,9302],{"class":1119,"line":2435},[1117,9295,8347],{"class":1130},[1117,9297,9140],{"class":1134},[1117,9299,1305],{"class":1180},[1117,9301,9188],{"class":1308},[1117,9303,1216],{"class":1180},[1117,9305,9306,9308],{"class":1119,"line":2450},[1117,9307,2916],{"class":1130},[1117,9309,2256],{"class":1198},[1117,9311,9312],{"class":1119,"line":2465},[1117,9313,1273],{"class":1134},[1117,9315,9316,9318,9320,9322,9324,9326,9328,9330,9332,9334,9336,9338],{"class":1119,"line":2480},[1117,9317,1279],{"class":1208},[1117,9319,8593],{"class":1184},[1117,9321,1188],{"class":1180},[1117,9323,1289],{"class":1288},[1117,9325,1425],{"class":1180},[1117,9327,6739],{"class":1428},[1117,9329,1239],{"class":1180},[1117,9331,2343],{"class":1134},[1117,9333,1379],{"class":1180},[1117,9335,1444],{"class":1180},[1117,9337,2343],{"class":1134},[1117,9339,1216],{"class":1180},[1117,9341,9342,9344,9347],{"class":1119,"line":2503},[1117,9343,1458],{"class":1222},[1117,9345,9346],{"class":1226},"Save customer to database",[1117,9348,1230],{"class":1222},[1117,9350,9351,9353],{"class":1119,"line":2534},[1117,9352,8196],{"class":1130},[1117,9354,1216],{"class":1180},[1117,9356,9357,9359,9361,9363,9365,9367,9369,9371,9373,9375,9377,9379,9381,9383],{"class":1119,"line":2563},[1117,9358,9135],{"class":1134},[1117,9360,1195],{"class":1180},[1117,9362,9140],{"class":1134},[1117,9364,1305],{"class":1180},[1117,9366,9145],{"class":1308},[1117,9368,1305],{"class":1180},[1117,9370,7294],{"class":1516},[1117,9372,1188],{"class":1180},[1117,9374,2412],{"class":1191},[1117,9376,1195],{"class":1180},[1117,9378,6839],{"class":1516},[1117,9380,1305],{"class":1180},[1117,9382,2412],{"class":1308},[1117,9384,1202],{"class":1180},[1117,9386,9387],{"class":1119,"line":2568},[1117,9388,9389],{"class":1123},"            # Update existing customer\n",[1117,9391,9392,9395,9397,9399,9401,9403,9405,9407,9409],{"class":1119,"line":2605},[1117,9393,9394],{"class":1134},"            django_customer",[1117,9396,1305],{"class":1180},[1117,9398,2427],{"class":1308},[1117,9400,1256],{"class":1180},[1117,9402,6739],{"class":1134},[1117,9404,1305],{"class":1180},[1117,9406,2427],{"class":1308},[1117,9408,1305],{"class":1180},[1117,9410,9411],{"class":1308},"value\n",[1117,9413,9414,9416,9418,9420,9422,9424,9426],{"class":1119,"line":2615},[1117,9415,9394],{"class":1134},[1117,9417,1305],{"class":1180},[1117,9419,2442],{"class":1308},[1117,9421,1256],{"class":1180},[1117,9423,6739],{"class":1134},[1117,9425,1305],{"class":1180},[1117,9427,9428],{"class":1308},"name\n",[1117,9430,9431,9433,9435,9437,9439,9441,9443],{"class":1119,"line":2624},[1117,9432,9394],{"class":1134},[1117,9434,1305],{"class":1180},[1117,9436,2472],{"class":1308},[1117,9438,1256],{"class":1180},[1117,9440,6739],{"class":1134},[1117,9442,1305],{"class":1180},[1117,9444,9445],{"class":1308},"is_active\n",[1117,9447,9448,9450,9452,9454,9456,9458,9460,9462,9464],{"class":1119,"line":2630},[1117,9449,9394],{"class":1134},[1117,9451,1305],{"class":1180},[1117,9453,2510],{"class":1308},[1117,9455,1256],{"class":1180},[1117,9457,6739],{"class":1134},[1117,9459,1305],{"class":1180},[1117,9461,2510],{"class":1308},[1117,9463,1305],{"class":1180},[1117,9465,3235],{"class":1308},[1117,9467,9468,9470,9472,9474,9476,9478,9480,9482,9484],{"class":1119,"line":2650},[1117,9469,9394],{"class":1134},[1117,9471,1305],{"class":1180},[1117,9473,2541],{"class":1308},[1117,9475,1256],{"class":1180},[1117,9477,6739],{"class":1134},[1117,9479,1305],{"class":1180},[1117,9481,2541],{"class":1308},[1117,9483,1305],{"class":1180},[1117,9485,3235],{"class":1308},[1117,9487,9488,9490,9492,9494,9496],{"class":1119,"line":2672},[1117,9489,8347],{"class":1130},[1117,9491,9140],{"class":1134},[1117,9493,1305],{"class":1180},[1117,9495,9188],{"class":1308},[1117,9497,1216],{"class":1180},[1117,9499,9500],{"class":1119,"line":2677},[1117,9501,9502],{"class":1123},"            # Create new customer\n",[1117,9504,9505,9507,9509,9511],{"class":1119,"line":2694},[1117,9506,9135],{"class":1134},[1117,9508,1195],{"class":1180},[1117,9510,9140],{"class":1516},[1117,9512,8224],{"class":1180},[1117,9514,9515,9518,9520,9522,9524,9526],{"class":1119,"line":2712},[1117,9516,9517],{"class":1191},"                id",[1117,9519,1195],{"class":1180},[1117,9521,6839],{"class":1516},[1117,9523,1305],{"class":1180},[1117,9525,2412],{"class":1308},[1117,9527,2709],{"class":1180},[1117,9529,9530,9533,9535,9537,9539,9541,9543,9545],{"class":1119,"line":2727},[1117,9531,9532],{"class":1191},"                email",[1117,9534,1195],{"class":1180},[1117,9536,6839],{"class":1516},[1117,9538,1305],{"class":1180},[1117,9540,2427],{"class":1308},[1117,9542,1305],{"class":1180},[1117,9544,2074],{"class":1308},[1117,9546,2709],{"class":1180},[1117,9548,9549,9552,9554,9556,9558,9560],{"class":1119,"line":2747},[1117,9550,9551],{"class":1191},"                name",[1117,9553,1195],{"class":1180},[1117,9555,6839],{"class":1516},[1117,9557,1305],{"class":1180},[1117,9559,2442],{"class":1308},[1117,9561,2709],{"class":1180},[1117,9563,9564,9567,9569,9571,9573,9575],{"class":1119,"line":2753},[1117,9565,9566],{"class":1191},"                is_active",[1117,9568,1195],{"class":1180},[1117,9570,6839],{"class":1516},[1117,9572,1305],{"class":1180},[1117,9574,2472],{"class":1308},[1117,9576,2709],{"class":1180},[1117,9578,9579,9582,9584,9586,9588,9590,9592,9594],{"class":1119,"line":2758},[1117,9580,9581],{"class":1191},"                credit_limit",[1117,9583,1195],{"class":1180},[1117,9585,6839],{"class":1516},[1117,9587,1305],{"class":1180},[1117,9589,2510],{"class":1308},[1117,9591,1305],{"class":1180},[1117,9593,1309],{"class":1308},[1117,9595,2709],{"class":1180},[1117,9597,9598,9601,9603,9605,9607,9609,9611,9613],{"class":1119,"line":2784},[1117,9599,9600],{"class":1191},"                current_balance",[1117,9602,1195],{"class":1180},[1117,9604,6839],{"class":1516},[1117,9606,1305],{"class":1180},[1117,9608,2541],{"class":1308},[1117,9610,1305],{"class":1180},[1117,9612,1309],{"class":1308},[1117,9614,2709],{"class":1180},[1117,9616,9617,9620,9622,9624,9626],{"class":1119,"line":2794},[1117,9618,9619],{"class":1191},"                created_at",[1117,9621,1195],{"class":1180},[1117,9623,6839],{"class":1516},[1117,9625,1305],{"class":1180},[1117,9627,9628],{"class":1308},"created_at\n",[1117,9630,9631],{"class":1119,"line":2812},[1117,9632,8249],{"class":1180},[1117,9634,9635],{"class":1119,"line":2831},[1117,9636,1346],{"class":1134},[1117,9638,9639,9642,9644,9646],{"class":1119,"line":2849},[1117,9640,9641],{"class":1134},"        django_customer",[1117,9643,1305],{"class":1180},[1117,9645,7730],{"class":1516},[1117,9647,2500],{"class":1180},[1117,9649,9650],{"class":1119,"line":2856},[1117,9651,1346],{"class":1134},[1117,9653,9654],{"class":1119,"line":2861},[1117,9655,9656],{"class":1123},"        # Save addresses\n",[1117,9658,9659,9661,9663,9666,9668,9670,9672,9675],{"class":1119,"line":2884},[1117,9660,2407],{"class":1301},[1117,9662,1305],{"class":1180},[1117,9664,9665],{"class":1516},"_save_addresses",[1117,9667,1188],{"class":1180},[1117,9669,6839],{"class":1516},[1117,9671,1425],{"class":1180},[1117,9673,9674],{"class":1516}," django_customer",[1117,9676,1202],{"class":1180},[1117,9678,9679],{"class":1119,"line":2894},[1117,9680,1346],{"class":1134},[1117,9682,9683,9685],{"class":1119,"line":2913},[1117,9684,1513],{"class":1130},[1117,9686,9687],{"class":1134}," customer\n",[1117,9689,9690],{"class":1119,"line":2922},[1117,9691,1273],{"class":1134},[1117,9693,9694,9696,9698,9700,9702,9704,9706,9708,9710,9712],{"class":1119,"line":2927},[1117,9695,1279],{"class":1208},[1117,9697,8634],{"class":1184},[1117,9699,1188],{"class":1180},[1117,9701,1289],{"class":1288},[1117,9703,1379],{"class":1180},[1117,9705,1444],{"class":1180},[1117,9707,8452],{"class":1134},[1117,9709,2182],{"class":1180},[1117,9711,8524],{"class":1134},[1117,9713,2781],{"class":1180},[1117,9715,9716,9718,9721],{"class":1119,"line":2933},[1117,9717,1458],{"class":1222},[1117,9719,9720],{"class":1226},"Find VIP customers",[1117,9722,1230],{"class":1222},[1117,9724,9725,9728,9730,9732,9734,9736,9738,9741],{"class":1119,"line":2947},[1117,9726,9727],{"class":1134},"        django_customers ",[1117,9729,1195],{"class":1180},[1117,9731,9140],{"class":1134},[1117,9733,1305],{"class":1180},[1117,9735,9145],{"class":1308},[1117,9737,1305],{"class":1180},[1117,9739,9740],{"class":1516},"filter",[1117,9742,8224],{"class":1180},[1117,9744,9745,9748,9750,9753],{"class":1119,"line":2963},[1117,9746,9747],{"class":1191},"            lifetime_spent__gt",[1117,9749,1195],{"class":1180},[1117,9751,9752],{"class":1316},"10000",[1117,9754,2709],{"class":1180},[1117,9756,9757,9760,9762],{"class":1119,"line":2968},[1117,9758,9759],{"class":1191},"            is_active",[1117,9761,1195],{"class":1180},[1117,9763,9764],{"class":1198},"True\n",[1117,9766,9767],{"class":1119,"line":2991},[1117,9768,9769],{"class":1180},"        )\n",[1117,9771,9772],{"class":1119,"line":3001},[1117,9773,1346],{"class":1134},[1117,9775,9776,9778,9780,9782,9784,9786,9788,9791,9793,9795,9798,9800,9803],{"class":1119,"line":3019},[1117,9777,1513],{"class":1130},[1117,9779,4720],{"class":1180},[1117,9781,1289],{"class":1301},[1117,9783,1305],{"class":1180},[1117,9785,9170],{"class":1516},[1117,9787,1188],{"class":1180},[1117,9789,9790],{"class":1516},"dc",[1117,9792,1379],{"class":1180},[1117,9794,5492],{"class":1130},[1117,9796,9797],{"class":1134}," dc ",[1117,9799,2639],{"class":1130},[1117,9801,9802],{"class":1134}," django_customers",[1117,9804,2324],{"class":1180},[1117,9806,9807],{"class":1119,"line":3037},[1117,9808,1273],{"class":1134},[1117,9810,9811,9813,9816,9818,9820,9822,9824,9826,9828,9830],{"class":1119,"line":3042},[1117,9812,1279],{"class":1208},[1117,9814,9815],{"class":1184}," _to_domain_object",[1117,9817,1188],{"class":1180},[1117,9819,1289],{"class":1288},[1117,9821,1425],{"class":1180},[1117,9823,9674],{"class":1428},[1117,9825,1379],{"class":1180},[1117,9827,1444],{"class":1180},[1117,9829,2343],{"class":1134},[1117,9831,1216],{"class":1180},[1117,9833,9834,9836,9839],{"class":1119,"line":3048},[1117,9835,1458],{"class":1222},[1117,9837,9838],{"class":1226},"Convert Django model to domain object",[1117,9840,1230],{"class":1222},[1117,9842,9843,9846,9848,9850],{"class":1119,"line":3067},[1117,9844,9845],{"class":1134},"        customer ",[1117,9847,1195],{"class":1180},[1117,9849,2343],{"class":1516},[1117,9851,8224],{"class":1180},[1117,9853,9854,9857,9859,9861,9863,9865],{"class":1119,"line":3086},[1117,9855,9856],{"class":1191},"            customer_id",[1117,9858,1195],{"class":1180},[1117,9860,9175],{"class":1516},[1117,9862,1305],{"class":1180},[1117,9864,2412],{"class":1308},[1117,9866,2709],{"class":1180},[1117,9868,9869,9872,9874,9877,9879,9881,9883,9885],{"class":1119,"line":3091},[1117,9870,9871],{"class":1191},"            email",[1117,9873,1195],{"class":1180},[1117,9875,9876],{"class":1516},"Email",[1117,9878,1188],{"class":1180},[1117,9880,9175],{"class":1516},[1117,9882,1305],{"class":1180},[1117,9884,2427],{"class":1308},[1117,9886,9887],{"class":1180},"),\n",[1117,9889,9890,9893,9895,9897,9899],{"class":1119,"line":3119},[1117,9891,9892],{"class":1191},"            name",[1117,9894,1195],{"class":1180},[1117,9896,9175],{"class":1516},[1117,9898,1305],{"class":1180},[1117,9900,9428],{"class":1308},[1117,9902,9903],{"class":1119,"line":3124},[1117,9904,9769],{"class":1180},[1117,9906,9907],{"class":1119,"line":3152},[1117,9908,1346],{"class":1134},[1117,9910,9911,9914,9916,9918,9920,9922,9924],{"class":1119,"line":3162},[1117,9912,9913],{"class":1134},"        customer",[1117,9915,1305],{"class":1180},[1117,9917,2472],{"class":1308},[1117,9919,1256],{"class":1180},[1117,9921,9674],{"class":1134},[1117,9923,1305],{"class":1180},[1117,9925,9445],{"class":1308},[1117,9927,9928,9930,9932,9934,9936,9938,9940],{"class":1119,"line":3177},[1117,9929,9913],{"class":1134},[1117,9931,1305],{"class":1180},[1117,9933,2487],{"class":1308},[1117,9935,1256],{"class":1180},[1117,9937,9674],{"class":1134},[1117,9939,1305],{"class":1180},[1117,9941,9628],{"class":1308},[1117,9943,9944,9946,9948,9950,9952,9954,9956,9958,9960,9962],{"class":1119,"line":3184},[1117,9945,9913],{"class":1134},[1117,9947,1305],{"class":1180},[1117,9949,2510],{"class":1308},[1117,9951,1256],{"class":1180},[1117,9953,1213],{"class":1516},[1117,9955,1188],{"class":1180},[1117,9957,9175],{"class":1516},[1117,9959,1305],{"class":1180},[1117,9961,2510],{"class":1308},[1117,9963,1202],{"class":1180},[1117,9965,9966,9968,9970,9972,9974,9976,9978,9980,9982,9984],{"class":1119,"line":3189},[1117,9967,9913],{"class":1134},[1117,9969,1305],{"class":1180},[1117,9971,2541],{"class":1308},[1117,9973,1256],{"class":1180},[1117,9975,1213],{"class":1516},[1117,9977,1188],{"class":1180},[1117,9979,9175],{"class":1516},[1117,9981,1305],{"class":1180},[1117,9983,2541],{"class":1308},[1117,9985,1202],{"class":1180},[1117,9987,9988],{"class":1119,"line":3213},[1117,9989,1346],{"class":1134},[1117,9991,9992],{"class":1119,"line":3238},[1117,9993,9994],{"class":1123},"        # Load addresses\n",[1117,9996,9997,9999,10002,10004,10006,10008,10010,10012,10015],{"class":1119,"line":3243},[1117,9998,2797],{"class":1130},[1117,10000,10001],{"class":1134}," addr_model ",[1117,10003,2639],{"class":1130},[1117,10005,9674],{"class":1134},[1117,10007,1305],{"class":1180},[1117,10009,2457],{"class":1308},[1117,10011,1305],{"class":1180},[1117,10013,10014],{"class":1516},"all",[1117,10016,4272],{"class":1180},[1117,10018,10019,10022,10024,10026],{"class":1119,"line":3265},[1117,10020,10021],{"class":1134},"            address ",[1117,10023,1195],{"class":1180},[1117,10025,1705],{"class":1516},[1117,10027,8224],{"class":1180},[1117,10029,10030,10033,10035,10038,10040,10042],{"class":1119,"line":3275},[1117,10031,10032],{"class":1191},"                street",[1117,10034,1195],{"class":1180},[1117,10036,10037],{"class":1516},"addr_model",[1117,10039,1305],{"class":1180},[1117,10041,1815],{"class":1308},[1117,10043,2709],{"class":1180},[1117,10045,10046,10049,10051,10053,10055,10057],{"class":1119,"line":3295},[1117,10047,10048],{"class":1191},"                city",[1117,10050,1195],{"class":1180},[1117,10052,10037],{"class":1516},[1117,10054,1305],{"class":1180},[1117,10056,1824],{"class":1308},[1117,10058,2709],{"class":1180},[1117,10060,10061,10064,10066,10068,10070,10072],{"class":1119,"line":3313},[1117,10062,10063],{"class":1191},"                state",[1117,10065,1195],{"class":1180},[1117,10067,10037],{"class":1516},[1117,10069,1305],{"class":1180},[1117,10071,1833],{"class":1308},[1117,10073,2709],{"class":1180},[1117,10075,10076,10079,10081,10083,10085,10087],{"class":1119,"line":3318},[1117,10077,10078],{"class":1191},"                postal_code",[1117,10080,1195],{"class":1180},[1117,10082,10037],{"class":1516},[1117,10084,1305],{"class":1180},[1117,10086,1842],{"class":1308},[1117,10088,2709],{"class":1180},[1117,10090,10091,10094,10096,10098,10100],{"class":1119,"line":3345},[1117,10092,10093],{"class":1191},"                country",[1117,10095,1195],{"class":1180},[1117,10097,10037],{"class":1516},[1117,10099,1305],{"class":1180},[1117,10101,10102],{"class":1308},"country\n",[1117,10104,10105],{"class":1119,"line":3350},[1117,10106,8249],{"class":1180},[1117,10108,10109,10112,10114,10117,10119,10121,10123,10126,10128,10130],{"class":1119,"line":3360},[1117,10110,10111],{"class":1134},"            customer",[1117,10113,1305],{"class":1180},[1117,10115,10116],{"class":1516},"add_address",[1117,10118,1188],{"class":1180},[1117,10120,2700],{"class":1516},[1117,10122,1425],{"class":1180},[1117,10124,10125],{"class":1516}," addr_model",[1117,10127,1305],{"class":1180},[1117,10129,2660],{"class":1308},[1117,10131,1202],{"class":1180},[1117,10133,10134],{"class":1119,"line":3370},[1117,10135,1346],{"class":1134},[1117,10137,10138,10140],{"class":1119,"line":3375},[1117,10139,1513],{"class":1130},[1117,10141,9687],{"class":1134},[1117,10143,10144],{"class":1119,"line":3414},[1117,10145,1273],{"class":1134},[1117,10147,10148,10150,10153,10155,10157,10159,10161,10163,10165,10167,10169],{"class":1119,"line":3428},[1117,10149,1279],{"class":1208},[1117,10151,10152],{"class":1184}," _save_addresses",[1117,10154,1188],{"class":1180},[1117,10156,1289],{"class":1288},[1117,10158,1425],{"class":1180},[1117,10160,6739],{"class":1428},[1117,10162,1239],{"class":1180},[1117,10164,2343],{"class":1134},[1117,10166,1425],{"class":1180},[1117,10168,9674],{"class":1428},[1117,10170,1292],{"class":1180},[1117,10172,10173,10175,10178],{"class":1119,"line":3441},[1117,10174,1458],{"class":1222},[1117,10176,10177],{"class":1226},"Save customer addresses",[1117,10179,1230],{"class":1222},[1117,10181,10182],{"class":1119,"line":3456},[1117,10183,10184],{"class":1123},"        # Clear existing addresses\n",[1117,10186,10187,10189,10191,10193,10195,10197,10199,10202],{"class":1119,"line":3469},[1117,10188,9641],{"class":1134},[1117,10190,1305],{"class":1180},[1117,10192,2457],{"class":1308},[1117,10194,1305],{"class":1180},[1117,10196,10014],{"class":1516},[1117,10198,5487],{"class":1180},[1117,10200,10201],{"class":1516},"delete",[1117,10203,2500],{"class":1180},[1117,10205,10206],{"class":1119,"line":3488},[1117,10207,1346],{"class":1134},[1117,10209,10210],{"class":1119,"line":3502},[1117,10211,10212],{"class":1123},"        # Save current addresses\n",[1117,10214,10215,10217,10219,10221,10223,10225,10227],{"class":1119,"line":3516},[1117,10216,2797],{"class":1130},[1117,10218,2636],{"class":1134},[1117,10220,2639],{"class":1130},[1117,10222,6739],{"class":1134},[1117,10224,1305],{"class":1180},[1117,10226,2457],{"class":1308},[1117,10228,1216],{"class":1180},[1117,10230,10231,10234,10236,10238,10240,10243],{"class":1119,"line":3521},[1117,10232,10233],{"class":1134},"            CustomerAddressModel",[1117,10235,1305],{"class":1180},[1117,10237,9145],{"class":1308},[1117,10239,1305],{"class":1180},[1117,10241,10242],{"class":1516},"create",[1117,10244,8224],{"class":1180},[1117,10246,10247,10250,10252,10254],{"class":1119,"line":3544},[1117,10248,10249],{"class":1191},"                customer",[1117,10251,1195],{"class":1180},[1117,10253,9175],{"class":1516},[1117,10255,2709],{"class":1180},[1117,10257,10258,10260,10262,10265,10267,10269,10271,10273,10276,10278],{"class":1119,"line":3554},[1117,10259,10032],{"class":1191},[1117,10261,1195],{"class":1180},[1117,10263,10264],{"class":1516},"addr_info",[1117,10266,2182],{"class":1180},[1117,10268,1439],{"class":1259},[1117,10270,2700],{"class":1263},[1117,10272,1439],{"class":1259},[1117,10274,10275],{"class":1180},"].",[1117,10277,1815],{"class":1308},[1117,10279,2709],{"class":1180},[1117,10281,10282,10284,10286,10288,10290,10292,10294,10296,10298,10300],{"class":1119,"line":3571},[1117,10283,10048],{"class":1191},[1117,10285,1195],{"class":1180},[1117,10287,10264],{"class":1516},[1117,10289,2182],{"class":1180},[1117,10291,1439],{"class":1259},[1117,10293,2700],{"class":1263},[1117,10295,1439],{"class":1259},[1117,10297,10275],{"class":1180},[1117,10299,1824],{"class":1308},[1117,10301,2709],{"class":1180},[1117,10303,10304,10306,10308,10310,10312,10314,10316,10318,10320,10322],{"class":1119,"line":3589},[1117,10305,10063],{"class":1191},[1117,10307,1195],{"class":1180},[1117,10309,10264],{"class":1516},[1117,10311,2182],{"class":1180},[1117,10313,1439],{"class":1259},[1117,10315,2700],{"class":1263},[1117,10317,1439],{"class":1259},[1117,10319,10275],{"class":1180},[1117,10321,1833],{"class":1308},[1117,10323,2709],{"class":1180},[1117,10325,10326,10328,10330,10332,10334,10336,10338,10340,10342,10344],{"class":1119,"line":3594},[1117,10327,10078],{"class":1191},[1117,10329,1195],{"class":1180},[1117,10331,10264],{"class":1516},[1117,10333,2182],{"class":1180},[1117,10335,1439],{"class":1259},[1117,10337,2700],{"class":1263},[1117,10339,1439],{"class":1259},[1117,10341,10275],{"class":1180},[1117,10343,1842],{"class":1308},[1117,10345,2709],{"class":1180},[1117,10347,10348,10350,10352,10354,10356,10358,10360,10362,10364,10366],{"class":1119,"line":3600},[1117,10349,10093],{"class":1191},[1117,10351,1195],{"class":1180},[1117,10353,10264],{"class":1516},[1117,10355,2182],{"class":1180},[1117,10357,1439],{"class":1259},[1117,10359,2700],{"class":1263},[1117,10361,1439],{"class":1259},[1117,10363,10275],{"class":1180},[1117,10365,1971],{"class":1308},[1117,10367,2709],{"class":1180},[1117,10369,10370,10373,10375,10377,10379,10381,10383,10385],{"class":1119,"line":3652},[1117,10371,10372],{"class":1191},"                is_primary",[1117,10374,1195],{"class":1180},[1117,10376,10264],{"class":1516},[1117,10378,2182],{"class":1180},[1117,10380,1439],{"class":1259},[1117,10382,2660],{"class":1263},[1117,10384,1439],{"class":1259},[1117,10386,10387],{"class":1180},"],\n",[1117,10389,10390,10393,10395,10397,10399,10401,10403,10405],{"class":1119,"line":3670},[1117,10391,10392],{"class":1191},"                added_at",[1117,10394,1195],{"class":1180},[1117,10396,10264],{"class":1516},[1117,10398,2182],{"class":1180},[1117,10400,1439],{"class":1259},[1117,10402,2732],{"class":1263},[1117,10404,1439],{"class":1259},[1117,10406,2324],{"class":1180},[1117,10408,10409],{"class":1119,"line":3675},[1117,10410,8249],{"class":1180},[1117,10412,10413],{"class":1119,"line":3689},[1117,10414,1174],{"emptyLinePlaceholder":1173},[1117,10416,10417,10419,10422,10424,10427],{"class":1119,"line":3694},[1117,10418,1209],{"class":1208},[1117,10420,10421],{"class":1212}," DjangoOrderRepository",[1117,10423,1188],{"class":1180},[1117,10425,10426],{"class":5906},"OrderRepository",[1117,10428,1292],{"class":1180},[1117,10430,10431,10433,10436],{"class":1119,"line":3714},[1117,10432,1223],{"class":1222},[1117,10434,10435],{"class":1226},"Django ORM implementation of order repository",[1117,10437,1230],{"class":1222},[1117,10439,10440],{"class":1119,"line":3724},[1117,10441,1273],{"class":1134},[1117,10443,10444,10446,10448,10450,10452,10454,10456,10458,10460,10462,10464,10466,10468,10470],{"class":1119,"line":3747},[1117,10445,1279],{"class":1208},[1117,10447,8501],{"class":1184},[1117,10449,1188],{"class":1180},[1117,10451,1289],{"class":1288},[1117,10453,1425],{"class":1180},[1117,10455,4016],{"class":1428},[1117,10457,1239],{"class":1180},[1117,10459,2382],{"class":1252},[1117,10461,1379],{"class":1180},[1117,10463,1444],{"class":1180},[1117,10465,2774],{"class":1134},[1117,10467,2182],{"class":1180},[1117,10469,8719],{"class":1134},[1117,10471,2781],{"class":1180},[1117,10473,10474,10476,10479],{"class":1119,"line":3752},[1117,10475,1458],{"class":1222},[1117,10477,10478],{"class":1226},"Get order by ID",[1117,10480,1230],{"class":1222},[1117,10482,10483,10485],{"class":1119,"line":3775},[1117,10484,8196],{"class":1130},[1117,10486,1216],{"class":1180},[1117,10488,10489,10492,10494,10497,10499,10501,10503,10506,10508,10510,10512,10514,10517,10519,10521,10523,10525,10527],{"class":1119,"line":3785},[1117,10490,10491],{"class":1134},"            django_order ",[1117,10493,1195],{"class":1180},[1117,10495,10496],{"class":1134}," OrderModel",[1117,10498,1305],{"class":1180},[1117,10500,9145],{"class":1308},[1117,10502,1305],{"class":1180},[1117,10504,10505],{"class":1516},"prefetch_related",[1117,10507,1188],{"class":1180},[1117,10509,1439],{"class":1259},[1117,10511,4065],{"class":1263},[1117,10513,1439],{"class":1259},[1117,10515,10516],{"class":1180},").",[1117,10518,7294],{"class":1516},[1117,10520,1188],{"class":1180},[1117,10522,2412],{"class":1191},[1117,10524,1195],{"class":1180},[1117,10526,6140],{"class":1516},[1117,10528,1202],{"class":1180},[1117,10530,10531,10533,10535,10537,10539,10541,10544],{"class":1119,"line":3800},[1117,10532,2916],{"class":1130},[1117,10534,1302],{"class":1301},[1117,10536,1305],{"class":1180},[1117,10538,9170],{"class":1516},[1117,10540,1188],{"class":1180},[1117,10542,10543],{"class":1516},"django_order",[1117,10545,1202],{"class":1180},[1117,10547,10548,10550,10552,10554,10556],{"class":1119,"line":3818},[1117,10549,8347],{"class":1130},[1117,10551,10496],{"class":1134},[1117,10553,1305],{"class":1180},[1117,10555,9188],{"class":1308},[1117,10557,1216],{"class":1180},[1117,10559,10560,10562],{"class":1119,"line":3823},[1117,10561,2916],{"class":1130},[1117,10563,2256],{"class":1198},[1117,10565,10566],{"class":1119,"line":3841},[1117,10567,1273],{"class":1134},[1117,10569,10570,10572,10574,10576,10578,10580,10582,10584,10586,10588,10590,10592],{"class":1119,"line":3859},[1117,10571,1279],{"class":1208},[1117,10573,8593],{"class":1184},[1117,10575,1188],{"class":1180},[1117,10577,1289],{"class":1288},[1117,10579,1425],{"class":1180},[1117,10581,6108],{"class":1428},[1117,10583,1239],{"class":1180},[1117,10585,3986],{"class":1134},[1117,10587,1379],{"class":1180},[1117,10589,1444],{"class":1180},[1117,10591,3986],{"class":1134},[1117,10593,1216],{"class":1180},[1117,10595,10596,10598,10601],{"class":1119,"line":3864},[1117,10597,1458],{"class":1222},[1117,10599,10600],{"class":1226},"Save order to database",[1117,10602,1230],{"class":1222},[1117,10604,10605,10608,10611,10613,10616],{"class":1119,"line":3879},[1117,10606,10607],{"class":1130},"        with",[1117,10609,10610],{"class":1134}," transaction",[1117,10612,1305],{"class":1180},[1117,10614,10615],{"class":1516},"atomic",[1117,10617,4272],{"class":1180},[1117,10619,10620,10623],{"class":1119,"line":3884},[1117,10621,10622],{"class":1130},"            try",[1117,10624,1216],{"class":1180},[1117,10626,10627,10630,10632,10634,10636,10638,10640,10642,10644,10646,10648,10650,10652,10654],{"class":1119,"line":3906},[1117,10628,10629],{"class":1134},"                django_order ",[1117,10631,1195],{"class":1180},[1117,10633,10496],{"class":1134},[1117,10635,1305],{"class":1180},[1117,10637,9145],{"class":1308},[1117,10639,1305],{"class":1180},[1117,10641,7294],{"class":1516},[1117,10643,1188],{"class":1180},[1117,10645,2412],{"class":1191},[1117,10647,1195],{"class":1180},[1117,10649,6129],{"class":1516},[1117,10651,1305],{"class":1180},[1117,10653,2412],{"class":1308},[1117,10655,1202],{"class":1180},[1117,10657,10658],{"class":1119,"line":3916},[1117,10659,10660],{"class":1123},"                # Update existing order\n",[1117,10662,10663,10666,10668,10670,10672,10674,10676,10678,10680],{"class":1119,"line":3929},[1117,10664,10665],{"class":1134},"                django_order",[1117,10667,1305],{"class":1180},[1117,10669,4078],{"class":1308},[1117,10671,1256],{"class":1180},[1117,10673,6108],{"class":1134},[1117,10675,1305],{"class":1180},[1117,10677,4078],{"class":1308},[1117,10679,1305],{"class":1180},[1117,10681,9411],{"class":1308},[1117,10683,10684,10686,10688,10690,10692,10694,10696,10698,10700],{"class":1119,"line":3946},[1117,10685,10665],{"class":1134},[1117,10687,1305],{"class":1180},[1117,10689,4098],{"class":1308},[1117,10691,1256],{"class":1180},[1117,10693,6108],{"class":1134},[1117,10695,1305],{"class":1180},[1117,10697,4098],{"class":1308},[1117,10699,1305],{"class":1180},[1117,10701,3235],{"class":1308},[1117,10703,10704,10706,10708,10710,10712,10714,10716],{"class":1119,"line":3951},[1117,10705,10665],{"class":1134},[1117,10707,1305],{"class":1180},[1117,10709,4156],{"class":1308},[1117,10711,1256],{"class":1180},[1117,10713,6108],{"class":1134},[1117,10715,1305],{"class":1180},[1117,10717,10718],{"class":1308},"confirmed_at\n",[1117,10720,10721,10724,10726,10728,10730],{"class":1119,"line":6299},[1117,10722,10723],{"class":1130},"            except",[1117,10725,10496],{"class":1134},[1117,10727,1305],{"class":1180},[1117,10729,9188],{"class":1308},[1117,10731,1216],{"class":1180},[1117,10733,10734],{"class":1119,"line":6309},[1117,10735,10736],{"class":1123},"                # Create new order\n",[1117,10738,10739,10741,10743,10745],{"class":1119,"line":6314},[1117,10740,10629],{"class":1134},[1117,10742,1195],{"class":1180},[1117,10744,10496],{"class":1516},[1117,10746,8224],{"class":1180},[1117,10748,10749,10752,10754,10756,10758,10760],{"class":1119,"line":6343},[1117,10750,10751],{"class":1191},"                    id",[1117,10753,1195],{"class":1180},[1117,10755,6129],{"class":1516},[1117,10757,1305],{"class":1180},[1117,10759,2412],{"class":1308},[1117,10761,2709],{"class":1180},[1117,10763,10764,10767,10769,10771,10773,10775],{"class":1119,"line":6358},[1117,10765,10766],{"class":1191},"                    customer_id",[1117,10768,1195],{"class":1180},[1117,10770,6129],{"class":1516},[1117,10772,1305],{"class":1180},[1117,10774,4052],{"class":1308},[1117,10776,2709],{"class":1180},[1117,10778,10779,10782,10784,10786,10788,10790,10792,10794],{"class":1119,"line":6375},[1117,10780,10781],{"class":1191},"                    status",[1117,10783,1195],{"class":1180},[1117,10785,6129],{"class":1516},[1117,10787,1305],{"class":1180},[1117,10789,4078],{"class":1308},[1117,10791,1305],{"class":1180},[1117,10793,2074],{"class":1308},[1117,10795,2709],{"class":1180},[1117,10797,10798,10801,10803,10805,10807,10809,10811,10813],{"class":1119,"line":6392},[1117,10799,10800],{"class":1191},"                    total",[1117,10802,1195],{"class":1180},[1117,10804,6129],{"class":1516},[1117,10806,1305],{"class":1180},[1117,10808,4098],{"class":1308},[1117,10810,1305],{"class":1180},[1117,10812,1309],{"class":1308},[1117,10814,2709],{"class":1180},[1117,10816,10817,10820,10822,10824,10826,10828],{"class":1119,"line":6405},[1117,10818,10819],{"class":1191},"                    created_at",[1117,10821,1195],{"class":1180},[1117,10823,6129],{"class":1516},[1117,10825,1305],{"class":1180},[1117,10827,2487],{"class":1308},[1117,10829,2709],{"class":1180},[1117,10831,10832,10835,10837,10839,10841],{"class":1119,"line":6410},[1117,10833,10834],{"class":1191},"                    confirmed_at",[1117,10836,1195],{"class":1180},[1117,10838,6129],{"class":1516},[1117,10840,1305],{"class":1180},[1117,10842,10718],{"class":1308},[1117,10844,10845],{"class":1119,"line":6416},[1117,10846,10847],{"class":1180},"                )\n",[1117,10849,10850],{"class":1119,"line":6426},[1117,10851,8254],{"class":1134},[1117,10853,10854,10857,10859,10861],{"class":1119,"line":6436},[1117,10855,10856],{"class":1134},"            django_order",[1117,10858,1305],{"class":1180},[1117,10860,7730],{"class":1516},[1117,10862,2500],{"class":1180},[1117,10864,10865],{"class":1119,"line":6441},[1117,10866,8254],{"class":1134},[1117,10868,10869],{"class":1119,"line":6451},[1117,10870,10871],{"class":1123},"            # Save shipping address\n",[1117,10873,10874,10876,10878,10880,10882],{"class":1119,"line":6456},[1117,10875,2815],{"class":1130},[1117,10877,6108],{"class":1134},[1117,10879,1305],{"class":1180},[1117,10881,4125],{"class":1308},[1117,10883,1216],{"class":1180},[1117,10885,10886,10888,10890,10893,10895,10897,10899,10902],{"class":1119,"line":6465},[1117,10887,1945],{"class":1301},[1117,10889,1305],{"class":1180},[1117,10891,10892],{"class":1516},"_save_shipping_address",[1117,10894,1188],{"class":1180},[1117,10896,6129],{"class":1516},[1117,10898,1425],{"class":1180},[1117,10900,10901],{"class":1516}," django_order",[1117,10903,1202],{"class":1180},[1117,10905,10906],{"class":1119,"line":6489},[1117,10907,8254],{"class":1134},[1117,10909,10910],{"class":1119,"line":6499},[1117,10911,10912],{"class":1123},"            # Save order items\n",[1117,10914,10915,10917,10919,10922,10924,10926,10928,10930],{"class":1119,"line":6521},[1117,10916,4442],{"class":1301},[1117,10918,1305],{"class":1180},[1117,10920,10921],{"class":1516},"_save_order_items",[1117,10923,1188],{"class":1180},[1117,10925,6129],{"class":1516},[1117,10927,1425],{"class":1180},[1117,10929,10901],{"class":1516},[1117,10931,1202],{"class":1180},[1117,10933,10934],{"class":1119,"line":6526},[1117,10935,1346],{"class":1134},[1117,10937,10938,10940],{"class":1119,"line":6533},[1117,10939,1513],{"class":1130},[1117,10941,10942],{"class":1134}," order\n",[1117,10944,10945],{"class":1119,"line":6554},[1117,10946,1273],{"class":1134},[1117,10948,10949,10951,10953,10955,10957,10959,10961,10963,10965,10967,10969,10971,10973,10975],{"class":1119,"line":6564},[1117,10950,1279],{"class":1208},[1117,10952,8782],{"class":1184},[1117,10954,1188],{"class":1180},[1117,10956,1289],{"class":1288},[1117,10958,1425],{"class":1180},[1117,10960,2377],{"class":1428},[1117,10962,1239],{"class":1180},[1117,10964,2382],{"class":1252},[1117,10966,1379],{"class":1180},[1117,10968,1444],{"class":1180},[1117,10970,8452],{"class":1134},[1117,10972,2182],{"class":1180},[1117,10974,8719],{"class":1134},[1117,10976,2781],{"class":1180},[1117,10978,10979,10981,10984],{"class":1119,"line":6583},[1117,10980,1458],{"class":1222},[1117,10982,10983],{"class":1226},"Find orders by customer",[1117,10985,1230],{"class":1222},[1117,10987,10988,10991,10993,10995,10997,10999,11001,11003],{"class":1119,"line":6588},[1117,10989,10990],{"class":1134},"        django_orders ",[1117,10992,1195],{"class":1180},[1117,10994,10496],{"class":1134},[1117,10996,1305],{"class":1180},[1117,10998,9145],{"class":1308},[1117,11000,1305],{"class":1180},[1117,11002,9740],{"class":1516},[1117,11004,8224],{"class":1180},[1117,11006,11007,11009,11011],{"class":1119,"line":6595},[1117,11008,9856],{"class":1191},[1117,11010,1195],{"class":1180},[1117,11012,6166],{"class":1516},[1117,11014,11015,11018,11020,11022,11024,11026,11028,11030,11033,11035,11037,11040,11042],{"class":1119,"line":6609},[1117,11016,11017],{"class":1180},"        ).",[1117,11019,10505],{"class":1516},[1117,11021,1188],{"class":1180},[1117,11023,1439],{"class":1259},[1117,11025,4065],{"class":1263},[1117,11027,1439],{"class":1259},[1117,11029,10516],{"class":1180},[1117,11031,11032],{"class":1516},"order_by",[1117,11034,1188],{"class":1180},[1117,11036,1439],{"class":1259},[1117,11038,11039],{"class":1263},"-created_at",[1117,11041,1439],{"class":1259},[1117,11043,1202],{"class":1180},[1117,11045,11046],{"class":1119,"line":6619},[1117,11047,1346],{"class":1134},[1117,11049,11051,11053,11055,11057,11059,11061,11063,11066,11068,11070,11073,11075,11078],{"class":1119,"line":11050},212,[1117,11052,1513],{"class":1130},[1117,11054,4720],{"class":1180},[1117,11056,1289],{"class":1301},[1117,11058,1305],{"class":1180},[1117,11060,9170],{"class":1516},[1117,11062,1188],{"class":1180},[1117,11064,11065],{"class":1516},"do",[1117,11067,1379],{"class":1180},[1117,11069,5492],{"class":1130},[1117,11071,11072],{"class":1134}," do ",[1117,11074,2639],{"class":1130},[1117,11076,11077],{"class":1134}," django_orders",[1117,11079,2324],{"class":1180},[1117,11081,11083],{"class":1119,"line":11082},213,[1117,11084,1273],{"class":1134},[1117,11086,11088,11090,11092,11094,11096,11098,11100,11102,11104,11106],{"class":1119,"line":11087},214,[1117,11089,1279],{"class":1208},[1117,11091,8827],{"class":1184},[1117,11093,1188],{"class":1180},[1117,11095,1289],{"class":1288},[1117,11097,1379],{"class":1180},[1117,11099,1444],{"class":1180},[1117,11101,8452],{"class":1134},[1117,11103,2182],{"class":1180},[1117,11105,8719],{"class":1134},[1117,11107,2781],{"class":1180},[1117,11109,11111,11113,11116],{"class":1119,"line":11110},215,[1117,11112,1458],{"class":1222},[1117,11114,11115],{"class":1226},"Find orders pending fulfillment",[1117,11117,1230],{"class":1222},[1117,11119,11121,11123,11125,11127,11129,11131,11133,11135],{"class":1119,"line":11120},216,[1117,11122,10990],{"class":1134},[1117,11124,1195],{"class":1180},[1117,11126,10496],{"class":1134},[1117,11128,1305],{"class":1180},[1117,11130,9145],{"class":1308},[1117,11132,1305],{"class":1180},[1117,11134,9740],{"class":1516},[1117,11136,8224],{"class":1180},[1117,11138,11140,11143,11145,11147,11149,11151,11153],{"class":1119,"line":11139},217,[1117,11141,11142],{"class":1191},"            status",[1117,11144,1195],{"class":1180},[1117,11146,4723],{"class":1516},[1117,11148,1305],{"class":1180},[1117,11150,4736],{"class":4088},[1117,11152,1305],{"class":1180},[1117,11154,9411],{"class":1308},[1117,11156,11158,11160,11162,11164,11166,11168,11170],{"class":1119,"line":11157},218,[1117,11159,11017],{"class":1180},[1117,11161,10505],{"class":1516},[1117,11163,1188],{"class":1180},[1117,11165,1439],{"class":1259},[1117,11167,4065],{"class":1263},[1117,11169,1439],{"class":1259},[1117,11171,1202],{"class":1180},[1117,11173,11175],{"class":1119,"line":11174},219,[1117,11176,1346],{"class":1134},[1117,11178,11180,11182,11184,11186,11188,11190,11192,11194,11196,11198,11200,11202,11204],{"class":1119,"line":11179},220,[1117,11181,1513],{"class":1130},[1117,11183,4720],{"class":1180},[1117,11185,1289],{"class":1301},[1117,11187,1305],{"class":1180},[1117,11189,9170],{"class":1516},[1117,11191,1188],{"class":1180},[1117,11193,11065],{"class":1516},[1117,11195,1379],{"class":1180},[1117,11197,5492],{"class":1130},[1117,11199,11072],{"class":1134},[1117,11201,2639],{"class":1130},[1117,11203,11077],{"class":1134},[1117,11205,2324],{"class":1180},[1117,11207,11209],{"class":1119,"line":11208},221,[1117,11210,1273],{"class":1134},[1117,11212,11214,11216,11218,11220,11222,11224,11226,11228,11230,11232],{"class":1119,"line":11213},222,[1117,11215,1279],{"class":1208},[1117,11217,9815],{"class":1184},[1117,11219,1188],{"class":1180},[1117,11221,1289],{"class":1288},[1117,11223,1425],{"class":1180},[1117,11225,10901],{"class":1428},[1117,11227,1379],{"class":1180},[1117,11229,1444],{"class":1180},[1117,11231,3986],{"class":1134},[1117,11233,1216],{"class":1180},[1117,11235,11237,11239,11241],{"class":1119,"line":11236},223,[1117,11238,1458],{"class":1222},[1117,11240,9838],{"class":1226},[1117,11242,1230],{"class":1222},[1117,11244,11246,11249,11251,11253,11255,11257,11259,11261,11263,11265,11267,11269],{"class":1119,"line":11245},224,[1117,11247,11248],{"class":1134},"        order ",[1117,11250,1195],{"class":1180},[1117,11252,3986],{"class":1516},[1117,11254,1188],{"class":1180},[1117,11256,10543],{"class":1516},[1117,11258,1305],{"class":1180},[1117,11260,2412],{"class":1308},[1117,11262,1425],{"class":1180},[1117,11264,10901],{"class":1516},[1117,11266,1305],{"class":1180},[1117,11268,4052],{"class":1308},[1117,11270,1202],{"class":1180},[1117,11272,11274,11277,11279,11281,11283,11285,11287,11289,11291,11293],{"class":1119,"line":11273},225,[1117,11275,11276],{"class":1134},"        order",[1117,11278,1305],{"class":1180},[1117,11280,4078],{"class":1308},[1117,11282,1256],{"class":1180},[1117,11284,4083],{"class":1516},[1117,11286,1188],{"class":1180},[1117,11288,10543],{"class":1516},[1117,11290,1305],{"class":1180},[1117,11292,4078],{"class":1308},[1117,11294,1202],{"class":1180},[1117,11296,11298,11300,11302,11304,11306,11308,11310,11312,11314,11316],{"class":1119,"line":11297},226,[1117,11299,11276],{"class":1134},[1117,11301,1305],{"class":1180},[1117,11303,4098],{"class":1308},[1117,11305,1256],{"class":1180},[1117,11307,1213],{"class":1516},[1117,11309,1188],{"class":1180},[1117,11311,10543],{"class":1516},[1117,11313,1305],{"class":1180},[1117,11315,4098],{"class":1308},[1117,11317,1202],{"class":1180},[1117,11319,11321,11323,11325,11327,11329,11331,11333],{"class":1119,"line":11320},227,[1117,11322,11276],{"class":1134},[1117,11324,1305],{"class":1180},[1117,11326,2487],{"class":1308},[1117,11328,1256],{"class":1180},[1117,11330,10901],{"class":1134},[1117,11332,1305],{"class":1180},[1117,11334,9628],{"class":1308},[1117,11336,11338,11340,11342,11344,11346,11348,11350],{"class":1119,"line":11337},228,[1117,11339,11276],{"class":1134},[1117,11341,1305],{"class":1180},[1117,11343,4156],{"class":1308},[1117,11345,1256],{"class":1180},[1117,11347,10901],{"class":1134},[1117,11349,1305],{"class":1180},[1117,11351,10718],{"class":1308},[1117,11353,11355],{"class":1119,"line":11354},229,[1117,11356,1346],{"class":1134},[1117,11358,11360],{"class":1119,"line":11359},230,[1117,11361,11362],{"class":1123},"        # Load shipping address\n",[1117,11364,11366,11368,11371,11373,11375,11377,11379,11381,11383,11385,11387,11389,11391,11393],{"class":1119,"line":11365},231,[1117,11367,1298],{"class":1130},[1117,11369,11370],{"class":1367}," hasattr",[1117,11372,1188],{"class":1180},[1117,11374,10543],{"class":1516},[1117,11376,1425],{"class":1180},[1117,11378,1260],{"class":1259},[1117,11380,4125],{"class":1263},[1117,11382,1439],{"class":1259},[1117,11384,1379],{"class":1180},[1117,11386,1936],{"class":1312},[1117,11388,10901],{"class":1134},[1117,11390,1305],{"class":1180},[1117,11392,4125],{"class":1308},[1117,11394,1216],{"class":1180},[1117,11396,11398,11401,11403,11405,11407],{"class":1119,"line":11397},232,[1117,11399,11400],{"class":1134},"            addr ",[1117,11402,1195],{"class":1180},[1117,11404,10901],{"class":1134},[1117,11406,1305],{"class":1180},[1117,11408,11409],{"class":1308},"shipping_address\n",[1117,11411,11413,11415,11417,11419,11421,11423],{"class":1119,"line":11412},233,[1117,11414,8264],{"class":1134},[1117,11416,1305],{"class":1180},[1117,11418,4125],{"class":1308},[1117,11420,1256],{"class":1180},[1117,11422,1705],{"class":1516},[1117,11424,8224],{"class":1180},[1117,11426,11428,11430,11432,11435,11437,11439],{"class":1119,"line":11427},234,[1117,11429,10032],{"class":1191},[1117,11431,1195],{"class":1180},[1117,11433,11434],{"class":1516},"addr",[1117,11436,1305],{"class":1180},[1117,11438,1815],{"class":1308},[1117,11440,2709],{"class":1180},[1117,11442,11444,11446,11448,11450,11452,11454],{"class":1119,"line":11443},235,[1117,11445,10048],{"class":1191},[1117,11447,1195],{"class":1180},[1117,11449,11434],{"class":1516},[1117,11451,1305],{"class":1180},[1117,11453,1824],{"class":1308},[1117,11455,2709],{"class":1180},[1117,11457,11459,11461,11463,11465,11467,11469],{"class":1119,"line":11458},236,[1117,11460,10063],{"class":1191},[1117,11462,1195],{"class":1180},[1117,11464,11434],{"class":1516},[1117,11466,1305],{"class":1180},[1117,11468,1833],{"class":1308},[1117,11470,2709],{"class":1180},[1117,11472,11474,11476,11478,11480,11482,11484],{"class":1119,"line":11473},237,[1117,11475,10078],{"class":1191},[1117,11477,1195],{"class":1180},[1117,11479,11434],{"class":1516},[1117,11481,1305],{"class":1180},[1117,11483,1842],{"class":1308},[1117,11485,2709],{"class":1180},[1117,11487,11489,11491,11493,11495,11497],{"class":1119,"line":11488},238,[1117,11490,10093],{"class":1191},[1117,11492,1195],{"class":1180},[1117,11494,11434],{"class":1516},[1117,11496,1305],{"class":1180},[1117,11498,10102],{"class":1308},[1117,11500,11502],{"class":1119,"line":11501},239,[1117,11503,8249],{"class":1180},[1117,11505,11507],{"class":1119,"line":11506},240,[1117,11508,1346],{"class":1134},[1117,11510,11512],{"class":1119,"line":11511},241,[1117,11513,11514],{"class":1123},"        # Load order items\n",[1117,11516,11518,11520,11523,11525,11527,11529,11531,11533,11535],{"class":1119,"line":11517},242,[1117,11519,2797],{"class":1130},[1117,11521,11522],{"class":1134}," item_model ",[1117,11524,2639],{"class":1130},[1117,11526,10901],{"class":1134},[1117,11528,1305],{"class":1180},[1117,11530,4065],{"class":1308},[1117,11532,1305],{"class":1180},[1117,11534,10014],{"class":1516},[1117,11536,4272],{"class":1180},[1117,11538,11540,11542,11544,11546],{"class":1119,"line":11539},243,[1117,11541,4386],{"class":1134},[1117,11543,1195],{"class":1180},[1117,11545,4407],{"class":1516},[1117,11547,8224],{"class":1180},[1117,11549,11551,11554,11556,11559,11561,11563],{"class":1119,"line":11550},244,[1117,11552,11553],{"class":1191},"                product_id",[1117,11555,1195],{"class":1180},[1117,11557,11558],{"class":1516},"item_model",[1117,11560,1305],{"class":1180},[1117,11562,4605],{"class":1308},[1117,11564,2709],{"class":1180},[1117,11566,11568,11571,11573,11575,11577,11579],{"class":1119,"line":11567},245,[1117,11569,11570],{"class":1191},"                product_name",[1117,11572,1195],{"class":1180},[1117,11574,11558],{"class":1516},[1117,11576,1305],{"class":1180},[1117,11578,5615],{"class":1308},[1117,11580,2709],{"class":1180},[1117,11582,11584,11587,11589,11591,11593,11595,11597,11599],{"class":1119,"line":11583},246,[1117,11585,11586],{"class":1191},"                unit_price",[1117,11588,1195],{"class":1180},[1117,11590,1436],{"class":1516},[1117,11592,1188],{"class":1180},[1117,11594,11558],{"class":1516},[1117,11596,1305],{"class":1180},[1117,11598,5629],{"class":1308},[1117,11600,9887],{"class":1180},[1117,11602,11604,11607,11609,11611,11613],{"class":1119,"line":11603},247,[1117,11605,11606],{"class":1191},"                quantity",[1117,11608,1195],{"class":1180},[1117,11610,11558],{"class":1516},[1117,11612,1305],{"class":1180},[1117,11614,11615],{"class":1308},"quantity\n",[1117,11617,11619],{"class":1119,"line":11618},248,[1117,11620,8249],{"class":1180},[1117,11622,11624,11626,11628,11630,11632,11634,11636,11638],{"class":1119,"line":11623},249,[1117,11625,8264],{"class":1134},[1117,11627,1305],{"class":1180},[1117,11629,4065],{"class":1308},[1117,11631,1305],{"class":1180},[1117,11633,2688],{"class":1516},[1117,11635,1188],{"class":1180},[1117,11637,4455],{"class":1516},[1117,11639,1202],{"class":1180},[1117,11641,11643],{"class":1119,"line":11642},250,[1117,11644,1346],{"class":1134},[1117,11646,11648,11650],{"class":1119,"line":11647},251,[1117,11649,1513],{"class":1130},[1117,11651,10942],{"class":1134},[1117,11653,11655],{"class":1119,"line":11654},252,[1117,11656,1273],{"class":1134},[1117,11658,11660,11662,11665,11667,11669,11671,11673,11675,11677,11679,11681],{"class":1119,"line":11659},253,[1117,11661,1279],{"class":1208},[1117,11663,11664],{"class":1184}," _save_shipping_address",[1117,11666,1188],{"class":1180},[1117,11668,1289],{"class":1288},[1117,11670,1425],{"class":1180},[1117,11672,6108],{"class":1428},[1117,11674,1239],{"class":1180},[1117,11676,3986],{"class":1134},[1117,11678,1425],{"class":1180},[1117,11680,10901],{"class":1428},[1117,11682,1292],{"class":1180},[1117,11684,11686,11688,11691],{"class":1119,"line":11685},254,[1117,11687,1458],{"class":1222},[1117,11689,11690],{"class":1226},"Save shipping address",[1117,11692,1230],{"class":1222},[1117,11694,11696,11699,11701,11703,11705],{"class":1119,"line":11695},255,[1117,11697,11698],{"class":1134},"        addr ",[1117,11700,1195],{"class":1180},[1117,11702,6108],{"class":1134},[1117,11704,1305],{"class":1180},[1117,11706,11409],{"class":1308},[1117,11708,11710,11713,11715,11717,11719,11722],{"class":1119,"line":11709},256,[1117,11711,11712],{"class":1134},"        OrderShippingAddressModel",[1117,11714,1305],{"class":1180},[1117,11716,9145],{"class":1308},[1117,11718,1305],{"class":1180},[1117,11720,11721],{"class":1516},"update_or_create",[1117,11723,8224],{"class":1180},[1117,11725,11727,11729,11731,11733],{"class":1119,"line":11726},257,[1117,11728,8264],{"class":1191},[1117,11730,1195],{"class":1180},[1117,11732,10543],{"class":1516},[1117,11734,2709],{"class":1180},[1117,11736,11738,11741],{"class":1119,"line":11737},258,[1117,11739,11740],{"class":1191},"            defaults",[1117,11742,11743],{"class":1180},"={\n",[1117,11745,11747,11750,11752,11754,11756,11759,11761,11763],{"class":1119,"line":11746},259,[1117,11748,11749],{"class":1259},"                '",[1117,11751,1815],{"class":1263},[1117,11753,1439],{"class":1259},[1117,11755,1239],{"class":1180},[1117,11757,11758],{"class":1516}," addr",[1117,11760,1305],{"class":1180},[1117,11762,1815],{"class":1308},[1117,11764,2709],{"class":1180},[1117,11766,11768,11770,11772,11774,11776,11778,11780,11782],{"class":1119,"line":11767},260,[1117,11769,11749],{"class":1259},[1117,11771,1824],{"class":1263},[1117,11773,1439],{"class":1259},[1117,11775,1239],{"class":1180},[1117,11777,11758],{"class":1516},[1117,11779,1305],{"class":1180},[1117,11781,1824],{"class":1308},[1117,11783,2709],{"class":1180},[1117,11785,11787,11789,11791,11793,11795,11797,11799,11801],{"class":1119,"line":11786},261,[1117,11788,11749],{"class":1259},[1117,11790,1833],{"class":1263},[1117,11792,1439],{"class":1259},[1117,11794,1239],{"class":1180},[1117,11796,11758],{"class":1516},[1117,11798,1305],{"class":1180},[1117,11800,1833],{"class":1308},[1117,11802,2709],{"class":1180},[1117,11804,11806,11808,11810,11812,11814,11816,11818,11820],{"class":1119,"line":11805},262,[1117,11807,11749],{"class":1259},[1117,11809,1842],{"class":1263},[1117,11811,1439],{"class":1259},[1117,11813,1239],{"class":1180},[1117,11815,11758],{"class":1516},[1117,11817,1305],{"class":1180},[1117,11819,1842],{"class":1308},[1117,11821,2709],{"class":1180},[1117,11823,11825,11827,11829,11831,11833,11835,11837],{"class":1119,"line":11824},263,[1117,11826,11749],{"class":1259},[1117,11828,1971],{"class":1263},[1117,11830,1439],{"class":1259},[1117,11832,1239],{"class":1180},[1117,11834,11758],{"class":1516},[1117,11836,1305],{"class":1180},[1117,11838,10102],{"class":1308},[1117,11840,11842],{"class":1119,"line":11841},264,[1117,11843,11844],{"class":1180},"            }\n",[1117,11846,11848],{"class":1119,"line":11847},265,[1117,11849,9769],{"class":1180},[1117,11851,11853],{"class":1119,"line":11852},266,[1117,11854,1273],{"class":1134},[1117,11856,11858,11860,11863,11865,11867,11869,11871,11873,11875,11877,11879],{"class":1119,"line":11857},267,[1117,11859,1279],{"class":1208},[1117,11861,11862],{"class":1184}," _save_order_items",[1117,11864,1188],{"class":1180},[1117,11866,1289],{"class":1288},[1117,11868,1425],{"class":1180},[1117,11870,6108],{"class":1428},[1117,11872,1239],{"class":1180},[1117,11874,3986],{"class":1134},[1117,11876,1425],{"class":1180},[1117,11878,10901],{"class":1428},[1117,11880,1292],{"class":1180},[1117,11882,11884,11886,11889],{"class":1119,"line":11883},268,[1117,11885,1458],{"class":1222},[1117,11887,11888],{"class":1226},"Save order items",[1117,11890,1230],{"class":1222},[1117,11892,11894],{"class":1119,"line":11893},269,[1117,11895,11896],{"class":1123},"        # Clear existing items\n",[1117,11898,11900,11903,11905,11907,11909,11911,11913,11915],{"class":1119,"line":11899},270,[1117,11901,11902],{"class":1134},"        django_order",[1117,11904,1305],{"class":1180},[1117,11906,4065],{"class":1308},[1117,11908,1305],{"class":1180},[1117,11910,10014],{"class":1516},[1117,11912,5487],{"class":1180},[1117,11914,10201],{"class":1516},[1117,11916,2500],{"class":1180},[1117,11918,11920],{"class":1119,"line":11919},271,[1117,11921,1346],{"class":1134},[1117,11923,11925],{"class":1119,"line":11924},272,[1117,11926,11927],{"class":1123},"        # Save current items\n",[1117,11929,11931,11933,11935,11937,11939,11941,11943],{"class":1119,"line":11930},273,[1117,11932,2797],{"class":1130},[1117,11934,5103],{"class":1134},[1117,11936,2639],{"class":1130},[1117,11938,6108],{"class":1134},[1117,11940,1305],{"class":1180},[1117,11942,4065],{"class":1308},[1117,11944,1216],{"class":1180},[1117,11946,11948,11951,11953,11955,11957,11959],{"class":1119,"line":11947},274,[1117,11949,11950],{"class":1134},"            OrderItemModel",[1117,11952,1305],{"class":1180},[1117,11954,9145],{"class":1308},[1117,11956,1305],{"class":1180},[1117,11958,10242],{"class":1516},[1117,11960,8224],{"class":1180},[1117,11962,11964,11966,11968,11970],{"class":1119,"line":11963},275,[1117,11965,8229],{"class":1191},[1117,11967,1195],{"class":1180},[1117,11969,10543],{"class":1516},[1117,11971,2709],{"class":1180},[1117,11973,11975,11977,11979,11981,11983,11985],{"class":1119,"line":11974},276,[1117,11976,11553],{"class":1191},[1117,11978,1195],{"class":1180},[1117,11980,4455],{"class":1516},[1117,11982,1305],{"class":1180},[1117,11984,4605],{"class":1308},[1117,11986,2709],{"class":1180},[1117,11988,11990,11992,11994,11996,11998,12000],{"class":1119,"line":11989},277,[1117,11991,11570],{"class":1191},[1117,11993,1195],{"class":1180},[1117,11995,4455],{"class":1516},[1117,11997,1305],{"class":1180},[1117,11999,5615],{"class":1308},[1117,12001,2709],{"class":1180},[1117,12003,12005,12007,12009,12011,12013,12015,12017,12019],{"class":1119,"line":12004},278,[1117,12006,11586],{"class":1191},[1117,12008,1195],{"class":1180},[1117,12010,4455],{"class":1516},[1117,12012,1305],{"class":1180},[1117,12014,5629],{"class":1308},[1117,12016,1305],{"class":1180},[1117,12018,1309],{"class":1308},[1117,12020,2709],{"class":1180},[1117,12022,12024,12026,12028,12030,12032],{"class":1119,"line":12023},279,[1117,12025,11606],{"class":1191},[1117,12027,1195],{"class":1180},[1117,12029,4455],{"class":1516},[1117,12031,1305],{"class":1180},[1117,12033,11615],{"class":1308},[1117,12035,12037],{"class":1119,"line":12036},280,[1117,12038,8249],{"class":1180},[1117,12040,12042],{"class":1119,"line":12041},281,[1117,12043,1174],{"emptyLinePlaceholder":1173},[1117,12045,12047],{"class":1119,"line":12046},282,[1117,12048,12049],{"class":1123},"# Django Models for Persistence\n",[1117,12051,12053,12055,12057,12059,12062,12064,12067],{"class":1119,"line":12052},283,[1117,12054,1209],{"class":1208},[1117,12056,9140],{"class":1212},[1117,12058,1188],{"class":1180},[1117,12060,12061],{"class":5906},"models",[1117,12063,1305],{"class":1180},[1117,12065,12066],{"class":5906},"Model",[1117,12068,1292],{"class":1180},[1117,12070,12072,12074,12077],{"class":1119,"line":12071},284,[1117,12073,1223],{"class":1222},[1117,12075,12076],{"class":1226},"Django model for customer persistence",[1117,12078,1230],{"class":1222},[1117,12080,12082],{"class":1119,"line":12081},285,[1117,12083,1273],{"class":1134},[1117,12085,12087,12090,12092,12095,12097,12100,12102,12105,12107,12109],{"class":1119,"line":12086},286,[1117,12088,12089],{"class":1134},"    email ",[1117,12091,1195],{"class":1180},[1117,12093,12094],{"class":1134}," models",[1117,12096,1305],{"class":1180},[1117,12098,12099],{"class":1516},"EmailField",[1117,12101,1188],{"class":1180},[1117,12103,12104],{"class":1191},"unique",[1117,12106,1195],{"class":1180},[1117,12108,1199],{"class":1198},[1117,12110,1202],{"class":1180},[1117,12112,12114,12117,12119,12121,12123,12126,12128,12131,12133,12136],{"class":1119,"line":12113},287,[1117,12115,12116],{"class":1134},"    name ",[1117,12118,1195],{"class":1180},[1117,12120,12094],{"class":1134},[1117,12122,1305],{"class":1180},[1117,12124,12125],{"class":1516},"CharField",[1117,12127,1188],{"class":1180},[1117,12129,12130],{"class":1191},"max_length",[1117,12132,1195],{"class":1180},[1117,12134,12135],{"class":1316},"200",[1117,12137,1202],{"class":1180},[1117,12139,12141,12144,12146,12148,12150,12153,12155,12158,12160,12162],{"class":1119,"line":12140},288,[1117,12142,12143],{"class":1134},"    is_active ",[1117,12145,1195],{"class":1180},[1117,12147,12094],{"class":1134},[1117,12149,1305],{"class":1180},[1117,12151,12152],{"class":1516},"BooleanField",[1117,12154,1188],{"class":1180},[1117,12156,12157],{"class":1191},"default",[1117,12159,1195],{"class":1180},[1117,12161,1199],{"class":1198},[1117,12163,1202],{"class":1180},[1117,12165,12167,12170,12172,12174,12176,12179,12181,12184,12186,12189,12191,12194,12196,12199,12201,12204,12206,12209],{"class":1119,"line":12166},289,[1117,12168,12169],{"class":1134},"    credit_limit ",[1117,12171,1195],{"class":1180},[1117,12173,12094],{"class":1134},[1117,12175,1305],{"class":1180},[1117,12177,12178],{"class":1516},"DecimalField",[1117,12180,1188],{"class":1180},[1117,12182,12183],{"class":1191},"max_digits",[1117,12185,1195],{"class":1180},[1117,12187,12188],{"class":1316},"10",[1117,12190,1425],{"class":1180},[1117,12192,12193],{"class":1191}," decimal_places",[1117,12195,1195],{"class":1180},[1117,12197,12198],{"class":1316},"2",[1117,12200,1425],{"class":1180},[1117,12202,12203],{"class":1191}," default",[1117,12205,1195],{"class":1180},[1117,12207,12208],{"class":1316},"1000",[1117,12210,1202],{"class":1180},[1117,12212,12214,12217,12219,12221,12223,12225,12227,12229,12231,12233,12235,12237,12239,12241,12243,12245,12247,12250],{"class":1119,"line":12213},290,[1117,12215,12216],{"class":1134},"    current_balance ",[1117,12218,1195],{"class":1180},[1117,12220,12094],{"class":1134},[1117,12222,1305],{"class":1180},[1117,12224,12178],{"class":1516},[1117,12226,1188],{"class":1180},[1117,12228,12183],{"class":1191},[1117,12230,1195],{"class":1180},[1117,12232,12188],{"class":1316},[1117,12234,1425],{"class":1180},[1117,12236,12193],{"class":1191},[1117,12238,1195],{"class":1180},[1117,12240,12198],{"class":1316},[1117,12242,1425],{"class":1180},[1117,12244,12203],{"class":1191},[1117,12246,1195],{"class":1180},[1117,12248,12249],{"class":1316},"0",[1117,12251,1202],{"class":1180},[1117,12253,12255,12258,12260,12262,12264,12266,12268,12270,12272,12275,12277,12279,12281,12283,12285,12287,12289,12291],{"class":1119,"line":12254},291,[1117,12256,12257],{"class":1134},"    lifetime_spent ",[1117,12259,1195],{"class":1180},[1117,12261,12094],{"class":1134},[1117,12263,1305],{"class":1180},[1117,12265,12178],{"class":1516},[1117,12267,1188],{"class":1180},[1117,12269,12183],{"class":1191},[1117,12271,1195],{"class":1180},[1117,12273,12274],{"class":1316},"12",[1117,12276,1425],{"class":1180},[1117,12278,12193],{"class":1191},[1117,12280,1195],{"class":1180},[1117,12282,12198],{"class":1316},[1117,12284,1425],{"class":1180},[1117,12286,12203],{"class":1191},[1117,12288,1195],{"class":1180},[1117,12290,12249],{"class":1316},[1117,12292,1202],{"class":1180},[1117,12294,12296,12299,12301,12303,12305,12308,12310,12312,12314,12316],{"class":1119,"line":12295},292,[1117,12297,12298],{"class":1134},"    order_count ",[1117,12300,1195],{"class":1180},[1117,12302,12094],{"class":1134},[1117,12304,1305],{"class":1180},[1117,12306,12307],{"class":1516},"IntegerField",[1117,12309,1188],{"class":1180},[1117,12311,12157],{"class":1191},[1117,12313,1195],{"class":1180},[1117,12315,12249],{"class":1316},[1117,12317,1202],{"class":1180},[1117,12319,12321,12324,12326,12328,12330,12333,12335,12338,12340,12342],{"class":1119,"line":12320},293,[1117,12322,12323],{"class":1134},"    created_at ",[1117,12325,1195],{"class":1180},[1117,12327,12094],{"class":1134},[1117,12329,1305],{"class":1180},[1117,12331,12332],{"class":1516},"DateTimeField",[1117,12334,1188],{"class":1180},[1117,12336,12337],{"class":1191},"auto_now_add",[1117,12339,1195],{"class":1180},[1117,12341,1199],{"class":1198},[1117,12343,1202],{"class":1180},[1117,12345,12347],{"class":1119,"line":12346},294,[1117,12348,1174],{"emptyLinePlaceholder":1173},[1117,12350,12352,12354,12357,12359,12361,12363,12365],{"class":1119,"line":12351},295,[1117,12353,1209],{"class":1208},[1117,12355,12356],{"class":1212}," CustomerAddressModel",[1117,12358,1188],{"class":1180},[1117,12360,12061],{"class":5906},[1117,12362,1305],{"class":1180},[1117,12364,12066],{"class":5906},[1117,12366,1292],{"class":1180},[1117,12368,12370,12372,12375],{"class":1119,"line":12369},296,[1117,12371,1223],{"class":1222},[1117,12373,12374],{"class":1226},"Django model for customer addresses",[1117,12376,1230],{"class":1222},[1117,12378,12380],{"class":1119,"line":12379},297,[1117,12381,1273],{"class":1134},[1117,12383,12385,12388,12390,12392,12394,12397,12399,12402,12404,12407,12409,12411,12413,12415,12417,12420,12422,12424,12426,12429],{"class":1119,"line":12384},298,[1117,12386,12387],{"class":1134},"    customer ",[1117,12389,1195],{"class":1180},[1117,12391,12094],{"class":1134},[1117,12393,1305],{"class":1180},[1117,12395,12396],{"class":1516},"ForeignKey",[1117,12398,1188],{"class":1180},[1117,12400,12401],{"class":1516},"CustomerModel",[1117,12403,1425],{"class":1180},[1117,12405,12406],{"class":1191}," related_name",[1117,12408,1195],{"class":1180},[1117,12410,1439],{"class":1259},[1117,12412,2457],{"class":1263},[1117,12414,1439],{"class":1259},[1117,12416,1425],{"class":1180},[1117,12418,12419],{"class":1191}," on_delete",[1117,12421,1195],{"class":1180},[1117,12423,12061],{"class":1516},[1117,12425,1305],{"class":1180},[1117,12427,12428],{"class":4088},"CASCADE",[1117,12430,1202],{"class":1180},[1117,12432,12434,12437,12439,12441,12443,12445,12447,12449,12451,12453],{"class":1119,"line":12433},299,[1117,12435,12436],{"class":1134},"    street ",[1117,12438,1195],{"class":1180},[1117,12440,12094],{"class":1134},[1117,12442,1305],{"class":1180},[1117,12444,12125],{"class":1516},[1117,12446,1188],{"class":1180},[1117,12448,12130],{"class":1191},[1117,12450,1195],{"class":1180},[1117,12452,12135],{"class":1316},[1117,12454,1202],{"class":1180},[1117,12456,12458,12461,12463,12465,12467,12469,12471,12473,12475,12478],{"class":1119,"line":12457},300,[1117,12459,12460],{"class":1134},"    city ",[1117,12462,1195],{"class":1180},[1117,12464,12094],{"class":1134},[1117,12466,1305],{"class":1180},[1117,12468,12125],{"class":1516},[1117,12470,1188],{"class":1180},[1117,12472,12130],{"class":1191},[1117,12474,1195],{"class":1180},[1117,12476,12477],{"class":1316},"100",[1117,12479,1202],{"class":1180},[1117,12481,12483,12486,12488,12490,12492,12494,12496,12498,12500,12503],{"class":1119,"line":12482},301,[1117,12484,12485],{"class":1134},"    state ",[1117,12487,1195],{"class":1180},[1117,12489,12094],{"class":1134},[1117,12491,1305],{"class":1180},[1117,12493,12125],{"class":1516},[1117,12495,1188],{"class":1180},[1117,12497,12130],{"class":1191},[1117,12499,1195],{"class":1180},[1117,12501,12502],{"class":1316},"50",[1117,12504,1202],{"class":1180},[1117,12506,12508,12511,12513,12515,12517,12519,12521,12523,12525,12528],{"class":1119,"line":12507},302,[1117,12509,12510],{"class":1134},"    postal_code ",[1117,12512,1195],{"class":1180},[1117,12514,12094],{"class":1134},[1117,12516,1305],{"class":1180},[1117,12518,12125],{"class":1516},[1117,12520,1188],{"class":1180},[1117,12522,12130],{"class":1191},[1117,12524,1195],{"class":1180},[1117,12526,12527],{"class":1316},"20",[1117,12529,1202],{"class":1180},[1117,12531,12533,12536,12538,12540,12542,12544,12546,12548,12550,12552,12554,12556,12558,12560,12562,12564],{"class":1119,"line":12532},303,[1117,12534,12535],{"class":1134},"    country ",[1117,12537,1195],{"class":1180},[1117,12539,12094],{"class":1134},[1117,12541,1305],{"class":1180},[1117,12543,12125],{"class":1516},[1117,12545,1188],{"class":1180},[1117,12547,12130],{"class":1191},[1117,12549,1195],{"class":1180},[1117,12551,12502],{"class":1316},[1117,12553,1425],{"class":1180},[1117,12555,12203],{"class":1191},[1117,12557,1195],{"class":1180},[1117,12559,1439],{"class":1259},[1117,12561,1775],{"class":1263},[1117,12563,1439],{"class":1259},[1117,12565,1202],{"class":1180},[1117,12567,12569,12572,12574,12576,12578,12580,12582,12584,12586,12589],{"class":1119,"line":12568},304,[1117,12570,12571],{"class":1134},"    is_primary ",[1117,12573,1195],{"class":1180},[1117,12575,12094],{"class":1134},[1117,12577,1305],{"class":1180},[1117,12579,12152],{"class":1516},[1117,12581,1188],{"class":1180},[1117,12583,12157],{"class":1191},[1117,12585,1195],{"class":1180},[1117,12587,12588],{"class":1198},"False",[1117,12590,1202],{"class":1180},[1117,12592,12594,12597,12599,12601,12603,12605,12607,12609,12611,12613],{"class":1119,"line":12593},305,[1117,12595,12596],{"class":1134},"    added_at ",[1117,12598,1195],{"class":1180},[1117,12600,12094],{"class":1134},[1117,12602,1305],{"class":1180},[1117,12604,12332],{"class":1516},[1117,12606,1188],{"class":1180},[1117,12608,12337],{"class":1191},[1117,12610,1195],{"class":1180},[1117,12612,1199],{"class":1198},[1117,12614,1202],{"class":1180},[1117,12616,12618],{"class":1119,"line":12617},306,[1117,12619,1174],{"emptyLinePlaceholder":1173},[1117,12621,12623,12625,12627,12629,12631,12633,12635],{"class":1119,"line":12622},307,[1117,12624,1209],{"class":1208},[1117,12626,10496],{"class":1212},[1117,12628,1188],{"class":1180},[1117,12630,12061],{"class":5906},[1117,12632,1305],{"class":1180},[1117,12634,12066],{"class":5906},[1117,12636,1292],{"class":1180},[1117,12638,12640,12642,12645],{"class":1119,"line":12639},308,[1117,12641,1223],{"class":1222},[1117,12643,12644],{"class":1226},"Django model for order persistence",[1117,12646,1230],{"class":1222},[1117,12648,12650],{"class":1119,"line":12649},309,[1117,12651,1273],{"class":1134},[1117,12653,12655,12658,12660,12662,12664,12666],{"class":1119,"line":12654},310,[1117,12656,12657],{"class":1134},"    customer_id ",[1117,12659,1195],{"class":1180},[1117,12661,12094],{"class":1134},[1117,12663,1305],{"class":1180},[1117,12665,12307],{"class":1516},[1117,12667,2500],{"class":1180},[1117,12669,12671,12674,12676,12678,12680,12682,12684,12686,12688,12690,12692,12694,12696,12698,12700,12702],{"class":1119,"line":12670},311,[1117,12672,12673],{"class":1134},"    status ",[1117,12675,1195],{"class":1180},[1117,12677,12094],{"class":1134},[1117,12679,1305],{"class":1180},[1117,12681,12125],{"class":1516},[1117,12683,1188],{"class":1180},[1117,12685,12130],{"class":1191},[1117,12687,1195],{"class":1180},[1117,12689,12527],{"class":1316},[1117,12691,1425],{"class":1180},[1117,12693,12203],{"class":1191},[1117,12695,1195],{"class":1180},[1117,12697,1439],{"class":1259},[1117,12699,5922],{"class":1263},[1117,12701,1439],{"class":1259},[1117,12703,1202],{"class":1180},[1117,12705,12707,12710,12712,12714,12716,12718,12720,12722,12724,12726,12728,12730,12732,12734,12736,12738,12740,12742],{"class":1119,"line":12706},312,[1117,12708,12709],{"class":1134},"    total ",[1117,12711,1195],{"class":1180},[1117,12713,12094],{"class":1134},[1117,12715,1305],{"class":1180},[1117,12717,12178],{"class":1516},[1117,12719,1188],{"class":1180},[1117,12721,12183],{"class":1191},[1117,12723,1195],{"class":1180},[1117,12725,12188],{"class":1316},[1117,12727,1425],{"class":1180},[1117,12729,12193],{"class":1191},[1117,12731,1195],{"class":1180},[1117,12733,12198],{"class":1316},[1117,12735,1425],{"class":1180},[1117,12737,12203],{"class":1191},[1117,12739,1195],{"class":1180},[1117,12741,12249],{"class":1316},[1117,12743,1202],{"class":1180},[1117,12745,12747,12749,12751,12753,12755,12757,12759,12761,12763,12765],{"class":1119,"line":12746},313,[1117,12748,12323],{"class":1134},[1117,12750,1195],{"class":1180},[1117,12752,12094],{"class":1134},[1117,12754,1305],{"class":1180},[1117,12756,12332],{"class":1516},[1117,12758,1188],{"class":1180},[1117,12760,12337],{"class":1191},[1117,12762,1195],{"class":1180},[1117,12764,1199],{"class":1198},[1117,12766,1202],{"class":1180},[1117,12768,12770,12773,12775,12777,12779,12781,12783,12786,12788,12790,12792,12795,12797,12799],{"class":1119,"line":12769},314,[1117,12771,12772],{"class":1134},"    confirmed_at ",[1117,12774,1195],{"class":1180},[1117,12776,12094],{"class":1134},[1117,12778,1305],{"class":1180},[1117,12780,12332],{"class":1516},[1117,12782,1188],{"class":1180},[1117,12784,12785],{"class":1191},"null",[1117,12787,1195],{"class":1180},[1117,12789,1199],{"class":1198},[1117,12791,1425],{"class":1180},[1117,12793,12794],{"class":1191}," blank",[1117,12796,1195],{"class":1180},[1117,12798,1199],{"class":1198},[1117,12800,1202],{"class":1180},[1117,12802,12804,12807,12809,12811,12813,12815,12817,12819,12821,12823,12825,12827,12829,12831],{"class":1119,"line":12803},315,[1117,12805,12806],{"class":1134},"    tracking_number ",[1117,12808,1195],{"class":1180},[1117,12810,12094],{"class":1134},[1117,12812,1305],{"class":1180},[1117,12814,12125],{"class":1516},[1117,12816,1188],{"class":1180},[1117,12818,12130],{"class":1191},[1117,12820,1195],{"class":1180},[1117,12822,12477],{"class":1316},[1117,12824,1425],{"class":1180},[1117,12826,12794],{"class":1191},[1117,12828,1195],{"class":1180},[1117,12830,1199],{"class":1198},[1117,12832,1202],{"class":1180},[1117,12834,12836],{"class":1119,"line":12835},316,[1117,12837,1174],{"emptyLinePlaceholder":1173},[1117,12839,12841,12843,12846,12848,12850,12852,12854],{"class":1119,"line":12840},317,[1117,12842,1209],{"class":1208},[1117,12844,12845],{"class":1212}," OrderItemModel",[1117,12847,1188],{"class":1180},[1117,12849,12061],{"class":5906},[1117,12851,1305],{"class":1180},[1117,12853,12066],{"class":5906},[1117,12855,1292],{"class":1180},[1117,12857,12859,12861,12864],{"class":1119,"line":12858},318,[1117,12860,1223],{"class":1222},[1117,12862,12863],{"class":1226},"Django model for order items",[1117,12865,1230],{"class":1222},[1117,12867,12869],{"class":1119,"line":12868},319,[1117,12870,1273],{"class":1134},[1117,12872,12874,12877,12879,12881,12883,12885,12887,12890,12892,12894,12896,12898,12900,12902,12904,12906,12908,12910,12912,12914],{"class":1119,"line":12873},320,[1117,12875,12876],{"class":1134},"    order ",[1117,12878,1195],{"class":1180},[1117,12880,12094],{"class":1134},[1117,12882,1305],{"class":1180},[1117,12884,12396],{"class":1516},[1117,12886,1188],{"class":1180},[1117,12888,12889],{"class":1516},"OrderModel",[1117,12891,1425],{"class":1180},[1117,12893,12406],{"class":1191},[1117,12895,1195],{"class":1180},[1117,12897,1439],{"class":1259},[1117,12899,4065],{"class":1263},[1117,12901,1439],{"class":1259},[1117,12903,1425],{"class":1180},[1117,12905,12419],{"class":1191},[1117,12907,1195],{"class":1180},[1117,12909,12061],{"class":1516},[1117,12911,1305],{"class":1180},[1117,12913,12428],{"class":4088},[1117,12915,1202],{"class":1180},[1117,12917,12919,12922,12924,12926,12928,12930],{"class":1119,"line":12918},321,[1117,12920,12921],{"class":1134},"    product_id ",[1117,12923,1195],{"class":1180},[1117,12925,12094],{"class":1134},[1117,12927,1305],{"class":1180},[1117,12929,12307],{"class":1516},[1117,12931,2500],{"class":1180},[1117,12933,12935,12938,12940,12942,12944,12946,12948,12950,12952,12954],{"class":1119,"line":12934},322,[1117,12936,12937],{"class":1134},"    product_name ",[1117,12939,1195],{"class":1180},[1117,12941,12094],{"class":1134},[1117,12943,1305],{"class":1180},[1117,12945,12125],{"class":1516},[1117,12947,1188],{"class":1180},[1117,12949,12130],{"class":1191},[1117,12951,1195],{"class":1180},[1117,12953,12135],{"class":1316},[1117,12955,1202],{"class":1180},[1117,12957,12959,12962,12964,12966,12968,12970,12972,12974,12976,12978,12980,12982,12984,12986],{"class":1119,"line":12958},323,[1117,12960,12961],{"class":1134},"    unit_price ",[1117,12963,1195],{"class":1180},[1117,12965,12094],{"class":1134},[1117,12967,1305],{"class":1180},[1117,12969,12178],{"class":1516},[1117,12971,1188],{"class":1180},[1117,12973,12183],{"class":1191},[1117,12975,1195],{"class":1180},[1117,12977,12188],{"class":1316},[1117,12979,1425],{"class":1180},[1117,12981,12193],{"class":1191},[1117,12983,1195],{"class":1180},[1117,12985,12198],{"class":1316},[1117,12987,1202],{"class":1180},[1117,12989,12991,12994,12996,12998,13000,13002],{"class":1119,"line":12990},324,[1117,12992,12993],{"class":1134},"    quantity ",[1117,12995,1195],{"class":1180},[1117,12997,12094],{"class":1134},[1117,12999,1305],{"class":1180},[1117,13001,12307],{"class":1516},[1117,13003,2500],{"class":1180},[1117,13005,13007],{"class":1119,"line":13006},325,[1117,13008,1174],{"emptyLinePlaceholder":1173},[1117,13010,13012,13014,13017,13019,13021,13023,13025],{"class":1119,"line":13011},326,[1117,13013,1209],{"class":1208},[1117,13015,13016],{"class":1212}," OrderShippingAddressModel",[1117,13018,1188],{"class":1180},[1117,13020,12061],{"class":5906},[1117,13022,1305],{"class":1180},[1117,13024,12066],{"class":5906},[1117,13026,1292],{"class":1180},[1117,13028,13030,13032,13035],{"class":1119,"line":13029},327,[1117,13031,1223],{"class":1222},[1117,13033,13034],{"class":1226},"Django model for order shipping address",[1117,13036,1230],{"class":1222},[1117,13038,13040],{"class":1119,"line":13039},328,[1117,13041,1273],{"class":1134},[1117,13043,13045,13047,13049,13051,13053,13056,13058,13060,13062,13064,13066,13068,13070,13072,13074,13076,13078,13080,13082,13084],{"class":1119,"line":13044},329,[1117,13046,12876],{"class":1134},[1117,13048,1195],{"class":1180},[1117,13050,12094],{"class":1134},[1117,13052,1305],{"class":1180},[1117,13054,13055],{"class":1516},"OneToOneField",[1117,13057,1188],{"class":1180},[1117,13059,12889],{"class":1516},[1117,13061,1425],{"class":1180},[1117,13063,12406],{"class":1191},[1117,13065,1195],{"class":1180},[1117,13067,1439],{"class":1259},[1117,13069,4125],{"class":1263},[1117,13071,1439],{"class":1259},[1117,13073,1425],{"class":1180},[1117,13075,12419],{"class":1191},[1117,13077,1195],{"class":1180},[1117,13079,12061],{"class":1516},[1117,13081,1305],{"class":1180},[1117,13083,12428],{"class":4088},[1117,13085,1202],{"class":1180},[1117,13087,13089,13091,13093,13095,13097,13099,13101,13103,13105,13107],{"class":1119,"line":13088},330,[1117,13090,12436],{"class":1134},[1117,13092,1195],{"class":1180},[1117,13094,12094],{"class":1134},[1117,13096,1305],{"class":1180},[1117,13098,12125],{"class":1516},[1117,13100,1188],{"class":1180},[1117,13102,12130],{"class":1191},[1117,13104,1195],{"class":1180},[1117,13106,12135],{"class":1316},[1117,13108,1202],{"class":1180},[1117,13110,13112,13114,13116,13118,13120,13122,13124,13126,13128,13130],{"class":1119,"line":13111},331,[1117,13113,12460],{"class":1134},[1117,13115,1195],{"class":1180},[1117,13117,12094],{"class":1134},[1117,13119,1305],{"class":1180},[1117,13121,12125],{"class":1516},[1117,13123,1188],{"class":1180},[1117,13125,12130],{"class":1191},[1117,13127,1195],{"class":1180},[1117,13129,12477],{"class":1316},[1117,13131,1202],{"class":1180},[1117,13133,13135,13137,13139,13141,13143,13145,13147,13149,13151,13153],{"class":1119,"line":13134},332,[1117,13136,12485],{"class":1134},[1117,13138,1195],{"class":1180},[1117,13140,12094],{"class":1134},[1117,13142,1305],{"class":1180},[1117,13144,12125],{"class":1516},[1117,13146,1188],{"class":1180},[1117,13148,12130],{"class":1191},[1117,13150,1195],{"class":1180},[1117,13152,12502],{"class":1316},[1117,13154,1202],{"class":1180},[1117,13156,13158,13160,13162,13164,13166,13168,13170,13172,13174,13176],{"class":1119,"line":13157},333,[1117,13159,12510],{"class":1134},[1117,13161,1195],{"class":1180},[1117,13163,12094],{"class":1134},[1117,13165,1305],{"class":1180},[1117,13167,12125],{"class":1516},[1117,13169,1188],{"class":1180},[1117,13171,12130],{"class":1191},[1117,13173,1195],{"class":1180},[1117,13175,12527],{"class":1316},[1117,13177,1202],{"class":1180},[1117,13179,13181,13183,13185,13187,13189,13191,13193,13195,13197,13199,13201,13203,13205,13207,13209,13211],{"class":1119,"line":13180},334,[1117,13182,12535],{"class":1134},[1117,13184,1195],{"class":1180},[1117,13186,12094],{"class":1134},[1117,13188,1305],{"class":1180},[1117,13190,12125],{"class":1516},[1117,13192,1188],{"class":1180},[1117,13194,12130],{"class":1191},[1117,13196,1195],{"class":1180},[1117,13198,12502],{"class":1316},[1117,13200,1425],{"class":1180},[1117,13202,12203],{"class":1191},[1117,13204,1195],{"class":1180},[1117,13206,1439],{"class":1259},[1117,13208,1775],{"class":1263},[1117,13210,1439],{"class":1259},[1117,13212,1202],{"class":1180},[1030,13214,13216],{"id":13215},"application-services-use-case-orchestration","Application Services - Use Case Orchestration",[1026,13218,13219],{},"Application services orchestrate domain objects and services to implement specific use cases. They handle transaction boundaries and coordinate between different aggregates.",[1107,13221,13223],{"className":1109,"code":13222,"language":1111,"meta":1112,"style":1112},"# Application Service Layer\nclass OrderApplicationService:\n    \"\"\"Application service for order use cases\"\"\"\n    \n    def __init__(self,\n                 order_repo: OrderRepository,\n                 customer_repo: CustomerRepository,\n                 product_repo: ProductRepository,\n                 pricing_service: PricingService,\n                 inventory_service: InventoryService,\n                 fulfillment_service: OrderFulfillmentService):\n        self.order_repo = order_repo\n        self.customer_repo = customer_repo\n        self.product_repo = product_repo\n        self.pricing_service = pricing_service\n        self.inventory_service = inventory_service\n        self.fulfillment_service = fulfillment_service\n    \n    @transaction.atomic\n    def place_order(self, customer_id: int, items: List[dict], shipping_address: Address) -> int:\n        \"\"\"Place order use case\"\"\"\n        # Load customer\n        customer = self.customer_repo.get_by_id(customer_id)\n        if not customer:\n            raise ValueError(\"Customer not found\")\n        \n        if not customer.is_active:\n            raise BusinessRuleError(\"Customer account is not active\")\n        \n        # Create order\n        order = Order(self._generate_order_id(), customer_id)\n        order.set_shipping_address(shipping_address)\n        \n        # Add items to order\n        for item_data in items:\n            product = self.product_repo.get_by_id(item_data['product_id'])\n            if not product:\n                raise ValueError(f\"Product {item_data['product_id']} not found\")\n            \n            order.add_item(product, item_data['quantity'])\n        \n        # Calculate total with pricing service\n        total = self.pricing_service.calculate_order_total(order, customer)\n        \n        # Check customer credit limit\n        if not customer.can_make_purchase(total):\n            raise BusinessRuleError(\"Order exceeds customer credit limit\")\n        \n        # Confirm order\n        order.confirm()\n        \n        # Save order\n        saved_order = self.order_repo.save(order)\n        \n        # Update customer balance\n        customer.make_purchase(total)\n        self.customer_repo.save(customer)\n        \n        # Process domain events\n        self._process_domain_events()\n        \n        return saved_order.id\n    \n    @transaction.atomic\n    def cancel_order(self, order_id: int, reason: str) -> None:\n        \"\"\"Cancel order use case\"\"\"\n        order = self.order_repo.get_by_id(order_id)\n        if not order:\n            raise ValueError(\"Order not found\")\n        \n        # Cancel order\n        order.cancel()\n        \n        # Release inventory\n        self.inventory_service.release_items_for_order(order)\n        \n        # Save order\n        self.order_repo.save(order)\n        \n        # Process domain events\n        self._process_domain_events()\n    \n    def _generate_order_id(self) -> int:\n        \"\"\"Generate unique order ID\"\"\"\n        import random\n        return random.randint(100000, 999999)\n    \n    def _process_domain_events(self):\n        \"\"\"Process raised domain events\"\"\"\n        events = DomainEvents.get_events()\n        \n        for event in events:\n            # Handle each event type\n            if isinstance(event, OrderConfirmedEvent):\n                self._handle_order_confirmed(event)\n            elif isinstance(event, OrderCancelledEvent):\n                self._handle_order_cancelled(event)\n            elif isinstance(event, OrderShippedEvent):\n                self._handle_order_shipped(event)\n        \n        DomainEvents.clear_events()\n    \n    def _handle_order_confirmed(self, event: OrderConfirmedEvent):\n        \"\"\"Handle order confirmed event\"\"\"\n        # Send confirmation email, update analytics, etc.\n        pass\n    \n    def _handle_order_cancelled(self, event: OrderCancelledEvent):\n        \"\"\"Handle order cancelled event\"\"\"\n        # Send cancellation email, update analytics, etc.\n        pass\n    \n    def _handle_order_shipped(self, event: OrderShippedEvent):\n        \"\"\"Handle order shipped event\"\"\"\n        # Send shipping notification, update tracking, etc.\n        pass\n",[1114,13224,13225,13230,13239,13248,13252,13264,13275,13286,13297,13308,13318,13329,13343,13357,13369,13383,13395,13409,13413,13425,13476,13485,13490,13512,13522,13539,13543,13557,13574,13578,13583,13607,13622,13626,13631,13644,13676,13686,13721,13725,13753,13757,13762,13790,13794,13799,13817,13834,13838,13843,13854,13858,13863,13886,13890,13895,13910,13928,13932,13937,13948,13952,13963,13967,13977,14013,14022,14044,14054,14071,14075,14080,14091,14095,14100,14118,14122,14126,14144,14148,14152,14162,14166,14185,14194,14201,14225,14229,14242,14251,14267,14271,14285,14290,14307,14322,14339,14354,14370,14385,14389,14400,14404,14425,14434,14439,14443,14447,14468,14477,14482,14486,14490,14511,14520,14525],{"__ignoreMap":1112},[1117,13226,13227],{"class":1119,"line":1120},[1117,13228,13229],{"class":1123},"# Application Service Layer\n",[1117,13231,13232,13234,13237],{"class":1119,"line":1127},[1117,13233,1209],{"class":1208},[1117,13235,13236],{"class":1212}," OrderApplicationService",[1117,13238,1216],{"class":1180},[1117,13240,13241,13243,13246],{"class":1119,"line":1144},[1117,13242,1223],{"class":1222},[1117,13244,13245],{"class":1226},"Application service for order use cases",[1117,13247,1230],{"class":1222},[1117,13249,13250],{"class":1119,"line":1157},[1117,13251,1273],{"class":1134},[1117,13253,13254,13256,13258,13260,13262],{"class":1119,"line":1170},[1117,13255,1279],{"class":1208},[1117,13257,2368],{"class":1367},[1117,13259,1188],{"class":1180},[1117,13261,1289],{"class":1288},[1117,13263,2709],{"class":1180},[1117,13265,13266,13269,13271,13273],{"class":1119,"line":1177},[1117,13267,13268],{"class":1428},"                 order_repo",[1117,13270,1239],{"class":1180},[1117,13272,8665],{"class":1134},[1117,13274,2709],{"class":1180},[1117,13276,13277,13280,13282,13284],{"class":1119,"line":1205},[1117,13278,13279],{"class":1428},"                 customer_repo",[1117,13281,1239],{"class":1180},[1117,13283,8467],{"class":1134},[1117,13285,2709],{"class":1180},[1117,13287,13288,13291,13293,13295],{"class":1119,"line":1219},[1117,13289,13290],{"class":1428},"                 product_repo",[1117,13292,1239],{"class":1180},[1117,13294,8858],{"class":1134},[1117,13296,2709],{"class":1180},[1117,13298,13299,13302,13304,13306],{"class":1119,"line":1233},[1117,13300,13301],{"class":1428},"                 pricing_service",[1117,13303,1239],{"class":1180},[1117,13305,6656],{"class":1134},[1117,13307,2709],{"class":1180},[1117,13309,13310,13312,13314,13316],{"class":1119,"line":1244},[1117,13311,7997],{"class":1428},[1117,13313,1239],{"class":1180},[1117,13315,7469],{"class":1134},[1117,13317,2709],{"class":1180},[1117,13319,13320,13323,13325,13327],{"class":1119,"line":1270},[1117,13321,13322],{"class":1428},"                 fulfillment_service",[1117,13324,1239],{"class":1180},[1117,13326,7947],{"class":1134},[1117,13328,1292],{"class":1180},[1117,13330,13331,13333,13335,13338,13340],{"class":1119,"line":1276},[1117,13332,2407],{"class":1301},[1117,13334,1305],{"class":1180},[1117,13336,13337],{"class":1308},"order_repo",[1117,13339,1256],{"class":1180},[1117,13341,13342],{"class":1134}," order_repo\n",[1117,13344,13345,13347,13349,13352,13354],{"class":1119,"line":1295},[1117,13346,2407],{"class":1301},[1117,13348,1305],{"class":1180},[1117,13350,13351],{"class":1308},"customer_repo",[1117,13353,1256],{"class":1180},[1117,13355,13356],{"class":1134}," customer_repo\n",[1117,13358,13359,13361,13363,13365,13367],{"class":1119,"line":1322},[1117,13360,2407],{"class":1301},[1117,13362,1305],{"class":1180},[1117,13364,7519],{"class":1308},[1117,13366,1256],{"class":1180},[1117,13368,7524],{"class":1134},[1117,13370,13371,13373,13375,13378,13380],{"class":1119,"line":1343},[1117,13372,2407],{"class":1301},[1117,13374,1305],{"class":1180},[1117,13376,13377],{"class":1308},"pricing_service",[1117,13379,1256],{"class":1180},[1117,13381,13382],{"class":1134}," pricing_service\n",[1117,13384,13385,13387,13389,13391,13393],{"class":1119,"line":1349},[1117,13386,2407],{"class":1301},[1117,13388,1305],{"class":1180},[1117,13390,8042],{"class":1308},[1117,13392,1256],{"class":1180},[1117,13394,8047],{"class":1134},[1117,13396,13397,13399,13401,13404,13406],{"class":1119,"line":1390},[1117,13398,2407],{"class":1301},[1117,13400,1305],{"class":1180},[1117,13402,13403],{"class":1308},"fulfillment_service",[1117,13405,1256],{"class":1180},[1117,13407,13408],{"class":1134}," fulfillment_service\n",[1117,13410,13411],{"class":1119,"line":1408},[1117,13412,1273],{"class":1134},[1117,13414,13415,13417,13420,13422],{"class":1119,"line":1413},[1117,13416,6459],{"class":1180},[1117,13418,13419],{"class":1184},"transaction",[1117,13421,1305],{"class":1180},[1117,13423,13424],{"class":1184},"atomic\n",[1117,13426,13427,13429,13432,13434,13436,13438,13440,13442,13444,13446,13449,13451,13453,13455,13458,13461,13464,13466,13468,13470,13472,13474],{"class":1119,"line":1455},[1117,13428,1279],{"class":1208},[1117,13430,13431],{"class":1184}," place_order",[1117,13433,1188],{"class":1180},[1117,13435,1289],{"class":1288},[1117,13437,1425],{"class":1180},[1117,13439,2377],{"class":1428},[1117,13441,1239],{"class":1180},[1117,13443,2382],{"class":1252},[1117,13445,1425],{"class":1180},[1117,13447,13448],{"class":1428}," items",[1117,13450,1239],{"class":1180},[1117,13452,8452],{"class":1134},[1117,13454,2182],{"class":1180},[1117,13456,13457],{"class":1252},"dict",[1117,13459,13460],{"class":1180},"],",[1117,13462,13463],{"class":1428}," shipping_address",[1117,13465,1239],{"class":1180},[1117,13467,1705],{"class":1134},[1117,13469,1379],{"class":1180},[1117,13471,1444],{"class":1180},[1117,13473,2382],{"class":1252},[1117,13475,1216],{"class":1180},[1117,13477,13478,13480,13483],{"class":1119,"line":1466},[1117,13479,1458],{"class":1222},[1117,13481,13482],{"class":1226},"Place order use case",[1117,13484,1230],{"class":1222},[1117,13486,13487],{"class":1119,"line":1487},[1117,13488,13489],{"class":1123},"        # Load customer\n",[1117,13491,13492,13494,13496,13498,13500,13502,13504,13506,13508,13510],{"class":1119,"line":1505},[1117,13493,9845],{"class":1134},[1117,13495,1195],{"class":1180},[1117,13497,1302],{"class":1301},[1117,13499,1305],{"class":1180},[1117,13501,13351],{"class":1308},[1117,13503,1305],{"class":1180},[1117,13505,7603],{"class":1516},[1117,13507,1188],{"class":1180},[1117,13509,4052],{"class":1516},[1117,13511,1202],{"class":1180},[1117,13513,13514,13516,13518,13520],{"class":1119,"line":1510},[1117,13515,1298],{"class":1130},[1117,13517,1354],{"class":1312},[1117,13519,6739],{"class":1134},[1117,13521,1216],{"class":1180},[1117,13523,13524,13526,13528,13530,13532,13535,13537],{"class":1119,"line":1546},[1117,13525,1325],{"class":1130},[1117,13527,1328],{"class":1252},[1117,13529,1188],{"class":1180},[1117,13531,1333],{"class":1259},[1117,13533,13534],{"class":1263},"Customer not found",[1117,13536,1333],{"class":1259},[1117,13538,1202],{"class":1180},[1117,13540,13541],{"class":1119,"line":1551},[1117,13542,1346],{"class":1134},[1117,13544,13545,13547,13549,13551,13553,13555],{"class":1119,"line":1585},[1117,13546,1298],{"class":1130},[1117,13548,1354],{"class":1312},[1117,13550,6739],{"class":1134},[1117,13552,1305],{"class":1180},[1117,13554,2472],{"class":1308},[1117,13556,1216],{"class":1180},[1117,13558,13559,13561,13563,13565,13567,13570,13572],{"class":1119,"line":1595},[1117,13560,1325],{"class":1130},[1117,13562,3072],{"class":1516},[1117,13564,1188],{"class":1180},[1117,13566,1333],{"class":1259},[1117,13568,13569],{"class":1263},"Customer account is not active",[1117,13571,1333],{"class":1259},[1117,13573,1202],{"class":1180},[1117,13575,13576],{"class":1119,"line":1625},[1117,13577,1346],{"class":1134},[1117,13579,13580],{"class":1119,"line":1630},[1117,13581,13582],{"class":1123},"        # Create order\n",[1117,13584,13585,13587,13589,13591,13593,13595,13597,13600,13603,13605],{"class":1119,"line":1651},[1117,13586,11248],{"class":1134},[1117,13588,1195],{"class":1180},[1117,13590,3986],{"class":1516},[1117,13592,1188],{"class":1180},[1117,13594,1289],{"class":1301},[1117,13596,1305],{"class":1180},[1117,13598,13599],{"class":1516},"_generate_order_id",[1117,13601,13602],{"class":1180},"(),",[1117,13604,2377],{"class":1516},[1117,13606,1202],{"class":1180},[1117,13608,13609,13611,13613,13616,13618,13620],{"class":1119,"line":1661},[1117,13610,11276],{"class":1134},[1117,13612,1305],{"class":1180},[1117,13614,13615],{"class":1516},"set_shipping_address",[1117,13617,1188],{"class":1180},[1117,13619,4125],{"class":1516},[1117,13621,1202],{"class":1180},[1117,13623,13624],{"class":1119,"line":1678},[1117,13625,1346],{"class":1134},[1117,13627,13628],{"class":1119,"line":1683},[1117,13629,13630],{"class":1123},"        # Add items to order\n",[1117,13632,13633,13635,13638,13640,13642],{"class":1119,"line":1700},[1117,13634,2797],{"class":1130},[1117,13636,13637],{"class":1134}," item_data ",[1117,13639,2639],{"class":1130},[1117,13641,13448],{"class":1134},[1117,13643,1216],{"class":1180},[1117,13645,13646,13648,13650,13652,13654,13656,13658,13660,13662,13665,13667,13669,13671,13673],{"class":1119,"line":1710},[1117,13647,7590],{"class":1134},[1117,13649,1195],{"class":1180},[1117,13651,1302],{"class":1301},[1117,13653,1305],{"class":1180},[1117,13655,7519],{"class":1308},[1117,13657,1305],{"class":1180},[1117,13659,7603],{"class":1516},[1117,13661,1188],{"class":1180},[1117,13663,13664],{"class":1516},"item_data",[1117,13666,2182],{"class":1180},[1117,13668,1439],{"class":1259},[1117,13670,4605],{"class":1263},[1117,13672,1439],{"class":1259},[1117,13674,13675],{"class":1180},"])\n",[1117,13677,13678,13680,13682,13684],{"class":1119,"line":1720},[1117,13679,2815],{"class":1130},[1117,13681,1354],{"class":1312},[1117,13683,4180],{"class":1134},[1117,13685,1216],{"class":1180},[1117,13687,13688,13691,13693,13695,13697,13700,13702,13704,13706,13708,13710,13712,13714,13716,13719],{"class":1119,"line":1731},[1117,13689,13690],{"class":1130},"                raise",[1117,13692,1328],{"class":1252},[1117,13694,1188],{"class":1180},[1117,13696,2088],{"class":1208},[1117,13698,13699],{"class":1263},"\"Product ",[1117,13701,2095],{"class":2094},[1117,13703,13664],{"class":1516},[1117,13705,2182],{"class":1180},[1117,13707,1439],{"class":1259},[1117,13709,4605],{"class":1263},[1117,13711,1439],{"class":1259},[1117,13713,2189],{"class":1180},[1117,13715,2104],{"class":2094},[1117,13717,13718],{"class":1263}," not found\"",[1117,13720,1202],{"class":1180},[1117,13722,13723],{"class":1119,"line":1741},[1117,13724,8254],{"class":1134},[1117,13726,13727,13729,13731,13734,13736,13738,13740,13743,13745,13747,13749,13751],{"class":1119,"line":1751},[1117,13728,8264],{"class":1134},[1117,13730,1305],{"class":1180},[1117,13732,13733],{"class":1516},"add_item",[1117,13735,1188],{"class":1180},[1117,13737,4349],{"class":1516},[1117,13739,1425],{"class":1180},[1117,13741,13742],{"class":1516}," item_data",[1117,13744,2182],{"class":1180},[1117,13746,1439],{"class":1259},[1117,13748,4379],{"class":1263},[1117,13750,1439],{"class":1259},[1117,13752,13675],{"class":1180},[1117,13754,13755],{"class":1119,"line":1761},[1117,13756,1346],{"class":1134},[1117,13758,13759],{"class":1119,"line":1780},[1117,13760,13761],{"class":1123},"        # Calculate total with pricing service\n",[1117,13763,13764,13767,13769,13771,13773,13775,13777,13780,13782,13784,13786,13788],{"class":1119,"line":1785},[1117,13765,13766],{"class":1134},"        total ",[1117,13768,1195],{"class":1180},[1117,13770,1302],{"class":1301},[1117,13772,1305],{"class":1180},[1117,13774,13377],{"class":1308},[1117,13776,1305],{"class":1180},[1117,13778,13779],{"class":1516},"calculate_order_total",[1117,13781,1188],{"class":1180},[1117,13783,6129],{"class":1516},[1117,13785,1425],{"class":1180},[1117,13787,6739],{"class":1516},[1117,13789,1202],{"class":1180},[1117,13791,13792],{"class":1119,"line":1798},[1117,13793,1346],{"class":1134},[1117,13795,13796],{"class":1119,"line":1848},[1117,13797,13798],{"class":1123},"        # Check customer credit limit\n",[1117,13800,13801,13803,13805,13807,13809,13811,13813,13815],{"class":1119,"line":1866},[1117,13802,1298],{"class":1130},[1117,13804,1354],{"class":1312},[1117,13806,6739],{"class":1134},[1117,13808,1305],{"class":1180},[1117,13810,3286],{"class":1516},[1117,13812,1188],{"class":1180},[1117,13814,4098],{"class":1516},[1117,13816,1292],{"class":1180},[1117,13818,13819,13821,13823,13825,13827,13830,13832],{"class":1119,"line":1871},[1117,13820,1325],{"class":1130},[1117,13822,3072],{"class":1516},[1117,13824,1188],{"class":1180},[1117,13826,1333],{"class":1259},[1117,13828,13829],{"class":1263},"Order exceeds customer credit limit",[1117,13831,1333],{"class":1259},[1117,13833,1202],{"class":1180},[1117,13835,13836],{"class":1119,"line":1904},[1117,13837,1346],{"class":1134},[1117,13839,13840],{"class":1119,"line":1914},[1117,13841,13842],{"class":1123},"        # Confirm order\n",[1117,13844,13845,13847,13849,13852],{"class":1119,"line":1942},[1117,13846,11276],{"class":1134},[1117,13848,1305],{"class":1180},[1117,13850,13851],{"class":1516},"confirm",[1117,13853,2500],{"class":1180},[1117,13855,13856],{"class":1119,"line":1964},[1117,13857,1346],{"class":1134},[1117,13859,13860],{"class":1119,"line":1984},[1117,13861,13862],{"class":1123},"        # Save order\n",[1117,13864,13865,13868,13870,13872,13874,13876,13878,13880,13882,13884],{"class":1119,"line":1989},[1117,13866,13867],{"class":1134},"        saved_order ",[1117,13869,1195],{"class":1180},[1117,13871,1302],{"class":1301},[1117,13873,1305],{"class":1180},[1117,13875,13337],{"class":1308},[1117,13877,1305],{"class":1180},[1117,13879,7730],{"class":1516},[1117,13881,1188],{"class":1180},[1117,13883,6129],{"class":1516},[1117,13885,1202],{"class":1180},[1117,13887,13888],{"class":1119,"line":2006},[1117,13889,1346],{"class":1134},[1117,13891,13892],{"class":1119,"line":2016},[1117,13893,13894],{"class":1123},"        # Update customer balance\n",[1117,13896,13897,13899,13901,13904,13906,13908],{"class":1119,"line":2026},[1117,13898,9913],{"class":1134},[1117,13900,1305],{"class":1180},[1117,13902,13903],{"class":1516},"make_purchase",[1117,13905,1188],{"class":1180},[1117,13907,4098],{"class":1516},[1117,13909,1202],{"class":1180},[1117,13911,13912,13914,13916,13918,13920,13922,13924,13926],{"class":1119,"line":2036},[1117,13913,2407],{"class":1301},[1117,13915,1305],{"class":1180},[1117,13917,13351],{"class":1308},[1117,13919,1305],{"class":1180},[1117,13921,7730],{"class":1516},[1117,13923,1188],{"class":1180},[1117,13925,6839],{"class":1516},[1117,13927,1202],{"class":1180},[1117,13929,13930],{"class":1119,"line":2041},[1117,13931,1346],{"class":1134},[1117,13933,13934],{"class":1119,"line":2054},[1117,13935,13936],{"class":1123},"        # Process domain events\n",[1117,13938,13939,13941,13943,13946],{"class":1119,"line":2079},[1117,13940,2407],{"class":1301},[1117,13942,1305],{"class":1180},[1117,13944,13945],{"class":1516},"_process_domain_events",[1117,13947,2500],{"class":1180},[1117,13949,13950],{"class":1119,"line":2111},[1117,13951,1346],{"class":1134},[1117,13953,13954,13956,13959,13961],{"class":1119,"line":2116},[1117,13955,1513],{"class":1130},[1117,13957,13958],{"class":1134}," saved_order",[1117,13960,1305],{"class":1180},[1117,13962,6149],{"class":1308},[1117,13964,13965],{"class":1119,"line":2145},[1117,13966,1273],{"class":1134},[1117,13968,13969,13971,13973,13975],{"class":1119,"line":2155},[1117,13970,6459],{"class":1180},[1117,13972,13419],{"class":1184},[1117,13974,1305],{"class":1180},[1117,13976,13424],{"class":1184},[1117,13978,13979,13981,13984,13986,13988,13990,13992,13994,13996,13998,14001,14003,14005,14007,14009,14011],{"class":1119,"line":2164},[1117,13980,1279],{"class":1208},[1117,13982,13983],{"class":1184}," cancel_order",[1117,13985,1188],{"class":1180},[1117,13987,1289],{"class":1288},[1117,13989,1425],{"class":1180},[1117,13991,4016],{"class":1428},[1117,13993,1239],{"class":1180},[1117,13995,2382],{"class":1252},[1117,13997,1425],{"class":1180},[1117,13999,14000],{"class":1428}," reason",[1117,14002,1239],{"class":1180},[1117,14004,1253],{"class":1252},[1117,14006,1379],{"class":1180},[1117,14008,1444],{"class":1180},[1117,14010,5438],{"class":1198},[1117,14012,1216],{"class":1180},[1117,14014,14015,14017,14020],{"class":1119,"line":2227},[1117,14016,1458],{"class":1222},[1117,14018,14019],{"class":1226},"Cancel order use case",[1117,14021,1230],{"class":1222},[1117,14023,14024,14026,14028,14030,14032,14034,14036,14038,14040,14042],{"class":1119,"line":2259},[1117,14025,11248],{"class":1134},[1117,14027,1195],{"class":1180},[1117,14029,1302],{"class":1301},[1117,14031,1305],{"class":1180},[1117,14033,13337],{"class":1308},[1117,14035,1305],{"class":1180},[1117,14037,7603],{"class":1516},[1117,14039,1188],{"class":1180},[1117,14041,6140],{"class":1516},[1117,14043,1202],{"class":1180},[1117,14045,14046,14048,14050,14052],{"class":1119,"line":2264},[1117,14047,1298],{"class":1130},[1117,14049,1354],{"class":1312},[1117,14051,6108],{"class":1134},[1117,14053,1216],{"class":1180},[1117,14055,14056,14058,14060,14062,14064,14067,14069],{"class":1119,"line":2284},[1117,14057,1325],{"class":1130},[1117,14059,1328],{"class":1252},[1117,14061,1188],{"class":1180},[1117,14063,1333],{"class":1259},[1117,14065,14066],{"class":1263},"Order not found",[1117,14068,1333],{"class":1259},[1117,14070,1202],{"class":1180},[1117,14072,14073],{"class":1119,"line":2294},[1117,14074,1346],{"class":1134},[1117,14076,14077],{"class":1119,"line":2327},[1117,14078,14079],{"class":1123},"        # Cancel order\n",[1117,14081,14082,14084,14086,14089],{"class":1119,"line":2332},[1117,14083,11276],{"class":1134},[1117,14085,1305],{"class":1180},[1117,14087,14088],{"class":1516},"cancel",[1117,14090,2500],{"class":1180},[1117,14092,14093],{"class":1119,"line":2338},[1117,14094,1346],{"class":1134},[1117,14096,14097],{"class":1119,"line":2348},[1117,14098,14099],{"class":1123},"        # Release inventory\n",[1117,14101,14102,14104,14106,14108,14110,14112,14114,14116],{"class":1119,"line":2358},[1117,14103,2407],{"class":1301},[1117,14105,1305],{"class":1180},[1117,14107,8042],{"class":1308},[1117,14109,1305],{"class":1180},[1117,14111,8376],{"class":1516},[1117,14113,1188],{"class":1180},[1117,14115,6129],{"class":1516},[1117,14117,1202],{"class":1180},[1117,14119,14120],{"class":1119,"line":2363},[1117,14121,1346],{"class":1134},[1117,14123,14124],{"class":1119,"line":2404},[1117,14125,13862],{"class":1123},[1117,14127,14128,14130,14132,14134,14136,14138,14140,14142],{"class":1119,"line":2420},[1117,14129,2407],{"class":1301},[1117,14131,1305],{"class":1180},[1117,14133,13337],{"class":1308},[1117,14135,1305],{"class":1180},[1117,14137,7730],{"class":1516},[1117,14139,1188],{"class":1180},[1117,14141,6129],{"class":1516},[1117,14143,1202],{"class":1180},[1117,14145,14146],{"class":1119,"line":2435},[1117,14147,1346],{"class":1134},[1117,14149,14150],{"class":1119,"line":2450},[1117,14151,13936],{"class":1123},[1117,14153,14154,14156,14158,14160],{"class":1119,"line":2465},[1117,14155,2407],{"class":1301},[1117,14157,1305],{"class":1180},[1117,14159,13945],{"class":1516},[1117,14161,2500],{"class":1180},[1117,14163,14164],{"class":1119,"line":2480},[1117,14165,1273],{"class":1134},[1117,14167,14168,14170,14173,14175,14177,14179,14181,14183],{"class":1119,"line":2503},[1117,14169,1279],{"class":1208},[1117,14171,14172],{"class":1184}," _generate_order_id",[1117,14174,1188],{"class":1180},[1117,14176,1289],{"class":1288},[1117,14178,1379],{"class":1180},[1117,14180,1444],{"class":1180},[1117,14182,2382],{"class":1252},[1117,14184,1216],{"class":1180},[1117,14186,14187,14189,14192],{"class":1119,"line":2534},[1117,14188,1458],{"class":1222},[1117,14190,14191],{"class":1226},"Generate unique order ID",[1117,14193,1230],{"class":1222},[1117,14195,14196,14198],{"class":1119,"line":2563},[1117,14197,2158],{"class":1130},[1117,14199,14200],{"class":1134}," random\n",[1117,14202,14203,14205,14208,14210,14213,14215,14218,14220,14223],{"class":1119,"line":2568},[1117,14204,1513],{"class":1130},[1117,14206,14207],{"class":1134}," random",[1117,14209,1305],{"class":1180},[1117,14211,14212],{"class":1516},"randint",[1117,14214,1188],{"class":1180},[1117,14216,14217],{"class":1316},"100000",[1117,14219,1425],{"class":1180},[1117,14221,14222],{"class":1316}," 999999",[1117,14224,1202],{"class":1180},[1117,14226,14227],{"class":1119,"line":2605},[1117,14228,1273],{"class":1134},[1117,14230,14231,14233,14236,14238,14240],{"class":1119,"line":2615},[1117,14232,1279],{"class":1208},[1117,14234,14235],{"class":1184}," _process_domain_events",[1117,14237,1188],{"class":1180},[1117,14239,1289],{"class":1288},[1117,14241,1292],{"class":1180},[1117,14243,14244,14246,14249],{"class":1119,"line":2624},[1117,14245,1458],{"class":1222},[1117,14247,14248],{"class":1226},"Process raised domain events",[1117,14250,1230],{"class":1222},[1117,14252,14253,14256,14258,14260,14262,14265],{"class":1119,"line":2630},[1117,14254,14255],{"class":1134},"        events ",[1117,14257,1195],{"class":1180},[1117,14259,6421],{"class":1134},[1117,14261,1305],{"class":1180},[1117,14263,14264],{"class":1516},"get_events",[1117,14266,2500],{"class":1180},[1117,14268,14269],{"class":1119,"line":2650},[1117,14270,1346],{"class":1134},[1117,14272,14273,14275,14278,14280,14283],{"class":1119,"line":2672},[1117,14274,2797],{"class":1130},[1117,14276,14277],{"class":1134}," event ",[1117,14279,2639],{"class":1130},[1117,14281,14282],{"class":1134}," events",[1117,14284,1216],{"class":1180},[1117,14286,14287],{"class":1119,"line":2677},[1117,14288,14289],{"class":1123},"            # Handle each event type\n",[1117,14291,14292,14294,14297,14299,14301,14303,14305],{"class":1119,"line":2694},[1117,14293,2815],{"class":1130},[1117,14295,14296],{"class":1367}," isinstance",[1117,14298,1188],{"class":1180},[1117,14300,6516],{"class":1516},[1117,14302,1425],{"class":1180},[1117,14304,6073],{"class":1516},[1117,14306,1292],{"class":1180},[1117,14308,14309,14311,14313,14316,14318,14320],{"class":1119,"line":2712},[1117,14310,1945],{"class":1301},[1117,14312,1305],{"class":1180},[1117,14314,14315],{"class":1516},"_handle_order_confirmed",[1117,14317,1188],{"class":1180},[1117,14319,6516],{"class":1516},[1117,14321,1202],{"class":1180},[1117,14323,14324,14327,14329,14331,14333,14335,14337],{"class":1119,"line":2727},[1117,14325,14326],{"class":1130},"            elif",[1117,14328,14296],{"class":1367},[1117,14330,1188],{"class":1180},[1117,14332,6516],{"class":1516},[1117,14334,1425],{"class":1180},[1117,14336,6194],{"class":1516},[1117,14338,1292],{"class":1180},[1117,14340,14341,14343,14345,14348,14350,14352],{"class":1119,"line":2747},[1117,14342,1945],{"class":1301},[1117,14344,1305],{"class":1180},[1117,14346,14347],{"class":1516},"_handle_order_cancelled",[1117,14349,1188],{"class":1180},[1117,14351,6516],{"class":1516},[1117,14353,1202],{"class":1180},[1117,14355,14356,14358,14360,14362,14364,14366,14368],{"class":1119,"line":2753},[1117,14357,14326],{"class":1130},[1117,14359,14296],{"class":1367},[1117,14361,1188],{"class":1180},[1117,14363,6516],{"class":1516},[1117,14365,1425],{"class":1180},[1117,14367,6290],{"class":1516},[1117,14369,1292],{"class":1180},[1117,14371,14372,14374,14376,14379,14381,14383],{"class":1119,"line":2758},[1117,14373,1945],{"class":1301},[1117,14375,1305],{"class":1180},[1117,14377,14378],{"class":1516},"_handle_order_shipped",[1117,14380,1188],{"class":1180},[1117,14382,6516],{"class":1516},[1117,14384,1202],{"class":1180},[1117,14386,14387],{"class":1119,"line":2784},[1117,14388,1346],{"class":1134},[1117,14390,14391,14393,14395,14398],{"class":1119,"line":2794},[1117,14392,4996],{"class":1134},[1117,14394,1305],{"class":1180},[1117,14396,14397],{"class":1516},"clear_events",[1117,14399,2500],{"class":1180},[1117,14401,14402],{"class":1119,"line":2812},[1117,14403,1273],{"class":1134},[1117,14405,14406,14408,14411,14413,14415,14417,14419,14421,14423],{"class":1119,"line":2831},[1117,14407,1279],{"class":1208},[1117,14409,14410],{"class":1184}," _handle_order_confirmed",[1117,14412,1188],{"class":1180},[1117,14414,1289],{"class":1288},[1117,14416,1425],{"class":1180},[1117,14418,6480],{"class":1428},[1117,14420,1239],{"class":1180},[1117,14422,6073],{"class":1134},[1117,14424,1292],{"class":1180},[1117,14426,14427,14429,14432],{"class":1119,"line":2849},[1117,14428,1458],{"class":1222},[1117,14430,14431],{"class":1226},"Handle order confirmed event",[1117,14433,1230],{"class":1222},[1117,14435,14436],{"class":1119,"line":2856},[1117,14437,14438],{"class":1123},"        # Send confirmation email, update analytics, etc.\n",[1117,14440,14441],{"class":1119,"line":2861},[1117,14442,8531],{"class":1130},[1117,14444,14445],{"class":1119,"line":2884},[1117,14446,1273],{"class":1134},[1117,14448,14449,14451,14454,14456,14458,14460,14462,14464,14466],{"class":1119,"line":2894},[1117,14450,1279],{"class":1208},[1117,14452,14453],{"class":1184}," _handle_order_cancelled",[1117,14455,1188],{"class":1180},[1117,14457,1289],{"class":1288},[1117,14459,1425],{"class":1180},[1117,14461,6480],{"class":1428},[1117,14463,1239],{"class":1180},[1117,14465,6194],{"class":1134},[1117,14467,1292],{"class":1180},[1117,14469,14470,14472,14475],{"class":1119,"line":2913},[1117,14471,1458],{"class":1222},[1117,14473,14474],{"class":1226},"Handle order cancelled event",[1117,14476,1230],{"class":1222},[1117,14478,14479],{"class":1119,"line":2922},[1117,14480,14481],{"class":1123},"        # Send cancellation email, update analytics, etc.\n",[1117,14483,14484],{"class":1119,"line":2927},[1117,14485,8531],{"class":1130},[1117,14487,14488],{"class":1119,"line":2933},[1117,14489,1273],{"class":1134},[1117,14491,14492,14494,14497,14499,14501,14503,14505,14507,14509],{"class":1119,"line":2947},[1117,14493,1279],{"class":1208},[1117,14495,14496],{"class":1184}," _handle_order_shipped",[1117,14498,1188],{"class":1180},[1117,14500,1289],{"class":1288},[1117,14502,1425],{"class":1180},[1117,14504,6480],{"class":1428},[1117,14506,1239],{"class":1180},[1117,14508,6290],{"class":1134},[1117,14510,1292],{"class":1180},[1117,14512,14513,14515,14518],{"class":1119,"line":2963},[1117,14514,1458],{"class":1222},[1117,14516,14517],{"class":1226},"Handle order shipped event",[1117,14519,1230],{"class":1222},[1117,14521,14522],{"class":1119,"line":2968},[1117,14523,14524],{"class":1123},"        # Send shipping notification, update tracking, etc.\n",[1117,14526,14527],{"class":1119,"line":2991},[1117,14528,8531],{"class":1130},[1030,14530,14532],{"id":14531},"bounded-contexts","Bounded Contexts",[1026,14534,14535],{},"Bounded contexts define explicit boundaries where specific domain models apply. Different contexts may have different models for the same real-world concepts.",[1107,14537,14539],{"className":1109,"code":14538,"language":1111,"meta":1112,"style":1112},"# Sales Context - Focused on order processing\nclass SalesOrder:\n    \"\"\"Order model in sales context\"\"\"\n    \n    def __init__(self, order_id: int, customer_id: int):\n        self.id = order_id\n        self.customer_id = customer_id\n        self.items = []\n        self.total = Money(Decimal('0.00'))\n        self.status = 'pending'\n    \n    def add_item(self, product_id: int, quantity: int, price: Money):\n        \"\"\"Add item to sales order\"\"\"\n        # Sales-specific logic\n        pass\n\n# Fulfillment Context - Focused on shipping and delivery\nclass FulfillmentOrder:\n    \"\"\"Order model in fulfillment context\"\"\"\n    \n    def __init__(self, order_id: int):\n        self.id = order_id\n        self.items = []\n        self.shipping_address = None\n        self.status = 'pending_fulfillment'\n        self.tracking_number = None\n    \n    def assign_to_warehouse(self, warehouse_id: int):\n        \"\"\"Assign order to warehouse for fulfillment\"\"\"\n        # Fulfillment-specific logic\n        pass\n    \n    def mark_as_shipped(self, tracking_number: str):\n        \"\"\"Mark order as shipped\"\"\"\n        # Fulfillment-specific logic\n        pass\n\n# Context Mapping - Integration between contexts\nclass OrderContextMapper:\n    \"\"\"Maps between sales and fulfillment contexts\"\"\"\n    \n    @staticmethod\n    def to_fulfillment_order(sales_order: SalesOrder) -> FulfillmentOrder:\n        \"\"\"Convert sales order to fulfillment order\"\"\"\n        fulfillment_order = FulfillmentOrder(sales_order.id)\n        \n        # Map only relevant data for fulfillment\n        for item in sales_order.items:\n            fulfillment_order.items.append({\n                'product_id': item.product_id,\n                'quantity': item.quantity,\n                'product_name': item.product_name\n            })\n        \n        fulfillment_order.shipping_address = sales_order.shipping_address\n        \n        return fulfillment_order\n",[1114,14540,14541,14546,14555,14564,14568,14596,14608,14620,14632,14658,14675,14679,14715,14724,14729,14733,14737,14742,14751,14760,14764,14784,14796,14808,14820,14837,14849,14853,14875,14884,14889,14893,14897,14918,14927,14931,14935,14939,14944,14953,14962,14966,14973,14997,15006,15025,15029,15034,15051,15066,15084,15102,15119,15124,15128,15145,15149],{"__ignoreMap":1112},[1117,14542,14543],{"class":1119,"line":1120},[1117,14544,14545],{"class":1123},"# Sales Context - Focused on order processing\n",[1117,14547,14548,14550,14553],{"class":1119,"line":1127},[1117,14549,1209],{"class":1208},[1117,14551,14552],{"class":1212}," SalesOrder",[1117,14554,1216],{"class":1180},[1117,14556,14557,14559,14562],{"class":1119,"line":1144},[1117,14558,1223],{"class":1222},[1117,14560,14561],{"class":1226},"Order model in sales context",[1117,14563,1230],{"class":1222},[1117,14565,14566],{"class":1119,"line":1157},[1117,14567,1273],{"class":1134},[1117,14569,14570,14572,14574,14576,14578,14580,14582,14584,14586,14588,14590,14592,14594],{"class":1119,"line":1170},[1117,14571,1279],{"class":1208},[1117,14573,2368],{"class":1367},[1117,14575,1188],{"class":1180},[1117,14577,1289],{"class":1288},[1117,14579,1425],{"class":1180},[1117,14581,4016],{"class":1428},[1117,14583,1239],{"class":1180},[1117,14585,2382],{"class":1252},[1117,14587,1425],{"class":1180},[1117,14589,2377],{"class":1428},[1117,14591,1239],{"class":1180},[1117,14593,2382],{"class":1252},[1117,14595,1292],{"class":1180},[1117,14597,14598,14600,14602,14604,14606],{"class":1119,"line":1177},[1117,14599,2407],{"class":1301},[1117,14601,1305],{"class":1180},[1117,14603,2412],{"class":1308},[1117,14605,1256],{"class":1180},[1117,14607,4043],{"class":1134},[1117,14609,14610,14612,14614,14616,14618],{"class":1119,"line":1205},[1117,14611,2407],{"class":1301},[1117,14613,1305],{"class":1180},[1117,14615,4052],{"class":1308},[1117,14617,1256],{"class":1180},[1117,14619,2417],{"class":1134},[1117,14621,14622,14624,14626,14628,14630],{"class":1119,"line":1219},[1117,14623,2407],{"class":1301},[1117,14625,1305],{"class":1180},[1117,14627,4065],{"class":1308},[1117,14629,1256],{"class":1180},[1117,14631,2462],{"class":1180},[1117,14633,14634,14636,14638,14640,14642,14644,14646,14648,14650,14652,14654,14656],{"class":1119,"line":1233},[1117,14635,2407],{"class":1301},[1117,14637,1305],{"class":1180},[1117,14639,4098],{"class":1308},[1117,14641,1256],{"class":1180},[1117,14643,1213],{"class":1516},[1117,14645,1188],{"class":1180},[1117,14647,2519],{"class":1516},[1117,14649,1188],{"class":1180},[1117,14651,1439],{"class":1259},[1117,14653,2556],{"class":1263},[1117,14655,1439],{"class":1259},[1117,14657,2531],{"class":1180},[1117,14659,14660,14662,14664,14666,14668,14670,14673],{"class":1119,"line":1244},[1117,14661,2407],{"class":1301},[1117,14663,1305],{"class":1180},[1117,14665,4078],{"class":1308},[1117,14667,1256],{"class":1180},[1117,14669,1260],{"class":1259},[1117,14671,14672],{"class":1263},"pending",[1117,14674,1267],{"class":1259},[1117,14676,14677],{"class":1119,"line":1270},[1117,14678,1273],{"class":1134},[1117,14680,14681,14683,14685,14687,14689,14691,14693,14695,14697,14699,14701,14703,14705,14707,14709,14711,14713],{"class":1119,"line":1276},[1117,14682,1279],{"class":1208},[1117,14684,4171],{"class":1184},[1117,14686,1188],{"class":1180},[1117,14688,1289],{"class":1288},[1117,14690,1425],{"class":1180},[1117,14692,3388],{"class":1428},[1117,14694,1239],{"class":1180},[1117,14696,2382],{"class":1252},[1117,14698,1425],{"class":1180},[1117,14700,3766],{"class":1428},[1117,14702,1239],{"class":1180},[1117,14704,2382],{"class":1252},[1117,14706,1425],{"class":1180},[1117,14708,3405],{"class":1428},[1117,14710,1239],{"class":1180},[1117,14712,1213],{"class":1134},[1117,14714,1292],{"class":1180},[1117,14716,14717,14719,14722],{"class":1119,"line":1295},[1117,14718,1458],{"class":1222},[1117,14720,14721],{"class":1226},"Add item to sales order",[1117,14723,1230],{"class":1222},[1117,14725,14726],{"class":1119,"line":1322},[1117,14727,14728],{"class":1123},"        # Sales-specific logic\n",[1117,14730,14731],{"class":1119,"line":1343},[1117,14732,8531],{"class":1130},[1117,14734,14735],{"class":1119,"line":1349},[1117,14736,1174],{"emptyLinePlaceholder":1173},[1117,14738,14739],{"class":1119,"line":1390},[1117,14740,14741],{"class":1123},"# Fulfillment Context - Focused on shipping and delivery\n",[1117,14743,14744,14746,14749],{"class":1119,"line":1408},[1117,14745,1209],{"class":1208},[1117,14747,14748],{"class":1212}," FulfillmentOrder",[1117,14750,1216],{"class":1180},[1117,14752,14753,14755,14758],{"class":1119,"line":1413},[1117,14754,1223],{"class":1222},[1117,14756,14757],{"class":1226},"Order model in fulfillment context",[1117,14759,1230],{"class":1222},[1117,14761,14762],{"class":1119,"line":1455},[1117,14763,1273],{"class":1134},[1117,14765,14766,14768,14770,14772,14774,14776,14778,14780,14782],{"class":1119,"line":1466},[1117,14767,1279],{"class":1208},[1117,14769,2368],{"class":1367},[1117,14771,1188],{"class":1180},[1117,14773,1289],{"class":1288},[1117,14775,1425],{"class":1180},[1117,14777,4016],{"class":1428},[1117,14779,1239],{"class":1180},[1117,14781,2382],{"class":1252},[1117,14783,1292],{"class":1180},[1117,14785,14786,14788,14790,14792,14794],{"class":1119,"line":1487},[1117,14787,2407],{"class":1301},[1117,14789,1305],{"class":1180},[1117,14791,2412],{"class":1308},[1117,14793,1256],{"class":1180},[1117,14795,4043],{"class":1134},[1117,14797,14798,14800,14802,14804,14806],{"class":1119,"line":1505},[1117,14799,2407],{"class":1301},[1117,14801,1305],{"class":1180},[1117,14803,4065],{"class":1308},[1117,14805,1256],{"class":1180},[1117,14807,2462],{"class":1180},[1117,14809,14810,14812,14814,14816,14818],{"class":1119,"line":1510},[1117,14811,2407],{"class":1301},[1117,14813,1305],{"class":1180},[1117,14815,4125],{"class":1308},[1117,14817,1256],{"class":1180},[1117,14819,2256],{"class":1198},[1117,14821,14822,14824,14826,14828,14830,14832,14835],{"class":1119,"line":1546},[1117,14823,2407],{"class":1301},[1117,14825,1305],{"class":1180},[1117,14827,4078],{"class":1308},[1117,14829,1256],{"class":1180},[1117,14831,1260],{"class":1259},[1117,14833,14834],{"class":1263},"pending_fulfillment",[1117,14836,1267],{"class":1259},[1117,14838,14839,14841,14843,14845,14847],{"class":1119,"line":1551},[1117,14840,2407],{"class":1301},[1117,14842,1305],{"class":1180},[1117,14844,5309],{"class":1308},[1117,14846,1256],{"class":1180},[1117,14848,2256],{"class":1198},[1117,14850,14851],{"class":1119,"line":1585},[1117,14852,1273],{"class":1134},[1117,14854,14855,14857,14860,14862,14864,14866,14869,14871,14873],{"class":1119,"line":1595},[1117,14856,1279],{"class":1208},[1117,14858,14859],{"class":1184}," assign_to_warehouse",[1117,14861,1188],{"class":1180},[1117,14863,1289],{"class":1288},[1117,14865,1425],{"class":1180},[1117,14867,14868],{"class":1428}," warehouse_id",[1117,14870,1239],{"class":1180},[1117,14872,2382],{"class":1252},[1117,14874,1292],{"class":1180},[1117,14876,14877,14879,14882],{"class":1119,"line":1625},[1117,14878,1458],{"class":1222},[1117,14880,14881],{"class":1226},"Assign order to warehouse for fulfillment",[1117,14883,1230],{"class":1222},[1117,14885,14886],{"class":1119,"line":1630},[1117,14887,14888],{"class":1123},"        # Fulfillment-specific logic\n",[1117,14890,14891],{"class":1119,"line":1651},[1117,14892,8531],{"class":1130},[1117,14894,14895],{"class":1119,"line":1661},[1117,14896,1273],{"class":1134},[1117,14898,14899,14901,14904,14906,14908,14910,14912,14914,14916],{"class":1119,"line":1678},[1117,14900,1279],{"class":1208},[1117,14902,14903],{"class":1184}," mark_as_shipped",[1117,14905,1188],{"class":1180},[1117,14907,1289],{"class":1288},[1117,14909,1425],{"class":1180},[1117,14911,5196],{"class":1428},[1117,14913,1239],{"class":1180},[1117,14915,1253],{"class":1252},[1117,14917,1292],{"class":1180},[1117,14919,14920,14922,14925],{"class":1119,"line":1683},[1117,14921,1458],{"class":1222},[1117,14923,14924],{"class":1226},"Mark order as shipped",[1117,14926,1230],{"class":1222},[1117,14928,14929],{"class":1119,"line":1700},[1117,14930,14888],{"class":1123},[1117,14932,14933],{"class":1119,"line":1710},[1117,14934,8531],{"class":1130},[1117,14936,14937],{"class":1119,"line":1720},[1117,14938,1174],{"emptyLinePlaceholder":1173},[1117,14940,14941],{"class":1119,"line":1731},[1117,14942,14943],{"class":1123},"# Context Mapping - Integration between contexts\n",[1117,14945,14946,14948,14951],{"class":1119,"line":1741},[1117,14947,1209],{"class":1208},[1117,14949,14950],{"class":1212}," OrderContextMapper",[1117,14952,1216],{"class":1180},[1117,14954,14955,14957,14960],{"class":1119,"line":1751},[1117,14956,1223],{"class":1222},[1117,14958,14959],{"class":1226},"Maps between sales and fulfillment contexts",[1117,14961,1230],{"class":1222},[1117,14963,14964],{"class":1119,"line":1761},[1117,14965,1273],{"class":1134},[1117,14967,14968,14970],{"class":1119,"line":1780},[1117,14969,6459],{"class":1180},[1117,14971,14972],{"class":1252},"staticmethod\n",[1117,14974,14975,14977,14980,14982,14985,14987,14989,14991,14993,14995],{"class":1119,"line":1785},[1117,14976,1279],{"class":1208},[1117,14978,14979],{"class":1184}," to_fulfillment_order",[1117,14981,1188],{"class":1180},[1117,14983,14984],{"class":1428},"sales_order",[1117,14986,1239],{"class":1180},[1117,14988,14552],{"class":1134},[1117,14990,1379],{"class":1180},[1117,14992,1444],{"class":1180},[1117,14994,14748],{"class":1134},[1117,14996,1216],{"class":1180},[1117,14998,14999,15001,15004],{"class":1119,"line":1798},[1117,15000,1458],{"class":1222},[1117,15002,15003],{"class":1226},"Convert sales order to fulfillment order",[1117,15005,1230],{"class":1222},[1117,15007,15008,15011,15013,15015,15017,15019,15021,15023],{"class":1119,"line":1848},[1117,15009,15010],{"class":1134},"        fulfillment_order ",[1117,15012,1195],{"class":1180},[1117,15014,14748],{"class":1516},[1117,15016,1188],{"class":1180},[1117,15018,14984],{"class":1516},[1117,15020,1305],{"class":1180},[1117,15022,2412],{"class":1308},[1117,15024,1202],{"class":1180},[1117,15026,15027],{"class":1119,"line":1866},[1117,15028,1346],{"class":1134},[1117,15030,15031],{"class":1119,"line":1871},[1117,15032,15033],{"class":1123},"        # Map only relevant data for fulfillment\n",[1117,15035,15036,15038,15040,15042,15045,15047,15049],{"class":1119,"line":1904},[1117,15037,2797],{"class":1130},[1117,15039,5103],{"class":1134},[1117,15041,2639],{"class":1130},[1117,15043,15044],{"class":1134}," sales_order",[1117,15046,1305],{"class":1180},[1117,15048,4065],{"class":1308},[1117,15050,1216],{"class":1180},[1117,15052,15053,15056,15058,15060,15062,15064],{"class":1119,"line":1914},[1117,15054,15055],{"class":1134},"            fulfillment_order",[1117,15057,1305],{"class":1180},[1117,15059,4065],{"class":1308},[1117,15061,1305],{"class":1180},[1117,15063,2688],{"class":1516},[1117,15065,2691],{"class":1180},[1117,15067,15068,15070,15072,15074,15076,15078,15080,15082],{"class":1119,"line":1942},[1117,15069,11749],{"class":1259},[1117,15071,4605],{"class":1263},[1117,15073,1439],{"class":1259},[1117,15075,1239],{"class":1180},[1117,15077,4616],{"class":1516},[1117,15079,1305],{"class":1180},[1117,15081,4605],{"class":1308},[1117,15083,2709],{"class":1180},[1117,15085,15086,15088,15090,15092,15094,15096,15098,15100],{"class":1119,"line":1964},[1117,15087,11749],{"class":1259},[1117,15089,4379],{"class":1263},[1117,15091,1439],{"class":1259},[1117,15093,1239],{"class":1180},[1117,15095,4616],{"class":1516},[1117,15097,1305],{"class":1180},[1117,15099,4379],{"class":1308},[1117,15101,2709],{"class":1180},[1117,15103,15104,15106,15108,15110,15112,15114,15116],{"class":1119,"line":1984},[1117,15105,11749],{"class":1259},[1117,15107,5615],{"class":1263},[1117,15109,1439],{"class":1259},[1117,15111,1239],{"class":1180},[1117,15113,4616],{"class":1516},[1117,15115,1305],{"class":1180},[1117,15117,15118],{"class":1308},"product_name\n",[1117,15120,15121],{"class":1119,"line":1989},[1117,15122,15123],{"class":1180},"            })\n",[1117,15125,15126],{"class":1119,"line":2006},[1117,15127,1346],{"class":1134},[1117,15129,15130,15133,15135,15137,15139,15141,15143],{"class":1119,"line":2016},[1117,15131,15132],{"class":1134},"        fulfillment_order",[1117,15134,1305],{"class":1180},[1117,15136,4125],{"class":1308},[1117,15138,1256],{"class":1180},[1117,15140,15044],{"class":1134},[1117,15142,1305],{"class":1180},[1117,15144,11409],{"class":1308},[1117,15146,15147],{"class":1119,"line":2026},[1117,15148,1346],{"class":1134},[1117,15150,15151,15153],{"class":1119,"line":2036},[1117,15152,1513],{"class":1130},[1117,15154,15155],{"class":1134}," fulfillment_order\n",[1030,15157,15159],{"id":15158},"ddd-best-practices-in-django","DDD Best Practices in Django",[1038,15161,15163],{"id":15162},"organizing-ddd-code-in-django","Organizing DDD Code in Django",[1107,15165,15170],{"className":15166,"code":15168,"language":15169},[15167],"language-text","myproject/\n├── domain/                    # Domain layer\n│   ├── model/                # Domain models\n│   │   ├── customer.py\n│   │   ├── order.py\n│   │   └── product.py\n│   ├── services/             # Domain services\n│   │   ├── pricing_service.py\n│   │   └── inventory_service.py\n│   ├── repositories/         # Repository interfaces\n│   │   ├── customer_repository.py\n│   │   └── order_repository.py\n│   └── events/               # Domain events\n│       └── order_events.py\n├── application/              # Application layer\n│   ├── services/            # Application services\n│   │   ├── order_service.py\n│   │   └── customer_service.py\n│   └── commands/            # Command objects\n│       └── order_commands.py\n├── infrastructure/          # Infrastructure layer\n│   ├── persistence/        # Django ORM implementations\n│   │   ├── models.py\n│   │   ├── django_customer_repository.py\n│   │   └── django_order_repository.py\n│   └── external/           # External service integrations\n│       └── payment_gateway.py\n└── presentation/           # Presentation layer\n    ├── views/             # Django views\n    ├── serializers/       # API serializers\n    └── forms/             # Django forms\n","text",[1114,15171,15168],{"__ignoreMap":1112},[1038,15173,15175],{"id":15174},"testing-ddd-applications","Testing DDD Applications",[1107,15177,15179],{"className":1109,"code":15178,"language":1111,"meta":1112,"style":1112},"# Testing Domain Models\nimport pytest\nfrom decimal import Decimal\n\nclass TestOrder:\n    \"\"\"Test order aggregate\"\"\"\n    \n    def test_add_item_to_order(self):\n        \"\"\"Should add item to order\"\"\"\n        order = Order(1, customer_id=100)\n        product = Product(1, \"Test Product\", Money(Decimal('10.00')))\n        \n        order.add_item(product, 2)\n        \n        assert len(order.items) == 1\n        assert order.total.amount == Decimal('20.00')\n    \n    def test_cannot_modify_confirmed_order(self):\n        \"\"\"Should not allow modifying confirmed order\"\"\"\n        order = Order(1, customer_id=100)\n        product = Product(1, \"Test Product\", Money(Decimal('10.00')))\n        order.add_item(product, 1)\n        order.set_shipping_address(Address(\"123 Main St\", \"City\", \"ST\", \"12345\"))\n        order.confirm()\n        \n        with pytest.raises(BusinessRuleError):\n            order.add_item(product, 1)\n    \n    def test_order_total_calculation(self):\n        \"\"\"Should calculate order total correctly\"\"\"\n        order = Order(1, customer_id=100)\n        product1 = Product(1, \"Product 1\", Money(Decimal('10.00')))\n        product2 = Product(2, \"Product 2\", Money(Decimal('15.00')))\n        \n        order.add_item(product1, 2)\n        order.add_item(product2, 3)\n        \n        assert order.total.amount == Decimal('65.00')  # (10*2) + (15*3)\n\n# Testing Application Services\nclass TestOrderApplicationService:\n    \"\"\"Test order application service\"\"\"\n    \n    @pytest.fixture\n    def service(self, mock_repos):\n        \"\"\"Create service with mocked dependencies\"\"\"\n        return OrderApplicationService(\n            order_repo=mock_repos.order_repo,\n            customer_repo=mock_repos.customer_repo,\n            product_repo=mock_repos.product_repo,\n            pricing_service=mock_repos.pricing_service,\n            inventory_service=mock_repos.inventory_service,\n            fulfillment_service=mock_repos.fulfillment_service\n        )\n    \n    def test_place_order_success(self, service, mock_repos):\n        \"\"\"Should place order successfully\"\"\"\n        # Arrange\n        customer = Customer(100, Email(\"test@example.com\"), \"Test Customer\")\n        product = Product(1, \"Test Product\", Money(Decimal('10.00')))\n        product.inventory_count = 10\n        \n        mock_repos.customer_repo.get_by_id.return_value = customer\n        mock_repos.product_repo.get_by_id.return_value = product\n        mock_repos.pricing_service.calculate_order_total.return_value = Money(Decimal('20.00'))\n        \n        # Act\n        order_id = service.place_order(\n            customer_id=100,\n            items=[{'product_id': 1, 'quantity': 2}],\n            shipping_address=Address(\"123 Main St\", \"City\", \"ST\", \"12345\")\n        )\n        \n        # Assert\n        assert order_id is not None\n        mock_repos.order_repo.save.assert_called_once()\n        mock_repos.customer_repo.save.assert_called_once()\n",[1114,15180,15181,15186,15193,15203,15207,15216,15225,15229,15242,15251,15273,15314,15318,15337,15341,15363,15392,15396,15409,15418,15440,15478,15497,15547,15557,15561,15580,15598,15602,15615,15624,15646,15686,15727,15731,15750,15769,15773,15805,15809,15814,15823,15832,15836,15848,15866,15875,15883,15899,15914,15929,15944,15959,15973,15977,15981,16002,16011,16016,16052,16090,16103,16107,16129,16150,16184,16188,16193,16209,16219,16252,16295,16299,16303,16308,16322,16341],{"__ignoreMap":1112},[1117,15182,15183],{"class":1119,"line":1120},[1117,15184,15185],{"class":1123},"# Testing Domain Models\n",[1117,15187,15188,15190],{"class":1119,"line":1127},[1117,15189,1138],{"class":1130},[1117,15191,15192],{"class":1134}," pytest\n",[1117,15194,15195,15197,15199,15201],{"class":1119,"line":1144},[1117,15196,1131],{"class":1130},[1117,15198,1149],{"class":1134},[1117,15200,1138],{"class":1130},[1117,15202,1154],{"class":1134},[1117,15204,15205],{"class":1119,"line":1157},[1117,15206,1174],{"emptyLinePlaceholder":1173},[1117,15208,15209,15211,15214],{"class":1119,"line":1170},[1117,15210,1209],{"class":1208},[1117,15212,15213],{"class":1212}," TestOrder",[1117,15215,1216],{"class":1180},[1117,15217,15218,15220,15223],{"class":1119,"line":1177},[1117,15219,1223],{"class":1222},[1117,15221,15222],{"class":1226},"Test order aggregate",[1117,15224,1230],{"class":1222},[1117,15226,15227],{"class":1119,"line":1205},[1117,15228,1273],{"class":1134},[1117,15230,15231,15233,15236,15238,15240],{"class":1119,"line":1219},[1117,15232,1279],{"class":1208},[1117,15234,15235],{"class":1184}," test_add_item_to_order",[1117,15237,1188],{"class":1180},[1117,15239,1289],{"class":1288},[1117,15241,1292],{"class":1180},[1117,15243,15244,15246,15249],{"class":1119,"line":1233},[1117,15245,1458],{"class":1222},[1117,15247,15248],{"class":1226},"Should add item to order",[1117,15250,1230],{"class":1222},[1117,15252,15253,15255,15257,15259,15261,15263,15265,15267,15269,15271],{"class":1119,"line":1244},[1117,15254,11248],{"class":1134},[1117,15256,1195],{"class":1180},[1117,15258,3986],{"class":1516},[1117,15260,1188],{"class":1180},[1117,15262,2321],{"class":1316},[1117,15264,1425],{"class":1180},[1117,15266,2377],{"class":1191},[1117,15268,1195],{"class":1180},[1117,15270,12477],{"class":1316},[1117,15272,1202],{"class":1180},[1117,15274,15275,15278,15280,15282,15284,15286,15288,15290,15293,15295,15297,15299,15301,15303,15305,15307,15310,15312],{"class":1119,"line":1270},[1117,15276,15277],{"class":1134},"        product ",[1117,15279,1195],{"class":1180},[1117,15281,3355],{"class":1516},[1117,15283,1188],{"class":1180},[1117,15285,2321],{"class":1316},[1117,15287,1425],{"class":1180},[1117,15289,5919],{"class":1259},[1117,15291,15292],{"class":1263},"Test Product",[1117,15294,1333],{"class":1259},[1117,15296,1425],{"class":1180},[1117,15298,1213],{"class":1516},[1117,15300,1188],{"class":1180},[1117,15302,2519],{"class":1516},[1117,15304,1188],{"class":1180},[1117,15306,1439],{"class":1259},[1117,15308,15309],{"class":1263},"10.00",[1117,15311,1439],{"class":1259},[1117,15313,6884],{"class":1180},[1117,15315,15316],{"class":1119,"line":1276},[1117,15317,1346],{"class":1134},[1117,15319,15320,15322,15324,15326,15328,15330,15332,15335],{"class":1119,"line":1295},[1117,15321,11276],{"class":1134},[1117,15323,1305],{"class":1180},[1117,15325,13733],{"class":1516},[1117,15327,1188],{"class":1180},[1117,15329,4349],{"class":1516},[1117,15331,1425],{"class":1180},[1117,15333,15334],{"class":1316}," 2",[1117,15336,1202],{"class":1180},[1117,15338,15339],{"class":1119,"line":1322},[1117,15340,1346],{"class":1134},[1117,15342,15343,15346,15348,15350,15352,15354,15356,15358,15360],{"class":1119,"line":1343},[1117,15344,15345],{"class":1130},"        assert",[1117,15347,1368],{"class":1367},[1117,15349,1188],{"class":1180},[1117,15351,6129],{"class":1516},[1117,15353,1305],{"class":1180},[1117,15355,4065],{"class":1308},[1117,15357,1379],{"class":1180},[1117,15359,1672],{"class":1312},[1117,15361,15362],{"class":1316}," 1\n",[1117,15364,15365,15367,15369,15371,15373,15375,15377,15379,15381,15383,15385,15388,15390],{"class":1119,"line":1349},[1117,15366,15345],{"class":1130},[1117,15368,6108],{"class":1134},[1117,15370,1305],{"class":1180},[1117,15372,4098],{"class":1308},[1117,15374,1305],{"class":1180},[1117,15376,1309],{"class":1308},[1117,15378,1672],{"class":1312},[1117,15380,1570],{"class":1516},[1117,15382,1188],{"class":1180},[1117,15384,1439],{"class":1259},[1117,15386,15387],{"class":1263},"20.00",[1117,15389,1439],{"class":1259},[1117,15391,1202],{"class":1180},[1117,15393,15394],{"class":1119,"line":1390},[1117,15395,1273],{"class":1134},[1117,15397,15398,15400,15403,15405,15407],{"class":1119,"line":1408},[1117,15399,1279],{"class":1208},[1117,15401,15402],{"class":1184}," test_cannot_modify_confirmed_order",[1117,15404,1188],{"class":1180},[1117,15406,1289],{"class":1288},[1117,15408,1292],{"class":1180},[1117,15410,15411,15413,15416],{"class":1119,"line":1413},[1117,15412,1458],{"class":1222},[1117,15414,15415],{"class":1226},"Should not allow modifying confirmed order",[1117,15417,1230],{"class":1222},[1117,15419,15420,15422,15424,15426,15428,15430,15432,15434,15436,15438],{"class":1119,"line":1455},[1117,15421,11248],{"class":1134},[1117,15423,1195],{"class":1180},[1117,15425,3986],{"class":1516},[1117,15427,1188],{"class":1180},[1117,15429,2321],{"class":1316},[1117,15431,1425],{"class":1180},[1117,15433,2377],{"class":1191},[1117,15435,1195],{"class":1180},[1117,15437,12477],{"class":1316},[1117,15439,1202],{"class":1180},[1117,15441,15442,15444,15446,15448,15450,15452,15454,15456,15458,15460,15462,15464,15466,15468,15470,15472,15474,15476],{"class":1119,"line":1466},[1117,15443,15277],{"class":1134},[1117,15445,1195],{"class":1180},[1117,15447,3355],{"class":1516},[1117,15449,1188],{"class":1180},[1117,15451,2321],{"class":1316},[1117,15453,1425],{"class":1180},[1117,15455,5919],{"class":1259},[1117,15457,15292],{"class":1263},[1117,15459,1333],{"class":1259},[1117,15461,1425],{"class":1180},[1117,15463,1213],{"class":1516},[1117,15465,1188],{"class":1180},[1117,15467,2519],{"class":1516},[1117,15469,1188],{"class":1180},[1117,15471,1439],{"class":1259},[1117,15473,15309],{"class":1263},[1117,15475,1439],{"class":1259},[1117,15477,6884],{"class":1180},[1117,15479,15480,15482,15484,15486,15488,15490,15492,15495],{"class":1119,"line":1487},[1117,15481,11276],{"class":1134},[1117,15483,1305],{"class":1180},[1117,15485,13733],{"class":1516},[1117,15487,1188],{"class":1180},[1117,15489,4349],{"class":1516},[1117,15491,1425],{"class":1180},[1117,15493,15494],{"class":1316}," 1",[1117,15496,1202],{"class":1180},[1117,15498,15499,15501,15503,15505,15507,15509,15511,15513,15516,15518,15520,15522,15525,15527,15529,15531,15534,15536,15538,15540,15543,15545],{"class":1119,"line":1505},[1117,15500,11276],{"class":1134},[1117,15502,1305],{"class":1180},[1117,15504,13615],{"class":1516},[1117,15506,1188],{"class":1180},[1117,15508,1891],{"class":1516},[1117,15510,1188],{"class":1180},[1117,15512,1333],{"class":1259},[1117,15514,15515],{"class":1263},"123 Main St",[1117,15517,1333],{"class":1259},[1117,15519,1425],{"class":1180},[1117,15521,5919],{"class":1259},[1117,15523,15524],{"class":1263},"City",[1117,15526,1333],{"class":1259},[1117,15528,1425],{"class":1180},[1117,15530,5919],{"class":1259},[1117,15532,15533],{"class":1263},"ST",[1117,15535,1333],{"class":1259},[1117,15537,1425],{"class":1180},[1117,15539,5919],{"class":1259},[1117,15541,15542],{"class":1263},"12345",[1117,15544,1333],{"class":1259},[1117,15546,2531],{"class":1180},[1117,15548,15549,15551,15553,15555],{"class":1119,"line":1510},[1117,15550,11276],{"class":1134},[1117,15552,1305],{"class":1180},[1117,15554,13851],{"class":1516},[1117,15556,2500],{"class":1180},[1117,15558,15559],{"class":1119,"line":1546},[1117,15560,1346],{"class":1134},[1117,15562,15563,15565,15568,15570,15573,15575,15578],{"class":1119,"line":1551},[1117,15564,10607],{"class":1130},[1117,15566,15567],{"class":1134}," pytest",[1117,15569,1305],{"class":1180},[1117,15571,15572],{"class":1516},"raises",[1117,15574,1188],{"class":1180},[1117,15576,15577],{"class":1516},"BusinessRuleError",[1117,15579,1292],{"class":1180},[1117,15581,15582,15584,15586,15588,15590,15592,15594,15596],{"class":1119,"line":1585},[1117,15583,8264],{"class":1134},[1117,15585,1305],{"class":1180},[1117,15587,13733],{"class":1516},[1117,15589,1188],{"class":1180},[1117,15591,4349],{"class":1516},[1117,15593,1425],{"class":1180},[1117,15595,15494],{"class":1316},[1117,15597,1202],{"class":1180},[1117,15599,15600],{"class":1119,"line":1595},[1117,15601,1273],{"class":1134},[1117,15603,15604,15606,15609,15611,15613],{"class":1119,"line":1625},[1117,15605,1279],{"class":1208},[1117,15607,15608],{"class":1184}," test_order_total_calculation",[1117,15610,1188],{"class":1180},[1117,15612,1289],{"class":1288},[1117,15614,1292],{"class":1180},[1117,15616,15617,15619,15622],{"class":1119,"line":1630},[1117,15618,1458],{"class":1222},[1117,15620,15621],{"class":1226},"Should calculate order total correctly",[1117,15623,1230],{"class":1222},[1117,15625,15626,15628,15630,15632,15634,15636,15638,15640,15642,15644],{"class":1119,"line":1651},[1117,15627,11248],{"class":1134},[1117,15629,1195],{"class":1180},[1117,15631,3986],{"class":1516},[1117,15633,1188],{"class":1180},[1117,15635,2321],{"class":1316},[1117,15637,1425],{"class":1180},[1117,15639,2377],{"class":1191},[1117,15641,1195],{"class":1180},[1117,15643,12477],{"class":1316},[1117,15645,1202],{"class":1180},[1117,15647,15648,15651,15653,15655,15657,15659,15661,15663,15666,15668,15670,15672,15674,15676,15678,15680,15682,15684],{"class":1119,"line":1661},[1117,15649,15650],{"class":1134},"        product1 ",[1117,15652,1195],{"class":1180},[1117,15654,3355],{"class":1516},[1117,15656,1188],{"class":1180},[1117,15658,2321],{"class":1316},[1117,15660,1425],{"class":1180},[1117,15662,5919],{"class":1259},[1117,15664,15665],{"class":1263},"Product 1",[1117,15667,1333],{"class":1259},[1117,15669,1425],{"class":1180},[1117,15671,1213],{"class":1516},[1117,15673,1188],{"class":1180},[1117,15675,2519],{"class":1516},[1117,15677,1188],{"class":1180},[1117,15679,1439],{"class":1259},[1117,15681,15309],{"class":1263},[1117,15683,1439],{"class":1259},[1117,15685,6884],{"class":1180},[1117,15687,15688,15691,15693,15695,15697,15699,15701,15703,15706,15708,15710,15712,15714,15716,15718,15720,15723,15725],{"class":1119,"line":1678},[1117,15689,15690],{"class":1134},"        product2 ",[1117,15692,1195],{"class":1180},[1117,15694,3355],{"class":1516},[1117,15696,1188],{"class":1180},[1117,15698,12198],{"class":1316},[1117,15700,1425],{"class":1180},[1117,15702,5919],{"class":1259},[1117,15704,15705],{"class":1263},"Product 2",[1117,15707,1333],{"class":1259},[1117,15709,1425],{"class":1180},[1117,15711,1213],{"class":1516},[1117,15713,1188],{"class":1180},[1117,15715,2519],{"class":1516},[1117,15717,1188],{"class":1180},[1117,15719,1439],{"class":1259},[1117,15721,15722],{"class":1263},"15.00",[1117,15724,1439],{"class":1259},[1117,15726,6884],{"class":1180},[1117,15728,15729],{"class":1119,"line":1683},[1117,15730,1346],{"class":1134},[1117,15732,15733,15735,15737,15739,15741,15744,15746,15748],{"class":1119,"line":1700},[1117,15734,11276],{"class":1134},[1117,15736,1305],{"class":1180},[1117,15738,13733],{"class":1516},[1117,15740,1188],{"class":1180},[1117,15742,15743],{"class":1516},"product1",[1117,15745,1425],{"class":1180},[1117,15747,15334],{"class":1316},[1117,15749,1202],{"class":1180},[1117,15751,15752,15754,15756,15758,15760,15763,15765,15767],{"class":1119,"line":1710},[1117,15753,11276],{"class":1134},[1117,15755,1305],{"class":1180},[1117,15757,13733],{"class":1516},[1117,15759,1188],{"class":1180},[1117,15761,15762],{"class":1516},"product2",[1117,15764,1425],{"class":1180},[1117,15766,1385],{"class":1316},[1117,15768,1202],{"class":1180},[1117,15770,15771],{"class":1119,"line":1720},[1117,15772,1346],{"class":1134},[1117,15774,15775,15777,15779,15781,15783,15785,15787,15789,15791,15793,15795,15798,15800,15802],{"class":1119,"line":1731},[1117,15776,15345],{"class":1130},[1117,15778,6108],{"class":1134},[1117,15780,1305],{"class":1180},[1117,15782,4098],{"class":1308},[1117,15784,1305],{"class":1180},[1117,15786,1309],{"class":1308},[1117,15788,1672],{"class":1312},[1117,15790,1570],{"class":1516},[1117,15792,1188],{"class":1180},[1117,15794,1439],{"class":1259},[1117,15796,15797],{"class":1263},"65.00",[1117,15799,1439],{"class":1259},[1117,15801,1379],{"class":1180},[1117,15803,15804],{"class":1123},"  # (10*2) + (15*3)\n",[1117,15806,15807],{"class":1119,"line":1741},[1117,15808,1174],{"emptyLinePlaceholder":1173},[1117,15810,15811],{"class":1119,"line":1751},[1117,15812,15813],{"class":1123},"# Testing Application Services\n",[1117,15815,15816,15818,15821],{"class":1119,"line":1761},[1117,15817,1209],{"class":1208},[1117,15819,15820],{"class":1212}," TestOrderApplicationService",[1117,15822,1216],{"class":1180},[1117,15824,15825,15827,15830],{"class":1119,"line":1780},[1117,15826,1223],{"class":1222},[1117,15828,15829],{"class":1226},"Test order application service",[1117,15831,1230],{"class":1222},[1117,15833,15834],{"class":1119,"line":1785},[1117,15835,1273],{"class":1134},[1117,15837,15838,15840,15843,15845],{"class":1119,"line":1798},[1117,15839,6459],{"class":1180},[1117,15841,15842],{"class":1184},"pytest",[1117,15844,1305],{"class":1180},[1117,15846,15847],{"class":1184},"fixture\n",[1117,15849,15850,15852,15855,15857,15859,15861,15864],{"class":1119,"line":1848},[1117,15851,1279],{"class":1208},[1117,15853,15854],{"class":1184}," service",[1117,15856,1188],{"class":1180},[1117,15858,1289],{"class":1288},[1117,15860,1425],{"class":1180},[1117,15862,15863],{"class":1428}," mock_repos",[1117,15865,1292],{"class":1180},[1117,15867,15868,15870,15873],{"class":1119,"line":1866},[1117,15869,1458],{"class":1222},[1117,15871,15872],{"class":1226},"Create service with mocked dependencies",[1117,15874,1230],{"class":1222},[1117,15876,15877,15879,15881],{"class":1119,"line":1871},[1117,15878,1513],{"class":1130},[1117,15880,13236],{"class":1516},[1117,15882,8224],{"class":1180},[1117,15884,15885,15888,15890,15893,15895,15897],{"class":1119,"line":1904},[1117,15886,15887],{"class":1191},"            order_repo",[1117,15889,1195],{"class":1180},[1117,15891,15892],{"class":1516},"mock_repos",[1117,15894,1305],{"class":1180},[1117,15896,13337],{"class":1308},[1117,15898,2709],{"class":1180},[1117,15900,15901,15904,15906,15908,15910,15912],{"class":1119,"line":1914},[1117,15902,15903],{"class":1191},"            customer_repo",[1117,15905,1195],{"class":1180},[1117,15907,15892],{"class":1516},[1117,15909,1305],{"class":1180},[1117,15911,13351],{"class":1308},[1117,15913,2709],{"class":1180},[1117,15915,15916,15919,15921,15923,15925,15927],{"class":1119,"line":1942},[1117,15917,15918],{"class":1191},"            product_repo",[1117,15920,1195],{"class":1180},[1117,15922,15892],{"class":1516},[1117,15924,1305],{"class":1180},[1117,15926,7519],{"class":1308},[1117,15928,2709],{"class":1180},[1117,15930,15931,15934,15936,15938,15940,15942],{"class":1119,"line":1964},[1117,15932,15933],{"class":1191},"            pricing_service",[1117,15935,1195],{"class":1180},[1117,15937,15892],{"class":1516},[1117,15939,1305],{"class":1180},[1117,15941,13377],{"class":1308},[1117,15943,2709],{"class":1180},[1117,15945,15946,15949,15951,15953,15955,15957],{"class":1119,"line":1984},[1117,15947,15948],{"class":1191},"            inventory_service",[1117,15950,1195],{"class":1180},[1117,15952,15892],{"class":1516},[1117,15954,1305],{"class":1180},[1117,15956,8042],{"class":1308},[1117,15958,2709],{"class":1180},[1117,15960,15961,15964,15966,15968,15970],{"class":1119,"line":1989},[1117,15962,15963],{"class":1191},"            fulfillment_service",[1117,15965,1195],{"class":1180},[1117,15967,15892],{"class":1516},[1117,15969,1305],{"class":1180},[1117,15971,15972],{"class":1308},"fulfillment_service\n",[1117,15974,15975],{"class":1119,"line":2006},[1117,15976,9769],{"class":1180},[1117,15978,15979],{"class":1119,"line":2016},[1117,15980,1273],{"class":1134},[1117,15982,15983,15985,15988,15990,15992,15994,15996,15998,16000],{"class":1119,"line":2026},[1117,15984,1279],{"class":1208},[1117,15986,15987],{"class":1184}," test_place_order_success",[1117,15989,1188],{"class":1180},[1117,15991,1289],{"class":1288},[1117,15993,1425],{"class":1180},[1117,15995,15854],{"class":1428},[1117,15997,1425],{"class":1180},[1117,15999,15863],{"class":1428},[1117,16001,1292],{"class":1180},[1117,16003,16004,16006,16009],{"class":1119,"line":2036},[1117,16005,1458],{"class":1222},[1117,16007,16008],{"class":1226},"Should place order successfully",[1117,16010,1230],{"class":1222},[1117,16012,16013],{"class":1119,"line":2041},[1117,16014,16015],{"class":1123},"        # Arrange\n",[1117,16017,16018,16020,16022,16024,16026,16028,16030,16032,16034,16036,16039,16041,16043,16045,16048,16050],{"class":1119,"line":2054},[1117,16019,9845],{"class":1134},[1117,16021,1195],{"class":1180},[1117,16023,2343],{"class":1516},[1117,16025,1188],{"class":1180},[1117,16027,12477],{"class":1316},[1117,16029,1425],{"class":1180},[1117,16031,2011],{"class":1516},[1117,16033,1188],{"class":1180},[1117,16035,1333],{"class":1259},[1117,16037,16038],{"class":1263},"test@example.com",[1117,16040,1333],{"class":1259},[1117,16042,5435],{"class":1180},[1117,16044,5919],{"class":1259},[1117,16046,16047],{"class":1263},"Test Customer",[1117,16049,1333],{"class":1259},[1117,16051,1202],{"class":1180},[1117,16053,16054,16056,16058,16060,16062,16064,16066,16068,16070,16072,16074,16076,16078,16080,16082,16084,16086,16088],{"class":1119,"line":2079},[1117,16055,15277],{"class":1134},[1117,16057,1195],{"class":1180},[1117,16059,3355],{"class":1516},[1117,16061,1188],{"class":1180},[1117,16063,2321],{"class":1316},[1117,16065,1425],{"class":1180},[1117,16067,5919],{"class":1259},[1117,16069,15292],{"class":1263},[1117,16071,1333],{"class":1259},[1117,16073,1425],{"class":1180},[1117,16075,1213],{"class":1516},[1117,16077,1188],{"class":1180},[1117,16079,2519],{"class":1516},[1117,16081,1188],{"class":1180},[1117,16083,1439],{"class":1259},[1117,16085,15309],{"class":1263},[1117,16087,1439],{"class":1259},[1117,16089,6884],{"class":1180},[1117,16091,16092,16094,16096,16098,16100],{"class":1119,"line":2111},[1117,16093,4471],{"class":1134},[1117,16095,1305],{"class":1180},[1117,16097,3509],{"class":1308},[1117,16099,1256],{"class":1180},[1117,16101,16102],{"class":1316}," 10\n",[1117,16104,16105],{"class":1119,"line":2116},[1117,16106,1346],{"class":1134},[1117,16108,16109,16112,16114,16116,16118,16120,16122,16125,16127],{"class":1119,"line":2145},[1117,16110,16111],{"class":1134},"        mock_repos",[1117,16113,1305],{"class":1180},[1117,16115,13351],{"class":1308},[1117,16117,1305],{"class":1180},[1117,16119,7603],{"class":1308},[1117,16121,1305],{"class":1180},[1117,16123,16124],{"class":1308},"return_value",[1117,16126,1256],{"class":1180},[1117,16128,9687],{"class":1134},[1117,16130,16131,16133,16135,16137,16139,16141,16143,16145,16147],{"class":1119,"line":2155},[1117,16132,16111],{"class":1134},[1117,16134,1305],{"class":1180},[1117,16136,7519],{"class":1308},[1117,16138,1305],{"class":1180},[1117,16140,7603],{"class":1308},[1117,16142,1305],{"class":1180},[1117,16144,16124],{"class":1308},[1117,16146,1256],{"class":1180},[1117,16148,16149],{"class":1134}," product\n",[1117,16151,16152,16154,16156,16158,16160,16162,16164,16166,16168,16170,16172,16174,16176,16178,16180,16182],{"class":1119,"line":2164},[1117,16153,16111],{"class":1134},[1117,16155,1305],{"class":1180},[1117,16157,13377],{"class":1308},[1117,16159,1305],{"class":1180},[1117,16161,13779],{"class":1308},[1117,16163,1305],{"class":1180},[1117,16165,16124],{"class":1308},[1117,16167,1256],{"class":1180},[1117,16169,1213],{"class":1516},[1117,16171,1188],{"class":1180},[1117,16173,2519],{"class":1516},[1117,16175,1188],{"class":1180},[1117,16177,1439],{"class":1259},[1117,16179,15387],{"class":1263},[1117,16181,1439],{"class":1259},[1117,16183,2531],{"class":1180},[1117,16185,16186],{"class":1119,"line":2227},[1117,16187,1346],{"class":1134},[1117,16189,16190],{"class":1119,"line":2259},[1117,16191,16192],{"class":1123},"        # Act\n",[1117,16194,16195,16198,16200,16202,16204,16207],{"class":1119,"line":2264},[1117,16196,16197],{"class":1134},"        order_id ",[1117,16199,1195],{"class":1180},[1117,16201,15854],{"class":1134},[1117,16203,1305],{"class":1180},[1117,16205,16206],{"class":1516},"place_order",[1117,16208,8224],{"class":1180},[1117,16210,16211,16213,16215,16217],{"class":1119,"line":2284},[1117,16212,9856],{"class":1191},[1117,16214,1195],{"class":1180},[1117,16216,12477],{"class":1316},[1117,16218,2709],{"class":1180},[1117,16220,16221,16224,16227,16229,16231,16233,16235,16237,16239,16241,16243,16245,16247,16249],{"class":1119,"line":2294},[1117,16222,16223],{"class":1191},"            items",[1117,16225,16226],{"class":1180},"=[{",[1117,16228,1439],{"class":1259},[1117,16230,4605],{"class":1263},[1117,16232,1439],{"class":1259},[1117,16234,1239],{"class":1180},[1117,16236,15494],{"class":1316},[1117,16238,1425],{"class":1180},[1117,16240,1260],{"class":1259},[1117,16242,4379],{"class":1263},[1117,16244,1439],{"class":1259},[1117,16246,1239],{"class":1180},[1117,16248,15334],{"class":1316},[1117,16250,16251],{"class":1180},"}],\n",[1117,16253,16254,16257,16259,16261,16263,16265,16267,16269,16271,16273,16275,16277,16279,16281,16283,16285,16287,16289,16291,16293],{"class":1119,"line":2327},[1117,16255,16256],{"class":1191},"            shipping_address",[1117,16258,1195],{"class":1180},[1117,16260,1891],{"class":1516},[1117,16262,1188],{"class":1180},[1117,16264,1333],{"class":1259},[1117,16266,15515],{"class":1263},[1117,16268,1333],{"class":1259},[1117,16270,1425],{"class":1180},[1117,16272,5919],{"class":1259},[1117,16274,15524],{"class":1263},[1117,16276,1333],{"class":1259},[1117,16278,1425],{"class":1180},[1117,16280,5919],{"class":1259},[1117,16282,15533],{"class":1263},[1117,16284,1333],{"class":1259},[1117,16286,1425],{"class":1180},[1117,16288,5919],{"class":1259},[1117,16290,15542],{"class":1263},[1117,16292,1333],{"class":1259},[1117,16294,1202],{"class":1180},[1117,16296,16297],{"class":1119,"line":2332},[1117,16298,9769],{"class":1180},[1117,16300,16301],{"class":1119,"line":2338},[1117,16302,1346],{"class":1134},[1117,16304,16305],{"class":1119,"line":2348},[1117,16306,16307],{"class":1123},"        # Assert\n",[1117,16309,16310,16312,16315,16318,16320],{"class":1119,"line":2358},[1117,16311,15345],{"class":1130},[1117,16313,16314],{"class":1134}," order_id ",[1117,16316,16317],{"class":1312},"is",[1117,16319,1354],{"class":1312},[1117,16321,2256],{"class":1198},[1117,16323,16324,16326,16328,16330,16332,16334,16336,16339],{"class":1119,"line":2363},[1117,16325,16111],{"class":1134},[1117,16327,1305],{"class":1180},[1117,16329,13337],{"class":1308},[1117,16331,1305],{"class":1180},[1117,16333,7730],{"class":1308},[1117,16335,1305],{"class":1180},[1117,16337,16338],{"class":1516},"assert_called_once",[1117,16340,2500],{"class":1180},[1117,16342,16343,16345,16347,16349,16351,16353,16355,16357],{"class":1119,"line":2404},[1117,16344,16111],{"class":1134},[1117,16346,1305],{"class":1180},[1117,16348,13351],{"class":1308},[1117,16350,1305],{"class":1180},[1117,16352,7730],{"class":1308},[1117,16354,1305],{"class":1180},[1117,16356,16338],{"class":1516},[1117,16358,2500],{"class":1180},[1030,16360,16362],{"id":16361},"benefits-of-ddd-in-django","Benefits of DDD in Django",[1026,16364,16365],{},[1045,16366,16367],{},"Rich Domain Models",[1049,16369,16370,16373,16376,16379],{},[1052,16371,16372],{},"Business logic is centralized in domain objects",[1052,16374,16375],{},"Code reads like business requirements",[1052,16377,16378],{},"Easier to understand and maintain",[1052,16380,16381],{},"Natural evolution with business changes",[1026,16383,16384],{},[1045,16385,16386],{},"Clear Boundaries",[1049,16388,16389,16392,16395,16398],{},[1052,16390,16391],{},"Explicit separation between layers",[1052,16393,16394],{},"Dependencies point inward toward domain",[1052,16396,16397],{},"Infrastructure details don't leak into business logic",[1052,16399,16400],{},"Easy to test business logic in isolation",[1026,16402,16403],{},[1045,16404,1047],{},[1049,16406,16407,16410,16413,16416],{},[1052,16408,16409],{},"Code uses business terminology",[1052,16411,16412],{},"Better communication with stakeholders",[1052,16414,16415],{},"Reduced translation errors",[1052,16417,16418],{},"Documentation is self-evident",[1026,16420,16421],{},[1045,16422,16423],{},"Flexibility",[1049,16425,16426,16429,16432,16435],{},[1052,16427,16428],{},"Easy to change persistence mechanisms",[1052,16430,16431],{},"Can swap external service implementations",[1052,16433,16434],{},"Business logic remains stable",[1052,16436,16437],{},"Technology changes don't affect domain",[1026,16439,16440],{},"Domain Driven Design transforms Django applications from data-centric CRUD systems into rich, expressive models that accurately reflect business requirements. By focusing on the domain and using DDD patterns, you create applications that are more maintainable, testable, and aligned with business needs.",[1026,16442,16443],{},"The key is starting with the domain model, understanding the business deeply, and letting that understanding drive your technical decisions. DDD is not about technology—it's about solving complex business problems through better software design.",[16445,16446,16447],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sETVe, html code.shiki .sETVe{--shiki-light:#39ADB5;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .sk0MF, html code.shiki .sk0MF{--shiki-light:#90A4AE;--shiki-default:#BDA437;--shiki-dark:#E6CC77}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}",{"title":1112,"searchDepth":1120,"depth":1127,"links":16449},[16450,16454,16455,16456,16457,16458,16462],{"id":1032,"depth":1127,"text":1033,"children":16451},[16452,16453],{"id":1040,"depth":1144,"text":1041},{"id":1104,"depth":1144,"text":1105},{"id":6635,"depth":1127,"text":6636},{"id":8410,"depth":1127,"text":8411},{"id":13215,"depth":1127,"text":13216},{"id":14531,"depth":1127,"text":14532},{"id":15158,"depth":1127,"text":15159,"children":16459},[16460,16461],{"id":15162,"depth":1144,"text":15163},{"id":15174,"depth":1144,"text":15175},{"id":16361,"depth":1127,"text":16362},"md",null,{},{"title":811,"description":1028},"atPBtbZBKaZH07E-6GoRNJb9jh0c6AucttXMqPO8i28",[16469,16471],{"title":807,"path":808,"stem":809,"description":16470,"children":-1},"System architecture patterns provide proven solutions for organizing complex Django applications. These patterns help create maintainable, scalable, and testable systems by defining clear boundaries between components and establishing consistent communication patterns. This comprehensive guide covers the most important architectural patterns for Django applications.",{"title":815,"path":816,"stem":817,"description":16472,"children":-1},"Large-scale Django projects require careful architecture, organization, and development practices to remain maintainable as they grow. This comprehensive guide covers strategies for organizing massive Django applications, managing complexity, scaling development teams, and maintaining code quality across hundreds of models and thousands of views.",1772474957630]