Preserva entrega A aceite de servicos em rascunho

This commit is contained in:
2026-10-25 22:02:44 +02:00
parent 26b80df545
commit ca13acb74e
31 changed files with 1152 additions and 17 deletions
@@ -0,0 +1,46 @@
<?php
namespace App\Modules\Services\Http;
use App\Http\Controllers\Controller;
use App\Modules\Services\ServiceWorkflow;
use App\Modules\Services\ServiceAccess;
use App\Modules\Services\ServicePermissions;
use Illuminate\Http\Request;
final class ServiceController extends Controller
{
public function index(Request $request, string $area, ServiceWorkflow $workflow) { return response()->json(['records' => $workflow->list($area, $request->user()->id)]); }
public function show(Request $request, string $area, int $id, ServiceWorkflow $workflow) { return response()->json($workflow->show($area, $id, $request->user()->id)); }
public function create(Request $request, string $area, ServiceWorkflow $workflow) { return $this->save($request, $area, null, $workflow); }
public function update(Request $request, string $area, int $id, ServiceWorkflow $workflow) { return $this->save($request, $area, $id, $workflow); }
private function save(Request $request, string $area, ?int $id, ServiceWorkflow $workflow)
{
abort_unless(in_array($area, ServicePermissions::AREAS, true), 404);
$rules = ['name' => ServicePermissions::unitScoped($area) ? 'sometimes|required|string|max:255' : 'required|string|max:255',
'description' => 'nullable|string|max:2000', 'version' => $id ? 'required|integer|min:1' : 'prohibited'];
if ($area === 'clients') { unset($rules['description']); }
if (ServicePermissions::unitScoped($area)) {
$rules += ['currency' => 'nullable|string|regex:/^[A-Z]{3}$/', 'lines' => $area === 'service_drafts' ? 'required|array|min:1|max:100' : 'sometimes|array|min:1|max:100',
'lines.*' => 'array:service_id,service_name,description,quantity,unit_price', 'lines.*.service_id' => 'required|integer|min:1',
'lines.*.service_name' => 'sometimes|string|max:255', 'lines.*.description' => 'nullable|string|max:2000', 'lines.*.quantity' => 'nullable|string|max:30', 'lines.*.unit_price' => 'nullable|string|max:30'];
if ($area === 'service_drafts') { $rules['client_id'] = 'required|integer|min:1'; }
else { $rules['source_id'] = $id ? 'prohibited' : 'required|integer|min:1'; $rules['reload_source'] = 'sometimes|boolean'; }
}
$unknown = array_diff(array_keys($request->all()), array_keys($rules));
abort_if($unknown !== [], 422, 'Campo não suportado ou identificador protegido.');
$data = $request->validate($rules);
$key = (string) $request->header('Idempotency-Key', '');
return response()->json($workflow->save($area, $id, $request->user()->id, $data, $key), $id ? 200 : 201);
}
public function accesses(Request $request, string $area, ServiceAccess $access) { return response()->json($access->listing($area, $request->user()->id)); }
public function changeAccess(Request $request, string $area, ServiceAccess $access)
{
$data = $request->validate(['email' => 'required|email|max:255', 'action' => 'required|string', 'grant' => 'required|boolean', 'reason' => 'required|string|max:500']);
abort_if(array_diff(array_keys($request->all()), ['email','action','grant','reason']) !== [], 422);
$access->change($area, $request->user()->id, $data);
return response()->json(['ok' => true]);
}
}