chore: add service to approve a invoice by user
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user