Regista aceitacao funcional do primeiro incremento PGC-NIRF e preserva as dependencias documentais e tecnicas existentes. A validacao do calculo fiscal continua separada e pendente. Sem credenciais, bases operacionais ou publicacao.
40 lines
3.2 KiB
PHP
40 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Modules\Services\Http;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Modules\Services\DocumentPreparation;
|
|
use Illuminate\Http\Request;
|
|
|
|
final class DocumentPreparationController extends Controller
|
|
{
|
|
public function index(Request $request, string $kind, DocumentPreparation $preparation) { return response()->json(['records' => $preparation->index($kind, $request->user()->id)]); }
|
|
public function show(Request $request, string $kind, int $id, DocumentPreparation $preparation) { return response()->json($preparation->show($kind, $id, $request->user()->id)); }
|
|
public function save(Request $request, string $kind, int $id, DocumentPreparation $preparation)
|
|
{
|
|
$preparation->scope($kind, $request->user()->id, 'edit');
|
|
$fields = in_array($kind, ['issuer','client'], true) ? DocumentPreparation::PROFILE_FIELDS : ($kind === 'payment' ? DocumentPreparation::PAYMENT_FIELDS : DocumentPreparation::DRAFT_FIELDS);
|
|
$allowed = array_merge($fields, ['version'], str_ends_with($kind, '_drafts') ? ['draft_version','currency'] : []);
|
|
abort_if(array_diff(array_keys($request->all()), $allowed) !== [], 422, 'Campo não suportado; não introduza credenciais, tokens ou dados de cartões.');
|
|
$rules = ['version' => 'required|integer|min:0'];
|
|
foreach ($fields as $field) { $rules[$field] = 'nullable|string|max:500'; }
|
|
if ($kind === 'payment') {
|
|
$rules['label'] = 'required|string|max:120'; $rules['instructions'] = 'nullable|string|max:2000'; $rules['currency'] = 'nullable|string|regex:/^[A-Z]{3}$/';
|
|
} elseif (str_ends_with($kind, '_drafts')) {
|
|
foreach (['service_date','period_start','period_end','proposed_due_date'] as $field) { $rules[$field] = 'nullable|date_format:Y-m-d'; }
|
|
if ($request->filled('period_start')) { $rules['period_end'] .= '|after_or_equal:period_start'; }
|
|
$rules['payment_terms'] = 'nullable|string|max:1000';
|
|
$rules['price_mode'] = 'required|in:undefined,included,added';
|
|
$rules['units'] = 'required|array|min:1|max:100'; $rules['units.*'] = 'nullable|string|max:80';
|
|
$rules['payment_instruction_ids'] = 'present|array|max:20'; $rules['payment_instruction_ids.*'] = 'required|integer|min:1|distinct';
|
|
$rules['draft_version'] = 'required|integer|min:1'; $rules['currency'] = 'nullable|string|regex:/^[A-Z]{3}$/';
|
|
}
|
|
$data = $request->validate($rules); $data['version'] = (int) $data['version'];
|
|
foreach ($fields as $field) { if (! array_key_exists($field, $data)) { $data[$field] = null; } }
|
|
if (isset($data['draft_version'])) { $data['draft_version'] = (int) $data['draft_version']; $data['currency'] ??= null; $data['payment_instruction_ids'] = array_map('intval', $data['payment_instruction_ids']); }
|
|
// Refuse obvious secret assignments in free text; no secret fields are supported.
|
|
foreach ($data as $value) { if (is_string($value)) { abort_if((bool) preg_match('/(?:password|palavra.passe|token|secret|cvv|cvc|pin)\s*[:=]/iu', $value), 422, 'Não introduza credenciais ou segredos nas instruções.'); } }
|
|
return response()->json($preparation->save($kind, $id, $request->user()->id, $data));
|
|
}
|
|
}
|