@ozdao/martyrs 0.2.518 → 0.2.520
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index.cjs +4 -4
- package/dist/_virtual/index.js +4 -4
- package/dist/_virtual/index2.cjs +4 -4
- package/dist/_virtual/index2.js +4 -4
- package/dist/{abac-Cf_9lCSh.js → abac-CnJsrv8S.js} +3 -3
- package/dist/{abac-6LjoG9u-.cjs → abac-DOyUjhee.cjs} +3 -3
- package/dist/builder.cjs +27 -25
- package/dist/builder.js +27 -25
- package/dist/chats.server.cjs +198 -1
- package/dist/chats.server.js +198 -1
- package/dist/{crud-sE7GLPbj.js → crud-BIFl1W1i.js} +6 -6
- package/dist/{crud-JN_LFj01.cjs → crud-CC6k6yY5.cjs} +6 -6
- package/dist/{globals.logger-CZMgIMlM.cjs → globals.logger-BuW7JHMY.cjs} +63 -53
- package/dist/{globals.logger-Bf6rRU7j.js → globals.logger-VRHh-WUW.js} +63 -53
- package/dist/{globals.observer-CV2wCzzh.cjs → globals.observer-C_FYclgV.cjs} +36 -1
- package/dist/{globals.observer-CDqUjVU5.js → globals.observer-MZsqaE6F.js} +36 -1
- package/dist/globals.server.cjs +1 -1
- package/dist/globals.server.js +1 -1
- package/dist/inventory.server.cjs +276 -376
- package/dist/inventory.server.js +276 -376
- package/dist/main-BM3GslOO.cjs +11 -0
- package/dist/{main-wmEhGVvD.js → main-Qcn7YlTx.js} +1834 -1830
- package/dist/martyrs/src/components/Address/{Address.vue2.cjs → Address.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Address/{Address.vue2.js.map → Address.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Address/{Address.vue2.js → Address.vue.js} +2 -2
- package/dist/martyrs/src/components/Address/Address.vue.js.map +1 -0
- package/dist/martyrs/src/components/Button/Button.vue.cjs +1 -1
- package/dist/martyrs/src/components/Button/Button.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Button/Button.vue.js +1 -1
- package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -1
- package/dist/martyrs/src/components/Chips/{Chips.vue.cjs → Chips.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Chips/Chips.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Chips/{Chips.vue.js → Chips.vue2.js} +2 -2
- package/dist/martyrs/src/components/Chips/Chips.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs → Dropdown.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.js → Dropdown.vue2.js} +2 -2
- package/dist/martyrs/src/components/Dropdown/{Dropdown.vue.cjs.map → Dropdown.vue2.js.map} +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs +0 -93
- package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js +1 -94
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs +93 -0
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js +94 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +2 -3
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +2 -3
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.cjs +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.js +1 -1
- package/dist/martyrs/src/components/Loader/Loader.vue2.js.map +1 -1
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.cjs → LocationMarker.vue.cjs} +2 -2
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.js.map → LocationMarker.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.js → LocationMarker.vue.js} +2 -2
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js.map +1 -0
- package/dist/martyrs/src/components/Select/{Select.vue2.cjs → Select.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Select/{Select.vue2.js.map → Select.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +4 -4
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +41 -51
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +59 -69
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs +11 -13
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js +11 -13
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs +10 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +10 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs +6 -0
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +6 -0
- package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.cjs +27 -11
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js +28 -12
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs +62 -0
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js +63 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.cjs +60 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.js +60 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +2 -2
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs +50 -368
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +53 -371
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +2 -3
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -3
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js.map +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +3 -3
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/LocationSelection.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/LocationSelection.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.cjs +16 -3
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.js +17 -4
- package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.cjs +7 -0
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.js +7 -0
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.js.map +1 -1
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +67 -43
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +68 -44
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.cjs +22 -7
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +23 -8
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.cjs +47 -32
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +48 -33
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +47 -26
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +48 -27
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +42 -52
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +43 -53
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +18 -18
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/store/{ inventory.store.cjs → inventory.store.cjs} +46 -2
- package/dist/martyrs/src/modules/inventory/store/inventory.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/inventory/store/{ inventory.store.js → inventory.store.js} +46 -2
- package/dist/martyrs/src/modules/inventory/store/inventory.store.js.map +1 -0
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs +180 -19
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +181 -20
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/router/music.cjs +1 -2
- package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.js +1 -2
- package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +3 -4
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +3 -4
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/orders.client.cjs +2 -2
- package/dist/martyrs/src/modules/orders/orders.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/orders.client.js +2 -2
- package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.cjs +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.js +1 -1
- package/dist/martyrs/src/modules/orders/router/customers.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +2 -24
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +5 -27
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.cjs +4 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js +4 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs +195 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +195 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs +402 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +402 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs +86 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +86 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +10 -10
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +11 -11
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +279 -191
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +285 -197
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +7 -7
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.cjs +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.js +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs +42 -41
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js +53 -52
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/organizations.client.cjs +23 -16
- package/dist/martyrs/src/modules/organizations/organizations.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/organizations.client.js +35 -28
- package/dist/martyrs/src/modules/organizations/organizations.client.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/router/departments.router.cjs +0 -18
- package/dist/martyrs/src/modules/organizations/router/departments.router.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/router/departments.router.js +0 -18
- package/dist/martyrs/src/modules/organizations/router/departments.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/store/departments.store.cjs +6 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.js +6 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.cjs +6 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.js +6 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.cjs +20 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.js +20 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.js.map +1 -0
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +3 -4
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -4
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +2 -2
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +3 -3
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs +60 -272
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +62 -274
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +4 -4
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +4 -4
- package/dist/martyrs.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.cjs +9 -9
- package/dist/music.server.js +9 -9
- package/dist/notifications.server.cjs +0 -24
- package/dist/notifications.server.js +0 -24
- package/dist/orders.server.cjs +3 -6
- package/dist/orders.server.js +3 -6
- package/dist/organizations.server.cjs +119 -43
- package/dist/organizations.server.js +119 -43
- package/dist/products.server.cjs +5 -5
- package/dist/products.server.js +5 -5
- package/dist/rents.server.cjs +3 -3
- package/dist/rents.server.js +3 -3
- package/dist/style.css +16 -17
- package/dist/wallet.server.cjs +2 -2
- package/dist/wallet.server.js +2 -2
- package/dist/{web-B5wZTKbK.cjs → web-B0cfxzgu.cjs} +1 -1
- package/dist/{web-520xCgXy.js → web-DVR8m2fm.js} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.rspack.dev.js +20 -12
- package/src/builder/rspack/rspack.config.base.js +16 -15
- package/src/components/Button/Button.vue +1 -1
- package/src/components/Feed/Feed.old.vue +0 -1
- package/src/components/Feed/Feed.vue +1 -31
- package/src/components/Loader/Loader.vue +1 -1
- package/src/modules/auth/FIXES.md +61 -0
- package/src/modules/auth/PROMT.md +33 -0
- package/src/modules/auth/auth.server.js +1 -0
- package/src/modules/auth/views/components/blocks/CardUser.vue +2 -2
- package/src/modules/auth/views/components/layouts/Auth.vue +1 -1
- package/src/modules/auth/views/components/pages/Invite.vue +2 -2
- package/src/modules/auth/views/components/pages/Profile.vue +33 -48
- package/src/modules/auth/views/components/sections/SliderFeatures.vue +5 -7
- package/src/modules/auth/views/store/auth.js +16 -1
- package/src/modules/auth//320/220/320/240/320/245/320/230/320/242/320/225/320/232/320/242/320/243/320/240/320/220.md +445 -0
- package/src/modules/backoffice/components/partials/Sidebar.vue +6 -0
- package/src/modules/chats/CLAUDE.md +137 -0
- package/src/modules/chats/components/blocks/ChatMessage.vue +12 -0
- package/src/modules/chats/components/sections/ChatWindow.vue +84 -2
- package/src/modules/chats/controllers/chats.controller.js +187 -0
- package/src/modules/chats/models/chat.model.js +21 -0
- package/src/modules/chats/routes/chats.routes.js +46 -0
- package/src/modules/chats/store/chat.store.js +67 -0
- package/src/modules/community/components/layouts/Community.vue +2 -2
- package/src/modules/community/components/pages/Posts.vue +3 -328
- package/src/modules/events/components/pages/EditEventTickets.vue +1 -1
- package/src/modules/events/components/pages/Events.vue +2 -2
- package/src/modules/globals/controllers/classes/globals.cache.js +64 -55
- package/src/modules/globals/controllers/classes/globals.logger.js +40 -4
- package/src/modules/globals/controllers/classes/globals.observer.js +54 -4
- package/src/modules/globals/views/components/partials/Header.vue +1 -1
- package/src/modules/globals/views/components/partials/Sidebar.vue +17 -13
- package/src/modules/globals/views/mixins/mixins.js +7 -0
- package/src/modules/inventory/CLAUDE.md +330 -0
- package/src/modules/inventory/PROMT.md +25 -0
- package/src/modules/inventory/components/forms/AdjustmentForm.vue +53 -36
- package/src/modules/inventory/components/forms/ColumnSettingsMenu.vue +11 -6
- package/src/modules/inventory/components/forms/HistoryView.vue +21 -9
- package/src/modules/inventory/components/forms/StockAlertsForm.vue +33 -22
- package/src/modules/inventory/components/pages/Inventory.vue +40 -40
- package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
- package/src/modules/inventory/docs/01-intro.md +126 -0
- package/src/modules/inventory/docs/02-architecture.md +266 -0
- package/src/modules/inventory/docs/03-components-and-relationships.md +338 -0
- package/src/modules/inventory/docs/04-business-logic-and-algorithms.md +376 -0
- package/src/modules/inventory/docs/05-api-specification.md +356 -0
- package/src/modules/inventory/docs/06-access-control.md +320 -0
- package/src/modules/inventory/inventory.server.js +6 -2
- package/src/modules/inventory/{services → middlewares}/inventory.verifier.js +5 -16
- package/src/modules/inventory/models/stock.availability.model.js +20 -7
- package/src/modules/inventory/routes/inventory.routes.js +14 -17
- package/src/modules/inventory/services/adjustment.service.js +137 -0
- package/src/modules/inventory/services/audit.service.js +160 -0
- package/src/modules/inventory/services/availability.service.js +323 -0
- package/src/modules/inventory/services/inventory.helpers.old.js +217 -0
- package/src/modules/inventory/store/{ inventory.store.js → inventory.store.js} +0 -14
- package/src/modules/inventory/workers/inventory.availability.worker.js +29 -30
- package/src/modules/marketplace/views/components/layouts/Marketplace.vue +160 -8
- package/src/modules/notifications/controllers/notifications.controller.js +0 -6
- package/src/modules/notifications/services/notification.service.js +1 -17
- package/src/modules/notifications/services/web-push.service.js +0 -2
- package/src/modules/orders/components/blocks/CardOrderBackoffice.vue +2 -2
- package/src/modules/orders/components/blocks/CardOrderVar1.vue +1 -1
- package/src/modules/orders/controllers/orders.controller.js +2 -4
- package/src/modules/orders/orders.client.js +2 -2
- package/src/modules/orders/router/customers.router.js +1 -1
- package/src/modules/organizations/CLAUDE.md +259 -0
- package/src/modules/organizations/components/blocks/CardDepartment.vue +1 -22
- package/src/modules/organizations/components/blocks/Socials.vue +1 -1
- package/src/modules/organizations/components/elements/ButtonToggleMembership.vue +3 -3
- package/src/modules/organizations/components/forms/AddExistingMembersForm.vue +191 -0
- package/src/modules/organizations/components/forms/DepartmentForm.vue +390 -0
- package/src/modules/organizations/components/forms/InviteForm.vue +81 -0
- package/src/modules/organizations/components/pages/Department.vue +10 -10
- package/src/modules/organizations/components/pages/DepartmentEdit.vue +8 -8
- package/src/modules/organizations/components/pages/Members.vue +265 -171
- package/src/modules/organizations/components/pages/Organization.new.vue +172 -183
- package/src/modules/organizations/components/pages/Organization.vue +6 -6
- package/src/modules/organizations/components/pages/OrganizationEdit.vue +1 -1
- package/src/modules/organizations/components/pages/Organizations.vue +1 -1
- package/src/modules/organizations/components/sections/Organizations.vue +2 -2
- package/src/modules/organizations/components/sections/Publics.vue +4 -4
- package/src/modules/organizations/configs/navigation.organization.config.js +40 -39
- package/src/modules/organizations/controllers/departments.controller.js +53 -34
- package/src/modules/organizations/controllers/invites.controller.js +44 -5
- package/src/modules/organizations/controllers/memberships.controller.js +43 -4
- package/src/modules/organizations/organizations.client.js +24 -15
- package/src/modules/organizations/router/departments.router.js +0 -18
- package/src/modules/organizations/routes/departments.routes.js +6 -8
- package/src/modules/organizations/routes/invites.routes.js +6 -4
- package/src/modules/organizations/routes/memberships.routes.js +6 -5
- package/src/modules/organizations/routes/organizations.routes.js +1 -1
- package/src/modules/organizations/store/departments.store.js +5 -0
- package/src/modules/organizations/store/invites.store.js +5 -0
- package/src/modules/organizations/store/memberships.store.js +23 -0
- package/src/modules/products/components/pages/Products.vue +0 -1
- package/src/modules/spots/components/blocks/CardSpot.vue +1 -1
- package/src/modules/spots/components/pages/Spots.vue +3 -203
- package/src/styles/base/all.scss +0 -15
- package/src/styles/responsive.scss +1 -31
- package/src/styles/typography.scss +20 -5
- package/dist/main-CSzPfQYR.cjs +0 -11
- package/dist/martyrs/src/components/Address/Address.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Chips/Chips.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/Chips/Chips.vue.js.map +0 -1
- package/dist/martyrs/src/components/Dropdown/Dropdown.vue.js.map +0 -1
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.cjs.map +0 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs +0 -76
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js +0 -76
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js.map +0 -1
- package/dist/martyrs/src/modules/inventory/store/ inventory.store.cjs.map +0 -1
- package/dist/martyrs/src/modules/inventory/store/ inventory.store.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +0 -280
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +0 -280
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/departments.cjs +0 -121
- package/dist/martyrs/src/modules/organizations/store/departments.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/departments.js +0 -121
- package/dist/martyrs/src/modules/organizations/store/departments.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/invites.cjs +0 -64
- package/dist/martyrs/src/modules/organizations/store/invites.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/invites.js +0 -64
- package/dist/martyrs/src/modules/organizations/store/invites.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/memberships.cjs +0 -87
- package/dist/martyrs/src/modules/organizations/store/memberships.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/memberships.js +0 -87
- package/dist/martyrs/src/modules/organizations/store/memberships.js.map +0 -1
- package/src/modules/globals/controllers/classes/globals.websocket.ws.js +0 -102
- package/src/modules/globals/views/components/blocks/BlockFilter.vue +0 -60
- package/src/modules/inventory/docs/README.md +0 -291
- package/src/modules/inventory/models/stock.balance.model.js +0 -43
- package/src/modules/inventory/services/inventory.crud.js +0 -710
- package/src/modules/inventory/tests/inventory.test.js +0 -281
- package/src/modules/organizations/store/departments.js +0 -137
- package/src/modules/organizations/store/invites.js +0 -76
- package/src/modules/organizations/store/memberships.js +0 -110
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# 2. Архитектура системы
|
|
2
|
+
|
|
3
|
+
## Общие архитектурные принципы
|
|
4
|
+
|
|
5
|
+
Модуль Inventory построен на основе **многослойной архитектуры** с четким разделением ответственности между слоями. Система использует **materialized views** для оптимизированного хранения расчетных данных доступности товаров.
|
|
6
|
+
|
|
7
|
+
Ключевой особенностью архитектуры является **синхронная модель данных**, где изменения в остатках товаров автоматически запускают пересчет доступности с учетом ингредиентов в рамках той же транзакции.
|
|
8
|
+
|
|
9
|
+
## Архитектурные слои
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────┐
|
|
13
|
+
│ UI Layer (Vue.js) │
|
|
14
|
+
│ components/pages/, components/forms/ │
|
|
15
|
+
└─────────────────┬───────────────────┘
|
|
16
|
+
│ API Calls
|
|
17
|
+
┌─────────────────▼───────────────────┐
|
|
18
|
+
│ Store Layer (Vue 3 Reactive) │
|
|
19
|
+
│ store/inventory.store.js │
|
|
20
|
+
└─────────────────┬───────────────────┘
|
|
21
|
+
│ HTTP Requests
|
|
22
|
+
┌─────────────────▼───────────────────┐
|
|
23
|
+
│ API Layer (Express) │
|
|
24
|
+
│ routes/inventory.routes.js │
|
|
25
|
+
└─────────────────┬───────────────────┘
|
|
26
|
+
│ Business Logic
|
|
27
|
+
┌─────────────────▼───────────────────┐
|
|
28
|
+
│ Service Layer │
|
|
29
|
+
│ adjustment.service.js │
|
|
30
|
+
│ availability.service.js │
|
|
31
|
+
│ audit.service.js │
|
|
32
|
+
│ inventory.helpers.js │
|
|
33
|
+
└─────────────────┬───────────────────┘
|
|
34
|
+
│ Data Operations
|
|
35
|
+
┌─────────────────▼───────────────────┐
|
|
36
|
+
│ Data Layer (MongoDB) │
|
|
37
|
+
│ models/*.model.js │
|
|
38
|
+
└─────────────────────────────────────┘
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Инициализация серверной части
|
|
42
|
+
|
|
43
|
+
Серверная инициализация происходит в файле `inventory.server.js` через функцию `initializeInventory`:
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
function initializeInventory(app, db, origins, publicPath) {
|
|
47
|
+
// 1. Регистрация моделей в глобальном объекте db
|
|
48
|
+
db.stockAdjustment = StockAdjustmentModel(db);
|
|
49
|
+
db.stockAvailability = StockAvailabilityModel(db);
|
|
50
|
+
db.stockAudit = StockAuditModel(db);
|
|
51
|
+
db.stockAlert = StockAlertModel(db);
|
|
52
|
+
|
|
53
|
+
// 2. Подключение маршрутов и политик безопасности
|
|
54
|
+
if (app) {
|
|
55
|
+
inventoryRoutes(app, db, origins, publicPath);
|
|
56
|
+
inventoryPolicies(db);
|
|
57
|
+
|
|
58
|
+
// 3. Инициализация Change Streams для автоматического пересчёта
|
|
59
|
+
const { cache, logger } = createSharedServices(db);
|
|
60
|
+
initChangeStreams(db, logger, recalculateAvailability, (tags) => invalidateCache(cache, logger, tags));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Почему такая последовательность**: Сначала регистрируются модели, чтобы они стали доступны через глобальный объект `db` во всех слоях приложения. Только после этого подключаются маршруты, которые зависят от наличия моделей. Политики безопасности инициализируются вместе с маршрутами. В конце запускаются Change Streams для автоматического пересчёта доступности при изменении ингредиентов товаров.
|
|
66
|
+
|
|
67
|
+
## Инициализация клиентской части
|
|
68
|
+
|
|
69
|
+
Клиентская инициализация в `inventory.client.js` настраивает Vue-роутинг для двух различных контекстов:
|
|
70
|
+
|
|
71
|
+
```javascript
|
|
72
|
+
function initializeInventory(app, store, router, options = {}) {
|
|
73
|
+
// Backoffice routes - полный доступ для администраторов
|
|
74
|
+
if (!options.withBackoffice) {
|
|
75
|
+
addRoutes(router, {
|
|
76
|
+
parentName: options.routeBackoffice || 'Backoffice Root',
|
|
77
|
+
basePath: 'inventory',
|
|
78
|
+
routes: routerInventory,
|
|
79
|
+
routeNamePrefix: 'Backoffice',
|
|
80
|
+
filterConfig: {
|
|
81
|
+
include: ['InventoryList', 'InventoryAudit']
|
|
82
|
+
},
|
|
83
|
+
meta: { context: 'backoffice' }
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Organization routes - ограниченный доступ для организаций
|
|
88
|
+
if (!options.withOrganizationRoutes) {
|
|
89
|
+
addRoutes(router, {
|
|
90
|
+
parentName: options.routeOrganizations || 'OrganizationRoot',
|
|
91
|
+
basePath: 'inventory',
|
|
92
|
+
routes: routerInventory,
|
|
93
|
+
routeNamePrefix: 'Organization',
|
|
94
|
+
filterConfig: {
|
|
95
|
+
include: ['InventoryList', 'InventoryAudit']
|
|
96
|
+
},
|
|
97
|
+
meta: { context: 'organization' }
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Зачем два контекста**:
|
|
104
|
+
- **Backoffice context**: административный интерфейс с полным доступом ко всем функциям
|
|
105
|
+
- **Organization context**: клиентский интерфейс с ограничениями по ownership и функциональности
|
|
106
|
+
|
|
107
|
+
Фильтрация маршрутов через `filterConfig.include` позволяет включать только необходимые страницы для каждого контекста.
|
|
108
|
+
|
|
109
|
+
## Синхронная система пересчета доступности
|
|
110
|
+
|
|
111
|
+
Пересчет доступности товаров происходит **синхронно** в рамках транзакций изменения остатков и **асинхронно** через Change Streams при изменении ингредиентов. Функция `recalculateAvailability` в `inventory.helpers.js` обновляет данные доступности в `StockAvailability`:
|
|
112
|
+
|
|
113
|
+
```javascript
|
|
114
|
+
// В adjustment.service.js - create
|
|
115
|
+
async create(req, res) {
|
|
116
|
+
const session = await db.mongoose.startSession();
|
|
117
|
+
session.startTransaction();
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
// 1. Создание adjustment
|
|
121
|
+
const [adjustment] = await db.stockAdjustment.create([adjustmentData], { session });
|
|
122
|
+
|
|
123
|
+
// 2. Обновление количества в StockAvailability
|
|
124
|
+
const availability = await updateStockQuantity(
|
|
125
|
+
db,
|
|
126
|
+
adjustmentData.product,
|
|
127
|
+
adjustmentData.variant,
|
|
128
|
+
adjustmentData.storage,
|
|
129
|
+
adjustmentData.quantity,
|
|
130
|
+
adjustmentData.owner,
|
|
131
|
+
adjustmentData.creator,
|
|
132
|
+
session
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// 3. Пересчет доступности в той же транзакции
|
|
136
|
+
if (affectedVariants.length) {
|
|
137
|
+
await recalculateAvailability(db, logger, affectedVariants, adjustmentData.storage, session);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
await session.commitTransaction();
|
|
141
|
+
} catch (error) {
|
|
142
|
+
await session.abortTransaction();
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Преимущества синхронного подхода**:
|
|
149
|
+
- **Консистентность данных**: доступность всегда соответствует текущим остаткам
|
|
150
|
+
- **Атомарность**: все изменения происходят в одной транзакции
|
|
151
|
+
- **Простота отладки**: нет асинхронных race conditions
|
|
152
|
+
|
|
153
|
+
### Автоматический пересчёт через Change Streams
|
|
154
|
+
|
|
155
|
+
Система использует MongoDB Change Streams для автоматического пересчёта доступности при изменении ингредиентов товаров. Реализация находится в `inventory.helpers.js`:
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
// inventory.helpers.js - активно используется
|
|
159
|
+
export function initChangeStreams(db, logger, recalculateAvailability, invalidateCache) {
|
|
160
|
+
const pipeline = [
|
|
161
|
+
{ $match: {
|
|
162
|
+
operationType: { $in: ['insert', 'update', 'replace', 'delete'] },
|
|
163
|
+
'fullDocument.ingredients': { $exists: true }
|
|
164
|
+
}}
|
|
165
|
+
];
|
|
166
|
+
|
|
167
|
+
const changeStream = db.variant.collection.watch(pipeline, {
|
|
168
|
+
fullDocument: 'updateLookup'
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
changeStream.on('change', async (change) => {
|
|
172
|
+
// Асинхронный пересчет при изменении ингредиентов
|
|
173
|
+
const variantId = change.documentKey._id;
|
|
174
|
+
const storages = await db.stockAvailability.distinct('storage', {
|
|
175
|
+
variant: variantId
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
for (const storage of storages) {
|
|
179
|
+
await recalculateAvailability(db, logger, [variantId], storage);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
invalidateCache(['availability', `variant:${variantId}`]);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Преимущества интегрированной системы**:
|
|
188
|
+
- Автоматический пересчет при изменении рецептов без задержки основных операций
|
|
189
|
+
- Консистентность данных между ингредиентами и доступностью
|
|
190
|
+
- Асинхронная обработка не блокирует основные операции
|
|
191
|
+
|
|
192
|
+
## Паттерн Observer для межмодульного взаимодействия
|
|
193
|
+
|
|
194
|
+
Система использует Observer pattern для уведомления других модулей о важных событиях:
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
// В adjustment.service.js
|
|
198
|
+
observer.notify('stock.adjusted', {
|
|
199
|
+
adjustment,
|
|
200
|
+
availability,
|
|
201
|
+
affectedVariants
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// В audit.service.js
|
|
205
|
+
observer.notify('inventory.completed', {
|
|
206
|
+
inventory,
|
|
207
|
+
affectedVariants
|
|
208
|
+
});
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Зачем Observer**: Прямые вызовы между модулями создают tight coupling. Observer позволяет:
|
|
212
|
+
- **Расширяемость**: новые модули могут подписываться на события без изменения inventory
|
|
213
|
+
- **Асинхронность**: события обрабатываются через `setImmediate()`, не блокируя основной поток
|
|
214
|
+
- **Отказоустойчивость**: падение одного обработчика не влияет на других
|
|
215
|
+
|
|
216
|
+
## Кеширование и производительность
|
|
217
|
+
|
|
218
|
+
Архитектура включает многоуровневое кеширование для обеспечения производительности:
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
// Кеширование в service layer (availability.service.js)
|
|
222
|
+
const { cache, logger } = createSharedServices(db);
|
|
223
|
+
const cacheKey = JSON.stringify({ type: 'availability', ...req.verifiedQuery });
|
|
224
|
+
|
|
225
|
+
let data = await cache.get(cacheKey);
|
|
226
|
+
if (!data) {
|
|
227
|
+
data = await db.stockAvailability.aggregate(pipeline).exec();
|
|
228
|
+
await cache.setWithTags(cacheKey, data, ['availability']);
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Стратегия инвалидации**: Используется tag-based invalidation через функцию `invalidateCache` из `inventory.helpers.js`:
|
|
233
|
+
- Изменение количества → инвалидация тегов `['availability']`
|
|
234
|
+
- Создание adjustment → инвалидация тегов `['adjustments', 'availability']`
|
|
235
|
+
- Завершение инвентаризации → инвалидация тегов `['adjustments', 'availability', 'inventories']`
|
|
236
|
+
|
|
237
|
+
## Транзакционная целостность
|
|
238
|
+
|
|
239
|
+
Критические операции (adjustments, audit completion) выполняются в MongoDB транзакциях:
|
|
240
|
+
|
|
241
|
+
```javascript
|
|
242
|
+
const session = await db.mongoose.startSession();
|
|
243
|
+
session.startTransaction();
|
|
244
|
+
|
|
245
|
+
try {
|
|
246
|
+
// 1. Создание adjustment
|
|
247
|
+
const [adjustment] = await db.stockAdjustment.create([adjustmentData], { session });
|
|
248
|
+
|
|
249
|
+
// 2. Обновление количества в StockAvailability
|
|
250
|
+
const availability = await updateStockQuantity(
|
|
251
|
+
db, product, variant, storage, quantity, owner, creator, session
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
// 3. Пересчет доступности с учётом ингредиентов
|
|
255
|
+
await recalculateAvailability(db, logger, affectedVariants, storage, session);
|
|
256
|
+
|
|
257
|
+
await session.commitTransaction();
|
|
258
|
+
} catch (error) {
|
|
259
|
+
await session.abortTransaction();
|
|
260
|
+
throw error;
|
|
261
|
+
} finally {
|
|
262
|
+
session.endSession();
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Атомарность операций**: Без транзакций возможны race conditions, когда количество обновилось, но доступность еще не пересчиталась. Транзакции гарантируют, что система никогда не находится в inconsistent состоянии. Все операции изменения остатков выполняются атомарно вместе с пересчётом доступности.
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# 3. Компоненты и их взаимодействие
|
|
2
|
+
|
|
3
|
+
## Route Layer - HTTP API endpoints
|
|
4
|
+
|
|
5
|
+
### Основные маршруты инвентаризации
|
|
6
|
+
|
|
7
|
+
Файл `inventory.routes.js` определяет основные HTTP endpoints с полной middleware цепочкой:
|
|
8
|
+
|
|
9
|
+
```javascript
|
|
10
|
+
export default function(app, db) {
|
|
11
|
+
const jwt = jwtFactory(db);
|
|
12
|
+
const verifier = verifierFactory(db);
|
|
13
|
+
const abac = getInstance(db);
|
|
14
|
+
const adjustmentService = adjustmentServiceFactory(db);
|
|
15
|
+
const availabilityService = availabilityServiceFactory(db);
|
|
16
|
+
const auditService = auditServiceFactory(db);
|
|
17
|
+
|
|
18
|
+
// Типичная цепочка middleware: Auth → Validation → Authorization → Business Logic
|
|
19
|
+
app.post('/api/inventory/adjustments/create',
|
|
20
|
+
jwt.verifyToken(), // JWT аутентификация
|
|
21
|
+
verifier.verifyAdjustmentBody, // Валидация входных данных
|
|
22
|
+
abac.middleware('stockAdjustment', 'create'), // ABAC авторизация
|
|
23
|
+
adjustmentService.create // Бизнес-логика
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Архитектурная особенность**: Каждый маршрут проходит через стандартизированную цепочку middleware, что обеспечивает:
|
|
29
|
+
- **Единообразие**: одинаковая схема безопасности для всех endpoints
|
|
30
|
+
- **Расширяемость**: легко добавить новые middleware без изменения бизнес-логики
|
|
31
|
+
- **Тестируемость**: каждый слой можно тестировать изолированно
|
|
32
|
+
|
|
33
|
+
### Группировка endpoints по сущностям
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
// StockAdjustment routes
|
|
37
|
+
app.get('/api/inventory/adjustments', ...) // Чтение списка движений
|
|
38
|
+
app.post('/api/inventory/adjustments/create', ...) // Создание движения
|
|
39
|
+
|
|
40
|
+
// StockAvailability routes
|
|
41
|
+
app.get('/api/inventory/availability', ...) // Текущие остатки и доступность
|
|
42
|
+
|
|
43
|
+
// StockAudit routes
|
|
44
|
+
app.get('/api/inventory/audits', ...) // Список инвентаризаций
|
|
45
|
+
app.post('/api/inventory/audits/create', ...) // Создание инвентаризации
|
|
46
|
+
app.post('/api/inventory/audits/complete', ...) // Завершение инвентаризации
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Зачем такая группировка**: Каждая группа endpoints соответствует отдельной бизнес-сущности, что упрощает:
|
|
50
|
+
- **API discovery**: разработчикам понятно, где искать нужную функциональность
|
|
51
|
+
- **Версионирование**: можно изменять API для одной сущности независимо от других
|
|
52
|
+
- **Мониторинг**: метрики можно собирать по типам операций
|
|
53
|
+
|
|
54
|
+
### CRUD паттерн для Stock Alerts
|
|
55
|
+
|
|
56
|
+
Файл `stock.alerts.routes.js` демонстрирует использование универсального CRUD класса:
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
const stockAlertsCRUD = new CRUD({
|
|
60
|
+
app, db,
|
|
61
|
+
model: db.stockAlert,
|
|
62
|
+
modelName: 'stockAlert',
|
|
63
|
+
basePath: '/api/inventory/alerts',
|
|
64
|
+
|
|
65
|
+
auth: true, // Требует аутентификации
|
|
66
|
+
|
|
67
|
+
verifiers: { // Кастомные валидаторы для каждой операции
|
|
68
|
+
create: verifier.createVerifier,
|
|
69
|
+
read: verifier.readVerifier,
|
|
70
|
+
update: verifier.updateVerifier,
|
|
71
|
+
delete: verifier.deleteVerifier
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
abac: abac, // ABAC авторизация
|
|
75
|
+
|
|
76
|
+
cache: { // Конфигурация кеширования
|
|
77
|
+
enabled: true,
|
|
78
|
+
ttl: 300,
|
|
79
|
+
tags: ['stockAlerts', 'inventory']
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
events: { // Система событий
|
|
83
|
+
enabled: true,
|
|
84
|
+
logReads: false // Не логировать чтение (слишком много событий)
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Преимущества CRUD паттерна**:
|
|
90
|
+
- **Стандартизация**: все CRUD операции работают одинаково
|
|
91
|
+
- **Конфигурируемость**: можно настроить кеширование, события, валидацию отдельно для каждой сущности
|
|
92
|
+
- **DRY принцип**: не нужно дублировать код для базовых операций
|
|
93
|
+
|
|
94
|
+
## Store Layer - Клиентское состояние
|
|
95
|
+
|
|
96
|
+
### Reactive State Management
|
|
97
|
+
|
|
98
|
+
Файл ` inventory.store.js` использует Vue 3 Composition API для управления состоянием:
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
const state = reactive({
|
|
102
|
+
// Основные коллекции данных
|
|
103
|
+
adjustments: [], // История движений товаров
|
|
104
|
+
availability: [], // Текущие остатки и доступность для продажи
|
|
105
|
+
inventories: [], // Список инвентаризаций
|
|
106
|
+
|
|
107
|
+
// Состояние текущей операции (например, создание инвентаризации)
|
|
108
|
+
current: {
|
|
109
|
+
storage: null, // Выбранный склад
|
|
110
|
+
positions: [], // Позиции в инвентаризации
|
|
111
|
+
comment: '', // Комментарий
|
|
112
|
+
status: 'draft' // Статус draft/published
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// Фильтры для поиска и сортировки
|
|
116
|
+
filters: {
|
|
117
|
+
storage: null, // Фильтр по складу
|
|
118
|
+
product: null, // Фильтр по товару
|
|
119
|
+
dateStart: null, // Период от
|
|
120
|
+
dateEnd: null // Период до
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Почему reactive**: Vue 3 reactive обеспечивает автоматическое обновление UI при изменении данных без необходимости вызывать специальные методы обновления.
|
|
126
|
+
|
|
127
|
+
### Actions - API Integration
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
const actions = {
|
|
131
|
+
async createAdjustment(data) {
|
|
132
|
+
try {
|
|
133
|
+
const response = await $axios.post('/api/inventory/adjustments/create', data);
|
|
134
|
+
state.adjustments.unshift(response.data); // Добавляем в начало списка
|
|
135
|
+
return response.data;
|
|
136
|
+
} catch (error) {
|
|
137
|
+
setError(error); // Глобальная обработка ошибок
|
|
138
|
+
throw error; // Пробрасываем для компонента
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Паттерн обработки**: Каждый action выполняет три операции:
|
|
145
|
+
1. **API запрос**: отправка данных на сервер
|
|
146
|
+
2. **State update**: обновление локального состояния
|
|
147
|
+
3. **Error handling**: обработка ошибок через глобальную систему
|
|
148
|
+
|
|
149
|
+
### Mutations - State Modifications
|
|
150
|
+
|
|
151
|
+
```javascript
|
|
152
|
+
const mutations = {
|
|
153
|
+
addPosition(position) {
|
|
154
|
+
state.current.positions.push(position); // Добавление позиции в инвентаризацию
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
removePosition(index) {
|
|
158
|
+
state.current.positions.splice(index, 1); // Удаление позиции
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
resetCurrent() { // Сброс текущей операции
|
|
162
|
+
state.current = {
|
|
163
|
+
storage: null,
|
|
164
|
+
positions: [],
|
|
165
|
+
comment: '',
|
|
166
|
+
status: 'draft'
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Separation of Concerns**: Mutations отвечают только за изменение состояния, а actions - за взаимодействие с API. Это упрощает тестирование и отладку.
|
|
173
|
+
|
|
174
|
+
## Component Layer - UI интеграция
|
|
175
|
+
|
|
176
|
+
### Context-Aware Navigation
|
|
177
|
+
|
|
178
|
+
Компонент `Inventory.vue` адаптируется к контексту выполнения:
|
|
179
|
+
|
|
180
|
+
```vue
|
|
181
|
+
<template>
|
|
182
|
+
<header class="mn-b-medium flex-v-center flex-nowrap flex">
|
|
183
|
+
<h2>Inventory</h2>
|
|
184
|
+
|
|
185
|
+
<!-- Кнопка создания инвентаризации - зависит от контекста -->
|
|
186
|
+
<button
|
|
187
|
+
v-if="route.meta.context === 'backoffice'"
|
|
188
|
+
@click="router.push({ name: 'BackofficeInventoryAudit' })"
|
|
189
|
+
class="mn-l-small radius-100 i-big hover-scale-1 cursor-pointer t-white bg-second"
|
|
190
|
+
/>
|
|
191
|
+
|
|
192
|
+
<button
|
|
193
|
+
v-if="route.meta.context === 'organization'"
|
|
194
|
+
@click="router.push({ name: 'OrganizationInventoryAudit', params: { _id: route.params._id } })"
|
|
195
|
+
class="mn-l-small radius-100 i-big hover-scale-1 cursor-pointer t-white bg-second"
|
|
196
|
+
/>
|
|
197
|
+
</header>
|
|
198
|
+
</template>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Адаптивность**: Один компонент работает в двух режимах:
|
|
202
|
+
- **Backoffice**: полные админские права без привязки к конкретной организации
|
|
203
|
+
- **Organization**: работа в рамках конкретной организации (параметр `_id`)
|
|
204
|
+
|
|
205
|
+
### Feed Integration Pattern
|
|
206
|
+
|
|
207
|
+
```vue
|
|
208
|
+
<Feed
|
|
209
|
+
:search="true"
|
|
210
|
+
v-model:sort="sort"
|
|
211
|
+
:store="{
|
|
212
|
+
read: (options) => products.actions.read(options), // Делегирование чтения в products store
|
|
213
|
+
state: products.state
|
|
214
|
+
}"
|
|
215
|
+
:options="{
|
|
216
|
+
limit: 15,
|
|
217
|
+
lookup: ['inventory','categories'], // Подключение инвентарных данных
|
|
218
|
+
owner: route.params._id, // Фильтрация по владельцу
|
|
219
|
+
sortParam: sort.param,
|
|
220
|
+
sortOrder: sort.order
|
|
221
|
+
}"
|
|
222
|
+
v-slot="{ items }"
|
|
223
|
+
>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Паттерн интеграции**: Компонент Inventory не работает напрямую с товарами, а делегирует это Products store. При этом он добавляет lookup для инвентарных данных, получая комбинированную информацию.
|
|
227
|
+
|
|
228
|
+
### Table Customization
|
|
229
|
+
|
|
230
|
+
```vue
|
|
231
|
+
<Table
|
|
232
|
+
:columns="columns.filter(col => col.visible)" // Динамические колонки
|
|
233
|
+
:items="items"
|
|
234
|
+
class="bg-white z-index-1 br-solid br-1px br-light radius-medium"
|
|
235
|
+
>
|
|
236
|
+
<!-- Кастомная ячейка для отображения доступности -->
|
|
237
|
+
<template #cell-available="{ row }">
|
|
238
|
+
<div class="flex-column flex">
|
|
239
|
+
<span class="d-block mn-b-thin">
|
|
240
|
+
{{ row.totalAvailable || 0 }}
|
|
241
|
+
</span>
|
|
242
|
+
|
|
243
|
+
<!-- Прогресс-бар уровня запасов -->
|
|
244
|
+
<div class="w-full h-0-5r bg-light radius-small overflow-hidden">
|
|
245
|
+
<div
|
|
246
|
+
class="h-full radius-small"
|
|
247
|
+
:class="getStockLevelClass(row.totalAvailable)"
|
|
248
|
+
:style="{ width: getStockLevelPercent(row.totalAvailable) + '%' }"
|
|
249
|
+
/>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
</template>
|
|
253
|
+
|
|
254
|
+
<!-- Кастомная ячейка для складов -->
|
|
255
|
+
<template #cell-storages="{ row }">
|
|
256
|
+
<div class="w-max-10r flex-nowrap flex t-trim">
|
|
257
|
+
<p
|
|
258
|
+
v-if="row.availabilityDetails?.length"
|
|
259
|
+
v-for="avail in row.availabilityDetails"
|
|
260
|
+
:key="avail._id"
|
|
261
|
+
class="w-max t-trim pd-small mn-r-micro radius-small bg-light t-small"
|
|
262
|
+
>
|
|
263
|
+
<span class="t-medium">{{ avail.available || 0 }}</span> ·
|
|
264
|
+
<span class="t-small">{{ avail.storageName || avail.storage }}:</span>
|
|
265
|
+
</p>
|
|
266
|
+
<p v-else>No stock</p>
|
|
267
|
+
</div>
|
|
268
|
+
</template>
|
|
269
|
+
</Table>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Rich Data Presentation**: Компонент не только отображает сырые данные, но и:
|
|
273
|
+
- **Визуализирует уровни запасов** через цветовые индикаторы и прогресс-бары
|
|
274
|
+
- **Группирует данные по складам** для удобного восприятия
|
|
275
|
+
- **Позволяет настраивать видимость колонок** через `columns.filter(col => col.visible)`
|
|
276
|
+
|
|
277
|
+
## Межкомпонентное взаимодействие
|
|
278
|
+
|
|
279
|
+
### Цепочка передачи данных
|
|
280
|
+
|
|
281
|
+
```
|
|
282
|
+
User Action (click) → Component Event Handler → Store Action → API Request → Server Controller → Database → Response → Store State Update → Component Re-render
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Конкретный пример - создание stock adjustment**:
|
|
286
|
+
|
|
287
|
+
1. **User Action**: Пользователь заполняет `AdjustmentForm.vue` и нажимает "Save"
|
|
288
|
+
2. **Component**: `AdjustmentForm.vue` эмитит событие `@save` с данными adjustment
|
|
289
|
+
3. **Parent Component**: `Inventory.vue` получает событие и вызывает `inventory.actions.createAdjustment(data)`
|
|
290
|
+
4. **Store Action**: Отправляет POST `/api/inventory/adjustments/create`
|
|
291
|
+
5. **Server Route**: `jwt.verifyToken() → verifier.verifyAdjustmentBody → abac.middleware → adjustmentService.create`
|
|
292
|
+
6. **Business Logic**: Создает adjustment, обновляет количество в StockAvailability, пересчитывает доступность
|
|
293
|
+
7. **Response**: Возвращает созданный объekt adjustment
|
|
294
|
+
8. **Store Update**: `state.adjustments.unshift(response.data)`
|
|
295
|
+
9. **UI Update**: Таблица автоматически обновляется через reactive связь
|
|
296
|
+
|
|
297
|
+
### Event Bus Pattern
|
|
298
|
+
|
|
299
|
+
```javascript
|
|
300
|
+
// В adjustment.service.js
|
|
301
|
+
observer.notify('stock.adjusted', {
|
|
302
|
+
adjustment,
|
|
303
|
+
availability,
|
|
304
|
+
affectedVariants
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// В другом модуле
|
|
308
|
+
observer.on('stock.adjusted', (data) => {
|
|
309
|
+
// Реакция на изменение остатков
|
|
310
|
+
updateRelatedData(data.affectedVariants);
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Слабая связанность**: Компоненты не знают друг о друге напрямую, что позволяет:
|
|
315
|
+
- **Легко добавлять новые обработчики** без изменения основного кода
|
|
316
|
+
- **Изолировать ошибки**: падение одного обработчика не влияет на другие
|
|
317
|
+
- **Упрощать тестирование**: можно мокать события
|
|
318
|
+
|
|
319
|
+
## Dependency Injection Pattern
|
|
320
|
+
|
|
321
|
+
### Factory Pattern для Services
|
|
322
|
+
|
|
323
|
+
```javascript
|
|
324
|
+
// В routes/inventory.routes.js
|
|
325
|
+
const jwt = jwtFactory(db); // Создание JWT service с доступом к db
|
|
326
|
+
const verifier = verifierFactory(db); // Создание validator service
|
|
327
|
+
const abac = getInstance(db); // Singleton ABAC instance
|
|
328
|
+
const adjustmentService = adjustmentServiceFactory(db); // Создание adjustment service
|
|
329
|
+
const availabilityService = availabilityServiceFactory(db); // Создание availability service
|
|
330
|
+
const auditService = auditServiceFactory(db); // Создание audit service
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Преимущества**:
|
|
334
|
+
- **Тестируемость**: легко подставить моки вместо реальных services
|
|
335
|
+
- **Конфигурируемость**: можно передавать разные конфигурации через параметры
|
|
336
|
+
- **Отложенная инициализация**: services создаются только когда нужны
|
|
337
|
+
|
|
338
|
+
Эта архитектура обеспечивает высокую модульность и maintainability кода, позволяя легко тестировать, расширять и модифицировать отдельные компоненты без влияния на систему в целом.
|