law-common 10.63.2 → 10.63.4-beta.0

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 (26) hide show
  1. package/dist/src/api/interface/vendor-invoice.entity.response.d.ts +5 -19
  2. package/dist/src/api/interface/vendor-invoice.entity.response.js +22 -0
  3. package/dist/src/api/interface/vendor_invoice.update.dto.interface.d.ts +2 -1
  4. package/dist/src/api/interface/vendor_invoice_item.update.dto.interface.d.ts +1 -4
  5. package/dist/src/api/interface/vendor_invoice_item.update.dto.interface.js +3 -0
  6. package/dist/src/entities/enums/vendor_invoice_action.enum.d.ts +3 -0
  7. package/dist/src/entities/enums/vendor_invoice_action.enum.js +7 -0
  8. package/dist/src/entities/enums/vendor_invoice_action_status_enum.d.ts +8 -6
  9. package/dist/src/entities/enums/vendor_invoice_action_status_enum.js +17 -10
  10. package/dist/src/entities/flow-configs/vendor-invoice-flow.config.d.ts +2 -11
  11. package/dist/src/entities/flow-configs/vendor-invoice-flow.config.js +192 -88
  12. package/dist/src/entities/interface/vendor_invoice.entity.interface.d.ts +5 -0
  13. package/dist/src/entities/interface/vendor_invoice_item.entity.interface.d.ts +5 -3
  14. package/dist/src/entities/model/vendor.entity.model.d.ts +17 -2
  15. package/dist/src/entities/model/vendor.entity.model.js +16 -1
  16. package/dist/src/entities/model/vendor_invoice.entity.model.d.ts +49 -0
  17. package/dist/src/entities/model/vendor_invoice.entity.model.js +90 -11
  18. package/dist/src/entities/model/vendor_invoice_item.entity.model.d.ts +20 -18
  19. package/dist/src/entities/model/vendor_invoice_item.entity.model.js +93 -66
  20. package/dist/src/utils/code.util.d.ts +2 -0
  21. package/dist/src/utils/code.util.js +4 -0
  22. package/dist/src/utils/models/date-code.model.util.d.ts +12 -0
  23. package/dist/src/utils/models/date-code.model.util.js +14 -0
  24. package/dist/src/utils/string.util.d.ts +11 -0
  25. package/dist/src/utils/string.util.js +11 -0
  26. package/package.json +3 -2
@@ -1,29 +1,15 @@
1
1
  import { IVendorInvoiceEntity, VendorInvoiceActionStatusEnum, VendorInvoiceItemEntityModel } from "../../entities";
2
2
  import { VendorInvoiceActionEnum } from "../../entities/enums/vendor_invoice_action.enum";
3
- import { VendorInvoiceItemActionEnum } from "../../entities/enums/vendor_invoice_item_action.enum";
4
- import { VendorInvoiceItemStatus } from "../../entities/enums/vendor_invoice_item_status.enum";
5
3
  export interface IVendorInvoiceFlowContextData {
6
4
  invoice: IVendorInvoiceEntity;
7
5
  items: VendorInvoiceItemEntityModel[];
8
6
  }
9
7
  export type IVendorInvoiceFlowConfig = {
10
- parent: {
11
- [key in VendorInvoiceActionStatusEnum]?: {
12
- actions: {
13
- [key in VendorInvoiceActionEnum]?: {
14
- permissions: string[];
15
- next?: (data: IVendorInvoiceFlowContextData) => VendorInvoiceActionStatusEnum;
16
- };
17
- };
18
- };
19
- };
20
- child: {
21
- [key in VendorInvoiceItemStatus]?: {
22
- actions: {
23
- [key in VendorInvoiceItemActionEnum]?: {
24
- permissions: string[];
25
- next?: () => VendorInvoiceItemStatus;
26
- };
8
+ [key in VendorInvoiceActionStatusEnum]?: {
9
+ actions: {
10
+ [key in VendorInvoiceActionEnum]?: {
11
+ permissions: string[];
12
+ next: () => VendorInvoiceActionStatusEnum;
27
13
  };
28
14
  };
29
15
  };
@@ -1,2 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ // export type IVendorInvoiceFlowConfig = {
4
+ // parent: {
5
+ // [key in VendorInvoiceActionStatusEnum]?: {
6
+ // actions: {
7
+ // [key in VendorInvoiceActionEnum]?: {
8
+ // permissions: string[];
9
+ // next?: (data: IVendorInvoiceFlowContextData) => VendorInvoiceActionStatusEnum;
10
+ // };
11
+ // };
12
+ // };
13
+ // };
14
+ // child: {
15
+ // [key in VendorInvoiceItemStatus]?: {
16
+ // actions: {
17
+ // [key in VendorInvoiceItemActionEnum]?: {
18
+ // permissions: string[];
19
+ // next?: () => VendorInvoiceItemStatus;
20
+ // };
21
+ // };
22
+ // };
23
+ // };
24
+ // };
@@ -1,10 +1,11 @@
1
- import { EntityEnum, EnumEntityType, VendorInvoiceActionEnum } from "../../entities";
1
+ import { EntityEnum, EnumEntityType, VendorInvoiceActionEnum, VendorInvoiceActionStatusEnum } from "../../entities";
2
2
  import { IDeleteDocumentDetails } from "../../misc";
3
3
  import { DeepPartialButRequired } from "./api.utils.interface";
4
4
  import { IVendorInvoiceCreateDto } from "./vendor_invoice.create.dto.interface";
5
5
  export type IVendorInvoiceUpdateDto = DeepPartialButRequired<IVendorInvoiceCreateDto, never> & {
6
6
  deleteDocumentDetails?: IDeleteDocumentDetails<EnumEntityType<EntityEnum.VENDOR_INVOICE>>;
7
7
  actionData: IVendorInvoiceActionDataDto;
8
+ actionStatus?: VendorInvoiceActionStatusEnum;
8
9
  };
9
10
  export interface IVendorInvoiceActionDataDto {
10
11
  action: VendorInvoiceActionEnum;
@@ -1,6 +1,3 @@
1
- import { VendorInvoiceItemActionEnum } from "../../entities";
2
1
  import { DeepPartialButRequired } from "./api.utils.interface";
3
2
  import { IVendorInvoiceItemCreateDto } from "./vendor_invoice_item.create.dto.interface";
4
- export type IVendorInvoiceItemUpdateDto = DeepPartialButRequired<IVendorInvoiceItemCreateDto, never> & {
5
- action?: VendorInvoiceItemActionEnum;
6
- };
3
+ export type IVendorInvoiceItemUpdateDto = DeepPartialButRequired<IVendorInvoiceItemCreateDto, never>;
@@ -1,2 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ // & {
4
+ // action?: VendorInvoiceItemActionEnum;
5
+ // };
@@ -2,5 +2,8 @@ export declare enum VendorInvoiceActionEnum {
2
2
  VIEW = "view",
3
3
  EDIT = "edit",
4
4
  DELETE = "delete",
5
+ CREATE = "create",
6
+ APPROVE = "approve",
7
+ REJECT = "reject",
5
8
  UPDATE_PAYMENT = "update_payment"
6
9
  }
@@ -6,5 +6,12 @@ var VendorInvoiceActionEnum;
6
6
  VendorInvoiceActionEnum["VIEW"] = "view";
7
7
  VendorInvoiceActionEnum["EDIT"] = "edit";
8
8
  VendorInvoiceActionEnum["DELETE"] = "delete";
9
+ VendorInvoiceActionEnum["CREATE"] = "create";
10
+ VendorInvoiceActionEnum["APPROVE"] = "approve";
11
+ VendorInvoiceActionEnum["REJECT"] = "reject";
9
12
  VendorInvoiceActionEnum["UPDATE_PAYMENT"] = "update_payment";
13
+ // RECALL = "recall",
14
+ // VIEW = "view",
15
+ // EDIT = "edit",
16
+ // DELETE = "delete",
10
17
  })(VendorInvoiceActionEnum || (exports.VendorInvoiceActionEnum = VendorInvoiceActionEnum = {}));
@@ -1,8 +1,10 @@
1
1
  export declare enum VendorInvoiceActionStatusEnum {
2
- PENDING_APPROVAL = "PENDING_APPROVAL",
3
- APPROVED = "APPROVED",
4
- REJECTED = "REJECTED",
5
- PARTIALLY_APPROVED = "PARTIALLY_APPROVED",
6
- PAYMENT_DISBURSE = "PAYMENT_DISBURSE",
7
- DELETED = "DELETED"
2
+ CREATE_APPROVAL = "create_approval",
3
+ EDIT_APPROVAL = "edit_approval",
4
+ DELETE_APPROVAL = "delete_approval",
5
+ REJECTED = "rejected",
6
+ APPROVED = "approved",
7
+ DELETED = "deleted",
8
+ RESOLVED_REJECTED = "resolved_rejected",
9
+ PAYMENT_DISBURSE = "payment_disburse"
8
10
  }
@@ -1,16 +1,23 @@
1
1
  "use strict";
2
- // export enum VendorInvoiceActionStatusEnum {
3
- // PENDING_APPROVAL = "PENDING_APPROVAL",
4
- // APPROVED = "APPROVED",
5
- // }
6
2
  Object.defineProperty(exports, "__esModule", { value: true });
7
3
  exports.VendorInvoiceActionStatusEnum = void 0;
8
4
  var VendorInvoiceActionStatusEnum;
9
5
  (function (VendorInvoiceActionStatusEnum) {
10
- VendorInvoiceActionStatusEnum["PENDING_APPROVAL"] = "PENDING_APPROVAL";
11
- VendorInvoiceActionStatusEnum["APPROVED"] = "APPROVED";
12
- VendorInvoiceActionStatusEnum["REJECTED"] = "REJECTED";
13
- VendorInvoiceActionStatusEnum["PARTIALLY_APPROVED"] = "PARTIALLY_APPROVED";
14
- VendorInvoiceActionStatusEnum["PAYMENT_DISBURSE"] = "PAYMENT_DISBURSE";
15
- VendorInvoiceActionStatusEnum["DELETED"] = "DELETED";
6
+ VendorInvoiceActionStatusEnum["CREATE_APPROVAL"] = "create_approval";
7
+ VendorInvoiceActionStatusEnum["EDIT_APPROVAL"] = "edit_approval";
8
+ VendorInvoiceActionStatusEnum["DELETE_APPROVAL"] = "delete_approval";
9
+ VendorInvoiceActionStatusEnum["REJECTED"] = "rejected";
10
+ VendorInvoiceActionStatusEnum["APPROVED"] = "approved";
11
+ VendorInvoiceActionStatusEnum["DELETED"] = "deleted";
12
+ VendorInvoiceActionStatusEnum["RESOLVED_REJECTED"] = "resolved_rejected";
13
+ VendorInvoiceActionStatusEnum["PAYMENT_DISBURSE"] = "payment_disburse";
14
+ // PENDING_APPROVAL = "PENDING_APPROVAL",
15
+ // APPROVED = "APPROVED",
16
+ // REJECTED = "REJECTED",
17
+ // PARTIALLY_APPROVED = "PARTIALLY_APPROVED",
18
+ // DELETED = "DELETED",
16
19
  })(VendorInvoiceActionStatusEnum || (exports.VendorInvoiceActionStatusEnum = VendorInvoiceActionStatusEnum = {}));
20
+ // export enum VendorInvoiceActionStatusEnum {
21
+ // PENDING_APPROVAL = "PENDING_APPROVAL",
22
+ // APPROVED = "APPROVED",
23
+ // }
@@ -1,11 +1,2 @@
1
- import { IVendorInvoiceFlowContextData } from "../../api";
2
- import { VendorInvoiceActionEnum } from "../enums/vendor_invoice_action.enum";
3
- import { VendorInvoiceActionStatusEnum } from "../enums/vendor_invoice_action_status_enum";
4
- import { VendorInvoiceItemActionEnum } from "../enums/vendor_invoice_item_action.enum";
5
- import { VendorInvoiceItemStatus } from "../enums/vendor_invoice_item_status.enum";
6
- import { FlowConfig, ParentChildFlowConfig } from "./flow-config.type";
7
- export type VendorInvoiceFlowConfig<S extends string, A extends string, CS extends string = never, CA extends string = never> = {
8
- parent?: FlowConfig<S, A>;
9
- child?: FlowConfig<CS, CA>;
10
- };
11
- export declare const vendorInvoiceConfigFlow: ParentChildFlowConfig<VendorInvoiceActionStatusEnum, VendorInvoiceActionEnum, VendorInvoiceItemStatus, VendorInvoiceItemActionEnum, IVendorInvoiceFlowContextData>;
1
+ import { IVendorInvoiceFlowConfig } from "../../api";
2
+ export declare const vendorInvoiceFlowConfig: IVendorInvoiceFlowConfig;
@@ -1,105 +1,209 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.vendorInvoiceConfigFlow = void 0;
3
+ exports.vendorInvoiceFlowConfig = void 0;
4
4
  const vendor_invoice_action_enum_1 = require("../enums/vendor_invoice_action.enum");
5
5
  const vendor_invoice_action_status_enum_1 = require("../enums/vendor_invoice_action_status_enum");
6
- const vendor_invoice_item_action_enum_1 = require("../enums/vendor_invoice_item_action.enum");
7
- const vendor_invoice_item_status_enum_1 = require("../enums/vendor_invoice_item_status.enum");
8
- exports.vendorInvoiceConfigFlow = {
9
- parent: {
10
- [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PENDING_APPROVAL]: {
11
- actions: {
12
- [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.EDIT]: {
13
- permissions: ["VENDOR_INVOICE_UPDATE"],
14
- next: (data) => {
15
- if (data && areAllVendorItemsInFinalState(data)) {
16
- if (areAllVendorItemsApproved(data)) {
17
- return vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.APPROVED;
18
- }
19
- if (areAllVendorItemsRejected(data)) {
20
- return vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.REJECTED;
21
- }
22
- // approved + deleted
23
- if (areAllVendorItemsInStates(data.items, [vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.APPROVED, vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.DELETED])) {
24
- return vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.APPROVED;
25
- }
26
- // rejected + deleted
27
- if (areAllVendorItemsInStates(data.items, [vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.REJECTED, vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.DELETED])) {
28
- return vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.REJECTED;
29
- }
30
- return vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PARTIALLY_APPROVED;
31
- }
32
- return vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PENDING_APPROVAL;
33
- },
34
- },
35
- [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.DELETE]: {
36
- permissions: ["VENDOR_INVOICE_UPDATE"],
37
- next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.DELETED,
38
- },
6
+ exports.vendorInvoiceFlowConfig = {
7
+ [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.CREATE_APPROVAL]: {
8
+ actions: {
9
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.APPROVE]: {
10
+ permissions: ["VENDOR_INVOICE_APPROVE"],
11
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.APPROVED,
12
+ },
13
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.EDIT]: {
14
+ permissions: ["VENDOR_INVOICE_UPDATE"],
15
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.CREATE_APPROVAL,
16
+ },
17
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.REJECT]: {
18
+ permissions: ["VENDOR_INVOICE_APPROVE"],
19
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.REJECTED,
20
+ },
21
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.DELETE]: {
22
+ permissions: ["VENDOR_INVOICE_UPDATE"],
23
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.DELETED,
39
24
  },
40
25
  },
41
- [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.APPROVED]: {
42
- actions: {
43
- [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.UPDATE_PAYMENT]: {
44
- permissions: ["VENDOR_INVOICE_PAYMENT_PROCESSOR"],
45
- next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PAYMENT_DISBURSE,
46
- },
26
+ },
27
+ [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.EDIT_APPROVAL]: {
28
+ actions: {
29
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.APPROVE]: {
30
+ permissions: ["VENDOR_INVOICE_APPROVE"],
31
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.APPROVED,
32
+ },
33
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.EDIT]: {
34
+ permissions: ["VENDOR_INVOICE_UPDATE"],
35
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.EDIT_APPROVAL,
36
+ },
37
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.REJECT]: {
38
+ permissions: ["VENDOR_INVOICE_APPROVE"],
39
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.RESOLVED_REJECTED,
47
40
  },
41
+ // [VendorInvoiceActionEnum.RECALL]: {
42
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
43
+ // next: () => VendorInvoiceActionStatusEnum.DELETED,
44
+ // },
48
45
  },
49
- [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PARTIALLY_APPROVED]: {
50
- actions: {
51
- [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.UPDATE_PAYMENT]: {
52
- permissions: ["VENDOR_INVOICE_PAYMENT_PROCESSOR"],
53
- next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PAYMENT_DISBURSE,
54
- },
46
+ },
47
+ [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.DELETE_APPROVAL]: {
48
+ actions: {
49
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.APPROVE]: {
50
+ permissions: ["VENDOR_INVOICE_APPROVE"],
51
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.DELETED,
52
+ },
53
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.REJECT]: {
54
+ permissions: ["VENDOR_INVOICE_APPROVE"],
55
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.RESOLVED_REJECTED,
55
56
  },
57
+ // [VendorInvoiceActionEnum.RECALL]: {
58
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
59
+ // next: () => VendorInvoiceActionStatusEnum.DELETED,
60
+ // },
56
61
  },
57
62
  },
58
- child: {
59
- [vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.PENDING]: {
60
- actions: {
61
- [vendor_invoice_item_action_enum_1.VendorInvoiceItemActionEnum.APPROVE]: {
62
- permissions: ["VENDOR_INVOICE_APPROVE"],
63
- next: () => vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.APPROVED,
64
- },
65
- [vendor_invoice_item_action_enum_1.VendorInvoiceItemActionEnum.PENDING]: {
66
- permissions: ["VENDOR_INVOICE_UPDATE"],
67
- next: () => vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.PENDING,
68
- },
69
- [vendor_invoice_item_action_enum_1.VendorInvoiceItemActionEnum.REJECT]: {
70
- permissions: ["VENDOR_INVOICE_APPROVE"],
71
- next: () => vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.REJECTED,
72
- },
73
- [vendor_invoice_item_action_enum_1.VendorInvoiceItemActionEnum.DELETE]: {
74
- permissions: ["VENDOR_INVOICE_UPDATE"],
75
- next: () => vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.DELETED,
76
- },
63
+ [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.APPROVED]: {
64
+ actions: {
65
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.EDIT]: {
66
+ permissions: ["VENDOR_INVOICE_UPDATE"],
67
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.EDIT_APPROVAL,
68
+ },
69
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.DELETE]: {
70
+ permissions: ["VENDOR_INVOICE_UPDATE"],
71
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.DELETE_APPROVAL,
72
+ },
73
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.UPDATE_PAYMENT]: {
74
+ permissions: ["VENDOR_INVOICE_UPDATE"],
75
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PAYMENT_DISBURSE,
77
76
  },
78
77
  },
79
- [vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.DELETED]: {
80
- actions: {
81
- [vendor_invoice_item_action_enum_1.VendorInvoiceItemActionEnum.PENDING]: {
82
- permissions: ["VENDOR_INVOICE_UPDATE"],
83
- next: () => vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.PENDING,
84
- },
78
+ },
79
+ [vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.RESOLVED_REJECTED]: {
80
+ actions: {
81
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.EDIT]: {
82
+ permissions: ["VENDOR_INVOICE_UPDATE"],
83
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.EDIT_APPROVAL,
84
+ },
85
+ [vendor_invoice_action_enum_1.VendorInvoiceActionEnum.DELETE]: {
86
+ permissions: ["VENDOR_INVOICE_UPDATE"],
87
+ next: () => vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.DELETE_APPROVAL,
85
88
  },
86
89
  },
87
90
  },
88
91
  };
89
- function areAllVendorItemsApproved(data) {
90
- const { items } = data;
91
- return items.length > 0 ? items.every((row) => row.status === vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.APPROVED) : false;
92
- }
93
- function areAllVendorItemsRejected(data) {
94
- const { items } = data;
95
- return items.length > 0 ? items.every((row) => row.status === vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.REJECTED) : false;
96
- }
97
- function areAllVendorItemsInFinalState(data) {
98
- const { items } = data;
99
- return items.length > 0
100
- ? items.every((row) => row.status === vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.APPROVED || row.status === vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.REJECTED || row.status === vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.DELETED)
101
- : false;
102
- }
103
- function areAllVendorItemsInStates(items, states) {
104
- return items.every((row) => states.includes(row.status));
105
- }
92
+ // import { IVendorInvoiceFlowContextData } from "../../api";
93
+ // import { VendorInvoiceActionEnum } from "../enums/vendor_invoice_action.enum";
94
+ // import { VendorInvoiceActionStatusEnum } from "../enums/vendor_invoice_action_status_enum";
95
+ // import { VendorInvoiceItemActionEnum } from "../enums/vendor_invoice_item_action.enum";
96
+ // import { VendorInvoiceItemStatus } from "../enums/vendor_invoice_item_status.enum";
97
+ // import { IVendorInvoiceItemEntity } from "../interface/vendor_invoice_item.entity.interface";
98
+ // import { FlowConfig, ParentChildFlowConfig } from "./flow-config.type";
99
+ // export type VendorInvoiceFlowConfig<S extends string, A extends string, CS extends string = never, CA extends string = never> = {
100
+ // parent?: FlowConfig<S, A>;
101
+ // child?: FlowConfig<CS, CA>;
102
+ // };
103
+ // export const vendorInvoiceConfigFlow: ParentChildFlowConfig<
104
+ // VendorInvoiceActionStatusEnum,
105
+ // VendorInvoiceActionEnum,
106
+ // VendorInvoiceItemStatus,
107
+ // VendorInvoiceItemActionEnum,
108
+ // IVendorInvoiceFlowContextData
109
+ // > = {
110
+ // parent: {
111
+ // [VendorInvoiceActionStatusEnum.PENDING_APPROVAL]: {
112
+ // actions: {
113
+ // [VendorInvoiceActionEnum.EDIT]: {
114
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
115
+ // next: (data?: IVendorInvoiceFlowContextData) => {
116
+ // if (data && areAllVendorItemsInFinalState(data)) {
117
+ // if (areAllVendorItemsApproved(data)) {
118
+ // return VendorInvoiceActionStatusEnum.APPROVED;
119
+ // }
120
+ // if (areAllVendorItemsRejected(data)) {
121
+ // return VendorInvoiceActionStatusEnum.REJECTED;
122
+ // }
123
+ // // approved + deleted
124
+ // if (areAllVendorItemsInStates(data.items, [VendorInvoiceItemStatus.APPROVED, VendorInvoiceItemStatus.DELETED])) {
125
+ // return VendorInvoiceActionStatusEnum.APPROVED;
126
+ // }
127
+ // // rejected + deleted
128
+ // if (areAllVendorItemsInStates(data.items, [VendorInvoiceItemStatus.REJECTED, VendorInvoiceItemStatus.DELETED])) {
129
+ // return VendorInvoiceActionStatusEnum.REJECTED;
130
+ // }
131
+ // return VendorInvoiceActionStatusEnum.PARTIALLY_APPROVED;
132
+ // }
133
+ // return VendorInvoiceActionStatusEnum.PENDING_APPROVAL;
134
+ // },
135
+ // },
136
+ // [VendorInvoiceActionEnum.DELETE]: {
137
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
138
+ // next: () => VendorInvoiceActionStatusEnum.DELETED,
139
+ // },
140
+ // },
141
+ // },
142
+ // [VendorInvoiceActionStatusEnum.APPROVED]: {
143
+ // actions: {
144
+ // [VendorInvoiceActionEnum.UPDATE_PAYMENT]: {
145
+ // permissions: ["VENDOR_INVOICE_PAYMENT_PROCESSOR"],
146
+ // next: () => VendorInvoiceActionStatusEnum.PAYMENT_DISBURSE,
147
+ // },
148
+ // },
149
+ // },
150
+ // [VendorInvoiceActionStatusEnum.PARTIALLY_APPROVED]: {
151
+ // actions: {
152
+ // [VendorInvoiceActionEnum.UPDATE_PAYMENT]: {
153
+ // permissions: ["VENDOR_INVOICE_PAYMENT_PROCESSOR"],
154
+ // next: () => VendorInvoiceActionStatusEnum.PAYMENT_DISBURSE,
155
+ // },
156
+ // },
157
+ // },
158
+ // },
159
+ // child: {
160
+ // [VendorInvoiceItemStatus.PENDING]: {
161
+ // actions: {
162
+ // [VendorInvoiceItemActionEnum.APPROVE]: {
163
+ // permissions: ["VENDOR_INVOICE_APPROVE"],
164
+ // next: () => VendorInvoiceItemStatus.APPROVED,
165
+ // },
166
+ // [VendorInvoiceItemActionEnum.PENDING]: {
167
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
168
+ // next: () => VendorInvoiceItemStatus.PENDING,
169
+ // },
170
+ // [VendorInvoiceItemActionEnum.REJECT]: {
171
+ // permissions: ["VENDOR_INVOICE_APPROVE"],
172
+ // next: () => VendorInvoiceItemStatus.REJECTED,
173
+ // },
174
+ // [VendorInvoiceItemActionEnum.DELETE]: {
175
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
176
+ // next: () => VendorInvoiceItemStatus.DELETED,
177
+ // },
178
+ // },
179
+ // },
180
+ // [VendorInvoiceItemStatus.DELETED]: {
181
+ // actions: {
182
+ // [VendorInvoiceItemActionEnum.PENDING]: {
183
+ // permissions: ["VENDOR_INVOICE_UPDATE"],
184
+ // next: () => VendorInvoiceItemStatus.PENDING,
185
+ // },
186
+ // },
187
+ // },
188
+ // },
189
+ // };
190
+ // function areAllVendorItemsApproved(data: IVendorInvoiceFlowContextData): boolean {
191
+ // const { items } = data;
192
+ // return items.length > 0 ? items.every((row) => row.status === VendorInvoiceItemStatus.APPROVED) : false;
193
+ // }
194
+ // function areAllVendorItemsRejected(data: IVendorInvoiceFlowContextData): boolean {
195
+ // const { items } = data;
196
+ // return items.length > 0 ? items.every((row) => row.status === VendorInvoiceItemStatus.REJECTED) : false;
197
+ // }
198
+ // function areAllVendorItemsInFinalState(data: IVendorInvoiceFlowContextData): boolean {
199
+ // const { items } = data;
200
+ // return items.length > 0
201
+ // ? items.every(
202
+ // (row) =>
203
+ // row.status === VendorInvoiceItemStatus.APPROVED || row.status === VendorInvoiceItemStatus.REJECTED || row.status === VendorInvoiceItemStatus.DELETED,
204
+ // )
205
+ // : false;
206
+ // }
207
+ // function areAllVendorItemsInStates(items: IVendorInvoiceItemEntity[], states: VendorInvoiceItemStatus[]): boolean {
208
+ // return items.every((row) => states.includes(row.status));
209
+ // }
@@ -15,4 +15,9 @@ export interface IVendorInvoiceEntity extends IEntityAuditColumn {
15
15
  voucherDate?: Nullable<number>;
16
16
  invoiceDocuments: string;
17
17
  remark: Nullable<string>;
18
+ totalBasicAmount: number;
19
+ totalInvoiceAmount: number;
20
+ totalGstAmount: number;
21
+ totalTdsAmount: number;
22
+ totalNetAmount: number;
18
23
  }
@@ -1,6 +1,5 @@
1
- import { VendorInvoiceItemStatus } from "../enums/vendor_invoice_item_status.enum";
2
1
  import { IEntityAuditColumn } from "./entity-audit-columns.interface";
3
- import { Nullable } from "./entity.utils.interface";
2
+ import { EntityEnum, EnumEntityType, IEntityFilterData, Nullable } from "./entity.utils.interface";
4
3
  export interface IVendorInvoiceItemEntity extends IEntityAuditColumn {
5
4
  id: number;
6
5
  vendorInvoiceId: number;
@@ -14,6 +13,9 @@ export interface IVendorInvoiceItemEntity extends IEntityAuditColumn {
14
13
  netAmount: number;
15
14
  quantity: number;
16
15
  rate: number;
17
- status: VendorInvoiceItemStatus;
18
16
  remark: Nullable<string>;
17
+ gstAmount: number;
18
+ tdsAmount: number;
19
+ }
20
+ export interface IVendorInvoiceItemEntityFilterData extends IEntityFilterData<EnumEntityType<EntityEnum.VENDOR_INVOICE_ITEM>> {
19
21
  }
@@ -2,6 +2,7 @@ import { EntityEnum, IEntityUpdateDto, Nullable } from "../interface/entity.util
2
2
  import { RelationConfigs } from "../interface/relation-config.interface";
3
3
  import { BaseEntityModel } from "./base.entity.model";
4
4
  import { IVendorActionDataDto } from "../../api";
5
+ import { VendorActionEnum } from "../enums/vendor-action.enum";
5
6
  import { VendorStatusEnum } from "../enums/vendor-status.enum";
6
7
  import { VendorContractApplicabilityEnum } from "../enums/vendor_contract_applicability_enum";
7
8
  import { VendorGstTypeEnum } from "../enums/vendor_gst_type_enum";
@@ -9,10 +10,9 @@ import { VendorLocationTypeEnum } from "../enums/vendor_location_type_enum";
9
10
  import { VendorPanTypeEnum } from "../enums/vendor_pan_type_enum";
10
11
  import { IUserEntity } from "../interface/user.entity.interface";
11
12
  import { IVendorEntity } from "../interface/vendor.entity.interface";
12
- import { OrganizationTypeEntityModel } from "./organization_type.entity.model";
13
13
  import { IRowActions } from "./interface/row-actions.interface";
14
+ import { OrganizationTypeEntityModel } from "./organization_type.entity.model";
14
15
  import { UserEntityModel } from "./user.entity.model";
15
- import { VendorActionEnum } from "../enums/vendor-action.enum";
16
16
  export declare class VendorEntityModel extends BaseEntityModel<EntityEnum.VENDOR> implements IVendorEntity {
17
17
  id: number;
18
18
  name: string;
@@ -42,6 +42,21 @@ export declare class VendorEntityModel extends BaseEntityModel<EntityEnum.VENDOR
42
42
  organizationType?: OrganizationTypeEntityModel;
43
43
  status: VendorStatusEnum;
44
44
  remark: Nullable<string>;
45
+ static readonly VENDOR_ENTITY_DOCUMENT_TYPES: readonly ["pan", "gst"];
46
+ /**
47
+ * Default number of days added to the Invoice Date to calculate the Due Date,
48
+ * used as a fallback when the Vendor does not have a `paymentDueDays` value configured.
49
+ *
50
+ * @formula
51
+ * DueDate = InvoiceDate + (vendor.paymentDueDays ?? VendorEntityModel.DEFAULT_DUE_DAYS)
52
+ *
53
+ * @example
54
+ * vendor.paymentDueDays = 30 → DueDate = InvoiceDate + 30
55
+ * vendor.paymentDueDays = null → DueDate = InvoiceDate + 7 (this constant)
56
+ *
57
+ * @see VendorEntityModel.paymentDueDays
58
+ */
59
+ static readonly DEFAULT_DUE_DAYS = 7;
45
60
  populateOrganizationTypeModel(organizationTypeEntityModels: OrganizationTypeEntityModel[]): null;
46
61
  getPanNoFourthCharacter(): string;
47
62
  static relationConfigs: RelationConfigs<[], EntityEnum.VENDOR>;
@@ -5,13 +5,13 @@ const entity_utils_interface_1 = require("../interface/entity.utils.interface");
5
5
  const base_entity_model_1 = require("./base.entity.model");
6
6
  const error_key_enum_1 = require("../../enums/error.key.enum");
7
7
  const exceptions_1 = require("../../exceptions");
8
+ const utils_1 = require("../../utils");
8
9
  const vendor_status_enum_1 = require("../enums/vendor-status.enum");
9
10
  const vendor_contract_applicability_enum_1 = require("../enums/vendor_contract_applicability_enum");
10
11
  const vendor_gst_type_enum_1 = require("../enums/vendor_gst_type_enum");
11
12
  const vendor_location_type_enum_1 = require("../enums/vendor_location_type_enum");
12
13
  const vendor_pan_type_enum_1 = require("../enums/vendor_pan_type_enum");
13
14
  const vendor_flow_config_1 = require("../flow-configs/vendor-flow.config");
14
- const utils_1 = require("../../utils");
15
15
  class VendorEntityModel extends base_entity_model_1.BaseEntityModel {
16
16
  constructor() {
17
17
  super(...arguments);
@@ -116,4 +116,19 @@ class VendorEntityModel extends base_entity_model_1.BaseEntityModel {
116
116
  }
117
117
  }
118
118
  exports.VendorEntityModel = VendorEntityModel;
119
+ VendorEntityModel.VENDOR_ENTITY_DOCUMENT_TYPES = ["pan", "gst"];
120
+ /**
121
+ * Default number of days added to the Invoice Date to calculate the Due Date,
122
+ * used as a fallback when the Vendor does not have a `paymentDueDays` value configured.
123
+ *
124
+ * @formula
125
+ * DueDate = InvoiceDate + (vendor.paymentDueDays ?? VendorEntityModel.DEFAULT_DUE_DAYS)
126
+ *
127
+ * @example
128
+ * vendor.paymentDueDays = 30 → DueDate = InvoiceDate + 30
129
+ * vendor.paymentDueDays = null → DueDate = InvoiceDate + 7 (this constant)
130
+ *
131
+ * @see VendorEntityModel.paymentDueDays
132
+ */
133
+ VendorEntityModel.DEFAULT_DUE_DAYS = 7;
119
134
  VendorEntityModel.relationConfigs = [];
@@ -29,6 +29,11 @@ export declare class VendorInvoiceEntityModel extends BaseEntityModel<EntityEnum
29
29
  updatedOn: number;
30
30
  createdBy: number;
31
31
  updatedBy: number;
32
+ totalBasicAmount: number;
33
+ totalInvoiceAmount: number;
34
+ totalGstAmount: number;
35
+ totalTdsAmount: number;
36
+ totalNetAmount: number;
32
37
  vendor?: VendorEntityModel;
33
38
  officeLocation?: OfficeLocationEntityModel;
34
39
  vendorInvoiceItems?: VendorInvoiceItemEntityModel[];
@@ -61,4 +66,48 @@ export declare class VendorInvoiceEntityModel extends BaseEntityModel<EntityEnum
61
66
  static getTotalNetAmount<T extends {
62
67
  netAmount: number;
63
68
  }>(data: T[]): number;
69
+ /**
70
+ * Generates the next sequential voucher number for a new Vendor Invoice.
71
+ *
72
+ * @format
73
+ * `<FY-1><FY><MM><DD><###>`
74
+ *
75
+ * Where:
76
+ * - `<FY-1><FY>` — 4-digit financial year code (e.g., "2526" for FY 2025–26)
77
+ * - `<MM>` — 2-digit month of today's date (e.g., "03" for March)
78
+ * - `<DD>` — 2-digit day of today's date (e.g., "27" for 27th)
79
+ * - `<###>` — 3-digit sequence number, continuous within the FY (001–999)
80
+ *
81
+ * @sequence
82
+ * The sequence (`###`) is FY-scoped — it does NOT reset daily or monthly.
83
+ * It only resets when the Financial Year changes.
84
+ * The next number is always `max(existing sequences in current FY) + 1`.
85
+ *
86
+ * @example
87
+ * // Today: 27 March 2026 (FY 2025–26 → fyCode = "2526")
88
+ * // Existing vouchers this FY: ["25260326001", "25260326002", "25260120003"]
89
+ * // maxSequence = 3
90
+ * // Result:
91
+ * getNextVoucherNumber(existingInvoices) // → "25260327004"
92
+ *
93
+ * @example
94
+ * // Today: 27 March 2026, No existing vouchers in FY 2025–26
95
+ * // Result:
96
+ * getNextVoucherNumber([]) // → "25260327001"
97
+ *
98
+ * @example
99
+ * // FY changes: Today: 01 April 2026 (FY 2026–27 → fyCode = "2627")
100
+ * // Existing vouchers: ["25260327999"] (from previous FY, ignored)
101
+ * // Result:
102
+ * getNextVoucherNumber(existingInvoices) // → "26270401001" (sequence resets)
103
+ *
104
+ * @throws {Error} If the sequence reaches 999 within the same FY
105
+ *
106
+ * @param existingVendorInvoices - All existing VendorInvoiceEntityModel instances.
107
+ * Invoices with undefined/null voucherNo are automatically skipped.
108
+ * Invoices from previous FYs are automatically ignored.
109
+ *
110
+ * @returns The next voucher number string in format `<FY-1><FY><MM><DD><###>`
111
+ */
112
+ static getNextVoucherNumber(existingVendorInvoices: VendorInvoiceEntityModel[]): string;
64
113
  }
@@ -21,12 +21,17 @@ class VendorInvoiceEntityModel extends base_entity_model_1.BaseEntityModel {
21
21
  this.invoiceDate = 0;
22
22
  this.invoiceDocuments = "";
23
23
  this.status = vendor_invoice_status_enum_1.VendorInvoiceStatusEnum.PENDING;
24
- this.actionStatus = vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PENDING_APPROVAL;
24
+ this.actionStatus = vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.CREATE_APPROVAL;
25
25
  this.remark = null;
26
26
  this.createdOn = 0;
27
27
  this.updatedOn = 0;
28
28
  this.createdBy = 0;
29
29
  this.updatedBy = 0;
30
+ this.totalBasicAmount = 0;
31
+ this.totalInvoiceAmount = 0;
32
+ this.totalGstAmount = 0;
33
+ this.totalTdsAmount = 0;
34
+ this.totalNetAmount = 0;
30
35
  }
31
36
  static fromEntity(entity) {
32
37
  const result = new VendorInvoiceEntityModel(entity_utils_interface_1.EntityEnum.VENDOR_INVOICE);
@@ -37,8 +42,7 @@ class VendorInvoiceEntityModel extends base_entity_model_1.BaseEntityModel {
37
42
  return this.constructor.prototype.constructor.relationConfigs || [];
38
43
  }
39
44
  getNextStatusForParent(currentUser, dto) {
40
- var _a;
41
- const flowForStatus = (_a = vendor_invoice_flow_config_1.vendorInvoiceConfigFlow.parent) === null || _a === void 0 ? void 0 : _a[this.actionStatus];
45
+ const flowForStatus = vendor_invoice_flow_config_1.vendorInvoiceFlowConfig[this.actionStatus];
42
46
  if (!flowForStatus) {
43
47
  throw new exceptions_1.AppBadRequestException({
44
48
  key: error_key_enum_1.ErrorKeyEnum.STATUS,
@@ -74,20 +78,20 @@ class VendorInvoiceEntityModel extends base_entity_model_1.BaseEntityModel {
74
78
  message: [`Vendor invoice items are required for getting next status of Vendor Invoice.`],
75
79
  });
76
80
  }
77
- const contextFlowData = {
78
- invoice: this,
79
- items: this.vendorInvoiceItems,
80
- };
81
- let nextStatus = vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.PENDING_APPROVAL;
81
+ // const contextFlowData: IVendorInvoiceFlowContextData = {
82
+ // invoice: this,
83
+ // items: this.vendorInvoiceItems,
84
+ // };
85
+ let nextStatus = vendor_invoice_action_status_enum_1.VendorInvoiceActionStatusEnum.CREATE_APPROVAL;
82
86
  if (matchingPermissionConfig.next) {
83
- nextStatus = matchingPermissionConfig.next(contextFlowData);
87
+ nextStatus = matchingPermissionConfig.next();
84
88
  }
85
89
  return nextStatus;
86
90
  }
87
91
  getAvailableActions(currentUser, config) {
88
92
  var _a;
89
93
  const params = {
90
- flowConfig: vendor_invoice_flow_config_1.vendorInvoiceConfigFlow.parent,
94
+ flowConfig: vendor_invoice_flow_config_1.vendorInvoiceFlowConfig,
91
95
  currentStatus: this.actionStatus,
92
96
  userPermissions: (_a = currentUser.permissions) !== null && _a !== void 0 ? _a : [],
93
97
  visibilityData: this.getUpdateActionVisibility.bind(this, currentUser),
@@ -100,7 +104,6 @@ class VendorInvoiceEntityModel extends base_entity_model_1.BaseEntityModel {
100
104
  return {};
101
105
  }
102
106
  static getTotalBasicAmount(data) {
103
- // console.log("data", data);
104
107
  return data.reduce((acc, item) => acc + item.basicAmount, 0);
105
108
  }
106
109
  static getTotalInvoiceAmount(data) {
@@ -115,6 +118,82 @@ class VendorInvoiceEntityModel extends base_entity_model_1.BaseEntityModel {
115
118
  static getTotalNetAmount(data) {
116
119
  return data.reduce((acc, item) => acc + item.netAmount, 0);
117
120
  }
121
+ /**
122
+ * Generates the next sequential voucher number for a new Vendor Invoice.
123
+ *
124
+ * @format
125
+ * `<FY-1><FY><MM><DD><###>`
126
+ *
127
+ * Where:
128
+ * - `<FY-1><FY>` — 4-digit financial year code (e.g., "2526" for FY 2025–26)
129
+ * - `<MM>` — 2-digit month of today's date (e.g., "03" for March)
130
+ * - `<DD>` — 2-digit day of today's date (e.g., "27" for 27th)
131
+ * - `<###>` — 3-digit sequence number, continuous within the FY (001–999)
132
+ *
133
+ * @sequence
134
+ * The sequence (`###`) is FY-scoped — it does NOT reset daily or monthly.
135
+ * It only resets when the Financial Year changes.
136
+ * The next number is always `max(existing sequences in current FY) + 1`.
137
+ *
138
+ * @example
139
+ * // Today: 27 March 2026 (FY 2025–26 → fyCode = "2526")
140
+ * // Existing vouchers this FY: ["25260326001", "25260326002", "25260120003"]
141
+ * // maxSequence = 3
142
+ * // Result:
143
+ * getNextVoucherNumber(existingInvoices) // → "25260327004"
144
+ *
145
+ * @example
146
+ * // Today: 27 March 2026, No existing vouchers in FY 2025–26
147
+ * // Result:
148
+ * getNextVoucherNumber([]) // → "25260327001"
149
+ *
150
+ * @example
151
+ * // FY changes: Today: 01 April 2026 (FY 2026–27 → fyCode = "2627")
152
+ * // Existing vouchers: ["25260327999"] (from previous FY, ignored)
153
+ * // Result:
154
+ * getNextVoucherNumber(existingInvoices) // → "26270401001" (sequence resets)
155
+ *
156
+ * @throws {Error} If the sequence reaches 999 within the same FY
157
+ *
158
+ * @param existingVendorInvoices - All existing VendorInvoiceEntityModel instances.
159
+ * Invoices with undefined/null voucherNo are automatically skipped.
160
+ * Invoices from previous FYs are automatically ignored.
161
+ *
162
+ * @returns The next voucher number string in format `<FY-1><FY><MM><DD><###>`
163
+ */
164
+ static getNextVoucherNumber(existingVendorInvoices) {
165
+ // Always use today's date
166
+ const today = new Date();
167
+ // Get FY code e.g. "2526"
168
+ const fyCode = utils_1.DateCodeModel.getFinancialYearCode(today);
169
+ // Get MM and DD from today
170
+ const month = String(today.getMonth() + 1).padStart(2, "0");
171
+ const day = String(today.getDate()).padStart(2, "0");
172
+ // Base prefix e.g. "25260327"
173
+ const basePrefix = `${fyCode}${month}${day}`;
174
+ // Filter out undefined/null voucherNo AND filter only same FY
175
+ const matchingVoucherNumbers = existingVendorInvoices
176
+ .map((invoice) => invoice.voucherNo)
177
+ .filter((voucherNo) => !!voucherNo && voucherNo.startsWith(fyCode));
178
+ if (matchingVoucherNumbers.length === 0) {
179
+ return `${basePrefix}001`;
180
+ }
181
+ // Extract sequence numbers from ALL vouchers in this FY
182
+ const sequences = matchingVoucherNumbers
183
+ .map((voucherNo) => {
184
+ const match = voucherNo.match(/(\d{3})$/);
185
+ return match ? parseInt(match[1], 10) : null;
186
+ })
187
+ .filter((seq) => seq !== null);
188
+ if (sequences.length === 0) {
189
+ return `${basePrefix}001`;
190
+ }
191
+ const maxSequence = Math.max(...sequences);
192
+ if (maxSequence >= 999) {
193
+ throw new Error(`Voucher number sequence exhausted for FY ${fyCode}`);
194
+ }
195
+ return `${basePrefix}${String(maxSequence + 1).padStart(3, "0")}`;
196
+ }
118
197
  }
119
198
  exports.VendorInvoiceEntityModel = VendorInvoiceEntityModel;
120
199
  VendorInvoiceEntityModel.relationConfigs = [
@@ -2,17 +2,21 @@ import { EntityEnum, Nullable } from "../interface/entity.utils.interface";
2
2
  import { RelationConfigs } from "../interface/relation-config.interface";
3
3
  import { BaseEntityModel } from "./base.entity.model";
4
4
  import { IVendorInvoiceItemEntity } from "../interface/vendor_invoice_item.entity.interface";
5
- import { IVendorInvoiceItemUpdateDto } from "../../api";
6
- import { VendorInvoiceItemStatus } from "../enums/vendor_invoice_item_status.enum";
7
- import { IUserEntity } from "../interface/user.entity.interface";
5
+ import { IGstRateEntity } from "../interface/gst_rate.entity.interface";
6
+ import { ITdsRateEntity } from "../interface/tds_rate.entity.interface";
7
+ import { IVendorEntity } from "../interface/vendor.entity.interface";
8
8
  import { ExpenseHeadEntityModel } from "./expense_head.entity.model";
9
9
  import { GstRateEntityModel } from "./gst_rate.entity.model";
10
10
  import { TdsRateEntityModel } from "./tds_rate.entity.model";
11
+ import { VendorEntityModel } from "./vendor.entity.model";
11
12
  import { VendorInvoiceEntityModel } from "./vendor_invoice.entity.model";
12
13
  import { VoucherTypeEntityModel } from "./voucher_type.entity.model";
13
- import { UserEntityModel } from "./user.entity.model";
14
- import { VendorInvoiceItemActionEnum } from "../enums/vendor_invoice_item_action.enum";
15
- import { IRowActions } from "./interface/row-actions.interface";
14
+ export interface IVendorInvoiceItemEntityAmounts {
15
+ gstAmount: number;
16
+ tdsAmount: number;
17
+ invoiceAmount: number;
18
+ netAmount: number;
19
+ }
16
20
  export declare class VendorInvoiceItemEntityModel extends BaseEntityModel<EntityEnum.VENDOR_INVOICE_ITEM> implements IVendorInvoiceItemEntity {
17
21
  id: number;
18
22
  vendorInvoiceId: number;
@@ -26,8 +30,9 @@ export declare class VendorInvoiceItemEntityModel extends BaseEntityModel<Entity
26
30
  netAmount: number;
27
31
  quantity: number;
28
32
  rate: number;
29
- status: VendorInvoiceItemStatus;
30
33
  remark: Nullable<string>;
34
+ gstAmount: number;
35
+ tdsAmount: number;
31
36
  createdOn: number;
32
37
  updatedOn: number;
33
38
  createdBy: number;
@@ -46,15 +51,12 @@ export declare class VendorInvoiceItemEntityModel extends BaseEntityModel<Entity
46
51
  ], EntityEnum.VENDOR_INVOICE_ITEM>;
47
52
  static fromEntity(entity: IVendorInvoiceItemEntity): VendorInvoiceItemEntityModel;
48
53
  getRelationConfigs(): any[];
49
- getNextStatus(dto: IVendorInvoiceItemUpdateDto, currentUser: IUserEntity): VendorInvoiceItemStatus;
50
- getAvailableActions(currentUser: UserEntityModel, config?: {
51
- combinedActions?: Record<string, {
52
- combineActions: VendorInvoiceItemActionEnum[];
53
- label: string;
54
- }>;
55
- customLabels?: Partial<Record<VendorInvoiceItemActionEnum, string>>;
56
- }): IRowActions<EntityEnum.VENDOR_INVOICE_ITEM>[];
57
- getUpdateActionVisibility(currentUser: UserEntityModel): {
58
- [key: string]: () => boolean;
59
- };
54
+ static calculateAmounts(params: {
55
+ basicAmount: number;
56
+ gstRateEntity: IGstRateEntity;
57
+ tdsRateEntity: ITdsRateEntity;
58
+ vendorEntity: VendorEntityModel;
59
+ }): IVendorInvoiceItemEntityAmounts;
60
+ static tdsRate(vendorEntity: IVendorEntity, tdsRateEntity: ITdsRateEntity): number;
61
+ static AMOUNT_KEYS: (keyof IVendorInvoiceItemEntityAmounts)[];
60
62
  }
@@ -4,11 +4,7 @@ exports.VendorInvoiceItemEntityModel = void 0;
4
4
  const relation_type_enum_1 = require("../enums/relation-type.enum");
5
5
  const entity_utils_interface_1 = require("../interface/entity.utils.interface");
6
6
  const base_entity_model_1 = require("./base.entity.model");
7
- const error_key_enum_1 = require("../../enums/error.key.enum");
8
- const exceptions_1 = require("../../exceptions");
9
- const vendor_invoice_item_status_enum_1 = require("../enums/vendor_invoice_item_status.enum");
10
- const utils_1 = require("../../utils");
11
- const vendor_invoice_flow_config_1 = require("../flow-configs/vendor-invoice-flow.config");
7
+ const vendor_pan_type_enum_1 = require("../enums/vendor_pan_type_enum");
12
8
  class VendorInvoiceItemEntityModel extends base_entity_model_1.BaseEntityModel {
13
9
  constructor() {
14
10
  super(...arguments);
@@ -24,12 +20,42 @@ class VendorInvoiceItemEntityModel extends base_entity_model_1.BaseEntityModel {
24
20
  this.netAmount = 0;
25
21
  this.quantity = 0;
26
22
  this.rate = 0;
27
- this.status = vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.PENDING;
23
+ // status: VendorInvoiceItemStatus = VendorInvoiceItemStatus.PENDING;
28
24
  this.remark = null;
25
+ this.gstAmount = 0;
26
+ this.tdsAmount = 0;
29
27
  this.createdOn = 0;
30
28
  this.updatedOn = 0;
31
29
  this.createdBy = 0;
32
30
  this.updatedBy = 0;
31
+ // getAvailableActions(
32
+ // currentUser: UserEntityModel,
33
+ // config?: {
34
+ // combinedActions?: Record<
35
+ // string,
36
+ // {
37
+ // combineActions: VendorInvoiceItemActionEnum[];
38
+ // label: string;
39
+ // }
40
+ // >;
41
+ // customLabels?: Partial<Record<VendorInvoiceItemActionEnum, string>>;
42
+ // },
43
+ // ): IRowActions<EntityEnum.VENDOR_INVOICE_ITEM>[] {
44
+ // const params = {
45
+ // flowConfig: vendorInvoiceConfigFlow.child,
46
+ // currentStatus: this.status,
47
+ // userPermissions: currentUser.permissions ?? [],
48
+ // visibilityData: this.getUpdateActionVisibility.bind(this, currentUser),
49
+ // combinedActions: config?.combinedActions,
50
+ // customLabels: config?.customLabels,
51
+ // };
52
+ // return EntityActionFlowResolverV2.getAvailableActionsData(params);
53
+ // }
54
+ // getUpdateActionVisibility(currentUser: UserEntityModel): {
55
+ // [key: string]: () => boolean;
56
+ // } {
57
+ // return {};
58
+ // }
33
59
  }
34
60
  static fromEntity(entity) {
35
61
  const result = new VendorInvoiceItemEntityModel(entity_utils_interface_1.EntityEnum.VENDOR_INVOICE_ITEM);
@@ -39,68 +65,68 @@ class VendorInvoiceItemEntityModel extends base_entity_model_1.BaseEntityModel {
39
65
  getRelationConfigs() {
40
66
  return this.constructor.prototype.constructor.relationConfigs || [];
41
67
  }
42
- getNextStatus(dto, currentUser) {
43
- var _a;
44
- // const flow = vendorInvoiceConfigFlow as FlowConfig<
45
- // VendorInvoiceActionStatusEnum,
46
- // VendorInvoiceActionEnum,
47
- // VendorInvoiceItemStatus,
48
- // VendorInvoiceItemActionEnum
49
- // >;
50
- // const flowForStatus = flow.child[this.status];
51
- const flowForStatus = (_a = vendor_invoice_flow_config_1.vendorInvoiceConfigFlow.child) === null || _a === void 0 ? void 0 : _a[this.status];
52
- if (!flowForStatus) {
53
- throw new exceptions_1.AppBadRequestException({
54
- key: error_key_enum_1.ErrorKeyEnum.STATUS,
55
- message: [`Status not found: ${this.status}`],
56
- });
57
- }
58
- if (!(dto === null || dto === void 0 ? void 0 : dto.action)) {
59
- throw new exceptions_1.AppBadRequestException({
60
- key: error_key_enum_1.ErrorKeyEnum.ACTION_DATA,
61
- message: ["dto.actionData is required"],
62
- });
63
- }
64
- const matchingPermissionConfig = flowForStatus.actions[dto.action];
65
- if (!matchingPermissionConfig) {
66
- throw new exceptions_1.AppBadRequestException({
67
- key: error_key_enum_1.ErrorKeyEnum.ACTION,
68
- message: [`Action '${dto.action}' is not valid for the current status.`],
69
- });
70
- }
71
- if (!currentUser.permissions || currentUser.permissions.length === 0) {
72
- throw new exceptions_1.AppBadRequestException({
73
- key: error_key_enum_1.ErrorKeyEnum.PERMISSIONS,
74
- message: ["Permission not available for currentUser"],
75
- });
76
- }
77
- const hasPermission = matchingPermissionConfig.permissions.some((permission) => { var _a; return (_a = currentUser.permissions) === null || _a === void 0 ? void 0 : _a.includes(permission); });
78
- if (!hasPermission) {
79
- throw new exceptions_1.AppBadRequestException({
80
- key: error_key_enum_1.ErrorKeyEnum.PERMISSION,
81
- message: [`Current user does not have permission to ${dto.action} vendor`],
82
- });
83
- }
84
- let nextStatus = vendor_invoice_item_status_enum_1.VendorInvoiceItemStatus.PENDING;
85
- if (matchingPermissionConfig.next) {
86
- nextStatus = matchingPermissionConfig.next();
87
- }
88
- return nextStatus;
89
- }
90
- getAvailableActions(currentUser, config) {
91
- var _a;
92
- const params = {
93
- flowConfig: vendor_invoice_flow_config_1.vendorInvoiceConfigFlow.child,
94
- currentStatus: this.status,
95
- userPermissions: (_a = currentUser.permissions) !== null && _a !== void 0 ? _a : [],
96
- visibilityData: this.getUpdateActionVisibility.bind(this, currentUser),
97
- combinedActions: config === null || config === void 0 ? void 0 : config.combinedActions,
98
- customLabels: config === null || config === void 0 ? void 0 : config.customLabels,
68
+ // getNextStatus(dto: IVendorInvoiceItemUpdateDto, currentUser: IUserEntity): VendorInvoiceItemStatus {
69
+ // // const flow = vendorInvoiceConfigFlow as FlowConfig<
70
+ // // VendorInvoiceActionStatusEnum,
71
+ // // VendorInvoiceActionEnum,
72
+ // // VendorInvoiceItemStatus,
73
+ // // VendorInvoiceItemActionEnum
74
+ // // >;
75
+ // // const flowForStatus = flow.child[this.status];
76
+ // const flowForStatus = vendorInvoiceConfigFlow.child?.[this.status];
77
+ // if (!flowForStatus) {
78
+ // throw new AppBadRequestException({
79
+ // key: ErrorKeyEnum.STATUS,
80
+ // message: [`Status not found: ${this.status}`],
81
+ // });
82
+ // }
83
+ // if (!dto?.action) {
84
+ // throw new AppBadRequestException({
85
+ // key: ErrorKeyEnum.ACTION_DATA,
86
+ // message: ["dto.actionData is required"],
87
+ // });
88
+ // }
89
+ // const matchingPermissionConfig = flowForStatus.actions[dto.action];
90
+ // if (!matchingPermissionConfig) {
91
+ // throw new AppBadRequestException({
92
+ // key: ErrorKeyEnum.ACTION,
93
+ // message: [`Action '${dto.action}' is not valid for the current status.`],
94
+ // });
95
+ // }
96
+ // if (!currentUser.permissions || currentUser.permissions.length === 0) {
97
+ // throw new AppBadRequestException({
98
+ // key: ErrorKeyEnum.PERMISSIONS,
99
+ // message: ["Permission not available for currentUser"],
100
+ // });
101
+ // }
102
+ // const hasPermission = matchingPermissionConfig.permissions.some((permission: string) => currentUser.permissions?.includes(permission));
103
+ // if (!hasPermission) {
104
+ // throw new AppBadRequestException({
105
+ // key: ErrorKeyEnum.PERMISSION,
106
+ // message: [`Current user does not have permission to ${dto.action} vendor`],
107
+ // });
108
+ // }
109
+ // let nextStatus: VendorInvoiceItemStatus = VendorInvoiceItemStatus.PENDING;
110
+ // if (matchingPermissionConfig.next) {
111
+ // nextStatus = matchingPermissionConfig.next();
112
+ // }
113
+ // return nextStatus;
114
+ // }
115
+ static calculateAmounts(params) {
116
+ const { basicAmount, gstRateEntity, tdsRateEntity, vendorEntity } = params;
117
+ const gstAmount = basicAmount * (gstRateEntity.rate / 100);
118
+ const tdsAmount = basicAmount * (VendorInvoiceItemEntityModel.tdsRate(vendorEntity, tdsRateEntity) / 100);
119
+ const invoiceAmount = basicAmount + gstAmount;
120
+ const netAmount = invoiceAmount - tdsAmount;
121
+ return {
122
+ gstAmount,
123
+ tdsAmount,
124
+ invoiceAmount,
125
+ netAmount,
99
126
  };
100
- return utils_1.EntityActionFlowResolverV2.getAvailableActionsData(params);
101
127
  }
102
- getUpdateActionVisibility(currentUser) {
103
- return {};
128
+ static tdsRate(vendorEntity, tdsRateEntity) {
129
+ return vendorEntity.panType === vendor_pan_type_enum_1.VendorPanTypeEnum.AVAILABLE ? tdsRateEntity.panAvailableRate : tdsRateEntity.panNotAvailableRate;
104
130
  }
105
131
  }
106
132
  exports.VendorInvoiceItemEntityModel = VendorInvoiceItemEntityModel;
@@ -151,3 +177,4 @@ VendorInvoiceItemEntityModel.relationConfigs = [
151
177
  },
152
178
  },
153
179
  ];
180
+ VendorInvoiceItemEntityModel.AMOUNT_KEYS = ["gstAmount", "tdsAmount", "netAmount", "invoiceAmount"];
@@ -3,8 +3,10 @@ export declare class CodeValidatorUtil {
3
3
  static readonly TAN_REGEX: RegExp;
4
4
  static readonly GST_REGEX: RegExp;
5
5
  static readonly ADDHAR_REGEX: RegExp;
6
+ static readonly IFSC_REGEX: RegExp;
6
7
  static isValidPAN(value: string): boolean;
7
8
  static isValidTAN(value: string): boolean;
8
9
  static isValidGST(value: string): boolean;
9
10
  static isValidAddhar(value: string): boolean;
11
+ static isValidateIFSCCode(value: string): boolean;
10
12
  }
@@ -15,6 +15,9 @@ class CodeValidatorUtil {
15
15
  static isValidAddhar(value) {
16
16
  return this.ADDHAR_REGEX.test(value);
17
17
  }
18
+ static isValidateIFSCCode(value) {
19
+ return this.IFSC_REGEX.test(value === null || value === void 0 ? void 0 : value.toUpperCase());
20
+ }
18
21
  }
19
22
  exports.CodeValidatorUtil = CodeValidatorUtil;
20
23
  // ---- private constants ----
@@ -22,3 +25,4 @@ CodeValidatorUtil.PAN_REGEX = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
22
25
  CodeValidatorUtil.TAN_REGEX = /^[A-Z]{4}[0-9]{5}[A-Z]{1}$/;
23
26
  CodeValidatorUtil.GST_REGEX = /^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/;
24
27
  CodeValidatorUtil.ADDHAR_REGEX = /^[2-9]{1}[0-9]{3}[0-9]{4}[0-9]{4}$/;
28
+ CodeValidatorUtil.IFSC_REGEX = /^[A-Z]{4}0[A-Z0-9]{6}$/;
@@ -63,4 +63,16 @@ export declare class DateCodeModel {
63
63
  currFY: string;
64
64
  };
65
65
  static getCurrentTimestampCode(): string;
66
+ /**
67
+ * Creates a DateCodeModel instance directly from a JavaScript Date object.
68
+ * Internally formats the date to "yyyyMMdd" and constructs the model.
69
+ *
70
+ * @param date - A valid JavaScript Date object
71
+ * @returns A new DateCodeModel instance representing the given date
72
+ *
73
+ * @example
74
+ * const model = DateCodeModel.fromDateObject(new Date('2025-01-01'));
75
+ * // equivalent to: new DateCodeModel(DateCodeModel.fromDate(new Date('2025-01-01')))
76
+ */
77
+ static fromDateObject(date: Date): DateCodeModel;
66
78
  }
@@ -316,5 +316,19 @@ class DateCodeModel {
316
316
  const minutes = String(nowIST.getUTCMinutes()).padStart(2, "0");
317
317
  return `${year}${month}${day} ${hours}${minutes}`;
318
318
  }
319
+ /**
320
+ * Creates a DateCodeModel instance directly from a JavaScript Date object.
321
+ * Internally formats the date to "yyyyMMdd" and constructs the model.
322
+ *
323
+ * @param date - A valid JavaScript Date object
324
+ * @returns A new DateCodeModel instance representing the given date
325
+ *
326
+ * @example
327
+ * const model = DateCodeModel.fromDateObject(new Date('2025-01-01'));
328
+ * // equivalent to: new DateCodeModel(DateCodeModel.fromDate(new Date('2025-01-01')))
329
+ */
330
+ static fromDateObject(date) {
331
+ return new DateCodeModel(DateCodeModel.fromDate(date));
332
+ }
319
333
  }
320
334
  exports.DateCodeModel = DateCodeModel;
@@ -34,4 +34,15 @@ export declare function toTitleCase(input: string): string;
34
34
  * @returns A title-cased, space-separated string
35
35
  */
36
36
  export declare function camelCaseToTitle(input: string): string;
37
+ /**
38
+ * Capitalizes the first character of a string.
39
+ *
40
+ * @param str - The string to capitalize
41
+ * @returns The string with its first character uppercased
42
+ *
43
+ * @example
44
+ * capitalizeFirstWord('basicAmount') // 'BasicAmount'
45
+ * capitalizeFirstWord('totalNetAmount') // 'TotalNetAmount'
46
+ * capitalizeFirstWord('') // ''
47
+ */
37
48
  export declare function capitalizeFirstWord(str: string): string;
@@ -67,6 +67,17 @@ function camelCaseToTitle(input) {
67
67
  // capitalize first letter
68
68
  .replace(/^./, (char) => char.toUpperCase()));
69
69
  }
70
+ /**
71
+ * Capitalizes the first character of a string.
72
+ *
73
+ * @param str - The string to capitalize
74
+ * @returns The string with its first character uppercased
75
+ *
76
+ * @example
77
+ * capitalizeFirstWord('basicAmount') // 'BasicAmount'
78
+ * capitalizeFirstWord('totalNetAmount') // 'TotalNetAmount'
79
+ * capitalizeFirstWord('') // ''
80
+ */
70
81
  function capitalizeFirstWord(str) {
71
82
  if (!str)
72
83
  return str;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "law-common",
3
- "version": "10.63.2",
3
+ "version": "10.63.4-beta.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -16,7 +16,8 @@
16
16
  "link": "npm run build && npm link",
17
17
  "test": "jest",
18
18
  "format": "prettier --write .",
19
- "check-format": "prettier --check ."
19
+ "check-format": "prettier --check .",
20
+ "pull:link": "git pull && npm run link"
20
21
  },
21
22
  "keywords": [],
22
23
  "author": "",