/* ===========================================================
Forja 3D — Dívidas & Configurações
=========================================================== */
const DEBT_KINDS = [
{ value: 'impressora', label: 'Impressora' },
{ value: 'insumo', label: 'Insumos' },
{ value: 'equipamento', label: 'Equipamento' },
{ value: 'outro', label: 'Outro' },
];
function DebtForm({ initial, onSave, onClose }) {
const [d, setD] = useState(initial || { name: '', total: '', paid: 0, kind: 'impressora', note: '' });
const set = (k, v) => setD((p) => ({ ...p, [k]: v }));
return (
<>
set('name', v)} placeholder="Ex: Impressora Ender 3 V3" />
set('total', v)} prefix="R$" />
set('paid', v)} prefix="R$" />
set('note', v)} placeholder="Ex: Parcelado 10x" />
>
);
}
function PayForm({ debt, onClose }) {
const rest = debt.total - debt.paid;
const [amt, setAmt] = useState(rest);
return (
<>
Faltam {fmt.brl(rest)} em {debt.name}.
{[rest / 2, rest].map((q, i) => )}
>
);
}
function Debts() {
const s = useStore();
const [modal, setModal] = useState(null);
const [pay, setPay] = useState(null);
const total = s.debts.reduce((a, d) => a + d.total, 0);
const paid = s.debts.reduce((a, d) => a + d.paid, 0);
const rest = total - paid;
return (
setModal({ mode: 'add' })}>Nova dívida} />
{/* global progress */}
Progresso geral
{fmt.pct((paid / (total || 1)) * 100)}
{s.debts.length === 0 ? setModal({ mode: 'add' })}>Adicionar dívida}>Cadastre o que ainda falta pagar.
: (
{s.debts.map((d) => {
const pct = (d.paid / d.total) * 100;
const done = d.paid >= d.total;
return (
{d.name}
{done ?
Quitado :
{DEBT_KINDS.find((k) => k.value === d.kind)?.label}}
{d.note &&
{d.note}
}
{!done && }
setModal({ mode: 'edit', data: d })} />
confirmDel(`Excluir "${d.name}"?`) && store.removeDebt(d.id)} />
{fmt.brl(d.paid)} de {fmt.brl(d.total)}
{done ? '100%' : 'faltam ' + fmt.brl(d.total - d.paid)}
);
})}
)}
setModal(null)} title={modal?.mode === 'edit' ? 'Editar dívida' : 'Nova dívida'}>
{modal && modal.mode === 'edit' ? store.updateDebt(modal.data.id, d) : store.addDebt(d)} onClose={() => setModal(null)} />}
setPay(null)} title="Registrar pagamento">
{pay && x.id === pay.id) || pay} onClose={() => setPay(null)} />}
);
}
window.Debts = Debts;
/* ===========================================================
Configurações / parâmetros
=========================================================== */
function Config() {
const s = useStore();
const st = s.settings;
const upd = (k, v) => store.updateSettings({ [k]: v });
return (
Impressora & custos fixos
upd('printerName', v)} />
upd('printerCost', v)} prefix="R$" />
upd('printerLifeHours', v)} suffix="h" />
upd('powerWatts', v)} suffix="W" />
upd('energyCostKwh', v)} prefix="R$" suffix="/kWh" />
upd('laborPerHour', v)} prefix="R$" suffix="/h" />
upd('defaultMargin', v)} suffix="%" />
upd('failRate', v)} suffix="%" />
upd('defaultPackaging', v)} prefix="R$" />
upd('marketplaceFee', v)} suffix="%" />
Tudo fica salvo só no seu navegador. Você pode recarregar a página sem perder nada.
);
}
window.Config = Config;