<?php

class Agro_Regras
{
    public $message;
    public $error = false;

    /**
     * Retorna os produtos da proposta
     *
     * @param integer $id_proposta identificador da proposta
     */
    public function calcula($id_proposta, $countParcelas = false, $bloquearParcelamento = false, $flAtendimento = false)
    {
        $Propostas = new Seguro_Model_Propostas();
        $Proposta = $Propostas->find($id_proposta)->current();
        $return = array();
        $dados = array();

        // Propriedades
        $propriedades = $Proposta->propriedades();

        // LMGA
        $lmga = $Proposta->lmga();

        // Comissao
        $comissao = $Proposta->comissao();

        // Coberturas da proposta
        $dados['coberturas'] = $Proposta->coberturas_contratadas();
        if (is_array($dados['coberturas'])) {
            foreach ($dados['coberturas'] as $cobertura) {
                $calculo = $this->RN_CALC_03($lmga, $cobertura['vl_taxa'], $Proposta->comissao(), $id_proposta);
                $Proposta->atualizaPremio(Agro_Util::formatCurrencyDb($calculo['premio']), $cobertura['id_cobertura']);
            }
        }

        if (!$countParcelas) {
            $countParcelas = count($Proposta->parcelamento());
        }

        $dados['premio_liquido'] = $Proposta->premio_liquido();
        $dados['custo_apolice'] = $propriedades['PROD_CUSTO_APOLICE'];
        $dados['premio_pagar'] = $dados['premio_liquido'] + $dados['custo_apolice'];
        $dt_base = ($Proposta['dt_vigencia_inicio']) ? $Proposta['dt_vigencia_inicio'] : date('Y-m-d');

        $parcelamento = $this->RN_CALC_06(
            $dados,
            $countParcelas,
            $dt_base,
            $Proposta,
            $propriedades,
            '',
            $flAtendimento
        );

        if (!$bloquearParcelamento) {
            $Proposta->atualizaParcelas($parcelamento);
        }

        if ($parcelamento['status']) {
            return $parcelamento;
        } else {
            return $parcelamento;
        }
    }

    public function RN_IS_01($dados, $Proposta)
    {
        try {
            $dados = $dados->toArray();
            $tmp = $dados;

            if (is_array($Proposta->segurado['questionario'])) {
                if ($Proposta->respostas('QUEST_PRODUTIVIDADE_DECLARADA') == 1) {
                    foreach ($tmp as $index => $item) {
                        switch ($item['ds_chave_rn']) {
                            case 'IS_PRODUCAO_PLANTA':
                            case 'IS_NRO_PLANTAS':
                                unset($dados[$index]);
                                break;
                            default:
                                continue;
                        }
                    }
                } elseif (array_key_exists(
                    'QUEST_PRODUTIVIDADE_DECLARADA',
                    $Proposta->segurado['questionario']
                ) && ($Proposta->segurado['questionario']['QUEST_PRODUTIVIDADE_DECLARADA'] == 2)) {
                    foreach ($tmp as $index => $item) {
                        if ($item['ds_chave_rn'] == 'IS_AREA' || $item['ds_chave_rn'] == 'IS_PRODUTIVIDADE') {
                            $dados[$index]['attrib']['disabled'] = true;
                        }
                    }
                }
            }

            return $dados;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra Item Segurado 1.';
            $this->error = true;

            return $this;
        }
    }

    public function RN_IS_02(&$dados, $Proposta, $propriedades, $endosso)
    {
        $ValidacoesModel = new Produto_Model_Validacoes();
        $Validacoes = $ValidacoesModel->getValidacaoProduto($Proposta->id_produto);
        $propriedade = $Proposta->propriedade();
        $produto = $Proposta->produto();
        $limiteISConfigurado = (new Comercializacao_Model_TaxaAgrupamentoItemSeguradoValorTonelada())->findByIdProposta($Proposta->id_proposta_mae);
        $limiteISConfigurado = !empty($limiteISConfigurado);

        // verificando se é um endosso
        if ($Proposta->id_proposta_endossada) {
            $PropostaMae = (new Seguro_Model_Propostas())->find($Proposta->id_proposta_mae)->current();
        }
        
        try {
           
            if ($propriedades['PROD_PRODUCAO_GARANTIDA']) {
                $dados = $this->RN_IS_03($dados, $Proposta, $propriedades, $Proposta->franquia_cobertura_principal());
            }

            //PG
            if ($propriedades['PROD_PRODUCAO_GARANTIDA'] == 1) {
                $dados['IS_LMGA_PARCIAL'] = Agro_Util::round(
                    $dados['IS_PRODUCAO_GARANTIDA'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) * $dados['IS_AREA'],
                    2
                );
            // CUSTEIO
            } elseif ($propriedades['PROD_PRODUCAO_GARANTIDA'] == 2) {
                $dados['IS_LMGA_PARCIAL'] = Agro_Util::round(
                    $dados['IS_AREA'],
                    5
                ) * Agro_Util::formatCurrencyDb($dados['IS_VALOR_CUSTEIO']);
            // FATURAMENTO
            } elseif ($propriedades['PROD_PRODUCAO_GARANTIDA'] == 3) {
                // DANO DIRETO
            } else {
                $dados['IS_LMGA_PARCIAL'] = Agro_Util::round(
                    $dados['IS_AREA'],
                    5
                ) * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) * $dados['IS_PRODUTIVIDADE'];
            }

            // Formata a LMGA
            $dados['IS_LMGA_PARCIAL'] = Agro_Util::formatDbCurrency($dados['IS_LMGA_PARCIAL']);

            // A data de final de colheita deve ser maior igual ao dia de hoje + 30 dias
            if ($dados['IS_DT_FINAL_COLHEITA']) {
                $arDtColheita = explode("/", $dados['IS_DT_FINAL_COLHEITA']);
                $dtFimColheita = mktime(0, 0, 0, $arDtColheita[1], $arDtColheita[0], $arDtColheita[2]);
                $dtLimiteFimColheita = mktime(0, 0, 0, date("m"), date("d") + 30, date("Y"));

                if ($dtFimColheita < $dtLimiteFimColheita) {
                    $this->message = "Data de Final de Colheita inválida.";
                    $this->error = true;

                    return false;
                }
            }

            // Validacao para que nro. por planta, area e idade não sejam igual a zero
            if (array_key_exists('IS_NRO_PLANTAS', $dados)) {
                if (!$dados['IS_NRO_PLANTAS'] || $dados['IS_NRO_PLANTAS'] <= 0) {
                    $this->message = "O valor do Nº de Plantas não pode ser igual a zero.";
                    $this->error = true;

                    return false;
                }
            }

            //Validação de área - quando for endosso, é possível zerar a área de um item segurado
            if (!$endosso > 0) {
                if (array_key_exists('IS_AREA', $dados)) {
                    if (!$dados['IS_AREA'] || $dados['IS_AREA'] <= 0) {
                        $this->message = "O valor da Área (ha) não pode ser igual a zero.";
                        $this->error = true;

                        return false;
                    }
                }
            }

            if (array_key_exists('IS_IDADE', $dados)) {
                if ($dados['IS_IDADE'] <= 0 and ($propriedades['PROD_LIBERAR_PADRAO_MINIMO'] == "0")) {
                    $this->message = "O valor da Idade não pode ser igual a zero." .
                      $this->error = true;

                    return false;
                }
            }

            if (Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) > 0 && !$limiteISConfigurado) {
                // Verifica se existe a propriedade limite minimo e maximo para o valor/tonelada
                if (is_array($propriedades)) {
                    if ((array_key_exists('LIMITE_MINIMO_IS', $propriedades)) && (array_key_exists(
                        'LIMITE_MAXIMO_IS',
                        $propriedades
                    ))) {
                        $valor = Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
                        $minimo = Agro_Util::formatCurrencyDb($propriedades['LIMITE_MINIMO_IS']);
                        $maximo = Agro_Util::formatCurrencyDb($propriedades['LIMITE_MAXIMO_IS']);

                        if (($valor < $minimo) || ($valor > $maximo)) {
                            $this->message = "O Valor (R$/ton) " . Agro_Util::formatDbCurrency($valor) . " não está entre " . Agro_Util::formatDbCurrency($minimo) . " e " . Agro_Util::formatDbCurrency($maximo);
                            $this->error = true;

                            return false;
                        }
                    }

                    //se for PG e os valores minimo e maximo por valor/tonelada não estiver espcificado no produto, validar de acordo com os
                    //valores setados para a variedade
                    elseif ($produto['ds_chave_rn'] == 'MULTIRRISCO' && !$limiteISConfigurado) {
                        $ProdutosVariedades = new Produto_Model_ProdutosVariedades();
                        $between = $ProdutosVariedades->checkBetweenVariedade(
                            $dados,
                            $Proposta->id_produto,
                            $Proposta->id,
                            true
                        );

                        if (is_array($between)) {
                            if (is_array($between)) {
                                $valor = Agro_Util::formatCurrencyDb($between[2]);
                                $min = Agro_Util::formatCurrencyDb($between[0]);
                                $max = Agro_Util::formatCurrencyDb($between[1]);

                                $this->message = "O Valor (" . Agro_Util::formatDbCurrency($valor) . ") da LMGA por hectare (ha) não está entre " . Agro_Util::formatDbCurrency($min) . " e " . Agro_Util::formatDbCurrency($max);
                                $this->error = true;

                                return false;
                            }
                        }
                    }
                }
            }

            if (
                (isset($dados['IS_DATA_PLANTIO_TRANSPLANTE']) || isset($dados['IS_DATA_SEMEADURA']))
                && empty($dados['fl_importado_previa'])
                && isset($propriedades['PROD_PERMITIR_SEGURO_AREA_SEMEADA_TRANSPLANTADA'])
            ) {
                $valores = explode(',', $propriedades['PROD_PERMITIR_SEGURO_AREA_SEMEADA_TRANSPLANTADA']);

                if ($valores[0] === '0') {
                    $dataSemeadura = $dados['IS_DATA_SEMEADURA'] ?? $dados['IS_DATA_PLANTIO_TRANSPLANTE'];
                    $diasComparacao = 0;

                    $mensagemErro = "Para essa proposta não está liberada a contratação de seguro com data de";
                    $mensagemErro .= " semeadura ou transplante menor que a data de transmissão.";

                    if (!empty($valores[1])) {
                        $diasComparacao = $valores[1];

                        $mensagemErro = "Para essa proposta não está liberada a contratação de seguro com data de";
                        $mensagemErro .= " semeadura ou transplante menor que a data de transmissão";
                        $mensagemErro .= " + {$valores[1]} dia(s).";
                    }

                    //quando endosso pega data da proposta mae
                    if (is_object($PropostaMae)) {
                        $dataAtual = date_create($PropostaMae->dt_transmissao);
                        $dataAtual = date_format($dataAtual, 'd/m/Y');
                    } else {
                        $dataAtual = date('d/m/Y');
                    }

                    if (
                        Agro_Util::contarDiasEntreDatas($dataAtual, $dataSemeadura) < $diasComparacao
                        && ((int)$dados['IS_LMGA_PARCIAL'] > 0 && (float)$dados['IS_LMGA_PARCIAL'] > 0)
                    ) {
                        $this->message = $mensagemErro;
                        $this->error = true;

                        return false;
                    }
                }
            }
            
            $flValidacao = !Agro_Util::checkPermission('seguro:proposta:liberarvalidacoesis');
            $flZoneamentoRegiao = $Proposta->atributo_rn('PROPRIEDADE', 'PROD_ZONEAMENTO_REGIAO');
            $ValidacoesZoneamento = new Produto_Model_Validacoes();

            if ($Validacoes->count()) {
                foreach ($Validacoes as $Validacao) {
                    /*
                     * Aplica a validacao de VALIDACAO_ZONEAMENTO
                     */
                    if ($Validacao->ds_chave == 'VALIDACAO_ZONEAMENTO') {
                        $Ciclos = new Produto_Model_Ciclos();
                        $Propriedade = $Proposta->propriedade();
                        $Variedades = new Produto_Model_Variedades();
                        $questionarios = $Proposta->respostas();

                        // busca o ciclo correto de acordo com os dados informados
                        if (!$flZoneamentoRegiao) {
                            $idCiclo = $Ciclos->getCicloEstado(
                                $Proposta->id_produto,
                                $dados['IS_VARIEDADES'],
                                $Propriedade['id_estado']
                            );
                        } else {
                            if (!$Propriedade['id_regiao']) {
                                $this->message = "Região de zoneamento não informada para o Município da propriedade.";
                                $this->error = true;

                                return false;
                            }
                            $idCiclo = $Ciclos->getCicloRegiao(
                                $Proposta->id_produto,
                                $dados['IS_VARIEDADES'],
                                $Propriedade['id_estado'],
                                $Propriedade['id_regiao']
                            );
                        }

                        // verifica se o produto esta habilitado para comercializar somente variedade transgenica na UF informada
                        if ($Ciclos->verificaProdutoUfTransgenico(
                            $Proposta->id_produto,
                            $Propriedade['id_estado']
                        ) > 0) {
                            // verifica se a variedade eh transgenica
                            $RsVariedade = $Variedades->getRow($dados['IS_VARIEDADES']);
                            if ($RsVariedade->fl_transgenico == false && $dados['IS_PRODUTIVIDADE'] > 0 && Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) > 0) {
                                $this->message = "Variedade não aceita pela Seguradora e, em virtude disso, o valor segurado deve ser zerado";
                                $this->error = true;

                                return false;
                            }
                        }

                        if ($dados['IS_PRODUTIVIDADE'] > 0 && Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) > 0) {
                            if (!$idCiclo) {
                                $this->message = "Variedade está em desacordo com o Zoneamento Agrícola e, em virtude disso, o valor segurado deve ser zerado";
                                $this->error = true;

                                return false;
                            } else {
                                $dados['IS_CICLO_VARIEDADE'] = $idCiclo;
                            }
                        }

                        // valida se as informações de zoneamento estão corretas
                        if (($dados['IS_PRODUTIVIDADE'] > 0 && Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) > 0) && ($flValidacao)) {

                            $isTipoSolo = $dados['IS_TIPO_SOLO_AD'] ? $dados['IS_TIPO_SOLO_AD'] : $dados['IS_TIPO_SOLO'];

                            $rsValidaZoneamento = $ValidacoesZoneamento->verificaZoneamento(
                                ($questionarios['QUEST_TIPO_SOLO'] ? $questionarios['QUEST_TIPO_SOLO'] : $isTipoSolo),
                                $Proposta->id_produto,
                                $dados['IS_CICLO_VARIEDADE'],
                                $propriedade['id_municipio'],
                                $dados['IS_DATA_SEMEADURA'],
                                $dados['IS_ALTITUDE'],
                                $dados['IS_SISTEMA_PLANTIO']
                            );

                            if ($rsValidaZoneamento['status'] == false) {
                                $this->message = $rsValidaZoneamento['msg'];
                                $this->error = true;

                                return false;
                            }
                        }
                    }

                    if ($flValidacao) {
                        // VALIDACAO DE PRODUTIVIDADE MINIMA E MAXIMA
                        $Cultura = $Proposta->cultura();
                        if ((($Cultura['vl_produtividade_minima'] > 0) || ($Cultura['vl_produtividade_minima'] === 0)) && ($Cultura['vl_produtividade_maxima'] > 0)) {
                            if ($dados['IS_PRODUTIVIDADE'] < $Cultura['vl_produtividade_minima']) {
                                $this->message = "Produtividade informada (" . $dados['IS_PRODUTIVIDADE'] . ") é menor que a produtividade mínima (" . $Cultura['vl_produtividade_minima'] . ") permitida.";
                                $this->error = true;

                                return false;
                            }

                            if ($dados['IS_PRODUTIVIDADE'] > $Cultura['vl_produtividade_maxima']) {
                                $this->message = "Produtividade informada (" . $dados['IS_PRODUTIVIDADE'] . ") é maior que a produtividade máxima (" . $Cultura['vl_produtividade_maxima'] . ") permitida.";
                                $this->error = true;

                                return false;
                            }
                        }

                        if ($dados['IS_PRODUTIVIDADE'] > 0 && Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) > 0) {
                            /*
                             * Aplica a validacao de VALIDACAO_IS_PRODUCAO_MINIMA_MACA
                             */
                            if ($Validacao->ds_chave == 'VALIDACAO_IS_PRODUCAO_MINIMA_MACA') {
                                if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
                                    $Densidade = (10000 / ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']));
                                } elseif (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
                                    $espacamento = explode('x', $dados['IS_ESPACAMENTO_SIMPLES']);
                                    $Densidade = (10000 / ($espacamento[0] * $espacamento[1]));
                                }

                                // Busca o Grupo da variedade
                                $ValidacaoGrupoVariedades = new Produto_Model_ValidacoesVariedades();
                                $idGrupoVariedade = $ValidacaoGrupoVariedades->getGrupoVariedade(
                                    $dados['IS_VARIEDADES'],
                                    $Validacao->id
                                );
                                if (!$idGrupoVariedade) {
                                    $this->message = "Não foi possível encontrar o grupo da Variedade (" . $Validacao->ds_chave . ").";
                                    $this->error = true;

                                    return false;
                                }

                                // Busca o Grupo do porta enxerto
                                $ValidacaoGrupoPortaenxerto = new Produto_Model_Validacoesportaenxerto();
                                $idGrupoPortaenxerto = $ValidacaoGrupoPortaenxerto->getGrupoPortaenxerto($dados['IS_PORTAENXERTO']);
                                if (!$idGrupoPortaenxerto) {
                                    $this->message = "Não foi possível encontrar o grupo do Porta Enxerto (" . $Validacao->ds_chave . ").";
                                    $this->error = true;

                                    return false;
                                }

                                // Busca o grupo da densidade
                                $ValidacaoGrupoDensidade = new Produto_Model_Validacoesdensidade();
                                $idValidacaoGrupoDensidade = $ValidacaoGrupoDensidade->getGrupoDensidade(
                                    $Densidade,
                                    $idGrupoPortaenxerto,
                                    $Validacao->id
                                );

                                if (!$idValidacaoGrupoDensidade) {
                                    $this->message = "Não foi possível encontrar o grupo da densidade (" . $Validacao->ds_chave . ").";
                                    $this->error = true;

                                    return false;
                                }

                                // Busca os valores
                                $ValidacoesValores = new Produto_Model_ValidacoesValores();
                                $Valores = $ValidacoesValores->getValores(
                                    $idGrupoVariedade,
                                    $idGrupoPortaenxerto,
                                    $idValidacaoGrupoDensidade,
                                    $dados['IS_IDADE'],
                                    $Validacao->id
                                );

                                if ($Valores['nr_plantas'] or $Valores['nr_plantas_regiao']) {
                                    if ($propriedade['id_municipio'] == 4535 or $propriedade['id_municipio'] == 4394 or $propriedade['id_municipio'] == 4602) {
                                        $dados['IS_PRODUCAO_MINIMA'] = $Valores['nr_plantas_regiao'];
                                    } else {
                                        $dados['IS_PRODUCAO_MINIMA'] = $Valores['nr_plantas'];
                                    }
                                } else {
                                    $this->message = "Não foi possível encontrar o valor da produção mínima.";
                                    $this->error = true;

                                    return false;
                                }
                            }

                            /*
                             * Aplica a validacao de VALIDACAO_VARIEDADE_DENSIDADE
                             */
                            if ($Validacao->ds_chave == 'VALIDACAO_VARIEDADE_DENSIDADE') {
                                // Calcula a densidade baseado no espacamento
                                if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
                                    $Densidade = (10000 / ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']));
                                } elseif (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
                                    $espacamento = explode('x', $dados['IS_ESPACAMENTO_SIMPLES']);
                                    $Densidade = (10000 / ($espacamento[0] * $espacamento[1]));
                                }
                                $Densidade = floor($Densidade);

                                // Busca o grupo da densidade
                                $ValidacaoGrupoDensidade = new Produto_Model_Validacoesdensidade();
                                $idValidacaoGrupoDensidade = $ValidacaoGrupoDensidade->getGrupoDensidade(
                                    $Densidade,
                                    '',
                                    $Validacao->id
                                );
                                if (!$idValidacaoGrupoDensidade) {
                                    $this->message = "Não foi possível encontrar o grupo da densidade.";
                                    $this->error = true;

                                    return false;
                                }

                                // Busca o Grupo da variedade
                                $ValidacaoGrupoVariedades = new Produto_Model_ValidacoesVariedades();
                                $idGrupoVariedade = $ValidacaoGrupoVariedades->getGrupoVariedade(
                                    $dados['IS_VARIEDADES'],
                                    $Validacao->id
                                );
                                if (!$idGrupoVariedade) {
                                    $this->message = "Não foi possível encontrar o grupo da Variedade.";
                                    $this->error = true;

                                    return false;
                                }
                                
                                if (!$limiteISConfigurado) {
                                    // Busca os valores
                                    $ValidacoesValores = new Produto_Model_ValidacoesValores();
                                    $Valores = $ValidacoesValores->getValores(
                                        $idGrupoVariedade,
                                        '',
                                        $idValidacaoGrupoDensidade,
                                        $dados['IS_IDADE'],
                                        $Validacao->id
                                    );

                                    $valor = $dados['IS_PRODUTIVIDADE'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
                                    if ($dados['IS_IDADE'] == 1 or $dados['IS_IDADE'] == 2) {
                                        $Valores['vl_minimo'] = 0;
                                    }

                                    if (($valor < $Valores['vl_minimo']) || ($valor > $Valores['vl_maximo'])) {
                                        $valor = Agro_Util::formatCurrencyDb($valor);
                                        $min = Agro_Util::formatCurrencyDb($Valores['vl_minimo']);
                                        $max = Agro_Util::formatCurrencyDb($Valores['vl_maximo']);

                                        $this->message = "O Valor (" . Agro_Util::formatDbCurrency($valor) . ") da LMGA por hectare não está entre " . Agro_Util::formatDbCurrency($min) . " e " . Agro_Util::formatDbCurrency($max);
                                        $this->error = true;

                                        return false;
                                    }
                                }
                            }

                            /*
                             * Aplica a validacao de VALIDACAO_PE_DENSIDADE_VAR
                             */
                            if ($Validacao->ds_chave == 'VALIDACAO_PE_DENSIDADE_VAR') {
                                // Calcula a densidade baseado no espacamento
                                if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
                                    $Densidade = (10000 / ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']));
                                } elseif (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
                                    $espacamento = explode('x', $dados['IS_ESPACAMENTO_SIMPLES']);
                                    $Densidade = (10000 / ($espacamento[0] * $espacamento[1]));
                                }

                                // Busca o Grupo da variedade
                                $ValidacaoGrupoVariedades = new Produto_Model_ValidacoesVariedades();
                                $idGrupoVariedade = $ValidacaoGrupoVariedades->getGrupoVariedade(
                                    $dados['IS_VARIEDADES'],
                                    $Validacao->id
                                );
                                if (!$idGrupoVariedade) {
                                    $this->message = "Não foi possível encontrar o grupo da Variedade.";
                                    $this->error = true;

                                    return false;
                                }

                                // Busca o Grupo do porta enxerto
                                $ValidacaoGrupoPortaenxerto = new Produto_Model_Validacoesportaenxerto();
                                $idGrupoPortaenxerto = $ValidacaoGrupoPortaenxerto->getGrupoPortaenxerto($dados['IS_PORTAENXERTO']);
                                if (!$idGrupoPortaenxerto) {
                                    $this->message = "Não foi possível encontrar o grupo do Porta Enxerto.";
                                    $this->error = true;

                                    return false;
                                }

                                // Busca o grupo da densidade
                                $ValidacaoGrupoDensidade = new Produto_Model_Validacoesdensidade();
                                $idValidacaoGrupoDensidade = $ValidacaoGrupoDensidade->getGrupoDensidade(
                                    $Densidade,
                                    $idGrupoPortaenxerto,
                                    $Validacao->id
                                );
                                if (!$idValidacaoGrupoDensidade) {
                                    $this->message = "Não foi possível encontrar o grupo da densidade.";
                                    $this->error = true;

                                    return false;
                                }
                                
                                if (!$limiteISConfigurado) {
                                    // Busca os valores
                                    $ValidacoesValores = new Produto_Model_ValidacoesValores();
                                    $Valores = $ValidacoesValores->getValores(
                                        $idGrupoVariedade,
                                        $idGrupoPortaenxerto,
                                        $idValidacaoGrupoDensidade,
                                        $dados['IS_IDADE'],
                                        $Validacao->id
                                    );

                                    $valor = $dados['IS_PRODUTIVIDADE'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
                                    if (($dados['IS_IDADE'] == 1 or $dados['IS_IDADE'] == 2) and ($propriedades['PROD_LIBERAR_PADRAO_MINIMO'] == "0")) {
                                        $Valores['vl_minimo'] = 0;
                                    }

                                    if (($valor < $Valores['vl_minimo']) || ($valor > $Valores['vl_maximo'])) {
                                        $valor = Agro_Util::formatCurrencyDb($valor);
                                        $min = Agro_Util::formatCurrencyDb($Valores['vl_minimo']);
                                        $max = Agro_Util::formatCurrencyDb($Valores['vl_maximo']);

                                        $this->message = "O Valor (" . Agro_Util::formatDbCurrency($valor) . ") da LMGA por hectare não está entre " . Agro_Util::formatDbCurrency($min) . " e " . Agro_Util::formatDbCurrency($max);
                                        $this->error = true;

                                        return false;
                                    }
                                }
                            }

                            /*
                             * Aplica a validacao de VALIDACAO_VARIEDADE_LIMITE
                             */
                            if ($Validacao->ds_chave == 'VALIDACAO_VARIEDADE_LIMITE' && !$limiteISConfigurado) {
                                $ProdutosVariedades = new Produto_Model_ProdutosVariedades();
                                $between = $ProdutosVariedades->checkBetweenVariedade(
                                    $dados,
                                    $Proposta->id_produto,
                                    $Proposta->id
                                );

                                if (is_array($between)) {
                                    $valor = Agro_Util::formatCurrencyDb($between[2]);
                                    $min = Agro_Util::formatCurrencyDb($between[0]);
                                    $max = Agro_Util::formatCurrencyDb($between[1]);

                                    $this->message = "O Valor (" . Agro_Util::formatDbCurrency($valor) . ") da LMGA por hectare (ha) não está entre " . Agro_Util::formatDbCurrency($min) . " e " . Agro_Util::formatDbCurrency($max);
                                    $this->error = true;

                                    return false;
                                }
                            }

                            /*
                             * Aplica a validacao de VALIDACAO_VARIEDADE_IDADE
                             */
                            if ($Validacao->ds_chave == 'VALIDACAO_VARIEDADE_IDADE') {
                                // Busca o Grupo da variedade
                                $ValidacaoGrupoVariedades = new Produto_Model_ValidacoesVariedades();
                                $idGrupoVariedade = $ValidacaoGrupoVariedades->getGrupoVariedade(
                                    $dados['IS_VARIEDADES'],
                                    $Validacao->id
                                );
                                if (!$idGrupoVariedade) {
                                    $this->message = "Não foi possível encontrar o grupo da Variedade.";
                                    $this->error = true;

                                    return false;
                                }

                                if (!$limiteISConfigurado) {
                                    // Busca os valores
                                    $ValidacoesValores = new Produto_Model_ValidacoesValores();
                                    $Valores = $ValidacoesValores->getValores(
                                        $idGrupoVariedade,
                                        '',
                                        '',
                                        $dados['IS_IDADE'],
                                        $Validacao->id
                                    );

                                    $valor = $dados['IS_PRODUTIVIDADE'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
                                    if (($dados['IS_IDADE'] == 1 or $dados['IS_IDADE'] == 2) and ($propriedades['PROD_LIBERAR_PADRAO_MINIMO'] == "0")) {
                                        $Valores['vl_minimo'] = 0;
                                    }

                                    if (($valor < $Valores['vl_minimo']) || ($valor > $Valores['vl_maximo'])) {
                                        $valor = Agro_Util::formatCurrencyDb($valor);
                                        $min = Agro_Util::formatCurrencyDb($Valores['vl_minimo']);
                                        $max = Agro_Util::formatCurrencyDb($Valores['vl_maximo']);

                                        $this->message = "O Valor (" . Agro_Util::formatDbCurrency($valor) . ") da LMGA por hectare não está entre " . Agro_Util::formatDbCurrency($min) . " e " . Agro_Util::formatDbCurrency($max);
                                        $this->error = true;

                                        return false;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return true;
        } catch (Exception $e) {
            $this->message = "Ocorreu um erro não esperado.";
            $this->error = true;

            return false;
        }
    }


    public function RN_IS_03($dados, $Proposta, $propriedades, $franquia = 0)
    {
        if ($franquia > 0) {
            $dados['IS_PRODUCAO_GARANTIDA'] = Agro_Util::round((($franquia * $dados['IS_PRODUTIVIDADE']) / 100), 3);
        } else {
            $taxa = $Proposta->taxas($Proposta->agrupamento(), $propriedades['PROD_PRODUCAO_GARANTIDA']);
            $franquia = $taxa[0]['vl_franquia'];
            $dados['IS_PRODUCAO_GARANTIDA'] = Agro_Util::round((($franquia * $dados['IS_PRODUTIVIDADE']) / 100), 3);
        }

        return $dados;
    }


    public function RN_IS_04(&$dados)
    {
        try {
            if (!array_key_exists('IS_NRO_PLANTAS', $dados)) {
                $this->message = 'Não foi informado o número de plantas.';
                $this->error = true;

                return $this;
            }

            if (!array_key_exists('IS_PRODUCAO_PLANTA', $dados)) {
                $this->message = 'Não foi informado a produção por plantas.';
                $this->error = true;

                return false;
            }

            if (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
                $espacamento = $dados['IS_ESPACAMENTO_SIMPLES'];
            } elseif (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
                $espacamento = ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']);
            }

            $dados['IS_AREA'] = Agro_Util::round(($dados['IS_NRO_PLANTAS'] / (10000 / $espacamento)), 5);
            $dados['IS_PRODUTIVIDADE'] = Agro_Util::round(
                ((10000 / $espacamento) * ($dados['IS_PRODUCAO_PLANTA'] / 1000)),
                4
            );

            return true;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra Item Segurado 4.';
            $this->error = true;

            return false;
        }
    }


    public function RN_IS_05(&$dados, $proposta)
    {
        try {
            $Coberturas = new Produto_Model_Coberturas();
            $Cobertura = $Coberturas->getCobertura('COB_PROTECAO_FITO', $proposta['id_produto']);
            if ($Cobertura) {
                if ($dados['IS_LMGA_PARCIAL'] > 0) {
                    $dados['IS_LMI_POS_GRANIZO'] = ($dados['IS_LMGA_PARCIAL'] * 100);
                } elseif ($dados['IS_LMGA_PARCIAL'] == 0) {
                    $dados['IS_LMI_POS_GRANIZO'] = 0;
                }
            }

            return true;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra Item Segurado 5.';
            $this->error = true;

            return false;
        }
    }

    public function RN_IS_06(&$dados)
    {
        $Proposta = new Zend_Session_Namespace('proposta');

        try {
            return true;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra Item Segurado 6.';
            $this->error = true;

            return false;
        }
    }

    private function verificarDataSemeadura($permitirSeguro, $diasEspecificos, $dataSemeadura, $retroativo = false, $dataAtual = false) {
        $dataSemeadura = DateTime::createFromFormat('d/m/Y', $dataSemeadura);
        $dataSemeadura = $dataSemeadura->format('Y-m-d');

        if(!$retroativo){return true;}

		if ($permitirSeguro) {
			if (is_null($diasEspecificos)) {
				// Permitir qualquer dia
				return true;
			} else {
                $dataAtual = (isset($dataAtual)) ? $dataAtual : date('Y-m-d');
				// Calcular a data mínima permitida
                $diasEspecificos = abs($diasEspecificos);
				$dataMinimaPermitida = date('Y-m-d', strtotime("$dataAtual -$diasEspecificos days"));
				return $dataSemeadura >= $dataMinimaPermitida;
			}
		} else {
			// Não permitir seguro de área já semeada ou transplantada
			return false;
		}
	}


    public function RN_IS_07($propriedades_proposta, $unidade, $proposta)
    {
        if ($proposta->id_proposta_endossada) {
            $propostaMae = (new Seguro_Model_Propostas())->find($proposta->id_proposta_mae)->current();
        }

        if (is_object($propostaMae)) {
            $dataAtual = date_create($propostaMae->dt_vigencia_inicio);
            $dataAtual = date_format($dataAtual, 'Y-m-d');
        } else {
            $dataAtual = date('Y-m-d');
        }

        try {
            $PROD_PERMITIR_SEGURO_AREA_SEMEADA_TRANSPLANTADA = $propriedades_proposta['PROD_PERMITIR_SEGURO_AREA_SEMEADA_TRANSPLANTADA'];
            [$retroativo, $diasEspecificos] = explode(',', $PROD_PERMITIR_SEGURO_AREA_SEMEADA_TRANSPLANTADA);
            $dataSemeadura = $unidade['IS_DATA_SEMEADURA'] ?? $unidade['IS_DATA_PLANTIO_TRANSPLANTE'];

            if ($dataSemeadura && empty($unidade['fl_importado_previa'])) {
                if ($this->verificarDataSemeadura(true, $diasEspecificos, $dataSemeadura, $retroativo, $dataAtual)) {
                    return true;
                }

                $this->message = 'Para essa proposta não está liberada a contratação de seguro com a data de semeadura ou transplante menor que a data de transmissão   ' . $diasEspecificos . " dia(s)";
                $this->error = true;
                return false;
            }
        } catch (Exception $e) {
            $this->message = 'Para essa proposta não está liberada a contratação de seguro com a data de semeadura ou transplante menor que a data de transmissão   ' . $diasEspecificos . " dia(s)";
            $this->error = true;

            return false;
        }

        return true;
    }

    public function RN_CALC_01($dados)
    {
        $Proposta = new Zend_Session_Namespace('proposta');

        try {
            return;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra de cálculo 1.';
            $this->error = true;

            return $this;
        }
    }

    public function RN_CALC_02($dados)
    {
        try {
            return;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra de cálculo 2.';
            $this->error = true;

            return $this;
        }
    }

    public function RN_CALC_03($lmga, $taxa, $comissao, $id_proposta)
    {
        $Propostas = new Seguro_Model_Propostas();
        $Proposta = $Propostas->find($id_proposta)->current();
        
        try {
            $premio = 0;
            $produto = $Proposta->produto();
            $comissaoAdicional = array_key_exists('valorComissaoAdicional', $comissao) ? $comissao['valorComissaoAdicional'] : null;

            $rowGestaoComissao = (new Produto_Model_GestaoComissao())->getComissaoByProposta($Proposta['id']);
            
            if ($comissaoAdicional === null || $comissaoAdicional == 0) {
                /**
                 * Valida se há comissão adicional para o corretor/sublogin e produto, pois o cálculo deve ser baseado
                 * na comissão sem este adicional.
                 */
                
                if (!empty($rowGestaoComissao) && !empty($rowGestaoComissao['id'])) {
                    $comissao['vl_nova_comissao'] -= $rowGestaoComissao['vl_comissao'];
                }
            } else {
                $comissao['vl_nova_comissao'] -= $comissaoAdicional;
            }
            
            if (is_null($comissao['vl_comissao_original'])) {
                $comissao['vl_comissao_original'] = $comissao['vl_nova_comissao'];
            }

            $comissaoMaior = $comissao['vl_comissao_original'] < $comissao['vl_nova_comissao'];
            $comissaoMenor = $comissao['vl_comissao_original'] > $comissao['vl_nova_comissao'];
           
            // se a comissao selecionado for diferente da comissao original, recalcula (aumenta ou diminui) a taxa
            if ($comissaoMaior || $comissaoMenor) {
                /**
                 * Aumento proporcional da AgroBrasil na comissão agravada pelo corretor
                 */
                if ($comissaoMaior) {
                    $rowComissaoAdicionalAgroBrasil = (new Produto_Model_ComissaoAdicionalAgroBrasil())->fetchAll()->current()->toArray();
                    $percentualComissaoAdicional = $rowComissaoAdicionalAgroBrasil['vl_percentual'];

                    $calculoTaxaParte1 = 1 + ($percentualComissaoAdicional / 100);
                    $calculoTaxaParte1 = $calculoTaxaParte1 * ($comissao['vl_comissao_original'] / 100);
                    $calculoTaxaParte1 = 1 - $calculoTaxaParte1;

                    $calculoTaxaParte2 = 1 + ($percentualComissaoAdicional / 100);
                    $calculoTaxaParte2 = $calculoTaxaParte2 * ($comissao['vl_nova_comissao'] / 100);
                    $calculoTaxaParte2 = 1 - $calculoTaxaParte2;
                    
                    $taxa = ((($taxa / 100) * $calculoTaxaParte1) / $calculoTaxaParte2) * 100;
                } elseif (empty($rowGestaoComissao)) {
                    $taxa = ($taxa * (1 - ($comissao['vl_comissao_original'] / 100))) / (1 - ($comissao['vl_nova_comissao'] / 100));
                }
                
                $taxa = Agro_Util::round($taxa, 2);
            }
            
            foreach ($Proposta->itens_segurados() as $item) {
                $premio += Agro_Util::round((($item['is_lmga_parcial'] * $taxa) / 100), 2);
            }

            $return = array();
            $return['taxa'] = Agro_Util::formatDbCurrency($taxa, 2, '.', '');
            $return['premio'] = Agro_Util::formatDbCurrency($premio);
            
            return $return;
        } catch (Exception $e) {
            $this->message = 'Erro ao aplicar a regra de cálculo 3.';
            $this->error = true;

            return $this;
        }
    }

    public function RN_CALC_05($dados, $pricipal, $adicionais, $propriedades, $dispensaComissaoMinima = false)
    {
        $return = array();

        // Soma os valores
        $valor = Agro_Util::formatCurrencyDb($pricipal['premio']);
        $valorAdicionais = 0;
        if (is_array($adicionais)) {
            foreach ($adicionais as $adicional) {
                $valor = Agro_Util::formatCurrencyDb($adicional['premio_tarifario']) + $valor;
                $valorAdicionais += Agro_Util::formatCurrencyDb($adicional['premio_tarifario']);
            }
        }

        $custoApolice = $propriedades['PROD_CUSTO_APOLICE'];
        $premioMinimo = $propriedades['PROD_PREMIO_MINIMO'];

        $return['status'] = true;
        $return['premio_liquido'] = Agro_Util::formatDbCurrency($valor);
        $return['custo_apolice'] = Agro_Util::formatDbCurrency($custoApolice);
        $return['premio_pagar'] = Agro_Util::formatDbCurrency(($valor + $custoApolice));

        if (Agro_Util::formatCurrencyDb($valor) < $premioMinimo && !$dispensaComissaoMinima) {
            
            if (!empty($dados['origem_orcamento_premio'])) {
                $premioMinimo70Porcento = ($premioMinimo * 70) / 100;
                if (Agro_Util::formatCurrencyDb($valor) > $premioMinimo70Porcento) {
                    $return['status']  = false;
                    $return['msg']     = 'O prêmio mínimo de R$ ' . Agro_Util::formatDbCurrency($premioMinimo) . ' não foi atingido. Gostaria de ajustar o valor tarifário para o valor mínimo proposto, e dar continuidade na contratação?';
                    $return['confirm']  = true;
                   
                    // Recalcula a nova taxa
                    $taxaMinima = ($pricipal['taxa'] * ($premioMinimo - $valorAdicionais)) / Agro_Util::formatCurrencyDb($pricipal['premio']);
                    $taxaMinimaFormatada = number_format($taxaMinima, 2, '.', '');
                    
                    // Recalcula o novo valor de prêmio de acordo com a nova taxa
                    $lmga = Agro_Util::formatCurrencyDb($dados['lmga']);
                    
                    // Como o prêmio será recalculado, para não aplicar novamente o valor da comissão igualamos o valor da vl_comissao_original com a vl_nova_comissao,
                    // para o recalculado não considerar que houve alteração da comissão, uma vez que isso já foi calculado na primeira vez.
                    $comissaoRecalculo = $dados['comissao'];
                    $comissaoRecalculo['vl_comissao_original'] = $comissaoRecalculo['vl_nova_comissao'];

                    $novaCoberturaPrincipal = Agro_Regras::RN_CALC_03($lmga, $taxaMinimaFormatada, $comissaoRecalculo, $dados['id_proposta']);
                    $novoPremioMinimo = Agro_Util::formatCurrencyDb($novaCoberturaPrincipal['premio']) + $valorAdicionais;
                    
                    // Caso a taxa tenha sido arredondada para baixo e o cálculo tenha resultado um prêmio menor do que o mínimo adiciono 0.01 ao valor da taxa
                    // e recalculo o prêmio.
                    if ($novoPremioMinimo < $premioMinimo) {
                        $taxaMinimaFormatada += 0.01;
                        $novaCoberturaPrincipal = Agro_Regras::RN_CALC_03($lmga, $taxaMinimaFormatada, $comissaoRecalculo, $dados['id_proposta']);
                        $novoPremioMinimo = Agro_Util::formatCurrencyDb($novaCoberturaPrincipal['premio']) + $valorAdicionais;
                    }
                    
                    $return['taxa_minima'] = $taxaMinimaFormatada;
                    $return['premio_minimo']  = Agro_Util::formatCurrencyDb($novoPremioMinimo - $valorAdicionais);
                    $return['premio_liquido_minimo']  = Agro_Util::formatDbCurrency($novoPremioMinimo);
                    $return['premio_pagar_minimo']  =  Agro_Util::formatDbCurrency(($novoPremioMinimo + $custoApolice));
                } else {
                    $return = array(
                        'status' => false,
                        'msg'    => 'O prêmio mínimo de ' . Agro_Util::formatDbCurrency($premioMinimo) . ' não foi atingido.',
                        'confirm' => false
                    );
                }
            } else {
                $return = array(
                    'status' => false,
                    'msg'    => 'O prêmio mínimo de ' . Agro_Util::formatDbCurrency($premioMinimo) . ' não foi atingido.',
                    'confirm' => false
                );
            }
        }

        return $return;
    }

    public function RN_CALC_06(
        $dados,
        $parcelas,
        $inicioVigencia,
        $Proposta,
        $propriedades,
        $x = "",
        $flAtendimento = false,
        $vlPercentualSubvencaoFederal = null,
        $idTaxaSelecionada = null
    ) {

        $norte_nordeste = ['AC','AP','AM','PA','RO','RR','TO','AL','BA','CE','MA','PB','PE','PI','RN','SE'];

        $dados['premio_liquido'] = Agro_Util::formatCurrencyDb($dados['premio_liquido']);
        $dados['custo_apolice'] = Agro_Util::formatCurrencyDb($dados['custo_apolice']);
        $dados['premio_pagar'] = Agro_Util::formatCurrencyDb($dados['premio_pagar']);

        if ($flAtendimento) {
            $parcelamento = $Proposta->condicoes($inicioVigencia);
        } else {
            $parcelamento = $Proposta->condicoes();
        }
        
        $proponente = $Proposta->proponente();
        $propriedade = $Proposta->propriedade();

        $status = $Proposta->status();

        if ($parcelamento['fl_data_flexivel'] || $parcelamento['fl_percentual_flexivel']) {
            $parcelas = $parcelamento['nr_parcelas'];
        }

        try {
            // Inicializa Models
            $CondicoesPagamentoItensOpcoes  = new Produto_Model_CondicoesPagamentoItensOpcoes();
            $CondicoesPagamento             = new Produto_Model_CondicoesPagamento();

            //valores default de subvencao estadual aplicados ao estado de SP
            $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX  = $propriedades['PROD_SUBVENCAO_ESTADUAL_VALOR_MAX'];
      
            $PROD_SUBVENCAO_ESTADUAL            = $propriedades['PROD_PERCENT_SUBVENCAO_ESTADUAL'];

            //valores específicos de subvencao estadual aplicados ao estado do PR
            if ($propriedade['ds_sigla'] == 'PR') {
                $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX          = $propriedades['PROD_SUBVENCAO_ESTADUAL_VALOR_MAX_PR'];
                $PROD_SUBVENCAO_ESTADUAL                    = $propriedades['PROD_PERCENT_SUBVENCAO_ESTADUAL_PR'];
                $PROD_PERCENT_MIN_NC_SUBVENCAO_ESTADUAL_PR  = $propriedades['PROD_PERCENT_MIN_NC_SUBVENCAO_ESTADUAL_PR'];
                $PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_VALOR   = explode(',',$propriedades['PROD_SUBVENCAO_ESTADUAL_CULTURA_PR'])[0];
                $PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_ID      = explode(',',$propriedades['PROD_SUBVENCAO_ESTADUAL_CULTURA_PR'])[1];
            }
            
            // Busca Variáveis da configuracao do produto
            $PROD_DIAS_VENCIMENTO_PARCELA       = $propriedades['PROD_DIAS_VENCIMENTO_PARCELA'];
            $PROD_VALOR_MINIMO_PARCELA          = $propriedades['PROD_VALOR_MINIMO_PARCELA'];
            $PROD_SUBVENCAO_FEDERAL_VALOR_MAX   = $propriedades['PROD_SUBVENCAO_FEDERAL_VALOR_MAX'];
            $PROD_SUBVENCAO_FEDERAL             = ($propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL'] ? $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL'] : $vlPercentualSubvencaoFederal);

            /*
             * Verifica se o municipio/cultura possui um percentual de subvencao especial
             * senão, pega o percentual de subvencao padrao do produto (PROD_PERCENT_SUBVENCAO_FEDERAL)
             */
            if ($propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL_MUNICIPIO'] > 0 && $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL'] > 0 && ($Proposta->subvencao_cultura_municipio() || $Proposta->respostas('QUEST_ENQUADRADO_PRONAMP') || $Proposta->respostas('QUEST_PRODUTOR_ORGANICO'))) {
                //$PROD_SUBVENCAO_FEDERAL = $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL_MUNICIPIO'];
            }

            /*
            * Verfica se o proponente participa do programa ABC (RENOVAGRO)
            */
            $ProponentesInAbc = new Seguro_Model_ProponentesAbc();
            if ($ProponentesInAbc->existsCpfCnpj($proponente['cpf_cnpj'])) {
                $PROD_SUBVENCAO_FEDERAL = $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL_ABC'];
            }
    
            /*
            * Verifica se o municipio pertence a regiao N ou NE para uma subvencao especial
            */
            if (in_array($propriedade['ds_sigla'],$norte_nordeste)){
                $PROD_SUBVENCAO_FEDERAL = $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL_NORTE_NORDESTE'];
            }
    
            $Proponentes = new Seguro_Model_Proponentes();
            // Busca e calcula os valores da Subvencao Federal
            if ($Proposta->respostas('QUEST_SUBVENCAO_FEDERAL') || $dados['calc_subvencao_federal']) {
                
                
                $VALOR_SUBVENCAO_FEDERAL = ($dados['premio_pagar'] - $dados['custo_apolice']) * ($PROD_SUBVENCAO_FEDERAL / 100);
                $VALOR_SUBVENCAO_FEDERAL = Agro_Util::round($VALOR_SUBVENCAO_FEDERAL, 2);
             

             
                if ($VALOR_SUBVENCAO_FEDERAL > $PROD_SUBVENCAO_FEDERAL_VALOR_MAX) {
                    $VALOR_SUBVENCAO_FEDERAL = $PROD_SUBVENCAO_FEDERAL_VALOR_MAX;
                }
          
                // Busca valores CPF no ano
                $VALOR_SUBVENCAO_FEDERAL_PROPONENTE_ANO = $Proponentes->getValorSubvencaoFederalAno(
                    $proponente['cpf_cnpj'],
                    $Proposta->id,
                    $inicioVigencia
                );

                if (($VALOR_SUBVENCAO_FEDERAL + $VALOR_SUBVENCAO_FEDERAL_PROPONENTE_ANO) > $PROD_SUBVENCAO_FEDERAL_VALOR_MAX) {
                    $VALOR_SUBVENCAO_FEDERAL = $PROD_SUBVENCAO_FEDERAL_VALOR_MAX - $VALOR_SUBVENCAO_FEDERAL_PROPONENTE_ANO;
                    
                }
     
                if (!empty($propriedades['PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO'])) {
                    $propriedadeSubvencaoFederalGrupo = explode(',', $propriedades['PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO']);
                    $valorSubvencaoFederalGrupo = 0;
                    $idsTipoProduto = [];

                    foreach ($propriedadeSubvencaoFederalGrupo as $indice => $valorPropriedade) {
                        if ($indice === 0) {
                            $valorSubvencaoFederalGrupo = $valorPropriedade;
                            continue;
                        }

                        $idsTipoProduto[] = $valorPropriedade;
                    }

                    if (empty($idsTipoProduto)) {
                        return array(
                          'status' => false,
                          'msg'    => 'Produto com Subvenção Federal Por Grupo configurado, porém sem tipo selecionado, impossibilitando o cálculo do Parcelamento.'
                        );
                    }

                    $valorSubvencaoProponenteAnoGrupo = $Proponentes->getValorSubvencaoFederalAnoGrupo(
                        $proponente['cpf_cnpj'],
                        $Proposta->id,
                        $inicioVigencia,
                        $idsTipoProduto
                    );
                 
                    if (($VALOR_SUBVENCAO_FEDERAL + $valorSubvencaoProponenteAnoGrupo) > $valorSubvencaoFederalGrupo) {
                        $VALOR_SUBVENCAO_FEDERAL = $valorSubvencaoFederalGrupo - $valorSubvencaoProponenteAnoGrupo;
                    }
                   
                    if ($VALOR_SUBVENCAO_FEDERAL < 0 || $valorSubvencaoProponenteAnoGrupo > $valorSubvencaoFederalGrupo) {
                        $VALOR_SUBVENCAO_FEDERAL = 0;
                    }
                }
            } else {
                $VALOR_SUBVENCAO_FEDERAL = 0;
            }
        
            // Busca e calcula os valores da Subvencao Estadual
            if ($Proposta->respostas('QUEST_SUBVENCAO_ESTADUAL') || $dados['calc_subvencao_estadual']) {
           
                $VALOR_SUBVENCAO_FEDERAL_TMP = ($dados['premio_pagar'] - $dados['custo_apolice']) * ($PROD_SUBVENCAO_FEDERAL / 100);
                $VALOR_SUBVENCAO_FEDERAL_TMP = Agro_Util::round($VALOR_SUBVENCAO_FEDERAL_TMP, 2);
                
                if ($Proposta->respostas('QUEST_ENQUADRADO_PIN')) {
                    $VALOR_SUBVENCAO_ESTADUAL = $dados['premio_pagar'] - $VALOR_SUBVENCAO_FEDERAL;
                    $propriedades['PROD_VALOR_MINIMO_PARCELA'] = 0;
                        
                } else {
                    $PROD_SUBVENCAO_ESTADUAL = (float)$PROD_SUBVENCAO_ESTADUAL;
      
                    //o estadado do paraná calcula a subvenção sobre o valor total do prêmio
                    if ($propriedade['ds_sigla'] == 'PR' || $propriedade['ds_sigla'] == 'SP') {
                        $produto = $Proposta->produto();

                        //caso a cobertura for multirrisco deve considerar o limite mínimo de cobertura
                        //para a subvenção estadual do paraná
                        if ($produto['ds_chave_rn'] == 'MULTIRRISCO' && $propriedade['ds_sigla'] == 'PR') {
                            //testa para ver se é informado na tela o novo NC
                            $vlFranquiaProposta = $dados['vlFranquiaProposta'] ?? null;
                         
                            if (is_null($vlFranquiaProposta)) {
                                if (is_null($idTaxaSelecionada)) {
                                    $RsAgrupamento = $Proposta->agrupamento(true);
                                    $taxas = $Proposta->taxas(
                                        $RsAgrupamento['id'],
                                        $propriedades['PROD_PRODUCAO_GARANTIDA']
                                    );
                                    $coberturaPrincipal = $Proposta->produto_cobertura_principal();
                                    
                                    foreach ($taxas as $taxa) {
                                        if ($taxa['id_cobertura'] == $coberturaPrincipal['id']) {
                                            $vlFranquiaProposta = $taxa['vl_franquia'];
                                        }
                                    }
                                } else {
                                    $modelTaxaValores = new Comercializacao_Model_TaxasValores;
                                    $taxa = $modelTaxaValores->find($idTaxaSelecionada)->current();

                                    $vlFranquiaProposta = $taxa->vl_franquia;
                                }
                            }

                            //caso a franquia proposta não seja superior ou igual ao limite do percentual permitido
                            // zera o valor da subcenção
                            if ($vlFranquiaProposta >= $PROD_PERCENT_MIN_NC_SUBVENCAO_ESTADUAL_PR) {
                                $VALOR_SUBVENCAO_ESTADUAL = ($dados['premio_pagar'] - $dados['custo_apolice']) * ($PROD_SUBVENCAO_ESTADUAL / 100);
                               
                            } else {
                                
                                $VALOR_SUBVENCAO_ESTADUAL = 0;
                            }
                        } else {
                            //para as outras coberturas, normalmente
                            $VALOR_SUBVENCAO_ESTADUAL = ($dados['premio_pagar'] - $dados['custo_apolice']) * ($PROD_SUBVENCAO_ESTADUAL / 100);
                            
                        }
                    } else {
                        // outros estados calculam sobre o restante do valor sem a subvenção federal
                        $VALOR_SUBVENCAO_ESTADUAL = ($dados['premio_pagar'] - $dados['custo_apolice'] - $VALOR_SUBVENCAO_FEDERAL_TMP) * ($PROD_SUBVENCAO_ESTADUAL / 100);
                                      
                    }
                }

                //TRUNCATE (orientação somente utilizada para subvencao estadual do estado de SP)
                if ($propriedade['ds_sigla'] == 'SP') {
                    $VALOR_SUBVENCAO_ESTADUAL = floor($VALOR_SUBVENCAO_ESTADUAL * 100) / 100;//truncate
                } else {
                    //SE A TERCEIRA CASA DECIMAL FOR IGUAL A 5 ARREDONDA PARA BAIXO
                    $VALOR_SUBVENCAO_ESTADUAL = (string)$VALOR_SUBVENCAO_ESTADUAL;
                    $pos = strpos($VALOR_SUBVENCAO_ESTADUAL, '.') + 3;
                    if ($VALOR_SUBVENCAO_ESTADUAL[$pos] == 5) {
                        $VALOR_SUBVENCAO_ESTADUAL -= 0.001;
                        $VALOR_SUBVENCAO_ESTADUAL = round($VALOR_SUBVENCAO_ESTADUAL, 2);
                    }
                }

                //Verificação da subvenção do paraná por cultura
                if (($propriedade['ds_sigla'] == 'PR') && isset($PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_VALOR) && isset($PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_ID)) {
                   
                    $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO_CULTURA = $Proponentes->getValorSubvencaoEstadualAnoPorCultura(
                        $proponente['cpf_cnpj'],
                        $inicioVigencia,
                        $Proposta->id,
                        $propriedade['ds_sigla'],
                        $PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_ID
                    );
                    if (($VALOR_SUBVENCAO_ESTADUAL + $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO_CULTURA) > $PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_VALOR) {
                        $VALOR_SUBVENCAO_ESTADUAL = $PROD_SUBVENCAO_ESTADUAL_CULTURA_PR_VALOR - $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO_CULTURA;
                    }
                }

                // Busca valores CPF no ano
                $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO = $Proponentes->getValorSubvencaoEstadualAno(
                    $proponente['cpf_cnpj'],
                    $inicioVigencia,
                    $Proposta->id,
                    $propriedade['ds_sigla']
                );
                if (($VALOR_SUBVENCAO_ESTADUAL + $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO) > $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX) {
                    $VALOR_SUBVENCAO_ESTADUAL = $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX - $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO;
                }
                
                if (!$dados['calc_subvencao_federal']) {
                    if (!$Proposta->respostas('QUEST_SUBVENCAO_FEDERAL')) {
                        $PROD_SUBVENCAO_FEDERAL_VALOR_MAX = 0;
                        $PROD_SUBVENCAO_FEDERAL = 0;
                        $VALOR_SUBVENCAO_FEDERAL = 0;
                    }
                }

            } else {
                $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX = 0;
                $PROD_SUBVENCAO_ESTADUAL = 0;
                $VALOR_SUBVENCAO_ESTADUAL = 0;
            }

            // Calcula os valores do valor do segurado
            // DEFINICOES DE PARCELAMENTO
            $return = array('qtdParcelas' => $parcelas);
            $somaSubvencaoEstadual = 0;
            $somaSubvencaoFederal = 0;
            $somaPremioLiquido = 0;

            if ((($VALOR_SUBVENCAO_FEDERAL + $VALOR_SUBVENCAO_ESTADUAL) >= ($dados['premio_pagar'] - $dados['custo_apolice'])) && $propriedade['ds_sigla'] == 'PR') {
                //zera o prêmio caso o valor das subvenções for maior que o valor do prêmio
                $VALOR_SEGURADO = 0;
            } else {
                // verifica se existe condicao com percentual flexivel
                $VALOR_SEGURADO = ($dados['premio_pagar'] - $VALOR_SUBVENCAO_FEDERAL - $VALOR_SUBVENCAO_ESTADUAL - $dados['custo_apolice']);
            }
            
            // força parcelamento para tovese.bayer de acordo com o valor para pagamento parcial estipulado no questionario
            if (Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA')) > 0) {
                if (Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA')) >= $VALOR_SEGURADO) {
                    $parcelas = 1;
                } else {
                    $parcelas = 2;
                }
            }

            for ($i = 1; $i <= $parcelas; $i++) {
                if ($parcelamento['fl_data_flexivel'] || $parcelamento['fl_percentual_flexivel']) {
                    $Opcao = $CondicoesPagamentoItensOpcoes->getItensOpcoes($parcelamento['id'], $i);
                }

                // Verifica se existe condicao com a data flexivel
                if ($parcelamento['fl_data_flexivel']) {
                    if ($i == 1) { // Primeira parcela
                        /**
                         * Se a opção 'Considerar data informada' (Formulário de Parcelamento) estiver marcada,
                         * deve-se ignorar a configuração 'Prazo de vencimento da primeira parcela' (Produtos > Configurações > Produtos > aba Propriedades)
                         */
                        if ($parcelamento['fl_considerar_data_informada_primeira_parcela']) {
                            $vencimento = strtotime($Opcao->dt_vencimento_parcela);
                        } else {
                            $vencimento = mktime(
                                0,
                                0,
                                0,
                                date("m", strtotime($inicioVigencia)),
                                date("d", strtotime($inicioVigencia)) + $PROD_DIAS_VENCIMENTO_PARCELA,
                                date("Y", strtotime($inicioVigencia))
                            );
                        }
                    } else { // Demais parcelas
                        $vencimento = strtotime($Opcao->dt_vencimento_parcela);
                    }

                    $DATA_VENCIMENTO = date('d/m/Y', $vencimento);
                } else {
                    if ($i == 1) { // Primeira parcela
                        $vencimento = mktime(
                            0,
                            0,
                            0,
                            date("m", strtotime($inicioVigencia)),
                            date("d", strtotime($inicioVigencia)) + $PROD_DIAS_VENCIMENTO_PARCELA,
                            date("Y", strtotime($inicioVigencia))
                        );
                        $vencimento_primeira = date('Y-m-d', $vencimento);
                    } else { // Demais parcelas
                        $vencimento = mktime(
                            0,
                            0,
                            0,
                            date("m", strtotime($vencimento_primeira)) + ($i - 1),
                            date("d", strtotime($vencimento_primeira)),
                            date("Y", strtotime($vencimento_primeira))
                        );
                    }

                    $DATA_VENCIMENTO = date('d/m/Y', $vencimento);
                }

                /*
                 * REGRA ESPECIAL PARA DATA DE VENCIMENTO DA PRIMEIRA e SEGUNDA PARCELA PARA aurora (uva de vinho)
                */
                $arUvaVinhoSafras = array(936, 1012, 1098);
                if ((
                    Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'agrorural.aurora'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'pasq.aurora'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'fiducia.aurora'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'rp.aurora'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'pasq.garibaldi'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'rp.garibaldi'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'rp.garibaldi'
                    || Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'agrocenter.aurora'
                )
                && (in_array($Proposta->id_produto, $arUvaVinhoSafras))
                ) {
                    if ($i == 1) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 20;
                    }

                    if ($i == 2) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 50;
                    }

                    if ($i == 3) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 80;
                    }

                    if ($i == 4) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 110;
                    }

                    if ($i == 5) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 140;
                    }

                    if ($i == 6) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 170;
                    }

                    if ($i == 7) {
                        $PROD_DIAS_VENCIMENTO_PARCELA = 200;
                    }

                    $vencimento = mktime(
                        0,
                        0,
                        0,
                        date("m", strtotime($inicioVigencia)),
                        date("d", strtotime($inicioVigencia)) + $PROD_DIAS_VENCIMENTO_PARCELA,
                        date("Y", strtotime($inicioVigencia))
                    );
                    $DATA_VENCIMENTO = date('d/m/Y', $vencimento);
                }
                /*
                 * FIM REGRA ESPECIAL PARA DATA DE VENCIMENTO DA PRIMEIRA PARCELA PARA aurora
                */

                /*
                 * REGRA ESPECIAL PARA DATA DE VENCIMENTO DA PRIMEIRA PARCELA PARA fortgroup.
                */
                if (Agro_Util::getUserName($Proposta->id_usuario_criacao) == 'fortgroup.fischer'
                  && (int)$Proposta->id_cultura === Produto_Model_Culturas::ID_MACA
                ) {
                    if ($i == 1) {
                        $dia = date("d");
                        $mes = date("m");
                        $ano = date("Y");

                        if ($dia >= 1 and $dia <= 10) {
                            $dia_venc = "30";
                            $mes_venc = $mes;
                            $ano_venc = $ano;
                        } elseif ($dia >= 11 and $dia <= 20) {
                            $dia_venc = "10";
                            if ($mes == "12") {
                                $mes_venc = "01";
                                $ano_venc = $ano + 1;
                            } else {
                                $mes_venc = $mes + 1;
                                $ano_venc = $ano;
                            }
                        } else {
                            $dia_venc = "20";
                            if ($mes == "12") {
                                $mes_venc = "01";
                                $ano_venc = $ano + 1;
                            } else {
                                $mes_venc = $mes + 1;
                                $ano_venc = $ano;
                            }
                        }
                        if (strlen($dia_venc) == 1) {
                            $dia_venc = "0" . $dia_venc;
                        }
                        if (strlen($mes_venc) == 1) {
                            $mes_venc = "0" . $mes_venc;
                        }
                        $DATA_VENCIMENTO = $dia_venc . "/" . $mes_venc . "/" . $ano_venc;
                    }
                }
                /*
                 * FIM REGRA ESPECIAL PARA DATA DE VENCIMENTO DA PRIMEIRA PARCELA PARA fortgroup.fischer
                */

                $loginsToveseRegra = ['tovese.cotrijal', 'tovese.cotrijal.ibge', 'tovese.cotrijalcevadaqualidade'];
                $safrasRegra = [20, 21, 24];
                $Produto = $Proposta->produto();

                /*
                 * REGRA ESPECIAL PARA DATA DE VENCIMENTO DA PRIMEIRA PARCELA PARA prepostos Tovese
                 */
                if (
                    in_array(Agro_Util::getUserName($Proposta->id_usuario_criacao), $loginsToveseRegra)
                    && in_array($Produto['id_safra'], $safrasRegra)
                ) {
                    if ($i == 1) {
                        $dia = date("d");
                        $mes = date("m");
                        $ano = date("Y");

                        if ($dia >= 1 and $dia <= 10) {
                            $dia_venc = "30";
                            $mes_venc = $mes;
                            $ano_venc = $ano;
                        } elseif ($dia >= 11 and $dia <= 20) {
                            $dia_venc = "10";
                            if ($mes == "12") {
                                $mes_venc = "01";
                                $ano_venc = $ano + 1;
                            } else {
                                $mes_venc = $mes + 1;
                                $ano_venc = $ano;
                            }
                        } else {
                            $dia_venc = "20";
                            if ($mes == "12") {
                                $mes_venc = "01";
                                $ano_venc = $ano + 1;
                            } else {
                                $mes_venc = $mes + 1;
                                $ano_venc = $ano;
                            }
                        }
                        if (strlen($dia_venc) == 1) {
                            $dia_venc = "0" . $dia_venc;
                        }
                        if (strlen($mes_venc) == 1) {
                            $mes_venc = "0" . $mes_venc;
                        }
                        $DATA_VENCIMENTO = $dia_venc . "/" . $mes_venc . "/" . $ano_venc;
                    }
                }
                /*
                 * FIM REGRA ESPECIAL PARA DATA DE VENCIMENTO DA PRIMEIRA PARCELA PARA prepostos Tovese
                 */

                if ($parcelamento['fl_percentual_flexivel']) {
                    $VALOR_PARCELA_SEGURADO = ($VALOR_SEGURADO * (($Opcao->vl_percentual_parcela / 100)));
                } else {
                    $VALOR_PARCELA_SEGURADO = ($VALOR_SEGURADO / $parcelas);
                }

                // Adiciona o custo da apólice
                if ($i == 1) { // Primeira parcela
                    $VALOR_PARCELA_SEGURADO = $VALOR_PARCELA_SEGURADO + $dados['custo_apolice'];

                    //Regra especial para tovese.bayer
                    if (Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA')) > 0) {
                        $VALOR_PARCELA_SEGURADO = $VALOR_SEGURADO - Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA'));
                        if ($parcelas == 2) {
                            $vl_saldo_pagto_parcial = Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA'));
                        }
                    }
                //Fim Regra especial para tovese.bayer
                } else {
                    if (Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA')) > 0) {
                        $VALOR_PARCELA_SEGURADO = $vl_saldo_pagto_parcial;
                    }
                }

                if ($parcelamento['fl_percentual_flexivel']) {
                    $VALOR_PARCELA_SUBVENCAO_FEDERAL = ($VALOR_SUBVENCAO_FEDERAL ? (Agro_Util::round(
                        (($VALOR_SUBVENCAO_FEDERAL * $Opcao->vl_percentual_parcela) / 100),
                        2
                    )) : 0);
                    $VALOR_PARCELA_SUBVENCAO_ESTADUAL = ($VALOR_SUBVENCAO_ESTADUAL ? (Agro_Util::round(
                        (($VALOR_SUBVENCAO_ESTADUAL * $Opcao->vl_percentual_parcela) / 100),
                        2
                    )) : 0);
                } else {
                    $VALOR_PARCELA_SUBVENCAO_FEDERAL = ($VALOR_SUBVENCAO_FEDERAL ? (Agro_Util::round(
                        ($VALOR_SUBVENCAO_FEDERAL / $parcelas),
                        2
                    )) : 0);
                    $VALOR_PARCELA_SUBVENCAO_ESTADUAL = ($VALOR_SUBVENCAO_ESTADUAL ? (Agro_Util::round(
                        ($VALOR_SUBVENCAO_ESTADUAL / $parcelas),
                        2
                    )) : 0);
                }
                
                if (is_array($propriedades)) {
                    if ((array_key_exists(
                        'PROD_VALOR_MINIMO_PARCELA',
                        $propriedades
                    )) && ($VALOR_PARCELA_SEGURADO < $propriedades['PROD_VALOR_MINIMO_PARCELA']) && !$parcelamento['fl_data_flexivel'] && !$parcelamento['fl_percentual_flexivel'] && !Agro_Util::formatCurrencyDb($Proposta->respostas('QUEST_PAGAMENTO_PARCIAL_PARCELA')) > 0) {
                        return array(
                          'status' => false,
                          'msg'    => 'O Valor da parcela não atingiu o valor mínimo de R$' . Agro_Util::formatDbCurrency($propriedades['PROD_VALOR_MINIMO_PARCELA'])
                        );
                    } else {
                        $VALOR_PREMIO_LIQUIDO = $VALOR_PARCELA_SEGURADO + $VALOR_PARCELA_SUBVENCAO_FEDERAL + $VALOR_PARCELA_SUBVENCAO_ESTADUAL;

                        $return['status'] = true;
                        $somaPremioLiquido = $somaPremioLiquido + $VALOR_PREMIO_LIQUIDO;
                        $somaSubvencaoEstadual = $somaSubvencaoEstadual + $VALOR_PARCELA_SUBVENCAO_ESTADUAL;
                        $somaSubvencaoFederal = $somaSubvencaoFederal + $VALOR_PARCELA_SUBVENCAO_FEDERAL;

                        if ($i == $parcelas) {
                            $diff = $somaSubvencaoFederal - $VALOR_SUBVENCAO_FEDERAL;
                            $VALOR_PARCELA_SUBVENCAO_FEDERAL = $VALOR_PARCELA_SUBVENCAO_FEDERAL - $diff;
                            $somaSubvencaoFederal -= $diff;

                            $diff_estadual = $somaSubvencaoEstadual - $VALOR_SUBVENCAO_ESTADUAL;
                            $VALOR_PARCELA_SUBVENCAO_ESTADUAL = $VALOR_PARCELA_SUBVENCAO_ESTADUAL - $diff_estadual;
                            $somaSubvencaoEstadual -= $diff_estadual;
                        }

                        $validacaoSubvencao = $Proposta->subvencaoCultura();
                        $validacaoSubvencaoGrupo = $Proposta->subvencaoCulturaGrupoCorretores();

                        if ($propriedades['PROD_DATA_PARCELA_SUBVENCAO_SEGURADO']) {
                            $return['itens'][$i]['premio_liquido'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                            $return['itens'][$i]['premio_federal'] = Agro_Util::formatDbCurrency(0);
                            $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency(0);
                            $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                            $return['itens'][$i]['vencimento'] = $DATA_VENCIMENTO;

                            if ($i == $parcelas && ($somaSubvencaoFederal > 0 || $somaSubvencaoEstadual > 0)) {
                                $vencimento = mktime(
                                    0,
                                    0,
                                    0,
                                    date("m", $DATA_VENCIMENTO),
                                    date("d", $DATA_VENCIMENTO) + 30,
                                    date("Y", $DATA_VENCIMENTO)
                                );
                                $add = $i + 1;

                                if ($propriedades['PROD_DATA_PARCELA_SUBVENCAO_SEGURADO']) {
                                    $return['itens'][$add]['premio_liquido'] = Agro_Util::formatDbCurrency($somaSubvencaoFederal + $somaSubvencaoEstadual);
                                    $return['itens'][$add]['premio_federal'] = Agro_Util::formatDbCurrency($somaSubvencaoFederal);
                                    $return['itens'][$add]['premio_estadual'] = Agro_Util::formatDbCurrency($somaSubvencaoEstadual);
                                    $return['itens'][$add]['premio_segurado'] = Agro_Util::formatDbCurrency(0);
                                    $return['itens'][$add]['vencimento'] = $propriedades['PROD_DATA_PARCELA_SUBVENCAO_SEGURADO'];
                                } else {
                                    return array(
                                      'status' => false,
                                      'msg'    => 'Data de Vencimento da Parcela de Subvenção Federal não configurada.'
                                    );
                                }
                            }

                            $somaSegurado = $somaSegurado + round($VALOR_PARCELA_SEGURADO, 2);
                        } else {
                            $return['itens'][$i]['premio_liquido'] = Agro_Util::formatDbCurrency($VALOR_PREMIO_LIQUIDO);
                            $return['itens'][$i]['premio_federal'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SUBVENCAO_FEDERAL);
                            $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SUBVENCAO_ESTADUAL);
                            $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                            $return['itens'][$i]['vencimento'] = $DATA_VENCIMENTO;
                            $somaSegurado = $somaSegurado + round($VALOR_PARCELA_SEGURADO, 2);
                            /*
                            if($i == 1){
                                $return['itens'][$i]['premio_liquido']  = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO + $VALOR_SUBVENCAO_FEDERAL + $VALOR_SUBVENCAO_ESTADUAL);
                                $return['itens'][$i]['premio_federal']  = Agro_Util::formatDbCurrency($VALOR_SUBVENCAO_FEDERAL);
                                $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency($VALOR_SUBVENCAO_ESTADUAL);
                                $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                                $return['itens'][$i]['vencimento']      = $DATA_VENCIMENTO;
                            } else {
                                $return['itens'][$i]['premio_liquido']  = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                                $return['itens'][$i]['premio_federal']  = Agro_Util::formatDbCurrency(0);
                                $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency(0);
                                $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                                $return['itens'][$i]['vencimento']      = $DATA_VENCIMENTO;
                            }
                            $somaSegurado = $somaSegurado + round($VALOR_PARCELA_SEGURADO, 2);
                            */
                        }
                    }
                } else {
                    $this->message = "Proriedades não configuradas.";
                    $this->error = true;

                    return false;
                }
            }

            if ($Proposta->respostas('QUEST_SUBVENCAO_FEDERAL') == '1') {
                if ($status != 'NAO_ENVIADA' && $status != 'DEVOLVIDA') {
                    $somaSubvencaoFederalValidacao = $somaSubvencaoFederal - $Proposta->subvencao_federal();
                
                } else {
                    $somaSubvencaoFederalValidacao = $somaSubvencaoFederal;
                }
                $somaSubvencaoFederalValidacao = Agro_Util::round($somaSubvencaoFederalValidacao, 2);

                //EXECUTA VALIDACAO DE LIMITES DE SUBVENCAO POR CULTURA/CORRETOR
                $subvencao = $Proposta->subvencaoCultura();

                //NÃO EXECUTA A VALIDAÇÃO SE O VALOR DA SUBVENÇÃO FOR DESTINADO A UMA PARCELA DO SEGURADO
                if (!$propriedades['PROD_DATA_PARCELA_SUBVENCAO_SEGURADO']) {
                    if (!$subvencao['grupo']) {
                        $msg_erro_subvencao = 'Grupo de Subvenção não encontrado.';
                    } else {
                       
                        if ($somaSubvencaoFederalValidacao < 0.01) {
                            $somaSubvencaoFederalValidacao = 0;
                        }

                        if (($subvencao['usado'] + $somaSubvencaoFederalValidacao) > $subvencao['liberado']) {
                            $msg_erro_subvencao = 'O Valor da Subvenção Federal atingiu o limite liberado para esta Cultura / Corretor. (Grupo: ' . $subvencao['grupo'] . ')';
                        }
                      
                        //EXECUTA VALIDACAO DE LIMITES DE SUBVENCAO POR CULTURA/GRUPO DE CORRETORES
                        $subvencao = $Proposta->subvencaoCulturaGrupoCorretores();
                     
                        if ($subvencao['liberado'] != '') {
                            if ($somaSubvencaoFederalValidacao < 0.01) {
                                $somaSubvencaoFederalValidacao = 0;
                            }
                            if (($subvencao['usado'] + $somaSubvencaoFederalValidacao) > $subvencao['liberado']) {
                                $msg_erro_subvencao = 'O Valor da Subvenção Federal atingiu o limite liberado para esta Cultura / Grupo de Corretores.';
                            } else {
                                unset($msg_erro_subvencao);
                            }
                        }
                    }
                }
            }

            if ($msg_erro_subvencao) {
                return array('status' => false, 'msg' => $msg_erro_subvencao);
            }

            $VALOR_SEGURADO += $dados['custo_apolice'];

            if ($somaSegurado > $VALOR_SEGURADO) {
                
                $dif = Agro_Util::round(($somaSegurado - $VALOR_SEGURADO), 2);
                $val = Agro_Util::round(($VALOR_PARCELA_SEGURADO - $dif), 2);

                $return['itens'][$i - 1]['premio_segurado'] = Agro_Util::formatDbCurrency($val);
                $return['itens'][$i - 1]['premio_liquido'] = Agro_Util::formatDbCurrency($val + $VALOR_PARCELA_SUBVENCAO_FEDERAL + $VALOR_PARCELA_SUBVENCAO_ESTADUAL);
            } elseif ($somaSegurado < $VALOR_SEGURADO) {
           
                $dif = Agro_Util::round(($VALOR_SEGURADO - $somaSegurado), 2);
                $val = Agro_Util::round(($VALOR_PARCELA_SEGURADO + $dif), 2);
              
                $return['itens'][$i - 1]['premio_segurado'] = Agro_Util::formatDbCurrency($val);
                $return['itens'][$i - 1]['premio_liquido'] = Agro_Util::formatDbCurrency($val + $VALOR_PARCELA_SUBVENCAO_FEDERAL + $VALOR_PARCELA_SUBVENCAO_ESTADUAL);
            }
           
            return $return;
        } catch (Exception $e) {
            die($e);
        }
    }

    public function RN_CALC_ENDOSSO($dados, $parcelas, $inicioVigencia, $Proposta)
    {
        $dados['premio_liquido'] = Agro_Util::formatCurrencyDb($dados['premio_liquido']);
        $dados['custo_apolice'] = Agro_Util::formatCurrencyDb($dados['custo_apolice']);
        $dados['premio_pagar'] = Agro_Util::formatCurrencyDb($dados['premio_pagar']);
        $propriedades = $Proposta->atributos_rn('PROPRIEDADE');
        $parcelamento = $Proposta->condicoes();
        $proponente = $Proposta->proponente();
        $propriedade = $Proposta->propriedade();
        $status = $Proposta->status();
        
        try {
            // Inicializa Models
            $CondicoesPagamentoItensOpcoes = new Produto_Model_CondicoesPagamentoItensOpcoes();
            $CondicoesPagamento = new Produto_Model_CondicoesPagamento();

            // Busca Variáveis da configuracao do produto
            $PROD_DIAS_VENCIMENTO_PARCELA = $propriedades['PROD_DIAS_VENCIMENTO_PARCELA'];
            $PROD_VALOR_MINIMO_PARCELA = $propriedades['PROD_VALOR_MINIMO_PARCELA'];
            $PROD_SUBVENCAO_FEDERAL_VALOR_MAX = $propriedades['PROD_SUBVENCAO_FEDERAL_VALOR_MAX'];
            $PROD_SUBVENCAO_FEDERAL = $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL'];

            //valores default de subvencao estadual aplicados ao estado de SP
            $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX = $propriedades['PROD_SUBVENCAO_ESTADUAL_VALOR_MAX'];
            $PROD_SUBVENCAO_ESTADUAL = $propriedades['PROD_PERCENT_SUBVENCAO_ESTADUAL'];

            //valores específicos de subvencao estadual aplicados ao estado do PR
            if ($propriedade['ds_sigla'] == 'PR') {
                $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX = $propriedades['PROD_SUBVENCAO_ESTADUAL_VALOR_MAX_PR'];
                $PROD_SUBVENCAO_ESTADUAL = $propriedades['PROD_PERCENT_SUBVENCAO_ESTADUAL_PR'];
            }

            /*
             * Verifica se o municipio/cultura possui um percentual de subvencao especial
            * senão, pega o percentual de subvencao padrao do produto (PROD_PERCENT_SUBVENCAO_FEDERAL)
            */
            if ($propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL_MUNICIPIO'] && ($Proposta->subvencao_cultura_municipio() || $Proposta->respostas('QUEST_ENQUADRADO_PRONAMP') || $Proposta->respostas('QUEST_PRODUTOR_ORGANICO'))) {
                $PROD_SUBVENCAO_FEDERAL = $propriedades['PROD_PERCENT_SUBVENCAO_FEDERAL_MUNICIPIO'];
            }

            $Proponentes = new Seguro_Model_Proponentes();
            // Busca e calcula os valores da Subvencao Federal
            if ($dados['calc_subvencao_federal']) {
                $VALOR_SUBVENCAO_FEDERAL = ($dados['premio_pagar'] - $dados['custo_apolice']) * ($PROD_SUBVENCAO_FEDERAL / 100);
                $VALOR_SUBVENCAO_FEDERAL = round($VALOR_SUBVENCAO_FEDERAL, 2);

                if ($VALOR_SUBVENCAO_FEDERAL > $PROD_SUBVENCAO_FEDERAL_VALOR_MAX) {
                    $VALOR_SUBVENCAO_FEDERAL = $PROD_SUBVENCAO_FEDERAL_VALOR_MAX;
                }

                // Busca valores CPF no ano
                $VALOR_SUBVENCAO_FEDERAL_PROPONENTE_ANO = $Proponentes->getValorSubvencaoFederalAno(
                    $proponente['cpf_cnpj'],
                    $Proposta->id,
                    $inicioVigencia
                );
                if (($VALOR_SUBVENCAO_FEDERAL + $VALOR_SUBVENCAO_FEDERAL_PROPONENTE_ANO) > $PROD_SUBVENCAO_FEDERAL_VALOR_MAX) {
                    $VALOR_SUBVENCAO_FEDERAL = $PROD_SUBVENCAO_FEDERAL_VALOR_MAX - $VALOR_SUBVENCAO_FEDERAL_PROPONENTE_ANO;
                }

                if (!empty($propriedades['PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO'])) {
                    $propriedadeSubvencaoFederalGrupo = explode(',', $propriedades['PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO']);
                    $valorSubvencaoFederalGrupo = 0;
                    $idsTipoProduto = [];

                    foreach ($propriedadeSubvencaoFederalGrupo as $indice => $valorPropriedade) {
                        if ($indice === 0) {
                            $valorSubvencaoFederalGrupo = $valorPropriedade;
                            continue;
                        }

                        $idsTipoProduto[] = $valorPropriedade;
                    }

                    if (empty($idsTipoProduto)) {
                        return array(
                          'status' => false,
                          'msg'    => 'Produto com Subvenção Federal Por Grupo configurado, porém sem tipo selecionado, impossibilitando o cálculo do Parcelamento.'
                        );
                    }

                    $valorSubvencaoProponenteAnoGrupo = $Proponentes->getValorSubvencaoFederalAnoGrupo(
                        $proponente['cpf_cnpj'],
                        $Proposta->id,
                        $inicioVigencia,
                        $idsTipoProduto
                    );

                    if (($VALOR_SUBVENCAO_FEDERAL + $valorSubvencaoProponenteAnoGrupo) > $valorSubvencaoFederalGrupo) {
                        $VALOR_SUBVENCAO_FEDERAL = $valorSubvencaoFederalGrupo - $valorSubvencaoProponenteAnoGrupo;
                    }

                    if ($VALOR_SUBVENCAO_FEDERAL < 0 || $valorSubvencaoProponenteAnoGrupo > $valorSubvencaoFederalGrupo) {
                        $VALOR_SUBVENCAO_FEDERAL = 0;
                    }
                }
            } else {
                $VALOR_SUBVENCAO_FEDERAL = 0;
            }

            // Busca e calcula os valores da Subvencao Estadual
            if ($dados['calc_subvencao_estadual']) {
                $VALOR_SUBVENCAO_ESTADUAL = ($dados['premio_pagar'] - $dados['custo_apolice'] - $VALOR_SUBVENCAO_FEDERAL) * ($PROD_SUBVENCAO_ESTADUAL / 100);

                //SE A TERCEIRA CASA DECIMAL FOR IGUAL A 5 ARREDONDA PARA BAIXO
                //(orientação somente utilizada para subvencao estadual do estado de SP)
                $VALOR_SUBVENCAO_ESTADUAL = (string)$VALOR_SUBVENCAO_ESTADUAL;
                $pos = strpos($VALOR_SUBVENCAO_ESTADUAL, '.') + 3;
                if ($VALOR_SUBVENCAO_ESTADUAL[$pos] == 5) {
                    $VALOR_SUBVENCAO_ESTADUAL -= 0.001;
                    $VALOR_SUBVENCAO_ESTADUAL = round($VALOR_SUBVENCAO_ESTADUAL, 2);
                }

                // Busca valores CPF no ano
                $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO = $Proponentes->getValorSubvencaoEstadualAno(
                    $proponente['cpf_cnpj'],
                    $inicioVigencia,
                    $Proposta->id,
                    $propriedade['ds_sigla']
                );

                /*
                if ($VALOR_SUBVENCAO_ESTADUAL > $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX['ds_valor']) {
                    $VALOR_SUBVENCAO_ESTADUAL = $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX['ds_valor'];
                }
                */
                if (($VALOR_SUBVENCAO_ESTADUAL + $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO) > $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX) {
                    $VALOR_SUBVENCAO_ESTADUAL = $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX - $VALOR_SUBVENCAO_ESTADUAL_PROPONENTE_ANO;
                }

                if (!$dados['calc_subvencao_federal']) {
                    if (!$Proposta->respostas('QUEST_SUBVENCAO_FEDERAL')) {
                        $PROD_SUBVENCAO_FEDERAL_VALOR_MAX = 0;
                        $PROD_SUBVENCAO_FEDERAL = 0;
                        $VALOR_SUBVENCAO_FEDERAL = 0;
                    }
                }
            } else {
                $PROD_SUBVENCAO_ESTADUAL_VALOR_MAX = 0;
                $PROD_SUBVENCAO_ESTADUAL = 0;
                $VALOR_SUBVENCAO_ESTADUAL = 0;
            }

            // Calcula os valores do valor do segurado
            // DEFINICOES DE PARCELAMENTO
            $return = array('qtdParcelas' => $parcelas);
            $somaSubvencaoEstadual = 0;
            $somaSubvencaoFederal = 0;
            $somaPremioLiquido = 0;

            for ($i = 1; $i <= $parcelas; $i++) {
                $vencimento = mktime(
                    0,
                    0,
                    0,
                    date("m", strtotime($inicioVigencia)),
                    date("d", strtotime($inicioVigencia)) + $PROD_DIAS_VENCIMENTO_PARCELA,
                    date("Y", strtotime($inicioVigencia))
                );
                $DATA_VENCIMENTO = date('d/m/Y', $vencimento);

                // verifica se existe condicao com percentual flexivel
                $VALOR_SEGURADO = ($dados['premio_pagar'] - $VALOR_SUBVENCAO_FEDERAL - $VALOR_SUBVENCAO_ESTADUAL - $dados['custo_apolice']);

                $VALOR_PARCELA_SEGURADO = ($VALOR_SEGURADO / $parcelas);

                // Adiciona o custo da apólice
                if ($i == 1) { // Primeira parcela
                    $VALOR_PARCELA_SEGURADO = $VALOR_PARCELA_SEGURADO + $dados['custo_apolice'];
                }

                if ($parcelamento['fl_percentual_flexivel']) {
                    $VALOR_PARCELA_SUBVENCAO_FEDERAL = ($VALOR_SUBVENCAO_FEDERAL ? (Agro_Util::round(
                        (($VALOR_SUBVENCAO_FEDERAL * $Opcao->vl_percentual_parcela) / 100),
                        2
                    )) : 0);
                    $VALOR_PARCELA_SUBVENCAO_ESTADUAL = ($VALOR_SUBVENCAO_ESTADUAL ? (Agro_Util::round(
                        (($VALOR_SUBVENCAO_ESTADUAL * $Opcao->vl_percentual_parcela) / 100),
                        2
                    )) : 0);
                } else {
                    $VALOR_PARCELA_SUBVENCAO_FEDERAL = ($VALOR_SUBVENCAO_FEDERAL ? (Agro_Util::round(
                        ($VALOR_SUBVENCAO_FEDERAL / $parcelas),
                        2
                    )) : 0);
                    $VALOR_PARCELA_SUBVENCAO_ESTADUAL = ($VALOR_SUBVENCAO_ESTADUAL ? (Agro_Util::round(
                        ($VALOR_SUBVENCAO_ESTADUAL / $parcelas),
                        2
                    )) : 0);
                }

                $VALOR_PREMIO_LIQUIDO = $VALOR_PARCELA_SEGURADO + $VALOR_PARCELA_SUBVENCAO_FEDERAL + $VALOR_PARCELA_SUBVENCAO_ESTADUAL;

                $return['status'] = true;
                $somaPremioLiquido = $somaPremioLiquido + $VALOR_PREMIO_LIQUIDO;
                $somaSubvencaoEstadual = $somaSubvencaoEstadual + $VALOR_PARCELA_SUBVENCAO_ESTADUAL;
                $somaSubvencaoFederal = $somaSubvencaoFederal + $VALOR_PARCELA_SUBVENCAO_FEDERAL;

                if ($i == $parcelas) {
                    $diff = $somaSubvencaoFederal - $VALOR_SUBVENCAO_FEDERAL;
                    $VALOR_PARCELA_SUBVENCAO_FEDERAL = $VALOR_PARCELA_SUBVENCAO_FEDERAL - $diff;

                    $diff_estadual = $somaSubvencaoEstadual - $VALOR_SUBVENCAO_ESTADUAL;
                    $VALOR_PARCELA_SUBVENCAO_ESTADUAL = $VALOR_PARCELA_SUBVENCAO_ESTADUAL - $diff_estadual;
                }

                if ($i == 1) {
                    $VALOR_PREMIO_LIQUIDO -= $dados['custo_apolice'];
                }

                switch ($propriedades['PROD_CALCULO_SUBVENCAO']) {
                    case '1':
                        if ($i == $parcelas) {
                            $return['itens'][$i]['premio_liquido'] = Agro_Util::formatDbCurrency($VALOR_PREMIO_LIQUIDO);
                            $return['itens'][$i]['premio_federal'] = Agro_Util::formatDbCurrency($somaSubvencaoFederal);
                            $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency($somaSubvencaoEstadual);
                            $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                            $return['itens'][$i]['vencimento'] = $DATA_VENCIMENTO;
                        } else {
                            $return['itens'][$i]['premio_liquido'] = Agro_Util::formatDbCurrency($VALOR_PREMIO_LIQUIDO);
                            $return['itens'][$i]['premio_federal'] = Agro_Util::formatDbCurrency(0);
                            $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency(0);
                            $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                            $return['itens'][$i]['vencimento'] = $DATA_VENCIMENTO;
                        }
                        break;
                    case '2':
                        $return['itens'][$i]['premio_liquido'] = Agro_Util::formatDbCurrency($VALOR_PREMIO_LIQUIDO);
                        $return['itens'][$i]['premio_federal'] = Agro_Util::formatDbCurrency(0);
                        $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency(0);
                        $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                        $return['itens'][$i]['vencimento'] = $DATA_VENCIMENTO;

                        if ($i == $parcelas) {
                            $vencimento = mktime(
                                0,
                                0,
                                0,
                                date("m", $DATA_VENCIMENTO),
                                date("d", $DATA_VENCIMENTO) + 30,
                                date("Y", $DATA_VENCIMENTO)
                            );
                            $add = $i + 1;

                            $return['itens'][$add]['premio_liquido'] = Agro_Util::formatDbCurrency(0);
                            $return['itens'][$add]['premio_federal'] = Agro_Util::formatDbCurrency($somaSubvencaoFederal);
                            $return['itens'][$add]['premio_estadual'] = Agro_Util::formatDbCurrency($somaSubvencaoEstadual);
                            $return['itens'][$add]['premio_segurado'] = Agro_Util::formatDbCurrency(0);
                            $return['itens'][$add]['vencimento'] = date('d/m/Y', $vencimento);
                        }

                        break;
                    default:
                        if ($i > 1) {
                            $vencimento = mktime(
                                0,
                                0,
                                0,
                                date("m", strtotime($inicioVigencia)) + ($i - 1),
                                date("d", strtotime($inicioVigencia)),
                                date("Y", strtotime($inicioVigencia))
                            );
                            $DATA_VENCIMENTO = date('d/m/Y', $vencimento);
                        }

                        $return['itens'][$i]['premio_liquido'] = Agro_Util::formatDbCurrency($VALOR_PREMIO_LIQUIDO);
                        $return['itens'][$i]['premio_federal'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SUBVENCAO_FEDERAL);
                        $return['itens'][$i]['premio_estadual'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SUBVENCAO_ESTADUAL);
                        $return['itens'][$i]['premio_segurado'] = Agro_Util::formatDbCurrency($VALOR_PARCELA_SEGURADO);
                        $return['itens'][$i]['vencimento'] = $DATA_VENCIMENTO;
                        $somaSegurado = $somaSegurado + round($VALOR_PARCELA_SEGURADO, 2);

                        break;
                }
            }

            if ($Proposta->respostas('QUEST_SUBVENCAO_FEDERAL') == '1') {
                if ($status != 'NAO_ENVIADA' && $status != 'DEVOLVIDA') {
                    $somaSubvencaoFederalValidacao = $somaSubvencaoFederal - $Proposta->subvencao_federal();
                } else {
                    $somaSubvencaoFederalValidacao = $somaSubvencaoFederal;
                }
                $somaSubvencaoFederalValidacao = Agro_Util::round($somaSubvencaoFederalValidacao);

                //EXECUTA VALIDACAO DE LIMITES DE SUBVENCAO POR CULTURA/CORRETOR
                $subvencao = $Proposta->subvencaoCultura();
                if ($somaSubvencaoFederalValidacao < 0.01) {
                    $somaSubvencaoFederalValidacao = 0;
                }
                if (($subvencao['usado'] + $somaSubvencaoFederalValidacao) > $subvencao['liberado']) {
                    $msg_erro_subvencao = 'O Valor da Subvenção Federal atingiu o limite liberado para esta Cultura / Corretor.';
                }

                //EXECUTA VALIDACAO DE LIMITES DE SUBVENCAO POR CULTURA/GRUPO DE CORRETORES
                $subvencao = $Proposta->subvencaoCulturaGrupoCorretores();
                if ($subvencao['liberado'] != '') {
                    if ($somaSubvencaoFederalValidacao < 0.01) {
                        $somaSubvencaoFederalValidacao = 0;
                    }
                    if (($subvencao['usado'] + $somaSubvencaoFederalValidacao) > $subvencao['liberado']) {
                        $msg_erro_subvencao = 'O Valor da Subvenção Federal atingiu o limite liberado para esta Cultura / Grupo de Corretores.';
                    } else {
                        unset($msg_erro_subvencao);
                    }
                }

                if ($msg_erro_subvencao) {
                    return array('status' => false, 'msg' => $msg_erro_subvencao);
                }
            }

            $VALOR_SEGURADO += $dados['custo_apolice'];
            if ($somaSegurado > $VALOR_SEGURADO) {
                $dif = Agro_Util::round(($somaSegurado - $VALOR_SEGURADO), 2);
                $val = Agro_Util::round(($VALOR_PARCELA_SEGURADO - $dif), 2);
                $return['itens'][$i - 1]['premio_segurado'] = Agro_Util::formatDbCurrency($val);
            } elseif ($somaSegurado < $VALOR_SEGURADO) {
                $dif = Agro_Util::round(($VALOR_SEGURADO - $somaSegurado), 2);
                $val = Agro_Util::round(($VALOR_PARCELA_SEGURADO + $dif), 2);
                $return['itens'][$i - 1]['premio_segurado'] = Agro_Util::formatDbCurrency($val);
            }

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

    public static function RN_CALC_07($lmga, $taxa, $comissao, $id_produto, $idEstado, $idUsuario)
    {
        $comissao['vl_nova_comissao'] = number_format($comissao['vl_nova_comissao'], 2, '.', '');
        $comissao['vl_comissao_original'] = number_format($comissao['vl_comissao_original'], 2, '.', '');
        
        try {
            $premio         = 0;
            $comissaoAdicional = array_key_exists('valorComissaoAdicional', $comissao) ? $comissao['valorComissaoAdicional'] : null;

            if ($comissaoAdicional === null || $comissaoAdicional == 0) {
                /**
                 * Valida se há comissão adicional para o corretor/sublogin e produto, pois o cálculo deve ser baseado
                 * na comissão sem este adicional.
                 */
                $rowGestaoComissao = (new Produto_Model_GestaoComissao())->getComissao(
                    $idUsuario,
                    $id_produto,
                    $idEstado
                );

                if (!empty($rowGestaoComissao) && !empty($rowGestaoComissao['id'])) {
                    $comissao['vl_nova_comissao'] -= $rowGestaoComissao['vl_comissao'];
                }
            } else {
                $comissao['vl_nova_comissao'] -= $comissaoAdicional;
            }
           
            if (is_null($comissao['vl_comissao_original'])) {
                $comissao['vl_comissao_original'] = $comissao['vl_nova_comissao'];
            }

            $comissaoMaior = $comissao['vl_comissao_original'] < $comissao['vl_nova_comissao'];
            $comissaoMenor = $comissao['vl_comissao_original'] > $comissao['vl_nova_comissao'];
           
            // se a comissao selecionado for diferente da comissao original, recalcula (aumenta ou diminui) a taxa
            if ($comissaoMaior || $comissaoMenor) {
                /**
                 * Aumento proporcional da AgroBrasil na comissão agravada pelo corretor
                 */
                if ($comissaoMaior) {
                    $rowComissaoAdicionalAgroBrasil = (new Produto_Model_ComissaoAdicionalAgroBrasil())->fetchAll()->current()->toArray();
                    $percentualComissaoAdicional = $rowComissaoAdicionalAgroBrasil['vl_percentual'];

                    $calculoTaxaParte1 = 1 + ($percentualComissaoAdicional / 100);
                    $calculoTaxaParte1 = $calculoTaxaParte1 * ($comissao['vl_comissao_original'] / 100);
                    $calculoTaxaParte1 = 1 - $calculoTaxaParte1;

                    $calculoTaxaParte2 = 1 + ($percentualComissaoAdicional / 100);
                    $calculoTaxaParte2 = $calculoTaxaParte2 * ($comissao['vl_nova_comissao'] / 100);
                    $calculoTaxaParte2 = 1 - $calculoTaxaParte2;
                    
                    $taxa = ((($taxa / 100) * $calculoTaxaParte1) / $calculoTaxaParte2) * 100;
                } else {
                    $taxa = ($taxa * (1 - ($comissao['vl_comissao_original'] / 100))) / (1 - ($comissao['vl_nova_comissao'] / 100));
                }
                $taxa = Agro_Util::round($taxa, 2);
            }
            
            $lmga = str_replace('.', '', $lmga); // Remove os pontos
            $lmga = str_replace(',', '.', $lmga); // Substitui a vírgula por ponto

            $premio = Agro_Util::round((($lmga * $taxa) / 100),2);
      
            $return['taxa'] = Agro_Util::formatDbCurrency($taxa, 2, '.', '');
            $return['premio'] = Agro_Util::formatDbCurrency($premio);

            return $return;
        } catch (Exception $e) {
            $message = 'Erro ao aplicar a regra de cálculo 3.';
            $error = true;
            return [$error, $message];
        }
    }

    public static function RN_CALC_08($taxa, $comissao, $id_produto, $lmga_parcial, $idMunicipio, $idUsuario)
    {
        $modelProdutos = new Produto_Model_Produtos();
        $User = Zend_Auth::getInstance()->getIdentity();
     
        try {
            $premio = 0;
            $produto = $modelProdutos->getProduto($id_produto);
            $cultura = $modelProdutos->getCultura($id_produto);
            $comissaoAdicional = array_key_exists('valorComissaoAdicional', $comissao) ? $comissao['valorComissaoAdicional'] : null;
            $municipio = (new Sistema_Model_Municipios())->getEstado($idMunicipio);

            if ($comissaoAdicional === null || $comissaoAdicional == 0) {
                /**
                 * Valida se há comissão adicional para o corretor/sublogin e produto, pois o cálculo deve ser baseado
                 * na comissão sem este adicional.
                 */

                $rowGestaoComissao = (new Produto_Model_GestaoComissao())->getComissao(
                    $idUsuario,
                    $produto['id'],
                    $municipio['id_estado']
                );

                if (!empty($rowGestaoComissao) && !empty($rowGestaoComissao['id'])) {
                    $comissao['vl_nova_comissao'] -= $rowGestaoComissao['vl_comissao'];
                }
            } else {
                $comissao['vl_nova_comissao'] -= $comissaoAdicional;
            }

            if (is_null($comissao['vl_comissao_original'])) {
                $comissao['vl_comissao_original'] = $comissao['vl_nova_comissao'];
            }

            $comissaoMaior = $comissao['vl_comissao_original'] < $comissao['vl_nova_comissao'];
            $comissaoMenor = $comissao['vl_comissao_original'] > $comissao['vl_nova_comissao'];

            // se a comissao selecionado for diferente da comissao original, recalcula (aumenta ou diminui) a taxa
            if ($comissaoMaior || $comissaoMenor) {
                /**
                 * Aumento proporcional da AgroBrasil na comissão agravada pelo corretor
                 */
                if ($comissaoMaior) {
                    $rowComissaoAdicionalAgroBrasil = (new Produto_Model_ComissaoAdicionalAgroBrasil())->fetchAll()->current()->toArray();
                    $percentualComissaoAdicional = $rowComissaoAdicionalAgroBrasil['vl_percentual'];

                    $calculoTaxaParte1 = 1 + ($percentualComissaoAdicional / 100);
                    $calculoTaxaParte1 = $calculoTaxaParte1 * ($comissao['vl_comissao_original'] / 100);
                    $calculoTaxaParte1 = 1 - $calculoTaxaParte1;

                    $calculoTaxaParte2 = 1 + ($percentualComissaoAdicional / 100);
                    $calculoTaxaParte2 = $calculoTaxaParte2 * ($comissao['vl_nova_comissao'] / 100);
                    $calculoTaxaParte2 = 1 - $calculoTaxaParte2;
                    
                    $taxa = ((($taxa / 100) * $calculoTaxaParte1) / $calculoTaxaParte2) * 100;
                } else {
                    $taxa = ($taxa * (1 - ($comissao['vl_comissao_original'] / 100))) / (1 - ($comissao['vl_nova_comissao'] / 100));
                }

                $taxa = Agro_Util::round($taxa, 2);
            }  
            
            $lmga_parcial = str_replace(['.', ','], ['', '.'], $lmga_parcial);
            $lmga_parcial = (float) $lmga_parcial;
            if (fmod($lmga_parcial, 1) == 0.0) {
                $lmga_parcial = (int)$lmga_parcial;
            }

            $premio = Agro_Util::round((($lmga_parcial * $taxa) / 100), 2);

            $return = array();
            $return['taxa'] = Agro_Util::formatDbCurrency($taxa, 2, '.', '');
            $return['premio'] = Agro_Util::formatDbCurrency($premio);
            $return['lmga_parcial'] = $lmga_parcial;
     
            return $return;
        } catch (Exception $e) {
            $return = array();
            $return['message'] = 'Erro ao aplicar a regra de cálculo 3.';
            $return['error'] = true;

            return $return;
        }
    }
    
    /**
     * Valida se há configurado limite de IS para a proposta ou para as unidades da proposta
     * e retornada cada unidade que possui erro em um array
     *
     * @param int $idProposta
     * @param array $unidades
     * @return array
     */
    public static function validarLimiteIS(int $idProposta, array $unidades): array 
    {
        $retorno = [];
        $modelValorTonelada = new Comercializacao_Model_TaxaAgrupamentoItemSeguradoValorTonelada();
        $valorToneladaLimiteIs = $modelValorTonelada->buscaLimiteProposta($idProposta);

        if (!empty($valorToneladaLimiteIs)) {
            
            $totalValorTonelada = array_sum(
                array_map(function ($unidade) {
                    return Agro_Util::formatCurrencyDb($unidade['IS_VALOR_TONELADA']);
                }, $unidades)
            );

            if ($totalValorTonelada > $valorToneladaLimiteIs) {
                foreach ($unidades as $nro => $unidade) {
                    $retorno['unidades'][$nro] = [
                        'status' => false,
                        'message' => "A IS total não pode ser superior a R$ " . Agro_Util::formatDbCurrency($valorToneladaLimiteIs)
                    ];
                }
            }
        } else {

            $modelItensSegurados = new Seguro_Model_ItensSegurados();
            foreach ($unidades as $nro => $unidade) {
                $idItemSegurado = $modelItensSegurados->getIdByPropostaNroItemSegurado($idProposta, $nro);

                if (empty($idItemSegurado)) {
                    continue;
                }

                $valorToneladaLimiteIs = $modelValorTonelada->findByIdItemSegurado($idItemSegurado);

                if (empty($valorToneladaLimiteIs)) {
                    continue;
                }

                $valor = Agro_Util::formatCurrencyDb($unidade['IS_VALOR_TONELADA']);

                if ($valor > $valorToneladaLimiteIs) {
                    $retorno['unidades'][$nro] = [
                        'status' => false,
                        'message' => "A IS da quadra/talhão não pode ser superior a R$ " . Agro_Util::formatDbCurrency($valorToneladaLimiteIs)
                    ];
                }
            }
        }

        return $retorno;
    }
}
