1import { NextRequest, NextResponse } from 'next/server';
2import { fieldpineServerApi } from '@/lib/server/fieldpineApi';
3import { getStoredAuth } from '@/lib/server/auth';
5export async function GET(
7 context: { params: Promise<{ id: string }> }
10 const { id: saleId } = await context.params;
12 // Get authentication from server-side store
13 const authData = await getStoredAuth();
14 if (!authData?.authenticated) {
15 return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
18 // Fetch sale details using saleflat.list for denormalized data with line items
19 console.log(`[Sale Details API] Fetching sale ${saleId}`);
21 // Use saleflat.list which returns denormalized sale data including line items and payments
22 let response = await fieldpineServerApi.buckApiCall(
24 '3': 'retailmax.elink.saleflat.list',
25 '9': `f100,eq,${saleId}`, // Filter by sale ID
31 console.log(`[Sale Details API] saleflat.list returned ${response?.DATS?.length || 0} records`);
33 if (!response?.DATS || response.DATS.length === 0) {
34 // Fallback to sale.list if saleflat doesn't work
35 console.log(`[Sale Details API] Trying sale.list with picking filter...`);
36 response = await fieldpineServerApi.buckApiCall(
38 '3': 'retailmax.elink.sale.list',
39 '9': 'f108,in,200,202',
40 '10': '2000,2001,2003,7000,905,906,907,130,131,133,902',
46 const sale = response?.DATS?.find((s: any) => s.f100 == saleId);
49 return NextResponse.json(
50 { success: false, error: `Sale ${saleId} not found` },
55 console.log(`[Sale Details API] Found sale ${saleId} via sale.list (no line items available)`);
56 return NextResponse.json({
62 // saleflat.list returns one row per line item, so we need to aggregate
63 const saleRows = response.DATS;
64 const firstRow = saleRows[0];
66 // Build LINE array from flat rows
67 const lineItems = saleRows.map((row: any) => ({
68 f200: row.f200, // Product ID
69 f202: row.f202, // Qty
70 f205: row.f205, // Total Price
71 f212: row.f212, // Description
72 f213: row.f213, // PLU
73 f303: row.f303, // Total Inc Tax
74 f304: row.f304, // Total Ex Tax
78 // Build sale object with aggregated data
90 PAYM: firstRow.PAYM, // Payments might still be in sub-array
95 console.log(`[Sale Details API] Built sale ${saleId} with ${lineItems.length} line items`);
97 return NextResponse.json({
101 } catch (error: any) {
102 console.error('[Sale Details API] Error fetching sale details:', error);
103 console.error('[Sale Details API] Error message:', error?.message);
104 return NextResponse.json(
105 { success: false, error: error?.message || 'Failed to fetch sale details' },