<?php

require_once "../../../_backend/_class/Conexao_class.php";
require_once "../../../_backend/_class/Crud_class.php";
require_once "../../../_backend/_class/Emitente_class.php";
require_once "functions.php";

//error_reporting(E_ALL);
//ini_set('display_errors', 'On');

$datainicial = $_GET['datai'];
$datafinal = $_GET['dataf'];

$data1 = parseDate($datainicial, "Y-m-d");
$data2 = parseDate($datafinal, "Y-m-d");
$sped = '';

require_once '../bootstrap.php';

function totalizeBloco($efd, $bloco) {
    $tot = '';
    $keys = [];
    $aefd = explode("\n", $efd);
    foreach ($aefd as $element) {
        $param = explode("|", $element);
        if (!empty($param[1])) {
            $key = $param[1];
            if (!empty($keys[$key])) {
                $keys[$key] += 1;
            } else {
                $keys[$key] = 1;
            }
        }
    }
//Inicializa o bloco 9
//    print_r($keys);
    $tot = 0;
    foreach ($keys as $key => $value) {
        if (!empty($key)) {
            if (substr($key, 0, 1) == $bloco) {
                $tot = $tot + $value;
            }
        }
    }

    return $tot + 1;
}

function totalize($efd) {
    $tot = '';
    $keys = [];
    $aefd = explode("\n", $efd);
    foreach ($aefd as $element) {
        $param = explode("|", $element);
        if (!empty($param[1])) {
            $key = $param[1];
            if (!empty($keys[$key])) {
                $keys[$key] += 1;
            } else {
                $keys[$key] = 1;
            }
        }
    }
//Inicializa o bloco 9
    $tot .= "|9001|0|\n";
    $n = 0;
    foreach ($keys as $key => $value) {
        if (!empty($key)) {
            $tot .= "|9900|$key|$value|\n";
            $n++;
        }
    }
    $n++;
    $tot .= "|9900|9001|1|\n";
    $tot .= "|9900|9900|" . ($n + 3) . "|\n";
    $tot .= "|9900|9990|1|\n";
    $tot .= "|9900|9999|1|\n";
    $tot .= "|9990|" . ($n + 6) . "|\n";
    $efd .= $tot;
    $n = count(explode("\n", $efd));
    $tot .= "|9999|$n|\n";
    return $tot;
}

use NFePHP\EFD\Elements\Contribuicoes\Z0000;
use NFePHP\EFD\Elements\Contribuicoes\Z0001;
use NFePHP\EFD\Elements\Contribuicoes\Z0100;
use NFePHP\EFD\Elements\Contribuicoes\Z0110;
use NFePHP\EFD\Elements\Contribuicoes\Z0140;
use NFePHP\EFD\Elements\Contribuicoes\Z0150;
use NFePHP\EFD\Elements\Contribuicoes\Z0190;
use NFePHP\EFD\Elements\Contribuicoes\Z0200;
use NFePHP\EFD\Elements\Contribuicoes\C010;
use NFePHP\EFD\Elements\Contribuicoes\C001;
use NFePHP\EFD\Elements\Contribuicoes\C100;
use NFePHP\EFD\Elements\Contribuicoes\C170;
use NFePHP\EFD\Elements\Contribuicoes\C190;
use NFePHP\EFD\Elements\Contribuicoes\D100;
use NFePHP\EFD\Elements\Contribuicoes\D001;
use NFePHP\EFD\Elements\Contribuicoes\D190;

//GERA 0000
$std = new stdClass();
$std->COD_VER = '006';
$std->TIPO_ESCRIT = '0';
$std->IND_SIT_ESP = '0';
$std->NUM_REC_ANTERIOR = null;
$std->DT_INI = soNumero($datainicial);
$std->DT_FIN = soNumero($datafinal);
$std->NOME = $emitente->xNome;
$std->CNPJ = $emitente->CNPJ;
$std->UF = $emitente->UF;
$std->COD_MUN = $emitente->cMun;
$std->SUFRAMA = '';
$std->IND_NAT_PJ = '00';
$std->IND_ATIV = '2';

try {
    $z0000 = new Z0000($std);
    $sped .= $z0000;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM 0000
//
//
//GERA 0001
$std = new stdClass();
$std->IND_MOV = '0';

try {
    $z0001 = new Z0001($std);
    $sped .= $z0001;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM 0001
//FIM 0005
//GERA 0100
$std = new stdClass();
$std->NOME = 'DORACI LAZARA DIAS';
$std->CPF = '36428167620';
$std->CRC = '00044609';
$std->CNPJ = null;
$std->CEP = '35500155';
$std->END = 'AV JK';
$std->NUM = '155';
$std->COMPL = '';
$std->BAIRRO = 'CENTRO';
$std->FONE = '3732295400';
$std->FAX = '3732295400';
$std->EMAIL = 'contabilidade@doracicontabilidade.com';
$std->COD_MUN = '3122306';

try {
    $z0100 = new Z0100($std);
    $sped .= $z0100;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM 0100
//
//Gera 0110
$std = new stdClass();
$std->COD_INC_TRIB = '2';
$std->IND_APRO_CRED = null;
$std->COD_TIPO_CONT = '1';
$std->IND_REG_CUM = '9';
try {
    $z0110 = new Z0110($std);
    $sped .= $z0110;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM 0110
//
//GERA 0140
$std = new stdClass();
$std->COD_EST = '01';
$std->NOME = $emitente->xFant;
$std->CNPJ = $emitente->CNPJ;
$std->UF = $emitente->UF;
$std->IE = $emitente->IE;
$std->COD_MUN = $emitente->cMun;
$std->IM = null;
$std->SUFRAMA = null;

try {
    $z0140 = new Z0140($std);
    $sped .= $z0140;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}

//

$pdo = Conexao::getInstance();
$crud = Crud::getInstance($pdo, 'emitente');
$sql = "SELECT DISTINCT dhSaiEnt,destCNPJ, destxNome, destIE, destcMun, destxLgr, destnro, destxCpl, destxBairro FROM nfe  ";
$sql .= " WHERE STR_TO_DATE(dhSaiEnt, '%d/%m/%Y') BETWEEN  '{$data1}' AND '{$data2}' AND status != '' AND status != '101'";
$arrayParam = '';
$dadosnfe = $crud->getSQLGeneric($sql, $arrayParam, true);
//echo $sql;
//
//GERA 0150
$paricipante = array();
foreach ($dadosnfe as $dados) :
    if ($dados->destCNPJ != '') :
        if (!in_array(strtoupper($dados->destCNPJ), $paricipante)) :
            $paricipante[] = strtoupper($dados->destCNPJ);
            $std = new stdClass();
            $std->COD_PART = soNumero($dados->destCNPJ);
            $std->NOME = $dados->destxNome;
            $std->COD_PAIS = '01058';
            if (strlen(soNumero($dados->destCNPJ)) > 11) :
                $std->CNPJ = $dados->destCNPJ;
                $std->CPF = '';
            else :
                $std->CNPJ = '';
                $std->CPF = $dados->destCNPJ;
            endif;
            $std->IE = $dados->destIE;
            $std->COD_MUN = $dados->destcMun;
            $std->SUFRAMA = '';
            $std->END = $dados->destxLgr;
            $std->NUM = $dados->destnro;
            $std->COMPL = $dados->destxCpl;
            $std->BAIRRO = $dados->destxBairro;

            try {
                $z0150 = new Z0150($std);
                $sped .= $z0150;
                $sped .= "\r\n";
            } catch (\Exception $e) {
                echo $e->getMessage();
            }
        endif;
    endif;

endforeach;
//FIM 0150
//
//GERA 0200

$pdo = Conexao::getInstance();
$crud = Crud::getInstance($pdo, 'emitente');
$sql = "SELECT DISTINCT `produtonfe`.`cProd`, `produtonfe`.`xProd`, `produtonfe`.`uCom`, 
`produtonfe`.`NCM`, produtonfe.`pICMS`, `produtonfe`.`CEST`, 
`estoqueprodutos`.`codproduto`, `estoqueprodutos`.`produto`, `estoqueprodutos`.qtd" . $_SESSION['Empresa'] . " as estoque, 
`produtos`.`codigo`, `produtos`.`classificacao`, 
`nfe`.`dhEmi`, nfe.dhSaiEnt, nfe.`id`, nfe.modelo, nfe.tipo from `produtonfe`
INNER JOIN `nfe` ON `nfe`.`id` = `produtonfe`.`NFe`
LEFT JOIN `estoqueprodutos` ON `estoqueprodutos`.`codproduto` = `produtonfe`.`cProd`
LEFT JOIN `produtos` ON `produtos`.`codigo` = `estoqueprodutos`.`produto`
  ";
$sql .= " WHERE STR_TO_DATE(dhEmi, '%d/%m/%Y') BETWEEN  '{$data1}' AND '{$data2}' AND status != '' and modelo <> '65'";
$arrayParam = '';
$dadosprod = $crud->getSQLGeneric($sql, $arrayParam, true);

//echo $sql;
$sz0200 = '';
$sz0190 = '';
$uncom = array();
$produto = array();
$estoque = array();
foreach ($dadosprod as $dados) :

    if (!in_array(strtoupper($dados->uCom), $uncom)) :
        if ($dados->uCom != '') :
            $uncom[] = strtoupper($dados->uCom);
            $std = new stdClass();
            $std->UNID = strtoupper($dados->uCom);
            $std->DESCR = 'UNIDADE DE MEDIDA ' . strtoupper($dados->uCom);
            try {
                $z0190 = new Z0190($std);
                $sz0190 .= $z0190;
                $sz0190 .= "\r\n";
            } catch (\Exception $e) {
                echo $e->getMessage();
//                echo '<br/>';
            }
        endif;
    endif;


    if (!in_array(strtoupper($dados->cProd), $produto)) :
        $produto[] = strtoupper($dados->cProd);
        $std = new stdClass();
        $std->COD_ITEM = strtoupper($dados->cProd);
        $std->DESCR_ITEM = $dados->xProd;
        $std->COD_BARRA = 'SEM GTIN';
        $std->COD_ANT_ITEM = '';
        $std->UNID_INV = $dados->uCom;
        if ($dados->classificacao == '') :
            $std->TIPO_ITEM = '04';
        else :
            $std->TIPO_ITEM = $dados->classificacao;
        endif;
        $std->COD_NCM = $dados->NCM;
        $std->EX_IPI = '';
        $std->COD_GEN = substr($dados->NCM, 0, 2);
        $std->COD_LST = '';
        $std->ALIQ_ICMS = $dados->pICMS;

        try {
            $z0200 = new Z0200($std);
            $sz0200 .= $z0200;
            $sz0200 .= "\r\n";
        } catch (\Exception $e) {
            echo $e->getMessage();
        }
    endif;

endforeach;
//FIM 0200
//GERA 0150
$sped .= $sz0190;
//FIM 0150
//ADICIONA 0200 NO TXT
$sped .= $sz0200;
//FIM ADICIONA 0200 NO TXT
//
//Total Bloco 0
$total000 = totalizeBloco($sped, '0');
$sped .= '|0990|' . $total000 . '|';
$sped .= "\r\n";
//Fim total bloco 0
//INFORMA B VAZIO
$sped .= '|A001|1|';
$sped .= "\r\n";
$sped .= '|A990|2|';
$sped .= "\r\n";

//GERA C001
$std = new stdClass();
$std->IND_MOV = '0';
try {
    $c001 = new C001($std);
    $sped .= $c001;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM C001
//
//
//
//GERA C010
$std = new stdClass();
$std->CNPJ = $emitente->CNPJ;
$std->IND_ESCRI = '2';
try {
    $c010 = new C010($std);
    $sped .= $c010;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM C010
//
//
//GERA C100


$pdo = Conexao::getInstance();
$crud = Crud::getInstance($pdo, 'emitente');
$sql = "SELECT * from nfe ";
$sql .= " WHERE STR_TO_DATE(dhEmi, '%d/%m/%Y') BETWEEN  '{$data1}' AND '{$data2}' AND status != '' and modelo != '57'";
$arrayParam = '';
$dadosnfe = $crud->getSQLGeneric($sql, $arrayParam, true);

foreach ($dadosnfe as $dados) :
    if ($dados->modelo == '55' || $dados->modelo == '65') :

        if ($dados->status == '101') :

            $std = new stdClass();
            if ($dados->tipo == 'Entrada') :
                $std->IND_OPER = '0';
                $std->IND_EMIT = '1';
            else :
                if ($dados->tpNF == '0') :
                    $std->IND_OPER = '0';
                    $std->IND_EMIT = '0';
                else :
                    $std->IND_OPER = '1';
                    $std->IND_EMIT = '0';
                endif;
            endif;
            $std->COD_PART = null;
            $std->COD_MOD = $dados->modelo;
            $std->COD_SIT = '02';
            $std->SER = $dados->serie;
            $std->NUM_DOC = $dados->nNF;
            $std->CHV_NFE = $dados->chavenfe;
            $std->DT_DOC = null;
            $std->DT_E_S = null;
            $std->VL_DOC = null;
            $std->IND_PGTO = null;
            $std->VL_DESC = null;
            $std->VL_ABAT_NT = null;
            $std->VL_MERC = null;
            $std->IND_FRT = null;
            $std->VL_FRT = null;
            $std->VL_SEG = null;
            $std->VL_OUT_DA = null;
            $std->VL_BC_ICMS = null;
            $std->VL_ICMS = null;
            $std->VL_BC_ICMS_ST = null;
            $std->VL_ICMS_ST = null;
            $std->VL_IPI = null;
            $std->VL_PIS = null; //$dados->vPISnf;
            $std->VL_COFINS = null; //$dados->vCOFINSnf;
            $std->VL_PIS_ST = null;
            $std->VL_COFINS_ST = null;
            try {
                $c100 = new C100($std);
                $sped .= $c100;
                $sped .= "\r\n";
            } catch (\Exception $e) {
                echo $e->getMessage();
            }

        else :

            $std = new stdClass();
            if ($dados->tipo == 'Entrada') :
                $std->IND_OPER = '0';
                $std->IND_EMIT = '1';
            else :
                if ($dados->tpNF == '0') :
                    $std->IND_OPER = '0';
                    $std->IND_EMIT = '0';
                else :
                    $std->IND_OPER = '1';
                    $std->IND_EMIT = '0';
                endif;
            endif;
            if ($dados->modelo === '65') :
                $std->COD_PART = null;
                $std->VL_BC_ICMS_ST = null;
                $std->VL_ICMS_ST = null;
                $std->VL_IPI = null;
                $std->VL_PIS = null;
                $std->VL_COFINS = null;
                $std->VL_PIS_ST = null;
                $std->VL_COFINS_ST = null;
            else :
                $std->COD_PART = soNumero($dados->destCNPJ);
                $std->VL_BC_ICMS_ST = $dados->vBCSTnf;
                $std->VL_ICMS_ST = $dados->vSTnf;
                $std->VL_IPI = $dados->vIPInf;
                $std->VL_PIS = $dados->vPISnf;
                $std->VL_COFINS = $dados->vCOFINSnf;
                $std->VL_PIS_ST = '0.00';
                $std->VL_COFINS_ST = '0.00';
            endif;
            $std->COD_MOD = $dados->modelo;
            $std->COD_SIT = '00';
            $std->SER = $dados->serie;
            $std->NUM_DOC = $dados->nNF;
            $std->CHV_NFE = $dados->chavenfe;
            $std->DT_DOC = soNumero($dados->dhEmi);
            $std->DT_E_S = soNumero($dados->dhSaiEnt);
            $std->VL_DOC = $dados->vNF;
            if ($dados->indPag == '') :
                $std->IND_PGTO = '2';
            else :
                $std->IND_PGTO = $dados->indPag;
            endif;
            $std->VL_DESC = $dados->vDescnf;
            $std->VL_ABAT_NT = '0.00';
            $std->VL_MERC = $dados->vProdnf;
            if ($dados->modFrete == '') :
                $std->IND_FRT = '9';
            else :
                $std->IND_FRT = $dados->modFrete;
            endif;
            $std->VL_FRT = $dados->vFretenf;
            $std->VL_SEG = $dados->vSegnf;
            $std->VL_OUT_DA = $dados->vOutronf;
            $std->VL_BC_ICMS = $dados->vBCnf;
            $std->VL_ICMS = $dados->vICMSnf;
            try {
                $c100 = new C100($std);
                $sped .= $c100;
                $sped .= "\r\n";
            } catch (\Exception $e) {
                echo $e->getMessage();
            }


//            REGISTRO C170
            $pdo = Conexao::getInstance();
            $crud = Crud::getInstance($pdo, 'produtonfe');
            $sql = "SELECT * from produtonfe ";
            $sql .= " WHERE NFe = '$dados->id'";
            $arrayParam = '';
            $dadosprodnfec = $crud->getSQLGeneric($sql, $arrayParam, true);
            $item = 1;
            if ($dadosprodnfec > 0) :
            else :
                echo 'nfe-' . $dados->id;
            endif;
            foreach ($dadosprodnfec as $dadosprod) :
                $std = new stdClass();
                $std->NUM_ITEM = $item;
                $std->COD_ITEM = $dadosprod->cProd;
                $std->DESCR_COMPL = '';
                $std->QTD = $dadosprod->qtd;
                $std->UNID = $dadosprod->uCom;
                $std->VL_ITEM = $dadosprod->vProd;
                $std->VL_DESC = $dadosprod->vDesc;
                $std->IND_MOV = '0';
                $std->CST_ICMS = str_pad(substr(soNumero($dadosprod->CST), 0, 3), 3, '0', STR_PAD_LEFT);
                $std->CFOP = $dadosprod->CFOP;
                $std->COD_NAT = '';
                $std->VL_BC_ICMS = $dadosprod->vBC;
                $std->ALIQ_ICMS = $dadosprod->pICMS;
                $std->VL_ICMS = $dadosprod->vICMS;
                $std->VL_BC_ICMS_ST = $dadosprod->vBCST;
                $std->ALIQ_ST = $dadosprod->pICMSST;
                $std->VL_ICMS_ST = $dadosprod->vICMSST;
                $std->IND_APUR = '0';
                if ($dadosprod->CSTIPI > 50) :
                    $std->CST_IPI = '01';
                else :
                    $std->CST_IPI = $dadosprod->CSTIPI;
                endif;
                $std->COD_ENQ = null;
                $std->VL_BC_IPI = $dadosprod->vBCIPI;
                $std->ALIQ_IPI = $dadosprod->pIPI;
                if ($dados->tipo == 'Entrada') :
                    if ($dadosprod->vPIS > 0) :
                        $std->CST_PIS = '50';
                        $std->CST_COFINS = '50';
                    else :
                        $std->CST_PIS = '75';
                        $std->CST_COFINS = '75';
                    endif;
                else :

                    if ($dadosprod->CSTCOFINS == '') :
                        if ($dadosprod->vPIS > 0) :
                            $std->CST_COFINS = '01';
                            $std->CST_PIS = '01';
                        else :
                            $std->CST_COFINS = '99';
                            $std->CST_PIS = '99';
                        endif;
                    else :
                        $std->CST_COFINS = $dadosprod->CSTCOFINS;
                        $std->CST_PIS = $dadosprod->CSTPIS;
                    endif;
                endif;
                $std->VL_IPI = $dadosprod->vIPI;
                $std->VL_BC_PIS = $dadosprod->vBCPIS;
                $std->ALIQ_PIS = $dadosprod->pPIS;
                $std->QUANT_BC_PIS = null;
                $std->ALIQ_PIS_QUANT = null;
                $std->VL_PIS = $dadosprod->vPIS;
                $std->VL_BC_COFINS = $dadosprod->vBCCOFINS;
                $std->ALIQ_COFINS = $dadosprod->pCOFINS;
                $std->QUANT_BC_COFINS = null;
                $std->ALIQ_COFINS_QUANT = null;
                $std->VL_COFINS = $dadosprod->vCOFINS;
                $std->COD_CTA = '';
                $std->VL_ABAT_NT = '0.00';
                $item++;
                try {
                    $c170 = new C170($std);
                    $sped .= $c170;
                    $sped .= "\r\n";
                } catch (\Exception $e) {
                    echo $e->getMessage();
                    echo '<Br/>';
                }

            endforeach;
//           
        endif;
    endif;
endforeach;



//Total Bloco C
$total000 = totalizeBloco($sped, 'C');
$sped .= '|C990|' . $total000 . '|';
$sped .= "\r\n";
//Fim total bloco C
//GERA D001
$sped .= '|D001|1|';
$sped .= "\r\n";
$sped .= '|D990|2|';
$sped .= "\r\n";
//fim GERA D0001

$sped .= '|F001|1|';
$sped .= "\r\n";
$sped .= '|F990|2|';
$sped .= "\r\n";

//BLOCO G VAZIO
//BLOCO H VAZIO

$sped .= '|I001|1|';
$sped .= "\r\n";
$sped .= '|I990|2|';
$sped .= "\r\n";

//BLOCO H VAZIO
//BLOCO 1001 VAZIO

$sped .= '|M001|1|';
$sped .= "\r\n";
$sped .= '|M990|2|';
$sped .= "\r\n";


$sped .= '|1001|1|';
$sped .= "\r\n";

$sped .= "|1990|2|";
$sped .= "\r\n";

//BLOCO 1001 VAZIO


$total = totalize($sped);
$sped .= $total;




//$total000
//GERA ARQUIVO TXT
$arquivo = fopen("SPED-EFD-CONTRIBUICOES-" . $emitente->CNPJ . ".txt", "w");
fwrite($arquivo, $sped);
fclose($arquivo);

$nomearquivo = "SPED-EFD-CONTRIBUICOES-" . $emitente->CNPJ . ".txt";

header('Cache-control: private');
header('Content-Type: application/octet-stream');
// header('Content-Length: ' . filesize($local_arquivio));
header('Content-Disposition: filename=' . $nomearquivo);
header("Content-Disposition: attachment; filename=" . basename($nomearquivo));

// Envia o arquivo Download
readfile($nomearquivo);
//echo $sped;
