|
|
import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from "@nestjs/common"; |
|
|
import { InjectModel } from "@nestjs/sequelize"; |
|
|
import { Invoice } from "./entities/invoice.entity"; |
|
|
import { CartService } from "src/cart/cart.service"; |
|
|
import { User } from "src/users/entities/user.entity"; |
|
|
|
|
|
@Injectable() |
|
|
export class InvoiceService { |
|
|
constructor( |
|
|
@InjectModel(Invoice) private readonly invoiceModel: typeof Invoice, |
|
|
@Inject(forwardRef(() => CartService)) |
|
|
private cartService: CartService, |
|
|
) {} |
|
|
|
|
|
async createInvoiceFromCart(userId: number): Promise<Invoice[]> { |
|
|
const user = await User.findByPk(userId); |
|
|
if (!user) { |
|
|
throw new HttpException("User not found", HttpStatus.NOT_FOUND); |
|
|
} |
|
|
|
|
|
const userCartItems = await this.cartService.getUserCart(userId); |
|
|
if (!userCartItems || userCartItems.cartItems.length === 0) { |
|
|
throw new HttpException("Cart is empty", HttpStatus.BAD_REQUEST); |
|
|
} |
|
|
|
|
|
const invoices: Invoice[] = []; |
|
|
|
|
|
for (const cartItem of userCartItems.cartItems) { |
|
|
const invoice = await this.invoiceModel.create({ |
|
|
userId, |
|
|
firstName: user.firstName, |
|
|
lastName: user.lastName, |
|
|
phoneNumber: user.phoneNumber, |
|
|
email: user.email, |
|
|
totalPaymentAmount: userCartItems.totalPrice, |
|
|
productId: cartItem.productId, |
|
|
quantity: cartItem.quantity, |
|
|
price: cartItem.productPrice, |
|
|
totalPrice:(cartItem.quantity*cartItem.productPrice), |
|
|
productName: cartItem.productName, |
|
|
}); |
|
|
|
|
|
invoices.push(invoice); |
|
|
} |
|
|
|
|
|
return invoices; // بازگرداندن آرایهای از فاکتورها |
|
|
} |
|
|
|
|
|
|
|
|
async getInvoicesByUser(userId: number): Promise<Invoice[]> { |
|
|
try { |
|
|
if (!userId) { |
|
|
throw new HttpException("User ID is required.", HttpStatus.BAD_REQUEST); |
|
|
} |
|
|
|
|
|
const invoices = await this.invoiceModel.findAll({ |
|
|
where: { userId }, |
|
|
}); |
|
|
|
|
|
if (!invoices || invoices.length === 0) { |
|
|
throw new HttpException("No invoices found for this user.", HttpStatus.NOT_FOUND); |
|
|
} |
|
|
|
|
|
return invoices; |
|
|
} catch (error) { |
|
|
if (error instanceof HttpException) { |
|
|
throw error; |
|
|
} |
|
|
throw new HttpException("An error occurred while retrieving invoices.", HttpStatus.INTERNAL_SERVER_ERROR); |
|
|
} |
|
|
} |
|
|
}
|
|
|
|