/* Admin ops screens: Clientes (lista + wizard + detail), Transações + detail, Antecipações, Conciliação, Cancelamento, Baixa, Chargebacks, Antifraude */

/* ----------------- CLIENTES (lista hierárquica) ----------------- */
function AdminClientes({ onNavigate }) {
  const [q, setQ] = useState('');
  const [statusF, setStatusF] = useState('todos');
  const [planoF, setPlanoF] = useState('todos');
  const [expanded, setExpanded] = useState(() => new Set(MOCK.REDES.slice(0,2).map(r => r.id)));

  const toggle = id => setExpanded(s => { const cp = new Set(s); cp.has(id) ? cp.delete(id) : cp.add(id); return cp; });

  const filtroUnidade = (u) => {
    if (statusF !== 'todos' && u.status !== statusF) return false;
    if (planoF !== 'todos' && u.plano.toLowerCase() !== planoF) return false;
    if (q && !(u.nome.toLowerCase().includes(q.toLowerCase()) || u.cnpj.includes(q) || u.cidade.toLowerCase().includes(q.toLowerCase()))) return false;
    return true;
  };

  return (
    <>
      <PageHeader title="Academias"
        subtitle={`${MOCK.UNIDADES.length} unidades em ${MOCK.FILIAIS.length} filiais · ${MOCK.REDES.length} redes`}
        actions={
          <>
            <Button variant="secondary" icon="download">Exportar</Button>
            <Button icon="plus" onClick={()=>onNavigate('admin/clientes/novo')}>Nova academia</Button>
          </>
        }/>

      <Card>
        <FilterBar>
          <div className="flex-1 min-w-[260px]"><SearchBar value={q} onChange={setQ} placeholder="Buscar por nome, CNPJ ou cidade…" kbd={null}/></div>
          <Select value={statusF} onChange={setStatusF} options={[
            {value:'todos',label:'Todos status'},{value:'ativo',label:'Ativo'},{value:'pendente',label:'Pendente'},{value:'suspenso',label:'Suspenso'}
          ]}/>
          <Select value={planoF} onChange={setPlanoF} options={[
            {value:'todos',label:'Todos planos'},...MOCK.PLANOS.map(p=>({value:p.nome.toLowerCase(),label:p.nome}))
          ]}/>
          <Button variant="ghost" size="sm" icon="filter">Mais filtros</Button>
        </FilterBar>
        <Table>
          <THead><tr>
            <TH>Nome</TH><TH>CNPJ</TH><TH>Cidade</TH><TH>Plano</TH><TH align="right">Volume 30d</TH><TH align="right">Alunos</TH><TH>Adq. preferida</TH><TH>Status</TH><TH/>
          </tr></THead>
          <TBody>
            {MOCK.REDES.map(rede => {
              const filiais = MOCK.FILIAIS.filter(f => f.rede === rede.id);
              const allUnits = MOCK.UNIDADES.filter(u => u.rede === rede.id && filtroUnidade(u));
              if (allUnits.length === 0 && (q || statusF !== 'todos' || planoF !== 'todos')) return null;
              const volR = allUnits.reduce((s,u)=>s+u.volume30d,0);
              const open = expanded.has(rede.id);
              return (
                <React.Fragment key={rede.id}>
                  <TR onClick={()=>toggle(rede.id)} className="bg-paper-100/60">
                    <TD>
                      <div className="flex items-center gap-2">
                        <Icon name={open?'chevronDown':'chevronRight'} className="text-ink-400"/>
                        <Icon name="network" className="text-violet-600"/>
                        <div>
                          <div className="font-semibold text-ink-900">{rede.nome}</div>
                          <div className="text-[11px] text-ink-400">{filiais.length} filiais · {allUnits.length} unidades</div>
                        </div>
                      </div>
                    </TD>
                    <TD mono className="text-ink-500">{rede.cnpj}</TD>
                    <TD className="text-ink-400">—</TD>
                    <TD/>
                    <TD align="right" mono className="font-semibold">{MOCK.fmtBRL(volR)}</TD>
                    <TD align="right" mono>{MOCK.fmtNum(allUnits.reduce((s,u)=>s+u.alunos,0))}</TD>
                    <TD/>
                    <TD><Badge tone="info" dot>Rede</Badge></TD>
                    <TD/>
                  </TR>
                  {open && filiais.map(f => {
                    const us = allUnits.filter(u => u.filial === f.id);
                    const oF = expanded.has(f.id);
                    if (us.length === 0) return null;
                    return (
                      <React.Fragment key={f.id}>
                        <TR onClick={()=>toggle(f.id)}>
                          <TD>
                            <div className="flex items-center gap-2 pl-6">
                              <Icon name={oF?'chevronDown':'chevronRight'} className="text-ink-400"/>
                              <Icon name="building" className="text-ink-500"/>
                              <div className="font-medium text-ink-700">{f.nome}</div>
                            </div>
                          </TD>
                          <TD className="text-ink-400">—</TD>
                          <TD/><TD/>
                          <TD align="right" mono>{MOCK.fmtBRL(us.reduce((s,u)=>s+u.volume30d,0))}</TD>
                          <TD align="right" mono>{MOCK.fmtNum(us.reduce((s,u)=>s+u.alunos,0))}</TD>
                          <TD/>
                          <TD><Badge tone="neutral">Filial</Badge></TD>
                          <TD/>
                        </TR>
                        {oF && us.map(u => (
                          <TR key={u.id} onClick={() => onNavigate('admin/clientes/' + u.id)}>
                            <TD>
                              <div className="flex items-center gap-2 pl-12">
                                <span className="h-1.5 w-1.5 rounded-full bg-ink-300"/>
                                <div>
                                  <div className="font-medium text-ink-900">{u.nome}</div>
                                  <div className="text-[11px] text-ink-400">MCC {u.mcc}</div>
                                </div>
                              </div>
                            </TD>
                            <TD mono className="text-ink-500">{u.cnpj}</TD>
                            <TD className="text-ink-700">{u.cidade}/{u.uf}</TD>
                            <TD>
                              <Badge tone={u.plano==='Diamante'?'info':u.plano==='Ouro'?'warn':'neutral'}>{u.plano}</Badge>
                            </TD>
                            <TD align="right" mono className="font-semibold">{MOCK.fmtBRL(u.volume30d)}</TD>
                            <TD align="right" mono>{MOCK.fmtNum(u.alunos)}</TD>
                            <TD><AdqBadge id={u.adquirentePref}/></TD>
                            <TD><Badge tone={MOCK.statusBadge(u.status).tone} dot>{MOCK.statusBadge(u.status).label}</Badge></TD>
                            <TD><Icon name="chevronRight" className="text-ink-300"/></TD>
                          </TR>
                        ))}
                      </React.Fragment>
                    );
                  })}
                </React.Fragment>
              );
            })}
          </TBody>
        </Table>
        <Pagination page={1} pages={1} onChange={()=>{}} total={MOCK.UNIDADES.length}/>
      </Card>
    </>
  );
}

/* ----------------- WIZARD ONBOARDING ----------------- */
function AdminClienteNovo({ onNavigate }) {
  const toast = useToast();
  const [step, setStep] = useState(0);
  const [data, setData] = useState({
    cnpj:'', razao:'', fantasia:'', mcc:'7997',
    cep:'04543-907', logradouro:'Av. Brigadeiro Faria Lima, 4400', cidade:'São Paulo', uf:'SP',
    banco:'341 — Itaú', agencia:'0001', conta:'12345-6', titular:'',
    aceitaCred:true, aceitaCred12:true, aceitaPIX:true, aceitaDeb:true, aceitaRec:true,
    midCielo:'MID-001234', midRede:'MID-994412', midGetNet:'MID-880077',
    plano:'prata', webhookUrl:'',
  });
  const steps = [
    { id:'basicos', label:'Dados básicos' },
    { id:'endereco', label:'Endereço' },
    { id:'bancario', label:'Bancário' },
    { id:'pagamento', label:'Pagamento' },
    { id:'taxas', label:'Plano' },
  ];
  const isLast = step === steps.length;

  return (
    <>
      <PageHeader breadcrumb={['Academias','Nova']} title="Cadastrar nova academia"
        subtitle="Onboarding em 5 passos"
        actions={<Button variant="secondary" onClick={()=>onNavigate('admin/clientes')}>Cancelar</Button>}/>

      <Card className="mb-4">
        <div className="px-5 pt-5">
          <div className="flex items-center gap-2">
            {steps.map((s, i) => (
              <React.Fragment key={s.id}>
                <button onClick={()=>setStep(i)} className="flex items-center gap-2 flex-1 text-left">
                  <span className={`h-7 w-7 rounded-full text-[12px] font-bold flex items-center justify-center ${
                    i < step ? 'bg-ok-500 text-white' : i === step ? 'bg-violet-500 text-white' : 'bg-paper-200 text-ink-500'
                  }`}>{i < step ? <Icon name="check"/> : i+1}</span>
                  <div className={`flex-1 ${i === step ? '' : 'text-ink-500'}`}>
                    <div className="text-[10px] uppercase tracking-wider font-semibold text-ink-400">Passo {i+1}</div>
                    <div className={`text-[13px] font-medium ${i === step ? 'text-ink-900' : ''}`}>{s.label}</div>
                  </div>
                </button>
                {i < steps.length - 1 && <div className={`h-px flex-1 ${i < step ? 'bg-ok-500' : 'bg-line-200'}`}/>}
              </React.Fragment>
            ))}
            <div className="flex items-center gap-2 flex-1 text-left">
              <span className={`h-7 w-7 rounded-full text-[12px] font-bold flex items-center justify-center ${
                isLast ? 'bg-violet-500 text-white' : 'bg-paper-200 text-ink-500'
              }`}>{isLast ? <Icon name="check"/> : '✓'}</span>
              <div className={`flex-1 ${isLast ? '' : 'text-ink-500'}`}>
                <div className="text-[10px] uppercase tracking-wider font-semibold text-ink-400">Final</div>
                <div className={`text-[13px] font-medium ${isLast ? 'text-ink-900':''}`}>Revisão</div>
              </div>
            </div>
          </div>
        </div>

        <div className="p-6 max-w-4xl">
          {step === 0 && (
            <div className="grid grid-cols-2 gap-4">
              <Input label="CNPJ" value={data.cnpj} onChange={e=>setData({...data, cnpj:e.target.value})} placeholder="00.000.000/0000-00"/>
              <Input label="MCC" value={data.mcc} onChange={e=>setData({...data, mcc:e.target.value})} hint="7997 — Clubes esportivos"/>
              <Input label="Razão social" value={data.razao} onChange={e=>setData({...data, razao:e.target.value})} placeholder="Academia Saúde Total Ltda."/>
              <Input label="Nome fantasia" value={data.fantasia} onChange={e=>setData({...data, fantasia:e.target.value})} placeholder="Saúde Total"/>
              <Select label="Tipo" value="unidade" onChange={()=>{}} options={[{value:'unidade',label:'Unidade isolada'},{value:'filial',label:'Filial de rede existente'}]}/>
              <Select label="Vincular à filial (opcional)" value="" onChange={()=>{}} options={[{value:'',label:'— Nenhuma —'},...MOCK.FILIAIS.map(f=>({value:f.id,label:f.nome}))]}/>
            </div>
          )}
          {step === 1 && (
            <div className="grid grid-cols-3 gap-4">
              <Input label="CEP" value={data.cep} onChange={e=>setData({...data, cep:e.target.value})}/>
              <Input className="col-span-2" label="Logradouro" value={data.logradouro} onChange={e=>setData({...data, logradouro:e.target.value})}/>
              <Input label="Número" defaultValue="4400"/>
              <Input label="Complemento" defaultValue="Sala 7"/>
              <Input label="Bairro" defaultValue="Itaim Bibi"/>
              <Input label="Cidade" value={data.cidade} onChange={e=>setData({...data, cidade:e.target.value})}/>
              <Select label="UF" value={data.uf} onChange={v=>setData({...data, uf:v})} options={['SP','RJ','MG','PR','RS','BA','PE','CE','SC','DF']}/>
              <Input label="País" defaultValue="Brasil"/>
            </div>
          )}
          {step === 2 && (
            <div className="grid grid-cols-2 gap-4">
              <Select label="Banco" value={data.banco} onChange={v=>setData({...data, banco:v})} options={['341 — Itaú','237 — Bradesco','001 — Banco do Brasil','104 — Caixa','260 — Nu Pagamentos','077 — Inter']}/>
              <Select label="Tipo de conta" value="cc" onChange={()=>{}} options={[{value:'cc',label:'Conta corrente'},{value:'cp',label:'Conta poupança'}]}/>
              <Input label="Agência" value={data.agencia} onChange={e=>setData({...data, agencia:e.target.value})}/>
              <Input label="Conta com dígito" value={data.conta} onChange={e=>setData({...data, conta:e.target.value})}/>
              <Input className="col-span-2" label="Titular da conta" placeholder="Mesmo nome da razão social ou CPF do titular"/>
            </div>
          )}
          {step === 3 && (
            <>
              <div className="text-[13px] font-semibold text-ink-700 mb-3">Modalidades aceitas</div>
              <div className="grid grid-cols-2 lg:grid-cols-3 gap-3">
                {[
                  ['aceitaCred','Crédito à vista','Liquidação D+30 (padrão Visa/Master)'],
                  ['aceitaCred12','Crédito parcelado','Até 12x sem juros'],
                  ['aceitaDeb','Débito','Liquidação D+1'],
                  ['aceitaRec','Crédito recorrente','Cobrança mensal automática'],
                  ['aceitaPIX','PIX à vista','Liquidação imediata'],
                  ['aceitaPIX2','PIX recorrente','Beta — Bacen 2024'],
                ].map(([k,t,s]) => (
                  <div key={k} className="rounded-xl border border-line-200 p-3.5 flex items-start gap-3">
                    <Toggle checked={data[k] ?? true} onChange={v => setData(d=>({...d,[k]:v}))} />
                    <div>
                      <div className="text-[13px] font-medium text-ink-900">{t}</div>
                      <div className="text-[11.5px] text-ink-500 mt-0.5">{s}</div>
                    </div>
                  </div>
                ))}
              </div>
              <div className="text-[13px] font-semibold text-ink-700 mt-6 mb-3">MerchantIDs por adquirente</div>
              <div className="grid grid-cols-3 gap-4">
                <Input label="Cielo MID" value={data.midCielo} onChange={e=>setData({...data, midCielo:e.target.value})} icon="copy"/>
                <Input label="Rede MID" value={data.midRede} onChange={e=>setData({...data, midRede:e.target.value})} icon="copy"/>
                <Input label="GetNet MID" value={data.midGetNet} onChange={e=>setData({...data, midGetNet:e.target.value})} icon="copy"/>
              </div>
              <div className="rounded-xl bg-violet-50 border border-violet-100 p-4 mt-4 flex items-start gap-3">
                <Icon name="info" className="text-violet-600 mt-0.5"/>
                <div className="text-[12.5px] text-ink-700">
                  <b>Provisionamento automático:</b> ao salvar, os MerchantIDs serão validados via API das adquirentes
                  e a unidade ficará pronta para processar em até 4h úteis.
                </div>
              </div>
            </>
          )}
          {step === 4 && (
            <>
              <div className="grid grid-cols-1 lg:grid-cols-4 gap-3">
                {MOCK.PLANOS.map(p => (
                  <button key={p.id} onClick={()=>setData(d=>({...d, plano:p.id}))}
                    className={`rounded-xl border p-4 text-left transition ${data.plano===p.id?'border-violet-500 bg-violet-50/40 shadow-card':'border-line-200 hover:border-line-300'}`}>
                    <div className="flex items-center justify-between">
                      <div className="font-semibold">{p.nome}</div>
                      {data.plano===p.id && <Icon name="check" className="text-violet-600"/>}
                    </div>
                    <div className="text-[24px] font-semibold tabular-nums mt-1">{MOCK.fmtPct(p.spread,2)}</div>
                    <div className="text-[11.5px] text-ink-500 mt-1">{p.descricao}</div>
                  </button>
                ))}
              </div>
              <Input className="mt-4" label="Webhook URL (opcional)" value={data.webhookUrl} onChange={e=>setData({...data, webhookUrl:e.target.value})} placeholder="https://api.academia.com/pacto-events"/>
            </>
          )}
          {isLast && (
            <div className="space-y-4 max-w-3xl">
              <div className="text-[13px] text-ink-500">Revise os dados antes de criar a unidade.</div>
              {[
                { t:'Dados básicos', items: { CNPJ: data.cnpj||'—', 'Razão social': data.razao||'—', 'Nome fantasia': data.fantasia||'—', MCC: data.mcc }},
                { t:'Endereço', items: { Logradouro: data.logradouro, Cidade: `${data.cidade}/${data.uf}` }},
                { t:'Bancário', items: { Banco: data.banco, 'Ag/Conta': `${data.agencia} / ${data.conta}` }},
                { t:'Configuração', items: { 'Cielo MID': data.midCielo, 'Rede MID': data.midRede, 'GetNet MID': data.midGetNet, 'Plano': MOCK.PLANOS.find(p=>p.id===data.plano).nome }},
              ].map(s => (
                <Card key={s.t} className="p-4">
                  <div className="text-[12px] font-semibold text-ink-900 mb-2">{s.t}</div>
                  <div className="grid grid-cols-2 gap-x-4 gap-y-1">
                    {Object.entries(s.items).map(([k,v])=>(
                      <div key={k} className="flex items-center justify-between text-[12.5px] py-0.5">
                        <span className="text-ink-500">{k}</span>
                        <span className="font-medium text-ink-900">{v}</span>
                      </div>
                    ))}
                  </div>
                </Card>
              ))}
            </div>
          )}
        </div>

        {/* Footer fixo */}
        <div className="px-5 py-3 border-t border-line-100 bg-paper-100 flex items-center justify-between rounded-b-xl2">
          <Button variant="ghost" icon="arrowLeft" onClick={()=> step === 0 ? onNavigate('admin/clientes') : setStep(s=>s-1)}>
            {step === 0 ? 'Cancelar' : 'Voltar'}
          </Button>
          <div className="text-[11.5px] text-ink-400">Passo {Math.min(step+1, steps.length+1)} de {steps.length+1}</div>
          <Button iconRight={isLast ? 'check' : 'arrowRight'} onClick={() => {
            if (isLast) { toast.success('Academia criada com sucesso · provisionando MerchantIDs'); onNavigate('admin/clientes'); }
            else setStep(s => s+1);
          }}>{isLast ? 'Criar academia' : 'Continuar'}</Button>
        </div>
      </Card>
    </>
  );
}

/* ----------------- CLIENTE DETAIL ----------------- */
function AdminClienteDetail({ id, onNavigate }) {
  const u = MOCK.UNIDADES.find(x => x.id === id);
  const [tab, setTab] = useState('dados');
  const toast = useToast();
  if (!u) return <Empty title="Unidade não encontrada"/>;
  return (
    <>
      <PageHeader breadcrumb={['Academias', u.redeNome, u.nome]} title={u.nome}
        subtitle={`${u.cidade}/${u.uf} · ${u.cnpj}`}
        actions={
          <>
            <Button variant="secondary" icon="arrowLeft" onClick={()=>onNavigate('admin/clientes')}>Voltar</Button>
            <Button variant="secondary" icon="power">Suspender</Button>
            <Button icon="edit">Editar</Button>
          </>
        }/>

      <div className="grid grid-cols-1 lg:grid-cols-4 gap-3 mb-4">
        <KpiCard label="Volume 30d" value={MOCK.fmtBRL(u.volume30d)} delta="+12,4%" deltaTone="ok"/>
        <KpiCard label="Alunos ativos" value={MOCK.fmtNum(u.alunos)} delta="+38" deltaTone="ok"/>
        <KpiCard label="Aprovação" value="95,2%" delta="+0,4pp" deltaTone="ok"/>
        <KpiCard label="Chargeback" value="0,15%" delta="−0,03pp" deltaTone="ok"/>
      </div>

      <Tabs tabs={[
        {id:'dados',label:'Dados'},
        {id:'hier',label:'Hierarquia'},
        {id:'modal',label:'Modalidades'},
        {id:'taxas',label:'Taxas'},
        {id:'mid',label:'MerchantIDs'},
        {id:'hook',label:'Webhook'},
        {id:'audit',label:'Auditoria'},
      ]} value={tab} onChange={setTab} className="mb-4"/>

      {tab==='dados' && (
        <Card className="p-5 grid grid-cols-1 lg:grid-cols-2 gap-x-8 gap-y-4 max-w-4xl">
          {[
            ['Razão social', 'Academia '+u.nome+' Ltda.'],
            ['Nome fantasia', u.nome],
            ['CNPJ', u.cnpj],
            ['MCC', u.mcc+' — Clubes esportivos'],
            ['Endereço', `Av. Pacífico, 1287 · ${u.cidade}/${u.uf}`],
            ['Telefone', '(11) 3000-0' + (Math.abs(u.id.charCodeAt(0))%10) + '00'],
            ['E-mail responsável', `financeiro@${u.nome.toLowerCase().replace(/\s+/g,'')}.com.br`],
            ['Banco', '341 — Itaú · Ag 0001 · CC 12.345-6'],
            ['Status', <Badge tone={MOCK.statusBadge(u.status).tone} dot>{MOCK.statusBadge(u.status).label}</Badge>],
            ['Plano', <Badge tone="info">{u.plano}</Badge>],
            ['Cadastrado em', MOCK.fmtDate(u.criadoEm)],
            ['ID interno', <span className="font-mono text-[11.5px]">{u.id}</span>],
          ].map(([k,v]) => (
            <div key={k} className="flex items-center justify-between border-b border-line-100 pb-2">
              <span className="text-[12.5px] text-ink-500">{k}</span>
              <span className="text-[13px] font-medium text-ink-900">{v}</span>
            </div>
          ))}
        </Card>
      )}
      {tab==='hier' && (
        <Card className="p-5">
          <div className="flex items-center gap-2 text-[12px] mb-4">
            <Icon name="network" className="text-violet-600"/>
            <b>{u.redeNome}</b>
            <Icon name="chevronRight" className="text-ink-300"/>
            <Icon name="building" className="text-ink-500"/>
            <b>{u.filialNome}</b>
            <Icon name="chevronRight" className="text-ink-300"/>
            <span className="font-semibold text-violet-700">{u.nome}</span>
          </div>
          <div className="text-[13px] text-ink-500">Outras unidades da mesma filial:</div>
          <div className="mt-2 grid grid-cols-2 gap-2">
            {MOCK.UNIDADES.filter(x=>x.filial===u.filial && x.id !== u.id).slice(0,4).map(s => (
              <div key={s.id} className="rounded-lg border border-line-200 p-3 flex items-center gap-3">
                <span className="h-7 w-7 rounded-md bg-violet-50 text-violet-600 flex items-center justify-center"><Icon name="building"/></span>
                <div className="flex-1 min-w-0">
                  <div className="font-medium text-[13px]">{s.nome}</div>
                  <div className="text-[11px] text-ink-400">{s.cidade}/{s.uf}</div>
                </div>
                <Button size="sm" variant="ghost" iconRight="arrowRight" onClick={()=>onNavigate('admin/clientes/'+s.id)}>Abrir</Button>
              </div>
            ))}
          </div>
        </Card>
      )}
      {tab==='modal' && (
        <Card className="p-5 grid grid-cols-1 lg:grid-cols-2 gap-3 max-w-3xl">
          {[
            ['Crédito à vista',true],['Crédito parcelado (até 12x)',true],['Recorrente',true],
            ['Débito',true],['PIX',true],['PIX Recorrente',false]
          ].map(([n,a]) => (
            <div key={n} className="rounded-lg border border-line-200 p-3 flex items-center justify-between">
              <div>
                <div className="text-[13px] font-medium">{n}</div>
                <div className="text-[11.5px] text-ink-400">Liquidação padrão · D+30 ou conforme contrato</div>
              </div>
              <Toggle checked={a} onChange={()=>toast.success('Modalidade atualizada')}/>
            </div>
          ))}
        </Card>
      )}
      {tab==='taxas' && (
        <Card>
          <div className="px-5 py-3 border-b border-line-100 flex items-center justify-between">
            <div className="text-[13px]">Spread aplicado: <b>{MOCK.fmtPct(MOCK.PLANOS.find(p=>p.nome.toLowerCase()===u.plano.toLowerCase()).spread,2)}</b> ({u.plano})</div>
            <Button size="sm" variant="outline" icon="edit">Alterar plano</Button>
          </div>
          <Table>
            <THead><tr><TH>Bandeira</TH>{MOCK.FAIXAS.map(f=><TH key={f.id} align="right">{f.nome}</TH>)}</tr></THead>
            <TBody>
              {MOCK.BANDEIRAS.slice(0,5).map(b => (
                <TR key={b.id}>
                  <TD><BandeiraBadge id={b.id}/></TD>
                  {MOCK.FAIXAS.map(f => {
                    const min = MOCK.TAXAS_ADQUIRENTE.filter(x=>x.bandeira===b.id&&x.faixa===f.id).sort((a,b)=>a.taxa-b.taxa)[0];
                    const spread = MOCK.PLANOS.find(p=>p.nome.toLowerCase()===u.plano.toLowerCase()).spread;
                    return <TD key={f.id} align="right" mono>{min ? MOCK.fmtPct(min.taxa+spread,2) : '—'}</TD>;
                  })}
                </TR>
              ))}
            </TBody>
          </Table>
        </Card>
      )}
      {tab==='mid' && (
        <Card className="p-5 space-y-3 max-w-3xl">
          {MOCK.ADQUIRENTES.map(a => (
            <div key={a.id} className="rounded-lg border border-line-200 p-3 flex items-center gap-3">
              <AdqBadge id={a.id}/>
              <div className="flex-1">
                <Input value={`MID-${a.id.toUpperCase()}-${(u.id.replace(/[^0-9]/g,'')||'001234').padEnd(6,'0')}`} readOnly icon="copy"/>
              </div>
              <Badge tone="ok" dot>Provisionado</Badge>
            </div>
          ))}
        </Card>
      )}
      {tab==='hook' && (
        <Card className="p-5 max-w-3xl space-y-3">
          <Input label="Webhook URL" defaultValue={`https://${u.nome.toLowerCase().replace(/\s+/g,'')}.com.br/api/pacto-events`} icon="link"/>
          <Input label="Secret HMAC" value="whsec_•••••••••••••••••••••" readOnly icon="eyeOff"/>
          <div className="text-[12px] font-semibold mt-3">Eventos assinados</div>
          <div className="flex flex-wrap gap-1.5">
            {MOCK.EVENTOS_WEBHOOK.slice(0,9).map(e => <Badge key={e} tone="neutral" className="font-mono">{e}</Badge>)}
          </div>
        </Card>
      )}
      {tab==='audit' && (
        <Card>
          <Table>
            <THead><tr><TH>Quando</TH><TH>Usuário</TH><TH>Ação</TH><TH>Detalhe</TH></tr></THead>
            <TBody>
              {[
                ['Hoje 12:18','renato@pactopay','plano.changed','Bronze → Prata'],
                ['-1d 09:02','operador@pactopay','webhook.updated','URL atualizada'],
                ['-4d 17:33','renato@pactopay','mid.added','GetNet provisionado'],
                ['-12d 11:15','sistema','transacao.refunded','TX_HUZ91 · R$ 247,00'],
                ['-31d 14:00','suporte@pactopay','documento.uploaded','Comprovante bancário'],
              ].map((r,i)=>(
                <TR key={i}><TD mono className="text-ink-500">{r[0]}</TD><TD>{r[1]}</TD>
                <TD><span className="font-mono text-[11.5px]">{r[2]}</span></TD><TD className="text-ink-700">{r[3]}</TD></TR>
              ))}
            </TBody>
          </Table>
        </Card>
      )}
    </>
  );
}

/* ----------------- TRANSAÇÕES (busca avançada admin) ----------------- */
function AdminTransacoes({ onNavigate }) {
  const [q, setQ] = useState('');
  const [statusF, setStatusF] = useState('todos');
  const [adqF, setAdqF] = useState('todos');
  const [bandF, setBandF] = useState('todos');
  const [page, setPage] = useState(1);
  const [drawer, setDrawer] = useState(null);

  const filtered = useMemo(() => MOCK.TRANSACOES.filter(t => {
    if (statusF !== 'todos' && t.status !== statusF) return false;
    if (adqF !== 'todos' && t.adquirente !== adqF) return false;
    if (bandF !== 'todos' && t.bandeira !== bandF) return false;
    if (q && !(t.id.toLowerCase().includes(q.toLowerCase()) || t.unidadeNome.toLowerCase().includes(q.toLowerCase()) || t.aluno.toLowerCase().includes(q.toLowerCase()) || t.nsu.includes(q))) return false;
    return true;
  }), [q, statusF, adqF, bandF]);
  const pageSize = 20;
  const pages = Math.max(1, Math.ceil(filtered.length / pageSize));
  const slice = filtered.slice((page-1)*pageSize, page*pageSize);

  return (
    <>
      <PageHeader title="Transações" subtitle="Busca avançada em todos os clientes"
        actions={<>
          <Button variant="secondary" icon="download">Exportar CSV</Button>
        </>}/>

      <Card>
        <FilterBar>
          <div className="flex-1 min-w-[280px]"><SearchBar value={q} onChange={v=>{setQ(v);setPage(1);}} placeholder="ID transação, NSU, aluno ou unidade…" kbd={null}/></div>
          <Select value={statusF} onChange={v=>{setStatusF(v);setPage(1);}} options={[
            {value:'todos',label:'Todos status'},{value:'aprovada',label:'Aprovadas'},{value:'pendente',label:'Pendentes'},
            {value:'recusada',label:'Recusadas'},{value:'chargeback',label:'Chargeback'}
          ]}/>
          <Select value={adqF} onChange={v=>{setAdqF(v);setPage(1);}} options={[{value:'todos',label:'Todas adq.'},...MOCK.ADQUIRENTES.map(a=>({value:a.id,label:a.nome}))]}/>
          <Select value={bandF} onChange={v=>{setBandF(v);setPage(1);}} options={[{value:'todos',label:'Todas bandeiras'},...MOCK.BANDEIRAS.map(b=>({value:b.id,label:b.nome}))]}/>
          <Button variant="ghost" size="sm" icon="filter">Mais filtros</Button>
        </FilterBar>
        <Table>
          <THead><tr>
            <TH>Quando</TH><TH>ID</TH><TH>Unidade</TH><TH>Aluno</TH>
            <TH>Modalidade</TH><TH>Bandeira</TH><TH>Adq.</TH>
            <TH align="right">Valor</TH><TH align="right">Taxa</TH><TH>Status</TH><TH/>
          </tr></THead>
          <TBody>
            {slice.map(t => {
              const sb = MOCK.statusBadge(t.status);
              return (
                <TR key={t.id} onClick={()=>setDrawer(t)}>
                  <TD mono className="text-ink-500">{MOCK.fmtDateTime(t.data)}</TD>
                  <TD mono className="font-medium">{t.id}</TD>
                  <TD className="text-ink-700">{t.unidadeNome}</TD>
                  <TD className="text-ink-700">{t.aluno}</TD>
                  <TD>{t.modalidadeNome}{t.parcelas>1?` · ${t.parcelas}x`:''}</TD>
                  <TD><BandeiraBadge id={t.bandeira}/></TD>
                  <TD><AdqBadge id={t.adquirente}/></TD>
                  <TD align="right" mono className="font-semibold">{MOCK.fmtBRL(t.valor)}</TD>
                  <TD align="right" mono>{MOCK.fmtPct(t.taxaTotal,2)}</TD>
                  <TD><Badge tone={sb.tone} dot>{sb.label}</Badge></TD>
                  <TD><Icon name="chevronRight" className="text-ink-300"/></TD>
                </TR>
              );
            })}
          </TBody>
        </Table>
        <Pagination page={page} pages={pages} onChange={setPage} total={filtered.length}/>
      </Card>

      <Drawer open={!!drawer} onClose={()=>setDrawer(null)}
        title={drawer ? drawer.id : ''}
        subtitle={drawer ? MOCK.fmtDateTime(drawer.data) : ''}
        footer={drawer && (
          <>
            <Button variant="secondary" icon="receipt">Comprovante</Button>
            <Button variant="danger" icon="ban" onClick={()=>onNavigate('admin/acoes/cancelamento')}>Cancelar tx</Button>
          </>
        )}>
        {drawer && <TransactionDetail t={drawer}/>}
      </Drawer>
    </>
  );
}

function TransactionDetail({ t }) {
  const sb = MOCK.statusBadge(t.status);
  const steps = [
    { t: 'Criada', when: MOCK.fmtDateTime(MOCK.daysAgo(0.001)) , status:'ok', d:'Origem: sistema Pacto · NSU '+t.nsu },
    { t: 'Roteada', when: MOCK.fmtDateTime(MOCK.daysAgo(0.0008)) , status:'ok', d:`Regra #1: menor custo total → ${MOCK.adqById(t.adquirente).nome}` },
    { t: 'Autorizada', when: MOCK.fmtDateTime(MOCK.daysAgo(0.0007)) , status:t.status==='recusada'?'err':'ok', d: t.status==='recusada' ? 'Recusada pela emissora (cód. 51 — fundos insuficientes)' : 'AUT '+t.autorizacao },
    { t: 'Capturada', when: MOCK.fmtDateTime(MOCK.daysAgo(0.0005)) , status:t.status==='aprovada'?'ok':'pending', d:'Captura automática' },
    { t: 'Liquidação prevista', when: MOCK.fmtDate(MOCK.daysAgo(-30)) , status:'pending', d:'Crédito D+30 · '+MOCK.adqById(t.adquirente).nome },
    ...(t.status==='chargeback' ? [{t:'Chargeback aberto', when: MOCK.fmtDateTime(MOCK.daysAgo(2)), status:'err', d:'4837 — Fraud-Card not present'}] : []),
  ];
  return (
    <div>
      <div className="p-5 grid grid-cols-3 gap-4 border-b border-line-100">
        <div>
          <div className="text-[11px] uppercase tracking-wider text-ink-400 font-semibold">Valor bruto</div>
          <div className="text-[22px] font-semibold tabular-nums">{MOCK.fmtBRL(t.valor)}</div>
        </div>
        <div>
          <div className="text-[11px] uppercase tracking-wider text-ink-400 font-semibold">Taxa total</div>
          <div className="text-[22px] font-semibold tabular-nums">{MOCK.fmtPct(t.taxaTotal,2)}</div>
        </div>
        <div>
          <div className="text-[11px] uppercase tracking-wider text-ink-400 font-semibold">Líquido</div>
          <div className="text-[22px] font-semibold tabular-nums text-ink-900">{MOCK.fmtBRL(t.valorLiquido)}</div>
        </div>
      </div>
      <div className="p-5 grid grid-cols-2 gap-x-6 gap-y-2 border-b border-line-100 text-[13px]">
        <Row k="Status" v={<Badge tone={sb.tone} dot>{sb.label}</Badge>}/>
        <Row k="Modalidade" v={`${t.modalidadeNome}${t.parcelas>1?' · '+t.parcelas+'x':''}`}/>
        <Row k="Bandeira" v={<BandeiraBadge id={t.bandeira}/>}/>
        <Row k="Adquirente" v={<AdqBadge id={t.adquirente}/>}/>
        <Row k="Aluno" v={t.aluno}/>
        <Row k="Unidade" v={t.unidadeNome}/>
        <Row k="NSU" v={<span className="font-mono">{t.nsu}</span>}/>
        <Row k="Autorização" v={<span className="font-mono">{t.autorizacao}</span>}/>
        <Row k="Spread PACTO" v={MOCK.fmtPct(t.spread,2)}/>
        <Row k="Taxa adquirente" v={MOCK.fmtPct(t.taxaAdquirente,2)}/>
      </div>
      <div className="p-5">
        <div className="text-[12px] uppercase tracking-wider text-ink-400 font-semibold mb-3">Linha do tempo</div>
        <ol className="relative pl-7">
          <div className="absolute left-2 top-2 bottom-2 w-px bg-line-200"/>
          {steps.map((s,i) => (
            <li key={i} className="mb-4 relative">
              <span className={`absolute -left-7 top-0.5 h-4 w-4 rounded-full flex items-center justify-center ${
                s.status==='ok'?'bg-ok-500 text-white':s.status==='err'?'bg-err-500 text-white':'bg-paper-200 border border-line-300'
              }`}>
                {s.status === 'ok' && <Icon name="check" size={10}/>}
                {s.status === 'err' && <Icon name="x" size={10}/>}
                {s.status === 'pending' && <span className="h-1.5 w-1.5 bg-ink-400 rounded-full"></span>}
              </span>
              <div className="text-[13px] font-semibold">{s.t}</div>
              <div className="text-[11px] text-ink-400 font-mono">{s.when}</div>
              <div className="text-[12.5px] text-ink-600 mt-0.5">{s.d}</div>
            </li>
          ))}
        </ol>
      </div>
    </div>
  );
}
function Row({k, v}){
  return (
    <div className="flex items-center justify-between py-1">
      <span className="text-ink-500">{k}</span>
      <span className="font-medium text-ink-900">{v}</span>
    </div>
  );
}

/* ----------------- ANTECIPAÇÕES SOLICITAÇÕES (lista admin) ----------------- */
function AdminAntecipacoesSolicitacoes({ onNavigate }) {
  const list = MOCK.ANTECIPACOES;
  return (
    <>
      <PageHeader breadcrumb={['Antecipações','Solicitações']} title="Solicitações de antecipação"
        subtitle="Todas as solicitações enviadas pelas academias"/>
      <Card>
        <Table>
          <THead><tr><TH>ID</TH><TH>Quando</TH><TH>Unidade</TH><TH align="right">Valor bruto</TH><TH align="right">Taxa</TH><TH align="right">Líquido</TH><TH align="right">Recebíveis</TH><TH>Status</TH></tr></THead>
          <TBody>
            {list.map(a => {
              const sb = MOCK.statusBadge(a.status);
              return (
                <TR key={a.id}>
                  <TD mono>{a.id}</TD>
                  <TD mono className="text-ink-500">{MOCK.fmtDateTime(a.criada)}</TD>
                  <TD className="text-ink-700">{a.unidadeNome}</TD>
                  <TD align="right" mono className="font-semibold">{MOCK.fmtBRL(a.valor)}</TD>
                  <TD align="right" mono>{MOCK.fmtPct(a.taxa,2)}</TD>
                  <TD align="right" mono>{MOCK.fmtBRL(a.liquido)}</TD>
                  <TD align="right" mono>{a.recebiveis}</TD>
                  <TD><Badge tone={sb.tone} dot>{sb.label}</Badge></TD>
                </TR>
              );
            })}
          </TBody>
        </Table>
      </Card>
    </>
  );
}

/* ----------------- ANTECIPAÇÕES APROVAÇÕES (fila com ações em lote) ----------------- */
function AdminAntecipacoesAprovacoes({ onNavigate }) {
  const toast = useToast();
  const pend = MOCK.ANTECIPACOES.filter(a => a.status === 'solicitada' || a.status === 'em_analise');
  const [sel, setSel] = useState(new Set());
  const totalSel = useMemo(()=> [...sel].reduce((s,id) => s + (pend.find(a=>a.id===id)?.valor||0), 0), [sel]);
  return (
    <>
      <PageHeader breadcrumb={['Antecipações','Fila de aprovação']} title="Fila de aprovação"
        subtitle={`${pend.length} solicitações aguardando análise`}/>
      <div className="flex items-center justify-between mb-3">
        <div className="text-[12.5px] text-ink-500">
          {sel.size > 0 ? <><b className="text-ink-900">{sel.size} selecionada{sel.size>1?'s':''}</b> · Total {MOCK.fmtBRL(totalSel)}</> : 'Selecione solicitações para ação em lote'}
        </div>
        <div className="flex gap-2">
          <Button variant="secondary" size="sm" icon="message" disabled={sel.size===0}>Solicitar info</Button>
          <Button variant="danger" size="sm" icon="x" disabled={sel.size===0}
            onClick={()=>{toast.error('Rejeitadas em lote ('+sel.size+')'); setSel(new Set());}}>Rejeitar lote</Button>
          <Button size="sm" icon="check" disabled={sel.size===0}
            onClick={()=>{toast.success('Aprovadas em lote ('+sel.size+')'); setSel(new Set());}}>Aprovar lote</Button>
        </div>
      </div>
      <Card>
        <Table>
          <THead><tr>
            <TH><input type="checkbox" className="accent-violet-500 rounded" checked={sel.size===pend.length && pend.length>0}
              onChange={e => setSel(e.target.checked ? new Set(pend.map(a=>a.id)) : new Set())}/></TH>
            <TH>ID</TH><TH>Solicitada em</TH><TH>Unidade</TH><TH align="right">Valor</TH><TH align="right">Taxa</TH><TH align="right">Líquido</TH><TH>Risk</TH><TH/>
          </tr></THead>
          <TBody>
            {pend.map(a => {
              const risk = a.valor > 60000 ? 'alto' : a.valor > 30000 ? 'médio' : 'baixo';
              return (
                <TR key={a.id}>
                  <TD><input type="checkbox" className="accent-violet-500 rounded"
                    checked={sel.has(a.id)} onChange={e => setSel(s => { const cp = new Set(s); e.target.checked ? cp.add(a.id) : cp.delete(a.id); return cp; })}/></TD>
                  <TD mono>{a.id}</TD>
                  <TD mono className="text-ink-500">{MOCK.fmtDateTime(a.criada)}</TD>
                  <TD className="text-ink-700">{a.unidadeNome}</TD>
                  <TD align="right" mono className="font-semibold">{MOCK.fmtBRL(a.valor)}</TD>
                  <TD align="right" mono>{MOCK.fmtPct(a.taxa,2)}</TD>
                  <TD align="right" mono>{MOCK.fmtBRL(a.liquido)}</TD>
                  <TD><Badge tone={risk==='alto'?'err':risk==='médio'?'warn':'ok'}>{risk}</Badge></TD>
                  <TD><div className="flex gap-1">
                    <IconBtn icon="check" tone="primary" label="Aprovar" onClick={()=>toast.success('Aprovada')}/>
                    <IconBtn icon="x" tone="danger" label="Rejeitar" onClick={()=>toast.error('Rejeitada')}/>
                  </div></TD>
                </TR>
              );
            })}
          </TBody>
        </Table>
      </Card>
    </>
  );
}

/* ----------------- CONCILIAÇÃO ----------------- */
function AdminConciliacao() {
  return (
    <>
      <PageHeader title="Conciliação" subtitle="Vendas registradas × depósitos efetuados pelas adquirentes"/>
      <div className="grid grid-cols-1 lg:grid-cols-4 gap-3 mb-5">
        <KpiCard label="Vendas casadas" value="11.482" delta="98,7%" deltaTone="ok" icon="check"/>
        <KpiCard label="Divergências" value="32" delta="0,28%" deltaTone="warn" icon="alertTriangle"/>
        <KpiCard label="Não recebidos" value="6" delta="6/32" deltaTone="err" icon="ban"/>
        <KpiCard label="Conciliado até" value="Ontem, 23:59" sub="próximo run em 4h" icon="refresh"/>
      </div>
      <Card>
        <CardHeader title="Divergências em aberto" subtitle="Eventos que precisam de tratamento"
          right={<Button variant="secondary" size="sm" icon="download">Exportar</Button>}/>
        <Table>
          <THead><tr><TH>Data</TH><TH>Unidade</TH><TH>Adq.</TH><TH align="right">Vendas</TH><TH align="right">Depositado</TH><TH align="right">Diferença</TH><TH>Motivo provável</TH></tr></THead>
          <TBody>
            {[
              { d:'12/05', u:'BodyTech Itaim', a:'rede', v:14820.10, dep:14693.40, diff:-126.70, m:'Estorno não previsto' },
              { d:'12/05', u:'Smart Fit Pinheiros', a:'cielo', v:9870.00, dep:9870.00, diff:0, m:'OK · ajuste taxas pendente' },
              { d:'11/05', u:'Companhia Athletica Moema', a:'getnet', v:22411.55, dep:22095.55, diff:-316.00, m:'Chargeback CB_5012' },
              { d:'11/05', u:'Cia da Saúde Tijuca', a:'rede', v:6320.40, dep:6420.40, diff:100.00, m:'Crédito extra · investigar' },
              { d:'10/05', u:'Smart Fit Centro', a:'cielo', v:18244.30, dep:0, diff:-18244.30, m:'Depósito não recebido · escalar' },
            ].map((r,i)=>(
              <TR key={i}>
                <TD mono>{r.d}</TD><TD className="text-ink-700">{r.u}</TD><TD><AdqBadge id={r.a}/></TD>
                <TD align="right" mono>{MOCK.fmtBRL(r.v)}</TD>
                <TD align="right" mono>{MOCK.fmtBRL(r.dep)}</TD>
                <TD align="right" mono className={r.diff<0?'text-err-600 font-semibold':r.diff>0?'text-ok-600 font-semibold':'text-ink-500'}>{r.diff===0?'—':MOCK.fmtBRL(r.diff)}</TD>
                <TD className="text-ink-500">{r.m}</TD>
              </TR>
            ))}
          </TBody>
        </Table>
      </Card>
    </>
  );
}

/* ----------------- CANCELAMENTO / BAIXA MANUAL ----------------- */
function AdminCancelamento() {
  const [tx, setTx] = useState(null);
  const [q, setQ] = useState('');
  const [motivo, setMotivo] = useState('');
  const toast = useToast();
  const matches = q ? MOCK.TRANSACOES.filter(t => t.id.toLowerCase().includes(q.toLowerCase()) || t.nsu.includes(q)).slice(0,6) : [];
  return (
    <>
      <PageHeader title="Cancelamento de transação" subtitle="Busque a transação e justifique a ação"/>
      <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
        <Card className="p-5">
          <div className="text-[13px] font-semibold mb-2">Buscar transação</div>
          <Input icon="search" placeholder="ID transação ou NSU" value={q} onChange={e=>setQ(e.target.value)}/>
          <div className="mt-3 space-y-1">
            {matches.map(t => (
              <button key={t.id} onClick={()=>setTx(t)} className={`w-full text-left p-3 rounded-lg border ${tx?.id===t.id?'border-violet-500 bg-violet-50/40':'border-line-200 hover:bg-paper-100'}`}>
                <div className="flex items-center justify-between text-[13px]">
                  <span className="font-mono font-semibold">{t.id}</span>
                  <span className="font-semibold tabular-nums">{MOCK.fmtBRL(t.valor)}</span>
                </div>
                <div className="text-[11.5px] text-ink-500 mt-0.5">{t.unidadeNome} · {t.aluno} · {MOCK.fmtDateTime(t.data)}</div>
              </button>
            ))}
            {q && matches.length===0 && <div className="text-[12.5px] text-ink-400 px-1 py-2">Nenhuma transação encontrada.</div>}
          </div>
        </Card>
        <Card className="p-5">
          <div className="text-[13px] font-semibold mb-2">Detalhes & ação</div>
          {!tx && <Empty icon="search" title="Nenhuma transação selecionada" hint="Busque acima e selecione para prosseguir."/>}
          {tx && (
            <>
              <div className="grid grid-cols-3 gap-2 mb-3">
                <KpiCard label="Valor" value={MOCK.fmtBRL(tx.valor)} icon="banknote"/>
                <KpiCard label="Adquirente" value={MOCK.adqById(tx.adquirente).nome} icon="network"/>
                <KpiCard label="Status" value={MOCK.statusBadge(tx.status).label} icon="info"/>
              </div>
              <Select label="Motivo do cancelamento" value={motivo} onChange={setMotivo} options={[
                {value:'',label:'Selecione…'},
                {value:'a',label:'Solicitação do cliente'},
                {value:'b',label:'Erro operacional'},
                {value:'c',label:'Duplicidade'},
                {value:'d',label:'Suspeita de fraude'},
                {value:'e',label:'Outros (descrever)'},
              ]}/>
              <Input className="mt-3" label="Observação" placeholder="Detalhe a justificativa..."/>
              <div className="border-t border-line-100 mt-4 pt-3 flex items-center justify-between">
                <div className="text-[11.5px] text-ink-500">Esta ação é registrada na auditoria.</div>
                <Button variant="danger" icon="ban" disabled={!motivo}
                  onClick={()=>{toast.success('Cancelamento registrado · estorno em até 24h'); setTx(null); setMotivo('');}}>Cancelar transação</Button>
              </div>
            </>
          )}
        </Card>
      </div>
    </>
  );
}

function AdminBaixa() {
  const toast = useToast();
  return (
    <>
      <PageHeader title="Baixa manual" subtitle="Registrar liquidação manual de recebíveis"/>
      <Card className="p-5 max-w-2xl grid grid-cols-2 gap-3">
        <Input label="ID do recebível" placeholder="rcv_..." icon="search"/>
        <Input label="Data de baixa" type="date" defaultValue="2026-05-12"/>
        <Input label="Valor" type="number" placeholder="0,00" icon="banknote"/>
        <Select label="Banco" value="341" onChange={()=>{}} options={['341 — Itaú','237 — Bradesco','001 — BB']}/>
        <Input className="col-span-2" label="Observação"/>
        <div className="col-span-2 flex justify-end gap-2 pt-2">
          <Button variant="secondary">Cancelar</Button>
          <Button icon="check" onClick={()=>toast.success('Baixa registrada')}>Confirmar baixa</Button>
        </div>
      </Card>
    </>
  );
}

Object.assign(window, { AdminClientes, AdminClienteNovo, AdminClienteDetail, AdminTransacoes, AdminAntecipacoesSolicitacoes, AdminAntecipacoesAprovacoes, AdminConciliacao, AdminCancelamento, AdminBaixa, TransactionDetail });
