Files
SGF/resources/js/stock-menu.js
T
2026-10-29 22:42:37 +02:00

60 lines
7.7 KiB
JavaScript

// Informational navigation until the existing stock implementation has a common adapter.
// No quantities, balances, permissions or stock commands are fabricated here.
export const stockSections=[
{id:'stock_panel',label:'Painel'},
{id:'stock_balances',label:'Existências'},
{id:'stock_receipts',label:'Entradas'},
{id:'stock_issues',label:'Saídas'},
{id:'stock_transfers',label:'Transferências'},
{id:'stock_returns',label:'Devoluções'},
{id:'stock_reports',label:'Relatórios'},
];
export function visibleStockSections(can) {
// company.view exposes this informational menu only, never warehouse data or actions.
return can('company.view')?stockSections:[];
}
export const stockOperations={
stock_receipts:{title:'Recepção de mercadoria',purpose:'Registar mercadoria efectivamente recebida. Um rascunho não aumenta o stock.',
fields:['Data efectiva e data de registo','Origem, motivo e documento original','Fornecedor, quando se trata de uma compra','Produto, quantidade e unidade','Armazém de destino','Responsável e evidência de recepção'],
flow:['Preparar a partir da origem ou de uma entrada justificada','Conferir quantidades, destino e informação obrigatória','Submeter para aprovação, quando o circuito o exigir','Confirmar uma única vez e conservar o comprovativo'],
existing:'Compras já tem recepções parciais de ordens e entradas de quantidades aceites. Esse percurso permanece na aplicação autónoma, sem ser duplicado neste menu.',
missing:'Falta disponibilizar o adaptador de stock no SGF. Entradas manuais, saldo inicial e quarentena do documento não estão entregues neste percurso.',
control:'Devoluções de clientes e recepções de transferências usam as suas origens próprias. Uma factura de fornecedor não gera outra entrada da mercadoria já recebida.'},
stock_issues:{title:'Expedição, consumo e abate',purpose:'Registar uma saída física, distinguindo venda, consumo interno e abate.',
fields:['Data efectiva e data de registo','Tipo, motivo e destinatário','Documento ou autorização de origem','Produto, quantidade e unidade','Armazém de origem','Responsável e comprovativo'],
flow:['Identificar origem, destinatário e motivo','Consultar disponibilidade na origem','Submeter a autorização aplicável','Revalidar o saldo e confirmar a saída uma única vez'],
existing:'Compras já tem saídas de stock com destino, motivo, responsável e prevenção de saldo negativo. Os apontamentos materiais da oficina não executam essas saídas.',
missing:'Falta ligar o percurso ao SGF. Consumo de reservas próprias, bloqueios, saídas por venda e autorização de abates exigem os respectivos fluxos.',
control:'Não descontar duas vezes uma reserva. Uma factura ou um apontamento de consumo não deve criar uma segunda saída para o mesmo facto.'},
stock_transfers:{title:'Transferência entre armazéns',purpose:'Mover mercadoria entre origem e destino sem representar uma venda.',
fields:['Armazéns de origem e destino distintos','Produto, unidade e quantidades pedida, expedida e recebida','Datas efectivas de expedição e recepção','Motivo e documento de acompanhamento','Divergências e responsáveis'],
flow:['Preparar e autorizar o pedido','Expedir da origem','Receber e conferir no destino','Resolver diferenças e concluir'],
existing:'Compras já tem transferência imediata entre armazéns, com dois movimentos na mesma transacção. Não representa o transporte em duas fases proposto no documento.',
missing:'Faltam o adaptador SGF e o fluxo separado de expedição, trânsito, recepção parcial e divergências. Não se inventa stock em trânsito a partir da transferência imediata.',
control:'Mercadoria em trânsito não fica disponível no destino antes da recepção. Uma transferência não aumenta a quantidade total da empresa.'},
stock_returns:{title:'Devoluções de mercadoria',purpose:'Distinguir devolução de cliente, que recebe mercadoria, de devolução a fornecedor, que a expede.',
fields:['Tipo de devolução e entidade','Documento original e linhas elegíveis','Quantidade, unidade, motivo e condição','Armazém e tratamento da mercadoria','Datas efectivas, responsáveis e comprovativos','Referência financeira, quando existir'],
flow:['Seleccionar a origem e a quantidade ainda elegível','Registar motivo e condição','Obter autorização','Receber ou expedir e conservar a ligação ao original'],
existing:'As devoluções documentais e físicas deste modelo ainda não estão implementadas como percurso operacional no SGF. Um material marcado como devolvido na oficina é uma observação, não este movimento.',
missing:'Faltam elegibilidade acumulada, reservas de pedidos activos, inspecção, quarentena, expedição e estornos próprios. Não são substituídos por ajustes genéricos.',
control:'Devolução física, nota de crédito e devolução de dinheiro têm efeitos separados. A nota de crédito não pode gerar outro movimento físico do mesmo facto.'},
};
export const stockReports=[
{id:'balances',label:'Existências por armazém',basis:'Situação à data de referência',fields:'Produto, unidade, armazém, localização quando configurada, físico, reservado, bloqueado e disponível.',missing:'Sem fonte de saldos SGF, a consulta é indisponível. Reservado e bloqueado não são substituídos por zero.'},
{id:'movements',label:'Movimentos de stock',basis:'Período entre duas datas',fields:'Data, documento, origem/destino, produto, unidade, entrada, saída e abertura/fecho com os mesmos filtros.',missing:'Falta ligar o livro de movimentos e as suas origens. Não se usam os apontamentos da oficina como movimentos de armazém.'},
{id:'minimum',label:'Stock mínimo',basis:'Data de referência e mínimos configurados',fields:'Produto, armazém, disponível, mínimo e diferença até ao mínimo.',missing:'Mínimos e fonte de disponível ainda não estão configurados no SGF. Não se geram alertas ou propostas de compra automáticos.'},
{id:'valuation',label:'Valorização do stock',basis:'Data de referência, método e moeda',fields:'Consulta restrita a utilizadores com autorização própria para custos.',restricted:true,missing:'Requer método, custos fiáveis e autorização de consulta. Não se estima valorização a partir de preços de venda ou dos custos incompletos da oficina.'},
{id:'inactive',label:'Produtos sem movimento',feature:'history',basis:'Período de inactividade escolhido',fields:'Produto, último movimento elegível e dias sem movimento.',missing:'Requer histórico suficiente e definição das operações elegíveis.'},
{id:'transit',label:'Transferências em trânsito',feature:'transit',basis:'Data de referência',fields:'Expedido, recebido e pendente por produto e unidade.',missing:'Requer o fluxo de expedição e recepção separado.'},
{id:'returns',label:'Devoluções',feature:'returns',basis:'Período, tipo e estado',fields:'Origem, entidade, quantidade e tratamento.',missing:'Requer o fluxo próprio de devoluções.'},
{id:'expiry',label:'Lotes próximos da validade',feature:'lots',basis:'Data de referência e janela configurada',fields:'Produto, lote, validade e quantidades elegíveis.',missing:'Requer controlo de lotes/validade activo.'},
{id:'inventory',label:'Diferenças de inventário',feature:'inventory',basis:'Contagem e período',fields:'Saldo à contagem, quantidade contada e ajuste associado.',missing:'Requer contagem física e ajuste autorizado integrados.'},
];
export function availableStockReports(features={},canViewCosts=false) {
return stockReports.filter(r=>(!r.feature||features[r.feature]===true)&&(!r.restricted||canViewCosts));
}