/*

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.tarifas;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.media.Media;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Label;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Plaza;
import com.rjconsultores.ventaboletos.entidad.Tarifa;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.MercadoCompetidoService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

/**
 * 
 * @author Rafius
 */
@Controller("modificacionMasivaTarifasUploadController")
@Scope("prototype")
public class ModificacionMasivaTarifasUploadController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private final Integer CELL_ID_TARIFA = 0;
	private final Integer CELL_NOVO_PRECIO = 10;
	// private final Integer CELL_PEAJE = 12;
	private final Integer CELL_NOVO_PEAJE = 12;
	private final Integer CELL_NOVO_TX_EMBARQUE = 14;
	private final Integer CELL_NOVO_SEGURO = 16;
	private final Integer CELL_NOVO_TPP = 18;
	private final Integer CELL_NOVO_MONEDA = 22;
	private final Integer CELL_ORIGINAL_PRECIO = 8;
	
	@Autowired
	private TarifaService tarifaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private MercadoCompetidoService mercadoCompetidoService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private ConstanteService constanteService;
	private List<VigenciaTarifa> lsVigenciaTarifa;
	private VigenciaTarifa vigenciaTarifaArquivoExcel;
	private Media mExcel;

	private Radio rdVigenciaAtual;
	private Radio rdVigenciaNueva;

	private Combobox cmbVigenciaTarifa;
	private Label lbVigencia;
	private String componentePreco;
	private Combobox cmbComponentePreco;
	private List<String> lsComponentePreco;
	private Radio radAlterarPrecoOriginalSim;
	private static Logger log = LogManager.getLogger(ModificacionMasivaTarifasUploadController.class);

	@Override
	public void doAfterCompose(Component comp) throws Exception {

		super.doAfterCompose(comp);

		mExcel = (Media) Executions.getCurrent().getArg().get("mExcel");

		lsVigenciaTarifa = vigenciaTarifaService.obtenerTodos();
		lbVigencia.setVisible(Boolean.FALSE);
		cmbVigenciaTarifa.setVisible(Boolean.FALSE);
		setLsComponentePreco(EnumTarifaPedagio.obterBundleValues());

		carregarVigenciaTarifaArquivoExcel();

	}

	public void onClick$rdVigenciaNueva(Event ev) {
		lbVigencia.setVisible(Boolean.TRUE);
		cmbVigenciaTarifa.setVisible(Boolean.TRUE);
		cmbVigenciaTarifa.setConstraint("no empty");
	}

	public void onClick$rdVigenciaAtual(Event ev) {
		lbVigencia.setVisible(Boolean.FALSE);
		cmbVigenciaTarifa.setVisible(Boolean.FALSE);
		cmbVigenciaTarifa.setConstraint("");
	}

	public void onClick$btnSalvar(Event ev) throws IOException, InterruptedException {
		componentePreco = cmbComponentePreco.getValue();

		salvarNuevos(rdVigenciaNueva.isChecked());
	}

	/**
	 * Indica se a operação será de alteração das tarifas do arquivo excel ou de inserção de novas tarifas em uma nova vigência
	 * 
	 * @param salvarNuevos
	 * @throws IOException
	 * @throws InterruptedException
	 */
	public void salvarNuevos(Boolean salvarNuevos) throws IOException, InterruptedException {

		log.debug("MotificacionMasica:Salvar nuevos");

		String strErrorTarifa = "";
		String strMercadoCompetido = "";
		String strTarifaMinima = "";
		String strDuplicidade = "";

		Integer contador = 0;

		Integer opcao = Messagebox.show(
				Labels.getLabel("modificacionMasivaTarifasController.MSGAplicar"),
				Labels.getLabel("modificacionMasivaTarifasController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (opcao.equals(Messagebox.YES)) {

			InputStream isMExcel = mExcel.getStreamData();
			XSSFWorkbook wb = new XSSFWorkbook(isMExcel);

			for (int k = 0; k < wb.getNumberOfSheets(); k++) {

				Sheet sheet = wb.getSheetAt(k);
				int rows = sheet.getPhysicalNumberOfRows();

				for (int r = 0; r < rows ; r++) {

					Row row = sheet.getRow(r);
					
					if (row == null || row.getCell(0) == null || (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && (row.getCell(0).getStringCellValue().startsWith("Linha") || row.getCell(0).getStringCellValue().isEmpty()))) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && row.getCell(0).getStringCellValue().equalsIgnoreCase("id")) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_BLANK) {
						continue;
					}
					
					boolean retorno = true;
					
					if (!componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao())){
						retorno = validarComponenteEspecifico(row);
					} 
					
					if (!retorno){
						continue;
					}
					
					Cell cellIdTarifa = row.getCell(CELL_ID_TARIFA);
					BigDecimal bdId = new BigDecimal(cellIdTarifa.getNumericCellValue());
					Integer idTarifa = bdId.intValue();

					Tarifa tarifa = tarifaService.obtenerID(idTarifa);

					if (tarifa != null) {
						alterarDescricaoTelaAuditoria(tarifa);
						contador = gerarComponeneteTarifa(tarifa, row, salvarNuevos, contador, strDuplicidade, strTarifaMinima, strErrorTarifa, strMercadoCompetido);
					}
				}
			}
		}

		if (opcao.equals(Messagebox.YES)) {
			Messagebox.show(
					Labels.getLabel("modificacionMasivaTarifasController.MSGAplicadoSucesso"),
					Labels.getLabel("modificacionMasivaTarifasController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario()
					+ "_" + Calendar.getInstance().getTime().getTime()
					+ "_" + "retorno";

			// Gravando no arquivo de retorno
			File fNomeArquivo = File.createTempFile(nomeArquivo, ".tmp");
			FileOutputStream fos = new FileOutputStream(fNomeArquivo);

			String texto = "" + contador + " "
					+ Labels.getLabel("modificacionMasivaTarifasController.MSG.RegistroSalvos") + "\n";

			if (!strTarifaMinima.isEmpty()) {
				texto = texto
						+ "---------- TARIFAS MINIMAS ----------\n"
						+ strTarifaMinima
						+ "\n-------------------------------------\n";
			}

			if (!strMercadoCompetido.isEmpty()) {
				texto = texto
						+ "--------- MERCADO COMPETIDO -----------\n"
						+ strMercadoCompetido
						+ "\n---------------------------------------\n";
			}

			if (!strErrorTarifa.isEmpty()) {
				texto = texto
						+ "--------------- ERRORS ----------------\n"
						+ strErrorTarifa
						+ "\n---------------------------------------";
			}
			if (!strDuplicidade.toString().isEmpty()) {
				log.debug(strDuplicidade);
				texto = texto
						+ "--------------- DUPLICADO ----------------\n"
						+ strDuplicidade
						+ "\n---------------------------------------";
			}

			fos.write(texto.getBytes());
			fos.close();

			InputStream is = null;
			is = new FileInputStream(fNomeArquivo);
			Filedownload.save(is, "application/txt", "RetornoModMasivaTarifa.txt");

			fNomeArquivo.delete();

			closeWindow();
		}

	}

	/**
	 * O arquivo excel gerado tem uma vigência apenas. Ou seja, basta buscar a primeira vigência da primeira tarifa.
	 * 
	 * Carregar essa vigência em uma variável
	 * 
	 * @throws IOException
	 * @throws InterruptedException
	 */
	public void carregarVigenciaTarifaArquivoExcel() throws IOException, InterruptedException {
		try {
			InputStream isMExcel = mExcel.getStreamData();
			XSSFWorkbook wb = null;
			try {
				wb = new XSSFWorkbook(isMExcel);
			} catch (Exception e) {
				Messagebox.show(
						Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.excel.old"),
						Labels.getLabel("modificacionMasivaTarifasController.window.title"),
						Messagebox.OK, Messagebox.ERROR);
				closeWindow();
				return;
			}
			vigenciaTarifaArquivoExcel = null;
			
			for (int k = 0; ( (k < wb.getNumberOfSheets()) && (vigenciaTarifaArquivoExcel == null)); k++) {
				Sheet sheet = wb.getSheetAt(k);
				int rows = sheet.getPhysicalNumberOfRows();

				for (int r = 0; ( (r < rows) && (vigenciaTarifaArquivoExcel == null)) ; r++) {
					Row row = sheet.getRow(r);

					if (row == null || (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && (row.getCell(0).getStringCellValue().startsWith("Linha") || row.getCell(0).getStringCellValue().isEmpty()))) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && row.getCell(0).getStringCellValue().equalsIgnoreCase("id")) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_BLANK) {
						continue;
					}

					Cell cellIdTarifa = row.getCell(CELL_ID_TARIFA);

					BigDecimal bdId = new BigDecimal(cellIdTarifa.getNumericCellValue());
					Integer idTarifa = bdId.intValue();

					Tarifa tarifa = tarifaService.obtenerID(idTarifa);

					if (tarifa != null) {

						vigenciaTarifaArquivoExcel = tarifa.getVigenciaTarifa();
						lsVigenciaTarifa.remove(vigenciaTarifaArquivoExcel);

						SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy HH:mm");

						log.debug("Vigencia De: " + sf.format(vigenciaTarifaArquivoExcel.getFeciniciovigencia()) + " até: " + sf.format(vigenciaTarifaArquivoExcel.getFecfinvigencia()));

						rdVigenciaAtual.setLabel(Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.radioUno",
								new Object[] { sf.format(vigenciaTarifaArquivoExcel.getFeciniciovigencia()).concat(" ").concat(sf.format(vigenciaTarifaArquivoExcel.getFecfinvigencia())) }));
					}
					break;
				}
			}
		} catch (Exception e) {
			log.error("Error ao inportar tarifas Excell", e);
			Messagebox.show(
					Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.excel"),
					Labels.getLabel("modificacionMasivaTarifasController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			closeWindow();
		}
	}

	public List<VigenciaTarifa> getLsVigenciaTarifa() {
		return lsVigenciaTarifa;
	}

	public void setLsVigenciaTarifa(List<VigenciaTarifa> lsVigenciaTarifa) {
		this.lsVigenciaTarifa = lsVigenciaTarifa;
	}

	public Media getmExcel() {
		return mExcel;
	}

	public void setmExcel(Media mExcel) {
		this.mExcel = mExcel;
	}

	public Radio getRdVigenciaAtual() {
		return rdVigenciaAtual;
	}

	public void setRdVigenciaAtual(Radio rdVigenciaAtual) {
		this.rdVigenciaAtual = rdVigenciaAtual;
	}

	public Radio getRdVigenciaNueva() {
		return rdVigenciaNueva;
	}

	public void setRdVigenciaNueva(Radio rdVigenciaNueva) {
		this.rdVigenciaNueva = rdVigenciaNueva;
	}

	public Combobox getCmbVigenciaTarifa() {
		return cmbVigenciaTarifa;
	}

	public void setCmbVigenciaTarifa(Combobox cmbVigenciaTarifa) {
		this.cmbVigenciaTarifa = cmbVigenciaTarifa;
	}

	public Label getLbVigencia() {
		return lbVigencia;
	}

	public void setLbVigencia(Label lbVigencia) {
		this.lbVigencia = lbVigencia;
	}

	public Combobox getCmbComponentePreco() {
		return cmbComponentePreco;
	}

	public void setCmbComponentePreco(Combobox cmbComponentePreco) {
		this.cmbComponentePreco = cmbComponentePreco;
	}

	public List<String> getLsComponentePreco() {
		return lsComponentePreco;
	}

	public void setLsComponentePreco(List<String> lsComponentePreco) {
		this.lsComponentePreco = lsComponentePreco;
	}
	
	private Integer gerarComponeneteTarifa(Tarifa tarifa, Row row, boolean salvarNuevos, Integer contador, String strDuplicidade, String strTarifaMinima,
		String strErrorTarifa, String strMercadoCompetido){
		Tramo tramo = tarifa.getTramo();
		
		if (tramo != null) {
			
			Parada origem = tarifa.getTramo().getOrigem();
			Ciudad ciudad = origem.getCiudad();
			Plaza plaza = null;
			
			if (ciudad != null) {
				plaza = ciudad.getPlaza();
			}
			
			Parada destino = tarifa.getTramo().getDestino();
			ClaseServicio claseServicio = tarifa.getClaseServicio();
			Moneda moneda = tarifa.getMoneda();

			// verificando se a tarifa eh de um mercado competido:
			boolean existeMercadoCompetido = mercadoCompetidoService.existe(claseServicio, origem, destino);
			if (!existeMercadoCompetido) {
				try {
					Cell cellNovoPrecio = null;
					Cell cellOriginalPrecio = null;

					Boolean podeSalvarTarifaMinima = naoValidaTarifaMinima() ? true: tarifaService.podeAlterarTarifaMinima(tarifa, tarifa.getMarca(),
							origem, destino, claseServicio, plaza, moneda,salvarNuevos? obterNovaVigenciaSelecionada():tarifa.getVigenciaTarifa());
					

					if (podeSalvarTarifaMinima) {
						
						if (salvarNuevos) {
							
							VigenciaTarifa nuevaVigencia = obterNovaVigenciaSelecionada();
							
							Tarifa tarifaNueva= tarifaService.buscar(tarifa.getTramo(), tarifa.getMarca(), tarifa.getClaseServicio(), nuevaVigencia, tarifa.getMoneda(), tarifa.getRuta());
							tarifaNueva.clonar();
							alterarDescricaoTelaAuditoria(tarifaNueva);
							
							boolean existeTarifa = tarifaNueva != null && tarifaNueva.getTarifaId() != null;
							if(!existeTarifa) {
								tarifaNueva = new Tarifa();
							}
							tarifaNueva.setVigenciaTarifa(nuevaVigencia);

							tarifaNueva.setClaseServicio(tarifa.getClaseServicio());
							tarifaNueva.setMarca(tarifa.getMarca());
							tarifaNueva.setMoneda(verificaMonedaASerInserida((row.getCell(CELL_NOVO_MONEDA) != null? row.getCell(CELL_NOVO_MONEDA).getStringCellValue():null), tarifa.getMoneda()));
							tarifaNueva.setPreciooriginal(tarifa.getPreciooriginal());
							
							if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao()) ||
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) && (row.getCell(CELL_NOVO_PRECIO) != null))) {
								cellNovoPrecio = row.getCell(CELL_NOVO_PRECIO);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								//mantis 7621
								if (radAlterarPrecoOriginalSim.isChecked() && row.getCell(CELL_ORIGINAL_PRECIO) != null){
									cellOriginalPrecio = row.getCell(CELL_ORIGINAL_PRECIO);
									tarifaNueva.setPreciooriginal(new BigDecimal(cellOriginalPrecio.getNumericCellValue()));
								}
								
								tarifaNueva.setPrecio(novoPrecio);
							} 
							
							if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) && row.getCell(CELL_NOVO_PEAJE) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_PEAJE);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifaNueva.setImportepedagio(novoPrecio);
							} 
							
							if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) && row.getCell(CELL_NOVO_TX_EMBARQUE) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_TX_EMBARQUE);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifaNueva.setImportetaxaembarque(novoPrecio);
							} 
							
							if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_SEGURO) != null)){
								cellNovoPrecio = row.getCell(CELL_NOVO_SEGURO);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifaNueva.setImporteseguro(novoPrecio);
							}
							
							if (componentePreco.equals(EnumTarifaPedagio.TPP.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_TPP) != null)){
								cellNovoPrecio = row.getCell(CELL_NOVO_TPP);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifaNueva.setImporteTPP(novoPrecio);
							}

							tarifaNueva.setPrecioredabierto(tarifa.getPrecioredabierto());
							tarifaNueva.setStatustarifa("A");
							tarifaNueva.setTramo(tarifa.getTramo());
							tarifaNueva.setRuta(tarifa.getRuta());
							tarifaNueva.setOrgaoConcedente(tarifa.getOrgaoConcedente());
							tarifaNueva.setOrigen(tarifa.getOrigen());
							tarifaNueva.setDestino(tarifa.getDestino());

							

							if (existeTarifa) {
								tarifaService.actualizacion(tarifaNueva);
							} else {
								tarifaNueva = tarifaService.suscribir(tarifaNueva);
							}

						} else {
							
							tarifa.setMoneda(verificaMonedaASerInserida((row.getCell(CELL_NOVO_MONEDA) != null? row.getCell(CELL_NOVO_MONEDA).getStringCellValue():null), tarifa.getMoneda()));
							if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_PRECIO) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_PRECIO);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								cellOriginalPrecio = row.getCell(CELL_ORIGINAL_PRECIO);
								BigDecimal originalPrecio = new BigDecimal(cellOriginalPrecio.getNumericCellValue());
								originalPrecio = originalPrecio.setScale(2, RoundingMode.HALF_UP);
			
								//mantis 7621
								if (radAlterarPrecoOriginalSim.isChecked()){
									tarifa.setPreciooriginal(originalPrecio);									
								}
								
								tarifa.setPrecio(novoPrecio);
							} 
							
							if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_PEAJE) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_PEAJE);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifa.setImportepedagio(novoPrecio);
							} 
							
							if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_TX_EMBARQUE) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_TX_EMBARQUE);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifa.setImportetaxaembarque(novoPrecio);
							} 
							
							if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_SEGURO) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_SEGURO);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifa.setImporteseguro(novoPrecio);
							}
							
							if (componentePreco.equals(EnumTarifaPedagio.TPP.getDescricao()) || 
									(componentePreco.equals(EnumTarifaPedagio.TODOS.getDescricao()) &&  row.getCell(CELL_NOVO_TPP) != null)) {
								cellNovoPrecio = row.getCell(CELL_NOVO_TPP);
								BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
								novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);
								
								tarifa.setImporteTPP(novoPrecio);
							}

							tarifa.setStatustarifa("A");

							tarifa = tarifaService.actualizacion(tarifa);
						}

						contador = contador + 1;
					} else {
						String strTmpTarifaMinima = "TARIFA MINIMA: \n"
								+ "Tarifa: " + tarifa.getTarifaId() + "; \n"
								+ "Tramo: " + tramo.getDesctramo() + "; \n"
								+ "Via: " + tramo.getVia() + "; \n"
								+ "Clase Servicio: " + claseServicio + "; \n"
								+ "Precio: " + tarifa.getPrecio().setScale(2).toString() + "\n";

						log.info(strTmpTarifaMinima);

						strTarifaMinima = strTarifaMinima + strTmpTarifaMinima;
					}
				} catch (Exception ex) {
					String strTmpErrorTarifa = "ERROR: formato nuevo precio." + ex + "\n"
							+ "Tarifa: " + tarifa.getTarifaId() + "; \n"
							+ "Tramo: " + tramo.getDesctramo() + "; \n"
							+ "Via: " + tramo.getVia() + "; \n"
							+ "Clase Servicio: " + claseServicio + "; \n"
							+ "Precio: " + tarifa.getPrecio().setScale(2).toString() + "\n";

					log.error(strTmpErrorTarifa);

					strErrorTarifa = strErrorTarifa + strTmpErrorTarifa;
				}
			} else {
				String strTmpMercadoCompetido = "MERCADO COMPETIDO: \n"
						+ "Tarifa: " + tarifa.getTarifaId() + "; \n"
						+ "Tramo: " + tramo.getDesctramo() + "; \n"
						+ "Via: " + tramo.getVia() + "; \n"
						+ "Clase Servicio: " + claseServicio + "; \n"
						+ "Precio: " + tarifa.getPrecio().setScale(2).toString() + "\n";

				log.info(strTmpMercadoCompetido);

				strMercadoCompetido = strMercadoCompetido + strTmpMercadoCompetido;
			}
		}
		
		return contador;
	}
	
	private VigenciaTarifa obterNovaVigenciaSelecionadaPela(Integer tarifaId) {
		return tarifaService.obtenerID(tarifaId).getVigenciaTarifa();
	}

	private VigenciaTarifa obterNovaVigenciaSelecionada() {
		Comboitem cbiVt = cmbVigenciaTarifa.getSelectedItem();
		VigenciaTarifa nuevaVigencia;

		nuevaVigencia = (VigenciaTarifa) cbiVt.getValue();
		return nuevaVigencia;
	}

	private Boolean naoValidaTarifaMinima() {
		Integer valorContante=constanteService.buscarValorConstantePorNomeConstante("NAOVALIDATARIFAMINIMA_M_MACICADEPRECO");
		
		if(null ==valorContante || valorContante==0) {
		    return new Boolean(false);
		}
		return true;
	}
	
	private void alterarDescricaoTelaAuditoria(Tarifa tarifa) {
		tarifa.setTelaAlternativa("auditarClasse.ModificacionMasivaTarifasUploadController");
	}

	private boolean validarComponenteEspecifico(Row row) {
		if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao())){
			if (row.getCell(CELL_NOVO_PRECIO) == null) {
				return false;
			}			
		} else if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao())){
			if (row.getCell(CELL_NOVO_PEAJE) == null) {
				return false;
			}			
		} else if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao())){
			if (row.getCell(CELL_NOVO_SEGURO) == null) {
				return false;
			}
		} else if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())){
			if (row.getCell(CELL_NOVO_TX_EMBARQUE) == null) {
				return false;
			}
		}
		
		return true;
	}
	
	private Moneda verificaMonedaASerInserida(String descMoedaNova, Moneda atual ) {
		Moneda nova = atual;
		if (!StringUtils.isBlank(descMoedaNova)) {
			if(!descMoedaNova.equals(atual.getDescmoneda())) {
				List<Moneda> monedas = monedaService.buscar(descMoedaNova);
				if(monedas !=null && !monedas.isEmpty()){
					nova = monedas.get(0);
				}
				return nova;
			}
		}
		return nova;
	}
}
