// Cadastro de Objetivos Pessoais — seleção de objetivos com detalhes (motivo, prazos, observações)
const { useState: useStateOp } = React;
const fmtDataOp = (v) => { if (!v) return ""; const p = String(v).split("-"); return p.length === 3 ? `${p[2]}/${p[1]}/${p[0]}` : v; };
const OBJ_PESSOAIS_CATALOGO = [
{ id: "imovel", icone: "🏠", nome: "Aquisição de Imóvel", desc: "Realização do sonho da casa própria ou investimento imobiliário" },
{ id: "automovel", icone: "🚗", nome: "Aquisição de Automóvel", desc: "Conquista do carro/moto ideal para seu dia-a-dia" },
{ id: "viagens", icone: "✈️", nome: "Viagens e Experiências", desc: "Planejamento de viagens nacionais e internacionais" },
{ id: "aposentadoria", icone: "🌴", nome: "Aposentadoria", desc: "Preparação para qualidade de vida futura" },
{ id: "familiar", icone: "👨👩👧", nome: "Planejamento Familiar", desc: "Preparação para unificar vida financeira e trazer tranquilidade à família" },
{ id: "seguranca", icone: "🛡️", nome: "Segurança Financeira Patrimonial", desc: "Proteção do patrimônio e preparo para sucessão" },
{ id: "crescimento", icone: "📈", nome: "Crescimento Patrimonial", desc: "Expansão do patrimônio com estratégias financeiras" },
{ id: "investimentos", icone: "🎯", nome: "Investimentos", desc: "Estratégias de investimentos seguras e diversificadas" },
{ id: "organizacao", icone: "🧮", nome: "Organização Financeira", desc: "Gestão estratégica do orçamento e das contas pessoais" },
{ id: "dividas", icone: "💳", nome: "Quitação de dívidas", desc: "Eliminação de dívidas e limpeza do nome" },
{ id: "educacao", icone: "🎓", nome: "Educação e Capacitação", desc: "Investimentos em cursos, graduação ou especializações" },
{ id: "outro", icone: "•••", nome: "Outro", desc: "Outros objetivos financeiros" },
];
// Espelha cada objetivo pessoal selecionado como meta financeira na sessão 2
window.syncMetasPessoais = function(objetivos, dados) {
const cat = OBJ_PESSOAIS_CATALOGO;
const ativo = (k) => { const d = dados[k]; return d && d.selecionado && (d.confirmado || (d.motivo && d.fim)); };
let out = (objetivos || []).filter(o => !o.origem || ativo(o.origem));
cat.forEach(i => {
const d = dados[i.id];
if (!d || !d.selecionado) return;
if (!(d.confirmado || (d.motivo && d.fim))) return;
const nome = i.id === "outro" && d.titulo ? d.titulo : i.nome;
const existe = out.find(o => o.origem === i.id);
if (!existe) {
out = [...out, { id: "op_" + i.id, origem: i.id, nome, icone: i.icone, alvo: 0, acumulado: 0, prazo: d.fim || "" }];
} else {
out = out.map(o => o.origem === i.id ? { ...o, nome, prazo: o.prazo || d.fim || "" } : o);
}
});
return out;
};
function ObjPessoalCard({ item, data, open, onToggleSelect, onToggleOpen, onChange, onConfirm }) {
const selected = !!data.selecionado;
return (
{selected && (
)}
{selected && open && (
)}
);
}
function ObjetivosPessoaisPage({ objetivosPessoais, onUpdate, objetivos, onAsset, onEditAsset, onDeleteAsset, familia, onEditFamilia }) {
const dados = objetivosPessoais || {};
const metas = objetivos || [];
const totalAlvo = metas.reduce((s, o) => s + Number(o.alvo || 0), 0);
const totalAcum = metas.reduce((s, o) => s + Number(o.acumulado || 0), 0);
const [open, setOpen] = useStateOp(null);
const [flash, setFlash] = useStateOp(null);
const selecionados = OBJ_PESSOAIS_CATALOGO.filter(i => dados[i.id] && dados[i.id].selecionado);
const completos = selecionados.filter(i => {
const d = dados[i.id];
return d.motivo && d.inicio && d.fim;
});
function toggleSelect(id) {
const cur = dados[id] || {};
const next = { ...dados, [id]: { ...cur, selecionado: !cur.selecionado } };
onUpdate(next);
setOpen(!cur.selecionado ? id : null);
}
function change(id, patch) {
onUpdate({ ...dados, [id]: { ...(dados[id] || {}), ...patch } });
}
function confirmar(id) {
onUpdate({ ...dados, [id]: { ...(dados[id] || {}), selecionado: true, confirmado: true } });
setOpen(null);
setFlash(id);
setTimeout(() => setFlash(null), 2200);
}
return (
🎯 Objetivos
Comece pela estrutura familiar, escolha seus objetivos pessoais e acompanhe as metas financeiras ligadas a eles.
Objetivos escolhidos
{selecionados.length}
Detalhados{completos.length}/{selecionados.length}
Metas financeiras{metas.length}
Falta acumular{window.fmtCompact(Math.max(0, totalAlvo - totalAcum))}
1 · Estrutura familiar
2 · Quais são seus objetivos?
{OBJ_PESSOAIS_CATALOGO.map(item => (
setOpen(o => (o === id ? null : id))}
onChange={change}
onConfirm={confirmar}
/>
))}
3 · Metas financeiras {flash && objetivo cadastrado aqui ↓}
{metas.map(o => {
const pct = o.alvo > 0 ? Math.min(o.acumulado / o.alvo, 1) : 0;
const done = pct >= 1;
const meses = o.prazo ? Math.max(0, Math.round((new Date(o.prazo) - new Date()) / (30.44 * 864e5))) : null;
const aporteNec = meses > 0 ? Math.max(0, (o.alvo - o.acumulado) / meses) : null;
return (
{o.icone || "🎯"}
{o.nome}
{o.origem &&
🧭 vindo dos objetivos pessoais
}
{window.fmtBRLString(o.acumulado)}
de {window.fmtBRLString(o.alvo)}
{Number(o.alvo) > 0
?
:
}
{Number(o.alvo) > 0 && {Math.round(pct * 100)}%}
{o.prazo && até {o.prazo.split("-").reverse().join("/")}}
{Number(o.alvo) > 0 && aporteNec != null && !done && ≈ {window.fmtCompact(aporteNec)}/mês}
{done && ✅ concluído}
);
})}
{metas.length === 0 &&
Nenhuma meta financeira. Adicione a primeira!
}
{selecionados.length > 0 && (
Resumo dos objetivos escolhidos
{selecionados.map(i => {
const d = dados[i.id] || {};
const titulo = i.id === "outro" && d.titulo ? d.titulo : i.nome;
return (
{i.icone}
{titulo}
{d.inicio ? fmtDataOp(d.inicio) : "sem início"} → {d.fim ? fmtDataOp(d.fim) : "sem prazo"}
{d.motivo &&
{d.motivo}
}
);
})}
)}
);
}
Object.assign(window, { ObjetivosPessoaisPage, OBJ_PESSOAIS_CATALOGO });