17 lines
9.2 KiB
PHP
17 lines
9.2 KiB
PHP
<!doctype html><html lang="pt-MZ"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Financeiro · fornecedores · SGF</title><style>body{font:16px system-ui;background:#f3f7f5;color:#173e36;margin:0}main{max-width:1100px;margin:auto;padding:24px}section,article{background:white;border:1px solid #bed0c9;border-radius:8px;padding:18px;margin:16px 0}label{display:block;margin:12px 0}input,textarea,select,button{font:inherit;padding:10px;max-width:100%;box-sizing:border-box}input,textarea,select{display:block;width:100%}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:8px;border-bottom:1px solid #ddd}a{color:#174d71}.notice{background:#fff3cf;padding:14px}</style></head><body><main id="finance-payables" data-context="{{ $context }}" data-csrf="{{ $csrf }}">
|
|
@php($money=fn($n)=>$n===null?'Indeterminado':number_format($n/100,2,',',' ').' MZN')
|
|
@php($prepare=$data['profile']==='finance_prepare') @php($review=$data['profile']==='finance_review')
|
|
<a href="/">Voltar ao SGF</a> · <a href="/sgf">Trocar função QA</a><h1>Financeiro · obrigações a fornecedores</h1><p class="notice">Ensaio sintético, sem dinheiro real. A preparação e a confirmação são distintas. Confirmar um pagamento não reduz a dívida; a afectação confirmada reduz o saldo. A Contabilidade exige o seu próprio percurso.</p>
|
|
<p role="status" id="result"></p>
|
|
<section><h2>Obrigações originais</h2><table><thead><tr><th>Documento</th><th>Principal</th><th>Saldo</th><th>Vencimento</th></tr></thead><tbody>@foreach($data['obligations'] as $o)<tr><td>{{ $o['document_number'] }} · #{{ $o['id'] }}</td><td>{{ $money($o['principal_minor']) }}</td><td>{{ $money($o['balance_minor']) }}</td><td>{{ $o['due_on']??'Desconhecido; atraso indeterminado' }}</td></tr>@endforeach</tbody></table></section>
|
|
@if($prepare&&count($data['obligations']))<section><h2>Preparar facto de pagamento</h2><form data-action="payment-prepare"><input type="hidden" name="currency" value="MZN"><label>Obrigação<select name="obligation_id" required data-source><option value="">Escolha explicitamente</option>@foreach($data['obligations'] as $o)<option value="{{ $o['id'] }}" data-revision="{{ $o['source_revision'] }}">{{ $o['document_number'] }} · {{ $money($o['balance_minor']) }}</option>@endforeach</select></label><input type="hidden" name="source_revision"><label>Montante (MZN)<input name="amount" required inputmode="decimal" pattern="[0-9]+(\.[0-9]{1,2})?"></label><label>Data do facto<input name="paid_on" type="date" required></label><label>Referência artificial<input name="fact_reference" required pattern="SIM-[A-Z0-9][A-Z0-9._-]{2,95}"></label><label>Evidência artificial<input name="evidence_reference" required pattern="SIM-[A-Z0-9][A-Z0-9._-]{2,95}"></label><label>Fundamento<textarea name="reason" required minlength="3" maxlength="2000"></textarea></label><button>Preparar — sem abater o saldo</button></form></section>@endif
|
|
<section><h2>Pagamentos</h2>@foreach($data['money']['payments'] as $p)<article><h3>{{ $p['fact_reference'] }} · {{ $money($p['amount_minor']) }}</h3><p>Estado: {{ $p['state'] }} · {{ $p['reason'] }}</p>@if($review&&!$p['decision'])<form data-action="payment-decide"><input type="hidden" name="payment_id" value="{{ $p['id'] }}"><label>Decisão<select name="decision" required><option value="">Escolha</option><option value="confirmed">Confirmar o facto sintético</option><option value="rejected">Recusar</option></select></label><label>Evidência da conferência<input name="evidence_reference" required pattern="SIM-[A-Z0-9][A-Z0-9._-]{2,95}"></label><label>Fundamento independente<textarea name="reason" required minlength="3"></textarea></label><button>Registar decisão individual</button></form>@endif</article>@endforeach
|
|
@php($paymentPage=$data['money']['pagination']['payments'])<nav aria-label="Paginação dos pagamentos">Página {{ $paymentPage['page'] }} de {{ $paymentPage['last_page'] }} @if($paymentPage['page']>1)<a href="?payments_page={{ $paymentPage['page']-1 }}">Anterior</a>@endif @if($paymentPage['page']<$paymentPage['last_page'])<a href="?payments_page={{ $paymentPage['page']+1 }}">Seguinte</a>@endif</nav></section>
|
|
@if($prepare)<section><h2>Propor afectação</h2><form data-action="allocation-prepare"><label>Pagamento confirmado<select name="payment_id" required><option value="">Escolha</option>@foreach($data['money']['payments'] as $p)@if($p['state']==='confirmed'&&$p['unallocated_minor']>0)<option value="{{ $p['id'] }}">{{ $p['fact_reference'] }} · Por afectar {{ $money($p['unallocated_minor']) }}</option>@endif @endforeach</select></label><label>Referência da afectação<input name="reference" required pattern="SIM-[A-Z0-9][A-Z0-9._-]{2,95}"></label><label>Obrigação<select name="obligation_id" data-source required><option value="">Escolha</option>@foreach($data['obligations'] as $o)<option value="{{ $o['id'] }}" data-revision="{{ $o['source_revision'] }}">{{ $o['document_number'] }}</option>@endforeach</select></label><input type="hidden" name="source_revision"><label>Montante a afectar<input name="amount" required inputmode="decimal"></label><label>Fundamento<textarea name="reason" required minlength="3"></textarea></label><button>Preparar afectação — sem a confirmar</button></form></section>@endif
|
|
<section><h2>Conferência de afectações</h2>@foreach($data['money']['proposals'] as $p)<article><h3>{{ $p['reference'] }}</h3>@foreach(json_decode($p['plan'],true) as $line)<p>Obrigação #{{ $line['obligation_id'] }} · {{ $money($line['amount_minor']) }}</p>@endforeach<p>{{ $p['reason'] }} · {{ $p['decision']?->decision??'Por conferir' }}</p>@if($review&&!$p['decision'])<form data-action="allocation-decide"><input type="hidden" name="proposal_id" value="{{ $p['id'] }}"><label>Decisão<select name="decision" required><option value="">Escolha</option><option value="confirmed">Confirmar a afectação mostrada</option><option value="rejected">Recusar</option></select></label><label>Fundamento<textarea name="reason" required minlength="3"></textarea></label><button>Revalidar saldos e confirmar individualmente</button></form>@endif</article>@endforeach</section>
|
|
<section><h2>Afectações confirmadas e reversões</h2>@foreach($data['money']['allocations'] as $a)@php($reversed=collect($data['money']['reversals'])->contains(fn($r)=>$r->allocation_id===$a->id))@php($proposal=collect($data['money']['reversal_proposals'])->first(fn($r)=>$r->allocation_id===$a->id))<article><p>Afectação #{{ $a->id }} · Obrigação #{{ $a->obligation_id }} · {{ $money($a->amount_minor) }} · {{ $reversed?'Revertida':'Confirmada' }}</p>@if($prepare&&!$reversed&&!$proposal)@php($ob=collect($data['obligations'])->first(fn($o)=>$o['id']===$a->obligation_id))@if($ob)<form data-action="reversal-prepare"><input type="hidden" name="allocation_id" value="{{ $a->id }}"><input type="hidden" name="source_revision" value="{{ $ob['source_revision'] }}"><label>Fundamento da reversão<textarea name="reason" required minlength="3"></textarea></label><button>Preparar reversão sem apagar o original</button></form>@endif @endif @if($review&&$proposal&&!$reversed)<p>Proposta #{{ $proposal->id }} · {{ $proposal->reason }}</p><form data-action="reversal-confirm"><input type="hidden" name="proposal_id" value="{{ $proposal->id }}"><label>Fundamento independente<textarea name="reason" required minlength="3"></textarea></label><button>Confirmar esta reversão</button></form>@endif</article>@endforeach</section>
|
|
<section><h2>Pesquisar e percorrer os registos</h2><form method="get"><label>Referência literal do pagamento<input name="payment_q" maxlength="100" value="{{ request('payment_q','') }}"></label><label>Estado<select name="payment_state">@foreach(['all'=>'Todos','proposed'=>'Por conferir','confirmed'=>'Confirmados','rejected'=>'Recusados'] as $value=>$label)<option value="{{ $value }}" @selected(request('payment_state','all')===$value)>{{ $label }}</option>@endforeach</select></label><label>Registos por página<select name="payment_per_page">@foreach([25,100] as $size)<option value="{{ $size }}" @selected((int)request('payment_per_page',25)===$size)>{{ $size }}</option>@endforeach</select></label><button>Pesquisar</button></form>
|
|
@foreach(['page'=>['Obrigações',$data['pagination']],'payments_page'=>['Pagamentos',$data['money']['pagination']['payments']],'allocation_proposals_page'=>['Propostas de afectação',$data['money']['pagination']['allocation_proposals']],'allocations_page'=>['Afectações',$data['money']['pagination']['allocations']],'payment_events_page'=>['Histórico',$data['money']['pagination']['payment_events']]] as $parameter=>[$label,$p])<nav aria-label="{{ $label }}"><strong>{{ $label }}</strong> · Página {{ $p['page'] }} de {{ $p['last_page'] }} @if($p['page']>1)<a href="{{ request()->fullUrlWithQuery([$parameter=>$p['page']-1]) }}">Anterior</a>@endif @if($p['page']<$p['last_page'])<a href="{{ request()->fullUrlWithQuery([$parameter=>$p['page']+1]) }}">Seguinte</a>@endif</nav>@endforeach
|
|
</section><section><h2>Histórico financeiro</h2>@foreach($data['money']['events'] as $event)<article><p>Evento #{{ $event->id }} · {{ $event->created_at }}</p><p>{{ $event->kind??$event->action??'Registo auditado' }}</p></article>@endforeach</section>
|
|
</main><script type="module" src="/sgf-finance-payables.mjs"></script></body></html>
|