@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.
Files changed (68) hide show
  1. package/client/pages/harvesting/harvesting-create-record.js +5 -2
  2. package/client/pages/loading/edit-loading-record.js +2 -0
  3. package/client/pages/report/report-daily-ffb-dispatch-and-production.js +19 -23
  4. package/dist-server/entities/daily-dispatch.js +2 -2
  5. package/dist-server/entities/daily-dispatch.js.map +1 -1
  6. package/dist-server/entities/ramp-block-history.js.map +1 -1
  7. package/dist-server/graphql/resolvers/daily-dispatch/delete-daily-dispatch.js +49 -1
  8. package/dist-server/graphql/resolvers/daily-dispatch/delete-daily-dispatch.js.map +1 -1
  9. package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js +124 -112
  10. package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js.map +1 -1
  11. package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js +51 -2
  12. package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js.map +1 -1
  13. package/dist-server/graphql/resolvers/daily-harvest/delete-daily-harvest.js +5 -7
  14. package/dist-server/graphql/resolvers/daily-harvest/delete-daily-harvest.js.map +1 -1
  15. package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js +3 -3
  16. package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js.map +1 -1
  17. package/dist-server/graphql/resolvers/daily-loading/delete-daily-loading.js +6 -0
  18. package/dist-server/graphql/resolvers/daily-loading/delete-daily-loading.js.map +1 -1
  19. package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js +68 -52
  20. package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js.map +1 -1
  21. package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js +16 -22
  22. package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js.map +1 -1
  23. package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js +50 -19
  24. package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js.map +1 -1
  25. package/dist-server/graphql/resolvers/report/daily-production-reports.js +96 -67
  26. package/dist-server/graphql/resolvers/report/daily-production-reports.js.map +1 -1
  27. package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js +1 -0
  28. package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js.map +1 -1
  29. package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js +7 -2
  30. package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js.map +1 -1
  31. package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js +11 -5
  32. package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js.map +1 -1
  33. package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js +21 -9
  34. package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js.map +1 -1
  35. package/dist-server/graphql/resolvers/report/monthly-production-reports.js +5 -2
  36. package/dist-server/graphql/resolvers/report/monthly-production-reports.js.map +1 -1
  37. package/dist-server/graphql/resolvers/report/yearly-production-reports.js +5 -2
  38. package/dist-server/graphql/resolvers/report/yearly-production-reports.js.map +1 -1
  39. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js +2 -0
  40. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js.map +1 -1
  41. package/dist-server/utils/transaction-util.js +32 -53
  42. package/dist-server/utils/transaction-util.js.map +1 -1
  43. package/package.json +2 -2
  44. package/server/entities/daily-dispatch.ts +2 -2
  45. package/server/entities/ramp-block-history.ts +2 -5
  46. package/server/graphql/resolvers/daily-dispatch/delete-daily-dispatch.ts +69 -2
  47. package/server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.ts +179 -141
  48. package/server/graphql/resolvers/daily-dispatch/update-daily-dispatch.ts +68 -5
  49. package/server/graphql/resolvers/daily-harvest/delete-daily-harvest.ts +9 -26
  50. package/server/graphql/resolvers/daily-harvest/generate-daily-harvest.ts +3 -3
  51. package/server/graphql/resolvers/daily-loading/delete-daily-loading.ts +11 -1
  52. package/server/graphql/resolvers/daily-loading/generate-daily-loading.ts +95 -98
  53. package/server/graphql/resolvers/daily-loading/update-daily-loading.ts +44 -47
  54. package/server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.ts +61 -26
  55. package/server/graphql/resolvers/report/daily-production-reports.ts +103 -72
  56. package/server/graphql/resolvers/report/daily-staff-harvest-reports.ts +5 -2
  57. package/server/graphql/resolvers/report/monthly-block-dispatch-reports.ts +20 -9
  58. package/server/graphql/resolvers/report/monthly-dispatch-summary-reports.ts +16 -12
  59. package/server/graphql/resolvers/report/monthly-ffb-sale-reports.ts +26 -12
  60. package/server/graphql/resolvers/report/monthly-production-reports.ts +5 -3
  61. package/server/graphql/resolvers/report/yearly-production-reports.ts +5 -2
  62. package/server/graphql/types/daily-loading-detail/daily-loading-detail-patch.ts +2 -0
  63. package/server/utils/transaction-util.ts +36 -56
  64. package/translations/en.json +1 -1
  65. package/translations/ja.json +1 -1
  66. package/translations/ko.json +1 -1
  67. package/translations/ms.json +1 -1
  68. 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: { seq: 'DESC' }
57
+ order: { createdAt: 'DESC' }
58
58
  });
59
- let res;
60
- if (!lastRampBlockHistory) {
61
- res = await rampBlockHistoryRepo
62
- .createQueryBuilder()
63
- .insert()
64
- .into(entities_1.RampBlockHistory)
65
- .values([
66
- {
67
- transactionDate,
68
- transactionType,
69
- seq: 0,
70
- domain,
71
- block,
72
- ramp,
73
- weight: rampWeight,
74
- previousWeight: 0,
75
- currentWeight: rampWeight,
76
- dailyDispatch,
77
- deletedAt: deletedAt ? deletedAt : null,
78
- creator: user,
79
- updater: user
80
- }
81
- ])
82
- .returning('*')
83
- .execute();
84
- }
85
- else {
86
- const previousWeight = lastRampBlockHistory.currentWeight;
87
- res = await rampBlockHistoryRepo
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":"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"}
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.595",
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": "5f3c80271b0e59c82c416f6444a90f57dc8edd6f"
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, getRepository, Repository } from 'typeorm'
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
- let dailyDispatchDetails: DailyDispatchDetail[] = dailyDispatch.dailyDispatchDetails
23
- let driver: OrganizationStaff
24
- let transport: Truck
25
- let dispatchTo: Organization
21
+ try {
22
+ const { dailyDispatchDetails, driver, transport, dispatchTo, dispatchAt, chitNo, percentage } = dailyDispatch
26
23
 
27
- if (dailyDispatch?.driver) {
28
- driver = await tx.getRepository(OrganizationStaff).findOne({
29
- where: { id: dailyDispatch.driver.id }
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
- if (dailyDispatch?.transport) {
34
- transport = await tx.getRepository(Truck).findOne({
35
- where: { id: dailyDispatch.transport.id }
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
- if (dailyDispatch?.dispatchTo) {
40
- dispatchTo = await tx.getRepository(Organization).findOne({
41
- where: { id: dailyDispatch.dispatchTo.id }
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
- const totalTonnageRelease: number = dailyDispatchDetails.reduce(function (prev, cur) {
46
- return prev + cur.collectedRampWeight
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
- await generateDispatchTransaction(domain, newDailyDispatch, dailyDispatchDetails, user, tx)
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
- return newDailyDispatch
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
- export async function addDailyDispatchDetail(
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
- newDailyDispatch: DailyDispatch,
88
- dailyDispatchDetails: DailyDispatchDetail[],
128
+ dailyDispatch: DailyDispatch,
129
+ details: DailyDispatchDetail[],
89
130
  user: User,
90
- tx?: EntityManager
131
+ tx: EntityManager
91
132
  ): Promise<DailyDispatchDetail[]> {
92
- const rampRepo: Repository<Ramp> = tx?.getRepository(Ramp) || getRepository(Ramp)
93
- const dailyDispatchDetailRepo: Repository<DailyDispatchDetail> =
94
- tx?.getRepository(DailyDispatchDetail) || getRepository(DailyDispatchDetail)
95
-
96
- dailyDispatchDetails = await Promise.all(
97
- dailyDispatchDetails.map(async (dailyDispatchDetail: DailyDispatchDetail) => {
98
- return {
99
- ...dailyDispatchDetail,
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: await rampRepo.findOne({ id: dailyDispatchDetail.ramp.id }),
103
- dailyDispatch: newDailyDispatch,
154
+ ramp,
155
+ dailyDispatch,
104
156
  creator: user,
105
157
  updater: user
106
- }
158
+ })
107
159
  })
108
160
  )
109
161
 
110
- return await dailyDispatchDetailRepo.save(dailyDispatchDetails)
162
+ return await detailRepo.save(createdDetails)
111
163
  }
112
164
 
113
- export async function generateDispatchTransaction(
165
+ async function generateDispatchTransaction(
114
166
  domain: Domain,
115
- newDailyDispatch: DailyDispatch,
116
- dailyDispatchDetails: DailyDispatchDetail[],
167
+ dailyDispatch: DailyDispatch, // Ensure this is passed correctly
168
+ details: DailyDispatchDetail[],
117
169
  user: User,
118
- tx?: EntityManager
170
+ tx: EntityManager
119
171
  ): Promise<void> {
120
- const blockRepo: Repository<Block> = tx?.getRepository(Block) || getRepository(Block)
172
+ const blockRepo = tx.getRepository(Block)
121
173
 
122
- for (let dailyDispatch of dailyDispatchDetails) {
123
- const dispatchedTonnage: number = dailyDispatch.collectedRampWeight
124
- const dispatchDate: string = newDailyDispatch.dispatchAt.toString().split('T')[0]
125
- const ramp: Ramp = dailyDispatch.ramp
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
- dailyDispatch.ramp,
131
- newDailyDispatch.id,
132
- newDailyDispatch.name,
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
- let rampBlockHistory = await tx.query(
197
+ // Fetch the latest ramp block histories
198
+ const rampBlockHistories = await tx.query(
142
199
  `
143
- SELECT * FROM (
144
- SELECT *, ROW_NUMBER () OVER (PARTITION BY ramp_id, block_id ORDER BY transaction_date desc, transaction_type) AS rn FROM ramp_block_histories
145
- WHERE ramp_id =$1 AND transaction_date <= $2
146
- ) foo WHERE rn = 1
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
- let totalRampWeight: number = rampBlockHistory.reduce((total, currentValue) => {
152
- total += currentValue.previous_weight + currentValue.weight
153
- return total
154
- }, 0)
155
-
156
- for (let index = 0; index < rampBlockHistory.length; index++) {
157
- const dt2 = rampBlockHistory[index]
158
- const block: Block = await blockRepo.findOne({ id: dt2.block_id })
159
-
160
- let currentRampBlockWeight = dt2.previous_weight + dt2.weight
161
- let percentage = parseFloat((currentRampBlockWeight / totalRampWeight).toFixed(4))
162
- let weight = (-dispatchedTonnage * percentage).toFixed(4)
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
- parseFloat(weight),
228
+ weight,
199
229
  user,
200
230
  null,
201
- newDailyDispatch,
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
+ // }