updates
This commit is contained in:
parent
9d49245efa
commit
06500a614d
|
|
@ -291,18 +291,18 @@ async function addExpenseTable(doc: PDFKit.PDFDocument, expenses: Expense[], opt
|
||||||
const rowHeight = 25;
|
const rowHeight = 25;
|
||||||
const fontSize = 9;
|
const fontSize = 9;
|
||||||
|
|
||||||
// Column definitions
|
// Column definitions - adjusted for better layout
|
||||||
const columns = [
|
const columns = [
|
||||||
{ header: 'Date', width: 70, x: 60 },
|
{ header: 'Date', width: 65, x: 60 },
|
||||||
{ header: 'Establishment', width: 120, x: 130 },
|
{ header: 'Establishment', width: 110, x: 125 },
|
||||||
{ header: 'Category', width: 60, x: 250 },
|
{ header: 'Category', width: 55, x: 235 },
|
||||||
{ header: 'Payer', width: 60, x: 310 },
|
{ header: 'Payer', width: 50, x: 290 },
|
||||||
{ header: 'Amount', width: 60, x: 370 },
|
{ header: 'Amount', width: 55, x: 340 },
|
||||||
{ header: 'Payment', width: 50, x: 430 }
|
{ header: 'Payment', width: 45, x: 395 }
|
||||||
];
|
];
|
||||||
|
|
||||||
if (options.includeReceiptContents) {
|
if (options.includeReceiptContents) {
|
||||||
columns.push({ header: 'Description', width: 85, x: 480 });
|
columns.push({ header: 'Description', width: 105, x: 440 });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw table header
|
// Draw table header
|
||||||
|
|
@ -404,7 +404,7 @@ async function drawExpenseRows(
|
||||||
|
|
||||||
if (options.includeReceiptContents) {
|
if (options.includeReceiptContents) {
|
||||||
const description = expense.Contents || 'N/A';
|
const description = expense.Contents || 'N/A';
|
||||||
rowData.push(description.length > 30 ? description.substring(0, 27) + '...' : description);
|
rowData.push(description.length > 40 ? description.substring(0, 37) + '...' : description);
|
||||||
}
|
}
|
||||||
|
|
||||||
rowData.forEach((data, colIndex) => {
|
rowData.forEach((data, colIndex) => {
|
||||||
|
|
@ -534,30 +534,75 @@ async function fetchReceiptImage(receipt: any): Promise<Buffer | null> {
|
||||||
const client = getMinioClient();
|
const client = getMinioClient();
|
||||||
const bucketName = useRuntimeConfig().minio.bucketName;
|
const bucketName = useRuntimeConfig().minio.bucketName;
|
||||||
|
|
||||||
// Determine the file path
|
// Determine the file path - try multiple possible locations
|
||||||
let filePath = receipt.url;
|
let filePath = null;
|
||||||
if (!filePath && receipt.directus_files_id?.filename_download) {
|
|
||||||
|
// Try different receipt data structures
|
||||||
|
if (receipt.url) {
|
||||||
|
filePath = receipt.url;
|
||||||
|
} else if (receipt.directus_files_id?.filename_download) {
|
||||||
filePath = receipt.directus_files_id.filename_download;
|
filePath = receipt.directus_files_id.filename_download;
|
||||||
|
} else if (receipt.filename_download) {
|
||||||
|
filePath = receipt.filename_download;
|
||||||
|
} else if (receipt.id && receipt.filename_disk) {
|
||||||
|
filePath = receipt.filename_disk;
|
||||||
|
} else if (typeof receipt === 'string') {
|
||||||
|
filePath = receipt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!filePath) {
|
if (!filePath) {
|
||||||
console.log('[expenses/generate-pdf] No file path found for receipt');
|
console.log('[expenses/generate-pdf] No file path found for receipt:', JSON.stringify(receipt, null, 2));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('[expenses/generate-pdf] Fetching receipt image:', filePath);
|
console.log('[expenses/generate-pdf] Fetching receipt image from path:', filePath);
|
||||||
|
|
||||||
// Get the object from MinIO
|
// Remove any URL prefixes if present
|
||||||
const dataStream = await client.getObject(bucketName, filePath);
|
if (filePath.includes('/files/')) {
|
||||||
|
const parts = filePath.split('/files/');
|
||||||
|
if (parts.length > 1) {
|
||||||
|
filePath = parts[parts.length - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Convert stream to buffer
|
// Ensure we're looking in the right place - sometimes files are in receipts/ folder
|
||||||
const chunks: Buffer[] = [];
|
const possiblePaths = [
|
||||||
|
filePath,
|
||||||
|
`receipts/${filePath}`,
|
||||||
|
`expenses/${filePath}`,
|
||||||
|
filePath.startsWith('receipts/') ? filePath : `receipts/${filePath}`
|
||||||
|
];
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
for (const testPath of possiblePaths) {
|
||||||
dataStream.on('data', (chunk) => chunks.push(chunk));
|
try {
|
||||||
dataStream.on('end', () => resolve(Buffer.concat(chunks)));
|
console.log('[expenses/generate-pdf] Trying path:', testPath);
|
||||||
dataStream.on('error', reject);
|
|
||||||
});
|
// Check if object exists first
|
||||||
|
await client.statObject(bucketName, testPath);
|
||||||
|
|
||||||
|
// Get the object from MinIO
|
||||||
|
const dataStream = await client.getObject(bucketName, testPath);
|
||||||
|
|
||||||
|
// Convert stream to buffer
|
||||||
|
const chunks: Buffer[] = [];
|
||||||
|
|
||||||
|
const imageBuffer = await new Promise<Buffer>((resolve, reject) => {
|
||||||
|
dataStream.on('data', (chunk) => chunks.push(chunk));
|
||||||
|
dataStream.on('end', () => resolve(Buffer.concat(chunks)));
|
||||||
|
dataStream.on('error', reject);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('[expenses/generate-pdf] Successfully fetched image from:', testPath, 'Size:', imageBuffer.length);
|
||||||
|
return imageBuffer;
|
||||||
|
|
||||||
|
} catch (pathError) {
|
||||||
|
console.log('[expenses/generate-pdf] Path not found:', testPath);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('[expenses/generate-pdf] Could not find image in any of the attempted paths');
|
||||||
|
return null;
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[expenses/generate-pdf] Error fetching receipt image:', error);
|
console.error('[expenses/generate-pdf] Error fetching receipt image:', error);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue