@softwear/latestcollectioncore 1.0.89 → 1.0.91
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/articleStatus.js +12 -9
- package/dist/transaction.d.ts +1 -1
- package/dist/transaction.js +58 -59
- package/package.json +1 -1
- package/src/articleStatus.ts +12 -8
- package/src/transaction.ts +58 -85
- package/test/articleStatus.spec.js +4 -4
package/dist/articleStatus.js
CHANGED
|
@@ -8,9 +8,8 @@ const types_1 = require("./types");
|
|
|
8
8
|
const transaction_1 = __importDefault(require("./transaction"));
|
|
9
9
|
const date_fns_1 = require("date-fns");
|
|
10
10
|
// fields in Vector
|
|
11
|
-
const { QTY_TRANSACTION, QTY_STOCK, AMOUNT_STOCK, QTY_SHELF_STOCK, AMOUNT_SHELF_STOCK, AMOUNT_REVALUATE, QTY_RECIEVED, AMOUNT_RECIEVED, QTY_SOLD, AMOUNT_SOLD, AMOUNT_SOLD_EXCL, COSTPRICE_SOLD, QTY_CHANGE, AMOUNT_CHANGE, QTY_TRANSIT, AMOUNT_TRANSIT, QTY_PO, AMOUNT_PO, QTY_PO_COMPLETE, AMOUNT_PO_COMPLETE, QTY_MINIMUM_STOCK, AMOUNT_MINIMUM_STOCK, QTY_CONSIGNMENT, AMOUNT_CONSIGNMENT, COSTPRICE_CONSIGNMENT, QTY_PREPICKLIST, AMOUNT_PREPICKLIST, COSTPRICE_PREPICKLIST, QTY_PICKLIST, AMOUNT_PICKLIST, COSTPRICE_PICKLIST, QTY_PREORDER, AMOUNT_PREORDER, COSTPRICE_PREORDER, QTY_ORDER, AMOUNT_ORDER, COSTPRICE_ORDER, QTY_PRESOLD, AMOUNT_PRESOLD, COSTPRICE_PRESOLD, QTY_B2B_RETURN, AMOUNT_B2B_RETURN, COSTPRICE_B2B_RETURN, } = transaction_1.default.
|
|
12
|
-
const DATABASE_VECTOR_LENGTH =
|
|
13
|
-
// const DATABASE_VECTOR_LENGTH = 40 // For wholesale (+retail) transactions
|
|
11
|
+
const { QTY_TRANSACTION, QTY_STOCK, AMOUNT_STOCK, QTY_SHELF_STOCK, AMOUNT_SHELF_STOCK, AMOUNT_REVALUATE, QTY_RECIEVED, AMOUNT_RECIEVED, QTY_SOLD, AMOUNT_SOLD, AMOUNT_SOLD_EXCL, COSTPRICE_SOLD, QTY_CHANGE, AMOUNT_CHANGE, QTY_TRANSIT, AMOUNT_TRANSIT, QTY_PO, AMOUNT_PO, QTY_PO_COMPLETE, AMOUNT_PO_COMPLETE, QTY_MINIMUM_STOCK, AMOUNT_MINIMUM_STOCK, QTY_CONSIGNMENT, AMOUNT_CONSIGNMENT, COSTPRICE_CONSIGNMENT, QTY_PREPICKLIST, AMOUNT_PREPICKLIST, COSTPRICE_PREPICKLIST, QTY_PICKLIST, AMOUNT_PICKLIST, COSTPRICE_PICKLIST, QTY_PREORDER, AMOUNT_PREORDER, COSTPRICE_PREORDER, QTY_ORDER, AMOUNT_ORDER, COSTPRICE_ORDER, QTY_PRESOLD, AMOUNT_PRESOLD, COSTPRICE_PRESOLD, QTY_B2B_RETURN, AMOUNT_B2B_RETURN, COSTPRICE_B2B_RETURN, } = transaction_1.default.dbTransactionVector;
|
|
12
|
+
const DATABASE_VECTOR_LENGTH = 40;
|
|
14
13
|
// DERIVED FIELDS
|
|
15
14
|
const AMOUNT_SOLD_MAX = DATABASE_VECTOR_LENGTH + 0;
|
|
16
15
|
const AMOUNT_SOLD_DISCOUNT = DATABASE_VECTOR_LENGTH + 1;
|
|
@@ -85,8 +84,11 @@ function addTransactionToAggregations(beginTimestamp, endTimestamp, aggregateKey
|
|
|
85
84
|
const vector = transaction.vector;
|
|
86
85
|
if (transaction.type == '1' && transaction.time > aggregateVector[MAX_RECIEVE_TIMESTAMP])
|
|
87
86
|
aggregateVector[MAX_RECIEVE_TIMESTAMP] = transaction.time;
|
|
88
|
-
if (transaction.time <= beginTimestamp)
|
|
89
|
-
|
|
87
|
+
if (transaction.time <= beginTimestamp) {
|
|
88
|
+
addVectors(aggregateVector, vector, BEGIN_STOCK_VECTOR_START, BEGIN_STOCK_VECTOR_END);
|
|
89
|
+
addVectors(aggregateVector, vector, QTY_CONSIGNMENT, COSTPRICE_CONSIGNMENT + 1);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
90
92
|
if (transaction.time > endTimestamp)
|
|
91
93
|
return;
|
|
92
94
|
addVectors(aggregateVector, vector, BEGIN_STOCK_VECTOR_END, vector.length);
|
|
@@ -248,10 +250,11 @@ function whichShardsToProcess(dateRange, granularity) {
|
|
|
248
250
|
* Calculate all derived columns on a given vector.
|
|
249
251
|
*/
|
|
250
252
|
function postAgg(v, timeFrame) {
|
|
251
|
-
v[QTY_END_STOCK] = v[QTY_STOCK] + v[QTY_RECIEVED] - v[QTY_SOLD] + v[QTY_CHANGE] + v[QTY_TRANSIT];
|
|
252
|
-
v[AMOUNT_END_STOCK] =
|
|
253
|
-
|
|
254
|
-
v[
|
|
253
|
+
v[QTY_END_STOCK] = v[QTY_STOCK] + v[QTY_RECIEVED] - v[QTY_SOLD] + v[QTY_CHANGE] + v[QTY_TRANSIT] - v[QTY_PRESOLD] + v[QTY_B2B_RETURN];
|
|
254
|
+
v[AMOUNT_END_STOCK] =
|
|
255
|
+
v[AMOUNT_STOCK] + v[AMOUNT_RECIEVED] - v[COSTPRICE_SOLD] + v[AMOUNT_CHANGE] + v[AMOUNT_TRANSIT] + v[AMOUNT_REVALUATE] - v[COSTPRICE_PRESOLD] + v[COSTPRICE_B2B_RETURN];
|
|
256
|
+
v[QTY_END_SHELF_STOCK] = v[QTY_END_STOCK] - v[QTY_CONSIGNMENT];
|
|
257
|
+
v[AMOUNT_END_SHELF_STOCK] = v[AMOUNT_END_STOCK] - v[COSTPRICE_CONSIGNMENT];
|
|
255
258
|
v[SELLOUT_PERCENTAGE] = (v[QTY_SOLD] / (v[QTY_SOLD] + v[QTY_END_STOCK])) * 100;
|
|
256
259
|
v[ROI] = v[AMOUNT_SOLD_EXCL] - v[AMOUNT_RECIEVED] + v[AMOUNT_TRANSIT];
|
|
257
260
|
v[QTY_AVG_STOCK] = (v[QTY_STOCK] * timeFrame + v[STOCK_TIME_PRODUCT]) / timeFrame;
|
package/dist/transaction.d.ts
CHANGED
package/dist/transaction.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const types_1 = require("./types");
|
|
4
4
|
const index_1 = require("./index");
|
|
5
5
|
// fields in Vector
|
|
6
|
-
const
|
|
6
|
+
const dbTransactionVector = {
|
|
7
7
|
QTY_TRANSACTION: 0,
|
|
8
8
|
QTY_STOCK: 1,
|
|
9
9
|
AMOUNT_STOCK: 2,
|
|
@@ -48,8 +48,7 @@ const transactionVector = {
|
|
|
48
48
|
AMOUNT_B2B_RETURN: 38,
|
|
49
49
|
COSTPRICE_B2B_RETURN: 39,
|
|
50
50
|
};
|
|
51
|
-
|
|
52
|
-
const { QTY_TRANSACTION, QTY_STOCK, AMOUNT_STOCK, QTY_SHELF_STOCK, AMOUNT_SHELF_STOCK, AMOUNT_REVALUATE, QTY_RECIEVED, AMOUNT_RECIEVED, QTY_SOLD, AMOUNT_SOLD, AMOUNT_SOLD_EXCL, COSTPRICE_SOLD, QTY_CHANGE, AMOUNT_CHANGE, QTY_TRANSIT, AMOUNT_TRANSIT, QTY_PO, AMOUNT_PO, QTY_PO_COMPLETE, AMOUNT_PO_COMPLETE, QTY_MINIMUM_STOCK, AMOUNT_MINIMUM_STOCK, QTY_CONSIGNMENT, AMOUNT_CONSIGNMENT, COSTPRICE_CONSIGNMENT, } = transactionVector;
|
|
51
|
+
const tv = dbTransactionVector;
|
|
53
52
|
/**
|
|
54
53
|
*
|
|
55
54
|
* Build a BI transaction object
|
|
@@ -72,109 +71,109 @@ const buildTransaction = function (transaction) {
|
|
|
72
71
|
if (transaction.agent)
|
|
73
72
|
dbTransaction.agent = transaction.agent;
|
|
74
73
|
if (transaction.type == types_1.transactionTypeE.RECEIVING) {
|
|
75
|
-
const vector = new Array(AMOUNT_RECIEVED + 1);
|
|
74
|
+
const vector = new Array(tv.AMOUNT_RECIEVED + 1);
|
|
76
75
|
vector.fill(0);
|
|
77
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
78
|
-
vector[QTY_STOCK] = transaction.qty;
|
|
79
|
-
vector[AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
80
|
-
vector[QTY_SHELF_STOCK] = transaction.qty;
|
|
81
|
-
vector[AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
82
|
-
vector[QTY_RECIEVED] = transaction.qty;
|
|
83
|
-
vector[AMOUNT_RECIEVED] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
76
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
77
|
+
vector[tv.QTY_STOCK] = transaction.qty;
|
|
78
|
+
vector[tv.AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
79
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty;
|
|
80
|
+
vector[tv.AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
81
|
+
vector[tv.QTY_RECIEVED] = transaction.qty;
|
|
82
|
+
vector[tv.AMOUNT_RECIEVED] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
84
83
|
dbTransaction.vector = vector;
|
|
85
84
|
return dbTransaction;
|
|
86
85
|
}
|
|
87
86
|
if (transaction.type == types_1.transactionTypeE.SALE) {
|
|
88
|
-
const vector = new Array(COSTPRICE_SOLD + 1);
|
|
87
|
+
const vector = new Array(tv.COSTPRICE_SOLD + 1);
|
|
89
88
|
vector.fill(0);
|
|
90
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
91
|
-
vector[QTY_STOCK] = -transaction.qty;
|
|
92
|
-
vector[AMOUNT_STOCK] = (0, index_1.round2)(-transaction.buyprice * transaction.qty);
|
|
93
|
-
vector[QTY_SHELF_STOCK] = -transaction.qty;
|
|
94
|
-
vector[AMOUNT_SHELF_STOCK] = (0, index_1.round2)(-transaction.buyprice * transaction.qty);
|
|
95
|
-
vector[QTY_SOLD] = transaction.qty;
|
|
96
|
-
vector[AMOUNT_SOLD] = (0, index_1.round2)(transaction.sellprice * transaction.qty);
|
|
97
|
-
vector[AMOUNT_SOLD_EXCL] = (0, index_1.round2)((transaction.sellprice / ((100 + (transaction.vat || 0)) / 100)) * transaction.qty);
|
|
98
|
-
vector[COSTPRICE_SOLD] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
89
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
90
|
+
vector[tv.QTY_STOCK] = -transaction.qty;
|
|
91
|
+
vector[tv.AMOUNT_STOCK] = (0, index_1.round2)(-transaction.buyprice * transaction.qty);
|
|
92
|
+
vector[tv.QTY_SHELF_STOCK] = -transaction.qty;
|
|
93
|
+
vector[tv.AMOUNT_SHELF_STOCK] = (0, index_1.round2)(-transaction.buyprice * transaction.qty);
|
|
94
|
+
vector[tv.QTY_SOLD] = transaction.qty;
|
|
95
|
+
vector[tv.AMOUNT_SOLD] = (0, index_1.round2)(transaction.sellprice * transaction.qty);
|
|
96
|
+
vector[tv.AMOUNT_SOLD_EXCL] = (0, index_1.round2)((transaction.sellprice / ((100 + (transaction.vat || 0)) / 100)) * transaction.qty);
|
|
97
|
+
vector[tv.COSTPRICE_SOLD] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
99
98
|
dbTransaction.vector = vector;
|
|
100
99
|
return dbTransaction;
|
|
101
100
|
}
|
|
102
101
|
if (transaction.type == types_1.transactionTypeE.TRANSIT) {
|
|
103
|
-
const vector = new Array(AMOUNT_TRANSIT + 1);
|
|
102
|
+
const vector = new Array(tv.AMOUNT_TRANSIT + 1);
|
|
104
103
|
vector.fill(0);
|
|
105
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
106
|
-
vector[QTY_STOCK] = transaction.qty;
|
|
107
|
-
vector[AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
108
|
-
vector[QTY_SHELF_STOCK] = transaction.qty;
|
|
109
|
-
vector[AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
110
|
-
vector[QTY_TRANSIT] = transaction.qty;
|
|
111
|
-
vector[AMOUNT_TRANSIT] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
104
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
105
|
+
vector[tv.QTY_STOCK] = transaction.qty;
|
|
106
|
+
vector[tv.AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
107
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty;
|
|
108
|
+
vector[tv.AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
109
|
+
vector[tv.QTY_TRANSIT] = transaction.qty;
|
|
110
|
+
vector[tv.AMOUNT_TRANSIT] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
112
111
|
dbTransaction.vector = vector;
|
|
113
112
|
return dbTransaction;
|
|
114
113
|
}
|
|
115
114
|
if (transaction.type == types_1.transactionTypeE.CHANGE || transaction.type == types_1.transactionTypeE.START_STOCK) {
|
|
116
|
-
const vector = new Array(AMOUNT_CHANGE + 1);
|
|
115
|
+
const vector = new Array(tv.AMOUNT_CHANGE + 1);
|
|
117
116
|
vector.fill(0);
|
|
118
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
119
|
-
vector[QTY_STOCK] = transaction.qty;
|
|
120
|
-
vector[AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
121
|
-
vector[QTY_SHELF_STOCK] = transaction.qty;
|
|
122
|
-
vector[AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
123
|
-
vector[QTY_CHANGE] = transaction.qty;
|
|
124
|
-
vector[AMOUNT_CHANGE] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
117
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
118
|
+
vector[tv.QTY_STOCK] = transaction.qty;
|
|
119
|
+
vector[tv.AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
120
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty;
|
|
121
|
+
vector[tv.AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
122
|
+
vector[tv.QTY_CHANGE] = transaction.qty;
|
|
123
|
+
vector[tv.AMOUNT_CHANGE] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
125
124
|
dbTransaction.vector = vector;
|
|
126
125
|
return dbTransaction;
|
|
127
126
|
}
|
|
128
127
|
if (transaction.type == types_1.transactionTypeE.RE_VALUATION) {
|
|
129
|
-
const vector = new Array(AMOUNT_REVALUATE + 1);
|
|
128
|
+
const vector = new Array(tv.AMOUNT_REVALUATE + 1);
|
|
130
129
|
vector.fill(0);
|
|
131
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
132
|
-
vector[AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
133
|
-
vector[AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
134
|
-
vector[AMOUNT_REVALUATE] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
130
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
131
|
+
vector[tv.AMOUNT_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
132
|
+
vector[tv.AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
133
|
+
vector[tv.AMOUNT_REVALUATE] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
135
134
|
dbTransaction.vector = vector;
|
|
136
135
|
return dbTransaction;
|
|
137
136
|
}
|
|
138
137
|
if (transaction.type == types_1.transactionTypeE.START_SHELF_STOCK) {
|
|
139
138
|
dbTransaction.type = types_1.transactionTypeE.START_STOCK;
|
|
140
|
-
const vector = new Array(AMOUNT_SHELF_STOCK + 1);
|
|
139
|
+
const vector = new Array(tv.AMOUNT_SHELF_STOCK + 1);
|
|
141
140
|
vector.fill(0);
|
|
142
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
143
|
-
vector[QTY_SHELF_STOCK] = transaction.qty;
|
|
144
|
-
vector[AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
141
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
142
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty;
|
|
143
|
+
vector[tv.AMOUNT_SHELF_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
145
144
|
dbTransaction.vector = vector;
|
|
146
145
|
return dbTransaction;
|
|
147
146
|
}
|
|
148
147
|
if (transaction.type == types_1.transactionTypeE.PURCHASE_ORDER) {
|
|
149
|
-
const vector = new Array(AMOUNT_PO + 1);
|
|
148
|
+
const vector = new Array(tv.AMOUNT_PO + 1);
|
|
150
149
|
vector.fill(0);
|
|
151
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
152
|
-
vector[QTY_PO] = transaction.qty;
|
|
153
|
-
vector[AMOUNT_PO] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
150
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
151
|
+
vector[tv.QTY_PO] = transaction.qty;
|
|
152
|
+
vector[tv.AMOUNT_PO] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
154
153
|
dbTransaction.vector = vector;
|
|
155
154
|
return dbTransaction;
|
|
156
155
|
}
|
|
157
156
|
if (transaction.type == types_1.transactionTypeE.PURCHASE_ORDER_COMPLETE) {
|
|
158
|
-
const vector = new Array(AMOUNT_PO_COMPLETE + 1);
|
|
157
|
+
const vector = new Array(tv.AMOUNT_PO_COMPLETE + 1);
|
|
159
158
|
vector.fill(0);
|
|
160
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
161
|
-
vector[QTY_PO_COMPLETE] = transaction.qty;
|
|
162
|
-
vector[AMOUNT_PO_COMPLETE] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
159
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
160
|
+
vector[tv.QTY_PO_COMPLETE] = transaction.qty;
|
|
161
|
+
vector[tv.AMOUNT_PO_COMPLETE] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
163
162
|
dbTransaction.vector = vector;
|
|
164
163
|
return dbTransaction;
|
|
165
164
|
}
|
|
166
165
|
if (transaction.type == types_1.transactionTypeE.MINIMUM_STOCK) {
|
|
167
|
-
const vector = new Array(AMOUNT_MINIMUM_STOCK + 1);
|
|
166
|
+
const vector = new Array(tv.AMOUNT_MINIMUM_STOCK + 1);
|
|
168
167
|
vector.fill(0);
|
|
169
|
-
vector[QTY_TRANSACTION] = transaction.qty;
|
|
170
|
-
vector[QTY_MINIMUM_STOCK] = transaction.qty;
|
|
171
|
-
vector[AMOUNT_MINIMUM_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
168
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty;
|
|
169
|
+
vector[tv.QTY_MINIMUM_STOCK] = transaction.qty;
|
|
170
|
+
vector[tv.AMOUNT_MINIMUM_STOCK] = (0, index_1.round2)(transaction.buyprice * transaction.qty);
|
|
172
171
|
dbTransaction.vector = vector;
|
|
173
172
|
return dbTransaction;
|
|
174
173
|
}
|
|
175
174
|
return undefined;
|
|
176
175
|
};
|
|
177
|
-
exports.default = {
|
|
176
|
+
exports.default = { dbTransactionVector, buildTransaction };
|
|
178
177
|
/**
|
|
179
178
|
TODO:
|
|
180
179
|
|
package/package.json
CHANGED
package/src/articleStatus.ts
CHANGED
|
@@ -48,10 +48,9 @@ const {
|
|
|
48
48
|
QTY_B2B_RETURN,
|
|
49
49
|
AMOUNT_B2B_RETURN,
|
|
50
50
|
COSTPRICE_B2B_RETURN,
|
|
51
|
-
} = transaction.
|
|
51
|
+
} = transaction.dbTransactionVector
|
|
52
52
|
|
|
53
|
-
const DATABASE_VECTOR_LENGTH =
|
|
54
|
-
// const DATABASE_VECTOR_LENGTH = 40 // For wholesale (+retail) transactions
|
|
53
|
+
const DATABASE_VECTOR_LENGTH = 40
|
|
55
54
|
|
|
56
55
|
// DERIVED FIELDS
|
|
57
56
|
const AMOUNT_SOLD_MAX = DATABASE_VECTOR_LENGTH + 0
|
|
@@ -131,7 +130,11 @@ function addTransactionToAggregations(beginTimestamp: number, endTimestamp: numb
|
|
|
131
130
|
}
|
|
132
131
|
const vector = transaction.vector
|
|
133
132
|
if (transaction.type == '1' && transaction.time > aggregateVector[MAX_RECIEVE_TIMESTAMP]) aggregateVector[MAX_RECIEVE_TIMESTAMP] = transaction.time
|
|
134
|
-
if (transaction.time <= beginTimestamp)
|
|
133
|
+
if (transaction.time <= beginTimestamp) {
|
|
134
|
+
addVectors(aggregateVector, vector, BEGIN_STOCK_VECTOR_START, BEGIN_STOCK_VECTOR_END)
|
|
135
|
+
addVectors(aggregateVector, vector, QTY_CONSIGNMENT, COSTPRICE_CONSIGNMENT + 1)
|
|
136
|
+
return
|
|
137
|
+
}
|
|
135
138
|
if (transaction.time > endTimestamp) return
|
|
136
139
|
addVectors(aggregateVector, vector, BEGIN_STOCK_VECTOR_END, vector.length)
|
|
137
140
|
|
|
@@ -312,10 +315,11 @@ function whichShardsToProcess(dateRange: any, granularity: 'year' | 'month'): an
|
|
|
312
315
|
* Calculate all derived columns on a given vector.
|
|
313
316
|
*/
|
|
314
317
|
function postAgg(v: any, timeFrame: number): void {
|
|
315
|
-
v[QTY_END_STOCK] = v[QTY_STOCK] + v[QTY_RECIEVED] - v[QTY_SOLD] + v[QTY_CHANGE] + v[QTY_TRANSIT]
|
|
316
|
-
v[AMOUNT_END_STOCK] =
|
|
317
|
-
|
|
318
|
-
v[
|
|
318
|
+
v[QTY_END_STOCK] = v[QTY_STOCK] + v[QTY_RECIEVED] - v[QTY_SOLD] + v[QTY_CHANGE] + v[QTY_TRANSIT] - v[QTY_PRESOLD] + v[QTY_B2B_RETURN]
|
|
319
|
+
v[AMOUNT_END_STOCK] =
|
|
320
|
+
v[AMOUNT_STOCK] + v[AMOUNT_RECIEVED] - v[COSTPRICE_SOLD] + v[AMOUNT_CHANGE] + v[AMOUNT_TRANSIT] + v[AMOUNT_REVALUATE] - v[COSTPRICE_PRESOLD] + v[COSTPRICE_B2B_RETURN]
|
|
321
|
+
v[QTY_END_SHELF_STOCK] = v[QTY_END_STOCK] - v[QTY_CONSIGNMENT]
|
|
322
|
+
v[AMOUNT_END_SHELF_STOCK] = v[AMOUNT_END_STOCK] - v[COSTPRICE_CONSIGNMENT]
|
|
319
323
|
v[SELLOUT_PERCENTAGE] = (v[QTY_SOLD] / (v[QTY_SOLD] + v[QTY_END_STOCK])) * 100
|
|
320
324
|
v[ROI] = v[AMOUNT_SOLD_EXCL] - v[AMOUNT_RECIEVED] + v[AMOUNT_TRANSIT]
|
|
321
325
|
v[QTY_AVG_STOCK] = (v[QTY_STOCK] * timeFrame + v[STOCK_TIME_PRODUCT]) / timeFrame
|
package/src/transaction.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { dbTransactionI, TransactionI, transactionTypeE } from './types'
|
|
|
2
2
|
import { round2 } from './index'
|
|
3
3
|
|
|
4
4
|
// fields in Vector
|
|
5
|
-
const
|
|
5
|
+
const dbTransactionVector = {
|
|
6
6
|
QTY_TRANSACTION: 0,
|
|
7
7
|
QTY_STOCK: 1,
|
|
8
8
|
AMOUNT_STOCK: 2,
|
|
@@ -48,34 +48,7 @@ const transactionVector = {
|
|
|
48
48
|
AMOUNT_B2B_RETURN: 38,
|
|
49
49
|
COSTPRICE_B2B_RETURN: 39,
|
|
50
50
|
}
|
|
51
|
-
|
|
52
|
-
const {
|
|
53
|
-
QTY_TRANSACTION,
|
|
54
|
-
QTY_STOCK,
|
|
55
|
-
AMOUNT_STOCK,
|
|
56
|
-
QTY_SHELF_STOCK,
|
|
57
|
-
AMOUNT_SHELF_STOCK,
|
|
58
|
-
AMOUNT_REVALUATE,
|
|
59
|
-
QTY_RECIEVED,
|
|
60
|
-
AMOUNT_RECIEVED,
|
|
61
|
-
QTY_SOLD,
|
|
62
|
-
AMOUNT_SOLD,
|
|
63
|
-
AMOUNT_SOLD_EXCL,
|
|
64
|
-
COSTPRICE_SOLD,
|
|
65
|
-
QTY_CHANGE,
|
|
66
|
-
AMOUNT_CHANGE,
|
|
67
|
-
QTY_TRANSIT,
|
|
68
|
-
AMOUNT_TRANSIT,
|
|
69
|
-
QTY_PO,
|
|
70
|
-
AMOUNT_PO,
|
|
71
|
-
QTY_PO_COMPLETE,
|
|
72
|
-
AMOUNT_PO_COMPLETE,
|
|
73
|
-
QTY_MINIMUM_STOCK,
|
|
74
|
-
AMOUNT_MINIMUM_STOCK,
|
|
75
|
-
QTY_CONSIGNMENT,
|
|
76
|
-
AMOUNT_CONSIGNMENT,
|
|
77
|
-
COSTPRICE_CONSIGNMENT,
|
|
78
|
-
} = transactionVector
|
|
51
|
+
const tv = dbTransactionVector
|
|
79
52
|
|
|
80
53
|
/**
|
|
81
54
|
*
|
|
@@ -97,70 +70,70 @@ const buildTransaction = function (transaction: TransactionI): dbTransactionI |
|
|
|
97
70
|
if (transaction.agent) dbTransaction.agent = transaction.agent
|
|
98
71
|
|
|
99
72
|
if (transaction.type == transactionTypeE.RECEIVING) {
|
|
100
|
-
const vector = new Array(AMOUNT_RECIEVED + 1)
|
|
73
|
+
const vector = new Array(tv.AMOUNT_RECIEVED + 1)
|
|
101
74
|
vector.fill(0)
|
|
102
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
103
|
-
vector[QTY_STOCK] = transaction.qty
|
|
104
|
-
vector[AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
105
|
-
vector[QTY_SHELF_STOCK] = transaction.qty
|
|
106
|
-
vector[AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
107
|
-
vector[QTY_RECIEVED] = transaction.qty
|
|
108
|
-
vector[AMOUNT_RECIEVED] = round2(transaction.buyprice * transaction.qty)
|
|
75
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
76
|
+
vector[tv.QTY_STOCK] = transaction.qty
|
|
77
|
+
vector[tv.AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
78
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty
|
|
79
|
+
vector[tv.AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
80
|
+
vector[tv.QTY_RECIEVED] = transaction.qty
|
|
81
|
+
vector[tv.AMOUNT_RECIEVED] = round2(transaction.buyprice * transaction.qty)
|
|
109
82
|
dbTransaction.vector = vector
|
|
110
83
|
return dbTransaction
|
|
111
84
|
}
|
|
112
85
|
|
|
113
86
|
if (transaction.type == transactionTypeE.SALE) {
|
|
114
|
-
const vector = new Array(COSTPRICE_SOLD + 1)
|
|
87
|
+
const vector = new Array(tv.COSTPRICE_SOLD + 1)
|
|
115
88
|
vector.fill(0)
|
|
116
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
117
|
-
vector[QTY_STOCK] = -transaction.qty
|
|
118
|
-
vector[AMOUNT_STOCK] = round2(-transaction.buyprice * transaction.qty)
|
|
119
|
-
vector[QTY_SHELF_STOCK] = -transaction.qty
|
|
120
|
-
vector[AMOUNT_SHELF_STOCK] = round2(-transaction.buyprice * transaction.qty)
|
|
121
|
-
vector[QTY_SOLD] = transaction.qty
|
|
122
|
-
vector[AMOUNT_SOLD] = round2(transaction.sellprice * transaction.qty)
|
|
123
|
-
vector[AMOUNT_SOLD_EXCL] = round2((transaction.sellprice / ((100 + (transaction.vat || 0)) / 100)) * transaction.qty)
|
|
124
|
-
vector[COSTPRICE_SOLD] = round2(transaction.buyprice * transaction.qty)
|
|
89
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
90
|
+
vector[tv.QTY_STOCK] = -transaction.qty
|
|
91
|
+
vector[tv.AMOUNT_STOCK] = round2(-transaction.buyprice * transaction.qty)
|
|
92
|
+
vector[tv.QTY_SHELF_STOCK] = -transaction.qty
|
|
93
|
+
vector[tv.AMOUNT_SHELF_STOCK] = round2(-transaction.buyprice * transaction.qty)
|
|
94
|
+
vector[tv.QTY_SOLD] = transaction.qty
|
|
95
|
+
vector[tv.AMOUNT_SOLD] = round2(transaction.sellprice * transaction.qty)
|
|
96
|
+
vector[tv.AMOUNT_SOLD_EXCL] = round2((transaction.sellprice / ((100 + (transaction.vat || 0)) / 100)) * transaction.qty)
|
|
97
|
+
vector[tv.COSTPRICE_SOLD] = round2(transaction.buyprice * transaction.qty)
|
|
125
98
|
dbTransaction.vector = vector
|
|
126
99
|
return dbTransaction
|
|
127
100
|
}
|
|
128
101
|
|
|
129
102
|
if (transaction.type == transactionTypeE.TRANSIT) {
|
|
130
|
-
const vector = new Array(AMOUNT_TRANSIT + 1)
|
|
103
|
+
const vector = new Array(tv.AMOUNT_TRANSIT + 1)
|
|
131
104
|
vector.fill(0)
|
|
132
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
133
|
-
vector[QTY_STOCK] = transaction.qty
|
|
134
|
-
vector[AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
135
|
-
vector[QTY_SHELF_STOCK] = transaction.qty
|
|
136
|
-
vector[AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
137
|
-
vector[QTY_TRANSIT] = transaction.qty
|
|
138
|
-
vector[AMOUNT_TRANSIT] = round2(transaction.buyprice * transaction.qty)
|
|
105
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
106
|
+
vector[tv.QTY_STOCK] = transaction.qty
|
|
107
|
+
vector[tv.AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
108
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty
|
|
109
|
+
vector[tv.AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
110
|
+
vector[tv.QTY_TRANSIT] = transaction.qty
|
|
111
|
+
vector[tv.AMOUNT_TRANSIT] = round2(transaction.buyprice * transaction.qty)
|
|
139
112
|
dbTransaction.vector = vector
|
|
140
113
|
return dbTransaction
|
|
141
114
|
}
|
|
142
115
|
|
|
143
116
|
if (transaction.type == transactionTypeE.CHANGE || transaction.type == transactionTypeE.START_STOCK) {
|
|
144
|
-
const vector = new Array(AMOUNT_CHANGE + 1)
|
|
117
|
+
const vector = new Array(tv.AMOUNT_CHANGE + 1)
|
|
145
118
|
vector.fill(0)
|
|
146
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
147
|
-
vector[QTY_STOCK] = transaction.qty
|
|
148
|
-
vector[AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
149
|
-
vector[QTY_SHELF_STOCK] = transaction.qty
|
|
150
|
-
vector[AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
151
|
-
vector[QTY_CHANGE] = transaction.qty
|
|
152
|
-
vector[AMOUNT_CHANGE] = round2(transaction.buyprice * transaction.qty)
|
|
119
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
120
|
+
vector[tv.QTY_STOCK] = transaction.qty
|
|
121
|
+
vector[tv.AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
122
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty
|
|
123
|
+
vector[tv.AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
124
|
+
vector[tv.QTY_CHANGE] = transaction.qty
|
|
125
|
+
vector[tv.AMOUNT_CHANGE] = round2(transaction.buyprice * transaction.qty)
|
|
153
126
|
dbTransaction.vector = vector
|
|
154
127
|
return dbTransaction
|
|
155
128
|
}
|
|
156
129
|
|
|
157
130
|
if (transaction.type == transactionTypeE.RE_VALUATION) {
|
|
158
|
-
const vector = new Array(AMOUNT_REVALUATE + 1)
|
|
131
|
+
const vector = new Array(tv.AMOUNT_REVALUATE + 1)
|
|
159
132
|
vector.fill(0)
|
|
160
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
161
|
-
vector[AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
162
|
-
vector[AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
163
|
-
vector[AMOUNT_REVALUATE] = round2(transaction.buyprice * transaction.qty)
|
|
133
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
134
|
+
vector[tv.AMOUNT_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
135
|
+
vector[tv.AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
136
|
+
vector[tv.AMOUNT_REVALUATE] = round2(transaction.buyprice * transaction.qty)
|
|
164
137
|
dbTransaction.vector = vector
|
|
165
138
|
return dbTransaction
|
|
166
139
|
}
|
|
@@ -168,48 +141,48 @@ const buildTransaction = function (transaction: TransactionI): dbTransactionI |
|
|
|
168
141
|
if (transaction.type == transactionTypeE.START_SHELF_STOCK) {
|
|
169
142
|
dbTransaction.type = transactionTypeE.START_STOCK
|
|
170
143
|
|
|
171
|
-
const vector = new Array(AMOUNT_SHELF_STOCK + 1)
|
|
144
|
+
const vector = new Array(tv.AMOUNT_SHELF_STOCK + 1)
|
|
172
145
|
vector.fill(0)
|
|
173
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
174
|
-
vector[QTY_SHELF_STOCK] = transaction.qty
|
|
175
|
-
vector[AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
146
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
147
|
+
vector[tv.QTY_SHELF_STOCK] = transaction.qty
|
|
148
|
+
vector[tv.AMOUNT_SHELF_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
176
149
|
dbTransaction.vector = vector
|
|
177
150
|
return dbTransaction
|
|
178
151
|
}
|
|
179
152
|
|
|
180
153
|
if (transaction.type == transactionTypeE.PURCHASE_ORDER) {
|
|
181
|
-
const vector = new Array(AMOUNT_PO + 1)
|
|
154
|
+
const vector = new Array(tv.AMOUNT_PO + 1)
|
|
182
155
|
vector.fill(0)
|
|
183
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
184
|
-
vector[QTY_PO] = transaction.qty
|
|
185
|
-
vector[AMOUNT_PO] = round2(transaction.buyprice * transaction.qty)
|
|
156
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
157
|
+
vector[tv.QTY_PO] = transaction.qty
|
|
158
|
+
vector[tv.AMOUNT_PO] = round2(transaction.buyprice * transaction.qty)
|
|
186
159
|
dbTransaction.vector = vector
|
|
187
160
|
return dbTransaction
|
|
188
161
|
}
|
|
189
162
|
|
|
190
163
|
if (transaction.type == transactionTypeE.PURCHASE_ORDER_COMPLETE) {
|
|
191
|
-
const vector = new Array(AMOUNT_PO_COMPLETE + 1)
|
|
164
|
+
const vector = new Array(tv.AMOUNT_PO_COMPLETE + 1)
|
|
192
165
|
vector.fill(0)
|
|
193
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
194
|
-
vector[QTY_PO_COMPLETE] = transaction.qty
|
|
195
|
-
vector[AMOUNT_PO_COMPLETE] = round2(transaction.buyprice * transaction.qty)
|
|
166
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
167
|
+
vector[tv.QTY_PO_COMPLETE] = transaction.qty
|
|
168
|
+
vector[tv.AMOUNT_PO_COMPLETE] = round2(transaction.buyprice * transaction.qty)
|
|
196
169
|
dbTransaction.vector = vector
|
|
197
170
|
return dbTransaction
|
|
198
171
|
}
|
|
199
172
|
|
|
200
173
|
if (transaction.type == transactionTypeE.MINIMUM_STOCK) {
|
|
201
|
-
const vector = new Array(AMOUNT_MINIMUM_STOCK + 1)
|
|
174
|
+
const vector = new Array(tv.AMOUNT_MINIMUM_STOCK + 1)
|
|
202
175
|
vector.fill(0)
|
|
203
|
-
vector[QTY_TRANSACTION] = transaction.qty
|
|
204
|
-
vector[QTY_MINIMUM_STOCK] = transaction.qty
|
|
205
|
-
vector[AMOUNT_MINIMUM_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
176
|
+
vector[tv.QTY_TRANSACTION] = transaction.qty
|
|
177
|
+
vector[tv.QTY_MINIMUM_STOCK] = transaction.qty
|
|
178
|
+
vector[tv.AMOUNT_MINIMUM_STOCK] = round2(transaction.buyprice * transaction.qty)
|
|
206
179
|
dbTransaction.vector = vector
|
|
207
180
|
return dbTransaction
|
|
208
181
|
}
|
|
209
182
|
|
|
210
183
|
return undefined
|
|
211
184
|
}
|
|
212
|
-
export default {
|
|
185
|
+
export default { dbTransactionVector, buildTransaction }
|
|
213
186
|
|
|
214
187
|
/**
|
|
215
188
|
TODO:
|
|
@@ -4,11 +4,11 @@ const { expect } = require('chai')
|
|
|
4
4
|
const articleStatus = core.articleStatus
|
|
5
5
|
describe('#articleStatus', () => {
|
|
6
6
|
describe('#constants', () => {
|
|
7
|
-
it('QTY_SOLD_BEFORE_RETURNS should be
|
|
8
|
-
expect(articleStatus.QTY_SOLD_BEFORE_RETURNS).to.equal(
|
|
7
|
+
it('QTY_SOLD_BEFORE_RETURNS should be 61', () => {
|
|
8
|
+
expect(articleStatus.QTY_SOLD_BEFORE_RETURNS).to.equal(61)
|
|
9
9
|
})
|
|
10
|
-
it('AMOUNT_RETURN should be
|
|
11
|
-
expect(articleStatus.AMOUNT_RETURN).to.equal(
|
|
10
|
+
it('AMOUNT_RETURN should be 46', () => {
|
|
11
|
+
expect(articleStatus.AMOUNT_RETURN).to.equal(46)
|
|
12
12
|
})
|
|
13
13
|
})
|
|
14
14
|
})
|