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, 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.
} onClick={() => setForm({ ...EMPTY_COMPANY })}>Nova empresa
r.active).length} tone="brand" icon={} />
r.kind === "cnpj").length} icon={} />
r.kind === "cpf").length} icon={} />
} />
setQ(e.target.value)} />
}
title="Cadastros" subtitle={list.length + " de " + rows.length + " registros"}>
{list.length ? (
(
{r.name}
{r.contact}
) },
{ key: "kind", label: "Tipo", width: 130, render: (r) => {r.kind === "cpf" ? "Pessoa física" : "Pessoa jurídica"} },
{ key: "doc", label: "CNPJ / CPF", width: 170, render: (r) => {r.doc} },
{ key: "purpose", label: "Finalidade", width: 170, render: (r) => {r.purpose} },
{ key: "demands", label: "Demandas", width: 100, render: (r) => {r.demands} },
{ key: "active", label: "Status", width: 100, render: (r) => {r.active ? "Ativo" : "Inativo"} },
{ key: "acoes", label: "", width: 92, render: (r) => (
} onClick={() => abrir(r)} />
} onClick={() => setRemove(r)} />
) },
]} />
) : (
} title="Nenhuma empresa encontrada." description="Ajuste a busca ou cadastre um novo registro." action={} />
)}
{form ? (
setForm(null)}
footer={<>>}>
setPurposes((s) => (s.includes(p) ? s : [...s, p]))} />
) : null}
{remove ? (
setRemove(null)}
footer={<>>}>
O cadastro sai das listas de seleção. As {remove.demands} demandas já vinculadas preservam o histórico.
) : null}
);
}
Object.assign(window, { CompaniesScreen });