62 lines
4.2 KiB
PHP
62 lines
4.2 KiB
PHP
<?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) {
|
|
$records=$workflow->list($area, $request->user()->id);
|
|
return response()->json(['records'=>$records,'module_id'=>\App\Shared\Context\ModuleRecords::active(),
|
|
'scope_notice'=>'Apenas registos explicitamente associados ao módulo activo. Registos anteriores sem associação não foram eliminados: consulte Associações de módulos nas opções gerais.']);
|
|
}
|
|
public function show(Request $request, string $area, int $id, ServiceWorkflow $workflow)
|
|
{
|
|
$record = $workflow->show($area, $id, $request->user()->id);
|
|
if ($area === 'billing_drafts') { $record['confirmation'] = app(\App\Modules\Services\InternalConfirmation::class)->show($id, $request->user()->id); }
|
|
return response()->json($record);
|
|
}
|
|
public function confirmInternal(Request $request, int $id, \App\Modules\Services\InternalConfirmation $confirmation)
|
|
{
|
|
abort_if(array_diff(array_keys($request->all()), ['version']) !== [], 422, 'Campo não suportado ou identificador protegido.');
|
|
$data = $request->validate(['version' => 'required|integer|min:1']);
|
|
return response()->json($confirmation->confirm($id, $request->user()->id, (int) $data['version'], (string) $request->header('Idempotency-Key', '')));
|
|
}
|
|
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]);
|
|
}
|
|
}
|