middleware('admin');
$this->datevService = $datevService;
}
/**
* Hauptseite: Periodenauswahl + Export-Übersicht
*/
public function index(Request $request)
{
$this->setFilterVars($request);
$month = intval(session('payment_taxadvisor_filter_month'));
$year = intval(session('payment_taxadvisor_filter_year'));
// Letzter Export für diese Periode
$currentExport = DatevExport::forPeriod($month, $year)
->generated()
->latest()
->first();
// Letzte 10 Exports für die Historie
$recentExports = DatevExport::generated()
->latest()
->limit(10)
->get();
$data = [
'filter_months' => HTMLHelper::getTransMonths(),
'filter_years' => HTMLHelper::getYearRange(2023),
'current_month' => $month,
'current_year' => $year,
'current_export' => $currentExport,
'recent_exports' => $recentExports,
];
return view('admin.payment.taxadvisor', $data);
}
/**
* AJAX: Vorschau der Daten für die gewählte Periode.
*/
public function preview(Request $request)
{
$month = intval($request->get('month', session('payment_taxadvisor_filter_month')));
$year = intval($request->get('year', session('payment_taxadvisor_filter_year')));
try {
$preview = $this->datevService->getPreview($month, $year);
return response()->json([
'success' => true,
'data' => $preview,
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Fehler bei der Vorschau: '.$e->getMessage(),
], 500);
}
}
/**
* Export generieren und speichern.
*/
public function generate(Request $request)
{
$month = intval($request->get('month', session('payment_taxadvisor_filter_month')));
$year = intval($request->get('year', session('payment_taxadvisor_filter_year')));
try {
$export = $this->datevService->generateExport($month, $year);
return redirect()
->route('admin_payments_taxadvisor')
->with('success', "DATEV-Export für {$month}/{$year} erfolgreich generiert. {$export->total_lines} Buchungszeilen erstellt.");
} catch (\RuntimeException $e) {
return redirect()
->route('admin_payments_taxadvisor')
->with('error', $e->getMessage());
} catch (\Exception $e) {
return redirect()
->route('admin_payments_taxadvisor')
->with('error', 'Fehler beim Generieren: '.$e->getMessage());
}
}
/**
* CSV-Datei herunterladen.
*/
public function download($id)
{
$export = DatevExport::findOrFail($id);
if (! $export->isGenerated()) {
return redirect()
->route('admin_payments_taxadvisor')
->with('error', 'Export wurde noch nicht generiert.');
}
$disk = config('datev.storage_disk', 'local');
$path = $export->file_path;
if (! Storage::disk($disk)->exists($path)) {
// CSV neu generieren falls Datei nicht mehr vorhanden
$csvContent = $this->datevService->buildCsv($export);
Storage::disk($disk)->makeDirectory($export->getStoragePath());
Storage::disk($disk)->put($path, $csvContent);
}
// Status auf "heruntergeladen" setzen
$export->markAsDownloaded();
return Storage::disk($disk)->download($path, $export->filename, [
'Content-Type' => 'text/csv; charset=utf-8',
]);
}
/**
* DataTable: Export-Lines eines bestimmten Exports.
*/
public function datatable(Request $request)
{
$exportId = $request->get('export_id');
$query = DatevExportLine::select('datev_export_lines.*');
if ($exportId) {
$query->where('datev_export_id', $exportId);
} else {
// Fallback: Lines des aktuellen Perioden-Exports
$month = intval(session('payment_taxadvisor_filter_month', date('m')));
$year = intval(session('payment_taxadvisor_filter_year', date('Y')));
$export = DatevExport::forPeriod($month, $year)
->generated()
->latest()
->first();
if ($export) {
$query->where('datev_export_id', $export->id);
} else {
$query->where('datev_export_id', 0); // Leere Ergebnismenge
}
}
return \DataTables::eloquent($query)
->editColumn('line_number', function (DatevExportLine $line) {
return $line->line_number;
})
->addColumn('source_type_label', function (DatevExportLine $line) {
return $line->source_type_label;
})
->addColumn('amount_display', function (DatevExportLine $line) {
return ''.$line->formatted_amount.'';
})
->editColumn('soll_haben', function (DatevExportLine $line) {
$badge = $line->soll_haben === 'H' ? 'success' : 'warning';
return ''.$line->soll_haben.'';
})
->editColumn('konto', function (DatevExportLine $line) {
return $line->konto;
})
->editColumn('gegenkonto', function (DatevExportLine $line) {
return $line->gegenkonto;
})
->editColumn('bu_schluessel', function (DatevExportLine $line) {
return $line->bu_schluessel;
})
->addColumn('belegdatum_display', function (DatevExportLine $line) {
return $line->formatted_belegdatum;
})
->editColumn('belegfeld1', function (DatevExportLine $line) {
return $line->belegfeld1;
})
->editColumn('buchungstext', function (DatevExportLine $line) {
return $line->buchungstext;
})
->editColumn('eu_ustid', function (DatevExportLine $line) {
return $line->eu_ustid ?: '-';
})
->filterColumn('source_type_label', function ($query, $keyword) {
$typeMap = ['rechnung' => 'invoice', 'gutschrift' => 'credit', 'storno' => 'cancellation'];
foreach ($typeMap as $label => $type) {
if (stripos($label, $keyword) !== false) {
$query->where('source_type', $type);
return;
}
}
$query->where('source_type', 'like', "%{$keyword}%");
})
->orderColumn('line_number', 'line_number $1')
->rawColumns(['amount_display', 'soll_haben'])
->make(true);
}
/**
* Export sperren (Lock).
*/
public function lock($id)
{
$export = DatevExport::findOrFail($id);
if ($export->isLocked()) {
return redirect()
->route('admin_payments_taxadvisor')
->with('info', 'Export ist bereits gesperrt.');
}
$export->lock();
return redirect()
->route('admin_payments_taxadvisor')
->with('success', "Export {$export->period_label} wurde gesperrt.");
}
/**
* Export löschen (soft delete).
*/
public function destroy($id)
{
$export = DatevExport::findOrFail($id);
if ($export->isLocked()) {
return redirect()
->route('admin_payments_taxadvisor')
->with('error', 'Gesperrte Exports können nicht gelöscht werden.');
}
$export->delete();
return redirect()
->route('admin_payments_taxadvisor')
->with('success', "Export {$export->period_label} wurde gelöscht.");
}
/*
|--------------------------------------------------------------------------
| Private Hilfsmethoden
|--------------------------------------------------------------------------
*/
private function setFilterVars(Request $request): void
{
if (! session('payment_taxadvisor_filter_month')) {
session(['payment_taxadvisor_filter_month' => intval(date('m'))]);
}
if (! session('payment_taxadvisor_filter_year')) {
session(['payment_taxadvisor_filter_year' => intval(date('Y'))]);
}
if ($request->get('payment_taxadvisor_filter_month')) {
session(['payment_taxadvisor_filter_month' => $request->get('payment_taxadvisor_filter_month')]);
}
if ($request->get('payment_taxadvisor_filter_year')) {
session(['payment_taxadvisor_filter_year' => $request->get('payment_taxadvisor_filter_year')]);
}
}
}