@things-factory/operato-pms 4.3.595 → 4.3.601
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/harvesting/harvesting-create-record.js +5 -2
- package/client/pages/loading/edit-loading-record.js +2 -0
- package/client/pages/report/report-daily-ffb-dispatch-and-production.js +19 -23
- package/dist-server/entities/daily-dispatch.js +2 -2
- package/dist-server/entities/daily-dispatch.js.map +1 -1
- package/dist-server/entities/ramp-block-history.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-dispatch/delete-daily-dispatch.js +49 -1
- package/dist-server/graphql/resolvers/daily-dispatch/delete-daily-dispatch.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js +124 -112
- package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js +51 -2
- package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-harvest/delete-daily-harvest.js +5 -7
- package/dist-server/graphql/resolvers/daily-harvest/delete-daily-harvest.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js +3 -3
- package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-loading/delete-daily-loading.js +6 -0
- package/dist-server/graphql/resolvers/daily-loading/delete-daily-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js +68 -52
- package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js +16 -22
- package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js +50 -19
- package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/daily-production-reports.js +96 -67
- package/dist-server/graphql/resolvers/report/daily-production-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js +1 -0
- package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js +7 -2
- package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js +11 -5
- package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js +21 -9
- package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/monthly-production-reports.js +5 -2
- package/dist-server/graphql/resolvers/report/monthly-production-reports.js.map +1 -1
- package/dist-server/graphql/resolvers/report/yearly-production-reports.js +5 -2
- package/dist-server/graphql/resolvers/report/yearly-production-reports.js.map +1 -1
- package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js +2 -0
- package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js.map +1 -1
- package/dist-server/utils/transaction-util.js +32 -53
- package/dist-server/utils/transaction-util.js.map +1 -1
- package/package.json +2 -2
- package/server/entities/daily-dispatch.ts +2 -2
- package/server/entities/ramp-block-history.ts +2 -5
- package/server/graphql/resolvers/daily-dispatch/delete-daily-dispatch.ts +69 -2
- package/server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.ts +179 -141
- package/server/graphql/resolvers/daily-dispatch/update-daily-dispatch.ts +68 -5
- package/server/graphql/resolvers/daily-harvest/delete-daily-harvest.ts +9 -26
- package/server/graphql/resolvers/daily-harvest/generate-daily-harvest.ts +3 -3
- package/server/graphql/resolvers/daily-loading/delete-daily-loading.ts +11 -1
- package/server/graphql/resolvers/daily-loading/generate-daily-loading.ts +95 -98
- package/server/graphql/resolvers/daily-loading/update-daily-loading.ts +44 -47
- package/server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.ts +61 -26
- package/server/graphql/resolvers/report/daily-production-reports.ts +103 -72
- package/server/graphql/resolvers/report/daily-staff-harvest-reports.ts +5 -2
- package/server/graphql/resolvers/report/monthly-block-dispatch-reports.ts +20 -9
- package/server/graphql/resolvers/report/monthly-dispatch-summary-reports.ts +16 -12
- package/server/graphql/resolvers/report/monthly-ffb-sale-reports.ts +26 -12
- package/server/graphql/resolvers/report/monthly-production-reports.ts +5 -3
- package/server/graphql/resolvers/report/yearly-production-reports.ts +5 -2
- package/server/graphql/types/daily-loading-detail/daily-loading-detail-patch.ts +2 -0
- package/server/utils/transaction-util.ts +36 -56
- package/translations/en.json +1 -1
- package/translations/ja.json +1 -1
- package/translations/ko.json +1 -1
- package/translations/ms.json +1 -1
- package/translations/zh.json +1 -1
|
@@ -38,7 +38,7 @@ async function updateTransactionHistory(block, domain, ramp, refActionID, refRec
|
|
|
38
38
|
});
|
|
39
39
|
if (!existingTransactionRecord)
|
|
40
40
|
throw new Error('Oops! Could not find current harvest record');
|
|
41
|
-
await transactionRepo.update({ id: existingTransactionRecord.id }, { fieldBunches: totalBunches, updater: user, updatedAt: new Date() });
|
|
41
|
+
await transactionRepo.update({ id: existingTransactionRecord.id }, { fieldBunches: totalBunches, transactionDate, block, updater: user, updatedAt: new Date() });
|
|
42
42
|
}
|
|
43
43
|
return true;
|
|
44
44
|
}
|
|
@@ -48,64 +48,43 @@ exports.updateTransactionHistory = updateTransactionHistory;
|
|
|
48
48
|
* seq will be calculated based on number of records for one specific plantation inventory
|
|
49
49
|
*/
|
|
50
50
|
async function generateRampBlockHistories(block, domain, ramp, transactionType, transactionDate, rampWeight, user, deletedAt, dailyDispatch, trxMgr) {
|
|
51
|
-
console.log(block, domain, ramp, user);
|
|
52
51
|
const rampBlockHistoryRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(entities_1.RampBlockHistory)) || (0, typeorm_1.getRepository)(entities_1.RampBlockHistory);
|
|
53
52
|
if (!(ramp === null || ramp === void 0 ? void 0 : ramp.id))
|
|
54
53
|
throw new Error(`Can't find a matching ramp.`);
|
|
54
|
+
// Fetch the last ramp block history for the given block, ramp, and domain
|
|
55
55
|
const lastRampBlockHistory = await rampBlockHistoryRepo.findOne({
|
|
56
56
|
where: { domain, ramp, block },
|
|
57
|
-
order: {
|
|
57
|
+
order: { createdAt: 'DESC' }
|
|
58
58
|
});
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
.createQueryBuilder()
|
|
89
|
-
.insert()
|
|
90
|
-
.into(entities_1.RampBlockHistory)
|
|
91
|
-
.values([
|
|
92
|
-
{
|
|
93
|
-
domain,
|
|
94
|
-
block,
|
|
95
|
-
ramp,
|
|
96
|
-
transactionType,
|
|
97
|
-
transactionDate,
|
|
98
|
-
weight: rampWeight,
|
|
99
|
-
previousWeight,
|
|
100
|
-
currentWeight: parseFloat((previousWeight + rampWeight).toFixed(4)),
|
|
101
|
-
creator: user,
|
|
102
|
-
updater: user,
|
|
103
|
-
seq: () => `(select seq from ramp_block_histories where ramp_id = '${ramp.id}' and block_id = '${block.id}' and domain_id = '${domain.id}' order by seq desc limit 1) + 1`
|
|
104
|
-
}
|
|
105
|
-
])
|
|
106
|
-
.returning('*')
|
|
107
|
-
.execute();
|
|
108
|
-
}
|
|
59
|
+
// if (!lastRampBlockHistory) {
|
|
60
|
+
// throw new Error(
|
|
61
|
+
// `No opening quantity defined for block ${block.id} in ramp ${ramp.id}. Please set an opening quantity before creating dispatch records to avoid negative calculation in report.`
|
|
62
|
+
// )
|
|
63
|
+
// }
|
|
64
|
+
const previousWeight = lastRampBlockHistory.currentWeight;
|
|
65
|
+
const res = await rampBlockHistoryRepo
|
|
66
|
+
.createQueryBuilder()
|
|
67
|
+
.insert()
|
|
68
|
+
.into(entities_1.RampBlockHistory)
|
|
69
|
+
.values([
|
|
70
|
+
{
|
|
71
|
+
domain,
|
|
72
|
+
block,
|
|
73
|
+
ramp,
|
|
74
|
+
transactionType,
|
|
75
|
+
transactionDate,
|
|
76
|
+
weight: rampWeight,
|
|
77
|
+
previousWeight,
|
|
78
|
+
currentWeight: parseFloat((previousWeight + rampWeight).toFixed(4)),
|
|
79
|
+
dailyDispatch,
|
|
80
|
+
creator: user,
|
|
81
|
+
updater: user,
|
|
82
|
+
seq: () => `(select seq from ramp_block_histories where ramp_id = '${ramp.id}' and block_id = '${block.id}' and domain_id = '${domain.id}' order by seq desc limit 1) + 1`
|
|
83
|
+
}
|
|
84
|
+
])
|
|
85
|
+
.returning('*')
|
|
86
|
+
.execute();
|
|
87
|
+
// Extract the newly created ramp block history
|
|
109
88
|
let newRampBlockHistory = res.generatedMaps[0];
|
|
110
89
|
return newRampBlockHistory;
|
|
111
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-util.js","sourceRoot":"","sources":["../../server/utils/transaction-util.ts"],"names":[],"mappings":";;;AAEA,4CAA8E;AAC9E,0CAQoB;AACpB,oCAAsC;AACtC,qCAAkE;AAElE;;;GAGG;AAEI,KAAK,UAAU,0BAA0B,CAC9C,KAAY,EACZ,MAAc,EACd,IAAU,EACV,WAAgB,EAChB,WAAmB,EACnB,eAAuB,EACvB,eAAuB,EACvB,YAAoB,EACpB,UAAkB,EAClB,IAAU,EACV,MAAsB;IAEtB,MAAM,eAAe,GACnB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,4BAAiB,CAAC,KAAI,IAAA,uBAAa,EAAC,4BAAiB,CAAC,CAAA;IAE9E,IAAI,qBAAqB,GAAsB,IAAI,4BAAiB,EAAE,CAAA;IACtE,qBAAqB,CAAC,IAAI,GAAG,mBAAW,CAAC,sBAAsB,EAAE,CAAA;IACjE,qBAAqB,CAAC,WAAW,GAAG,WAAW,CAAA;IAC/C,qBAAqB,CAAC,WAAW,GAAG,WAAW,CAAA;IAC/C,qBAAqB,CAAC,eAAe,GAAG,eAAe,CAAA;IACvD,qBAAqB,CAAC,eAAe,GAAG,eAAe,CAAA;IACvD,qBAAqB,CAAC,YAAY,GAAG,YAAY,CAAA;IACjD,qBAAqB,CAAC,UAAU,GAAG,UAAU,CAAA;IAC7C,qBAAqB,CAAC,IAAI,GAAG,IAAI,CAAA;IACjC,qBAAqB,CAAC,MAAM,GAAG,MAAM,CAAA;IACrC,qBAAqB,CAAC,KAAK,GAAG,KAAK,CAAA;IACnC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAA;IACpC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAA;IACpC,MAAM,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAEjD,OAAO,qBAAqB,CAAA;AAC9B,CAAC;AAhCD,gEAgCC;AAEM,KAAK,UAAU,wBAAwB,CAC5C,KAAY,EACZ,MAAc,EACd,IAAU,EACV,WAAgB,EAChB,WAAmB,EACnB,eAAuB,EACvB,eAAuB,EACvB,YAAoB,EACpB,UAAkB,EAClB,IAAU,EACV,MAAsB;IAEtB,MAAM,eAAe,GACnB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,4BAAiB,CAAC,KAAI,IAAA,uBAAa,EAAC,4BAAiB,CAAC,CAAA;IAE9E,IAAI,yBAA4C,CAAA;IAEhD,QAAQ,eAAe,EAAE;QACvB,KAAK,4BAAgB,CAAC,OAAO;YAC3B,yBAAyB,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;gBACxD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE;aACvD,CAAC,CAAA;YAEF,IAAI,CAAC,yBAAyB;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAE9F,MAAM,eAAe,CAAC,MAAM,CAC1B,EAAE,EAAE,EAAE,yBAAyB,CAAC,EAAE,EAAE,EACpC,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"transaction-util.js","sourceRoot":"","sources":["../../server/utils/transaction-util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/operato-pms",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.601",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -95,5 +95,5 @@
|
|
|
95
95
|
"devDependencies": {
|
|
96
96
|
"@things-factory/builder": "^4.3.591"
|
|
97
97
|
},
|
|
98
|
-
"gitHead": "
|
|
98
|
+
"gitHead": "d7949f19d5fb44db88037b9e4a4167d49121954d"
|
|
99
99
|
}
|
|
@@ -55,8 +55,8 @@ export class DailyDispatch {
|
|
|
55
55
|
@ManyToOne(type => Organization, { nullable: true })
|
|
56
56
|
dispatchTo: Organization
|
|
57
57
|
|
|
58
|
-
@Column({ nullable: true })
|
|
59
|
-
dispatchAt: Date
|
|
58
|
+
@Column({ type: 'timestamp', nullable: true })
|
|
59
|
+
dispatchAt: Date | string
|
|
60
60
|
|
|
61
61
|
@Column({ nullable: true })
|
|
62
62
|
dispatchDate: string
|
|
@@ -4,11 +4,7 @@ import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedCol
|
|
|
4
4
|
import { Block, Ramp, PlantationInventory, DailyDispatch } from '../entities'
|
|
5
5
|
|
|
6
6
|
@Entity()
|
|
7
|
-
@Index(
|
|
8
|
-
'ix_ramp_block_history_0',
|
|
9
|
-
(rampBlockHistory: RampBlockHistory) => [rampBlockHistory.id],
|
|
10
|
-
{ unique: true }
|
|
11
|
-
)
|
|
7
|
+
@Index('ix_ramp_block_history_0', (rampBlockHistory: RampBlockHistory) => [rampBlockHistory.id], { unique: true })
|
|
12
8
|
export class RampBlockHistory {
|
|
13
9
|
@PrimaryGeneratedColumn('uuid')
|
|
14
10
|
id: string
|
|
@@ -41,6 +37,7 @@ export class RampBlockHistory {
|
|
|
41
37
|
* transactionType
|
|
42
38
|
* LOADING
|
|
43
39
|
* DISPATCH
|
|
40
|
+
* REVERSE_DISPATCH
|
|
44
41
|
*/
|
|
45
42
|
@Column()
|
|
46
43
|
transactionType: string
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { Domain } from '@things-factory/shell'
|
|
2
|
+
import { User } from '@things-factory/auth-base'
|
|
2
3
|
import { EntityManager, IsNull } from 'typeorm'
|
|
3
|
-
import { DailyDispatch, DailyDispatchDetail } from '../../../entities'
|
|
4
|
+
import { DailyDispatch, DailyDispatchDetail, RecordTransaction, RampBlockHistory } from '../../../entities'
|
|
4
5
|
|
|
5
6
|
export const deleteDailyDispatch = {
|
|
6
7
|
async deleteDailyDispatch(_: any, { name }, context: any) {
|
|
7
|
-
const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
|
|
8
|
+
const { user, domain, tx }: { user: User; domain: Domain; tx: EntityManager } = context.state
|
|
9
|
+
|
|
10
|
+
// Step 1: Fetch the daily dispatch record
|
|
8
11
|
const dailyDispatch = await tx
|
|
9
12
|
.getRepository(DailyDispatch)
|
|
10
13
|
.findOneOrFail({ where: { name, deletedAt: IsNull() }, relations: ['dailyDispatchDetails'] })
|
|
11
14
|
|
|
15
|
+
// Step 2: Soft delete the daily dispatch record
|
|
12
16
|
await tx.getRepository(DailyDispatch).update(
|
|
13
17
|
{
|
|
14
18
|
domain,
|
|
@@ -19,6 +23,7 @@ export const deleteDailyDispatch = {
|
|
|
19
23
|
}
|
|
20
24
|
)
|
|
21
25
|
|
|
26
|
+
// Step 3: Soft delete related daily dispatch details
|
|
22
27
|
await tx.getRepository(DailyDispatchDetail).update(
|
|
23
28
|
{
|
|
24
29
|
domain,
|
|
@@ -28,5 +33,67 @@ export const deleteDailyDispatch = {
|
|
|
28
33
|
deletedAt: new Date()
|
|
29
34
|
}
|
|
30
35
|
)
|
|
36
|
+
|
|
37
|
+
// Step 4: Soft delete related record transactions
|
|
38
|
+
await tx.getRepository(RecordTransaction).update(
|
|
39
|
+
{
|
|
40
|
+
domain,
|
|
41
|
+
refActionID: dailyDispatch.id
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
deletedAt: new Date()
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
// Step 5: Reverse the effects of the dispatch in ramp_block_histories
|
|
49
|
+
await reverseRampBlockHistories(domain, user, dailyDispatch, tx)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Helper function to reverse ramp block histories
|
|
54
|
+
async function reverseRampBlockHistories(
|
|
55
|
+
domain: Domain,
|
|
56
|
+
user: User,
|
|
57
|
+
dailyDispatch: DailyDispatch,
|
|
58
|
+
tx?: EntityManager
|
|
59
|
+
): Promise<void> {
|
|
60
|
+
const rampBlockHistoryRepo = tx.getRepository(RampBlockHistory)
|
|
61
|
+
|
|
62
|
+
// Fetch all ramp block histories related to this dispatch
|
|
63
|
+
const rampBlockHistories = await rampBlockHistoryRepo.find({
|
|
64
|
+
where: {
|
|
65
|
+
domain,
|
|
66
|
+
dailyDispatch: dailyDispatch.id,
|
|
67
|
+
transactionType: 'DISPATCH'
|
|
68
|
+
},
|
|
69
|
+
relations: ['ramp', 'block', 'domain']
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
// Reverse the effects of each ramp block history record
|
|
73
|
+
for (const history of rampBlockHistories) {
|
|
74
|
+
// Create a new ramp block history record to reverse the dispatch
|
|
75
|
+
await rampBlockHistoryRepo.save({
|
|
76
|
+
weight: -history.weight, // Reverse the weight (e.g., if dispatch was -100, reversal will be +100)
|
|
77
|
+
previousWeight: history.previousWeight,
|
|
78
|
+
currentWeight: parseFloat((history.previousWeight + -history.weight).toFixed(4)),
|
|
79
|
+
transactionType: 'REVERSE_DISPATCH', // Use a new transaction type for reversals
|
|
80
|
+
transactionDate: dailyDispatch.dispatchDate, // Use the current date for the reversal
|
|
81
|
+
domain: history.domain,
|
|
82
|
+
block: history.block,
|
|
83
|
+
ramp: history.ramp,
|
|
84
|
+
dailyDispatch,
|
|
85
|
+
creator: user,
|
|
86
|
+
updater: user
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Soft delete the original ramp block history record
|
|
90
|
+
await rampBlockHistoryRepo.update(
|
|
91
|
+
{
|
|
92
|
+
id: history.id
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
deletedAt: new Date()
|
|
96
|
+
}
|
|
97
|
+
)
|
|
31
98
|
}
|
|
32
99
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { EntityManager,
|
|
2
|
-
|
|
1
|
+
import { EntityManager, Repository } from 'typeorm'
|
|
3
2
|
import { User } from '@things-factory/auth-base'
|
|
4
3
|
import { Domain } from '@things-factory/shell'
|
|
5
|
-
|
|
6
4
|
import { RECORD_STATUS, TRANSACTION_TYPE } from '../../../constants'
|
|
7
5
|
import {
|
|
8
6
|
Block,
|
|
@@ -11,6 +9,7 @@ import {
|
|
|
11
9
|
Organization,
|
|
12
10
|
OrganizationStaff,
|
|
13
11
|
Ramp,
|
|
12
|
+
RampBlockHistory,
|
|
14
13
|
Truck
|
|
15
14
|
} from '../../../entities'
|
|
16
15
|
import { generateRampBlockHistories, generateTransactionHistory, NoGenerator } from '../../../utils'
|
|
@@ -19,117 +18,174 @@ export const generateDailyDispatch = {
|
|
|
19
18
|
async generateDailyDispatch(_: any, { dailyDispatch }, context: any) {
|
|
20
19
|
const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
let transport: Truck
|
|
25
|
-
let dispatchTo: Organization
|
|
21
|
+
try {
|
|
22
|
+
const { dailyDispatchDetails, driver, transport, dispatchTo, dispatchAt, chitNo, percentage } = dailyDispatch
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
}
|
|
24
|
+
// Validate input data
|
|
25
|
+
if (!dailyDispatchDetails || dailyDispatchDetails.length === 0) {
|
|
26
|
+
throw new Error('Daily dispatch details are required.')
|
|
27
|
+
}
|
|
32
28
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
29
|
+
// Fetch related entities
|
|
30
|
+
const driverEntity = driver ? await fetchEntity(tx.getRepository(OrganizationStaff), driver.id) : null
|
|
31
|
+
const transportEntity = transport ? await fetchEntity(tx.getRepository(Truck), transport.id) : null
|
|
32
|
+
const dispatchToEntity = dispatchTo ? await fetchEntity(tx.getRepository(Organization), dispatchTo.id) : null
|
|
38
33
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
// Calculate total tonnage released
|
|
35
|
+
const totalTonnageRelease = dailyDispatchDetails.reduce((sum, detail) => sum + detail.collectedRampWeight, 0)
|
|
36
|
+
|
|
37
|
+
// Create daily dispatch record
|
|
38
|
+
const newDailyDispatch = await createDailyDispatch({
|
|
39
|
+
domain,
|
|
40
|
+
transport: transportEntity,
|
|
41
|
+
driver: driverEntity,
|
|
42
|
+
dispatchTo: dispatchToEntity,
|
|
43
|
+
totalTonnageRelease,
|
|
44
|
+
chitNo,
|
|
45
|
+
percentage,
|
|
46
|
+
dispatchAt,
|
|
47
|
+
user,
|
|
48
|
+
tx
|
|
42
49
|
})
|
|
43
|
-
}
|
|
44
50
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}, 0)
|
|
48
|
-
|
|
49
|
-
// 1. Create daily dispatchment
|
|
50
|
-
let newDailyDispatch: DailyDispatch = new DailyDispatch()
|
|
51
|
-
newDailyDispatch.name = NoGenerator.dailyDispatch()
|
|
52
|
-
newDailyDispatch.domain = domain
|
|
53
|
-
newDailyDispatch.transport = transport
|
|
54
|
-
newDailyDispatch.transportNo = transport.name
|
|
55
|
-
newDailyDispatch.driver = driver
|
|
56
|
-
newDailyDispatch.driverIdentification = driver?.idNumber ? driver.idNumber : null
|
|
57
|
-
newDailyDispatch.externalDriver = driver?.name ? driver?.name : null
|
|
58
|
-
newDailyDispatch.totalTonnageRelease = totalTonnageRelease
|
|
59
|
-
newDailyDispatch.chitNo = dailyDispatch?.chitNo
|
|
60
|
-
newDailyDispatch.percentage = dailyDispatch?.percentage
|
|
61
|
-
newDailyDispatch.dispatchTo = dispatchTo
|
|
62
|
-
newDailyDispatch.dispatchDate = dailyDispatch.dispatchAt.split('T')[0]
|
|
63
|
-
newDailyDispatch.dispatchAt = dailyDispatch.dispatchAt
|
|
64
|
-
newDailyDispatch.status = RECORD_STATUS.STORED
|
|
65
|
-
newDailyDispatch.creator = user
|
|
66
|
-
newDailyDispatch = await tx.getRepository(DailyDispatch).save(newDailyDispatch)
|
|
67
|
-
|
|
68
|
-
// 2. Create daily dispatch detail
|
|
69
|
-
dailyDispatchDetails = await addDailyDispatchDetail(
|
|
70
|
-
domain,
|
|
71
|
-
newDailyDispatch,
|
|
72
|
-
dailyDispatchDetails.map((record: DailyDispatchDetail) => {
|
|
73
|
-
return { ...record }
|
|
74
|
-
}),
|
|
75
|
-
user,
|
|
76
|
-
tx
|
|
77
|
-
)
|
|
51
|
+
// Create daily dispatch details
|
|
52
|
+
const createdDetails = await addDailyDispatchDetail(domain, newDailyDispatch, dailyDispatchDetails, user, tx)
|
|
78
53
|
|
|
79
|
-
|
|
54
|
+
// Generate transaction history and ramp block histories
|
|
55
|
+
await generateDispatchTransaction(domain, newDailyDispatch, createdDetails, user, tx)
|
|
56
|
+
|
|
57
|
+
return newDailyDispatch
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error('Error generating daily dispatch:', error)
|
|
60
|
+
throw new Error('Failed to generate daily dispatch.')
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
80
64
|
|
|
81
|
-
|
|
65
|
+
// Helper function to fetch an entity by ID
|
|
66
|
+
async function fetchEntity<T>(repository: Repository<T>, id: string): Promise<T> {
|
|
67
|
+
const entity = await repository.findOne({ where: { id } })
|
|
68
|
+
if (!entity) {
|
|
69
|
+
throw new Error(`Entity with ID ${id} not found.`)
|
|
82
70
|
}
|
|
71
|
+
return entity
|
|
83
72
|
}
|
|
84
73
|
|
|
85
|
-
|
|
74
|
+
// Helper function to create a daily dispatch record
|
|
75
|
+
async function createDailyDispatch({
|
|
76
|
+
domain,
|
|
77
|
+
transport,
|
|
78
|
+
driver,
|
|
79
|
+
dispatchTo,
|
|
80
|
+
totalTonnageRelease,
|
|
81
|
+
chitNo,
|
|
82
|
+
percentage,
|
|
83
|
+
dispatchAt,
|
|
84
|
+
user,
|
|
85
|
+
tx
|
|
86
|
+
}: {
|
|
87
|
+
domain: Domain
|
|
88
|
+
transport: Truck | null
|
|
89
|
+
driver: OrganizationStaff | null
|
|
90
|
+
dispatchTo: Organization | null
|
|
91
|
+
totalTonnageRelease: number
|
|
92
|
+
chitNo?: string
|
|
93
|
+
percentage?: number
|
|
94
|
+
dispatchAt: Date | string // Allow both Date and string
|
|
95
|
+
user: User
|
|
96
|
+
tx: EntityManager
|
|
97
|
+
}): Promise<DailyDispatch> {
|
|
98
|
+
const dailyDispatchRepo = tx.getRepository(DailyDispatch)
|
|
99
|
+
|
|
100
|
+
// Convert dispatchAt to a string if it's a Date object
|
|
101
|
+
const dispatchDate =
|
|
102
|
+
typeof dispatchAt === 'string' ? dispatchAt.split('T')[0] : dispatchAt.toISOString().split('T')[0]
|
|
103
|
+
|
|
104
|
+
const newDailyDispatch = dailyDispatchRepo.create({
|
|
105
|
+
name: NoGenerator.dailyDispatch(),
|
|
106
|
+
domain,
|
|
107
|
+
transport,
|
|
108
|
+
transportNo: transport?.name || null,
|
|
109
|
+
driver,
|
|
110
|
+
driverIdentification: driver?.idNumber || null,
|
|
111
|
+
externalDriver: driver?.name || null,
|
|
112
|
+
totalTonnageRelease,
|
|
113
|
+
chitNo,
|
|
114
|
+
percentage,
|
|
115
|
+
dispatchTo,
|
|
116
|
+
dispatchDate, // Use the formatted date string
|
|
117
|
+
dispatchAt: typeof dispatchAt === 'string' ? dispatchAt : dispatchAt.toISOString(), // Ensure dispatchAt is a string
|
|
118
|
+
status: RECORD_STATUS.STORED,
|
|
119
|
+
creator: user
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
return await dailyDispatchRepo.save(newDailyDispatch)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Helper function to add daily dispatch details
|
|
126
|
+
async function addDailyDispatchDetail(
|
|
86
127
|
domain: Domain,
|
|
87
|
-
|
|
88
|
-
|
|
128
|
+
dailyDispatch: DailyDispatch,
|
|
129
|
+
details: DailyDispatchDetail[],
|
|
89
130
|
user: User,
|
|
90
|
-
tx
|
|
131
|
+
tx: EntityManager
|
|
91
132
|
): Promise<DailyDispatchDetail[]> {
|
|
92
|
-
const rampRepo
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
133
|
+
const rampRepo = tx.getRepository(Ramp)
|
|
134
|
+
const detailRepo = tx.getRepository(DailyDispatchDetail)
|
|
135
|
+
|
|
136
|
+
// Extract unique ramp IDs from details
|
|
137
|
+
// const uniqueRampIds = new Set(details.map(detail => detail.ramp.id))
|
|
138
|
+
|
|
139
|
+
// Validate opening quantities for all unique ramps
|
|
140
|
+
// for (const rampId of uniqueRampIds) {
|
|
141
|
+
// const ramp = await fetchEntity(rampRepo, rampId)
|
|
142
|
+
// await validateOpeningQuantities(domain, ramp, tx)
|
|
143
|
+
// }
|
|
144
|
+
|
|
145
|
+
// Create and save daily dispatch details
|
|
146
|
+
const createdDetails = await Promise.all(
|
|
147
|
+
details.map(async detail => {
|
|
148
|
+
const ramp = await fetchEntity(rampRepo, detail.ramp.id)
|
|
149
|
+
|
|
150
|
+
return detailRepo.create({
|
|
151
|
+
...detail,
|
|
100
152
|
domain,
|
|
101
153
|
name: NoGenerator.dailyDispatchDetail(),
|
|
102
|
-
ramp
|
|
103
|
-
dailyDispatch
|
|
154
|
+
ramp,
|
|
155
|
+
dailyDispatch,
|
|
104
156
|
creator: user,
|
|
105
157
|
updater: user
|
|
106
|
-
}
|
|
158
|
+
})
|
|
107
159
|
})
|
|
108
160
|
)
|
|
109
161
|
|
|
110
|
-
return await
|
|
162
|
+
return await detailRepo.save(createdDetails)
|
|
111
163
|
}
|
|
112
164
|
|
|
113
|
-
|
|
165
|
+
async function generateDispatchTransaction(
|
|
114
166
|
domain: Domain,
|
|
115
|
-
|
|
116
|
-
|
|
167
|
+
dailyDispatch: DailyDispatch, // Ensure this is passed correctly
|
|
168
|
+
details: DailyDispatchDetail[],
|
|
117
169
|
user: User,
|
|
118
|
-
tx
|
|
170
|
+
tx: EntityManager
|
|
119
171
|
): Promise<void> {
|
|
120
|
-
const blockRepo
|
|
172
|
+
const blockRepo = tx.getRepository(Block)
|
|
121
173
|
|
|
122
|
-
for (
|
|
123
|
-
const dispatchedTonnage
|
|
124
|
-
const dispatchDate
|
|
125
|
-
|
|
174
|
+
for (const detail of details) {
|
|
175
|
+
const dispatchedTonnage = detail.collectedRampWeight
|
|
176
|
+
const dispatchDate =
|
|
177
|
+
typeof dailyDispatch.dispatchAt === 'string'
|
|
178
|
+
? dailyDispatch.dispatchAt.split('T')[0]
|
|
179
|
+
: dailyDispatch.dispatchAt.toISOString().split('T')[0]
|
|
180
|
+
const ramp = detail.ramp
|
|
126
181
|
|
|
182
|
+
// Generate transaction history
|
|
127
183
|
await generateTransactionHistory(
|
|
128
184
|
null,
|
|
129
185
|
domain,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
186
|
+
ramp,
|
|
187
|
+
dailyDispatch.id,
|
|
188
|
+
dailyDispatch.name,
|
|
133
189
|
TRANSACTION_TYPE.DISPATCHMENT,
|
|
134
190
|
dispatchDate,
|
|
135
191
|
0,
|
|
@@ -138,56 +194,30 @@ export async function generateDispatchTransaction(
|
|
|
138
194
|
tx
|
|
139
195
|
)
|
|
140
196
|
|
|
141
|
-
|
|
197
|
+
// Fetch the latest ramp block histories
|
|
198
|
+
const rampBlockHistories = await tx.query(
|
|
142
199
|
`
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
200
|
+
SELECT * FROM (
|
|
201
|
+
SELECT *, ROW_NUMBER () OVER (PARTITION BY ramp_id, block_id ORDER BY transaction_date DESC, transaction_type) AS rn
|
|
202
|
+
FROM ramp_block_histories
|
|
203
|
+
WHERE ramp_id = $1 AND transaction_date <= $2
|
|
204
|
+
) foo WHERE rn = 1
|
|
147
205
|
`,
|
|
148
206
|
[ramp.id, dispatchDate]
|
|
149
207
|
)
|
|
150
208
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
// // insert into ramp_block_histories (id,transaction_type, creator_id, updater_id, transaction_date, created_at, updated_at, weight, domain_id, block_id, ramp_id)
|
|
165
|
-
// let processedData = await tx.query(
|
|
166
|
-
// `
|
|
167
|
-
// insert into ramp_block_histories (id, seq, transaction_type, creator_id, updater_id, transaction_date, created_at, updated_at, domain_id, ramp_id, weight, previous_weight, current_weight, block_id, daily_dispatch_id)
|
|
168
|
-
// SELECT uuid_generate_v4() AS id, (select seq from ramp_block_histories where ramp_id = '${ramp.id}' and domain_id = '${domain.id}' order by seq desc limit 1) + 1,'DISPATCH' AS transaction_type,
|
|
169
|
-
// '0933baea-e099-494b-9791-3dfe805731f0' AS creator_id, '0933baea-e099-494b-9791-3dfe805731f0' AS updater_id,
|
|
170
|
-
// $1 AS transaction_date, $2 AS created_at, $3 AS updated_at,
|
|
171
|
-
// $4 AS domain_id, $5 AS ramp_id,
|
|
172
|
-
// $6 AS weight,
|
|
173
|
-
// $7 AS previous_weight,
|
|
174
|
-
// $8 AS current_weight,
|
|
175
|
-
// $9 AS block_id,
|
|
176
|
-
// $10 AS daily_dispatch_id
|
|
177
|
-
// `,
|
|
178
|
-
// [
|
|
179
|
-
// dispatchDate,
|
|
180
|
-
// dt2.created_at,
|
|
181
|
-
// dt2.updated_at,
|
|
182
|
-
// domain.id,
|
|
183
|
-
// ramp.id,
|
|
184
|
-
// parseFloat(weight),
|
|
185
|
-
// parseFloat(currentRampBlockWeight),
|
|
186
|
-
// parseFloat(currentRampBlockWeight) + parseFloat(weight),
|
|
187
|
-
// dt2.block_id,
|
|
188
|
-
// newDailyDispatch.id
|
|
189
|
-
// ]
|
|
190
|
-
// )
|
|
209
|
+
// Calculate total ramp weight
|
|
210
|
+
const totalRampWeight = rampBlockHistories.reduce(
|
|
211
|
+
(total, history) => total + history.previous_weight + history.weight,
|
|
212
|
+
0
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
// Distribute dispatched tonnage across blocks
|
|
216
|
+
for (const history of rampBlockHistories) {
|
|
217
|
+
const block = await fetchEntity(blockRepo, history.block_id)
|
|
218
|
+
const currentRampBlockWeight = history.previous_weight + history.weight
|
|
219
|
+
const percentage = parseFloat((currentRampBlockWeight / totalRampWeight).toFixed(4))
|
|
220
|
+
const weight = parseFloat((-dispatchedTonnage * percentage).toFixed(4))
|
|
191
221
|
|
|
192
222
|
await generateRampBlockHistories(
|
|
193
223
|
block,
|
|
@@ -195,22 +225,30 @@ export async function generateDispatchTransaction(
|
|
|
195
225
|
ramp,
|
|
196
226
|
'DISPATCH',
|
|
197
227
|
dispatchDate,
|
|
198
|
-
|
|
228
|
+
weight,
|
|
199
229
|
user,
|
|
200
230
|
null,
|
|
201
|
-
|
|
231
|
+
dailyDispatch, // Pass dailyDispatch object
|
|
202
232
|
tx
|
|
203
233
|
)
|
|
204
|
-
|
|
205
|
-
// await txMgr.query(`
|
|
206
|
-
// SELECT * FROM (
|
|
207
|
-
// SELECT *, ROW_NUMBER () OVER (PARTITION BY ramp_id, block_id ORDER BY transaction_date desc) AS rn FROM ramp_block_histories
|
|
208
|
-
// WHERE ramp_id =$1 AND transaction_date <= $2
|
|
209
|
-
// ) foo WHERE rn = 1
|
|
210
|
-
// `, [dt.ramp_id, dt.transaction_date]
|
|
211
|
-
// )
|
|
212
|
-
let x = dt2
|
|
213
234
|
}
|
|
214
|
-
let x = rampBlockHistory
|
|
215
235
|
}
|
|
216
236
|
}
|
|
237
|
+
|
|
238
|
+
// async function validateOpeningQuantities(domain: Domain, ramp: Ramp, tx: EntityManager): Promise<void> {
|
|
239
|
+
// const rampBlockHistoryRepo = tx.getRepository(RampBlockHistory)
|
|
240
|
+
|
|
241
|
+
// const blocks = await tx.getRepository(Block).find({ where: { ramp } })
|
|
242
|
+
|
|
243
|
+
// for (const block of blocks) {
|
|
244
|
+
// const history = await rampBlockHistoryRepo.findOne({
|
|
245
|
+
// where: { domain, ramp, block, transactionType: 'OPENING_QUANTITY' }
|
|
246
|
+
// })
|
|
247
|
+
|
|
248
|
+
// if (!history) {
|
|
249
|
+
// throw new Error(
|
|
250
|
+
// `No opening quantity defined for block ${block.id} in ramp ${ramp.id}. Please set an opening quantity before creating dispatch records.`
|
|
251
|
+
// )
|
|
252
|
+
// }
|
|
253
|
+
// }
|
|
254
|
+
// }
|