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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.brazilutils.br.cpfcnpj.Cnpj;
import org.brazilutils.validation.ValidationException;
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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.CuponSecretaria;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FormaPago;
import com.rjconsultores.ventaboletos.entidad.Secretaria;
import com.rjconsultores.ventaboletos.entidad.SecretariaEmpresa;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.CuponSecretariaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.FormaPagoService;
import com.rjconsultores.ventaboletos.service.SecretariaEmpresaService;
import com.rjconsultores.ventaboletos.service.SecretariaService;
import com.rjconsultores.ventaboletos.utilerias.TraslaparUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCuponSecretaria;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderSecretariaEmpresa;

/**
 *
 * @author Administrador
 */
@Controller("editarSecretariaController")
@Scope("prototype")
public class EditarSecretariaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private SecretariaService secretariaService;
	@Autowired
	private SecretariaEmpresaService secretariaEmpresaService;
	@Autowired
	private EmpresaService empresaService;
	private CuponSecretariaService cuponSecretariaService;
	private Secretaria secretaria;
	private List<CuponSecretaria> lsCuponSecretaria;
	private List<SecretariaEmpresa> lsSecretariaEmpresa;
	private List<Empresa> lsEmpresas;
	private MyListbox secretariaList;
	private MyListbox cuponSecretariaList;
	private MyListbox empresasList;
	private Textbox txtDescSecretaria;
	private Textbox txtCveSecretaria;
	private MyTextboxDecimal txtPorcdescuento;
	private MyTextboxDecimal txtPorcdescuentoOutros;
	private MyTextboxDecimal txtPorcdescuentoPedagio;
	private MyTextboxDecimal txtPorcdescuentoSeguro;
	private MyTextboxDecimal txtPorcdescuentoTaxaEmbarque;
	private MyTextboxDecimal txtPorcdescuentoSeguroOpcional;
	private Longbox txtNumfolioinicio;
	private Longbox txtNumfoliofinal;
	private Textbox txtSerie;
	private Textbox txtSubserie;
	private Longbox txtRUT;
	private Textbox txtDirSecretaria;
	private Textbox txtCiudad;
	private MyTextbox txtCNPJ;
	private Button btnApagar;
	private Button btnAdicionarCuponSecretaria;
	private Radio rdPrecioTotal;
	private Radio rdPrecioDescuento;
	private Radio rdDescuento;
	private Checkbox chkValidaFolio;
	private Checkbox chkValidaSerieSubserie;
	private Checkbox chkVoucherRod;
	private MyComboboxEstandar cmbEmpresa;
	@Autowired
	private ConstanteService constanteService;
	
	private static Logger log = LogManager.getLogger(EditarSecretariaController.class);
	
	private Row rowComboFormaPago;
	
	private Combobox cmbFormaPago;	
	private List<FormaPago> lsFormaPago;
	
	@Autowired
	private FormaPagoService formaPagoService;

	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	public Checkbox getChkValidaFolio() {
		return chkValidaFolio;
	}

	public void setChkValidaFolio(Checkbox chkValidaFolio) {
		this.chkValidaFolio = chkValidaFolio;
	}

	public MyListbox getCuponSecretariaList() {
		return cuponSecretariaList;
	}

	public void setCuponSecretariaList(MyListbox cuponSecretariaList) {
		this.cuponSecretariaList = cuponSecretariaList;
	}

	public Radio getRdDescuento() {
		return rdDescuento;
	}

	public void setRdDescuento(Radio rdDescuento) {
		this.rdDescuento = rdDescuento;
	}

	public Radio getRdPrecioDescuento() {
		return rdPrecioDescuento;
	}

	public void setRdPrecioDescuento(Radio rdPrecioDescuento) {
		this.rdPrecioDescuento = rdPrecioDescuento;
	}

	public Radio getRdPrecioTotal() {
		return rdPrecioTotal;
	}

	public void setRdPrecioTotal(Radio rdPrecioTotal) {
		this.rdPrecioTotal = rdPrecioTotal;
	}

	public Secretaria getSecretaria() {
		return secretaria;
	}

	public void setSecretaria(Secretaria secretaria) {
		this.secretaria = secretaria;
	}

	public Textbox getTxtCveSecretaria() {
		return txtCveSecretaria;
	}

	public void setTxtCveSecretaria(Textbox txtCveSecretaria) {
		this.txtCveSecretaria = txtCveSecretaria;
	}

	public Textbox getTxtDescSecretaria() {
		return txtDescSecretaria;
	}

	public void setTxtDescSecretaria(Textbox txtDescSecretaria) {
		this.txtDescSecretaria = txtDescSecretaria;
	}

	public Longbox getTxtNumfoliofinal() {
		return txtNumfoliofinal;
	}

	public void setTxtNumfoliofinal(Longbox txtNumfoliofinal) {
		this.txtNumfoliofinal = txtNumfoliofinal;
	}

	public Longbox getTxtNumfolioinicio() {
		return txtNumfolioinicio;
	}

	public void setTxtNumfolioinicio(Longbox txtNumfolioinicio) {
		this.txtNumfolioinicio = txtNumfolioinicio;
	}

	public MyTextboxDecimal getTxtPorcdescuentoOutros() {
		return txtPorcdescuentoOutros;
	}

	public void setTxtPorcdescuentoOutros(MyTextboxDecimal txtPorcdescuentoOutros) {
		this.txtPorcdescuentoOutros = txtPorcdescuentoOutros;
	}

	public MyTextboxDecimal getTxtPorcdescuentoPedagio() {
		return txtPorcdescuentoPedagio;
	}

	public void setTxtPorcdescuentoPedagio(MyTextboxDecimal txtPorcdescuentoPedagio) {
		this.txtPorcdescuentoPedagio = txtPorcdescuentoPedagio;
	}

	public MyTextboxDecimal getTxtPorcdescuentoSeguro() {
		return txtPorcdescuentoSeguro;
	}

	public void setTxtPorcdescuentoSeguro(MyTextboxDecimal txtPorcdescuentoSeguro) {
		this.txtPorcdescuentoSeguro = txtPorcdescuentoSeguro;
	}

	public MyTextboxDecimal getTxtPorcdescuentoTaxaEmbarque() {
		return txtPorcdescuentoTaxaEmbarque;
	}

	public void setTxtPorcdescuentoTaxaEmbarque(MyTextboxDecimal txtPorcdescuentoTaxaEmbarque) {
		this.txtPorcdescuentoTaxaEmbarque = txtPorcdescuentoTaxaEmbarque;
	}

	public MyTextboxDecimal getTxtPorcdescuentoSeguroOpcional() {
		return txtPorcdescuentoSeguroOpcional;
	}

	public void setTxtPorcdescuentoSeguroOpcional(MyTextboxDecimal txtPorcdescuentoSeguroOpcional) {
		this.txtPorcdescuentoSeguroOpcional = txtPorcdescuentoSeguroOpcional;
	}

	public Button getBtnAdicionarCuponSecretaria() {
		return btnAdicionarCuponSecretaria;
	}

	public void setBtnAdicionarCuponSecretaria(Button btnAdicionarCuponSecretaria) {
		this.btnAdicionarCuponSecretaria = btnAdicionarCuponSecretaria;
	}

	public Checkbox getChkVoucherRod() {
		return chkVoucherRod;
	}

	public void setChkVoucherRod(Checkbox chkVoucherRod) {
		this.chkVoucherRod = chkVoucherRod;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		secretaria = (Secretaria) Executions.getCurrent().getArg().get("secretaria");
		secretariaList = (MyListbox) Executions.getCurrent().getArg().get("secretariaList");
		// Boolean isMostraSerieSubserie = ApplicationProperties.getInstance().isSerieSubserieSecretaria();
		if (secretaria.getSecretariaId() != null) {
			lsSecretariaEmpresa = secretariaEmpresaService.buscarPorSecretaria(secretaria);
		} else {
			lsSecretariaEmpresa = new ArrayList<SecretariaEmpresa>();
		}
		lsEmpresas = empresaService.obtenerTodosIncluindoEmpresaTodas();
		
		lsFormaPago = bucarFormasPagoVoucherRodoviaria();
		
		super.doAfterCompose(comp);
		
		empresasList.setItemRenderer(new RenderSecretariaEmpresa());
		empresasList.setData(lsSecretariaEmpresa);
		cuponSecretariaList.setItemRenderer(new RenderCuponSecretaria());
		lsCuponSecretaria = new ArrayList<CuponSecretaria>();
		cuponSecretariaList.setData(lsCuponSecretaria);
		if (secretaria.getSecretariaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
			chkValidaSerieSubserie.setChecked(secretaria.getValidaSerieSubSerie() != null ? secretaria.getValidaSerieSubSerie() : Boolean.FALSE);
			onClick$chkValidaSerieSubserie(null);
			txtDirSecretaria.setText("");
		} else {
			secretaria = secretariaService.obtenerID(secretaria.getSecretariaId());
			if (secretaria.getImprimeprecio().equals(Secretaria.DESCUENTO_COBRAR)) {
				rdDescuento.setChecked(Boolean.TRUE);
			} else if (secretaria.getImprimeprecio().equals(Secretaria.PRECIO_MENOS_DESCUENTO)) {
				rdPrecioDescuento.setChecked(Boolean.TRUE);
			} else if (secretaria.getImprimeprecio().equals(Secretaria.PRECIO_TOTAL)) {
				rdPrecioTotal.setChecked(Boolean.TRUE);
			}
			// Prenche Documento
			chkValidaFolio.setChecked(secretaria.getValidafolio());
			chkValidaFolio.setDisabled(Boolean.FALSE);
			chkVoucherRod.setChecked(secretaria.getIndVoucherRod());
			
			if(secretaria.getFormaPago() != null) {
				cmbFormaPago.setValue(secretaria.getFormaPago().toString());
			}
			
			onClick$chkValidaFolio(null);
			// Prenche Serie e subserie
			chkValidaSerieSubserie.setChecked(secretaria.getValidaSerieSubSerie() == null ? false : secretaria.getValidaSerieSubSerie());
			chkValidaSerieSubserie.setDisabled(Boolean.FALSE);
			onClick$chkValidaSerieSubserie(null);
			lsCuponSecretaria = secretaria.getLsCuponSecretaria();
			cuponSecretariaList.setData(lsCuponSecretaria);
			
			txtRUT.setValue(secretaria.getRut());
			txtDirSecretaria.setText(secretaria.getDireccion());
			txtCiudad.setText(secretaria.getCiudad());
			txtCNPJ.setText(secretaria.getCnpj());
		}
		
		rowComboFormaPago.setVisible(chkVoucherRod.isChecked());
		
		insereConstrants();
		txtDescSecretaria.focus();
		
	}

	private List<FormaPago> bucarFormasPagoVoucherRodoviaria() {
		try {
			List<FormaPago> listaTodasFormasPago = formaPagoService.obtenerTodos();
			
			List<FormaPago> formaPagoVoucher = new ArrayList<FormaPago>();
			
			for(FormaPago fp : listaTodasFormasPago) {
				if(fp.getIndVoucherRodoviaria()) {
					formaPagoVoucher.add(fp);
				}
			}
			
			return formaPagoVoucher;
		} catch (Exception e) {
			log.error("Erro ao buscar formas de pagamento: ", e);
		}
		return null;
	}

	public void onClick$btnRemoverEmpresa(Event ev) throws InterruptedException {
		if (empresasList.getSelectedItem() == null) {
			org.zkoss.zul.Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.selecionarEmpresa"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
			return;
		}
		SecretariaEmpresa se = (SecretariaEmpresa) empresasList.getSelected();
		secretariaEmpresaService.borrar(se);
		secretaria.removeEmpresa(se);
		empresasList.setData(secretaria.getEmpresas());
	}

	public void onClick$btnAdicionarEmpresa(Event ev) throws InterruptedException {
		if (cmbEmpresa.getSelectedItem() == null) {
			org.zkoss.zul.Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.selecionarEmpresa"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
			return;
		}
		Empresa e = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		secretaria.addEmpresa(e);
		empresasList.setData(secretaria.getEmpresas());
	}

	public void onClick$chkValidaFolio(Event ev) {
		if (chkValidaFolio.isChecked()) {
			txtNumfolioinicio.setDisabled(Boolean.FALSE);
			txtNumfoliofinal.setDisabled(Boolean.FALSE);
			txtNumfolioinicio.setConstraint("no empty, no negative, no zero");
			txtNumfoliofinal.setConstraint("no empty, no negative, no zero");
		} else {
			txtNumfolioinicio.setConstraint("");
			txtNumfoliofinal.setConstraint("");
			txtNumfolioinicio.setValue(null);
			txtNumfoliofinal.setValue(null);
			txtNumfolioinicio.setDisabled(Boolean.TRUE);
			txtNumfoliofinal.setDisabled(Boolean.TRUE);
		}
	}

	public void onClick$chkValidaSerieSubserie(Event ev) {
		if (chkValidaSerieSubserie.isChecked()) {
			txtSerie.setConstraint("no empty");
			txtSubserie.setConstraint("no empty");
			txtSerie.setDisabled(Boolean.FALSE);
			txtSubserie.setDisabled(Boolean.FALSE);
		} else {
			txtSerie.setConstraint("");
			txtSubserie.setConstraint("");
			txtSerie.setValue(null);
			txtSubserie.setValue(null);
			txtSerie.setDisabled(Boolean.TRUE);
			txtSubserie.setDisabled(Boolean.TRUE);
		}
	}

	@SuppressWarnings("deprecation")
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		txtDescSecretaria.getValue();
		txtCveSecretaria.getValue();
		cmbFormaPago.getValue();
		
		try {
			if (isCnpjObrigatorioOrdemDeSevico() && StringUtils.isBlank(txtCNPJ.getText())) {
				String msg = "editarSecretariaController.cnjp.CNPJincorreto";
				Messagebox.show(Labels.getLabel(msg), Labels.getLabel("editarSecretariaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return;
			} else if (!(!isCnpjObrigatorioOrdemDeSevico() && StringUtils.isBlank(txtCNPJ.getText()))) {
				if (!validarCPFCNPJ(txtCNPJ.getText())) {
					txtCNPJ.focus();
					return;
				} else {
					secretaria.setCnpj(txtCNPJ.getText());
				}
			}
			
			FormaPago formaPago = cmbFormaPago.getSelectedItem() != null ? (FormaPago) cmbFormaPago.getSelectedItem().getValue() : null;
			
			if(chkVoucherRod.isChecked() && formaPago == null) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("editarSecretariaController.MSG.voucherRodSemFormaPago.value"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
			
			if(chkVoucherRod.isChecked() && formaPago != null) {
				Secretaria voucher = secretariaService.buscarSecretariaVoucherRod(formaPago.getFormapagoId());
				
				if (voucher != null && !secretaria.equals(voucher) && chkVoucherRod.isChecked()){
					org.zkoss.zul.Messagebox.show(
							Labels.getLabel("editarSecretariaController.MSG.voucherRodDuplicado.value"),
							Labels.getLabel("editarSecretariaController.window.title"),
							org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
					return;
				}
			}
			
			if (lsCuponSecretaria.isEmpty()) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("editarSecretariaController.MSG.necessaitaPorcentaje.value"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
			secretaria.setActivo(true);
			secretaria.setFecmodif(Calendar.getInstance().getTime());
			secretaria.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			secretaria.setLsCuponSecretaria(lsCuponSecretaria);
			secretaria.setValidafolio(chkValidaFolio.isChecked());
			secretaria.setValidaSerieSubSerie(chkValidaSerieSubserie.isChecked());
			
			secretaria.setIndVoucherRod(chkVoucherRod.isChecked());
			
			if(chkVoucherRod.isChecked() && formaPago != null) {
				secretaria.setFormaPago(formaPago);				
			}
			
			secretaria.setRut(txtRUT.getValue());
			secretaria.setCiudad(txtCiudad.getText());
			secretaria.setDireccion(txtDirSecretaria.getText());
			if (rdDescuento.isChecked()) {
				secretaria.setImprimeprecio(Secretaria.DESCUENTO_COBRAR);
			} else if (rdPrecioDescuento.isChecked()) {
				secretaria.setImprimeprecio(Secretaria.PRECIO_MENOS_DESCUENTO);
			} else if (rdPrecioTotal.isChecked()) {
				secretaria.setImprimeprecio(Secretaria.PRECIO_TOTAL);
			}
		
			boolean podeSalvar = false;
			List<Secretaria> lsSecretaria = secretariaService.buscar(secretaria.getDescsecretaria());
			if (lsSecretaria.isEmpty()) {
				podeSalvar = true;
			} else {
				for (Secretaria s : lsSecretaria) {
					if (s.getSecretariaId().equals(secretaria.getSecretariaId())) {
						podeSalvar = true;
					}
				}
			}
			if (podeSalvar) {
				if (secretaria.getSecretariaId() == null) {
					secretariaService.suscribir(secretaria);
					secretariaList.addItem(secretaria);
				} else {
					secretariaService.actualizacion(secretaria);
					secretariaList.updateItem(secretaria);
				}
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("editarSecretariaController.MSG.suscribirOK"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);

				closeWindow();
			} else {
				mostraMensagemRegistroExistente();
			}
		} catch (Exception ex) {
			EditarSecretariaController.log.error("", ex);
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarSecretariaController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.ERROR);

		}
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		try {
			int resp = org.zkoss.zul.Messagebox.show(
					Labels.getLabel("editarSecretariaController.MSG.borrarPergunta"),
					Labels.getLabel("editarSecretariaController.window.title"),
					org.zkoss.zul.Messagebox.YES | org.zkoss.zul.Messagebox.NO, org.zkoss.zul.Messagebox.QUESTION);
			if (resp == org.zkoss.zul.Messagebox.YES) {
				secretariaService.borrar(secretaria);
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("editarSecretariaController.MSG.borrarOK"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
				secretariaList.removeItem(secretaria);
				closeWindow();
			}
		} catch (Exception ex) {
			EditarSecretariaController.log.error("", ex);
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarSecretariaController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarCuponSecretaria(Event ev) throws InterruptedException {
		txtPorcdescuento.getValue();
		if (txtPorcdescuento.getValueDecimal().compareTo(new BigDecimal("100")) > 0) {
			Clients.wrongValue(txtPorcdescuento, Labels.getLabel("MSG.Porcentaje"));
			return;
		}
		try {
			txtNumfolioinicio.getValue();
			txtNumfoliofinal.getValue();
			BigDecimal porcdescuento = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuento.getValue()));
			BigDecimal porcdescuentoOutros = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoOutros.getValue()));
			BigDecimal porcdescuentoPedagio = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoPedagio.getValue()));
			BigDecimal porcdescuentoSeguro = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoSeguro.getValue()));
			BigDecimal porcdescuentoTaxaEmbarque = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoTaxaEmbarque.getValue()));
			BigDecimal porcdescuentoSeguroOpcional = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoSeguroOpcional.getValue()));
			Long numfolioinicio = txtNumfolioinicio.getValue();
			Long numfoliofinal = txtNumfoliofinal.getValue();
			String serie = null;
			String subserie = null;
			try{
				serie = txtSerie.getValue() != null ? txtSerie.getValue().trim() : null;
			}catch(WrongValueException wve){
				org.zkoss.zul.Messagebox.show(
						"Serie: "+wve.getMessage(),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
			try{
				subserie = txtSubserie.getValue() != null ? txtSubserie.getValue() : null;
			}catch(WrongValueException wve){
				org.zkoss.zul.Messagebox.show(
						"Sub Serie: "+wve.getMessage(),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
			if (chkValidaFolio.isChecked() && (numfolioinicio > numfoliofinal)) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("MSG.Folios"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
			if (chkValidaSerieSubserie.isChecked() && (StringUtils.isEmpty(txtSerie.getValue()) ||
					StringUtils.isEmpty(txtSubserie.getValue()))) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("MSG.Folios"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
			Boolean achouCupon = Boolean.FALSE;
			if (chkValidaFolio.isChecked() || chkValidaSerieSubserie.isChecked()) {
				achouCupon = validaCuponExistente(porcdescuento, numfolioinicio, numfoliofinal, serie, subserie);
				if (achouCupon == null) {
					return;
				}
				if (chkValidaFolio.isChecked()) {
					int resp = registroDuplicadoIntersecao(numfolioinicio, numfoliofinal);
					if (resp != 0) {
						org.zkoss.zul.Messagebox.show(
								(resp == 1) ? Labels.getLabel("MSG.Registro.Existe") : Labels.getLabel("editarSecretariaController.MSG.registroTraslapado"),
								Labels.getLabel("editarSecretariaController.window.title"),
								org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
						insereConstrants();
						return;
					}
				}
			}
			if (!achouCupon) {
				CuponSecretaria cd = new CuponSecretaria();
				cd.setActivo(Boolean.TRUE);
				cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				cd.setFecmodif(Calendar.getInstance().getTime());
				cd.setPorcdescuento(porcdescuento);
				cd.setPorcdescuentooutros(porcdescuentoOutros);
				cd.setPorcdescuentopedagio(porcdescuentoPedagio);
				cd.setPorcdescuentoseguro(porcdescuentoSeguro);
				cd.setPorcdescuentotaxaembarque(porcdescuentoTaxaEmbarque);
				cd.setPorcdescuentoseguroopcional(porcdescuentoSeguroOpcional);
				cd.setNumfolioinicio(numfolioinicio);
				cd.setNumfoliofinal(numfoliofinal);
				cd.setSerie(serie);
				cd.setSubserie(subserie);
				lsCuponSecretaria.add(cd);
				cuponSecretariaList.setData(lsCuponSecretaria);
				secretaria.setLsCuponSecretaria(lsCuponSecretaria);
				removeConstrants();
				reiniciaCamposTexto();
				insereConstrants();
			} else {
				mostraMensagemRegistroExistente();
			}


		} catch (Exception ex) {
			EditarSecretariaController.log.error("", ex);
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarSecretariaController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.ERROR);
		}
	}

	/**
	 * Reinicia os valores do campo de texto.
	 */
	private void reiniciaCamposTexto() {
		txtPorcdescuento.setText(null);
		txtPorcdescuentoOutros.setText("0");
		txtPorcdescuentoPedagio.setText("0");
		txtPorcdescuentoSeguro.setText("0");
		txtPorcdescuentoTaxaEmbarque.setText("0");
		txtPorcdescuentoSeguroOpcional.setText("0");
		txtNumfolioinicio.setValue(null);
		txtNumfoliofinal.setValue(null);
		txtSerie.setValue(null);
		txtSubserie.setValue(null);
	}

	/**
	 * Remove Connstrants dos campos de texto
	 */
	private void removeConstrants() {
		txtSerie.setConstraint("");
		txtSubserie.setConstraint("");
		txtPorcdescuento.setConstraint("");
		txtNumfolioinicio.setConstraint("");
		txtNumfoliofinal.setConstraint("");
	}

	/**
	 * Insere cosntrants dos campos de texto.
	 */
	private void insereConstrants() {
		txtPorcdescuento.setConstraint("no empty");
		if (chkValidaFolio.isChecked()) {
			txtNumfolioinicio.setConstraint("no empty, no negative, no zero");
			txtNumfoliofinal.setConstraint("no empty, no negative, no zero");
		}
		if (chkValidaSerieSubserie.isChecked()) {
			txtSerie.setConstraint("no empty");
			txtSubserie.setConstraint("no empty");
		}
	}

	private void mostraMensagemRegistroExistente() throws InterruptedException {
		org.zkoss.zul.Messagebox.show(
				Labels.getLabel("MSG.Registro.Existe"),
				Labels.getLabel("editarSecretariaController.window.title"),
				org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
	}

	/**
	 * 
	 * Valida se existe Fólio cadastrado para Cupon Secretaria informado.
	 * 
	 * @param porcdescuento
	 * @param numfolioinicio
	 * @param numfoliofinal
	 * @param achouFolio
	 * @param cds
	 * @return
	 * @throws InterruptedException
	 */
	private Boolean validaFolioCuponSecretaria(BigDecimal porcdescuento, Long numfolioinicio, Long numfoliofinal, Boolean achouFolio, CuponSecretaria cds) throws InterruptedException {
		if (cds.getNumfoliofinal() != null
				&& cds.getNumfolioinicio() != null) {
			if (cds.getNumfoliofinal().equals(numfoliofinal)
					&& cds.getNumfolioinicio().equals(numfolioinicio)
					&& cds.getPorcdescuento().equals(porcdescuento)) {
				achouFolio = Boolean.TRUE;
			}
		} else {
			if (cds.getNumfolioinicio() == null && cds.getNumfoliofinal() == null) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("editarSecretariaController.MSG.necessarioRemoverCupon.value"),
						Labels.getLabel("editarSecretariaController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return null;
			}
		}
		return achouFolio;
	}

	/**
	 * Valida se existe Cupon Secretaria para os dados informados.
	 * 
	 * @param porcdescuento
	 * @param numfolioinicio
	 * @param numfoliofinal
	 * @param serie
	 * @param subserie
	 * @return
	 * @throws InterruptedException
	 */
	private Boolean validaCuponExistente(BigDecimal porcdescuento, Long numfolioinicio, Long numfoliofinal, String serie, String subserie) throws InterruptedException {
		Boolean achouFolio = Boolean.FALSE;
		for (CuponSecretaria cds : secretaria.getLsCuponSecretaria()) {
			if (chkValidaSerieSubserie.isChecked()) {
				if (StringUtils.isNotEmpty(cds.getSerie()) && StringUtils.isNotEmpty(cds.getSubserie())) {
					if (cds.getSerie().trim().equals(serie)
							&& cds.getSubserie().trim().equals(subserie)) {
						if (getChkValidaFolio().isChecked()) {
							Boolean isValidaCupon = validaFolioCuponSecretaria(porcdescuento, numfolioinicio, numfoliofinal, achouFolio, cds);
							if (isValidaCupon == null) {
								return null;
							} else {
								return isValidaCupon;
							}
						} else {
							return Boolean.TRUE;
						}
					}
				}
			} else {
				achouFolio = validaFolioCuponSecretaria(porcdescuento, numfolioinicio, numfoliofinal, achouFolio, cds);
				if (achouFolio == null) {
					return null;
				} else {
					return achouFolio;
				}

			}
		}
		return Boolean.FALSE;
	}

	/**
	 * Valida se o registro está duplicado ou se os período do flio informado se sobrepõe a outro já existentes.
	 *
	 * @return 0 - Esta ok 1 - Registro duplicado 2 - Registro traslapado
	 * @throws InterruptedException
	 */
	private int registroDuplicadoIntersecao(Long folioIni, Long folioFin) throws InterruptedException {
		Collections.sort(lsCuponSecretaria, new Comparator<CuponSecretaria>() {
			@Override
			public int compare(CuponSecretaria o1, CuponSecretaria o2) {
				if (o1.getNumfolioinicio() != null) {
					return o1.getNumfolioinicio().compareTo(o2.getNumfoliofinal());
				} else {
					return -1;
				}
			}
		});
		for (CuponSecretaria pv : lsCuponSecretaria) {
			if (!pv.getActivo() || (pv.getNumfolioinicio() == null && pv.getNumfoliofinal() == null)) {
				continue;
			}
			if (TraslaparUtil.intersectNum(pv.getNumfolioinicio().longValue(), pv.getNumfoliofinal().longValue(),
					folioIni, folioFin)) {
				return 2;
			}
		}
		return 0;
	}

	public void onClick$btnRemoverCuponSecretaria(Event ev) {
		CuponSecretaria cd = (CuponSecretaria) cuponSecretariaList.getSelected();
		if (cd != null) {
			cd.setActivo(Boolean.FALSE);
			cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			cd.setFecmodif(Calendar.getInstance().getTime());
			if (cd.getCuponsecretariaId() != null) {
				cuponSecretariaService.borrar(cd);
			}
			lsCuponSecretaria.remove(cd);
			if (lsCuponSecretaria.isEmpty()) {
				btnAdicionarCuponSecretaria.setDisabled(Boolean.FALSE);
				chkValidaFolio.setDisabled(Boolean.FALSE);
			}
			cuponSecretariaList.setData(lsCuponSecretaria);
			secretaria.setLsCuponSecretaria(lsCuponSecretaria);
		}
	}
	
	private boolean validarCPFCNPJ(String numDoc) {
		try {
			String msg = "";
			if (numDoc == null || StringUtils.isBlank(numDoc) || numDoc.length() != 14) {
				msg = "editarSecretariaController.cnjp.CNPJincorreto";
			} else {

				numDoc = numDoc.trim();			
				if (!isCNPJValido(numDoc)) {
					msg = "editarSecretariaController.cnjp.CNPJincorreto";
				}
			}

			if (StringUtils.isNotBlank(msg)) {
				Messagebox.show(Labels.getLabel(msg), Labels.getLabel("editarSecretariaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return false;
			}

			return true;
		} catch (Exception e) {
			log.error("Erro ao validar CPF/CNPJ: ", e);
			return false;
		}
	}
	
	
	private Boolean isCNPJValido(String numDoc) {
		try {
			Cnpj cnpj = new Cnpj(numDoc);					
			if(!cnpj.isValid()) {
				return false;						
			}
		} catch (ValidationException e) {
			return false;		
		}
		
		return true;
	}
	
	public Boolean isCnpjObrigatorioOrdemDeSevico() {
		Constante constante = constanteService.buscarPorNomeConstante(Constantes.CNPJ_OBRIGATORIO_ORDEN_SERVICO);
		if(constante != null) {
			return Boolean.valueOf(constante.getValorconstante());
		}
		return false;
	}
	

	public void onCheck$chkVoucherRod(Event event) {
		rowComboFormaPago.setVisible(chkVoucherRod.isChecked());
	}
	
	public List<SecretariaEmpresa> getLsSecretariaEmpresa() {
		return lsSecretariaEmpresa;
	}

	public void setLsSecretariaEmpresa(List<SecretariaEmpresa> lsSecretariaEmpresa) {
		this.lsSecretariaEmpresa = lsSecretariaEmpresa;
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public Checkbox getChkValidaSerieSubserie() {
		return chkValidaSerieSubserie;
	}

	public void setChkValidaSerieSubserie(Checkbox chkValidaSerieSubserie) {
		this.chkValidaSerieSubserie = chkValidaSerieSubserie;
	}

	public Textbox getTxtSerie() {
		return txtSerie;
	}

	public void setTxtSerie(Textbox txtSerie) {
		this.txtSerie = txtSerie;
	}

	public Textbox getTxtSubserie() {
		return txtSubserie;
	}

	public void setTxtSubserie(Textbox txtSubserie) {
		this.txtSubserie = txtSubserie;
	}

	public Longbox getTxtRUT() {
		return txtRUT;
	}

	public void setTxtRUT(Longbox txtRut) {
		this.txtRUT = txtRut;
	}

	public Textbox getTxtDirSecretaria() {
		return txtDirSecretaria;
	}

	public void setTxtDirSecretaria(Textbox txtDirSecretaria) {
		this.txtDirSecretaria = txtDirSecretaria;
	}

	public Textbox getTxtCiudad() {
		return txtCiudad;
	}

	public void setTxtCiudad(Textbox txtCiudad) {
		this.txtCiudad = txtCiudad;
	}

	public List<FormaPago> getLsFormaPago() {
		return lsFormaPago;
	}

	public void setLsFormaPago(List<FormaPago> lsFormaPago) {
		this.lsFormaPago = lsFormaPago;
	}

	public Combobox getCmbFormaPago() {
		return cmbFormaPago;
	}

	public void setCmbFormaPago(Combobox cmbFormaPago) {
		this.cmbFormaPago = cmbFormaPago;
	}
}
