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.
- package/dist/src/api/interface/client_affiliate.create.dto.interface.d.ts +1 -1
- package/dist/src/api/interface/client_quote_rate.create.dto.interface.d.ts +2 -1
- package/dist/src/api/interface/document_upload.create.dto.interface.d.ts +2 -1
- package/dist/src/api/interface/intermediary_bank.create.dto.interface.d.ts +2 -1
- package/dist/src/api/interface/intermediary_bank.update.dto.interface.d.ts +1 -1
- package/dist/src/api/interface/office_location.create.dto.interface.d.ts +3 -1
- package/dist/src/api/interface/office_location.update.dto.interface.d.ts +2 -1
- package/dist/src/api/interface/timesheet.entity.response.interface.d.ts +7 -13
- package/dist/src/api/interface/to_do_list.create.dto.interface.d.ts +3 -1
- package/dist/src/api/interface/to_do_list.update.dto.interface.d.ts +2 -1
- package/dist/src/entities/enums/billing_profile_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/billing_profile_status_enum.js +9 -0
- package/dist/src/entities/enums/client_affiliate_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/client_affiliate_status_enum.js +9 -0
- package/dist/src/entities/enums/client_quote_rate_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/client_quote_rate_status_enum.js +9 -0
- package/dist/src/entities/enums/document_upload_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/document_upload_status_enum.js +9 -0
- package/dist/src/entities/enums/expense_type_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/expense_type_status_enum.js +9 -0
- package/dist/src/entities/enums/intermediary_bank_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/intermediary_bank_status_enum.js +9 -0
- package/dist/src/entities/enums/office_location_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/office_location_status_enum.js +9 -0
- package/dist/src/entities/enums/to_do_list_status_enum.d.ts +5 -0
- package/dist/src/entities/enums/to_do_list_status_enum.js +9 -0
- package/dist/src/entities/flow-configs/base-flow-config.factory.d.ts +20 -1
- package/dist/src/entities/flow-configs/base-flow-config.factory.js +1 -16
- package/dist/src/entities/flow-configs/{billing.flow.config.d.ts → billing_flow.config.d.ts} +1 -1
- package/dist/src/entities/flow-configs/billing_flow.config.js +305 -0
- package/dist/src/entities/flow-configs/billing_transaction_flow.config.d.ts +24 -0
- package/dist/src/entities/flow-configs/billing_transaction_flow.config.js +111 -0
- package/dist/src/entities/flow-configs/flow-config.type.d.ts +14 -0
- package/dist/src/entities/flow-configs/leave_flow.config.d.ts +7 -0
- package/dist/src/entities/flow-configs/leave_flow.config.js +117 -65
- package/dist/src/entities/flow-configs/moving_timesheet_flow.config.js +21 -8
- package/dist/src/entities/flow-configs/timesheet_flow.config.d.ts +5 -0
- package/dist/src/entities/flow-configs/timesheet_flow.config.js +420 -0
- package/dist/src/entities/flow-configs/vendor_flow.config.js +74 -60
- package/dist/src/entities/index.d.ts +11 -2
- package/dist/src/entities/index.js +11 -2
- package/dist/src/entities/interface/billing_profile.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/client_affiliate.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/client_quote_rate.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/document_upload.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/expense_type.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/field-constraint/billing_profile_field_constraints.interface.d.ts +2 -2
- package/dist/src/entities/interface/field-constraint/client_affiliate_field_constraints.interface.d.ts +1 -1
- package/dist/src/entities/interface/field-constraint/client_quote_rate_field_constraints.interface.d.ts +1 -1
- package/dist/src/entities/interface/field-constraint/document_upload_field_constraints.interface.d.ts +1 -1
- package/dist/src/entities/interface/field-constraint/expense_type_field_constraints.interface.d.ts +2 -2
- package/dist/src/entities/interface/field-constraint/office_location_field_constraints.interface.d.ts +3 -1
- package/dist/src/entities/interface/field-constraint/to_do_list_field_constraints.interface.d.ts +1 -1
- package/dist/src/entities/interface/intermediary_bank.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/office_location.entity.interface.d.ts +2 -0
- package/dist/src/entities/interface/to_do_list.entity.interface.d.ts +2 -0
- package/dist/src/entities/model/billing_profile.entity.model.d.ts +2 -0
- package/dist/src/entities/model/billing_profile.entity.model.js +2 -0
- package/dist/src/entities/model/client_affiliate.entity.model.d.ts +2 -1
- package/dist/src/entities/model/client_affiliate.entity.model.js +1 -0
- package/dist/src/entities/model/client_quote_rate.entity.model.d.ts +2 -0
- package/dist/src/entities/model/client_quote_rate.entity.model.js +2 -0
- package/dist/src/entities/model/document_upload.entity.model.d.ts +2 -0
- package/dist/src/entities/model/document_upload.entity.model.js +2 -0
- package/dist/src/entities/model/expense_type.entity.model.d.ts +2 -0
- package/dist/src/entities/model/expense_type.entity.model.js +2 -0
- package/dist/src/entities/model/intermediary_bank.entity.model.d.ts +2 -0
- package/dist/src/entities/model/intermediary_bank.entity.model.js +2 -0
- package/dist/src/entities/model/office_location.entity.model.d.ts +2 -0
- package/dist/src/entities/model/office_location.entity.model.js +2 -0
- package/dist/src/entities/model/to_do_list.entity.model.d.ts +2 -0
- package/dist/src/entities/model/to_do_list.entity.model.js +2 -0
- package/package.json +1 -1
- package/dist/src/entities/flow-configs/billing.flow.config.js +0 -209
- package/dist/src/entities/flow-configs/billing_transaction.flow.config.d.ts +0 -19
- 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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|