validate(['territories' => 'nullable|array|max:4', 'territories.*' => 'required|uuid|distinct', 'start_year' => 'nullable|integer|between:1900,2100', 'end_year' => 'nullable|integer|between:1900,2100|gte:start_year', 'sector' => 'nullable|in:'.implode(',', array_keys(DemographicEvidence::sectors())), 'edition' => 'nullable|uuid']); $start = (int) ($data['start_year'] ?? date('Y')); $end = (int) ($data['end_year'] ?? $start); abort_unless($end >= $start && $end - $start <= 50, 422, 'Escolha um horizonte até 50 anos.'); $evidence = $service->analyse($data['territories'] ?? [], $start, $end, $data['sector'] ?? 'general', $data['edition'] ?? null); if ($request->expectsJson()) { return response()->json($evidence); } $territories = $service->territories()->orderBy('name')->get(['id', 'name', 'parent_id', 'location_type']); return Inertia::render('investment/demography', ['evidence' => $evidence, 'filters' => $data, 'territories' => $territories, 'sectors' => DemographicEvidence::sectors()]); } public function management(Request $request, DemographicImport $service): Response|RedirectResponse { if (! Schema::hasTable('demographic_imports')) { return redirect('/management/demography/install'); } $service->authorize($request->user()); $data = $request->validate(['batch' => 'nullable|uuid']); return Inertia::render('management/demography', ['qa' => ! app(DemographicInstallation::class)->activeTarget(), 'batches' => DB::table('demographic_imports')->orderByDesc('created_at')->get(['id', 'file_name', 'publication_version', 'status', 'created_at']), 'preview' => isset($data['batch']) ? $service->preview($request->user(), $data['batch']) : null]); } public function installation(Request $request, DemographicInstallation $service): Response { return Inertia::render('management/demography-install', ['plan' => $service->preview($request->user())]); } public function install(Request $request, DemographicInstallation $service): JsonResponse { return response()->json($service->apply($request->user(), $request->all())); } public function prepare(Request $request, DemographicImport $service): JsonResponse { $data = $request->validate(['file' => 'required|file|mimes:xlsx|max:19531', 'publication_version' => 'required|string|max:255', 'baseline_year' => 'nullable|integer|between:1900,2100']); $file = $request->file('file'); return response()->json($service->prepare($request->user(), $file->getRealPath(), $file->getClientOriginalName(), $data['publication_version'], isset($data['baseline_year']) ? (int) $data['baseline_year'] : null)); } public function confirm(Request $request, string $id, DemographicImport $service): JsonResponse { $data = $request->validate(['sha256' => 'required|string|size:64', 'mapping' => 'present|array', 'mapping.*' => 'required|uuid', 'reason' => 'required|string|min:10|max:2000']); return response()->json($service->confirm($request->user(), $id, $data['sha256'], $data['mapping'], $data['reason'])); } public function transition(Request $request, string $id, DemographicImport $service): JsonResponse { $data = $request->validate(['action' => 'required|in:approved,disabled', 'reason' => 'required|string|min:10|max:2000']); $service->transition($request->user(), $id, $data['action'], $data['reason']); return response()->json(['id' => $id, 'status' => $data['action']]); } }