@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
@@ -1,3 +1,4 @@
1
+ import '@things-factory/barcode-ui'
1
2
  import '@things-factory/grist-ui'
2
3
  import './dispatcher-verification-popup'
3
4
 
@@ -8,11 +9,11 @@ import { GhostPrint } from '@operato/ghost-print'
8
9
  import { MultiColumnFormStyles } from '@things-factory/form-ui'
9
10
  import { i18next, localize } from '@things-factory/i18n-base'
10
11
  import { openPopup } from '@things-factory/layout-base'
11
- import { client, navigate, PageView } from '@things-factory/shell'
12
+ import { client, navigate, PageView, CustomAlert } from '@things-factory/shell'
12
13
  import { CommonButtonStyles } from '@things-factory/styles'
13
14
  import { isMobileDevice } from '@things-factory/utils'
14
15
 
15
- import { MANIFEST_STATUS } from '../constants'
16
+ import { MANIFEST_STATUS, ORDER_STATUS } from '../constants'
16
17
 
17
18
  class LoadingManifestDetail extends localize(i18next)(PageView) {
18
19
  static get styles() {
@@ -64,6 +65,21 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
64
65
  h2 + data-grist {
65
66
  padding-top: var(--grist-title-with-grid-padding);
66
67
  }
68
+
69
+ .add[collapsable] {
70
+ height: 10%;
71
+ margin-top: -5px;
72
+ }
73
+ .add[collapsable][collapsed] {
74
+ display: none;
75
+ }
76
+ h2.add-title {
77
+ padding-bottom: 0px;
78
+ }
79
+
80
+ [hidden] {
81
+ display: none;
82
+ }
67
83
  `
68
84
  ]
69
85
  }
@@ -73,10 +89,21 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
73
89
  shippingData: Object,
74
90
  shippingGristConfig: Object,
75
91
  _manifestNo: String,
76
- _status: String
92
+ _status: String,
93
+ _removeOrders: Array,
94
+ _selectedStatus: String,
95
+ _addExpanded: Boolean
77
96
  }
78
97
  }
79
98
 
99
+ get trackingNoInput() {
100
+ return this.shadowRoot.querySelector('barcode-scanable-input[name=trackingNo]')?.shadowRoot.querySelector('input')
101
+ }
102
+
103
+ _focusOnTrackingNoInput() {
104
+ setTimeout(() => this.trackingNoInput.focus(), 50)
105
+ }
106
+
80
107
  get context() {
81
108
  var actions = [
82
109
  {
@@ -91,12 +118,19 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
91
118
  }
92
119
  ]
93
120
 
94
- if (this._status == MANIFEST_STATUS.OPEN.value) {
95
- actions.push({
96
- title: i18next.t('button.dispatch'),
97
- action: this._openDispatcherVerificationPopup.bind(this),
98
- ...CommonButtonStyles.load
99
- })
121
+ if (this._status == MANIFEST_STATUS.OPEN.value || this._status == MANIFEST_STATUS.IN_QUEUE.value) {
122
+ actions.push(
123
+ {
124
+ title: i18next.t('button.update'),
125
+ action: this._updateManifestDetails.bind(this),
126
+ ...CommonButtonStyles.add
127
+ },
128
+ {
129
+ title: i18next.t('button.dispatch'),
130
+ action: this._openDispatcherVerificationPopup.bind(this),
131
+ ...CommonButtonStyles.load
132
+ }
133
+ )
100
134
  }
101
135
 
102
136
  return {
@@ -105,6 +139,10 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
105
139
  }
106
140
  }
107
141
 
142
+ get dataGrist() {
143
+ return this.shadowRoot.querySelector('data-grist')
144
+ }
145
+
108
146
  get manifestForm() {
109
147
  return this.shadowRoot.querySelector('form[name=manifest]')
110
148
  }
@@ -131,43 +169,128 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
131
169
  <input name="totalTrackingNo" readonly />
132
170
 
133
171
  <label>${i18next.t('label.status')}</label>
134
- <input name="status" readonly />
172
+ <select
173
+ name="status"
174
+ ?disabled=${this._status == MANIFEST_STATUS.CLOSED.value}
175
+ @change="${e => {
176
+ this._selectedStatus = e.currentTarget.value
177
+ }}"
178
+ >
179
+ ${Object.keys(MANIFEST_STATUS).map(key => {
180
+ const status = MANIFEST_STATUS[key]
181
+ if (this._status == MANIFEST_STATUS.OPEN.value || this._status == MANIFEST_STATUS.IN_QUEUE.value) {
182
+ if (status.name !== 'closed') {
183
+ return html` <option value="${status.value}">${i18next.t(`label.${status.name}`)}</option> `
184
+ }
185
+ } else {
186
+ if (status.name == 'closed') {
187
+ return html` <option value="${status.value}">${i18next.t(`label.${status.name}`)}</option> `
188
+ }
189
+ }
190
+ })}
191
+ </select>
135
192
  </fieldset>
136
193
  </form>
137
194
  </div>
138
195
 
139
196
  <div class="container">
140
197
  <div class="grist">
141
- <h2><mwc-icon>list_alt</mwc-icon>${i18next.t('title.manifest_items')}</h2>
198
+ <h2>
199
+ <mwc-icon>list_alt</mwc-icon>${i18next.t('title.manifest_items')}
200
+ ${this._showReset ? html`<mwc-icon @click=${e => this.dataGrist.fetch()}>sync</mwc-icon>` : ''}
201
+ </h2>
142
202
 
143
203
  <data-grist
144
204
  .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
145
205
  .config=${this.shippingGristConfig}
146
206
  .data=${this.shippingData}
207
+ .fetchHandler=${this._fetchManifestDetail.bind(this)}
147
208
  ></data-grist>
209
+
210
+ ${this._status !== MANIFEST_STATUS.CLOSED.value
211
+ ? html`
212
+ <h2
213
+ @click="${e => {
214
+ this._addExpanded = !this._addExpanded
215
+ this._focusOnTrackingNoInput()
216
+ }}"
217
+ >
218
+ <mwc-icon>list_alt</mwc-icon>${i18next.t('title.add_tracking_no')}<mwc-icon
219
+ >${this._addExpanded ? 'expand_less' : 'expand_more'}</mwc-icon
220
+ >
221
+ </h2>
222
+
223
+ <div class="add" collapsable ?collapsed=${!this._addExpanded}>
224
+ <form name="addTrackingNo" class="multi-column-form">
225
+ <fieldset>
226
+ <label>${i18next.t('label.scan_tracking_no')}</label>
227
+ <barcode-scanable-input
228
+ name="trackingNo"
229
+ custom-input
230
+ @keypress="${e => {
231
+ if (e.keyCode === 13) {
232
+ e.preventDefault()
233
+ if (this.trackingNoInput.value) {
234
+ this._addTrackingNo(this.trackingNoInput.value)
235
+ }
236
+ }
237
+ }}"
238
+ ></barcode-scanable-input>
239
+ </fieldset>
240
+ </form>
241
+ </div>
242
+ `
243
+ : ''}
148
244
  </div>
149
245
  </div>
150
246
  `
151
247
  }
152
248
 
249
+ constructor() {
250
+ super()
251
+ this._removeOrders = []
252
+ this._addExpanded = false
253
+ }
254
+
153
255
  pageInitialized() {
154
256
  this.shippingGristConfig = {
155
257
  list: { fields: ['refNo', 'trackingNo', 'dispatchmentStatus'] },
156
258
  pagination: { infinite: true },
259
+ rows: {
260
+ appendable: false
261
+ },
157
262
  columns: [
263
+ {
264
+ type: 'gutter',
265
+ gutterName: 'button',
266
+ icon: 'close',
267
+ handlers: {
268
+ click: (columns, data, column, record, rowIndex) => {
269
+ try {
270
+ if (this._status && this._status == MANIFEST_STATUS.CLOSED.value) return
271
+ const newData = data.records.filter((_, idx) => idx !== rowIndex)
272
+ this.shippingData = { ...this.shippingData, records: newData }
273
+ this._removeOrders.push(record.refNo)
274
+ this._showReset = true
275
+ } catch (e) {}
276
+ }
277
+ }
278
+ },
158
279
  { type: 'gutter', gutterName: 'sequence' },
159
280
  {
160
281
  type: 'string',
161
- name: 'refNo',
282
+ name: 'trackingNo',
162
283
  label: true,
163
- header: i18next.t('field.order_no'),
284
+ header: i18next.t('field.tracking_no'),
285
+ sortable: true,
164
286
  width: 200
165
287
  },
166
288
  {
167
289
  type: 'string',
168
- name: 'trackingNo',
290
+ name: 'refNo',
169
291
  label: true,
170
- header: i18next.t('field.tracking_no'),
292
+ header: i18next.t('field.order_no'),
293
+ sortable: true,
171
294
  width: 200
172
295
  },
173
296
  {
@@ -175,6 +298,7 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
175
298
  name: 'attentionTo',
176
299
  label: true,
177
300
  header: i18next.t('field.delivery_to'),
301
+ sortable: true,
178
302
  width: 150
179
303
  },
180
304
  {
@@ -182,6 +306,7 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
182
306
  name: 'phone',
183
307
  label: true,
184
308
  header: i18next.t('field.phone'),
309
+ sortable: true,
185
310
  width: 150
186
311
  },
187
312
  {
@@ -189,27 +314,23 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
189
314
  name: 'deliveryAddress',
190
315
  label: true,
191
316
  header: i18next.t('field.delivery_address'),
317
+ sortable: true,
192
318
  width: 250
193
319
  },
194
320
  {
195
321
  type: 'string',
196
- name: 'postalCode',
322
+ name: 'orderStatus',
197
323
  label: true,
198
- header: i18next.t('field.postal_code'),
199
- width: 120
200
- },
201
- {
202
- type: 'string',
203
- name: 'city',
204
- label: true,
205
- header: i18next.t('field.city'),
206
- width: 120
324
+ header: i18next.t('field.order_status'),
325
+ sortable: true,
326
+ width: 150
207
327
  },
208
328
  {
209
329
  type: 'string',
210
- name: 'dispatchmentStatus',
330
+ name: 'orderRemark',
211
331
  label: true,
212
- header: i18next.t('field.status'),
332
+ header: i18next.t('field.order_remark'),
333
+ sortable: true,
213
334
  width: 150
214
335
  }
215
336
  ]
@@ -219,18 +340,18 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
219
340
  async pageUpdated(changes, lifecycle, before) {
220
341
  if (this.active) {
221
342
  this._manifestNo = changes.resourceId || this._manifestNo || ''
222
- await this._fetchManifestDetail()
343
+ await this.dataGrist.fetch()
223
344
  this.updateContext()
224
345
  }
225
346
  }
226
347
 
227
- async _fetchManifestDetail() {
348
+ async _fetchManifestDetail({ page, limit, sorters = [] }) {
228
349
  if (!this._manifestNo) return
229
350
 
230
351
  const response = await client.query({
231
352
  query: gql`
232
- query manifest($name: String!) {
233
- manifest(name: $name) {
353
+ query manifest($name: String!, $sortings: [Sorting!]) {
354
+ manifest(name: $name, sortings: $sortings) {
234
355
  id
235
356
  name
236
357
  dispatchedAt
@@ -247,11 +368,13 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
247
368
  city
248
369
  refNo
249
370
  dispatchmentStatus
371
+ orderStatus
372
+ orderRemark
250
373
  }
251
374
  }
252
375
  }
253
376
  `,
254
- variables: { name: this._manifestNo }
377
+ variables: { name: this._manifestNo, sortings: sorters }
255
378
  })
256
379
 
257
380
  if (!response.errors) {
@@ -259,25 +382,105 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
259
382
 
260
383
  this._status = manifest.status
261
384
  this._fillupForm(this.manifestForm, { ...manifest, totalTrackingNo: manifest.trackingNos?.length })
262
- this.shippingData = { records: manifest.trackingNos }
385
+ this.shippingData = {
386
+ manifestId: manifest.id,
387
+ shippingProvider: manifest.shippingProvider,
388
+ records: manifest.trackingNos
389
+ }
390
+ this._removeOrders = []
391
+ this._showReset = false
263
392
  this.updateContext()
264
393
  }
265
394
  }
266
395
 
267
- _openDispatcherVerificationPopup() {
268
- openPopup(
269
- html`
270
- <dispatcher-verification-popup
271
- @dispatch="${e => {
272
- this._dispatchManifest(e.detail)
273
- }}"
274
- ></dispatcher-verification-popup>
396
+ async _updateManifestDetails() {
397
+ if ((!this._selectedStatus || this._selectedStatus == this._status) && this._removeOrders?.length == 0) {
398
+ return
399
+ }
400
+ const response = await client.mutate({
401
+ mutation: gql`
402
+ mutation updateManifest(
403
+ $manifestId: String
404
+ $status: String
405
+ $shippingProvider: String
406
+ $removeOrders: [String!]
407
+ ) {
408
+ updateManifest(
409
+ manifestId: $manifestId
410
+ status: $status
411
+ shippingProvider: $shippingProvider
412
+ removeOrders: $removeOrders
413
+ )
414
+ }
275
415
  `,
276
- {
277
- size: 'medium',
278
- title: `${i18next.t('title.dispatcher_verification')}`
416
+ variables: {
417
+ manifestId: this.shippingData.manifestId,
418
+ status: this._selectedStatus,
419
+ shippingProvider: this.shippingData.shippingProvider,
420
+ removeOrders: this._removeOrders
279
421
  }
280
- )
422
+ })
423
+ if (!response.errors) {
424
+ if (!response.data.updateManifest) {
425
+ navigate('loading_manifest_list')
426
+ this._showToast({ message: i18next.t('text.manifest_has_been_deleted') })
427
+ } else {
428
+ await this.dataGrist.fetch()
429
+ this._showToast({ message: i18next.t('text.manifest_has_been_updated') })
430
+ }
431
+ }
432
+ }
433
+
434
+ async _openDispatcherVerificationPopup() {
435
+ let answer = await this._validateOrderStatus()
436
+
437
+ if (answer) {
438
+ openPopup(
439
+ html`
440
+ <dispatcher-verification-popup
441
+ @dispatch="${e => {
442
+ this._dispatchManifest(e.detail)
443
+ }}"
444
+ ></dispatcher-verification-popup>
445
+ `,
446
+ {
447
+ size: 'small',
448
+ title: `${i18next.t('title.dispatcher_verification')}`
449
+ }
450
+ )
451
+ }
452
+ }
453
+
454
+ async _addTrackingNo() {
455
+ let answer = await this._checkReleaseOrderStatus()
456
+
457
+ if (answer) {
458
+ const response = await client.mutate({
459
+ mutation: gql`
460
+ mutation addTrackingNo($manifestId: String, $trackingNo: String, $shippingProvider: String) {
461
+ addTrackingNo(manifestId: $manifestId, trackingNo: $trackingNo, shippingProvider: $shippingProvider)
462
+ }
463
+ `,
464
+ variables: {
465
+ manifestId: this.shippingData.manifestId,
466
+ trackingNo: this.trackingNoInput.value.trim(),
467
+ shippingProvider: this.shippingData.shippingProvider
468
+ }
469
+ })
470
+
471
+ if (!response.errors) {
472
+ await this.dataGrist.fetch()
473
+ this.trackingNoInput.value = ''
474
+ this._focusOnTrackingNoInput()
475
+ this._showToast({ message: i18next.t('text.tracking_no_added_successfully') })
476
+ } else {
477
+ let errorMessage = response.errors[0].message
478
+ if (errorMessage.includes('amp;')) {
479
+ response.errors[0].message = errorMessage.replace('amp;', '')
480
+ this._showToast({ message: response.errors[0].message })
481
+ }
482
+ }
483
+ }
281
484
  }
282
485
 
283
486
  async _dispatchManifest(patch) {
@@ -294,11 +497,73 @@ class LoadingManifestDetail extends localize(i18next)(PageView) {
294
497
  })
295
498
 
296
499
  if (!response.errors) {
297
- await this._fetchManifestDetail()
500
+ await this.dataGrist.fetch()
298
501
  this._showToast({ message: i18next.t('text.manifest_has_been_dispatched_and_closed') })
299
502
  }
300
503
  }
301
504
 
505
+ async _validateOrderStatus() {
506
+ let foundCancelOrder = this.shippingData.records.filter(
507
+ itm => itm.orderStatus == ORDER_STATUS.PENDING_CANCEL || itm.orderStatus == ORDER_STATUS.CANCELLED
508
+ )
509
+ if (foundCancelOrder?.length > 0) {
510
+ const answer = await CustomAlert({
511
+ title: i18next.t('title.do_you_wish_to_proceed'),
512
+ text: i18next.t('text.parcels_are_found_with_cancelled_or_pending_cancelled_status'),
513
+ confirmButton: { text: i18next.t('button.proceed') },
514
+ cancelButton: { text: i18next.t('button.cancel') }
515
+ })
516
+
517
+ if (answer) {
518
+ if (!answer?.value) {
519
+ return false
520
+ } else {
521
+ return true
522
+ }
523
+ }
524
+ }
525
+
526
+ return true
527
+ }
528
+
529
+ async _checkReleaseOrderStatus() {
530
+ const response = await client.query({
531
+ query: gql`
532
+ query releaseGood($trackingNo: String) {
533
+ releaseGood(trackingNo: $trackingNo) {
534
+ id
535
+ name
536
+ status
537
+ }
538
+ }
539
+ `,
540
+ variables: { trackingNo: this.trackingNoInput.value.trim() }
541
+ })
542
+
543
+ if (!response.error) {
544
+ let releaseGood = response.data.releaseGood
545
+
546
+ if (releaseGood?.status === ORDER_STATUS.CANCELLED || releaseGood?.status === ORDER_STATUS.PENDING_CANCEL) {
547
+ let answer = await CustomAlert({
548
+ type: 'warning',
549
+ title: i18next.t('title.order(s)_is_at_pending_cancelled_or_cancelled'),
550
+ text: i18next.t('text.do_you_want_to_ignore'),
551
+ confirmButton: { text: i18next.t('button.ignore') },
552
+ cancelButton: { text: i18next.t('button.cancel') }
553
+ })
554
+
555
+ if (!answer?.value) {
556
+ this._focusOnTrackingNoInput()
557
+ return false
558
+ } else {
559
+ return true
560
+ }
561
+ } else {
562
+ return true
563
+ }
564
+ }
565
+ }
566
+
302
567
  _printManifest() {
303
568
  GhostPrint.print({
304
569
  src: `/view_manifest/${this._manifestNo}`,
@@ -37,7 +37,8 @@ class LoadingManifestList extends localize(i18next)(PageView) {
37
37
  return {
38
38
  _searchFields: Array,
39
39
  config: Object,
40
- data: Object
40
+ data: Object,
41
+ _shippingProviderList: Array
41
42
  }
42
43
  }
43
44
 
@@ -85,6 +86,11 @@ class LoadingManifestList extends localize(i18next)(PageView) {
85
86
  }
86
87
  }
87
88
 
89
+ constructor() {
90
+ super()
91
+ this._shippingProviderList = []
92
+ }
93
+
88
94
  async pageInitialized() {
89
95
  const manifestStatus = await getCodeByName('MANIFEST_STATUS')
90
96
  this._searchFields = [
@@ -94,9 +100,30 @@ class LoadingManifestList extends localize(i18next)(PageView) {
94
100
  type: 'text',
95
101
  props: { searchOper: 'i_like' }
96
102
  },
103
+ {
104
+ label: i18next.t('field.order_info'),
105
+ name: 'orderInfo',
106
+ type: 'text',
107
+ props: { searchOper: 'eq' }
108
+ },
97
109
  {
98
110
  label: i18next.t('field.transporter'),
99
111
  name: 'shippingProvider',
112
+ type: 'select',
113
+ options: [
114
+ { value: '' },
115
+ ...this._shippingProviderList.map(sp => {
116
+ return {
117
+ name: sp,
118
+ value: sp
119
+ }
120
+ })
121
+ ],
122
+ props: { searchOper: 'eq' }
123
+ },
124
+ {
125
+ label: i18next.t('field.tracking_no'),
126
+ name: 'trackingNo',
100
127
  type: 'text',
101
128
  props: { searchOper: 'i_like' }
102
129
  },
@@ -105,11 +132,12 @@ class LoadingManifestList extends localize(i18next)(PageView) {
105
132
  name: 'fromDate',
106
133
  type: 'date',
107
134
  props: {
108
- searchOper: 'eq'
135
+ searchOper: 'eq',
136
+ max: new Date().toISOString().split('T')[0]
109
137
  },
110
138
  value: (() => {
111
139
  let date = new Date()
112
- date.setMonth(date.getMonth() - 6)
140
+ date.setMonth(date.getMonth() - 1)
113
141
  return date.toISOString().split('T')[0]
114
142
  })(),
115
143
  handlers: { change: this._modifyDateRange.bind(this) }
@@ -122,8 +150,13 @@ class LoadingManifestList extends localize(i18next)(PageView) {
122
150
  searchOper: 'eq',
123
151
  min: (() => {
124
152
  let date = new Date()
125
- date.setMonth(date.getMonth() - 6)
153
+ date.setMonth(date.getMonth() - 1)
126
154
  return date.toISOString().split('T')[0]
155
+ })(),
156
+ max: (() => {
157
+ var max = new Date()
158
+ max.setMonth(max.getMonth())
159
+ return max.toISOString().split('T')[0]
127
160
  })()
128
161
  },
129
162
  value: new Date().toISOString().split('T')[0]
@@ -147,7 +180,16 @@ class LoadingManifestList extends localize(i18next)(PageView) {
147
180
 
148
181
  this.config = {
149
182
  list: {
150
- fields: ['name', 'shippingProvider', 'dispatchedAt', 'status', 'createdAt', 'updatedAt', 'creator']
183
+ fields: [
184
+ 'name',
185
+ 'shippingProvider',
186
+ 'status',
187
+ 'totalTrackingNo',
188
+ 'dispatchedAt',
189
+ 'createdAt',
190
+ 'updatedAt',
191
+ 'creator'
192
+ ]
151
193
  },
152
194
  rows: { appendable: false, selectable: { multiple: true } },
153
195
  columns: [
@@ -180,20 +222,27 @@ class LoadingManifestList extends localize(i18next)(PageView) {
180
222
  width: 150
181
223
  },
182
224
  {
183
- type: 'datetime',
184
- name: 'dispatchedAt',
185
- header: i18next.t('field.dispatch_at'),
225
+ type: 'string',
226
+ name: 'status',
227
+ header: i18next.t('field.status'),
186
228
  label: true,
187
229
  sortable: true,
188
230
  width: 150
189
231
  },
190
232
  {
191
- type: 'string',
192
- name: 'status',
193
- header: i18next.t('field.status'),
233
+ type: 'int',
234
+ name: 'totalTrackingNo',
235
+ header: i18next.t('field.total_tracking_no'),
236
+ label: true,
237
+ width: 150
238
+ },
239
+ {
240
+ type: 'datetime',
241
+ name: 'dispatchedAt',
242
+ header: i18next.t('field.dispatch_at'),
194
243
  label: true,
195
244
  sortable: true,
196
- width: 170
245
+ width: 150
197
246
  },
198
247
  {
199
248
  type: 'datetime',
@@ -226,6 +275,7 @@ class LoadingManifestList extends localize(i18next)(PageView) {
226
275
  shippingProvider
227
276
  dispatchedAt
228
277
  status
278
+ totalTrackingNo
229
279
  createdAt
230
280
  creator {
231
281
  id
@@ -241,6 +291,22 @@ class LoadingManifestList extends localize(i18next)(PageView) {
241
291
  })
242
292
 
243
293
  if (!response.errors) {
294
+ let shippingProviders = response.data.manifests.items.map(itm => itm.shippingProvider)
295
+ shippingProviders = [...new Set(shippingProviders)]
296
+
297
+ if (this._shippingProviderList.length < shippingProviders.length) {
298
+ this._shippingProviderList = shippingProviders
299
+ this._searchFields.filter(x => x.name == 'shippingProvider')[0].options = [
300
+ { value: '' },
301
+ ...this._shippingProviderList.map(sp => {
302
+ return {
303
+ name: sp,
304
+ value: sp
305
+ }
306
+ })
307
+ ]
308
+ this._searchFields = [...this._searchFields]
309
+ }
244
310
  return {
245
311
  total: response.data.manifests.total || 0,
246
312
  records: response.data.manifests.items || []
@@ -250,16 +316,23 @@ class LoadingManifestList extends localize(i18next)(PageView) {
250
316
 
251
317
  _modifyDateRange(e) {
252
318
  const fromDate = e.currentTarget.value
253
-
319
+ if (fromDate == '') return
254
320
  if (this._toDateInput.value < fromDate) this._toDateInput.value = fromDate
255
321
 
256
322
  let min = new Date(fromDate)
323
+ let max = new Date(fromDate)
324
+ max.setMonth(max.getMonth() + 1)
325
+
257
326
  let today = new Date()
258
327
  today.setHours(0, 0, 0, 0)
259
328
 
260
329
  min = min.toISOString().split('T')[0]
330
+ max = max.toISOString().split('T')[0]
331
+
332
+ if (this._toDateInput.value > max) this._toDateInput.value = max
261
333
 
262
334
  this._toDateInput.min = min
335
+ this._toDateInput.max = max
263
336
  }
264
337
 
265
338
  get _columns() {