From 8a58574e7bd526acb1d1e62175dc0683f13b9f0d Mon Sep 17 00:00:00 2001 From: valdevir Date: Thu, 13 May 2021 13:51:12 +0000 Subject: [PATCH] fixes bug#22115 qua: dev:Valdir git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@106664 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../relatorios/impl/RelatorioIndiceIRK.java | 229 ++++++++ .../RelatorioIndiceIRK_pt_BR.properties | 50 ++ .../RelatorioCaixaOrgaoConcedente.jasper | Bin 66682 -> 66680 bytes .../RelatorioCaixaOrgaoConcedente.jrxml | 6 +- .../templates/RelatorioIndiceIRK.jasper | Bin 0 -> 62952 bytes .../templates/RelatorioIndiceIRK.jrxml | 552 ++++++++++++++++++ .../utilitarios/RelatorioIndiceIRKBean.java | 241 ++++++++ .../catalogos/EditarEmpresaController.java | 14 + .../RelatorioIndiceIRKController.java | 250 ++++++++ .../ItemMenuRelatorioIndiceIRK.java | 25 + .../utilerias/menu/menu_original.properties | 1 + .../render/RenderRelatorioIndiceIRK.java | 57 ++ web/WEB-INF/i3-label_en.label | 1 + web/WEB-INF/i3-label_es_MX.label | 1 + web/WEB-INF/i3-label_pt_BR.label | 27 +- web/gui/catalogos/editarEmpresa.zul | 10 + web/gui/relatorios/filtroRelatorioIRK.zul | 213 +++++++ 17 files changed, 1673 insertions(+), 4 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioIndiceIRK.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioIndiceIRK_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioIndiceIRK.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioIndiceIRK.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioIndiceIRKBean.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioIndiceIRKController.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioIndiceIRK.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioIndiceIRK.java create mode 100644 web/gui/relatorios/filtroRelatorioIRK.zul diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioIndiceIRK.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioIndiceIRK.java new file mode 100644 index 000000000..80f121779 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioIndiceIRK.java @@ -0,0 +1,229 @@ +/** + * + */ +package com.rjconsultores.ventaboletos.relatorios.impl; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioIndiceIRKBean; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; + +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; + +/** + * @author valdevir_rj + * + */ +public class RelatorioIndiceIRK extends Relatorio { + + private List lsDadosRelatorio; + private static Logger log = Logger.getLogger(RelatorioIndiceIRK.class); + + + /** + * @param parametros + * @param conexao + */ + public RelatorioIndiceIRK(final Map parametros, final Connection conexao) throws Exception { + super(parametros, conexao); + + this.setCustomDataSource(new DataSource(this) { + @Override + public void initDados() throws Exception { + try { + Integer rutaId = parametros.get("RUTA_ID") != null ? Integer.valueOf(parametros.get("RUTA_ID").toString()) : null; + Empresa empresa = parametros.get("EMPRESA") != null ? (Empresa) (parametros.get("EMPRESA")) : null; + Integer grupoRutaId = parametros.get("GRUPORUTA_ID") != null ? Integer.valueOf(parametros.get("GRUPORUTA_ID").toString()) : null; + String rutaIds = parametros.get("LINHA_FILTRO") != null ? (parametros.get("LINHA_FILTRO").toString()) : null; + String corridasIds = parametros.get("SERVICO_FILTRO") != null ? (parametros.get("SERVICO_FILTRO").toString()) : null; + + // Executa query relatório e preenche objeto relatório + lsDadosRelatorio= preencheAgrupaRelatorioBean(preparaExecutaQuery(parametros, conexao, rutaId, empresa, grupoRutaId, rutaIds, corridasIds)); + + // Ordena pela Desc Linha + Collections.sort(lsDadosRelatorio, new Comparator() { + @Override + public int compare(RelatorioIndiceIRKBean rel1, RelatorioIndiceIRKBean rel2) { + return rel1.getDescRuta().compareTo(rel2.getDescRuta()); + } + }); + + parametros.put("RELATORIOLIST", lsDadosRelatorio); + setLsDadosRelatorio(lsDadosRelatorio); + } catch (Exception e) { + log.error("Erro ao executar relatório", e); + } + + } + + /** + * @param parametros + * @param conexao + * @param rutaId + * @param empresa + * @param grupoRutaId + * @return + * @throws SQLException + */ + private ResultSet preparaExecutaQuery(final Map parametros, final Connection conexao, Integer rutaId, Empresa empresa, Integer grupoRutaId,String rutaIds, String corridasIds) throws SQLException { + String sql = getSql(rutaId, grupoRutaId, rutaIds, corridasIds); + NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql); + ResultSet rset = null; + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + if (parametros.get("DATA_INICIO") != null) { + Date dataInicio = (Date) parametros.get("DATA_INICIO"); + stmt.setString("DATA_INICIO", sdf.format(dataInicio)); + } + + if (parametros.get("DATA_FINAL") != null) { + Date dataFinal = (Date) parametros.get("DATA_FINAL"); + stmt.setString("DATA_FINAL", sdf.format(dataFinal)); + } + stmt.setInt("empresaId", empresa.getEmpresaId()); + rset = stmt.executeQuery(); + return rset; + } + + }); + } + + /** + * @param lsDadosRelatorio + */ + public void setLsDadosRelatorio(List lsDadosRelatorio) { + this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); + this.lsDadosRelatorio = lsDadosRelatorio; + } + + @Override + public void processaParametros() throws Exception { + } + + private String getSql(Integer rutaId, Integer grupoRutaId, String rutaIds, String corridasIds) { + String TODOS = "TODOS"; + StringBuilder sql = new StringBuilder(); + sql.append(" SELECT "); + sql.append(" servico,"); + sql.append(" rutaid,"); + sql.append(" descruta,"); + sql.append(" sentido,"); + sql.append(" gruporuta,"); + sql.append(" indiceirkminimo,"); + sql.append(" hora,"); + sql.append(" extensao,"); + sql.append(" SUM(seguro) AS seguro,"); + sql.append(" SUM(txembarque) AS txembarque,"); + sql.append(" SUM(pedagio) AS pedagio,"); + sql.append(" SUM(passagens) AS passagens,"); + sql.append(" ( SUM(passagens) + SUM(pedagio) + SUM(txembarque) + SUM(seguro) ) AS totalhorario,"); + sql.append(" round(((SUM(passagens) + SUM(pedagio) + SUM(txembarque) + SUM(seguro)) / extensao), 2) AS irk, "); + sql.append(" indiceirkminimo * extensao AS receitaminima,"); + sql.append(" (SUM(passagens) + SUM(pedagio) + SUM(txembarque) + SUM(seguro) ) - ( indiceirkminimo * extensao ) AS diferencareceita "); + sql.append(" FROM "); + sql.append(" ( "); + sql.append(" SELECT "); + sql.append(" cj.caja_id AS cajaId, "); + sql.append(" cj.corrida_id AS servico, "); + sql.append(" r.ruta_id AS rutaid, "); + sql.append(" r.descruta AS descruta, "); + sql.append(" r.indsentidoida AS sentido, "); + sql.append(" nvl(e.indiceirk, 0) AS indiceirkminimo, "); + sql.append(" nvl(gr.descgrupo, 'Não Definido') AS gruporuta, "); + sql.append(" to_char(cj.fechorviaje, 'HH24:MI') AS hora, "); + sql.append(" tr.cantkmreal AS extensao, "); + sql.append(" cj.importeseguro AS seguro, "); + sql.append(" cj.importetaxaembarque AS txembarque, "); + sql.append(" cj.importepedagio AS pedagio, "); + sql.append(" cj.preciopagado AS passagens "); + sql.append(" FROM "); + sql.append(" caja cj "); + sql.append(" INNER JOIN ruta r ON ( cj.ruta_id = r.ruta_id ) "); + sql.append(" LEFT JOIN grupo_ruta gr ON ( r.gruporuta_id = gr.gruporuta_id ) "); + sql.append(" INNER JOIN ruta_combinacion rc ON ( rc.ruta_id = cj.ruta_id "); + sql.append(" AND rc.activo = 1 ) "); + sql.append(" INNER JOIN tramo tr ON ( tr.tramo_id = rc.tramo_id "); + sql.append(" AND tr.origen_id = cj.origen_id "); + sql.append(" AND tr.destino_id = cj.destino_id ) "); + sql.append(" INNER JOIN marca m ON ( cj.marca_id = m.marca_id "); + sql.append(" AND m.empresa_id = :empresaId ) "); + sql.append(" INNER JOIN empresa e ON ( e.empresa_id = :empresaId ) "); + sql.append(" WHERE "); + sql.append(" cj.activo = 1 "); + sql.append(" AND cj.motivocancelacion_id IS NULL "); + sql.append(" AND cj.feccorrida BETWEEN TO_DATE(:DATA_INICIO, 'DD/MM/YY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YY hh24:mi:ss') "); + sql.append(rutaIds == null ||TODOS.equals(rutaIds) ? "" : " AND r.ruta_id IN ( " + rutaIds + " ) "); + sql.append(corridasIds == null || TODOS.equals(corridasIds) ? "" : " AND cj.corrida_id IN ( " + corridasIds + " ) "); + sql.append(grupoRutaId == null ? "" : " AND R.GRUPORUTA_ID IN ( " + grupoRutaId + " ) "); + sql.append(" GROUP BY "); + sql.append(" cj.caja_id, "); + sql.append(" cj.corrida_id, "); + sql.append(" r.ruta_id, "); + sql.append(" r.descruta, "); + sql.append(" r.indsentidoida,"); + sql.append(" e.indiceirk, "); + sql.append(" gr.descgrupo, "); + sql.append(" cj.fechorviaje, "); + sql.append(" tr.cantkmreal, "); + sql.append(" cj.importeseguro, "); + sql.append(" cj.importetaxaembarque, "); + sql.append(" cj.importepedagio, "); + sql.append(" cj.preciopagado "); + sql.append(" ORDER BY "); + sql.append(" r.descruta "); + sql.append(" ) dados_sem_agrupamento "); + sql.append(" GROUP BY "); + sql.append(" servico, "); + sql.append(" rutaid, "); + sql.append(" descruta, "); + sql.append(" gruporuta, "); + sql.append(" sentido, "); + sql.append(" indiceirkminimo, "); + sql.append(" hora, "); + sql.append(" extensao "); + return sql.toString(); + + } + + private List preencheAgrupaRelatorioBean(ResultSet rset) throws SQLException { + lsDadosRelatorio = new ArrayList(); + while (rset.next()) { + RelatorioIndiceIRKBean relatorioIndiceIRK = new RelatorioIndiceIRKBean(); + relatorioIndiceIRK.setServico((Integer) rset.getInt("servico")); + relatorioIndiceIRK.setRutaId((Integer) rset.getInt("rutaid")); + relatorioIndiceIRK.setDescRuta((String) rset.getObject("descruta")); + relatorioIndiceIRK.setGrupoRuta((String) rset.getObject("gruporuta")); + relatorioIndiceIRK.setSentido(Boolean.TRUE.equals((Boolean) rset.getBoolean("sentido")) ? "Ida" : "Volta"); + relatorioIndiceIRK.setIrkMinimo((BigDecimal) rset.getObject("indiceirkminimo")); + relatorioIndiceIRK.setHora((String) rset.getObject("hora")); + relatorioIndiceIRK.setExtensao((BigDecimal) rset.getObject("extensao")); + relatorioIndiceIRK.setKmRodado((BigDecimal) rset.getObject("extensao")); + relatorioIndiceIRK.setSeguro((BigDecimal) rset.getObject("seguro")); + relatorioIndiceIRK.setTxEmbarque((BigDecimal) rset.getObject("txembarque")); + relatorioIndiceIRK.setPedagio((BigDecimal) rset.getObject("pedagio")); + relatorioIndiceIRK.setPassagens((BigDecimal) rset.getObject("passagens")); + relatorioIndiceIRK.setTotalViagem((BigDecimal) rset.getObject("totalhorario")); + relatorioIndiceIRK.setTotal((BigDecimal) rset.getObject("totalhorario")); + relatorioIndiceIRK.setIrk((BigDecimal) rset.getObject("irk")); + relatorioIndiceIRK.setReceitaMinima((BigDecimal) rset.getObject("receitaminima")); + relatorioIndiceIRK.setDiferencaReceitas((BigDecimal) rset.getObject("diferencareceita")); + lsDadosRelatorio.add(relatorioIndiceIRK); + } + return lsDadosRelatorio; + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioIndiceIRK_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioIndiceIRK_pt_BR.properties new file mode 100644 index 000000000..fb8b3df5c --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioIndiceIRK_pt_BR.properties @@ -0,0 +1,50 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. +msg.a=à + +#Labels header +header.titulo.relatorio=Indice IRK +header.periodo=Per\u00EDodo\: +header.data.hora=Data/Hora\: +header.pagina=P\u00E1gina\: +header.filtro=Filtro\: +header.filtro.servico=Servi\u00E7o\: +header.filtro.linha=Linha\: +header.filtro.grupo=Grupo de Linhas\: +cabecalho.impressorPor=Impresso por + +#Labels detail + +detail.receita=RECEITA +detail.viagens=VIAGENS +detail.passageiros=PASSAGEIROS +detail.parametrosOperacionais=PARÂMETROS OPERACIONAIS +detail.hora=Hora +detail.servico=Serviço +detail.setido=Sentido +detail.extensao=Extensão +detail.passagens=Passagens +detail.seguro=Seguro +detail.bagagens=Bagagens +detail.segOpc=Tx. Embarque +detail.total=Total +detail.totalViagem=Total +detail.km.rodad=Km Rodad. +detail.irk=IRK +detail.rsViagem=R$/Viagem +detail.pedagio=Pedágio +detail.linha=Linha +detail.irkMinimo= IRK Mínimo +detail.receitaMinima= Receita Mínima +detail.diferencaReceitas= Diferença de Receitas + + +#Group +ruta.total= Total Linha +group.total=Total do Grupo +sub.total=Sub Total +total.geral=Total Geral + +linhas=Linhas + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCaixaOrgaoConcedente.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCaixaOrgaoConcedente.jasper index 4dbafff442c664fb30730890be9fa5939d648fcc..fec3d5803e3b774fe4969da015f47c54474b76df 100644 GIT binary patch delta 95 zcmey>!SbVnWkZ)Eqx9x(M?)qiX~xO^n);jHI{z|bVl>$Nx+>OO)X2cnz|zpd(#XOv k-onttz`%%|fpN0^ezncbn>GXrV@j7yGL@U2!ony90N6wvdjJ3c delta 100 zcmey-!SbtvWkZ)EqwwZ#M?)qiVaCb+n);jHI{z|bVKyOfr?5p2Wf^1^_a*9GCzA diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCaixaOrgaoConcedente.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCaixaOrgaoConcedente.jrxml index a98ea0563..a2dc92fce 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCaixaOrgaoConcedente.jrxml +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCaixaOrgaoConcedente.jrxml @@ -1,7 +1,7 @@ - + @@ -595,9 +595,9 @@ $F{categoria}]]> - + - + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioIndiceIRK.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioIndiceIRK.jasper new file mode 100644 index 0000000000000000000000000000000000000000..88c5511a2829e587d1c4e1bbfe80a34e985cb0ea GIT binary patch literal 62952 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band splitType="Stretch"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioIndiceIRKBean.java b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioIndiceIRKBean.java new file mode 100644 index 000000000..e50856366 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioIndiceIRKBean.java @@ -0,0 +1,241 @@ +package com.rjconsultores.ventaboletos.relatorios.utilitarios; + +import java.math.BigDecimal; + +/** + * @author valdevir + * + */ +public class RelatorioIndiceIRKBean { + + /** + * Valor estipulado pela empresa (definido na configuração de empresa) + */ + private BigDecimal irkMinimo; + /** + * Valor gerado através (IRK minímo x KM da Linha) + */ + private BigDecimal receitaMinima; + + /** + * Valor Gerado Através (Total da Receita daquele horário - a Receita miníma) + */ + private BigDecimal diferencaReceitas; + /** + * Grupo Ruta + */ + private String grupoRuta; + /** + * Hora Corrida + */ + private String hora; + /** + * Num Corrida + */ + private Integer servico; + /** + * Sentido Linha (Ida/Volta) + */ + private String sentido; + + /** + * Extensão da linha em Km + */ + private BigDecimal extensao; + /** + * Soma do valor de passagens (Tarifa) + */ + private BigDecimal passagens; + /** + * Soma do valor de seguro (Seguro Tabela) + */ + private BigDecimal seguro; + /** + * Total das Receita do horário (Passagem + Pedágio + seguro + Taxa de Embarque) + */ + private BigDecimal total; + /** + * + */ + private BigDecimal totalViagem; + /** + * Total Kilometragem Rodado da Linha para o período + */ + private BigDecimal kmRodado; + /** + * IRK "Indice de Receita por Kilometro": Valor Gerado Através (Total/Km) onde Total é o somatório do valor das passagens do serviço incluído venda embarcada + */ + private BigDecimal irk; + /** + * + */ + private BigDecimal rsViagem; + /** + * valor de Taxa Embarque do Horário + */ + private BigDecimal txEmbarque; + /** + * valor de pedágio do Horário + */ + private BigDecimal pedagio; + /** + * Descrição da linha + */ + private String descRuta; + + private Integer rutaId; + + public Integer getRutaId() { + return rutaId; + } + + public void setRutaId(Integer rutaId) { + this.rutaId = rutaId; + } + + public String getSentido() { + return sentido; + } + + public String getGrupoRuta() { + return grupoRuta; + } + + public void setGrupoRuta(String grupoRuta) { + this.grupoRuta = grupoRuta; + } + + public String getHora() { + return hora; + } + + public void setHora(String hora) { + this.hora = hora; + } + + public Integer getServico() { + return servico; + } + + public void setServico(Integer servico) { + this.servico = servico; + } + + public BigDecimal getExtensao() { + return extensao == null ? BigDecimal.ZERO : extensao; + } + + public void setExtensao(BigDecimal extensao) { + this.extensao = extensao; + } + + public BigDecimal getPassagens() { + return passagens == null ? BigDecimal.ZERO : passagens; + } + + public void setPassagens(BigDecimal passagens) { + this.passagens = passagens; + } + + public BigDecimal getSeguro() { + return seguro == null ? BigDecimal.ZERO : seguro; + } + + public void setSeguro(BigDecimal seguro) { + this.seguro = seguro; + } + + public BigDecimal getTotal() { + return total == null ? BigDecimal.ZERO : total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public BigDecimal getTotalViagem() { + return totalViagem == null ? BigDecimal.ZERO : totalViagem; + } + + public void setTotalViagem(BigDecimal totalViagem) { + this.totalViagem = totalViagem; + } + + public BigDecimal getKmRodado() { + return kmRodado == null ? BigDecimal.ZERO : kmRodado; + } + + public void setKmRodado(BigDecimal kmRodado) { + this.kmRodado = kmRodado; + } + + public BigDecimal getRsViagem() { + return rsViagem == null ? BigDecimal.ZERO : rsViagem; + } + + public void setRsViagem(BigDecimal rsViagem) { + this.rsViagem = rsViagem; + } + + public BigDecimal getTxEmbarque() { + return txEmbarque; + } + + public void setTxEmbarque(BigDecimal txEmbarque) { + this.txEmbarque = txEmbarque; + } + + public BigDecimal getPedagio() { + return pedagio; + } + + public void setPedagio(BigDecimal pedagio) { + this.pedagio = pedagio; + } + + public String getDescRuta() { + return descRuta; + } + + public void setDescRuta(String descRuta) { + this.descRuta = descRuta; + } + + public BigDecimal getIrkMinimo() { + return irkMinimo; + } + + public void setIrkMinimo(BigDecimal irkMinimo) { + this.irkMinimo = irkMinimo; + } + + public BigDecimal getReceitaMinima() { + return receitaMinima; + } + + public void setReceitaMinima(BigDecimal receitaMinima) { + this.receitaMinima = receitaMinima; + } + + public BigDecimal getDiferencaReceitas() { + return diferencaReceitas; + } + + public void setDiferencaReceitas(BigDecimal diferencaReceitas) { + this.diferencaReceitas = diferencaReceitas; + } + + public void setSentido(String sentido) { + this.sentido = sentido; + } + + public BigDecimal getIrk() { + return irk; + } + + public void setIrk(BigDecimal irk) { + this.irk = irk; + } + + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarEmpresaController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarEmpresaController.java index b66891822..15ce60f04 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarEmpresaController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/catalogos/EditarEmpresaController.java @@ -33,6 +33,7 @@ import org.zkoss.zul.Button; import org.zkoss.zul.Checkbox; import org.zkoss.zul.Combobox; import org.zkoss.zul.Comboitem; +import org.zkoss.zul.Decimalbox; import org.zkoss.zul.Image; import org.zkoss.zul.Intbox; import org.zkoss.zul.Messagebox; @@ -322,6 +323,9 @@ public class EditarEmpresaController extends MyGenericForwardComposer { private MyTextbox txtCpfCnpj_AutorizadoDowload; + private Decimalbox txtIrkPadrao; + + private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; @@ -702,6 +706,7 @@ public class EditarEmpresaController extends MyGenericForwardComposer { chkIndComTransfGeraCaja.getValue(); chkIndPricingVendaAberto.getValue(); + txtIrkPadrao.getValue(); rdCst00.getValue(); rdCst40.getValue(); rdCst41.getValue(); @@ -823,6 +828,7 @@ public class EditarEmpresaController extends MyGenericForwardComposer { empresa.setIndConfMovFPTrocaVlrDeposito(chkIndConfMovFPTrocaVlrDeposito.isChecked()); empresa.setIndComTransfGeraCaja(chkIndComTransfGeraCaja.isChecked()); empresa.setIndPricingVendaAberto(chkIndPricingVendaAberto.isChecked()); + empresa.setIndiceIRK(txtIrkPadrao.getValue()); if(rdCst00.isChecked()) { empresa.setCstGratuidade(TipoCstGratuidade.CST00); @@ -2015,4 +2021,12 @@ public void onClick$btnTestEmailFlexBus(Event ev) throws InterruptedException { public void setEmpresaEmailFlexBus(EmpresaEmailFlexBus empresaEmailFlexBus) { this.empresaEmailFlexBus = empresaEmailFlexBus; } + + public Decimalbox getTxtIrkPadrao() { + return txtIrkPadrao; + } + + public void setTxtIrkPadrao(Decimalbox txtIrkPadrao) { + this.txtIrkPadrao = txtIrkPadrao; + } } diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioIndiceIRKController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioIndiceIRKController.java new file mode 100644 index 000000000..ce1ef3418 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioIndiceIRKController.java @@ -0,0 +1,250 @@ +package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.apache.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.event.Event; +import org.zkoss.zul.Combobox; +import org.zkoss.zul.Datebox; +import org.zkoss.zul.Intbox; +import org.zkoss.zul.Textbox; + +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.GrupoRuta; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioIndiceIRK; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.service.CorridaService; +import com.rjconsultores.ventaboletos.service.EmpresaService; +import com.rjconsultores.ventaboletos.service.GrupoRutaService; +import com.rjconsultores.ventaboletos.service.RutaService; +import com.rjconsultores.ventaboletos.utilerias.DateUtil; +import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; +import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCorridaOrigemDestino; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioIndiceIRK; + +@Controller("relatorioIndiceIRKController") +@Scope("prototype") +public class RelatorioIndiceIRKController extends MyGenericForwardComposer { + + private static final long serialVersionUID = 1L; + private static Logger log = Logger.getLogger(RelatorioIndiceIRKController.class); + + @Autowired + private DataSource dataSourceRead; + + @Autowired + private EmpresaService empresaService; + + @Autowired + private CorridaService corridaService; + + @Autowired + private RutaService rutaService; + + @Autowired + private GrupoRutaService grupoRutaService; + + private Datebox datInicial; + private Datebox datFinal; + + private Combobox cmbEmpresa; + private List lsEmpresa; + + private Combobox cmbGrupoRuta; + private List lsGrupoRuta; + + private MyListbox linhaList; + private MyListbox linhaListSelList; + private Textbox txtPalavraPesquisaLinha; + + private ArrayList lsNumLinha = new ArrayList(); + private MyListbox servicoList; + private MyListbox servicoListSelList; + private Intbox txtCorridaId; + + private ArrayList lsNumServico = new ArrayList(); + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void executarRelatorio() throws Exception { + try { + Map parametros = new HashMap(); + // Filtro Data Início + Timestamp dataInicio = new Timestamp((DateUtil.inicioFecha((java.util.Date) datInicial.getValue()).getTime())); + parametros.put("DATA_INICIO", dataInicio); + + // Filtro Data Final + Timestamp dataFinal = new Timestamp((DateUtil.fimFecha((java.util.Date) datFinal.getValue()).getTime())); + parametros.put("DATA_FINAL", dataFinal); + + // Filtro Usuário Id + parametros.put("USUARIO_ID", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString()); + + // Filtro nome usuário + parametros.put("NOME_USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario().toString()); + + // Filtro Empresa + Empresa empresa = null; + if (cmbEmpresa.getSelectedItem() != null) { + empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue(); + } + parametros.put("EMPRESA", empresa); + parametros.put("NOMBEMPRESA", empresa != null ? empresa.getNombempresa() : "TODOS"); + + // Filtro Grupo Ruta + GrupoRuta grupoRuta = null; + if (cmbGrupoRuta.getSelectedItem() != null) { + grupoRuta = (GrupoRuta) cmbGrupoRuta.getSelectedItem().getValue(); + } + parametros.put("DESCGRUPO", grupoRuta != null ? grupoRuta.getDescGrupo() : "TODOS"); + // Filtro Linha + lsNumLinha = new ArrayList(Arrays.asList(linhaListSelList.getData())); + String rutasIds = getRutasIds(lsNumLinha); + parametros.put("LINHA_FILTRO", lsNumLinha != null && !lsNumLinha.isEmpty() ? rutasIds : "TODOS"); + parametros.put("lsNumLinha", lsNumLinha); + + // Filtro Serviço + lsNumServico = new ArrayList(Arrays.asList(servicoListSelList.getData())); + String corridasIds = getCorridasIds(lsNumServico); + parametros.put("SERVICO_FILTRO", lsNumServico != null && !lsNumServico.isEmpty()? corridasIds : "TODOS"); + parametros.put("lsNumServico", lsNumServico); + + // Instancia o relatório + Relatorio relatorio = new RelatorioIndiceIRK(parametros, dataSourceRead.getConnection()); + Map args = new HashMap(); + args.put("relatorio", relatorio); + + // Abre a janela do relatório + openWindow("/component/reportView.zul", + Labels.getLabel("relatorioIndiceIRKController.window.title"), args, MODAL); + } catch (Exception e) { + log.error("Erro ao executar relatório", e); + } + + } + + private String getCorridasIds(ArrayList lsNumServico) { + StringBuilder corridasIds = new StringBuilder(); + for (Corrida corrida : lsNumServico) { + corridasIds.append(corrida.getId().getCorridaId()); + } + return corridasIds.toString(); + } + + private String getRutasIds(ArrayList lsNumLinha2) { + StringBuilder rutasIds = new StringBuilder(); + for (Ruta ruta : lsNumLinha2) { + rutasIds.append(ruta.getRutaId()); + } + return rutasIds.toString(); + } + + public void onClick$btnExecutarRelatorio(Event ev) throws Exception { + executarRelatorio(); + } + + public void onClick$btnPesquisaLinha(Event ev) { + executarPesquisaLinha(); + } + + public void onClick$btnLimparLinha(Event ev) { + linhaList.clearSelection(); + lsNumLinha.clear(); + } + + public void onDoubleClick$servicoList(Event ev) { + Corrida corridaAux = (Corrida) servicoList.getSelected(); + servicoListSelList.addItemNovo(corridaAux); + } + + public void onDoubleClick$linhaList(Event ev) { + Ruta rutaAux = (Ruta) linhaList.getSelected(); + linhaListSelList.addItemNovo(rutaAux); + } + + private void executarPesquisaLinha() { + + String palavraPesquisaRuta = txtPalavraPesquisaLinha.getText(); + linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta)); + + if (linhaList.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioIndiceIRKController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + } + + private void executarPesquisaServico() { + + Integer corridaId = txtCorridaId.getValue(); + servicoList.setData(corridaService.buscarGroupCorrridaId(corridaId, datInicial.getValue(), datFinal.getValue())); + + if (servicoList.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioLinhasHorarioController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + } + + public void onClick$btnLimparServico(Event ev) { + servicoList.clearSelection(); + servicoList.setData(new ArrayList()); + lsNumServico.clear(); + } + + public void onClick$btnPesquisaServico(Event ev) { + executarPesquisaServico(); + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + lsEmpresa = empresaService.obtenerTodos(); + + lsGrupoRuta = grupoRutaService.obtenerTodos(); + + linhaList.setItemRenderer(new RenderRelatorioIndiceIRK()); + linhaListSelList.setItemRenderer(new RenderRelatorioIndiceIRK()); + + servicoList.setItemRenderer(new RenderCorridaOrigemDestino()); + servicoListSelList.setItemRenderer(new RenderCorridaOrigemDestino()); + } + + public List getLsEmpresa() { + return lsEmpresa; + } + + public void setLsEmpresa(List lsEmpresa) { + this.lsEmpresa = lsEmpresa; + } + + public List getLsGrupoRuta() { + return lsGrupoRuta; + } + + public void setLsGrupoRuta(List lsGrupoRuta) { + this.lsGrupoRuta = lsGrupoRuta; + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioIndiceIRK.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioIndiceIRK.java new file mode 100644 index 000000000..40a925d85 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioIndiceIRK.java @@ -0,0 +1,25 @@ +package com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios; + +import org.zkoss.util.resource.Labels; + +import com.rjconsultores.ventaboletos.web.utilerias.PantallaUtileria; +import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema; + +public class ItemMenuRelatorioIndiceIRK extends DefaultItemMenuSistema { + + public ItemMenuRelatorioIndiceIRK() { + super("indexController.mniRelatorioIndiceIRK.label"); + } + + @Override + public String getClaveMenu() { + return "COM.RJCONSULTORES.ADMINISTRACION.GUI.RELATORIOS.MENU.RELATORIOIRK"; + } + + @Override + public void ejecutar() { + PantallaUtileria.openWindow("/gui/relatorios/filtroRelatorioIRK.zul", + Labels.getLabel("relatorioIRKController.window.title"), getArgs(), desktop); + + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties index 3f75655b3..7a755ed26 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties @@ -162,6 +162,7 @@ analitico.gerenciais.relatorioHistoricoCompras=com.rjconsultores.ventaboletos.we analitico.gerenciais.operacionais=com.rjconsultores.ventaboletos.web.utilerias.menu.item.analitico.gerenciais.operacionais.SubMenuRelatorioOperacionais analitico.gerenciais.operacionais.aproveitamento=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioAproveitamento analitico.gerenciais.operacionais.resumoLinhas=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioResumoLinhas +analitico.gerenciais.operacionais.indiceIRK=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioIndiceIRK analitico.gerenciais.operacionais.kmProgramada=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioKmProgramada analitico.gerenciais.operacionais.acompanhamentoEquivalentes=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioAcompanhamentoEquivalentes analitico.gerenciais.operacionais.linhasHorario=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioLinhasHorario diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioIndiceIRK.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioIndiceIRK.java new file mode 100644 index 000000000..d23b0bce8 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioIndiceIRK.java @@ -0,0 +1,57 @@ +package com.rjconsultores.ventaboletos.web.utilerias.render; + +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zul.Button; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; + +import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; + +public class RenderRelatorioIndiceIRK implements ListitemRenderer { + public void render(Listitem lstm, Object o) throws Exception { + Ruta ruta = (Ruta) o; + + Listcell lc = new Listcell(ruta.getNumRuta().toString()); + lc.setParent(lstm); + + lc = new Listcell(ruta.getPrefixo()); + lc.setParent(lstm); + + lc = new Listcell(ruta.getDescruta()); + lc.setParent(lstm); + + OrgaoConcedente orgaoConcedente = ruta.getOrgaoConcedente(); + if (orgaoConcedente != null) { + lc = new Listcell(orgaoConcedente.getDescOrgao()); + } else { + lc = new Listcell("-"); + } + lc.setParent(lstm); + + Button btn = new Button(); + + lc = new Listcell(); + lc.setParent(lstm); + + btn.setWidth("16"); + btn.setHeight("16"); + btn.setImage("/gui/img/remove.png"); + + btn.addEventListener("onClick", new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + MyListbox listBox = (MyListbox) event.getTarget().getParent().getParent().getParent(); + Listitem listItem = (Listitem) event.getTarget().getParent().getParent(); + listBox.removeItem((Ruta) listItem.getAttribute("data")); + } + }); + + lc.appendChild(btn); + + lstm.setAttribute("data", ruta); + } +} diff --git a/web/WEB-INF/i3-label_en.label b/web/WEB-INF/i3-label_en.label index d08eb436c..1a5bd5b1f 100644 --- a/web/WEB-INF/i3-label_en.label +++ b/web/WEB-INF/i3-label_en.label @@ -295,6 +295,7 @@ indexController.mniRelatorioTrechoVendido.label=Section by Point of Sale indexController.mniRelatorioOrigemDestino.label=Performance by Service indexController.mniRelatorioPassageirosViajar.label=Ticket to Travel indexController.mniRelatorioResumoLinhas.label=Route Summary +indexController.mniRelatorioIndiceIRK.label = Indice IRK indexController.mniRelatorioKmProgramada.label=Scheduled Km indexController.mniRelatorioAcompanhamentoEquivalentes.label=Indicators indexController.mniRelatorioLinhasHorario.label=Routes by Time diff --git a/web/WEB-INF/i3-label_es_MX.label b/web/WEB-INF/i3-label_es_MX.label index cb6e6d87b..1e5e3b2b2 100644 --- a/web/WEB-INF/i3-label_es_MX.label +++ b/web/WEB-INF/i3-label_es_MX.label @@ -292,6 +292,7 @@ indexController.mniRelatorioTrechoVendido.label = Tramo por punto de venta indexController.mniRelatorioOrigemDestino.label = Desempeño de servicio indexController.mniRelatorioPassageirosViajar.label = Pasajeros a viajar indexController.mniRelatorioResumoLinhas.label = Reporte resumen de rutas +indexController.mniRelatorioIndiceIRK.label = Indice IRK indexController.mniRelatorioAcompanhamentoEquivalentes.label = Indicadores (Acompanhamento de Equivalentes) indexController.mniRelatorioLinhasHorario.label = Rutas por horário indexController.mniRelatorioTaxasLinha.label = Tasas diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 18c8d8552..6fc3574f7 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -302,6 +302,7 @@ indexController.mniRelatorioTrechoVendido.label = Trecho por Agência indexController.mniRelatorioOrigemDestino.label = Desempenho Por Serviço indexController.mniRelatorioPassageirosViajar.label = Passageiros a Viajar indexController.mniRelatorioResumoLinhas.label = Resumo de Linhas +indexController.mniRelatorioIndiceIRK.label = Indice IRK indexController.mniRelatorioKmProgramada.label = Km Programada indexController.mniRelatorioAcompanhamentoEquivalentes.label = Indicadores (Acompanhamento de Equivalentes) indexController.mniRelatorioLinhasHorario.label = Linhas por Horário @@ -519,6 +520,8 @@ editarGrupoRutaController.MSG.borrarOK = Grupo de linha excluido com sucesso. #Relatórios +#Relatório IRK +relatorioIRKController.window.title= Relatório Indice IRK #Resumo de linhas relatorioResumoLinhasController.window.title = Relatório Resumo de Linhas @@ -653,7 +656,28 @@ relatorioLinhasHorarioController.lblSimplificado.value = Emite relatório Simpli relatorioLinhasHorarioController.lbHoraSaidaInicial.value = Hora Saída relatorioLinhasHorarioController.lbHoraSaidaFinal.value = à relatorioLinhasHorarioController.chKIda.value = Linha Ida -relatorioLinhasHorarioController.chKVolta.value = Linha Volta +relatorioLinhasHorarioController.chKVolta.value = Linha Volta + +#Relatório Indice IRK +relatorioIndiceIRKController.window.title = Relatório Indice IRK +relatorioIndiceIRKController.lbDataIni.value = Data Inicial Viagem +relatorioIndiceIRKController.lbDataFin.value = Data Final Viagem +relatorioIndiceIRKController.lbEmpresa.label = Empresa +relatorioIndiceIRKController.lbGrupoRuta.label = Grupo de Linhas +relatorioIndiceIRKController.lbLinha.label = Linha +relatorioIndiceIRKController.lbServico.label = Servico +relatorioIndiceIRKController.lbNumRuta.label = Num. Linha +relatorioIndiceIRKController.lbPrefixo.label = Prefixo +relatorioIndiceIRKController.lbOrgao.label = Orgão Concedente +relatorioIndiceIRKController.lbDataCorrida.value = Data +relatorioIndiceIRKController.btnPesquisa.label = Pesquisar +relatorioIndiceIRKController.btnLimpar.label = Limpar +relatorioIndiceIRKController.horaSaida.label = Hora +relatorioIndiceIRKController.origem.destino.label = Origem x Destino +relatorioIndiceIRKController.rutaId.label = Cód Linha +relatorioIndiceIRKController.rdTodos.label = Todos +relatorioIndiceIRKController.lbHoraSaidaInicial.value = Hora Saída +relatorioIndiceIRKController.lbHoraSaidaFinal.value = à #Relatorio Trecho Vendido relatorioTrechoVendidoController.lbDataIni.value = Data Inicial @@ -1663,6 +1687,7 @@ editarEmpresaController.lbAtivarRateioComissaoGrupoLinha.value = Ativar rateio d editarEmpresaController.lbUsarGrupoLinhas.value = Grupo de Linhas editarEmpresaController.lbUsarGrupoLinhasLinhaOriginal.value = Usar o Grupo de Linhas da linha original editarEmpresaController.lbUsarGrupoLinhasAproveitamentoSeletivo.value = Usar o Grupo de Linhas do Aproveitamento Seletivo +editarEmpresaController.irkPdarao.label = IRK Mínimo Padrão #Empresa Imposto editarEmpresaImpostoController.window.title = Configuração de Imposto por Empresa/Estado diff --git a/web/gui/catalogos/editarEmpresa.zul b/web/gui/catalogos/editarEmpresa.zul index 28b250345..b9304d0ca 100644 --- a/web/gui/catalogos/editarEmpresa.zul +++ b/web/gui/catalogos/editarEmpresa.zul @@ -924,6 +924,16 @@ + + + + + + + + diff --git a/web/gui/relatorios/filtroRelatorioIRK.zul b/web/gui/relatorios/filtroRelatorioIRK.zul new file mode 100644 index 000000000..c119166b0 --- /dev/null +++ b/web/gui/relatorios/filtroRelatorioIRK.zul @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +