27 lines
5.4 KiB
PHP
27 lines
5.4 KiB
PHP
@php
|
|
$money=static fn($n)=>$n===null?'Indeterminado':($n<0?'-':'').number_format(intdiv(abs($n),100),0,',',' ').','.str_pad((string)(abs($n)%100),2,'0',STR_PAD_LEFT).' MZN';
|
|
$source=$flow['source_id'];$position=$flow['position'];$proposal=$flow['proposal'];$review=$flow['review'];$journal=$flow['journal'];
|
|
@endphp
|
|
<!doctype html><html lang="pt"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Conferência até ao lançamento — SGF</title><style>body{font:17px system-ui;background:#f3f6f5;color:#142b28}main{max-width:1000px;margin:auto;padding:24px}section,header{background:white;border:1px solid #d5e0dc;padding:24px;margin:18px 0;border-radius:12px}button{font:inherit;padding:10px;cursor:pointer}pre{white-space:pre-wrap;overflow-wrap:anywhere}.notice{padding:16px;background:#fff2cc}a{color:#125a4b}</style></head><body><main>
|
|
<header><a href="/general-ledger">Diário e extracto</a> · <a href="/">Navegação SGF</a><h1>Conferência → obrigação → lançamento</h1><p class="notice">Demonstração sintética. Cada decisão mantém o seu autor, fundamento e revisão. Abrir uma etapa não reconhece uma obrigação nem aplica um lançamento.</p><p>Empresa #{{ $flow['scope']['company_id'] }} / Unidade #{{ $flow['scope']['unit_id'] }} · Origem local #{{ $source }}</p>@if(session('ledger_demo'))<a href="/qa/ledger-demo">Trocar função sintética</a>@endif</header>
|
|
<p id="flow-error" role="alert"></p>
|
|
<section><h2>1. Documento e conferência financeira</h2><p>{{ $flow['document']['number'] }} · {{ $money($flow['document']['total_minor']) }}</p><p>A origem desta demonstração é um recibo sintético. Não comprova ligação operacional viva a Compras. Consulte a fotografia, pendências e propostas antes de decidir.</p><button data-module="purchasing" data-path="/supplier-payables?source={{ $source }}">Abrir conferência desta origem</button><details><summary>Fotografia documental</summary><pre>{{ json_encode($flow['document'],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE) }}</pre></details></section>
|
|
<section><h2>2. Reconhecimento independente e posição financeira</h2>
|
|
@if($position)<p>Obrigação #{{ $position['id'] }} · Principal {{ $money($position['principal_minor']) }} · Saldo {{ $money($position['balance_minor']) }}</p><p>Vencimento {{ $position['due_on']??'desconhecido' }}. O lançamento contabilístico não reduz o saldo.</p>@if($flow['source_conflict'])<p role="alert">Origem divergente. Exige nova conferência; a existência de uma proposta contabilística não resolve esta pendência.</p>@endif
|
|
@else<p>Ainda não reconhecida. Um documento ou uma proposta preparados não são uma obrigação validada. A contabilidade recusará uma origem sem reconhecimento.</p>@endif
|
|
<button data-module="purchasing" data-path="/supplier-payables/report?source={{ $source }}">Conferir posição financeira e totais</button>
|
|
@foreach($flow['financial_proposals'] as $p)<details><summary>Proposta financeira #{{ $p->id }} · captura {{ $p->capture_version }}</summary><p>{{ $p->reason }}</p><pre>{{ $p->snapshot }}</pre></details>@endforeach
|
|
@foreach($flow['financial_events'] as $event)<details><summary>Evidência #{{ $event->id }} · {{ $event->kind }} · autor #{{ $event->actor_id }} · {{ $event->created_at }}</summary><pre>{{ $event->payload }}</pre></details>@endforeach</section>
|
|
<section><h2>3. Preparação e revisão contabilística</h2>
|
|
@if($proposal)<p>Proposta #{{ $proposal->id }} · captura {{ $proposal->capture_version }} · autor #{{ $proposal->prepared_by }}</p><p>Revisão exacta <code>{{ $proposal->revision }}</code></p><p>{{ $review ? ($review->decision==='approved'?'Aprovada':'Recusada').' por #'.$review->reviewed_by : 'Conferência independente pendente' }}</p>
|
|
@else<p>Sem proposta contabilística. A preparação exige uma obrigação reconhecida e configuração compatível.</p>@endif
|
|
@if($position)<a href="/general-ledger?obligation_id={{ $position['id'] }}">Abrir proposta e impacto desta obrigação</a>@endif</section>
|
|
<section><h2>4. Aplicação única e extracto</h2>
|
|
@if($journal)<p>Lançamento #{{ $journal->id }} · {{ $journal->journal_on }} · Débito {{ $money($journal->debit_minor) }} / Crédito {{ $money($journal->credit_minor) }}</p><p>Aplicador #{{ $journal->posted_by }} · {{ $journal->created_at }} · {{ $journal->reason }}</p><a href="/general-ledger?obligation_id={{ $journal->obligation_id }}">Conferir comprovativo, linhas e histórico</a>
|
|
@else<p>Nenhum lançamento aplicado. A aprovação da proposta não o aplica automaticamente.</p>@endif</section>
|
|
<p>Revisão visual, carga de implantação, contas reais e composição autónoma contabilística continuam separadas. Esta página consulta o estado actual; as fotografias aplicadas conservam o histórico.</p>
|
|
</main><script>
|
|
const scope=@json($flow['scope']),token=@json(csrf_token());
|
|
for(const button of document.querySelectorAll('[data-module]'))button.onclick=async()=>{button.disabled=true;try{const r=await fetch('/api/context',{method:'POST',credentials:'same-origin',headers:{Accept:'application/json','Content-Type':'application/json','X-CSRF-TOKEN':token},body:JSON.stringify({...scope,module_id:button.dataset.module})});const data=await r.json();if(!r.ok)throw Error(data.message||'Não foi possível seleccionar o módulo.');location.assign(button.dataset.path);}catch(e){document.querySelector('#flow-error').textContent=e.message;button.disabled=false;}};
|
|
</script></body></html>
|