@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,373 @@
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 RefundService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.RefundService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const core_1 = require("@nestjs/core");
19
+ const constants_1 = require("../constants");
20
+ const gateway_registry_service_1 = require("../gateways/gateway-registry.service");
21
+ const payment_email_service_1 = require("./payment-email.service");
22
+ const exceptions_1 = require("../exceptions");
23
+ const REFUNDABLE_STATUSES = new Set([
24
+ 'SUCCEEDED',
25
+ 'PARTIALLY_REFUNDED',
26
+ ]);
27
+ let RefundService = RefundService_1 = class RefundService {
28
+ constructor(invoiceRepo, paymentRepo, refundRepo, webhookIdempotencyRepo, transactionManager, gatewayRegistry, moduleRef) {
29
+ this.invoiceRepo = invoiceRepo;
30
+ this.paymentRepo = paymentRepo;
31
+ this.refundRepo = refundRepo;
32
+ this.webhookIdempotencyRepo = webhookIdempotencyRepo;
33
+ this.transactionManager = transactionManager;
34
+ this.gatewayRegistry = gatewayRegistry;
35
+ this.moduleRef = moduleRef;
36
+ this.logger = new common_1.Logger(RefundService_1.name);
37
+ this.paymentEventListener = null;
38
+ this.paymentEmailService = null;
39
+ }
40
+ onModuleInit() {
41
+ try {
42
+ this.paymentEventListener = this.moduleRef.get(constants_1.PAYMENT_EVENT_LISTENER, {
43
+ strict: false,
44
+ });
45
+ this.logger.log('Refund event listener resolved successfully');
46
+ }
47
+ catch {
48
+ this.paymentEventListener = null;
49
+ this.logger.log('No payment event listener registered — refund event emission disabled');
50
+ }
51
+ try {
52
+ this.paymentEmailService = this.moduleRef.get(payment_email_service_1.PaymentEmailService, {
53
+ strict: false,
54
+ });
55
+ }
56
+ catch {
57
+ this.paymentEmailService = null;
58
+ }
59
+ }
60
+ async createRefund(input) {
61
+ const { refund, refundSnapshot } = await this.transactionManager.runInTransaction(async (repos) => {
62
+ const payment = await repos.payments.findById(input.paymentId);
63
+ if (!payment) {
64
+ throw new exceptions_1.RefundNotAllowedException(`Payment ${input.paymentId} not found`);
65
+ }
66
+ if (!REFUNDABLE_STATUSES.has(payment.status)) {
67
+ throw new exceptions_1.RefundNotAllowedException(`Cannot refund payment in "${payment.status}" status. ` +
68
+ `Payment must be in one of: ${Array.from(REFUNDABLE_STATUSES).join(', ')}.`);
69
+ }
70
+ const existingRefunds = await repos.refunds.findByPaymentId(payment.id);
71
+ const succeededRefundTotal = existingRefunds
72
+ .filter((r) => r.status === 'SUCCEEDED')
73
+ .reduce((sum, r) => sum + r.amount, 0);
74
+ const maxRefundable = payment.amount - succeededRefundTotal;
75
+ const amount = input.amount ?? maxRefundable;
76
+ if (amount <= 0) {
77
+ throw new exceptions_1.RefundNotAllowedException('Payment has already been fully refunded');
78
+ }
79
+ if (amount > maxRefundable) {
80
+ throw new exceptions_1.PaymentAmountExceededException(`Refund amount (${amount}) exceeds maximum refundable amount (${maxRefundable}).`);
81
+ }
82
+ if (payment.provider) {
83
+ return this.createOnlineRefund(repos, payment, amount, input);
84
+ }
85
+ else {
86
+ return this.createManualRefund(repos, payment, amount, input);
87
+ }
88
+ });
89
+ if (refundSnapshot) {
90
+ await this.emitRefundEvent(refundSnapshot);
91
+ }
92
+ if (refund.status === 'SUCCEEDED' && this.paymentEmailService) {
93
+ await this.sendRefundEmail(refund);
94
+ }
95
+ return refund;
96
+ }
97
+ async handleRefundSucceeded(event) {
98
+ const alreadyProcessed = await this.webhookIdempotencyRepo.exists(event.eventId);
99
+ if (alreadyProcessed) {
100
+ this.logger.log(`Skipping already-processed webhook event: ${event.eventId}`);
101
+ return;
102
+ }
103
+ const result = await this.transactionManager.runInTransaction(async (repos) => {
104
+ const payment = await repos.payments.findByProviderPaymentId('stripe', event.providerPaymentId);
105
+ if (!payment) {
106
+ this.logger.error(`Refund succeeded webhook for unknown providerPaymentId=${event.providerPaymentId}. Skipping.`);
107
+ await repos.webhookIdempotency.record(event.eventId);
108
+ return null;
109
+ }
110
+ let refund = await this.findRefundByProviderRefundId(repos.refunds, payment.id, event.providerRefundId);
111
+ if (!refund) {
112
+ this.logger.log(`Creating record for provider-initiated refund: providerRefundId=${event.providerRefundId}`);
113
+ const refundAmount = event.providerData?.refundAmount ?? event.amount;
114
+ refund = await repos.refunds.create({
115
+ paymentId: payment.id,
116
+ amount: refundAmount,
117
+ currency: event.currency,
118
+ status: 'SUCCEEDED',
119
+ providerRefundId: event.providerRefundId,
120
+ providerData: event.providerData,
121
+ createdBy: 'system',
122
+ });
123
+ }
124
+ else if (refund.status !== 'SUCCEEDED') {
125
+ refund = await repos.refunds.update(refund.id, {
126
+ status: 'SUCCEEDED',
127
+ providerData: event.providerData,
128
+ });
129
+ }
130
+ const newStatus = await this.recalculateInvoiceAmounts(repos, payment.invoiceId);
131
+ await this.updatePaymentRefundStatus(repos, payment.id);
132
+ await repos.webhookIdempotency.record(event.eventId);
133
+ const snapshot = await this.buildRefundSnapshot(repos, payment.invoiceId, newStatus);
134
+ return { refundSnapshot: snapshot, refund };
135
+ });
136
+ if (result?.refundSnapshot) {
137
+ await this.emitRefundEvent(result.refundSnapshot);
138
+ }
139
+ if (result?.refund?.status === 'SUCCEEDED' && this.paymentEmailService) {
140
+ await this.sendRefundEmail(result.refund);
141
+ }
142
+ }
143
+ async handleRefundFailed(event) {
144
+ const alreadyProcessed = await this.webhookIdempotencyRepo.exists(event.eventId);
145
+ if (alreadyProcessed) {
146
+ this.logger.log(`Skipping already-processed webhook event: ${event.eventId}`);
147
+ return;
148
+ }
149
+ await this.transactionManager.runInTransaction(async (repos) => {
150
+ const payment = await repos.payments.findByProviderPaymentId('stripe', event.providerPaymentId);
151
+ if (!payment) {
152
+ this.logger.warn(`Refund failed webhook for unknown providerPaymentId=${event.providerPaymentId}. Skipping.`);
153
+ await repos.webhookIdempotency.record(event.eventId);
154
+ return;
155
+ }
156
+ const refund = await this.findRefundByProviderRefundId(repos.refunds, payment.id, event.providerRefundId);
157
+ if (refund && refund.status === 'PENDING') {
158
+ await repos.refunds.update(refund.id, {
159
+ status: 'FAILED',
160
+ providerData: event.providerData,
161
+ });
162
+ }
163
+ await repos.webhookIdempotency.record(event.eventId);
164
+ });
165
+ }
166
+ async refundInvoice(invoiceId, createdBy) {
167
+ const payments = await this.paymentRepo.findByInvoiceId(invoiceId);
168
+ const succeededPayment = payments.find((p) => p.status === 'SUCCEEDED');
169
+ if (!succeededPayment) {
170
+ this.logger.warn(`No SUCCEEDED payment found for invoice ${invoiceId} — cannot refund`);
171
+ return;
172
+ }
173
+ await this.createRefund({
174
+ paymentId: succeededPayment.id,
175
+ createdBy,
176
+ });
177
+ }
178
+ async findRefundsByPaymentId(paymentId) {
179
+ return this.refundRepo.findByPaymentId(paymentId);
180
+ }
181
+ async createOnlineRefund(repos, payment, amount, input) {
182
+ const gateway = this.gatewayRegistry.get(payment.provider);
183
+ let gatewayResult;
184
+ try {
185
+ gatewayResult = await gateway.createRefund({
186
+ providerPaymentId: payment.providerPaymentId,
187
+ amount,
188
+ reason: input.reason,
189
+ });
190
+ }
191
+ catch (error) {
192
+ if (error instanceof exceptions_1.PaymentGatewayException) {
193
+ throw error;
194
+ }
195
+ throw new exceptions_1.PaymentGatewayException(`Failed to create refund with ${payment.provider}: ${error instanceof Error ? error.message : String(error)}`);
196
+ }
197
+ const refund = await repos.refunds.create({
198
+ paymentId: payment.id,
199
+ amount,
200
+ currency: payment.currency,
201
+ status: gatewayResult.status,
202
+ reason: input.reason,
203
+ providerRefundId: gatewayResult.providerRefundId,
204
+ createdBy: input.createdBy,
205
+ });
206
+ this.logger.log(`Online refund created: refundId=${refund.id} providerRefundId=${gatewayResult.providerRefundId} ` +
207
+ `status=${gatewayResult.status} amount=${amount}`);
208
+ let refundSnapshot = null;
209
+ if (gatewayResult.status === 'SUCCEEDED') {
210
+ const newStatus = await this.recalculateInvoiceAmounts(repos, payment.invoiceId);
211
+ await this.updatePaymentRefundStatus(repos, payment.id);
212
+ refundSnapshot = await this.buildRefundSnapshot(repos, payment.invoiceId, newStatus);
213
+ }
214
+ return { refund, refundSnapshot };
215
+ }
216
+ async createManualRefund(repos, payment, amount, input) {
217
+ const refund = await repos.refunds.create({
218
+ paymentId: payment.id,
219
+ amount,
220
+ currency: payment.currency,
221
+ status: 'SUCCEEDED',
222
+ reason: input.reason,
223
+ createdBy: input.createdBy,
224
+ processedBy: input.createdBy,
225
+ });
226
+ const newStatus = await this.recalculateInvoiceAmounts(repos, payment.invoiceId);
227
+ await this.updatePaymentRefundStatus(repos, payment.id);
228
+ const refundSnapshot = await this.buildRefundSnapshot(repos, payment.invoiceId, newStatus);
229
+ this.logger.log(`Manual refund created: refundId=${refund.id} amount=${amount}`);
230
+ return { refund, refundSnapshot };
231
+ }
232
+ async recalculateInvoiceAmounts(repos, invoiceId) {
233
+ const invoice = await repos.invoices.findByIdForUpdate(invoiceId);
234
+ if (!invoice) {
235
+ this.logger.warn(`Invoice ${invoiceId} not found during refund reconciliation`);
236
+ return null;
237
+ }
238
+ const allPayments = await repos.payments.findByInvoiceId(invoiceId);
239
+ const succeededPayments = allPayments.filter((p) => p.status === 'SUCCEEDED' ||
240
+ p.status === 'PARTIALLY_REFUNDED' ||
241
+ p.status === 'REFUNDED');
242
+ const totalPayments = succeededPayments.reduce((sum, p) => sum + p.amount, 0);
243
+ let totalRefunds = 0;
244
+ for (const payment of succeededPayments) {
245
+ const refunds = await repos.refunds.findByPaymentId(payment.id);
246
+ totalRefunds += refunds
247
+ .filter((r) => r.status === 'SUCCEEDED')
248
+ .reduce((sum, r) => sum + r.amount, 0);
249
+ }
250
+ const newAmountPaid = totalPayments - totalRefunds;
251
+ const newAmountDue = invoice.total - newAmountPaid;
252
+ let newStatus;
253
+ if (newAmountPaid <= 0) {
254
+ newStatus = 'REFUNDED';
255
+ }
256
+ else if (newAmountPaid < invoice.total) {
257
+ newStatus = 'PARTIALLY_PAID';
258
+ }
259
+ else {
260
+ newStatus = invoice.status;
261
+ }
262
+ await repos.invoices.update(invoice.id, {
263
+ amountPaid: Math.max(newAmountPaid, 0),
264
+ amountDue: Math.max(newAmountDue, 0),
265
+ status: newStatus,
266
+ });
267
+ this.logger.log(`Invoice ${invoiceId} recalculated: amountPaid=${newAmountPaid} amountDue=${newAmountDue} status=${newStatus}`);
268
+ return newStatus;
269
+ }
270
+ async updatePaymentRefundStatus(repos, paymentId) {
271
+ const payment = await repos.payments.findById(paymentId);
272
+ if (!payment)
273
+ return;
274
+ const refunds = await repos.refunds.findByPaymentId(paymentId);
275
+ const succeededRefundTotal = refunds
276
+ .filter((r) => r.status === 'SUCCEEDED')
277
+ .reduce((sum, r) => sum + r.amount, 0);
278
+ let newStatus;
279
+ if (succeededRefundTotal >= payment.amount) {
280
+ newStatus = 'REFUNDED';
281
+ }
282
+ else if (succeededRefundTotal > 0) {
283
+ newStatus = 'PARTIALLY_REFUNDED';
284
+ }
285
+ else {
286
+ newStatus = 'SUCCEEDED';
287
+ }
288
+ if (newStatus !== payment.status) {
289
+ await repos.payments.update(payment.id, { status: newStatus });
290
+ this.logger.log(`Payment ${paymentId} status updated: ${payment.status} -> ${newStatus}`);
291
+ }
292
+ }
293
+ async sendRefundEmail(refund) {
294
+ if (!this.paymentEmailService)
295
+ return;
296
+ try {
297
+ const payment = await this.paymentRepo.findById(refund.paymentId);
298
+ if (!payment)
299
+ return;
300
+ const invoice = await this.invoiceRepo.findById(payment.invoiceId);
301
+ if (!invoice)
302
+ return;
303
+ await this.paymentEmailService.sendRefundConfirmation(refund, payment, invoice);
304
+ }
305
+ catch (err) {
306
+ this.logger.warn(`Failed to send refund confirmation email for refund ${refund.id}: ${err instanceof Error ? err.message : String(err)}`);
307
+ }
308
+ }
309
+ async buildRefundSnapshot(repos, invoiceId, newStatus) {
310
+ if (!newStatus)
311
+ return null;
312
+ const invoice = await repos.invoices.findById(invoiceId);
313
+ if (!invoice)
314
+ return null;
315
+ return {
316
+ invoiceId: invoice.id,
317
+ divisionId: invoice.divisionId,
318
+ referenceType: invoice.referenceType,
319
+ referenceId: invoice.referenceId,
320
+ newInvoiceStatus: newStatus,
321
+ metadata: null,
322
+ lineItems: [],
323
+ };
324
+ }
325
+ async emitRefundEvent(snapshot) {
326
+ if (!this.paymentEventListener?.onInvoiceRefunded)
327
+ return;
328
+ const enriched = await this.enrichRefundSnapshot(snapshot);
329
+ try {
330
+ await this.paymentEventListener.onInvoiceRefunded(enriched);
331
+ }
332
+ catch (err) {
333
+ this.logger.warn(`Refund event listener failed for invoice ${enriched.invoiceId}: ${err instanceof Error ? err.message : String(err)}`);
334
+ }
335
+ }
336
+ async enrichRefundSnapshot(snapshot) {
337
+ const invoice = await this.invoiceRepo.findByIdWithItems(snapshot.invoiceId);
338
+ if (!invoice)
339
+ return { ...snapshot, metadata: null, lineItems: [] };
340
+ return {
341
+ ...snapshot,
342
+ metadata: invoice.metadata,
343
+ lineItems: invoice.lineItems.map((item) => ({
344
+ id: item.id,
345
+ description: item.description,
346
+ quantity: item.quantity,
347
+ unitPrice: item.unitPrice,
348
+ isTaxable: item.isTaxable,
349
+ referenceType: item.referenceType,
350
+ referenceId: item.referenceId,
351
+ metadata: item.metadata,
352
+ })),
353
+ };
354
+ }
355
+ async findRefundByProviderRefundId(refundRepo, paymentId, providerRefundId) {
356
+ if (!providerRefundId)
357
+ return null;
358
+ const refunds = await refundRepo.findByPaymentId(paymentId);
359
+ return refunds.find((r) => r.providerRefundId === providerRefundId) ?? null;
360
+ }
361
+ };
362
+ exports.RefundService = RefundService;
363
+ exports.RefundService = RefundService = RefundService_1 = __decorate([
364
+ (0, common_1.Injectable)(),
365
+ __param(0, (0, common_1.Inject)(constants_1.INVOICE_REPOSITORY)),
366
+ __param(1, (0, common_1.Inject)(constants_1.PAYMENT_REPOSITORY)),
367
+ __param(2, (0, common_1.Inject)(constants_1.REFUND_REPOSITORY)),
368
+ __param(3, (0, common_1.Inject)(constants_1.WEBHOOK_IDEMPOTENCY_REPOSITORY)),
369
+ __param(4, (0, common_1.Inject)(constants_1.TRANSACTION_MANAGER)),
370
+ __metadata("design:paramtypes", [Object, Object, Object, Object, Object, gateway_registry_service_1.GatewayRegistryService,
371
+ core_1.ModuleRef])
372
+ ], RefundService);
373
+ //# sourceMappingURL=refund.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refund.service.js","sourceRoot":"","sources":["../../src/services/refund.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IPaymentEmailBrandingResolver, PaymentEmailBrandingConfig } from '../interfaces/payment-email.interfaces';
2
+ export declare class StaticBrandingResolver implements IPaymentEmailBrandingResolver {
3
+ private readonly branding;
4
+ constructor(branding: PaymentEmailBrandingConfig);
5
+ resolveBranding(_divisionId: string): Promise<PaymentEmailBrandingConfig>;
6
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StaticBrandingResolver = void 0;
4
+ class StaticBrandingResolver {
5
+ constructor(branding) {
6
+ this.branding = branding;
7
+ }
8
+ async resolveBranding(_divisionId) {
9
+ return this.branding;
10
+ }
11
+ }
12
+ exports.StaticBrandingResolver = StaticBrandingResolver;
13
+ //# sourceMappingURL=static-branding-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-branding-resolver.js","sourceRoot":"","sources":["../../src/services/static-branding-resolver.ts"],"names":[],"mappings":";;;AASA,MAAa,sBAAsB;IACjC,YAA6B,QAAoC;QAApC,aAAQ,GAAR,QAAQ,CAA4B;IAAG,CAAC;IAErE,KAAK,CAAC,eAAe,CACnB,WAAmB;QAEnB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AARD,wDAQC"}
@@ -0,0 +1,240 @@
1
+ export interface DecimalLike {
2
+ toNumber(): number;
3
+ toString(): string;
4
+ }
5
+ export type InvoiceStatus = 'DRAFT' | 'SENT' | 'PARTIALLY_PAID' | 'PAID' | 'OVERDUE' | 'VOID' | 'REFUNDED';
6
+ export type PaymentMethod = 'CREDIT_CARD' | 'DEBIT' | 'E_TRANSFER' | 'BANK_TRANSFER' | 'CHEQUE' | 'CASH' | 'OTHER';
7
+ export type PaymentStatus = 'PENDING' | 'PENDING_CONFIRMATION' | 'PROCESSING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED' | 'REJECTED' | 'REFUNDED' | 'PARTIALLY_REFUNDED';
8
+ export type RefundStatus = 'PENDING' | 'PROCESSING' | 'SUCCEEDED' | 'FAILED';
9
+ export type PaymentPlanStatus = 'ACTIVE' | 'COMPLETED' | 'CANCELLED' | 'DEFAULTED';
10
+ export type InstallmentStatus = 'PENDING' | 'INVOICED' | 'PAID' | 'OVERDUE' | 'WAIVED' | 'CANCELLED';
11
+ export interface Invoice {
12
+ id: string;
13
+ divisionId: string;
14
+ invoiceNumber: string;
15
+ status: InvoiceStatus;
16
+ clientDetailsId: string;
17
+ referenceType: string | null;
18
+ referenceId: string | null;
19
+ paymentPlanId: string | null;
20
+ installmentNumber: number | null;
21
+ recurringInvoiceId: string | null;
22
+ subtotal: number;
23
+ taxRate: DecimalLike;
24
+ taxAmount: number;
25
+ discount: number;
26
+ total: number;
27
+ amountPaid: number;
28
+ amountDue: number;
29
+ currency: string;
30
+ eTransferCode: string | null;
31
+ eTransferAnswer: string | null;
32
+ issuedAt: Date | null;
33
+ dueAt: Date | null;
34
+ notes: string | null;
35
+ clientNotes: string | null;
36
+ metadata: Record<string, unknown> | null;
37
+ createdBy: string;
38
+ voidedBy: string | null;
39
+ voidedAt: Date | null;
40
+ voidReason: string | null;
41
+ createdAt: Date;
42
+ updatedAt: Date;
43
+ }
44
+ export interface InvoiceLineItem {
45
+ id: string;
46
+ invoiceId: string;
47
+ description: string;
48
+ quantity: number;
49
+ unitPrice: number;
50
+ sortOrder: number;
51
+ isTaxable: boolean;
52
+ referenceType: string | null;
53
+ referenceId: string | null;
54
+ metadata: Record<string, unknown> | null;
55
+ createdAt: Date;
56
+ updatedAt: Date;
57
+ }
58
+ export interface InvoiceWithItems extends Invoice {
59
+ lineItems: InvoiceLineItem[];
60
+ }
61
+ export interface Payment {
62
+ id: string;
63
+ invoiceId: string;
64
+ amount: number;
65
+ currency: string;
66
+ method: PaymentMethod;
67
+ status: PaymentStatus;
68
+ provider: string | null;
69
+ providerPaymentId: string | null;
70
+ providerData: Record<string, unknown> | null;
71
+ receiptUrl: string | null;
72
+ referenceNumber: string | null;
73
+ notes: string | null;
74
+ processedAt: Date | null;
75
+ receivedBy: string | null;
76
+ needsReconciliation: boolean;
77
+ createdBy: string;
78
+ createdAt: Date;
79
+ updatedAt: Date;
80
+ }
81
+ export interface Refund {
82
+ id: string;
83
+ paymentId: string;
84
+ amount: number;
85
+ currency: string;
86
+ status: RefundStatus;
87
+ reason: string | null;
88
+ providerRefundId: string | null;
89
+ providerData: Record<string, unknown> | null;
90
+ createdBy: string;
91
+ processedBy: string | null;
92
+ createdAt: Date;
93
+ updatedAt: Date;
94
+ }
95
+ export interface PaymentPlan {
96
+ id: string;
97
+ divisionId: string;
98
+ status: PaymentPlanStatus;
99
+ clientDetailsId: string;
100
+ referenceType: string | null;
101
+ referenceId: string | null;
102
+ totalAmount: number;
103
+ currency: string;
104
+ name: string | null;
105
+ description: string | null;
106
+ createdBy: string;
107
+ cancelledBy: string | null;
108
+ cancelledAt: Date | null;
109
+ cancelReason: string | null;
110
+ createdAt: Date;
111
+ updatedAt: Date;
112
+ }
113
+ export interface PaymentPlanInstallment {
114
+ id: string;
115
+ paymentPlanId: string;
116
+ sequenceOrder: number;
117
+ amount: number;
118
+ status: InstallmentStatus;
119
+ dueAt: Date | null;
120
+ invoiceId: string | null;
121
+ createdAt: Date;
122
+ updatedAt: Date;
123
+ }
124
+ export interface PaymentConfig {
125
+ id: string;
126
+ divisionId: string;
127
+ eTransferEnabled: boolean;
128
+ eTransferAutoDeposit: boolean;
129
+ eTransferEmail: string | null;
130
+ eTransferRecipient: string | null;
131
+ defaultCurrency: string;
132
+ defaultTaxRate: DecimalLike | null;
133
+ createdAt: Date;
134
+ updatedAt: Date;
135
+ }
136
+ export interface PaymentProvider {
137
+ id: string;
138
+ paymentConfigId: string;
139
+ providerType: string;
140
+ isActive: boolean;
141
+ config: Record<string, unknown> | null;
142
+ createdAt: Date;
143
+ updatedAt: Date;
144
+ }
145
+ export interface CreateInvoiceData {
146
+ divisionId: string;
147
+ invoiceNumber: string;
148
+ clientDetailsId: string;
149
+ taxRate: DecimalLike;
150
+ currency: string;
151
+ createdBy: string;
152
+ referenceType?: string;
153
+ referenceId?: string;
154
+ dueAt?: Date;
155
+ notes?: string;
156
+ clientNotes?: string;
157
+ metadata?: Record<string, unknown> | null;
158
+ recurringInvoiceId?: string;
159
+ }
160
+ export interface CreateLineItemData {
161
+ invoiceId: string;
162
+ description: string;
163
+ quantity: number;
164
+ unitPrice: number;
165
+ sortOrder?: number;
166
+ isTaxable?: boolean;
167
+ referenceType?: string;
168
+ referenceId?: string;
169
+ metadata?: Record<string, unknown> | null;
170
+ }
171
+ export interface CreatePaymentData {
172
+ invoiceId: string;
173
+ amount: number;
174
+ currency: string;
175
+ method: PaymentMethod;
176
+ status?: PaymentStatus;
177
+ provider?: string;
178
+ providerPaymentId?: string;
179
+ providerData?: Record<string, unknown>;
180
+ receiptUrl?: string;
181
+ referenceNumber?: string;
182
+ notes?: string;
183
+ processedAt?: Date;
184
+ receivedBy?: string;
185
+ createdBy: string;
186
+ }
187
+ export interface CreateRefundData {
188
+ paymentId: string;
189
+ amount: number;
190
+ currency: string;
191
+ status?: RefundStatus;
192
+ reason?: string;
193
+ providerRefundId?: string;
194
+ providerData?: Record<string, unknown>;
195
+ createdBy: string;
196
+ processedBy?: string;
197
+ }
198
+ export interface CreatePaymentPlanData {
199
+ divisionId: string;
200
+ clientDetailsId: string;
201
+ totalAmount: number;
202
+ currency: string;
203
+ createdBy: string;
204
+ referenceType?: string;
205
+ referenceId?: string;
206
+ name?: string;
207
+ description?: string;
208
+ }
209
+ export interface CreateInstallmentData {
210
+ paymentPlanId: string;
211
+ sequenceOrder: number;
212
+ amount: number;
213
+ dueAt?: Date;
214
+ }
215
+ export interface CreatePaymentConfigData {
216
+ divisionId: string;
217
+ eTransferEnabled?: boolean;
218
+ eTransferAutoDeposit?: boolean;
219
+ eTransferEmail?: string;
220
+ eTransferRecipient?: string;
221
+ defaultCurrency?: string;
222
+ defaultTaxRate?: DecimalLike;
223
+ }
224
+ export interface InvoiceFilter {
225
+ status?: InvoiceStatus;
226
+ clientDetailsId?: string;
227
+ referenceType?: string;
228
+ referenceId?: string;
229
+ createdAfter?: Date;
230
+ createdBefore?: Date;
231
+ recurringInvoiceId?: string;
232
+ }
233
+ export interface PaymentPlanFilter {
234
+ status?: PaymentPlanStatus | PaymentPlanStatus[];
235
+ clientDetailsId?: string;
236
+ referenceType?: string;
237
+ referenceId?: string;
238
+ }
239
+ export * from './recurring-invoice.types';
240
+ export * from './payment-customer.types';