ein paar feature aber datenbank macht probleme wenn man aufträge speichern möchge
This commit is contained in:
2026-04-05 12:47:57 +02:00
parent e1d4bb7edf
commit 9ddce354c0
32 changed files with 3931 additions and 612 deletions

View File

@@ -0,0 +1,96 @@
import 'dart:convert';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import '../models/auftrag.dart';
import '../models/auftrag_status.dart';
import '../models/dokument_typ.dart';
import '../models/zahlungs_status.dart';
/// Export der Auftragsdaten als JSON (ohne Binärdaten der Fotos/Unterschrift).
class DataExportService {
DataExportService._();
static String _csvZelle(String? s) {
final t = (s ?? '').replaceAll('"', '""');
if (t.contains(';') || t.contains('\n') || t.contains('"')) {
return '"$t"';
}
return t;
}
/// Semikolon-CSV (Excel DE) grobe Vorlage für Steuerbüro / DATEV-Vorbereitung.
static Future<File> exportAuftraegeCsvToTempFile(List<Auftrag> list) async {
final header = [
'Rechnungsnummer',
'Dokumenttyp',
'Titel',
'Kunde',
'Adresse',
'E-Mail',
'Betrag_Text',
'Status',
'Zahlungsstatus',
'Faellig_am',
'Leistungsdatum',
'Kleinunternehmer',
'Reverse_Charge',
'Skonto',
'USt_Id_Kunde',
'IBAN',
'BIC',
'Kontoinhaber',
'Erstellt',
];
final sb = StringBuffer()
..writeln(header.map(_csvZelle).join(';'));
for (final a in list) {
sb.writeln(
[
a.rechnungsnummer,
a.dokumentTyp.labelDe,
a.titel,
a.kundenName,
a.kundenAdresse,
a.kundenEmail,
a.betragText,
a.status.labelDe,
a.zahlungsStatus.labelDe,
a.faelligAm?.toIso8601String() ?? '',
a.leistungsDatum?.toIso8601String() ?? '',
a.kleinunternehmer ? 'ja' : 'nein',
a.reverseCharge ? 'ja' : 'nein',
a.skontoText,
a.ustIdKunde,
a.ibanVerkaeufer,
a.bicVerkaeufer,
a.kontoinhaberVerkaeufer,
a.createdAt?.toIso8601String() ?? '',
].map(_csvZelle).join(';'),
);
}
final dir = await getTemporaryDirectory();
final name =
'handwerkpro_export_${DateTime.now().millisecondsSinceEpoch}.csv';
final file = File('${dir.path}/$name');
await file.writeAsString(sb.toString(), encoding: utf8);
return file;
}
static Future<File> exportAuftraegeToTempFile(List<Auftrag> list) async {
final payload = {
'exportVersion': 4,
'exportedAt': DateTime.now().toIso8601String(),
'count': list.length,
'auftraege': list.map((a) => a.toExportMap()).toList(),
};
final json = const JsonEncoder.withIndent(' ').convert(payload);
final dir = await getTemporaryDirectory();
final name =
'handwerkpro_export_${DateTime.now().millisecondsSinceEpoch}.json';
final file = File('${dir.path}/$name');
await file.writeAsString(json);
return file;
}
}