Przeglądaj źródła

feat(api): add POST endpoint for generating cintas summary data

- Added POST /api/imports/[id]/summary endpoint to trigger summary generation
- Implemented stored procedure call cintas_calculate_summary for data processing
- Added summaryExists flag to track if summary has been generated
- Updated frontend to use new POST endpoint instead of manual generation
- Added proper error handling and duplicate summary detection
vtugulan 6 miesięcy temu
rodzic
commit
d47aa8b599

+ 88 - 1
app/api/imports/[id]/summary/route.ts

@@ -59,7 +59,8 @@ export async function GET(
             importId,
             fileName: file?.filename || 'Unknown',
             uploadDate: importRecord.createdAt,
-            summary
+            summary,
+            summaryExists: cintasSummaries.length > 0
         });
 
     } catch (error) {
@@ -69,4 +70,90 @@ export async function GET(
             { status: 500 }
         );
     }
+}
+
+export async function POST(
+    request: NextRequest,
+    { params }: { params: Promise<{ id: string }> }
+) {
+    try {
+        const { id } = await params;
+        const importId = parseInt(id);
+
+        if (isNaN(importId)) {
+            return NextResponse.json(
+                { error: 'Invalid import ID' },
+                { status: 400 }
+            );
+        }
+
+        // Check if import exists
+        const importRecord = await prisma.import.findUnique({
+            where: { id: importId }
+        });
+
+        if (!importRecord) {
+            return NextResponse.json(
+                { error: 'Import not found' },
+                { status: 404 }
+            );
+        }
+
+        // Check if summary already exists
+        const existingSummaries = await prisma.cintasSummary.count({
+            where: { importId }
+        });
+
+        if (existingSummaries > 0) {
+            // Return existing summary
+            const cintasSummaries = await prisma.cintasSummary.findMany({
+                where: { importId },
+                orderBy: { week: 'asc' }
+            });
+
+            return NextResponse.json({
+                importId,
+                summaryGenerated: false,
+                message: 'Summary already exists',
+                summary: cintasSummaries.map(summary => ({
+                    week: summary.week,
+                    trrTotal: summary.trrTotal,
+                    fourWkAverages: summary.fourWkAverages,
+                    trrPlus4Wk: summary.trrPlus4Wk,
+                    powerAdds: summary.powerAdds
+                }))
+            });
+        }
+
+        // Execute the stored procedure to generate summary
+        await prisma.$executeRawUnsafe(
+            `CALL cintas_calculate_summary(${importId})`
+        );
+
+        // Fetch the newly generated summary
+        const cintasSummaries = await prisma.cintasSummary.findMany({
+            where: { importId },
+            orderBy: { week: 'asc' }
+        });
+
+        return NextResponse.json({
+            importId,
+            summaryGenerated: true,
+            message: 'Summary generated successfully',
+            summary: cintasSummaries.map(summary => ({
+                week: summary.week,
+                trrTotal: summary.trrTotal,
+                fourWkAverages: summary.fourWkAverages,
+                trrPlus4Wk: summary.trrPlus4Wk,
+                powerAdds: summary.powerAdds
+            }))
+        });
+
+    } catch (error) {
+        console.error('Error generating summary:', error);
+        return NextResponse.json(
+            { error: 'Failed to generate summary', details: error instanceof Error ? error.message : 'Unknown error' },
+            { status: 500 }
+        );
+    }
 }

+ 20 - 8
app/cintas-calendar-summary/page.tsx

@@ -34,6 +34,7 @@ export default function CintasCalendarSummaryPage() {
   const [importRecord, setImportRecord] = useState<any>(null);
   const [summaryData, setSummaryData] = useState<CintasSummary[]>([]);
   const [error, setError] = useState<string | null>(null);
+  const [summaryExists, setSummaryExists] = useState(false);
 
   const handleFileUploaded = (file: FileData) => {
     setUploadedFile(file);
@@ -91,15 +92,26 @@ export default function CintasCalendarSummaryPage() {
     setError(null);
 
     try {
-      // This would typically call an API endpoint to run the stored procedure
-      // For now, we'll simulate the summary generation
-      const response = await fetch(`/api/imports/${importRecord.id}/summary`);
+      // Call the new POST endpoint to generate summary
+      const response = await fetch(`/api/imports/${importRecord.id}/summary`, {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+      });
+
+      const data = await response.json();
 
       if (response.ok) {
-        const data = await response.json();
-        setSummaryData(data);
+        setSummaryData(data.summary || []);
+        setSummaryExists(true);
+
+        // If summary was just generated, mark as completed
+        if (data.summaryGenerated) {
+          setCurrentStep(4);
+        }
       } else {
-        throw new Error('Failed to generate summary');
+        throw new Error(data.error || 'Failed to generate summary');
       }
     } catch (err) {
       setError(err instanceof Error ? err.message : 'Failed to generate summary');
@@ -312,10 +324,10 @@ export default function CintasCalendarSummaryPage() {
                   {isProcessing ? (
                     <>
                       <Loader2 className="mr-2 h-4 w-4 animate-spin" />
-                      Generating Summary...
+                      {summaryExists ? 'Loading Summary...' : 'Generating Summary...'}
                     </>
                   ) : (
-                    'Generate Summary'
+                    summaryExists ? 'Load Summary' : 'Generate Summary'
                   )}
                 </Button>