@ambushsoftworks/nestjs-payments-graphql 0.1.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 (217) hide show
  1. package/dist/constants.d.ts +17 -0
  2. package/dist/constants.js +21 -0
  3. package/dist/constants.js.map +1 -0
  4. package/dist/dto/create-installment.input.d.ts +5 -0
  5. package/dist/dto/create-installment.input.js +39 -0
  6. package/dist/dto/create-installment.input.js.map +1 -0
  7. package/dist/dto/create-invoice.input.d.ts +13 -0
  8. package/dist/dto/create-invoice.input.js +95 -0
  9. package/dist/dto/create-invoice.input.js.map +1 -0
  10. package/dist/dto/create-line-item.input.d.ts +10 -0
  11. package/dist/dto/create-line-item.input.js +77 -0
  12. package/dist/dto/create-line-item.input.js.map +1 -0
  13. package/dist/dto/create-payment-plan.input.d.ts +11 -0
  14. package/dist/dto/create-payment-plan.input.js +76 -0
  15. package/dist/dto/create-payment-plan.input.js.map +1 -0
  16. package/dist/dto/create-recurring-invoice.input.d.ts +18 -0
  17. package/dist/dto/create-recurring-invoice.input.js +117 -0
  18. package/dist/dto/create-recurring-invoice.input.js.map +1 -0
  19. package/dist/dto/create-recurring-line-item.input.d.ts +10 -0
  20. package/dist/dto/create-recurring-line-item.input.js +77 -0
  21. package/dist/dto/create-recurring-line-item.input.js.map +1 -0
  22. package/dist/dto/create-refund.input.d.ts +5 -0
  23. package/dist/dto/create-refund.input.js +43 -0
  24. package/dist/dto/create-refund.input.js.map +1 -0
  25. package/dist/dto/index.d.ts +8 -0
  26. package/dist/dto/index.js +20 -0
  27. package/dist/dto/index.js.map +1 -0
  28. package/dist/dto/invoice-filter.input.d.ts +10 -0
  29. package/dist/dto/invoice-filter.input.js +64 -0
  30. package/dist/dto/invoice-filter.input.js.map +1 -0
  31. package/dist/dto/payment-plan-filter.input.d.ts +7 -0
  32. package/dist/dto/payment-plan-filter.input.js +46 -0
  33. package/dist/dto/payment-plan-filter.input.js.map +1 -0
  34. package/dist/dto/record-manual-payment.input.d.ts +9 -0
  35. package/dist/dto/record-manual-payment.input.js +58 -0
  36. package/dist/dto/record-manual-payment.input.js.map +1 -0
  37. package/dist/dto/recurring-invoice-filter.input.d.ts +7 -0
  38. package/dist/dto/recurring-invoice-filter.input.js +46 -0
  39. package/dist/dto/recurring-invoice-filter.input.js.map +1 -0
  40. package/dist/dto/update-invoice-metadata.input.d.ts +3 -0
  41. package/dist/dto/update-invoice-metadata.input.js +30 -0
  42. package/dist/dto/update-invoice-metadata.input.js.map +1 -0
  43. package/dist/dto/update-payment-config.input.d.ts +8 -0
  44. package/dist/dto/update-payment-config.input.js +61 -0
  45. package/dist/dto/update-payment-config.input.js.map +1 -0
  46. package/dist/dto/update-recurring-template.input.d.ts +12 -0
  47. package/dist/dto/update-recurring-template.input.js +89 -0
  48. package/dist/dto/update-recurring-template.input.js.map +1 -0
  49. package/dist/dto/upsert-payment-provider.input.d.ts +5 -0
  50. package/dist/dto/upsert-payment-provider.input.js +43 -0
  51. package/dist/dto/upsert-payment-provider.input.js.map +1 -0
  52. package/dist/dto/validators/is-metadata.d.ts +1 -0
  53. package/dist/dto/validators/is-metadata.js +41 -0
  54. package/dist/dto/validators/is-metadata.js.map +1 -0
  55. package/dist/exceptions/index.d.ts +34 -0
  56. package/dist/exceptions/index.js +73 -0
  57. package/dist/exceptions/index.js.map +1 -0
  58. package/dist/gateways/gateway-registry.service.d.ts +10 -0
  59. package/dist/gateways/gateway-registry.service.js +45 -0
  60. package/dist/gateways/gateway-registry.service.js.map +1 -0
  61. package/dist/gateways/payment-gateway.interface.d.ts +50 -0
  62. package/dist/gateways/payment-gateway.interface.js +3 -0
  63. package/dist/gateways/payment-gateway.interface.js.map +1 -0
  64. package/dist/gateways/recurring-payment-gateway.interface.d.ts +32 -0
  65. package/dist/gateways/recurring-payment-gateway.interface.js +3 -0
  66. package/dist/gateways/recurring-payment-gateway.interface.js.map +1 -0
  67. package/dist/gateways/stripe/stripe-webhook.controller.d.ts +24 -0
  68. package/dist/gateways/stripe/stripe-webhook.controller.js +150 -0
  69. package/dist/gateways/stripe/stripe-webhook.controller.js.map +1 -0
  70. package/dist/gateways/stripe/stripe.gateway.d.ts +84 -0
  71. package/dist/gateways/stripe/stripe.gateway.js +424 -0
  72. package/dist/gateways/stripe/stripe.gateway.js.map +1 -0
  73. package/dist/index.d.ts +70 -0
  74. package/dist/index.js +147 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/interfaces/invoice-repository.interface.d.ts +23 -0
  77. package/dist/interfaces/invoice-repository.interface.js +3 -0
  78. package/dist/interfaces/invoice-repository.interface.js.map +1 -0
  79. package/dist/interfaces/payment-config-repository.interface.d.ts +11 -0
  80. package/dist/interfaces/payment-config-repository.interface.js +3 -0
  81. package/dist/interfaces/payment-config-repository.interface.js.map +1 -0
  82. package/dist/interfaces/payment-customer-repository.interface.d.ts +6 -0
  83. package/dist/interfaces/payment-customer-repository.interface.js +3 -0
  84. package/dist/interfaces/payment-customer-repository.interface.js.map +1 -0
  85. package/dist/interfaces/payment-email.interfaces.d.ts +74 -0
  86. package/dist/interfaces/payment-email.interfaces.js +3 -0
  87. package/dist/interfaces/payment-email.interfaces.js.map +1 -0
  88. package/dist/interfaces/payment-event-listener.interface.d.ts +61 -0
  89. package/dist/interfaces/payment-event-listener.interface.js +3 -0
  90. package/dist/interfaces/payment-event-listener.interface.js.map +1 -0
  91. package/dist/interfaces/payment-plan-repository.interface.d.ts +16 -0
  92. package/dist/interfaces/payment-plan-repository.interface.js +3 -0
  93. package/dist/interfaces/payment-plan-repository.interface.js.map +1 -0
  94. package/dist/interfaces/payment-repository.interface.d.ts +13 -0
  95. package/dist/interfaces/payment-repository.interface.js +3 -0
  96. package/dist/interfaces/payment-repository.interface.js.map +1 -0
  97. package/dist/interfaces/recurring-invoice-repository.interface.d.ts +16 -0
  98. package/dist/interfaces/recurring-invoice-repository.interface.js +3 -0
  99. package/dist/interfaces/recurring-invoice-repository.interface.js.map +1 -0
  100. package/dist/interfaces/refund-repository.interface.d.ts +8 -0
  101. package/dist/interfaces/refund-repository.interface.js +3 -0
  102. package/dist/interfaces/refund-repository.interface.js.map +1 -0
  103. package/dist/interfaces/transaction-manager.interface.d.ts +19 -0
  104. package/dist/interfaces/transaction-manager.interface.js +3 -0
  105. package/dist/interfaces/transaction-manager.interface.js.map +1 -0
  106. package/dist/interfaces/webhook-idempotency-repository.interface.d.ts +5 -0
  107. package/dist/interfaces/webhook-idempotency-repository.interface.js +3 -0
  108. package/dist/interfaces/webhook-idempotency-repository.interface.js.map +1 -0
  109. package/dist/models/e-transfer-instructions.model.d.ts +11 -0
  110. package/dist/models/e-transfer-instructions.model.js +56 -0
  111. package/dist/models/e-transfer-instructions.model.js.map +1 -0
  112. package/dist/models/index.d.ts +13 -0
  113. package/dist/models/index.js +36 -0
  114. package/dist/models/index.js.map +1 -0
  115. package/dist/models/invoice-client.model.d.ts +5 -0
  116. package/dist/models/invoice-client.model.js +32 -0
  117. package/dist/models/invoice-client.model.js.map +1 -0
  118. package/dist/models/invoice-line-item.model.d.ts +14 -0
  119. package/dist/models/invoice-line-item.model.js +72 -0
  120. package/dist/models/invoice-line-item.model.js.map +1 -0
  121. package/dist/models/invoice.model.d.ts +86 -0
  122. package/dist/models/invoice.model.js +210 -0
  123. package/dist/models/invoice.model.js.map +1 -0
  124. package/dist/models/online-payment-session.model.d.ts +6 -0
  125. package/dist/models/online-payment-session.model.js +40 -0
  126. package/dist/models/online-payment-session.model.js.map +1 -0
  127. package/dist/models/paginated-invoices.model.d.ts +5 -0
  128. package/dist/models/paginated-invoices.model.js +19 -0
  129. package/dist/models/paginated-invoices.model.js.map +1 -0
  130. package/dist/models/paginated-payment-plans.model.d.ts +5 -0
  131. package/dist/models/paginated-payment-plans.model.js +19 -0
  132. package/dist/models/paginated-payment-plans.model.js.map +1 -0
  133. package/dist/models/paginated-recurring-invoices.model.d.ts +5 -0
  134. package/dist/models/paginated-recurring-invoices.model.js +19 -0
  135. package/dist/models/paginated-recurring-invoices.model.js.map +1 -0
  136. package/dist/models/paginated.model.d.ts +6 -0
  137. package/dist/models/paginated.model.js +30 -0
  138. package/dist/models/paginated.model.js.map +1 -0
  139. package/dist/models/payment-config.model.d.ts +21 -0
  140. package/dist/models/payment-config.model.js +98 -0
  141. package/dist/models/payment-config.model.js.map +1 -0
  142. package/dist/models/payment-method-setup.model.d.ts +4 -0
  143. package/dist/models/payment-method-setup.model.js +32 -0
  144. package/dist/models/payment-method-setup.model.js.map +1 -0
  145. package/dist/models/payment-plan-installment.model.d.ts +12 -0
  146. package/dist/models/payment-plan-installment.model.js +57 -0
  147. package/dist/models/payment-plan-installment.model.js.map +1 -0
  148. package/dist/models/payment-plan.model.d.ts +25 -0
  149. package/dist/models/payment-plan.model.js +105 -0
  150. package/dist/models/payment-plan.model.js.map +1 -0
  151. package/dist/models/payment.model.d.ts +23 -0
  152. package/dist/models/payment.model.js +102 -0
  153. package/dist/models/payment.model.js.map +1 -0
  154. package/dist/models/recurring-invoice-line-item.model.d.ts +14 -0
  155. package/dist/models/recurring-invoice-line-item.model.js +72 -0
  156. package/dist/models/recurring-invoice-line-item.model.js.map +1 -0
  157. package/dist/models/recurring-invoice.model.d.ts +43 -0
  158. package/dist/models/recurring-invoice.model.js +157 -0
  159. package/dist/models/recurring-invoice.model.js.map +1 -0
  160. package/dist/models/refund.model.d.ts +15 -0
  161. package/dist/models/refund.model.js +73 -0
  162. package/dist/models/refund.model.js.map +1 -0
  163. package/dist/payments.module.d.ts +54 -0
  164. package/dist/payments.module.js +211 -0
  165. package/dist/payments.module.js.map +1 -0
  166. package/dist/register-payment-enums.d.ts +1 -0
  167. package/dist/register-payment-enums.js +18 -0
  168. package/dist/register-payment-enums.js.map +1 -0
  169. package/dist/services/customer.service.d.ts +15 -0
  170. package/dist/services/customer.service.js +63 -0
  171. package/dist/services/customer.service.js.map +1 -0
  172. package/dist/services/default-payment-email-templates.d.ts +8 -0
  173. package/dist/services/default-payment-email-templates.js +249 -0
  174. package/dist/services/default-payment-email-templates.js.map +1 -0
  175. package/dist/services/e-transfer.service.d.ts +35 -0
  176. package/dist/services/e-transfer.service.js +93 -0
  177. package/dist/services/e-transfer.service.js.map +1 -0
  178. package/dist/services/invoice-number.service.d.ts +9 -0
  179. package/dist/services/invoice-number.service.js +56 -0
  180. package/dist/services/invoice-number.service.js.map +1 -0
  181. package/dist/services/invoice.service.d.ts +66 -0
  182. package/dist/services/invoice.service.js +293 -0
  183. package/dist/services/invoice.service.js.map +1 -0
  184. package/dist/services/payment-config.service.d.ts +26 -0
  185. package/dist/services/payment-config.service.js +90 -0
  186. package/dist/services/payment-config.service.js.map +1 -0
  187. package/dist/services/payment-email.service.d.ts +20 -0
  188. package/dist/services/payment-email.service.js +153 -0
  189. package/dist/services/payment-email.service.js.map +1 -0
  190. package/dist/services/payment-plan.service.d.ts +47 -0
  191. package/dist/services/payment-plan.service.js +264 -0
  192. package/dist/services/payment-plan.service.js.map +1 -0
  193. package/dist/services/payment.service.d.ts +65 -0
  194. package/dist/services/payment.service.js +532 -0
  195. package/dist/services/payment.service.js.map +1 -0
  196. package/dist/services/recurring-interval.util.d.ts +3 -0
  197. package/dist/services/recurring-interval.util.js +43 -0
  198. package/dist/services/recurring-interval.util.js.map +1 -0
  199. package/dist/services/recurring-invoice.service.d.ts +88 -0
  200. package/dist/services/recurring-invoice.service.js +450 -0
  201. package/dist/services/recurring-invoice.service.js.map +1 -0
  202. package/dist/services/refund.service.d.ts +44 -0
  203. package/dist/services/refund.service.js +373 -0
  204. package/dist/services/refund.service.js.map +1 -0
  205. package/dist/services/static-branding-resolver.d.ts +6 -0
  206. package/dist/services/static-branding-resolver.js +13 -0
  207. package/dist/services/static-branding-resolver.js.map +1 -0
  208. package/dist/types/index.d.ts +240 -0
  209. package/dist/types/index.js +19 -0
  210. package/dist/types/index.js.map +1 -0
  211. package/dist/types/payment-customer.types.d.ts +15 -0
  212. package/dist/types/payment-customer.types.js +3 -0
  213. package/dist/types/payment-customer.types.js.map +1 -0
  214. package/dist/types/recurring-invoice.types.d.ts +84 -0
  215. package/dist/types/recurring-invoice.types.js +3 -0
  216. package/dist/types/recurring-invoice.types.js.map +1 -0
  217. package/package.json +70 -0
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var InvoiceService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.InvoiceService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const core_1 = require("@nestjs/core");
19
+ const constants_1 = require("../constants");
20
+ const exceptions_1 = require("../exceptions");
21
+ const invoice_number_service_1 = require("./invoice-number.service");
22
+ const e_transfer_service_1 = require("./e-transfer.service");
23
+ const payment_email_service_1 = require("./payment-email.service");
24
+ const VOIDABLE_STATUSES = new Set([
25
+ 'DRAFT',
26
+ 'SENT',
27
+ 'PARTIALLY_PAID',
28
+ 'OVERDUE',
29
+ ]);
30
+ const EDITABLE_STATUSES = new Set(['DRAFT']);
31
+ class SimpleDecimal {
32
+ constructor(value) {
33
+ this.value = value;
34
+ }
35
+ toNumber() {
36
+ return this.value;
37
+ }
38
+ toString() {
39
+ return String(this.value);
40
+ }
41
+ }
42
+ let InvoiceService = InvoiceService_1 = class InvoiceService {
43
+ constructor(invoiceRepo, configRepo, defaultCurrency, invoiceNumberService, eTransferService, moduleRef) {
44
+ this.invoiceRepo = invoiceRepo;
45
+ this.configRepo = configRepo;
46
+ this.defaultCurrency = defaultCurrency;
47
+ this.invoiceNumberService = invoiceNumberService;
48
+ this.eTransferService = eTransferService;
49
+ this.moduleRef = moduleRef;
50
+ this.logger = new common_1.Logger(InvoiceService_1.name);
51
+ this.paymentEmailService = null;
52
+ }
53
+ onModuleInit() {
54
+ try {
55
+ this.paymentEmailService = this.moduleRef.get(payment_email_service_1.PaymentEmailService, {
56
+ strict: false,
57
+ });
58
+ }
59
+ catch {
60
+ this.paymentEmailService = null;
61
+ }
62
+ }
63
+ async createInvoice(divisionId, input, createdBy) {
64
+ const taxRate = await this.resolveTaxRate(divisionId, input.taxRate);
65
+ const currency = input.currency ?? this.defaultCurrency;
66
+ for (let attempt = 0; attempt < InvoiceService_1.MAX_CREATE_RETRIES; attempt++) {
67
+ const invoiceNumber = await this.invoiceNumberService.generate(divisionId);
68
+ try {
69
+ const invoice = await this.invoiceRepo.create({
70
+ divisionId,
71
+ invoiceNumber,
72
+ clientDetailsId: input.clientDetailsId,
73
+ taxRate,
74
+ currency,
75
+ createdBy,
76
+ referenceType: input.referenceType,
77
+ referenceId: input.referenceId,
78
+ dueAt: input.dueAt,
79
+ notes: input.notes,
80
+ clientNotes: input.clientNotes,
81
+ metadata: input.metadata,
82
+ recurringInvoiceId: input.recurringInvoiceId,
83
+ });
84
+ const lineItems = [];
85
+ if (input.lineItems && input.lineItems.length > 0) {
86
+ for (let i = 0; i < input.lineItems.length; i++) {
87
+ const item = input.lineItems[i];
88
+ const lineItem = await this.invoiceRepo.createLineItem({
89
+ invoiceId: invoice.id,
90
+ description: item.description,
91
+ quantity: item.quantity,
92
+ unitPrice: item.unitPrice,
93
+ sortOrder: item.sortOrder ?? i,
94
+ isTaxable: item.isTaxable,
95
+ referenceType: item.referenceType,
96
+ referenceId: item.referenceId,
97
+ metadata: item.metadata,
98
+ });
99
+ lineItems.push(lineItem);
100
+ }
101
+ const totals = this.recalculateTotals(invoice, lineItems);
102
+ const updatedInvoice = await this.invoiceRepo.update(invoice.id, totals);
103
+ return { ...updatedInvoice, lineItems };
104
+ }
105
+ return { ...invoice, lineItems: [] };
106
+ }
107
+ catch (error) {
108
+ if (error instanceof exceptions_1.UniqueConstraintViolationException) {
109
+ this.logger.warn(`Invoice number collision on creation attempt ${attempt + 1}`);
110
+ continue;
111
+ }
112
+ throw error;
113
+ }
114
+ }
115
+ throw new exceptions_1.InvoiceNumberExhaustedException(`Failed to create invoice after ${InvoiceService_1.MAX_CREATE_RETRIES} attempts due to number collisions`);
116
+ }
117
+ async addLineItem(invoiceId, input) {
118
+ return this.invoiceRepo.withTransaction(async (txRepo) => {
119
+ const invoice = await txRepo.findByIdForUpdate(invoiceId);
120
+ if (!invoice) {
121
+ throw new exceptions_1.InvalidInvoiceStateException(`Invoice ${invoiceId} not found`);
122
+ }
123
+ if (!EDITABLE_STATUSES.has(invoice.status)) {
124
+ throw new exceptions_1.InvalidInvoiceStateException(`Cannot add line items to invoice in "${invoice.status}" status. Invoice must be in DRAFT status.`);
125
+ }
126
+ const lineItem = await txRepo.createLineItem({
127
+ ...input,
128
+ invoiceId,
129
+ });
130
+ const lineItems = await txRepo.findLineItemsByInvoice(invoiceId);
131
+ const totals = this.recalculateTotals(invoice, lineItems);
132
+ await txRepo.update(invoiceId, totals);
133
+ return lineItem;
134
+ });
135
+ }
136
+ async removeLineItem(invoiceId, lineItemId) {
137
+ await this.invoiceRepo.withTransaction(async (txRepo) => {
138
+ const invoice = await txRepo.findByIdForUpdate(invoiceId);
139
+ if (!invoice) {
140
+ throw new exceptions_1.InvalidInvoiceStateException(`Invoice ${invoiceId} not found`);
141
+ }
142
+ if (!EDITABLE_STATUSES.has(invoice.status)) {
143
+ throw new exceptions_1.InvalidInvoiceStateException(`Cannot remove line items from invoice in "${invoice.status}" status. Invoice must be in DRAFT status.`);
144
+ }
145
+ await txRepo.deleteLineItem(lineItemId);
146
+ const lineItems = await txRepo.findLineItemsByInvoice(invoiceId);
147
+ const totals = this.recalculateTotals(invoice, lineItems);
148
+ await txRepo.update(invoiceId, totals);
149
+ });
150
+ }
151
+ async sendInvoice(id, eTransferEnabled, eTransferAutoDeposit, eTransferConfig) {
152
+ const invoice = await this.invoiceRepo.findById(id);
153
+ if (!invoice) {
154
+ throw new exceptions_1.InvalidInvoiceStateException(`Invoice ${id} not found`);
155
+ }
156
+ if (invoice.status !== 'DRAFT') {
157
+ throw new exceptions_1.InvalidInvoiceStateException(`Cannot send invoice in "${invoice.status}" status. Invoice must be in DRAFT status.`);
158
+ }
159
+ const updateData = {
160
+ status: 'SENT',
161
+ issuedAt: new Date(),
162
+ };
163
+ if (eTransferEnabled) {
164
+ const result = await this.eTransferService.assignCode(id, eTransferAutoDeposit);
165
+ updateData.eTransferCode = result.code;
166
+ }
167
+ const updatedInvoice = await this.invoiceRepo.update(id, updateData);
168
+ if (this.paymentEmailService) {
169
+ const invoiceWithItems = await this.invoiceRepo.findByIdWithItems(id);
170
+ if (invoiceWithItems) {
171
+ await this.paymentEmailService.sendInvoiceNotification(invoiceWithItems);
172
+ }
173
+ if (eTransferEnabled && updateData.eTransferCode && eTransferConfig) {
174
+ const instructions = this.eTransferService.getInstructions({
175
+ invoiceNumber: invoice.invoiceNumber,
176
+ amount: updatedInvoice.amountDue,
177
+ currency: updatedInvoice.currency,
178
+ eTransferCode: updateData.eTransferCode,
179
+ eTransferEmail: eTransferConfig.eTransferEmail,
180
+ eTransferRecipient: eTransferConfig.eTransferRecipient,
181
+ eTransferAnswer: updatedInvoice.eTransferAnswer,
182
+ });
183
+ await this.paymentEmailService.sendETransferInstructions(updatedInvoice, instructions);
184
+ }
185
+ }
186
+ return updatedInvoice;
187
+ }
188
+ async voidInvoice(id, reason, voidedBy) {
189
+ const invoice = await this.invoiceRepo.findById(id);
190
+ if (!invoice) {
191
+ throw new exceptions_1.InvalidInvoiceStateException(`Invoice ${id} not found`);
192
+ }
193
+ if (invoice.status === 'VOID') {
194
+ return invoice;
195
+ }
196
+ if (!VOIDABLE_STATUSES.has(invoice.status)) {
197
+ throw new exceptions_1.InvalidInvoiceStateException(`Cannot void invoice in "${invoice.status}" status. ` +
198
+ `Invoice must be in one of: ${Array.from(VOIDABLE_STATUSES).join(', ')}.`);
199
+ }
200
+ return this.invoiceRepo.update(id, {
201
+ status: 'VOID',
202
+ voidedBy: voidedBy ?? null,
203
+ voidedAt: new Date(),
204
+ voidReason: reason ?? null,
205
+ });
206
+ }
207
+ async updateInvoiceMetadata(invoiceId, metadata) {
208
+ const invoice = await this.invoiceRepo.findById(invoiceId);
209
+ if (!invoice) {
210
+ throw new exceptions_1.InvalidInvoiceStateException(`Invoice ${invoiceId} not found`);
211
+ }
212
+ if (!EDITABLE_STATUSES.has(invoice.status)) {
213
+ throw new exceptions_1.InvalidInvoiceStateException(`Cannot update metadata on invoice in "${invoice.status}" status. Invoice must be in DRAFT status.`);
214
+ }
215
+ return this.invoiceRepo.update(invoiceId, { metadata });
216
+ }
217
+ async findInvoice(divisionId, id) {
218
+ const invoice = await this.invoiceRepo.findByIdWithItems(id);
219
+ if (!invoice) {
220
+ return null;
221
+ }
222
+ if (invoice.divisionId !== divisionId) {
223
+ return null;
224
+ }
225
+ return invoice;
226
+ }
227
+ async findInvoices(divisionId, filter, skip, take) {
228
+ return this.invoiceRepo.findByDivision(divisionId, filter, skip, take);
229
+ }
230
+ async findInvoicesByClientDetailsIds(clientDetailsIds, skip, take) {
231
+ return this.invoiceRepo.findByClientDetailsIds(clientDetailsIds, skip, take);
232
+ }
233
+ async findInvoiceById(id) {
234
+ return this.invoiceRepo.findByIdWithItems(id);
235
+ }
236
+ async findOverdueInvoices(now) {
237
+ return this.invoiceRepo.findOverdue(now);
238
+ }
239
+ async markOverdue(ids) {
240
+ let updated = 0;
241
+ for (const id of ids) {
242
+ const invoice = await this.invoiceRepo.findById(id);
243
+ if (!invoice)
244
+ continue;
245
+ if (invoice.status !== 'SENT' && invoice.status !== 'PARTIALLY_PAID') {
246
+ continue;
247
+ }
248
+ await this.invoiceRepo.update(id, { status: 'OVERDUE' });
249
+ updated++;
250
+ }
251
+ return updated;
252
+ }
253
+ async findByETransferCode(code) {
254
+ return this.invoiceRepo.findByETransferCode(code);
255
+ }
256
+ recalculateTotals(invoice, lineItems) {
257
+ let subtotal = 0;
258
+ let taxableSubtotal = 0;
259
+ for (const item of lineItems) {
260
+ const lineTotal = item.quantity * item.unitPrice;
261
+ subtotal += lineTotal;
262
+ if (item.isTaxable) {
263
+ taxableSubtotal += lineTotal;
264
+ }
265
+ }
266
+ const taxAmount = Math.round(taxableSubtotal * invoice.taxRate.toNumber());
267
+ const total = subtotal + taxAmount - invoice.discount;
268
+ const amountDue = total - invoice.amountPaid;
269
+ return { subtotal, taxAmount, total, amountDue };
270
+ }
271
+ async resolveTaxRate(divisionId, inputTaxRate) {
272
+ if (inputTaxRate !== undefined) {
273
+ return new SimpleDecimal(inputTaxRate);
274
+ }
275
+ const config = await this.configRepo.findByDivisionId(divisionId);
276
+ if (config?.defaultTaxRate) {
277
+ return config.defaultTaxRate;
278
+ }
279
+ return new SimpleDecimal(0);
280
+ }
281
+ };
282
+ exports.InvoiceService = InvoiceService;
283
+ InvoiceService.MAX_CREATE_RETRIES = 5;
284
+ exports.InvoiceService = InvoiceService = InvoiceService_1 = __decorate([
285
+ (0, common_1.Injectable)(),
286
+ __param(0, (0, common_1.Inject)(constants_1.INVOICE_REPOSITORY)),
287
+ __param(1, (0, common_1.Inject)(constants_1.PAYMENT_CONFIG_REPOSITORY)),
288
+ __param(2, (0, common_1.Inject)(constants_1.DEFAULT_CURRENCY)),
289
+ __metadata("design:paramtypes", [Object, Object, String, invoice_number_service_1.InvoiceNumberService,
290
+ e_transfer_service_1.ETransferService,
291
+ core_1.ModuleRef])
292
+ ], InvoiceService);
293
+ //# sourceMappingURL=invoice.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice.service.js","sourceRoot":"","sources":["../../src/services/invoice.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { IPaymentConfigRepository } from '../interfaces/payment-config-repository.interface';
2
+ import type { PaymentConfig, PaymentProvider } from '../types';
3
+ export interface UpsertPaymentConfigInput {
4
+ eTransferEnabled?: boolean;
5
+ eTransferAutoDeposit?: boolean;
6
+ eTransferEmail?: string;
7
+ eTransferRecipient?: string;
8
+ defaultCurrency?: string;
9
+ defaultTaxRate?: number;
10
+ }
11
+ export interface UpsertPaymentProviderInput {
12
+ providerType: string;
13
+ isActive?: boolean;
14
+ config?: Record<string, unknown> | null;
15
+ }
16
+ export declare class PaymentConfigService {
17
+ private readonly configRepo;
18
+ private readonly logger;
19
+ constructor(configRepo: IPaymentConfigRepository);
20
+ getConfig(divisionId: string): Promise<PaymentConfig | null>;
21
+ upsertConfig(divisionId: string, input: UpsertPaymentConfigInput): Promise<PaymentConfig>;
22
+ upsertProvider(divisionId: string, input: UpsertPaymentProviderInput): Promise<PaymentProvider>;
23
+ getActiveProviders(divisionId: string): Promise<PaymentProvider[]>;
24
+ getDefaultProvider(divisionId: string): Promise<PaymentProvider>;
25
+ removeProvider(divisionId: string, providerType: string): Promise<void>;
26
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var PaymentConfigService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.PaymentConfigService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const constants_1 = require("../constants");
19
+ class SimpleDecimal {
20
+ constructor(value) {
21
+ this.value = value;
22
+ }
23
+ toNumber() {
24
+ return this.value;
25
+ }
26
+ toString() {
27
+ return String(this.value);
28
+ }
29
+ }
30
+ let PaymentConfigService = PaymentConfigService_1 = class PaymentConfigService {
31
+ constructor(configRepo) {
32
+ this.configRepo = configRepo;
33
+ this.logger = new common_1.Logger(PaymentConfigService_1.name);
34
+ }
35
+ async getConfig(divisionId) {
36
+ return this.configRepo.findByDivisionId(divisionId);
37
+ }
38
+ async upsertConfig(divisionId, input) {
39
+ return this.configRepo.upsert({
40
+ divisionId,
41
+ eTransferEnabled: input.eTransferEnabled,
42
+ eTransferAutoDeposit: input.eTransferAutoDeposit,
43
+ eTransferEmail: input.eTransferEmail,
44
+ eTransferRecipient: input.eTransferRecipient,
45
+ defaultCurrency: input.defaultCurrency,
46
+ defaultTaxRate: input.defaultTaxRate !== undefined
47
+ ? new SimpleDecimal(input.defaultTaxRate)
48
+ : undefined,
49
+ });
50
+ }
51
+ async upsertProvider(divisionId, input) {
52
+ const config = await this.configRepo.findByDivisionId(divisionId);
53
+ if (!config) {
54
+ throw new Error(`No payment configuration found for division ${divisionId}. Create a PaymentConfig first.`);
55
+ }
56
+ return this.configRepo.upsertProvider(config.id, input.providerType, {
57
+ isActive: input.isActive,
58
+ config: input.config,
59
+ });
60
+ }
61
+ async getActiveProviders(divisionId) {
62
+ const config = await this.configRepo.findByDivisionId(divisionId);
63
+ if (!config) {
64
+ return [];
65
+ }
66
+ const providers = await this.configRepo.findProvidersByConfigId(config.id);
67
+ return providers.filter((p) => p.isActive);
68
+ }
69
+ async getDefaultProvider(divisionId) {
70
+ const activeProviders = await this.getActiveProviders(divisionId);
71
+ if (activeProviders.length === 0) {
72
+ throw new Error(`No active payment providers configured for division ${divisionId}`);
73
+ }
74
+ return activeProviders[0];
75
+ }
76
+ async removeProvider(divisionId, providerType) {
77
+ const config = await this.configRepo.findByDivisionId(divisionId);
78
+ if (!config) {
79
+ return;
80
+ }
81
+ await this.configRepo.deactivateProvider(config.id, providerType);
82
+ }
83
+ };
84
+ exports.PaymentConfigService = PaymentConfigService;
85
+ exports.PaymentConfigService = PaymentConfigService = PaymentConfigService_1 = __decorate([
86
+ (0, common_1.Injectable)(),
87
+ __param(0, (0, common_1.Inject)(constants_1.PAYMENT_CONFIG_REPOSITORY)),
88
+ __metadata("design:paramtypes", [Object])
89
+ ], PaymentConfigService);
90
+ //# sourceMappingURL=payment-config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-config.service.js","sourceRoot":"","sources":["../../src/services/payment-config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAE5D,4CAAyD;AAIzD,MAAM,aAAa;IACjB,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAC9C,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,QAAQ;QACN,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;CACF;AAkBM,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAG/B,YAEE,UAAqD;QAApC,eAAU,GAAV,UAAU,CAA0B;QAJtC,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IAK7D,CAAC;IAKJ,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAKD,KAAK,CAAC,YAAY,CAChB,UAAkB,EAClB,KAA+B;QAE/B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5B,UAAU;YACV,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;YAChD,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,cAAc,EACZ,KAAK,CAAC,cAAc,KAAK,SAAS;gBAChC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC;gBACzC,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;IAQD,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,KAAiC;QAEjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,+CAA+C,UAAU,iCAAiC,CAC3F,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE;YACnE,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAKD,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAOD,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACzC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAElE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,uDAAuD,UAAU,EAAE,CACpE,CAAC;QACJ,CAAC;QAED,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAKD,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,YAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACpE,CAAC;CACF,CAAA;AAvGY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAA;;GAJzB,oBAAoB,CAuGhC"}
@@ -0,0 +1,20 @@
1
+ import { type OnModuleInit } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import type { Invoice, InvoiceWithItems, Payment, Refund } from '../types';
4
+ import type { ETransferInstructions } from './e-transfer.service';
5
+ export declare class PaymentEmailService implements OnModuleInit {
6
+ private readonly moduleRef;
7
+ private readonly logger;
8
+ private sender;
9
+ private clientResolver;
10
+ private brandingResolver;
11
+ private templateRenderer;
12
+ constructor(moduleRef: ModuleRef);
13
+ onModuleInit(): void;
14
+ sendInvoiceNotification(invoice: InvoiceWithItems): Promise<void>;
15
+ sendETransferInstructions(invoice: Invoice, instructions: ETransferInstructions): Promise<void>;
16
+ sendPaymentConfirmation(payment: Payment, invoice: Invoice): Promise<void>;
17
+ sendOverdueReminder(invoice: Invoice): Promise<void>;
18
+ sendRefundConfirmation(refund: Refund, payment: Payment, invoice: Invoice): Promise<void>;
19
+ private sendEmail;
20
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var PaymentEmailService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PaymentEmailService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const core_1 = require("@nestjs/core");
16
+ const constants_1 = require("../constants");
17
+ const default_payment_email_templates_1 = require("./default-payment-email-templates");
18
+ const DEFAULT_BRANDING = {
19
+ appName: 'Payments',
20
+ primaryColor: '#2563eb',
21
+ fromEmail: 'noreply@example.com',
22
+ };
23
+ let PaymentEmailService = PaymentEmailService_1 = class PaymentEmailService {
24
+ constructor(moduleRef) {
25
+ this.moduleRef = moduleRef;
26
+ this.logger = new common_1.Logger(PaymentEmailService_1.name);
27
+ this.sender = null;
28
+ this.clientResolver = null;
29
+ this.brandingResolver = null;
30
+ this.templateRenderer = new default_payment_email_templates_1.DefaultPaymentEmailTemplateRenderer();
31
+ }
32
+ onModuleInit() {
33
+ try {
34
+ this.sender = this.moduleRef.get(constants_1.PAYMENT_EMAIL_SENDER, {
35
+ strict: false,
36
+ });
37
+ }
38
+ catch {
39
+ this.sender = null;
40
+ }
41
+ if (!this.sender) {
42
+ this.logger.log('No payment email sender registered — payment emails disabled');
43
+ return;
44
+ }
45
+ try {
46
+ this.clientResolver = this.moduleRef.get(constants_1.PAYMENT_CLIENT_RESOLVER, {
47
+ strict: false,
48
+ });
49
+ }
50
+ catch {
51
+ this.clientResolver = null;
52
+ this.logger.warn('No payment client resolver registered — payment emails will be skipped');
53
+ }
54
+ try {
55
+ this.brandingResolver = this.moduleRef.get(constants_1.PAYMENT_EMAIL_BRANDING_RESOLVER, { strict: false });
56
+ }
57
+ catch {
58
+ this.brandingResolver = null;
59
+ }
60
+ try {
61
+ const custom = this.moduleRef.get(constants_1.PAYMENT_EMAIL_TEMPLATE_RENDERER, {
62
+ strict: false,
63
+ });
64
+ if (custom)
65
+ this.templateRenderer = custom;
66
+ }
67
+ catch {
68
+ }
69
+ this.logger.log('Payment email service configured successfully');
70
+ }
71
+ async sendInvoiceNotification(invoice) {
72
+ await this.sendEmail('invoice notification', invoice, async (client, branding) => {
73
+ const rendered = this.templateRenderer.renderInvoiceNotification({
74
+ invoice,
75
+ clientName: client.name,
76
+ branding,
77
+ });
78
+ return rendered;
79
+ });
80
+ }
81
+ async sendETransferInstructions(invoice, instructions) {
82
+ await this.sendEmail('e-transfer instructions', invoice, async (client, branding) => {
83
+ return this.templateRenderer.renderETransferInstructions({
84
+ invoice,
85
+ instructions,
86
+ clientName: client.name,
87
+ branding,
88
+ });
89
+ });
90
+ }
91
+ async sendPaymentConfirmation(payment, invoice) {
92
+ await this.sendEmail('payment confirmation', invoice, async (client, branding) => {
93
+ return this.templateRenderer.renderPaymentConfirmation({
94
+ payment,
95
+ invoice,
96
+ clientName: client.name,
97
+ branding,
98
+ });
99
+ });
100
+ }
101
+ async sendOverdueReminder(invoice) {
102
+ await this.sendEmail('overdue reminder', invoice, async (client, branding) => {
103
+ return this.templateRenderer.renderOverdueReminder({
104
+ invoice,
105
+ clientName: client.name,
106
+ branding,
107
+ });
108
+ });
109
+ }
110
+ async sendRefundConfirmation(refund, payment, invoice) {
111
+ await this.sendEmail('refund confirmation', invoice, async (client, branding) => {
112
+ return this.templateRenderer.renderRefundConfirmation({
113
+ refund,
114
+ payment,
115
+ invoice,
116
+ clientName: client.name,
117
+ branding,
118
+ });
119
+ });
120
+ }
121
+ async sendEmail(emailType, invoice, render) {
122
+ if (!this.sender || !this.clientResolver)
123
+ return;
124
+ try {
125
+ const client = await this.clientResolver.resolveClient(invoice.clientDetailsId);
126
+ if (!client) {
127
+ this.logger.warn(`No email found for client ${invoice.clientDetailsId}, skipping ${emailType} for invoice ${invoice.id}`);
128
+ return;
129
+ }
130
+ const branding = this.brandingResolver
131
+ ? await this.brandingResolver.resolveBranding(invoice.divisionId)
132
+ : DEFAULT_BRANDING;
133
+ const rendered = await render(client, branding);
134
+ await this.sender.send({
135
+ to: client.email,
136
+ from: { email: branding.fromEmail, name: branding.fromName },
137
+ subject: rendered.subject,
138
+ html: rendered.html,
139
+ text: rendered.text,
140
+ });
141
+ this.logger.log(`Sent ${emailType} for invoice ${invoice.invoiceNumber} to ${client.email}`);
142
+ }
143
+ catch (err) {
144
+ this.logger.warn(`Failed to send ${emailType} for invoice ${invoice.id}: ${err instanceof Error ? err.message : String(err)}`);
145
+ }
146
+ }
147
+ };
148
+ exports.PaymentEmailService = PaymentEmailService;
149
+ exports.PaymentEmailService = PaymentEmailService = PaymentEmailService_1 = __decorate([
150
+ (0, common_1.Injectable)(),
151
+ __metadata("design:paramtypes", [core_1.ModuleRef])
152
+ ], PaymentEmailService);
153
+ //# sourceMappingURL=payment-email.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-email.service.js","sourceRoot":"","sources":["../../src/services/payment-email.service.ts"],"names":[],"mappings":"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"}