const { Card, DataTable, Button, Icon, IconButton, SearchField, Select, Input, Modal, Badge, Tag, Tabs, EmptyState, Switch, DropdownMenu, StatCard } = window.ACRFlowDesignSystem_ba1e9c; const EMPTY_COMPANY = { name: "", kind: "cnpj", doc: "", purpose: "Condomínio", contact: "", active: true }; function CompanyForm({ value, purposes, onChange, onNewPurpose }) { const [novo, setNovo] = React.useState(""); const [adding, setAdding] = React.useState(false); return ( <> onChange({ ...value, name: e.target.value })} />
onChange({ ...value, doc: e.target.value })} />
setNovo(e.target.value)} />
) : ( )} onChange({ ...value, contact: e.target.value })} /> onChange({ ...value, phone: e.target.value })} hint="Visível apenas ao abrir o cadastro da empresa — não aparece na listagem." /> onChange({ ...value, active: !value.active })} label="Cadastro ativo" description="Cadastros inativos não aparecem na abertura de demandas." /> ); } function CompaniesScreen({ onToast }) { const D = window.useStore(); const S = window.ACRStore; const rows = D.companies || []; const [extraPurposes, setExtraPurposes] = React.useState([]); const purposes = [...new Set([...(D.purposes || []), ...extraPurposes])]; const setPurposes = (fn) => setExtraPurposes((s) => { const r = typeof fn === "function" ? fn([...purposes]) : fn; return r.filter((p) => !(D.purposes || []).includes(p)); }); const [salvando, setSalvando] = React.useState(false); /** O telefone não vem na listagem: busca ao abrir o cadastro. */ const abrir = async (empresa) => { setForm(empresa); if (empresa && empresa.id) { const cheia = await S.empresa(empresa.id); if (cheia) setForm((f) => (f && f.id === empresa.id ? { ...f, phone: cheia.phone || "", contact: cheia.contact || f.contact } : f)); } }; const falhou = (r) => { if (!r.ok) { onToast({ tone: "danger", title: "Não foi possível gravar", message: r.error }); return true; } return false; }; const [q, setQ] = React.useState(""); const [purpose, setPurpose] = React.useState("todas"); const [form, setForm] = React.useState(null); const [remove, setRemove] = React.useState(null); const list = rows.filter((r) => (purpose === "todas" || r.purpose === purpose) && (String(r.name).toLowerCase().includes(q.toLowerCase()) || String(r.doc || "").includes(q))); const save = async () => { if (!form.name || !String(form.name).trim()) { onToast({ tone: "danger", title: "Informe o nome", message: "O nome ou razão social é obrigatório." }); return; } setSalvando(true); const r = await S.salvarEmpresa(form); setSalvando(false); if (falhou(r)) return; onToast({ tone: "success", title: form.id ? "Cadastro atualizado" : "Empresa cadastrada", message: form.name }); setForm(null); }; return (

Empresas

Pessoas jurídicas e físicas atendidas pela ACR — condomínios, administradoras e prestadores.
r.active).length} tone="brand" icon={} /> r.kind === "cnpj").length} icon={} /> r.kind === "cpf").length} icon={} /> } />
setQ(e.target.value)} />