chore: add new notification for invoice approve and paid invoice

This commit is contained in:
mahyargdz
2025-03-07 16:09:41 +03:30
parent 84317ebe99
commit a4cae0c273
7 changed files with 223 additions and 61 deletions
@@ -83,6 +83,7 @@ export class InvoicesService {
userPhone: user.phone,
userEmail: user.email,
items: invoiceItems.map((item) => item.name).join(", "),
paidAt: invoice.paidAt,
},
queryRunner,
);
@@ -142,30 +143,58 @@ export class InvoicesService {
//********************************** */
async approveInvoiceByUser(invoiceId: string, userId: string, verifyOtpDto: VerifyOtpWithUserId) {
const { code } = verifyOtpDto;
const queryRunner = this.dataSource.createQueryRunner();
const invoice = await this.invoiceRepository.findOneBy({ id: invoiceId, user: { id: userId } });
if (!invoice) throw new BadRequestException(InvoiceMessage.NOT_FOUND_BY_ID);
try {
await queryRunner.connect();
await queryRunner.startTransaction();
const { code } = verifyOtpDto;
const { user } = await this.usersService.findOneById(userId);
const invoice = await queryRunner.manager.findOne(Invoice, {
where: { id: invoiceId, user: { id: userId } },
relations: { items: true },
});
if (!invoice) throw new BadRequestException(InvoiceMessage.NOT_FOUND_BY_ID);
const isValid = await this.otpService.verifyOtp(user.phone, code, "INVOICE_VERIFY");
if (!isValid) throw new BadRequestException(AuthMessage.INVALID_OTP);
const user = await this.usersService.findOneByIdWithQueryRunner(userId, queryRunner);
if (invoice.status === InvoiceStatus.WAIT_PAYMENT) throw new BadRequestException(InvoiceMessage.ALREADY_APPROVED);
if (invoice.status === InvoiceStatus.PAID) throw new BadRequestException(InvoiceMessage.INVOICE_ALREADY_PAID);
if (dayjs().isAfter(invoice.dueDate)) throw new BadRequestException(InvoiceMessage.INVOICE_IS_OVERDUE);
const isValid = await this.otpService.verifyOtp(user.phone, code, "INVOICE_VERIFY");
if (!isValid) throw new BadRequestException(AuthMessage.INVALID_OTP);
if (invoice.status !== InvoiceStatus.PENDING) throw new BadRequestException(InvoiceMessage.INVOICE_CAN_NOT_APPROVED);
if (invoice.status === InvoiceStatus.WAIT_PAYMENT) throw new BadRequestException(InvoiceMessage.ALREADY_APPROVED);
if (invoice.status === InvoiceStatus.PAID) throw new BadRequestException(InvoiceMessage.INVOICE_ALREADY_PAID);
if (dayjs().isAfter(invoice.dueDate)) throw new BadRequestException(InvoiceMessage.INVOICE_IS_OVERDUE);
if (invoice.status !== InvoiceStatus.PENDING) throw new BadRequestException(InvoiceMessage.INVOICE_CAN_NOT_APPROVED);
invoice.status = InvoiceStatus.WAIT_PAYMENT;
invoice.status = InvoiceStatus.WAIT_PAYMENT;
await queryRunner.manager.save(Invoice, invoice);
await this.invoiceRepository.save(invoice);
await this.notificationsService.createApprovedInvoiceNotification(
userId,
{
invoiceId: invoice.numericId.toString(),
dueDate: invoice.dueDate,
createDate: invoice.createdAt,
price: new Decimal(invoice.totalPrice).toNumber(),
userPhone: user.phone,
userEmail: user.email,
items: invoice.items.map((item) => item.name).join(", "),
},
queryRunner,
);
return {
message: InvoiceMessage.APPROVED,
invoice,
};
await queryRunner.commitTransaction();
return {
message: InvoiceMessage.APPROVED,
invoice,
};
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
}
}
///********************************** */
async createInvoiceForSubscription(user: User, plan: SubscriptionPlan, userSub: UserSubscription, dueDate: Date, qryRnr: QueryRunner) {
@@ -319,6 +348,22 @@ export class InvoicesService {
invoice.paidAt = dayjs().toDate();
await queryRunner.manager.save(Invoice, invoice);
await this.notificationsService.createBillInvoiceNotification(
userId,
{
invoiceId: invoice.numericId.toString(),
dueDate: invoice.dueDate,
createDate: invoice.createdAt,
price: new Decimal(invoice.totalPrice).toNumber(),
userPhone: user.phone,
userEmail: user.email,
items: invoice.items.map((item) => item.name).join(", "),
paidAt: invoice.paidAt,
},
queryRunner,
);
await queryRunner.commitTransaction();
return {
message: InvoiceMessage.INVOICE_PAID,