1import { NextRequest, NextResponse } from 'next/server';
2import { fieldpineServerApi } from '@/lib/server/fieldpineApi';
3import { getRequestContext } from '@/lib/server/sessionUtils';
6 * eLink/BUCK Sales Endpoint
7 * Uses Fieldpine's BUCK API via eLink protocol for sales data
8 * Documentation: https://docs.fieldpine.com/pos/elink.htm
10export async function GET(request: NextRequest) {
12 // Get request context with authentication
13 const context = await getRequestContext(request);
14 if (!context?.session) {
15 return NextResponse.json(
16 { error: 'Authentication required' },
22 const clientId = request.headers.get('x-forwarded-for') ||
23 request.headers.get('x-real-ip') ||
24 context.session.userId ||
26 if (!fieldpineServerApi.checkClientRateLimit(clientId)) {
27 return NextResponse.json(
28 { error: 'Rate limit exceeded' },
33 // Parse query parameters
34 const { searchParams } = new URL(request.url);
35 const params: Record<string, string> = {};
37 const limit = searchParams.get('limit') || searchParams.get('$top');
38 if (limit) params.limit = limit;
40 const startDate = searchParams.get('startDate');
41 if (startDate) params.startDate = startDate;
43 const endDate = searchParams.get('endDate');
44 if (endDate) params.endDate = endDate;
46 const storeId = searchParams.get('storeId');
47 if (storeId) params.storeId = storeId;
49 // Call Fieldpine BUCK API via eLink protocol
51 // Use sale.list for retrieving sales/invoices
52 const buckParams: Record<string, string> = {
53 "3": "retailmax.elink.sale.list",
54 "8": limit || '100', // Limit results
57 console.log('[ELINK Sales] BUCK params:', buckParams);
58 console.log('[ELINK Sales] API Key available:', !!context.session.apiKey);
60 // Add date filters if provided (using proper date filter format)
61 // f110 = CompletedDt field
62 // Filter operator: 4 = greater than or equal, 1 = less than or equal
63 if (params.startDate) {
64 buckParams["9"] = `f110,4,${params.startDate}`;
67 const key = params.startDate ? "9.1" : "9";
68 buckParams[key] = `f110,1,${params.endDate}`;
71 // Add store filter if provided
73 buckParams["7"] = params.storeId;
76 console.log('[ELINK Sales] Final BUCK params:', buckParams);
78 const sales = await fieldpineServerApi.buckApiCall(buckParams, context.session.apiKey);
80 console.log('[ELINK Sales] Raw response:', JSON.stringify(sales).substring(0, 200));
82 // Extract DATS array from BUCK response
83 const salesData = sales?.DATS || [];
85 console.log(`[ELINK Sales] Loaded ${salesData.length} sales`);
87 // Handle no sales found
88 if (!salesData || salesData.length === 0) {
89 console.log('[ELINK Sales] No sales records found');
90 return NextResponse.json({
94 message: 'No sales records found for the specified criteria',
99 return NextResponse.json({
102 count: salesData.length,
107 console.error('[ELINK Sales] Error details:', error);
108 return NextResponse.json(
111 error: 'eLink endpoint unavailable',
112 details: error instanceof Error ? error.message : String(error),
120 console.error('eLink sales error:', error);
121 return NextResponse.json(
122 { error: 'Failed to fetch sales' },