<?php

class Agro_Db_Table_Row_Dao_Proposta extends Agro_Db_Table_Row_Abstract {

	public function _agrupamentoCar(): array
	{
		// Busca os itens que possuem CAR informado com taxas cadastradas para ele
		$rs = Agro_Db_Table_Abstract::getDefaultAdapter()
			->fetchAll(
				$this
					->select()
					->setIntegrityCheck(false)
					->from(array('cta' => 'comercializacao.taxas_agrupamento'), array('id as id_taxa_agrupamento', 'id_secao', 'vl_comissao'))
					->join(array('ctac' => 'comercializacao.taxas_agrupamento_car'), 'ctac.id_taxa_agrupamento = cta.id', array('ds_car'))
					->join(array('sisc' => 'seguro.itens_segurados_car'), 'sisc.ds_car = ctac.ds_car', array('id_item_segurado'))
					->join(array('sis' => 'seguro.itens_segurados'), 'sis.id = sisc.id_item_segurado', array('vl_lmga'))
					->join(array('spr' => 'seguro.propostas'), 'spr.id = sis.id_proposta AND spr.id_produto = cta.id_produto', false)
					->join(
						array('ctv' => 'comercializacao.taxas_valores'),
						'ctv.id_taxa_agrupamento = cta.id',
						array('id as id_taxa_valor', 'vl_taxa', 'vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'id_cobertura', 'vl_percentual_subvencao_federal'))
					->join(array('sp' => 'seguro.propostas'), 'sp.id = sis.id_proposta', false)
					->join(
						array('ppc' => 'produto.produtos_coberturas'),
						'ppc.id_produto = sp.id_produto AND ppc.fl_ativo IS true AND ppc.id_cobertura = ctv.id_cobertura',
						array('fl_cobertura_principal', 'fl_somente_renovacoes', 'fl_contratacao_automatica'))
					->where('sis.id_proposta = ?', $this->id)
					->where('sisc.fl_selecionado IS TRUE')
			);
		
		if (empty($rs)) {
			return [];
		}
		
		// Busca os itens que não possuem CAR informado
		$rsItensSemCar = Agro_Db_Table_Abstract::getDefaultAdapter()
			->fetchAll(
				$this
					->select()
					->setIntegrityCheck(false)
					->from(array('sis' => 'seguro.itens_segurados'), array('id', 'vl_lmga'))
					->joinLeft(array('sisc' => 'seguro.itens_segurados_car'), 'sisc.id_item_segurado = sis.id', false)
					->where('sis.id_proposta = ?', $this->id)
					->where('sisc.fl_selecionado IS TRUE')
					->where("sisc.ds_car = '' OR sisc.ds_car IS NULL")
			);
		
		// Busca os itens que possuem CAR informado porém não há taxas cadastradas para ele
		$rsItensComCarSemTaxa = Agro_Db_Table_Abstract::getDefaultAdapter()
			->fetchAll(
				$this
					->select()
					->setIntegrityCheck(false)
					->from(array('sis' => 'seguro.itens_segurados'), array('id', 'vl_lmga'))
					->join(array('sisc' => 'seguro.itens_segurados_car'), 'sisc.id_item_segurado = sis.id', 'ds_car')
					->joinLeft(array('ctac' => 'comercializacao.taxas_agrupamento_car'), 'ctac.ds_car = sisc.ds_car', false)
					->where('sis.id_proposta = ?', $this->id)
					->where('sisc.fl_selecionado IS TRUE')
					->where("ctac.id IS NULL")
			);
		
		$this->validaItensMaisDeUmCar($rs, $rsItensComCarSemTaxa);

		$rsItensSemCar = array_merge($rsItensSemCar, $rsItensComCarSemTaxa);
			
		$return = [];
		$carsPorFranquias = [];
		$cars = [];

		$flMesmoCar = true;
		$numeroCarAnterior = $rs[0]['ds_car'];
		$totalCarFranquia = [];
		
		foreach ($rs as $val) {
			if ($val['ds_car'] != $numeroCarAnterior) {
				$flMesmoCar = false;
			}

			if ($val['fl_cobertura_principal'] == 1) {
				$carsPorFranquias['principal'][$val['vl_franquia']][] = $val;
				$totalCarFranquia['principal'][$val['vl_franquia']][$val['ds_car']] = true;
			} else {
				$carsPorFranquias['adicional'][$val['id_cobertura']][$val['vl_franquia']][] = $val;
				$totalCarFranquia['adicional'][$val['id_cobertura']][$val['vl_franquia']][$val['ds_car']] = true;
			}

			$cars[$val['ds_car']] = $val['ds_car'];

			$numeroCarAnterior = $val['ds_car'];
		}
		
		$franquiasValidas = [];
		$franquiasAdicionaisValidas = [];
		$valoresFranquias = [];
		$totalCars = count($cars);
		
		if ($flMesmoCar) {
			foreach ($carsPorFranquias['principal'] as $vlFranquia => $taxasPorFranquia) {
				$franquiasValidas[] = $taxasPorFranquia;
				$valoresFranquias[$vlFranquia] = $vlFranquia;
			}
			
			foreach ($carsPorFranquias['adicional'] as $idCobertura => $cobertura) {
				foreach ($cobertura as $vlFranquia => $franquia) {
					$franquiasAdicionaisValidas[$idCobertura][$vlFranquia] = $franquia;
					$valoresFranquias[$vlFranquia] = $vlFranquia;
				}
			}
		} else {
			// Franquias válidas são as que estão vinculadas a todos os CARs
			foreach ($carsPorFranquias['principal'] as $vlFranquia => $taxasPorFranquia) {
				if (count($totalCarFranquia['principal'][$vlFranquia]) == $totalCars) {
					$franquiasValidas[] = $taxasPorFranquia;
					$valoresFranquias[$vlFranquia] = $vlFranquia;
				}
			}
			
			foreach ($carsPorFranquias['adicional'] as $idCobertura => $cobertura) {
				foreach ($cobertura as $vlFranquia => $franquia) {
					if (count($totalCarFranquia['adicional'][$idCobertura][$vlFranquia]) == $totalCars) {
						$franquiasAdicionaisValidas[$idCobertura][$vlFranquia] = $franquia;
						$valoresFranquias[$vlFranquia] = $vlFranquia;
					}
				}
			}
		}
		
		// Caso haja itens sem CAR, é necessário olhar nos demais níveis de hierarquia, filtrando pelo valor da franquia e tipo de cobertura
		if (!empty($rsItensSemCar)) {
			$agrupamento = $this->agrupamento(false, $valoresFranquias);
			$novoAgrupamentoPrincipal = $novoAgrupamentoAdicional =[];
			$mapItens = [];

			// Vincula as taxas a todos os itens sem CAR
			foreach ($rsItensSemCar as $item) {
				// Para não vincular taxas a mais para o mesmo item
				if (!empty($mapItens[$item['id']])) {
					continue;
				}

				$mapItens[$item['id']] = $item['id'];
				
				foreach ($agrupamento as $ag) {
					$aux = $ag;
					$aux['vl_lmga'] = $item['vl_lmga'];
					$aux['id_item_segurado'] = $item['id'];
					
					if ($ag['fl_cobertura_principal'] == true) {
						$novoAgrupamentoPrincipal[] = $aux;
					} else {
						$novoAgrupamentoAdicional[$ag['id_cobertura']][$ag['vl_franquia']][] = $aux;
					}
					
				}
			}

			// Valida novamente as franquias conforme as taxas vinculadas aos itens sem CAR
			foreach ($franquiasValidas as $key => &$franquia) {
				$franquiaAindaValida = false;

				foreach ($novoAgrupamentoPrincipal as $ag) {
					if ($ag['vl_franquia'] == $franquia[0]['vl_franquia']) {
						$franquia[] = $ag;
						$franquiaAindaValida = true;
					}
				}

				if (!$franquiaAindaValida) {
					unset($franquiasValidas[$key]);
				}
			}

			if (!empty($carsPorFranquias['adicional'])) {
				foreach ($franquiasAdicionaisValidas as $idCobertura => &$cobertura) {
					$franquiaAindaValida = false;

					foreach ($cobertura as $vlFranquia => &$franquia) {
						if (!empty($novoAgrupamentoAdicional[$idCobertura][$vlFranquia])) {
							$franquia = array_merge($franquia, $novoAgrupamentoAdicional[$idCobertura][$vlFranquia]);
						} else {
							unset($franquiasAdicionaisValidas[$idCobertura][$vlFranquia]);
						}
					}
				}
			}
		}

		$return = [];
		$mapIdTaxaAgrupamento = [];

		foreach ($franquiasValidas as $fv) {
			$itensJaPercorridos = [];
			
			foreach ($fv as $key => $val) {
				if (array_key_exists($val['id_item_segurado'], $itensJaPercorridos)) {
					unset($fv[$key]);
					continue;
				}
				$itensJaPercorridos[$val['id_item_segurado']] = true;
				$mapIdTaxaAgrupamento[$val['id_taxa_agrupamento']] = true;
			}

			$mediaValores = Comercializacao_Model_TaxasValores::calculaMediaPonderadaCar($fv);
			
			$return['principal'][] = [
				'id' => 0,
				'id_taxa_agrupamento' => $fv[0]['id_taxa_agrupamento'],
				'id_taxa' => $fv[0]['id_taxa_valor'],
				'id_secao' => $fv[0]['id_secao'],
				'vl_comissao' => $mediaValores['vl_comissao'],
				'vl_taxa' => $mediaValores['vl_taxa'],
				'vl_franquia' => $fv[0]['vl_franquia'],
				'vl_taxa_renovacao' =>$mediaValores['vl_taxa_renovacao'],
				'vl_taxa_inadimplente' => $mediaValores['vl_taxa_inadimplente'],
				'vl_taxa_reduzida' => $mediaValores['vl_taxa_reduzida'],
				'id_cobertura' => $fv[0]['id_cobertura'],
				'vl_percentual_subvencao_federal' => $mediaValores['vl_percentual_subvencao_federal'],
				'fl_cobertura_principal' => $fv[0]['fl_cobertura_principal']
			];
		}
		
		$return['idsTaxasAgrupamentoUtilizadas'] = array_keys($mapIdTaxaAgrupamento);
		
		foreach ($franquiasAdicionaisValidas as $coberturas) {
			foreach ($coberturas as $franquias) {
				$itensJaPercorridos = [];

				foreach ($franquias as $key => $val) {
					if (array_key_exists($val['id_item_segurado'], $itensJaPercorridos)) {
						unset($franquias[$key]);
						continue;
					}
					
					$itensJaPercorridos[$val['id_item_segurado']] = true;
				}

				$mediaValores = Comercializacao_Model_TaxasValores::calculaMediaPonderadaCar($franquias);

				$return['adicionais'][] = [
					'id' => 0,
					'id_secao' => $franquias[0]['id_secao'],
					'vl_comissao' => $mediaValores['vl_comissao'],
					'vl_taxa' => $mediaValores['vl_taxa'],
					'vl_franquia' => $franquias[0]['vl_franquia'],
					'vl_taxa_renovacao' =>$mediaValores['vl_taxa_renovacao'],
					'vl_taxa_inadimplente' => $mediaValores['vl_taxa_inadimplente'],
					'vl_taxa_reduzida' => $mediaValores['vl_taxa_reduzida'],
					'id_cobertura' => $franquias[0]['id_cobertura'],
					'vl_percentual_subvencao_federal' => $mediaValores['vl_percentual_subvencao_federal'],
					'fl_cobertura_principal' => $franquias[0]['fl_cobertura_principal']
				];
			}
		}
		
		return $return;
	}

	private function validaItensMaisDeUmCar(array $comTaxa, ?array $semTaxa)
	{
		$itensCarComTaxa = [];
		$itemCoberturaFranquia = [];
		foreach ($comTaxa as $taxa) {
			$itensCarComTaxa[$taxa['id_item_segurado']][$taxa['ds_car']][$taxa['id_cobertura']][$taxa['vl_franquia']] = $taxa['vl_taxa'];
			$chave = "{$taxa['id_item_segurado']}#{$taxa['id_cobertura']}#{$taxa['vl_franquia']}";
			
			if (array_key_exists($chave, $itemCoberturaFranquia) && $itemCoberturaFranquia[$chave] != $taxa['vl_taxa']) {
				throw new Exception('ATENÇÃO!\nErro de coordenada. Favor entrar em contato com a AgroBrasil.');
			}

			$itemCoberturaFranquia[$chave] = $taxa['vl_taxa'];
		}

		foreach ($semTaxa as $item) {
			if (array_key_exists($item['id'], $itensCarComTaxa)) {
				throw new Exception('ATENÇÃO!\nErro de coordenada. Favor entrar em contato com a AgroBrasil.');
			}
		}
	}

    public function _agrupamentoUsuario(array $valoresFranquia = [])
    {
        $propriedade = $this->propriedade();
        $preposto = $this->preposto();
        $corretor = $this->corretor();
        $idUsuario = $preposto ? $preposto['id_usuario'] : $corretor['id_usuario'];

        if (!$propriedade || !$idUsuario) {
            return false;
        }

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('a' => 'comercializacao.taxas_agrupamento'));
        $select->join(
            array('tam' => 'comercializacao.taxas_agrupamento_municipios'),
            'a.id = tam.id_taxa_agrupamento',
            false
        );
        $select->join(
            array('tau' => 'comercializacao.taxas_agrupamento_usuarios'),
            'a.id = tau.id_taxa_agrupamento',
            false
        );
        $select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
        $select->where("tau.id_usuario = ?", $idUsuario);
        $select->where("a.id_produto = ?", $this->id_produto);
        $select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_USUARIO . "'");
        $select->where("a.fl_ativo = true");

        if (!empty($valoresFranquia)) {
            $select->join(
                array('ctv' => 'comercializacao.taxas_valores'),
                'ctv.id_taxa_agrupamento = a.id',
                array(
                    'vl_franquia',
                    'vl_taxa_renovacao',
                    'vl_taxa_reduzida',
                    'vl_taxa_inadimplente',
                    'vl_taxa',
                    'vl_percentual_subvencao_federal'
                )
            );

            $select->join(
                array('ppc' => 'produto.produtos_coberturas'),
                'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto',
                ['fl_cobertura_principal', 'id_cobertura']
            );
            $select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');
            $select->where('ppc.id_produto = ?', $this->id_produto);

            return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);
        }

        return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);
    }

	/**
	 * Retorna o(s) agrupamento(s) do proponente|usuario
	 */
	public function _agrupamentoProponenteUsuario(array $valoresFranquia = []) {
		$propriedade = $this->propriedade();
		$proponente = $this->proponente();
		$preposto = $this->preposto();
		$corretor = $this->corretor();
			
		if ($proponente['cpf_cnpj'] && $propriedade && $preposto) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tap' => 'comercializacao.taxas_agrupamento_proponentes'), 'a.id = tap.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('p' => 'seguro.proponentes'), 'tap.id_proponente = p.id', false);
			$Select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
			$Select->where("p.cpf_cnpj = ?", $proponente['cpf_cnpj']);
			$Select->where("tau.id_usuario = ?", $preposto['id_usuario']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_PROPONENTE . "'");
			$Select->where("a.fl_ativo = true");

			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');

				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);

				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		} elseif ($proponente['cpf_cnpj'] && $propriedade && $corretor['id_usuario']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tap' => 'comercializacao.taxas_agrupamento_proponentes'), 'a.id = tap.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('p' => 'seguro.proponentes'), 'tap.id_proponente = p.id', false);
			$Select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
			$Select->where("p.cpf_cnpj = ?", $proponente['cpf_cnpj']);
			$Select->where("tau.id_usuario = ?", $corretor['id_usuario']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_PROPONENTE . "'");
			$Select->where("a.fl_ativo = true");

			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');
				
				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);

				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}
		
		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do proponente
	 */
	public function _agrupamentoProponente(array $valoresFranquia = []) {
		$propriedade = $this->propriedade();
		$proponente = $this->proponente();
		
		if ($proponente['cpf_cnpj'] && $propriedade) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tap' => 'comercializacao.taxas_agrupamento_proponentes'), 'a.id = tap.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
			$Select->join(array('p' => 'seguro.proponentes'), 'tap.id_proponente = p.id', false);
			$Select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
			$Select->where("p.cpf_cnpj = ?", $proponente['cpf_cnpj']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_PROPONENTE . "'");
			$Select->where("a.fl_ativo = true");
			$Select->where("a.id not in (select id_taxa_agrupamento from comercializacao.taxas_agrupamento_usuarios)");

			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');

				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);

				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do preposto
	 */
	public function _agrupamentoPreposto(array $valoresFranquia = []) {
		$propriedade = $this->propriedade();
		$preposto = $this->preposto();

		if ($preposto && $propriedade) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
			$Select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
			$Select->where("tau.id_usuario = ?", $preposto['id_usuario']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_USUARIO . "'");
			$Select->where("a.fl_ativo = true");

			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');
				
				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);

				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do corretor
	 */
	public function _agrupamentoCorretor(array $valoresFranquia = []) {
		$propriedade = $this->propriedade();
		$corretor = $this->corretor();

		if ($corretor && $propriedade) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
			$Select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
			$Select->where("tau.id_usuario = ?", $corretor['id_usuario']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_USUARIO . "'");
			$Select->where("a.fl_ativo = true");

			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');
				
				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);

				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do municipio
	 */
	public function _agrupamentoMunicipio(array $valoresFranquia = []) {
		$propriedade = $this->propriedade();
		
		if ($propriedade) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
			$Select->where("tam.id_municipio = ?", $propriedade['id_municipio']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_MUNICIPIO . "'");
			$Select->where("a.fl_ativo = true");
			
			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');

				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);
				
				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do estado
	 */
	public function _agrupamentoEstado(array $valoresFranquia = []) {
		$propriedade = $this->propriedade();

		if ($propriedade) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('e' => 'comercializacao.taxas_agrupamento_estados'), 'a.id = e.id_taxa_agrupamento', false);
			$Select->where("e.id_estado = ?", $propriedade['id_estado']);
			$Select->where("a.id_produto = ?", $this->id_produto);
			$Select->where("a.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_ESTADO . "'");
			$Select->where("a.fl_ativo = true");

			if (!empty($valoresFranquia)) {
				$Select->join(
					array('ctv' => 'comercializacao.taxas_valores'),
					'ctv.id_taxa_agrupamento = a.id',
					array('vl_franquia', 'vl_taxa_renovacao', 'vl_taxa_reduzida', 'vl_taxa_inadimplente', 'vl_taxa', 'vl_percentual_subvencao_federal'));
				$Select->where('ctv.vl_franquia IN ('. implode(', ', $valoresFranquia) .')');
				
				$Select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_cobertura = ctv.id_cobertura AND ppc.id_produto = a.id_produto', ['fl_cobertura_principal', 'id_cobertura']);
				$Select->where('ppc.id_produto = ?', $this->id_produto);

				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

    /**
     * Retorna o(s) agrupamento(s) do orçamento
     */
    public function _agrupamentoOrcamento()
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('ta' => 'comercializacao.taxas_agrupamento'));
        $select->join(array('tao' => 'comercializacao.taxas_agrupamento_orcamentos'), 'tao.id_taxa_agrupamento = ta.id', false);
        $select->where("ta.id_produto = ?", $this->id_produto);
        $select->where("tao.id_proposta = ?", $this->id);
        $select->where("ta.tp_taxa_agrupamento = '" . Comercializacao_Model_TaxasAgrupamentos::TIPO_ORCAMENTO . "'");
        $select->where("ta.fl_ativo = true");

        $row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

        return !empty($row) ? $row : false;
    }

	/**
	 * Retorna o(s) atributo(s) do proponente
	 *
	 * @param $name
	 * @param $grupo
	 */
	public function _atributosProponente($name, $grupo) {
		$proponente = $this->proponente();

		if ($proponente['id_proponente_original']) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_proponentes'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->where('p.id_proponente = ?', $proponente['id_proponente_original']);
			$Select->where('a.id_produto = ?', $this->id_produto);
			$Select->where('fl_grupo_padrao = false');
			$Select->order('rn.ds_ordem');

			if ($grupo) $Select->where('ds_chave_atributo_modulo = ?', $grupo);
			if ($name) {
				$Select->where('ds_chave_rn = ?', $name);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}
		} else {
			return false;
		}
	}

	/**
	 * Retorna o(s) atributo(s) do preposto
	 *
	 * @param $name
	 * @param $grupo
	 */
	public function _atributosPreposto($name, $grupo) {
		$preposto = $this->preposto();

		if ($preposto) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->where('p.id_usuario = ?', $preposto['id_usuario'], 'integer');
			$Select->where('a.id_produto = ?', $this->id_produto);
			$Select->where('fl_grupo_padrao = false');
			$Select->order('rn.ds_ordem');

			if ($grupo) $Select->where('ds_chave_atributo_modulo = ?', $grupo);
			if ($name) {
				$Select->where('ds_chave_rn = ?', $name);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}
		} else {
			return false;
		}
	}

	/**
	 * Retorna o(s) atributo(s) do corretor
	 *
	 * @param $name
	 * @param $grupo
	 */
	public function _atributosCorretor($name, $grupo) {
		$corretor = $this->corretor();

		if ($corretor) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->where('p.id_usuario = ?', $corretor['id_usuario'], 'integer');
			$Select->where('a.id_produto = ?', $this->id_produto);
			$Select->where('fl_grupo_padrao = false');
			$Select->order('rn.ds_ordem');

			if ($grupo) $Select->where('ds_chave_atributo_modulo = ?', $grupo);
			if ($name) {
				$Select->where('ds_chave_rn = ?', $name);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			}
		} else {
			return false;
		}
	}

	/**
	 * Retorna o(s) atributo(s) do corretor
	 *
	 * @param $name
	 * @param $grupo
	 */
	public function _atributosPadrao($name, $grupo) {
		$Select = $this->select()->setIntegrityCheck(false)->distinct();
		$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
		$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
		$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
		$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
		$Select->where('a.id_produto = ?', $this->id_produto);
		$Select->where('fl_grupo_padrao = true');
		$Select->order('rn.ds_ordem');

		if ($grupo) $Select->where('ds_chave_atributo_modulo = ?', $grupo);
		if ($name) {
			$Select->where('ds_chave_rn = ?', $name);
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
			return $Row['ds_valor'];
		} else {
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
		}
	}

	/**
	 * Verifica se a data da semeadura
	 *
	 * @param date $dtSemeadura
	 * @param integer $idCiclo
	 * @param integer $idTipoSolo
	 */
	/*
	public function verificaDataSemeadura($dtSemeadura, $idCiclo, $idTipoSolo=false) {

		$propriedade = $this->propriedade();
		if (!$dtSemeadura) return 0;

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('z'=>'produto.validacoes_zoneamento_graos'), 'count(*)');
		$Select->join(array('m'=>'produto.validacoes_zoneamento_graos_municipios'), 'z.id = m.id_validacao_zoneamento_graos', false);
		$Select->where('m.id_municipio = ?', $propriedade['id_municipio']);
		$Select->where('? between (dt_inicial) and (dt_final)', Agro_Util::formatDate($dtSemeadura, Zend_Date::W3C));
		$Select->where('z.id_produto = ?', $this->id_produto);

		if($idCiclo and $idCiclo <> 16){
		    $Select->where('z.id_ciclo = ?', $idCiclo);
		}

		if ($idTipoSolo) $Select->where('z.id_tipo_solo = ?', $idTipoSolo);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}
	*/

	/**
	 * Busca o questionario do proponente
	 *
	 *  @param array $proponente
	 *  @param integer $idParent
	 */
	public function _buscaQuestionarioProponente($proponente, $idParent=null) {
		if ($proponente['cpf_cnpj']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
			$Select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
			$Select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
			$Select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
			$Select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
			$Select->join(array('pgap' => 'produto.produtos_grupos_atributos_rn_proponentes'), 'pgap.id_grupo_atributo_rn = pga.id', null);
			$Select->join(array('p' => 'seguro.proponentes'), 'pgap.id_proponente = p.id', null);
			$Select->where('am.ds_chave_atributo_modulo = ?', 'QUESTIONARIO');
			$Select->where('a.id_parent = ?', ($idParent ? $idParent : 0));
			$Select->where('p.cpf_cnpj = ?', $proponente['cpf_cnpj']);
			$Select->where('pga.id_produto = ?', $this->id_produto);
			$Select->where('pga.fl_grupo_padrao = false');
			$Select->where('pa.fl_del = false');
			$Select->order('a.ds_ordem');
			$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

			$return = array();
			if (count($Rs)) {
				foreach ($Rs as $Row) {
					$return[$Row['ds_chave_rn']] = $Row;
					$return[$Row['ds_chave_rn']]['chields'] = $this->_buscaQuestionarioPadrao($Row['id']);
				}
			}

			return $return;
		}
	}

	/**
	 * Busca o questionario do preposto
	 *
	 *  @param array $preposto
	 *  @param integer $idParent
	 */
	public function _buscaQuestionarioPreposto($preposto, $idParent=null) {
		if ($preposto) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
			$Select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
			$Select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
			$Select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
			$Select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
			$Select->join(array('pgau' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'pgau.id_grupo_atributo_rn = pga.id', null);
			$Select->where('am.ds_chave_atributo_modulo = ?', 'QUESTIONARIO');
			$Select->where('a.id_parent = ?', ($idParent ? $idParent : 0));
			$Select->where('pgau.id_usuario = ?', $preposto['id_usuario']);
			$Select->where('pga.id_produto = ?', $this->id_produto);
			$Select->where('pga.fl_grupo_padrao = false');
			$Select->where('pa.fl_del = false');
			$Select->order('a.ds_ordem');
			$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

			$return = array();
			if (count($Rs)) {
				foreach ($Rs as $Row) {
					$return[$Row['ds_chave_rn']] = $Row;
					$return[$Row['ds_chave_rn']]['chields'] = $this->_buscaQuestionarioPadrao($Row['id']);
				}
			}

			return $return;
		}
	}

	/**
	 * Busca o questionario do corretor
	 *
	 *  @param array $corretor
	 *  @param integer $idParent
	 */
	public function _buscaQuestionarioCorretor($corretor, $idParent=null) {
		if ($corretor) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
			$Select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
			$Select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
			$Select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
			$Select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
			$Select->join(array('pgau' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'pgau.id_grupo_atributo_rn = pga.id', null);
			$Select->where('am.ds_chave_atributo_modulo = ?', 'QUESTIONARIO');
			$Select->where('a.id_parent = ?', ($idParent ? $idParent : 0));
			$Select->where('pgau.id_usuario = ?', $corretor['id_usuario']);
			$Select->where('pga.id_produto = ?', $this->id_produto);
			$Select->where('pga.fl_grupo_padrao = false');
			$Select->where('pa.fl_del = false');
			$Select->order('a.ds_ordem');
			$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

			$return = array();
			if (count($Rs)) {
				foreach ($Rs as $Row) {
					$return[$Row['ds_chave_rn']] = $Row;
					$return[$Row['ds_chave_rn']]['chields'] = $this->_buscaQuestionarioPadrao($Row['id']);
				}
			}

			return $return;
		}
	}

	/**
	 * Busca o questionario padrao
	 *
	 *  @param integer $idParent
	 */
	public function _buscaQuestionarioPadrao($idParent=null) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
		$Select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
		$Select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
		$Select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
		$Select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
		$Select->where('am.ds_chave_atributo_modulo = ?', 'QUESTIONARIO');
		$Select->where('a.id_parent = ?', ($idParent ? $idParent : 0));
		$Select->where('pga.id_produto = ?', $this->id_produto);
		$Select->where('pga.fl_grupo_padrao = true');
		$Select->where('pa.fl_del = false');
		$Select->where('a.fl_ativo = true');
		$Select->order('a.ds_ordem');
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

		$return = array();
		if (count($Rs) > 0) {
			foreach ($Rs as $Row) {
				$return[$Row['ds_chave_rn']] = $Row;
				$return[$Row['ds_chave_rn']]['chields'] = $this->_buscaQuestionarioPadrao($Row['id']);
			}
		}

		return $return;
	}

	/**
	 * Busca uma validacao pela chave
	 *
	 * @param string $chave
	 * @author Renato - 05/08/2010
	 */
	public function _validacao($chave) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('pv'=>'produto.produtos_validacoes'));
		$Select->join(array('v'=>'produto.validacoes'), "pv.id_validacao = v.id", false);
		$Select->where("id_produto = ?", $this->id_produto);
		$Select->where("ds_chave = ?", $chave);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function _getParcelamentoProposta(?string $inicioVigencia = ''): array
	{
		$mes = substr($inicioVigencia, 5, 2);
	    $ano = substr($inicioVigencia, 0, 4);

		$sql = $this
			->select()
			->setIntegrityCheck(false)
			->from(array('cp' => 'produto.condicoes_pagamento'))
			->join(array('cppr' => 'produto.condicao_pagamento_proposta'), 'cppr.id_condicao_pagamento = cp.id', false)
			->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento')
			->where('cp.id_produto = ?', $this->id_produto)
			->where('cp.fl_inadimplentes = false')
			->where('cp.fl_ativo IS TRUE')
			->where('cppr.id_proposta = ?', $this->id);
		
		if (!empty($inicioVigencia)) {
			$sql->where('cpi.ds_mes = ?', $mes - 1);
		    $sql->where('cpi.ds_ano = ?', $ano);
		} else {
			$sql->where('cpi.ds_mes = ?', date('m') - 1);
            $sql->where('cpi.ds_ano = ?', date('Y'));
		}

		$rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($sql);

		return !empty($rs) ? $rs : [];
	}

	public function _getParcelamentoProponente($cpf_cnpj,$inicioVigencia=null) {
	    $mes = substr($inicioVigencia,5,2);
	    $ano = substr($inicioVigencia,0,4);

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('cp' => 'produto.condicoes_pagamento'));
		$Select->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento');
		$Select->join(array('cpp' => 'produto.condicoes_pagamento_proponentes'), 'cp.id = cpp.id_condicao_pagamento');
		$Select->join(array('p' => 'seguro.proponentes'), 'cpp.id_proponente = p.id', null);
		$Select->where('cp.id_produto = ?', $this->id_produto);
		$Select->where('cp.fl_inadimplentes = false');
		$Select->where('cp.fl_ativo IS TRUE');
		$Select->where("cp.tp_grupo = 'C'");

		if($inicioVigencia){
		    $Select->where('cpi.ds_mes = ?', $mes-1);
		    $Select->where('cpi.ds_ano = ?', $ano);
		} else {
		    $Select->where('cpi.ds_mes = ?', date('m')-1);
            $Select->where('cpi.ds_ano = ?', date('Y'));
		}
		$Select->where('p.cpf_cnpj = ?', $cpf_cnpj);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function _getParcelamentoUsuario($idUsuario,$inicioVigencia=null) {
	    $mes = substr($inicioVigencia,5,2);
	    $ano = substr($inicioVigencia,0,4);

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('cpu' => 'produto.condicoes_pagamento_usuarios'));
		$Select->join(array('cp' => 'produto.condicoes_pagamento'), 'cp.id = cpu.id_condicao_pagamento');
		$Select->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento');
		$Select->where('cp.id_produto = ?', $this->id_produto);
		$Select->where('cp.fl_inadimplentes = false');
		$Select->where('cp.fl_ativo IS TRUE');
		$Select->where('cpu.id_usuario = ?', $idUsuario);
		$Select->where("cp.tp_grupo = 'U'");

		if($inicioVigencia){
		    $Select->where('cpi.ds_mes = ?', $mes-1);
		    $Select->where('cpi.ds_ano = ?', $ano);
		} else {
		    $Select->where('cpi.ds_mes = ?', date('m')-1);
            $Select->where('cpi.ds_ano = ?', date('Y'));
		}

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function _getParcelamentoMunicipio($idMunicipio,$inicioVigencia=null) {
	    $mes = substr($inicioVigencia,5,2);
	    $ano = substr($inicioVigencia,0,4);

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('cpm' => 'produto.condicoes_pagamento_municipios'));
		$Select->join(array('cp' => 'produto.condicoes_pagamento'), 'cp.id = cpm.id_condicao_pagamento');
		$Select->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento');
		$Select->where('cp.id_produto = ?', $this->id_produto);
		$Select->where('cp.fl_inadimplentes = false');
		$Select->where('cp.fl_ativo IS TRUE');
		$Select->where('cpm.id_municipio = ?', $idMunicipio);
		$Select->where("cp.tp_grupo = 'M'");

		if($inicioVigencia){
		    $Select->where('cpi.ds_mes = ?', $mes-1);
		    $Select->where('cpi.ds_ano = ?', $ano);
		} else {
		    $Select->where('cpi.ds_mes = ?', date('m')-1);
            $Select->where('cpi.ds_ano = ?', date('Y'));
		}

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function _getParcelamentoDefault() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('cp' => 'produto.condicoes_pagamento'));
		$Select->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento');
		$Select->where('cp.id_produto = ?', $this->id_produto);
		$Select->where('cp.fl_condicao_padrao = ?', true);
		$Select->where('cp.fl_ativo IS TRUE');
		$Select->where('cpi.ds_mes = ?', date('m')-1);
		$Select->where('cpi.ds_ano = ?', date('Y'));

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function _getParcelamentoInadimplentes($idUsuario=false, $cpfCnpj=false) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('cp' => 'produto.condicoes_pagamento'));
		$Select->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento');
		$Select->where('cp.id_produto = ?', $this->id_produto);
		$Select->where('cp.fl_inadimplentes = ?', true);
		$Select->where('cp.fl_ativo is true');
		$Select->where('cpi.ds_mes = ?', date('m')-1);
		$Select->where('cpi.ds_ano = ?', date('Y'));

		if($idUsuario){
			$Select->join(array('cpu' => 'produto.condicoes_pagamento_usuarios'), 'cp.id = cpu.id_condicao_pagamento');
			$Select->where('cpu.id_usuario = ?', $idUsuario);
		}

		if($cpfCnpj){
			$Select->join(array('cpp' => 'produto.condicoes_pagamento_proponentes'), 'cp.id = cpp.id_condicao_pagamento');
			$Select->join(array('sp' => 'seguro.proponentes'), 'sp.id = cpp.id_proponente');
			$Select->where('sp.cpf_cnpj = ?', $cpfCnpj);
		}

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function getParcelamentoById($id_condicao) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('cp' => 'produto.condicoes_pagamento'));
		$Select->join(array('cpi' => 'produto.condicoes_pagamento_itens'), 'cp.id = cpi.id_condicao_pagamento');
		$Select->where('cp.id = ?', $id_condicao);
		$Select->where('cpi.ds_mes = ?', date('m')-1);
		$Select->where('cpi.ds_ano = ?', date('Y'));

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function _propriedadesMunicipio($chave) {
		$propriedade = $this->propriedade();
		if ($propriedade['id_municipio']) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', 'ds_valor');
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id', 'ds_chave_rn');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', null);
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_municipios'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->join(array('pp' => 'seguro.proponentes'), 'p.id_municipio = pp.id_municipio', null);
			$Select->where('pp.id_municipio = ?', $propriedade['id_municipio']);
			$Select->where('ds_chave_atributo_modulo = ?', 'PROPRIEDADE');
			$Select->where('a.id_produto = ?', $this->id_produto);
			$Select->where('fl_grupo_padrao = false');
    		$Select->where('pa.fl_del = false');
    		$Select->where('pa.fl_ativo = true');

			if ($chave) {
				$Select->where('ds_chave_rn = ?', $chave);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				$Pairs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
				if (count($Pairs)) return $Pairs;
			}
		}

		return false;	
	}

	public function _propriedadesProponente($chave) {
		$proponente = $this->proponente();
		if ($proponente['cpf_cnpj']) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', 'ds_valor');
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id', 'ds_chave_rn');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', null);
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_proponentes'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->join(array('pp' => 'seguro.proponentes'), 'p.id_proponente = pp.id', null);
			$Select->where('pp.cpf_cnpj = ?', $proponente['cpf_cnpj']);
			$Select->where('ds_chave_atributo_modulo = ?', 'PROPRIEDADE');
			$Select->where('a.id_produto = ?', $this->id_produto);
			$Select->where('fl_grupo_padrao = false');
    		$Select->where('pa.fl_del = false');
    		$Select->where('pa.fl_ativo = true');

			if ($chave) {
				$Select->where('ds_chave_rn = ?', $chave);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				$Pairs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
				if (count($Pairs)) return $Pairs;
			}
		}

		return false;
	}
	
	public function _propriedadesProduto($chave) {
		$proponente = $this->proponente();
		$preposto = $this->preposto();
		$corretor = $this->corretor();
		$propriedade = $this->propriedade();

		$Select = $this->select()->setIntegrityCheck(false)->distinct();
		$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), 'id');
		$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', 'ds_valor');
		$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id', 'ds_chave_rn');
		$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', null);
		$Select->joinLeft(array('p' => 'produto.produtos_grupos_atributos_rn_proponentes'), 'p.id_grupo_atributo_rn = a.id', 'id_proponente');
		$Select->joinLeft(array('pp' => 'seguro.proponentes'), 'p.id_proponente = pp.id', 'pp.cpf_cnpj');
		$Select->joinLeft(array('pu' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'pu.id_grupo_atributo_rn = a.id', 'id_usuario');
		$Select->joinLeft(array('pm' => 'produto.produtos_grupos_atributos_rn_municipios'), 'pm.id_grupo_atributo_rn = a.id', 'id_municipio');
		$Select->where('a.id_produto = ?', $this->id_produto);
		$Select->where('fl_grupo_padrao = false');
		$Select->where('pa.fl_del = false');
		$Select->where('pa.fl_ativo = true');
		$Select->where('ds_chave_atributo_modulo = ?', 'PROPRIEDADE');
		$Select->order('a.id, rn.ds_chave_rn');

		$whereClause = '';

		$idsUsuario = []; 
		if (!empty($preposto)) {
			$idsUsuario[] = $preposto['id_usuario'];
		}

		if (!empty($corretor)) {
			$idsUsuario[] = $corretor['id_usuario'];
		}

		if (!empty($idsUsuario)) {
			$whereClause .= 'pu.id_usuario IN ('. implode(',', $idsUsuario) .')';
		}

		if (!empty($proponente)) {
			$whereClause .= !empty($whereClause) ? ' OR ' : '';
			$whereClause .= "pp.cpf_cnpj = '{$proponente['cpf_cnpj']}'";
		}

		if (!empty($propriedade)) {
			$whereClause .= !empty($whereClause) ? ' OR ' : '';
			$whereClause .= "pm.id_municipio = {$propriedade['id_municipio']}";
		}

		if (!empty($whereClause)) {
			$Select->where($whereClause);
		}
		
		if ($chave) {
			$Select->where('ds_chave_rn = ?', $chave);
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

			return $Row['ds_valor'];
		} else {
			$Pairs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			if (count($Pairs)) return $Pairs;
		}

		return false;
	}

	public function _propriedadesPreposto($chave) {
		$preposto = $this->preposto();
		if ($preposto['id_usuario']) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', 'ds_valor');
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id', 'ds_chave_rn');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', null);
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->where('p.id_usuario = ?', $preposto['id_usuario'], 'integer');
			$Select->where('ds_chave_atributo_modulo = ?', 'PROPRIEDADE');
			$Select->where('a.id_produto = ?', $this->id_produto);
			$Select->where('fl_grupo_padrao = false');
    		$Select->where('pa.fl_del = false');
    		$Select->where('pa.fl_ativo = true');

			if ($chave) {
				$Select->where('ds_chave_rn = ?', $chave);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				$Pairs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
				if (count($Pairs)) return $Pairs;
			}
		}

		return false;
	}

	public function _propriedadesCorretor($chave) {
		$corretor = $this->corretor();
		if ($corretor['id_usuario']) {
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', 'ds_valor');
			$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id', 'ds_chave_rn');
			$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', null);
			$Select->join(array('p' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'p.id_grupo_atributo_rn = a.id', null);
			$Select->where('p.id_usuario = ?', $corretor['id_usuario'], 'integer');
			$Select->where('ds_chave_atributo_modulo = ?', 'PROPRIEDADE');
			$Select->where('a.id_produto = ?', $this->id_produto);
    		$Select->where('pa.fl_del = false');
    		$Select->where('pa.fl_ativo = true');


			if ($chave) {
				$Select->where('ds_chave_rn = ?', $chave);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				return $Row['ds_valor'];
			} else {
				$Pairs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
				if (count($Pairs)) return $Pairs;
			}
		}

		return false;
	}

	public function _propriedadesDefault($chave) {
		$Select = $this->select()->setIntegrityCheck(false)->distinct();
		$Select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
		$Select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', 'ds_valor');
		$Select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id', 'ds_chave_rn');
		$Select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', null);
		$Select->where('ds_chave_atributo_modulo = ?', 'PROPRIEDADE');
		$Select->where('pa.fl_del = false');
		$Select->where('pa.fl_ativo = true');
		$Select->where('a.id_produto = ?', $this->id_produto);
		$Select->where('fl_grupo_padrao = true');

		if ($chave) {
			$Select->where('ds_chave_rn = ?', $chave);
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
			return $Row['ds_valor'];
		} else {
			$Pairs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			if (count($Pairs)) return $Pairs;
		}

		return false;
	}

}
