<?php

class Endosso_Model_Proposta_Coberturas extends Agro_Db_Table_Propostas {
	protected $_primary = array('id_proposta', 'id_cobertura');
	protected $_name = 'propostas_coberturas';
	protected $_schema = 'seguro';

	public function add($idProposta, $row) {
		$Row = $this->createRow();

		$Row->id_proposta = $idProposta;
		$Row->id_cobertura = $row['id_cobertura'];
		$Row->fl_principal = $row['fl_principal'] ? 1 : 0;
		$Row->vl_franquia = $row['vl_franquia'];
		$Row->vl_taxa = $row['vl_taxa'];
		$Row->vl_taxa_bi = $row['vl_taxa_bi'];
		$Row->vl_premio = $row['vl_premio'];
		$Row->vl_lmi = $row['vl_lmi'];
		$Row->id_usuario_criacao = $row['id_usuario_criacao'];
		$Row->id_usuario_alteracao = $row['id_usuario_alteracao'];
		$Row->fl_ativo = $row['fl_ativo'] ? 1 : 0;
		$Row->fl_del = $row['fl_del'] ? 1 : 0;

		return $Row->save();
	}

	public function save($params) {
		$this->getAdapter()->beginTransaction();

		$Propostas = new Endosso_Model_Propostas();
		$Proposta = $Propostas->find($params['id_proposta'])->current();
		
		try {
			if ($params['id_proposta']) {
				$this->getDefaultAdapter()->query("DELETE from seguro.propostas_coberturas WHERE id_proposta = {$params['id_proposta']}");

				if (is_array($params['coberturas'])) {
					foreach ($params['coberturas'] as $cobertura) {
						
						if ($cobertura['id_cobertura']) {
							
							$vl_taxa_bi = 0;
							if(((Agro_Util::formatCurrencyDb($cobertura['vl_premio']) / $Proposta->lmga()) * 100) != $cobertura['vl_taxa']){
								$vl_taxa_bi = round((Agro_Util::formatCurrencyDb($cobertura['vl_premio']) / $Proposta->lmga()) * 100, 8);
							}
							
							$Row = $this->createRow();
							
							$Row->vl_premio = !empty($cobertura['vl_premio']) ? Agro_Util::formatCurrencyDb($cobertura['vl_premio']) : '0.00';
							$Row->fl_principal = ($cobertura['fl_principal'] ? 't' : 'f');
							$Row->id_cobertura = $cobertura['id_cobertura'];
							$Row->vl_franquia  = $cobertura['vl_franquia'] ? $cobertura['vl_franquia'] : '0.0';
							$Row->id_proposta  = $params['id_proposta'];
							$Row->vl_taxa      = !empty($cobertura['vl_taxa']) ? $cobertura['vl_taxa'] : '0.000000';
							$Row->vl_taxa_bi   = ($vl_taxa_bi ? $vl_taxa_bi : $Row->vl_taxa);
							$Row->vl_lmi       = !empty($cobertura['vl_lmi']) ? $cobertura['vl_lmi'] : '0.000';
							$Row->fl_ativo     = true;
							$Row->fl_del       = 'f';

							// Salva a(s) cobertura(s)
							try {
								$Row->save();
							} catch (Exception $e) {
								die($e);
								$this->setMessage("Não foi possível salvar as Coberturas");
								$this->getAdapter()->rollBack();
								return false;
							}
								
						}
					}
				}
			}

			// Salva a parcela unica
			try {
				$parcela = $this->gera_parcela_unica($params['id_proposta']);
				$this->save_parcela($Row->id_proposta, $parcela[0]);
			} catch (Exception $e) {
				die($e);
				$this->setMessage("Não foi possível gerar o Parcelamento");
				$this->getAdapter()->rollBack();
				return false;
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->query("update seguro.propostas_endosso set dt_alteracao = 'now()', fl_coberturas_atualizadas = true where id_endosso = {$Proposta->id_endosso}");

			$this->getAdapter()->commit();
			return true;
		} catch (Exception $e) {
			$this->getAdapter()->rollBack();
			return false;
		}
	}

	public function save_parcela($id_proposta, $parcela) {
		if ($id_proposta) {
			$Parcelas = new Endosso_Model_Proposta_Parcelas();
			$Parcelas->clear($id_proposta);

			if (is_array($parcela)) {
				return $Parcelas->add($id_proposta, $parcela);
			}
		}

		return false;
	}

	public function gera_parcela_unica($id_proposta, $options=array()) {
		$Parcelas = new Endosso_Model_Proposta_Parcelas();
		$Propostas = new Endosso_Model_Propostas();
		$return = false;

		try {
			if ($id_proposta) {
				$Endosso = $Propostas->find($id_proposta)->current();
				$Original = $Propostas->find($Endosso->id_proposta_endossada)->current();

				if ($Endosso && $Original) {
					$parcela = $Endosso->premio_liquido() - $Original->premio_liquido();
					$apolice = $Original->apolice();

					if (($parcela < 0) or $Endosso->endossoReducao()) {
						$apolice = 0;
					}
					
					$Questionario  = $Endosso->questionario();
					foreach($Questionario as $questionario) {
						
						if($options['calc_subvencao_federal']){
							if($questionario['ds_chave_rn'] == 'QUEST_SUBVENCAO_FEDERAL') {
								if($Endosso->resposta($questionario['ds_chave_rn']) == 0) {
									$options['calc_subvencao_federal'] = false;
									if($Original->subvencao_federal() > 0){
										$parcela += $Original->subvencao_federal();
									}								
								}
							}
						}
						
						if($options['calc_subvencao_estadual']){
							if($questionario['ds_chave_rn'] == 'QUEST_SUBVENCAO_ESTADUAL') {
								if($Endosso->resposta($questionario['ds_chave_rn']) == 0) {
									$options['calc_subvencao_estadual'] = false;
									if($Original->subvencao_estadual() > 0){
										$parcela += $Original->subvencao_estadual();
									}
								}
							}
						}
					}				

					$dados = array(
						'custo_apolice' => 0,
						'premio_liquido' => $parcela,
						'premio_pagar' => $parcela + $apolice,
						'calc_subvencao_federal' => $options['calc_subvencao_federal'],
						'calc_subvencao_estadual' => $options['calc_subvencao_estadual'],
					);

					if($options['parcelas_endosso'] > 0){
						$parcelas_endosso = $options['parcelas_endosso'];
					} else {
						$parcelas_endosso = 1;
					}
						
					$parcelas = Agro_Regras::RN_CALC_ENDOSSO($dados, $parcelas_endosso, date('Y-m-d'), $Endosso);
					
					if (array_key_exists('status', $parcelas) && !$parcelas['status']) {
						$this->setMessage($parcelas['msg']);
						return false;
					}

					if (is_array($parcelas['itens'])) {
						$count = 1;
						foreach ($parcelas['itens'] as $parcela) {
							$arParcelas[] = array(
								'nr_parcela' => $count,
								'vl_total' => Agro_Util::formatCurrencyDb($parcela['premio_liquido']),
								'vl_segurado' => Agro_Util::formatCurrencyDb($parcela['premio_segurado']),
								'vl_subvencao_federal' => Agro_Util::formatCurrencyDb($parcela['premio_federal']),
								'vl_subvencao_estadual' => Agro_Util::formatCurrencyDb($parcela['premio_estadual']),
								'dt_vencimento' => Agro_Util::formatDate($parcela['vencimento'], Zend_Date::W3C),
							 	'id_usuario_criacao' => $Original->id_usuario_criacao,
	    						'id_usuario_alteracao' => $Original->id_usuario_alteracao
							);
							$count++;
						}
						
						return $arParcelas;
					}
					
				} else {
					$this->setMessage('Não foi possivel gerar o parcelamento');
					return false;
				}
			}

			return $return;
		} catch (Exception $e) {
			die($e);
		}
	}
}