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 { 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 { 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); } } }