<?

/**
 * @name Regulacao_Model_LIQ15
 * @desc Liquidação Trigo / GEADA e GRANIZO
 * @author Vinicius Marconi V. Berni
 * @since 30/11/2012
 */
class Regulacao_Model_LIQ15 extends Agro_Db_Table_Abstract {

    protected $_schema = 'sinistro';
    protected $_name = 'tipo_liquidacao';
    protected $_primary = 'id';
    public $_order = 'ds_nome_tipo_liquidacao';
    private $_ModelLiquidacoes;
    private $_ModelLiquidacoesItensSegurados;
    private $_ModelLiquidacoesItensSeguradosCoberturas;
    private $_ModelLiquidacoesItensSeguradosCoberturasLf;
    private $_ModelPropostaCoberturas;
    private $_ModelItemSegurado;
    private $_ModelLfIS;

    public function init() {
        parent::init();

        $this->_ModelLiquidacoes = new Sinistro2_Model_Liquidacoes();
        $this->_ModelLiquidacoesItensSeguradosCoberturas = new Sinistro2_Model_LiquidacoesItensSeguradosCoberturas();
        $this->_ModelLiquidacoesItensSeguradosCoberturasLf = new Sinistro2_Model_LiquidacoesItensSeguradosCoberturasLF();
        $this->_ModelPropostaCoberturas = new Seguro_Model_PropostasCoberturas();
        $this->_ModelItemSegurado = new Seguro_Model_ItensSegurados();
        $this->_ModelLfIS = new Sinistro2_Model_LaudosFinaisItensSegurados();
    }

    public function liquidar($dados) {
        $result = array("status" => true, "message" => "", "execute" => "");

        $avisos = Zend_Db_Table::getDefaultAdapter()->fetchOne("select count(*) from sinistro.avisos where id_proposta = {$dados["id_proposta"]} and id_status = " . Agro_Util::status("ACEITO", "SA"));

        /*
         * Verifica se há mais de 1 aviso. Caso haja, bloqueia...
         */
        if ($avisos > 2) {
            $result["status"] = false;
            $result["message"] = "Esta liquidação não contempla casos com mais de 2 eventos. \nPor favor, liquidar manualmente.";

            /*
             * Se houver mais de 2 laudos, bloqueia...
             */
        } elseif (count($dados["laudos"]) > 2) {
            $result["status"] = false;
            $result["message"] = "Esta liquidação contempla casos que possuam até 2 laudos, para os demais liquidar manualmente.";

            /*
             * Havendo 2 laudos devem ser de coberturas diferentes. Se for igual, bloqueia...
             */
        } elseif ((count($dados["laudos"]) == 2) && ($dados["laudos"][0]["ds_chave_cobertura"] == $dados["laudos"][1]["ds_chave_cobertura"])) {
            $result["status"] = false;
            $result["message"] = "Esta liquidação contempla 2 eventos de coberturas diferentes. Ex.: GRANIZO e GEADA.\nPara 2 eventos de mesma cobertura utilizar a liquidação manual";

            /*
             * Se a cobertura não for GRANIZO ou GEADA, bloqueia...
             */
        } elseif ((count($dados["laudos"]) == 2) && (!in_array($dados["laudos"][0]["ds_chave_cobertura"], array("COB_GEADA", "COB_GRANIZO")) || !in_array($dados["laudos"][1]["ds_chave_cobertura"], array("COB_GEADA", "COB_GRANIZO")))) {
            $result["status"] = false;
            $result["message"] = "Esta liquidação contempla casos de GRANIZO e GEADA, demais coberturas devem ser liquidadas manualmente.";
        } elseif ((count($dados["laudos"]) == 1) && (!in_array($dados["laudos"][0]["ds_chave_cobertura"], array("COB_GEADA", "COB_GRANIZO")) )) {
            $result["status"] = false;
            $result["message"] = "Esta liquidação contempla casos de GRANIZO e GEADA, demais coberturas devem ser liquidadas manualmente.";
        } else {

            Zend_Db_Table::getDefaultAdapter()->beginTransaction();

            try {
                $ItemSegurado = $this->_ModelItemSegurado->find($dados['id_item_segurado'])->current();
                $Liq = $this->_ModelLiquidacoes->find($dados["id_liquidacao"])->current();


                /*
                 * Se for somente 1 evento liquida da maneira simples
                 */
                if (count($dados["laudos"]) == 1 && $avisos == 1) {

                    $LFIS = $this->_ModelLfIS->fetchRow("id=" . $dados["laudos"][0]['id_laudo_final_item_segurado']);
                    /*
                     * Verifica qual é a cobertura para selecionar o calculo
                     */
                    switch ($dados["laudos"][0]["ds_chave_cobertura"]) {

                        case "COB_GEADA":
                            
                            if (max($LFIS->vl_percent_colhido, $LFIS->vl_percent_colhido_chocho) > 0) {
                                $percent_area_remanecente = 100 - max($LFIS->vl_percent_colhido, $LFIS->vl_percent_colhido_chocho);
                                $area_remanescente = $ItemSegurado->vl_area * ($percent_area_remanecente / 100);
                            } else {
                                $area_remanescente = $ItemSegurado->vl_area;
                                $percent_area_remanecente = 100;
                            }

                            $lmga = ($ItemSegurado->vl_lmga * $percent_area_remanecente) / 100;

                            $dano = $this->liquidarGeada($Liq, $ItemSegurado, $dados["laudos"][0], $dados, $LFIS, $lmga);

                            break;

                        case "COB_GRANIZO":
                            
                            $lmga = $ItemSegurado->vl_lmga * round($LFIS->vl_ha_area_afetada / $ItemSegurado->vl_area, 4);
                                                     
                            $this->liquidarGranizo($Liq, $dados["laudos"][0], $dados, $LFIS, $lmga);

                            $lmga_remanecente = $ItemSegurado->vl_lmga * ((100 - $dados["laudos"][0]["percentual_dano"]) / 100);

                            break;
                    }
                } else {
                    /*
                     * Calcula quando houver 2 eventos
                     */

                    $LAUDO01 = $dados["laudos"][0];
                    $LFIS01 = $this->_ModelLfIS->fetchRow("id=" . $dados["laudos"][0]['id_laudo_final_item_segurado']);

                    if ($dados["laudos"][1]) {
                        $LAUDO02 = $dados["laudos"][1];
                        $LFIS02 = $this->_ModelLfIS->fetchRow("id=" . $dados["laudos"][1]['id_laudo_final_item_segurado']);
                    } else {
                        $LAUDO02 = false;
                        $LFIS02 = false;
                    }


                    /*
                     * Calcula Laudo 1
                     */

                    $lmga_remanecente = 0;

                    switch ($LAUDO01["ds_chave_cobertura"]) {
                        
                        case "COB_GRANIZO":

                            $lmga = $ItemSegurado->vl_lmga * round($LFIS01->vl_ha_area_afetada / $ItemSegurado->vl_area, 4);
                                                     
                            $this->liquidarGranizo($Liq, $LAUDO01, $dados, $LFIS01, $lmga);

                            $lmga_remanecente = $ItemSegurado->vl_lmga * ((100 - $LAUDO01["percentual_dano"]) / 100);
                                                       
                         
                            break;

                        case "COB_GEADA":

                            if (max($LFIS01->vl_percent_colhido, $LFIS01->vl_percent_colhido_chocho) > 0) {
                                $percent_area_remanecente = 100 - max($LFIS01->vl_percent_colhido, $LFIS01->vl_percent_colhido_chocho);
                                $area_remanescente = $ItemSegurado->vl_area * ($percent_area_remanecente / 100);
                            } else {
                                $area_remanescente = $ItemSegurado->vl_area;
                                $percent_area_remanecente = 100;
                            }

                            $lmga = ($ItemSegurado->vl_lmga * $percent_area_remanecente) / 100;

                            $dano = $this->liquidarGeada($Liq, $ItemSegurado, $LAUDO01, $dados, $LFIS01, $lmga);

                            $lmga_remanecente = $lmga * ((100 - $dano) / 100);

                            break;
                    }

                    if ($LAUDO02) {
                        /*
                         * Calcula Laudo 2
                         */
                        switch ($LAUDO02["ds_chave_cobertura"]) {

                            case "COB_GRANIZO":

                                $lmga_remanecente = $lmga_remanecente * ($LFIS02->vl_ha_area_afetada / $ItemSegurado->vl_area);

                                $this->liquidarGranizo($Liq, $LAUDO02, $dados, $LFIS02, $lmga_remanecente);

                                break;

                            case "COB_GEADA":

                                if (max($LFIS02->vl_percent_colhido, $LFIS02->vl_percent_colhido_chocho) > 0) {
                                    $percent_area_remanecente = 100 - max($LFIS02->vl_percent_colhido, $LFIS02->vl_percent_colhido_chocho);
                                    $area_remanescente = $ItemSegurado->vl_area * ($percent_area_remanecente / 100);
                                    
                                } else {
                                    $area_remanescente = $ItemSegurado->vl_area;
                                    $percent_area_remanecente = 100;
                                    
                                }

                                $lmga_remanecente = ($lmga_remanecente * $percent_area_remanecente) / 100;

                                $this->liquidarGeada($Liq, $ItemSegurado, $LAUDO02, $dados, $LFIS02, $lmga_remanecente);

                                break;
                        }
                    }
                }


                $result['message'] = "Liquidação realizada com sucesso";

                Zend_Db_Table::getDefaultAdapter()->commit();
            } catch (Exception $e) {
                Zend_Db_Table::getDefaultAdapter()->rollBack();
                $result['status'] = false;
                $result['message'] = "Não foi possível realizar a liquidação. \n {$e->getMessage()}";
            }
        }

        return $result;
    }

    private function liquidarGranizo($Liq, $Laudo, $dados, $LFIS, $lmga_remanecente) {
        /**
         * Calcula o prejuizo apurado
         */
    	//$LFIS->vl_percent_perdas = 4.9;
    	
        $vl_prejuizo = ($LFIS->vl_percent_perdas > 0 ? (($LFIS->vl_percent_perdas * $lmga_remanecente) / 100) : 0);

        /*
         * Franquia
         */
        $vl_percent_franquia = $this->_ModelPropostaCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $Laudo["id_cobertura"]);
        $vl_franquia = ($LFIS->vl_percent_perdas <= $vl_percent_franquia ? $vl_prejuizo : 0);
        
        /*
         * Indenização
         * Prejuizo - Franquia
         */
        if($LFIS->vl_percent_perdas >= $vl_percent_franquia){
        	$vl_franquia = '0.0';
        }
        
        $vl_indenizacao = $vl_prejuizo - $vl_franquia;

        $LiqISCob = $this->_ModelLiquidacoesItensSeguradosCoberturas->save(
                array(
                    "id_usuario_criacao" => $Liq->id_usuario_criacao,
                    "id_liquidacao" => $dados["id_liquidacao"],
                    "id_item_segurado" => $dados["id_item_segurado"],
                    "id_cobertura" => $Laudo["id_cobertura"],
                    "vl_percent_franquia" => $vl_percent_franquia,
                    "vl_franquia" => $vl_franquia,
                    "vl_indenizacao" => $vl_indenizacao,
                    "vl_prejuizo_total" => $vl_prejuizo,
                    "vl_percent_indenizacao" => $percent_area_afetada
                )
        );

        $this->_ModelLiquidacoesItensSeguradosCoberturasLf->save(
                array(
                    "id_liquidacoes_itens_segurados_coberturas" => $LiqISCob->id,
                    "id_laudo_final_item_segurado" => $Laudo['id_laudo_final_item_segurado'],
                    "vl_prejuizo" => $vl_prejuizo
                )
        );

        $LiqISCob->save();
    }

    private function liquidarGeada($Liq, $ItemSegurado, $Laudo, $dados, $LFIS, $lmga_remanecente) {
        /*
         * Normaliza dano chocho
         */
        $vl_percent_dano_chocho = ($LFIS->vl_percent_perdas_chocho ? $LFIS->vl_percent_perdas_chocho : 0);

        /*
         * Normaliza dano
         */
        $vl_percent_dano = ($LFIS->vl_percent_perdas ? $LFIS->vl_percent_perdas : 0);

        /**
         * Calcula o prejuizo apurado
         */
        if (($vl_percent_dano_chocho + $vl_percent_dano) > 0) {

            if (($vl_percent_dano_chocho == 0) || ($vl_percent_dano == 0)) {
                $percent_dano_total = max(array($vl_percent_dano_chocho, $vl_percent_dano));
            } else {

                $percent_dano_total = $vl_percent_dano + ($vl_percent_dano_chocho * (1 - ($vl_percent_dano / 100)));
            }
        } else {
            $percent_dano_total = 0;
        }
        
        $vl_prejuizo = $lmga_remanecente * ($percent_dano_total / 100);
        $vl_prejuizo = Agro_Util::round($vl_prejuizo, 2);

        /*
         * Franquia
         */
        $vl_percent_franquia = $this->_ModelPropostaCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $Laudo["id_cobertura"]);

        if ($vl_prejuizo > 0) {

            $vl_franquia = $ItemSegurado->vl_lmga * ($vl_percent_franquia / 100);
        } else {
            $vl_franquia = 0;
        }

        /*
         * Indenização
         * Prejuizo - Franquia
         */
        $vl_indenizacao = ($vl_franquia > $vl_prejuizo ? 0 : Agro_Util::round($vl_prejuizo - $vl_franquia, 2));

        $LiqISCob = $this->_ModelLiquidacoesItensSeguradosCoberturas->save(
                array(
                    "id_usuario_criacao" => $Liq->id_usuario_criacao,
                    "id_liquidacao" => $dados["id_liquidacao"],
                    "id_item_segurado" => $dados["id_item_segurado"],
                    "id_cobertura" => $Laudo["id_cobertura"],
                    "vl_percent_franquia" => $vl_percent_franquia,
                    "vl_franquia" => $vl_franquia,
                    "vl_indenizacao" => $vl_indenizacao,
                    "vl_prejuizo_total" => $vl_prejuizo,
                    "vl_percent_indenizacao" => $percent_area_afetada
                )
        );

        $this->_ModelLiquidacoesItensSeguradosCoberturasLf->save(
                array(
                    "id_liquidacoes_itens_segurados_coberturas" => $LiqISCob->id,
                    "id_laudo_final_item_segurado" => $Laudo['id_laudo_final_item_segurado'],
                    "vl_prejuizo" => $vl_prejuizo
                )
        );

        $LiqISCob->save();

        return $percent_dano_total;
    }

}