chore: add service to approve a invoice by user
This commit is contained in:
@@ -335,6 +335,11 @@ export const enum InvoiceMessage {
|
|||||||
CREATED = "فاکتور با موفقیت ایجاد شد",
|
CREATED = "فاکتور با موفقیت ایجاد شد",
|
||||||
SEARCH_QUERY_MUST_BE_A_STRING = "رشته جستجو باید یک رشته باشد",
|
SEARCH_QUERY_MUST_BE_A_STRING = "رشته جستجو باید یک رشته باشد",
|
||||||
NOT_FOUND_BY_ID = "فاکتوری با این شناسه یافت نشد",
|
NOT_FOUND_BY_ID = "فاکتوری با این شناسه یافت نشد",
|
||||||
|
APPROVED = "فاکتور با موفقیت تایید شد",
|
||||||
|
ALREADY_APPROVED = "فاکتور قبلا تایید شده است",
|
||||||
|
INVOICE_CAN_NOT_APPROVED = "فاکتور قابل تایید نیست",
|
||||||
|
INVOICE_ALREADY_PAID = "فاکتور قبلا پرداخت شده است",
|
||||||
|
INVOICE_IS_OVERDUE = "فاکتور منقضی شده است",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const enum LearningMessage {
|
export const enum LearningMessage {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
export enum InvoiceStatus {
|
export enum InvoiceStatus {
|
||||||
|
APPROVED = "APPROVED",
|
||||||
PENDING = "PENDING",
|
PENDING = "PENDING",
|
||||||
PAID = "PAID",
|
PAID = "PAID",
|
||||||
EXPIRED = "EXPIRED",
|
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 { ApiOperation } from "@nestjs/swagger";
|
||||||
|
|
||||||
import { ApplyDiscountDto } from "./DTO/apply-discount-invoice.dto";
|
import { ApplyDiscountDto } from "./DTO/apply-discount-invoice.dto";
|
||||||
@@ -48,6 +48,13 @@ export class InvoicesController {
|
|||||||
return this.invoiceService.getInvoiceById(paramDto.id, isAdmin, userId);
|
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")
|
@Post(":id/apply-discount")
|
||||||
async applyDiscount(@Param() paramDto: ParamDto, @Body() applyDiscountDto: ApplyDiscountDto) {
|
async applyDiscount(@Param() paramDto: ParamDto, @Body() applyDiscountDto: ApplyDiscountDto) {
|
||||||
return this.invoiceService.applyDiscount(paramDto.id, applyDiscountDto);
|
return this.invoiceService.applyDiscount(paramDto.id, applyDiscountDto);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { BadRequestException, Injectable } from "@nestjs/common";
|
import { BadRequestException, Injectable } from "@nestjs/common";
|
||||||
// eslint-disable-next-line import/no-named-as-default
|
// eslint-disable-next-line import/no-named-as-default
|
||||||
|
import dayjs from "dayjs";
|
||||||
import Decimal from "decimal.js";
|
import Decimal from "decimal.js";
|
||||||
import { QueryRunner } from "typeorm";
|
import { QueryRunner } from "typeorm";
|
||||||
|
|
||||||
@@ -59,7 +60,27 @@ export class InvoicesService {
|
|||||||
invoice,
|
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) {
|
async createInvoiceForSubscription(userId: string, plan: SubscriptionPlan, dueDate: Date, queryRunner: QueryRunner) {
|
||||||
|
|||||||
Reference in New Issue
Block a user