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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.CorridaCtrl;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoAgencia;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoCanalVendas;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoCategoria;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoOcupacion;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.CorridaCtrlService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.PricingEspecificoAgenciaService;
import com.rjconsultores.ventaboletos.service.PricingEspecificoCanalVendasService;
import com.rjconsultores.ventaboletos.service.PricingEspecificoCategoriaService;
import com.rjconsultores.ventaboletos.service.PricingEspecificoOcupacionService;
import com.rjconsultores.ventaboletos.service.PricingEspecificoService;
import com.rjconsultores.ventaboletos.service.PuntoVentaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPricingAgencia;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPricingCanal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPricingEspecificoCategoria;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPricingEspecificoOcupacion;

/**
 * 
 * @author Cássio Rocha
 */
@Controller("editarPricingEspecificoController")
@Scope("prototype")
@SuppressWarnings({ "unchecked", "rawtypes", "unused" })
public class EditarPricingEspecificoController extends PricingController {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(EditarPricingController.class);

	@Autowired
	private PricingEspecificoService pricingEspecificoService;
	@Autowired
	private TipoPuntoVentaService puntoVentaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private CorridaCtrlService corridaCtrlService;
	@Autowired
	private PricingEspecificoOcupacionService pricingEspecificoOcupacionService;
	@Autowired 
	private PricingEspecificoCategoriaService pricingEspecificoCategoriaService;
	@Autowired
	private PuntoVentaService puntoVenService;
	@Autowired
	private PricingEspecificoAgenciaService  pricingEspecificoAgenciaService;
	@Autowired
	private PricingEspecificoCanalVendasService  pricingEspecificoCanalVendasService;

	private PricingEspecifico pricingEspecifico;
	private MyListbox pricingList;
	private Combobox cmbPtovta;
	private Combobox cmbCategoria;
	private Combobox cmbServicio;
	private Combobox cmbMarca;
	private Combobox cmbOrigem;
	private Combobox cmbMoneda;
	private Combobox cmbDestino;
	private List<TipoPuntoVenta> lsPtovata;
	private List<Categoria> lsCategoria;
	private List<ClaseServicio> lsclaseServicio;
	private List<Marca> lsMarca;
	private List<Moneda> lsMoneda;
	private Button btnApagar;
	private Datebox fechaInicio;
	private Datebox fechaFin;
	private Textbox nombrePricing;
	private Textbox tarifaAbierto;
	private Button btnCopiar;
	private Radio rdExibirVendaSi;
	private Radio rdExibirVendaNo;

	private MyListbox pricingListEspOcupacion;
	private MyListbox pricingListEspAgencia;
	private MyListbox pricingListEspCategoria;
	private MyListbox pricingListEspCanal;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private List<PricingEspecificoOcupacion> pricingEspecificoADesativar;
	private List<PricingEspecificoAgencia> pricingEspecificoADesativarAgencia;
	private List<PricingEspecificoCategoria> pricingEspecificoADesativarCategoria;
	
	private List<PricingEspecificoCanalVendas> pricingEspecificoADesativarCanal;
	
	private Datebox inicioDataViagem;
	private Datebox fimDataViagem;
	private Datebox inicioDataVenda;
	private Datebox fimDataVenda;
	
	private Checkbox chkDomingo;
	private Checkbox chkSegunda;
	private Checkbox chkTerca;
	private Checkbox chkQuarta;
	private Checkbox chkQuinta;
	private Checkbox chkSexta;
	private Checkbox chkSabado;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsCategoria = getCategoriaService().obtenerTodos();
		lsMarca = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsMoneda = monedaService.obtenerTodos();
		lsPtovata = puntoVentaService.obtenerTodos();
		lsclaseServicio = claseServicioService.obtenerTodos();
		pricingEspecifico = (PricingEspecifico) Executions.getCurrent().getArg().get("pricingEspecifico");
		pricingList = (MyListbox) Executions.getCurrent().getArg().get("pricingList");
		pricingEspecificoADesativar = new ArrayList<PricingEspecificoOcupacion>();
		pricingEspecificoADesativarAgencia = new ArrayList<PricingEspecificoAgencia>();
		pricingEspecificoADesativarCanal = new ArrayList<PricingEspecificoCanalVendas>();
		pricingEspecificoADesativarCategoria = new ArrayList<PricingEspecificoCategoria>();
		super.doAfterCompose(comp);

		pricingListEspOcupacion.setItemRenderer(new RenderPricingEspecificoOcupacion());
		pricingListEspAgencia.setItemRenderer(new RenderPricingAgencia());
		pricingListEspCanal.setItemRenderer(new RenderPricingCanal());
		pricingListEspCategoria.setItemRenderer(new RenderPricingEspecificoCategoria());

		if (pricingEspecifico.getPricingespecificoId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
			incluirCategoriasPadroes();
		} else {
			Parada origem = pricingEspecifico.getParada();
			if (origem != null) {
				cmbOrigem.setText(origem.getDescparada());
			}

			Parada destino = pricingEspecifico.getParada1();
			if (destino != null) {
				cmbDestino.setText(destino.getDescparada());
			}

			pricingEspecifico = pricingEspecificoService.obtenerID(pricingEspecifico.getPricingespecificoId());

			pricingListEspOcupacion.setData(pricingEspecifico.getPricingEspecificoOcupacionsListActivos());
			pricingListEspOcupacion.addEventListener("onDoubleClick", new EventListener() {

				@Override
				public void onEvent(Event event) throws Exception {
					PricingEspecificoOcupacion especificoOcupacion = (PricingEspecificoOcupacion) pricingListEspOcupacion.getSelected();
					verPricingEspecificoOcupacion(especificoOcupacion, true);
				}
			});
			pricingListEspAgencia.setData(pricingEspecifico.getPricingEspecificoAgenciaListActivos());
						
			
			pricingListEspCanal.setData(pricingEspecifico.getPricingEspecificoCanalListActivos());
			pricingListEspCategoria.setData(pricingEspecifico.getPricingEspecificoCategoriaList());
		}
		
		atualizarDiasSemana();

		fechaInicio.focus(); 
	}
	
	private void atualizarDiasSemana() {
		chkDomingo.setChecked(pricingEspecifico.getDomingo());
		chkSegunda.setChecked(pricingEspecifico.getSegunda());
		chkTerca.setChecked(pricingEspecifico.getTerca());
		chkQuarta.setChecked(pricingEspecifico.getQuarta());
		chkQuinta.setChecked(pricingEspecifico.getQuinta());
		chkSexta.setChecked(pricingEspecifico.getSexta());
		chkSabado.setChecked(pricingEspecifico.getSabado());
	}
	
	public void verPricingEspecificoOcupacion(PricingEspecificoOcupacion especificoOcupacion, Boolean isEdicao) {

		Map args = new HashMap();
		args.put("pricingEspecifico", pricingEspecifico);
		args.put("pricingEspecificoOcupacion", especificoOcupacion);
		args.put("isEdicao", isEdicao);
		args.put("pricingListEspOcupacion", pricingListEspOcupacion);

		openWindow("/gui/pricing/editarPricingEspecificoOcupacion.zul",
				Labels.getLabel("editarPricingController.window.title"), args, MODAL);
	}

	public void onClick$btnNovoPricingEspOcup(Event ev) throws InterruptedException {
		verPricingEspecificoOcupacion(new PricingEspecificoOcupacion(), false);
	}
	
	public void onClick$btnNovoPricingCategoria(Event ev) throws InterruptedException {
		if (cmbCategoria.getSelectedItem() == null) {
			return;
		}
		PricingEspecificoCategoria pricingCategoria = new PricingEspecificoCategoria((Categoria) cmbCategoria.getSelectedItem().getValue(), pricingEspecifico, UsuarioLogado.getUsuarioLogado().getUsuarioId());

		if (pricingEspecifico.getPricingEspecificoCategoriaList().contains(pricingCategoria)) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.noPricingEspecificoCategoriaJaCadastrado"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			pricingListEspCategoria.addItemNovo(pricingCategoria);
			pricingEspecifico.getPricingEspecificoCategoriaList().add(pricingCategoria);
		}

		cmbCategoria.setValue("");
	}
	
	public void onClick$btnNovoPricingAgencia(Event ev) throws InterruptedException {		
		if(cmbPuntoVenta.getSelectedItem() == null){
			return;
		}
		PricingEspecificoAgencia pricingAgencia  = new PricingEspecificoAgencia((PuntoVenta)cmbPuntoVenta.getSelectedItem().getValue(), pricingEspecifico, UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		if (pricingEspecifico.getPricingEspecificoAgenciasList().contains(pricingAgencia)) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.noPricingEspecificoAgenciaJaCadastrado"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			pricingListEspAgencia.addItemNovo(pricingAgencia);
			pricingEspecifico.getPricingEspecificoAgenciasList().add(pricingAgencia);
			
			
			//se não estiver adicionando TODOS
			if(pricingAgencia.getPuntoVenta().getPuntoventaId() != -1){
				
				//busca o todos na lista
				for (PricingEspecificoAgencia pea : pricingEspecifico.getPricingEspecificoAgenciasList() ) {
					if(pea.getPuntoVenta().getPuntoventaId().equals(new Integer("-1"))) {
						pricingListEspAgencia.removeItem(pea);
						pricingEspecificoADesativarAgencia.add(pea);
						break;
					}
				}
							
			}else {
				//se adicionou TODOS remove os outros
				for (PricingEspecificoAgencia p : pricingEspecifico.getPricingEspecificoAgenciasList() ) {
					if(!p.getPuntoVenta().getPuntoventaId().equals(new Integer("-1"))) {
						pricingListEspAgencia.removeItem(p);
						pricingEspecificoADesativarAgencia.add(p);
					}
				}
			}
		}
		
		cmbPuntoVenta.setValue("");
	}
	
	public void onClick$btnNovoPricingCanal(Event ev) throws InterruptedException {
		
		if(cmbPtovta.getSelectedItem() == null){
			return;
		}
		PricingEspecificoCanalVendas pricingCanal  = new PricingEspecificoCanalVendas((TipoPuntoVenta)cmbPtovta.getSelectedItem().getValue(), pricingEspecifico, UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		if (pricingEspecifico.getPricingEspecificoCanalVendasList().contains(pricingCanal)) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.noPricingEspecificoCanalJaCadastrado"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			pricingListEspCanal.addItemNovo(pricingCanal);
			pricingEspecifico.getPricingEspecificoCanalVendasList().add(pricingCanal);
			
			
			//se não estiver adicionando TODOS
			if(pricingCanal.getTipoPtovta().getTipoptovtaId() != -1){
				
				//busca o todos na lista
				for (PricingEspecificoCanalVendas pecv : pricingEspecifico.getPricingEspecificoCanalVendasList() ) {
					if(pecv.getTipoPtovta().getTipoptovtaId().equals(new Short("-1"))) {
						pricingListEspCanal.removeItem(pecv);
						pricingEspecificoADesativarCanal.add(pecv);
						break;
					}
				}
							
			}else {
				//se adicionou TODOS remove os outros
				for (PricingEspecificoCanalVendas p : pricingEspecifico.getPricingEspecificoCanalVendasList() ) {
					if(!p.getTipoPtovta().getTipoptovtaId().equals(new Short("-1"))) {
						pricingListEspCanal.removeItem(p);
						pricingEspecificoADesativarCanal.add(p);
					}
				}
			}
		}
		
		cmbPtovta.setValue("");
	}

	public void onClick$btnApagarPricingEspOcup(Event ev) throws InterruptedException {
		if (pricingListEspOcupacion.getSelected() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"),
					Labels.getLabel("editarPricingController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			int resp = Messagebox.show(Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.borrarPergunta"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {
				PricingEspecificoOcupacion especificoOcupacion = (PricingEspecificoOcupacion) pricingListEspOcupacion.getSelected();

				if (especificoOcupacion.getPricingEspecificoOcupacionId() != null) {
					especificoOcupacion.setActivo(false);
					pricingListEspOcupacion.removeItem(especificoOcupacion);
					pricingEspecificoADesativar.add(especificoOcupacion);
				} else {
					pricingListEspOcupacion.removeSelectedItem();
					removerPricingOcupacion(especificoOcupacion);
				}
			}
		}
	}
	
	public void onClick$btnApagarPricingEspCategoria(Event ev) throws InterruptedException {
		if (pricingListEspCategoria.getSelected() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"),
					Labels.getLabel("editarPricingController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			int resp = Messagebox.show(Labels.getLabel("editarPricingEspecificoCategoriaController.MSG.borrarPergunta"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {
				PricingEspecificoCategoria pricingCategoria = (PricingEspecificoCategoria) pricingListEspCategoria.getSelected();
				pricingListEspCategoria.removeItem(pricingCategoria);
				
				if(pricingCategoria.getPricingEspecificoCategoriaId() != null){
					pricingCategoria.setActivo(false);
					pricingEspecificoADesativarCategoria.add(pricingCategoria);
				}else{
					removerPricingCategoria(pricingCategoria);					
				}
			}
		}
	}
	
	public void onClick$btnApagarPricingEspAgencia(Event ev) throws InterruptedException {
		if (pricingListEspAgencia.getSelected() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"),
					Labels.getLabel("editarPricingController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			int resp = Messagebox.show(Labels.getLabel("editarPricingEspecificoAgenciaController.MSG.borrarPergunta"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {
				PricingEspecificoAgencia pricingEspecificoAgencia = (PricingEspecificoAgencia) pricingListEspAgencia.getSelected();

				if (pricingEspecificoAgencia.getPricingEspecificoAgenciaId() != null) {
					pricingEspecificoAgencia.setActivo(false);
					pricingListEspAgencia.removeItem(pricingEspecificoAgencia);
					pricingEspecificoADesativarAgencia.add(pricingEspecificoAgencia);
				} else {
					pricingListEspAgencia.removeSelectedItem();
					removerPricingAgencia(pricingEspecificoAgencia);
				}
			}
		}
	}
	
	public void onClick$btnApagarPricingEspCanal(Event ev) throws InterruptedException {
		if (pricingListEspCanal.getSelected() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"),
					Labels.getLabel("editarPricingController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			int resp = Messagebox.show(Labels.getLabel("editarPricingEspecificoCanalVendaController.MSG.borrarPergunta"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {
				PricingEspecificoCanalVendas pricingEspecificoCanal = (PricingEspecificoCanalVendas) pricingListEspCanal.getSelected();
				if(pricingEspecifico.getPricingEspecificoCanalVendasList().indexOf(pricingEspecificoCanal)>-1){
					pricingEspecifico.getPricingEspecificoCanalVendasList().get(pricingEspecifico.getPricingEspecificoCanalVendasList().indexOf(pricingEspecificoCanal)).setActivo(Boolean.FALSE);
				}
			
				if (pricingEspecificoCanal.getPricingEspecificoCanalId() != null) {
					pricingEspecificoCanal.setActivo(false);
					pricingListEspCanal.removeItem(pricingEspecificoCanal);
					pricingEspecificoADesativarCanal.add(pricingEspecificoCanal);
				} else {
					pricingListEspCanal.removeSelectedItem();
					removerPricingCanalVendas(pricingEspecificoCanal);
				}
				
			}
		}
	}

	private void removerPricingOcupacion(PricingEspecificoOcupacion especificoOcupacion) {
		if (especificoOcupacion.getPricingEspecificoOcupacionId() != null) {
			pricingEspecifico.getPricingEspecificoOcupacionsList().remove(especificoOcupacion);
		} else {
			int index = 1;
			for (PricingEspecificoOcupacion pricingEspecificoOcupacion : pricingEspecifico.getPricingEspecificoOcupacionsList()) {
				if(especificoOcupacion.getTarifa() != null){
					if (pricingEspecificoOcupacion.getOcupacionfinal().equals(especificoOcupacion.getOcupacionfinal()) &&
							pricingEspecificoOcupacion.getOcupacioninicial().equals(especificoOcupacion.getOcupacioninicial()) &&
							pricingEspecificoOcupacion.getTarifa().equals(especificoOcupacion.getTarifa())) {
						break;
					}
				}
				if(especificoOcupacion.getDescuento() != null){
					if (pricingEspecificoOcupacion.getOcupacionfinal().equals(especificoOcupacion.getOcupacionfinal()) &&
							pricingEspecificoOcupacion.getOcupacioninicial().equals(especificoOcupacion.getOcupacioninicial()) &&
							pricingEspecificoOcupacion.getDescuento().equals(especificoOcupacion.getDescuento())) {
						break;
					}
				}
				
				index++;
			}
			pricingEspecifico.getPricingEspecificoOcupacionsList().remove(index - 1);
		}
	}
	private void removerPricingCategoria(PricingEspecificoCategoria especificoCategoria){
		if(especificoCategoria.getPricingEspecificoCategoriaId() != null){
			pricingEspecifico.getPricingEspecificoCategoriaList().remove(especificoCategoria);
		}
	}
	
	private void removerPricingAgencia(PricingEspecificoAgencia especificoAgencia) {
		if (especificoAgencia.getPricingEspecificoAgenciaId() != null) {
			pricingEspecifico.getPricingEspecificoAgenciasList().remove(especificoAgencia);
		} 
	}
	
	private void removerPricingCanalVendas(PricingEspecificoCanalVendas especificoCanalVendas) {
		if (especificoCanalVendas.getPricingEspecificoCanalId() != null) {
			pricingEspecifico.getPricingEspecificoCanalVendasList().remove(especificoCanalVendas);
		} 
	}

	public void onClick$btnModificarPricingEspOcup(Event ev) {
		PricingEspecificoOcupacion especificoOcupacion = (PricingEspecificoOcupacion) pricingListEspOcupacion.getSelected();

		if (especificoOcupacion != null) {
			verPricingEspecificoOcupacion(especificoOcupacion, true);
		} else {
			try {
				Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"),
						Labels.getLabel("editarPricingController.windowVigencia.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			} catch (InterruptedException ex) {
				log.error("", ex);
			}
		}
	}

	public void onClick$btnApagar(Event e) {
		// Esclusão Logica
		try {
			int resp = Messagebox.show(
					Labels.getLabel("editarPricingController.MSG.borrarPergunta"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				pricingEspecificoService.borrar(pricingEspecifico);
				Messagebox.show(
						Labels.getLabel("editarPricingController.MSG.borrarOK"),
						Labels.getLabel("busquedaPricingEspecificoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				pricingList.removeItem(pricingEspecifico);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error(ex);
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		nombrePricing.getValue();
		fechaInicio.getValue();
		fechaFin.getValue();
		tarifaAbierto.getValue();
		inicioDataViagem.getValue();
		fimDataViagem.getValue();
		inicioDataVenda.getValue();
		fimDataVenda.getValue();

		List<PricingEspecificoOcupacion> pricingEspecificoOcupacionList = new ArrayList<PricingEspecificoOcupacion>();
		for (Object o : pricingListEspOcupacion.getData()) {
			PricingEspecificoOcupacion p = (PricingEspecificoOcupacion) o;	
			pricingEspecificoOcupacionList.add(p);	
		}
		pricingEspecifico.setPricingEspecificoOcupacionsList(pricingEspecificoOcupacionList);
		
		List<PricingEspecificoCategoria> pec = (List<PricingEspecificoCategoria>) pricingListEspCategoria.getModel();
		for(PricingEspecificoCategoria pricingEspecificoCategoria : pec){
			if(!pricingEspecificoCategoria.getActivo()){
				pec.remove(pricingEspecificoCategoria);
			}
		}
		List<PricingEspecificoCategoria> pecAuxiliar = new ArrayList<PricingEspecificoCategoria>();
		for(PricingEspecificoCategoria pricingEspecificoCategoria : pec){
			pecAuxiliar.add(pricingEspecificoCategoria);
		}
		
		
		List<PricingEspecificoCanalVendas> pecv =  (List<PricingEspecificoCanalVendas>) pricingListEspCanal.getModel();
		List<PricingEspecificoCanalVendas> pecvAuxiliar = new ArrayList<PricingEspecificoCanalVendas>();
		for (PricingEspecificoCanalVendas pricingEspecificoCanalVendas : pecv) {
			if(pricingEspecificoCanalVendas.getActivo().equals(Boolean.FALSE)){
				pecvAuxiliar.add(pricingEspecificoCanalVendas);				
			}
		}
		pecv.removeAll(pecvAuxiliar);
		List<PricingEspecificoCanalVendas> pecvAuxiliar2 = new ArrayList<PricingEspecificoCanalVendas>();
		for (PricingEspecificoCanalVendas pricingEspecificoCanalVendas : pecv) {
			pecvAuxiliar2.add(pricingEspecificoCanalVendas);
		}
		
		
		
		List<PricingEspecificoAgencia> pea =  (List<PricingEspecificoAgencia>) pricingListEspAgencia.getModel();
		List<PricingEspecificoAgencia> peaAuxiliar = new ArrayList<PricingEspecificoAgencia>();
		for (PricingEspecificoAgencia pricingEspecificoAgencia : pea) {
			if(pricingEspecificoAgencia.getActivo().equals(Boolean.FALSE)){
				peaAuxiliar.add(pricingEspecificoAgencia);
			}
		}
		pea.removeAll(peaAuxiliar);
		List<PricingEspecificoAgencia> peaAuxiliar2 = new ArrayList<PricingEspecificoAgencia>();
		for (PricingEspecificoAgencia pricingEspecificoAgencia : pea) {
			peaAuxiliar2.add(pricingEspecificoAgencia);
		}
		
		pricingEspecifico.setPricingEspecificoCategoriaList(pecAuxiliar);
		pricingEspecifico.setPricingEspecificoAgenciasList(peaAuxiliar2);		
		pricingEspecifico.setPricingEspecificoCanalVendasList(pecvAuxiliar2);
		
		
		if(pricingEspecifico.getPricingEspecificoCategoriaList().isEmpty()){
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.categoria"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		
		if (pricingEspecifico.getClaseServicio() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.claseServicio"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (pricingEspecifico.getMarca() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.marca"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (pricingEspecifico.getParada() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.origen"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (pricingEspecifico.getParada1() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.destino"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (pricingEspecifico.getMoneda() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.moneda"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if(pricingEspecifico.getFechorinicio() == null || pricingEspecifico.getFechorfin() == null) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.datasFechaNaoInformadas"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			
			return;
		}
		
		if(DateUtil.isMaior(pricingEspecifico.getFechorinicio(), pricingEspecifico.getFechorfin())) {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.datasFecha"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}
		
		if(!(pricingEspecifico.getDataInicioVenda() == null && pricingEspecifico.getDataFimVenda() == null) &&
		    DateUtil.isMaior(pricingEspecifico.getDataInicioVenda(), pricingEspecifico.getDataFimVenda()))
		{
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.datasVendaErradaFaixa"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}

		//Verifica se a data da venda esta dentro da data de Vigencia
		if(!(pricingEspecifico.getDataInicioVenda() == null && pricingEspecifico.getDataFimVenda() == null) &&
		   !(DateUtil.isIgualORMaior(pricingEspecifico.getDataInicioVenda(), pricingEspecifico.getFechorinicio()) && DateUtil.isIgualORMenor(pricingEspecifico.getDataFimVenda(), pricingEspecifico.getFechorfin())))
		{
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.datasVendaErrada"), Labels.getLabel("busquedaPricingEspecificoController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		
		if(!(pricingEspecifico.getDataInicioViagem() == null && pricingEspecifico.getDataFimViagem() == null) &&
		    DateUtil.isMaior(pricingEspecifico.getDataInicioViagem(), pricingEspecifico.getDataFimViagem()))
		{
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.datasViagemErradaFaixa"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}		
		
		//Verifica se a data da venda esta dentro da data de Vigencia
		if(!(pricingEspecifico.getDataInicioViagem() == null && pricingEspecifico.getDataFimViagem() == null) &&
		   !(DateUtil.isIgualORMaior(pricingEspecifico.getDataInicioViagem(), pricingEspecifico.getFechorinicio()) && DateUtil.isIgualORMenor(pricingEspecifico.getDataFimViagem(), pricingEspecifico.getFechorfin())))
		{
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.datasViagemErrada"), Labels.getLabel("busquedaPricingEspecificoController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		
		if (rdExibirVendaSi.isChecked()) {
			pricingEspecifico.setExibeVenda(Boolean.TRUE);
		} else {
			pricingEspecifico.setExibeVenda(Boolean.FALSE);
		}
		
		pricingEspecifico.setDomingo(chkDomingo.isChecked());
		pricingEspecifico.setSegunda(chkSegunda.isChecked());
		pricingEspecifico.setTerca(chkTerca.isChecked());
		pricingEspecifico.setQuarta(chkQuarta.isChecked());
		pricingEspecifico.setQuinta(chkQuinta.isChecked());
		pricingEspecifico.setSexta(chkSexta.isChecked());
		pricingEspecifico.setSabado(chkSabado.isChecked());
		
		if (pricingEspecifico.getCorridaId() != null) {
			CorridaCtrl corridaCtrlId = corridaCtrlService.obtenerID(pricingEspecifico.getCorridaId());
			if (corridaCtrlId == null) {
				Messagebox.show(Labels.getLabel("editarPricingController.MSG.corridaId", new Object[] { pricingEspecifico.getCorridaId() }),
						Labels.getLabel("busquedaPricingEspecificoController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			} else {
				CorridaCtrl corridaCtrlFinal = corridaCtrlService.buscar(
						pricingEspecifico.getCorridaId(),
						pricingEspecifico.getParada(),
						pricingEspecifico.getParada1(),
						pricingEspecifico.getClaseServicio(),
						pricingEspecifico.getMarca());

				if (corridaCtrlFinal == null) {
					Integer opcao = Messagebox.show(Labels.getLabel("editarPricingController.MSG.corridaIdFinalNaoExiste", new Object[] { pricingEspecifico.getCorridaId() }),
							Labels.getLabel("busquedaPricingEspecificoController.window.title"),
							Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

					if (opcao.equals(Messagebox.NO)) {
						return;
					}
				}
			}
		}

		if (!validarPricingEspecificoOcupacion()) {
			return;
		}

		List<PricingEspecifico> lsPricing = pricingEspecificoService.buscarPorNome(pricingEspecifico);
		boolean podeSalvar = false;
		if (lsPricing.isEmpty()) {
			podeSalvar = true;
		} else {
			for (PricingEspecifico p : lsPricing) {
				if (p.getPricingespecificoId().equals(pricingEspecifico.getPricingespecificoId())) {
					podeSalvar = true;
				}
			}
		}

		if (podeSalvar) {
			if(pricingEspecifico.getPricingEspecificoAgenciasList() == null ){								
				pricingEspecifico.setPricingEspecificoAgenciasList(new ArrayList<PricingEspecificoAgencia>());
			}
			if (pricingEspecifico.getPricingEspecificoAgenciasList().isEmpty()){
				
				int resp = Messagebox.show(
						Labels.getLabel("editarPricingEspecificoAgenciaController.MSG.perguntaAdicionarTodosAgencia"),
						Labels.getLabel("busquedaPricingEspecificoController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
				if(resp == Messagebox.YES){
					
					PricingEspecificoAgencia pea1 = new PricingEspecificoAgencia();
					pea1.setPricingEspecifico(pricingEspecifico);
					PuntoVenta pv = puntoVenService.obtenerID(-1);
					pea1.setPuntoVenta(pv);
					pea1.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					pea1.setFecmodif(new Date());
					pea1.setActivo(Boolean.TRUE);
					pricingEspecifico.setPricingEspecificoAgenciasList(new ArrayList<PricingEspecificoAgencia>());
					pricingEspecifico.getPricingEspecificoAgenciasList().add(pea1);
					
					if(pricingEspecifico.getPricingEspecificoAgenciasList().contains(pea1) && pricingEspecifico.getPricingEspecificoAgenciasList().size()>1){
						pricingEspecifico.getPricingEspecificoAgenciasList().get(pricingEspecifico.getPricingEspecificoAgenciasList().indexOf(pea1)).setActivo(Boolean.FALSE);
					}
				}else{
					Messagebox.show(Labels.getLabel("editarPricingEspecificoAgenciaController.MSG.agenciaVazio"),
							Labels.getLabel("busquedaPricingEspecificoController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);

					return;
				}
			}
			
			if(pricingEspecifico.getPricingEspecificoCanalVendasList() == null ){
				pricingEspecifico.setPricingEspecificoCanalVendasList(new ArrayList<PricingEspecificoCanalVendas>());
			}
			
			if (pricingEspecifico.getPricingEspecificoCanalVendasList().isEmpty()){	
				
				int resp = Messagebox.show(
						Labels.getLabel("editarPricingEspecificoCanalVendaController.MSG.perguntaAdicionarTodosCanalVendas"),
						Labels.getLabel("busquedaPricingEspecificoController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
				if(resp == Messagebox.YES){
					TipoPuntoVenta tpv = puntoVentaService.obtenerID(new Short("-1"));
					PricingEspecificoCanalVendas canalTODOS = new PricingEspecificoCanalVendas();
					canalTODOS.setTipoPtovta(tpv);
					canalTODOS.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					canalTODOS.setActivo(Boolean.TRUE);
					canalTODOS.setPricingEspecifico(pricingEspecifico);
					pricingEspecifico.getPricingEspecificoCanalVendasList().add(canalTODOS);
					if(pricingEspecifico.getPricingEspecificoCanalVendasList().contains(canalTODOS) && pricingEspecifico.getPricingEspecificoCanalVendasList().size()>1){
						pricingEspecifico.getPricingEspecificoCanalVendasList().get(pricingEspecifico.getPricingEspecificoCanalVendasList().indexOf(canalTODOS)).setActivo(Boolean.FALSE);
					}
				}else{
					Messagebox.show(Labels.getLabel("editarPricingEspecificoCanalVendaController.MSG.canalVendasVazio"),
							Labels.getLabel("busquedaPricingEspecificoController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);

					return;
				}
			}
			
			if (pricingEspecifico.getPricingespecificoId() == null) {
				pricingEspecificoService.suscribir(pricingEspecifico);
				pricingList.addItemNovo(pricingEspecifico);
			} else {
				pricingEspecificoService.actualizacion(pricingEspecifico);
				pricingList.updateItem(pricingEspecifico);
			}

			desativarPricingEspecificoCategoria();
			desativarPricingEspecificoOcupacionDesativados();
			desativarPricingEspecificoAgenciaDesativados();
			desativarPricingEspecificoCanalDesativados();

			Messagebox.show(Labels.getLabel("editarPricingController.MSG.suscribirOK"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
		} else {
			Messagebox.show(
					Labels.getLabel("MSG.Registro.Existe"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}

	}

	private void desativarPricingEspecificoCategoria(){
		for(PricingEspecificoCategoria p : pricingEspecificoADesativarCategoria){
			p.setActivo(Boolean.FALSE);
			pricingEspecificoCategoriaService.actualizacion(p);
		}
	}
	
	private void desativarPricingEspecificoOcupacionDesativados() {
		for (PricingEspecificoOcupacion p : pricingEspecificoADesativar) {
			p.setActivo(Boolean.FALSE);
			pricingEspecificoOcupacionService.actualizacion(p);
		}
	}
	
	private void desativarPricingEspecificoAgenciaDesativados() {
		for (PricingEspecificoAgencia p : pricingEspecificoADesativarAgencia) {
			p.setActivo(Boolean.FALSE);
			pricingEspecificoAgenciaService.actualizacion(p);
		}
	}
	
	private void desativarPricingEspecificoCanalDesativados() {
		for (PricingEspecificoCanalVendas p : pricingEspecificoADesativarCanal) {
			p.setActivo(Boolean.FALSE);
			pricingEspecificoCanalVendasService.actualizacion(p);
		}
	}

	/**
	 * Valida se a lista de ocupações são subsequentes e se a primeira ocupação possui ocupação inicial igual a 1.
	 * 
	 * @return
	 * @throws InterruptedException
	 */
	private boolean validarPricingEspecificoOcupacion() throws InterruptedException {
		if (pricingEspecifico.getPricingEspecificoOcupacionsListActivos() == null || pricingEspecifico.getPricingEspecificoOcupacionsListActivos().isEmpty()) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.noPricingEspecificoOcupacion"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}

		List<PricingEspecificoOcupacion> sOcupacionInicial = new ArrayList<PricingEspecificoOcupacion>(pricingEspecifico.getPricingEspecificoOcupacionsListActivos());
		Collections.sort(sOcupacionInicial, new Comparator<PricingEspecificoOcupacion>() {

			@Override
			public int compare(PricingEspecificoOcupacion o1, PricingEspecificoOcupacion o2) {
				return o1.getOcupacioninicial().compareTo(o2.getOcupacioninicial());
			}
		});

		if (sOcupacionInicial.iterator().next().getOcupacioninicial().intValue() != 1) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.pricingEspecificoOcupacionInicial"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}

		boolean pricingEspecificoOcupacionNoSubsequente = false;
		for (int i = 0; i < sOcupacionInicial.size(); i++) {
			PricingEspecificoOcupacion pricingEspecificoOcupacion = sOcupacionInicial.get(i);
			PricingEspecificoOcupacion pricingEspecificoOcupacionAnterior = null;

			if (i > 0) {
				pricingEspecificoOcupacionAnterior = sOcupacionInicial.get(i - 1);
			}

			if (pricingEspecificoOcupacionAnterior != null
					&& pricingEspecificoOcupacionAnterior.getOcupacionfinal().add(new BigDecimal(1)).doubleValue() != pricingEspecificoOcupacion.getOcupacioninicial().doubleValue()) {
				pricingEspecificoOcupacionNoSubsequente = true;
				break;
			}
		}

		if (pricingEspecificoOcupacionNoSubsequente) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.pricingEspecificoOcupacionNoSubsequente"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}

		return true;
	}

	/**
	 * @return the pricingEspecificoService
	 */
	public PricingEspecificoService getPricingEspecificoService() {
		return pricingEspecificoService;
	}

	/**
	 * @param pricingEspecificoService
	 *            the pricingEspecificoService to set
	 */
	public void setPricingEspecificoService(PricingEspecificoService pricingEspecificoService) {
		this.pricingEspecificoService = pricingEspecificoService;
	}

	/**
	 * @return the pricingEspecifico
	 */
	public PricingEspecifico getPricingEspecifico() {
		return pricingEspecifico;
	}

	/**
	 * @param pricingEspecifico
	 *            the pricingEspecifico to set
	 */
	public void setPricingEspecifico(PricingEspecifico pricingEspecifico) {
		this.pricingEspecifico = pricingEspecifico;
	}

	/**
	 * @return the pricingList
	 */
	public MyListbox getPricingList() {
		return pricingList;
	}

	/**
	 * @param pricingList
	 *            the pricingList to set
	 */
	public void setPricingList(MyListbox pricingList) {
		this.pricingList = pricingList;
	}

	/**
	 * @return the cmbPtovta
	 */
	public Combobox getCmbPtovta() {
		return cmbPtovta;
	}

	/**
	 * @param cmbPtovta
	 *            the cmbPtovta to set
	 */
	public void setCmbPtovta(Combobox cmbPtovta) {
		this.cmbPtovta = cmbPtovta;
	}

	/**
	 * @return the cmbCategoria
	 */
	public Combobox getCmbCategoria() {
		return cmbCategoria;
	}

	/**
	 * @param cmbCategoria
	 *            the cmbCategoria to set
	 */
	public void setCmbCategoria(Combobox cmbCategoria) {
		this.cmbCategoria = cmbCategoria;
	}

	/**
	 * @return the cmbServicio
	 */
	public Combobox getCmbServicio() {
		return cmbServicio;
	}

	/**
	 * @param cmbServicio
	 *            the cmbServicio to set
	 */
	public void setCmbServicio(Combobox cmbServicio) {
		this.cmbServicio = cmbServicio;
	}

	/**
	 * @return the cmbMarca
	 */
	public Combobox getCmbMarca() {
		return cmbMarca;
	}

	/**
	 * @param cmbMarca
	 *            the cmbMarca to set
	 */
	public void setCmbMarca(Combobox cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	/**
	 * @return the cmbOrigem
	 */
	public Combobox getCmbOrigem() {
		return cmbOrigem;
	}

	/**
	 * @param cmbOrigem
	 *            the cmbOrigem to set
	 */
	public void setCmbOrigem(Combobox cmbOrigem) {
		this.cmbOrigem = cmbOrigem;
	}

	/**
	 * @return the cmbMoneda
	 */
	public Combobox getCmbMoneda() {
		return cmbMoneda;
	}

	/**
	 * @param cmbMoneda
	 *            the cmbMoneda to set
	 */
	public void setCmbMoneda(Combobox cmbMoneda) {
		this.cmbMoneda = cmbMoneda;
	}

	/**
	 * @return the cmbDestino
	 */
	public Combobox getCmbDestino() {
		return cmbDestino;
	}

	/**
	 * @param cmbDestino
	 *            the cmbDestino to set
	 */
	public void setCmbDestino(Combobox cmbDestino) {
		this.cmbDestino = cmbDestino;
	}

	/**
	 * @return the lsPtovata
	 */
	public List<TipoPuntoVenta> getLsPtovata() {
		return lsPtovata;
	}

	/**
	 * @param lsPtovata
	 *            the lsPtovata to set
	 */
	public void setLsPtovata(List<TipoPuntoVenta> lsPtovata) {
		this.lsPtovata = lsPtovata;
	}

	/**
	 * @return the lsCategoria
	 */
	public List<Categoria> getLsCategoria() {
		return lsCategoria;
	}

	/**
	 * @param lsCategoria
	 *            the lsCategoria to set
	 */
	public void setLsCategoria(List<Categoria> lsCategoria) {
		this.lsCategoria = lsCategoria;
	}

	/**
	 * @return the lsclaseServicio
	 */
	public List<ClaseServicio> getLsclaseServicio() {
		return lsclaseServicio;
	}

	/**
	 * @param lsclaseServicio
	 *            the lsclaseServicio to set
	 */
	public void setLsclaseServicio(List<ClaseServicio> lsclaseServicio) {
		this.lsclaseServicio = lsclaseServicio;
	}

	/**
	 * @return the lsMarca
	 */
	public List<Marca> getLsMarca() {
		return lsMarca;
	}

	/**
	 * @param lsMarca
	 *            the lsMarca to set
	 */
	public void setLsMarca(List<Marca> lsMarca) {
		this.lsMarca = lsMarca;
	}

	/**
	 * @return the lsMoneda
	 */
	public List<Moneda> getLsMoneda() {
		return lsMoneda;
	}

	/**
	 * @param lsMoneda
	 *            the lsMoneda to set
	 */
	public void setLsMoneda(List<Moneda> lsMoneda) {
		this.lsMoneda = lsMoneda;
	}

	/**
	 * @return the puntoVentaService
	 */
	public TipoPuntoVentaService getPuntoVentaService() {
		return puntoVentaService;
	}

	/**
	 * @param puntoVentaService
	 *            the puntoVentaService to set
	 */
	public void setPuntoVentaService(TipoPuntoVentaService puntoVentaService) {
		this.puntoVentaService = puntoVentaService;
	}

	/**
	 * @return the claseServicioService
	 */
	public ClaseServicioService getClaseServicioService() {
		return claseServicioService;
	}

	/**
	 * @param claseServicioService
	 *            the claseServicioService to set
	 */
	public void setClaseServicioService(ClaseServicioService claseServicioService) {
		this.claseServicioService = claseServicioService;
	}

	/**
	 * @return the marcaService
	 */
	public MarcaService getMarcaService() {
		return marcaService;
	}

	/**
	 * @param marcaService
	 *            the marcaService to set
	 */
	public void setMarcaService(MarcaService marcaService) {
		this.marcaService = marcaService;
	}

	/**
	 * @return the paradaService
	 */
	public ParadaService getParadaService() {
		return paradaService;
	}

	/**
	 * @param paradaService
	 *            the paradaService to set
	 */
	public void setParadaService(ParadaService paradaService) {
		this.paradaService = paradaService;
	}

	/**
	 * @return the monedaService
	 */
	public MonedaService getMonedaService() {
		return monedaService;
	}

	/**
	 * @param monedaService
	 *            the monedaService to set
	 */
	public void setMonedaService(MonedaService monedaService) {
		this.monedaService = monedaService;
	}

	public MyListbox getPricingListEspOcupacion() {
		return pricingListEspOcupacion;
	}

	public void setPricingListEspOcupacion(MyListbox pricingListEspOcupacion) {
		this.pricingListEspOcupacion = pricingListEspOcupacion;
	}

	public Textbox getTarifaAbierto() {
		return tarifaAbierto;
	}

	public void setTarifaAbierto(Textbox tarifaAbierto) {
		this.tarifaAbierto = tarifaAbierto;
	}
	
	public Radio getRdExibirVendaSi() {
		return rdExibirVendaSi;
	}

	public void setRdExibirVendaSi(Radio rdExibirVendaSi) {
		this.rdExibirVendaSi = rdExibirVendaSi;
	}

	public Radio getRdExibirVendaNo() {
		return rdExibirVendaNo;
	}

	public void setRdExibirVendaNo(Radio rdExibirVendaNo) {
		this.rdExibirVendaNo = rdExibirVendaNo;
	}
	
	public void onClick$btnCopiar(Event ev) throws InterruptedException {
		incluiCategoriasPadroesAntesCopiar();
		Map args = new HashMap();
		args.put("pricingEspecifico", pricingEspecifico);
		args.put("pricingCategoriaList", pricingEspecifico.getPricingEspecificoCategoriaList());

		openWindow("/gui/pricing/copiarPricingEspecifico.zul",
				Labels.getLabel("copiarPricingEspecificoController.window.title"), args, MODAL);
	}
	
	private void incluiCategoriasPadroesAntesCopiar() {
		if (ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.USA_PADRAO_PRICING_TIPO_PASSAGEM_PET.getDescricao())) {
			Categoria categoriaNormal = getCategoriaNormal();
			Categoria categoriaPET = getCategoriaPET();
			Boolean existeNormal = false;
			Boolean existePET = false;

			for (PricingEspecificoCategoria c : pricingEspecifico.getPricingEspecificoCategoriaList()) {
				if (c.getCategoria().equals(categoriaNormal)) {
					existeNormal = true;
				}
				if (c.getCategoria().equals(categoriaPET)) {
					existePET = true;
				}
			}

			if (!existeNormal) {
				incluirCategoriaNormal(categoriaNormal);
			}
			if (!existePET) {
				incluirCategoriaPet(categoriaPET);
			}
		}
	}

	@Override
	protected void incluirCategoriaNormal(Categoria categoriaNormal) {
		PricingEspecificoCategoria pcNormal = new PricingEspecificoCategoria(categoriaNormal, pricingEspecifico, UsuarioLogado.getUsuarioLogado().getUsuarioId());
		pricingListEspCategoria.addItemNovo(pcNormal);
		pricingEspecifico.getPricingEspecificoCategoriaList().add(pcNormal);
	}

	@Override
	protected void incluirCategoriaPet(Categoria categoriaPET) {
		PricingEspecificoCategoria pcPET = new PricingEspecificoCategoria(categoriaPET, pricingEspecifico, UsuarioLogado.getUsuarioLogado().getUsuarioId());
		pricingListEspCategoria.addItemNovo(pcPET);
		pricingEspecifico.getPricingEspecificoCategoriaList().add(pcPET);
	}
	
	public void onChange$fechaInicio(Event ev) throws Exception {
		if(inicioDataViagem != null && inicioDataViagem.getValue() == null) {
			inicioDataViagem.setValue(fechaInicio.getValue());
			pricingEspecifico.setDataInicioViagem(fechaInicio.getValue());
		}
		if(inicioDataVenda != null && inicioDataVenda.getValue() == null) {
			inicioDataVenda.setValue(fechaInicio.getValue());
			pricingEspecifico.setDataInicioVenda(fechaInicio.getValue());
		}
	}
	
	public void onChange$fechaFin(Event ev) throws Exception {
		if(fimDataViagem != null && fimDataViagem.getValue() == null) {
			fimDataViagem.setValue(fechaFin.getValue());
			pricingEspecifico.setDataFimViagem(fechaFin.getValue());
		}
		if(fimDataVenda != null && fimDataVenda.getValue() == null) {
			fimDataVenda.setValue(fechaFin.getValue());
			pricingEspecifico.setDataFimVenda(fechaFin.getValue());
		}
	}

}
