update: the invoice service
This commit is contained in:
@@ -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);
|
||||
}
|
||||
//********************************** */
|
||||
|
||||
Reference in New Issue
Block a user