update: the invoice service

This commit is contained in:
mahyargdz
2025-04-23 14:29:48 +03:30
parent 4d01c87eb2
commit 10a7653451
6 changed files with 107 additions and 6 deletions
@@ -69,18 +69,41 @@ export class InvoiceProcessor extends WorkerProcessor {
}
//********************************** */
private async validateRecurringInvoice(invoice: Invoice): Promise<void> {
if (!invoice.isRecurring) throw new Error(`Invoice ${invoice.id} is not set up for recurring billing`);
if (invoice.maxRecurringCycles && invoice.currentRecurringCycle >= invoice.maxRecurringCycles) {
throw new Error(`Maximum recurring cycles (${invoice.maxRecurringCycles}) reached for invoice ${invoice.id}`);
}
if (invoice.status === InvoiceStatus.CANCELLED) throw new Error(`Cannot create recurring invoice for cancelled invoice ${invoice.id}`);
}
//********************************** */
private async handleAdminCreatedInvoice(invoice: Invoice, queryRunner: QueryRunner): Promise<Invoice> {
this.logger.verbose(`Creating admin-initiated recurring invoice in draft status`);
await this.validateRecurringInvoice(invoice);
const newInvoice = queryRunner.manager.create(Invoice, {
user: invoice.user,
status: InvoiceStatus.DRAFT,
dueDate: dayjs().add(INVOICE.DUEDATE, "day").toDate(),
totalPrice: invoice.totalPrice,
originalPrice: invoice.originalPrice,
tax: invoice.tax,
items: invoice.items,
isRecurring: invoice.isRecurring,
recurringPeriod: invoice.recurringPeriod,
maxRecurringCycles: invoice.maxRecurringCycles,
currentRecurringCycle: invoice.currentRecurringCycle + 1,
});
// Update the original invoice's current recurring cycle
invoice.currentRecurringCycle += 1;
await queryRunner.manager.save(Invoice, invoice);
await this.sendNotificationToAdmins(invoice, queryRunner);
return queryRunner.manager.save(Invoice, newInvoice);
@@ -90,12 +113,24 @@ export class InvoiceProcessor extends WorkerProcessor {
private async handleSubscriptionInvoice(invoice: Invoice, queryRunner: QueryRunner): Promise<Invoice> {
this.logger.verbose(`Creating subscription-based recurring invoice`);
await this.validateRecurringInvoice(invoice);
const userSubscriptionPlan = invoice.items[0]?.subscriptionPlan;
if (!userSubscriptionPlan) throw new Error(`No subscription plan found for invoice ${invoice.id}`);
if (!userSubscriptionPlan) {
throw new Error(`No subscription plan found for invoice ${invoice.id}`);
}
if (userSubscriptionPlan.status !== SubscriptionStatus.ACTIVE) {
throw new Error(`Subscription plan ${userSubscriptionPlan.id} is not active`);
}
const { plan } = userSubscriptionPlan;
const dueDate = dayjs().add(INVOICE.DUEDATE, "day").toDate();
// Update the original invoice's current recurring cycle
invoice.currentRecurringCycle += 1;
await queryRunner.manager.save(Invoice, invoice);
return this.invoicesService.createInvoiceForSubscription(invoice.user, plan, userSubscriptionPlan, dueDate, queryRunner);
}
//********************************** */