<?

class Nobre_Model_Liquidacoes extends Agro_Db_Table_Abstract {
	protected $_schema = 'sinistro';
	protected $_name = 'liquidacoes';
	protected $_primary = 'id';
	public $_order = 'id';

	public function save($dados){
		$Row = $this->getRow($dados['id_liquidacao']);
		$Row->id_processo = $dados["id_processo"];
		$Row->tp_liquidacao = $dados["tp_liquidacao"];

		return $Row->save();
	}

	public function getLiquidacoes($id_proposta, $id_processo){
		$Select = $this->select()->setIntegrityCheck(false);

    	$Select->from(array("lf"=>"sinistro.laudos_finais"), false);

    	$Select->joinInner(array("p"=>"sinistro.processos"), "p.id = lf.id_processo", false);
    	$Select->joinInner(array("pc"=>"seguro.propostas_coberturas"), "pc.id_proposta = p.id_proposta", false);
    	$Select->joinInner(array("pco"=>"produto.produtos_coberturas"), "pco.id_cobertura = pc.id_cobertura", false);
    	$Select->joinInner(array("iseg"=>"seguro.itens_segurados"), "iseg.id_proposta = p.id_proposta", array("iseg.id_proposta", "iseg.id as id_item_segurado", "iseg.ds_item_segurado", "iseg.vl_area", "iseg.vl_lmga"));
    	$Select->joinInner(array("v"=>"produto.variedades"), "v.id = iseg.id_variedade", "v.ds_nome_variedade");
    	$Select->joinInner(array("l"=>"sinistro.liquidacoes"), "l.id_processo = p.id", "l.id as id_liquidacao");

    	$Select->where("lf.id_processo = $id_processo");
    	$Select->where("p.id_proposta = $id_proposta");

    	$Row = $this->fetchAll($Select);

    	$result = array();

    	if ($Row){
    		$itens = $Row->toArray();

    		foreach ($itens as $iten){
    			$prejuizo_total = 0;

    			$Laudos = $this->getLaudosLiquidados($iten['id_liquidacao'], $iten['id_item_segurado']);

	    		$iten["LAUDOS"] =  $Laudos;

	    		foreach($Laudos as $laudo){
	    			$prejuizo_total += $laudo['vl_prejuizo'];
	    		}

	    		$iten['prejuizo_total'] = $prejuizo_total;
	    		$iten['franquia'] = 0;
	    		$iten['indenizacao'] = 0;

	    		$result[] = $iten;
    		}

    	}

    	return $result;

	}

    public function getLiquidacao($id_liquidacao){

        $result = array();

        //Busca informações da proposta e do processo
        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(array('l'=>'sinistro.liquidacoes'), 'l.id as id_liquidacao');
        $Select->join(array('pc'=>'sinistro.processos'), 'pc.id = l.id_processo', array('pc.id as id_processo', 'pc.id_proposta'));
        $Select->where("l.id = ?", $id_liquidacao);

        $Row = $this->fetchRow($Select);
        $result['id_liquidacao'] = $Row->id_liquidacao;
        $result['id_proposta'] = $Row->id_proposta;
        $result['id_processo'] = $Row->id_processo;

        // Busca informações da liquidação: franquia e indenização por item segurado/cobertura

        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(array('l'=>'sinistro.liquidacoes'), 'l.id as id_liquidacao');
        $Select->join(array('lisc'=>'sinistro.liquidacoes_itens_segurados_coberturas'), 'lisc.id_liquidacao = l.id', array('lisc.vl_franquia','lisc.vl_percent_franquia', 'lisc.vl_indenizacao', 'lisc.id_item_segurado', 'lisc.id_cobertura', 'lisc.vl_prejuizo_total'));
        $Select->join(array('c'=>'produto.coberturas'), 'c.id = lisc.id_cobertura', 'c.ds_nome_cobertura');
        $Select->where('l.id = ?', $id_liquidacao);
        $Select->order(array('l.id', 'lisc.id'));
        $Row = $this->fetchAll($Select);

        $result['itens_segurados'] = array();
        $result['vl_indenizacao_total'] = 0;
        $result['vl_franquia_total'] = 0;

        if ($Row){
            $LiquidacoesItensSeguradosCobertura = $Row->toArray();
            foreach ($LiquidacoesItensSeguradosCobertura as $LiquidacaoItemSeguradoCobertura) {
                $result['itens_segurados'][$LiquidacaoItemSeguradoCobertura['id_item_segurado']]['indenizacao'][] = array(
                    'id_cobertura'          => $LiquidacaoItemSeguradoCobertura['id_cobertura'],
                    'ds_nome_cobertura'     => $LiquidacaoItemSeguradoCobertura['ds_nome_cobertura'],
                    'vl_percent_franquia'   => $LiquidacaoItemSeguradoCobertura['vl_percent_franquia'],
                    'vl_franquia'           => $LiquidacaoItemSeguradoCobertura['vl_franquia'],
                    'vl_indenizacao'        => $LiquidacaoItemSeguradoCobertura['vl_indenizacao']
                );
                $result['itens_segurados'][$LiquidacaoItemSeguradoCobertura['id_item_segurado']]['vl_indenizacao_total'] += $LiquidacaoItemSeguradoCobertura['vl_indenizacao'];
                $result['itens_segurados'][$LiquidacaoItemSeguradoCobertura['id_item_segurado']]['vl_prejuizo_total'] += $LiquidacaoItemSeguradoCobertura['vl_prejuizo_total'];
                $result['vl_indenizacao_total'] += $LiquidacaoItemSeguradoCobertura['vl_indenizacao'];
                $result['vl_franquia_total'] += $LiquidacaoItemSeguradoCobertura['vl_franquia'];
                $result['vl_prejuizo_total'] += $LiquidacaoItemSeguradoCobertura['vl_prejuizo_total'];
            }
        }


        // Busca informações da liquidação: prejuizo por item segurado/cobertura/laudo
        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(array('l'=>'sinistro.liquidacoes'), 'l.id as id_liquidacao');
        $Select->join(array('lisc'=>'sinistro.liquidacoes_itens_segurados_coberturas'), 'lisc.id_liquidacao = l.id and lisc.fl_dependente = false', array('lisc.id_item_segurado', 'lisc.id_cobertura'));
        $Select->join(array('lisclf'=>'sinistro.liquidacoes_itens_segurados_coberturas_lf'), 'lisclf.id_liquidacoes_itens_segurados_coberturas = lisc.id', array('lisclf.vl_prejuizo','id as id_liquidacoes_itens_segurados_coberturas_lf'));
        $Select->join(array('lfis'=>'sinistro.laudos_finais_itens_segurados'), 'lfis.id = lisclf.id_laudo_final_item_segurado', array('lfis.vl_percent_perdas','lfis.vl_percent_colhido'));
        $Select->join(array('c'=>'produto.coberturas'), 'c.id = lisc.id_cobertura', 'c.ds_nome_cobertura');
        $Select->where('l.id = ?', $id_liquidacao);
        $Select->order(array('l.id', 'lisclf.id'));

        $Rows = $this->fetchAll($Select);

        $result['vl_area_total'] = 0;
        $result['vl_lmga_total'] = 0;

        if ($Rows){

            $LiquidacaoItensSegurados = $Rows->toArray();
            foreach ($LiquidacaoItensSegurados as $LiquidacaoItemSegurado) {

                // Busca informações da liquidação: prejuizo por item segurado/laudo/cobertura dependente
                $Select = $this->select()->setIntegrityCheck(false);
                $Select->from(array('liscd'=>'sinistro.liquidacoes_itens_segurados_coberturas_lf_dependentes'), array('liscd.vl_prejuizo', 'liscd.vl_percent_perdas'));
                $Select->join(array('lisc'=>'sinistro.liquidacoes_itens_segurados_coberturas'), 'lisc.id = liscd.id_liquidacoes_itens_segurados_coberturas', array('lisc.vl_indenizacao'));
                $Select->join(array('c'=>'produto.coberturas'), 'c.id = lisc.id_cobertura', 'c.ds_nome_cobertura');
                $Select->where('liscd.id_liquidacoes_itens_segurados_coberturas_lf = ?', $LiquidacaoItemSegurado['id_liquidacoes_itens_segurados_coberturas_lf']);
                $Select->order(array('liscd.nr_prioridade'));

                $Rows = $this->fetchAll($Select);
                if ($Rows) {
                    $LiquidacaoCoberturasDependentes = $Rows->toArray();
                    $LiquidacaoItemSegurado['liquidacoes_dependentes'] = array();
                    foreach ($LiquidacaoCoberturasDependentes as $LiquidacaoCoberturaDependente) {
                        $LiquidacaoItemSegurado['liquidacoes_dependentes'][] = $LiquidacaoCoberturaDependente;

                    }
                }


                $result['itens_segurados'][$LiquidacaoItemSegurado['id_item_segurado']]['liquidacoes'][] = $LiquidacaoItemSegurado;
                //$result['itens_segurados'][$LiquidacaoItemSegurado['id_item_segurado']]['vl_prejuizo_total'] += $LiquidacaoItemSegurado['vl_prejuizo'];

            }

            $ModelItensSegurados = new Seguro_Model_ItensSegurados();

            foreach ($result['itens_segurados'] as $id_item_segurado=>$liquidacao_item_segurado) {
                $ItemSegurado = $ModelItensSegurados->getItemSeguradoById($id_item_segurado);
                $result['itens_segurados'][$id_item_segurado]['id_item_segurado'] = $id_item_segurado;
                $result['itens_segurados'][$id_item_segurado]['nr_item_segurado'] = $ItemSegurado['nr_item_segurado'];
                $result['itens_segurados'][$id_item_segurado]['ds_item_segurado'] = $ItemSegurado['ds_item_segurado'];
                $result['itens_segurados'][$id_item_segurado]['vl_area'] = $ItemSegurado['vl_area'];
                $result['itens_segurados'][$id_item_segurado]['vl_lmga'] = $ItemSegurado['vl_lmga'];
                $result['itens_segurados'][$id_item_segurado]['ds_nome_variedade'] = $ItemSegurado['ds_nome_variedade'];

                $result['vl_lmga_total'] += $ItemSegurado['vl_lmga'];
                $result['vl_area_total'] += $ItemSegurado['vl_area'];

            }
        }

        return $result;

    }

	public function getLaudosLiquidados($id_liquidacao, $id_item_segurado){
		$Laudos = false;

    	$Select = $this->select()->setIntegrityCheck(false);

    	$Select->from(array("lis"=>"sinistro.liquidacoes_laudos_finais_itens_segurados"), array("lis.vl_prejuizo", 'lis.vl_indenizacao'));

    	$Select->joinInner(array("lfis"=>"sinistro.laudos_finais_itens_segurados"), "lfis.id = lis.id_laudo_final_item_segurado", false);
    	$Select->joinInner(array("lf"=>"sinistro.laudos_finais"), "lf.id = lfis.id_laudo_final", false);
    	$Select->joinInner(array("pc"=>"produto.produtos_coberturas"), "pc.id_cobertura = lf.id_cobertura", false);
    	$Select->joinInner(array("c"=>"produto.coberturas"), "pc.id_cobertura = c.id", "c.ds_nome_cobertura");

    	$Select->where("lis.id_liquidacao = $id_liquidacao");
    	$Select->where("lfis.id_item_segurado = $id_item_segurado");

    	$Row = $this->fetchAll($Select);

    	if($Row){
			$ArrLaudos = $Row->toArray();

			$Laudos = array();
			foreach ($ArrLaudos as $laudo){
				$laudo["dependente"] = false;

				$Laudos[] = $laudo;

			}
		}

    	return $Laudos;

	}

	public function beforeDelete($idLiquidacao) {
		$ModelLiquidacoesItensSeguradosCoberturas = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();
		$ModelLiquidacaoItensSeguradosCoberturasLf = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLF();
		$ModelLiquidacaoItensSeguradosCoberturasLfDependente = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLFDependentes();

		$RowLISC = $ModelLiquidacoesItensSeguradosCoberturas->fetchAll("id_liquidacao = $idLiquidacao");

		foreach ($RowLISC as $Item){
			$ModelLiquidacaoItensSeguradosCoberturasLfDependente->delete($Item->id, "id_liquidacoes_itens_segurados_coberturas");
			$ModelLiquidacaoItensSeguradosCoberturasLf->delete($Item->id, "id_liquidacoes_itens_segurados_coberturas");
		}


		$ModelLiquidacoesItensSeguradosCoberturas->delete($idLiquidacao, "id_liquidacao");
	}

	public function getLiquidacoesByProcessoCobertura($idProcesso, $cobertura) {
	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('l'=>'sinistro.liquidacoes'),array('l.id as id_liquidacao',"to_char(l.dt_criacao,'DD/MM/YYYY') as dt_realizada_em","l.id_status as id_status"));
	    $Select->join(array('lic'=>'sinistro.liquidacoes_itens_segurados_coberturas'), 'lic.id_liquidacao = l.id', false);
	    $Select->where('l.id_processo = ?', $idProcesso);

	    if(is_array($cobertura)) {
	        $ids_coberturas = implode(',',$cobertura);
	        $Select->where("lic.id_cobertura in ($ids_coberturas)");
	    } else {
	        $Select->where('lic.id_cobertura = ', $cobertura);
	    }

	    $Select->group(array('l.id','l.dt_criacao','l.id_status'));

	    return $this->fetchAll($Select);
	}

	public function getStatusLiquidacao($idLiquidacao){
	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('s'=>'sistema.status'),array('s.ds_status as ds_status','s.ds_chave as ds_chave'));
	    $Select->join(array('l'=>'sinistro.liquidacoes'), 'l.id_status = s.id', false);
	    $Select->where('s.id_tipo_status = ?', 9);
	    $Select->where('l.id = ?', $idLiquidacao);

	    $Row = $this->getAdapter()->fetchRow($Select);

	    return ($Row ? $Row : false);
	}

	public function atualizaStatusLiquidacao($idLiquidacao,$idStatus){
		$hoje = Zend_Date::now();
		$hoje = Agro_Util::formatDate($hoje,Zend_Date::W3C);
		$User = Zend_Auth::getInstance()->getIdentity();

		$InsertStatus = new Sinistro_Model_LiquidacoesStatus();
		$InsertStatus->save($idLiquidacao,$idStatus);

		$update = "UPDATE sinistro.liquidacoes SET id_status = '".$idStatus."', dt_alteracao='".$hoje."',id_usuario_alteracao='".$User->id."' WHERE id='".$idLiquidacao."'";
		return $this->_db->query($update);
	}

	public function getListaLiquidacoes($id_proposta, $id_processo){
		$Status = new Sistema_Model_Status();
		$LiqCob = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();

		$list = array();

		$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array("l"=>"sinistro.liquidacoes"), array(
    		'*',
			new Zend_Db_Expr("
				(
		            select
		            	to_char(ls.dt_criacao, 'DD/MM/YYYY HH24:MI')
		            from
		            	sinistro.liquidacoes_status ls,
		            	sistema.status st
		            where
		            	ls.id_liquidacao = l.id and
		            	st.id = ls.id_status and
		            	st.ds_chave = 'ENVIADA_SEGURADORA'
		            order by
		            	ls.dt_criacao desc
		            limit 1
		        ) as dt_envio_seguradora
			")
    	));
    	$Select->joinInner(array("s"=>"sistema.status"), "l.id_status = s.id", "ds_status");
    	$Select->joinInner(array("p"=>"sinistro.processos"), "l.id_processo = p.id", false);
    	$Select->joinLeft(array("lc"=>"sinistro.liquidacoes_canceladas"), "lc.id_liquidacao = l.id", false);
    	$Select->where("l.id_processo = $id_processo");
    	$Select->where("p.id_proposta = $id_proposta");
    	$Select->where("lc.id_liquidacao IS NULL");
		$Select->where("l.id_status IN ({$Status->getIdStatus("ENVIADA_SEGURADORA", "LIQUIDACOES")},
                                        {$Status->getId("INDENIZACAO_PAGA", "LIQUIDACOES")},
                                        {$Status->getId("SEM_INDENIZACAO", "LIQUIDACOES")})");

		$Row = $this->fetchAll($Select);

		if ($Row){
			foreach($Row as $item){
				$list[] = array(
					"id" => $item->id,
					"cobertura" => implode(", ", $LiqCob->getCoberturas($item->id)),
					"indenizacao" => Agro_Util::formatDbCurrency($LiqCob->getTotalIndenizacao($item->id)),
					"status" => $item->ds_status,
					"dt_envio_seguradora" => $item->dt_envio_seguradora,
					"arquivo" => $item->ds_arquivo_liquidacao_manual
				);
			}
		}
		return $list;
	}


	public function deleteItemSeguradoCobertura($idLiquidacao,$idItemSegurado){
		$ModelLiquidacaoItensSeguradosCoberturas = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();
		$ModelLiquidacaoItensSeguradosCoberturasLf = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLF();
		$ModelLiquidacaoItensSeguradosCoberturasLfDependente = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLFDependentes();

		$Item = $ModelLiquidacaoItensSeguradosCoberturas->getDefaultAdapter()->fetchOne("SELECT id FROM sinistro.liquidacoes_itens_segurados_coberturas WHERE id_liquidacao = ".$idLiquidacao." AND id_item_segurado = ".$idItemSegurado);

		$ModelLiquidacaoItensSeguradosCoberturasLfDependente->delete($Item, "id_liquidacoes_itens_segurados_coberturas");
		$ModelLiquidacaoItensSeguradosCoberturasLf->delete($Item, "id_liquidacoes_itens_segurados_coberturas");

		return $ModelLiquidacaoItensSeguradosCoberturas->delete($Item);
	}

	public function getArquivoLiquidacao($idLiquidacao){
		$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array("l"=>"sinistro.liquidacoes"),'ds_arquivo_liquidacao_manual');
    	$Select->where("l.id = $idLiquidacao");

		return $this->_db->fetchOne($Select);
	}

	public function savePagamento($dados){
		$Row = $this->getRow($dados['id_liquidacao']);
		$Row->dt_pagamento = Agro_Util::formatDate($dados['dt_pagamento'],Zend_Date::W3C);
		$Row->vl_pagamento = Agro_Util::formatCurrencyDb($dados['vl_pagamento']);
		$Row->dt_confirmacao_pagamento = $dados['dt_confirmacao_pagamento'] ? Agro_Util::formatDate($dados['dt_confirmacao_pagamento'],Zend_Date::W3C) : null;
		$Row->fl_subvencao_descontada = ($dados['fl_subvencao_descontada'] ? 1 : 0);

		return $Row->save();
	}

	public function getDadosPagto($idLiquidacao){
		$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array("l"=>"sinistro.liquidacoes"), array('dt_pagamento','vl_pagamento','dt_confirmacao_pagamento', 'fl_subvencao_descontada'));
    	$Select->where("l.id = $idLiquidacao");

    	return $this->_db->fetchRow($Select);

	}

}




