DEMONSTRAÇÃO ORÇAMENTAL
Compras — controlo orçamental
ENSAIO SINTÉTICO — SEM UTILIZAÇÃO REAL. Dotações, reservas, compromissos e consumo usam o núcleo comum de Compras. Este percurso não é o orçamento industrial.
Empresa: {context.company.name} · Unidade: {context.unit?.name} · Moeda: MZN
Prepare a dotação, entre como validador para a aprovar e use a conta de operação para os movimentos. Decisões exigem identidade distinta. Consumo aqui é apenas um efeito orçamental simulado, sem factura, obrigação ou pagamento.
{error&&{error}
}{notice&&{notice}
}
load().catch(e=>setError(e.message))}>Actualizar saldos e histórico
{!data?A carregar o percurso…
:<>
{allowed('create')&&}
Dotações e saldos {!budget?Não há dotações neste contexto. A conta de preparação pode criar a primeira.
:<>
DotaçãosetSelection(e.target.value)}>{data.budgets.map(b=>#{b.id} · centro #{b.cost_center_id} · {b.year} · {b.includes_tax?'com imposto':'sem imposto'} )}
Estado: {budget.approved_by?'Aprovada':'Pendente de aprovação'} · Preparada por {data.actors[budget.created_by]??`#${budget.created_by}`} {budget.approved_by&&`· Validada por ${data.actors[budget.approved_by]??`#${budget.approved_by}`}`}
{[['Dotação inicial',budget.amount_minor],['Reforço aprovado',budget.balance.reinforced_minor],['Total aprovado',budget.balance.approved_total_minor],['Reservado',budget.balance.reserved_minor],['Comprometido',budget.balance.committed_minor],['Consumido',budget.balance.consumed_minor],['Disponível',budget.balance.available_minor]].map(([label,value])=>
{label} {budgetMoney(value)} )}
{allowed('approve')&&!budget.approved_by&&send('approve',{budget_id:budget.id})}>Aprovar dotação por identidade distinta }
>}
{(allowed('record')||allowed('consume'))&&!canMove&&Para operar, seleccione uma dotação aprovada do exercício actual com origem sintética no mesmo centro. O guião usa o centro ORC-DEMO.
}
{allowed('record')&&canMove&&Movimentos da origem sintética Reserva → ajuste de adjudicação → compromisso. A libertação só está disponível antes do compromisso. Uma repetição não volta a movimentar o saldo.
({...d,origin_id:Number(d.origin_id)}))}>Origem{originOptions} Movimento{Object.entries(kinds).map(([k,v])=>{v} )} {moneyInput('total','Total indicado (MZN)','300.00')}{moneyInput('subtotal','Subtotal sem imposto (MZN)','300.00')}Registar movimento sintético
}
{allowed('consume')&&canMove&&}
{allowed('reinforcement.propose')&&budget?.approved_by&&}
Reforços e decisões {data.reinforcements.length===0?Sem propostas de reforço.
:data.reinforcements.map(r=>{r.reference} · {budgetMoney(r.amount_minor)} Dotação #{r.budget_id} · {r.status} · Proponente: {data.actors[r.created_by]??r.created_by}
{r.reason}
{r.review_reason&&Decisão: {r.review_reason}
}{allowed('reinforcement.review')&&r.status==='pending'&&({...d,reinforcement_id:r.id}))}>DecisãoAprovar Recusar Fundamento Registar decisão distinta } )}
Movimentos rastreáveis Movimento Dotação / origem Actor Reserva Δ Compromisso Δ Data {data.entries.map(e=>#{e.id} · {kinds[e.kind]??e.kind} #{e.budget_id} / {data.origins.find(o=>o.id===e.requisition_id)?.reference??e.requisition_id} {data.actors[e.created_by]??e.created_by} {budgetMoney(e.reserved_minor)} {budgetMoney(e.committed_minor)} {e.created_at} )}
{!data.entries.length&&Ainda não há movimentos.
}
Consumos e respectivas referências {data.consumption_sources.map(s=>{s.reference} · origem #{s.origin_id} · total {budgetMoney(s.total_minor)} · efeito #{data.consumptions.find(c=>c.invoice_id===s.id)?.id??'pendente'}
)}
Histórico de decisões e efeitos {data.history.map(h=>#{h.id} · {h.action} · {data.actors[h.actor_id]??h.actor_id} · {h.created_at} {JSON.stringify(typeof h.payload==='string'?JSON.parse(h.payload):h.payload,null,2)} )}
>}
;
}