@things-factory/integration-accounting 4.3.113-alpha.0 → 4.3.122
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/client/pages/create-account-popup.js +10 -5
- package/dist-server/constants/account.js +13 -0
- package/dist-server/constants/account.js.map +1 -0
- package/dist-server/constants/index.js +18 -0
- package/dist-server/constants/index.js.map +1 -0
- package/dist-server/controllers/accounting-api/index.js +63 -0
- package/dist-server/controllers/accounting-api/index.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/xilnex/apis/goods-received/create-goods-received-note.js +44 -0
- package/dist-server/controllers/xilnex/apis/goods-received/create-goods-received-note.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/goods-received/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/goods-received/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/index.js +25 -0
- package/dist-server/controllers/xilnex/apis/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/purchase-order/get-purchase-order.js +41 -0
- package/dist-server/controllers/xilnex/apis/purchase-order/get-purchase-order.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/purchase-order/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/purchase-order/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales/get-sale.js +18 -0
- package/dist-server/controllers/xilnex/apis/sales/get-sale.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/sales/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales-order/create-sales-order.js +63 -0
- package/dist-server/controllers/xilnex/apis/sales-order/create-sales-order.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales-order/index.js +19 -0
- package/dist-server/controllers/xilnex/apis/sales-order/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales-order/post-sales-order-to-sales-invoice.js +24 -0
- package/dist-server/controllers/xilnex/apis/sales-order/post-sales-order-to-sales-invoice.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales-return/create-sales-return.js +44 -0
- package/dist-server/controllers/xilnex/apis/sales-return/create-sales-return.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/sales-return/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/sales-return/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/shipment/create-shipment.js +30 -0
- package/dist-server/controllers/xilnex/apis/shipment/create-shipment.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/shipment/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/shipment/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/stock-request/get-stock-request.js +20 -0
- package/dist-server/controllers/xilnex/apis/stock-request/get-stock-request.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/stock-request/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/stock-request/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/stocks/create-stock-adjust-record.js +45 -0
- package/dist-server/controllers/xilnex/apis/stocks/create-stock-adjust-record.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/stocks/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/stocks/index.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/transfer-note/create-transfer-note.js +43 -0
- package/dist-server/controllers/xilnex/apis/transfer-note/create-transfer-note.js.map +1 -0
- package/dist-server/controllers/xilnex/apis/transfer-note/index.js +18 -0
- package/dist-server/controllers/xilnex/apis/transfer-note/index.js.map +1 -0
- package/dist-server/controllers/xilnex/index.js +34 -0
- package/dist-server/controllers/xilnex/index.js.map +1 -0
- package/dist-server/controllers/xilnex/platform-action.js +41 -0
- package/dist-server/controllers/xilnex/platform-action.js.map +1 -0
- package/dist-server/controllers/xilnex/xilnex.js +71 -0
- package/dist-server/controllers/xilnex/xilnex.js.map +1 -0
- package/dist-server/entities/account-webhook-order.js +76 -0
- package/dist-server/entities/account-webhook-order.js.map +1 -0
- package/dist-server/entities/account.js +11 -2
- package/dist-server/entities/account.js.map +1 -1
- package/dist-server/entities/index.js +4 -2
- package/dist-server/entities/index.js.map +1 -1
- package/dist-server/graphql/resolvers/account-webhook-order/account-webhook-order.js +15 -0
- package/dist-server/graphql/resolvers/account-webhook-order/account-webhook-order.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/account-webhook-orders.js +14 -0
- package/dist-server/graphql/resolvers/account-webhook-order/account-webhook-orders.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/create-account-webhook-order.js +12 -0
- package/dist-server/graphql/resolvers/account-webhook-order/create-account-webhook-order.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/delete-account-webhook-order.js +16 -0
- package/dist-server/graphql/resolvers/account-webhook-order/delete-account-webhook-order.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/delete-account-webhook-orders.js +19 -0
- package/dist-server/graphql/resolvers/account-webhook-order/delete-account-webhook-orders.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/index.js +13 -0
- package/dist-server/graphql/resolvers/account-webhook-order/index.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/update-account-webhook-order.js +15 -0
- package/dist-server/graphql/resolvers/account-webhook-order/update-account-webhook-order.js.map +1 -0
- package/dist-server/graphql/resolvers/account-webhook-order/update-multiple-account-webhook-orders.js +30 -0
- package/dist-server/graphql/resolvers/account-webhook-order/update-multiple-account-webhook-orders.js.map +1 -0
- package/dist-server/graphql/resolvers/index.js +3 -2
- package/dist-server/graphql/resolvers/index.js.map +1 -1
- package/dist-server/graphql/types/account-webhook-order/account-webhook-order-list.js +14 -0
- package/dist-server/graphql/types/account-webhook-order/account-webhook-order-list.js.map +1 -0
- package/dist-server/graphql/types/account-webhook-order/account-webhook-order-patch.js +18 -0
- package/dist-server/graphql/types/account-webhook-order/account-webhook-order-patch.js.map +1 -0
- package/dist-server/graphql/types/account-webhook-order/account-webhook-order.js +22 -0
- package/dist-server/graphql/types/account-webhook-order/account-webhook-order.js.map +1 -0
- package/dist-server/graphql/types/account-webhook-order/index.js +35 -0
- package/dist-server/graphql/types/account-webhook-order/index.js.map +1 -0
- package/dist-server/graphql/types/account-webhook-order/new-account-webhook-order.js +16 -0
- package/dist-server/graphql/types/account-webhook-order/new-account-webhook-order.js.map +1 -0
- package/dist-server/graphql/types/accounting/account-patch.js +1 -0
- package/dist-server/graphql/types/accounting/account-patch.js.map +1 -1
- package/dist-server/graphql/types/accounting/account.js +1 -0
- package/dist-server/graphql/types/accounting/account.js.map +1 -1
- package/dist-server/graphql/types/accounting/new-account.js +1 -0
- package/dist-server/graphql/types/accounting/new-account.js.map +1 -1
- package/dist-server/graphql/types/index.js +10 -3
- package/dist-server/graphql/types/index.js.map +1 -1
- package/dist-server/index.js +3 -2
- package/dist-server/index.js.map +1 -1
- package/package.json +15 -15
- package/server/constants/account.ts +10 -0
- package/server/constants/index.ts +1 -0
- package/server/controllers/accounting-api/index.ts +27 -0
- package/server/controllers/index.ts +2 -0
- package/server/controllers/xilnex/apis/goods-received/create-goods-received-note.ts +42 -0
- package/server/controllers/xilnex/apis/goods-received/index.ts +1 -0
- package/server/controllers/xilnex/apis/index.ts +8 -0
- package/server/controllers/xilnex/apis/purchase-order/get-purchase-order.ts +39 -0
- package/server/controllers/xilnex/apis/purchase-order/index.ts +1 -0
- package/server/controllers/xilnex/apis/sales/get-sale.ts +13 -0
- package/server/controllers/xilnex/apis/sales/index.ts +1 -0
- package/server/controllers/xilnex/apis/sales-order/create-sales-order.ts +61 -0
- package/server/controllers/xilnex/apis/sales-order/index.ts +2 -0
- package/server/controllers/xilnex/apis/sales-order/post-sales-order-to-sales-invoice.ts +22 -0
- package/server/controllers/xilnex/apis/sales-return/create-sales-return.ts +40 -0
- package/server/controllers/xilnex/apis/sales-return/index.ts +1 -0
- package/server/controllers/xilnex/apis/shipment/create-shipment.ts +28 -0
- package/server/controllers/xilnex/apis/shipment/index.ts +1 -0
- package/server/controllers/xilnex/apis/stock-request/get-stock-request.ts +15 -0
- package/server/controllers/xilnex/apis/stock-request/index.ts +1 -0
- package/server/controllers/xilnex/apis/stocks/create-stock-adjust-record.ts +42 -0
- package/server/controllers/xilnex/apis/stocks/index.ts +1 -0
- package/server/controllers/xilnex/apis/transfer-note/create-transfer-note.ts +40 -0
- package/server/controllers/xilnex/apis/transfer-note/index.ts +1 -0
- package/server/controllers/xilnex/index.ts +7 -0
- package/server/controllers/xilnex/platform-action.ts +46 -0
- package/server/controllers/xilnex/xilnex.ts +86 -0
- package/server/entities/account-webhook-order.ts +55 -0
- package/server/entities/account.ts +12 -2
- package/server/entities/index.ts +3 -2
- package/server/graphql/resolvers/account-webhook-order/account-webhook-order.ts +14 -0
- package/server/graphql/resolvers/account-webhook-order/account-webhook-orders.ts +16 -0
- package/server/graphql/resolvers/account-webhook-order/create-account-webhook-order.ts +16 -0
- package/server/graphql/resolvers/account-webhook-order/delete-account-webhook-order.ts +20 -0
- package/server/graphql/resolvers/account-webhook-order/delete-account-webhook-orders.ts +23 -0
- package/server/graphql/resolvers/account-webhook-order/index.ts +20 -0
- package/server/graphql/resolvers/account-webhook-order/update-account-webhook-order.ts +18 -0
- package/server/graphql/resolvers/account-webhook-order/update-multiple-account-webhook-orders.ts +44 -0
- package/server/graphql/resolvers/index.ts +3 -2
- package/server/graphql/types/account-webhook-order/account-webhook-order-list.ts +8 -0
- package/server/graphql/types/account-webhook-order/account-webhook-order-patch.ts +12 -0
- package/server/graphql/types/account-webhook-order/account-webhook-order.ts +16 -0
- package/server/graphql/types/account-webhook-order/index.ts +34 -0
- package/server/graphql/types/account-webhook-order/new-account-webhook-order.ts +10 -0
- package/server/graphql/types/accounting/account-patch.ts +1 -0
- package/server/graphql/types/accounting/account.ts +1 -0
- package/server/graphql/types/accounting/new-account.ts +1 -0
- package/server/graphql/types/index.ts +10 -3
- package/server/index.ts +4 -3
- package/client/themes/layout-theme.css +0 -92
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AccountingAPI } from '../../../accounting-api'
|
|
2
|
+
|
|
3
|
+
export function postSalesOrderToSalesInvoice() {
|
|
4
|
+
return {
|
|
5
|
+
method: 'post',
|
|
6
|
+
path: '/salesorder/{orderId}/invoice/{outlet}',
|
|
7
|
+
denormalize(req, { accounting }) {
|
|
8
|
+
let accountInfo: any = accounting?.accountInfo ? JSON.parse(accounting.accountInfo) : {}
|
|
9
|
+
return {
|
|
10
|
+
resource: { orderId: req.orderId, outlet: accountInfo?.outlet || 'MAIN BRANCH' }
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
async normalize(res, { accounting }) {
|
|
14
|
+
let data = res.data
|
|
15
|
+
|
|
16
|
+
const sale = await AccountingAPI.getSale(accounting, { orderId: data.salesId })
|
|
17
|
+
data.sale = { ...sale.sale }
|
|
18
|
+
|
|
19
|
+
return data
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function createSalesReturn() {
|
|
2
|
+
return {
|
|
3
|
+
method: 'post',
|
|
4
|
+
path: '/sales/salesreturn',
|
|
5
|
+
denormalize(req, { accounting }) {
|
|
6
|
+
const { releaseGood, orderProducts } = req
|
|
7
|
+
let accountInfo: any = accounting?.accountInfo ? JSON.parse(accounting.accountInfo) : {}
|
|
8
|
+
let sale: any = {
|
|
9
|
+
id: releaseGood?.refNo3,
|
|
10
|
+
dateTime: releaseGood.updatedAt,
|
|
11
|
+
term: 0,
|
|
12
|
+
status: 'CONFIRMED',
|
|
13
|
+
outlet: accountInfo?.outlet || 'MAIN BRANCH',
|
|
14
|
+
salesPerson: accountInfo?.clientName,
|
|
15
|
+
recipientContact: releaseGood?.phone1,
|
|
16
|
+
recipientName: releaseGood?.attentionTo,
|
|
17
|
+
items: orderProducts.map(op => {
|
|
18
|
+
return {
|
|
19
|
+
id: op?.refItemId,
|
|
20
|
+
unitPrice: op?.sellingPrice,
|
|
21
|
+
quantity: -op?.pickedQty,
|
|
22
|
+
deliveryQuantity: 0,
|
|
23
|
+
discountAmount: 0,
|
|
24
|
+
remark: op?.remark,
|
|
25
|
+
enterPrice: op?.sellingPrice,
|
|
26
|
+
discountRemark: '',
|
|
27
|
+
totalDiscountAmount: 0
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
payload: { sale }
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
normalize(res) {
|
|
37
|
+
return res.data
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './create-sales-return'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function createShipment() {
|
|
2
|
+
return {
|
|
3
|
+
method: 'post',
|
|
4
|
+
path: '/shipment',
|
|
5
|
+
denormalize(req, { accounting }) {
|
|
6
|
+
const { releaseGood, orderProducts } = req
|
|
7
|
+
let accountInfo: any = accounting?.accountInfo ? JSON.parse(accounting.accountInfo) : {}
|
|
8
|
+
|
|
9
|
+
let shipmentItems: any = orderProducts.map(op => {
|
|
10
|
+
return {
|
|
11
|
+
documentId: op.refItemId,
|
|
12
|
+
shippingQuantity: op.releaseQty
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
let shipment: any = {
|
|
17
|
+
shippingOutlet: accountInfo?.outlet || 'MAIN BRANCH',
|
|
18
|
+
documentId: releaseGood.refNo3,
|
|
19
|
+
shippingDateTime: new Date()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return { payload: { shipment: { ...shipment, shipmentItems } } }
|
|
23
|
+
},
|
|
24
|
+
normalize(res) {
|
|
25
|
+
return res
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './create-shipment'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function getStockRequest() {
|
|
2
|
+
return {
|
|
3
|
+
method: 'get',
|
|
4
|
+
path: '/stockrequest/{orderId}',
|
|
5
|
+
denormalize(req) {
|
|
6
|
+
const { orderId } = req
|
|
7
|
+
return { resource: { orderId } }
|
|
8
|
+
},
|
|
9
|
+
normalize(res) {
|
|
10
|
+
const { data } = res
|
|
11
|
+
let stockRequest: any = data.stockRequest
|
|
12
|
+
return stockRequest
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './get-stock-request'
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function createStockAdjustRecord() {
|
|
2
|
+
return {
|
|
3
|
+
method: 'post',
|
|
4
|
+
path: '/stocks/stockadjustment',
|
|
5
|
+
denormalize(req) {
|
|
6
|
+
const { xilnexInv } = req
|
|
7
|
+
|
|
8
|
+
let adjustQuantity: number = xilnexInv.changedQty - xilnexInv.originalQty
|
|
9
|
+
let stocksTakeTitle: any = {
|
|
10
|
+
recordItems: [],
|
|
11
|
+
adjustItems: [
|
|
12
|
+
{
|
|
13
|
+
adjustQuantity: xilnexInv.adjustQuantity,
|
|
14
|
+
adjustType: adjustQuantity >= 0 ? 'AdjustUp' : 'AdjustDown',
|
|
15
|
+
remark: '',
|
|
16
|
+
itemId: xilnexInv.productDetail.refCode,
|
|
17
|
+
itemCode: xilnexInv.product.sku,
|
|
18
|
+
name: xilnexInv.product.name,
|
|
19
|
+
stockAdjustType: 'Normal',
|
|
20
|
+
uom: xilnexInv?.uom ? xilnexInv.uom : xilnexInv.productDetail.uom,
|
|
21
|
+
uomQuantity: xilnexInv?.packingSize ? xilnexInv.packingSize : xilnexInv.productDetail.packingSize,
|
|
22
|
+
batchNo: xilnexInv?.batchId ? xilnexInv.batchId : null,
|
|
23
|
+
batchExpiryDate: xilnexInv?.expirationDate ? xilnexInv.expirationDate : null,
|
|
24
|
+
dateTime: xilnexInv.createdAt
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
description: 'Stock Adjustment',
|
|
28
|
+
dateTime: xilnexInv.createdAt,
|
|
29
|
+
remarks: '',
|
|
30
|
+
stockTakeType: 'StockAdjustment',
|
|
31
|
+
status: 'COMPLETED'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
payload: { stocksTakeTitle }
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
normalize(res) {
|
|
39
|
+
return res
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './create-stock-adjust-record'
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function createTransferNote() {
|
|
2
|
+
return {
|
|
3
|
+
method: 'post',
|
|
4
|
+
path: '/TransferNote',
|
|
5
|
+
denormalize(req) {
|
|
6
|
+
const { releaseGood, deliveryOrder, orderInventories } = req
|
|
7
|
+
|
|
8
|
+
let transferNote: any = {
|
|
9
|
+
transferTo: deliveryOrder.attentionTo,
|
|
10
|
+
transferBy: '',
|
|
11
|
+
transferDate: '',
|
|
12
|
+
receiveDate: '',
|
|
13
|
+
transferFrom: '',
|
|
14
|
+
status: deliveryOrder.status,
|
|
15
|
+
remarks: deliveryOrder.remark,
|
|
16
|
+
type: 'Transfer',
|
|
17
|
+
toCompany: deliveryOrder.attentionCompany,
|
|
18
|
+
fromCompany: '',
|
|
19
|
+
transferType: '',
|
|
20
|
+
lastUpdateDateTime: deliveryOrder.deliveryOrderDateTime,
|
|
21
|
+
etaDate: deliveryOrder.deliveryDate,
|
|
22
|
+
totalQuantity: 1,
|
|
23
|
+
totalPrice: 0,
|
|
24
|
+
transferItems: orderInventories
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
payload: {
|
|
29
|
+
clientId: '',
|
|
30
|
+
transferNote,
|
|
31
|
+
deliveryOrderNumber: deliveryOrder.name,
|
|
32
|
+
deliveryOrderDate: deliveryOrder.deliveryDate
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
normalize(res) {
|
|
37
|
+
return res
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './create-transfer-note'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { config, logger } from '@things-factory/env'
|
|
2
|
+
|
|
3
|
+
import { Xilnex } from './xilnex'
|
|
4
|
+
|
|
5
|
+
const xilnexConfig = config.get('accountingIntegrationXilnex', {})
|
|
6
|
+
const { apiKey, apiSecret } = xilnexConfig
|
|
7
|
+
|
|
8
|
+
function substitute(path, obj) {
|
|
9
|
+
var props = []
|
|
10
|
+
var re = /{([^}]+)}/g
|
|
11
|
+
var text
|
|
12
|
+
|
|
13
|
+
while ((text = re.exec(path))) {
|
|
14
|
+
props.push(text[1])
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
var result = path
|
|
18
|
+
props.forEach(prop => {
|
|
19
|
+
let value = obj[prop.trim()]
|
|
20
|
+
result = result.replace(`{${prop}}`, value === undefined ? '' : value)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
return result
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function _action({ accounting, method = 'get', path, request }) {
|
|
27
|
+
const client = new Xilnex({
|
|
28
|
+
accessToken: accounting.accessToken,
|
|
29
|
+
appId: accounting.accountId
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
const { resource = {}, payload = {} } = request
|
|
33
|
+
|
|
34
|
+
path = substitute(path, resource)
|
|
35
|
+
|
|
36
|
+
return await client[method](path, payload)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const action = async ({ accounting, method = 'get', path, request }) => {
|
|
40
|
+
try {
|
|
41
|
+
return await _action({ accounting, method, path, request })
|
|
42
|
+
} catch (ex) {
|
|
43
|
+
logger.error(`Xilnex: action: ${ex}`)
|
|
44
|
+
throw ex
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import crypto from 'crypto'
|
|
2
|
+
import fetch from 'node-fetch'
|
|
3
|
+
|
|
4
|
+
const ENDPOINT = `https://api.xilnex.com/logic/v2`
|
|
5
|
+
const debug = require('debug')('things-factory:integration-accounting:xilnex')
|
|
6
|
+
|
|
7
|
+
export type XilnexConfig = {
|
|
8
|
+
accessToken?: string
|
|
9
|
+
appId?: string
|
|
10
|
+
secretKey?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class Xilnex {
|
|
14
|
+
private config: XilnexConfig
|
|
15
|
+
|
|
16
|
+
constructor(config: XilnexConfig) {
|
|
17
|
+
this.config = {
|
|
18
|
+
...config
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
isValidSignature(data, secret, signature) {
|
|
23
|
+
let hmac = crypto.createHmac('sha256', secret).update(JSON.stringify(data)).digest('hex')
|
|
24
|
+
|
|
25
|
+
return hmac === signature
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async get(path: string, data: any) {
|
|
29
|
+
const { accessToken, appId } = this.config
|
|
30
|
+
|
|
31
|
+
const qs = Object.entries(data)
|
|
32
|
+
.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`)
|
|
33
|
+
.join('&')
|
|
34
|
+
|
|
35
|
+
const endpoint = `${ENDPOINT}${path}${qs ? '?' + qs : ''}`
|
|
36
|
+
debug('endpoint', endpoint)
|
|
37
|
+
|
|
38
|
+
const response = await fetch(endpoint, {
|
|
39
|
+
method: 'get',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
token: accessToken,
|
|
43
|
+
appid: appId,
|
|
44
|
+
auth: '5'
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
if (response.ok) {
|
|
49
|
+
const result = await response.json()
|
|
50
|
+
return result
|
|
51
|
+
} else {
|
|
52
|
+
const result = await response.text()
|
|
53
|
+
throw new Error(`(${response.status}) ${result}`)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async post(path: string, data: any = {}) {
|
|
58
|
+
const { accessToken, appId } = this.config
|
|
59
|
+
|
|
60
|
+
debug('data', data)
|
|
61
|
+
|
|
62
|
+
const jsondata = JSON.stringify(data)
|
|
63
|
+
|
|
64
|
+
const endpoint = `${ENDPOINT}${path}`
|
|
65
|
+
debug('endpoint', endpoint)
|
|
66
|
+
|
|
67
|
+
const response = await fetch(endpoint, {
|
|
68
|
+
method: 'post',
|
|
69
|
+
headers: {
|
|
70
|
+
'Content-Type': 'application/json',
|
|
71
|
+
token: accessToken,
|
|
72
|
+
appid: appId,
|
|
73
|
+
auth: '5'
|
|
74
|
+
},
|
|
75
|
+
body: jsondata
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
if (response.ok) {
|
|
79
|
+
const result = await response.json()
|
|
80
|
+
return result
|
|
81
|
+
} else {
|
|
82
|
+
const result = await response.text()
|
|
83
|
+
throw new Error(`(${response.status}) ${result}`)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Field } from 'type-graphql'
|
|
2
|
+
import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { User } from '@things-factory/auth-base'
|
|
5
|
+
import { Domain } from '@things-factory/shell'
|
|
6
|
+
|
|
7
|
+
import { ACCOUNT_PLATFORM, ACCOUNT_SYNC_STATUS } from '../constants/account'
|
|
8
|
+
|
|
9
|
+
@Entity()
|
|
10
|
+
@Index(
|
|
11
|
+
'ix_account_webhook_order_0',
|
|
12
|
+
(accountWebhook: AccountWebhookOrder) => [accountWebhook.domain, accountWebhook.name],
|
|
13
|
+
{ unique: true }
|
|
14
|
+
)
|
|
15
|
+
export class AccountWebhookOrder {
|
|
16
|
+
@PrimaryGeneratedColumn('uuid')
|
|
17
|
+
id: string
|
|
18
|
+
|
|
19
|
+
@ManyToOne(type => Domain)
|
|
20
|
+
domain: Domain
|
|
21
|
+
|
|
22
|
+
@Column({
|
|
23
|
+
nullable: true
|
|
24
|
+
})
|
|
25
|
+
request: string
|
|
26
|
+
|
|
27
|
+
@Column({ default: ACCOUNT_PLATFORM.OTHERS })
|
|
28
|
+
@Field()
|
|
29
|
+
platform: string
|
|
30
|
+
|
|
31
|
+
@Column({
|
|
32
|
+
nullable: true,
|
|
33
|
+
default: ACCOUNT_SYNC_STATUS.FAILED
|
|
34
|
+
})
|
|
35
|
+
status: string
|
|
36
|
+
|
|
37
|
+
@Column()
|
|
38
|
+
name: string
|
|
39
|
+
|
|
40
|
+
@CreateDateColumn()
|
|
41
|
+
createdAt: Date
|
|
42
|
+
|
|
43
|
+
@UpdateDateColumn()
|
|
44
|
+
updatedAt: Date
|
|
45
|
+
|
|
46
|
+
@ManyToOne(type => User, {
|
|
47
|
+
nullable: true
|
|
48
|
+
})
|
|
49
|
+
creator: User
|
|
50
|
+
|
|
51
|
+
@ManyToOne(type => User, {
|
|
52
|
+
nullable: true
|
|
53
|
+
})
|
|
54
|
+
updater: User
|
|
55
|
+
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { Field } from 'type-graphql'
|
|
2
|
+
import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
|
|
3
|
+
|
|
1
4
|
import { User } from '@things-factory/auth-base'
|
|
2
5
|
import { Domain } from '@things-factory/shell'
|
|
3
|
-
|
|
6
|
+
|
|
7
|
+
import { ACCOUNT_PLATFORM } from '../constants/account'
|
|
4
8
|
|
|
5
9
|
@Entity()
|
|
6
10
|
@Index('ix_account_0', (account: Account) => [account.domain, account.name], { unique: true })
|
|
@@ -11,7 +15,8 @@ export class Account {
|
|
|
11
15
|
@ManyToOne(type => Domain)
|
|
12
16
|
domain: Domain
|
|
13
17
|
|
|
14
|
-
@Column()
|
|
18
|
+
@Column({ default: ACCOUNT_PLATFORM.OTHERS })
|
|
19
|
+
@Field()
|
|
15
20
|
platform: string
|
|
16
21
|
|
|
17
22
|
@Column({
|
|
@@ -40,6 +45,11 @@ export class Account {
|
|
|
40
45
|
})
|
|
41
46
|
accessToken: string
|
|
42
47
|
|
|
48
|
+
@Column({
|
|
49
|
+
nullable: true
|
|
50
|
+
})
|
|
51
|
+
webhookKey: string
|
|
52
|
+
|
|
43
53
|
@Column({ default: false, nullable: true })
|
|
44
54
|
trackedInventory: Boolean
|
|
45
55
|
|
package/server/entities/index.ts
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
4
|
+
|
|
5
|
+
export const accountWebhookOrderResolver = {
|
|
6
|
+
async accountWebhookOrder(_: any, { id }, context: any) {
|
|
7
|
+
const repository = getRepository(AccountWebhookOrder)
|
|
8
|
+
|
|
9
|
+
return await getRepository(AccountWebhookOrder).findOne({
|
|
10
|
+
where: { domain: context.state.domain, id },
|
|
11
|
+
relations: ['domain', 'creator', 'updater']
|
|
12
|
+
})
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { convertListParams, ListParam } from '@things-factory/shell'
|
|
4
|
+
|
|
5
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
6
|
+
|
|
7
|
+
export const accountWebhookOrdersResolver = {
|
|
8
|
+
async accountWebhookOrders(_: any, params: ListParam, context: any) {
|
|
9
|
+
const convertedParams = convertListParams(params, context.state.domain.id)
|
|
10
|
+
const [items, total] = await getRepository(AccountWebhookOrder).findAndCount({
|
|
11
|
+
...convertedParams,
|
|
12
|
+
relations: ['domain', 'creator', 'updater']
|
|
13
|
+
})
|
|
14
|
+
return { items, total }
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { ACCOUNTING_STATUS } from '../../../controllers'
|
|
4
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
5
|
+
|
|
6
|
+
export const createAccountWebhookOrder = {
|
|
7
|
+
async createAccountWebhookOrder(_: any, { account }, context: any) {
|
|
8
|
+
return await getRepository(AccountWebhookOrder).save({
|
|
9
|
+
status: ACCOUNTING_STATUS.INACTIVE,
|
|
10
|
+
...account,
|
|
11
|
+
domain: context.state.domain,
|
|
12
|
+
creator: context.state.user,
|
|
13
|
+
updater: context.state.user
|
|
14
|
+
})
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { ACCOUNTING_STATUS } from '../../../controllers'
|
|
4
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
5
|
+
|
|
6
|
+
export const deleteAccountWebhookOrder = {
|
|
7
|
+
async deleteAccountWebhookOrder(_: any, { id }, context: any) {
|
|
8
|
+
const foundAccountWebhookOrder: AccountWebhookOrder = await getRepository(AccountWebhookOrder).findOne({
|
|
9
|
+
where: { domain: context.state.domain, id }
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
await getRepository(AccountWebhookOrder).save({
|
|
13
|
+
...foundAccountWebhookOrder,
|
|
14
|
+
status: ACCOUNTING_STATUS.TERMINATED,
|
|
15
|
+
updater: context.state.user
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
return true
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getRepository, In } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { ACCOUNTING_STATUS } from '../../../controllers'
|
|
4
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
5
|
+
|
|
6
|
+
export const deleteAccountWebhookOrders = {
|
|
7
|
+
async deleteAccountWebhookOrders(_: any, { ids }, context: any) {
|
|
8
|
+
let foundAccountWebhookOrders: AccountWebhookOrder[] = await getRepository(AccountWebhookOrder).find({
|
|
9
|
+
where: { domain: context.state.domain, id: In(ids) }
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
const updatedAccountWebhookOrder = foundAccountWebhookOrders.map((accountWebhookOrder: AccountWebhookOrder) => {
|
|
13
|
+
return {
|
|
14
|
+
...accountWebhookOrder,
|
|
15
|
+
status: ACCOUNTING_STATUS.TERMINATED,
|
|
16
|
+
updater: context.state.user
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
await getRepository(AccountWebhookOrder).save(updatedAccountWebhookOrder)
|
|
21
|
+
return true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { accountWebhookOrderResolver } from './account-webhook-order'
|
|
2
|
+
import { accountWebhookOrdersResolver } from './account-webhook-orders'
|
|
3
|
+
import { createAccountWebhookOrder } from './create-account-webhook-order'
|
|
4
|
+
import { deleteAccountWebhookOrder } from './delete-account-webhook-order'
|
|
5
|
+
import { deleteAccountWebhookOrders } from './delete-account-webhook-orders'
|
|
6
|
+
import { updateAccountWebhookOrder } from './update-account-webhook-order'
|
|
7
|
+
import { updateMultipleAccountWebhookOrders } from './update-multiple-account-webhook-orders'
|
|
8
|
+
|
|
9
|
+
export const Query = {
|
|
10
|
+
...accountWebhookOrdersResolver,
|
|
11
|
+
...accountWebhookOrderResolver
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const Mutation = {
|
|
15
|
+
...updateAccountWebhookOrder,
|
|
16
|
+
...updateMultipleAccountWebhookOrders,
|
|
17
|
+
...createAccountWebhookOrder,
|
|
18
|
+
...deleteAccountWebhookOrder,
|
|
19
|
+
...deleteAccountWebhookOrders
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
4
|
+
|
|
5
|
+
export const updateAccountWebhookOrder = {
|
|
6
|
+
async updateAccountWebhookOrder(_: any, { name, patch }, context: any) {
|
|
7
|
+
const repository = getRepository(AccountWebhookOrder)
|
|
8
|
+
const accountWebhookOrder: any = await repository.findOne({
|
|
9
|
+
where: { domain: context.state.domain, name }
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
return await repository.save({
|
|
13
|
+
...accountWebhookOrder,
|
|
14
|
+
...patch,
|
|
15
|
+
updater: context.state.user
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
}
|
package/server/graphql/resolvers/account-webhook-order/update-multiple-account-webhook-orders.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { AccountWebhookOrder } from '../../../entities'
|
|
4
|
+
|
|
5
|
+
export const updateMultipleAccountWebhookOrders = {
|
|
6
|
+
async updateMultipleAccountWebhookOrders(_: any, { patches }, context: any) {
|
|
7
|
+
let results = []
|
|
8
|
+
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
|
9
|
+
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
10
|
+
const accountWebhookOrderRepo = getRepository(AccountWebhookOrder)
|
|
11
|
+
|
|
12
|
+
if (_createRecords.length > 0) {
|
|
13
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
14
|
+
const newRecord = _createRecords[i]
|
|
15
|
+
|
|
16
|
+
const result = await accountWebhookOrderRepo.save({
|
|
17
|
+
...newRecord,
|
|
18
|
+
domain: context.state.domain,
|
|
19
|
+
creator: context.state.user,
|
|
20
|
+
updater: context.state.user
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
results.push({ ...result, cuFlag: '+' })
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (_updateRecords.length > 0) {
|
|
28
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
29
|
+
const newRecord = _updateRecords[i]
|
|
30
|
+
const accountWebhookOrder: AccountWebhookOrder = await accountWebhookOrderRepo.findOne(newRecord.id)
|
|
31
|
+
|
|
32
|
+
const result = await accountWebhookOrderRepo.save({
|
|
33
|
+
...accountWebhookOrder,
|
|
34
|
+
...newRecord,
|
|
35
|
+
updater: context.state.user
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
results.push({ ...result, cuFlag: 'M' })
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return results
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import * as AccountWebhookOrder from './account-webhook-order'
|
|
1
2
|
import * as Accounting from './accounting'
|
|
2
3
|
|
|
3
|
-
export const queries = [Accounting.Query]
|
|
4
|
+
export const queries = [Accounting.Query, AccountWebhookOrder.Query]
|
|
4
5
|
|
|
5
|
-
export const mutations = [Accounting.Mutation]
|
|
6
|
+
export const mutations = [Accounting.Mutation, AccountWebhookOrder.Mutation]
|