<?php /* Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva */ ?>
<?php
/** Relatório de Compras configurável. */
$hoje = date('Y-m-d'); $ini = date('Y-m-01');
?>
<script type="application/json" id="relatorio-meta"><?= json_encode([
    'titulo'  => 'Relatório Avançado de Compras',
    'empresa' => $empresa ?? null,
], JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) ?></script>
<div class="pbi-page-header">
    <div class="pbi-page-icon"><i class="bi bi-bag-check"></i></div>
    <div>
        <div class="pbi-page-title">Relatório de Compras</div>
        <div class="pbi-page-subtitle">Notas de entrada · filtros · sintético e analítico · exportável</div>
    </div>
    <div class="ms-auto"><a href="/relatorios" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i> Relatórios</a></div>
</div>

<div class="pbi-card mb-3">
    <div class="pbi-card-header"><i class="bi bi-funnel me-2"></i>Filtros</div>
    <div class="pbi-card-body">
        <div class="pbi-hint mb-3" style="margin-top:0">Preencha o que precisar e clique em <strong>Gerar</strong>. Campos vazios não filtram. O período é obrigatório.</div>
        <form id="relForm" onsubmit="return false">
            <div class="row g-2">
                <div class="col-6 col-md-2"><label class="form-label small mb-1">De</label><input type="date" name="data_ini" value="<?= $ini ?>" class="form-control form-control-sm"></div>
                <div class="col-6 col-md-2"><label class="form-label small mb-1">Até</label><input type="date" name="data_fim" value="<?= $hoje ?>" class="form-control form-control-sm"></div>
                <div class="col-6 col-md-4"><label class="form-label small mb-1">Natureza</label>
                    <select name="naturezas" class="form-select form-select-sm"><option value="">Todas</option></select></div>
                <div class="col-6 col-md-4"><label class="form-label small mb-1">Condição de pagamento</label>
                    <select name="cond" class="form-select form-select-sm"><option value="">Todas</option></select></div>

                <div class="col-6 col-md-2"><label class="form-label small mb-1">Série</label>
                    <select name="serie" class="form-select form-select-sm"><option value="">Todas</option></select></div>
                <div class="col-6 col-md-3"><label class="form-label small mb-1">Usuário (comprador)</label>
                    <select name="usuario" class="form-select form-select-sm"><option value="">Todos</option></select></div>
                <div class="col-6 col-md-2"><label class="form-label small mb-1">Fornecedor cód. (de)</label><input type="number" name="forn_ini" class="form-control form-control-sm"></div>
                <div class="col-6 col-md-2"><label class="form-label small mb-1">Fornecedor cód. (até)</label><input type="number" name="forn_fim" class="form-control form-control-sm"></div>
                <div class="col-6 col-md-3"><label class="form-label small mb-1">Canceladas</label>
                    <select name="canceladas" class="form-select form-select-sm"><option value="excluir">Excluir</option><option value="incluir">Incluir</option><option value="somente">Somente canceladas</option></select></div>

                <div class="col-6 col-md-2"><label class="form-label small mb-1">Nº Nota (de)</label><input type="number" name="nota_ini" class="form-control form-control-sm"></div>
                <div class="col-6 col-md-2"><label class="form-label small mb-1">Nº Nota (até)</label><input type="number" name="nota_fim" class="form-control form-control-sm"></div>
            </div>

            <hr class="my-3">
            <div class="row g-2">
                <?php foreach ([
                    ['produtos','Detalhar por produto'],
                    ['nfe','Somente NFe'],
                    ['inc_transferencias','Incluir transferências'],
                    ['inc_devolucoes','Incluir devoluções'],
                    ['inc_mov_interna','Incluir movimentação interna'],
                ] as $c): ?>
                <div class="col-12 col-md-4 col-lg-3"><div class="form-check">
                    <input class="form-check-input" type="checkbox" name="<?= $c[0] ?>" id="chk_<?= $c[0] ?>">
                    <label class="form-check-label small" for="chk_<?= $c[0] ?>"><?= $c[1] ?></label>
                </div></div>
                <?php endforeach; ?>
            </div>

            <div class="row g-2 mt-1 align-items-end">
                <div class="col-6 col-md-2"><label class="form-label small mb-1">Ordenar por</label>
                    <select name="ordenar" class="form-select form-select-sm">
                        <option value="data">Data</option><option value="nota">Nº Nota</option><option value="fornecedor">Fornecedor</option><option value="valor">Maior valor</option>
                    </select></div>
                <div class="col-6 col-md-2"><label class="form-label small mb-1">Máx. notas</label>
                    <select name="limite" class="form-select form-select-sm"><option>500</option><option selected>1000</option><option>2000</option><option>5000</option></select></div>
                <div class="col-12 col-md-8 d-flex gap-2 justify-content-md-end">
                    <button class="btn btn-primary btn-sm" id="btnGerar"><i class="bi bi-search me-1"></i>Gerar relatório</button>
                    <button class="btn btn-outline-secondary btn-sm" id="btnCsv" disabled><i class="bi bi-filetype-csv"></i> CSV</button>
                    <button class="btn btn-outline-secondary btn-sm" id="btnPrint" disabled><i class="bi bi-printer"></i></button>
                </div>
            </div>
        </form>
    </div>
</div>

<div id="rel-status" class="pbi-hint mb-3" style="margin-top:0;display:none"></div>
<div class="pbi-kpi-grid mb-3" id="rel-kpis" style="display:none" data-export-secao="kpis"></div>

<div class="row g-3 mb-3" id="rel-sintetico" style="display:none">
    <div class="col-12 col-lg-4"><div class="pbi-card h-100"><div class="pbi-card-header"><i class="bi bi-truck me-2"></i>Por Fornecedor</div><div class="pbi-card-body"><div id="rel-forn"></div></div></div></div>
    <div class="col-12 col-lg-4"><div class="pbi-card h-100"><div class="pbi-card-header"><i class="bi bi-tags me-2"></i>Por Natureza</div><div class="pbi-card-body"><div id="rel-nat"></div></div></div></div>
    <div class="col-12 col-lg-4"><div class="pbi-card h-100"><div class="pbi-card-header"><i class="bi bi-receipt me-2"></i>Por Série</div><div class="pbi-card-body"><div id="rel-serie"></div></div></div></div>
</div>

<div class="pbi-card mb-3" id="rel-card-produtos" style="display:none">
    <div class="pbi-card-header"><i class="bi bi-box-seam me-2"></i>Produtos Comprados</div>
    <div class="pbi-card-body"><div class="pbi-hint mb-2" style="margin-top:0">Itens comprados no filtro, somados por produto.</div><div id="rel-produtos"></div></div>
</div>

<div class="pbi-card" id="rel-card-notas" style="display:none" data-export-secao="dados">
    <div class="pbi-card-header d-flex justify-content-between flex-wrap"><span><i class="bi bi-table me-2"></i>Notas de Entrada (analítico)</span><small class="text-muted" id="rel-notas-badge"></small></div>
    <div class="pbi-card-body"><div id="rel-notas"></div></div>
</div>

<script>
(function () {
'use strict';
var ST = { dados: null };
function brl(v){ return 'R$ '+parseFloat(v||0).toLocaleString('pt-BR',{minimumFractionDigits:2,maximumFractionDigits:2}); }
function n0(v){ return parseInt(v||0).toLocaleString('pt-BR'); }
function esc(s){ var d=document.createElement('div'); d.textContent=s==null?'':String(s); return d.innerHTML; }
function status(msg,tipo){ var el=document.getElementById('rel-status'); el.style.display='block'; el.innerHTML=(tipo==='erro'?'<i class="bi bi-exclamation-triangle text-danger me-1"></i>':'<i class="bi bi-info-circle me-1"></i>')+esc(msg); }
function filtros(){ var f=document.getElementById('relForm'), p=new URLSearchParams();
    Array.prototype.forEach.call(f.elements,function(el){ if(!el.name) return; if(el.type==='checkbox'){ if(el.checked) p.set(el.name,'1'); } else if(el.value!=='') p.set(el.name,el.value); });
    return p.toString();
}
function tabela(itens, cols){
    if(!itens||!itens.length) return '<div class="text-muted small py-2">Sem dados.</div>';
    var th=cols.map(function(c){return '<th'+(c.end?' class="text-end"':'')+'>'+esc(c.lbl)+'</th>';}).join('');
    var tr=itens.map(function(r){ return '<tr>'+cols.map(function(c){var v=c.fmt?c.fmt(r[c.k],r):esc(r[c.k]);return '<td'+(c.end?' class="text-end"':'')+(c.cls?' class="'+c.cls+'"':'')+'>'+v+'</td>';}).join('')+'</tr>'; }).join('');
    return '<div class="table-responsive"><table class="pbi-table"><thead><tr>'+th+'</tr></thead><tbody>'+tr+'</tbody></table></div>';
}
function fillSelect(name, itens, codKey, nomeKey){ var sel=document.querySelector('[name="'+name+'"]'); if(!sel||!itens) return; var first=sel.options[0]; sel.innerHTML=''; sel.appendChild(first);
    itens.forEach(function(i){ var o=document.createElement('option'); o.value=i[codKey]; o.textContent=i[nomeKey]!=null?i[nomeKey]:i[codKey]; sel.appendChild(o); }); }

function render(d){
    ST.dados=d; var r=d.resumo||{}, tem=parseInt(r.QTD||0)>0;
    var kpis=[
        {l:'Notas', v:n0(r.QTD)}, {l:'Fornecedores', v:n0(r.FORNECEDORES)},
        {l:'Total Comprado', v:brl(r.TOTAL), c:'text-accent'}, {l:'Produtos', v:brl(r.PRODUTOS)},
        {l:'Frete', v:brl(r.FRETE)}, {l:'Descontos', v:brl(r.DESCONTOS)},
        {l:'ICMS', v:brl(r.ICMS)}, {l:'IPI', v:brl(r.IPI)}, {l:'ICMS ST', v:brl(r.ST)}
    ];
    var gk=document.getElementById('rel-kpis');
    gk.innerHTML=kpis.map(function(k){return '<div class="pbi-kpi-card"><div class="pbi-kpi-label">'+k.l+'</div><div class="pbi-kpi-value '+(k.c||'')+'">'+k.v+'</div></div>';}).join('');
    gk.style.display=tem?'':'none';

    document.getElementById('rel-sintetico').style.display=tem?'':'none';
    var fT=function(v){return brl(v);}, fQ=function(v){return n0(v);};
    document.getElementById('rel-forn').innerHTML  = tabela(d.por_fornecedor,[{k:'NOME',lbl:'Fornecedor'},{k:'QTD',lbl:'Notas',end:1,fmt:fQ},{k:'TOTAL',lbl:'Total',end:1,fmt:fT}]);
    document.getElementById('rel-nat').innerHTML   = tabela(d.por_natureza,[{k:'NOME',lbl:'Natureza'},{k:'QTD',lbl:'Qtd',end:1,fmt:fQ},{k:'TOTAL',lbl:'Total',end:1,fmt:fT}]);
    document.getElementById('rel-serie').innerHTML = tabela(d.por_serie,[{k:'NOME',lbl:'Série'},{k:'QTD',lbl:'Qtd',end:1,fmt:fQ},{k:'TOTAL',lbl:'Total',end:1,fmt:fT}]);

    var cp=document.getElementById('rel-card-produtos');
    if(document.getElementById('chk_produtos').checked && d.produtos && d.produtos.length){
        cp.style.display='';
        document.getElementById('rel-produtos').innerHTML=tabela(d.produtos,[
            {k:'COD_ITEM',lbl:'Cód.'},{k:'DESCRICAO',lbl:'Produto'},
            {k:'QTD',lbl:'Qtd',end:1,fmt:function(v){return parseFloat(v||0).toLocaleString('pt-BR');}},
            {k:'TOTAL',lbl:'Total comprado',end:1,fmt:fT}
        ]);
    } else cp.style.display='none';

    document.getElementById('rel-card-notas').style.display=tem?'':'none';
    document.getElementById('rel-notas-badge').textContent=n0((d.notas||[]).length)+' notas'+(d.capado?(' (limitado a '+d.limite+')'):'');
    document.getElementById('rel-notas').innerHTML=tabela(d.notas,[
        {k:'NR_NOTA',lbl:'Nota'},{k:'SERIE',lbl:'Série'},{k:'DATA_REF',lbl:'Data',fmt:function(v){return v?String(v).split('-').reverse().join('/'):'';}},
        {k:'FORNECEDOR',lbl:'Fornecedor'},{k:'OPERACAO',lbl:'Operação'},
        {k:'PRODUTOS',lbl:'Produtos',end:1,fmt:fT},{k:'FRETE',lbl:'Frete',end:1,fmt:fT},{k:'DESCONTO',lbl:'Desc.',end:1,fmt:fT},
        {k:'TOTAL_NOTA',lbl:'Total',end:1,fmt:fT,cls:'text-end fw-semibold'}
    ]);

    if(!tem) status('Nenhuma compra encontrada com esses filtros.','info'); else document.getElementById('rel-status').style.display='none';
    document.getElementById('btnCsv').disabled=!tem; document.getElementById('btnPrint').disabled=!tem;
}

function gerar(){
    var btn=document.getElementById('btnGerar'); btn.disabled=true; var ico=btn.querySelector('i'); var old=ico?ico.className:'';
    if(ico) ico.className='spinner-border spinner-border-sm me-1';
    status('Gerando relatório…','info');
    fetch('/api/relatorios/compras-avancado?'+filtros(),{credentials:'same-origin'})
        .then(function(r){ if(!r.ok) return r.json().then(function(e){throw new Error(e.erro||'HTTP '+r.status);}); return r.json(); })
        .then(function(d){ render(d); })
        .catch(function(e){ status('Erro ao gerar: '+e.message,'erro'); })
        .finally(function(){ btn.disabled=false; if(ico) ico.className=old; });
}
function carregarLookups(){
    fetch('/api/relatorios/compras-avancado/lookups',{credentials:'same-origin'}).then(function(r){return r.json();}).then(function(d){
        if(!d||d.erro) return;
        fillSelect('naturezas', d.naturezas,'COD','NOME'); fillSelect('cond', d.condicoes,'COD','NOME');
        fillSelect('serie', d.series,'COD','COD'); fillSelect('usuario', d.usuarios,'COD','NOME');
    }).catch(function(){});
}
function csv(){
    var d=ST.dados; if(!d) return;
    var head=['Nota','Serie','Data','Fornecedor','Operacao','Produtos','Frete','Desconto','Total'];
    var nz=function(v){return String(parseFloat(v||0).toFixed(2)).replace('.',',');};
    var linhas=[head.join(';')];
    (d.notas||[]).forEach(function(r){ linhas.push([r.NR_NOTA,r.SERIE,r.DATA_REF,'"'+String(r.FORNECEDOR||'').replace(/"/g,'""')+'"','"'+String(r.OPERACAO||'').replace(/"/g,'""')+'"',nz(r.PRODUTOS),nz(r.FRETE),nz(r.DESCONTO),nz(r.TOTAL_NOTA)].join(';')); });
    var blob=new Blob(["﻿"+linhas.join('\r\n')],{type:'text/csv;charset=utf-8'});
    var a=document.createElement('a'); a.href=URL.createObjectURL(blob); a.download='relatorio-compras.csv'; document.body.appendChild(a); a.click(); document.body.removeChild(a);
}
document.getElementById('btnGerar').addEventListener('click', gerar);
document.getElementById('btnCsv').addEventListener('click', csv);
document.getElementById('btnPrint').addEventListener('click', function(){ window.print(); });
window.addEventListener('DOMContentLoaded', function(){ gerar(); carregarLookups(); });
})();
</script>
