This commit is contained in:
2026-11-03 11:51:44 +02:00
parent badaada043
commit e753f7a0a4
309 changed files with 14537 additions and 529 deletions
@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Models\Tenant;
use App\Models\User;
use App\Services\SupplierPayables;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -11,20 +12,42 @@ use Tempo\Finance\Payables\Workspace;
final class SupplierPayablesController extends Controller
{
private function actor(Request $r): User
{
$user = $r->user();
abort_unless($user instanceof User, 403);
return $user;
}
/** @return array<string,mixed> */
private function filters(Request $r): array
{
$filter = $r->validate(['invoice' => 'sometimes|required|integer|min:1', 'page' => 'sometimes|integer|min:1|max:100000',
'proposal_page' => 'sometimes|integer|min:1|max:100000', 'event_page' => 'sometimes|integer|min:1|max:100000',
'per_page' => 'sometimes|integer|in:25,100', 'q' => 'sometimes|nullable|string|max:100', 'recognition' => 'sometimes|in:all,recognised,unrecognised']);
abort_if(array_diff(array_keys($r->query()), array_keys($filter)) !== [], 422);
return $filter;
}
public function index(Request $r, SupplierPayables $s): JsonResponse
{
$filter = $r->validate(['invoice' => 'sometimes|required|integer|min:1']);
$filter = $this->filters($r);
$options = array_diff_key($filter, ['invoice' => true]);
return response()->json($s->listing($r->user(), isset($filter['invoice']) ? (int) $filter['invoice'] : null))->header('Cache-Control', 'no-store');
return response()->json($s->listing($this->actor($r), isset($filter['invoice']) ? (int) $filter['invoice'] : null, $options))->header('Cache-Control', 'no-store');
}
public function page(Request $r, SupplierPayables $s): Response
{
$filter = $r->validate(['invoice' => 'sometimes|required|integer|min:1']);
$data = $s->listing($r->user(), isset($filter['invoice']) ? (int) $filter['invoice'] : null);
$company = Tenant::query()->findOrFail($r->user()->tenant_id)->name;
$filter = $this->filters($r);
$options = array_diff_key($filter, ['invoice' => true]);
$actor = $this->actor($r);
$data = $s->listing($actor, isset($filter['invoice']) ? (int) $filter['invoice'] : null, $options);
$company = Tenant::query()->findOrFail($actor->tenant_id)->name;
return response(Workspace::render($data, ['host' => 'Compras autónomo', 'actor' => $r->user()->name, 'organisation' => $company, 'api' => '/api/supplier-payables', 'csrf' => csrf_token(), 'return_url' => '/facturas', 'return_label' => 'Voltar às facturas']))->header('Cache-Control', 'no-store');
return response(Workspace::render($data, ['host' => 'Compras autónomo', 'actor' => $actor->name, 'organisation' => $company, 'api' => '/api/supplier-payables', 'page_url' => '/obrigacoes-fornecedores', 'csrf' => csrf_token(), 'return_url' => '/facturas', 'return_label' => 'Voltar às facturas']))->header('Cache-Control', 'no-store');
}
public function command(Request $r, string $action, SupplierPayables $s): JsonResponse
@@ -33,7 +56,7 @@ final class SupplierPayablesController extends Controller
$d = $r->validate(['id' => 'required|integer|min:1', 'reason' => 'required|string|min:3|max:2000']);
abort_if(array_diff(array_keys($r->all()), ['id', 'reason']) !== [], 422);
try {
return response()->json($s->engine($r->user())->command($action, $d['id'], $d['reason'], (string) $r->header('Idempotency-Key')));
return response()->json($s->engine($this->actor($r))->command($action, $d['id'], $d['reason'], (string) $r->header('Idempotency-Key')));
} catch (\DomainException $e) {
abort(409, $e->getMessage());
} catch (\InvalidArgumentException $e) {