@things-factory/worksheet-base 5.0.0-alpha.4 → 5.0.0-alpha.40

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 (160) hide show
  1. package/dist-server/constants/template.js +1 -0
  2. package/dist-server/constants/template.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +9 -3
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
  6. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/index.js +2 -0
  8. package/dist-server/controllers/index.js.map +1 -1
  9. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  10. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  12. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
  14. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  16. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  18. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  19. package/dist-server/controllers/render-fm-grn.js +229 -0
  20. package/dist-server/controllers/render-fm-grn.js.map +1 -0
  21. package/dist-server/controllers/render-grn.js +45 -21
  22. package/dist-server/controllers/render-grn.js.map +1 -1
  23. package/dist-server/controllers/render-invoices.js +103 -65
  24. package/dist-server/controllers/render-invoices.js.map +1 -1
  25. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  26. package/dist-server/controllers/render-orientage-grn.js +1 -0
  27. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  28. package/dist-server/controllers/render-po.js +147 -0
  29. package/dist-server/controllers/render-po.js.map +1 -0
  30. package/dist-server/controllers/render-ro-do.js +65 -1
  31. package/dist-server/controllers/render-ro-do.js.map +1 -1
  32. package/dist-server/controllers/worksheet-controller.js +15 -0
  33. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +10 -3
  35. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  37. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  39. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  41. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +26 -2
  43. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  45. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  47. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  49. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  51. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  52. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
  53. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  55. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +6 -19
  57. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  59. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
  61. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  63. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  64. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  65. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  66. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  67. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  68. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  69. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  70. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  71. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  72. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  73. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  74. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  75. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  76. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  77. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  78. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  80. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  81. package/dist-server/graphql/resolvers/worksheet/worksheets.js +18 -0
  82. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  83. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  84. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  85. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  86. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  87. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  88. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  89. package/dist-server/graphql/types/worksheet/index.js +33 -6
  90. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  91. package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
  92. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  93. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  94. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  95. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  96. package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
  97. package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
  98. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  99. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  100. package/dist-server/index.js +5 -0
  101. package/dist-server/index.js.map +1 -1
  102. package/dist-server/routes.js +12 -0
  103. package/dist-server/routes.js.map +1 -1
  104. package/dist-server/utils/inventory-util.js +14 -25
  105. package/dist-server/utils/inventory-util.js.map +1 -1
  106. package/package.json +17 -17
  107. package/server/constants/template.ts +1 -0
  108. package/server/controllers/ecommerce/sellercraft-controller.ts +10 -3
  109. package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
  110. package/server/controllers/index.ts +3 -0
  111. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  112. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  113. package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
  114. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  115. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  116. package/server/controllers/render-fm-grn.ts +266 -0
  117. package/server/controllers/render-grn.ts +57 -23
  118. package/server/controllers/render-invoices.ts +119 -72
  119. package/server/controllers/render-orientage-do.ts +11 -11
  120. package/server/controllers/render-orientage-grn.ts +12 -11
  121. package/server/controllers/render-po.ts +170 -0
  122. package/server/controllers/render-ro-do.ts +93 -8
  123. package/server/controllers/worksheet-controller.ts +18 -2
  124. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +13 -4
  125. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  126. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  127. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  128. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +41 -8
  129. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  130. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  131. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  132. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  133. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  134. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  135. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +5 -20
  136. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  137. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
  138. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  139. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  140. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  141. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  142. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  143. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  144. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  145. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  146. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  147. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  148. package/server/graphql/resolvers/worksheet/worksheets.ts +26 -0
  149. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  150. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  151. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  152. package/server/graphql/types/worksheet/index.ts +33 -6
  153. package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
  154. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  155. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  156. package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
  157. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  158. package/server/index.ts +5 -0
  159. package/server/routes.ts +17 -0
  160. package/server/utils/inventory-util.ts +15 -23
@@ -1,11 +1,11 @@
1
1
  import FormData from 'form-data'
2
2
  import fetch from 'node-fetch'
3
- import { getRepository } from 'typeorm'
3
+ import { getRepository, SelectQueryBuilder } from 'typeorm'
4
4
 
5
5
  import { Attachment, STORAGE } from '@things-factory/attachment-base'
6
6
  import { Bizplace } from '@things-factory/biz-base'
7
7
  import { config } from '@things-factory/env'
8
- import { Invoice, ReleaseGood } from '@things-factory/sales-base'
8
+ import { InvoiceProduct, ReleaseGood } from '@things-factory/sales-base'
9
9
  import { Domain } from '@things-factory/shell'
10
10
 
11
11
  import { TEMPLATE_TYPE } from '../constants'
@@ -22,20 +22,34 @@ export async function renderInvoices({ req, timezoneOffSet }, context: any) {
22
22
  let result = await Promise.all(
23
23
  req.roIds.map(async roId => {
24
24
  try {
25
- const foundReleaseGoods: ReleaseGood = await getRepository(ReleaseGood).findOne({
26
- where: { domain, id: roId },
27
- relations: ['domain', 'bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
28
- })
29
-
30
- if (foundReleaseGoods) {
31
- const foundInvoice: Invoice = await getRepository(Invoice).findOne({
32
- where: { releaseGood: foundReleaseGoods },
33
- relations: ['invoiceProducts', 'invoiceProducts.product', 'domain', 'creator', 'updater']
34
- })
35
-
36
- const partnerBiz: Bizplace = foundReleaseGoods.bizplace
25
+ const qb: SelectQueryBuilder<ReleaseGood> = await getRepository(ReleaseGood)
26
+ .createQueryBuilder('rg')
27
+ .innerJoinAndSelect('rg.domain', 'domain')
28
+ .innerJoinAndSelect('rg.bizplace', 'bizplace')
29
+ .innerJoinAndSelect('bizplace.domain', 'bizplace_domain')
30
+ .innerJoinAndSelect('bizplace.company', 'company')
31
+ .innerJoinAndSelect('company.domain', 'company_domain')
32
+ .innerJoinAndSelect('invoices', 'iv', 'rg.ref_no = iv.ref_no_1')
33
+ .leftJoinAndSelect('marketplace_orders', 'mo', 'rg.id = mo.release_order_id::uuid')
34
+ .leftJoinAndSelect('marketplace_order_shippings', 'mos', 'rg.id = mos.release_order_id::uuid')
35
+ .leftJoinAndSelect('mo.fulfillmentCenter', 'fc')
36
+ .where('rg.id = :roId')
37
+ .andWhere('rg.domain = :domainId')
38
+ .setParameters({ roId, domainId: domain.id })
39
+
40
+ let record: any = await qb.getRawOne()
41
+
42
+ if (record) {
43
+ const partnerBiz: Partial<Bizplace> = {
44
+ id: record.bizplace_id,
45
+ name: record.bizplace_name,
46
+ address: record.bizplace_address
47
+ }
37
48
 
38
- const partnerCompanyDomain: Domain = foundReleaseGoods.bizplace.company.domain
49
+ const partnerCompanyDomain: Partial<Domain> = {
50
+ id: record.company_domain_id,
51
+ name: record.company_domain_name
52
+ }
39
53
 
40
54
  const foundTemplate: Attachment = await getRepository(Attachment).findOne({
41
55
  where: { domain: partnerCompanyDomain, category: TEMPLATE_TYPE.INVOICE_TEMPLATE }
@@ -44,43 +58,74 @@ export async function renderInvoices({ req, timezoneOffSet }, context: any) {
44
58
  const template = await STORAGE.readFile(foundTemplate.path, 'utf-8')
45
59
 
46
60
  let fullBillingAddress = [
47
- foundInvoice.billingAddress1,
48
- foundInvoice.billingAddress2,
49
- foundInvoice.billingAddress3,
50
- foundInvoice.billingAddress4,
51
- foundInvoice.billingAddress5
61
+ record.iv_billing_address_1,
62
+ record.iv_billing_address_2,
63
+ record.iv_billing_address_3,
64
+ record.iv_billing_address_4,
65
+ record.iv_billing_address_5
52
66
  ]
53
67
 
54
68
  let fullDeliveryAddress = [
55
- foundInvoice.deliveryAddress1,
56
- foundInvoice.deliveryAddress2,
57
- foundInvoice.deliveryAddress3,
58
- foundInvoice.deliveryAddress4,
59
- foundInvoice.deliveryAddress5
69
+ record.iv_delivery_address_1,
70
+ record.iv_delivery_address_2,
71
+ record.iv_delivery_address_3,
72
+ record.iv_delivery_address_4,
73
+ record.iv_delivery_address_5
60
74
  ]
61
75
 
62
- let date = DateTimeConverter.date(
63
- new Date((foundInvoice.issuedOn || foundInvoice.createdAt) - timezoneOffSet)
76
+ const qb: SelectQueryBuilder<InvoiceProduct> = await getRepository(InvoiceProduct)
77
+ .createQueryBuilder('ip')
78
+ .innerJoin('invoices', 'iv', 'iv.id = ip.invoice_id')
79
+ .leftJoin('release_goods', 'rg', 'rg.ref_no = iv.ref_no_1')
80
+ .where('rg.id = :roId')
81
+ .andWhere('rg.domain = :domainId')
82
+ .setParameters({ roId, domainId: domain.id })
83
+
84
+ let items: any[] = await qb.getRawMany()
85
+
86
+ const product_list = items.map((item, idx) => {
87
+ return {
88
+ list_no: idx + 1,
89
+ product_sku: item.ip_sku,
90
+ product_name: item.ip_name,
91
+ product_desc: item.ip_description,
92
+ product_qty: item.ip_qty,
93
+ product_other_charges: item.ip_other_charges,
94
+ product_paid_price: getRoundedValue(item.ip_paid_price || item.ip_unit_price),
95
+ product_unit_price: getRoundedValue(item.ip_unit_price),
96
+ product_total_paid_price: getRoundedValue(
97
+ (item.ip_paid_price || item.ip_unit_price) * parseInt(item.ip_qty || 0)
98
+ ),
99
+ product_total_unit_price: getRoundedValue(item.ip_unit_price * parseInt(item.ip_qty || 0)),
100
+ original_price: getRoundedValue(parseFloat(item.ip_unit_price || 0)),
101
+ product_discount: getRoundedValue(parseFloat(item.ip_discount || 0)),
102
+ shipping_fee_paid_by_customer: getRoundedValue(parseFloat(item.ip_shipping_fee_paid_by_customer || 0))
103
+ }
104
+ })
105
+
106
+ const sumProductTotalPaidPrice: number = product_list.reduce(
107
+ (total, item) => total + item.product_total_paid_price,
108
+ 0
64
109
  )
110
+
111
+ let date = DateTimeConverter.date(new Date((record.iv_issued_on || record.iv_created_at) - timezoneOffSet))
65
112
  const data = {
66
- order_no: foundReleaseGoods.name,
67
- ref_no: foundReleaseGoods.refNo,
68
- deliver_to: foundInvoice.deliverTo,
69
- deliver_to_phone: foundInvoice.deliverToPhone || '',
70
- bill_to: foundInvoice.billTo,
71
- bill_to_phone: foundInvoice.billToPhone || '',
113
+ order_no: record.rg_name,
114
+ ref_no: record.rg_ref_no,
115
+ from: record.iv_from,
72
116
  customer_address: partnerBiz.address,
73
- delivery_date: date,
74
- store_name: foundInvoice.from,
75
- billing_address_1: foundInvoice.billingAddress1,
76
- billing_address_2: foundInvoice.billingAddress2,
77
- billing_address_3: foundInvoice.billingAddress3,
78
- billing_address_4: foundInvoice.billingAddress4,
79
- billing_address_5: foundInvoice.billingAddress5,
80
- billing_postcode: foundInvoice.billingPostcode,
81
- billing_city: foundInvoice.billingCity,
82
- billing_state: foundInvoice.billingState,
83
- billing_country: foundInvoice.billingCountry,
117
+ store_name: record.iv_from,
118
+ bill_to: record.iv_bill_to,
119
+ bill_to_phone: record.iv_bill_to_phone,
120
+ billing_address_1: record.iv_billing_address_1,
121
+ billing_address_2: record.iv_billing_address_2,
122
+ billing_address_3: record.iv_billing_address_3,
123
+ billing_address_4: record.iv_billing_address_4,
124
+ billing_address_5: record.iv_billing_address_5,
125
+ billing_postcode: record.iv_billing_postcode,
126
+ billing_city: record.iv_billing_city,
127
+ billing_state: record.iv_billing_state,
128
+ billing_country: record.iv_billing_country,
84
129
  full_billing_address: fullBillingAddress
85
130
  .reduce((acc, itm) => {
86
131
  if (itm && itm.trim() != '') {
@@ -90,15 +135,18 @@ export async function renderInvoices({ req, timezoneOffSet }, context: any) {
90
135
  return acc
91
136
  }, [])
92
137
  .join(' '),
93
- delivery_address_1: foundInvoice.deliveryAddress1,
94
- delivery_address_2: foundInvoice.deliveryAddress2,
95
- delivery_address_3: foundInvoice.deliveryAddress3,
96
- delivery_address_4: foundInvoice.deliveryAddress4,
97
- delivery_address_5: foundInvoice.deliveryAddress5,
98
- delivery_postcode: foundInvoice.deliveryPostcode,
99
- delivery_city: foundInvoice.deliveryCity,
100
- delivery_state: foundInvoice.deliveryState,
101
- delivery_country: foundInvoice.deliveryCountry,
138
+ delivery_date: date,
139
+ deliver_to: record.iv_deliver_to,
140
+ deliver_to_phone: record.iv_deliver_to_phone,
141
+ delivery_address_1: record.iv_delivery_address_1,
142
+ delivery_address_2: record.iv_delivery_address_2,
143
+ delivery_address_3: record.iv_delivery_address_3,
144
+ delivery_address_4: record.iv_delivery_address_4,
145
+ delivery_address_5: record.iv_delivery_address_5,
146
+ delivery_postcode: record.iv_delivery_postcode,
147
+ delivery_city: record.iv_delivery_city,
148
+ delivery_state: record.iv_delivery_state,
149
+ delivery_country: record.iv_delivery_country,
102
150
  full_delivery_address: fullDeliveryAddress
103
151
  .reduce((acc, itm) => {
104
152
  if (itm && itm.trim() != '') {
@@ -108,22 +156,16 @@ export async function renderInvoices({ req, timezoneOffSet }, context: any) {
108
156
  return acc
109
157
  }, [])
110
158
  .join(' '),
111
- product_list: foundInvoice.invoiceProducts.map((item, idx) => {
112
- return {
113
- list_no: idx + 1,
114
- product_sku: item.sku,
115
- product_name: item.name,
116
- product_desc: item.description,
117
- product_qty: item.qty,
118
- product_other_charges: item.otherCharges,
119
- product_paid_price: parseFloat(item.paidPrice || item.unitPrice).toFixed(2),
120
- product_unit_price: parseFloat(item.unitPrice).toFixed(2),
121
- product_total_paid_price: (
122
- parseFloat(item.paidPrice || item.unitPrice) * parseFloat(item.qty)
123
- ).toFixed(2),
124
- product_total_unit_price: (parseFloat(item.unitPrice) * parseFloat(item.qty)).toFixed(2)
125
- }
126
- })
159
+ fulfillment_center: record.fc_name,
160
+ voucher_amount: getRoundedValue(parseFloat(record.mo_voucher_amount || 0)),
161
+ actual_shipping_fee: getRoundedValue(parseFloat(record.mos_actual_shipping_fee || 0)),
162
+ sub_total: sumProductTotalPaidPrice,
163
+ grand_total: getRoundedValue(
164
+ sumProductTotalPaidPrice -
165
+ parseFloat(record.mo_voucher_amount || 0) +
166
+ parseFloat(record.mos_actual_shipping_fee || 0)
167
+ ),
168
+ product_list
127
169
  }
128
170
 
129
171
  const formData = new FormData()
@@ -137,18 +179,23 @@ export async function renderInvoices({ req, timezoneOffSet }, context: any) {
137
179
 
138
180
  return await response.text()
139
181
  }
140
- return ''
182
+ return null
141
183
  } catch (ex) {
142
- return ''
184
+ return null
143
185
  }
144
186
  })
145
187
  )
146
188
 
147
- if (result.length <= 0) {
189
+ if (result.filter(x => x != null).length <= 0) {
148
190
  throw Error('No invoice found!')
149
191
  }
192
+
150
193
  return result.join()
151
194
  } catch (ex) {
152
195
  throw ex
153
196
  }
154
197
  }
198
+
199
+ function getRoundedValue(value = 0) {
200
+ return Math.round((value + Number.EPSILON) * 100) / 100
201
+ }
@@ -150,20 +150,20 @@ export async function renderOrientageDO({ doNo }, context: any) {
150
150
  pack_size: matchedProductDetail
151
151
  ? matchedProductDetail.uomValue
152
152
  ? matchedProductDetail.uomValue +
153
- ' ' +
154
- matchedProductDetail.uom +
155
- (inventory.product.volumeSize
156
- ? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
157
- : '')
153
+ ' ' +
154
+ matchedProductDetail.uom +
155
+ (inventory.product.volumeSize
156
+ ? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
157
+ : '')
158
158
  : null
159
159
  : inventory.product.primaryValue
160
- ? inventory.product.primaryValue +
160
+ ? inventory.product.primaryValue +
161
161
  ' ' +
162
162
  inventory.product.primaryUnit +
163
163
  (inventory.product.volumeSize
164
164
  ? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
165
165
  : '')
166
- : null,
166
+ : null,
167
167
  aux_value_3: matchedProductDetail ? matchedProductDetail.auxValue3 : inventory.product.auxValue3,
168
168
  product_qty: targetInventory.inventory.warehouse !== 'DAMAGE ZONE' ? targetInventory.releaseQty : 0,
169
169
  product_qty_damage: targetInventory.inventory.warehouse === 'DAMAGE ZONE' ? targetInventory.releaseQty : 0,
@@ -176,15 +176,15 @@ export async function renderOrientageDO({ doNo }, context: any) {
176
176
  ? matchedProductDetail.volume
177
177
  : 0
178
178
  : inventory?.product?.volume
179
- ? inventory.product.volume
180
- : 0,
179
+ ? inventory.product.volume
180
+ : 0,
181
181
  total_volume: matchedProductDetail
182
182
  ? matchedProductDetail.volume
183
183
  ? Number((matchedProductDetail.volume * targetInventory.releaseQty).toFixed(4))
184
184
  : 0
185
185
  : inventory?.product?.volume
186
- ? Number((inventory.product.volume * targetInventory.releaseQty).toFixed(4))
187
- : 0,
186
+ ? Number((inventory.product.volume * targetInventory.releaseQty).toFixed(4))
187
+ : 0,
188
188
  remark: targetInventory.remark,
189
189
  inventory_remark: inventory.remark,
190
190
  cross_docking: targetInventory.crossDocking,
@@ -123,16 +123,16 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
123
123
  pack_size: matchedProductDetail
124
124
  ? matchedProductDetail.uomValue
125
125
  ? matchedProductDetail.uomValue +
126
- ' ' +
127
- matchedProductDetail.uom +
128
- (item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
126
+ ' ' +
127
+ matchedProductDetail.uom +
128
+ (item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
129
129
  : null
130
130
  : item.product.primaryValue
131
- ? item.product.primaryValue +
131
+ ? item.product.primaryValue +
132
132
  ' ' +
133
133
  item.product.primaryUnit +
134
134
  (item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
135
- : null,
135
+ : null,
136
136
  pack_qty: item.packQty ? item.packQty : 0,
137
137
  actual_pack_qty: item.actualPackQty ? item.actualPackQty : 0,
138
138
  container_no: foundGAN.containerNo ? foundGAN.containerNo : '',
@@ -142,23 +142,24 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
142
142
  ? matchedProductDetail.volume
143
143
  : 0
144
144
  : item?.product?.volume
145
- ? item.product.volume
146
- : 0,
145
+ ? item.product.volume
146
+ : 0,
147
147
  total_volume: matchedProductDetail
148
148
  ? matchedProductDetail.volume
149
149
  ? Number((matchedProductDetail.volume * item.actualPackQty).toFixed(4))
150
150
  : 0
151
151
  : item?.product?.volume
152
- ? Number((item.product.volume * item.actualPackQty).toFixed(4))
153
- : 0,
152
+ ? Number((item.product.volume * item.actualPackQty).toFixed(4))
153
+ : 0,
154
+ manufacture_year: item.manufactureDate ? new Date(item.manufactureDate).getFullYear() : null,
154
155
  manufacture_date: item.manufactureDate ? item.manufactureDate : null,
155
156
  literage: matchedProductDetail
156
157
  ? matchedProductDetail.packingSize
157
158
  ? parseFloat(matchedProductDetail.packingSize) * parseFloat(item.product.volumeSize)
158
159
  : 0
159
160
  : item.packingSize
160
- ? parseFloat(item.packingSize) * parseFloat(item.product.volumeSize)
161
- : 0,
161
+ ? parseFloat(item.packingSize) * parseFloat(item.product.volumeSize)
162
+ : 0,
162
163
  remark: item.remark || ''
163
164
  }
164
165
  })
@@ -0,0 +1,170 @@
1
+ import FormData from 'form-data'
2
+ import fetch from 'node-fetch'
3
+ import { getRepository, SelectQueryBuilder } from 'typeorm'
4
+
5
+ import { Attachment, STORAGE } from '@things-factory/attachment-base'
6
+ import { Bizplace } from '@things-factory/biz-base'
7
+ import { config } from '@things-factory/env'
8
+ import { InvoiceProduct, ReleaseGood, PurchaseOrder, PurchaseOrderOtherCharge, OrderProduct } from '@things-factory/sales-base'
9
+
10
+ import { Domain } from '@things-factory/shell'
11
+
12
+ import { TEMPLATE_TYPE } from '../constants'
13
+ import { DateTimeConverter } from '../utils/datetime-util'
14
+
15
+ const REPORT_API_URL = config.get('reportApiUrl', 'http://localhost:8888/rest/report/show_html')
16
+
17
+ export async function renderPO({ req, timezoneOffSet }, context: any) {
18
+ try {
19
+ const domain: Domain = await getRepository(Domain).findOne({
20
+ where: { id: context.state.domain.id }
21
+ })
22
+
23
+ let result = await Promise.all(
24
+ req.poIds.map(async poId => {
25
+ try {
26
+ const qb: SelectQueryBuilder<PurchaseOrder> = await getRepository(PurchaseOrder)
27
+ .createQueryBuilder('po')
28
+ .innerJoinAndSelect('po.domain', 'domain')
29
+ .innerJoinAndSelect('po.bizplace', 'bizplace')
30
+ .innerJoinAndSelect('bizplace.domain', 'bizplace_domain')
31
+ .innerJoinAndSelect('bizplace.company', 'company')
32
+ .innerJoinAndSelect('company.domain', 'company_domain')
33
+ .leftJoinAndSelect('contact_points', 'cp', 'po.supplier_id = cp.id')
34
+ .where('po.id = :poId')
35
+ .andWhere('po.domain = :domainId')
36
+ .setParameters({ poId, domainId: domain.id })
37
+
38
+ let record: any = await qb.getRawOne()
39
+
40
+ if (record) {
41
+ const partnerBiz: Partial<Bizplace> = {
42
+ id: record.bizplace_id,
43
+ name: record.bizplace_name,
44
+ address: record.bizplace_address,
45
+ domain: { id: record.bizplace_domain_id }
46
+ }
47
+
48
+ const foundTemplate: Attachment = await getRepository(Attachment).findOne({
49
+ where: { domain: partnerBiz.domain, category: TEMPLATE_TYPE.PO_TEMPLATE }
50
+ })
51
+
52
+ const foundLogo: Attachment = await getRepository(Attachment).findOne({
53
+ where: {
54
+ domain: partnerBiz.domain,
55
+ category: TEMPLATE_TYPE.LOGO
56
+ }
57
+ })
58
+
59
+ let logo = null
60
+ if (foundLogo?.path) {
61
+ logo = 'data:' + foundLogo.mimetype + ';base64,' + (await STORAGE.readFile(foundLogo.path, 'base64'))
62
+ }
63
+
64
+ const template = await STORAGE.readFile(foundTemplate.path, 'utf-8')
65
+
66
+ const poocQb: SelectQueryBuilder<PurchaseOrderOtherCharge> = await getRepository(PurchaseOrderOtherCharge)
67
+ .createQueryBuilder('pooc')
68
+ .where('pooc.purchase_order_id = :poId')
69
+ .andWhere('pooc.apply_in_items = false')
70
+ .setParameters({ poId })
71
+
72
+ let poOtherCharges: any[] = await poocQb.getRawMany()
73
+
74
+
75
+ const qb: SelectQueryBuilder<OrderProduct> = await getRepository(OrderProduct)
76
+ .createQueryBuilder('op')
77
+ .innerJoin('domains', 'd', 'op.domain_id = d.id')
78
+ .leftJoinAndSelect('purchase_orders', 'po', 'po.id = op.purchase_order_id')
79
+ .leftJoinAndSelect('products', 'p', 'op.product_id = p.id')
80
+ .where('op.purchase_order_id = :poId')
81
+ .andWhere('op.domain = :domainId')
82
+ .setParameters({ poId, domainId: domain.id })
83
+
84
+ let items: any[] = await qb.getRawMany()
85
+
86
+ const product_list = items.map((item, idx) => {
87
+ return {
88
+ list_no: idx + 1,
89
+ product_sku: item.p_sku,
90
+ product_name: item.p_name,
91
+ product_desc: item.p_description,
92
+ product_qty: item.op_pack_qty,
93
+ product_uom: item.op_uom,
94
+ product_other_charges: item.ip_other_charges,
95
+ product_unit_price: (item.op_unit_price).toFixed(2),
96
+ product_total_price: ((((item.op_unit_price || 0) * item.op_pack_qty) - (item.op_discount_amt || 0)) * (1 + (item.op_tax_rate / 100))).toFixed(2),
97
+ product_tax_rate: item.op_tax_rate,
98
+ product_disc_amt: item.op_discount_amt
99
+ }
100
+ })
101
+
102
+
103
+ let date = DateTimeConverter.date(new Date(record.po_created_at - timezoneOffSet))
104
+ let eta = DateTimeConverter.date(new Date(record.po_eta_date))
105
+
106
+ let subtotal = getRoundedValue(
107
+ product_list.reduce((init, item) => {
108
+ return (init += parseFloat(item.product_total_price))
109
+ }, 0) || 0
110
+ )
111
+
112
+ const data = {
113
+ logo_url: logo,
114
+ company_name: record.company_description,
115
+ company_address: record.company_address,
116
+ company_postal_code: record.company_postal_code,
117
+ po_number: record.po_name,
118
+ po_order_date: date,
119
+ po_delivery_date: eta,
120
+ ref_no: record.po_ref_no,
121
+ cp_company_name: record.cp_company_name,
122
+ cp_address: record.cp_address2 ? [record.cp_address, record.cp_address2].join(', ') : record.cp_address,
123
+ cp_contact_name: record.cp_name,
124
+ cp_email: record.cp_email,
125
+ cp_phone_number: record.cp_phone,
126
+ product_list,
127
+ charges_list: [
128
+ {
129
+ field: 'SUBTOTAL', value: subtotal.toFixed(2)
130
+ },
131
+ ...poOtherCharges.map(itm => { return { field: itm.pooc_name.toUpperCase(), value: itm.pooc_total_amt.toFixed(2) } }),
132
+ {
133
+ field: 'TOTAL', value: (poOtherCharges.reduce((init, item) => {
134
+ return init += (item.pooc_total_amt)
135
+ }, subtotal) || 0).toFixed(2),
136
+ },
137
+ ]
138
+ }
139
+
140
+ const formData = new FormData()
141
+ formData.append('template', template)
142
+ formData.append('jsonString', JSON.stringify(data))
143
+
144
+ const response = await fetch(REPORT_API_URL, {
145
+ method: 'POST',
146
+ body: formData
147
+ })
148
+
149
+ return await response.text()
150
+ }
151
+ return null
152
+ } catch (ex) {
153
+ return null
154
+ }
155
+ })
156
+ )
157
+
158
+ if (result.filter(x => x != null).length <= 0) {
159
+ throw Error('No purchase order found!')
160
+ }
161
+
162
+ return result.join()
163
+ } catch (ex) {
164
+ throw ex
165
+ }
166
+ }
167
+
168
+ function getRoundedValue(value = 0) {
169
+ return Math.round((value + Number.EPSILON) * 100) / 100
170
+ }