law-common 13.0.1-beta.2 → 13.0.1-beta.21

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 (76) hide show
  1. package/dist/src/api/interface/client_affiliate.create.dto.interface.d.ts +1 -1
  2. package/dist/src/api/interface/client_quote_rate.create.dto.interface.d.ts +2 -1
  3. package/dist/src/api/interface/document_upload.create.dto.interface.d.ts +2 -1
  4. package/dist/src/api/interface/intermediary_bank.create.dto.interface.d.ts +2 -1
  5. package/dist/src/api/interface/intermediary_bank.update.dto.interface.d.ts +1 -1
  6. package/dist/src/api/interface/office_location.create.dto.interface.d.ts +3 -1
  7. package/dist/src/api/interface/office_location.update.dto.interface.d.ts +2 -1
  8. package/dist/src/api/interface/timesheet.entity.response.interface.d.ts +7 -13
  9. package/dist/src/api/interface/to_do_list.create.dto.interface.d.ts +3 -1
  10. package/dist/src/api/interface/to_do_list.update.dto.interface.d.ts +2 -1
  11. package/dist/src/entities/enums/billing_profile_status_enum.d.ts +5 -0
  12. package/dist/src/entities/enums/billing_profile_status_enum.js +9 -0
  13. package/dist/src/entities/enums/client_affiliate_status_enum.d.ts +5 -0
  14. package/dist/src/entities/enums/client_affiliate_status_enum.js +9 -0
  15. package/dist/src/entities/enums/client_quote_rate_status_enum.d.ts +5 -0
  16. package/dist/src/entities/enums/client_quote_rate_status_enum.js +9 -0
  17. package/dist/src/entities/enums/document_upload_status_enum.d.ts +5 -0
  18. package/dist/src/entities/enums/document_upload_status_enum.js +9 -0
  19. package/dist/src/entities/enums/expense_type_status_enum.d.ts +5 -0
  20. package/dist/src/entities/enums/expense_type_status_enum.js +9 -0
  21. package/dist/src/entities/enums/intermediary_bank_status_enum.d.ts +5 -0
  22. package/dist/src/entities/enums/intermediary_bank_status_enum.js +9 -0
  23. package/dist/src/entities/enums/office_location_status_enum.d.ts +5 -0
  24. package/dist/src/entities/enums/office_location_status_enum.js +9 -0
  25. package/dist/src/entities/enums/to_do_list_status_enum.d.ts +5 -0
  26. package/dist/src/entities/enums/to_do_list_status_enum.js +9 -0
  27. package/dist/src/entities/flow-configs/base-flow-config.factory.d.ts +20 -1
  28. package/dist/src/entities/flow-configs/base-flow-config.factory.js +1 -16
  29. package/dist/src/entities/flow-configs/{billing.flow.config.d.ts → billing_flow.config.d.ts} +1 -1
  30. package/dist/src/entities/flow-configs/billing_flow.config.js +305 -0
  31. package/dist/src/entities/flow-configs/billing_transaction_flow.config.d.ts +24 -0
  32. package/dist/src/entities/flow-configs/billing_transaction_flow.config.js +111 -0
  33. package/dist/src/entities/flow-configs/flow-config.type.d.ts +14 -0
  34. package/dist/src/entities/flow-configs/leave_flow.config.d.ts +7 -0
  35. package/dist/src/entities/flow-configs/leave_flow.config.js +117 -65
  36. package/dist/src/entities/flow-configs/moving_timesheet_flow.config.js +21 -8
  37. package/dist/src/entities/flow-configs/timesheet_flow.config.d.ts +5 -0
  38. package/dist/src/entities/flow-configs/timesheet_flow.config.js +420 -0
  39. package/dist/src/entities/flow-configs/vendor_flow.config.js +74 -60
  40. package/dist/src/entities/index.d.ts +11 -2
  41. package/dist/src/entities/index.js +11 -2
  42. package/dist/src/entities/interface/billing_profile.entity.interface.d.ts +2 -0
  43. package/dist/src/entities/interface/client_affiliate.entity.interface.d.ts +2 -0
  44. package/dist/src/entities/interface/client_quote_rate.entity.interface.d.ts +2 -0
  45. package/dist/src/entities/interface/document_upload.entity.interface.d.ts +2 -0
  46. package/dist/src/entities/interface/expense_type.entity.interface.d.ts +2 -0
  47. package/dist/src/entities/interface/field-constraint/billing_profile_field_constraints.interface.d.ts +2 -2
  48. package/dist/src/entities/interface/field-constraint/client_affiliate_field_constraints.interface.d.ts +1 -1
  49. package/dist/src/entities/interface/field-constraint/client_quote_rate_field_constraints.interface.d.ts +1 -1
  50. package/dist/src/entities/interface/field-constraint/document_upload_field_constraints.interface.d.ts +1 -1
  51. package/dist/src/entities/interface/field-constraint/expense_type_field_constraints.interface.d.ts +2 -2
  52. package/dist/src/entities/interface/field-constraint/office_location_field_constraints.interface.d.ts +3 -1
  53. package/dist/src/entities/interface/field-constraint/to_do_list_field_constraints.interface.d.ts +1 -1
  54. package/dist/src/entities/interface/intermediary_bank.entity.interface.d.ts +2 -0
  55. package/dist/src/entities/interface/office_location.entity.interface.d.ts +2 -0
  56. package/dist/src/entities/interface/to_do_list.entity.interface.d.ts +2 -0
  57. package/dist/src/entities/model/billing_profile.entity.model.d.ts +2 -0
  58. package/dist/src/entities/model/billing_profile.entity.model.js +2 -0
  59. package/dist/src/entities/model/client_affiliate.entity.model.d.ts +2 -1
  60. package/dist/src/entities/model/client_affiliate.entity.model.js +1 -0
  61. package/dist/src/entities/model/client_quote_rate.entity.model.d.ts +2 -0
  62. package/dist/src/entities/model/client_quote_rate.entity.model.js +2 -0
  63. package/dist/src/entities/model/document_upload.entity.model.d.ts +2 -0
  64. package/dist/src/entities/model/document_upload.entity.model.js +2 -0
  65. package/dist/src/entities/model/expense_type.entity.model.d.ts +2 -0
  66. package/dist/src/entities/model/expense_type.entity.model.js +2 -0
  67. package/dist/src/entities/model/intermediary_bank.entity.model.d.ts +2 -0
  68. package/dist/src/entities/model/intermediary_bank.entity.model.js +2 -0
  69. package/dist/src/entities/model/office_location.entity.model.d.ts +2 -0
  70. package/dist/src/entities/model/office_location.entity.model.js +2 -0
  71. package/dist/src/entities/model/to_do_list.entity.model.d.ts +2 -0
  72. package/dist/src/entities/model/to_do_list.entity.model.js +2 -0
  73. package/package.json +1 -1
  74. package/dist/src/entities/flow-configs/billing.flow.config.js +0 -209
  75. package/dist/src/entities/flow-configs/billing_transaction.flow.config.d.ts +0 -19
  76. package/dist/src/entities/flow-configs/billing_transaction.flow.config.js +0 -83
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timesheetFlowConfig = void 0;
4
+ const error_key_enum_1 = require("../../enums/error.key.enum");
5
+ const exceptions_1 = require("../../exceptions");
6
+ const utils_1 = require("../../utils");
7
+ const project_user_status_enum_1 = require("../enums/project_user_status.enum");
8
+ const timesheet_action_enum_1 = require("../enums/timesheet_action_enum");
9
+ const timesheet_status_enum_1 = require("../enums/timesheet_status_enum");
10
+ const base_flow_config_factory_1 = require("./base-flow-config.factory");
11
+ const TIMESHEET_UPDATE_PERMISSION = ["TIMESHEETS_UPDATE_ORG", "TIMESHEETS_UPDATE_PROJECT", "TIMESHEETS_UPDATE_SELF"];
12
+ const TIMESHEET_DELETE_PERMISSION = ["TIMESHEETS_DELETE_ORG", "TIMESHEETS_DELETE_PROJECT"];
13
+ const TIMESHEET_APPROVER_PERMISSION = ["TIMESHEETS_APPROVER_ORG", "TIMESHEETS_APPROVER_PROJECT"];
14
+ const TIMESHEET_MOVE_TIMESHEET_PERMISSION = ["TIMESHEETS_UPDATE_ORG", "TIMESHEETS_UPDATE_PROJECT", "TIMESHEET_MOVE_PROJECT"];
15
+ const TIMESHEET_BILLING_UPDATE_PERMISSION = ["TIMESHEETS_UPDATE_ORG"];
16
+ const TIMESHEET_CLASSIFY_PERMISSION = ["TIMESHEETS_UPDATE_ORG", "TIMESHEETS_UPDATE_PROJECT"];
17
+ const TIMESHEET_AUTO_CLASSIFY_PERMISSION = ["TIMESHEETS_UPDATE_ORG"];
18
+ /**
19
+ * Every status this flow declares a block for. BILLING_UPDATE, CLASSIFY and AUTO_CLASSIFY are identity
20
+ * transitions available from each of them, so this is exactly their reachable set.
21
+ *
22
+ * REJECTED and DELETED are terminal and have no block. The legacy `addActionToAllStatuses` helper listed
23
+ * them in an `excludeStatuses` guard, but since neither was ever a key that guard never excluded anything.
24
+ */
25
+ const TIMESHEET_FLOW_STATUSES = [
26
+ timesheet_status_enum_1.TimesheetStatusEnum.ONTIME,
27
+ timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING,
28
+ timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING,
29
+ timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING,
30
+ timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED,
31
+ timesheet_status_enum_1.TimesheetStatusEnum.APPROVED,
32
+ timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL,
33
+ ];
34
+ /**
35
+ * UPDATE, DELETE, APPROVE and REJECT are context-driven and can land on any status, because both
36
+ * resolvers used below have an identity branch:
37
+ *
38
+ * - `resolveStatusForNonBillableTimesheet` returns `currentTimesheet.status` for a backdated
39
+ * non-billable edit;
40
+ * - `getNextStatusForMovingTimesheetActions` returns `latestStatusFromHistory ?? status`.
41
+ *
42
+ * So the honest reachable set for those four actions is the full enum. Narrowing it would be a claim the
43
+ * compiler cannot check, since neither branch is statically analysable.
44
+ */
45
+ const ALL_TIMESHEET_STATUSES = [
46
+ timesheet_status_enum_1.TimesheetStatusEnum.ONTIME,
47
+ timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING,
48
+ timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING,
49
+ timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING,
50
+ timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED,
51
+ timesheet_status_enum_1.TimesheetStatusEnum.REJECTED,
52
+ timesheet_status_enum_1.TimesheetStatusEnum.APPROVED,
53
+ timesheet_status_enum_1.TimesheetStatusEnum.DELETED,
54
+ timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL,
55
+ ];
56
+ const ACTION_MAP = {
57
+ // VIEW and CREATE carry no transition in this flow. They are declared so the map covers every
58
+ // TimesheetActionEnum member, with an empty reachable set so createActionConfig cannot be called for them.
59
+ [timesheet_action_enum_1.TimesheetActionEnum.VIEW]: {
60
+ reachableStatues: [],
61
+ permissions: [],
62
+ },
63
+ [timesheet_action_enum_1.TimesheetActionEnum.CREATE]: {
64
+ reachableStatues: [],
65
+ permissions: [],
66
+ },
67
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: {
68
+ reachableStatues: ALL_TIMESHEET_STATUSES,
69
+ permissions: TIMESHEET_UPDATE_PERMISSION,
70
+ },
71
+ [timesheet_action_enum_1.TimesheetActionEnum.DELETE]: {
72
+ reachableStatues: ALL_TIMESHEET_STATUSES,
73
+ permissions: TIMESHEET_DELETE_PERMISSION,
74
+ },
75
+ [timesheet_action_enum_1.TimesheetActionEnum.APPROVE]: {
76
+ reachableStatues: ALL_TIMESHEET_STATUSES,
77
+ permissions: TIMESHEET_APPROVER_PERMISSION,
78
+ },
79
+ [timesheet_action_enum_1.TimesheetActionEnum.REJECT]: {
80
+ reachableStatues: ALL_TIMESHEET_STATUSES,
81
+ permissions: TIMESHEET_APPROVER_PERMISSION,
82
+ },
83
+ [timesheet_action_enum_1.TimesheetActionEnum.RECALL]: {
84
+ reachableStatues: [timesheet_status_enum_1.TimesheetStatusEnum.DELETED],
85
+ permissions: TIMESHEET_UPDATE_PERMISSION,
86
+ },
87
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: {
88
+ reachableStatues: [timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL],
89
+ permissions: TIMESHEET_MOVE_TIMESHEET_PERMISSION,
90
+ },
91
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: {
92
+ reachableStatues: TIMESHEET_FLOW_STATUSES,
93
+ permissions: TIMESHEET_BILLING_UPDATE_PERMISSION,
94
+ },
95
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: {
96
+ reachableStatues: TIMESHEET_FLOW_STATUSES,
97
+ permissions: TIMESHEET_CLASSIFY_PERMISSION,
98
+ },
99
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: {
100
+ reachableStatues: TIMESHEET_FLOW_STATUSES,
101
+ permissions: TIMESHEET_AUTO_CLASSIFY_PERMISSION,
102
+ },
103
+ };
104
+ const { createActionConfig } = (0, base_flow_config_factory_1.createFlowConfigFactory)()(ACTION_MAP);
105
+ // ONTIME status transitions
106
+ const transitionOntimeStatusUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.UPDATE, (data) => {
107
+ // non-billable timesheets: keep ontime/approved on edit
108
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
109
+ if (nonBillableStatus)
110
+ return nonBillableStatus;
111
+ if (data.projectUserMapping && isInactive(data)) {
112
+ return timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING;
113
+ }
114
+ return isBackdated(data) ? timesheet_status_enum_1.TimesheetStatusEnum.ONTIME : timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING;
115
+ }, undefined, { validActionPastThreshold: false });
116
+ const transitionOntimeStatusMoveTimesheetAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
117
+ const transitionOntimeStatusDeleteAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.DELETE, (data) => {
118
+ // non-billable timesheets: auto-delete
119
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
120
+ if (nonBillableStatus)
121
+ return nonBillableStatus;
122
+ if (data.projectUserMapping && isInactive(data)) {
123
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING;
124
+ }
125
+ return isBackdated(data) ? timesheet_status_enum_1.TimesheetStatusEnum.DELETED : timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING;
126
+ }, undefined, { validActionPastThreshold: false });
127
+ const transitionOntimeStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.ONTIME);
128
+ const transitionOntimeStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.ONTIME, undefined, {
129
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
130
+ validActionPastThreshold: true,
131
+ });
132
+ const transitionOntimeStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.ONTIME, undefined, {
133
+ isApplicable: () => true,
134
+ validActionPastThreshold: true,
135
+ });
136
+ // CREATE_APPROVAL_PENDING status transitions
137
+ const transitionCreateApprovalPendingStatusUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: false });
138
+ const transitionCreateApprovalPendingStatusDeleteAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.DELETE, (data) => {
139
+ // non-billable timesheets: auto-delete
140
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
141
+ if (nonBillableStatus)
142
+ return nonBillableStatus;
143
+ // if (data.projectUserMapping && isInactive(data)) {
144
+ // return TimesheetStatusEnum.DELETE_APPROVAL_PENDING;
145
+ // }
146
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETED;
147
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: false });
148
+ const transitionCreateApprovalPendingStatusApproveAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.APPROVE, (data) => {
149
+ // non-billable timesheets: auto-approve pending or delete
150
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
151
+ if (nonBillableStatus)
152
+ return nonBillableStatus;
153
+ return timesheet_status_enum_1.TimesheetStatusEnum.APPROVED;
154
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold });
155
+ const transitionCreateApprovalPendingStatusRejectAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.REJECT, timesheet_status_enum_1.TimesheetStatusEnum.REJECTED, undefined, {
156
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
157
+ });
158
+ const transitionCreateApprovalPendingStatusMoveTimesheetAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
159
+ const transitionCreateApprovalPendingStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING);
160
+ const transitionCreateApprovalPendingStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
161
+ const transitionCreateApprovalPendingStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING, undefined, { isApplicable: () => true, validActionPastThreshold: true });
162
+ // UPDATE_APPROVAL_PENDING status transitions
163
+ const transitionUpdateApprovalPendingStatusUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: false });
164
+ const transitionUpdateApprovalPendingStatusRecallAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.RECALL, timesheet_status_enum_1.TimesheetStatusEnum.DELETED, undefined, {
165
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
166
+ validActionPastThreshold: false,
167
+ });
168
+ const transitionUpdateApprovalPendingStatusApproveAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.APPROVE, (data) => {
169
+ // non-billable timesheets: auto-approve pending or delete
170
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
171
+ if (nonBillableStatus)
172
+ return nonBillableStatus;
173
+ return timesheet_status_enum_1.TimesheetStatusEnum.APPROVED;
174
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold });
175
+ const transitionUpdateApprovalPendingStatusRejectAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.REJECT, timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED, undefined, {
176
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
177
+ });
178
+ const transitionUpdateApprovalPendingStatusMoveTimesheetAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
179
+ const transitionUpdateApprovalPendingStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING);
180
+ const transitionUpdateApprovalPendingStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
181
+ const transitionUpdateApprovalPendingStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING, undefined, { isApplicable: () => true, validActionPastThreshold: true });
182
+ // DELETE_APPROVAL_PENDING status transitions
183
+ const transitionDeleteApprovalPendingStatusUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: false });
184
+ const transitionDeleteApprovalPendingStatusRecallAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.RECALL, timesheet_status_enum_1.TimesheetStatusEnum.DELETED, undefined, {
185
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
186
+ validActionPastThreshold: false,
187
+ });
188
+ const transitionDeleteApprovalPendingStatusApproveAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.APPROVE, (data) => {
189
+ // non-billable timesheets: auto-approve pending or delete
190
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
191
+ if (nonBillableStatus)
192
+ return nonBillableStatus;
193
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETED;
194
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold });
195
+ const transitionDeleteApprovalPendingStatusRejectAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.REJECT, timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED, undefined, {
196
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
197
+ });
198
+ const transitionDeleteApprovalPendingStatusMoveTimesheetAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
199
+ const transitionDeleteApprovalPendingStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING);
200
+ const transitionDeleteApprovalPendingStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
201
+ const transitionDeleteApprovalPendingStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING, undefined, { isApplicable: () => true, validActionPastThreshold: true });
202
+ // RESOLVED_REJECTED status transitions
203
+ const transitionResolvedRejectedStatusUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING, undefined, {
204
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
205
+ validActionPastThreshold: false,
206
+ });
207
+ const transitionResolvedRejectedStatusDeleteAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.DELETE, (data) => {
208
+ // non-billable timesheets: auto-delete
209
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
210
+ if (nonBillableStatus)
211
+ return nonBillableStatus;
212
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING;
213
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold });
214
+ const transitionResolvedRejectedStatusMoveTimesheetAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
215
+ const transitionResolvedRejectedStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED);
216
+ const transitionResolvedRejectedStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED, undefined, {
217
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
218
+ validActionPastThreshold: true,
219
+ });
220
+ const transitionResolvedRejectedStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED, undefined, { isApplicable: () => true, validActionPastThreshold: true });
221
+ // APPROVED status transitions
222
+ const transitionApprovedStatusUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.UPDATE, (data) => {
223
+ // non-billable timesheets: keep ontime/approved on edit
224
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
225
+ if (nonBillableStatus)
226
+ return nonBillableStatus;
227
+ return timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING;
228
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: false });
229
+ const transitionApprovedStatusMoveTimesheetAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
230
+ const transitionApprovedStatusDeleteAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.DELETE, (data) => {
231
+ // non-billable timesheets: auto-delete
232
+ const nonBillableStatus = resolveStatusForNonBillableTimesheet(data);
233
+ if (nonBillableStatus)
234
+ return nonBillableStatus;
235
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING;
236
+ }, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: false });
237
+ const transitionApprovedStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.APPROVED);
238
+ const transitionApprovedStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.APPROVED, undefined, {
239
+ isApplicable: isValidActionAfterTimesheetEnterThreshold,
240
+ validActionPastThreshold: true,
241
+ });
242
+ const transitionApprovedStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.APPROVED, undefined, {
243
+ isApplicable: () => true,
244
+ validActionPastThreshold: true,
245
+ });
246
+ // MOVING_TIMESHEET_PENDING_APPROVAL status transitions
247
+ const transitionMovingTimesheetPendingApprovalStatusApproveAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.APPROVE, (data) => getNextStatusForMovingTimesheetActions(data), // <== currentEntity will always have status
248
+ // ?? TimesheetStatusEnum.APPROVED,
249
+ undefined, { validActionPastThreshold: true });
250
+ const transitionMovingTimesheetPendingApprovalStatusRejectAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.REJECT, (data) => getNextStatusForMovingTimesheetActions(data), undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
251
+ const transitionMovingTimesheetPendingApprovalStatusBillingUpdateAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL);
252
+ const transitionMovingTimesheetPendingApprovalStatusClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: isValidActionAfterTimesheetEnterThreshold, validActionPastThreshold: true });
253
+ const transitionMovingTimesheetPendingApprovalStatusAutoClassifyAction = createActionConfig(timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY, timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL, undefined, { isApplicable: () => true, validActionPastThreshold: true });
254
+ exports.timesheetFlowConfig = {
255
+ [timesheet_status_enum_1.TimesheetStatusEnum.ONTIME]: {
256
+ actions: {
257
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: transitionOntimeStatusUpdateAction,
258
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: transitionOntimeStatusMoveTimesheetAction,
259
+ [timesheet_action_enum_1.TimesheetActionEnum.DELETE]: transitionOntimeStatusDeleteAction,
260
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionOntimeStatusBillingUpdateAction,
261
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionOntimeStatusClassifyAction,
262
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionOntimeStatusAutoClassifyAction,
263
+ },
264
+ },
265
+ [timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING]: {
266
+ actions: {
267
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: transitionCreateApprovalPendingStatusUpdateAction,
268
+ [timesheet_action_enum_1.TimesheetActionEnum.DELETE]: transitionCreateApprovalPendingStatusDeleteAction,
269
+ [timesheet_action_enum_1.TimesheetActionEnum.APPROVE]: transitionCreateApprovalPendingStatusApproveAction,
270
+ [timesheet_action_enum_1.TimesheetActionEnum.REJECT]: transitionCreateApprovalPendingStatusRejectAction,
271
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: transitionCreateApprovalPendingStatusMoveTimesheetAction,
272
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionCreateApprovalPendingStatusBillingUpdateAction,
273
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionCreateApprovalPendingStatusClassifyAction,
274
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionCreateApprovalPendingStatusAutoClassifyAction,
275
+ },
276
+ },
277
+ [timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING]: {
278
+ actions: {
279
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: transitionUpdateApprovalPendingStatusUpdateAction,
280
+ [timesheet_action_enum_1.TimesheetActionEnum.RECALL]: transitionUpdateApprovalPendingStatusRecallAction,
281
+ [timesheet_action_enum_1.TimesheetActionEnum.APPROVE]: transitionUpdateApprovalPendingStatusApproveAction,
282
+ [timesheet_action_enum_1.TimesheetActionEnum.REJECT]: transitionUpdateApprovalPendingStatusRejectAction,
283
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: transitionUpdateApprovalPendingStatusMoveTimesheetAction,
284
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionUpdateApprovalPendingStatusBillingUpdateAction,
285
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionUpdateApprovalPendingStatusClassifyAction,
286
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionUpdateApprovalPendingStatusAutoClassifyAction,
287
+ },
288
+ },
289
+ [timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING]: {
290
+ actions: {
291
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: transitionDeleteApprovalPendingStatusUpdateAction,
292
+ [timesheet_action_enum_1.TimesheetActionEnum.RECALL]: transitionDeleteApprovalPendingStatusRecallAction,
293
+ [timesheet_action_enum_1.TimesheetActionEnum.APPROVE]: transitionDeleteApprovalPendingStatusApproveAction,
294
+ [timesheet_action_enum_1.TimesheetActionEnum.REJECT]: transitionDeleteApprovalPendingStatusRejectAction,
295
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: transitionDeleteApprovalPendingStatusMoveTimesheetAction,
296
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionDeleteApprovalPendingStatusBillingUpdateAction,
297
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionDeleteApprovalPendingStatusClassifyAction,
298
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionDeleteApprovalPendingStatusAutoClassifyAction,
299
+ },
300
+ },
301
+ [timesheet_status_enum_1.TimesheetStatusEnum.RESOLVED_REJECTED]: {
302
+ actions: {
303
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: transitionResolvedRejectedStatusUpdateAction,
304
+ [timesheet_action_enum_1.TimesheetActionEnum.DELETE]: transitionResolvedRejectedStatusDeleteAction,
305
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: transitionResolvedRejectedStatusMoveTimesheetAction,
306
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionResolvedRejectedStatusBillingUpdateAction,
307
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionResolvedRejectedStatusClassifyAction,
308
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionResolvedRejectedStatusAutoClassifyAction,
309
+ },
310
+ },
311
+ [timesheet_status_enum_1.TimesheetStatusEnum.APPROVED]: {
312
+ actions: {
313
+ [timesheet_action_enum_1.TimesheetActionEnum.UPDATE]: transitionApprovedStatusUpdateAction,
314
+ [timesheet_action_enum_1.TimesheetActionEnum.MOVE_TIMESHEET]: transitionApprovedStatusMoveTimesheetAction,
315
+ [timesheet_action_enum_1.TimesheetActionEnum.DELETE]: transitionApprovedStatusDeleteAction,
316
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionApprovedStatusBillingUpdateAction,
317
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionApprovedStatusClassifyAction,
318
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionApprovedStatusAutoClassifyAction,
319
+ },
320
+ },
321
+ [timesheet_status_enum_1.TimesheetStatusEnum.MOVING_TIMESHEET_PENDING_APPROVAL]: {
322
+ actions: {
323
+ [timesheet_action_enum_1.TimesheetActionEnum.APPROVE]: transitionMovingTimesheetPendingApprovalStatusApproveAction,
324
+ [timesheet_action_enum_1.TimesheetActionEnum.REJECT]: transitionMovingTimesheetPendingApprovalStatusRejectAction,
325
+ [timesheet_action_enum_1.TimesheetActionEnum.BILLING_UPDATE]: transitionMovingTimesheetPendingApprovalStatusBillingUpdateAction,
326
+ [timesheet_action_enum_1.TimesheetActionEnum.CLASSIFY]: transitionMovingTimesheetPendingApprovalStatusClassifyAction,
327
+ [timesheet_action_enum_1.TimesheetActionEnum.AUTO_CLASSIFY]: transitionMovingTimesheetPendingApprovalStatusAutoClassifyAction,
328
+ },
329
+ },
330
+ };
331
+ function isInactive(data) {
332
+ if (!data.projectUserMapping) {
333
+ throw new exceptions_1.AppBadRequestException({
334
+ key: error_key_enum_1.ErrorKeyEnum.PROJECT_USER_MAPPING,
335
+ message: ["ProjectUserMapping is required to check for active/inactive"],
336
+ });
337
+ }
338
+ return data.projectUserMapping.status === project_user_status_enum_1.ProjectUserStatusEnum.INACTIVE;
339
+ }
340
+ function isBackdated(data) {
341
+ const { currentTimesheet, buffer, dto } = data;
342
+ // const booleanValue = recordDateModel.isWithinOffset(buffer);
343
+ let booleanValue = true;
344
+ if (currentTimesheet) {
345
+ let dateToCheck;
346
+ if (dto && dto.dateCode && currentTimesheet.dateCode !== dto.dateCode) {
347
+ dateToCheck = dto.dateCode;
348
+ }
349
+ else {
350
+ dateToCheck = currentTimesheet.dateCode;
351
+ }
352
+ const recordDateModel = new utils_1.DateCodeModel(dateToCheck);
353
+ booleanValue = recordDateModel.isWithinOffset(buffer);
354
+ }
355
+ return booleanValue;
356
+ }
357
+ function isValidActionAfterTimesheetEnterThreshold(data) {
358
+ var _a;
359
+ // here its assumed that record date is post threshold
360
+ const { currentTimesheet, dto, timesheetEnterThresholdValue } = data;
361
+ let isValidAction = true;
362
+ if (currentTimesheet && dto && timesheetEnterThresholdValue) {
363
+ const currentTimesheetRecordDate = new utils_1.DateCodeModel(currentTimesheet.dateCode);
364
+ // subtract threshold days from today
365
+ const todayModel = new utils_1.DateCodeModel(utils_1.DateCodeModel.fromDate(new Date()));
366
+ const dateUptoWhichTimesheetCanBeCreatedModel = todayModel.getByOffset(timesheetEnterThresholdValue);
367
+ if (currentTimesheetRecordDate.dateCode < dateUptoWhichTimesheetCanBeCreatedModel.dateCode) {
368
+ const actionConfig = exports.timesheetFlowConfig[currentTimesheet.status];
369
+ if (!actionConfig) {
370
+ return false;
371
+ }
372
+ if (!dto.actionData) {
373
+ throw new exceptions_1.AppBadRequestException({
374
+ key: error_key_enum_1.ErrorKeyEnum.ACTION_DATA,
375
+ message: ["Action data is required when updating a timesheet."],
376
+ });
377
+ }
378
+ // return actionConfig.validAction.includes(dto.actionData.action);
379
+ const actionConfigForAction = actionConfig.actions[dto.actionData.action];
380
+ if (!actionConfigForAction) {
381
+ throw new exceptions_1.AppBadRequestException({
382
+ key: error_key_enum_1.ErrorKeyEnum.ACTION,
383
+ message: [`No config found for action: ${dto.actionData.action}. Please try with a valid action.`],
384
+ });
385
+ }
386
+ isValidAction = (_a = actionConfigForAction.validActionPastThreshold) !== null && _a !== void 0 ? _a : true;
387
+ }
388
+ }
389
+ return isValidAction;
390
+ }
391
+ function getNextStatusForMovingTimesheetActions(contextData) {
392
+ var _a;
393
+ const { dto, currentTimesheet, buffer } = contextData;
394
+ return (_a = currentTimesheet === null || currentTimesheet === void 0 ? void 0 : currentTimesheet.latestStatusFromHistory) !== null && _a !== void 0 ? _a : currentTimesheet === null || currentTimesheet === void 0 ? void 0 : currentTimesheet.status;
395
+ }
396
+ function resolveStatusForNonBillableTimesheet(contextData) {
397
+ var _a, _b, _c, _d;
398
+ const { dto, currentTimesheet, buffer } = contextData;
399
+ const isNonBillableTimesheet = ((_a = dto === null || dto === void 0 ? void 0 : dto.projectId) !== null && _a !== void 0 ? _a : currentTimesheet === null || currentTimesheet === void 0 ? void 0 : currentTimesheet.projectId) === 0;
400
+ const wasNonBillableTimesheet = (currentTimesheet === null || currentTimesheet === void 0 ? void 0 : currentTimesheet.projectId) === 0;
401
+ if (isNonBillableTimesheet && wasNonBillableTimesheet) {
402
+ // delete action on non-billable → straight to DELETED
403
+ if (((_b = dto === null || dto === void 0 ? void 0 : dto.actionData) === null || _b === void 0 ? void 0 : _b.action) === timesheet_action_enum_1.TimesheetActionEnum.DELETE) {
404
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETED;
405
+ }
406
+ // auto-approve if date changed to outside buffer (prevent ontime for backdated edits)
407
+ if (buffer && isBackdated(contextData)) {
408
+ return currentTimesheet.status;
409
+ }
410
+ return timesheet_status_enum_1.TimesheetStatusEnum.APPROVED;
411
+ }
412
+ if (isNonBillableTimesheet && !wasNonBillableTimesheet) {
413
+ if ([timesheet_status_enum_1.TimesheetStatusEnum.CREATE_APPROVAL_PENDING, timesheet_status_enum_1.TimesheetStatusEnum.UPDATE_APPROVAL_PENDING].includes((_c = currentTimesheet === null || currentTimesheet === void 0 ? void 0 : currentTimesheet.status) !== null && _c !== void 0 ? _c : "")) {
414
+ return timesheet_status_enum_1.TimesheetStatusEnum.APPROVED;
415
+ }
416
+ else if ([timesheet_status_enum_1.TimesheetStatusEnum.DELETE_APPROVAL_PENDING].includes((_d = currentTimesheet === null || currentTimesheet === void 0 ? void 0 : currentTimesheet.status) !== null && _d !== void 0 ? _d : "")) {
417
+ return timesheet_status_enum_1.TimesheetStatusEnum.DELETED;
418
+ }
419
+ }
420
+ }
@@ -3,85 +3,99 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.vendorFlowConfig = void 0;
4
4
  const vendor_action_enum_1 = require("../enums/vendor_action_enum");
5
5
  const vendor_status_enum_1 = require("../enums/vendor_status_enum");
6
+ const base_flow_config_factory_1 = require("./base-flow-config.factory");
7
+ const VENDOR_APPROVE_PERMISSION = ["VENDOR_APPROVE_ORG"];
8
+ const VENDOR_UPDATE_PERMISSION = ["VENDOR_UPDATE"];
9
+ const ACTION_MAP = {
10
+ // VIEW and CREATE are declared on VendorActionEnum but carry no transition in this flow. They are
11
+ // listed so the map covers every enum member; the empty reachable set makes createActionConfig
12
+ // uncallable for them.
13
+ [vendor_action_enum_1.VendorActionEnum.VIEW]: {
14
+ reachableStatues: [],
15
+ permissions: [],
16
+ },
17
+ [vendor_action_enum_1.VendorActionEnum.CREATE]: {
18
+ reachableStatues: [],
19
+ permissions: [],
20
+ },
21
+ [vendor_action_enum_1.VendorActionEnum.UPDATE]: {
22
+ reachableStatues: [vendor_status_enum_1.VendorStatusEnum.CREATE_APPROVAL_PENDING, vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING],
23
+ permissions: VENDOR_UPDATE_PERMISSION,
24
+ },
25
+ [vendor_action_enum_1.VendorActionEnum.DELETE]: {
26
+ reachableStatues: [vendor_status_enum_1.VendorStatusEnum.DELETE_APPROVAL_PENDING, vendor_status_enum_1.VendorStatusEnum.DELETED],
27
+ permissions: VENDOR_UPDATE_PERMISSION,
28
+ },
29
+ [vendor_action_enum_1.VendorActionEnum.APPROVE]: {
30
+ reachableStatues: [vendor_status_enum_1.VendorStatusEnum.APPROVED, vendor_status_enum_1.VendorStatusEnum.DELETED],
31
+ permissions: VENDOR_APPROVE_PERMISSION,
32
+ },
33
+ [vendor_action_enum_1.VendorActionEnum.REJECT]: {
34
+ reachableStatues: [vendor_status_enum_1.VendorStatusEnum.REJECTED, vendor_status_enum_1.VendorStatusEnum.RESOLVED_REJECTED],
35
+ permissions: VENDOR_APPROVE_PERMISSION,
36
+ },
37
+ // RECALL is commented out on VendorActionEnum. Reviving it needs an entry here as well as the two
38
+ // commented transitions below.
39
+ // [VendorActionEnum.RECALL]: {
40
+ // reachableStatues: [VendorStatusEnum.DELETED] as const,
41
+ // permissions: VENDOR_UPDATE_PERMISSION,
42
+ // },
43
+ };
44
+ const { createActionConfig } = (0, base_flow_config_factory_1.createFlowConfigFactory)()(ACTION_MAP);
45
+ // CREATE_APPROVAL_PENDING status transitions
46
+ const transitionCreateApprovalPendingStatusApproveAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.APPROVE, vendor_status_enum_1.VendorStatusEnum.APPROVED);
47
+ const transitionCreateApprovalPendingStatusUpdateAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.UPDATE, vendor_status_enum_1.VendorStatusEnum.CREATE_APPROVAL_PENDING);
48
+ const transitionCreateApprovalPendingStatusRejectAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.REJECT, vendor_status_enum_1.VendorStatusEnum.REJECTED);
49
+ const transitionCreateApprovalPendingStatusDeleteAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.DELETE, vendor_status_enum_1.VendorStatusEnum.DELETED);
50
+ // UPDATE_APPROVAL_PENDING status transitions
51
+ const transitionUpdateApprovalPendingStatusApproveAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.APPROVE, vendor_status_enum_1.VendorStatusEnum.APPROVED);
52
+ const transitionUpdateApprovalPendingStatusUpdateAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.UPDATE, vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING);
53
+ const transitionUpdateApprovalPendingStatusRejectAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.REJECT, vendor_status_enum_1.VendorStatusEnum.RESOLVED_REJECTED);
54
+ // const transitionUpdateApprovalPendingStatusRecallAction = createActionConfig(VendorActionEnum.RECALL, VendorStatusEnum.DELETED);
55
+ // DELETE_APPROVAL_PENDING status transitions
56
+ const transitionDeleteApprovalPendingStatusApproveAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.APPROVE, vendor_status_enum_1.VendorStatusEnum.DELETED);
57
+ const transitionDeleteApprovalPendingStatusRejectAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.REJECT, vendor_status_enum_1.VendorStatusEnum.RESOLVED_REJECTED);
58
+ // const transitionDeleteApprovalPendingStatusRecallAction = createActionConfig(VendorActionEnum.RECALL, VendorStatusEnum.DELETED);
59
+ // APPROVED status transitions
60
+ const transitionApprovedStatusUpdateAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.UPDATE, vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING);
61
+ const transitionApprovedStatusDeleteAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.DELETE, vendor_status_enum_1.VendorStatusEnum.DELETE_APPROVAL_PENDING);
62
+ // RESOLVED_REJECTED status transitions
63
+ const transitionResolvedRejectedStatusUpdateAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.UPDATE, vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING);
64
+ const transitionResolvedRejectedStatusDeleteAction = createActionConfig(vendor_action_enum_1.VendorActionEnum.DELETE, vendor_status_enum_1.VendorStatusEnum.DELETE_APPROVAL_PENDING);
6
65
  exports.vendorFlowConfig = {
7
66
  [vendor_status_enum_1.VendorStatusEnum.CREATE_APPROVAL_PENDING]: {
8
67
  actions: {
9
- [vendor_action_enum_1.VendorActionEnum.APPROVE]: {
10
- permissions: ["VENDOR_APPROVE_ORG"],
11
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.APPROVED,
12
- },
13
- [vendor_action_enum_1.VendorActionEnum.UPDATE]: {
14
- permissions: ["VENDOR_UPDATE"],
15
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.CREATE_APPROVAL_PENDING,
16
- },
17
- [vendor_action_enum_1.VendorActionEnum.REJECT]: {
18
- permissions: ["VENDOR_APPROVE_ORG"],
19
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.REJECTED,
20
- },
21
- [vendor_action_enum_1.VendorActionEnum.DELETE]: {
22
- permissions: ["VENDOR_UPDATE"],
23
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.DELETED,
24
- },
68
+ [vendor_action_enum_1.VendorActionEnum.APPROVE]: transitionCreateApprovalPendingStatusApproveAction,
69
+ [vendor_action_enum_1.VendorActionEnum.UPDATE]: transitionCreateApprovalPendingStatusUpdateAction,
70
+ [vendor_action_enum_1.VendorActionEnum.REJECT]: transitionCreateApprovalPendingStatusRejectAction,
71
+ [vendor_action_enum_1.VendorActionEnum.DELETE]: transitionCreateApprovalPendingStatusDeleteAction,
25
72
  },
26
73
  },
27
74
  [vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING]: {
28
75
  actions: {
29
- [vendor_action_enum_1.VendorActionEnum.APPROVE]: {
30
- permissions: ["VENDOR_APPROVE_ORG"],
31
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.APPROVED,
32
- },
33
- [vendor_action_enum_1.VendorActionEnum.UPDATE]: {
34
- permissions: ["VENDOR_UPDATE"],
35
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING,
36
- },
37
- [vendor_action_enum_1.VendorActionEnum.REJECT]: {
38
- permissions: ["VENDOR_APPROVE_ORG"],
39
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.RESOLVED_REJECTED,
40
- },
41
- // [VendorActionEnum.RECALL]: {
42
- // permissions: ["VENDOR_UPDATE"],
43
- // next: (vendorFlowConfigContextData: IVendorFlowConfigContextData) => VendorStatusEnum.DELETED,
44
- // },
76
+ [vendor_action_enum_1.VendorActionEnum.APPROVE]: transitionUpdateApprovalPendingStatusApproveAction,
77
+ [vendor_action_enum_1.VendorActionEnum.UPDATE]: transitionUpdateApprovalPendingStatusUpdateAction,
78
+ [vendor_action_enum_1.VendorActionEnum.REJECT]: transitionUpdateApprovalPendingStatusRejectAction,
79
+ // [VendorActionEnum.RECALL]: transitionUpdateApprovalPendingStatusRecallAction,
45
80
  },
46
81
  },
47
82
  [vendor_status_enum_1.VendorStatusEnum.DELETE_APPROVAL_PENDING]: {
48
83
  actions: {
49
- [vendor_action_enum_1.VendorActionEnum.APPROVE]: {
50
- permissions: ["VENDOR_APPROVE_ORG"],
51
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.DELETED,
52
- },
53
- [vendor_action_enum_1.VendorActionEnum.REJECT]: {
54
- permissions: ["VENDOR_APPROVE_ORG"],
55
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.RESOLVED_REJECTED,
56
- },
57
- // [VendorActionEnum.RECALL]: {
58
- // permissions: ["VENDOR_UPDATE"],
59
- // next: (vendorFlowConfigContextData: IVendorFlowConfigContextData) => VendorStatusEnum.DELETED,
60
- // },
84
+ [vendor_action_enum_1.VendorActionEnum.APPROVE]: transitionDeleteApprovalPendingStatusApproveAction,
85
+ [vendor_action_enum_1.VendorActionEnum.REJECT]: transitionDeleteApprovalPendingStatusRejectAction,
86
+ // [VendorActionEnum.RECALL]: transitionDeleteApprovalPendingStatusRecallAction,
61
87
  },
62
88
  },
63
89
  [vendor_status_enum_1.VendorStatusEnum.APPROVED]: {
64
90
  actions: {
65
- [vendor_action_enum_1.VendorActionEnum.UPDATE]: {
66
- permissions: ["VENDOR_UPDATE"],
67
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING,
68
- },
69
- [vendor_action_enum_1.VendorActionEnum.DELETE]: {
70
- permissions: ["VENDOR_UPDATE"],
71
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.DELETE_APPROVAL_PENDING,
72
- },
91
+ [vendor_action_enum_1.VendorActionEnum.UPDATE]: transitionApprovedStatusUpdateAction,
92
+ [vendor_action_enum_1.VendorActionEnum.DELETE]: transitionApprovedStatusDeleteAction,
73
93
  },
74
94
  },
75
95
  [vendor_status_enum_1.VendorStatusEnum.RESOLVED_REJECTED]: {
76
96
  actions: {
77
- [vendor_action_enum_1.VendorActionEnum.UPDATE]: {
78
- permissions: ["VENDOR_UPDATE"],
79
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.UPDATE_APPROVAL_PENDING,
80
- },
81
- [vendor_action_enum_1.VendorActionEnum.DELETE]: {
82
- permissions: ["VENDOR_UPDATE"],
83
- next: (vendorFlowConfigContextData) => vendor_status_enum_1.VendorStatusEnum.DELETE_APPROVAL_PENDING,
84
- },
97
+ [vendor_action_enum_1.VendorActionEnum.UPDATE]: transitionResolvedRejectedStatusUpdateAction,
98
+ [vendor_action_enum_1.VendorActionEnum.DELETE]: transitionResolvedRejectedStatusDeleteAction,
85
99
  },
86
100
  },
87
101
  };