<?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\ICMSIPI\Z0000;
use NFePHP\EFD\Elements\ICMSIPI\Z0001;
use NFePHP\EFD\Elements\ICMSIPI\Z0005;
use NFePHP\EFD\Elements\ICMSIPI\Z0100;
use NFePHP\EFD\Elements\ICMSIPI\Z0150;
use NFePHP\EFD\Elements\ICMSIPI\Z0190;
use NFePHP\EFD\Elements\ICMSIPI\Z0200;
use NFePHP\EFD\Elements\ICMSIPI\C001;
use NFePHP\EFD\Elements\ICMSIPI\C100;
use NFePHP\EFD\Elements\ICMSIPI\C170;
use NFePHP\EFD\Elements\ICMSIPI\C190;
use NFePHP\EFD\Elements\ICMSIPI\C500;
use NFePHP\EFD\Elements\ICMSIPI\C590;
use NFePHP\EFD\Elements\ICMSIPI\D001;
use NFePHP\EFD\Elements\ICMSIPI\D100;
use NFePHP\EFD\Elements\ICMSIPI\D190;
use NFePHP\EFD\Elements\ICMSIPI\E001;
use NFePHP\EFD\Elements\ICMSIPI\E100;
use NFePHP\EFD\Elements\ICMSIPI\K001;
use NFePHP\EFD\Elements\ICMSIPI\K100;
use NFePHP\EFD\Elements\ICMSIPI\K200;

//GERA 0000
$std = new stdClass();
$std->COD_VER = '016';
$std->COD_FIN = '0';
$std->DT_INI = soNumero($datainicial);
$std->DT_FIN = soNumero($datafinal);
$std->NOME = $emitente->xNome;
$std->CNPJ = $emitente->CNPJ;
$std->CPF = '';
$std->UF = $emitente->UF;
$std->IE = $emitente->IE;
$std->COD_MUN = $emitente->cMun;
$std->IM = '';
$std->SUFRAMA = '';
$std->IND_PERFIL = 'B';
$std->IND_ATIV = '1';

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
//GERA 0005
$std = new stdClass();
$std->FANTASIA = $emitente->xFant;
$std->CEP = $emitente->CEP;
$std->END = $emitente->xLgr;
$std->NUM = $emitente->nro;
$std->COMPL = $emitente->xCpl;
$std->BAIRRO = $emitente->xBairro;
$std->FONE = $emitente->fone;
$std->FAX = $emitente->fone;
$std->EMAIL = $emitente->email;

try {
    $z0005 = new Z0005($std);
    $sped .= $z0005;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//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
//
//

$pdo = Conexao::getInstance();
$crud = Crud::getInstance($pdo, 'emitente');
$sql = "SELECT DISTINCT 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 = preg_replace('/[^0-9]/', '', $dados->destnro);
            $std->COMPL = preg_replace('/[^0-9]/', '', $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(dhSaiEnt, '%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 ($dados->tipo == 'Entrada') :
        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);
            $estoque[] = array("produto" => strtoupper($dados->cProd), "estoque" => $dados->estoque);
            $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;
            $std->CEST = trim($dados->CEST);

            try {
                $z0200 = new Z0200($std);
                $sz0200 .= $z0200;
                $sz0200 .= "\r\n";
            } catch (\Exception $e) {
                echo $e->getMessage();
            }
        endif;
    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 .= '|B001|1|';
$sped .= "\r\n";
$sped .= '|B990|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 C100


$pdo = Conexao::getInstance();
$crud = Crud::getInstance($pdo, 'emitente');
$sql = "SELECT * from nfe ";
$sql .= " WHERE STR_TO_DATE(dhSaiEnt, '%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->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;
            $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;
            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';
            if ($dados->finNFe == '2') :
                $std->COD_SIT = '06';
            else :
                $std->COD_SIT = '00';
            endif;
            $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;
            $std->IND_PGTO = '2';
            $std->VL_DESC = $dados->vDescnf;
            $std->VL_ABAT_NT = '0.00';
            $std->VL_MERC = $dados->vProdnf;
            $std->IND_FRT = '3';
            $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();
            }

            if ($dados->modelo <> '65' && $dados->tipo == 'Entrada') :
                $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;
                foreach ($dadosprodnfec as $dadosprod) :
                    $std = new stdClass();
                    $std->NUM_ITEM = $item;
                    $std->COD_ITEM = strtoupper($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;
                    $std->VL_IPI = $dadosprod->vIPI;
                    $std->CST_PIS = $dadosprod->CSTPIS;
                    $std->VL_BC_PIS = $dadosprod->vBCPIS;
                    $std->ALIQ_PIS = $dadosprod->pPIS;
                    $std->QUANT_BC_PIS = '0.00';
                    $std->ALIQ_PIS_QUANT = '0.00';
                    $std->VL_PIS = $dadosprod->vPIS;
                    if ($dadosprod->CSTCOFINS == '') :
                        $std->CST_COFINS = '99';
                    else :
                        $std->CST_COFINS = $dadosprod->CSTCOFINS;
                    endif;
                    $std->VL_BC_COFINS = $dadosprod->vBCCOFINS;
                    $std->ALIQ_COFINS = $dadosprod->pCOFINS;
                    $std->QUANT_BC_COFINS = '0.00';
                    $std->ALIQ_COFINS_QUANT = '0.00';
                    $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;

                $pdo = Conexao::getInstance();
                $crud = Crud::getInstance($pdo, 'produtonfe');
                $sql = "SELECT produtonfe.CST, produtonfe.CFOP, produtonfe.pICMS, sum(produtonfe.valortotal) as VL_OPR, sum(produtonfe.vBC) as VL_BC_ICMS, 
                sum(produtonfe.vICMS) as VL_ICMS, sum(produtonfe.vICMSDeson) as VL_RED_BC, sum(produtonfe.vBCST) as VL_BC_ICMS_ST, sum(produtonfe.vICMSST) as VL_ICMS_ST, sum(produtonfe.vIPI) as VL_IPI
                from produtonfe ";
                $sql .= " WHERE NFe = '$dados->id'";
                $sql .= " GROUP BY produtonfe.CST, produtonfe.CFOP, produtonfe.pICMS";
                $arrayParam = '';
                $dadosprodnfec = $crud->getSQLGeneric($sql, $arrayParam, true);
                $item = 1;
//            echo $sql;
//            echo '<br/>';
                foreach ($dadosprodnfec as $dadosprod) :
                    $std = new stdClass();
                    $std->CST_ICMS = str_pad(substr(soNumero($dadosprod->CST), 0, 3), 3, '0', STR_PAD_LEFT);
                    $std->CFOP = $dadosprod->CFOP;
                    $std->ALIQ_ICMS = number_format($dadosprod->pICMS, 2, '.', '');
//                    VL_OPR
                    if ($dados->finNFe == '2') :
                        $std->VL_OPR = '0';
                    else :
                        if ($dadosprod->VL_BC_ICMS > 0) :
                            $std->VL_OPR = number_format($dadosprod->VL_BC_ICMS + $dadosprod->VL_IPI, 2, '.', '');
                        else :
                            $std->VL_OPR = number_format($dadosprod->VL_OPR + $dadosprod->VL_IPI, 2, '.', '');
                        endif;
                    endif;

                    $std->VL_BC_ICMS = number_format($dadosprod->VL_BC_ICMS, 2, '.', '');
                    $std->VL_ICMS = number_format($dadosprod->VL_ICMS, 2, '.', '');
                    $std->VL_BC_ICMS_ST = number_format($dadosprod->VL_BC_ICMS_ST, 2, '.', '');
                    $std->VL_ICMS_ST = number_format($dadosprod->VL_ICMS_ST, 2, '.', '');
                    $std->VL_RED_BC = number_format($dadosprod->VL_RED_BC, 2, '.', '');
                    $std->VL_IPI = number_format($dadosprod->VL_IPI, 2, '.', '');
                    $std->COD_OBS = '';
                    
//                    echo $dadosprod->VL_RED_BC;
                    try {
                        $c190 = new C190($std);
                        $sped .= $c190;
                        $sped .= "\r\n";
                    } catch (\Exception $e) {
                        echo $e->getMessage();
                    }
                endforeach;
            else :
//            GERA C190
                $pdo = Conexao::getInstance();
                $crud = Crud::getInstance($pdo, 'produtonfe');
                $sql = "SELECT produtonfe.CST, produtonfe.CFOP, produtonfe.pICMS, sum(produtonfe.valortotal) as VL_OPR, sum(produtonfe.vBC) as VL_BC_ICMS, 
                sum(produtonfe.vICMS) as VL_ICMS,  sum(produtonfe.vICMSDeson) as VL_RED_BC, sum(produtonfe.vBCST) as VL_BC_ICMS_ST, sum(produtonfe.vICMSST) as VL_ICMS_ST, sum(produtonfe.vIPI) as VL_IPI
                from produtonfe ";
                $sql .= " WHERE NFe = '$dados->id'";
                $sql .= " GROUP BY produtonfe.CST, produtonfe.CFOP, produtonfe.pICMS";
                $arrayParam = '';
                $dadosprodnfec = $crud->getSQLGeneric($sql, $arrayParam, true);
                $item = 1;
//            echo $sql;
//            echo '<br/>';
                foreach ($dadosprodnfec as $dadosprod) :
                    $std = new stdClass();
                    $std->CST_ICMS = str_pad(substr(soNumero($dadosprod->CST), 0, 3), 3, '0', STR_PAD_LEFT);
                    $std->CFOP = $dadosprod->CFOP;
                    $std->ALIQ_ICMS = number_format($dadosprod->pICMS, 2, '.', '');
                    $std->VL_OPR = number_format($dadosprod->VL_BC_ICMS + $dadosprod->VL_IPI, 2, '.', '');
                    $std->VL_BC_ICMS = number_format($dadosprod->VL_BC_ICMS, 2, '.', '');
                    $std->VL_ICMS = number_format($dadosprod->VL_ICMS, 2, '.', '');
                    $std->VL_BC_ICMS_ST = number_format($dadosprod->VL_BC_ICMS_ST, 2, '.', '');
                    $std->VL_ICMS_ST = number_format($dadosprod->VL_ICMS_ST, 2, '.', '');
                    $std->VL_RED_BC = number_format($dadosprod->VL_RED_BC, 2, '.', '');
                    $std->VL_IPI = number_format($dadosprod->VL_IPI, 2, '.', '');
                    $std->COD_OBS = '';
                    
//                                        echo $dadosprod->VL_RED_BC;

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

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

//fim GERA D0001
//GERA D100
foreach ($dadosnfe as $dados) :
    $std = new stdClass();
    if ($dados->tipo == 'Entrada') :
        $std->IND_OPER = '0';
        $std->IND_EMIT = '1';
    else :
        $std->IND_OPER = '1';
        $std->IND_EMIT = '0';
    endif;
    $std->COD_PART = soNumero($dados->destCNPJ);
    $std->COD_MOD = $dados->modelo;
    if ($dados->status == '101') :
        $std->COD_SIT = '02';
    else :
        $std->COD_SIT = '00';
    endif;
    $std->SER = $dados->serie;
    $std->SUB = null;
    $std->COD_CONS = '01';
    $std->NUM_DOC = $dados->nNF;
    $std->DT_DOC = soNumero($dados->dhEmi);
    $std->DT_E_S = soNumero($dados->dhSaiEnt);
    $std->VL_DOC = $dados->vNF;
    $std->VL_DESC = $dados->vDescnf;
    $std->VL_FORN = $dados->vNF;
    $std->VL_SERV_NT = $dados->vNF;
    $std->VL_DA = $dados->vBCnf;
    $std->VL_BC_ICMS = $dados->vBCnf;
    $std->VL_ICMS = $dados->vICMSnf;
    $std->VL_BC_ICMS_ST = '0';
    $std->VL_ICMS_ST = '0';
    $std->COD_INF = null;
    $std->COD_CTA = null;
    $std->VL_PIS = '0';
    $std->VL_COFINS = '0';
    $std->TP_LIGACAO = null;
    $std->COD_GRUPO_TENSAO = null;
    $std->CHV_DOCe = null;
    $std->FIN_DOCe = null;
    $std->CHV_DOCe_REF = null;
    $std->IND_DEST = null;
    $std->COD_MUN_DEST = $dados->destcMun;
    $std->COD_MUN_DEST = null;
    try {
        $C500 = new C500($std);
        $sped .= $C500;
        $sped .= "\r\n";
    } catch (\Exception $e) {
        echo $e->getMessage();
    }


    $std = new stdClass();
    $std->CST_ICMS = '060';
    $std->CFOP = $dados->CFOP;
    $std->ALIQ_ICMS = '0';
    $std->VL_OPR = $dados->vNF;
    $std->VL_BC_ICMS = '0';
    $std->VL_ICMS = '0';
    $std->VL_BC_ICMS_ST = '0';
    $std->VL_ICMS_ST = '0';
    $std->VL_RED_BC = $dados->vNF;
    $std->COD_OBS = null;
    try {
        $C590 = new C590($std);
        $sped .= $C590;
        $sped .= "\r\n";
    } catch (\Exception $e) {
        echo $e->getMessage();
    }

endforeach;

//Total Bloco C
$total000 = totalizeBloco($sped, 'C');
$sped .= '|C990|' . $total000 . '|';
$sped .= "\r\n";
//Fim total bloco C

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

//GERA D001
$std = new stdClass();
if (count($dadosnfe) > 0) :
    $std->IND_MOV = 0;
else :
    $std->IND_MOV = 1;
endif;
try {
    $D001 = new D001($std);
    $sped .= $D001;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//fim GERA D0001
//GERA D100
foreach ($dadosnfe as $dados) :
    $std = new stdClass();
    if ($dados->tipo == 'Entrada') :
        $std->IND_OPER = '0';
        $std->IND_EMIT = '1';
    else :
        $std->IND_OPER = '1';
        $std->IND_EMIT = '0';
    endif;
    $std->COD_PART = soNumero($dados->destCNPJ);
    $std->COD_MOD = $dados->modelo;
    if ($dados->status == '101') :
        $std->COD_SIT = '02';
    else :
        $std->COD_SIT = '00';
    endif;
    $std->SER = $dados->serie;
    $std->SUB = null;
    $std->NUM_DOC = $dados->nNF;
    $std->CHV_CTE = $dados->chavenfe;
    $std->DT_DOC = soNumero($dados->dhEmi);
    $std->DT_A_P = soNumero($dados->dhSaiEnt);
    $std->TP_CT_E = '0';
    $std->CHV_CTE_REF = '';
    $std->VL_DOC = $dados->vNF;
    $std->VL_DESC = $dados->vDescnf;
    $std->IND_FRT = 0;
    $std->VL_SERV = $dados->vNF;
    $std->VL_BC_ICMS = $dados->vBCnf;
    $std->VL_ICMS = $dados->vICMSnf;
    $std->VL_NT = 0.00;
    $std->COD_INF = null;
    $std->COD_CTA = null;
    $std->COD_MUN_ORIG = $dados->destcMun;
    $std->COD_MUN_DEST = $emitente->cMun;
    try {
        $D100 = new D100($std);
        $sped .= $D100;
        $sped .= "\r\n";
    } catch (\Exception $e) {
        echo $e->getMessage();
    }


    $std = new stdClass();
    $std->CST_ICMS = '060';
    $std->CFOP = $dados->CFOP;
    $std->ALIQ_ICMS = null;
    $std->VL_OPR = $dados->vNF;
    $std->VL_BC_ICMS = $dados->vBCnf;
    $std->VL_ICMS = $dados->vICMSnf;
    $std->VL_RED_BC = $dados->vNF;
    $std->COD_OBS = null;
    try {
        $D190 = new D190($std);
        $sped .= $D190;
        $sped .= "\r\n";
    } catch (\Exception $e) {
        echo $e->getMessage();
    }
endforeach;

//Total Bloco D
$total000 = totalizeBloco($sped, 'D');
$sped .= '|D990|' . $total000 . '|';
$sped .= "\r\n";
//Fim total bloco D
//GERA E0001
$std = new stdClass();
$std->IND_MOV = '0';

try {
    $E001 = new E001($std);
    $sped .= $E001;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM GERA E001
//GERA E100
$std = new stdClass();
$std->DT_INI = soNumero($datainicial);
$std->DT_FIN = soNumero($datafinal);

try {
    $E100 = new E100($std);
    $sped .= $E100;
    $sped .= "\r\n";
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM GERA E100
//
//Total Bloco E
$total000 = totalizeBloco($sped, 'E');
$sped .= '|E990|' . $total000 . '|';
$sped .= "\r\n";
//Fim total bloco E
//BLOCO G VAZIO

$sped .= '|G001|1|';
$sped .= "\r\n";
$sped .= '|G990|2|';
$sped .= "\r\n";

//BLOCO G VAZIO
//BLOCO H VAZIO

$sped .= '|H001|1|';
$sped .= "\r\n";
$sped .= '|H990|2|';
$sped .= "\r\n";

//BLOCO H VAZIO
//GERA RGISTRO K001

$std = new stdClass();
$std->ind_mov = 0;
try {
    $K001 = new K001($std);
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM K001
//
//GERA K100
$std = new stdClass();
$std->DT_INI = soNumero($datainicial);
$std->DT_FIN = soNumero($datafinal);

try {
    $K100 = new K100($std);
} catch (\Exception $e) {
    echo $e->getMessage();
}
//FIM K100
//GERA K200
$k200a = '';
$gk = 'N';
foreach ($estoque as $qtd) :
    if ($qtd['estoque'] > 0) :
        $gk = 'S';
        $std = new stdClass();
        $std->DT_EST = soNumero($datafinal);
        $std->COD_ITEM = $qtd['produto'];
        $std->QTD = $qtd['estoque'];
        $std->IND_EST = 0;
        $std->COD_PART = null;

        try {
            $K200 = new K200($std);
            $k200a .= $K200;
            $k200a .= "\r\n";
        } catch (\Exception $e) {
            echo $e->getMessage();
        }
    endif;
endforeach;
//FIM K200
if ($gk === 'S') :
    $sped .= $K001;
    $sped .= "\r\n";

    $sped .= $K100;
    $sped .= "\r\n";

    $sped .= $k200a;

//Total Bloco K
    $total000 = totalizeBloco($sped, 'K');
    $sped .= '|K990|' . $total000 . '|';
    $sped .= "\r\n";
//Fim total bloco K
else :

//BLOCO K VAZIO

    $sped .= '|K001|1|';
    $sped .= "\r\n";
    $sped .= '|K990|2|';
    $sped .= "\r\n";

//BLOCO H VAZIO
endif;

//BLOCO 1001 VAZIO

$sped .= '|1001|0|';
$sped .= "\r\n";
$sped .= '|1010|N|N|N|N|N|N|N|N|N|N|N|N|N|';
$sped .= "\r\n";
$sped .= "|1990|3|";
$sped .= "\r\n";

//BLOCO 1001 VAZIO


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

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

function download($arquivo) {
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream;");
    header("Content-Length:" . filesize($arquivo));
    header("Content-disposition: attachment; filename=" . $arquivo);
    header("Pragma: no-cache");
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
    header("Expires: 0");
    readfile($arquivo);
    flush();
}

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

download($nomearquivo);