"use server" import { exportImportFieldsMapping } from "@/models/export_and_import" import { createTransaction } from "@/models/transactions" import { parse } from "@fast-csv/parse" import { revalidatePath } from "next/cache" export async function parseCSVAction(prevState: any, formData: FormData) { const file = formData.get("file") as File if (!file) { return { success: false, error: "No file uploaded" } } if (!file.name.toLowerCase().endsWith(".csv")) { return { success: false, error: "Only CSV files are allowed" } } try { const buffer = Buffer.from(await file.arrayBuffer()) const rows: string[][] = [] const parser = parse() .on("data", (row) => rows.push(row)) .on("error", (error) => { throw error }) parser.write(buffer) parser.end() // Wait for parsing to complete await new Promise((resolve) => parser.on("end", resolve)) return { success: true, data: rows } } catch (error) { console.error("Error parsing CSV:", error) return { success: false, error: "Failed to parse CSV file" } } } export async function saveTransactionsAction(prevState: any, formData: FormData) { try { const rows = JSON.parse(formData.get("rows") as string) as Record[] for (const row of rows) { const transactionData: Record = {} for (const [fieldCode, value] of Object.entries(row)) { const fieldDef = exportImportFieldsMapping[fieldCode] if (fieldDef?.import) { transactionData[fieldCode] = await fieldDef.import(value as string) } else { transactionData[fieldCode] = value as string } } await createTransaction(transactionData) } revalidatePath("/import/csv") revalidatePath("/transactions") return { success: true } } catch (error) { console.error("Error saving transactions:", error) return { success: false, error: "Failed to save transactions: " + error } } }