EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
route.ts
Go to the documentation of this file.
1import { NextRequest, NextResponse } from 'next/server';
2import { fieldpineServerApi } from '@/lib/server/fieldpineApi';
3import { getRequestContext } from '@/lib/server/sessionUtils';
4
5/**
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
9 */
10export async function GET(request: NextRequest) {
11 try {
12 // Get request context with authentication
13 const context = await getRequestContext(request);
14 if (!context?.session) {
15 return NextResponse.json(
16 { error: 'Authentication required' },
17 { status: 401 }
18 );
19 }
20
21 // Rate limiting
22 const clientId = request.headers.get('x-forwarded-for') ||
23 request.headers.get('x-real-ip') ||
24 context.session.userId ||
25 'unknown';
26 if (!fieldpineServerApi.checkClientRateLimit(clientId)) {
27 return NextResponse.json(
28 { error: 'Rate limit exceeded' },
29 { status: 429 }
30 );
31 }
32
33 // Parse query parameters
34 const { searchParams } = new URL(request.url);
35 const params: Record<string, string> = {};
36
37 const limit = searchParams.get('limit') || searchParams.get('$top');
38 if (limit) params.limit = limit;
39
40 const startDate = searchParams.get('startDate');
41 if (startDate) params.startDate = startDate;
42
43 const endDate = searchParams.get('endDate');
44 if (endDate) params.endDate = endDate;
45
46 const storeId = searchParams.get('storeId');
47 if (storeId) params.storeId = storeId;
48
49 // Call Fieldpine BUCK API via eLink protocol
50 try {
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
55 };
56
57 console.log('[ELINK Sales] BUCK params:', buckParams);
58 console.log('[ELINK Sales] API Key available:', !!context.session.apiKey);
59
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}`;
65 }
66 if (params.endDate) {
67 const key = params.startDate ? "9.1" : "9";
68 buckParams[key] = `f110,1,${params.endDate}`;
69 }
70
71 // Add store filter if provided
72 if (params.storeId) {
73 buckParams["7"] = params.storeId;
74 }
75
76 console.log('[ELINK Sales] Final BUCK params:', buckParams);
77
78 const sales = await fieldpineServerApi.buckApiCall(buckParams, context.session.apiKey);
79
80 console.log('[ELINK Sales] Raw response:', JSON.stringify(sales).substring(0, 200));
81
82 // Extract DATS array from BUCK response
83 const salesData = sales?.DATS || [];
84
85 console.log(`[ELINK Sales] Loaded ${salesData.length} sales`);
86
87 // Handle no sales found
88 if (!salesData || salesData.length === 0) {
89 console.log('[ELINK Sales] No sales records found');
90 return NextResponse.json({
91 success: true,
92 data: [],
93 count: 0,
94 message: 'No sales records found for the specified criteria',
95 source: 'elink'
96 });
97 }
98
99 return NextResponse.json({
100 success: true,
101 data: salesData,
102 count: salesData.length,
103 source: 'elink'
104 });
105
106 } catch (error) {
107 console.error('[ELINK Sales] Error details:', error);
108 return NextResponse.json(
109 {
110 success: false,
111 error: 'eLink endpoint unavailable',
112 details: error instanceof Error ? error.message : String(error),
113 source: 'elink'
114 },
115 { status: 503 }
116 );
117 }
118
119 } catch (error) {
120 console.error('eLink sales error:', error);
121 return NextResponse.json(
122 { error: 'Failed to fetch sales' },
123 { status: 500 }
124 );
125 }
126}