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,305 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.billingFlowConfig = void 0;
4
+ exports.getNextStatusTotalAmount = getNextStatusTotalAmount;
5
+ const error_key_enum_1 = require("../../enums/error.key.enum");
6
+ const exceptions_1 = require("../../exceptions");
7
+ const billing_action_enum_1 = require("../enums/billing_action_enum");
8
+ const billing_status_enum_1 = require("../enums/billing_status_enum");
9
+ const base_flow_config_factory_1 = require("./base-flow-config.factory");
10
+ const BILLING_APPROVER_PERMISSION = ["BILLING_APPROVER_ORG", "BILLING_APPROVER_PROJECT"];
11
+ const BILLING_AMENDMENT_PERMISSION = ["BILLING_AMENDMENT_ORG"];
12
+ const BILLING_REGENERATE_PERMISSION = ["BILLING_UPDATE"];
13
+ const BILLING_PDF_VIEW_PERMISSION = ["BILLING_VIEW_PDF"];
14
+ /**
15
+ * Every status this flow declares a block for. PDF_VIEW is an identity transition available from each
16
+ * of them, so this is exactly its reachable set.
17
+ *
18
+ * CANCELLED is a target (REJECT, REGENERATE) but has no block of its own — it is terminal.
19
+ */
20
+ const BILLING_FLOW_STATUSES = [
21
+ billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL,
22
+ billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES,
23
+ billing_status_enum_1.BillingStatusEnum.INTERNAL_APPROVED,
24
+ billing_status_enum_1.BillingStatusEnum.PENDING_CLIENT_REVIEW,
25
+ billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL,
26
+ billing_status_enum_1.BillingStatusEnum.REJECT_CLIENT_REVISION,
27
+ billing_status_enum_1.BillingStatusEnum.INVOICE_SENT,
28
+ billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT,
29
+ billing_status_enum_1.BillingStatusEnum.SETTLED,
30
+ ];
31
+ const ACTION_MAP = {
32
+ [billing_action_enum_1.BillingActionsEnum.APPROVE]: {
33
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.INTERNAL_APPROVED],
34
+ permissions: BILLING_APPROVER_PERMISSION,
35
+ },
36
+ [billing_action_enum_1.BillingActionsEnum.REJECT]: {
37
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.CANCELLED, billing_status_enum_1.BillingStatusEnum.REJECT_CLIENT_REVISION],
38
+ permissions: BILLING_APPROVER_PERMISSION,
39
+ },
40
+ /**
41
+ * UPDATE is the one action whose permission is not constant across its transitions: four of the five
42
+ * use the approver list, but REQUEST_CHANGES uses the amendment list. The approver list is the default
43
+ * here and REQUEST_CHANGES passes the amendment list as an override.
44
+ */
45
+ [billing_action_enum_1.BillingActionsEnum.UPDATE]: {
46
+ reachableStatues: [
47
+ billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL,
48
+ billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES,
49
+ billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL,
50
+ billing_status_enum_1.BillingStatusEnum.INVOICE_SENT,
51
+ ],
52
+ permissions: BILLING_APPROVER_PERMISSION,
53
+ },
54
+ [billing_action_enum_1.BillingActionsEnum.REQUEST_FOR_CHANGES]: {
55
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES],
56
+ permissions: BILLING_APPROVER_PERMISSION,
57
+ },
58
+ [billing_action_enum_1.BillingActionsEnum.SENT_FOR_APPROVAL]: {
59
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL],
60
+ permissions: BILLING_AMENDMENT_PERMISSION,
61
+ },
62
+ [billing_action_enum_1.BillingActionsEnum.SEND_FOR_CLIENT_REVIEW]: {
63
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.PENDING_CLIENT_REVIEW],
64
+ permissions: BILLING_AMENDMENT_PERMISSION,
65
+ },
66
+ [billing_action_enum_1.BillingActionsEnum.CLIENT_REVISION]: {
67
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL],
68
+ permissions: BILLING_AMENDMENT_PERMISSION,
69
+ },
70
+ [billing_action_enum_1.BillingActionsEnum.SEND_INVOICE]: {
71
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT, billing_status_enum_1.BillingStatusEnum.INVOICE_SENT],
72
+ permissions: BILLING_AMENDMENT_PERMISSION,
73
+ },
74
+ [billing_action_enum_1.BillingActionsEnum.APPROVAL]: {
75
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES],
76
+ permissions: BILLING_APPROVER_PERMISSION,
77
+ },
78
+ /**
79
+ * UPDATE_PAYMENT is context-driven: `getNextStatusTotalAmount` returns SETTLED once the outstanding
80
+ * amount reaches zero and PENDING_PAYMENT otherwise. The from-status is also reachable, because both
81
+ * transitions fall back to it when called without context — which the entity-flow component does.
82
+ */
83
+ [billing_action_enum_1.BillingActionsEnum.UPDATE_PAYMENT]: {
84
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.SETTLED, billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT, billing_status_enum_1.BillingStatusEnum.INVOICE_SENT],
85
+ permissions: BILLING_AMENDMENT_PERMISSION,
86
+ },
87
+ [billing_action_enum_1.BillingActionsEnum.REGENERATE]: {
88
+ reachableStatues: [billing_status_enum_1.BillingStatusEnum.CANCELLED],
89
+ permissions: BILLING_REGENERATE_PERMISSION,
90
+ },
91
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: {
92
+ reachableStatues: BILLING_FLOW_STATUSES,
93
+ permissions: BILLING_PDF_VIEW_PERMISSION,
94
+ },
95
+ // CREDIT_NOTE, WRITE_OFF and TDS are declared on BillingActionsEnum but carry no transition in this
96
+ // flow. They are listed so the map covers every enum member; the empty reachable set makes
97
+ // createActionConfig uncallable for them.
98
+ [billing_action_enum_1.BillingActionsEnum.CREDIT_NOTE]: {
99
+ reachableStatues: [],
100
+ permissions: [],
101
+ },
102
+ [billing_action_enum_1.BillingActionsEnum.WRITE_OFF]: {
103
+ reachableStatues: [],
104
+ permissions: [],
105
+ },
106
+ [billing_action_enum_1.BillingActionsEnum.TDS]: {
107
+ reachableStatues: [],
108
+ permissions: [],
109
+ },
110
+ };
111
+ const { createActionConfig } = (0, base_flow_config_factory_1.createFlowConfigFactory)()(ACTION_MAP);
112
+ // PENDING_APPROVAL status transitions
113
+ const transitionPendingApprovalStatusApproveAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.APPROVE, billing_status_enum_1.BillingStatusEnum.INTERNAL_APPROVED, undefined, {
114
+ description: "Internal Approved state signifies that the Proforma Invoice has been reviewed and verified by internal stakeholders.",
115
+ });
116
+ const transitionPendingApprovalStatusRejectAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REJECT, billing_status_enum_1.BillingStatusEnum.CANCELLED, undefined, {
117
+ description: "Rejected state indicates that the Proforma Invoice was not approved and has been cancelled.",
118
+ });
119
+ const transitionPendingApprovalStatusUpdateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE, billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL, undefined, {
120
+ description: "Allows stakeholders to edit the Proforma Invoice while keeping it in Pending Approval status.",
121
+ });
122
+ const transitionPendingApprovalStatusRequestForChangesAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REQUEST_FOR_CHANGES, billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES, undefined, { description: "Stakeholders have requested changes before approving the Proforma Invoice." });
123
+ // REQUEST_CHANGES status transitions
124
+ const transitionRequestChangesStatusUpdateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE, billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES, BILLING_AMENDMENT_PERMISSION, // differs from the action default — amendment, not approver
125
+ { description: "Allows modification of the Proforma Invoice based on stakeholder feedback." });
126
+ const transitionRequestChangesStatusSentForApprovalAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.SENT_FOR_APPROVAL, billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL, undefined, { description: "Resubmits the updated Proforma Invoice for stakeholder approval." });
127
+ // INTERNAL_APPROVED status transitions
128
+ const transitionInternalApprovedStatusSendForClientReviewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.SEND_FOR_CLIENT_REVIEW, billing_status_enum_1.BillingStatusEnum.PENDING_CLIENT_REVIEW, undefined, { description: "Invoice has been internally approved and is sent to the client for review." });
129
+ // PENDING_CLIENT_REVIEW status transitions
130
+ const transitionPendingClientReviewStatusClientRevisionAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.CLIENT_REVISION, billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL, undefined, { description: "Client has requested revisions to the Proforma Invoice." });
131
+ const transitionPendingClientReviewStatusSendInvoiceAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.SEND_INVOICE, billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT, undefined, {
132
+ description: "Final invoice has been shared with the client and payment is awaited.",
133
+ });
134
+ // CLIENT_REVISION_APPROVAL status transitions
135
+ const transitionClientRevisionApprovalStatusApprovalAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.APPROVAL, billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES, undefined, {
136
+ description: "Client revision has been reviewed and approved for further amendments.",
137
+ });
138
+ const transitionClientRevisionApprovalStatusRejectAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REJECT, billing_status_enum_1.BillingStatusEnum.REJECT_CLIENT_REVISION, undefined, {
139
+ description: "Client revision request has been rejected by stakeholders.",
140
+ });
141
+ const transitionClientRevisionApprovalStatusUpdateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE, billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL, undefined, { description: "Allows editing while client revision approval is in progress." });
142
+ const transitionClientRevisionApprovalStatusRequestForChangesAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REQUEST_FOR_CHANGES, billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES, undefined, { description: "Requests additional changes before approving the client revision." });
143
+ // REJECT_CLIENT_REVISION status transitions
144
+ const transitionRejectClientRevisionStatusSendInvoiceAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.SEND_INVOICE, billing_status_enum_1.BillingStatusEnum.INVOICE_SENT, undefined, {
145
+ description: "Invoice has been sent despite client revision rejection.",
146
+ });
147
+ // INVOICE_SENT status transitions
148
+ const transitionInvoiceSentStatusUpdatePaymentAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE_PAYMENT, (data) => {
149
+ return data ? getNextStatusTotalAmount(data) : billing_status_enum_1.BillingStatusEnum.INVOICE_SENT;
150
+ }, undefined, { description: "Updates received payment details and recalculates outstanding amount." });
151
+ const transitionInvoiceSentStatusRejectAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REJECT, billing_status_enum_1.BillingStatusEnum.CANCELLED, undefined, {
152
+ description: "Rejected state indicates that the Proforma Invoice was not approved and has been cancelled.",
153
+ });
154
+ const transitionInvoiceSentStatusUpdateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE, billing_status_enum_1.BillingStatusEnum.INVOICE_SENT, undefined, {
155
+ description: "Allows stakeholders to edit the invoice while keeping it in Invoice Sent status.",
156
+ });
157
+ const transitionInvoiceSentStatusRegenerateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REGENERATE, billing_status_enum_1.BillingStatusEnum.CANCELLED, undefined, {
158
+ description: "Regenerates the billing by cancelling the current one and creating a replacement",
159
+ });
160
+ // PENDING_PAYMENT status transitions
161
+ const transitionPendingPaymentStatusUpdatePaymentAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE_PAYMENT, (data) => {
162
+ return data ? getNextStatusTotalAmount(data) : billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT;
163
+ }, undefined, { description: "Tracks partial or full payments until the invoice is completely settled." });
164
+ const transitionPendingPaymentStatusRejectAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REJECT, billing_status_enum_1.BillingStatusEnum.CANCELLED, undefined, {
165
+ description: "Rejected state indicates that the Proforma Invoice was not approved and has been cancelled.",
166
+ });
167
+ const transitionPendingPaymentStatusUpdateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.UPDATE, billing_status_enum_1.BillingStatusEnum.INVOICE_SENT, undefined, {
168
+ description: "Allows stakeholders to edit the invoice while keeping it in Invoice Sent status.",
169
+ });
170
+ const transitionPendingPaymentStatusRegenerateAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.REGENERATE, billing_status_enum_1.BillingStatusEnum.CANCELLED, undefined, {
171
+ description: "Regenerates the billing by cancelling the current one and creating a replacement",
172
+ });
173
+ /**
174
+ * PDF_VIEW status transitions — one per status block, each keeping the row where it is. These were
175
+ * previously attached by mutating the config through `addPdfViewToAllStatuses` after definition; they
176
+ * are written out explicitly so the exported object is complete and immutable.
177
+ */
178
+ const transitionPendingApprovalStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL, undefined, {
179
+ description: "",
180
+ });
181
+ const transitionRequestChangesStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES, undefined, {
182
+ description: "",
183
+ });
184
+ const transitionInternalApprovedStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.INTERNAL_APPROVED, undefined, {
185
+ description: "",
186
+ });
187
+ const transitionPendingClientReviewStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.PENDING_CLIENT_REVIEW, undefined, {
188
+ description: "",
189
+ });
190
+ const transitionClientRevisionApprovalStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL, undefined, { description: "" });
191
+ const transitionRejectClientRevisionStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.REJECT_CLIENT_REVISION, undefined, {
192
+ description: "",
193
+ });
194
+ const transitionInvoiceSentStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.INVOICE_SENT, undefined, {
195
+ description: "",
196
+ });
197
+ const transitionPendingPaymentStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT, undefined, {
198
+ description: "",
199
+ });
200
+ const transitionSettledStatusPdfViewAction = createActionConfig(billing_action_enum_1.BillingActionsEnum.PDF_VIEW, billing_status_enum_1.BillingStatusEnum.SETTLED, undefined, { description: "" });
201
+ exports.billingFlowConfig = {
202
+ [billing_status_enum_1.BillingStatusEnum.PENDING_APPROVAL]: {
203
+ description: "The Proforma Invoice has been created and is awaiting review and approval by internal stakeholders (org or project approvers).",
204
+ actions: {
205
+ [billing_action_enum_1.BillingActionsEnum.APPROVE]: transitionPendingApprovalStatusApproveAction,
206
+ [billing_action_enum_1.BillingActionsEnum.REJECT]: transitionPendingApprovalStatusRejectAction,
207
+ [billing_action_enum_1.BillingActionsEnum.UPDATE]: transitionPendingApprovalStatusUpdateAction,
208
+ [billing_action_enum_1.BillingActionsEnum.REQUEST_FOR_CHANGES]: transitionPendingApprovalStatusRequestForChangesAction,
209
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionPendingApprovalStatusPdfViewAction,
210
+ },
211
+ },
212
+ [billing_status_enum_1.BillingStatusEnum.REQUEST_CHANGES]: {
213
+ description: "Stakeholders have reviewed the Proforma Invoice and requested modifications before it can be approved. The invoice is pending amendments by the billing team.",
214
+ actions: {
215
+ [billing_action_enum_1.BillingActionsEnum.UPDATE]: transitionRequestChangesStatusUpdateAction,
216
+ [billing_action_enum_1.BillingActionsEnum.SENT_FOR_APPROVAL]: transitionRequestChangesStatusSentForApprovalAction,
217
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionRequestChangesStatusPdfViewAction,
218
+ },
219
+ },
220
+ [billing_status_enum_1.BillingStatusEnum.INTERNAL_APPROVED]: {
221
+ description: "The Proforma Invoice has been reviewed and approved by internal stakeholders. It is now ready to be forwarded to the client for review.",
222
+ actions: {
223
+ [billing_action_enum_1.BillingActionsEnum.SEND_FOR_CLIENT_REVIEW]: transitionInternalApprovedStatusSendForClientReviewAction,
224
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionInternalApprovedStatusPdfViewAction,
225
+ },
226
+ },
227
+ [billing_status_enum_1.BillingStatusEnum.PENDING_CLIENT_REVIEW]: {
228
+ description: "The Proforma Invoice has been shared with the client and is awaiting their response. The client may either accept the invoice or request revisions.",
229
+ actions: {
230
+ [billing_action_enum_1.BillingActionsEnum.CLIENT_REVISION]: transitionPendingClientReviewStatusClientRevisionAction,
231
+ [billing_action_enum_1.BillingActionsEnum.SEND_INVOICE]: transitionPendingClientReviewStatusSendInvoiceAction,
232
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionPendingClientReviewStatusPdfViewAction,
233
+ },
234
+ },
235
+ [billing_status_enum_1.BillingStatusEnum.CLIENT_REVISION_APPROVAL]: {
236
+ description: "The client has requested revisions to the invoice. Internal stakeholders are reviewing whether to approve the revision request, reject it, or ask for further changes.",
237
+ actions: {
238
+ [billing_action_enum_1.BillingActionsEnum.APPROVAL]: transitionClientRevisionApprovalStatusApprovalAction,
239
+ [billing_action_enum_1.BillingActionsEnum.REJECT]: transitionClientRevisionApprovalStatusRejectAction,
240
+ [billing_action_enum_1.BillingActionsEnum.UPDATE]: transitionClientRevisionApprovalStatusUpdateAction,
241
+ [billing_action_enum_1.BillingActionsEnum.REQUEST_FOR_CHANGES]: transitionClientRevisionApprovalStatusRequestForChangesAction,
242
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionClientRevisionApprovalStatusPdfViewAction,
243
+ },
244
+ },
245
+ [billing_status_enum_1.BillingStatusEnum.REJECT_CLIENT_REVISION]: {
246
+ description: "The client's revision request has been rejected by internal stakeholders. The billing team can proceed to send the original invoice to the client.",
247
+ actions: {
248
+ [billing_action_enum_1.BillingActionsEnum.SEND_INVOICE]: transitionRejectClientRevisionStatusSendInvoiceAction,
249
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionRejectClientRevisionStatusPdfViewAction,
250
+ },
251
+ },
252
+ [billing_status_enum_1.BillingStatusEnum.INVOICE_SENT]: {
253
+ description: "The final invoice has been issued to the client following a rejected revision request. Payment is being tracked; partial payments may be recorded until the invoice is fully settled.",
254
+ actions: {
255
+ [billing_action_enum_1.BillingActionsEnum.UPDATE_PAYMENT]: transitionInvoiceSentStatusUpdatePaymentAction,
256
+ [billing_action_enum_1.BillingActionsEnum.REJECT]: transitionInvoiceSentStatusRejectAction,
257
+ [billing_action_enum_1.BillingActionsEnum.UPDATE]: transitionInvoiceSentStatusUpdateAction,
258
+ [billing_action_enum_1.BillingActionsEnum.REGENERATE]: transitionInvoiceSentStatusRegenerateAction,
259
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionInvoiceSentStatusPdfViewAction,
260
+ },
261
+ },
262
+ [billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT]: {
263
+ description: "The final invoice has been sent to the client and payment is awaited. Partial or full payments can be recorded; the invoice remains in this state until the total amount is fully settled.",
264
+ actions: {
265
+ [billing_action_enum_1.BillingActionsEnum.UPDATE_PAYMENT]: transitionPendingPaymentStatusUpdatePaymentAction,
266
+ [billing_action_enum_1.BillingActionsEnum.REJECT]: transitionPendingPaymentStatusRejectAction,
267
+ [billing_action_enum_1.BillingActionsEnum.UPDATE]: transitionPendingPaymentStatusUpdateAction,
268
+ [billing_action_enum_1.BillingActionsEnum.REGENERATE]: transitionPendingPaymentStatusRegenerateAction,
269
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionPendingPaymentStatusPdfViewAction,
270
+ },
271
+ },
272
+ [billing_status_enum_1.BillingStatusEnum.SETTLED]: {
273
+ description: "The invoice has been fully settled. The total amount due has been accounted for through a combination of payments, credit notes, write-offs, TDS, and refunds. No further actions are required.",
274
+ actions: {
275
+ [billing_action_enum_1.BillingActionsEnum.PDF_VIEW]: transitionSettledStatusPdfViewAction,
276
+ },
277
+ },
278
+ };
279
+ function getNextStatusTotalAmount(data) {
280
+ var _a, _b, _c, _d, _e;
281
+ const { currentBilling, dto } = data;
282
+ if (!currentBilling) {
283
+ throw new exceptions_1.AppBadRequestException({
284
+ key: error_key_enum_1.ErrorKeyEnum.BILLING,
285
+ message: ["Current billing entity is required"],
286
+ });
287
+ }
288
+ if (!dto) {
289
+ throw new exceptions_1.AppBadRequestException({
290
+ key: error_key_enum_1.ErrorKeyEnum.BILLING,
291
+ message: ["Current billing entity is required"],
292
+ });
293
+ }
294
+ if (Number(currentBilling.totalAmount) ===
295
+ Number((_a = dto.totalAmountPaid) !== null && _a !== void 0 ? _a : currentBilling.totalAmountPaid) +
296
+ Number((_b = dto.creditNoteAmount) !== null && _b !== void 0 ? _b : currentBilling.creditNoteAmount) +
297
+ Number((_c = dto.writeoffAmount) !== null && _c !== void 0 ? _c : currentBilling.writeoffAmount) +
298
+ Number((_d = dto.tdsAmount) !== null && _d !== void 0 ? _d : currentBilling.tdsAmount) -
299
+ Number((_e = dto.refundAmount) !== null && _e !== void 0 ? _e : currentBilling.refundAmount)) {
300
+ return billing_status_enum_1.BillingStatusEnum.SETTLED;
301
+ }
302
+ else {
303
+ return billing_status_enum_1.BillingStatusEnum.PENDING_PAYMENT;
304
+ }
305
+ }
@@ -0,0 +1,24 @@
1
+ import { IBillingTransactionUpdateDto } from "../../api";
2
+ import { BillingTransactionActionEnum } from "../enums/billing_transaction_action_enum";
3
+ import { BillingTransactionStatusEnum } from "../enums/billing_transaction_status_enum";
4
+ import { IBillingTransactionEntity } from "../interface/billing_transaction.entity.interface";
5
+ import { FlowConfig } from "./flow-config.type";
6
+ export interface IBillingTransactionContextFlowData {
7
+ currentBillingTransactionEntity: IBillingTransactionEntity;
8
+ dto: IBillingTransactionUpdateDto;
9
+ }
10
+ /**
11
+ * LW-828: this used to re-declare the flow-config shape by hand. It is now an alias of the shared
12
+ * `FlowConfig`, which is a strict superset of the old declaration — same `permissions` and `next`, plus
13
+ * the optional `description` / `isApplicable` / `validActionPastThreshold` this entity does not use.
14
+ * Kept as a named type so every existing consumer keeps compiling unchanged.
15
+ */
16
+ export type IBillingTransactionFlowConfig = FlowConfig<BillingTransactionStatusEnum, BillingTransactionActionEnum, IBillingTransactionContextFlowData>;
17
+ /**
18
+ * The ADJUST_AGAINST_CREDIT_NOTE_APPROVAL_PENDING block was commented out in the legacy config and stays
19
+ * commented here, converted to the new shape so reviving it is a straight uncomment. It also needs
20
+ * `ADJUST_AGAINST_CREDIT_NOTE_APPROVAL_PENDING` on BillingTransactionStatusEnum, its counterpart on
21
+ * BillingTransactionType, the mapping line in `decideNextStatus`, and the status added to UPDATE's
22
+ * `reachableStatues` in ACTION_MAP.
23
+ */
24
+ export declare const billingTransactionFlowConfig: IBillingTransactionFlowConfig;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.billingTransactionFlowConfig = void 0;
4
+ const billing_transaction_action_enum_1 = require("../enums/billing_transaction_action_enum");
5
+ const billing_transaction_enum_1 = require("../enums/billing_transaction_enum");
6
+ const billing_transaction_status_enum_1 = require("../enums/billing_transaction_status_enum");
7
+ const base_flow_config_factory_1 = require("./base-flow-config.factory");
8
+ const BILLING_TRANSACTION_UPDATE_PERMISSION = ["BILLING_TRANSACTION_UPDATE_SELF"];
9
+ const BILLING_TRANSACTION_APPROVER_PERMISSION = ["BILLING_TRANSACTION_APPROVER_PROJECT", "BILLING_TRANSACTION_APPROVER_ORG"];
10
+ const ACTION_MAP = {
11
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.APPROVE]: {
12
+ reachableStatues: [billing_transaction_status_enum_1.BillingTransactionStatusEnum.APPROVED],
13
+ permissions: BILLING_TRANSACTION_APPROVER_PERMISSION,
14
+ },
15
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.REJECT]: {
16
+ reachableStatues: [billing_transaction_status_enum_1.BillingTransactionStatusEnum.REJECTED],
17
+ permissions: BILLING_TRANSACTION_APPROVER_PERMISSION,
18
+ },
19
+ /**
20
+ * UPDATE delegates to `decideNextStatus`, which returns one of the two approval-pending statuses when
21
+ * the transaction type changes, and otherwise falls back to `currentBillingTransactionEntity.status`.
22
+ * That identity branch can yield any status the row already holds, so the honest reachable set is the
23
+ * full enum rather than just the two mapped targets.
24
+ */
25
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE]: {
26
+ reachableStatues: [
27
+ billing_transaction_status_enum_1.BillingTransactionStatusEnum.APPROVED,
28
+ billing_transaction_status_enum_1.BillingTransactionStatusEnum.REJECTED,
29
+ billing_transaction_status_enum_1.BillingTransactionStatusEnum.WRITEOFF_APPROVAL_PENDING,
30
+ billing_transaction_status_enum_1.BillingTransactionStatusEnum.CREDITNOTE_APPROVAL_PENDING,
31
+ ],
32
+ permissions: BILLING_TRANSACTION_UPDATE_PERMISSION,
33
+ },
34
+ };
35
+ const { createActionConfig } = (0, base_flow_config_factory_1.createFlowConfigFactory)()(ACTION_MAP);
36
+ // APPROVED status transitions
37
+ const transitionApprovedStatusUpdateAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE, (data) => decideNextStatus(data));
38
+ // WRITEOFF_APPROVAL_PENDING status transitions
39
+ const transitionWriteoffApprovalPendingStatusApproveAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.APPROVE, billing_transaction_status_enum_1.BillingTransactionStatusEnum.APPROVED);
40
+ const transitionWriteoffApprovalPendingStatusRejectAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.REJECT, billing_transaction_status_enum_1.BillingTransactionStatusEnum.REJECTED);
41
+ const transitionWriteoffApprovalPendingStatusUpdateAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE, (data) => decideNextStatus(data));
42
+ // CREDITNOTE_APPROVAL_PENDING status transitions
43
+ const transitionCreditnoteApprovalPendingStatusApproveAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.APPROVE, billing_transaction_status_enum_1.BillingTransactionStatusEnum.APPROVED);
44
+ const transitionCreditnoteApprovalPendingStatusRejectAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.REJECT, billing_transaction_status_enum_1.BillingTransactionStatusEnum.REJECTED);
45
+ const transitionCreditnoteApprovalPendingStatusUpdateAction = createActionConfig(billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE, (data) => decideNextStatus(data));
46
+ /**
47
+ * The ADJUST_AGAINST_CREDIT_NOTE_APPROVAL_PENDING block was commented out in the legacy config and stays
48
+ * commented here, converted to the new shape so reviving it is a straight uncomment. It also needs
49
+ * `ADJUST_AGAINST_CREDIT_NOTE_APPROVAL_PENDING` on BillingTransactionStatusEnum, its counterpart on
50
+ * BillingTransactionType, the mapping line in `decideNextStatus`, and the status added to UPDATE's
51
+ * `reachableStatues` in ACTION_MAP.
52
+ */
53
+ // const transitionAdjustAgainstCreditNoteApprovalPendingStatusApproveAction = createActionConfig(
54
+ // BillingTransactionActionEnum.APPROVE,
55
+ // BillingTransactionStatusEnum.APPROVED,
56
+ // );
57
+ // const transitionAdjustAgainstCreditNoteApprovalPendingStatusRejectAction = createActionConfig(
58
+ // BillingTransactionActionEnum.REJECT,
59
+ // BillingTransactionStatusEnum.REJECTED,
60
+ // );
61
+ // const transitionAdjustAgainstCreditNoteApprovalPendingStatusUpdateAction = createActionConfig(
62
+ // BillingTransactionActionEnum.UPDATE,
63
+ // (data: IBillingTransactionContextFlowData) => decideNextStatus(data),
64
+ // );
65
+ exports.billingTransactionFlowConfig = {
66
+ [billing_transaction_status_enum_1.BillingTransactionStatusEnum.APPROVED]: {
67
+ actions: {
68
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE]: transitionApprovedStatusUpdateAction,
69
+ },
70
+ },
71
+ [billing_transaction_status_enum_1.BillingTransactionStatusEnum.WRITEOFF_APPROVAL_PENDING]: {
72
+ actions: {
73
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.APPROVE]: transitionWriteoffApprovalPendingStatusApproveAction,
74
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.REJECT]: transitionWriteoffApprovalPendingStatusRejectAction,
75
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE]: transitionWriteoffApprovalPendingStatusUpdateAction,
76
+ },
77
+ },
78
+ [billing_transaction_status_enum_1.BillingTransactionStatusEnum.CREDITNOTE_APPROVAL_PENDING]: {
79
+ actions: {
80
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.APPROVE]: transitionCreditnoteApprovalPendingStatusApproveAction,
81
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.REJECT]: transitionCreditnoteApprovalPendingStatusRejectAction,
82
+ [billing_transaction_action_enum_1.BillingTransactionActionEnum.UPDATE]: transitionCreditnoteApprovalPendingStatusUpdateAction,
83
+ },
84
+ },
85
+ // [BillingTransactionStatusEnum.ADJUST_AGAINST_CREDIT_NOTE_APPROVAL_PENDING]: {
86
+ // actions: {
87
+ // [BillingTransactionActionEnum.APPROVE]: transitionAdjustAgainstCreditNoteApprovalPendingStatusApproveAction,
88
+ // [BillingTransactionActionEnum.REJECT]: transitionAdjustAgainstCreditNoteApprovalPendingStatusRejectAction,
89
+ // [BillingTransactionActionEnum.UPDATE]: transitionAdjustAgainstCreditNoteApprovalPendingStatusUpdateAction,
90
+ // },
91
+ // },
92
+ };
93
+ function decideNextStatus(data) {
94
+ var _a;
95
+ const { currentBillingTransactionEntity, dto } = data;
96
+ const typeStatusMapping = {
97
+ [billing_transaction_enum_1.BillingTransactionType.WRITE_OFF]: billing_transaction_status_enum_1.BillingTransactionStatusEnum.WRITEOFF_APPROVAL_PENDING,
98
+ [billing_transaction_enum_1.BillingTransactionType.CREDIT_NOTE]: billing_transaction_status_enum_1.BillingTransactionStatusEnum.CREDITNOTE_APPROVAL_PENDING,
99
+ // [BillingTransactionType.ADJUST_AGAINST_CREDIT_NOTE]: BillingTransactionStatusEnum.ADJUST_AGAINST_CREDIT_NOTE_APPROVAL_PENDING,
100
+ };
101
+ if (currentBillingTransactionEntity.type === dto.type) {
102
+ return currentBillingTransactionEntity.status;
103
+ }
104
+ else {
105
+ if (dto.type && dto.type in typeStatusMapping) {
106
+ return (_a = typeStatusMapping[dto.type]) !== null && _a !== void 0 ? _a : currentBillingTransactionEntity.status;
107
+ }
108
+ // otherwise → retain current status
109
+ return currentBillingTransactionEntity.status;
110
+ }
111
+ }
@@ -62,6 +62,20 @@ export interface IFlowConfigActionConfig<STATUS_ENUM_TYPE extends string, CONTEX
62
62
  permissions: string[];
63
63
  next: (data: CONTEXT_DATA_TYPE) => STATUS_ENUM_TYPE;
64
64
  description?: string;
65
+ /**
66
+ * Optional runtime guard. When present, the flow consumer evaluates it against the same
67
+ * context data as `next()` and refuses the action when it returns false. Distinct from
68
+ * `permissions`, which gate *who* may act; this gates *whether the action applies at all*
69
+ * to the row in its current state.
70
+ */
71
+ isApplicable?: (data: CONTEXT_DATA_TYPE) => boolean;
72
+ /**
73
+ * Optional flag read by consumers that enforce a data-entry threshold: whether this action
74
+ * stays available once the row is older than that threshold. Absent means "yes" — consumers
75
+ * read it as `validActionPastThreshold ?? true`. It is a plain boolean rather than a
76
+ * function so it survives serialisation to clients that receive the flow config over HTTP.
77
+ */
78
+ validActionPastThreshold?: boolean;
65
79
  }
66
80
  export type ParentChildFlowConfig<S extends string, A extends string, CS extends string = never, CA extends string = never, T extends Record<any, any> = never> = {
67
81
  parent: FlowConfig<S, A, T>;
@@ -12,4 +12,11 @@ export type ILeaveFlowContextData = {
12
12
  dto?: ILeaveUpdateDto;
13
13
  };
14
14
  export type ILeaveFlowConfig = FlowConfig<LeaveStatusEnum, LeaveActionEnum, never>;
15
+ /**
16
+ * The commented-out entries below are kept verbatim from the legacy config, in the old inline
17
+ * `{ permissions, next }` shape, rather than converted. There are eight of them across five status
18
+ * blocks plus two whole commented status blocks (DELETED, REJECTED); rewriting all of them would add
19
+ * a lot of dead consts for transitions nobody has decided to revive. Reviving any of them means
20
+ * writing a `transition…Action` const and, for READ, giving it a real reachable set in ACTION_MAP.
21
+ */
15
22
  export declare const leaveFlowConfig: FlowConfig<LeaveStatusEnum, LeaveActionEnum, ILeaveFlowConfigContextData>;