diff --git a/src/app/profile/orders/[id]/components/OrderSidebar.tsx b/src/app/profile/orders/[id]/components/OrderSidebar.tsx index e436dbe..41e8422 100644 --- a/src/app/profile/orders/[id]/components/OrderSidebar.tsx +++ b/src/app/profile/orders/[id]/components/OrderSidebar.tsx @@ -1,10 +1,9 @@ 'use client' -import React, { useState } from 'react' +import React from 'react' import { Button } from '@/components/ui/button' import TrackCode from './TrackCode' import { Payment, User, ShipmentAddress } from '../../types/Types' -import * as api from '../../service/Service' -import { toast } from '@/components/Toast' +import { useRouter } from 'next/navigation' interface OrderSidebarProps { orderData: { @@ -20,29 +19,7 @@ interface OrderSidebarProps { } const OrderSidebar: React.FC = ({ orderData, orderId }) => { - const [isLoadingInvoice, setIsLoadingInvoice] = useState(false) - - const handleInvoice = async () => { - try { - setIsLoadingInvoice(true) - const blob = await api.getInvoice(orderId.toString()) - - const url = window.URL.createObjectURL(blob) - const link = document.createElement('a') - link.href = url - link.download = `invoice-${orderId}.pdf` - document.body.appendChild(link) - link.click() - document.body.removeChild(link) - window.URL.revokeObjectURL(url) - - toast("فاکتور با موفقیت دانلود شد", "success") - } catch (error) { - toast("مشکلی در دانلود فاکتور رخ داد", "error") - } finally { - setIsLoadingInvoice(false) - } - } + const router = useRouter() return (
@@ -92,10 +69,9 @@ const OrderSidebar: React.FC = ({ orderData, orderId }) => {
) diff --git a/src/app/profile/orders/[id]/invoice/page.tsx b/src/app/profile/orders/[id]/invoice/page.tsx new file mode 100644 index 0000000..85d5a5f --- /dev/null +++ b/src/app/profile/orders/[id]/invoice/page.tsx @@ -0,0 +1,236 @@ +'use client' +import { useGetOrderDetail } from "@/app/profile/orders/hooks/useOrdersData" +import { NumberFormat, toJalaliDate } from "@/config/func" +import { useRouter, useParams } from "next/navigation" +import { useEffect } from "react" +import Image from "next/image" +import Layout from "@/hoc/Layout" + +const OrderInvoicePage = () => { + const { id } = useParams() + const { data, isLoading } = useGetOrderDetail(id as string) + const router = useRouter() + + useEffect(() => { + if (!isLoading && !data?.results?.order) { + router.push('/profile/orders') + } + }, [data, isLoading, router]) + + if (isLoading) { + return ( +
+
در حال بارگذاری...
+
+ ) + } + + const order = data?.results?.order + if (!order) return null + + const handlePrint = () => { + window.print() + } + + // محاسبه تعداد کل محصولات + const totalItemsCount = order.orderItems.reduce((sum, orderItem) => { + return sum + orderItem.shipmentItems.reduce((itemSum, item) => itemSum + item.quantity, 0) + }, 0) + + // محاسبه قیمت‌ها + const totalRetailPrice = order.payment.priceDetails.total_retail_price + const totalDiscount = order.payment.priceDetails.total_discount + const couponDiscount = order.payment.priceDetails.coupon_discount + const shippingCost = order.payment.priceDetails.shipping_cost + const totalPrice = order.payment.totalPrice + + return ( +
+
+
+ + +
+ +
+
+
+ لوگو +
+
+

فاکتور خرید

+

+ تاریخ: {order.createdAt} +

+
+
+ +
+
+

نام و نام خانوادگی

+

{order.user?.fullName || '-'}

+
+
+

شماره تماس

+

{order.shipmentAddress.phone || '-'}

+
+
+

شماره سفارش

+

{NumberFormat(order._id)}

+
+
+

تعداد کالا

+

{NumberFormat(totalItemsCount)} محصول

+
+
+

آدرس تحویل

+

+ {order.shipmentAddress.province}, {order.shipmentAddress.city}, {order.shipmentAddress.address} +

+
+
+

کدپستی

+

{order.shipmentAddress.postalCode}

+
+
+

شناسه تراکنش

+

{order.payment.transaction_id || '-'}

+
+
+ +
+

لیست محصولات

+
+ + + + + + + + + + + + + {order.orderItems.flatMap((orderItem, orderIndex) => + orderItem.shipmentItems.map((item, itemIndex) => { + const globalIndex = order.orderItems + .slice(0, orderIndex) + .reduce((sum, oi) => sum + oi.shipmentItems.length, 0) + itemIndex + + const retailPrice = item.retail_price + const sellingPrice = item.selling_price + const totalRetail = retailPrice * item.quantity + const totalSelling = sellingPrice * item.quantity + const discount = totalRetail - totalSelling + + return ( + + + + + + + + + ) + }) + )} + +
ردیفمحصولتعدادقیمت واحدتخفیفقیمت کل
+ {NumberFormat(globalIndex + 1)} + +
+

{item.product.title_fa}

+

+ فروشنده: {orderItem.shop.shopName} +

+ {item.variant.warranty && ( +

+ گارانتی: {item.variant.warranty.name} +

+ )} +
+
+ {NumberFormat(item.quantity)} + + {NumberFormat(retailPrice)} تومان + + {discount > 0 ? `${NumberFormat(discount)} تومان` : '-'} + + {NumberFormat(totalSelling)} تومان +
+
+
+ +
+
+
+
+ قیمت کالاها: + {NumberFormat(totalRetailPrice)} تومان +
+
+ تخفیف: + + {NumberFormat(totalDiscount)} تومان + +
+ {couponDiscount > 0 && ( +
+ تخفیف کد تخفیف: + + {NumberFormat(couponDiscount)} تومان + +
+ )} +
+ هزینه ارسال: + {NumberFormat(shippingCost)} تومان +
+
+ جمع کل: + + {NumberFormat(totalPrice)} تومان + +
+
+
+
+ +
+

+ این فاکتور برای سفارش شماره {NumberFormat(order._id)} صادر شده است. +

+
+
+
+
+ ) +} + +export default function OrderInvoiceWithLayout() { + return ( + + + + ) +} + diff --git a/src/app/profile/orders/service/Service.ts b/src/app/profile/orders/service/Service.ts index 7ae70bc..122243f 100644 --- a/src/app/profile/orders/service/Service.ts +++ b/src/app/profile/orders/service/Service.ts @@ -21,13 +21,6 @@ export const getOrderDetail = async ( return data; }; -export const getInvoice = async (orderId: string) => { - const { data } = await axios.get(`/order/${orderId}/invoice`, { - responseType: "blob", - }); - return data; -}; - export const getCancelReasons = async (): Promise => { const { data } = await axios.get(`/cancel/reasons`); return data;