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')]); } } }