<?php
class Seguro_Model_PropostaBoleto extends Agro_Db_Table_Abstract {
	protected $_name = 'proposta_boletos';
	protected $_schema = 'seguro';

	public function setNumeroBoleto($idProposta, $nuBoleto) {

	    $User = Zend_Auth::getInstance()->getIdentity();

		if (strlen($nuBoleto) > 9){
			$this->setMessage("O número do boleto deve ter no máximo 10 caracteres");

		}else {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('p' => 'seguro.propostas'), 'id');
			$Select->join(array('b' => 'seguro.proposta_boletos'), 'p.id = b.id_proposta', 'id_proposta');
			$Select->join(array('s' => 'sistema.status'), 'p.id_status = s.id', false);
			$Select->where("s.ds_chave not in ('PROPOSTA_CANCELADA', 'DEVOLVIDA', 'NAO_ENVIADA')");
			$Select->where('b.nu_boleto = ?', $nuBoleto);
			$Select->where('b.fl_ativo = true');
			$Select->where('b.id_proposta <> ?', $idProposta);

			$Row = $this->fetchRow($Select);

			if ($Row->id_proposta) {
			    $this->setMessage("Não é possível alterar o boleto pois o mesmo pertence a proposta ". str_pad($Row->id_proposta, 6, 0, STR_PAD_LEFT));
			} else {
				$Select = $this->select()->setIntegrityCheck(false);
				$Select->from(array('b' => 'seguro.proposta_boletos'), 'id_proposta');
				$Select->where('b.nu_boleto = ?', $nuBoleto);
				$Select->where('b.id_proposta = ?', $idProposta);
				$Row = $this->fetchRow($Select);

				if ($Row->id_proposta){
				    $this->update(array('fl_ativo' => 0, 'id_usuario_alteracao' => $User->id), "id_proposta = $idProposta");
				    $this->update(array('fl_ativo' => 1, 'id_usuario_alteracao' => $User->id), "id_proposta = $idProposta and nu_boleto = $nuBoleto");
				    $this->setMessage("Número do boleto alterado com sucesso.");
				} else {
				    $this->update(array('fl_ativo' => 0, 'id_usuario_alteracao' => $User->id), "id_proposta = $idProposta");

    				$New = $this->fetchRow("nu_boleto = $nuBoleto");
    				$New->id_proposta = $idProposta;
    				$New->id_usuario_criacao = $User->id;
    				$New->fl_ativo = 1;

    				if ($New->save()) {
    					$this->setMessage("Número do boleto alterado com sucesso.");
    				} else {
    					$this->setMessage("Não foi possível alterar o número do boleto.");
    				}
				}
			}
		}
	}

	public function getNumeroBoleto($idProposta, $nrParcela=1, $idVersao="") {
		$Select = $this->select();
		$Select->from(array('p' => 'seguro.proposta_boletos'), 'nu_boleto');
		$Select->where('id_proposta = ?', $idProposta);
		$Select->where('nr_parcela = ?' , $nrParcela);
		$Select->where('fl_ativo = true');
		if($idVersao){
		    $Select->where('id_versao = ?' , $idVersao);		    
		}

		return $this->getAdapter()->fetchOne($Select);
	}
	

	
	public function getNumeroBoletoReapresentado($idProposta, $nrParcela) {
	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('p' => 'seguro.propostas_boletos_prorrogacoes'), 'max(nu_boleto) as nu_boleto');
	    $Select->where('id_proposta = ?', $idProposta);
	    $Select->where('nr_parcela = ?' , $nrParcela);
	    $Select->where('fl_ativo = true');
	    
	    return $this->getAdapter()->fetchOne($Select);
	}

	public function deleteNumeroBoleto($idProposta) {
		$this->getAdapter()->query("update seguro.proposta_boletos set fl_ativo = false where id_proposta = $idProposta");
	}


	/**
	 * Retorna os boletos que estão vencidos e não pagados
	 *
	 * @param int $diasVencidos
	 * @param bool $primeiraParcela
	 * @return array
	 */
	public function getBoletosVencidos(int $diasVencidos = 6, bool $primeiraParcela = true): array
	{
		$dtMaxVencimento = "(CURRENT_DATE - INTERVAL '{$diasVencidos} days')::DATE";
		$sumValorTotal = "(SELECT SUM(sp.vl_total) FROM seguro.propostas_parcelas sp WHERE sp.id_proposta = pr.id AND sp.fl_ativo is true) AS vl_total";
		$idSafraAtual = (new Produto_Model_Safras())->getSafraAtual('id');
		$idSafraAnterior = $idSafraAtual - 1;
		
		$subQueryResponsavel = $this->select();
		$subQueryResponsavel = $subQueryResponsavel->setIntegrityCheck(false);
		$subQueryResponsavel->setIntegrityCheck(false);
		$subQueryResponsavel->from(
			['proposta' => "seguro.propostas"],
			"proposta.id AS id_proposta
			,coalesce(preposto.ds_nome_preposto, corretor.ds_nome_corretor) AS ds_nome_responsavel
			,coalesce(preposto.id, corretor.id) AS id_responsavel
			,coalesce(preposto.id_comercial, corretor.id_comercial) AS id_comercial"
		);
		$subQueryResponsavel->joinLeft(['corretor' => 'sistema.corretores'], 'corretor.id_usuario = proposta.id_usuario_criacao', false);
		$subQueryResponsavel->joinLeft(['preposto' => 'sistema.prepostos'], 'preposto.id_usuario = proposta.id_usuario_criacao', false);

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(['pb' => 'seguro.proposta_boletos'], "id_proposta, nr_parcela, fl_pago, dt_vencimento, {$dtMaxVencimento} AS dt_max_vencimento");
		$select->join(['pr' => 'seguro.propostas'], 'pr.id = pb.id_proposta', "seguro.nr_endosso(pr.id, pr.id_endosso) AS nr_endosso, {$sumValorTotal}");
		$select->join(['pd' => 'produto.produtos'], 'pd.id = pr.id_produto', false);
		$select->join(['responsavel' => $subQueryResponsavel], 'responsavel.id_proposta = pr.id');
		$select->join(['comercial' => 'sistema.funcionarios'], 'comercial.id_usuario = responsavel.id_comercial', "ds_nome_funcionario AS ds_nome_comercial, ds_email as ds_email_comercial");
		$select->where('pb.fl_ativo is true');
		$select->where('pb.fl_pago is false');
		$select->where('pr.id_status NOT IN (?)', [Seguro_Model_Propostas::ID_STATUS_PROPOSTA_CANCELADA, Seguro_Model_Propostas::ID_STATUS_APOLICE_CANCELADA]);
		$select->where("pd.id_safra IN (?)", [$idSafraAtual, $idSafraAnterior]);
		$select->where("pb.dt_vencimento < $dtMaxVencimento");
		$select->where('seguro.nr_endosso(pr.id, pr.id_endosso) = ?', 0);
		
		if ($primeiraParcela) {
			$select->where('nr_parcela = ?' , 1);
		}

		$select->order('id_comercial, id_responsavel');
		return $this->fetchAll($select)->toArray();
	}
}