@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.
- package/dist-server/constants/template.js +1 -0
- package/dist-server/constants/template.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +9 -3
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/index.js +2 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-fm-grn.js +229 -0
- package/dist-server/controllers/render-fm-grn.js.map +1 -0
- package/dist-server/controllers/render-grn.js +45 -21
- package/dist-server/controllers/render-grn.js.map +1 -1
- package/dist-server/controllers/render-invoices.js +103 -65
- package/dist-server/controllers/render-invoices.js.map +1 -1
- package/dist-server/controllers/render-orientage-do.js.map +1 -1
- package/dist-server/controllers/render-orientage-grn.js +1 -0
- package/dist-server/controllers/render-orientage-grn.js.map +1 -1
- package/dist-server/controllers/render-po.js +147 -0
- package/dist-server/controllers/render-po.js.map +1 -0
- package/dist-server/controllers/render-ro-do.js +65 -1
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +15 -0
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +10 -3
- package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +26 -2
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +6 -19
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheets.js +18 -0
- package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
- package/dist-server/graphql/types/worksheet/index.js +33 -6
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/dist-server/index.js +5 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +12 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/utils/inventory-util.js +14 -25
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +17 -17
- package/server/constants/template.ts +1 -0
- package/server/controllers/ecommerce/sellercraft-controller.ts +10 -3
- package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
- package/server/controllers/index.ts +3 -0
- package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
- package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
- package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
- package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
- package/server/controllers/render-fm-grn.ts +266 -0
- package/server/controllers/render-grn.ts +57 -23
- package/server/controllers/render-invoices.ts +119 -72
- package/server/controllers/render-orientage-do.ts +11 -11
- package/server/controllers/render-orientage-grn.ts +12 -11
- package/server/controllers/render-po.ts +170 -0
- package/server/controllers/render-ro-do.ts +93 -8
- package/server/controllers/worksheet-controller.ts +18 -2
- package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +13 -4
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
- package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +41 -8
- package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
- package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
- package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +5 -20
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
- package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
- package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
- package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
- package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
- package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
- package/server/graphql/resolvers/worksheet/worksheets.ts +26 -0
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
- package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
- package/server/graphql/types/worksheet/index.ts +33 -6
- package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
- package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
- package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
- package/server/graphql/types/worksheet-detail/index.ts +0 -2
- package/server/index.ts +5 -0
- package/server/routes.ts +17 -0
- 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 {
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 =
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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:
|
|
67
|
-
ref_no:
|
|
68
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
180
|
-
|
|
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
|
-
|
|
187
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
153
|
-
|
|
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
|
-
|
|
161
|
-
|
|
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
|
+
}
|