1import { NextRequest, NextResponse } from 'next/server';
2import { fieldpineServerApi } from '@/lib/server/fieldpineApi';
3import { getRequestContext } from '@/lib/server/sessionUtils';
6 * GET /api/v1/elink/sales/[id]
7 * Fetch detailed sale information including line items, payments, and location
9export async function GET(
11 { params }: { params: Promise<{ id: string }> }
14 const context = await getRequestContext(request);
15 if (!context?.session) {
16 return NextResponse.json(
17 { success: false, error: 'Not authenticated' },
22 const { id: saleId } = await params;
23 console.log(`[Sale Fetch] Fetching sale details for ID: ${saleId}`);
25 // Use BUCK API to fetch full sale details
26 // retailmax.elink.sale.fetch with 100=1 returns full details including LINE, PAYM, LOCN
27 const buckParams: Record<string, string> = {
28 '3': 'retailmax.elink.sale.fetch',
29 '100': '1', // Include all sub-records
30 '9': `f100,0,${saleId}` // Filter by sale ID
33 const result = await fieldpineServerApi.buckApiCall(buckParams, context.session.apiKey);
36 return NextResponse.json(
37 { success: false, error: 'Sale not found' },
42 console.log(`[Sale Fetch] Successfully fetched sale ${saleId}`);
44 return NextResponse.json({
50 console.error('[Sale Fetch] Error:', error);
51 return NextResponse.json(
54 error: error instanceof Error ? error.message : 'Failed to fetch sale details'
62 * DELETE /api/v1/elink/sales/[id]
63 * Void/delete a sale by setting phase to 10002
65export async function DELETE(
67 { params }: { params: Promise<{ id: string }> }
70 const context = await getRequestContext(request);
71 if (!context?.session) {
72 return NextResponse.json(
73 { success: false, error: 'Not authenticated' },
78 const { id: saleId } = await params;
79 console.log(`[Sale Delete] Voiding sale ID: ${saleId}`);
81 // First, parse the delete command (dry run)
82 const parseUrl = `${context.session.storeUrl}/OpenApi2/Sales/Edit/Parse?saleid=${saleId}&ref=${Date.now()}`;
83 const parseResponse = await fetch(parseUrl, {
86 'Authorization': `Bearer ${context.session.apiKey}`,
87 'Content-Type': 'text/plain'
92 if (!parseResponse.ok) {
93 throw new Error(`Parse failed: ${parseResponse.status} ${parseResponse.statusText}`);
96 const parseResult = await parseResponse.json();
97 console.log('[Sale Delete] Parse result:', parseResult);
99 // If parse was successful, execute the actual delete
100 const editUrl = `${context.session.storeUrl}/OpenApi2/Sales/Edit?saleid=${saleId}&ref=${Date.now()}`;
101 const editResponse = await fetch(editUrl, {
104 'Authorization': `Bearer ${context.session.apiKey}`,
105 'Content-Type': 'text/plain'
107 body: 'delete sale\n'
110 if (!editResponse.ok) {
111 throw new Error(`Delete failed: ${editResponse.status} ${editResponse.statusText}`);
114 const editResult = await editResponse.json();
115 console.log('[Sale Delete] Edit result:', editResult);
117 if (editResult.data?.Status?.includes('Changes applied')) {
118 return NextResponse.json({
120 message: 'Sale voided successfully',
121 data: editResult.data
124 return NextResponse.json(
127 error: 'Failed to void sale',
135 console.error('[Sale Delete] Error:', error);
136 return NextResponse.json(
139 error: error instanceof Error ? error.message : 'Failed to void sale'
147 * PUT /api/v1/elink/sales/[id]
148 * Update sale details (placeholder for future implementation)
150export async function PUT(
151 request: NextRequest,
152 { params }: { params: Promise<{ id: string }> }
154 return NextResponse.json(
155 { success: false, error: 'Sale updates not yet implemented' },