<?

class Sinistro_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']);
		$ModelProcesso = new Sinistro_Model_Processos();
		$ModelProposta = new Seguro_Model_Propostas();

		if($dados['id_status']){

			$RowProcesso = $ModelProcesso->getRow($Row->id_processo);
			$Proposta    = $ModelProposta->get($RowProcesso->id_proposta);
			
			$arDatas[] = $this->_db->fetchOne("select sinistro.liq_ultimo_aviso_encerramento(".$dados['id_liquidacao'].")");
			$arDatas[] = $this->_db->fetchOne("select sinistro.liq_ultimo_doc_segurado('".$Row->id_processo."')");
			
			$Beneficiarios = $Proposta->beneficiarios();
			
			//verifica se a liquidação tem direito a indenização de beneficiário
			if($this->_db->fetchOne("select count(*) from sinistro.liquidacoes_itens_segurados_coberturas where id_liquidacao=".$dados['id_liquidacao']." and (id_cobertura=16 or id_cobertura=5 or id_cobertura=11)") > 0){
				$flIndenizacaoBeneficiario = false;
			} else {
				$flIndenizacaoBeneficiario = true;
			}
			
			if(is_array($Beneficiarios) && $flIndenizacaoBeneficiario==true){		
				foreach($Beneficiarios as $benef){
					unset($date);
					$date = str_replace('/', '-', $benef['dt_ultimo_arquivo_beneficiario']);
					$arDatas[] = date('Y-m-d',strtotime($date));
				}					
			}

			$dt_ultima_data = max($arDatas);
			$Row->dt_base_pagamento = $dt_ultima_data;
			$Row->id_status = $dados['id_status'];
			$id = $Row->save();

			$Status = new Sinistro_Model_LiquidacoesStatus();
			$Status->save($id, $Row->id_status, $dados['ds_observacao']);

		}else{

			$Row->id_processo = ($dados["id_processo"] ? $dados["id_processo"] : $Row->id_processo);
			$Row->tp_liquidacao = ($dados["tp_liquidacao"] ? $dados["tp_liquidacao"] : $Row->tp_liquidacao);
			$Row->id_tipo_liquidacao = ($dados["id_tipo_liquidacao"] ? $dados["id_tipo_liquidacao"] : $Row->id_tipo_liquidacao);
			$Row->ds_observacao = ($dados["ds_observacao"] ? $dados["ds_observacao"] : $Row->ds_observacao);

			$id = $Row->save();

			if ($id) {
				$Status = new Sinistro_Model_LiquidacoesStatus();
				$Status->save($id, Agro_Util::getIdStatus("AGUARDANDO_REVISAO"));
				
				$RowProcesso = $ModelProcesso->getRow($Row->id_processo);
				$RowProcesso->id_usuario_responsavel_liquidacao = Zend_Auth::getInstance()->getIdentity()->id;

				$RowProcesso->save();

			}
		}

		return $id;
	}

	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");

		$Select->order('iset.id');

		$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 getPercentConvertido($vlPercentPerdas) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('aux' => 'sinistro.auxiliar_liquidacao_uva_mesa_conversao'), 'aux.vl_percent_correcao');
		$Select->where('? between aux.vl_percent_perdas_min and aux.vl_percent_perdas_max', $vlPercentPerdas);

		return $this->_db->fetchOne($Select);
	}
	
	public function getPropostaByLiquidacao($id_liquidacao) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('l' => 'sinistro.liquidacoes'),null);
		$Select->join(array('pc' => 'sinistro.processos'), 'pc.id = l.id_processo', 'pc.id_proposta');
		$Select->where("l.id = ?", $id_liquidacao);
		return $this->_db->fetchOne($Select);
	}
	
	public function getLiquidacao($id_liquidacao) {
		$ModelProposta = new Seguro_Model_Propostas();

		$result = array();

		//Busca informações da proposta e do processo
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('l' => 'sinistro.liquidacoes'), array('l.id as id_liquidacao', 'l.id_tipo_liquidacao', 'l.tp_liquidacao',"l.ds_observacao"));
		$Select->join(array('pc' => 'sinistro.processos'), 'pc.id = l.id_processo', array('pc.id as id_processo', 'pc.id_proposta'));
		$Select->join(array('tl' => 'sinistro.tipo_liquidacao'), 'tl.id = l.id_tipo_liquidacao', array('tl.ds_chave as tipo_liquidacao'));
		$Select->where("l.id = ?", $id_liquidacao);

		$Row = $this->fetchRow($Select);

		foreach ($Row as $key => $value) {
			$result[$key] = $value;
		}

		$Proposta = $ModelProposta->find($result["id_proposta"])->current();
		$Produto = $Proposta->produto();

		//Busca informações do rodapé
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('l' => 'sinistro.liquidacoes'), array('id_usuario_criacao', 'dt_criacao'));
		$Select->where("l.id = ?", $id_liquidacao);

		$Row = $this->fetchRow($Select);

		$Model = new Sistema_Model_Usuarios();
		$usuario = $Model->getUsuarioById($Row->id_usuario_criacao);
		$result['responsavel'] = $usuario;
		$result['data'] = $Row->dt_criacao;

		// 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.vl_percent_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->join(array("ise" => "seguro.itens_segurados"), "ise.id = lisc.id_item_segurado", false);
		$Select->where('l.id = ?', $id_liquidacao);
		$Select->order(array('l.id', 'ise.nr_item_segurado'));

		$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_prejuizo_total' => $LiquidacaoItemSeguradoCobertura['vl_prejuizo_total'],
					'vl_indenizacao' => ($LiquidacaoItemSeguradoCobertura['vl_indenizacao'] > 0 ? $LiquidacaoItemSeguradoCobertura['vl_indenizacao'] : 0),
					'vl_percent_indenizacao' => ($LiquidacaoItemSeguradoCobertura['vl_percent_indenizacao'] > 0 ? $LiquidacaoItemSeguradoCobertura['vl_percent_indenizacao'] : 0)
				);

				$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'] > 0 ? $LiquidacaoItemSeguradoCobertura['vl_indenizacao'] : 0);
				$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', 'lisclf.vl_percent_dano'));
		$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', 'lfis.vl_percent_perdas_chocho', 'lfis.vl_percent_colhido_chocho'));
		$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', 'vl_percent_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;
					}
				}

				if (in_array($Produto['ds_chave_produto'], array('UVA_MESA_TABELA_II', 'UVA_MESA_TABELA_II_S2', 'UVA_VINHO_TABELA_II'))) {
					$LiquidacaoItemSegurado['percentual_convertido'] = $this->getPercentConvertido($LiquidacaoItemSegurado['vl_percent_perdas']);
				} else {
					$LiquidacaoItemSegurado['percentual_convertido'] = false;
				}

				$result['itens_segurados'][$LiquidacaoItemSegurado['id_item_segurado']]['liquidacoes'][] = $LiquidacaoItemSegurado;
			}

			$ModelItensSegurados = new Seguro_Model_ItensSegurados();
			$ModelItensSeguradoComp = new Seguro_Model_ItensSeguradosComplementos();

			foreach ($result['itens_segurados'] as $id_item_segurado => $liquidacao_item_segurado) {

				$ItemSegurado = $ModelItensSegurados->getItemSeguradoById($id_item_segurado);
				$ISC = $ModelItensSeguradoComp->find($id_item_segurado)->current();
				$IS = $ModelItensSegurados->find($id_item_segurado)->current();

				$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_area_atingida'] = ($this->getAreaAtingida($id_liquidacao, $id_item_segurado) ? $this->getAreaAtingida($id_liquidacao, $id_item_segurado) : $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['itens_segurados'][$id_item_segurado]['dt_encerramento_colheita'] = $ItemSegurado['dt_encerramento_colheita'];

				if ($Proposta->isPg() && $result["tipo_liquidacao"] != "LIQ05") {
					$result['itens_segurados'][$id_item_segurado]['vl_producao_garantida'] = $ISC["vl_producao_garantida"];
					$result['itens_segurados'][$id_item_segurado]['vl_rendimento_final_lavoura'] = $this->getRendimentoFinalLavoura($id_liquidacao, $id_item_segurado);
				}

				$result['vl_lmga_total'] += $ItemSegurado['vl_lmga'];
				$result['vl_area_total'] += $ItemSegurado['vl_area'];
			}
		}

		return $result;
	}

	public function getAreaAtingida($id_liquidacao, $id_item_segurado) {
		$sql = "
    		SELECT
				max(lfis.id),
			    lfis.vl_ha_area_afetada
			FROM
				sinistro.liquidacoes_itens_segurados_coberturas_lf lisclf inner join
			    sinistro.laudos_finais_itens_segurados lfis on lfis.id = lisclf.id_laudo_final_item_segurado inner join
			    sinistro.liquidacoes_itens_segurados_coberturas lisc on lisc.id = lisclf.id_liquidacoes_itens_segurados_coberturas inner join
			    sinistro.liquidacoes l on l.id = lisc.id_liquidacao
			WHERE
				(l.id = $id_liquidacao) AND
			    (lfis.id_item_segurado = $id_item_segurado)
			group by
				vl_ha_area_afetada";

		$Row = $this->_db->fetchRow($sql);

		return ($Row["vl_ha_area_afetada"] ? $Row["vl_ha_area_afetada"] : false);
	}

	public function getRendimentoFinalLavoura($id_liquidacao, $id_item_segurado) {
		$sql = "
    		SELECT
				max(lfis.id_item_segurado),
			    lfis.vl_rendimento_final_lavoura
			FROM
				sinistro.liquidacoes_itens_segurados_coberturas_lf lisclf inner join
			    sinistro.laudos_finais_itens_segurados  lfis on lfis.id = lisclf.id_laudo_final_item_segurado inner join
			    sinistro.liquidacoes_itens_segurados_coberturas lisc on  lisc.id = lisclf.id_liquidacoes_itens_segurados_coberturas inner join
				sinistro.liquidacoes l on l.id = lisc.id_liquidacao

			WHERE
				(l.id = $id_liquidacao) AND
			    (lfis.id_item_segurado = $id_item_segurado)
			group by
				vl_rendimento_final_lavoura";

		$Row = $this->_db->fetchRow($sql);

		return $Row["vl_rendimento_final_lavoura"];
	}

	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", array("lfis.vl_rendimento_final_lavoura"));
		$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($dados) {

		try {
			$ModelLiquidacoesCanceladas = new Sinistro_Model_LiquidacoesCanceladas();
			$ModelLiquidacoesCanceladas->save($dados);

			$ModelLiquidacoesItensSeguradosCoberturas = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();
			$ModelLiquidacaoItensSeguradosCoberturasLf = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLF();
			$ModelLiquidacaoItensSeguradosCoberturasLfDependente = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLFDependentes();
			$ModelLiquidacoesStatus = new Sinistro_Model_LiquidacoesStatus();
			$ModelLiquidacoesStatus->delete($dados['id_liquidacao'], 'id_liquidacao');

			$RowLISC = $ModelLiquidacoesItensSeguradosCoberturas->fetchAll("id_liquidacao = " . $dados["id_liquidacao"]);

			foreach ($RowLISC as $Item) {
				$ModelLiquidacaoItensSeguradosCoberturasLfDependente->delete($Item->id, "id_liquidacoes_itens_segurados_coberturas");
				$ModelLiquidacaoItensSeguradosCoberturasLf->delete($Item->id, "id_liquidacoes_itens_segurados_coberturas");
			}

			$ModelLiquidacoesItensSeguradosCoberturas->delete($dados['id_liquidacao'], "id_liquidacao");

			return true;
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	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", "l.ds_arquivo_liquidacao_manual as arquivo", "id_tipo_liquidacao"));
		$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 {
			if ($cobertura) {
				$Select->where('lic.id_cobertura = ', $cobertura);
			}
		}

		$Select->group(array('l.id', 'l.dt_criacao', 'l.id_status', 'l.ds_arquivo_liquidacao_manual', 'id_tipo_liquidacao'));

		return $this->fetchAll($Select);
	}

	public function getLiquidacoesAvulsasByProcessoCobertura($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", "l.ds_arquivo_liquidacao_manual as arquivo", "id_tipo_liquidacao"));
		$Select->join(array('lic' => 'sinistro.liquidacoes_itens_segurados_coberturas'), 'lic.id_liquidacao = l.id', array("id_cobertura"));
		$Select->where('l.id_processo = ?', $idProcesso);

		if (is_array($cobertura)) {
			$ids_coberturas = implode(',', $cobertura);
			$Select->where("lic.id_cobertura in ($ids_coberturas)");
		} else {
			if ($cobertura) {
				$Select->where('lic.id_cobertura = ', $cobertura);
			}
		}
		
		$Select->group(array('l.id', 'l.dt_criacao', 'l.id_status', 'l.ds_arquivo_liquidacao_manual', 'id_tipo_liquidacao', 'id_cobertura'));
		
		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) {
		$User = Zend_Auth::getInstance()->getIdentity();
		$Status = new Sinistro_Model_LiquidacoesStatus();
		$ModelLiquidacao = new Sinistro_Model_Liquidacoes();

		if ($Status->save($idLiquidacao, $idStatus)) {
			$Liquidacao = $ModelLiquidacao->find($idLiquidacao)->current();
			$Liquidacao->id_status = $idStatus;
			$Liquidacao->dt_alteracao = Zend_Date::now();
			$Liquidacao->id_usuario_alteracao = $User->id;

			return $Liquidacao->save();
		}
	}

	public function getListaLiquidacoes($id_proposta, $id_processo) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array("l" => "sinistro.liquidacoes"));
		$Select->joinInner(array("p" => "sinistro.processos"), "l.id_processo = p.id", false);
		$Select->where("l.id_processo = $id_processo");
		$Select->where("p.id_proposta = $id_proposta");

		return $this->fetchAll($Select);
	}

	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 saveArquivoLiquidacao($arquivo, $idLiquidacao) {
		$Row = $this->getRow($idLiquidacao);
		$Row->ds_arquivo_liquidacao_manual = $arquivo;

		return $Row->save();
	}

	public function getArquivosBeneficiario($idLiquidacao) {

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array("l" => "sinistro.liquidacoes"), false);
		$Select->joinInner(array("p" => "sinistro.processos"), "l.id_processo = p.id", false);
		$Select->joinInner(array("pb" => "seguro.propostas_beneficiarios"), "pb.id_proposta = p.id_proposta", false);
		$Select->joinInner(array("b" => "seguro.beneficiarios"), "b.cpf_cnpj = pb.nr_cpf_cnpj", false);
		$Select->joinInner(array("ba" => "seguro.beneficiarios_arquivos"), "ba.id_beneficiario = b.id", array('id', 'ds_nome_arquivo'));
		$Select->where("l.id = ?", $idLiquidacao);
		$Select->where("b.id_status_arquivos = 108");
		$Select->where("ba.fl_ativo = true");

		return $this->fetchAll($Select)->toArray();
	}

	public function getArquivoLiquidacao($idLiquidacao) {

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array("l" => "sinistro.liquidacoes"), array('id', 'ds_arquivo_liquidacao_manual'));
		$Select->where("l.id = $idLiquidacao");

		return $this->fetchAll($Select)->toArray();
	}

	public function deleteArquivoLiquidacao($idLiquidacao) {
		$update = "UPDATE sinistro.liquidacoes SET id_usuario_alteracao = ".$User->id.", ds_arquivo_liquidacao_manual = null WHERE id='" . $idLiquidacao . "'";
		return $this->_db->query($update);
	}

	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;

		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'));
		$Select->where("l.id = $idLiquidacao");

		return $this->_db->fetchRow($Select);
	}*/

	/**
	 * @name getCoberturasLiqManual
	 * @desc No caso da cobertura passada como parâmetro ser a cobertura principal
	 * 		 retorna todas as coberturas que tiverem o mesmo tipo de liquidação dela
	 *       ou não forem exibidas na regulação de perda. Caso contrario retorna a
	 *       cobertura passada pois de acordo com as regras, esta deve possuir uma
	 *       liquidação individual.
	 * @param $id_proposta
	 * @param $id_cobertura
	 * @author Vinicius Berni
	 * @since 13/07/2011
	 */
	public function getCoberturasLiqManual($id_proposta, $id_cobertura) {
		$ModelProposta = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		$Proposta = $ModelProposta->find($id_proposta)->current();
		$ProdutoCobertura = $ModelProdutoCobertura->find($Proposta->id_produto, $id_cobertura)->current();

		if ($ProdutoCobertura->fl_cobertura_principal) {
			$sql = "
				select
					c.id as id_cobertura,
					c.ds_nome_cobertura
				from
					seguro.propostas p inner join
				    produto.produtos_coberturas pc on pc.id_produto = p.id_produto inner join
				    produto.coberturas c on c.id = pc.id_cobertura
				where
					p.id = $id_proposta and
				    (
				       (pc.id_tipo_liquidacao in (
				       		select
				            	prc.id_tipo_liquidacao
				            from
				            	produto.produtos_coberturas  prc
				            where
				               prc.id_produto = p.id_produto and
				               prc.fl_cobertura_principal = TRUE
				            )
				       ) or (
				       		pc.fl_exibir_regulacao_perdas = FALSE
				       ) or (
				        	pc.id_tipo_liquidacao is null and pc.fl_exibir_regulacao_perdas = TRUE
				        )
				    ) and (
				    	pc.id_cobertura in (
				    		select prc.id_cobertura from seguro.propostas_coberturas prc where prc.id_proposta = $id_proposta
				    	)
				    )
				order by
					pc.fl_cobertura_principal desc,
				    c.ds_nome_cobertura
			";
		} else {
			$sql = "
				select
					c.id as id_cobertura,
					c.ds_nome_cobertura
				from
				    produto.coberturas c
				where
					c.id = $id_cobertura and
				    c.id in (
				    		select prc.id_cobertura from seguro.propostas_coberturas prc where prc.id_proposta = $id_proposta
				  	);
			";
		}
		
		return $this->_db->fetchAll($sql);
	}

	public function getItensLiquidacaoManual($id_proposta, $id_processo, $id_cobertura) {
		$ModelTipoLiquidacao = new Sinistro_Model_TipoLiquidacao();
		$ModelProposta = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();
		$ModelLaudosFinais = new Sinistro_Model_LaudosFinais();

		$Proposta = $ModelProposta->find($id_proposta)->current();
		$ProdutoCobertura = $ModelProdutoCobertura->find($Proposta->id_produto, $id_cobertura)->current();
		$TipoLiquidacao = $ModelProdutoCobertura->getTipoLiquidacao($Proposta->id_produto, $id_cobertura);

		$Select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$Select->from(array("iseg" => "seguro.itens_segurados"), 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("pc" => "seguro.propostas_coberturas"), "pc.id_proposta = iseg.id_proposta", false);
		$Select->where("iseg.id_proposta = ?", $id_proposta);
		$Select->where("pc.id_cobertura = ?", $id_cobertura);

		$Select->order("iseg.id asc");

		$Row = $this->fetchAll($Select);

		$result = array();

		if ($Row) {
			$itens = $Row->toArray();

			foreach ($itens as $iten) {
				if ($ModelLaudosFinais->naoExisteLiquidacaoAnterior($id_processo, $iten['id_item_segurado'], $id_cobertura)) {
					$iten["COBERTURAS"] = $this->getCoberturasLiqManual($id_proposta, $id_cobertura);
					$result[] = $iten;
				}
			}
		}
		return $result;
	}

}

