chore: add service to approve a invoice by user

This commit is contained in:
mahyargdz
2025-02-17 16:23:08 +03:30
parent 0cd59e0212
commit 6014da7e73
4 changed files with 35 additions and 1 deletions
+5
View File
@@ -335,6 +335,11 @@ export const enum InvoiceMessage {
CREATED = "فاکتور با موفقیت ایجاد شد",
SEARCH_QUERY_MUST_BE_A_STRING = "رشته جستجو باید یک رشته باشد",
NOT_FOUND_BY_ID = "فاکتوری با این شناسه یافت نشد",
APPROVED = "فاکتور با موفقیت تایید شد",
ALREADY_APPROVED = "فاکتور قبلا تایید شده است",
INVOICE_CAN_NOT_APPROVED = "فاکتور قابل تایید نیست",
INVOICE_ALREADY_PAID = "فاکتور قبلا پرداخت شده است",
INVOICE_IS_OVERDUE = "فاکتور منقضی شده است",
}
export const enum LearningMessage {
@@ -1,4 +1,5 @@
export enum InvoiceStatus {
APPROVED = "APPROVED",
PENDING = "PENDING",
PAID = "PAID",
EXPIRED = "EXPIRED",
+8 -1
View File
@@ -1,4 +1,4 @@
import { Body, Controller, Get, Param, Post, Query } from "@nestjs/common";
import { Body, Controller, Get, Param, Patch, Post, Query } from "@nestjs/common";
import { ApiOperation } from "@nestjs/swagger";
import { ApplyDiscountDto } from "./DTO/apply-discount-invoice.dto";
@@ -48,6 +48,13 @@ export class InvoicesController {
return this.invoiceService.getInvoiceById(paramDto.id, isAdmin, userId);
}
@ApiOperation({ summary: "approve invoice by user" })
@AuthGuards()
@Patch(":id/approve")
approveInvoiceByUser(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
return this.invoiceService.approveInvoiceByUser(paramDto.id, userId);
}
@Post(":id/apply-discount")
async applyDiscount(@Param() paramDto: ParamDto, @Body() applyDiscountDto: ApplyDiscountDto) {
return this.invoiceService.applyDiscount(paramDto.id, applyDiscountDto);
@@ -1,5 +1,6 @@
import { BadRequestException, Injectable } from "@nestjs/common";
// eslint-disable-next-line import/no-named-as-default
import dayjs from "dayjs";
import Decimal from "decimal.js";
import { QueryRunner } from "typeorm";
@@ -59,7 +60,27 @@ export class InvoicesService {
invoice,
};
}
///********************************** */
async approveInvoiceByUser(invoiceId: string, userId: string) {
const invoice = await this.invoiceRepository.findOneBy({ id: invoiceId, user: { id: userId } });
if (!invoice) throw new BadRequestException(InvoiceMessage.NOT_FOUND_BY_ID);
if (invoice.status === InvoiceStatus.APPROVED) 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.APPROVED;
await this.invoiceRepository.save(invoice);
return {
message: InvoiceMessage.APPROVED,
invoice,
};
}
///********************************** */
async createInvoiceForSubscription(userId: string, plan: SubscriptionPlan, dueDate: Date, queryRunner: QueryRunner) {