<?php
class Produto_Model_Produtos extends Agro_Db_Table_Produtos {
	protected $_log = true;
	protected $_schema = 'produto';
	protected $_name = 'produtos';
	protected $_view = 'v_produtos';
	protected $_primary = 'id';
	protected $_rowClass = 'Produto_Model_Row_Produto';
	public $_order = 'ds_nome_produto';

	public function save(array $values) {
		$insert  = ($values['id'] ? false : true);
		$Row     = $this->getRow($values['id']);
		$oldName = $Row->ds_nome_produto;
		$assunto = null;
		$user    = Zend_Auth::getInstance()->getIdentity()->ds_nome_usuario;
		
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
		
		try {
			$Row->ds_nome_abreviado = $values['ds_nome_abreviado'];
			$Row->id_produto_geral = $values['id_produto_geral'];
			$Row->ds_nome_produto = $values['ds_nome_produto'];
			$Row->id_seguradora = $values['id_seguradora'];
			$Row->id_safra = $values['id_safra'];
			$Row->nr_susep = $values['nr_susep'];
			$Row->cd_produto_seguradora = $values['cd_produto_seguradora'];
			$Row->ds_ordenacao_laudos_liquidacao = 'dt_aviso_sinistro';
			$tmp_importar_zoneamento = $Row->fl_importar_zoneamento_tablet; //guarda o valor atual do banco para comparar depois e atualizar o zoneamento
			$Row->fl_importar_zoneamento_tablet = $values['importar_zoneamento'];

			// Salva o produto
			if ($Row->save()) {
				$values['id'] = $Row->id;

				$configuracaoDataCorte = (new Produto_Model_ConfiguracaoDataCorte())
					->find($values['id_configuracao_data_corte'])
					->current();
				
				$valuesConfig = [];
				$valuesConfig['ds_url_condicoes'] = $values['ds_url_condicoes'];;
				$valuesConfig['id_produto'] = $Row->id;
				$valuesConfig['id_modelo_vistoria_previa'] = $values['id_modelo_vistoria_previa'];
				$valuesConfig['ds_frase_padrao_orcamento'] = !empty($values['ds_frase_padrao_orcamento'])
					? $values['ds_frase_padrao_orcamento']
					: '';
				$valuesConfig['ds_frase_restricoes'] = !empty($values['ds_frase_restricoes'])
					? $values['ds_frase_restricoes']
					: '';
				$valuesConfig['ds_frase_risco'] = !empty($values['ds_frase_risco'])
					? $values['ds_frase_risco']
					: '';
				$valuesConfig['dt_inicio_validade'] = $configuracaoDataCorte['dt_corte'];
				
				$idProdutoConfig = (new Produto_Model_ProdutoConfig())->save($valuesConfig);
				
				if (empty($idProdutoConfig)) {
					throw new Exception('Erro ao salvar configuração do produto.');
				}

				// Salva as Validacoes
				$ProdutoValidacao = new Produto_Model_ProdutosValidacoes();
				$ProdutoValidacao->save($values);

				// Se houve mudança no checkbox de importar ou não o zoneamento marca para rodar a rotina de geração de base de zoneamento
				if ($tmp_importar_zoneamento != $values['importar_zoneamento']) {
					$ModelVersaoZoneamento = new Sistema_Model_VersaoZoneamento();
					$modelSafra = new Produto_Model_Safras;
					$safra = $modelSafra->getSafraByProduto($Row->id);
					$safraAtual = $modelSafra->getSafraAtual();
		
					if (!$ModelVersaoZoneamento->newVersionZoneamento($safraAtual['id'])) {
						throw new Exception('Houve problemas ao indicar para gerar novo banco de zoneamento!');
					}
				}

				$ProdutoGeralRenovacao = new Produto_Model_ProdutosProdutosGeralRenovacao();
				if(is_array($values['id_produto_geral_renovacao'])){
					$ProdutoGeralRenovacao->save($values['id_produto_geral_renovacao'], $Row->id, $idProdutoConfig);
				}

				if ($insert && !isset($values['nao_gerar_condicao_pagamento_padrao'])) {
					$CondicaoPagamento = new Produto_Model_CondicoesPagamento();
					$CondicaoPagamento->geraPadrao($Row->id);
				}
				
				//Envia email para o departametno de sinistro, notificando sobre o cadastro de um novo produto
				//e alertando sobre a necessidade da configuração de laudos de sinistro
				if ($insert) {
					$assunto = "Novo Produto Cadastrado ({$values['ds_nome_produto']})";
					$content = "\nInformamos que o usuário: {$user} cadastrou o produto {$values['ds_nome_produto']} (Id: {$Row->id}) foi cadastrado.\n";
				} elseif ($oldName <> $values['ds_nome_produto']) {
					$assunto = "O produto $oldName teve seu nome alterado.";
					$content = "\nInformamos que o usuário: {$user} alterou o produto {$oldName}.\nO produto {$oldName} (Id: {$Row->id}) agora chama-se {$values['ds_nome_produto']}. \n";
				}
				
				Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
				
				if ($assunto) {
					$To = 'tiago.zschornack@agrobrasilseguros.com.br';
					$Cc = 'tonismar.bernardo@agrobrasilseguros.com.br';
					$Cc1 = 'marcia.correa@agrobrasilseguros.com.br';

					$content .= "É necessário realizar as configurações de Laudos de Sinistro para seu correto funcionamento.\n\n";

					try {
						$Mail = new Agro_Mail();
						$Mail->addTo($To);
						$Mail->addCc($Cc);
						$Mail->addCc($Cc1);
						$Mail->setTipoUsuario('Usuário');
						$Mail->setBody($content);
						$Mail->setSubject($assunto);
						$Mail->send();

						return true;
					} catch (Exception $e) {
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
						$this->setMessage($e->getMessage());
						return false;
					}
				}

				return $Row->id;

			} else {
				Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
				return false;
			}

		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
            $this->setMessage($e->getMessage());
			return false;
		}
	}

	public function setAtributos(array $post) {
		$ProdutosAtributos = new Produto_Model_ProdutosAtributos();

		if ($post['id']) {
			$ProdutosAtributos->deleteProdutoAtributo($post['id']);

			if (is_array($post['id_atributo'])) {
				foreach ($post['id_atributo'] as $idAtributo) {
					$ProdutosAtributos->relacionaProdutoAtributo($post['id'], $idAtributo, $post['value_atributo'][$idAtributo]);
				}
			}
		}
	}

	public function getAtributos($id) {
		if ($id) {
			$ret = array();
			$Rs = $this->getAdapter()->fetchAll("select * from produto.produtos_atributos_rn WHERE id_produto = $id");
			if (is_array($Rs)) {
				foreach ($Rs as $Row) {
					$ret[$Row['id_atributo_rn']] = $Row['ds_valor'];
				}
			}

			return $ret;
		}
	}

	public function getComboProdutoGeral($idSafra) {
		$Rs = $this->fetchAll('id_safra = ' . $idSafra . 'and fl_ativo = true', 'ds_nome_produto')->toArray();

		if (is_array($Rs)) {
			$options[] = '';
			foreach ($Rs as $row) {
				$options[$row['id_produto_geral']] = $row['ds_nome_produto'];
			}

			return $options;
		} else {
			return false;
		}
	}

	public function getComboProdutoProposta($idSafra, $outrasCondicoes = array()) {
	    $where = ["id_safra = {$idSafra}", 'fl_ativo = true'];

	    if (!empty($outrasCondicoes)) {
            $where = array_merge($where, $outrasCondicoes);
        }

		$Rs = $this->fetchAll(implode(' AND ', $where), 'ds_nome_produto')->toArray();

		if (is_array($Rs)) {
			$options[] = '';
			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_nome_produto'];
			}

			return $options;
		} else {
			return false;
		}
	}

	public function getComboOrcamento() {
		$User = Zend_Registry::get('USER');
		$Rs = null;

		if ($User->tp_usuario == 'P') {
			$Corretor = new Sistema_Model_Corretores();
			$Preposto = new Sistema_Model_Prepostos();
			$Preposto = $Preposto->findByUser($User->id);
			$Corretor = $Corretor->find($Preposto->id_corretor);
		}

		// Busca Produtos permitidos para o PREPOSTO
		if (!$Rs && $User->tp_usuario == 'P') {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('p' => 'produto.produtos'));
			$select->join(array('pc' => 'produto.produtos_coberturas'),'p.id=pc.id_produto', false);
			$select->join(array('c' => 'comercializacao.comercializacoes'),'p.id=c.id_produto', false);
			$select->join(array('cu' => 'comercializacao.comercializacoes_usuarios'),'c.id=cu.id_comercializacao', false);
			$select->join(array('cp' => 'produto.condicoes_pagamento'),'cp.id_produto=p.id', false);
			$select->join(array('cpi' => 'produto.condicoes_pagamento_itens'),'cp.id=cpi.id_condicao_pagamento', false);
			$select->where('cpi.ds_mes = cast(extract(month from now())-1 as character)');
			$select->where('c.dt_comercializacao_fim >= now()');
			$select->where('cu.id_usuario = ?', $User->id);
			$Rs = $this->fetchAll($select);
		}

		// Busca Registros Permitidos para o CORRETOR
		if (!$Rs && ($User->tp_usuario == 'C' || $User->tp_usuario == 'P')) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('p' => 'produto.produtos'));
			$select->join(array('pc' => 'produto.produtos_coberturas'),'p.id=pc.id_produto', false);
			$select->join(array('c' => 'comercializacao.comercializacoes'),'p.id=c.id_produto', false);
			$select->join(array('cu' => 'comercializacao.comercializacoes_usuarios'),'c.id=cu.id_comercializacao', false);
			$select->join(array('cp' => 'produto.condicoes_pagamento'),'cp.id_produto=p.id', false);
			$select->join(array('cpi' => 'produto.condicoes_pagamento_itens'),'cp.id=cpi.id_condicao_pagamento', false);
			$select->where('cpi.ds_mes = cast(extract(month from now())-1 as character)');
			$select->where('cu.id_usuario = ?', $Corretor->id_usuario);
			$select->where('c.dt_comercializacao_fim >= now()');
			$Rs = $this->fetchAll($select);
		}

		if (!$Rs) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('p' => 'produto.produtos'));
			//$select->join(array('pc' => 'produto.produtos_coberturas'),'p.id=pc.id_produto', false);
			//$select->join(array('c' => 'comercializacao.comercializacoes'),'p.id=c.id_produto', false);
			//$select->join(array('cp' => 'produto.condicoes_pagamento'),'cp.id_produto=p.id', false);
			//$select->join(array('cpi' => 'produto.condicoes_pagamento_itens'),'cp.id=cpi.id_condicao_pagamento', false);
			//$select->where('cpi.ds_mes = cast(extract(month from now())-1 as character)');
			//$select->where('c.dt_comercializacao_fim >= now()');
			$Rs = $this->fetchAll($select);
		}

		if ($Rs) {
			$options[] = null;
			foreach ($Rs as $row) {
				$options[$row['id']] = $row[$this->_order];
			}

			return $options;
		} else {
			return false;
		}

		return $options;
	}

	public function getProduto($idProduto,$field=null){
		$data = null;
		if($idProduto){
			$data = $this->fetchRow($this->getAdapter()->quoteInto('id = ?',$idProduto))->toArray();

			if($field && array_key_exists($field, $data)){
				$data = $data[$field];
			}
		}
		return $data;
	}

	public function getCultura($idProduto){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.produtos'), false);
		$select->join(array('pg' => 'produto.produtos_geral'),'p.id_produto_geral = pg.id', false);
		$select->join(array('c' => 'produto.culturas'),'pg.id_cultura = c.id', '*');
		$select->where('p.id = ?', $idProduto);

		return $this->getDefaultAdapter()->fetchRow($select);
	}


	public function getProdutosByCultura($idCultura){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.produtos'));
		$select->join(array('pg' => 'produto.produtos_geral'),'p.id_produto_geral = pg.id', false);
		$select->join(array('c' => 'produto.culturas'),'pg.id_cultura = c.id', false);
		if (is_array($idCultura)) {
			$idCultura = implode(',', $idCultura);
		}

		if (!empty($idSafra)) {
			$select->where("p.id_safra = {$idSafra}");
		}

		$select->where("c.id IN ($idCultura)");
		
		return $this->getDefaultAdapter()->fetchAll($select);
	}

	public function getProdutosByIdSafraIdCultura(int $idSafra, array $idsCultura = [])
    {
        $query = $this->select()
            ->setIntegrityCheck(false)
            ->from(array('p' => 'produto.produtos'))
            ->join(array('pg' => 'produto.produtos_geral'), 'p.id_produto_geral = pg.id', 'id_cultura')
            ->join(array('c' => 'produto.culturas'), 'pg.id_cultura = c.id', false)
            ->where('p.id_safra = ?', $idSafra);

        if (!empty($idsCultura)) {
            $query->where('c.id in (' . implode(',', $idsCultura) . ')');
        }

        return $this->getDefaultAdapter()->fetchAll($query);
    }

	/*
	 *
	 * Copia um produto para uma nova safra
	 *
	 */
	public function copiarProduto($params) {
        Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		try {
			$Produto = $this->find($params['id_produto'])->current();
			// $produtoConfig = findByIdProduto

			if ($Produto) {
				// Cria um novo produto
				$newProduto = $this->createRow();
				$newProduto->id_produto_geral = $Produto->id_produto_geral;
				$newProduto->id_safra = $params['id_safra'];
				$newProduto->id_seguradora = $Produto->id_seguradora;
				$newProduto->nr_susep = $Produto->nr_susep;
				$newProduto->ds_nome_produto = $Produto->ds_nome_produto;
				$newProduto->ds_chave_produto = $Produto->ds_chave_produto;
				$newProduto->ar_condicoes_gerais = $Produto->ar_condicoes_gerais;
				$newProduto->cd_bacen = $Produto->cd_bacen;
				$newProduto->id_legacy = $params['id_produto'];
				$newProduto->ds_nome_abreviado = $Produto->ds_nome_abreviado;
				$newProduto->cd_produto_seguradora = $Produto->cd_produto_seguradora;

				$newProduto->save();

				// Se salvou o novo produto, comeca a copiar as tabelas dependentes
				if ($newProduto->id) {

					// Copia as Variedades
					$this->_copiarVariedades($params['id_produto'], $newProduto->id);

					// Copia as Coberturas
					$this->_copiarCoberturas($params['id_produto'], $newProduto->id);

					// Copia as Condições Especiais de cada cobertura
					$this->_copiarCoberturasCondicoesEspeciais($params['id_produto'], $newProduto->id);

					// Copia configurações do produto
					$this->_copiarProdutoConfiguracoes($params['id_produto'], $newProduto->id);

					// Copia os grupos de atributos
					$this->_copiarGrupos($params['id_produto'], $newProduto->id, true);
					if ($params['copiar_grupo_atributos']) {
						$this->_copiarGrupos($params['id_produto'], $newProduto->id, false);
					}

					// Copia as condicoes de pagamento
					if ($params['copiar_condicao_pagamento']) {
						$this->_copiarCondicoesPagamento($params['id_produto'], $newProduto->id, true);
					}

					// Copia as comercializacoes
					if ($params['copiar_comercializacoes']) {
						$this->_copiarComercializacoes($params['id_produto'], $newProduto->id);
					}

					// Copia as taxas
					if ($params['copiar_taxas']) {
						$this->_copiarTaxas($params['id_produto'], $newProduto->id);
					}

					//$this->_copiarCapacidades($params['id_produto'], $newProduto->id);

					// Copia as validacoes do produto para o novo
					$this->_copiarValidacoes($params['id_produto'], $newProduto->id);

					//Copia as validações de aviso de sinistro
					$this->_copiarValidacoesAvisoSinistro($params['id_produto'], $newProduto->id);

					//Envia email para o departametno de sinistro, notificando sobre o cadastro de um novo produto
					//e alertando sobre a necessidade da configuração de laudos de sinistro
					$To = 'tiago.zschornack@agrobrasilseguros.com.br';
					$Cc = 'tonismar.bernardo@agrobrasilseguros.com.br';
					$Cc1 = 'marcia.correa@agrobrasilseguros.com.br';

					$assunto = "Novo Produto Cadastrado ({$newProduto->ds_nome_produto})";

					$content = "\nInformamos que o usuário: ".Zend_Auth::getInstance()->getIdentity()->ds_nome_usuario." cadastrou o produto {$newProduto->ds_nome_produto} (Id: {$newProduto->id}) através da funcionalidade de cópia de Produtos.\n";
					$content .= "É necessário realizar as configurações de Laudos de Sinistro para seu correto funcionamento.\n\n";

					try {
						$Mail = new Agro_Mail();
						$Mail->addTo($To);
						$Mail->addCc($Cc);
						$Mail->addCc($Cc1);
						$Mail->setTipoUsuario('Usuário');
						$Mail->setBody($content);
						$Mail->setSubject($assunto);
						$Mail->send();

						Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
						return $newProduto->id;

					} catch (Exception $e) {

						Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
						return false;
					}

				}
			}

		} catch (Exception $e) {

			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as comercializacoes
	 */
	private function _copiarComercializacoes($idProduto, $idNewProduto) {
		$Comercializacoes = new Produto_Model_Comercializacoes();
		$Comercializacoes->copiar($idProduto, $idNewProduto);
	}

	/*
	 * Copia as taxas
	 */
	private function _copiarTaxas($idProduto, $idNewProduto) {
		$Taxas = new Produto_Model_Taxas();
		$Taxas->copiar($idProduto, $idNewProduto);
	}

	/*
	 * Copia as taxas
	 */
	private function _copiarCapacidades($idProduto, $idNewProduto) {
	    $Capacidades = new Produto_Model_Validacoescapacidade();
	    $Capacidades->copiar($idProduto, $idNewProduto);
	}
	
	/*
	 * Copia as validacoes de um produto para outro produto
	 */
	private function _copiarValidacoes($idProduto, $idNewProduto) {

		$ProdutosValidacoes = new Produto_Model_ProdutosValidacoes();
		$Validacoes = $ProdutosValidacoes->fetchAll("id_produto = $idProduto");

		try {
			if ($Validacoes->count()) {
				foreach ($Validacoes as $Validacao) {
					$ProdutosValidacoes->defaultSave(array(
						'id_validacao' => $Validacao->id_validacao,
						'id_produto' => $idNewProduto
					));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}

	}

	/*
	 * Copia as validacoes de aviso de sinistro de um produto para outro produto
	 */
	private function _copiarValidacoesAvisoSinistro($idProduto, $idNewProduto) {

		$ProdutosValidacoesAviso = new Produto_Model_ProdutosCoberturasEventos();
		$Validacoes = $ProdutosValidacoesAviso->fetchAll("id_produto = $idProduto");

		try {
			if ($Validacoes->count()) {
				foreach ($Validacoes as $Validacao) {
					$ProdutosValidacoesAviso->save(array(
							'id_produto' => $idNewProduto,
							'id_cobertura' => $Validacao->id_cobertura,
							'id_evento' 	=> $Validacao->id_evento,
							'nr_dias_carencia' => $Validacao->nr_dias_carencia,
							'nr_dias_alerta_aviso' => $Validacao->nr_dias_alerta_aviso,
							'nr_dias_cancelamento' => $Validacao->nr_dias_cancelamento,
					        'fl_excluir_aviso_sinistro' => $Validacao->fl_excluir_aviso_sinistro
					    ));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}

	}

	private function _copiarProdutoConfiguracoes($idProduto, $idNewProduto)
	{
		$produtoConfig = new Produto_Model_ProdutoConfig();
		$produtoRenovacao = new Produto_Model_ProdutosProdutosGeralRenovacao();

		try {
			$configuracoes = $produtoConfig->fetchAll("id_produto = {$idProduto}");

			$mapConfig = [];

			foreach($configuracoes as $config) {
				$idProdutoConfigNovo = $produtoConfig->save([
					'id_produto' => $idNewProduto,
					'id_modelo_vistoria_previa' => $config->id_modelo_vistoria_previa,
					'ds_frase_padrao_orcamento' => $config->ds_frase_padrao_orcamento,
					'ds_frase_restricoes' => $config->ds_frase_restricoes,
					'ds_frase_risco' => $config->ds_frase_risco,
					'ds_url_condicoes' => $config->ds_url_condicoes,
					'fl_ativo' => $config->fl_ativo,
					'dt_inicio_validade' => $config->dt_inicio_validade,
				]);

				$mapConfig[$config->id] = $idProdutoConfigNovo;
			}

			$rs = $produtoRenovacao->fetchAll("id_produto = {$idProduto}");

			foreach ($rs as $row) {
				$produtoRenovacao->saveRow($row->id_produto_geral, $idNewProduto, $mapConfig[$row->id_produto_config]);
			}

		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as variedades de um produto para outro produto
	 */
	private function _copiarVariedades($idProduto, $idNewProduto) {
		$ProdutosVariedades = new Produto_Model_ProdutosVariedades();
		$GrupoVariedades    = new Produto_Model_ValidacaoLimitesLmga();

		try {
			$GruposVar = $GrupoVariedades->fetchAll("id_produto = $idProduto and fl_grupo_padrao = true");

			if ($GruposVar->count()) {
				foreach ($GruposVar as $GrupoVar) {
					$idNewGrupoVar = $GrupoVariedades->save(array(
							'id_produto' => $idNewProduto,
							'ds_nome_grupo' => 'PADRÃO',
							'fl_grupo_padrao' => 't'
					));
				}

				$Variedades = $ProdutosVariedades->fetchAll("id_produto = $idProduto and id_validacao_limites_lmga=$GrupoVar->id");

				if ($Variedades->count()) {
					foreach ($Variedades as $Variedade) {
						if(!$ProdutosVariedades->save(array(
								'id_produto' => $idNewProduto,
								'id_variedade' => $Variedade->id_variedade,
								'vl_importancia_segurada_minima' => $Variedade->vl_importancia_segurada_minima,
								'vl_importancia_segurada_maxima' => $Variedade->vl_importancia_segurada_maxima,
								'id_validacao_limites_lmga' => $idNewGrupoVar
						))){
							return false;
						}
					}
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as coberturas de um produto para outro produto
	 */
	private function _copiarCoberturas($idProduto, $idNewProduto) {
		$ProdutosCoberturas = new Produto_Model_ProdutosCoberturas();
		$Coberturas = $ProdutosCoberturas->fetchAll("id_produto = $idProduto");

		try {
			if ($Coberturas->count()) {
				foreach ($Coberturas as $Cobertura) {
					$ProdutosCoberturas->save(array(
						'id_produto' => $idNewProduto,
						'id_cobertura' => $Cobertura->id_cobertura,
						'fl_cobertura_principal' => $Cobertura->fl_cobertura_principal,
						'fl_taxa_relacionada' => $Cobertura->fl_taxa_relacionada,
						'fl_somente_renovacoes' => $Cobertura->fl_somente_renovacoes,
						'fl_vistoria_previa' => $Cobertura->fl_vistoria_previa,
						'fl_vistoria_preliminar' => $Cobertura->fl_vistoria_preliminar,
						'fl_vistoria_final' => $Cobertura->fl_vistoria_final,
						'fl_validar_capacidade' => $Cobertura->fl_validar_capacidade,
						'fl_cobertura_dependente' => $Cobertura->fl_cobertura_dependente,
						'fl_exibir_franquia' => $Cobertura->fl_exibir_franquia,
						'id_cobertura_dependencia' => $Cobertura->id_cobertura_dependencia,
						'id_tipo_laudo_preliminar' => $Cobertura->id_tipo_laudo_preliminar,
						'id_tipo_laudo_final' => $Cobertura->id_tipo_laudo_final,
						'id_tipo_liquidacao' => $Cobertura->id_tipo_liquidacao,
						'vl_lmi' => $Cobertura->vl_lmi,
					    'cd_cobertura_seguradora' => $Cobertura->cd_cobertura_seguradora,
                        'ds_observacao' => $Cobertura->ds_observacao, //task 04050 - new field
                        'ds_observacao_interna' => $Cobertura->ds_observacao_interna,
					));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}
	
	public function getTipoLaudoByIdProduto(int $idProduto)
	{
		return $this->_db->fetchRow(
			$this
				->select()
				->setIntegrityCheck(false)
				->from(['p' => 'produto.produtos'], false)
				->join(['pc' => 'produto.produtos_coberturas'], 'pc.id_produto = p.id', false)
				->join(['tlf' => 'sinistro.tipo_laudo_final'], 'tlf.id = pc.id_tipo_laudo_final')
				->where('p.id = ?', $idProduto)
		);
	}

	/*
	 * Copia as coberturas de um produto para outro produto
	*/
	private function _copiarCoberturasCondicoesEspeciais($idProduto, $idNewProduto) {
		$ProdutosCoberturasCondEspeciais = new Produto_Model_ProdutosCoberturasCondicoesEspeciais();
		$Coberturas = $ProdutosCoberturasCondEspeciais->fetchAll("id_produto = $idProduto");

		try {
			if ($Coberturas->count()) {
				foreach ($Coberturas as $Cobertura) {
					$ProdutosCoberturasCondEspeciais->saveCopiaCondicoesEspeciais(array(
							'id_produto' => $idNewProduto,
							'id_cobertura' => $Cobertura->id_cobertura,
							'id_condicao_especial' => $Cobertura->id_condicao_especial
					));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}


	/*
	 * Copia os grupos de atributos e suas relacoes para outro produto
	 */
	private function _copiarGrupos($idProduto, $idNewProduto, $flPadrao) {
		$GruposProponentes = new Produto_Model_AtributoGrupoProponente();
		$GruposUsuarios = new Produto_Model_AtributoGrupoUsuarios();
		$ProdutosAtributos = new Produto_Model_ProdutosAtributos();
		$GrupoAtributo = new Produto_Model_Atributogrupos();
		$flPadrao = ($flPadrao ? 'true' : 'false');

		try{
		    $Grupos = $GrupoAtributo->fetchAll("id_produto = $idProduto and fl_grupo_padrao = $flPadrao and fl_del=false");
			
			if ($Grupos->count()) {
				foreach ($Grupos as $Grupo) {
					$idNewGrupo = $GrupoAtributo->save(array(
						'id_produto' => $idNewProduto,
						'ds_nome_grupo' => $Grupo->ds_nome_grupo,
						'fl_grupo_padrao' => $Grupo->fl_grupo_padrao,
						'ds_tipo' => $Grupo->ds_tipo,
					));

					if ($idNewGrupo) {
						$Itens = $ProdutosAtributos->fetchAll("id_grupo_atributo_rn = {$Grupo->id} and fl_del=false");
						if ($Itens->count()) {
							foreach ($Itens as $Item) {
								$ProdutosAtributos->save(array(
									'id_grupo_atributo_rn' => $idNewGrupo,
									'id_atributo_rn' => $Item->id_atributo_rn,
									'ds_valor' => $Item->ds_valor
								));
							}
						}

						$Itens = $GruposProponentes->fetchAll("id_grupo_atributo_rn = {$Grupo->id} and fl_del=false");
						if ($Itens->count()) {
							foreach ($Itens as $Item) {
								$GruposProponentes->save(array(
									'id_grupo_atributo_rn' => $idNewGrupo,
									'id_proponente' => $Item->id_proponente
								));
							}
						}

						$Itens = $GruposUsuarios->fetchAll("id_grupo_atributo_rn = {$Grupo->id} and fl_del=false");
						if ($Itens->count()) {
							foreach ($Itens as $Item) {
								$GruposUsuarios->save(array(
									'id_grupo_atributo_rn' => $idNewGrupo,
									'id_usuario' => $Item->id_usuario
								));
							}
						}
					}
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as condicoes de pagamento e suas relacoes para outro produto
	 */
	private function _copiarCondicoesPagamento($idProduto, $idNewProduto, $flPadrao) {
		$CondicaoPagamento = new Produto_Model_CondicoesPagamento();
		$flPadrao = ($flPadrao ? 'true' : 'false');


		$Condicoes = $CondicaoPagamento->fetchCondicoes("id_produto = $idProduto and fl_condicao_padrao = $flPadrao");
		if ($Condicoes->count()) {
			foreach ($Condicoes as $Condicao) {
				$idNewCondicaoPagamento = $CondicaoPagamento->save(array(
					'id_produto' => $idNewProduto,
					'fl_data_flexivel' => $Condicao->fl_data_flexivel,
					'ds_nome_condicao' => $Condicao->ds_nome_condicao,
					'fl_condicao_padrao' => $Condicao->fl_condicao_padrao,
					'fl_percentual_flexivel' => $Condicao->fl_percentual_flexivel,
					'fl_inadimplentes' => $Condicao->fl_inadimplentes
				));

				$this->_copiarCondicoesPagamentoItens($Condicao->id, $idNewCondicaoPagamento);
				return true;
			}
		}
	}

	/*
	 * Copia as condicoes de pagamento itens e suas relacoes para outro produto
	 */
	private function _copiarCondicoesPagamentoProponentes($idCondicaoPagamento, $idNewCondicaoPagamento) {
		$CondicaoPagamentoProponente = new Produto_Model_Condicaopagamentoproponente();

		try{
			$Itens = $CondicaoPagamentoProponente->fetchAll("id_condicao_pagamento = $idCondicaoPagamento");
			if ($Itens->count()) {
				foreach ($Itens as $Item) {
					$CondicaoPagamentoProponente->save(array(
						'id_condicao_pagamento' => $idNewCondicaoPagamento,
						'id_proponente' => $Item->id_proponente
					));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as condicoes de pagamento itens e suas relacoes para outro produto
	 */
	private function _copiarCondicoesPagamentoUsuarios($idCondicaoPagamento, $idNewCondicaoPagamento) {
		$CondicoesPagamentoUsuarios = new Produto_Model_CondicoesPagamentoUsuarios();

		try{
			$Itens = $CondicoesPagamentoUsuarios->fetchAll("id_condicao_pagamento = $idCondicaoPagamento");
			if ($Itens->count()) {
				foreach ($Itens as $Item) {
					$CondicoesPagamentoUsuarios->save(array(
						'id_condicao_pagamento' => $idNewCondicaoPagamento,
						'id_usuario' => $Item->id_usuario
					));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as condicoes de pagamento itens e suas relacoes para outro produto
	 */
	private function _copiarCondicoesPagamentoItens($idCondicaoPagamento, $idNewCondicaoPagamento) {
		$CondicaoPagamentoItens = new Produto_Model_CondicoesPagamentoItens();
		try{
			$Itens = $CondicaoPagamentoItens->fetchAll("id_condicao_pagamento = $idCondicaoPagamento");

			if ($Itens->count()) {
				foreach ($Itens as $Item) {
					$idNewCondicaoPagamentoItem = $CondicaoPagamentoItens->save(array(
						'id_condicao_pagamento' => $idNewCondicaoPagamento,
						'ds_dia_preferencial' => $Item->ds_dia_preferencial,
						'nr_parcelas' => $Item->nr_parcelas,
						'ds_ano' => $Item->ds_ano+1,
						'ds_mes' => $Item->ds_mes
					));
					$this->_copiarCondicoesPagamentoItensOpcoes($Item->id, $idNewCondicaoPagamentoItem);
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Copia as condicoes de pagamento opcoes e suas relacoes para outro produto
	 */
	private function _copiarCondicoesPagamentoItensOpcoes($idCondicaoPagamentoItem, $idNewCondicaoPagamentoItem) {
		$CondicaoPagamentoItensOpcoes = new Produto_Model_CondicoesPagamentoItensOpcoes();
		try{
			$Opcoes = $CondicaoPagamentoItensOpcoes->fetchAll("id_condicao_pagamento_item = $idCondicaoPagamentoItem");
			if ($Opcoes->count()) {
				foreach ($Opcoes as $Opcao) {
					$CondicaoPagamentoItensOpcoes->insert(array(
						'id_condicao_pagamento_item' => $idNewCondicaoPagamentoItem,
						'vl_percentual_parcela' => $Opcao->vl_percentual_parcela,
						'dt_vencimento_parcela' => $Opcao->dt_vencimento_parcela,
						'nr_parcela' => $Opcao->nr_parcela
					));
				}
			}
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/*
	 * Deleta produto e TUDO relacionado.
	 */
	public function beforeDelete($id, $field='') {
		try {
			$Model = new Produto_Model_ProdutosCoberturas();
			$Model->delete($id, 'id_produto');

			$Model = new Produto_Model_ProdutosVariedades();
			$Model->delete($id, 'id_produto');

			$Model = new Produto_Model_ProdutosValidacoes();
			$Model->delete($id, 'id_produto');
			
			$Model = new Produto_Model_CondicoesPagamento();
			$Model->delete($id, 'id_produto');
			
			$Model = new Produto_Model_Atributogrupos();
			$Model->delete($id, 'id_produto');

			$Model = new Produto_Model_Habilitacoes();
			$Model->delete($id, 'id_produto');
			
			$Model = new Produto_Model_Atributogrupos();
			$Model->delete($id, 'id_produto');

			$Model = new Produto_Model_Validacoeszoneamento();
			$Model->delete($id, 'id_produto');
			
			$Model = new Produto_Model_ProdutosProdutosGeralRenovacao();
			$Model->delete($id, 'id_produto');
			
			$Model = new Produto_Model_ProdutoConfig();
			$Model->delete($id, 'id_produto');

			$Model = new Produto_Model_ProdutosCoberturasCondicoesEspeciais();
			$Model->delete($id, 'id_produto');
			
			return true;
		} catch (Exception $e) {
			$this->setMessage("Não foi possível deletar o produto, existem dependências que impedem a operação");
			return false;
		}
	}

	public function getDadosXls($dados) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.produtos'), '*');
		$select->join(array('pg' => 'produto.produtos_geral'), 'p.id_produto_geral = pg.id', 'ds_nome_produto_geral');
		$select->join(array('c' => 'produto.culturas'), 'pg.id_cultura = c.id', 'ds_nome_cultura');
		$select->join(array('s' => 'produto.safras'), 'p.id_safra = s.id', 'ds_nome_safra');

		//lol, ja tinha id_safra_search em algum lugar, entao usei 2 :D
		$select->where('p.id_safra = ?', $dados['id_safra_search2']);
		$select->order('id_safra', 'ds_nome_produto');



		return $this->fetchAll($select)->toArray();
	}

	public function get(int $idProduto)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct();
        $select->from(array('p' => 'produto.produtos'));
        $select->join(
            array('pg' => 'produto.produtos_geral'),
            'pg.id = p.id_produto_geral',
            array('ds_nome_produto_geral', 'cd_produto_geral_seguradora', 'tp_epoca_cultivo')
        );
        $select->join(
            array('tp' => 'produto.tipo_produto'),
            'tp.id = pg.id_tipo_produto',
            array('ds_tipo_produto', 'ds_chave_rn AS ds_chave_tipo_produto')
        );
        $select->join(
            array('c' => 'produto.culturas'),
            'c.id = pg.id_cultura',
            array('ds_nome_cultura', 'cd_cultura_seguradora', 'cd_bacen')
        );
        $select->join(
            array('pc' => 'produto.produtos_coberturas'),
            'p.id = pc.id_produto and pc.fl_cobertura_principal = true',
            array(
                'id_cobertura',
                'fl_cobertura_principal',
                'fl_taxa_relacionada',
                'fl_somente_renovacoes',
                'fl_vistoria_previa',
                'vl_lmi',
                'id_condicao_especial',
                'fl_vistoria_preliminar',
                'fl_cobertura_dependente',
                'id_cobertura_dependencia',
                'fl_exibir_franquia',
                'fl_vistoria_final'
            )
        );
        $select->join(array('cob' => 'produto.coberturas'), 'cob.id = pc.id_cobertura', array('ds_nome_cobertura'));
        $select->join(array('e' => 'sistema.empresas'), 'p.id_seguradora= e.id', array('ds_nome_fantasia', 'cpf_cnpj'));
        $select->where('p.id = ?', $idProduto);
		
        return $this->fetchRow($select);
    }

	public function getComboModelosVistoriaPrevia(){
		$select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$select->from(array('m'=>'seguro.modelos_laudos_previas'),array('id','ds_titulo'));
		$select->where('m.fl_ativo = true');
		$Rs = $this->fetchAll($select);

		$options = array();
		$options[0] = '';
		if ($Rs) {
			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_titulo'];
			}
		}

		return $options;
	}

	public function getChaveProdutoById($idProduto) {
	    $select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p'=>$this->_schema.'.'.$this->_name),'ds_chave_produto');
		$select->where('p.id = ?', $idProduto);

		return $this->_db->fetchOne($select);
	}

	public function getProdutosMobile() {

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p'=>'produto.produtos'), array('id','ds_nome_produto','id_safra'));
		$Select->join(array('prc'=>'produto.produtos_coberturas'), 'prc.id_produto = p.id', null);
		$Select->where('prc.fl_vistoria_previa = true');
		$Select->where('p.id_safra >= 16');
		$Select->group(array('p.id', 'p.ds_nome_produto', 'p.id_safra'));
		$Select->order('p.ds_nome_produto');

		$Rs = $this->fetchAll($Select)->toArray();

		return $Rs;
	}

	public function getProdutosVariedadesMobile() {

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('pv'=>'produto.produtos_variedades'), array('id_produto','id_variedade'));
		$Select->join(array('p'=>'produto.produtos'), 'p.id = pv.id_produto', null);
		$Select->join(array('prc'=>'produto.produtos_coberturas'), 'prc.id_produto = p.id', null);
		$Select->where('prc.fl_vistoria_previa = true');
		$Select->where('p.id_safra >= 16');
		$Select->order('pv.id_produto');

		$Rs = $this->fetchAll($Select)->toArray();

		return $Rs;
	}

	public function getRegiaoProduto($idProduto, $idMunicipio)
    {
        if (empty($idProduto) || empty($idMunicipio)) {
            return [];
        }

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('produto.produtos'), array('regioes.id', 'regioes.ds_nome_regiao'));
        $select->join(array('pg' => 'produto.produtos_geral'), 'pg.id = produtos.id_produto_geral', []);
        $select->join(array('produto.culturas'), 'culturas.id = pg.id_cultura', []);
        $select->join(array('mcr' => 'sistema.municipios_culturas_regioes'), 'mcr.id_cultura = culturas.id', []);
        $select->join(array('sistema.regioes'), 'regioes.id = mcr.id_regiao', []);
        $select->where('produtos.id = ?', $idProduto);
        $select->where('mcr.id_municipio = ?', $idMunicipio);

        return $this->fetchAll($select)->toArray();
    }

	/**
	 * Retorna o combo de produtos disponíveis pela safra e culturas informadas
	 *
	 * @param int $idSafra
	 * @param array $idsCulturas
	 * @return array
	 */
	public function getComboBySafraCultura(int $idSafra, array $idsCulturas): array
	{
		$idsCulturas = implode(", ", $idsCulturas);
		$select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$select->from(['pp' => 'produto.produtos'], "pp.id, CASE WHEN pp.ds_nome_abreviado <> '' THEN pp.ds_nome_abreviado ELSE pp.ds_nome_produto END AS ds_nome_produto");
		$select->join(['pg' => 'produto.produtos_geral'], 'pg.id = pp.id_produto_geral', false);
		$select->where('pp.id_safra = ?', $idSafra);
		$select->where("pg.id_cultura IN ({$idsCulturas})");
		$select->order("ds_nome_produto");
		$rs = $this->fetchAll($select);

		$options = [];
		if ($rs) {
			foreach ($rs as $row) {
				$options[$row['id']] = $row['ds_nome_produto'];
			}
		}

		return $options;
	}
}
