<?php

class Sinistro2_Model_AvisosFinalReplantio extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sinistro';
    protected $_name = 'avisos_final_replantio';
    protected $_primary = 'id';
    public $_order = 'id_proposta';

    public function getData($where)
    {
        $sub = $this->select()
            ->setIntegrityCheck(false)
            ->from(array('spc' => 'seguro.propostas_coberturas'), 'id_proposta')
            ->joinInner(array('cob' => 'produto.coberturas'), 'cob.id = spc.id_cobertura', false)
            ->where('spc.id_proposta = p.id')
            ->where("cob.ds_nome_cobertura ilike '%REPLANTIO%'");

        $select = $this->select()
          ->setIntegrityCheck(false)
          ->from(array('pr' => 'sinistro.processos'))
          ->joinInner(array('p' => 'seguro.propostas'), 'p.id = pr.id_proposta', array('p.id_proposta_mae'))
          ->joinInner(array('pe' => 'seguro.propostas_endosso'),
            'pe.id_proposta = pr.id_proposta AND pe.fl_proposta_vigente = true', false)
          ->joinInner(array('pp' => 'seguro.propostas_proponentes'),
            'pp.id_proposta = p.id', array('pp.ds_nome_proponente'))
          ->joinInner(array('pc' => 'seguro.propostas_corretores'),
            'pc.id_proposta = p.id', array('pc.id_usuario as id_corretor'))
          ->joinInner(array('pd' => 'produto.produtos'),
            'pd.id = p.id_produto', false)
          ->where('pr.id_status <> ?', Agro_Util::getIdStatus('CANCELADO'))
          ->where('EXISTS (' . $sub . ')')
          ->where('p.id_status in (' .
            Agro_Util::status('APOLICE_EMITIDA', 'PR') . ', ' .
            Agro_Util::status('APOLICE_CANCELADA', 'PR') . ')');

        if ($this->_order) {
            $select->order($this->_order);
        }

        $this->getWhere($select, $where);

        return $select;
    }

    public function getItensSeguradosAvisosFinalReplantio($idProcesso, $idProposta)
    {
        $data = array();

        $sub = $this->select()
          ->setIntegrityCheck(false)
          ->from(array('ae' => 'sinistro.avisos_final_replantio'), false)
          ->joinInner(array('aeis' => 'sinistro.avisos_final_replantio_itens_segurados'),
            'aeis.id_aviso_final_replantio = ae.id', 'id_item_segurado')
          ->where('ae.id_proposta = ?', $idProposta)
          ->where('ae.fl_del is false');

        if ($idProcesso && $idProposta) {
            $select = $this->select()
              ->setIntegrityCheck(false)
              ->from(array('it' => 'seguro.itens_segurados'),
                array('id_proposta', 'id', 'nr_item_segurado', 'ds_item_segurado', 'vl_area', 'vl_lmga'))
              ->joinInner(array('v' => 'produto.variedades'), 'v.id = it.id_variedade', 'ds_nome_variedade')
              ->joinInner(array('p' => 'sinistro.processos'), 'p.id_proposta = it.id_proposta', false)
              ->where('p.id = ?', $idProcesso)
              ->where('it.id not in (' . $sub . ')')
              ->where('p.id_status != 168')
              ->where('it.vl_lmga > 0')
              ->group(array(
                'p.id, it.id_proposta, 
                    it.id, it.nr_item_segurado, 
                    it.ds_item_segurado, it.vl_area, 
                    it.vl_lmga, v.ds_nome_variedade'
              ))
              ->order('it.id');

            $data = $this->_db->fetchAll($select);
        }

        return $data;
    }

    public function getDataViewAvisoFinalReplantio($idAvisoFinalReplantio)
    {
        $data = array();

        $select = $this->select()
          ->setIntegrityCheck(false)
          ->from(array('afr' => 'sinistro.avisos_final_replantio'),
            array(
              'afr.id as id_aviso_final_replantio',
              "to_char(afr.dt_final_replantio, 'DD/MM/YYYY') as dt_final_replantio",
              "to_char(afr.dt_criacao, 'DD/MM/YYYY HH24:MI') as dt_envio",
              'id_proposta',
              'afr.fl_del',
              'afr.ds_beneficiario_alteracao',
            ))
          ->where('afr.id = ?', $idAvisoFinalReplantio);

        $data = $this->fetchAll($select)->toArray();

        $selectProcesso = "
        SELECT proc.id AS id_processo
          FROM (SELECT id_proposta_mae
                  FROM sinistro.avisos_final_replantio AS afr
                       INNER JOIN seguro.propostas ON seguro.propostas.id = afr.id_proposta
                 WHERE afr.id = {$idAvisoFinalReplantio}) AS proposta_mae
               INNER JOIN seguro.propostas prop ON prop.id_proposta_mae = proposta_mae.id_proposta_mae
               INNER JOIN sinistro.processos AS proc ON proc.id_proposta = prop.id";

        $data = array_merge($data[0], $this->_db->fetchAll($selectProcesso)[0]);

        $select = $this->select()
          ->setIntegrityCheck(false)
          ->from(array('afris' => 'sinistro.avisos_final_replantio_itens_segurados'), 'id')
          ->joinInner(array('it' => 'seguro.itens_segurados'), 'it.id = afris.id_item_segurado',
            array('it.id as id_item_segurado', 'nr_item_segurado', 'ds_item_segurado', 'vl_area'))
          ->joinInner(array('v' => 'produto.variedades'), 'v.id = it.id_variedade', 'ds_nome_variedade')
          ->where('afris.id_aviso_final_replantio = ?', $idAvisoFinalReplantio)
          ->order('it.nr_item_segurado');

        $data['arItensSegurados'] = $this->fetchAll($select)->toArray();

        return $data;
    }

    public function getAvisosFinalReplantioByProposta($idProposta, bool $buscarRegistrosDeletados = false)
    {
        $subQuery = $this->select()
          ->setIntegrityCheck(false)
          ->from('seguro.propostas', 'id_proposta_mae')
          ->where('id = ?', $idProposta);

        $camposFrom = [
          'afr.id as id_aviso_final_replantio',
          "to_char(afr.dt_final_replantio, 'DD/MM/YYYY') as dt_final_replantio",
          "to_char(afr.dt_criacao, 'DD/MM/YYYY HH24:MI') as dt_envio",
          'id_status',
          'afr.fl_del',
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('afr' => 'sinistro.avisos_final_replantio'), $camposFrom);
        $select->joinInner(array('prop' => 'seguro.propostas'), 'prop.id = afr.id_proposta', false);
        $select->joinInner(array('u' => 'sistema.usuarios'), 'u.id = afr.id_usuario_criacao', 'ds_nome_usuario as ds_nome_usuario_envio');
        $select->where("id_proposta_mae in ({$subQuery})");

        if (!$buscarRegistrosDeletados) {
          $select->where('afr.fl_del is false');
        }

        return $this->fetchAll($select)->toArray();
    }

    public function delete($id, $field='id')
    {
      $this->_db->query("UPDATE sinistro.avisos_final_replantio SET fl_del = true WHERE id = {$id}");
    }
    
    public function configuraDestinatarioPagamento($id_processo, $idAviso, $idBeneficiario = '')
    {
		  $Row = $this->find($idAviso)->current();

      $ModelProcessosObservacoes = new Sinistro2_Model_ProcessosObservacoes();

      $Obs = $ModelProcessosObservacoes->createRow();
      $Obs->id_processo = $id_processo;
      if(empty($idBeneficiario)){
        $Obs->ds_observacao = "ATENÇÃO! Alteração no pagamento da cobertura adicional de replantio: Será pago para o segurado.* Conferir os dados bancários do segurado";
      }else{
        $Obs->ds_observacao = "ATENÇÃO! Alteração no pagamento da cobertura adicional de replantio: Será pago para o beneficiário.* Solicitar Termo de crédito em conta bancária'.";
      }
      
      $Obs->save();

      $Row->ds_beneficiario_original = $Row->ds_beneficiario_alteracao;
      $id_beneficiario_original = $Row->ds_beneficiario_alteracao;
      $Row->ds_beneficiario_alteracao = $idBeneficiario;
      $id_beneficiario_alteracao = $idBeneficiario;
      $Row->save();
      
      $this->setLog($id_beneficiario_original,$id_beneficiario_alteracao, $idAviso);
      return ['status'=>true];
      
    }

    public function setLog($original, $novo, $idAviso)
    {
      try{
		    $User = Zend_Auth::getInstance()->getIdentity();
        $this->_db->query("
				  INSERT INTO log.log_alteracao_destinatario_pagamento (id_destinatario_antigo,id_destinatario_novo,id_aviso,id_usuario_criacao) VALUES ('{$original}', '{$novo}','{$idAviso}', '{$User->id}')");	
        }catch(Exception $e){
          $this->setMessage($e->getMessage());
			    return false; 
        }
    }

    public function getLogs($idAviso){

      $sql = "SELECT adp.*, u.ds_nome_usuario,b.ds_nome_beneficiario
        FROM log.log_alteracao_destinatario_pagamento adp
        JOIN sistema.usuarios u 
        ON adp.id_usuario_criacao = u.id
        LEFT JOIN seguro.beneficiarios b 
        ON b.id = COALESCE(
        CASE 
            WHEN adp.id_destinatario_novo IS NOT NULL 
                 AND adp.id_destinatario_novo <> '' 
                 AND adp.id_destinatario_novo ~ '^[0-9]+$'
            THEN adp.id_destinatario_novo::int
            ELSE NULL
        END,
        CASE 
            WHEN adp.id_destinatario_antigo IS NOT NULL 
                 AND adp.id_destinatario_antigo <> '' 
                 AND adp.id_destinatario_antigo ~ '^[0-9]+$'
            THEN adp.id_destinatario_antigo::int
            ELSE NULL
        END)
        WHERE adp.id_aviso = {$idAviso};";


      return $this->_db->fetchAll($sql);
    }
    //pega as liquidacoes que tem itens segurados que tem vinculo com o aviso
    public function getLiquidacoesAviso($idAviso)
    {
      $select = $this->select();
		  $select->setIntegrityCheck(false);

		  $select->from(array('a'=>'sinistro.avisos_final_replantio_itens_segurados'),array('id_item_segurado'));
		  $select->join(array('l'=>'sinistro.liquidacoes_itens_segurados_coberturas'),'a.id_item_segurado = l.id_item_segurado',array('id_liquidacao'));
      $select->join(array('liq'=>'sinistro.liquidacoes'),'l.id_liquidacao = liq.id', array('id_status'));
		  $select->where($this->getAdapter()->quoteInto('a.id_aviso_final_replantio = ?',$idAviso));
   
		  return $this->fetchAll($select)->toArray();
     
    }

    public function existeBeneficiarioAlterado(int $idLiquidacao)
    {
      try{
        //$sql = "
        //    SELECT EXISTS (
        //        SELECT 1
        //        FROM sinistro.liquidacoes_itens_segurados_coberturas lic
        //        JOIN sinistro.avisos_final_replantio_itens_segurados afris
        //              ON afris.id_item_segurado = lic.id_item_segurado
        //             AND afris.fl_del = FALSE
        //        JOIN sinistro.avisos_final_replantio afr
        //              ON afr.id = afris.id_aviso_final_replantio
        //        WHERE lic.id_liquidacao = :id_liquidacao
        //          AND afr.ds_beneficiario_alteracao IS NOT NULL
        //          AND afr.ds_beneficiario_alteracao <> ''
        //        LIMIT 1
        //    ) AS existe
        //";

        $sql = "
          SELECT (
            SELECT NULLIF(BTRIM(afr.ds_beneficiario_alteracao), '')
            FROM sinistro.liquidacoes_itens_segurados_coberturas lic
            JOIN sinistro.avisos_final_replantio_itens_segurados afris
                  ON afris.id_item_segurado = lic.id_item_segurado
                AND afris.fl_del = FALSE
            JOIN sinistro.avisos_final_replantio afr
                  ON afr.id = afris.id_aviso_final_replantio
            WHERE lic.id_liquidacao = :id_liquidacao
              AND afr.ds_beneficiario_alteracao IS NOT NULL
              AND BTRIM(afr.ds_beneficiario_alteracao) <> ''
            LIMIT 1
          ) AS ds_beneficiario_alteracao;
          ";

        $result = $this->_db->fetchOne($sql, [
            ':id_liquidacao' => $idLiquidacao,
        ]);

    
        return $result;
      }catch(Exception $e){
        $this->setMessage($e->getMessage());
			  return false;
      }
    }

}
