V 1.1.0: Recht gut ausgebaut jetzt
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
// seniorendienst-frontend/src/components/CSVImport.jsx
|
||||
import React, { useRef, useState } from 'react';
|
||||
import { parse } from 'csv-parse/browser/esm/sync';
|
||||
|
||||
const CSVImport = ({ onImport }) => {
|
||||
const fileInputRef = useRef(null);
|
||||
@@ -13,16 +14,24 @@ const CSVImport = ({ onImport }) => {
|
||||
|
||||
try {
|
||||
const text = await file.text();
|
||||
const lines = text.split('\n').filter(line => line.trim());
|
||||
|
||||
// Erste Zeile als Header überspringen
|
||||
const dataLines = lines.slice(1);
|
||||
// Führendes Semikolon aus jeder Zeile entfernen
|
||||
const cleanedText = text
|
||||
.split('\n')
|
||||
.map(line => line.startsWith(';') ? line.substring(1) : line)
|
||||
.join('\n');
|
||||
|
||||
const entries = dataLines.map(line => {
|
||||
// CSV-Zeile parsen (einfaches Komma-getrennt)
|
||||
const columns = line.split(',').map(col => col.trim());
|
||||
|
||||
// Erwartetes Format: Name,Vorname,Straße,PLZ/Ort,Telefon,Email,Anfrage,Termin,Zeit,Fahrtzeit,Strecke,Transport,Dauer,Durchgeführt,Bemerkungen,Bezahlt
|
||||
// CSV mit csv-parse parsen
|
||||
const records = parse(cleanedText, {
|
||||
delimiter: ';',
|
||||
skip_empty_lines: true,
|
||||
from_line: 2, // Erste Zeile (Header) überspringen
|
||||
relax_column_count: true, // Erlaubt unterschiedliche Spaltenanzahlen
|
||||
trim: true,
|
||||
});
|
||||
|
||||
const entries = records.map(columns => {
|
||||
// Erwartetes Format: Name,Vorname,Straße,PLZ/Ort,Telefon,Email,Anfrage,Termin,Dauer,Fahrtzeit,Strecke,Transport,Bezahlt,Durchgeführt,Bemerkungen
|
||||
return {
|
||||
name: columns[0] || '',
|
||||
firstName: columns[1] || '',
|
||||
@@ -31,14 +40,14 @@ const CSVImport = ({ onImport }) => {
|
||||
phone: columns[4] || '',
|
||||
email: columns[5] || '',
|
||||
requestDate: columns[6] ? new Date(columns[6]) : new Date(),
|
||||
appointmentDate: columns[7] && columns[8] ? new Date(`${columns[7]}T${columns[8]}`) : new Date(),
|
||||
appointmentDate: columns[7] ? new Date(columns[7]) : new Date(),
|
||||
workDuration: Number(columns[8]) || 0,
|
||||
travelTime: Number(columns[9]) || 0,
|
||||
distance: Number(columns[10]) || 0,
|
||||
transport: columns[11] || 'Auto',
|
||||
workDuration: Number(columns[12]) || 0,
|
||||
paidAmount: Number(columns[12]) || 0,
|
||||
taskDone: columns[13] || '',
|
||||
remarks: columns[14] || '',
|
||||
paidAmount: Number(columns[15]) || 0,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -71,7 +80,7 @@ const CSVImport = ({ onImport }) => {
|
||||
{isProcessing ? '⏳ Importiere...' : '📁 CSV importieren'}
|
||||
</label>
|
||||
<small className="csv-hint">
|
||||
Format: Name,Vorname,Straße,PLZ/Ort,Telefon,Email,Anfrage,Termin,Zeit,Fahrtzeit,Strecke,Transport,Dauer,Durchgeführt,Bemerkungen,Bezahlt
|
||||
Format: Name,Vorname,Straße,PLZ/Ort,Telefon,Email,Anfrage,Termin (YYYY-MM-DD HH:MM),Dauer,Fahrtzeit,Strecke,Transport,Bezahlt,Durchgeführt,Bemerkungen
|
||||
</small>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user