<?php
class Produto_RotinasController extends Agro_Controller_Action{

	public function init() {
		$this->view->title = 'Produto » Rotinas';

		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");
		$this->wsdl = "http://ws.nobre.com.br/Emissao.asmx?WSDL";
		$this->client = new nusoap_client($this->wsdl);
	}

	public function getModel() {
		return new Produto_Model_Rotinas();
	}

	public function importarhabilitacoesAction(){
		$this->view->title = 'Produto » Rotinas » Importar Habilitações';

		if($this->getRequest()->isPost()){

			$dir = APPLICATION_PATH . '/upload_files/temp/';
			$Adapter = new Zend_File_Transfer_Adapter_Http();
			$Adapter->setDestination(APPLICATION_PATH . '/upload_files/temp/');
			$file = $Adapter->getFileInfo();
			$field = array_key_first($file);

			$Adapter->addFilter('Rename', [
				'target'    => $dir . uniqid('up_') . '_habilitacoes.csv',
				'overwrite' => false
			], $field);
			
			if (!$Adapter->receive($field)) {
				$mensagem = "Erro ao atualizar Habilitações!";
				$result['status'] = $mensagem;
				$this->view->showMessage($mensagem, 'error');
			} else {
				$extensao = explode('.', $file['habilitacoes']['name']);
				if ($extensao[1] == 'csv') {
					$arquivo = fopen($Adapter->getFileName($field, true), "r");
					$linha = 0;
					$colunaIdUsuario = 0;
					$colunaIdProduto = 1;
					$colunaIdMunicipio = 2;
					$colunaIdEstado = 3;
					
					$modelPrepostos = new Sistema_Model_Prepostos();
					$corretoresProdutos = [];
					$hashSolicitacao = hash('sha256', uniqid(mt_rand(), true));

					while (($dados = fgetcsv($arquivo, 0, ";")) != false) {

						if ($linha === 0 || empty($dados[$colunaIdUsuario])) {
							$linha++;
							continue;
						}

						$idUsuarioCorretor = $dados[$colunaIdUsuario];
						$idUsuarioPreposto = null;
						
						$rowCorretor = $modelPrepostos->getCorretorByUsuario($dados[$colunaIdUsuario]);
						if (!empty($rowCorretor['id_usuario'])) {
							$idUsuarioCorretor = $rowCorretor['id_usuario'];
							$idUsuarioPreposto = $dados[$colunaIdUsuario];
						}

						$hashMunicipio = "{$dados[$colunaIdEstado]}#{$dados[$colunaIdMunicipio]}";
						$hash = "{$idUsuarioCorretor}#{$dados[$colunaIdProduto]}#{$hashMunicipio}";

						if (!array_key_exists($hash, $corretoresProdutos)) {
							$corretoresProdutos[$hash] = [
								"id_corretor" => $idUsuarioCorretor,
								"id_preposto" => null,
								"id_produto" => $dados[$colunaIdProduto],
								"municipios" => [],
								"prepostos" => [],
								"hash_solicitacao" => $hashSolicitacao,
								"limpar_habilitacoes" => false,
								"habilitar" => $this->getRequest()->getParam('habilitar') == 1,
								"nome_arquivo" => $file['habilitacoes']['name'],
								"incluir_corretor" => false
							];
						}

						$corretoresProdutos[$hash]['municipios'][$hashMunicipio] = $hashMunicipio;

						if (!empty($idUsuarioPreposto)) {
							$corretoresProdutos[$hash]['prepostos'][] = ['id_usuario' => $idUsuarioPreposto];
						} else {
							$corretoresProdutos[$hash]['incluir_corretor'] = true;
						}
					}

					fclose($arquivo);

					if (empty($corretoresProdutos)) {
						$msg = "Arquivo inválido!";
						$this->view->showMessage($msg, 'error');

					} else {
						$contador = 1;
						$total = count($corretoresProdutos);
						$modelHabilitacoes = new Produto_Model_Habilitacoes();

						foreach ($corretoresProdutos as $dados) {
							$dados['enviar_email_conclusao'] = $contador == $total;
							$modelHabilitacoes->adicionarHabilitacoesFila($dados);
							$contador++;
						}
						
						$msg = "A configuração será finalizada em instantes. Você receberá um e-mail assim que o processo for concluído!";
						$this->view->showMessage($msg, 'success');
					}
					
				} else {
					$msg = "Formato de arquivo inválido!";
					$this->view->showMessage($msg, 'error');
				}
			}
		}
	}

	public function importarzoneamentoAction(){
		$this->view->title = 'Produto » Rotinas » Importar Zoneamento';
	}

	public function importazoneamentoAction() {
		$this->isAjax();

		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
        $User = Zend_Auth::getInstance()->getIdentity();
		$Db->beginTransaction();

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();

		if(!$Adapter->receive($file['zoneamento']['name'])) {
			$result['status'] = 'Erro ao atualizar Zoneamento!';
		} else {
			$extensao = explode('.',$file['zoneamento']['name']);
			if($extensao[1] == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['zoneamento']['name'],"r");
				$linha = 0;
				$Model = $this->getModel();
				$zoneamentoExcluido = array();
				$sqlInsereHabilitacaoMunicipio = array();

				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false){
					for($i = 0; $i < count($dados); $i++){
						$result['id_municipio']        = $dados[0];
						$result['id_ciclo']            = $dados[1];
						$result['id_solo']             = $dados[2];
						$result['dt_inicio']           = $dados[3];
						$result['dt_fim']              = $dados[4];
						$result['id_produto']          = $dados[5];
						$result['vl_altitude']         = $dados[6];
						$result['id_sistema_plantio']  = $dados[7];
						$result['agrupamento']         = $dados[8];
						$result['dt_inicio_restricao'] = $dados[9];
						$result['dt_termino_restricao']= $dados[10];
					}

					//pula a primeira linha pois é cabeçalho
					if($linha != 0){
					    if ( !in_array(array($result['id_produto'], $result['id_municipio']), $zoneamentoExcluido)
                            && $Model->removeZoneamentoByMunicipioProduto($result['id_produto'], $result['id_municipio'])) {
                            $zoneamentoExcluido[] = array($result['id_produto'], $result['id_municipio']);
                        }

			            if(in_array(array($result['id_produto'], $result['id_municipio']), $zoneamentoExcluido)){
				            if((trim($result['agrupamento']) != trim($agrupamento_anterior)) && $result['id_produto']){
				                $result['id_validacao_zoneamento_graos'] = $Model->insereGrupoZoneamento($result);
				                $agrupamento_anterior = $result['agrupamento'];
				            }

				            $sqlInsereHabilitacaoMunicipio[] = "(
				                        ".$result['id_validacao_zoneamento_graos'].",
				                        ".$result['id_municipio'].",
				                        ".($result['vl_altitude'] ? $result['vl_altitude'] : 'null').",
				                        ".($result['id_sistema_plantio'] ? $result['id_sistema_plantio'] : 'null').",
				                        ".$User->id.",
				                        NOW()
				             )";
			            }else{
			            	$erro = true;
			            	break;
			            }
					}
					$idProduto = $result['id_produto'];
					$linha++;
				}
                if (!$Model->insereHabilitacaoMunicipioLote($sqlInsereHabilitacaoMunicipio)) {
                    $erro = true;
                }

                $modelSafra = new Produto_Model_Safras;
                $safra = $modelSafra->getSafraByProduto($idProduto);
                if (!$this->updateVersionZoneamento($safra)) {
                    $erro = true;
                }

				if(!$erro){
					$result['status'] = 'Zoneamento atualizado com sucesso!';
		  			fclose($arquivo);
					$Db->commit();

				}else{
	            	$result['status'] = 'Erro na linha '.($linha).' ao atualizar Zoneamento. Alterações canceladas.';
	            	$Db->rollback();
				}
			}else{
				$result['status'] = 'Formato de arquivo inválido!';
			}
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	private function updateVersionZoneamento($idSafra) {
	    try {
            $adp = Zend_Db_Table_Abstract::getDefaultAdapter();
            $user = Zend_Auth::getInstance()->getIdentity();

            $stat = $adp->query('SELECT id FROM sistema.versao_zoneamento WHERE fl_importado_zoneamento = TRUE AND fl_exportado_tablet = FALSE');
            $result = $stat->fetchAll();

            if (empty($result)) {
                $adp->query('
                INSERT INTO sistema.versao_zoneamento (
                    id_usuario_criacao,
                    id_usuario_alteracao,
                    dt_criacao,
                    dt_alteracao,
                    fl_ativo,
                    fl_del,
                    id,
                    id_safra,
                    ds_nome_arquivo,
                    md5,
                    fl_importado_zoneamento,
                    fl_exportado_tablet
                ) VALUES (
                    ' . $user->id . ',
                    NULL,
                    NOW(),
                    NULL,
                    FALSE,
                    FALSE,
                    NEXTVAL(\'sistema.versao_zoneamento_id_seq\'),
                    ' . $idSafra . ',
                    \'\',
                    \'\',
                    TRUE,
                    FALSE
                );');
            }

            return true;
        } catch (Exception $e) {
	        Agro_Util::zf_debug($e->getMessage());
	        return false;
        }
    }

	public function excluirzoneamentoAction() {
		$this->isAjax();
	
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();
	
		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();
	
		if(!$Adapter->receive($file['zoneamento_2']['name'])) {
			$result['status'] = 'Erro ao excluir Zoneamento!';
		} else {
			$extensao = explode('.',$file['zoneamento_2']['name']);
			if($extensao[1] == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['zoneamento_2']['name'],"r");
				$linha = 0;
				$Model = $this->getModel();
	
				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false){
					for($i = 0; $i < count($dados); $i++){
						$result['id_produto'] = $dados[0];
						$result['id_estado']  = $dados[1];
					}
	
					//pula a primeira linha pois é cabeçalho
					if($linha != 0){
						if(!$Model->removeZoneamentoUF($result['id_produto'], $result['id_estado'])){
							$erro = true;
							break;
						}
					}
					$linha++;
				}
	
				if(!$erro){
					$result['status'] = 'Zoneamento excluido com sucesso!';
					fclose($arquivo);
					$Db->commit();
	
				}else{
					$result['status'] = 'Erro na linha '.($linha).' ao excluir Zoneamento.';
					$Db->rollback();
				}
			}else{
				$result['status'] = 'Formato de arquivo inválido!';
			}
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}
	
	public function excluirciclosAction() {
	    $this->isAjax();
	    
	    $Db = Agro_Db_Table_Abstract::getDefaultAdapter();
	    $Db->beginTransaction();
	    
	    $Adapter = new Zend_File_Transfer_Adapter_Http();
	    $Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
	    $file = $Adapter->getFileInfo();
	    
	    if(!$Adapter->receive($file['ciclos_2']['name'])) {
	        $result['status'] = 'Erro ao excluir Ciclos!';
	    } else {
	        
	        
	        
	        $extensao = explode('.',$file['ciclos_2']['name']);
	        if($extensao[1] == 'csv'){
	            //abre o arquivo
	            $arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['ciclos_2']['name'],"r");
	            $linha = 0;
	            $Model = $this->getModel();
	            
	            //processa o csv
	            while(($dados = fgetcsv($arquivo, 0, ";")) != false){
	                for($i = 0; $i < count($dados); $i++){
	                    $result['id_produto'] = $dados[0];
	                }
	                
	                //pula a primeira linha pois é cabeçalho
	                if($linha != 0){
	                    if(!$Model->removeCiclos($result['id_produto'])){
	                        $erro = true;
	                        break;
	                    }
	                }
	                $linha++;
	            }
	            
	            if(!$erro){
	                $result['status'] = 'Ciclos excluídos com sucesso!';
	                fclose($arquivo);
	                $Db->commit();
	                
	            }else{
	                $result['status'] = 'Erro na linha '.($linha).' ao excluir Ciclos.';
	                $Db->rollback();
	            }
	        }else{
	            $result['status'] = 'Formato de arquivo inválido!';
	        }
	    }
	    $this->getResponse()->setBody(Zend_Json::encode($result));
	}
	
	public function importacultivaresAction() {

		$this->isAjax();

		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();

		$ModelCultivares = new Produto_Model_VariedadesCiclos();

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();

		if(!$Adapter->receive($file['cultivares']['name'])) {
			$result['status'] = 'Erro ao atualizar Cultivares!';
		} else {

			$extensao = explode('.',$file['cultivares']['name']);
			if($extensao[1] == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['cultivares']['name'],"r");
				$linha = 0;
				$Model = $this->getModel();


				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false){
					$result['id_estado']    = $dados[0];
					$result['id_variedade'] = $dados[1];
					$result['id_ciclo']     = $dados[2];
					$result['id_produto']   = $dados[3];
					$result['id_regiao']    = ($dados[4] ? $dados[4] : null);

					//pula a primeira linha pois é cabeçalho
					if($linha != 0){
			            if(!$ModelCultivares->deleteCultivar($result['id_estado'], $result['id_variedade'], $result['id_ciclo'], $result['id_produto'], $result['id_regiao'])){
			            	$erro = true;
			            	break;
			            }else{
			            	$ModelCultivares->save($result);
			            }
					}

					$idProduto = $result['id_produto'];

					$linha++;
				}

				$modelSafra = new Produto_Model_Safras;
                $safra = $modelSafra->getSafraByProduto($idProduto);
                if (!$this->updateVersionZoneamento($safra)) {
                    $erro = true;
                }

				if(!$erro){
					$result['status'] = 'Cultivares atualizados com sucesso! '.$linha;
		  			fclose($arquivo);
					$Db->commit();
				}else{
	            	$result['status'] = 'Erro na linha '.($linha+1).' ao atualizar Cultivares. Alterações canceladas.';
	            	$Db->rollback();
				}

			}else{
				$result['status'] = 'Formato de arquivo inválido!';
			}
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function importartaxamunicipioAction() {
		$this->view->title = 'Produto » Rotinas » Importar Taxas por Municípios';
	}

	public function taxasmunicipioAction() {
		$this->getHelper('layout')->disableLayout();
		$this->getHelper('ViewRenderer')->setNoRender();

		$Proponentes = new Seguro_Model_Proponentes();
		$ProdutoCoberturas = new Produto_Model_ProdutosCoberturas();
		$Safra = new Produto_Model_Safras();
		$TaxasAgrupamentos = new Comercializacao_Model_TaxasAgrupamentos();

		$i=0;
		$message = array();
		$message['status'] = 'Operação cancelada. Verifique o formato e layout do arquivo.';

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$Adapter->addValidator('Extension', false, array('csv', 'case' => true));
		$file = $Adapter->getFileInfo();

		Zend_Db_Table::getDefaultAdapter()->beginTransaction();

		//verifica se os dois arquivos foram fornecidados
		if($Adapter->receive($file['franquias_csv']['name']) && $Adapter->receive($file['franquias_municipios_csv']['name'])) {

			$arMun = $this->checaEstruturaFranquiasMunicipios($file['franquias_municipios_csv']['name']);

			if((count($arMun)>0) && (is_array($arMun))){

				$f = fopen(APPLICATION_PATH . '/upload_files/temp/' . $file['franquias_csv']['name'], 'r');

				while (!feof($f)) {
					$data = array();
					$linha = fgets($f, 780);

					//verifica se o arquivo está na estrutura correta
					if (substr_count($linha, ';') == 9) {
						list($id_produto, $id_cobertura, $vl_franquia, $vl_comissao, $vl_taxa, $vl_taxa_renovacao, $vl_taxa_inadimplente, $vl_percentual_subvencao_federal, $id_secao, $grupo) = explode(';', $linha);

						//pula primeira linha de caso seja titulos
						if ((integer)$id_produto == 0) { continue; }

						$Cobertura = $ProdutoCoberturas->getCoberturaPrincipal($id_produto,$id_cobertura);

						//inserir grupo
						if(( trim($grupo) != trim($grupo_anterior)) AND $grupo != '' AND $id_produto) {
							$grupo_anterior = $grupo;
							$arCobPrincipal = array();
							$id_taxa_agrupamento_max = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow('select max(id)+1 as id from comercializacao.taxas_agrupamento');
							$ds_nome_safra = $Safra->getNomeSafraByProduto($id_produto);
							$ds_nome_agrupamento_taxa = $ds_nome_safra." - ".$id_taxa_agrupamento_max['id'];

 							if (($this->getRequest()->getParam('importar_taxa_municipio') == 'S') && ($id_produto_anterior != $id_produto)){
								$id_produto_anterior = $id_produto;
								Agro_Db_Table_Abstract::getDefaultAdapter()->query("DELETE FROM comercializacao.taxas_agrupamento WHERE id_produto = $id_produto AND tp_taxa_agrupamento = 'M'");
							}

							$arMunTmp = array();
							$tp_agrupamento = 'M';
							$data['id_produto'] = $id_produto;
							$data['ds_nome_agrupamento_taxas'] = $ds_nome_agrupamento_taxa;
							$data['tp_taxa_agrupamento'] =$tp_agrupamento;
							$data['vl_comissao'] = $vl_comissao;
							$data['id_secao'] = $id_secao;

							//insert taxas_agrupamento
							$id_taxa_agrupamento = $TaxasAgrupamentos->insert($data);
							if (!$id_taxa_agrupamento) {
								$message['status'] = 'Erro ao cadastrar agrupamento de taxas: '.((int) $id_produto).' -> '. ((int)$grupo).' -> '.$tp_agrupamento;
								Zend_Db_Table::getDefaultAdapter()->rollBack();
								exit;
							}

							//relaciona agrupamento de taxas a municípios
							if( $tp_agrupamento == 'M' and $id_produto AND $id_taxa_agrupamento) {
								$TaxasAgrupamentoMunicipios = new Comercializacao_Model_TaxasAgrupamentoMunicipios();
								$arMunTmp = $arMun[trim($grupo)];

								foreach($arMunTmp as $key => $arMunProd) {
									$data = array();
									$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
									$data['id_municipio'] = $arMunProd['id_municipio'];
									$data['vl_produtividade_estimada'] = $arMunProd['vl_produtividade'];

									$RowMunicipio = $TaxasAgrupamentoMunicipios->save($data);
									if(!$RowMunicipio) {
										$message['status'] = 'Erro ao relacionar município à taxa: '.((int) $id_produto).' -> '.((int) $grupo).' -> '.$sigla_uf;
										Zend_Db_Table::getDefaultAdapter()->rollBack();
										exit;
									}
								}
							}
						}

						if($id_taxa_agrupamento AND $id_cobertura AND $vl_franquia) {
							
							$count++;
							$TaxaValores = new Comercializacao_Model_TaxasValores();

							$data = array();
							$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
							$data['id_cobertura'] = $id_cobertura;
							$data['vl_franquia'] = $vl_franquia;
							$data['vl_taxa'] = $vl_taxa;
							$data['vl_taxa_renovacao'] = $vl_taxa_renovacao;
							$data['vl_taxa_reduzida'] = $vl_taxa;
							$data['vl_taxa_inadimplente'] = ($vl_taxa_inadimplente ? $vl_taxa_inadimplente : 0);
							$data['vl_percentual_subvencao_federal'] = $vl_percentual_subvencao_federal;
							$data['fl_franquia_disponivel'] = 'S';
							$data['fl_ativo'] = true;

							$id_taxa_valores = $TaxaValores->save($data);

							if ($Cobertura->fl_cobertura_principal) {
								$arCobPrincipal[$vl_franquia] = $id_taxa_valores;
							}
							
							if($id_taxa_valores) {
								$id_cobertura = '';

								if (!$Cobertura->fl_cobertura_principal) {
									$data = array();
									$TaxasRelacionadas = new Comercializacao_Model_TaxasRelacionadas();
									$data['id_taxa'] = $id_taxa_valores;
									$data['id_taxa_relacionada'] = $arCobPrincipal[$vl_franquia];
									$taxa_relacionadas = $TaxasRelacionadas->insert($data);
									if (!$taxa_relacionadas) {
										$message['status'] = 'Erro ao relacionar coberturas adicionais: '. ((int) $id_produto).' -> '.((int) $grupo).' -> '. ((int) $id_cobertura);
										Zend_Db_Table::getDefaultAdapter()->rollBack();
										exit;
									}
								}
								
							} else {
								$message['status'] = 'Erro ao cadastrar valores da cobertura' . ($cobertura ? ' principal' : 's adicionais') . ((int) $id_produto).' -> '.((int) $grupo).' -> '. ((int) $id_cobertura);
								Zend_Db_Table::getDefaultAdapter()->rollBack();
								exit;
							}
						}
					} else { continue; }

					$i++;
				}
				
				if ($i>0) {
					$message['status'] = 'Taxas inseridas com sucesso.';
					Zend_Db_Table::getDefaultAdapter()->commit();
				}

			} else {
				$message['status'] = 'Erro ao validar arquivos de municipios.';
			}

		} else {
			$message['status'] = 'Problema ao receber os arquivos.';
		}

		$this->getResponse()->setBody("<script>window.top.window.stopUploadLocal('".$message['status']."');</script>");
	}

	private function checaEstruturaFranquiasMunicipios($file) {
		$count=0;
		$f = fopen(APPLICATION_PATH . '/upload_files/temp/' . $file, 'r');
		while(!feof($f)) {
			$linha = fgets($f, 780);
			if (substr_count($linha,';') == 2) {
				list($id_municipio, $grupo, $vl_produtividade) = explode(';', $linha);

				//pula primeira linha caso seja titulo
				if((integer)$id_municipio == 0) { continue; };

				$arMun[$grupo][$count]['id_municipio'] = $id_municipio;
				$arMun[$grupo][$count]['vl_produtividade'] = $vl_produtividade;
				$count++;
			} else {
				continue;
			}
		}

		return $arMun;
	}

	public function importartaxacarAction()
	{
		$this->view->title = 'Produto » Rotinas » Importar Taxas por Propriedades';
	}

	public function taxascarAction() 
	{
		$this->getHelper('layout')->disableLayout();
		$this->getHelper('ViewRenderer')->setNoRender();

		$modelUsuarios = new Sistema_Model_Usuarios();
		$modelTaxaValores = new Comercializacao_Model_TaxasValores();
		$modelTaxaAgrupamentoCar = new Comercializacao_Model_TaxasAgrupamentoCar();
		$modelProdutoCoberturas = new Produto_Model_ProdutosCoberturas();
		$modelTaxasAgrupamentos = new Comercializacao_Model_TaxasAgrupamentos();
		$modelTaxasRelacionadas = new Comercializacao_Model_TaxasRelacionadas();
		
		$numerosCarASeremInseridos = [];

		try {
			if (empty($_FILES)) {
				throw new Exception('Nenhum arquivo selecionado.');
			}

			$file = $_FILES['file-car'];

			$aux = explode('.', $file['name']);
			$extension = $aux[count($aux) - 1];
			
			if ($extension != 'csv') {
				throw new Exception('Arquivo informado deve ser um .csv.');
			}

			if (($open = fopen($file['tmp_name'], "r")) !== false) {
				$data = [];

				Zend_Db_Table::getDefaultAdapter()->beginTransaction();

				$linha = 0;
				$errorMessage = '';

				$nextIdTaxaAgrupamento = Agro_Db_Table_Abstract::getDefaultAdapter()
					->fetchRow("select  last_value + 1 as next_id from comercializacao.taxas_agrupamento_id_seq")['next_id'];
				
				while (($row = fgetcsv($open, 0, ',')) !== FALSE) {
					$linha++;

					if (substr_count($row[0], ';') != 11) {
						continue;
					}

					$values = explode(';', $row[0]);

					list(
						$numeroCar,
						$idProduto,
						$idCobertura,
						$vlFranquia,
						$vlComissao,
						$vlTaxa,
						$vlTaxaRenovacao,
						$vlTaxaInadimplencia,
						$vlPercentualSubvencaoFederal,
						$idSecao,
						$vlProdutividadeEsperada,
						$grupo) = $values;

					$numeroCar = Agro_Util::carUnmask($numeroCar);

					if ((int) $idProduto == 0) {
						continue;
					}

					if (!array_key_exists($idProduto, $mapNumerosCarExistentesSistema)) {
						$mapNumerosCarExistentesSistema[$idProduto] = $modelTaxaAgrupamentoCar
							->getCarsRelacionadosPorIdProduto((int) $idProduto);						
					}

					if ($idProduto && empty($data[$idProduto][$grupo])) {
						$nomeAgrupamentoTaxa = "Taxa por Propriedade {$nextIdTaxaAgrupamento}";

						$data[$idProduto][$grupo] = [
							'id_produto' => $idProduto,
							'ds_nome_agrupamento_taxas' => $nomeAgrupamentoTaxa,
							'tp_taxa_agrupamento' => 'C',
							'vl_comissao' => $vlComissao,
							'id_secao' =>  $idSecao,
						];

						++$nextIdTaxaAgrupamento;
					}

					if($idCobertura && $vlFranquia) {
						if (empty($idCobertura) || !is_numeric($idCobertura)) {
							$errorMessage .= "\nLinha {$linha}: cobertura não pode estar vazia e deve ser um inteiro.";
						}

						$cobertura = $modelProdutoCoberturas->getCoberturaPrincipal($idProduto, $idCobertura);

						if (empty($cobertura)) {
							$errorMessage .= "\nLinha {$linha}: cobertura não encontrada.";
						}

						if (empty($data[$idProduto][$grupo]['taxas_valor'][$idCobertura][$vlFranquia])) {
							$data[$idProduto][$grupo]['taxas_valor'][$idCobertura][$vlFranquia] = [
								'id_cobertura' => $idCobertura,
								'vl_franquia' => $vlFranquia,
								'vl_taxa' => $vlTaxa,
								'vl_taxa_renovacao' => $vlTaxaRenovacao,
								'vl_taxa_reduzida' => $vlTaxa,
								'vl_taxa_inadimplente' => ($vlTaxaInadimplencia ? $vlTaxaInadimplencia : 0),
								'vl_percentual_subvencao_federal' => $vlPercentualSubvencaoFederal,
								'fl_franquia_disponivel' => 'S',
								'fl_ativo' => true,
								'fl_cobertura_principal' => $cobertura->fl_cobertura_principal
							];
						}
					}

					if (array_key_exists($numeroCar, $mapNumerosCarExistentesSistema[$idProduto])) {
						$errorMessage .= "\nLinha {$linha}: o número CAR {$numeroCar} já encontra-se vinculado a uma taxa de agrupamento.";
					}

					if (
						array_key_exists($numeroCar, $numerosCarASeremInseridos)
						&& !array_key_exists($numeroCar, $data[$idProduto][$grupo]['taxas_car'])
					) {
						$errorMessage .= "\nLinha {$linha}: o número CAR {$numeroCar} já foi informado no arquivo sendo importado.";
					}

					$numerosCarASeremInseridos[$numeroCar] = true;
					
					$data[$idProduto][$grupo]['taxas_car'][$numeroCar] = [
						'ds_car' => trim($numeroCar),
						'vl_produtividade_esperada' => $vlProdutividadeEsperada
					];
				}

				if (!empty($errorMessage)) {
					throw new Exception($errorMessage);
				}

				if (empty($data)) {
					throw new Exception('Não foi possível importar os dados. Revise o arquivo.');
				}
				
				foreach ($data as $produtos) {
					foreach ($produtos as $grupo => $prod) {
						$taxaAgrupamento = [];
						
						$taxaAgrupamento['id_produto'] = $prod['id_produto'];
						$taxaAgrupamento['ds_nome_agrupamento_taxas'] = $prod['ds_nome_agrupamento_taxas'];
						$taxaAgrupamento['tp_taxa_agrupamento'] = 'C';
						$taxaAgrupamento['vl_comissao'] = $prod['vl_comissao'];
						$taxaAgrupamento['id_secao'] = $prod['id_secao'];

						$idTaxaAgrupamento = $modelTaxasAgrupamentos->insert($taxaAgrupamento);
						
						if (!$idTaxaAgrupamento) {
							throw new Exception('Erro ao cadastrar agrupamento de taxas: '.$prod['id_produto'].' -> '.$grupo);
						}

						$mapFranquiaToIdTaxaValor = [];
						$taxasRelacionadas = [];
						
						foreach ($prod['taxas_valor'] as $taxasValorPorCobertura) {
							foreach ($taxasValorPorCobertura as $dados) {
								$taxa = $dados;
								$taxa['id_taxa_agrupamento'] = $idTaxaAgrupamento;

								$idTaxaValor = $modelTaxaValores->save($taxa);

								if (!$idTaxaValor) {
									throw new Exception('Erro ao cadastrar agrupamento de taxas de valor: '.$prod['id_produto'].' -> '.$grupo.' -> '.$dados['id_cobertura']);
								}

								if ($taxa['fl_cobertura_principal']) {
									$mapFranquiaToIdTaxaValor[$dados['vl_franquia']] = $idTaxaValor;
								} else {
									$taxasRelacionadas[] = ['id_taxa' => $idTaxaValor, 'vl_franquia' => $dados['vl_franquia']];
								}
							}
						}

						foreach ($taxasRelacionadas as $taxaRel) {
							if (empty($taxaRel['id_taxa']) || empty($taxaRel['vl_franquia'])) {
								continue;
							}

							if (!empty($mapFranquiaToIdTaxaValor[$taxaRel['vl_franquia']])) {
								$idTaxaRelacionada = $modelTaxasRelacionadas->insert(
									[
										'id_taxa' => $taxaRel['id_taxa'],
										'id_taxa_relacionada' => $mapFranquiaToIdTaxaValor[$taxaRel['vl_franquia']]
									]
								);
	
								if (!$idTaxaRelacionada) {
									throw new Exception('Erro ao cadastrar agrupamento de taxas relacionadas: '.$prod['id_produto'].' -> '.$grupo);
								}
							}
						}
						
						foreach ($prod['taxas_car'] as $taxaCar) {
							$car = $taxaCar;
							$car['id_taxa_agrupamento'] = $idTaxaAgrupamento;

							$idTaxaAgrupamentoCar = $modelTaxaAgrupamentoCar->save($car);

							if (!$idTaxaAgrupamentoCar) {
								throw new Exception('Erro ao cadastrar agrupamento de taxas de propriedade (CAR): '.$prod['id_produto'].' -> '.$grupo.' -> '. $taxaCar['ds_car']);
							}
						}
					}
				}
				
				fclose($open);

				$message = 'Taxas inseridas com sucesso.';
				
				Zend_Db_Table::getDefaultAdapter()->commit();
			}
		} catch (Exception $e) {
			Zend_Db_Table::getDefaultAdapter()->rollBack();
			$message = $e->getMessage();
		}
		
		$this->getResponse()->setBody("<script>window.top.window.stopUploadLocal(`{$message}`);</script>");
	}

	public function importartaxausuarioAction() {
		$this->view->title = 'Produto » Rotinas » Importar Taxas por Usuários';
	}

	public function taxasusuarioAction() {
		$this->getHelper('layout')->disableLayout();
		$this->getHelper('ViewRenderer')->setNoRender();

		$Proponentes = new Seguro_Model_Proponentes();
		$ProdutoCoberturas = new Produto_Model_ProdutosCoberturas();
		$TaxasAgrupamentos = new Comercializacao_Model_TaxasAgrupamentos();
		$Usuarios = new Sistema_Model_Usuarios();

		$i=0;
		$message = array();
		$message['status'] = 'Operação cancelada. Verifique o formato e layout do arquivo.';

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$Adapter->addValidator('Extension', false, array('csv', 'case' => true));
		$file = $Adapter->getFileInfo();

		Zend_Db_Table::getDefaultAdapter()->beginTransaction();

		try {
			//verifica se os dois arquivos foram fornecidados
			if($Adapter->receive($file['franquias_csv']['name']) && $Adapter->receive($file['franquias_usuario_csv']['name'])) {

				$arMun = $this->checaEstruturaFranquiasMunicipios($file['franquias_usuario_csv']['name']);

				if((count($arMun)>0) && (is_array($arMun))){

					$f = fopen(APPLICATION_PATH . '/upload_files/temp/' . $file['franquias_csv']['name'], 'r');

					while (!feof($f)) {
						$data = array();
						$linha = fgets($f, 780);

						//verifica se o arquivo está na estrutura correta
						if (substr_count($linha, ';') == 10) {
							list($id_usuario, $id_produto, $id_cobertura, $vl_franquia, $vl_comissao, $vl_taxa, $vl_taxa_renovacao, $vl_taxa_inadimplencia, $vl_percentual_subvencao_federal, $id_secao, $grupo) = explode(';', $linha);

							//pula primeira linha do arquivo caso seja titulos
							if ((integer)$id_usuario == 0) { continue; }

							$Cobertura = $ProdutoCoberturas->getCoberturaPrincipal($id_produto,$id_cobertura);

							//inserir grupo
							if(( trim($grupo) != trim($grupo_anterior)) AND $grupo != '' AND $id_produto) {
								$ds_nome_usuario = $Usuarios->getNameById($id_usuario);

								$grupo_anterior = $grupo;
								$arCobPrincipal = array();
								$id_taxa_agrupamento_max = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow('select max(id)+1 as id from comercializacao.taxas_agrupamento');
								$ds_nome_agrupamento_taxa = $ds_nome_usuario." - ".$id_taxa_agrupamento_max['id'];

								if (($this->getRequest()->getParam('importar_taxa_usuario') == 'S') && ($id_produto_anterior != $id_produto)){
									$id_produto_anterior = $id_produto;
									Agro_Db_Table_Abstract::getDefaultAdapter()->query("DELETE FROM comercializacao.taxas_agrupamento WHERE id_produto = $id_produto AND tp_taxa_agrupamento = 'U'");
								}

								$arMunTmp = array();
								$tp_agrupamento = 'U';
								$data['id_produto'] = $id_produto;
								$data['ds_nome_agrupamento_taxas'] = $ds_nome_agrupamento_taxa;
								$data['tp_taxa_agrupamento'] = $tp_agrupamento;
								$data['vl_comissao'] = $vl_comissao;
								$data['id_secao'] = $id_secao;

								//insert taxas_agrupamento
								$id_taxa_agrupamento = $TaxasAgrupamentos->insert($data);
								if (!$id_taxa_agrupamento) {
									$message['status'] = 'Erro ao cadastrar agrupamento de taxas: '.$id_produto.' -> '.$grupo.' -> '.$tp_agrupamento;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}

								//insert taxa_agrupamento_usuarios
								$TaxasAgrupamentoUsuario = new Comercializacao_Model_TaxasAgrupamentoUsuarios();
								$Row = $TaxasAgrupamentoUsuario->save($id_taxa_agrupamento, $id_usuario);
								if (!$Row) {
									$message['status'] = 'Erro ao relacionar usuário à taxa: '.$id_produto.' -> '.$grupo.' -> '.$id_usuario;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}

								//relaciona agrupamento de taxas a municípios
								if( ( $tp_agrupamento == 'M' or $tp_agrupamento == 'U' ) and $id_produto AND $id_taxa_agrupamento) {
									$TaxasAgrupamentoMunicipios = new Comercializacao_Model_TaxasAgrupamentoMunicipios();
									$arMunTmp = $arMun[trim($grupo)];

									foreach($arMunTmp as $key => $arMunProd) {
										$data = array();
										$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
										$data['id_municipio'] = $arMunProd['id_municipio'];
										$data['vl_produtividade_estimada'] = $arMunProd['vl_produtividade'];

										$RowMunicipio = $TaxasAgrupamentoMunicipios->save($data);
										if(!$RowMunicipio) {
											$message['status'] = 'Erro ao relacionar município à taxa: '.$id_produto.' -> '.$grupo.' -> '.$sigla_uf;
											Zend_Db_Table::getDefaultAdapter()->rollBack();
											exit;
										}
									}
								}
							}

							if($id_taxa_agrupamento AND $id_cobertura AND $vl_franquia) {

								$count++;
								$TaxaValores = new Comercializacao_Model_TaxasValores();

								$data = array();
								$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
								$data['id_cobertura'] = $id_cobertura;
								$data['vl_franquia'] = $vl_franquia;
								$data['vl_taxa'] = $vl_taxa;
								$data['vl_taxa_renovacao'] = $vl_taxa_renovacao;
								$data['vl_taxa_reduzida'] = $vl_taxa;
								$data['vl_taxa_inadimplente'] = ($vl_taxa_inadimplencia ? $vl_taxa_inadimplencia : 0);
								$data['vl_percentual_subvencao_federal'] = $vl_percentual_subvencao_federal;
								$data['fl_franquia_disponivel'] = 'S';
								$data['fl_ativo'] = true;

								$id_taxa_valores = $TaxaValores->save($data);

								if($id_taxa_valores) {
									$id_cobertura = '';
	
									if (!$Cobertura->fl_cobertura_principal) {
										$data = array();
										$TaxasRelacionadas = new Comercializacao_Model_TaxasRelacionadas();
										$data['id_taxa'] = $id_taxa_valores;
										$data['id_taxa_relacionada'] = $arCobPrincipal[$vl_franquia];
										$taxa_relacionadas = $TaxasRelacionadas->insert($data);
										if (!$taxa_relacionadas) {
											$message['status'] = 'Erro ao relacionar coberturas adicionais: '.$id_produto.' -> '.$grupo.' -> '.$id_cobertura;
											Zend_Db_Table::getDefaultAdapter()->rollBack();
											exit;
										}
									} else {
										$arCobPrincipal[$vl_franquia] = $id_taxa_valores;
									}
								} else {
									$message['status'] = 'Erro ao cadastrar valores da cobertura' . ($cobertura ? ' principal' : 's adicionais') . $id_produto.' -> '.$grupo.' -> '.$id_cobertura;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}
							}
						} else { continue; }

						$i++;
					}

					if ($i>0) {
						$message['status'] = 'Taxas inseridas com sucesso.';
						Zend_Db_Table::getDefaultAdapter()->commit();
					}

				} else {
					$message['status'] = 'Erro ao validar arquivo de municípios.';
				}

			} else {
				$message['status'] = 'Erro ao receber os arquivos.';
			}
		} catch (Exception $e) {
			$message['status'] = 'Erro ao processar os arquivos. Verifique as informações.';
		}

		$this->getResponse()->setBody("<script>window.top.window.stopUploadLocal('".$message['status']."');</script>");
	}

	public function importartaxaproponenteAction() {
		$this->view->title = 'Produto » Rotinas » Importar Taxas por Proponentes';
	}

	public function taxasproponenteAction() {
		//liberando tempo e aumentando o tamanho da memória
		set_time_limit(0);
		ini_set(‘memory_limit’,’256M’);

		$this->getHelper('layout')->disableLayout();
		$this->getHelper('ViewRenderer')->setNoRender();

		$Proponentes = new Seguro_Model_Proponentes();
		$ProdutoCoberturas = new Produto_Model_ProdutosCoberturas();
		$TaxasAgrupamentos = new Comercializacao_Model_TaxasAgrupamentos();
		$Usuarios = new Sistema_Model_Usuarios();

		$i=0;
		$message = array();
		$message['status'] = 'Operação cancelada. Verifique o formato e layout do arquivo.';

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$Adapter->addValidator('Extension', false, array('csv', 'case' => true));
		$file = $Adapter->getFileInfo();

		Zend_Db_Table::getDefaultAdapter()->beginTransaction();

		//verifica se os dois arquivos foram fornecidados
		if($Adapter->receive($file['franquias_csv']['name']) && $Adapter->receive($file['franquias_proponente_csv']['name'])) {

			$arMun = $this->checaEstruturaFranquiasMunicipios($file['franquias_proponente_csv']['name']);

			if((count($arMun)>0) && (is_array($arMun))){

				$f = fopen(APPLICATION_PATH . '/upload_files/temp/' . $file['franquias_csv']['name'], 'r');

				while (!feof($f)) {
					$data = array();
					$linha = fgets($f, 780);

					//verifica se o arquivo está na estrutura correta
					if (substr_count($linha, ';') == 10) {
						list($id_proponente, $id_produto, $id_cobertura, $vl_franquia, $vl_comissao, $vl_taxa, $vl_taxa_renovacao, $vl_taxa_inadimplencia, $vl_percentual_subvencao_federal, $id_secao, $grupo) = explode(';', $linha);

						//pula primeira linha do arquivo caso seja titulos
						if ((integer)$id_proponente == 0) { continue; }

						$Cobertura = $ProdutoCoberturas->getCoberturaPrincipal($id_produto,$id_cobertura);
 
						//inserir grupo
						if(( trim($grupo) != trim($grupo_anterior)) AND $grupo != '' AND $id_produto) {

							$prop = $Proponentes->find($id_proponente)->current();
							$grupo_anterior = $grupo;
							$arCobPrincipal = array();
							$ds_nome_agrupamento_taxa = $prop['ds_nome_proponente'] .' ('.$prop['cpf_cnpj'].')';

							if (($this->getRequest()->getParam('importar_taxa_proponente') == 'S') && ($id_produto_anterior != $id_produto)){
								$id_produto_anterior = $id_produto;
								Agro_Db_Table_Abstract::getDefaultAdapter()->query("DELETE FROM comercializacao.taxas_agrupamento WHERE id_produto = $id_produto AND tp_taxa_agrupamento = 'P'");
							}

							$arMunTmp = array();
							$tp_agrupamento = 'P';
							$data['id_produto'] = $id_produto;
							$data['ds_nome_agrupamento_taxas'] = $ds_nome_agrupamento_taxa;
							$data['tp_taxa_agrupamento'] = $tp_agrupamento;
							$data['vl_comissao'] = $vl_comissao;
							$data['id_secao'] = $id_secao;

							//insert taxas_agrupamento
							$id_taxa_agrupamento = $TaxasAgrupamentos->insert($data);
							if (!$id_taxa_agrupamento) {
								$message['status'] = 'Erro ao cadastrar agrupamento de taxas: '.((int) $id_produto).' -> '.((int) $grupo).' -> '.$tp_agrupamento;
								Zend_Db_Table::getDefaultAdapter()->rollBack();
								exit;
							}

							//insert taxa_agrupamento_proponentes
							$TaxasAgrupamentoProponente = new Comercializacao_Model_TaxasAgrupamentoProponente();
							$Row = $TaxasAgrupamentoProponente->save(array('id_taxa_agrupamento' => $id_taxa_agrupamento, 'id_proponente' => $id_proponente));
							if (!$Row) {
								$message['status'] = 'Erro ao relacionar proponente à taxa: '.((int) $id_produto).' -> '.((int) $grupo).' -> '.((int)$id_proponente);
								Zend_Db_Table::getDefaultAdapter()->rollBack();
								exit;
							}

							//relaciona agrupamento de taxas a municípios
							if( ( $tp_agrupamento == 'M' or $tp_agrupamento == 'U'  or $tp_agrupamento == 'P' ) and $id_produto AND $id_taxa_agrupamento) {
								$TaxasAgrupamentoMunicipios = new Comercializacao_Model_TaxasAgrupamentoMunicipios();
								$arMunTmp = $arMun[trim($grupo)];

								foreach($arMunTmp as $key => $arMunProd) {
									$data = array();
									$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
									$data['id_municipio'] = $arMunProd['id_municipio'];
									$data['vl_produtividade_estimada'] = $arMunProd['vl_produtividade'];

									$RowMunicipio = $TaxasAgrupamentoMunicipios->save($data);
									if(!$RowMunicipio) {
										$message['status'] = 'Erro ao relacionar município à taxa: '.((int) $id_produto).' -> '.((int) $grupo).' -> '.$sigla_uf;
										Zend_Db_Table::getDefaultAdapter()->rollBack();
										exit;
									}
								}
							}
						}

						if($id_taxa_agrupamento AND $id_cobertura AND $vl_franquia) {

							$count++;
							$TaxaValores = new Comercializacao_Model_TaxasValores();

							$data = array();
							$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
							$data['id_cobertura'] = $id_cobertura;
							$data['vl_franquia'] = $vl_franquia;
							$data['vl_taxa'] = $vl_taxa;
							$data['vl_taxa_renovacao'] = $vl_taxa_renovacao;
							$data['vl_taxa_reduzida'] = $vl_taxa;
							$data['vl_taxa_inadimplente'] = $vl_taxa_inadimplencia;
							$data['vl_percentual_subvencao_federal'] = $vl_percentual_subvencao_federal;
							$data['fl_franquia_disponivel'] = 'S';
							$data['fl_ativo'] = true;

							$id_taxa_valores = $TaxaValores->save($data);

							if($id_taxa_valores) {
								$id_cobertura = '';

								if (!$Cobertura->fl_cobertura_principal) {
									$data = array();
									$TaxasRelacionadas = new Comercializacao_Model_TaxasRelacionadas();
									$data['id_taxa'] = $id_taxa_valores;
									$data['id_taxa_relacionada'] = $arCobPrincipal[$vl_franquia];
									$taxa_relacionadas = $TaxasRelacionadas->insert($data);
									if (!$taxa_relacionadas) {
										$message['status'] = 'Erro ao relacionar coberturas adicionais: '. ((int) $id_produto).' -> '.((int)$grupo).' -> '.((int)$id_cobertura);
										Zend_Db_Table::getDefaultAdapter()->rollBack();
									}
								} else {
									$arCobPrincipal[$vl_franquia] = $id_taxa_valores;
								}
							} else {
								$message['status'] = 'Erro ao cadastrar valores da cobertura' . ($cobertura ? ' principal' : 's adicionais') . ((int)$id_produto).' -> '.((int)$grupo).' -> '.((int)$id_cobertura);
								Zend_Db_Table::getDefaultAdapter()->rollBack();
							}
						}
					} else { continue; }

					$i++;
				}

				if ($i>0) {
					$message['status'] = 'Taxas inseridas com sucesso.';
					Zend_Db_Table::getDefaultAdapter()->commit();
				}

			} else {
				$message['status'] = 'Erro ao validar arquivo de municípios.';
			}

		} else {
			$message['status'] = 'Erro ao receber os arquivos.';
		}

		$this->getResponse()->setBody("<script>window.top.window.stopUploadLocal('".$message['status']."');</script>");
	}

	public function importartaxaproponenteusuarioAction() {
		$this->view->title = 'Produto » Rotinas » Importar Taxas por Proponentes';
	}

	public function taxasproponenteusuarioAction() {
		//liberando tempo e aumentando o tamanho da memória
		set_time_limit(0);
		ini_set(‘memory_limit’,’2048M’);

		$this->getHelper('layout')->disableLayout();
		$this->getHelper('ViewRenderer')->setNoRender();

		$Proponentes = new Seguro_Model_Proponentes();
		$ProdutoCoberturas = new Produto_Model_ProdutosCoberturas();
		$TaxasAgrupamentos = new Comercializacao_Model_TaxasAgrupamentos();
		$Usuarios = new Sistema_Model_Usuarios();

		$i=0;
		$message = array();
		$message['status'] = 'Operação cancelada. Verifique o formato e layout do arquivo.';

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$Adapter->addValidator('Extension', false, array('csv', 'case' => true));
		$file = $Adapter->getFileInfo();

		Zend_Db_Table::getDefaultAdapter()->beginTransaction();

		try {
		//verifica se os dois arquivos foram fornecidados
			if($Adapter->receive($file['franquias_csv']['name']) && $Adapter->receive($file['franquias_proponente_csv']['name'])) {

				$arMun = $this->checaEstruturaFranquiasMunicipios($file['franquias_proponente_csv']['name']);

				if((count($arMun)>0) && (is_array($arMun))){

					$f = fopen(APPLICATION_PATH . '/upload_files/temp/' . $file['franquias_csv']['name'], 'r');

					while (!feof($f)) {
						$data = array();
						$linha = fgets($f, 18780);

						//verifica se o arquivo está na estrutura correta
						if (substr_count($linha, ';') == 11) {
							list($id_usuario, $id_proponente, $id_produto, $id_cobertura, $vl_franquia, $vl_comissao, $vl_taxa, $vl_taxa_renovacao, $vl_taxa_inadimplencia, $vl_percentual_subvencao_federal, $id_secao, $grupo) = explode(';', $linha);

							//pula primeira linha do arquivo caso seja titulos
							if ((integer)$id_proponente == 0) { continue; }

							$Cobertura = $ProdutoCoberturas->getCoberturaPrincipal($id_produto,$id_cobertura);

							//inserir grupo
							if(( trim($grupo) != trim($grupo_anterior)) AND $grupo != '' AND $id_produto) {

								$prop = $Proponentes->find($id_proponente)->current();
								$grupo_anterior = $grupo;
								$arCobPrincipal = array();
								$ds_nome_agrupamento_taxa = $prop['ds_nome_proponente'] .' ('.$prop['cpf_cnpj'].')';

								if (($this->getRequest()->getParam('importar_taxa_proponente') == 'S') && ($id_produto_anterior != $id_produto)){
									$id_produto_anterior = $id_produto;
									Agro_Db_Table_Abstract::getDefaultAdapter()->query("DELETE FROM comercializacao.taxas_agrupamento WHERE id_produto = $id_produto AND tp_taxa_agrupamento = 'P'");
								}

								$arMunTmp = array();
								$tp_agrupamento = 'P';
								$data['id_produto'] = $id_produto;
								$data['ds_nome_agrupamento_taxas'] = substr($ds_nome_agrupamento_taxa, 0, 99);
								$data['tp_taxa_agrupamento'] = $tp_agrupamento;
								$data['vl_comissao'] = $vl_comissao;
								$data['id_secao'] = $id_secao;

								//insert taxas_agrupamento
								$id_taxa_agrupamento = $TaxasAgrupamentos->insert($data);
								if (!$id_taxa_agrupamento) {
									$message['status'] = 'Erro ao cadastrar agrupamento de taxas: '.$id_produto.' -> '.$grupo.' -> '.$tp_agrupamento;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}

								//insert taxa_agrupamento_proponentes
								$TaxasAgrupamentoProponente = new Comercializacao_Model_TaxasAgrupamentoProponente();
								$Row = $TaxasAgrupamentoProponente->save(array('id_taxa_agrupamento' => $id_taxa_agrupamento, 'id_proponente' => $id_proponente));
								if (!$Row) {
									$message['status'] = 'Erro ao relacionar proponente à taxa: '.$id_produto.' -> '.$grupo.' -> '.$id_proponente;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}

								//insert taxa_agrupamento_usuarios
								$TaxasAgrupamentoUsuario = new Comercializacao_Model_TaxasAgrupamentoUsuarios();
								$Row = $TaxasAgrupamentoUsuario->save($id_taxa_agrupamento, $id_usuario);
								if (!$Row) {
									$message['status'] = 'Erro ao relacionar usuário à taxa: '.$id_produto.' -> '.$grupo.' -> '.$id_usuario;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}

								//relaciona agrupamento de taxas a municípios
								if( ( $tp_agrupamento == 'M' or $tp_agrupamento == 'U'  or $tp_agrupamento == 'P' ) and $id_produto AND $id_taxa_agrupamento) {
									$TaxasAgrupamentoMunicipios = new Comercializacao_Model_TaxasAgrupamentoMunicipios();

									$arMunTmp = $arMun[trim($grupo)];

									foreach($arMunTmp as $key => $arMunProd) {
										$data = array();
										$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
										$data['id_municipio'] = $arMunProd['id_municipio'];
										$data['vl_produtividade_estimada'] = $arMunProd['vl_produtividade'];

										$check_taxa = $TaxasAgrupamentoMunicipios->fetchAll("id_taxa_agrupamento = $id_taxa_agrupamento and id_municipio = ".$arMunProd['id_municipio'])->count();
										if ($check_taxa <= 0) {
											$RowMunicipio = $TaxasAgrupamentoMunicipios->save($data);
											if(!$RowMunicipio) {
												$message['status'] = 'Erro ao relacionar município à taxa: '.$id_produto.' -> '.$grupo.' -> '.$sigla_uf;
												Zend_Db_Table::getDefaultAdapter()->rollBack();
												exit;
											}
										}
									}
								}
							}

							if($id_taxa_agrupamento AND $id_cobertura AND $vl_franquia) {

								$count++;
								$TaxaValores = new Comercializacao_Model_TaxasValores();

								$data = array();
								$data['id_taxa_agrupamento'] = $id_taxa_agrupamento;
								$data['id_cobertura'] = $id_cobertura;
								$data['vl_franquia'] = $vl_franquia;
								$data['vl_taxa'] = $vl_taxa;
								$data['vl_taxa_renovacao'] = $vl_taxa_renovacao;
								$data['vl_taxa_reduzida'] = $vl_taxa;
								$data['vl_taxa_inadimplente'] = $vl_taxa_inadimplencia;
								$data['vl_percentual_subvencao_federal'] = $vl_percentual_subvencao_federal;
								$data['fl_franquia_disponivel'] = 'S';
								$data['fl_ativo'] = true;

								$id_taxa_valores = $TaxaValores->save($data);

								if($id_taxa_valores) {
									$id_cobertura = '';

									if (!$Cobertura->fl_cobertura_principal) {
										$data = array();
										$TaxasRelacionadas = new Comercializacao_Model_TaxasRelacionadas();
										$data['id_taxa'] = $id_taxa_valores;
										$data['id_taxa_relacionada'] = $arCobPrincipal[$vl_franquia];
										$taxa_relacionadas = $TaxasRelacionadas->insert($data);
										if (!$taxa_relacionadas) {
											$message['status'] = 'Erro ao relacionar coberturas adicionais: '.$id_produto.' -> '.$grupo.' -> '.$id_cobertura;
											Zend_Db_Table::getDefaultAdapter()->rollBack();
											exit;
										}
									} else {
										$arCobPrincipal[$vl_franquia] = $id_taxa_valores;
									}
								} else {
									$message['status'] = 'Erro ao cadastrar valores da cobertura' . ($cobertura ? ' principal' : 's adicionais') . $id_produto.' -> '.$grupo.' -> '.$id_cobertura;
									Zend_Db_Table::getDefaultAdapter()->rollBack();
									exit;
								}
							}
						} else { continue; }

						$i++;
					}

					if ($i>0) {
						$message['status'] = 'Taxas inseridas com sucesso.';
						Zend_Db_Table::getDefaultAdapter()->commit();
						fclose($f);
					}

				} else {
					$message['status'] = 'Erro ao validar arquivo de municípios.';
					Zend_Db_Table::getDefaultAdapter()->rollBack();
				}

			} else {
				$message['status'] = 'Erro ao receber os arquivos.';
				Zend_Db_Table::getDefaultAdapter()->rollback();
			}

		} catch (Exception $e) {
			$message['status'] = $e->getMessage();
			Zend_Db_Table::getDefaultAdapter()->rollback();
		}

		$this->getResponse()->setBody("<script>window.top.window.stopUploadLocal('".$message['status']."');</script>");
	}

	public function duplicarcapacidadesAction(){
	    set_time_limit(0);
	    
	    $this->getHelper('ViewRenderer')->setNoRender();
	    $this->getHelper('layout')->disableLayout();
	    
	    $Capacidades = new Produto_Model_Validacoescapacidade();
	    $Capacidades->copiar();
	    
        $ret['message'] = 'Capacidades duplicadas com sucesso.';
        $ret['status'] = false;
	    
	    $this->getResponse()->setBody(Zend_Json::encode($ret));
	}
}
