64 lines
3.0 KiB
TypeScript
64 lines
3.0 KiB
TypeScript
import type {CustomerOrder} from '@/types/account';
|
|
|
|
export async function downloadInvoicePdf(element: HTMLElement, filename: string) {
|
|
const [{default: html2canvas}, {jsPDF}] = await Promise.all([import('html2canvas'), import('jspdf')]);
|
|
const canvas = await html2canvas(element, {scale: 2, backgroundColor: '#ffffff', useCORS: true});
|
|
const image = canvas.toDataURL('image/jpeg', 0.95);
|
|
const pdf = new jsPDF({orientation: 'portrait', unit: 'mm', format: 'a4'});
|
|
const pageWidth = pdf.internal.pageSize.getWidth();
|
|
const pageHeight = pdf.internal.pageSize.getHeight();
|
|
const imageHeight = (canvas.height * pageWidth) / canvas.width;
|
|
let remaining = imageHeight;
|
|
let position = 0;
|
|
pdf.addImage(image, 'JPEG', 0, position, pageWidth, imageHeight);
|
|
remaining -= pageHeight;
|
|
while (remaining > 0) {
|
|
position = remaining - imageHeight;
|
|
pdf.addPage();
|
|
pdf.addImage(image, 'JPEG', 0, position, pageWidth, imageHeight);
|
|
remaining -= pageHeight;
|
|
}
|
|
pdf.save(`${filename}.pdf`);
|
|
}
|
|
|
|
export async function downloadInvoiceExcel(order: CustomerOrder, filename: string) {
|
|
const ExcelJS = await import('exceljs');
|
|
const workbook = new ExcelJS.Workbook();
|
|
const sheet = workbook.addWorksheet('پیش فاکتور', {views: [{rightToLeft: true}]});
|
|
sheet.columns = [
|
|
{header: 'نام دستگاه', key: 'name', width: 34},
|
|
{header: 'مدل', key: 'model', width: 14},
|
|
{header: 'امکانات', key: 'modules', width: 44},
|
|
{header: 'تعداد', key: 'quantity', width: 10},
|
|
{header: 'قیمت واحد (ریال)', key: 'unitPrice', width: 22},
|
|
{header: 'جمع (ریال)', key: 'total', width: 22},
|
|
];
|
|
order.items.forEach(item =>
|
|
sheet.addRow({
|
|
name: item.name,
|
|
model: item.model,
|
|
modules: item.modules.join('، '),
|
|
quantity: item.quantity,
|
|
unitPrice: item.unitPrice,
|
|
total: item.unitPrice * item.quantity,
|
|
}),
|
|
);
|
|
const subtotal = order.items.reduce((sum, item) => sum + item.unitPrice * item.quantity, 0);
|
|
const total =
|
|
subtotal - (order.invoice?.discount || 0) + (order.invoice?.shipping || 0) + (order.invoice?.tax || 0);
|
|
sheet.addRow({name: 'مبلغ نهایی', total});
|
|
sheet.getRow(1).font = {bold: true, color: {argb: 'FFFFFFFF'}};
|
|
sheet.getRow(1).fill = {type: 'pattern', pattern: 'solid', fgColor: {argb: 'FF00A693'}};
|
|
sheet.getRow(sheet.rowCount).font = {bold: true, color: {argb: 'FF006D61'}};
|
|
sheet.getColumn('unitPrice').numFmt = '#,##0';
|
|
sheet.getColumn('total').numFmt = '#,##0';
|
|
const buffer = await workbook.xlsx.writeBuffer();
|
|
const blob = new Blob([buffer], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
|
|
const url = URL.createObjectURL(blob);
|
|
const link = document.createElement('a');
|
|
link.href = url;
|
|
link.download = `${filename}.xlsx`;
|
|
link.click();
|
|
URL.revokeObjectURL(url);
|
|
}
|