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 { getStoredAuth } from '@/lib/server/auth';
4
5/**
6 * Individual Sale Operations (using BUCK API)
7 * GET /api/v1/openapi/sales/[id] - Get sale details
8 * PUT /api/v1/openapi/sales/[id] - Update sale
9 * DELETE /api/v1/openapi/sales/[id] - Delete/void sale
10 *
11 * Note: Uses BUCK API (retailmax.elink.sale.*) since OpenAPI Sales endpoint
12 * is not consistently available across all Fieldpine installations.
13 */
14
15export async function GET(
16 request: NextRequest,
17 { params }: { params: Promise<{ id: string }> }
18) {
19 try {
20 const authData = await getStoredAuth();
21 if (!authData || !authData.authenticated) {
22 return NextResponse.json(
23 { error: 'Authentication required' },
24 { status: 401 }
25 );
26 }
27
28 const saleId = await params.then(p => p.id);
29
30 console.log('[Sale Detail] Fetching sale:', saleId);
31
32 // Use BUCK API to get sale details
33 const buckParams: Record<string, string> = {
34 '3': 'retailmax.elink.sale.list',
35 '10': '102,131,132,140,141,210,211,212,213,214,300,301,302,303,304,305,306,307,400,401', // All sale fields
36 '102': saleId // Filter by sale ID
37 };
38
39 const result = await fieldpineServerApi.buckApiCall(buckParams, authData.apiKey);
40
41 if (!result.DATS || result.DATS.length === 0) {
42 return NextResponse.json(
43 { success: false, error: 'Sale not found' },
44 { status: 404 }
45 );
46 }
47
48 const saleData = result.DATS[0];
49 const sale = {
50 Sid: saleData.f102_E || 0,
51 ExternalId: saleData.f140_s || saleData.f141_s || null,
52 CompletedDt: saleData.f131_DT || saleData.f132_DT || null,
53 Total: parseFloat(saleData.f210_$) || 0,
54 Phase: parseInt(saleData.f300_E) || 0,
55 CustomerId: saleData.f301_s || null,
56 CustomerName: saleData.f302_s || null,
57 LocationId: parseInt(saleData.f303_E) || null,
58 LocationName: saleData.f304_s || null,
59 CreatedDt: saleData.f305_DT || null,
60 TellerId: saleData.f306_s || null,
61 TellerName: saleData.f307_s || null
62 };
63
64 return NextResponse.json({
65 success: true,
66 data: sale,
67 source: 'buck'
68 });
69
70 } catch (error) {
71 console.error('[Sale Detail] Error:', error);
72 return NextResponse.json(
73 {
74 success: false,
75 error: 'Failed to fetch sale details',
76 details: error instanceof Error ? error.message : 'Unknown error'
77 },
78 { status: 500 }
79 );
80 }
81}
82
83export async function PUT(
84 request: NextRequest,
85 { params }: { params: Promise<{ id: string }> }
86) {
87 try {
88 const authData = await getStoredAuth();
89 if (!authData || !authData.authenticated) {
90 return NextResponse.json(
91 { error: 'Authentication required' },
92 { status: 401 }
93 );
94 }
95
96 const saleId = await params.then(p => p.id);
97 const updates = await request.json();
98
99 console.log('[Sale Update] Updating sale:', saleId, updates);
100
101 // Use BUCK API to update sale
102 const buckParams: Record<string, string> = {
103 '3': 'retailmax.elink.sale.edit',
104 '102': saleId,
105 ...updates
106 };
107
108 const result = await fieldpineServerApi.buckApiCall(buckParams, authData.apiKey);
109
110 return NextResponse.json({
111 success: true,
112 data: result,
113 source: 'buck'
114 });
115
116 } catch (error) {
117 console.error('[Sale Update] Error:', error);
118 return NextResponse.json(
119 {
120 success: false,
121 error: 'Failed to update sale',
122 details: error instanceof Error ? error.message : 'Unknown error'
123 },
124 { status: 500 }
125 );
126 }
127}
128
129export async function DELETE(
130 request: NextRequest,
131 { params }: { params: Promise<{ id: string }> }
132) {
133 try {
134 const authData = await getStoredAuth();
135 if (!authData || !authData.authenticated) {
136 return NextResponse.json(
137 { error: 'Authentication required' },
138 { status: 401 }
139 );
140 }
141
142 const saleId = await params.then(p => p.id);
143
144 console.log('[Sale Delete] Voiding sale:', saleId);
145
146 // Use BUCK API to void/delete sale
147 // In Fieldpine, deleting a sale typically means setting phase to void state (900 or similar)
148 const buckParams: Record<string, string> = {
149 '3': 'retailmax.elink.sale.edit',
150 '102': saleId,
151 '300': '900' // Set phase to void/deleted state
152 };
153
154 const result = await fieldpineServerApi.buckApiCall(buckParams, authData.apiKey);
155
156 return NextResponse.json({
157 success: true,
158 data: result,
159 message: 'Sale voided successfully',
160 source: 'buck'
161 });
162
163 } catch (error) {
164 console.error('[Sale Delete] Error:', error);
165 return NextResponse.json(
166 {
167 success: false,
168 error: 'Failed to delete/void sale',
169 details: error instanceof Error ? error.message : 'Unknown error'
170 },
171 { status: 500 }
172 );
173 }
174}