From 482261845ec352d4b8af011e4d64fc9279449cb2 Mon Sep 17 00:00:00 2001 From: Alberto Trevezani Date: Wed, 1 Nov 2023 11:25:51 -0300 Subject: [PATCH 01/15] =?UTF-8?q?Rotinas=20para=20gerar=20a=20libera=C3=A7?= =?UTF-8?q?=C3=A3o=20da=20utiliza=C3=A7=C3=A3o=20da=20empresa=20no=20siste?= =?UTF-8?q?ma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 9 ++ .../web/utilerias/security/AESGSMHelper.java | 106 +++++++++++++ .../security/SecurityEmpresaToken.java | 140 ++++++++++++++++++ .../security/exception/SecurityException.java | 13 ++ .../tests/SecurityEmpresaTokenTest.java | 91 ++++++++++++ ...aTest.java => SerieEmbarcadaTest.java.old} | 0 6 files changed, 359 insertions(+) create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/security/AESGSMHelper.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/security/exception/SecurityException.java create mode 100644 tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java rename tests/com/rjconsultores/tests/{SerieEmbarcadaTest.java => SerieEmbarcadaTest.java.old} (100%) diff --git a/pom.xml b/pom.xml index f2f0737be..5220d9f91 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,15 @@ + tests + + + tests + + **/*.java + + + maven-compiler-plugin diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/AESGSMHelper.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/AESGSMHelper.java new file mode 100644 index 000000000..bc7f43653 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/AESGSMHelper.java @@ -0,0 +1,106 @@ +package com.rjconsultores.ventaboletos.web.utilerias.security; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +public class AESGSMHelper { + private final String SECRET_KEY = "RJ@2019#c0n5ul10r35"; + private final String SALT = "HrqoFr44GtkAhhYN+jP8Ag=="; + private final String ENCRYPT_ALGO = "AES/GCM/NoPadding"; + private final int TAG_LENGTH_BIT = 128; + private final int IV_LENGTH_BYTE = 12; + + private final Charset UTF_8 = StandardCharsets.UTF_8; + + public String encrypt(String value) throws Exception { + SecretKey secret = getAESKeyFromPassword(SECRET_KEY.toCharArray()); + + byte[] pText = value.getBytes(StandardCharsets.UTF_8); + byte[] iv = getRandomNonce(12); + byte[] cipherText = encrypt(pText, secret, iv); + + byte[] cipherTextWithIv = ByteBuffer.allocate(iv.length + cipherText.length) + .put(iv) + .put(cipherText) + .array(); + + return hex(cipherTextWithIv); + } + + private byte[] encrypt(byte[] pText, SecretKey secret, byte[] iv) throws Exception { + Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO); + cipher.init(Cipher.ENCRYPT_MODE, secret, new GCMParameterSpec(TAG_LENGTH_BIT, iv)); + + byte[] encryptedText = cipher.doFinal(pText); + + return encryptedText; + + } + + public String decrypt(String value) throws Exception { + SecretKey secret = getAESKeyFromPassword(SECRET_KEY.toCharArray()); + + byte[] cText = unhex(value); + + ByteBuffer bb = ByteBuffer.wrap(cText); + + byte[] iv = new byte[IV_LENGTH_BYTE]; + bb.get(iv); + + byte[] cipherText = new byte[bb.remaining()]; + bb.get(cipherText); + + String plainText = decrypt(cipherText, secret, iv); + + return plainText; + } + + private String decrypt(byte[] cText, SecretKey secret, byte[] iv) throws Exception { + Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO); + cipher.init(Cipher.DECRYPT_MODE, secret, new GCMParameterSpec(TAG_LENGTH_BIT, iv)); + + byte[] plainText = cipher.doFinal(cText); + + return new String(plainText, UTF_8); + } + + private byte[] getRandomNonce(int numBytes) { + byte[] nonce = new byte[numBytes]; + new SecureRandom().nextBytes(nonce); + + return nonce; + } + + private SecretKey getAESKeyFromPassword(char[] password) throws NoSuchAlgorithmException, InvalidKeySpecException { + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); + + KeySpec spec = new PBEKeySpec(password, SALT.getBytes(), 65536, 256); + SecretKeySpec secret = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES"); + + return secret; + } + + private String hex(byte[] bytes) { + char[] result = Hex.encodeHex(bytes); + return new String(result); + } + + private byte[] unhex(String hex) throws DecoderException { + return Hex.decodeHex(hex.toCharArray()); + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java new file mode 100644 index 000000000..533537fa1 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java @@ -0,0 +1,140 @@ +package com.rjconsultores.ventaboletos.web.utilerias.security; + +import java.text.ParseException; +import java.time.Duration; +import java.util.Calendar; + +import javax.xml.bind.DatatypeConverter; + +import org.apache.log4j.Logger; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.nimbusds.jose.JWSAlgorithm; +import com.nimbusds.jose.JWSHeader; +import com.nimbusds.jose.JWSObject; +import com.nimbusds.jose.Payload; +import com.nimbusds.jose.crypto.MACSigner; +import com.nimbusds.jwt.JWTClaimsSet; + +import net.minidev.json.JSONObject; + +public class SecurityEmpresaToken { + private static Logger log = Logger.getLogger(SecurityEmpresaToken.class); + + private String secret = "#KO&Fm4_k.sU9M8`6Mx'F\\\"H:*Qxu]6F4r,)JmZ2Jwafd)I.2[RET'1:)VQ6mG9,"; + private static final Duration ttl = Duration.ofHours(24); + + private Gson gson = new Gson(); + + public String bodyRequestGenerate(final Integer empresaId, final String cnpj) throws SecurityException { + try { + AESGSMHelper crypto = new AESGSMHelper(); + + JsonObject json = new JsonObject(); + json.addProperty("empresaId", empresaId); + json.addProperty("CNPJ", cnpj); + + return crypto.encrypt(json.toString()); + + } catch (Exception e) { + log.error("Erro ao gerar o body usado no request da licença: " + e.getMessage(), e); + + throw new SecurityException(e); + } + } + + public String licenseDefaultGenerate(final Integer empresaId, final String cnpj) throws SecurityException { + try { + AESGSMHelper crypto = new AESGSMHelper(); + + JsonObject json = new JsonObject(); + json.addProperty("empresaId", empresaId); + json.addProperty("CNPJ", cnpj); + json.addProperty("aprovado", 1); + + return crypto.encrypt(json.toString()); + + } catch (Exception e) { + log.error("Erro ao gerar a licença padrão para as empresas existentes: " + e.getMessage(), e); + + throw new SecurityException(e); + } + } + + public boolean licenseValidate(final String license, final Integer empresaId, final String cnpj) { + try { + AESGSMHelper crypto = new AESGSMHelper(); + + final String value = crypto.decrypt(license); + final JsonObject json = gson.fromJson(value, JsonObject.class); + + if (json.has("empresaId") && json.get("empresaId").getAsInt() == empresaId.intValue() + && json.has("CNPJ") && json.get("CNPJ").getAsString().equals(cnpj) + && json.has("aprovado")) { + log.debug("[empresaId=" + json.get("empresaId").getAsString() + ", CNPJ=" + json.get("CNPJ").getAsString() + ", aprovado=" + json.get("aprovado").getAsString() + "]"); + + return json.get("aprovado").getAsString().equals("1"); + } + } catch (Exception e) { + log.error("Erro ao gerar o body usado no request da licença: " + e.getMessage(), e); + } + + return false; + } + + public String requestGenerate(String licenseRequest) throws SecurityException { + return requestGenerate(licenseRequest, ttl); + } + + public String requestGenerate(String licenseRequest, Duration ttl) throws SecurityException { + try { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MILLISECOND, (int) ttl.toMillis()); + + JWTClaimsSet claims = new JWTClaimsSet.Builder() + .expirationTime(cal.getTime()) + .claim("sub", licenseRequest) + .claim("userId", "adm") + .claim("role", "ROLE_TOKEN") + .build(); + + JWSObject jwsObject = new JWSObject(new JWSHeader(JWSAlgorithm.HS256), new Payload(claims.toJSONObject())); + + jwsObject.sign(new MACSigner(DatatypeConverter.parseBase64Binary(secret))); + + return jwsObject.serialize(); + } catch (Exception e) { + log.error("Erro ao gerar a request: " + e.getMessage(), e); + + throw new SecurityException(e); + } + } + + public String tokenValidate(final String token) throws SecurityException { + try { + JWSObject jwsObject = JWSObject.parse(token); + JSONObject jsonPayload = jwsObject.getPayload().toJSONObject(); + JWTClaimsSet claims = JWTClaimsSet.parse(jsonPayload); + + if (claims.getExpirationTime().compareTo(Calendar.getInstance().getTime()) < 0) { + throw new SecurityException("Token expirado"); + } + + return claims.getSubject(); + + } catch (SecurityException e) { + throw e; + + } catch (ParseException e) { + log.error("Erro no parser do token: " + e.getMessage(), e); + + throw new SecurityException(e); + + } catch (Exception e) { + log.error("Erro ao validar o token: " + e.getMessage(), e); + + throw new SecurityException(e); + } + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/exception/SecurityException.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/exception/SecurityException.java new file mode 100644 index 000000000..ca6b559f9 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/exception/SecurityException.java @@ -0,0 +1,13 @@ +package com.rjconsultores.ventaboletos.web.utilerias.security.exception; + +public class SecurityException extends Exception { + private static final long serialVersionUID = 1801174850577435303L; + + public SecurityException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + + public SecurityException(String arg0) { + super(arg0); + } +} diff --git a/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java b/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java new file mode 100644 index 000000000..82de6e409 --- /dev/null +++ b/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java @@ -0,0 +1,91 @@ +package com.rjconsultores.tests; + +import static org.junit.Assert.fail; + +import java.time.Duration; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.rjconsultores.ventaboletos.web.utilerias.security.SecurityEmpresaToken; + +public class SecurityEmpresaTokenTest { + private static final Logger log = LoggerFactory.getLogger(SecurityEmpresaTokenTest.class); + + @Before + public void initApplicationContext() { + log.info("[ BEGIN ]"); + } + + @After + public void closeApplicationContext() { + log.info("[ END ]"); + } + + @Test + public void test_EmpresaNova() throws Exception { + // license request -> token request -> token response -> license + + Integer empresaId = 1313; + String cnpj = "00073778000120"; + + SecurityEmpresaToken security = new SecurityEmpresaToken(); + + final String bodyRequest = security.bodyRequestGenerate(empresaId, cnpj); + final String request = security.requestGenerate(bodyRequest); + + final String license = security.tokenValidate(request); + final boolean valid = security.licenseValidate(license, empresaId, cnpj); + + log.info("Body Request: " + bodyRequest); + log.info("Request: " + request); + log.info("License: " + license); + log.info("Valid: " + Boolean.toString(valid)); + + if (valid) fail("Licença válida"); + } + + @Test + public void test_Licenca() throws Exception { + Integer empresaId = 1313; + String cnpj = "00073778000120"; + + SecurityEmpresaToken security = new SecurityEmpresaToken(); + + final String license = security.licenseDefaultGenerate(empresaId, cnpj); + final boolean valid = security.licenseValidate(license, empresaId, cnpj); + + log.info("License: " + license); + log.info("Valid: " + Boolean.toString(valid)); + + if (!valid) fail("Licença inválida"); + } + + @Test(expected = SecurityException.class) + public void test_TTL_expired() throws Exception { + Duration ttl = Duration.ofSeconds(5); + + Integer empresaId = 1313; + String cnpj = "00073778000120"; + + SecurityEmpresaToken security = new SecurityEmpresaToken(); + + final String bodyRequest = security.bodyRequestGenerate(empresaId, cnpj); + final String request = security.requestGenerate(bodyRequest, ttl); + + Thread.sleep(Duration.ofSeconds(10).toMillis()); + + final String license = security.tokenValidate(request); + final boolean valid = security.licenseValidate(license, empresaId, cnpj); + + log.info("Body Request: " + bodyRequest); + log.info("Request: " + request); + log.info("License: " + license); + log.info("Valid: " + Boolean.toString(valid)); + + if (valid) fail("Licença válida"); + } +} diff --git a/tests/com/rjconsultores/tests/SerieEmbarcadaTest.java b/tests/com/rjconsultores/tests/SerieEmbarcadaTest.java.old similarity index 100% rename from tests/com/rjconsultores/tests/SerieEmbarcadaTest.java rename to tests/com/rjconsultores/tests/SerieEmbarcadaTest.java.old From 61aef7b8cb9a229628018276c3cfffcde55692b3 Mon Sep 17 00:00:00 2001 From: Alberto Trevezani Date: Fri, 3 Nov 2023 18:02:03 -0300 Subject: [PATCH 02/15] =?UTF-8?q?Ajuste=20TTL=20e=20adicionado=20teste=20d?= =?UTF-8?q?e=20token=20gerado=20pelo=20servi=C3=A7o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/SecurityEmpresaToken.java | 2 +- .../tests/SecurityEmpresaTokenTest.java | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java index 533537fa1..3fe1f432c 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/security/SecurityEmpresaToken.java @@ -23,7 +23,7 @@ public class SecurityEmpresaToken { private static Logger log = Logger.getLogger(SecurityEmpresaToken.class); private String secret = "#KO&Fm4_k.sU9M8`6Mx'F\\\"H:*Qxu]6F4r,)JmZ2Jwafd)I.2[RET'1:)VQ6mG9,"; - private static final Duration ttl = Duration.ofHours(24); + private static final Duration ttl = Duration.ofDays(7); private Gson gson = new Gson(); diff --git a/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java b/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java index 82de6e409..ccb6edd43 100644 --- a/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java +++ b/tests/com/rjconsultores/tests/SecurityEmpresaTokenTest.java @@ -25,6 +25,31 @@ public class SecurityEmpresaTokenTest { log.info("[ END ]"); } + @Test + public void test_Token() throws Exception { + // license request -> token request -> token response -> license + + Integer empresaId = 1313; + String cnpj = "00073778000120"; + + SecurityEmpresaToken security = new SecurityEmpresaToken(); + + final String bodyRequest = security.bodyRequestGenerate(empresaId, cnpj); + final String request = security.requestGenerate(bodyRequest); + + final String reponse = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4ZTY2MGVmOTQwMGRlNjU2MmQ1MjljZTVkZDMyZDU0NmM2OGU5YTk0NTUwYjUyNzc4MDhjNWIxMjgzNzkwNjVlNzI0NWU2ZTMxNzBjMTQ2ZGVlOWUyNGQwZjc1YzMwYTVmM2JlYmY5NjY0YzZiNWNiYjU3NTk1NzVmOGYzMTk4OTljNmVmODNkZDc3NmI4YjM2MGM1NDE3N2RhMzFkMDAzNTA5ZDFlIiwiZXhwIjoxNjk5NjQ5OTQ1LCJ1c2VySWQiOiJhZG0iLCJyb2xlIjoiUk9MRV9UT0tFTiJ9.0WFPKf6RcpPYle4Rgq_D-GScwhkw_Q4pmCvNCL_INfg"; + + final String license = security.tokenValidate(reponse); + final boolean valid = security.licenseValidate(license, empresaId, cnpj); + + log.info("Body Request: " + bodyRequest); + log.info("Request: " + request); + log.info("License: " + license); + log.info("Valid: " + Boolean.toString(valid)); + + if (!valid) fail("Licença inválida"); + } + @Test public void test_EmpresaNova() throws Exception { // license request -> token request -> token response -> license @@ -75,14 +100,15 @@ public class SecurityEmpresaTokenTest { final String bodyRequest = security.bodyRequestGenerate(empresaId, cnpj); final String request = security.requestGenerate(bodyRequest, ttl); + + log.info("Body Request: " + bodyRequest); + log.info("Request: " + request); Thread.sleep(Duration.ofSeconds(10).toMillis()); final String license = security.tokenValidate(request); final boolean valid = security.licenseValidate(license, empresaId, cnpj); - log.info("Body Request: " + bodyRequest); - log.info("Request: " + request); log.info("License: " + license); log.info("Valid: " + Boolean.toString(valid)); From 7211d9f48bb6e139ba6651f9d87e3bc97e384f50 Mon Sep 17 00:00:00 2001 From: "valdir.cordeiro" Date: Fri, 10 Nov 2023 10:37:49 -0300 Subject: [PATCH 03/15] =?UTF-8?q?bug#al-3254=2066363=20-=20Servi=C3=A7os?= =?UTF-8?q?=20-=20Ajustes=20na=20Tela=20de=20Configura=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20Servi=C3=A7o=20na=20ADM=20dev:=20qua:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- .../BusquedaCorridaController.java | 272 ++++++++++++++- .../render/RenderConfiguracionCorrida.java | 326 +++++++++++++----- src/java/spring-config.xml | 3 +- .../esquema_operacional/busquedaCorrida.zul | 30 +- 5 files changed, 520 insertions(+), 117 deletions(-) diff --git a/pom.xml b/pom.xml index 11c03fdde..445bf0d69 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,12 @@ 4.0.0 br.com.rjconsultores ventaboletosadm - 1.27.2 + 1.28.0 war - 1.19.1 - 1.16.0 + 1.20.0 + 1.17.0 UTF-8 UTF-8 diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/esquemaoperacional/BusquedaCorridaController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/esquemaoperacional/BusquedaCorridaController.java index 44a34c6de..1a6c78b59 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/esquemaoperacional/BusquedaCorridaController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/esquemaoperacional/BusquedaCorridaController.java @@ -5,6 +5,7 @@ package com.rjconsultores.ventaboletos.web.gui.controladores.esquemaoperacional; import java.sql.Time; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -17,6 +18,7 @@ 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.event.DropEvent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.InputEvent; @@ -27,15 +29,18 @@ import org.zkoss.zul.Combobox; import org.zkoss.zul.Comboitem; import org.zkoss.zul.Datebox; import org.zkoss.zul.Intbox; +import org.zkoss.zul.Listheader; import org.zkoss.zul.Paging; import org.zkoss.zul.Timebox; import com.rjconsultores.ventaboletos.entidad.ClaseServicio; import com.rjconsultores.ventaboletos.entidad.Empresa; import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida; +import com.rjconsultores.ventaboletos.entidad.HeaderTabelaEsquemaCorrida; import com.rjconsultores.ventaboletos.entidad.Marca; import com.rjconsultores.ventaboletos.entidad.Ruta; import com.rjconsultores.ventaboletos.service.ClaseServicioService; +import com.rjconsultores.ventaboletos.service.HeaderEsquemaCorridaService; import com.rjconsultores.ventaboletos.service.MarcaService; import com.rjconsultores.ventaboletos.service.RutaService; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; @@ -82,6 +87,145 @@ public class BusquedaCorridaController extends MyGenericForwardComposer { private Checkbox chkNaoIncluirLinhaInativa; private Checkbox chkCorridaCancelada; + + private Listheader listHeader1; + private Listheader listHeader2; + private Listheader listHeader3; + private Listheader listHeader4; + private Listheader listHeader5; + private Listheader listHeader6; + private Listheader listHeader7; + private Listheader listHeader8; + private Listheader listHeader9; + private Listheader listHeader10; + private Listheader listHeader11; + private Listheader listHeader12; + private Listheader listHeader13; + private Listheader listHeader14; + private Listheader listHeader15; + + @Autowired + private HeaderEsquemaCorridaService headerService; + + public Listheader getListHeader1() { + return listHeader1; + } + + public void setListHeader1(Listheader listHeader1) { + this.listHeader1 = listHeader1; + } + + public Listheader getListHeader2() { + return listHeader2; + } + + public void setListHeader2(Listheader listHeader1) { + this.listHeader2 = listHeader1; + } + + public Listheader getListHeader3() { + return listHeader3; + } + + public void setListHeader3(Listheader listHeader3) { + this.listHeader3 = listHeader3; + } + + public Listheader getListHeader4() { + return listHeader4; + } + + public void setListHeader4(Listheader listHeader4) { + this.listHeader4 = listHeader4; + } + + public Listheader getListHeader5() { + return listHeader5; + } + + public void setListHeader5(Listheader listHeader5) { + this.listHeader5 = listHeader5; + } + + public Listheader getListHeader6() { + return listHeader6; + } + + public void setListHeader6(Listheader listHeader6) { + this.listHeader6 = listHeader6; + } + + public Listheader getListHeader7() { + return listHeader7; + } + + public void setListHeader7(Listheader listHeader7) { + this.listHeader7 = listHeader7; + } + + public Listheader getListHeader8() { + return listHeader8; + } + + public void setListHeader8(Listheader listHeader8) { + this.listHeader8 = listHeader8; + } + + public Listheader getListHeader9() { + return listHeader9; + } + + public void setListHeader9(Listheader listHeader9) { + this.listHeader9 = listHeader9; + } + + public Listheader getListHeader10() { + return listHeader10; + } + + public void setListHeader10(Listheader listHeader10) { + this.listHeader10 = listHeader10; + } + + public Listheader getListHeader11() { + return listHeader11; + } + + public void setListHeader11(Listheader listHeader11) { + this.listHeader11 = listHeader11; + } + + public Listheader getListHeader12() { + return listHeader12; + } + + public void setListHeader12(Listheader listHeader12) { + this.listHeader12 = listHeader12; + } + + public Listheader getListHeader13() { + return listHeader13; + } + + public void setListHeader13(Listheader listHeader13) { + this.listHeader13 = listHeader13; + } + + public Listheader getListHeader14() { + return listHeader14; + } + + public void setListHeader14(Listheader listHeader14) { + this.listHeader14 = listHeader14; + } + + public Listheader getListHeader15() { + return listHeader15; + } + + public void setListHeader15(Listheader listHeader15) { + this.listHeader15 = listHeader15; + } public Combobox getCmbClase() { return cmbClase; @@ -240,7 +384,23 @@ public class BusquedaCorridaController extends MyGenericForwardComposer { lsClase = claseService.obtenerTodos(); lsRuta = rutaService.obtenerTodos(); - esquemaCorridaList.setItemRenderer(new RenderConfiguracionCorrida()); + criarListaDinamica(); + + btnPesquisa.focus(); + cmbMarca.setSelectedItem(null); + + refreshLista(); + } + + Integer posicoesColunasTabela[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; + List labelsList = new ArrayList<>(); + private void criarListaDinamica() { + + //Busca do banco as posicoes salvas + posicoesColunasTabela = headerService.buscarHeader(); + + esquemaCorridaList.setItemRenderer(new RenderConfiguracionCorrida(posicoesColunasTabela)); + esquemaCorridaList.addEventListener("onDoubleClick", new EventListener() { @Override @@ -249,11 +409,115 @@ public class BusquedaCorridaController extends MyGenericForwardComposer { verPeriodo(rc); } }); + + iniciarListHeader(listHeader1); + iniciarListHeader(listHeader2); + iniciarListHeader(listHeader3); + iniciarListHeader(listHeader4); + iniciarListHeader(listHeader5); + iniciarListHeader(listHeader6); + iniciarListHeader(listHeader7); + iniciarListHeader(listHeader8); + iniciarListHeader(listHeader9); + iniciarListHeader(listHeader10); + iniciarListHeader(listHeader11); + iniciarListHeader(listHeader12); + iniciarListHeader(listHeader13); + iniciarListHeader(listHeader14); + iniciarListHeader(listHeader15); + + criarListaDeLabels(); + atualizaLabelsTabela(); + } - btnPesquisa.focus(); - cmbMarca.setSelectedItem(null); + private void criarListaDeLabels() { + labelsList.add("ZERO"); + labelsList.add(listHeader1.getLabel()); + labelsList.add(listHeader2.getLabel()); + labelsList.add(listHeader3.getLabel()); + labelsList.add(listHeader4.getLabel()); + labelsList.add(listHeader5.getLabel()); + labelsList.add(listHeader6.getLabel()); + labelsList.add(listHeader7.getLabel()); + labelsList.add(listHeader8.getLabel()); + labelsList.add(listHeader9.getLabel()); + labelsList.add(listHeader10.getLabel()); + labelsList.add(listHeader11.getLabel()); + labelsList.add(listHeader12.getLabel()); + labelsList.add(listHeader13.getLabel()); + labelsList.add(listHeader14.getLabel()); + labelsList.add(listHeader15.getLabel()); + } - refreshLista(); + private void atualizaLabelsTabela() { + + int i = 1; + for(Integer posicao : posicoesColunasTabela) { + + if(i == 1) { + listHeader1.setLabel(labelsList.get(posicao)); + } else if ( i == 2) { + listHeader2.setLabel(labelsList.get(posicao)); + } else if ( i == 3) { + listHeader3.setLabel(labelsList.get(posicao)); + } else if ( i == 4) { + listHeader4.setLabel(labelsList.get(posicao)); + } else if ( i == 5) { + listHeader5.setLabel(labelsList.get(posicao)); + } else if ( i == 6) { + listHeader6.setLabel(labelsList.get(posicao)); + } else if ( i == 7) { + listHeader7.setLabel(labelsList.get(posicao)); + } else if ( i == 8) { + listHeader8.setLabel(labelsList.get(posicao)); + } else if ( i == 9) { + listHeader9.setLabel(labelsList.get(posicao)); + } else if ( i == 10) { + listHeader10.setLabel(labelsList.get(posicao)); + } else if ( i == 11) { + listHeader11.setLabel(labelsList.get(posicao)); + } else if ( i == 12) { + listHeader12.setLabel(labelsList.get(posicao)); + } else if ( i == 13) { + listHeader13.setLabel(labelsList.get(posicao)); + } else if ( i == 14) { + listHeader14.setLabel(labelsList.get(posicao)); + } else if ( i == 15) { + listHeader15.setLabel(labelsList.get(posicao)); + } + + i++; + } + + } + + private void iniciarListHeader(Listheader listHeader) { + listHeader.setDraggable("true"); + listHeader.setDroppable("true"); + + listHeader.addEventListener("onDrop", new EventListener() { + public void onEvent(Event inEvent) throws Exception { + + DropEvent dropEvent = (DropEvent) inEvent; + Component dragged = dropEvent.getDragged(); + + int de = dragged.getParent().getChildren().indexOf(dragged); + int para = listHeader.getParent().getChildren().indexOf(listHeader); + + Integer posicaoDe = posicoesColunasTabela[de]; + Integer posicaoPara = posicoesColunasTabela[para]; + + posicoesColunasTabela[para] = posicaoDe; + posicoesColunasTabela[de] = posicaoPara; + + headerService.salvarPosicoesHeader(posicoesColunasTabela); + + esquemaCorridaList.setItemRenderer(new RenderConfiguracionCorrida(posicoesColunasTabela)); + esquemaCorridaList.renderAll(); + + atualizaLabelsTabela(); + } + }); } private void verPeriodo(EsquemaCorrida rc) { diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderConfiguracionCorrida.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderConfiguracionCorrida.java index 7564cff86..10c5fb6f8 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderConfiguracionCorrida.java +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderConfiguracionCorrida.java @@ -19,107 +19,245 @@ import org.zkoss.zul.ListitemRenderer; */ public class RenderConfiguracionCorrida implements ListitemRenderer { + private Integer[] posicoes = null; + private SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yy"); + + public RenderConfiguracionCorrida(Integer[] posicoes) { + super(); + this.posicoes = posicoes; + } + + public RenderConfiguracionCorrida() { + super(); + } + public void render(Listitem lstm, Object o) throws Exception { EsquemaCorrida corrida = (EsquemaCorrida) o; - - Listcell lc = new Listcell(corrida.getEsquemacorridaId().toString()); - lc.setParent(lstm); - lc = new Listcell(corrida.getNumCorrida().toString()); - lc.setParent(lstm); - - SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yy"); - lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecniciovigencia())); - lc.setParent(lstm); - - lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecfinvigencia())); - lc.setParent(lstm); - - if (corrida.getHorasalida() == null) { - lc = new Listcell("-"); - lc.setParent(lstm); + if(posicoes != null) { + Listcell lc; + + for(Integer posicao : posicoes) { + lc = buscarListCell(posicao, corrida); + lc.setParent(lstm); + } + } else { - SimpleDateFormat hr = new SimpleDateFormat("HH:mm"); - lc = new Listcell(hr.format(corrida.getHorasalida())); + Listcell lc = new Listcell(corrida.getEsquemacorridaId().toString()); lc.setParent(lstm); + + lc = new Listcell(corrida.getNumCorrida().toString()); + lc.setParent(lstm); + + lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecniciovigencia())); + lc.setParent(lstm); + + lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecfinvigencia())); + lc.setParent(lstm); + + if (corrida.getHorasalida() == null) { + lc = new Listcell("-"); + lc.setParent(lstm); + } else { + SimpleDateFormat hr = new SimpleDateFormat("HH:mm"); + lc = new Listcell(hr.format(corrida.getHorasalida())); + lc.setParent(lstm); + } + // Ruta + lc = new Listcell(corrida.getRuta().getDescruta() == null ? "-" : corrida.getRuta().getDescruta()); + lc.setParent(lstm); + + lc = new Listcell(corrida.getRuta().getNumRuta() == null ? "-" : corrida.getRuta().getNumRuta()); + lc.setParent(lstm); + + lc = new Listcell(corrida.getRuta().getIndSentidoIda() == true ? Labels.getLabel("editarCatalogoDeRutaController.radIda.value") : Labels.getLabel("editarCatalogoDeRutaController.radVolta.value")); + lc.setParent(lstm); + + // Marca + lc = new Listcell(corrida.getMarca().getDescmarca() == null ? "-" : corrida.getMarca().getDescmarca()); + lc.setParent(lstm); + + // Semana + String l = (corrida.getIndlunes() == Boolean.TRUE) ? "S " : "- "; + String ma = (corrida.getIndmartes() == Boolean.TRUE) ? "T " : "- "; + String mi = (corrida.getIndmiercoles() == Boolean.TRUE) ? "Q " : "- "; + String j = (corrida.getIndjueves() == Boolean.TRUE) ? "Q " : "- "; + String v = (corrida.getIndviernes() == Boolean.TRUE) ? "S " : "- "; + String s = (corrida.getIndsabado() == Boolean.TRUE) ? "S " : "- "; + String d = (corrida.getInddomingo() == Boolean.TRUE) ? "D " : "- "; + + lc = new Listcell(l + ma + mi + j + v + s + d); + lc.setParent(lstm); + + // Clase + try { + lc = new Listcell(corrida.getClaseServicio().getDescclase() == null ? "-" : corrida.getClaseServicio().getDescclase()); + lc.setParent(lstm); + } catch (Exception e) { + lc = new Listcell("-"); + lc.setParent(lstm); + } + + // EmpC + try { + lc = new Listcell(corrida.getEmpresa().getNombempresa() == null ? "-" : corrida.getEmpresa().getNombempresa()); + lc.setParent(lstm); + } catch (Exception e) { + lc = new Listcell("-"); + lc.setParent(lstm); + } + + // EmpI + try { + lc = new Listcell(corrida.getEmpresa1().getNombempresa() == null ? "-" : corrida.getEmpresa1().getNombempresa()); + lc.setParent(lstm); + } catch (Exception e) { + lc = new Listcell("-"); + lc.setParent(lstm); + } + + // RolOperativo + try { + lc = new Listcell(corrida.getRolOperativo().getDescroloperativo() == null ? "-" : corrida.getRolOperativo().getDescroloperativo()); + lc.setParent(lstm); + } catch (Exception e) { + lc = new Listcell("-"); + lc.setParent(lstm); + } + + // Status + if (corrida.getStatusCorrida() == null) { + lc = new Listcell("-"); + lc.setParent(lstm); + } else if (corrida.getStatusCorrida().equals("L")) { + lc = new Listcell("LATENTE"); + lc.setParent(lstm); + } else if (corrida.getStatusCorrida().equals("A")) { + lc = new Listcell("AUTORIZADA"); + lc.setParent(lstm); + } else { + lc = new Listcell("CANCELADA"); + lc.setParent(lstm); + } } - // Ruta - lc = new Listcell(corrida.getRuta().getDescruta() == null ? "-" : corrida.getRuta().getDescruta()); - lc.setParent(lstm); - lc = new Listcell(corrida.getRuta().getNumRuta() == null ? "-" : corrida.getRuta().getNumRuta()); - lc.setParent(lstm); - - lc = new Listcell(corrida.getRuta().getIndSentidoIda() == true ? Labels.getLabel("editarCatalogoDeRutaController.radIda.value") : Labels.getLabel("editarCatalogoDeRutaController.radVolta.value")); - lc.setParent(lstm); - - // Marca - lc = new Listcell(corrida.getMarca().getDescmarca() == null ? "-" : corrida.getMarca().getDescmarca()); - lc.setParent(lstm); - - // Semana - String l = (corrida.getIndlunes() == Boolean.TRUE) ? "S " : "- "; - String ma = (corrida.getIndmartes() == Boolean.TRUE) ? "T " : "- "; - String mi = (corrida.getIndmiercoles() == Boolean.TRUE) ? "Q " : "- "; - String j = (corrida.getIndjueves() == Boolean.TRUE) ? "Q " : "- "; - String v = (corrida.getIndviernes() == Boolean.TRUE) ? "S " : "- "; - String s = (corrida.getIndsabado() == Boolean.TRUE) ? "S " : "- "; - String d = (corrida.getInddomingo() == Boolean.TRUE) ? "D " : "- "; - - lc = new Listcell(l + ma + mi + j + v + s + d); - lc.setParent(lstm); - - // Clase - try { - lc = new Listcell(corrida.getClaseServicio().getDescclase() == null ? "-" : corrida.getClaseServicio().getDescclase()); - lc.setParent(lstm); - } catch (Exception e) { - lc = new Listcell("-"); - lc.setParent(lstm); - } - - // EmpC - try { - lc = new Listcell(corrida.getEmpresa().getNombempresa() == null ? "-" : corrida.getEmpresa().getNombempresa()); - lc.setParent(lstm); - } catch (Exception e) { - lc = new Listcell("-"); - lc.setParent(lstm); - } - - // EmpI - try { - lc = new Listcell(corrida.getEmpresa1().getNombempresa() == null ? "-" : corrida.getEmpresa1().getNombempresa()); - lc.setParent(lstm); - } catch (Exception e) { - lc = new Listcell("-"); - lc.setParent(lstm); - } - - // RolOperativo - try { - lc = new Listcell(corrida.getRolOperativo().getDescroloperativo() == null ? "-" : corrida.getRolOperativo().getDescroloperativo()); - lc.setParent(lstm); - } catch (Exception e) { - lc = new Listcell("-"); - lc.setParent(lstm); - } - - // Status - if (corrida.getStatusCorrida() == null) { - lc = new Listcell("-"); - lc.setParent(lstm); - } else if (corrida.getStatusCorrida().equals("L")) { - lc = new Listcell("LATENTE"); - lc.setParent(lstm); - } else if (corrida.getStatusCorrida().equals("A")) { - lc = new Listcell("AUTORIZADA"); - lc.setParent(lstm); - } else { - lc = new Listcell("CANCELADA"); - lc.setParent(lstm); - } - lstm.setAttribute("data", corrida); + + } + + private Listcell buscarListCell(Integer posicao, EsquemaCorrida corrida) { + Listcell lc = null; + + switch (posicao) { + case 1: + lc = new Listcell(corrida.getEsquemacorridaId().toString()); + break; + + case 2: + lc = new Listcell(corrida.getNumCorrida().toString()); + break; + + case 3: + lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecniciovigencia())); + break; + + case 4: + lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecfinvigencia())); + break; + + case 5: + if (corrida.getHorasalida() == null) { + lc = new Listcell("-"); + } else { + SimpleDateFormat hr = new SimpleDateFormat("HH:mm"); + lc = new Listcell(hr.format(corrida.getHorasalida())); + } + break; + + case 6: + // Ruta + lc = new Listcell(corrida.getRuta().getDescruta() == null ? "-" : corrida.getRuta().getDescruta()); + break; + + case 7: + lc = new Listcell(corrida.getRuta().getNumRuta() == null ? "-" : corrida.getRuta().getNumRuta()); + break; + + case 8: + lc = new Listcell(corrida.getRuta().getIndSentidoIda() == true ? Labels.getLabel("editarCatalogoDeRutaController.radIda.value") : Labels.getLabel("editarCatalogoDeRutaController.radVolta.value")); + break; + + case 9: + // Marca + lc = new Listcell(corrida.getMarca().getDescmarca() == null ? "-" : corrida.getMarca().getDescmarca()); + break; + + case 10: + // Semana + String l = (corrida.getIndlunes() == Boolean.TRUE) ? "S " : "- "; + String ma = (corrida.getIndmartes() == Boolean.TRUE) ? "T " : "- "; + String mi = (corrida.getIndmiercoles() == Boolean.TRUE) ? "Q " : "- "; + String j = (corrida.getIndjueves() == Boolean.TRUE) ? "Q " : "- "; + String v = (corrida.getIndviernes() == Boolean.TRUE) ? "S " : "- "; + String s = (corrida.getIndsabado() == Boolean.TRUE) ? "S " : "- "; + String d = (corrida.getInddomingo() == Boolean.TRUE) ? "D " : "- "; + + lc = new Listcell(l + ma + mi + j + v + s + d); + break; + + case 11: + // Clase + try { + lc = new Listcell(corrida.getClaseServicio().getDescclase() == null ? "-" : corrida.getClaseServicio().getDescclase()); + } catch (Exception e) { + lc = new Listcell("-"); + } + break; + + case 12: + // EmpC + try { + lc = new Listcell(corrida.getEmpresa().getNombempresa() == null ? "-" : corrida.getEmpresa().getNombempresa()); + } catch (Exception e) { + lc = new Listcell("-"); + } + break; + + case 13: + // EmpI + try { + lc = new Listcell(corrida.getEmpresa1().getNombempresa() == null ? "-" : corrida.getEmpresa1().getNombempresa()); + } catch (Exception e) { + lc = new Listcell("-"); + } + break; + + case 14: + // RolOperativo + try { + lc = new Listcell(corrida.getRolOperativo().getDescroloperativo() == null ? "-" : corrida.getRolOperativo().getDescroloperativo()); + } catch (Exception e) { + lc = new Listcell("-"); + } + break; + + case 15: + // Status + if (corrida.getStatusCorrida() == null) { + lc = new Listcell("-"); + } else if (corrida.getStatusCorrida().equals("L")) { + lc = new Listcell("LATENTE"); + } else if (corrida.getStatusCorrida().equals("A")) { + lc = new Listcell("AUTORIZADA"); + } else { + lc = new Listcell("CANCELADA"); + } + break; + + default: + break; + } + + return lc; } } diff --git a/src/java/spring-config.xml b/src/java/spring-config.xml index 906a3d5a0..1fac7086b 100644 --- a/src/java/spring-config.xml +++ b/src/java/spring-config.xml @@ -451,7 +451,8 @@ com.rjconsultores.ventaboletos.entidad.GP_PricingGestao com.rjconsultores.ventaboletos.entidad.GP_PricingHistorico com.rjconsultores.ventaboletos.entidad.PricingConexao - com.rjconsultores.ventaboletos.entidad.OrgaoComprovanteCustomizado + com.rjconsultores.ventaboletos.entidad.OrgaoComprovanteCustomizado + com.rjconsultores.ventaboletos.entidad.HeaderTabelaEsquemaCorrida diff --git a/web/gui/esquema_operacional/busquedaCorrida.zul b/web/gui/esquema_operacional/busquedaCorrida.zul index ba1f1fa2a..8ffa0b8da 100644 --- a/web/gui/esquema_operacional/busquedaCorrida.zul +++ b/web/gui/esquema_operacional/busquedaCorrida.zul @@ -126,48 +126,48 @@ use="com.rjconsultores.ventaboletos.web.utilerias.MyListbox" multiple="false" vflex="true" height="50%"> - - - - - - - - - - - - - - - From 213efd55f3e444ffb323f8ddf07e5fe580626f69 Mon Sep 17 00:00:00 2001 From: "wallace.henrique" Date: Fri, 10 Nov 2023 15:02:30 -0300 Subject: [PATCH 04/15] fixes bug#AL-3351 dev: qua: --- pom.xml | 6 +++--- .../catalogos/EditarPuntoVentaController.java | 2 ++ web/WEB-INF/i3-label_es_MX.label | 1 + web/WEB-INF/i3-label_pt_BR.label | 1 + web/gui/catalogos/editarPuntoVenta.zul | 8 +++++++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 445bf0d69..f121158fd 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,12 @@ 4.0.0 br.com.rjconsultores ventaboletosadm - 1.28.0 + 1.29.0 war - 1.20.0 - 1.17.0 + 1.21.0 + 1.18.0 UTF-8 UTF-8 diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarPuntoVentaController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarPuntoVentaController.java index d01a4ef6c..1d5618fca 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarPuntoVentaController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarPuntoVentaController.java @@ -587,6 +587,7 @@ public class EditarPuntoVentaController extends MyGenericForwardComposer { private Checkbox checkIndBloqueioDescontoAPI; private Checkbox checkIndBloqueioDescontoWEB; + private Checkbox checkIndTaxaConvenienciaOrgaoConcedente; @Autowired private CobrancaAdcPuntoVentaService cobrancaAdcService; @@ -1213,6 +1214,7 @@ public class EditarPuntoVentaController extends MyGenericForwardComposer { txtTaxaConvenienciaPorc.setDisabled(true); checkIndBloqueioDescontoAPI.setDisabled(true); checkIndBloqueioDescontoWEB.setDisabled(true); + checkIndTaxaConvenienciaOrgaoConcedente.setDisabled(true); } } diff --git a/web/WEB-INF/i3-label_es_MX.label b/web/WEB-INF/i3-label_es_MX.label index 9b8fb6865..562ad34f9 100644 --- a/web/WEB-INF/i3-label_es_MX.label +++ b/web/WEB-INF/i3-label_es_MX.label @@ -1996,6 +1996,7 @@ editarPuntoVentaController.lbQrcodeTaxaEmbarqueRodTTL.label= Imprimir na venda o editarPuntoVentaController.checkIndBloqueioDescontoAPI.label = Bloquear descuento a través de api editarPuntoVentaController.checkIndBloqueioDescontoWEB.label = Bloquear descuento en internet editarPuntoVentaController.merchantStoreAdyen.label= Merchant Store Adyen +editarPuntoVentaController.lbTaxaConvenienciaOrgaoConcedente.label= Taxa Conveniência por Órgao Concedente # Fechamento Conta Contábil Agencia editarPuntoVentaController.puntoventa.label = Agencia diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 61b9e8025..d2447587d 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -2290,6 +2290,7 @@ editarPuntoVentaController.checkIndBloqueioDescontoWEB.label = Bloquear desconto editarPuntoVentaController.merchantStoreAdyen.label= Merchant Store Adyen editarPuntoVentaController.tempoMaxServicoEmVenda.label= Tempo máx. Serviço em venda antes/após saída (minutos) editarPuntoVentaController.dicatempoMaxServicoEmVenda.value=Tempo em minutos em que o serviço ficará em venda, antes saída (inserir valor negativo) ou após saída (inserir valor positivo) para este ponto de venda. Caso configurado este campo terá prioridade em relação as Config. Gerais (menu Configuração Geral) hoje usadas para esta finalidade tal como a Confi.Geral TIEMPO_ULTIMA_HORA_CORRIDA ou TIEMPO_ANTES_SALIDA_VENTAWEB(para substituir o valor desta constante deve inserir valor negativo). +editarPuntoVentaController.lbTaxaConvenienciaOrgaoConcedente.label= Taxa Conveniência por Órgao Concedente # Editar comissão ponto de venda editarPuntoVentaComissaoController.window.title = Comissão Empresa/Ponto de Venda - {0} diff --git a/web/gui/catalogos/editarPuntoVenta.zul b/web/gui/catalogos/editarPuntoVenta.zul index 17999af24..c3ecdc5ef 100644 --- a/web/gui/catalogos/editarPuntoVenta.zul +++ b/web/gui/catalogos/editarPuntoVenta.zul @@ -506,7 +506,13 @@