@things-factory/operato-wms 5.0.13 → 6.0.0-alpha.1

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.
Files changed (206) hide show
  1. package/client/pages/bulk-operation/bulk-operation.js +96 -8
  2. package/client/pages/bulk-operation/validate-gan-popup.js +37 -27
  3. package/client/pages/bulk-operation/validate-ro-popup.js +40 -0
  4. package/client/pages/components/select-inventory-popup.js +633 -0
  5. package/client/pages/constants/order.js +2 -1
  6. package/client/pages/inbound/pallet-label-popup.js +2 -0
  7. package/client/pages/inbound/select-product-batch.js +7 -1
  8. package/client/pages/inbound/undo-unload-popup.js +37 -21
  9. package/client/pages/inbound/unload-product.js +147 -59
  10. package/client/pages/inbound/worksheet-putaway.js +1 -1
  11. package/client/pages/inbound/worksheet-unloading.js +11 -7
  12. package/client/pages/inventory/inventory-adjustment.js +261 -238
  13. package/client/pages/inventory/inventory-by-product-detail.js +99 -92
  14. package/client/pages/inventory/inventory-by-product.js +170 -68
  15. package/client/pages/inventory/onhand-inventory.js +10 -12
  16. package/client/pages/inventory/serial-number-list-popup.js +36 -5
  17. package/client/pages/inventory-check/inspecting-product.js +1 -1
  18. package/client/pages/manifest/create-loading-manifest.js +47 -22
  19. package/client/pages/manifest/dispatcher-verification-popup.js +24 -13
  20. package/client/pages/manifest/loading-manifest-detail.js +311 -46
  21. package/client/pages/manifest/loading-manifest-list.js +86 -13
  22. package/client/pages/order/arrival-notice/arrival-notice-detail.js +305 -52
  23. package/client/pages/order/arrival-notice/arrival-notice-list.js +20 -1
  24. package/client/pages/order/arrival-notice/create-arrival-notice.js +2 -2
  25. package/client/pages/order/goods-received-note/received-note-detail.js +187 -15
  26. package/client/pages/order/release-order/b2b/b2b-order-list.js +76 -80
  27. package/client/pages/order/release-order/b2c/b2c-order-requests.js +148 -123
  28. package/client/pages/order/release-order/batch-picking-popup.js +11 -0
  29. package/client/pages/order/release-order/create-release-order.js +762 -250
  30. package/client/pages/order/release-order/release-extra-product-popup.js +10 -3
  31. package/client/pages/order/release-order/release-order-detail.js +897 -215
  32. package/client/pages/order/transport-order/delivery-note-popup.js +1050 -107
  33. package/client/pages/order/transport-order/print-delivery-note.js +214 -33
  34. package/client/pages/order/transport-order/upload-delivery-note.js +6 -4
  35. package/client/pages/order/transport-order/view-delivery-note.js +0 -1
  36. package/client/pages/outbound/generate-worksheet-popup.js +374 -0
  37. package/client/pages/outbound/inventory-reassign-popup.js +1097 -0
  38. package/client/pages/outbound/loading-product.js +88 -78
  39. package/client/pages/outbound/merged-outbound-worksheet.js +1 -1
  40. package/client/pages/outbound/packing-product.js +193 -82
  41. package/client/pages/outbound/packing-worksheet-list.js +10 -9
  42. package/client/pages/outbound/picking-product.js +979 -905
  43. package/client/pages/outbound/route-label-popup.js +283 -191
  44. package/client/pages/outbound/serial-number-popup.js +1 -0
  45. package/client/pages/outbound/sorting-product.js +12 -12
  46. package/client/pages/outbound/worksheet-batch-picking.js +39 -5
  47. package/client/pages/outbound/worksheet-packing.js +17 -4
  48. package/client/pages/outbound/worksheet-picking.js +45 -6
  49. package/client/pages/report/inbound-serial-number-report.js +86 -9
  50. package/client/pages/report/inventory-report.js +10 -0
  51. package/client/pages/report/inventory-summary-report.js +28 -19
  52. package/client/pages/report/outbound-order-details-report.js +204 -43
  53. package/client/pages/report/outbound-serial-number-report.js +87 -9
  54. package/client/pages/report/release-inventory-report.js +503 -0
  55. package/client/route.js +5 -0
  56. package/client/util/index.js +2 -0
  57. package/client/util/page-settings.js +43 -0
  58. package/client/util/toast.js +10 -0
  59. package/dist-server/graphql/resolvers/board-setting/board-settings.js +3 -3
  60. package/dist-server/graphql/resolvers/board-setting/board-settings.js.map +1 -1
  61. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.js +2 -2
  62. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.js.map +1 -1
  63. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-order-inventory-report.js +1 -1
  64. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-order-inventory-report.js.map +1 -1
  65. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-pallet-detail-report.js +2 -2
  66. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-pallet-detail-report.js.map +1 -1
  67. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.js +9 -10
  68. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.js.map +1 -1
  69. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js +2 -2
  70. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js.map +1 -1
  71. package/dist-server/graphql/resolvers/custom/elccl/elccl-onhand-inventory-counter.js +6 -4
  72. package/dist-server/graphql/resolvers/custom/elccl/elccl-onhand-inventory-counter.js.map +1 -1
  73. package/dist-server/graphql/resolvers/custom/kimeda/kimeda-onhand-inventory-counter.js +6 -4
  74. package/dist-server/graphql/resolvers/custom/kimeda/kimeda-onhand-inventory-counter.js.map +1 -1
  75. package/dist-server/graphql/resolvers/dashboard/arrival-notices-by-status.js +21 -10
  76. package/dist-server/graphql/resolvers/dashboard/arrival-notices-by-status.js.map +1 -1
  77. package/dist-server/graphql/resolvers/dashboard/collection-orders-by-status.js +1 -2
  78. package/dist-server/graphql/resolvers/dashboard/collection-orders-by-status.js.map +1 -1
  79. package/dist-server/graphql/resolvers/dashboard/delivery-orders-by-status.js +1 -2
  80. package/dist-server/graphql/resolvers/dashboard/delivery-orders-by-status.js.map +1 -1
  81. package/dist-server/graphql/resolvers/dashboard/index.js +2 -1
  82. package/dist-server/graphql/resolvers/dashboard/index.js.map +1 -1
  83. package/dist-server/graphql/resolvers/dashboard/inventory-expiry-monitor.js +17 -1
  84. package/dist-server/graphql/resolvers/dashboard/inventory-expiry-monitor.js.map +1 -1
  85. package/dist-server/graphql/resolvers/dashboard/outbound-order-by-status.js +113 -75
  86. package/dist-server/graphql/resolvers/dashboard/outbound-order-by-status.js.map +1 -1
  87. package/dist-server/graphql/resolvers/dashboard/release-goods-by-status.js +21 -10
  88. package/dist-server/graphql/resolvers/dashboard/release-goods-by-status.js.map +1 -1
  89. package/dist-server/graphql/resolvers/dashboard/unit-inbounded-outbounded.js +56 -0
  90. package/dist-server/graphql/resolvers/dashboard/unit-inbounded-outbounded.js.map +1 -0
  91. package/dist-server/graphql/resolvers/index.js +5 -4
  92. package/dist-server/graphql/resolvers/index.js.map +1 -1
  93. package/dist-server/graphql/resolvers/inventory-comparison/inventory-comparison-list.js.map +1 -1
  94. package/dist-server/graphql/resolvers/opa-menu/opa-menus.js +8 -7
  95. package/dist-server/graphql/resolvers/opa-menu/opa-menus.js.map +1 -1
  96. package/dist-server/graphql/resolvers/{extra → other}/add-release-good-products.js +59 -8
  97. package/dist-server/graphql/resolvers/other/add-release-good-products.js.map +1 -0
  98. package/dist-server/graphql/resolvers/{extra → other}/index.js +3 -1
  99. package/dist-server/graphql/resolvers/other/index.js.map +1 -0
  100. package/dist-server/graphql/resolvers/other/page-settings.js +87 -0
  101. package/dist-server/graphql/resolvers/other/page-settings.js.map +1 -0
  102. package/dist-server/graphql/resolvers/reports/costing-report.js +4 -4
  103. package/dist-server/graphql/resolvers/reports/costing-report.js.map +1 -1
  104. package/dist-server/graphql/resolvers/reports/inbound-order-details-report.js +3 -3
  105. package/dist-server/graphql/resolvers/reports/inbound-order-details-report.js.map +1 -1
  106. package/dist-server/graphql/resolvers/reports/inbound-serial-number-report.js +36 -7
  107. package/dist-server/graphql/resolvers/reports/inbound-serial-number-report.js.map +1 -1
  108. package/dist-server/graphql/resolvers/reports/index.js +2 -1
  109. package/dist-server/graphql/resolvers/reports/index.js.map +1 -1
  110. package/dist-server/graphql/resolvers/reports/outbound-order-details-report.js +69 -30
  111. package/dist-server/graphql/resolvers/reports/outbound-order-details-report.js.map +1 -1
  112. package/dist-server/graphql/resolvers/reports/outbound-serial-number-report.js +36 -11
  113. package/dist-server/graphql/resolvers/reports/outbound-serial-number-report.js.map +1 -1
  114. package/dist-server/graphql/resolvers/reports/product-label-report.js +3 -3
  115. package/dist-server/graphql/resolvers/reports/product-label-report.js.map +1 -1
  116. package/dist-server/graphql/resolvers/reports/release-inventory-report.js +180 -0
  117. package/dist-server/graphql/resolvers/reports/release-inventory-report.js.map +1 -0
  118. package/dist-server/graphql/resolvers/shipping-provider/shipping-providers.js +2 -2
  119. package/dist-server/graphql/resolvers/shipping-provider/shipping-providers.js.map +1 -1
  120. package/dist-server/graphql/resolvers/warehouse-inventory-adjustment/warehouse-intentory-adjustment.js +1 -1
  121. package/dist-server/graphql/resolvers/warehouse-inventory-adjustment/warehouse-intentory-adjustment.js.map +1 -1
  122. package/dist-server/graphql/types/dashboard/index.js +1 -0
  123. package/dist-server/graphql/types/dashboard/index.js.map +1 -1
  124. package/dist-server/graphql/types/index.js +7 -2
  125. package/dist-server/graphql/types/index.js.map +1 -1
  126. package/dist-server/graphql/types/other/index.js +19 -0
  127. package/dist-server/graphql/types/other/index.js.map +1 -0
  128. package/dist-server/graphql/types/other/page-setting.js +34 -0
  129. package/dist-server/graphql/types/other/page-setting.js.map +1 -0
  130. package/dist-server/graphql/types/reports/index.js +6 -1
  131. package/dist-server/graphql/types/reports/index.js.map +1 -1
  132. package/dist-server/graphql/types/reports/outbound-order-details-report.js +17 -1
  133. package/dist-server/graphql/types/reports/outbound-order-details-report.js.map +1 -1
  134. package/dist-server/graphql/types/reports/release-inventory-report-list.js +12 -0
  135. package/dist-server/graphql/types/reports/release-inventory-report-list.js.map +1 -0
  136. package/dist-server/graphql/types/reports/release-inventory-report.js +27 -0
  137. package/dist-server/graphql/types/reports/release-inventory-report.js.map +1 -0
  138. package/dist-server/migrations/1568858861188-SeedSetting.js +5 -6
  139. package/dist-server/migrations/1568858861188-SeedSetting.js.map +1 -1
  140. package/dist-server/migrations/1623308919899-SeedLocationRecommendSetting.js +1 -1
  141. package/dist-server/migrations/1623308919899-SeedLocationRecommendSetting.js.map +1 -1
  142. package/dist-server/migrations/1623381200659-SeedStoringRule.js +1 -1
  143. package/dist-server/migrations/1623381200659-SeedStoringRule.js.map +1 -1
  144. package/dist-server/tsconfig.tsbuildinfo +1 -1
  145. package/dist-server/utils/report-query-util.js +5 -2
  146. package/dist-server/utils/report-query-util.js.map +1 -1
  147. package/helps/release-note.ko.md +8 -20
  148. package/helps/release-note.md +8 -20
  149. package/helps/release-note.ms.md +8 -20
  150. package/helps/release-note.zh.md +8 -20
  151. package/package.json +42 -42
  152. package/server/graphql/resolvers/board-setting/board-settings.ts +4 -6
  153. package/server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.ts +4 -5
  154. package/server/graphql/resolvers/custom/elccl/elccl-daily-order-inventory-report.ts +9 -10
  155. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-pallet-detail-report.ts +4 -5
  156. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.ts +17 -19
  157. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.ts +10 -8
  158. package/server/graphql/resolvers/custom/elccl/elccl-onhand-inventory-counter.ts +9 -9
  159. package/server/graphql/resolvers/custom/kimeda/kimeda-onhand-inventory-counter.ts +9 -9
  160. package/server/graphql/resolvers/dashboard/arrival-notices-by-status.ts +23 -14
  161. package/server/graphql/resolvers/dashboard/collection-orders-by-status.ts +4 -5
  162. package/server/graphql/resolvers/dashboard/delivery-orders-by-status.ts +4 -5
  163. package/server/graphql/resolvers/dashboard/index.ts +3 -1
  164. package/server/graphql/resolvers/dashboard/inventory-expiry-monitor.ts +18 -6
  165. package/server/graphql/resolvers/dashboard/outbound-order-by-status.ts +114 -81
  166. package/server/graphql/resolvers/dashboard/release-goods-by-status.ts +23 -14
  167. package/server/graphql/resolvers/dashboard/unit-inbounded-outbounded.ts +61 -0
  168. package/server/graphql/resolvers/index.ts +5 -4
  169. package/server/graphql/resolvers/inventory-comparison/inventory-comparison-list.ts +11 -9
  170. package/server/graphql/resolvers/opa-menu/opa-menus.ts +7 -6
  171. package/server/graphql/resolvers/{extra → other}/add-release-good-products.ts +73 -12
  172. package/server/graphql/resolvers/other/index.ts +10 -0
  173. package/server/graphql/resolvers/other/page-settings.ts +105 -0
  174. package/server/graphql/resolvers/reports/costing-report.ts +8 -10
  175. package/server/graphql/resolvers/reports/inbound-order-details-report.ts +7 -9
  176. package/server/graphql/resolvers/reports/inbound-serial-number-report.ts +41 -13
  177. package/server/graphql/resolvers/reports/index.ts +3 -1
  178. package/server/graphql/resolvers/reports/outbound-order-details-report.ts +76 -38
  179. package/server/graphql/resolvers/reports/outbound-serial-number-report.ts +42 -18
  180. package/server/graphql/resolvers/reports/product-label-report.ts +4 -6
  181. package/server/graphql/resolvers/reports/release-inventory-report.ts +201 -0
  182. package/server/graphql/resolvers/shipping-provider/shipping-providers.ts +3 -5
  183. package/server/graphql/resolvers/warehouse-inventory-adjustment/warehouse-intentory-adjustment.ts +10 -10
  184. package/server/graphql/types/dashboard/index.ts +1 -0
  185. package/server/graphql/types/index.ts +8 -2
  186. package/server/graphql/types/other/index.ts +19 -0
  187. package/server/graphql/types/other/page-setting.ts +33 -0
  188. package/server/graphql/types/reports/index.ts +6 -1
  189. package/server/graphql/types/reports/outbound-order-details-report.ts +17 -1
  190. package/server/graphql/types/reports/release-inventory-report-list.ts +8 -0
  191. package/server/graphql/types/reports/release-inventory-report.ts +23 -0
  192. package/server/migrations/1568858861188-SeedSetting.ts +4 -4
  193. package/server/migrations/1623308919899-SeedLocationRecommendSetting.ts +3 -2
  194. package/server/migrations/1623381200659-SeedStoringRule.ts +3 -2
  195. package/server/utils/report-query-util.ts +5 -2
  196. package/things-factory.config.js +4 -0
  197. package/translations/en.json +148 -27
  198. package/translations/ko.json +185 -105
  199. package/translations/ms.json +183 -98
  200. package/translations/zh.json +197 -112
  201. package/dist-server/graphql/resolvers/extra/add-release-good-products.js.map +0 -1
  202. package/dist-server/graphql/resolvers/extra/index.js.map +0 -1
  203. package/dist-server/graphql/types/extra/index.js +0 -11
  204. package/dist-server/graphql/types/extra/index.js.map +0 -1
  205. package/server/graphql/resolvers/extra/index.ts +0 -5
  206. package/server/graphql/types/extra/index.ts +0 -7
@@ -0,0 +1,1097 @@
1
+ import '@things-factory/grist-ui'
2
+ import '@things-factory/form-ui'
3
+
4
+ import gql from 'graphql-tag'
5
+ import { css, html, LitElement } from 'lit-element'
6
+
7
+ import { sleep } from '@operato/utils'
8
+ import { i18next, localize } from '@things-factory/i18n-base'
9
+ import { client } from '@things-factory/shell'
10
+ import { isMobileDevice } from '@things-factory/utils'
11
+
12
+ import { fetchLocationSortingRule } from '../../fetch-location-sorting-rule'
13
+ import { INVENTORY_STATUS, LOCATION_SORTING_RULE, ORDER_TYPES } from '../constants'
14
+
15
+ class InventoryReassignPopup extends localize(i18next)(LitElement) {
16
+ static get properties() {
17
+ return {
18
+ _orderProductSearchFields: Array,
19
+ orderProductConfig: Object,
20
+ orderInventoryConfig: Object,
21
+ orderProductData: Array,
22
+ orderInventoryData: Array,
23
+ _selectedOrderProduct: Object,
24
+ roId: String,
25
+ taskNo: String,
26
+ worksheetNo: String,
27
+ bizplaceId: String,
28
+ recallOption: Boolean,
29
+ _itemNotReassignable: Boolean
30
+ }
31
+ }
32
+
33
+ static get styles() {
34
+ return [
35
+ css`
36
+ :host {
37
+ display: flex;
38
+ flex-direction: column;
39
+ overflow: hidden;
40
+ background-color: white;
41
+ }
42
+ .grist {
43
+ flex: 1;
44
+ display: flex;
45
+ flex-direction: column;
46
+ overflow: auto;
47
+ }
48
+ .grist-container {
49
+ overflow-y: hidden;
50
+ display: flex;
51
+ flex: 1;
52
+ padding: 5px;
53
+ }
54
+ data-grist {
55
+ overflow-y: hidden;
56
+ flex: 1;
57
+ }
58
+ h2 {
59
+ padding: var(--subtitle-padding);
60
+ font: var(--subtitle-font);
61
+ color: var(--subtitle-text-color);
62
+ border-bottom: var(--subtitle-border-bottom);
63
+ }
64
+ .grist h2 {
65
+ margin: var(--grist-title-margin);
66
+ border: var(--grist-title-border);
67
+ font: var(--grist-title-font);
68
+ color: var(--secondary-color);
69
+ }
70
+ .grist h2 mwc-icon {
71
+ vertical-align: middle;
72
+ margin: var(--grist-title-icon-margin);
73
+ font-size: var(--grist-title-icon-size);
74
+ color: var(--grist-title-icon-color);
75
+ }
76
+ h2 + data-grist {
77
+ padding-top: var(--grist-title-with-grid-padding);
78
+ }
79
+ .button-container {
80
+ padding: var(--button-container-padding);
81
+ margin: var(--button-container-margin);
82
+ text-align: var(--button-container-align);
83
+ background-color: var(--button-container-background);
84
+ height: var(--button-container-height);
85
+ }
86
+ `
87
+ ]
88
+ }
89
+
90
+ render() {
91
+ return html`<div class="grist-container">
92
+ <div class="grist">
93
+ <h2>
94
+ <mwc-icon>list_alt</mwc-icon>${i18next.t('title.product')}
95
+ (${this._selectedOrderProduct?.product?.sku || ''})
96
+ </h2>
97
+ <search-form
98
+ id="orderProductSearchForm"
99
+ .fields=${this._orderProductSearchFields}
100
+ @submit=${e => this.orderProductGrist.fetch()}
101
+ ></search-form>
102
+ <data-grist
103
+ id="orderProduct"
104
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
105
+ .config=${this.orderProductConfig}
106
+ .fetchHandler="${this.fetchOrderProducts.bind(this)}"
107
+ ></data-grist>
108
+ </div>
109
+ </div>
110
+
111
+ ${this._selectedOrderProduct
112
+ ? html`<div class="grist-container">
113
+ <div class="grist">
114
+ <h2><mwc-icon>list_alt</mwc-icon>${i18next.t('title.inventory')}</h2>
115
+ <data-grist
116
+ id="orderInventory"
117
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
118
+ .config=${this.orderInventoryConfig}
119
+ .data=${this.orderInventoryData}
120
+ @record-change="${this._onProductChangeHandler.bind(this)}"
121
+ @field-change="${this._onInventoryFieldChanged.bind(this)}"
122
+ ></data-grist>
123
+ </div>
124
+ </div>`
125
+ : ''}
126
+
127
+ <div class="button-container">
128
+ ${this._selectedOrderProduct
129
+ ? html`<mwc-button
130
+ label="${`${i18next.t('button.update')}`}"
131
+ @click=${async e => {
132
+ const button = e.currentTarget
133
+ this.disableButton(button)
134
+
135
+ try {
136
+ await this.reassignInventories()
137
+ } finally {
138
+ await sleep(200)
139
+ this.enableButton(button)
140
+ }
141
+ }}
142
+ raised
143
+ ></mwc-button>`
144
+ : ''}
145
+ <mwc-button
146
+ label="${`${i18next.t('button.close')}`}"
147
+ @click="${() => {
148
+ this.dispatchEvent(new CustomEvent('reassignment-completed'))
149
+ history.back()
150
+ }}"
151
+ raised
152
+ ></mwc-button>
153
+ </div> `
154
+ }
155
+
156
+ disableButton(button) {
157
+ button.icon = 'rotate_right'
158
+ button.setAttribute('working', true)
159
+ button.disabled = true
160
+ }
161
+
162
+ enableButton(button) {
163
+ button.disabled = false
164
+ button.icon = ''
165
+ button.removeAttribute('working')
166
+ }
167
+
168
+ get orderProductSearchForm() {
169
+ return this.shadowRoot.querySelector('search-form#orderProductSearchForm')
170
+ }
171
+
172
+ get orderProductGrist() {
173
+ return this.shadowRoot.querySelector('data-grist#orderProduct')
174
+ }
175
+
176
+ get orderInventoryGrist() {
177
+ return this.shadowRoot.querySelector('data-grist#orderInventory')
178
+ }
179
+
180
+ async firstUpdated() {
181
+ const locationSortingRules = await fetchLocationSortingRule(LOCATION_SORTING_RULE.INVENTORY_ASSIGNMENT.value)
182
+
183
+ this._orderProductSearchFields = [
184
+ {
185
+ name: 'productInfo',
186
+ label: i18next.t('field.product_info'),
187
+ type: 'text',
188
+ props: { searchOper: 'eq' }
189
+ }
190
+ ]
191
+
192
+ this.orderProductConfig = {
193
+ pagination: { pages: [10, 20, 50, 100] },
194
+ rows: {
195
+ appendable: false,
196
+ handlers: {
197
+ click: async (columns, data, column, record, rowIndex) => {
198
+ if (record != undefined) {
199
+ this._selectedOrderProduct = record
200
+ this.bizplace = record.bizplace.id
201
+ this.recallOption = record?.releaseGood?.recall || false
202
+ this._updateOrderInventoryConfig()
203
+ await this.fetchOrderInventories({ page: 1, limit: 9999999 })
204
+ }
205
+ }
206
+ }
207
+ },
208
+ columns: [
209
+ { type: 'gutter', gutterName: 'sequence' },
210
+ {
211
+ type: 'string',
212
+ name: 'releaseOrderNo',
213
+ header: i18next.t('field.release_order_no'),
214
+ width: 200
215
+ },
216
+ {
217
+ type: 'string',
218
+ name: 'batchId',
219
+ header: i18next.t('field.batch_no'),
220
+ width: 100
221
+ },
222
+ {
223
+ type: 'string',
224
+ name: 'productSKU',
225
+ header: i18next.t('field.sku'),
226
+ width: 100
227
+ },
228
+ {
229
+ type: 'object',
230
+ name: 'product',
231
+ header: i18next.t('field.product'),
232
+ width: 150
233
+ },
234
+ {
235
+ type: 'string',
236
+ name: 'packingType',
237
+ header: i18next.t('field.packing_type'),
238
+ width: 150
239
+ },
240
+ {
241
+ type: 'number',
242
+ name: 'packingSize',
243
+ header: i18next.t('field.packing_size'),
244
+ width: 140
245
+ },
246
+ {
247
+ type: 'string',
248
+ name: 'uom',
249
+ header: i18next.t('field.uom'),
250
+ width: 100
251
+ },
252
+ {
253
+ type: 'integer',
254
+ name: 'releaseQty',
255
+ header: i18next.t('field.release_qty'),
256
+ width: 140
257
+ },
258
+ {
259
+ type: 'float',
260
+ name: 'releaseUomValue',
261
+ header: i18next.t('field.release_uom_value'),
262
+ width: 140
263
+ }
264
+ ]
265
+ }
266
+
267
+ this.orderInventoryConfig = {
268
+ pagination: { infinite: true },
269
+ rows: {
270
+ appendable: true,
271
+ handlers: {
272
+ click: (columns, data, column, record, rowIndex) => {
273
+ if (record != undefined && record?.notReassignable) {
274
+ this._itemNotReassignable = true
275
+ } else {
276
+ this._itemNotReassignable = false
277
+ }
278
+ this._updateOrderInventoryConfig()
279
+ }
280
+ }
281
+ },
282
+ list: { fields: ['inventory', 'product', 'location', 'releaseQty'] },
283
+ columns: [
284
+ { type: 'gutter', gutterName: 'sequence' },
285
+ {
286
+ type: 'gutter',
287
+ gutterName: 'button',
288
+ icon: 'close',
289
+ handlers: {
290
+ click: (columns, data, column, record, rowIndex) => {
291
+ if (record != undefined && !record.notReassignable) {
292
+ const newData = data.records.filter((_, idx) => idx !== rowIndex)
293
+ this.orderInventoryData = { ...this.orderInventoryData, records: newData }
294
+ this.orderInventoryGrist.dirtyData.records = newData
295
+ this._updateOrderInventoryConfig()
296
+ } else {
297
+ this._showToast({ message: i18next.t('text.picked_inventory_not_allowed_to_reassign') })
298
+ }
299
+ }
300
+ }
301
+ },
302
+ {
303
+ type: 'object',
304
+ name: 'inventory',
305
+ header: i18next.t('field.inventory_list'),
306
+ record: {
307
+ editable: true,
308
+ options: {
309
+ queryName: 'inventoriesByPallet',
310
+ basicArgs: {
311
+ filters: [{ name: 'status', operator: 'eq', value: INVENTORY_STATUS.STORED.value }],
312
+ locationSortingRules
313
+ },
314
+ nameField: 'batchId',
315
+ descriptionField: 'palletId',
316
+ select: [
317
+ { name: 'id', hidden: true },
318
+ { name: 'name', hidden: true },
319
+ { name: 'remainUomValue', hidden: true },
320
+ { name: 'product', type: 'object', hidden: true },
321
+ { name: 'palletId', header: i18next.t('field.lot_id') },
322
+ { name: 'cartonId', header: i18next.t('field.carton_id') },
323
+ { name: 'productSKU', header: i18next.t('field.sku') },
324
+ { name: 'productName', header: i18next.t('field.product_info') },
325
+ { name: 'productBrand', header: i18next.t('field.brand') },
326
+ { name: 'batchId', header: i18next.t('field.batch_id') },
327
+ {
328
+ name: 'location',
329
+ type: 'object',
330
+ queryName: 'locations',
331
+ field: 'name'
332
+ },
333
+ { name: 'packingType', header: i18next.t('field.packing_type') },
334
+ { name: 'packingSize', header: i18next.t('field.packing_size') },
335
+ { name: 'uom', header: i18next.t('field.uom') },
336
+ { name: 'remainQty', type: 'float', header: i18next.t('field.remain_qty') },
337
+ {
338
+ name: 'remainUomValueWithUom',
339
+ type: 'string',
340
+ header: i18next.t('field.total_uom_value')
341
+ },
342
+ { name: 'batchIdRef', header: i18next.t('field.batch_no_ref') },
343
+ {
344
+ name: 'remark',
345
+ type: 'string',
346
+ header: i18next.t('field.remark')
347
+ }
348
+ ],
349
+ list: {
350
+ fields: ['palletId', 'cartonId', 'batchId', 'location', 'batchIdRef']
351
+ }
352
+ }
353
+ },
354
+ width: 250
355
+ },
356
+ {
357
+ type: 'object',
358
+ name: 'product',
359
+ header: i18next.t('field.product'),
360
+ width: 150
361
+ },
362
+ {
363
+ type: 'string',
364
+ name: 'productBrand',
365
+ header: i18next.t('field.brand'),
366
+ width: 100
367
+ },
368
+ {
369
+ type: 'object',
370
+ name: 'location',
371
+ header: i18next.t('field.location'),
372
+ width: 150
373
+ },
374
+ {
375
+ type: 'string',
376
+ name: 'packingType',
377
+ header: i18next.t('field.packing_type'),
378
+ width: 150
379
+ },
380
+ {
381
+ type: 'number',
382
+ name: 'packingSize',
383
+ header: i18next.t('field.packing_size'),
384
+ width: 140
385
+ },
386
+ {
387
+ type: 'string',
388
+ name: 'uom',
389
+ header: i18next.t('field.uom'),
390
+ width: 100
391
+ },
392
+ {
393
+ type: 'integer',
394
+ name: 'addableQty',
395
+ header: i18next.t('field.remaining_qty'),
396
+ width: 100
397
+ },
398
+ {
399
+ type: 'integer',
400
+ name: 'releaseQty',
401
+ header: i18next.t('field.release_qty'),
402
+ record: { editable: true, options: { min: 0 } },
403
+ width: 100
404
+ },
405
+ {
406
+ type: 'string',
407
+ name: 'addableUomValue',
408
+ header: i18next.t('field.remaining_uom_value'),
409
+ width: 100
410
+ },
411
+ {
412
+ type: 'float',
413
+ name: 'releaseUomValue',
414
+ header: i18next.t('field.release_uom_value'),
415
+ record: { editable: true, options: { min: 0 } },
416
+ width: 140
417
+ },
418
+ {
419
+ type: 'string',
420
+ name: 'batchIdRef',
421
+ header: i18next.t('field.batch_no_ref'),
422
+ width: 100
423
+ }
424
+ ]
425
+ }
426
+ }
427
+
428
+ async _fetchReleaseOrderList(taskNo) {
429
+ try {
430
+ const response = await client.query({
431
+ query: gql`
432
+ query findReleaseOrdersByTaskNo($taskNo: String!) {
433
+ findReleaseOrdersByTaskNo(taskNo: $taskNo) {
434
+ releaseGoods {
435
+ id
436
+ name
437
+ status
438
+ }
439
+ taskNo
440
+ }
441
+ }
442
+ `,
443
+ variables: { taskNo }
444
+ })
445
+
446
+ if (!response.errors) {
447
+ let releaseOrders = response.data.findReleaseOrdersByTaskNo.releaseGoods
448
+
449
+ if (releaseOrders?.length) {
450
+ return releaseOrders
451
+ } else {
452
+ return []
453
+ }
454
+ }
455
+ } catch (e) {
456
+ this._showToast(e)
457
+ }
458
+ }
459
+
460
+ async fetchOrderProducts({ page, limit, sorters = [{ name: 'createdAt', desc: true }] }) {
461
+ let filters = this.orderProductSearchForm.queryFilters
462
+
463
+ if (this.roId) {
464
+ filters.push({
465
+ name: 'releaseGood',
466
+ operator: 'in',
467
+ value: [this.roId]
468
+ })
469
+ }
470
+
471
+ if (this.taskNo) {
472
+ const releaseGoods = await this._fetchReleaseOrderList(this.taskNo)
473
+ filters.push({
474
+ name: 'releaseGood',
475
+ operator: 'in',
476
+ value: releaseGoods.map(rg => rg.id)
477
+ })
478
+ }
479
+
480
+ const response = await client.query({
481
+ query: gql`
482
+ query orderProducts($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
483
+ orderProducts(filters: $filters, pagination: $pagination, sortings: $sortings) {
484
+ items {
485
+ id
486
+ name
487
+ batchId
488
+ batchIdRef
489
+ packingType
490
+ packingSize
491
+ uom
492
+ releaseQty
493
+ releaseUomValue
494
+ status
495
+ bizplace {
496
+ id
497
+ name
498
+ }
499
+ product {
500
+ id
501
+ name
502
+ description
503
+ sku
504
+ }
505
+ releaseGood {
506
+ id
507
+ name
508
+ recall
509
+ }
510
+ }
511
+ total
512
+ }
513
+ }
514
+ `,
515
+ variables: {
516
+ filters,
517
+ pagination: { page, limit },
518
+ sortings: sorters
519
+ }
520
+ })
521
+
522
+ if (!response.errors) {
523
+ const orderProductItems =
524
+ response.data.orderProducts.items.map(item => {
525
+ return {
526
+ ...item,
527
+ productSKU: item.product.sku,
528
+ releaseOrderNo: item.releaseGood.name
529
+ }
530
+ }) || []
531
+
532
+ if (orderProductItems?.length > 0) {
533
+ this._selectedOrderProduct = orderProductItems[0]
534
+ this.recallOption = orderProductItems[0]?.releaseGood?.recall || false
535
+ if (!this.bizplaceId) this.bizplaceId = this._selectedOrderProduct?.bizplace?.id
536
+
537
+ await this.fetchOrderInventories({ page: 1, limit: 9999999 })
538
+ } else {
539
+ this._selectedOrderProduct = null
540
+ }
541
+
542
+ return {
543
+ total: response.data.orderProducts.total || 0,
544
+ records: orderProductItems
545
+ }
546
+ }
547
+ }
548
+
549
+ async fetchOrderInventories({ page, limit, sorters = [{ name: 'inventoryPalletId' }] }) {
550
+ let filters = [
551
+ {
552
+ name: 'orderProductId',
553
+ operator: 'eq',
554
+ value: this._selectedOrderProduct.id
555
+ }
556
+ ]
557
+
558
+ const response = await client.query({
559
+ query: gql`
560
+ query orderInventories($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
561
+ orderInventories(filters: $filters, pagination: $pagination, sortings: $sortings) {
562
+ items {
563
+ id
564
+ name
565
+ batchId
566
+ packingType
567
+ packingSize
568
+ uom
569
+ releaseQty
570
+ releaseUomValue
571
+ pickedQty
572
+ status
573
+ inventory {
574
+ id
575
+ palletId
576
+ cartonId
577
+ batchId
578
+ batchIdRef
579
+ qty
580
+ lockedQty
581
+ uom
582
+ uomValue
583
+ lockedUomValue
584
+ product {
585
+ id
586
+ name
587
+ description
588
+ sku
589
+ brand
590
+ }
591
+ warehouse {
592
+ name
593
+ description
594
+ }
595
+ location {
596
+ name
597
+ description
598
+ }
599
+ }
600
+ }
601
+ total
602
+ }
603
+ }
604
+ `,
605
+ variables: {
606
+ filters,
607
+ pagination: { page, limit },
608
+ sortings: sorters
609
+ }
610
+ })
611
+
612
+ if (!response.errors) {
613
+ const data = response.data.orderInventories.items.map(item => {
614
+ return {
615
+ ...item,
616
+ product: item.inventory.product,
617
+ productBrand: item.inventory.product.brand,
618
+ location: item.inventory.location,
619
+ addableQty: Math.round(item.inventory.qty - item.inventory.lockedQty),
620
+ addableUomValue: Math.round(item.inventory.uomValue - item.inventory.lockedUomValue),
621
+ remainQty: Math.round(item.inventory.qty - item.inventory.lockedQty),
622
+ remainUomValue: Math.round(item.inventory.uomValue - item.inventory.lockedUomValue),
623
+ remainUomValueWithUom: `${item.inventory.uomValue - item.inventory.lockedUomValue} ${item.inventory.uom}`,
624
+ notReassignable: item?.pickedQty ? true : false
625
+ }
626
+ })
627
+ this.orderInventoryData = {
628
+ records: data
629
+ }
630
+
631
+ this._updateOrderInventoryConfig()
632
+ }
633
+ }
634
+
635
+ _onProductChangeHandler(event) {
636
+ const changeRecord = event.detail.after
637
+ const beforeRecord = event.detail.before
638
+ const changedColumn = event.detail.column.name
639
+ let totalAvailableQty = 0
640
+ let totalAvailableUomValue = 0
641
+
642
+ try {
643
+ if (Number.isNaN(changeRecord.releaseQty) || Number.isNaN(changeRecord.releaseUomValue)) {
644
+ throw new Error(i18next.t('text.invalid_form_value'))
645
+ }
646
+
647
+ if (event.detail.after.__dirty__ == '+') {
648
+ totalAvailableQty = changeRecord.remainQty
649
+ totalAvailableUomValue = changeRecord.remainUomValue
650
+ } else {
651
+ totalAvailableQty = beforeRecord.addableQty + beforeRecord.releaseQty
652
+ totalAvailableUomValue = beforeRecord.addableUomValue + beforeRecord.releaseUomValue
653
+ }
654
+
655
+ if (changedColumn === 'releaseQty') {
656
+ this._validateReleaseQty(changeRecord, totalAvailableQty)
657
+ } else if (changedColumn === 'releaseUomValue') {
658
+ this._validateReleaseUomValue(changeRecord, totalAvailableUomValue)
659
+ }
660
+ this._updateOrderInventoryConfig()
661
+ } catch (e) {
662
+ const columnName = event.detail.column.name
663
+ const beforeValue = event.detail.before && event.detail.before[columnName]
664
+ const afterValue = event.detail.after && event.detail.after[columnName]
665
+ if (beforeValue) {
666
+ if (columnName == 'releaseQty') {
667
+ event.detail.after['addableQty'] = event.detail.before['addableQty']
668
+ }
669
+ event.detail.after[columnName] = beforeValue
670
+ } else {
671
+ if (columnName == 'releaseQty') {
672
+ event.detail.after['addableQty'] = afterValue
673
+ }
674
+ event.detail.after[columnName] = null
675
+ }
676
+ this._showToast(e)
677
+ }
678
+ }
679
+
680
+ _validateReleaseQty(changeRecord, totalAvailableQty) {
681
+ if (changeRecord.remainQty === undefined) throw new Error(i18next.t('text.there_is_no_selected_items'))
682
+ if (totalAvailableQty) {
683
+ if (changeRecord.releaseQty < 0) {
684
+ throw new Error(i18next.t('text.invalid_quantity_input'))
685
+ } else if (changeRecord.releaseQty > totalAvailableQty) {
686
+ throw new Error(i18next.t('text.available_quantity_insufficient'))
687
+ }
688
+ } else {
689
+ if (changeRecord.releaseQty > remainQty) {
690
+ throw new Error(i18next.t('text.available_quantity_insufficient'))
691
+ }
692
+ }
693
+
694
+ if (changeRecord?.notReassignable) {
695
+ if (changeRecord.releaseQty < changeRecord.pickedQty) {
696
+ throw new Error(i18next.t('text.release_qty_cannot_exceed_picked_qty'))
697
+ }
698
+ }
699
+ }
700
+
701
+ _validateReleaseUomValue(changeRecord, totalAvailableUomValue) {
702
+ if (changeRecord.remainUomValue === undefined) throw new Error(i18next.t('text.there_is_no_selected_items'))
703
+ if (totalAvailableUomValue) {
704
+ if (changeRecord.releaseUomValue < 0) {
705
+ throw new Error(i18next.t('text.invalid_quantity_input'))
706
+ } else if (changeRecord.releaseUomValue > totalAvailableUomValue) {
707
+ throw new Error(i18next.t('text.available_uom_value_insufficient'))
708
+ }
709
+ } else {
710
+ if (changeRecord.releaseUomValue > remainUomValue) {
711
+ throw new Error(i18next.t('text.available_uom_value_insufficient'))
712
+ }
713
+ }
714
+ }
715
+
716
+ _onInventoryFieldChanged(e) {
717
+ let columnName = e.detail.column.name
718
+ let roundedUomValue = e.detail.record.roundedUomValue || 0
719
+ let releaseQty = 0
720
+ let packageUomValue = 0
721
+
722
+ try {
723
+ if (e.details?.after && e.details?.after !== 0) {
724
+ throw new Error(i18next.t('text.invalid_form_value'))
725
+ }
726
+
727
+ const result = this._calculateQtyAndUom(
728
+ packageUomValue,
729
+ columnName,
730
+ e.detail.record.uomValue,
731
+ e.detail.record.qty,
732
+ e.detail.record?.__origin__?.releaseUomValue || 0,
733
+ e.detail.record?.__origin__?.releaseQty || 0,
734
+ e.detail.record?.__origin__?.addableUomValue || e.detail.after.remainUomValue,
735
+ e.detail.record?.__origin__?.addableQty || e.detail.after.remainQty,
736
+ e.detail.record?.__origin__?.remainUomValue || e.detail.after.remainUomValue,
737
+ e.detail.record?.__origin__?.remainQty || e.detail.after.remainQty,
738
+ e.detail.after
739
+ )
740
+
741
+ if (columnName == 'releaseUomValue' || columnName == 'releaseQty' || columnName == 'inventory') {
742
+ if (columnName == 'inventory') {
743
+ if (
744
+ e.detail.after.remainUomValue &&
745
+ e.detail.after.remainQty &&
746
+ e.detail.after.remainUomValue > 0 &&
747
+ e.detail.after.remainQty > 0
748
+ ) {
749
+ releaseQty = e.detail.record.releaseQty || 0
750
+
751
+ roundedUomValue = releaseQty * (e.detail.after.remainUomValue / e.detail.after.remainQty)
752
+
753
+ roundedUomValue = parseFloat(roundedUomValue.toFixed(2))
754
+ }
755
+ } else {
756
+ let packageUomValue = e.detail.record.remainUomValue / e.detail.record.remainQty
757
+ if (
758
+ e.detail.record.remainUomValue &&
759
+ e.detail.record.remainQty &&
760
+ e.detail.record.remainUomValue > 0 &&
761
+ e.detail.record.remainQty > 0
762
+ ) {
763
+ if (columnName === 'releaseQty') {
764
+ releaseQty = e.detail.after || 0
765
+ } else {
766
+ releaseQty = Math.round(e.detail.after / packageUomValue)
767
+ }
768
+
769
+ roundedUomValue = releaseQty * packageUomValue
770
+ roundedUomValue = parseFloat(roundedUomValue.toFixed(2))
771
+ this.releaseQty = releaseQty
772
+ this.releaseUomValue = roundedUomValue
773
+ }
774
+ }
775
+ }
776
+
777
+ this.orderInventoryData = {
778
+ ...this.orderInventoryData,
779
+ ...this.orderInventoryGrist.dirtyData,
780
+ records: this.orderInventoryGrist.dirtyData.records.map((record, idx) => {
781
+ if (columnName == 'inventory' && idx === e.detail.row) {
782
+ if (this.releaseQty > e.detail.record.remainQty && this.releaseUomValue > e.detail.record.remainUomValue) {
783
+ record.releaseQty = e.detail.record.releaseQty
784
+ record.releaseUomValue = e.detail.record.releaseUomValue
785
+ } else {
786
+ record.releaseQty = releaseQty
787
+ record.releaseUomValue = roundedUomValue
788
+ }
789
+ record.remainQty = e.detail.after.remainQty
790
+ record.remainUomValue = e.detail.after.remainUomValue
791
+ record.addableQty = e.detail.after.remainQty
792
+ record.addableUomValue = e.detail.after.remainUomValue
793
+ if (record?.__origin__) {
794
+ record.__origin__.addableQty = e.detail.after.remainQty
795
+ record.__origin__.addableUomValue = e.detail.after.remainUomValue
796
+ }
797
+ if (record.releaseQty > 0 && record.releaseUomValue > 0) {
798
+ record.addableQty = record.addableQty - record.releaseQty
799
+ if (record.addableQty <= 0) {
800
+ record.addableQty = 0
801
+ }
802
+ if (record.addableUomValue == 0) {
803
+ record.addableUomValue = record.addableQty * (record.releaseUomValue / record.releaseQty)
804
+ } else {
805
+ if (record.addableQty == 0) {
806
+ record.addableUomValue = 0
807
+ } else {
808
+ if (e.detail.record.releaseQty == 0 || e.detail.record.releaseUomValue == 0) {
809
+ record.addableUomValue =
810
+ record.addableQty * (e.detail.record.addableUomValue / e.detail.record.addableQty)
811
+ } else {
812
+ record.addableUomValue =
813
+ record.addableQty * (e.detail.record.releaseUomValue / e.detail.record.releaseQty)
814
+ }
815
+ }
816
+ }
817
+ }
818
+ }
819
+
820
+ if (result.releaseQty >= 0 && result.roundedUom >= 0) {
821
+ if ((columnName == 'releaseUomValue' || columnName == 'releaseQty') && idx === e.detail.row) {
822
+ if (columnName == 'releaseUomValue') {
823
+ record.releaseQty = result.releaseQty
824
+ }
825
+ record.releaseUomValue = result.roundedUom
826
+ if (record.__dirty__ == '+') {
827
+ if (result.releaseQty == record.__origin__.addableQty) {
828
+ record.addableQty = record.__origin__.addableQty - result.releaseQty
829
+ } else {
830
+ record.addableQty = record.__origin__.releaseQty + record.__origin__.addableQty - result.releaseQty
831
+ }
832
+
833
+ if (record.releaseQty == 0) {
834
+ record.releaseUomValue = 0
835
+ record.addableQty = record.remainQty
836
+ }
837
+ } else {
838
+ if (record.releaseQty == record.__origin__.releaseQty) {
839
+ record.addableQty = record.__origin__.releaseQty + record.__origin__.addableQty - record.releaseQty
840
+ } else {
841
+ record.addableQty = record.__origin__.releaseQty + record.__origin__.addableQty - result.releaseQty
842
+ }
843
+ }
844
+
845
+ if (record.addableQty <= 0) {
846
+ record.addableQty = 0
847
+ }
848
+ if (record.addableUomValue == 0) {
849
+ record.addableUomValue =
850
+ record.addableQty * (record.__origin__.releaseUomValue / record.__origin__.releaseQty)
851
+ } else {
852
+ if (record.addableQty == 0) {
853
+ record.addableUomValue = 0
854
+ } else {
855
+ if (e.detail.record.__origin__.releaseQty == 0 || e.detail.record.__origin__.releaseUomValue == 0) {
856
+ record.addableUomValue =
857
+ record.addableQty *
858
+ (e.detail.record.__origin__.addableUomValue / e.detail.record.__origin__.addableQty)
859
+ } else {
860
+ record.addableUomValue =
861
+ record.addableQty *
862
+ (e.detail.record.__origin__.releaseUomValue / e.detail.record.__origin__.releaseQty)
863
+ }
864
+ }
865
+ }
866
+ }
867
+ }
868
+
869
+ let returnObj = {
870
+ ...record,
871
+ ...record.inventory,
872
+ name: record.name ? record.name : idx
873
+ }
874
+
875
+ return returnObj
876
+ })
877
+ }
878
+
879
+ this._updateOrderInventoryConfig()
880
+ } catch (e) {
881
+ this._showToast(e)
882
+ }
883
+ }
884
+
885
+ _calculateQtyAndUom(
886
+ packageUom,
887
+ columnName,
888
+ detailUom,
889
+ detailQty,
890
+ originUom = 0,
891
+ originQty = 0,
892
+ originAddableUom,
893
+ originAddableQty,
894
+ originRemainUom,
895
+ originRemainQty,
896
+ afterValue
897
+ ) {
898
+ var releaseQty = 0
899
+ var roundedUom = 0
900
+
901
+ if (afterValue >= 0) {
902
+ if (columnName == 'releaseUomValue' || columnName == 'releaseQty') {
903
+ if (originQty >= 0) {
904
+ if (originQty == 0 || originUom == 0) {
905
+ packageUom = originAddableUom / originAddableQty
906
+ } else {
907
+ packageUom = originUom / originQty
908
+ }
909
+ } else {
910
+ packageUom = originRemainUom / originRemainQty
911
+ }
912
+
913
+ if (columnName === 'releaseQty') {
914
+ if (afterValue - originQty <= originAddableQty) {
915
+ releaseQty = afterValue || 0
916
+ } else {
917
+ releaseQty = originQty
918
+ }
919
+ } else if (columnName === 'releaseUomValue') {
920
+ if (afterValue - originUom <= originAddableUom) {
921
+ releaseQty = Math.round(afterValue / packageUom)
922
+ } else {
923
+ releaseQty = Math.round(originUom / packageUom)
924
+ }
925
+ }
926
+
927
+ roundedUom = releaseQty * packageUom
928
+ roundedUom = parseFloat(roundedUom.toFixed(2))
929
+ }
930
+ } else {
931
+ releaseQty = afterValue
932
+ roundedUom = afterValue
933
+ }
934
+
935
+ return { releaseQty, roundedUom }
936
+ }
937
+
938
+ _updateOrderInventoryConfig() {
939
+ const _selectedInventories = (this.orderInventoryGrist.dirtyData.records || this.orderInventoryData.records).map(
940
+ record => record.inventory.id
941
+ )
942
+ this.orderInventoryConfig = {
943
+ ...this.orderInventoryConfig,
944
+ columns: this.orderInventoryConfig.columns.map(column => {
945
+ if (column.name === 'inventory') {
946
+ column.record.editable = !this._itemNotReassignable
947
+ column.record.options.basicArgs = {
948
+ ...column.record.options.basicArgs,
949
+ filters: [...column.record.options.basicArgs.filters.filter(filter => filter.name !== 'id')]
950
+ }
951
+
952
+ if (this._selectedOrderProduct) {
953
+ column.record.options.basicArgs.filters = [
954
+ { name: 'status', operator: 'eq', value: INVENTORY_STATUS.STORED.value },
955
+ { name: 'productName', operator: 'eq', value: this._selectedOrderProduct.product.sku },
956
+ { name: 'packingType', operator: 'eq', value: this._selectedOrderProduct.packingType },
957
+ { name: 'packingSize', operator: 'eq', value: this._selectedOrderProduct.packingSize },
958
+ { name: 'uom', operator: 'eq', value: this._selectedOrderProduct.uom },
959
+ { name: 'recall', operator: '', value: this.recallOption },
960
+ { name: 'skipLockCheck', operator: '', value: true }
961
+ ]
962
+ }
963
+
964
+ if (_selectedInventories.length) {
965
+ column.record.options.basicArgs.filters = [
966
+ ...column.record.options.basicArgs.filters,
967
+ {
968
+ name: 'id',
969
+ value: _selectedInventories,
970
+ operator: 'notin'
971
+ }
972
+ ]
973
+ }
974
+
975
+ if (this.bizplaceId) {
976
+ column.record.options.basicArgs.filters = [
977
+ ...column.record.options.basicArgs.filters,
978
+ {
979
+ name: 'bizplace_id',
980
+ operator: 'eq',
981
+ value: this.bizplaceId
982
+ }
983
+ ]
984
+ }
985
+ }
986
+
987
+ return column
988
+ })
989
+ }
990
+
991
+ this.orderInventoryData = {
992
+ ...this.orderInventoryData
993
+ }
994
+ }
995
+
996
+ _validateInventories() {
997
+ let inventoryData = this.orderInventoryData.records
998
+ let orderProduct = this._selectedOrderProduct
999
+
1000
+ if (inventoryData.some(({ releaseQty }) => releaseQty <= 0)) {
1001
+ throw new Error(i18next.t('text.x_should_be_positive', { state: { x: i18next.t('label.release_qty') } }))
1002
+ }
1003
+
1004
+ if (inventoryData.some(({ releaseUomValue }) => releaseUomValue <= 0)) {
1005
+ throw new Error(i18next.t('text.x_should_be_positive', { state: { x: i18next.t('label.release_uom_value') } }))
1006
+ }
1007
+
1008
+ let totalReleaseQty = inventoryData.reduce((qty, record) => {
1009
+ if (record.releaseQty > 0) {
1010
+ qty += record.releaseQty
1011
+ }
1012
+ return qty
1013
+ }, 0)
1014
+
1015
+ if (totalReleaseQty != orderProduct.releaseQty) throw new Error(i18next.t('text.release_qty_not_matched'))
1016
+ }
1017
+
1018
+ async reassignInventories() {
1019
+ try {
1020
+ this._validateInventories()
1021
+
1022
+ let response = await client.mutate({
1023
+ mutation: gql`
1024
+ mutation regenerateReleaseGoodWorksheetDetails(
1025
+ $worksheetNo: String!
1026
+ $batchId: String!
1027
+ $productId: String!
1028
+ $packingType: String!
1029
+ $packingSize: Float!
1030
+ $orderProductId: String!
1031
+ $worksheetDetails: [NewWorksheetDetail]
1032
+ ) {
1033
+ regenerateReleaseGoodWorksheetDetails(
1034
+ worksheetNo: $worksheetNo
1035
+ batchId: $batchId
1036
+ productId: $productId
1037
+ packingType: $packingType
1038
+ packingSize: $packingSize
1039
+ orderProductId: $orderProductId
1040
+ worksheetDetails: $worksheetDetails
1041
+ )
1042
+ }
1043
+ `,
1044
+ variables: {
1045
+ worksheetNo: this.worksheetNo,
1046
+ batchId: this._selectedOrderProduct?.batchId,
1047
+ productId: this._selectedOrderProduct?.product?.id,
1048
+ packingType: this._selectedOrderProduct?.packingType,
1049
+ packingSize: this._selectedOrderProduct?.packingSize,
1050
+ orderProductId: this._selectedOrderProduct?.id,
1051
+ worksheetDetails: this._composeWorksheetDetails()
1052
+ }
1053
+ })
1054
+
1055
+ if (!response.errors) {
1056
+ await this.fetchOrderInventories({ page: 1, limit: 9999999 })
1057
+ this._showToast({ message: i18next.t('text.reassignment_done') })
1058
+ }
1059
+ } catch (e) {
1060
+ this._showToast(e)
1061
+ return
1062
+ }
1063
+ }
1064
+
1065
+ _composeWorksheetDetails() {
1066
+ return this.orderInventoryGrist.dirtyData.records
1067
+ .filter(record => record.releaseQty && record.releaseUomValue)
1068
+ .map(record => {
1069
+ return {
1070
+ targetInventory: {
1071
+ inventory: { id: record.inventory.id },
1072
+ product: { id: record.product.id },
1073
+ releaseQty: record.releaseQty,
1074
+ releaseUomValue: record.releaseUomValue,
1075
+ type: ORDER_TYPES.RELEASE_OF_GOODS.value,
1076
+ uom: record.uom
1077
+ },
1078
+ targetProduct: {
1079
+ id: this._selectedOrderProduct?.id
1080
+ }
1081
+ }
1082
+ })
1083
+ }
1084
+
1085
+ _showToast({ type, message }) {
1086
+ document.dispatchEvent(
1087
+ new CustomEvent('notify', {
1088
+ detail: {
1089
+ type,
1090
+ message
1091
+ }
1092
+ })
1093
+ )
1094
+ }
1095
+ }
1096
+
1097
+ window.customElements.define('inventory-reassign-popup', InventoryReassignPopup)