<?php
class Seguro_ProponenteController extends Agro_Controller_Action{
	public $_columnList = array(
		'ds_nome_proponente' => 'Nome'
	);

	public function init() {
		$this->view->title = 'Seguro » Proponente';
	}

	public function getModel() {
		return new Seguro_Model_Proponentes();
	}

	public function getForm() {
		return new Seguro_Form_Proponente();
	}
	
	public function saveAction() {
		$this->isAjax();
		
		try {
			$params = $this->getRequest()->getParam('proponente');

			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			if (is_array($params) && $params['id_proposta']) {
				$PropostasProponentes = new Seguro_Model_PropostasProponentes();
				
				$retorno = [];

				if ($PropostasProponentes->save($params, $params['id_proposta'])) {
					$Proponentes = new Seguro_Model_Proponentes();
					
					if ($Proponentes->saveByCpfCnpj($params)) {
                        $retorno['message'] = "Proponente atualizado.";

                        if (!empty($this->_requestParams['origemSolicitacaoEndosso'])) {
							$retorno['message'] = "Proponente atualizado.";
							$retorno['salvarCamposAlteradosProponente'] = true;
                        }

						$PropostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();
						if (!empty($params['nr_justificativa'])) {
							$PropostasEmailJustificativa->save($params);
						} else {
							$PropostasEmailJustificativa->deleteByProposta($params['id_proposta']);
						}

						$this->getResponse()->setBody($retorno);
					} else {
						$retorno['message'] = "Não foi possível salvar os dados proponente.";
					}
					
				} else {
					$retorno['message'] = "Não foi possível salvar os dados proponente.";
				}
			} else {
				$retorno['message'] = "Parâmetros insuficientes.";
			}
			
			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (Exception $e) {
			$retorno['message'] = "Ocorreu uma falha inesperada no sistema.\n\nContate o setor de TI.";
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}
	
	public function getFilter() {
		$where = array();

		if ($this->getRequest()->getParam('ds_nome_proponente')) {
			$where[] = array (
				'field' => 'ds_nome_proponente',
				'operator' => 'ilike',
				'value' => '%'.$this->getRequest()->getParam('ds_nome_proponente').'%'
			);
		}

		if ($this->getRequest()->getParam('cpf_cnpj')) {
			$where[] = array (
				'field' => 'cpf_cnpj',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('cpf_cnpj')
			);
		}

		if ($this->getRequest()->getParam('fl_ativo')) {
			$where[] = array (
				'field' => 'p.fl_ativo',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('fl_ativo')
			);
		}

		if ($this->getRequest()->getParam('fl_restricao')) {
			$where[] = array (
				'field' => 'p.fl_restricao',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('fl_restricao') == 1 ? 'true' : 'null'
			);
		}

		return $where;
	}

	public function viewAction() {
		$this->view->title .= ' » Visualização';
		$this->view->back = '/seguro/proponente';

		$Model = $this->getModel();

		$data = $Model->find($this->getRequest()->getParam('id'))->current();

		$data['dt_documento_exp'] = Agro_Util::formatDate($data['dt_documento_exp'], Zend_Date::DATES);
		$data['dt_nascimento'] = Agro_Util::formatDate($data['dt_nascimento'], Zend_Date::DATES);
		$data['ds_sexo'] = $data['ds_sexo'] == 'M' ? 'Masculino' : 'Feminino';
		$data['fl_inadimplente'] = $data['fl_inadimplente'] ? 'Sim' : 'Não';
		$data['fl_validacao_receita'] = $data['fl_validacao_receita'] ? 'Sim' : 'Não';

		$this->view->data = $data;
	}

	public function getajaxAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$Proponente = new Seguro_Model_Proponentes();
		$row = '';
		$row = $Proponente->fetchRow("cpf_cnpj = '{$this->getRequest()->getParam('cpf_cnpj')}'");

		if ($row) {
			$row['dt_documento_exp'] = Agro_Util::formatDate($row[dt_documento_exp], Zend_Date::DATES);
			$row['dt_nascimento'] = Agro_Util::formatDate($row[dt_nascimento], Zend_Date::DATES);

			$this->getResponse()->setBody(Zend_Json::encode($row->toArray()));
		}
	}

	public function relacionaproponenteAction() {
		$this->getHelper('layout')->disableLayout();

		// Adiciona o id na view
		$this->view->id = $this->getRequest()->getParam('id');
		$this->view->ds_tipo = $this->getRequest()->getParam('ds_tipo');

		// Adiciona o tipo na view
		$this->view->tipo = $this->getRequest()->getParam('tipo');
		$this->view->id_produto = $this->getRequest()->getParam('id_produto');

		if ($this->view->tipo == 'condicao') {
			$Model = new Produto_Model_Condicaopagamentoproponente();
			$this->view->proponentes = $Model->getProponentesRelacionados($this->view->id);
		}

		if ($this->view->tipo == 'taxa') {
			$Model = new Comercializacao_Model_TaxasAgrupamentoProponente();
			$this->view->proponentes = $Model->getProponentesRelacionados($this->view->id);
		}
		
		if ($this->view->tipo == 'comercializacao') {
			$Model = new Comercializacao_Model_ComercializacoesProponente();
			$this->view->proponentes = $Model->getProponentesRelacionados($this->view->id);
		}
				
		if ($this->view->tipo == 'grupo') {
			$Model = new Produto_Model_AtributoGrupoProponente();
			$this->view->proponentes = $Model->getProponentesRelacionados($this->view->id);
		}

		if ($this->view->tipo == 'variedade') {
			$Model = new Produto_Model_ValidacaoLimitesLmgaProponentes();
			$this->view->proponentes = $Model->getProponentesRelacionados($this->view->id);
		}
		
	}
	
	public function listrelacionadosAction() {
		$this->getHelper('layout')->disableLayout();

		// Adiciona o id na view
		$this->view->id = $this->getRequest()->getParam('id');

		// Adiciona o tipo na view
		$this->view->tipo = $this->getRequest()->getParam('tipo');

		switch ($this->view->tipo) {
			case 'grupo':
				$Model = new Produto_Model_AtributoGrupoProponente();
				$this->view->relacionados = $Model->getProponentesRelacionados($this->view->id);
				break;
			case 'condicao':
				$Model = new Produto_Model_Condicaopagamentoproponente();
				$this->view->relacionados = $Model->getProponentesRelacionados($this->view->id);
				break;
			case 'taxa':
				$Model = new Comercializacao_Model_TaxasAgrupamentoProponente();
				$this->view->relacionados = $Model->getProponentesRelacionados($this->view->id);
				break;
			case 'comercializacao':
				$Model = new Comercializacao_Model_ComercializacoesProponente();
				$this->view->relacionados = $Model->getProponentesRelacionados($this->view->id);
				break;
			case 'variedade':
				$Model = new Produto_Model_ValidacaoLimitesLmgaProponentes();
				$this->view->relacionados = $Model->getProponentesRelacionados($this->view->id);
				break;
			default:
				$this->view->message = 'Nenhum tipo passado para o elemento';
				break;
		}
	}

	public function listencontradosAction() {
		$this->getHelper('layout')->disableLayout();
		$this->view->relacionados = array();

		$Model = $this->getModel();
		$Select = $Model->getData($this->getFilter());
		$this->view->encontrados = $Model->fetchAll($Select);

		switch ($this->getRequest()->getParam('tipo')) {
			case 'grupo':
				$Model = new Produto_Model_AtributoGrupoProponente();
				$relacionados = $Model->getProponentesRelacionados($this->getRequest()->getParam('id'));
				if ($relacionados->count()) {
					foreach ($relacionados as $relacionado) {
						$this->view->relacionados[] = $relacionado->id;
					}
				}

				break;
			case 'condicao':
				$Model = new Produto_Model_Condicaopagamentoproponente();
				$relacionados = $Model->getProponentesRelacionados($this->getRequest()->getParam('id'));
				if ($relacionados->count()) {
					foreach ($relacionados as $relacionado) {
						$this->view->relacionados[] = $relacionado->id;
					}
				}

				break;
			case 'taxa':
				$Model = new Comercializacao_Model_TaxasAgrupamentoProponente();
				$relacionados = $Model->getProponentesRelacionados($this->getRequest()->getParam('id'));
				if ($relacionados->count()) {
					foreach ($relacionados as $relacionado) {
						$this->view->relacionados[] = $relacionado->id;
					}
				}

				break;
			case 'comercializacao':
				$Model = new Comercializacao_Model_ComercializacoesProponente();
				$relacionados = $Model->getProponentesRelacionados($this->getRequest()->getParam('id'));
				if ($relacionados->count()) {
					foreach ($relacionados as $relacionado) {
						$this->view->relacionados[] = $relacionado->id;
					}
				}
			
				break;				
			default:
				$this->view->message = 'Nenhum tipo passado para o elemento';
				break;
		}
	}

	public function loadproponentesfromfilesAction()
	{
		$this->isAjax();
		
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			$idsProponentes = [];
			$allowedExtensions = ['csv'];
			
			foreach ($_FILES as $file) {
				$aux = explode('.', $file['name']);
				$extension = $aux[count($aux) - 1];
				
				if (!in_array($extension, $allowedExtensions)) {
					throw new Exception('Só permitido realizar upload de arquivos .csv.');
				}
				
				if (($open = fopen($file['tmp_name'], "r")) !== false) {
					while (($data = fgetcsv($open, 30, ',')) !== FALSE) {
						$cellData = explode(';', $data[0])[0];

						if (!empty($cellData) && is_numeric($cellData)) {
							$idsProponentes[] = $cellData;
						}
					}
	
					fclose($open);
				}
				
			}
			
			if (empty($idsProponentes)) {
				throw new Exception('Nenhum proponente informado no arquivo para importar.');
			}
			
			
			switch ($this->getRequest()->getParam('tipo')) {
				case 'grupo':
					$Model = new Produto_Model_AtributoGrupoProponente();
					$Model->vincularProponentes((int) $this->getRequest()->getParam('id'), $idsProponentes);
					$result['status'] = true;
					break;
				
				default:
					$taxasAgrupamentoProponente = new Comercializacao_Model_TaxasAgrupamentoProponente();
					$taxasAgrupamentoProponente->vincularProponentes(
						(int) $this->getRequest()->getParam('id'),
						$idsProponentes
					);
					break;
			}
			
			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
			$return = [
				'statusCode' => 200,
				'message' => 'Proponentes importados com sucesso',
				'status' => true
			];
		} catch(Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$return = [
				'statusCode' => 406,
				'message' => 'Ocorreu um erro ao importar o arquivo. Garanta que, os ids dos proponentes que deseja vincular estejam na primeira coluna do csv.',
				'status' => false
			];
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function marcarAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		try {
			if ($this->getRequest()->getParam('id')) {

				if (is_array($this->getRequest()->getParam('id_proponente'))) {
					foreach ($this->getRequest()->getParam('id_proponente') as $proponente) {
						$data = array();

						switch ($this->getRequest()->getParam('tipo')) {
							case 'grupo':
								$this->validarProponentesGrupo($this->getRequest()->getParams());

								return true;
								break;
							case 'condicao':
								$data['id_condicao_pagamento'] = $this->getRequest()->getParam('id');
								$data['id_proponente'] = $proponente;

								$Model = new Produto_Model_Condicaopagamentoproponente();
								if (!$Model->save($data)) {
									throw new Exception('Não foi possível relacionar o item.');
								}
								break;
							case 'taxa':
								$data['id_taxa_agrupamento'] = $this->getRequest()->getParam('id');
								$data['id_proponente'] = $proponente;

								$Model = new Comercializacao_Model_TaxasAgrupamentoProponente();
								$Model->save($data);
								break;
							case 'comercializacao':
								$data['id_comercializacao'] = $this->getRequest()->getParam('id');
								$data['id_proponente'] = $proponente;
							
								$Model = new Comercializacao_Model_ComercializacoesProponente();
								$Model->save($data);
								break;
							case 'variedade':
								$data['id_validacao_limites_lmga'] = $this->getRequest()->getParam('id');
								$data['id_proponente'] = $proponente;

								$Model = new Produto_Model_ValidacaoLimitesLmgaProponentes();
								$Model->save($data);
								break;
						}
					}
				}
			}

			$result['message'] = 'Proponentes relacionados.';
			$result['status'] = true;
		} catch (Exception $e) {
			$result['message'] = $e->getMessage();
			$result['status'] = false;
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function desmarcarAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$result = array();

		try {
			switch ($this->getRequest()->getParam('tipo')) {
				case 'grupo':
					$Model = new Produto_Model_AtributoGrupoProponente();
					$Model->desmarcaProponete($this->getRequest()->getParam('id'), $this->getRequest()->getParam('proponente'));
					$result['status'] = true;
					break;
				case 'condicao':
					$Model = new Produto_Model_Condicaopagamentoproponente();
					$Model->desmarcaProponete($this->getRequest()->getParam('id'), $this->getRequest()->getParam('proponente'));
					$result['status'] = true;
					break;
				case 'taxa':
					$Model = new Comercializacao_Model_TaxasAgrupamentoProponente();
					$Model->desmarcaProponete($this->getRequest()->getParam('id'), $this->getRequest()->getParam('proponente'));
					$result['status'] = true;
					break;
				case 'comercializacao':
					$Model = new Comercializacao_Model_ComercializacoesProponente();
					$Model->desmarcaProponete($this->getRequest()->getParam('id'), $this->getRequest()->getParam('proponente'));
					$result['status'] = true;
					break;
				case 'variedade':
					$Model = new Produto_Model_ValidacaoLimitesLmgaProponentes();
					$Model->desmarcaProponente($this->getRequest()->getParam('id'), $this->getRequest()->getParam('proponente'));
					$result['status'] = true;
					break;
				default:
					$result['message'] = 'Nenhum tipo passado para o elemento';
					$result['status'] = false;
					break;
			}
		} catch (Exception $e) {
			$result['message'] = $e->getMessage();
			$result['status'] = false;
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function formsociosAction(){
		$this->isAjax(true);

		$Model = new Seguro_Model_PropostasProponentesSocios();
		$socio = $Model->getSocio($this->getRequest()->getParam('id'));

		$this->view->id = $socio['id'];
		$this->view->ds_nome_socio = $socio['ds_nome_socio'];
		$this->view->cpf_cnpj = $socio['cpf_cnpj'];
		$this->view->tp_pessoa = $socio['tp_pessoa'];
		$this->view->id_parent = $socio['id_parent'];
		$this->view->cnpj_segurado = $socio['cnpj_segurado'];

	}

	public function formsociosppeAction(){
		$this->isAjax(true);
		
		$Model = new Seguro_Model_PropostasProponentesRelacionamentoPpe();
		$socio = $Model->getSocio($this->getRequest()->getParam('id'));
		
		$this->view->id = $socio['id'];
		$this->view->ds_nome_socio = $socio['ds_nome_socio'];
		$this->view->cpf_cnpj = $socio['ds_nro_cpf'];
		$this->view->id_proposta = $socio['id_proposta'];
		$this->view->tp_relacionamento = $socio['tp_relacionamento'];
		
	}
	
	public function sociosAction(){
		$this->isAjax(true);

		if($this->getRequest()->getParam('id_parent')){
			$this->view->id_parent = $this->getRequest()->getParam('id_parent');
		}

		$this->view->cnpj_segurado = $this->getRequest()->getParam('cnpj_segurado');
	}

	public function sociosppeAction(){
		$this->isAjax(true);
		$this->view->cnpj_segurado = $this->getRequest()->getParam('cnpj_segurado');
		$this->view->id_proposta= $this->getRequest()->getParam('id_proposta');
	}
	
	public function getsociosAction(){
		$this->isAjax();

		$Model = new Seguro_Model_PropostasProponentesSocios();
		$socios = $Model->getSociosByCnpjSegurado($this->getRequest()->getParam('cnpj'),$this->getRequest()->getParam('id_parent'));
		foreach($socios as $key => $value){
			$dados[$key] = $value;
		}
		$this->getResponse()->setBody(Zend_Json::encode($dados));

	}

	public function getsociosppeAction(){
		$this->isAjax();
		
		$Model = new Seguro_Model_PropostasProponentesRelacionamentoPpe();
		$socios = $Model->getSociosByProposta($this->getRequest()->getParam('id_proposta'));
		foreach($socios as $key => $value){
			$dados[$key] = $value;
		}
		$this->getResponse()->setBody(Zend_Json::encode($dados));
	}
	
	public function savesocioAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentesSocios();

		$dados = array();

		$dados['cnpj_segurado'] = $this->getRequest()->getParam('cnpj_segurado');
		$dados['id_parent'] = $this->getRequest()->getParam('id_parent');
		$dados['tp_relacionamento'] = $this->getRequest()->getParam('tp_relacionamento');

		if($Model->save($this->getRequest()->getParams())){
			$return = array();
			$return['cnpj_segurado'] = $dados['cnpj_segurado'];
			$return['id_parent'] = $dados['id_parent'];
		}
		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function savesocioppeAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentesRelacionamentoPpe();
		
		$dados = array();
		
		$dados['id_proposta'] = $this->getRequest()->getParam('id_proposta');
		$dados['tp_relacionamento'] = $this->getRequest()->getParam('tp_relacionamento');
		
		if($Model->save($this->getRequest()->getParams())){
			$return = array();
			$return['id_proposta'] = $dados['id_proposta'];
		}
		$this->getResponse()->setBody(Zend_Json::encode($return));
	}
	
	public function removesocioAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentesSocios();

		if($Model->removeSocio($this->getRequest()->getParam('id'))){
			$return = true;
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}
	
	public function removesocioppeAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentesRelacionamentoPpe();

		if($Model->removeSocio($this->getRequest()->getParam('id'))){
			$return = true;
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function excelAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		
		ini_set('memory_limit','4096M');
		ini_set('max_execution_time',360);
		
		$where = $this->getFilter();

		$Module = $this->getRequest()->getModuleName();
		$Controller = $this->getRequest()->getControllerName();
		$Model = $this->getModel();

		if ($this->getRequest()->getParam("o")) {
			$Model->_order = trim($this->getRequest()->getParam("o") .' '. $this->getRequest()->getParam("s"));
		}

		$Rs = $Model->fetchAllPaginator($where);
		foreach ($Rs as $key => $row) {
			$row->fl_inadimplente = $row->fl_inadimplente ? 'Sim' : 'Não';
			$row->fl_restricao = $row->fl_restricao ? 'Sim' : 'Não';
		}
		if ($Model->_columnExcel) {
			$Csv = new Agro_Plugin_Rs2Csv();
			$Csv->setTitles($Model->_columnExcel);
			$Csv->setRecordSet($Rs);
			$Csv->setType("application/octet-stream");
			$Csv->setFileName("pesquisa.csv");
			$Csv->setDisposition("attachment");
			$Csv->setSeparator(";");
			$Csv->getCsv();
		} else {
			$Csv = new Agro_Plugin_Rs2Csv();
			$Csv->setTitles($Model->_columnExcel);
			$Csv->setRecordSet(array('Excel não configurado'));
			$Csv->setType("application/octet-stream");
			$Csv->setFileName("notfound.csv");
			$Csv->setDisposition("attachment");
			$Csv->setSeparator(";");
			$Csv->getCsv();
		}
	}

	public function formAction() {
		$Restricoes = new Seguro_Model_RestricoesTecnicas();
		$this->view->restricoes = $Restricoes->fetchAll()->toArray();

		//load list of restrictions
		$ProponentesRestricoesTecnicas = new Seguro_Model_ProponentesRestricoesTecnicas();

        $data = $this->getModel()->find($this->getRequest()->getParam('id'))->current();
		$this->view->programa_abc = false;
		$this->view->dt_vencimento_programa_abc = '';

		$modelProponentesAbc = new Seguro_Model_ProponentesAbc();
		$proponenteAbc = $modelProponentesAbc->getByCpfCnpj(preg_replace('/[^a-zA-Z0-9_ %\[\]\(\)%&]/s','', $data['cpf_cnpj']));

		if (!empty($proponenteAbc)) {
			$this->view->programa_abc = true;
			$dtVencimento = !empty($proponenteAbc->dt_vencimento) ? Agro_Util::formatDate($proponenteAbc->dt_vencimento, Zend_Date::DATES) : '';
			$this->view->dt_vencimento_programa_abc = $dtVencimento;
		}

		parent::formAction();
	}

	public function saverestricoesAction() {
		$this->isAjax();
		
		$params = $this->getRequest()->getParams();
		
		$modelProposta = new Seguro_Model_Propostas();
		$modelRestricoes = new Seguro_Model_ProponentesRestricoesTecnicas();
		$modelRestricoesPropostas = new Seguro_Model_ProponentesRestricoesTecnicasPropostas();
		$Proponentes = new Seguro_Model_Proponentes();
		$modelHistorico = new Seguro_Model_HistoricoProponenteRestricaoTecnica();
		
		$adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

		$adapter->beginTransaction();

		try {
			$idRestricao = $modelRestricoes->save($params);
			$modelHistorico->save(['id_proponente_restricao_tecnica' => $idRestricao]);
			
			$Proponentes->update(array('fl_restricao' => 'true'), 'id = '. $params['id_proponente']);
			
			$modelRestricoesPropostas->deleteByIdProponenteRestricaoTecnica($idRestricao);
			$idsPropostaInseridos = [];
			
			foreach ($params['ids_proposta'] as $id) {
				if (!empty($idsPropostaInseridos[$id]) || empty($id)) {
					continue;
				}

				if (empty($modelProposta->find($id)->current())) {
                    throw new Exception("Proposta {$id} não encontrada.");
                }
				
				$modelRestricoesPropostas->save(array(
					'id_proposta' => $id,
					'id_proponente_restricao_tecnica' => $idRestricao
				));
				$idsPropostaInseridos[$id] = true;
			}

			$adapter->commit();
			$result = array('status' => true, 'message' => 'Restrição salva com sucesso', 'id' => $params['id_proponente']);
		} catch (Exception $e) {
			$adapter->rollback();
			$result = array('status' => false, 'message' => 'Erro ao salvar restrição. ('.$e->getMessage().')');
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function listrestricoesAction() {
		$this->getHelper('layout')->disableLayout();
		$ProponentesRestricoesTecnicas = new Seguro_Model_ProponentesRestricoesTecnicas();
		
		$this->view->paginator = $ProponentesRestricoesTecnicas->getRestricoesByProponente($this->getRequest()->getParam('id'));
	}

	public function historicorestricaotecnicaAction() {
		$this->getHelper('layout')->disableLayout();
		
		$this->view->historico = (new Seguro_Model_HistoricoProponenteRestricaoTecnica())
			->getHistorico((int) $this->getRequest()->getParam('id'));
	}

	public function deleterestricaoAction() {
		$this->isAjax();
		$ProponentesRestricoesTecnicas = new Seguro_Model_ProponentesRestricoesTecnicas();

		$ProponentesRestricoesTecnicas->getDefaultAdapter()->beginTransaction();

		try {
			(new Seguro_Model_RestricoesTecnicasProponentesRestricoesTecnicas())
				->delete($this->getRequest()->getParam('id'), 'id_proponente_restricao');
			(new Seguro_Model_HistoricoProponenteRestricaoTecnica())
				->delete($this->getRequest()->getParam('id'), 'id_proponente_restricao_tecnica');
			(new Seguro_Model_ProponentesRestricoesTecnicasPropostas())
				->delete($this->getRequest()->getParam('id'), 'id_proponente_restricao_tecnica');
			$ProponentesRestricoesTecnicas->delete($this->getRequest()->getParam('id'));

			$numRestricoes = $ProponentesRestricoesTecnicas->fetchAll('id_proponente = ' . $this->getRequest()->getParam('id_proponente'))->count();

			if($numRestricoes==0) {
				$Proponentes = new Seguro_Model_Proponentes();
				$Proponentes->update(array('fl_restricao' => 'false'), 'id = ' . $this->getRequest()->getParam('id_proponente'));
			}
			$ProponentesRestricoesTecnicas->getDefaultAdapter()->commit();
			$result = array('status' => true, 'message' => 'Restrição removida com sucesso.', 'count' => $numRestricoes);
		} catch (Exception $e) {
			$ProponentesRestricoesTecnicas->getDefaultAdapter()->rollBack();
			$result = array('status' => false, 'message' => 'Erro ao remover restrição: ('.$e->getMessage().').');
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function editrestricaoAction() {
		$this->isAjax();

		$r = array();

		$ProponentesRestricoesTecnicas = new Seguro_Model_ProponentesRestricoesTecnicas();
		$RestricoesTecnicasProponentesRestricoesTecnicas = new Seguro_Model_RestricoesTecnicasProponentesRestricoesTecnicas();
		$modelProponentesRestricoesTecnicasPropostas = new Seguro_Model_ProponentesRestricoesTecnicasPropostas();

		$idProponenteRestricaoTecnica = $this->getRequest()->getParam('id');

		$proponente_restricao = $ProponentesRestricoesTecnicas->fetchRow("id = {$idProponenteRestricaoTecnica}")->toArray();
		$restricoes = $RestricoesTecnicasProponentesRestricoesTecnicas
			->fetchAll("id_proponente_restricao = {$idProponenteRestricaoTecnica}")
			->toArray();
		$restricoesPropostas = $modelProponentesRestricoesTecnicasPropostas
			->fetchAll("id_proponente_restricao_tecnica = {$idProponenteRestricaoTecnica}")
			->toArray();

		foreach($restricoes as $res) {
			array_push($r, $res['id_restricao']); 
		}

		$proponente_restricao['restricoes'] = $r;
		$proponente_restricao['propostas'] = !empty($restricoesPropostas) 
			? array_column($restricoesPropostas, 'id_proposta')
			: [];

		$this->getResponse()->setBody(Zend_Json::encode($proponente_restricao));
	}

	public function checkpropostaAction() {
		$this->isAjax();
		$result = array();
		$PropostasProponentes = new Seguro_Model_PropostasProponentes();
		$PropostasCorretores = new Seguro_Model_PropostasCorretores();
		$corretor = $PropostasCorretores->getIdCorredorByProposta($this->getRequest()->getParam('id_proposta'));

		$proponente = $PropostasProponentes->fetchAll('id_proposta = ' . $this->getRequest()->getParam('id_proposta') . ' and cpf_cnpj = \'' . $this->getRequest()->getParam('cpf_cnpj') . '\'')->count();

		if ($proponente>0) {
			$result = array('status' => true, 'message' => $corretor->id);
		} else {
			$result = array('status' => false, 'message' => 'Proposta informada não pertence a este proponente.');
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function validarcpfcnpjproponenteclausulaAction()
    {
        $this->isAjax();
        $retorno = ['erro' => false, 'mensagem' => ''];
        $parametros = $this->getRequest()->getParams();

        if ($parametros['origem'] === 'clausula') {
            $proponente = (new Seguro_Model_Propostas())->find($parametros['id_proposta'])->current()->proponente();

            if ($parametros['cpf_cnpj'] === $proponente['cpf_cnpj']) {
                $retorno['erro'] = true;
                $retorno['mensagem'] = 'Não é necessário cadastrar o Proponente como Beneficiário.';
            }
        }

        if ($parametros['origem'] === 'proponente') {
            $beneficiarios = (new Seguro_Model_PropostasBeneficiarios())->fetchBeneficiarios($parametros['id_proposta']);

            foreach ($beneficiarios as $beneficiario) {
                if ($parametros['cpf_cnpj'] === $beneficiario['nr_cpf_cnpj']) {
                    $retorno['erro'] = true;
                    $retorno['mensagem'] = 'CPF/CNPJ informado do Proponente deve ser diferente do Beneficiário.';

                    break;
                }
            }
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	private function validarProponentesGrupo(array $parametros)
    {
        $modelAtributoGrupoProponente = new Produto_Model_AtributoGrupoProponente();
        $usuariosGrupos = [];
        $retorno = [
          'usuariosComVinculoOutroGrupo' => false,
          'id'                           => $parametros['id'],
          'proponentes'                  => $parametros['id_proponente'],
          'mensagem'                     => ''
        ];

        foreach ($parametros['id_proponente'] as $proponente) {
            $rowProponente = $this->getModel()->find($proponente)->current();
            $rowsGruposProponentes = $modelAtributoGrupoProponente->getGruposProponenteByCpfCnpj(
                $rowProponente['cpf_cnpj'],
                $parametros['id_produto'],
                $parametros['ds_tipo'] ?? ''
            );

            foreach ($rowsGruposProponentes as $row) {
                $usuariosGrupos[] = "[{$row['ds_nome_grupo']}] - {$row['ds_nome_proponente']}.";
            }
        }

        if (!empty($usuariosGrupos)) {
            $mensagem = "Os seguintes proponentes já possuem configurações em outro grupo deste produto:\n";
            $mensagem .= implode("\n", $usuariosGrupos);
            $mensagem .= "\n\nDeseja seguir com o relacionamento dos proponentes?";
            $mensagem = strlen($mensagem) > 9995 ? substr($mensagem, 0, 9995) . " ..." : $mensagem;

            $retorno['usuariosComVinculoOutroGrupo'] = true;
            $retorno['mensagem'] = $mensagem;
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

	public function marcarproponentesgrupoAction()
    {
        $this->isAjax();
        $retorno = ['erro' => false, 'mensagem' => 'Proponentes relacionados.'];
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            foreach ($this->getRequest()->getParam('proponentes') as $proponente) {
                $data = ['id_grupo_atributo_rn' => $this->getRequest()->getParam('id'), 'id_proponente' => $proponente];
                $Model = new Produto_Model_AtributoGrupoProponente();
                $Model->save($data);
            }

            $adapter->commit();
        } catch (Exception $erro) {
            $adapter->rollback();

            $retorno['erro'] = true;
            $retorno['mensagem'] = 'Erro ao relacionar os proponentes.';
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function verificarinadimplenciaproponentesAction()
    {
        $this->isAjax();

        $parametros = $this->getRequest()->getParams();
        $retorno = ['temInadimplentes' => false, 'proponentesInadimplementes' => []];

        if (!empty($parametros['idsProponentes'])) {
            $proponentesInadimplentes = $this->getModel()->getInadimplentesById($parametros['idsProponentes']);

            if (!empty($proponentesInadimplentes)) {
                $retorno['temInadimplentes'] = true;
                $retorno['proponentesInadimplementes'] = $proponentesInadimplentes;
            }
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

	public function isinadimplentebypropostaAction(): void
	{
        $this->isAjax();
		$retorno = [
			'erro' => false,
			'mensagem' => '',
			'fl_inadimplente' => false,
		];

		try {
			$params = $this->getRequest()->getParams();

			if (empty($params['idProposta'])) {
				throw new Exception("ID Proposta não informado.");
			}

			if (filter_var($params['idProposta'], FILTER_VALIDATE_INT) === false) {
				throw new Exception('ID proposta deve ser um inteiro');
			}

			$retorno['fl_inadimplente'] = $this->getModel()->isInadimplenteByProposta($params['idProposta']);

		} catch (\Throwable $th) {
            $retorno['erro'] = true;
            $retorno['mensagem'] = $th->getMessage();
		}

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function possuiprogramaabcAction()
	{
		$this->isAjax();
		$retorno = [
			'erro' => false,
			'mensagem' => '',
			'programa_abc' => false,
			'dt_vencimento' => ''
		];

		try {
			$params = $this->getRequest()->getParams();
			
			if (empty($params['cpf_cnpj'])) {
				throw new Exception("CPF/CNPJ não informados.");
			}

			$modelProponentesAbc = new Seguro_Model_ProponentesAbc();
			$proponenteAbc = $modelProponentesAbc->getByCpfCnpj(preg_replace('/[^a-zA-Z0-9_ %\[\]\(\)%&]/s','', $params['cpf_cnpj']));
			
			if (!empty($proponenteAbc)) {
				
				$dtVencimento = !empty($proponenteAbc->dt_vencimento) ? Agro_Util::formatDate($proponenteAbc->dt_vencimento, Zend_Date::DATES) : '';
				$retorno['programa_abc'] = true;
				$retorno['dt_vencimento'] = $dtVencimento;
			}
		} catch (\Throwable $th) {
			$retorno['erro'] = true;
            $retorno['mensagem'] = $th->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}
}
