<?php

final class DModelNotaFiscalNotaFiscal extends Model
{

    public function saveNFEToDB($orderid, $chaveacesso, $strxml, $plinkXml, $pLinkDanfe, $quantidade_volumes,
                                $pMlEnviado = 0, $pGpEnviado = 0, $numero_nfe = "", $data_hora_emissao = null,
                                $serie = "", $cfop = "")
    {
        $sql = "INSERT INTO oc_order_nfe (order_id,
                                          chave_acesso,
                                          xml,
                                          link_xml,
                                          link_danfe,
                                          ml_nf_enviado,
                                          quantidade_volumes,
                                          gp_nf_enviado,
                                          numero_nfe,
                                          data_hora_emissao,
                                          serie,
                                          cfop
                                          ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        $this->db->executeSql($sql, [$orderid, $chaveacesso, $strxml, $plinkXml, $pLinkDanfe, $pMlEnviado,
            $quantidade_volumes, $pGpEnviado, $numero_nfe, $data_hora_emissao, $serie, $cfop]);
    }

    public function getNotaFiscalServer($data = array())
    {

        $this->load->type('tipofuturaserver');
        $params = $this->db->query('select cast(data_inicial_verxml as DATE) AS dataInicial from parametros_efutura');

        if (!$params->num_rows) {
            return false;
        }

        $dataInicial     = str_replace('/', '.', ftr_geral::formatDate($params->row['dataInicial'], 'br'));
        $faturado        = Type_PedidoStatus::TpPSt_Faturado;
        $ecmEnviadoNao   = Type_DsimDnaoServer::Tp_Nao;
        $modelodocfiscal = TNotaFiscalModelo::Tp_NFMod_Nota_Fiscal_Eletronica;
        $xmltipo         = Type_TNFEXmlTipo::Tp_NfeXmlTp_EmissaoPropriaNormal;


        $sql = "select
                    FIRST 25
                    nf.id as nota_fiscal_id,
                    p.id_ecommerce,
                    nf.nro_nota,
                    nfe.chave_acesso,
                    nfe.xml_arquivo,
                    nf.quantidade as quantidade_volumes,
                    nf.data_hora_emissao,
                    nf.serie,
                    cf.cfop
                from PEDIDO p
                inner join NOTA_FISCAL nf ON (p.ID = nf.FK_PEDIDO)
                inner join NOTA_FISCAL_NFE nfe on (nf.ID = nfe.FK_NOTA_FISCAL)
                left join CFOP cf on (nf.FK_CFOP = cf.ID)
                where
                    p.ID_ECOMMERCE is not null and
                    nf.NRO_NOTA is not null and
                    nfe.XML_ARQUIVO is not null and
                    p.status = $faturado and
                    nf.DATA_EMISSAO > '$dataInicial' and
                    nf.DATA_EMISSAO between (current_date - 90) AND current_date and
                    nf.ECM_ENVIADO = '$ecmEnviadoNao' and
                    nfe.XML_TIPO = $xmltipo and
                    nf.MODELO_DOC_FISCAL = $modelodocfiscal";

        if (!empty($data['order_id'])) {
            $sql .= " and (p.ID_ECOMMERCE = " . $data['order_id'] . ")";
        }

        return $this->wsceo->getConsultaFromSqlSemCache($sql);

    }


    public function setEcmEnviado($pedidoServerId)
    {

        $sql = array();
        $sql[] = "update NOTA_FISCAl SET ECM_ENVIADO = '" . Type_DsimDnaoServer::Tp_Sim . "' WHERE ID = " . $pedidoServerId;
        return $this->wsceo->executeSql($sql);

    }

    public function getPedidosVerificarNFE($data = array())
    {
        $this->load->type('tipofuturaserver');

        $temStatusNFE = !(empty($this->config->get('select_order_status_nota_fiscal_emitida_id')));

        //data_inicial_verxml
        $sqlParam = 'select data_inicial_verxml from parametros_efutura';
        $resultParam = $this->db->query($sqlParam);

        $dataIniNota = $resultParam->row['data_inicial_verxml'];

        $sql = "SELECT o.id_futura, o.order_id FROM oc_order o"
            . " WHERE o.status_futuraserver = '" . Type_PedidoStatus::TpPSt_Faturado . "'"
            . " and (o.id_futura is not null)"
            . " and (o.date_added > '" . $dataIniNota . "')"
            . " and (date(o.date_added) BETWEEN CURDATE() - INTERVAL 90 DAY AND CURDATE())"
            . " and (not exists(select nfe.order_id from oc_order_nfe nfe where (o.order_id = nfe.order_id)))";

        //Se não utiliza processo verifica o status também,
        //se utiliza processo, o status da nota pode vir antes, fazendo com que não iria capturar a nota, por isso essa validação...
        if ($this->config->get('processo_venda_status') == Type_DsimDnao::Tp_Nao) {
            $sql .= ($temStatusNFE) ? " and (not exists(select oh.order_status_id from oc_order_history oh where (oh.order_id = o.order_id) and (oh.order_status_id = " . $this->config->get('select_order_status_nota_fiscal_emitida_id') . ")))" : "";
        }

        if (!empty($data['order_id'])) {
            $sql .= ' and (o.order_id = ' . $data['order_id'] . ')';
        }

        $result = $this->db->query($sql);

        if ($result->rows) {
            return $result->rows;
        } else {
            return false;
        }

    }

    public function getOrderNfe($order_id)
    {

        $sql = "select onfe.*, o.status_futuraserver from " . DB_PREFIX . "order_nfe onfe "
            . "inner join " . DB_PREFIX . "order o ON (onfe.order_id = o.order_id) "
            . "where o.order_id = " . $order_id;

        $query = $this->db->query($sql);
        if ($query->row) {
            return $query->row;
        } else {
            return false;
        }


    }

    public function deleteOrderNfe($order_id){

       return $this->db->query("DELETE FROM " . DB_PREFIX . "order_nfe WHERE order_id = ".$order_id);

    }

    public function getLogoNFE()
    {
        $tmpDanfe = $this->config->get('config_danfe');

        if (!empty($tmpDanfe)) {

            $tmpDanfe = explode('/', $tmpDanfe);

            $logoDanfe = '';
            $i = 0;
            foreach ($tmpDanfe as $tmp) {

                if (!empty($tmp)) {
                    $logoDanfe .= ($i > 0) ? '/' . rawurlencode($tmp) : '' . rawurlencode($tmp);
                }

                $i++;

            }

            return $this->urlloja->link('', '', 'SSL', false) . 'image/' . $logoDanfe;
        } else {
            return false;
        }

    }



}
