This commit is contained in:
Cunha 2026-04-14 08:37:19 -03:00
parent fb2bec0fd5
commit 54ab21ef3b
91 changed files with 5660 additions and 195 deletions

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>datasets</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
<classpathentry kind="src" path=""/>
<classpathentry kind="output" path=""/>
</classpath>

View File

@ -0,0 +1 @@
org.eclipse.wst.jsdt.launching.JRE_CONTAINER

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>forms</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
<classpathentry kind="src" path=""/>
<classpathentry kind="output" path=""/>
</classpath>

View File

@ -0,0 +1 @@
org.eclipse.wst.jsdt.launching.JRE_CONTAINER

View File

@ -2,15 +2,16 @@
"version": "1.0.0", "version": "1.0.0",
"configurations": [ "configurations": [
{ {
"id": "cafi5jey9zammnjzp2n5z2h8lutld7", "id": "kcd262syqgmnhlewwba1vu2pgu6b",
"name": "Fluig produção", "name": "Fluig producao",
"host": "comerciode188006.fluig.cloudtotvs.com.br", "host": "comerciode188006.fluig.cloudtotvs.com.br",
"ssl": true, "ssl": true,
"port": 443, "port": 443,
"username": "andrey.cunha", "username": "andrey.cunha",
"password": "eyJpdiI6ImQwNjBhYWU1NzM3ZjVhNzU0ZWExOWYwZGZiNDEzNWI3Iiwic2FsdCI6IjQ0NmVjYTQ4OTY3ZWViOTc3NmRjY2E4M2UyYzc2NGViIiwidGV4dCI6ImNmZWRiYzFlODFjY2EwOTUzOWZlMGVlMTMzZWIwNzA0In0=", "password": "eyJpdiI6IjM5OWJjNjRiOGQ3Yjg5ZWEwYzk0Yzk4NWU5YjI5ODk4Iiwic2FsdCI6ImZjMzVmM2FmMDRhNjljNjA1YThiYzJjYTI5ZjU3NTgyIiwidGV4dCI6ImYwNDA2ZWYxOTM1N2FmMzYyYWZiODc4ZThjMmMzM2ZiIn0=",
"userCode": "andrey.cunha", "userCode": "andrey.cunha",
"confirmExporting": false, "confirmExporting": false,
"hasBrowser": false,
"companyId": 1 "companyId": 1
} }
] ]

View File

@ -79,7 +79,7 @@
</div> </div>
<h1 id="rcorners"> Lançamento de documento </h1> <h1 id="rcorners"> Lançamento de documento </h1>
<div class="container activity-all"> <div class="container activity-all">
@ -90,7 +90,7 @@
<h2> <h2>
<i class="flaticon flaticon-account-box" aria-hidden="true"></i> &nbsp;Dados do documento&nbsp; <i class="flaticon flaticon-account-box" aria-hidden="true"></i> &nbsp;Dados do documento&nbsp;
</h2> </h2>
<h6>Dados referentes ao documento que será lançado.</h6> <h6>Dados referentes ao documento que será lançado.</h6>
<br> <br>
</div> </div>
@ -113,11 +113,11 @@
</select> </select>
<p class="help-block" id="emitidoPor" <p class="help-block" id="emitidoPor"
style="display: none; position: absolute; font-size: 12px;">Preenchimento style="display: none; position: absolute; font-size: 12px;">Preenchimento
obrigatório</p> obrigatório</p>
</div> </div>
<div class="form-group col-md-3 col-xs-12 divResposavelPelaEmissao divEntidadeResponsavel alertaCampo"> <div class="form-group col-md-3 col-xs-12 divResposavelPelaEmissao divEntidadeResponsavel alertaCampo">
<label for="entidade_responsavel"> Nome do responsável pela emissão</label> <label for="entidade_responsavel"> Nome do responsável pela emissão</label>
<span class="required text-danger"><strong> * </strong></span> <span class="required text-danger"><strong> * </strong></span>
<input <input
type="text" type="text"
@ -133,11 +133,11 @@
/> />
<p class="help-block" id="entidadeResponsavel" <p class="help-block" id="entidadeResponsavel"
style="display: none; position: absolute; font-size: 12px;"> style="display: none; position: absolute; font-size: 12px;">
Preenchimento obrigatório Preenchimento obrigatório
</p> </p>
</div> </div>
<div class="form-group col-md-3 col-xs-12"> <div class="form-group col-md-3 col-xs-12">
<label> E-mail do usuário </label> <label> E-mail do usuário </label>
<input <input
type="email" type="email"
name="emailSolicitante" name="emailSolicitante"
@ -161,13 +161,13 @@
<label for="tipo_cadastro"> Tipo de cadastro </label><span <label for="tipo_cadastro"> Tipo de cadastro </label><span
class="required text-danger"><strong> * </strong></span> class="required text-danger"><strong> * </strong></span>
<select name="tipo_cadastro" id="tipo_cadastro" class="form-control"> <select name="tipo_cadastro" id="tipo_cadastro" class="form-control">
<option value="">Selecionar opção</option> <option value="">Selecionar opção</option>
<option value="cpf">CPF</option> <option value="cpf">CPF</option>
<option value="cnpj">CNPJ</option> <option value="cnpj">CNPJ</option>
</select> </select>
<p class="help-block" id="tipoCadastro" <p class="help-block" id="tipoCadastro"
style="display: none; position: absolute; font-size: 12px;">Preenchimento style="display: none; position: absolute; font-size: 12px;">Preenchimento
obrigatório</p> obrigatório</p>
</div> </div>
<div class="form-group col-md-3 col-xs-12 divCnpj alertaCampoj"> <div class="form-group col-md-3 col-xs-12 divCnpj alertaCampoj">
<label for="cnpj"> CNPJ </label> <span class="required text-danger"><strong> * <label for="cnpj"> CNPJ </label> <span class="required text-danger"><strong> *
@ -176,7 +176,7 @@
mask="00.000.000/0000-00" class="form-control" readonly /> mask="00.000.000/0000-00" class="form-control" readonly />
<p class="help-block" id="errorCnpj" <p class="help-block" id="errorCnpj"
style="display: none; position: absolute; font-size: 12px;">Preenchimento style="display: none; position: absolute; font-size: 12px;">Preenchimento
obrigatório</p> obrigatório</p>
<p class="help-block" style="color: #cc3d3d;" id="mensagemErroCnpj"></p> <p class="help-block" style="color: #cc3d3d;" id="mensagemErroCnpj"></p>
</div> </div>
@ -199,7 +199,7 @@
/> />
<p class="help-block" id="errorCpf" <p class="help-block" id="errorCpf"
style="display: none; position: absolute; font-size: 12px;"> style="display: none; position: absolute; font-size: 12px;">
Preenchimento obrigatório Preenchimento obrigatório
</p> </p>
<p class="help-block" style="color: #cc3d3d" id="mensagemErroCpf"></p> <p class="help-block" style="color: #cc3d3d" id="mensagemErroCpf"></p>
</div> </div>
@ -207,8 +207,9 @@
<label for="tipo_documento"> Tipo de documento </label> <label for="tipo_documento"> Tipo de documento </label>
<select name="tipo_documento" id="tipo_documento" class="form-control"> <select name="tipo_documento" id="tipo_documento" class="form-control">
<option value="">Selecionar tipo de documento</option> <option value="">Selecionar tipo de documento</option>
<option value="danfe">Nota Fiscal de Mercadoria</option> <option value="energia">Documento de energia</option>
<option value="nota_fiscal_servico">Nota Fiscal de Serviços</option> <option value="agua">Documento de água</option>
<option value="internet">Documento de Internet</option>
</select> </select>
</div> </div>
</div> </div>
@ -219,13 +220,13 @@
<div class="form-field"> <div class="form-field">
<div class="form-input"> <div class="form-input">
<div class="form-group col-md-6 col-xs-12 divNumeroDocumento alertaCampo"> <div class="form-group col-md-6 col-xs-12 divNumeroDocumento alertaCampo">
<label> Número do documento </label><span class="required text-danger"><strong> * <label> Número do documento </label><span class="required text-danger"><strong> *
</strong></span> </strong></span>
<input type="text" name="numero_documento" id="numero_documento" <input type="text" name="numero_documento" id="numero_documento"
placeholder="Inserir número do documento" class="form-control" /> placeholder="Inserir número do documento" class="form-control" />
<p class="help-block" id="numeroDocumento" <p class="help-block" id="numeroDocumento"
style="display: none; position: absolute; font-size: 12px;">Preenchimento style="display: none; position: absolute; font-size: 12px;">Preenchimento
obrigatório</p> obrigatório</p>
</div> </div>
<div class="form-group col-md-6 col-xs-12"> <div class="form-group col-md-6 col-xs-12">
<label for="valor_contrato"> Valor do documento (se houver)</label> <label for="valor_contrato"> Valor do documento (se houver)</label>
@ -245,8 +246,8 @@
<label id="labelAnexaCota">Anexar documento</label> <label id="labelAnexaCota">Anexar documento</label>
<span class="required text-danger"> <strong> * </strong> <span class="required text-danger"> <strong> * </strong>
</span> </span>
<p id="descAnexaCota">Utilize a aba anexos para anexar o documento ou o botão <p id="descAnexaCota">Utilize a aba anexos para anexar o documento ou o botão
abaixo. <strong> Anexo obrigatório. </strong></p> abaixo. <strong> Anexo obrigatório. </strong></p>
<input type="button" class="btn btn-primary" id="anexaDocumento" <input type="button" class="btn btn-primary" id="anexaDocumento"
value="Anexar documento" onclick="showCamera('anexo_documento');" value="Anexar documento" onclick="showCamera('anexo_documento');"
style="margin-top: 25px;" /> style="margin-top: 25px;" />
@ -258,21 +259,21 @@
<br> <br>
<h2><i class="flaticon flaticon-message-question" aria-hidden="true"> <h2><i class="flaticon flaticon-message-question" aria-hidden="true">
</i> &nbsp;Descrição dos serviços </i> &nbsp;Descrição dos serviços
&nbsp; &nbsp;
</h2> </h2>
<h6>Descrição detalhada dos serviços prestados e as possíveis informações complementares.</h6> <h6>Descrição detalhada dos serviços prestados e as possíveis informações complementares.</h6>
<br> <br>
<div class="row"> <div class="row">
<div class="form-field"> <div class="form-field">
<div class="form-input"> <div class="form-input">
<div class="form-group col-md-12 col-xs-12 divJustificativa alertaCampo"> <div class="form-group col-md-12 col-xs-12 divJustificativa alertaCampo">
<label for="justificativa"> Descrição dos serviços </label> <span <label for="justificativa"> Descrição dos serviços </label> <span
class="required text-danger"><strong> * </strong></span> class="required text-danger"><strong> * </strong></span>
<textarea class="form-control" rows="3" id="justificativa" name="justificativa" <textarea class="form-control" rows="3" id="justificativa" name="justificativa"
placeholder="Descreva os serviços prestados."></textarea> placeholder="Descreva os serviços prestados."></textarea>
<p class="help-block" id="msgJustificativa" style="display: none;">Preenchimento <p class="help-block" id="msgJustificativa" style="display: none;">Preenchimento
obrigatório</p> obrigatório</p>
</div> </div>
</div> </div>
</div> </div>
@ -294,10 +295,10 @@
<br> <br>
</div> </div>
<div class="row"> <div class="row">
<div class="form-field"> <div class="form-field">
<div class="form-input"> <div class="form-input">
<div class="form-group col-md-10 col-xs-6"> <div class="form-group col-md-10 col-xs-6">
<label> Responsável por lançamento de documentos </label> <label> Responsável por lançamento de documentos </label>
<input <input
type="text" type="text"
@ -322,6 +323,110 @@
readonly readonly
/> />
</div> </div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-field">
<div class="form-input">
<div class="form-group col-md-3 col-xs-12 divFilialAnalista alertaCampo">
<label for="FILIAL">Filial <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="FILIAL" id="FILIAL" class="form-control" placeholder="010101" />
<p class="help-block" id="filialAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divPrefixoAnalista alertaCampo">
<label for="PREFIXO">Prefixo <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="PREFIXO" id="PREFIXO" class="form-control" placeholder="NF" />
<p class="help-block" id="prefixoAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-4 col-xs-12 divNumeroAnalista alertaCampo">
<label for="NUMERO">Número <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="NUMERO" id="NUMERO" class="form-control" placeholder="010203045" />
<p class="help-block" id="numeroAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-2 col-xs-12 divParcelaAnalista alertaCampo">
<label for="PARCELA">Parcela <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="PARCELA" id="PARCELA" class="form-control" placeholder="01" />
<p class="help-block" id="parcelaAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-field">
<div class="form-input">
<div class="form-group col-md-3 col-xs-12 divTipoAnalista alertaCampo">
<label for="TIPO">Tipo <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="TIPO" id="TIPO" class="form-control" placeholder="NF" />
<p class="help-block" id="tipoAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divNaturezaAnalista alertaCampo">
<label for="NATUREZA">Natureza <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="NATUREZA" id="NATUREZA" class="form-control" placeholder="20201001" />
<p class="help-block" id="naturezaAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divCodFornAnalista alertaCampo">
<label for="COD_FORN">Código do fornecedor <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="COD_FORN" id="COD_FORN" class="form-control" placeholder="00000914" />
<p class="help-block" id="codFornAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divLojaAnalista alertaCampo">
<label for="LOJA">Loja <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="LOJA" id="LOJA" class="form-control" placeholder="01" />
<p class="help-block" id="lojaAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-field">
<div class="form-input">
<div class="form-group col-md-3 col-xs-12 divEmissaoAnalista alertaCampo">
<label for="EMISSAO">Emissão <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="EMISSAO" id="EMISSAO" class="form-control" placeholder="20260402" />
<p class="help-block" id="emissaoAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divVencimentoAnalista alertaCampo">
<label for="VENCIMENTO">Vencimento <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="VENCIMENTO" id="VENCIMENTO" class="form-control" placeholder="20260402" />
<p class="help-block" id="vencimentoAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divVencRealAnalista alertaCampo">
<label for="VENC_REAL">Vencimento real <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="VENC_REAL" id="VENC_REAL" class="form-control" placeholder="20260402" />
<p class="help-block" id="vencRealAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divValorAnalista alertaCampo">
<label for="VALORtotal">Valor <span class="required text-danger"><strong>*</strong></span></label>
<input type="number" step="0.01" name="VALORtotal" id="VALORtotal" class="form-control" placeholder="1500.75" />
<p class="help-block" id="valorAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-field">
<div class="form-input">
<div class="form-group col-md-6 col-xs-12 divHistoricoAnalista alertaCampo">
<label for="HISTORICO">Histórico <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="HISTORICO" id="HISTORICO" class="form-control" placeholder="Teste Postman" />
<p class="help-block" id="historicoAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divCodigoBarrasAnalista">
<label for="CODIGO_BARRAS">Código de barras</label>
<input type="text" name="CODIGO_BARRAS" id="CODIGO_BARRAS" class="form-control" />
<p class="help-block" id="codigoBarrasAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
<div class="form-group col-md-3 col-xs-12 divCentroCustoAnalista alertaCampo">
<label for="CENTRO_CUSTO">Centro de custo <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" name="CENTRO_CUSTO" id="CENTRO_CUSTO" class="form-control" placeholder="41101" />
<p class="help-block" id="centroCustoAnalista" style="display: none;">Preenchimento obrigatorio</p>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -926,7 +1031,35 @@
$("#msgJustificativa").show(); $("#msgJustificativa").show();
erro++; erro++;
} }
} if (activity == ANALISAR_DOCUMENTO) { }
if (activity == ANALISAR_DOCUMENTO) {
var camposAnalistaObrigatorios = [
{ valor: $("#FILIAL").val(), classe: ".divFilialAnalista", help: "#filialAnalista" },
{ valor: $("#PREFIXO").val(), classe: ".divPrefixoAnalista", help: "#prefixoAnalista" },
{ valor: $("#NUMERO").val(), classe: ".divNumeroAnalista", help: "#numeroAnalista" },
{ valor: $("#PARCELA").val(), classe: ".divParcelaAnalista", help: "#parcelaAnalista" },
{ valor: $("#TIPO").val(), classe: ".divTipoAnalista", help: "#tipoAnalista" },
{ valor: $("#NATUREZA").val(), classe: ".divNaturezaAnalista", help: "#naturezaAnalista" },
{ valor: $("#COD_FORN").val(), classe: ".divCodFornAnalista", help: "#codFornAnalista" },
{ valor: $("#LOJA").val(), classe: ".divLojaAnalista", help: "#lojaAnalista" },
{ valor: $("#EMISSAO").val(), classe: ".divEmissaoAnalista", help: "#emissaoAnalista" },
{ valor: $("#VENCIMENTO").val(), classe: ".divVencimentoAnalista", help: "#vencimentoAnalista" },
{ valor: $("#VENC_REAL").val(), classe: ".divVencRealAnalista", help: "#vencRealAnalista" },
{ valor: $("#VALOR").val(), classe: ".divValorAnalista", help: "#valorAnalista" },
{ valor: $("#HISTORICO").val(), classe: ".divHistoricoAnalista", help: "#historicoAnalista" },
{ valor: $("#CENTRO_CUSTO").val(), classe: ".divCentroCustoAnalista", help: "#centroCustoAnalista" }
];
for (var i = 0; i < camposAnalistaObrigatorios.length; i++) {
var campo = camposAnalistaObrigatorios[i];
if (campo.valor == undefined || campo.valor == "" || campo.valor == null) {
$(campo.classe).addClass("has-error");
$(campo.help).show();
erro++;
}
}
var justi_decisao_gestor = $("#justi_decisao_gestor").val();
if (justi_decisao_gestor == undefined || justi_decisao_gestor == "" || justi_decisao_gestor == null) { if (justi_decisao_gestor == undefined || justi_decisao_gestor == "" || justi_decisao_gestor == null) {
$(".divJustiDecisaoGestor").addClass("has-error"); $(".divJustiDecisaoGestor").addClass("has-error");
$("#justiDecisaoGestor").show(); $("#justiDecisaoGestor").show();

View File

@ -0,0 +1,61 @@
eclipse.preferences.version=1
encoding//wcm/widget/wdtransf/src/main/resources/application.info=utf8
encoding//wcm/widget/wdtransf/src/main/resources/edit.ftl=utf8
encoding//wcm/widget/wdtransf/src/main/resources/view.ftl=utf8
encoding//wcm/widget/wdtransf/src/main/resources/wdtransf.properties=utf8
encoding//wcm/widget/wdtransf/src/main/resources/wdtransf_en_US.properties=utf8
encoding//wcm/widget/wdtransf/src/main/resources/wdtransf_es.properties=utf8
encoding//wcm/widget/wdtransf/src/main/resources/wdtransf_pt_BR.properties=utf8
encoding//wcm/widget/wdtransf/src/main/webapp/WEB-INF/jboss-web.xml=utf8
encoding//wcm/widget/wdtransf/src/main/webapp/WEB-INF/web.xml=utf8
encoding//wcm/widget/wdtransf/src/main/webapp/resources/css/wdtransf.css=utf8
encoding//wcm/widget/wdtransf/src/main/webapp/resources/images/icon.png=utf8
encoding//wcm/widget/wdtransf/src/main/webapp/resources/js/wdtransf.js=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/application.info=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/edit.ftl=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/view.ftl=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista.properties=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_en_US.properties=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_es.properties=utf8
encoding//wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_pt_BR.properties=utf8
encoding//wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/jboss-web.xml=utf8
encoding//wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/web.xml=utf8
encoding//wcm/widget/wdtransfanalista/src/main/webapp/resources/css/wdtransfanalista.css=utf8
encoding//wcm/widget/wdtransfanalista/src/main/webapp/resources/images/icon.png=utf8
encoding//wcm/widget/wdtransfanalista/src/main/webapp/resources/js/wdtransfanalista.js=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/application.info=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/edit.ftl=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/view.ftl=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/wdtransfloja.properties=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_en_US.properties=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_es.properties=utf8
encoding//wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_pt_BR.properties=utf8
encoding//wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/jboss-web.xml=utf8
encoding//wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/web.xml=utf8
encoding//wcm/widget/wdtransfloja/src/main/webapp/resources/css/wdtransfloja.css=utf8
encoding//wcm/widget/wdtransfloja/src/main/webapp/resources/images/icon.png=utf8
encoding//wcm/widget/wdtransfloja/src/main/webapp/resources/js/wdtransfloja.js=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/application.info=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/edit.ftl=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/view.ftl=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista.properties=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_en_US.properties=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_es.properties=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_pt_BR.properties=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/jboss-web.xml=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/web.xml=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/webapp/resources/css/wdtransfmotorista.css=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/webapp/resources/images/icon.png=utf8
encoding//wcm/widget/wdtransfmotorista/src/main/webapp/resources/js/wdtransfmotorista.js=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/application.info=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/edit.ftl=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/view.ftl=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/wdtransfreg.properties=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_en_US.properties=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_es.properties=utf8
encoding//wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_pt_BR.properties=utf8
encoding//wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/jboss-web.xml=utf8
encoding//wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/web.xml=utf8
encoding//wcm/widget/wdtransfreg/src/main/webapp/resources/css/wdtransfreg.css=utf8
encoding//wcm/widget/wdtransfreg/src/main/webapp/resources/images/icon.png=utf8
encoding//wcm/widget/wdtransfreg/src/main/webapp/resources/js/wdtransfreg.js=utf8

View File

@ -13,6 +13,19 @@
"confirmExporting": false, "confirmExporting": false,
"hasBrowser": false, "hasBrowser": false,
"companyId": 1 "companyId": 1
},
{
"id": "ktaxtphdhzqmn8tbsn4t14t2skqwo",
"name": "Producao",
"host": "comerciode188006.fluig.cloudtotvs.com.br",
"ssl": true,
"port": 443,
"username": "andrey.cunha",
"password": "eyJpdiI6ImFmYzY2MWIzNmNmMTNhYTRkZTUyZGVjZjFhOWJjMmI2Iiwic2FsdCI6ImNhMTQ4ZWIxMjAzMDQyZDM5MGY0YzVlM2Y3ZjUyMmUwIiwidGV4dCI6IjRhZjUwNjcxMzFkZjljYmVlOGI5Y2JjNzU2ZmRiMWYyIn0=",
"userCode": "andrey.cunha",
"confirmExporting": false,
"hasBrowser": false,
"companyId": 1
} }
] ]
} }

View File

@ -119,7 +119,7 @@ function parseConstraints(constraints) {
var out = { var out = {
pdv: "", pdv: "",
loja: "", loja: "",
onlyAtivo: true, onlyAtivo: false,
termoLivre: "" termoLivre: ""
}; };

View File

@ -38,14 +38,14 @@ function createDataset(fields, constraints, sortFields) {
} }
var auth = resolveAuth(constraints); var auth = resolveAuth(constraints);
var authVariants = buildAuthVariants(auth);
var diagnostics = []; var diagnostics = [];
var query = "page=1&page_size=50&key=" + key + "&sort_by=updatedAt&sort_order=desc";
var endpoints = [ var endpoints = [
"/fiscal-invoices?key=" + key, "/v2/vendas/rgb-transferencias?" + query,
"fiscal-invoices?key=" + key, "v2/vendas/rgb-transferencias?" + query,
"/fiscal/invoices?key=" + key, "/rgb-transferencias?" + query
"/fiscal/invoice?key=" + key,
"/invoice?key=" + key
]; ];
var apiObj = null; var apiObj = null;
@ -56,15 +56,21 @@ function createDataset(fields, constraints, sortFields) {
var clientService = fluigAPI.getAuthorizeClientService(); var clientService = fluigAPI.getAuthorizeClientService();
for (var i = 0; i < endpoints.length; i++) { for (var i = 0; i < endpoints.length; i++) {
var endpoint = endpoints[i]; var endpoint = endpoints[i];
var resp = invokeAuthorizedGet(clientService, endpoint, auth); for (var a = 0; a < authVariants.length; a++) {
diagnostics.push(endpoint + " => HTTP " + trim(resp.status)); var authVariant = authVariants[a];
var parsed = parseApiPayload(resp.body); var resp = invokeAuthorizedGet(clientService, endpoint, authVariant);
if (parsed && trim(parsed.message)) { diagnostics.push(endpoint + " [" + authVariant.name + "] => HTTP " + trim(resp.status));
lastApiMessage = trim(parsed.message); var parsed = parseApiPayload(resp.body);
if (parsed && trim(parsed.message)) {
lastApiMessage = trim(parsed.message);
}
if (String(resp.status) === "200" && isApiSuccess(parsed)) {
apiObj = parsed;
hitInfo = endpoint + " [" + authVariant.name + "]";
break;
}
} }
if (String(resp.status) === "200" && isApiSuccess(parsed)) { if (apiObj) {
apiObj = parsed;
hitInfo = endpoint;
break; break;
} }
} }
@ -74,21 +80,26 @@ function createDataset(fields, constraints, sortFields) {
if (!apiObj) { if (!apiObj) {
var directUrls = [ var directUrls = [
"https://api.grupoginseng.com.br/fiscal-invoices?key=" + key, "https://api.grupoginseng.com.br/v2/vendas/rgb-transferencias?" + query
"https://api.grupoginseng.com.br/fiscal/invoice?key=" + key
]; ];
for (var d = 0; d < directUrls.length; d++) { for (var d = 0; d < directUrls.length; d++) {
var url = directUrls[d]; var url = directUrls[d];
var directResp = fetchDirect(url, 30000, auth); for (var da = 0; da < authVariants.length; da++) {
diagnostics.push(url + " => HTTP " + trim(directResp.status)); var directAuthVariant = authVariants[da];
var parsedDirect = parseApiPayload(directResp.body); var directResp = fetchDirect(url, 30000, directAuthVariant);
if (parsedDirect && trim(parsedDirect.message)) { diagnostics.push(url + " [" + directAuthVariant.name + "] => HTTP " + trim(directResp.status));
lastApiMessage = trim(parsedDirect.message); var parsedDirect = parseApiPayload(directResp.body);
if (parsedDirect && trim(parsedDirect.message)) {
lastApiMessage = trim(parsedDirect.message);
}
if (String(directResp.status) === "200" && isApiSuccess(parsedDirect)) {
apiObj = parsedDirect;
hitInfo = url + " [" + directAuthVariant.name + "]";
break;
}
} }
if (String(directResp.status) === "200" && isApiSuccess(parsedDirect)) { if (apiObj) {
apiObj = parsedDirect;
hitInfo = url;
break; break;
} }
} }
@ -103,34 +114,33 @@ function createDataset(fields, constraints, sortFields) {
return dataset; return dataset;
} }
if (!apiObj.success || !apiObj.data) { var dataNfe = extractInvoiceData(apiObj, key);
if (!dataNfe) {
addErrorRow(dataset, trim(apiObj.message) || "NFe nao encontrada. Fonte: " + hitInfo); addErrorRow(dataset, trim(apiObj.message) || "NFe nao encontrada. Fonte: " + hitInfo);
return dataset; return dataset;
} }
var itens = resolveItems(dataNfe);
var dataNfe = apiObj.data || {};
var itens = dataNfe.itens || [];
var itensJson = JSON.stringify(buildNfeItems(itens)); var itensJson = JSON.stringify(buildNfeItems(itens));
dataset.addRow([ dataset.addRow([
"true", "true",
"OK (" + hitInfo + ")", "OK (" + hitInfo + ")",
trim(dataNfe.key), trim(dataNfe.key || dataNfe.nfeKey || dataNfe.chave || key),
trim(dataNfe.invoiceNumber), trim(dataNfe.invoiceNumber || dataNfe.numeroNota || dataNfe.numero || dataNfe.number),
trim(dataNfe.serie), trim(dataNfe.serie || dataNfe.series),
formatIsoDate(dataNfe.emissionDate), formatIsoDate(dataNfe.emissionDate || dataNfe.issueDate || dataNfe.invoiceDate),
formatIsoDate(dataNfe.operationDate), formatIsoDate(dataNfe.operationDate || dataNfe.transactionDate || dataNfe.operation_at),
trim(dataNfe.supplierName), trim(dataNfe.supplierName || dataNfe.supplier || dataNfe.fornecedor || dataNfe.emitente),
trim(dataNfe.documentValue), trim(dataNfe.documentValue || dataNfe.totalValue || dataNfe.valorDocumento || dataNfe.amount),
trim(dataNfe.totalItemsValue), trim(dataNfe.totalItemsValue || dataNfe.itemsValue || dataNfe.valorItens || dataNfe.totalValue),
trim(dataNfe.situation), trim(dataNfe.situation || dataNfe.status),
trim(dataNfe.fiscalOperationDescription), trim(dataNfe.fiscalOperationDescription || dataNfe.operationDescription || dataNfe.naturezaOperacao),
String(itens.length), String(itens.length),
itensJson, itensJson,
trim(dataNfe.storeId), trim(dataNfe.storeId || dataNfe.pdv || dataNfe.storeCode || dataNfe.lojaId),
trim(dataNfe.invoiceId), trim(dataNfe.invoiceId || dataNfe.id_venda || dataNfe.id || dataNfe.transferId),
trim(dataNfe.emitterEmployeeId), trim(dataNfe.emitterEmployeeId || dataNfe.emitterId || dataNfe.usuarioEmissor),
formatIsoDateTime(dataNfe.updatedAt) formatIsoDateTime(dataNfe.updatedAt || dataNfe.modifiedAt || dataNfe.lastUpdate)
]); ]);
} catch (e) { } catch (e) {
addErrorRow(dataset, "Erro ao consultar a NFe: " + e); addErrorRow(dataset, "Erro ao consultar a NFe: " + e);
@ -187,11 +197,12 @@ function addErrorRow(dataset, message) {
function getConstraintValue(constraints, fieldName) { function getConstraintValue(constraints, fieldName) {
if (!constraints || !fieldName) return ""; if (!constraints || !fieldName) return "";
var target = String(fieldName).toLowerCase();
for (var i = 0; i < constraints.length; i++) { for (var i = 0; i < constraints.length; i++) {
var c = constraints[i]; var c = constraints[i];
if (!c || !c.fieldName) continue; if (!c || !c.fieldName) continue;
if (String(c.fieldName) === String(fieldName)) { if (String(c.fieldName).toLowerCase() === target) {
return c.initialValue; return c.initialValue;
} }
} }
@ -199,7 +210,13 @@ function getConstraintValue(constraints, fieldName) {
} }
function resolveAuth(constraints) { function resolveAuth(constraints) {
var token = trim(getConstraintValue(constraints, "token")); var token = trim(getFirstConstraintValue(constraints, [
"token",
"accessToken",
"xAccessToken",
"bearerToken",
"access_token"
]));
if (!token) { if (!token) {
try { try {
token = trim(java.lang.System.getenv("GINSENG_FISCAL_TOKEN")); token = trim(java.lang.System.getenv("GINSENG_FISCAL_TOKEN"));
@ -210,8 +227,16 @@ function resolveAuth(constraints) {
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhcGlnaW5zZW5nIiwiZXhwIjoxNzg3NDQ4MDY3fQ.GJqcIJBkMIfp_q_KRzgGuAHWWo93j3FWo3TObKqlAwA"; token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhcGlnaW5zZW5nIiwiZXhwIjoxNzg3NDQ4MDY3fQ.GJqcIJBkMIfp_q_KRzgGuAHWWo93j3FWo3TObKqlAwA";
} }
var basicUser = trim(getConstraintValue(constraints, "basicUser")); var basicUser = trim(getFirstConstraintValue(constraints, [
var basicPass = trim(getConstraintValue(constraints, "basicPass")); "basicUser",
"username",
"user"
]));
var basicPass = trim(getFirstConstraintValue(constraints, [
"basicPass",
"password",
"pass"
]));
// Fallback operacional para homologacao, conforme credenciais validadas em teste manual. // Fallback operacional para homologacao, conforme credenciais validadas em teste manual.
if (!basicUser) basicUser = "fluig"; if (!basicUser) basicUser = "fluig";
@ -224,19 +249,84 @@ function resolveAuth(constraints) {
}; };
} }
function invokeAuthorizedGet(clientService, endpoint, auth) { function getFirstConstraintValue(constraints, names) {
var authHeader = resolveAuthHeader(auth); if (!names || !(names instanceof Array)) return "";
var headers = { "Accept": "application/json" }; for (var i = 0; i < names.length; i++) {
if (authHeader) { var val = getConstraintValue(constraints, names[i]);
headers.Authorization = authHeader; if (trim(val)) return val;
if (auth && auth.token) { }
headers["x-access-token"] = auth.token; return "";
}
function buildAuthVariants(auth) {
auth = auth || {};
var variants = [];
var token = trim(auth.token);
var basicUser = trim(auth.basicUser);
var basicPass = trim(auth.basicPass);
var basicHeader = buildBasicAuthHeader(basicUser, basicPass);
if (token) {
variants.push({
name: "Bearer+XToken",
authorization: "Bearer " + token,
xAccessToken: token
});
variants.push({
name: "XToken",
xAccessToken: token
});
variants.push({
name: "Bearer",
authorization: "Bearer " + token
});
}
if (basicHeader) {
variants.push({
name: "Basic",
authorization: basicHeader
});
if (token) {
variants.push({
name: "Basic+XToken",
authorization: basicHeader,
xAccessToken: token
});
} }
} }
variants.push({ name: "NoAuth" });
return dedupeAuthVariants(variants);
}
function dedupeAuthVariants(variants) {
var out = [];
var seen = {};
for (var i = 0; i < variants.length; i++) {
var v = variants[i] || {};
var signature = trim(v.authorization) + "|" + trim(v.xAccessToken);
if (seen[signature]) continue;
seen[signature] = true;
out.push(v);
}
if (!out.length) {
out.push({ name: "NoAuth" });
}
return out;
}
function invokeAuthorizedGet(clientService, endpoint, authVariant) {
var headers = { "Accept": "application/json" };
applyAuthHeaders(headers, authVariant);
var data = { var data = {
companyId: String(getValue("WKCompany") || "1"), companyId: String(getValue("WKCompany") || "1"),
serviceCode: "GinsengAPI2", serviceCode: "Fastapi",
endpoint: endpoint, endpoint: endpoint,
method: "get", method: "get",
timeoutService: "30000", timeoutService: "30000",
@ -284,12 +374,113 @@ function parseApiPayload(bodyText) {
} }
function isApiSuccess(obj) { function isApiSuccess(obj) {
if (!obj || !obj.data) return false; if (!obj) return false;
if (obj.success === true) return true; if (obj.success === true) return true;
if (String(obj.success).toLowerCase() === "true") return true; if (String(obj.success).toLowerCase() === "true") return true;
if (obj.data || obj.items || obj.result || obj.content) return true;
return false; return false;
} }
function extractInvoiceData(apiObj, expectedKey) {
if (!apiObj) return null;
var normalizedKey = normalizeDigits(expectedKey);
return extractInvoiceFromNode(apiObj, normalizedKey);
}
function extractInvoiceFromNode(node, normalizedKey) {
if (!node) return null;
if (typeof node === "string") {
var parsed = parseJsonSafe(node);
if (!parsed) return null;
return extractInvoiceFromNode(parsed, normalizedKey);
}
if (node instanceof Array) {
return extractInvoiceFromArray(node, normalizedKey);
}
if (matchesInvoiceObject(node, normalizedKey)) {
return node;
}
var nestedCandidates = [
node.data,
node.items,
node.rows,
node.results,
node.content,
node.result,
node.list,
node.transferencias,
node.rgbTransferencias
];
for (var i = 0; i < nestedCandidates.length; i++) {
var nested = extractInvoiceFromNode(nestedCandidates[i], normalizedKey);
if (nested) return nested;
}
return null;
}
function extractInvoiceFromArray(list, normalizedKey) {
if (!list || !(list instanceof Array) || list.length === 0) return null;
for (var i = 0; i < list.length; i++) {
var item = list[i];
if (matchesInvoiceObject(item, normalizedKey)) {
return item;
}
}
return list[0] || null;
}
function matchesInvoiceObject(item, normalizedKey) {
if (!item || item instanceof Array || typeof item !== "object") return false;
var keyCandidate = normalizeDigits(item.key || item.nfeKey || item.chave || item.invoiceKey || item.nfe_key);
if (normalizedKey && keyCandidate) {
return keyCandidate === normalizedKey;
}
if (keyCandidate) return true;
var hasIdentity = trim(item.invoiceNumber || item.numeroNota || item.invoiceId || item.transferId);
return !!hasIdentity;
}
function resolveItems(dataNfe) {
if (!dataNfe || typeof dataNfe !== "object") return [];
var candidates = [
dataNfe.itens,
dataNfe.itensJson,
dataNfe.items,
dataNfe.products,
dataNfe.produtos
];
for (var i = 0; i < candidates.length; i++) {
var raw = candidates[i];
if (!raw) continue;
if (raw instanceof Array) {
return raw;
}
if (typeof raw === "string") {
var parsed = parseJsonSafe(raw);
if (parsed instanceof Array) {
return parsed;
}
}
}
return [];
}
function fetchDirect(url, timeoutMs, auth) { function fetchDirect(url, timeoutMs, auth) {
var conn = null; var conn = null;
var reader = null; var reader = null;
@ -305,10 +496,12 @@ function fetchDirect(url, timeoutMs, auth) {
conn.setReadTimeout(timeoutMs || 30000); conn.setReadTimeout(timeoutMs || 30000);
conn.setRequestProperty("Accept", "application/json"); conn.setRequestProperty("Accept", "application/json");
var authHeader = resolveAuthHeader(auth); var authHeaders = {};
if (authHeader) { applyAuthHeaders(authHeaders, auth);
conn.setRequestProperty("Authorization", authHeader); for (var h in authHeaders) {
if (auth.token) conn.setRequestProperty("x-access-token", auth.token); if (!authHeaders.hasOwnProperty(h)) continue;
if (!authHeaders[h]) continue;
conn.setRequestProperty(h, String(authHeaders[h]));
} }
var status = conn.getResponseCode(); var status = conn.getResponseCode();
@ -331,18 +524,30 @@ function fetchDirect(url, timeoutMs, auth) {
} }
} }
function resolveAuthHeader(auth) { function applyAuthHeaders(headers, authVariant) {
auth = auth || {}; headers = headers || {};
if (auth.basicUser && auth.basicPass) { authVariant = authVariant || {};
var raw = String(auth.basicUser) + ":" + String(auth.basicPass);
var bytes = new java.lang.String(raw).getBytes("UTF-8"); var authorization = trim(authVariant.authorization);
var encoded = java.util.Base64.getEncoder().encodeToString(bytes); var xAccessToken = trim(authVariant.xAccessToken);
return "Basic " + String(encoded);
if (authorization) {
headers.Authorization = authorization;
} }
if (auth.token) { if (xAccessToken) {
return "Bearer " + String(auth.token); headers["x-access-token"] = xAccessToken;
} }
return ""; }
function buildBasicAuthHeader(basicUser, basicPass) {
var user = trim(basicUser);
var pass = trim(basicPass);
if (!user || !pass) return "";
var raw = String(user) + ":" + String(pass);
var bytes = new java.lang.String(raw).getBytes("UTF-8");
var encoded = java.util.Base64.getEncoder().encodeToString(bytes);
return "Basic " + String(encoded);
} }
function buildNfeItems(items) { function buildNfeItems(items) {
@ -354,7 +559,8 @@ function buildNfeItems(items) {
out.push({ out.push({
productId: trim(item.productId), productId: trim(item.productId),
quantity: toNumber(item.quantity || item.completeQuantity), quantity: toNumber(item.quantity || item.completeQuantity),
code: trim(item.code || item.sku || item.productCode || item.codigo) code: trim(item.code || item.sku || item.productCode || item.codigo || item.productId),
unitValue: toNumber(item.unitValue || item.unit_value || item.value)
}); });
} }

View File

@ -32,7 +32,7 @@ function createDataset(fields, constraints, sortFields) {
var clientService = fluigAPI.getAuthorizeClientService(); var clientService = fluigAPI.getAuthorizeClientService();
var data = { var data = {
companyId: String(getValue("WKCompany") || "1"), companyId: String(getValue("WKCompany") || "1"),
serviceCode: "GINSENG APITESTE", serviceCode: "GinsengAPI2",
endpoint: "/dados_rgb_products", endpoint: "/dados_rgb_products",
method: "get", method: "get",
timeoutService: "60000", timeoutService: "60000",

View File

@ -39,7 +39,7 @@ function validateForm(form) {
} }
var qtdDivergenciasNfe = parseInt(String(form.getValue("qtdDivergenciasNfe") || "0"), 10); var qtdDivergenciasNfe = parseInt(String(form.getValue("qtdDivergenciasNfe") || "0"), 10);
if (!isNaN(qtdDivergenciasNfe) && qtdDivergenciasNfe > 0) { if (!isNaN(qtdDivergenciasNfe) && qtdDivergenciasNfe > 0) {
message += "Existem " + qtdDivergenciasNfe + " divergencia(s) entre a solicitacao e a NFe.<br>"; message += "Existem " + qtdDivergenciasNfe + " divergencia(s) entre a base aprovada e a NFe.<br>";
hasErros = true; hasErros = true;
} }
if (form.getValue("usuarioEmissorNfe") == "") { if (form.getValue("usuarioEmissorNfe") == "") {

View File

@ -1,8 +1,34 @@
var EXCEL_ATTACHMENT_DESCRIPTION = "Planilha de Itens Excel";
var EXCEL_ATTACHMENT_INPUT_ID = "fnAnexo_PlanilhaItens";
function updateExcelImportUi(filename) {
var name = String(filename || "").trim();
if (name) {
$("#nomeArquivoExcel").text("Arquivo selecionado: " + name);
$("#btnAdicionarExcel").hide();
$("#btnRemoverExcel").show();
return;
}
$("#nomeArquivoExcel").text("Nenhum arquivo selecionado");
$("#btnAdicionarExcel").show();
$("#btnRemoverExcel").hide();
}
function getExcelAttachmentField() {
var $field = $("#" + EXCEL_ATTACHMENT_INPUT_ID);
if ($field.length) return $field;
return $("#_" + EXCEL_ATTACHMENT_INPUT_ID);
}
$(document).ready(function () { $(document).ready(function () {
// Quando clicar em "Adicionar arquivo" // Quando clicar em "Adicionar arquivo"
$('#btnAdicionarExcel').on('click', function () { $('#btnAdicionarExcel').on('click', function () {
$('#excelUpload').click(); // aciona o input escondido if (typeof uploadFile === "function" && getExcelAttachmentField().length) {
uploadFile(EXCEL_ATTACHMENT_DESCRIPTION, EXCEL_ATTACHMENT_INPUT_ID);
return;
}
$('#excelUpload').click(); // fallback: aciona o input escondido
}); });
// Quando um arquivo for selecionado // Quando um arquivo for selecionado
@ -10,10 +36,7 @@ $(document).ready(function () {
const file = this.files[0]; const file = this.files[0];
if (file) { if (file) {
$('#nomeArquivoExcel').text('Arquivo selecionado: ' + file.name); updateExcelImportUi(file.name);
$('#btnAdicionarExcel').hide();
$('#btnRemoverExcel').show();
carregarItensDoExcel('excelUpload'); // chama sua função carregarItensDoExcel('excelUpload'); // chama sua função
} }
}); });
@ -21,9 +44,17 @@ $(document).ready(function () {
// Quando clicar em "Remover arquivo" // Quando clicar em "Remover arquivo"
$('#btnRemoverExcel').on('click', function () { $('#btnRemoverExcel').on('click', function () {
$('#excelUpload').val(''); $('#excelUpload').val('');
$('#nomeArquivoExcel').text('Nenhum arquivo selecionado'); updateExcelImportUi("");
$('#btnAdicionarExcel').show(); getExcelAttachmentField().val("");
$('#btnRemoverExcel').hide();
try {
removeFile(EXCEL_ATTACHMENT_DESCRIPTION);
if (typeof setFilePhisicalName === "function") {
setFilePhisicalName(EXCEL_ATTACHMENT_INPUT_ID, "");
}
} catch (e) {
console.error("Falha ao remover anexo da planilha:", e);
}
}); });
$('#chaveNfe').on('input', function () { $('#chaveNfe').on('input', function () {
@ -45,8 +76,28 @@ $(document).ready(function () {
applySelectedMotoristaEntregaOption(); applySelectedMotoristaEntregaOption();
}); });
$(document).on("input", "input[name^='quantidadeItem___']", function () { $(document).on("input", "input[name^='quantidadeItem___'], input[name^='_quantidadeItem___'], input[name='quantidadeItem'], input[name='_quantidadeItem'], input[id^='quantidadeItem___'], input[id^='_quantidadeItem___'], #quantidadeItem, #_quantidadeItem", function () {
syncQuantidadeAprovadaFromSolicitada(this);
processarConferenciaNfe(); processarConferenciaNfe();
toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
});
$(document).on("input", ".input-qtd-aprov-gestor-view", function () {
var linha = String($(this).attr("data-linha") || "");
var indice = String($(this).attr("data-indice") || "");
if (!linha) return;
var normalized = normalizeQuantidadeCampo($(this).val());
$(this).val(normalized);
var $row = $("#tabelaAprovacaoGestorItensBody tr[data-linha='" + linha + "']");
var $hidden = getCampoItem("quantidadeAprovadaGestor", indice, $row);
if (!$hidden.length) {
$hidden = getCampoItem("quantidadeAprovadaGestor", indice);
}
if ($hidden.length) {
$hidden.val(normalized);
}
atualizarStatusLinhaAprovacaoGestor(linha);
}); });
var activity = String($("#activity").val() || ""); var activity = String($("#activity").val() || "");
@ -194,11 +245,17 @@ $(document).ready(function () {
updateConferenciaNfeVisibility(activity); updateConferenciaNfeVisibility(activity);
} }
syncQuantidadeAprovadaAllRows();
toggleQuantidadeAprovadaGestorByActivity(activity);
agendarRefreshTabelaAprovacao(activity);
updateExcelImportUi(getExcelAttachmentField().val());
formatarMoedasTabela("preco___"); formatarMoedasTabela("preco___");
//formatarMoedasTabela("precoIndica___"); //formatarMoedasTabela("precoIndica___");
formatarMoedasTabela("ValorTotal"); formatarMoedasTabela("ValorTotal");
displayBtnFiles(); displayBtnFiles();
invisibleBtnUpload("fnAnexo_PlanilhaItens");
invisibleBtnUpload("fnAnexo_Nfe"); invisibleBtnUpload("fnAnexo_Nfe");
invisibleBtnUpload("fdAnexo_Coleta"); invisibleBtnUpload("fdAnexo_Coleta");
invisibleBtnUpload("fdAnexo_Entrega"); invisibleBtnUpload("fdAnexo_Entrega");
@ -211,6 +268,20 @@ $(document).ready(function () {
}); });
function agendarRefreshTabelaAprovacao(activity) {
var state = String(activity || $("#activity").val() || "");
var retries = [250, 800, 1800];
for (var i = 0; i < retries.length; i++) {
(function (delay) {
setTimeout(function () {
syncQuantidadeAprovadaAllRows();
toggleQuantidadeAprovadaGestorByActivity(state);
}, delay);
})(retries[i]);
}
}
function applyTransferStatus(activity) { function applyTransferStatus(activity) {
var current = String(activity || ""); var current = String(activity || "");
var pills = $("#transferStatus .status-pill"); var pills = $("#transferStatus .status-pill");
@ -331,6 +402,296 @@ function getCurrentDate() {
return currentDate; return currentDate;
} }
function normalizeQuantidadeCampo(value) {
var txt = String(value == null ? "" : value).trim();
if (txt === "") return "";
txt = txt.replace(",", ".");
var n = parseFloat(txt);
if (isNaN(n) || n < 0) return "";
if (Math.floor(n) === n) return String(parseInt(n, 10));
return String(n);
}
function toNumberQuantidade(value) {
var txt = normalizeQuantidadeCampo(value);
if (txt === "") return NaN;
return parseFloat(txt);
}
function getIndiceCampoPaiFilho($el) {
var raw = String($el.attr("name") || $el.attr("id") || "");
if (raw.indexOf("___") < 0) return "";
return String(raw.split("___")[1] || "");
}
function collectQuantidadeItemFields() {
var out = [];
var seen = {};
var selector = [
"input[name^='quantidadeItem___']",
"input[name^='_quantidadeItem___']",
"input[name='quantidadeItem']",
"input[name='_quantidadeItem']",
"input[id^='quantidadeItem___']",
"input[id^='_quantidadeItem___']",
"#quantidadeItem",
"#_quantidadeItem"
].join(", ");
$(selector).each(function () {
var $field = $(this);
var key = String($field.attr("name") || $field.attr("id") || "");
if (!key) {
key = "anon_" + out.length;
}
if (seen[key]) return;
seen[key] = true;
out.push(this);
});
return out;
}
function getCampoItem(baseName, indice, $scopeRow) {
var idx = String(indice == null ? "" : indice).trim();
var selectors = [];
if (idx !== "") {
selectors.push("#" + baseName + "___" + idx);
selectors.push("#_" + baseName + "___" + idx);
selectors.push("[name='" + baseName + "___" + idx + "']");
selectors.push("[name='_" + baseName + "___" + idx + "']");
}
selectors.push("#" + baseName);
selectors.push("#_" + baseName);
selectors.push("[name='" + baseName + "']");
selectors.push("[name='_" + baseName + "']");
for (var i = 0; i < selectors.length; i++) {
var selector = selectors[i];
var $field = $();
if ($scopeRow && $scopeRow.length) {
$field = $scopeRow.find(selector).first();
}
if (!$field.length) {
$field = $(selector).first();
}
if ($field.length) return $field;
}
return $();
}
function syncQuantidadeAprovadaFromSolicitada(inputSolicitada) {
var $solicitada = $(inputSolicitada);
var idx = getIndiceCampoPaiFilho($solicitada);
var $row = $solicitada.closest("tr");
var $aprovada = getCampoItem("quantidadeAprovadaGestor", idx, $row);
if (!$aprovada.length) return;
var currentAprovada = normalizeQuantidadeCampo($aprovada.val());
if (currentAprovada !== "") return;
var solicitada = normalizeQuantidadeCampo($solicitada.val());
if (solicitada !== "") {
$aprovada.val(solicitada);
}
}
function syncQuantidadeAprovadaAllRows() {
$(collectQuantidadeItemFields()).each(function () {
syncQuantidadeAprovadaFromSolicitada(this);
});
}
function toggleQuantidadeAprovadaGestorByActivity(activity) {
var state = String(activity || "");
var isGestorApproval = state === "4";
var $tbody = $("#tabelaAprovacaoGestorItensBody");
if (!$tbody.length) return;
var html = [];
var rowsFound = 0;
$(collectQuantidadeItemFields()).each(function (idx, el) {
var $qtdSolicitadaField = $(el);
var $row = $qtdSolicitadaField.closest("tr");
var linha = getIndiceCampoPaiFilho($qtdSolicitadaField);
var linhaKey = linha !== "" ? linha : ("base_" + idx);
var codigo = $.trim(String(getCampoItem("descricao", linha, $row).val() || ""));
var descricao = $.trim(String(getCampoItem("codigoItem", linha, $row).val() || ""));
var categoria = $.trim(String(getCampoItem("categoriaItem", linha, $row).val() || ""));
var qtdSolicitadaNorm = normalizeQuantidadeCampo($qtdSolicitadaField.val());
var hasData = qtdSolicitadaNorm !== "" || codigo !== "" || descricao !== "" || categoria !== "";
if (!hasData) return;
rowsFound++;
var qtdSolicitadaLabel = qtdSolicitadaNorm || "-";
var itemLabel = codigo || descricao || ("Item " + rowsFound);
if (descricao && descricao !== codigo) itemLabel += " - " + descricao;
if (categoria) itemLabel += " (" + categoria + ")";
var $hiddenAprovada = getCampoItem("quantidadeAprovadaGestor", linha, $row);
var qtdAprovadaAtual = normalizeQuantidadeCampo($hiddenAprovada.val());
if (qtdAprovadaAtual === "" && qtdSolicitadaNorm !== "") {
qtdAprovadaAtual = qtdSolicitadaNorm;
$hiddenAprovada.val(qtdAprovadaAtual);
}
var status = "Sem divergência";
var statusClass = "label label-success";
if (qtdSolicitadaNorm === "" || qtdAprovadaAtual === "") {
status = "Aprovado";
statusClass = "label label-default";
} else {
var nSolicitada = toNumberQuantidade(qtdSolicitadaNorm);
var nAprovada = toNumberQuantidade(qtdAprovadaAtual);
if (isNaN(nSolicitada) || isNaN(nAprovada)) {
status = "Inválido";
statusClass = "label label-danger";
} else if (nAprovada > nSolicitada) {
status = "Maior que solicitada";
statusClass = "label label-danger";
} else if (nAprovada === 0) {
status = "Sem estoque";
statusClass = "label label-warning";
} else if (nAprovada < nSolicitada) {
status = "Divergente";
statusClass = "label label-warning";
}
}
var disabledAttr = isGestorApproval ? "" : " readonly disabled ";
html.push(
"<tr data-linha='" + escapeHtml(linhaKey) + "' data-indice='" + escapeHtml(linha) + "' data-qtd-solicitada='" + escapeHtml(qtdSolicitadaNorm) + "'>" +
"<td>" + rowsFound + "</td>" +
"<td>" + escapeHtml(itemLabel) + "</td>" +
"<td>" + escapeHtml(qtdSolicitadaLabel) + "</td>" +
"<td>" +
"<input type='number' min='0' " + disabledAttr +
" class='form-control transfer-input input-qtd-aprov-gestor-view' " +
" data-linha='" + escapeHtml(linhaKey) + "' data-indice='" + escapeHtml(linha) + "' " +
" id='quantidadeAprovadaGestorView___" + escapeHtml(linhaKey) + "' " +
" value='" + escapeHtml(qtdAprovadaAtual) + "' placeholder='Se diferente' />" +
"</td>" +
"<td><span class='" + statusClass + " status-aprov-gestor' data-linha='" + escapeHtml(linhaKey) + "'>" + escapeHtml(status) + "</span></td>" +
"</tr>"
);
});
if (!rowsFound) {
html.push("<tr><td colspan='5'>Sem itens para validação.</td></tr>");
}
$tbody.html(html.join(""));
$(".hint-qtd-aprov-gestor").toggle(isGestorApproval);
}
function atualizarStatusLinhaAprovacaoGestor(linha) {
var rowSelector = "#tabelaAprovacaoGestorItensBody tr[data-linha='" + linha + "']";
var $row = $(rowSelector);
if (!$row.length) return;
var $status = $row.find(".status-aprov-gestor");
if (!$status.length) return;
var qtdSolicitada = toNumberQuantidade($row.attr("data-qtd-solicitada"));
var qtdAprovada = toNumberQuantidade($row.find(".input-qtd-aprov-gestor-view").val());
$status.removeClass("label-success label-warning label-danger label-default");
if (isNaN(qtdSolicitada) || isNaN(qtdAprovada)) {
$status.addClass("label-default").text("Pendente");
return;
}
if (qtdAprovada > qtdSolicitada) {
$status.addClass("label-danger").text("Maior que solicitada");
return;
}
if (qtdAprovada === 0) {
$status.addClass("label-warning").text("Sem estoque");
return;
}
if (qtdAprovada < qtdSolicitada) {
$status.addClass("label-warning").text("Divergente");
return;
}
$status.addClass("label-success").text("Sem divergência");
}
function validarQuantidadeAprovadaGestor() {
var divergencias = 0;
var itemContador = 0;
$(collectQuantidadeItemFields()).each(function () {
var $qtdSolicitada = $(this);
var $row = $qtdSolicitada.closest("tr");
var linha = getIndiceCampoPaiFilho($qtdSolicitada);
var codigo = $.trim(String(getCampoItem("descricao", linha, $row).val() || ""));
var descricao = $.trim(String(getCampoItem("codigoItem", linha, $row).val() || ""));
var qtdSolicitadaRaw = $.trim(String($qtdSolicitada.val() || ""));
if (qtdSolicitadaRaw === "" && !codigo && !descricao) {
return;
}
itemContador++;
var $qtdAprovada = getCampoItem("quantidadeAprovadaGestor", linha, $row);
if (!$qtdAprovada.length) return;
var qtdSolicitada = toNumberQuantidade(qtdSolicitadaRaw);
if (isNaN(qtdSolicitada) || qtdSolicitada <= 0) {
$qtdSolicitada.closest("td, div").addClass("errorValidate");
throw "Quantidade solicitada inválida no item " + itemContador + ".";
}
var qtdAprovadaRaw = $.trim(String($qtdAprovada.val() || ""));
if (qtdAprovadaRaw === "") {
$qtdAprovada.val(normalizeQuantidadeCampo($qtdSolicitada.val()));
qtdAprovadaRaw = $.trim(String($qtdAprovada.val() || ""));
}
var qtdAprovada = toNumberQuantidade(qtdAprovadaRaw);
if (isNaN(qtdAprovada) || qtdAprovada < 0) {
$qtdAprovada.closest("td, div").addClass("errorValidate");
throw "Preencha a quantidade aprovada do item " + itemContador + " com valor maior ou igual a zero.";
}
if (qtdAprovada > qtdSolicitada) {
$qtdAprovada.closest("td, div").addClass("errorValidate");
throw "A quantidade aprovada do item " + itemContador + " não pode ser maior que a solicitada.";
}
if (qtdAprovada !== qtdSolicitada) {
divergencias++;
}
});
$("#qtdDivergenciasGestor").val(String(divergencias));
if (divergencias > 0 && $.trim($("#justificativaDecisaoGestor").val()) === "") {
$("#justificativaDecisaoGestor").parent("div").addClass("errorValidate");
throw "Informe a justificativa da decisão quando houver divergência de quantidade.";
}
}
function initMotoristaEntregaEscolha() { function initMotoristaEntregaEscolha() {
var escolha = String($("input[name='tipoMotoristaEntrega']:checked").val() || ""); var escolha = String($("input[name='tipoMotoristaEntrega']:checked").val() || "");
if (!escolha) { if (!escolha) {
@ -607,6 +968,10 @@ function updateConferenciaNfeVisibility(activity) {
} }
var ATTACHMENT_PLUGIN_CONFIG = { var ATTACHMENT_PLUGIN_CONFIG = {
fnAnexo_PlanilhaItens: {
filename: EXCEL_ATTACHMENT_DESCRIPTION,
accept: ".xlsx,.xls"
},
fnAnexo_Nfe: { fnAnexo_Nfe: {
filename: "Nota Fiscal", filename: "Nota Fiscal",
accept: ".pdf,.xml,image/*" accept: ".pdf,.xml,image/*"
@ -666,6 +1031,10 @@ function initAttachmentPlugins() {
} }
function resolveAttachmentFilename(inputId, fallback) { function resolveAttachmentFilename(inputId, fallback) {
if (inputId === EXCEL_ATTACHMENT_INPUT_ID) {
var numProcExcel = String($("#WKNumProces").val() || "").trim();
return numProcExcel ? (EXCEL_ATTACHMENT_DESCRIPTION + " - " + numProcExcel) : EXCEL_ATTACHMENT_DESCRIPTION;
}
if (inputId !== "fnAnexo_Nfe") return fallback; if (inputId !== "fnAnexo_Nfe") return fallback;
var solicitacao = String($("#WKNumProces").val() || "").trim(); var solicitacao = String($("#WKNumProces").val() || "").trim();
if (!solicitacao) return "Nota Fiscal"; if (!solicitacao) return "Nota Fiscal";
@ -785,7 +1154,7 @@ function processarConferenciaNfe() {
if (req.qty === 0 && nfe.qty > 0) { if (req.qty === 0 && nfe.qty > 0) {
status = "Somente NFe"; status = "Somente NFe";
} else if (nfe.qty === 0 && req.qty > 0) { } else if (nfe.qty === 0 && req.qty > 0) {
status = "Somente solicitacao"; status = "Somente base";
} else if (Math.abs(req.qty - nfe.qty) > 0.00001) { } else if (Math.abs(req.qty - nfe.qty) > 0.00001) {
status = "Quantidade divergente"; status = "Quantidade divergente";
} }
@ -821,20 +1190,21 @@ function parseItensNfeJson() {
function buildSolicitacaoMap() { function buildSolicitacaoMap() {
var out = {}; var out = {};
$("input[name^='quantidadeItem___']").each(function () { $(collectQuantidadeItemFields()).each(function (i) {
var name = $(this).attr("name") || ""; var $qtd = $(this);
var indice = name.split("___")[1]; var $row = $qtd.closest("tr");
if (!indice) return; var indice = getIndiceCampoPaiFilho($qtd);
var rowKey = indice || ("BASE_" + (i + 1));
var qty = toFloatSafe($(this).val()); var qty = getQuantidadeBaseConferencia($qtd, indice, $row);
if (qty <= 0) return; if (qty <= 0) return;
var productId = String($("#productIdItem___" + indice).val() || "").trim(); var productId = String(getCampoItem("productIdItem", indice, $row).val() || "").trim();
var code = resolveSolicitacaoItemCode(indice, $(this)); var code = resolveSolicitacaoItemCode(indice, $qtd);
var descricao = String($("#codigoItem___" + indice).val() || "").trim(); var descricao = String(getCampoItem("codigoItem", indice, $row).val() || "").trim();
var key = resolveConferenciaKey(productId, code, "ROW:" + indice); var key = resolveConferenciaKey(productId, code, "ROW:" + rowKey);
var label = productId ? ("PID " + productId) : (code || descricao || ("Linha " + indice)); var label = productId ? ("PID " + productId) : (code || descricao || ("Linha " + rowKey));
if (!out[key]) { if (!out[key]) {
out[key] = { qty: 0, label: label }; out[key] = { qty: 0, label: label };
@ -844,6 +1214,21 @@ function buildSolicitacaoMap() {
return out; return out;
} }
function getQuantidadeBaseConferencia($qtdSolicitada, indice, $row) {
var qtdSolicitada = toFloatSafe($qtdSolicitada.val());
var $qtdAprovada = getCampoItem("quantidadeAprovadaGestor", indice, $row);
if ($qtdAprovada.length) {
var qtdAprovadaRaw = String($qtdAprovada.val() == null ? "" : $qtdAprovada.val()).trim();
// Regra: se o gestor preencheu, a conferencia da NFe usa a quantidade aprovada (inclusive 0).
if (qtdAprovadaRaw !== "") {
return toFloatSafe(qtdAprovadaRaw);
}
}
return qtdSolicitada;
}
function resolveSolicitacaoItemCode(indice, qtyInput) { function resolveSolicitacaoItemCode(indice, qtyInput) {
var code = String($("#codigoProdutoItem___" + indice).val() || "").trim(); var code = String($("#codigoProdutoItem___" + indice).val() || "").trim();
if (code) return normalizeCodigoComparacao(code); if (code) return normalizeCodigoComparacao(code);
@ -975,7 +1360,7 @@ function renderTabelaConferencia(rows, totalItens, divergencias, mensagem, tipo)
var itemNfe = row.key; var itemNfe = row.key;
var qtdNfe = formatConferenciaNumero(row.nfeQty); var qtdNfe = formatConferenciaNumero(row.nfeQty);
if (row.status === "Somente solicitacao") { if (row.status === "Somente base") {
itemNfe = "-"; itemNfe = "-";
qtdNfe = "0"; qtdNfe = "0";
} else if (row.status === "Somente NFe") { } else if (row.status === "Somente NFe") {
@ -1018,7 +1403,7 @@ function montarResumoDivergenciasConferencia(limit) {
var itemNfe = String($(cols[2]).text() || "").trim(); var itemNfe = String($(cols[2]).text() || "").trim();
var qtdNfe = String($(cols[3]).text() || "").trim(); var qtdNfe = String($(cols[3]).text() || "").trim();
linhas.push("Item solicitado: " + itemSolicitado + " / Quantidade: " + qtdSolicitada + " | Item emitido na nota: " + itemNfe + " / Quantidade: " + qtdNfe); linhas.push("Item base: " + itemSolicitado + " / Quantidade: " + qtdSolicitada + " | Item emitido na nota: " + itemNfe + " / Quantidade: " + qtdNfe);
}); });
if (!linhas.length) return ""; if (!linhas.length) return "";
@ -1138,35 +1523,52 @@ var beforeSendValidate = function (numState, nextState) {
} else if ($("#justificativa").val() == "") { } else if ($("#justificativa").val() == "") {
$("#justificativa").parent("div").addClass("errorValidate"); $("#justificativa").parent("div").addClass("errorValidate");
throw "'Qual o motivo da transferência?' é obrigatório."; throw "'Qual o motivo da transferência?' é obrigatório.";
} else if (String($("#analistasup").val() || "").trim() == "") {
$("#analistasup").parent("div").addClass("errorValidate");
throw "'Analista solicitante' é obrigatório.";
} else { } else {
$("input[id^='quantidadeItem___']").each(function (index, value) { $(collectQuantidadeItemFields()).each(function () {
var linha = $(value).attr("name").split("___")[1]; var $qtd = $(this);
var $row = $qtd.closest("tr");
var linha = getIndiceCampoPaiFilho($qtd);
if (!linha) return;
if ( var $descricao = getCampoItem("descricao", linha, $row);
$("#descricao___" + linha).val() == "" && var descricaoValor = $.trim(String($descricao.val() || ""));
$("#quantidadeItem___" + linha).val() == "" var qtdValor = $.trim(String($qtd.val() || ""));
) { if (!descricaoValor && !qtdValor) {
remove_row(value); var $btnRemove = $row.find("button[onclick*='remove_row']");
if ($btnRemove.length) {
remove_row($btnRemove.get(0));
}
} }
}); });
$("input[id^='quantidadeItem___']").each(function (index, value) { var itensInformados = 0;
var linha = $(value).attr("name").split("___")[1]; $(collectQuantidadeItemFields()).each(function () {
var $qtd = $(this);
var $row = $qtd.closest("tr");
var linha = getIndiceCampoPaiFilho($qtd);
var $descricao = getCampoItem("descricao", linha, $row);
if ($("#descricao___" + linha).val() == "") { var descricaoValor = $.trim(String($descricao.val() || ""));
$("#descricao___" + linha) var qtdValor = $.trim(String($qtd.val() || ""));
.parent("div") if (!descricaoValor && !qtdValor) return;
.addClass("errorValidate");
throw "Selecione o item " + (index + 1) + "."; itensInformados++;
} else if ($("#quantidadeItem___" + linha).val() == "") {
$("#quantidadeItem___" + linha) if (!descricaoValor) {
.parent("div") $descricao.parent("div").addClass("errorValidate");
.addClass("errorValidate"); throw "Selecione o item " + itensInformados + ".";
throw "Preencha a quantidade do item " + (index + 1) + "."; }
if (!qtdValor) {
$qtd.parent("div").addClass("errorValidate");
throw "Preencha a quantidade do item " + itensInformados + ".";
} }
}); });
if ($("input[name^='quantidadeItem___']").length == 0) { if (itensInformados === 0) {
throw "Ao menos um item é necessário para iniciar a solicitação."; throw "Ao menos um item é necessário para iniciar a solicitação.";
} }
} }
@ -1176,6 +1578,8 @@ var beforeSendValidate = function (numState, nextState) {
$("#justificativaDecisaoGestor").parent("div").addClass("errorValidate"); $("#justificativaDecisaoGestor").parent("div").addClass("errorValidate");
throw "'Justificativa da decisão' é obrigatória para reprovar."; throw "'Justificativa da decisão' é obrigatória para reprovar.";
} }
} else {
validarQuantidadeAprovadaGestor();
} }
} else if (numState == 6) { } else if (numState == 6) {
var chaveNfe = normalizeNfeKey($("#chaveNfe").val()); var chaveNfe = normalizeNfeKey($("#chaveNfe").val());
@ -1199,7 +1603,7 @@ var beforeSendValidate = function (numState, nextState) {
var qtdDivergencias = parseInt($("#qtdDivergenciasNfe").val() || "0", 10); var qtdDivergencias = parseInt($("#qtdDivergenciasNfe").val() || "0", 10);
if (!isNaN(qtdDivergencias) && qtdDivergencias > 0) { if (!isNaN(qtdDivergencias) && qtdDivergencias > 0) {
var produtos = listarProdutosDivergentes(10); var produtos = listarProdutosDivergentes(10);
var msg = "A nota tem produtos divergentes da solicitacao."; var msg = "A nota tem produtos divergentes da base aprovada para emissão.";
if (produtos) { if (produtos) {
msg += " Produtos: " + produtos + "."; msg += " Produtos: " + produtos + ".";
} }
@ -1247,6 +1651,7 @@ var beforeSendValidate = function (numState, nextState) {
throw "'Data da entrega' é obrigatória."; throw "'Data da entrega' é obrigatória.";
} }
if (String($("#nomerecebedor").val() || "").trim() == "") { if (String($("#nomerecebedor").val() || "").trim() == "") {
$("#nomerecebedor").parent("div").addClass("errorValidate");
throw "'Nome de quem recebeu a mercadoria' é obrigatório."; throw "'Nome de quem recebeu a mercadoria' é obrigatório.";
} }
} else if (numState == 18) { } else if (numState == 18) {
@ -1354,6 +1759,7 @@ function setSelectedZoomItem(selectedItem) {
$("#productIdItem" + "___" + indice).val(itemProductId); $("#productIdItem" + "___" + indice).val(itemProductId);
$("#categoriaItem" + "___" + indice).val(itemCategoria); $("#categoriaItem" + "___" + indice).val(itemCategoria);
processarConferenciaNfe(); processarConferenciaNfe();
toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
} }
} }
@ -1395,7 +1801,9 @@ function removedZoomItem(removedItem) {
$("#productIdItem___" + linha[1]).val(""); $("#productIdItem___" + linha[1]).val("");
$("#categoriaItem___" + linha[1]).val(""); $("#categoriaItem___" + linha[1]).val("");
$("#quantidadeItem___" + linha[1]).val(""); $("#quantidadeItem___" + linha[1]).val("");
$("#quantidadeAprovadaGestor___" + linha[1]).val("");
processarConferenciaNfe(); processarConferenciaNfe();
toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
} }
} }
@ -1404,13 +1812,17 @@ function removedZoomItem(removedItem) {
$("#codigoProdutoItem" + "___" + indice).val(""); $("#codigoProdutoItem" + "___" + indice).val("");
$("#productIdItem" + "___" + indice).val(""); $("#productIdItem" + "___" + indice).val("");
$("#categoriaItem" + "___" + indice).val(""); $("#categoriaItem" + "___" + indice).val("");
$("#quantidadeAprovadaGestor" + "___" + indice).val("");
processarConferenciaNfe(); processarConferenciaNfe();
toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
} }
} }
function add_new_row(table) { function add_new_row(table) {
var row = wdkAddChild(table); var row = wdkAddChild(table);
updt_line(); updt_line();
toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
syncQuantidadeAprovadaAllRows();
} }
function updt_line() { function updt_line() {
@ -1424,6 +1836,7 @@ function remove_row(element) {
fnWdkRemoveChild(element); fnWdkRemoveChild(element);
updt_line(); updt_line();
processarConferenciaNfe(); processarConferenciaNfe();
toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
} }
@ -1820,6 +2233,10 @@ function getAllowedAttachmentInputs() {
return []; return [];
} }
if (activity === "0" || activity === "1") {
return ["fnAnexo_PlanilhaItens"];
}
if (activity === "6") { if (activity === "6") {
return ["fnAnexo_Nfe"]; return ["fnAnexo_Nfe"];
} }
@ -1958,18 +2375,22 @@ function hasFileFluig(fileDescription){
//Quando o Fluig finalizar o upload e o anexo for escolhido //Quando o Fluig finalizar o upload e o anexo for escolhido
window.parent.$("#ecm-navigation-inputFile-clone").on('change', function () { window.parent.$("#ecm-navigation-inputFile-clone").on('change', function () {
const fileDescription = this.getAttribute("data-file-name-camera"); const fileDescription = String(this.getAttribute("data-file-name-camera") || "");
const file = this.files[0]; const file = this.files[0];
if (!file) return;
if (fileDescription === "Planilha de Itens Excel") { if (fileDescription === EXCEL_ATTACHMENT_DESCRIPTION || fileDescription.indexOf(EXCEL_ATTACHMENT_DESCRIPTION + " - ") === 0) {
// Copia o arquivo para o input técnico // Copia o arquivo para o input técnico
const dt = new DataTransfer(); const dt = new DataTransfer();
dt.items.add(file); dt.items.add(file);
document.getElementById("excelUpload").files = dt.files; var excelInput = document.getElementById("excelUpload");
if (!excelInput) return;
excelInput.files = dt.files;
// Atualiza nome mostrado // Atualiza nome mostrado
$("#nomeArquivoExcel").text("Arquivo selecionado: " + file.name); updateExcelImportUi(file.name);
getExcelAttachmentField().val(file.name);
// Agora sim o arquivo está dentro do input e pode ser lido // Agora sim o arquivo está dentro do input e pode ser lido
carregarItensDoExcel("excelUpload"); carregarItensDoExcel("excelUpload");
@ -1978,5 +2399,9 @@ window.parent.$("#ecm-navigation-inputFile-clone").on('change', function () {
function getChaveNfeLimpa() {
return (document.getElementById("chaveNfe").value || "")
.replace(/\s+/g, "") // tira espaços
.replace(/\D/g, "") // garante só dígitos
.slice(0, 44); // limite oficial
}

View File

@ -315,6 +315,10 @@
<label class="transfer-label" for="ufDestino">UF destino</label> <label class="transfer-label" for="ufDestino">UF destino</label>
<input type="text" class="form-control transfer-input" name="ufDestino" id="ufDestino" readonly /> <input type="text" class="form-control transfer-input" name="ufDestino" id="ufDestino" readonly />
</div> </div>
<div class="col-md-2 col-sm-4">
<label class="transfer-label" for="analistasup">Analista solicitante</label>
<input type="text" class="form-control transfer-input" name="analistasup" id="analistasup" required />
</div>
</div> </div>
</section> </section>
@ -322,7 +326,7 @@
<h2 class="card-title">Itens da Transferência</h2> <h2 class="card-title">Itens da Transferência</h2>
<div class="excel-import-wrap"> <div class="excel-import-wrap">
<label class="transfer-label">Importar itens via Excel</label> <label class="transfer-label">Importar itens via Excel</label>
<small>Colunas esperadas: codigo/codigoItem e quantidade/quantidadeItem.</small> <small>Colunas esperadas: codigo e quantidade. Coloque a planilha no botão verde com seta para cima.</small>
<div class="excel-import-actions"> <div class="excel-import-actions">
<button type="button" id="btnAdicionarExcel" class="btn btn-default"> <button type="button" id="btnAdicionarExcel" class="btn btn-default">
<i class="fluigicon fluigicon-file-upload"></i> Importar planilha <i class="fluigicon fluigicon-file-upload"></i> Importar planilha
@ -331,6 +335,10 @@
<i class="fluigicon fluigicon-trash"></i> Remover arquivo <i class="fluigicon fluigicon-trash"></i> Remover arquivo
</button> </button>
<span id="nomeArquivoExcel">Nenhum arquivo selecionado</span> <span id="nomeArquivoExcel">Nenhum arquivo selecionado</span>
<div class="componentAnexo" style="min-width:320px;flex:1;">
<input type="hidden" class="descAnexo" name="descAnexo_PlanilhaItens" id="descAnexo_PlanilhaItens" value="Planilha de Itens Excel" />
<input type="text" class="form-control transfer-input inputAnexo" name="fnAnexo_PlanilhaItens" id="fnAnexo_PlanilhaItens" placeholder="Nenhuma planilha anexada" readonly />
</div>
</div> </div>
<input type="file" id="excelUpload" name="excelUpload" accept=".xlsx,.xls" style="display:none;" /> <input type="file" id="excelUpload" name="excelUpload" accept=".xlsx,.xls" style="display:none;" />
</div> </div>
@ -338,10 +346,10 @@
<thead> <thead>
<tr> <tr>
<th style="width:70px;">#</th> <th style="width:70px;">#</th>
<th style="width:34%;">Código do item</th> <th style="width:12%;">Código do item</th>
<th style="width:18%;">Quantidade</th> <th style="width:12%;">Quantidade</th>
<th>Descrição</th> <th>Descrição</th>
<th style="width:18%;">Categoria</th> <th style="width:16%;">Categoria</th>
<th style="width:70px;"></th> <th style="width:70px;"></th>
</tr> </tr>
</thead> </thead>
@ -364,6 +372,7 @@
</td> </td>
<td> <td>
<input type="number" min="1" class="form-control transfer-input" name="quantidadeItem" /> <input type="number" min="1" class="form-control transfer-input" name="quantidadeItem" />
<input type="hidden" name="quantidadeAprovadaGestor" />
</td> </td>
<td> <td>
<input type="text" class="form-control transfer-input" name="codigoItem" readonly /> <input type="text" class="form-control transfer-input" name="codigoItem" readonly />
@ -393,6 +402,37 @@
<section class="transfer-card activity activity-4 activity-6 activity-18 activity-24 activity-31 activity-57 justificativa-activity-4"> <section class="transfer-card activity activity-4 activity-6 activity-18 activity-24 activity-31 activity-57 justificativa-activity-4">
<h2 class="card-title">Aprovação Filial Emitente</h2> <h2 class="card-title">Aprovação Filial Emitente</h2>
<div class="row hint-qtd-aprov-gestor" style="margin-bottom:10px;">
<div class="col-md-12">
<div class="alert alert-info" style="margin-bottom:0;">
Se a quantidade de algum item estiver diferente, preencha a coluna <strong>Qtd. aprovada gestor</strong> nesta validação.
Campo em branco = mesma quantidade solicitada. Valor <strong>0 = sem estoque</strong>.
</div>
</div>
</div>
<div class="row" style="margin-top:10px;">
<div class="col-md-12">
<label class="transfer-label">Validação de itens e quantidades de saída</label>
<div class="table-responsive">
<table class="table table-striped table-modern" id="tabelaAprovacaoGestorItens">
<thead>
<tr>
<th style="width:60px;">#</th>
<th>Item</th>
<th style="width:140px;">Qtd. solicitada</th>
<th style="width:170px;">Qtd. aprovada gestor</th>
<th style="width:120px;">Status</th>
</tr>
</thead>
<tbody id="tabelaAprovacaoGestorItensBody">
<tr>
<td colspan="5">Sem itens para validação.</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-md-6 col-sm-12"> <div class="col-md-6 col-sm-12">
<label class="transfer-label" for="userValidacaoGestor">Nome aprovação filial emitente</label> <label class="transfer-label" for="userValidacaoGestor">Nome aprovação filial emitente</label>
@ -432,7 +472,7 @@
<div class="row" style="margin-top:10px;"> <div class="row" style="margin-top:10px;">
<div class="col-md-9 col-sm-12"> <div class="col-md-9 col-sm-12">
<label class="transfer-label" for="chaveNfe">Chave de acesso para consulta</label> <label class="transfer-label" for="chaveNfe">Chave de acesso para consulta</label>
<input type="text" class="form-control transfer-input" name="chaveNfe" id="chaveNfe" maxlength="44" placeholder="Informe a chave de acesso da NFe" /> <input type="text" class="form-control transfer-input" name="chaveNfe" id="chaveNfe" maxlength="54" placeholder="Informe a chave de acesso da NFe" oninput="this.value.replace(/[^\d\s]/g, '').replace(/\s{2,}/g, ' ')" />
<small>Campo rastreável para consulta posterior da nota fiscal.</small> <small>Campo rastreável para consulta posterior da nota fiscal.</small>
</div> </div>
<div class="col-md-3 col-sm-12"> <div class="col-md-3 col-sm-12">
@ -556,7 +596,7 @@
<div class="row"> <div class="row">
<div class="col-md-6 col-sm-12"> <div class="col-md-6 col-sm-12">
<label class="transfer-label" for="nomerecebedor">Nome de quem recebeu a mercadoria:</label> <label class="transfer-label" for="nomerecebedor">Nome de quem recebeu a mercadoria:</label>
<input type="text" class="form-control transfer-input" name="nomerecebedor" id="nomerecebedor" /> <input type="text" class="form-control transfer-input" name="nomerecebedor" id="nomerecebedor" required />
</div> </div>
</div> </div>
</section> </section>
@ -565,7 +605,7 @@
<h2 class="card-title">Validação do Recebimento</h2> <h2 class="card-title">Validação do Recebimento</h2>
<div class="row" style="margin-top:16px;" id="blocoConferenciaNfe"> <div class="row" style="margin-top:16px;" id="blocoConferenciaNfe">
<div class="col-md-12"> <div class="col-md-12">
<h3 class="transfer-label" style="margin:0 0 8px 0;">Conferência da NFe x Solicitação</h3> <h3 class="transfer-label" style="margin:0 0 8px 0;">Conferência da NFe x Base Aprovada</h3>
<div id="resumoConferenciaNfe" class="alert alert-info" style="margin-bottom:10px;"> <div id="resumoConferenciaNfe" class="alert alert-info" style="margin-bottom:10px;">
Consulte a chave da NFe para gerar o confronto dos itens. Consulte a chave da NFe para gerar o confronto dos itens.
</div> </div>
@ -573,8 +613,8 @@
<table class="table table-striped table-modern"> <table class="table table-striped table-modern">
<thead> <thead>
<tr> <tr>
<th>Item solicitado</th> <th>Item base</th>
<th>Qtd. solicitada</th> <th>Qtd. base</th>
<th>Item emitido na NFe</th> <th>Item emitido na NFe</th>
<th>Qtd. emitida na NFe</th> <th>Qtd. emitida na NFe</th>
<th>Status</th> <th>Status</th>
@ -636,6 +676,7 @@
<input type="hidden" name="storeIdNfeConsulta" id="storeIdNfeConsulta" value="" /> <input type="hidden" name="storeIdNfeConsulta" id="storeIdNfeConsulta" value="" />
<input type="hidden" name="itensNfeJson" id="itensNfeJson" value="" /> <input type="hidden" name="itensNfeJson" id="itensNfeJson" value="" />
<input type="hidden" name="qtdDivergenciasNfe" id="qtdDivergenciasNfe" value="0" /> <input type="hidden" name="qtdDivergenciasNfe" id="qtdDivergenciasNfe" value="0" />
<input type="hidden" name="qtdDivergenciasGestor" id="qtdDivergenciasGestor" value="0" />
<input type="hidden" name="motoristaColetaLogin" id="motoristaColetaLogin" value="" /> <input type="hidden" name="motoristaColetaLogin" id="motoristaColetaLogin" value="" />
<input type="hidden" name="motoristaEntregaLogin" id="motoristaEntregaLogin" value="" /> <input type="hidden" name="motoristaEntregaLogin" id="motoristaEntregaLogin" value="" />
</div> </div>

View File

@ -0,0 +1,19 @@
application.type=widget
application.code=wdtransf
application.title=wdtransf
application.description=wdtransf
application.fluig.version=null
application.category=SYSTEM
application.renderer=freemarker
developer.code=Andrey Cunha
developer.name=Andrey cunha
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
edit.file=edit.ftl
locale.file.base.name=wdtransf
application.resource.js.1=/resources/js/wdtransf.js
application.resource.css.2=/resources/css/wdtransf.css
hash=4a16315e9e66fa7d797b3f6b1fb365b69f9a4ce2

View File

@ -0,0 +1,5 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="WdTransfWidget.instance()">
</div>

View File

@ -0,0 +1,97 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdtransf-widget" data-params="WdTransfWidget.instance()">
<div class="wdtransf-shell">
<div class="wdtransf-head">
<div>
<h3 class="wdtransf-title">Monitor de Transferencias</h3>
<p class="wdtransf-subtitle">Fonte: dataset <strong>transferenciav2</strong></p>
</div>
<span class="wdtransf-updated" data-role="updatedAt">Atualizando...</span>
</div>
<div class="wdtransf-filters row">
<div class="col-md-6 col-sm-12">
<label class="wdtransf-label">Busca</label>
<input type="text" class="form-control" data-role="search" placeholder="WKNumProces, requesterName, ufOrigem, ufDestino..." />
</div>
<div class="col-md-4 col-sm-6">
<label class="wdtransf-label">Atividade</label>
<select class="form-control" data-role="activityFilter"></select>
</div>
<div class="col-md-2 col-sm-12 wdtransf-actions">
<button type="button" class="btn btn-primary" data-action="reload">Atualizar</button>
</div>
</div>
<div class="wdtransf-message" data-role="message" style="display:none;"></div>
<div class="wdtransf-kpis row">
<div class="col-md-3 col-sm-6">
<div class="wdtransf-kpi">
<div class="wdtransf-kpi-label">Total carregado</div>
<div class="wdtransf-kpi-value" data-role="kpiTotal">0</div>
</div>
</div>
<div class="col-md-3 col-sm-6">
<div class="wdtransf-kpi">
<div class="wdtransf-kpi-label">Em transito</div>
<div class="wdtransf-kpi-value" data-role="kpiTransit">0</div>
</div>
</div>
<div class="col-md-2 col-sm-4">
<div class="wdtransf-kpi">
<div class="wdtransf-kpi-label">Aguard. recebimento</div>
<div class="wdtransf-kpi-value" data-role="kpiPendingReceipt">0</div>
</div>
</div>
<div class="col-md-2 col-sm-4">
<div class="wdtransf-kpi">
<div class="wdtransf-kpi-label">Em problema</div>
<div class="wdtransf-kpi-value" data-role="kpiProblem">0</div>
</div>
</div>
<div class="col-md-2 col-sm-4">
<div class="wdtransf-kpi">
<div class="wdtransf-kpi-label">Finalizadas</div>
<div class="wdtransf-kpi-value" data-role="kpiDone">0</div>
</div>
</div>
</div>
<div class="wdtransf-panel">
<div class="wdtransf-panel-title">Funil por etapa</div>
<div class="wdtransf-stage-list" data-role="stageBars"></div>
</div>
<div class="wdtransf-panel">
<div class="wdtransf-panel-title">Detalhes das transferencias</div>
<div class="table-responsive">
<table class="table table-condensed table-striped wdtransf-table">
<thead>
<tr>
<th>Processo</th>
<th>Solicitante</th>
<th>Origem</th>
<th>Destino</th>
<th>Data abertura</th>
<th>Atividade</th>
</tr>
</thead>
<tbody data-role="tableBody">
<tr>
<td colspan="6">Carregando dados...</td>
</tr>
</tbody>
</table>
</div>
<div class="wdtransf-pagination">
<div class="wdtransf-pagination-info" data-role="pageInfo">Exibindo 0 de 0</div>
<div class="wdtransf-pagination-controls">
<button type="button" class="btn btn-default btn-sm" data-action="prevPage">Anterior</button>
<span class="wdtransf-page-status" data-role="pageStatus">Pagina 0 de 0</span>
<button type="button" class="btn btn-default btn-sm" data-action="nextPage">Proxima</button>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wdtransf</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,277 @@
.wdtransf-widget .wdtransf-shell {
background: #f4f7fb;
border: 1px solid #d8e3ee;
border-radius: 12px;
padding: 14px;
}
.wdtransf-widget .wdtransf-head {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
margin-bottom: 12px;
}
.wdtransf-widget .wdtransf-title {
margin: 0;
color: #0f4a77;
font-size: 22px;
font-weight: 700;
}
.wdtransf-widget .wdtransf-subtitle {
margin: 4px 0 0;
color: #5a6c7f;
font-size: 12px;
}
.wdtransf-widget .wdtransf-updated {
color: #4f6274;
font-size: 11px;
white-space: nowrap;
}
.wdtransf-widget .wdtransf-label {
display: block;
margin-bottom: 4px;
color: #3e5a73;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
}
.wdtransf-widget .wdtransf-filters {
margin-bottom: 10px;
}
.wdtransf-widget .wdtransf-filters .form-control {
height: 36px;
border-radius: 8px;
}
.wdtransf-widget .wdtransf-actions {
display: flex;
align-items: flex-end;
gap: 6px;
padding-top: 18px;
}
.wdtransf-widget .wdtransf-message {
margin-bottom: 10px;
border-radius: 8px;
padding: 8px 10px;
font-size: 12px;
border: 1px solid transparent;
}
.wdtransf-widget .wdtransf-message.is-info {
background: #e8f1fb;
color: #1d4f7d;
border-color: #bed6ee;
}
.wdtransf-widget .wdtransf-message.is-success {
background: #e8f6ea;
color: #2b6a3b;
border-color: #bde0c3;
}
.wdtransf-widget .wdtransf-message.is-warning {
background: #fff5e8;
color: #8f6219;
border-color: #f0d8b5;
}
.wdtransf-widget .wdtransf-message.is-danger {
background: #fdecec;
color: #9a2f2f;
border-color: #e8b8b8;
}
.wdtransf-widget .wdtransf-kpis {
margin-bottom: 12px;
}
.wdtransf-widget .wdtransf-kpi {
background: #ffffff;
border: 1px solid #dbe6f1;
border-radius: 10px;
padding: 10px 12px;
min-height: 72px;
}
.wdtransf-widget .wdtransf-kpi-label {
color: #4b647b;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
}
.wdtransf-widget .wdtransf-kpi-value {
margin-top: 4px;
color: #0f4a77;
font-size: 24px;
font-weight: 700;
line-height: 1.1;
}
.wdtransf-widget .wdtransf-panel {
background: #ffffff;
border: 1px solid #dbe6f1;
border-radius: 10px;
padding: 10px 12px;
margin-bottom: 12px;
}
.wdtransf-widget .wdtransf-panel-title {
color: #1a537f;
font-size: 13px;
font-weight: 700;
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.wdtransf-widget .wdtransf-stage-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.wdtransf-widget .wdtransf-stage-item {
display: grid;
grid-template-columns: 180px 1fr 62px;
gap: 8px;
align-items: center;
}
.wdtransf-widget .wdtransf-stage-label {
color: #3f5d75;
font-size: 12px;
font-weight: 600;
}
.wdtransf-widget .wdtransf-stage-bar-wrap {
background: #edf2f7;
border: 1px solid #d5e0eb;
border-radius: 999px;
height: 14px;
overflow: hidden;
}
.wdtransf-widget .wdtransf-stage-bar {
background: linear-gradient(90deg, #2f84bf 0%, #0f5b91 100%);
height: 100%;
min-width: 0;
}
.wdtransf-widget .wdtransf-stage-value {
text-align: right;
color: #244d70;
font-size: 12px;
font-weight: 700;
}
.wdtransf-widget .wdtransf-table {
margin-bottom: 0;
}
.wdtransf-widget .wdtransf-table thead th {
background: #eef4fb;
color: #3f5d75;
font-size: 11px;
border-bottom: 1px solid #d6e1ed;
}
.wdtransf-widget .wdtransf-table tbody td {
font-size: 12px;
vertical-align: middle;
}
.wdtransf-widget .wdtransf-pagination {
margin-top: 10px;
padding-top: 8px;
border-top: 1px solid #e1e9f2;
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
flex-wrap: wrap;
}
.wdtransf-widget .wdtransf-pagination-info {
color: #536b81;
font-size: 12px;
}
.wdtransf-widget .wdtransf-pagination-controls {
display: flex;
align-items: center;
gap: 6px;
}
.wdtransf-widget .wdtransf-page-status {
min-width: 110px;
text-align: center;
color: #2d5679;
font-size: 12px;
font-weight: 600;
}
.wdtransf-widget .wdtransf-status {
display: inline-block;
padding: 2px 8px;
border-radius: 999px;
font-size: 11px;
font-weight: 700;
border: 1px solid transparent;
}
.wdtransf-widget .wdtransf-status.is-progress {
color: #1d6095;
background: #e8f2fb;
border-color: #c3dbef;
}
.wdtransf-widget .wdtransf-status.is-problem {
color: #a53333;
background: #feecec;
border-color: #efb9b9;
}
.wdtransf-widget .wdtransf-status.is-done {
color: #2f6f41;
background: #e9f8ed;
border-color: #bfe4c7;
}
.wdtransf-widget .wdtransf-status.is-cancel {
color: #8c651f;
background: #fff5e8;
border-color: #f0dcba;
}
.wdtransf-widget.is-loading .wdtransf-panel,
.wdtransf-widget.is-loading .wdtransf-kpi {
opacity: 0.85;
}
@media (max-width: 767px) {
.wdtransf-widget .wdtransf-head {
flex-direction: column;
align-items: flex-start;
}
.wdtransf-widget .wdtransf-actions {
padding-top: 6px;
}
.wdtransf-widget .wdtransf-stage-item {
grid-template-columns: 1fr;
}
.wdtransf-widget .wdtransf-stage-value {
text-align: left;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,570 @@
var WdTransfWidget = SuperWidget.extend({
datasetName: "transferenciav2",
pageSize: 10,
batchSize: 1000,
currentPage: 1,
rowsCache: [],
isIncrementalLoading: false,
loadOffset: 0,
batchToken: 0,
lastChunkMarker: "",
noPagingMode: false,
stageDefs: [
{ label: "Solicitacao", activities: ["0", "1"] },
{ label: "Aprovacao", activities: ["4"] },
{ label: "Emissao NFe", activities: ["6"] },
{ label: "Coleta", activities: ["31"] },
{ label: "Entrega", activities: ["57"] },
{ label: "Recebimento", activities: ["18"] },
{ label: "Consultar Entrada", activities: ["99"] },
{ label: "Verificar Problema", activities: ["24", "104"] },
{ label: "Finalizada", activities: ["96", "101"] },
{ label: "Cancelada", activities: ["39", "60"] }
],
bindings: {
local: {},
global: {}
},
init: function() {
this.$widget = $("#MyWidget_" + this.instanceId);
this.bindEvents();
this.populateActivityFilter();
this.currentPage = 1;
this.loadData();
},
bindEvents: function() {
var self = this;
self.$widget.on("click", "[data-action='reload']", function() {
self.currentPage = 1;
self.loadData();
});
self.$widget.on("change", "[data-role='activityFilter']", function() {
self.currentPage = 1;
self.render();
});
self.$widget.on("keypress", "[data-role='search']", function(e) {
if (e.which === 13) {
e.preventDefault();
self.currentPage = 1;
self.render();
}
});
self.$widget.on("click", "[data-action='prevPage']", function() {
self.setPage(self.currentPage - 1);
});
self.$widget.on("click", "[data-action='nextPage']", function() {
self.setPage(self.currentPage + 1);
});
},
populateActivityFilter: function() {
var added = {};
var options = ["<option value=''>Todas</option>"];
for (var i = 0; i < this.stageDefs.length; i++) {
var stage = this.stageDefs[i];
for (var j = 0; j < stage.activities.length; j++) {
var code = String(stage.activities[j]);
if (added[code]) continue;
added[code] = true;
options.push(
"<option value='" + this.escapeHtml(code) + "'>" +
this.escapeHtml(code + " - " + this.getActivityLabel(code)) +
"</option>"
);
}
}
this.$widget.find("[data-role='activityFilter']").html(options.join(""));
},
loadData: function() {
this.batchToken++;
this.rowsCache = [];
this.currentPage = 1;
this.loadOffset = 0;
this.lastChunkMarker = "";
this.noPagingMode = false;
this.isIncrementalLoading = true;
this.setLoading(true);
this.setMessage("Carregando solicitacoes...", "info");
this.render();
this.loadNextBatch(this.batchToken);
},
loadNextBatch: function(token) {
var self = this;
if (token !== self.batchToken) return;
self.fetchDatasetBatch(self.batchSize, self.loadOffset, function(err, rows) {
if (token !== self.batchToken) return;
if (err) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Erro ao carregar dataset: " + err, "danger");
return;
}
rows = rows || [];
if (!rows.length) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
var chunkMarker = self.buildChunkMarker(rows[0]);
if (self.loadOffset > 0 && chunkMarker && chunkMarker === self.lastChunkMarker) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Paginacao do dataset nao evoluiu (sqlStart/offset). Verifique suporte no ambiente.", "warning");
return;
}
self.lastChunkMarker = chunkMarker;
self.rowsCache = self.rowsCache.concat(rows);
self.loadOffset += rows.length;
self.render();
self.setMessage("Carregando solicitacoes... " + self.formatNumber(self.rowsCache.length) + " registro(s).", "info");
if (self.noPagingMode) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
if (rows.length < self.batchSize) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
setTimeout(function() {
self.loadNextBatch(token);
}, 0);
});
},
fetchDatasetBatch: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
try {
if (typeof DatasetFactory !== "undefined" && typeof DatasetFactory.getDataset === "function" &&
typeof ConstraintType !== "undefined" && typeof DatasetFactory.createConstraint === "function") {
var constraints = self.noPagingMode ? null : self.buildFactoryPagingConstraints(limit, offset);
var ds = DatasetFactory.getDataset(self.datasetName, null, constraints, null);
var rows = (ds && ds.values) ? ds.values : [];
// Fallback para datasets (card/form) que nao suportam sqlLimit/sqlStart como MUST.
if (!rows.length && offset === 0 && !self.noPagingMode) {
var dsNoPaging = DatasetFactory.getDataset(self.datasetName, null, null, null);
var rowsNoPaging = (dsNoPaging && dsNoPaging.values) ? dsNoPaging.values : [];
if (rowsNoPaging.length) {
self.noPagingMode = true;
callback(null, rowsNoPaging);
return;
}
}
callback(null, rows);
return;
}
} catch (e) {
// fallback REST
}
this.fetchDatasetBatchViaRest(limit, offset, callback);
},
buildFactoryPagingConstraints: function(limit, offset) {
var constraints = [];
constraints.push(DatasetFactory.createConstraint("sqlLimit", String(limit), String(limit), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlStart", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("offset", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlOffset", String(offset), String(offset), ConstraintType.MUST));
return constraints;
},
fetchDatasetBatchViaRest: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
function readRows(resp) {
if (resp && resp.content && resp.content.values) return resp.content.values;
if (resp && resp.values) return resp.values;
return [];
}
function request(usePaging, done) {
var constraints = usePaging ? self.buildRestPagingConstraints(limit, offset) : [];
$.ajax({
url: "/api/public/ecm/dataset/datasets",
type: "POST",
contentType: "application/json; charset=UTF-8",
dataType: "json",
data: JSON.stringify({
name: self.datasetName,
fields: [],
constraints: constraints,
order: []
})
}).done(function(resp) {
done(null, readRows(resp) || []);
}).fail(function(xhr) {
var detail = xhr && (xhr.responseText || xhr.statusText || xhr.status);
done(detail || "falha na API REST de datasets", []);
});
}
request(!self.noPagingMode, function(err, rows) {
if (err) {
callback(err);
return;
}
if (!rows.length && offset === 0 && !self.noPagingMode) {
request(false, function(err2, rows2) {
if (err2) {
callback(err2);
return;
}
if (rows2.length) {
self.noPagingMode = true;
}
callback(null, rows2 || []);
});
return;
}
callback(null, rows || []);
});
},
buildRestPagingConstraints: function(limit, offset) {
return [
{ _field: "sqlLimit", _initialValue: String(limit), _finalValue: String(limit), _type: 1 },
{ _field: "sqlStart", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "offset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "sqlOffset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 }
];
},
buildChunkMarker: function(row) {
if (!row) return "";
var id = this.pick(row, ["metadata#id", "id", "WKNumProces", "processInstanceId"]);
var state = this.pick(row, ["activity", "WKNumState", "state"]);
return (id || "-") + "|" + (state || "-");
},
render: function() {
var rows = this.getFilteredRows(this.rowsCache);
this.renderKpis(rows);
this.renderStageBars(rows);
this.renderTable(rows);
this.renderUpdatedAt();
},
getFilteredRows: function(rows) {
var out = [];
var search = $.trim(String(this.$widget.find("[data-role='search']").val() || "")).toLowerCase();
var activityFilter = $.trim(String(this.$widget.find("[data-role='activityFilter']").val() || ""));
for (var i = 0; i < (rows || []).length; i++) {
var row = rows[i] || {};
var activityCode = this.getActivityCode(row);
if (activityFilter && activityCode !== activityFilter) {
continue;
}
if (search) {
var base = this.extractRow(row);
var blob = [
base.processo,
base.solicitante,
base.origem,
base.destino,
base.dataAbertura,
base.atividadeCode
].join(" ").toLowerCase();
if (blob.indexOf(search) === -1) {
continue;
}
}
out.push(row);
}
return out;
},
renderKpis: function(rows) {
var total = rows.length;
var transit = this.countByActivities(rows, ["31", "57"]);
var pendingReceipt = this.countByActivities(rows, ["18"]);
var problem = this.countByActivities(rows, ["24", "104"]);
var done = this.countByActivities(rows, ["96", "101"]);
this.$widget.find("[data-role='kpiTotal']").text(this.formatNumber(total));
this.$widget.find("[data-role='kpiTransit']").text(this.formatNumber(transit));
this.$widget.find("[data-role='kpiPendingReceipt']").text(this.formatNumber(pendingReceipt));
this.$widget.find("[data-role='kpiProblem']").text(this.formatNumber(problem));
this.$widget.find("[data-role='kpiDone']").text(this.formatNumber(done));
},
renderStageBars: function(rows) {
var total = rows.length;
var html = [];
for (var i = 0; i < this.stageDefs.length; i++) {
var stage = this.stageDefs[i];
var count = this.countByActivities(rows, stage.activities);
var percent = total > 0 ? ((count * 100) / total) : 0;
html.push(
"<div class='wdtransf-stage-item'>" +
"<span class='wdtransf-stage-label'>" + this.escapeHtml(stage.label) + "</span>" +
"<div class='wdtransf-stage-bar-wrap'>" +
"<div class='wdtransf-stage-bar' style='width:" + percent.toFixed(2) + "%;'></div>" +
"</div>" +
"<span class='wdtransf-stage-value'>" + this.formatNumber(count) + "</span>" +
"</div>"
);
}
this.$widget.find("[data-role='stageBars']").html(html.join(""));
},
renderTable: function(rows) {
var html = [];
var totalRows = rows.length;
var totalPages = totalRows > 0 ? Math.ceil(totalRows / this.pageSize) : 1;
if (this.currentPage > totalPages) {
this.currentPage = totalPages;
}
if (this.currentPage < 1) {
this.currentPage = 1;
}
var startIndex = totalRows > 0 ? ((this.currentPage - 1) * this.pageSize) : 0;
var endIndex = totalRows > 0 ? Math.min(startIndex + this.pageSize, totalRows) : 0;
var pageRows = rows.slice(startIndex, endIndex);
if (!totalRows) {
var emptyMsg = this.isIncrementalLoading ?
"Carregando dados..." :
"Nenhum registro para os filtros informados.";
html.push("<tr><td colspan='6'>" + this.escapeHtml(emptyMsg) + "</td></tr>");
this.$widget.find("[data-role='tableBody']").html(html.join(""));
this.renderPagination(0, 0, 0, 0);
return;
}
for (var i = 0; i < pageRows.length; i++) {
var base = this.extractRow(pageRows[i]);
html.push(
"<tr>" +
"<td>" + this.escapeHtml(base.processo) + "</td>" +
"<td>" + this.escapeHtml(base.solicitante) + "</td>" +
"<td>" + this.escapeHtml(base.origem) + "</td>" +
"<td>" + this.escapeHtml(base.destino) + "</td>" +
"<td>" + this.escapeHtml(base.dataAbertura) + "</td>" +
"<td>" + this.escapeHtml(base.atividadeCode) + "</td>" +
"</tr>"
);
}
this.$widget.find("[data-role='tableBody']").html(html.join(""));
this.renderPagination(totalRows, totalPages, startIndex + 1, endIndex);
},
renderPagination: function(totalRows, totalPages, firstRow, lastRow) {
var info = "Exibindo " + this.formatNumber(firstRow) + "-" + this.formatNumber(lastRow) +
" de " + this.formatNumber(totalRows);
if (totalRows === 0) {
info = "Exibindo 0-0 de 0";
}
this.$widget.find("[data-role='pageInfo']").text(info);
this.$widget.find("[data-role='pageStatus']").text(
"Pagina " + this.formatNumber(this.currentPage) + " de " +
this.formatNumber(totalPages || 1) +
(this.isIncrementalLoading ? " (carregando...)" : "")
);
var disablePrev = (this.currentPage <= 1 || totalRows === 0);
var disableNext = (this.currentPage >= (totalPages || 1) && !this.isIncrementalLoading) || totalRows === 0;
this.$widget.find("[data-action='prevPage']").prop("disabled", disablePrev);
this.$widget.find("[data-action='nextPage']").prop("disabled", disableNext);
},
setPage: function(page) {
var n = parseInt(page, 10);
if (isNaN(n)) return;
if (n < 1) n = 1;
var totalPages = Math.ceil(this.getFilteredRows(this.rowsCache).length / this.pageSize) || 1;
if (n > totalPages) {
if (this.isIncrementalLoading) {
this.setMessage("Aguarde: ainda carregando mais registros...", "info");
return;
}
n = totalPages;
}
this.currentPage = n;
this.render();
},
extractRow: function(row) {
var activityCode = this.getActivityCode(row);
var solicitante = this.pick(row, ["requesterName"]) || "-";
var origem = this.pick(row, ["ufOrigem"]) || "-";
var destino = this.pick(row, ["ufDestino"]) || "-";
return {
processo: this.pick(row, ["WKNumProces"]) || "-",
solicitante: solicitante,
origem: origem,
destino: destino,
dataAbertura: this.formatDate(this.pick(row, ["dataAbertura"])) || "-",
atividadeCode: activityCode || "-",
atividadeLabel: this.getActivityLabel(activityCode)
};
},
getActivityCode: function(row) {
var raw = this.pick(row, ["Activity", "activity", "WKNumState", "state", "statusAtividade"]);
var text = $.trim(String(raw || ""));
if (!text) return "";
var parsed = parseInt(text, 10);
return isNaN(parsed) ? text : String(parsed);
},
getActivityLabel: function(code) {
var map = {
"0": "Solicitacao",
"1": "Solicitacao",
"4": "Aprovacao",
"6": "Emissao NFe",
"18": "Recebimento",
"24": "Verificar Problema",
"31": "Coleta",
"39": "Cancelada",
"57": "Entrega",
"60": "Cancelada",
"99": "Consultar Entrada",
"96": "Finalizada",
"101": "Finalizada",
"104": "Problema de Lancamento"
};
return map[String(code || "")] || "Nao mapeada";
},
countByActivities: function(rows, activities) {
var set = {};
for (var i = 0; i < activities.length; i++) {
set[String(activities[i])] = true;
}
var count = 0;
for (var j = 0; j < rows.length; j++) {
var code = this.getActivityCode(rows[j]);
if (set[String(code)]) count++;
}
return count;
},
pick: function(row, keys) {
for (var i = 0; i < keys.length; i++) {
var value = row[keys[i]];
if (value !== null && value !== undefined && String(value).trim() !== "") {
return String(value).trim();
}
}
return "";
},
formatDate: function(value) {
var text = $.trim(String(value || ""));
if (!text) return "";
var iso = /^(\d{4})-(\d{2})-(\d{2})/.exec(text);
if (iso) {
return iso[3] + "/" + iso[2] + "/" + iso[1];
}
return text;
},
formatNumber: function(value) {
var n = Number(value || 0);
if (isNaN(n)) return "0";
return n.toLocaleString("pt-BR");
},
renderUpdatedAt: function() {
var now = new Date();
var stamp = now.toLocaleDateString("pt-BR") + " " + now.toLocaleTimeString("pt-BR");
this.$widget.find("[data-role='updatedAt']").text("Atualizado em: " + stamp);
},
setLoading: function(isLoading) {
this.$widget.toggleClass("is-loading", !!isLoading);
if (isLoading) {
this.setMessage("Carregando dados...", "info");
}
},
setMessage: function(text, type) {
var $msg = this.$widget.find("[data-role='message']");
$msg.removeClass("is-info is-success is-warning is-danger");
if (!text) {
$msg.hide().text("");
return;
}
var className = "is-info";
if (type === "success") className = "is-success";
if (type === "warning") className = "is-warning";
if (type === "danger") className = "is-danger";
$msg.addClass(className).text(text).show();
},
escapeHtml: function(text) {
return String(text == null ? "" : text)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;");
}
});

View File

@ -0,0 +1,19 @@
application.type=widget
application.code=wdtransfanalista
application.title=wdtransfanalista
application.description=wdtransfanalista
application.fluig.version=null
application.category=SYSTEM
application.renderer=freemarker
developer.code=Andrey Cunha
developer.name=Andrey Cunha
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
edit.file=edit.ftl
locale.file.base.name=wdtransfanalista
application.resource.js.1=/resources/js/wdtransfanalista.js
application.resource.css.2=/resources/css/wdtransfanalista.css
hash=4a16315e9e66fa7d797b3f6b1fb365b69f9a4ce2

View File

@ -0,0 +1,5 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="WdTransfAnalistaWidget.instance()">
</div>

View File

@ -0,0 +1,11 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdtransf-agg-widget" data-params="WdTransfAnalistaWidget.instance()">
<div class="wdtransf-agg-shell">
<div class="wdtransf-agg-chart-wrap">
<h3 class="wdtransf-agg-title">Transferencias por Analista</h3>
<div class="wdtransf-agg-chart" data-role="chartBars">
<div class="wdtransf-agg-chart-empty">Carregando dados...</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wdtransfanalista</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,181 @@
.wdtransf-agg-widget .wdtransf-agg-shell {
background: #f4f7fb;
border: 1px solid #d8e3ee;
border-radius: 12px;
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
background: #e8ecf1;
border: 1px solid #d3dde8;
border-radius: 16px;
padding: 10px 12px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
margin: 0 0 8px;
color: #00507c;
font-size: 18px;
font-weight: 700;
text-align: center;
}
.wdtransf-agg-widget .wdtransf-agg-chart {
display: flex;
flex-direction: column;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend {
margin-bottom: 4px;
color: #486680;
font-size: 12px;
font-weight: 600;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-item {
display: inline-flex;
align-items: center;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-swatch {
display: inline-block;
width: 16px;
height: 10px;
border-radius: 2px;
background: #0f678a;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
display: grid;
grid-template-columns: 36px 1fr;
gap: 8px;
align-items: end;
min-height: 195px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
height: 160px;
display: flex;
flex-direction: column;
justify-content: space-between;
color: #57728b;
font-size: 11px;
text-align: right;
padding-right: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-scroll {
overflow-x: auto;
overflow-y: hidden;
padding-bottom: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
position: relative;
height: 160px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid {
position: absolute;
left: 0;
right: 0;
border-top: 1px solid #ced9e4;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-100 { top: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-50 { top: 50%; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-0 { bottom: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-bars {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
align-items: flex-end;
gap: 10px;
padding: 0 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-item {
width: 64px;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-value {
color: #1e4e71;
font-size: 11px;
font-weight: 700;
line-height: 1;
min-height: 12px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
width: 30px;
height: 120px;
display: flex;
align-items: flex-end;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar {
width: 100%;
border-radius: 4px 4px 0 0;
background: #0f678a;
min-height: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
color: #3c5c75;
font-size: 11px;
font-weight: 600;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transform: rotate(-12deg);
transform-origin: center top;
}
.wdtransf-agg-widget .wdtransf-agg-chart-empty {
color: #4f6880;
font-size: 12px;
padding: 8px 0;
}
@media (max-width: 767px) {
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
font-size: 16px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
grid-template-columns: 1fr;
min-height: 170px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
display: none;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
height: 145px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
height: 108px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
transform: none;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,446 @@
var WdTransfAnalistaWidget = SuperWidget.extend({
datasetName: "transferenciav2",
batchSize: 1000,
rowsCache: [],
isIncrementalLoading: false,
loadOffset: 0,
batchToken: 0,
lastChunkMarker: "",
noPagingMode: false,
groupKeyCandidates: ["requesterName", "solicitante", "currentUserName", "requesterId", "nome"],
emptyLabel: "Nao informado",
bindings: {
local: {},
global: {}
},
init: function() {
this.$widget = $("#MyWidget_" + this.instanceId);
this.bindEvents();
this.loadData();
},
bindEvents: function() {
var self = this;
self.$widget.on("click", "[data-action='reload']", function() {
self.loadData();
});
self.$widget.on("change", "[data-role='topN']", function() {
self.render();
});
self.$widget.on("input", "[data-role='search']", function() {
self.render();
});
self.$widget.on("keypress", "[data-role='search']", function(e) {
if (e.which === 13) {
e.preventDefault();
self.render();
}
});
},
loadData: function() {
this.batchToken++;
this.rowsCache = [];
this.loadOffset = 0;
this.lastChunkMarker = "";
this.noPagingMode = false;
this.isIncrementalLoading = true;
this.setLoading(true);
this.setMessage("Carregando solicitacoes...", "info");
this.render();
this.loadNextBatch(this.batchToken);
},
loadNextBatch: function(token) {
var self = this;
if (token !== self.batchToken) return;
self.fetchDatasetBatch(self.batchSize, self.loadOffset, function(err, rows) {
if (token !== self.batchToken) return;
if (err) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Erro ao carregar dataset: " + err, "danger");
return;
}
rows = rows || [];
if (!rows.length) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
var chunkMarker = self.buildChunkMarker(rows[0]);
if (self.loadOffset > 0 && chunkMarker && chunkMarker === self.lastChunkMarker) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Paginacao do dataset nao evoluiu (sqlStart/offset). Verifique suporte no ambiente.", "warning");
return;
}
self.lastChunkMarker = chunkMarker;
self.rowsCache = self.rowsCache.concat(rows);
self.loadOffset += rows.length;
self.render();
self.setMessage("Carregando solicitacoes... " + self.formatNumber(self.rowsCache.length) + " registro(s).", "info");
if (self.noPagingMode) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
if (rows.length < self.batchSize) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
setTimeout(function() {
self.loadNextBatch(token);
}, 0);
});
},
fetchDatasetBatch: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
try {
if (typeof DatasetFactory !== "undefined" && typeof DatasetFactory.getDataset === "function" &&
typeof ConstraintType !== "undefined" && typeof DatasetFactory.createConstraint === "function") {
var constraints = self.noPagingMode ? null : self.buildFactoryPagingConstraints(limit, offset);
var ds = DatasetFactory.getDataset(self.datasetName, null, constraints, null);
var rows = (ds && ds.values) ? ds.values : [];
if (!rows.length && offset === 0 && !self.noPagingMode) {
var dsNoPaging = DatasetFactory.getDataset(self.datasetName, null, null, null);
var rowsNoPaging = (dsNoPaging && dsNoPaging.values) ? dsNoPaging.values : [];
if (rowsNoPaging.length) {
self.noPagingMode = true;
callback(null, rowsNoPaging);
return;
}
}
callback(null, rows);
return;
}
} catch (e) {
// fallback REST
}
this.fetchDatasetBatchViaRest(limit, offset, callback);
},
buildFactoryPagingConstraints: function(limit, offset) {
var constraints = [];
constraints.push(DatasetFactory.createConstraint("sqlLimit", String(limit), String(limit), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlStart", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("offset", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlOffset", String(offset), String(offset), ConstraintType.MUST));
return constraints;
},
fetchDatasetBatchViaRest: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
function readRows(resp) {
if (resp && resp.content && resp.content.values) return resp.content.values;
if (resp && resp.values) return resp.values;
return [];
}
function request(usePaging, done) {
var constraints = usePaging ? self.buildRestPagingConstraints(limit, offset) : [];
$.ajax({
url: "/api/public/ecm/dataset/datasets",
type: "POST",
contentType: "application/json; charset=UTF-8",
dataType: "json",
data: JSON.stringify({
name: self.datasetName,
fields: [],
constraints: constraints,
order: []
})
}).done(function(resp) {
done(null, readRows(resp) || []);
}).fail(function(xhr) {
var detail = xhr && (xhr.responseText || xhr.statusText || xhr.status);
done(detail || "falha na API REST de datasets", []);
});
}
request(!self.noPagingMode, function(err, rows) {
if (err) {
callback(err);
return;
}
if (!rows.length && offset === 0 && !self.noPagingMode) {
request(false, function(err2, rows2) {
if (err2) {
callback(err2);
return;
}
if (rows2.length) {
self.noPagingMode = true;
}
callback(null, rows2 || []);
});
return;
}
callback(null, rows || []);
});
},
buildRestPagingConstraints: function(limit, offset) {
return [
{ _field: "sqlLimit", _initialValue: String(limit), _finalValue: String(limit), _type: 1 },
{ _field: "sqlStart", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "offset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "sqlOffset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 }
];
},
buildChunkMarker: function(row) {
if (!row) return "";
var id = this.pick(row, ["metadata#id", "id", "WKNumProces", "processInstanceId"]);
var state = this.pick(row, ["activity", "WKNumState", "state"]);
return (id || "-") + "|" + (state || "-");
},
render: function() {
var grouped = this.aggregateRows(this.rowsCache);
var filteredGroups = this.filterGroups(grouped);
var shownGroups = this.applyTopN(filteredGroups);
this.renderChart(shownGroups, this.rowsCache.length);
},
aggregateRows: function(rows) {
var map = {};
var key;
for (var i = 0; i < (rows || []).length; i++) {
key = this.resolveGroupValue(rows[i]) || this.emptyLabel;
if (!map[key]) {
map[key] = {
name: key,
count: 0
};
}
map[key].count++;
}
var list = [];
for (var name in map) {
if (map.hasOwnProperty(name)) {
list.push(map[name]);
}
}
list.sort(function(a, b) {
if (b.count !== a.count) return b.count - a.count;
return String(a.name).localeCompare(String(b.name));
});
return list;
},
filterGroups: function(groups) {
var $search = this.$widget.find("[data-role='search']");
if (!$search.length) return groups.slice(0);
var search = $.trim(String($search.val() || "")).toLowerCase();
if (!search) return groups.slice(0);
var out = [];
for (var i = 0; i < groups.length; i++) {
var g = groups[i];
if (String(g.name || "").toLowerCase().indexOf(search) !== -1) {
out.push(g);
}
}
return out;
},
applyTopN: function(groups) {
var $top = this.$widget.find("[data-role='topN']");
if (!$top.length) return groups.slice(0);
var raw = $.trim(String($top.val() || "0"));
var topN = parseInt(raw, 10);
if (isNaN(topN) || topN < 0) topN = 0;
if (topN === 0) return groups.slice(0);
return groups.slice(0, topN);
},
renderKpis: function(allGroups, shownGroups) {
var totalSolicitacoes = this.rowsCache.length;
var totalGrupos = allGroups.length;
var solicitacoesExibidas = 0;
for (var i = 0; i < shownGroups.length; i++) {
solicitacoesExibidas += Number(shownGroups[i].count || 0);
}
this.$widget.find("[data-role='kpiTotalSolicitacoes']").text(this.formatNumber(totalSolicitacoes));
this.$widget.find("[data-role='kpiTotalGrupos']").text(this.formatNumber(totalGrupos));
this.$widget.find("[data-role='kpiSolicitacoesExibidas']").text(this.formatNumber(solicitacoesExibidas));
},
renderChart: function(groups, totalRows) {
var html = [];
if (!groups.length) {
var emptyMsg = this.isIncrementalLoading ?
"Carregando dados..." :
"Nenhum registro para os filtros informados.";
html.push("<div class='wdtransf-agg-chart-empty'>" + this.escapeHtml(emptyMsg) + "</div>");
this.$widget.find("[data-role='chartBars']").html(html.join(""));
return;
}
var bars = [];
for (var i = 0; i < groups.length; i++) {
var item = groups[i];
var count = Number(item.count || 0);
var percentTotal = totalRows > 0 ? (count * 100 / totalRows) : 0;
bars.push(
"<div class='wdtransf-agg-vchart-item'>" +
"<div class='wdtransf-agg-vchart-value'>" + this.escapeHtml(this.formatPercent(percentTotal)) + "</div>" +
"<div class='wdtransf-agg-vchart-bar-wrap'>" +
"<div class='wdtransf-agg-vchart-bar' style='height:" + percentTotal.toFixed(2) + "%;'></div>" +
"</div>" +
"<div class='wdtransf-agg-vchart-label' title='" + this.escapeHtml(item.name) + "'>" + this.escapeHtml(item.name) + "</div>" +
"</div>"
);
}
var minWidth = Math.max(groups.length * 86, 360);
html.push(
"<div class='wdtransf-agg-vchart-legend'>" +
"<span class='wdtransf-agg-vchart-legend-item'>" +
"<span class='wdtransf-agg-vchart-legend-swatch'></span>Participacao (%)" +
"</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart'>" +
"<div class='wdtransf-agg-vchart-axis'>" +
"<span>100%</span><span>50%</span><span>0%</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart-scroll'>" +
"<div class='wdtransf-agg-vchart-plot' style='min-width:" + minWidth + "px;'>" +
"<div class='wdtransf-agg-vchart-grid grid-100'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-50'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-0'></div>" +
"<div class='wdtransf-agg-vchart-bars'>" + bars.join("") + "</div>" +
"</div>" +
"</div>" +
"</div>"
);
this.$widget.find("[data-role='chartBars']").html(html.join(""));
},
resolveGroupValue: function(row) {
return this.pick(row || {}, this.groupKeyCandidates);
},
pick: function(row, keys) {
for (var i = 0; i < keys.length; i++) {
var value = row[keys[i]];
if (value !== null && value !== undefined && String(value).trim() !== "") {
return String(value).trim();
}
}
return "";
},
formatNumber: function(value) {
var n = Number(value || 0);
if (isNaN(n)) return "0";
return n.toLocaleString("pt-BR");
},
formatPercent: function(value) {
var n = Number(value || 0);
if (isNaN(n)) n = 0;
return n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + "%";
},
renderUpdatedAt: function() {
var now = new Date();
var stamp = now.toLocaleDateString("pt-BR") + " " + now.toLocaleTimeString("pt-BR");
this.$widget.find("[data-role='updatedAt']").text("Atualizado em: " + stamp);
},
setLoading: function(isLoading) {
this.$widget.toggleClass("is-loading", !!isLoading);
if (isLoading) {
this.setMessage("Carregando dados...", "info");
}
},
setMessage: function(text, type) {
var $msg = this.$widget.find("[data-role='message']");
$msg.removeClass("is-info is-success is-warning is-danger");
if (!text) {
$msg.hide().text("");
return;
}
var className = "is-info";
if (type === "success") className = "is-success";
if (type === "warning") className = "is-warning";
if (type === "danger") className = "is-danger";
$msg.addClass(className).text(text).show();
},
escapeHtml: function(text) {
return String(text == null ? "" : text)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\"/g, "&quot;")
.replace(/'/g, "&#39;");
}
});

View File

@ -0,0 +1,19 @@
application.type=widget
application.code=wdtransfloja
application.title=wdtransfloja
application.description=wdtransfloja
application.fluig.version=null
application.category=SYSTEM
application.renderer=freemarker
developer.code=Andrey Cunha
developer.name=Andrey Cunha
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
edit.file=edit.ftl
locale.file.base.name=wdtransfloja
application.resource.js.1=/resources/js/wdtransfloja.js
application.resource.css.2=/resources/css/wdtransfloja.css
hash=4a16315e9e66fa7d797b3f6b1fb365b69f9a4ce2

View File

@ -0,0 +1,5 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="WdTransfLojaWidget.instance()">
</div>

View File

@ -0,0 +1,11 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdtransf-agg-widget" data-params="WdTransfLojaWidget.instance()">
<div class="wdtransf-agg-shell">
<div class="wdtransf-agg-chart-wrap">
<h3 class="wdtransf-agg-title">Transferencias por Loja</h3>
<div class="wdtransf-agg-chart" data-role="chartBars">
<div class="wdtransf-agg-chart-empty">Carregando dados...</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wdtransfloja</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,181 @@
.wdtransf-agg-widget .wdtransf-agg-shell {
background: #f4f7fb;
border: 1px solid #d8e3ee;
border-radius: 12px;
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
background: #e8ecf1;
border: 1px solid #d3dde8;
border-radius: 16px;
padding: 10px 12px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
margin: 0 0 8px;
color: #00507c;
font-size: 18px;
font-weight: 700;
text-align: center;
}
.wdtransf-agg-widget .wdtransf-agg-chart {
display: flex;
flex-direction: column;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend {
margin-bottom: 4px;
color: #486680;
font-size: 12px;
font-weight: 600;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-item {
display: inline-flex;
align-items: center;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-swatch {
display: inline-block;
width: 16px;
height: 10px;
border-radius: 2px;
background: #0f678a;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
display: grid;
grid-template-columns: 36px 1fr;
gap: 8px;
align-items: end;
min-height: 195px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
height: 160px;
display: flex;
flex-direction: column;
justify-content: space-between;
color: #57728b;
font-size: 11px;
text-align: right;
padding-right: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-scroll {
overflow-x: auto;
overflow-y: hidden;
padding-bottom: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
position: relative;
height: 160px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid {
position: absolute;
left: 0;
right: 0;
border-top: 1px solid #ced9e4;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-100 { top: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-50 { top: 50%; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-0 { bottom: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-bars {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
align-items: flex-end;
gap: 10px;
padding: 0 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-item {
width: 64px;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-value {
color: #1e4e71;
font-size: 11px;
font-weight: 700;
line-height: 1;
min-height: 12px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
width: 30px;
height: 120px;
display: flex;
align-items: flex-end;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar {
width: 100%;
border-radius: 4px 4px 0 0;
background: #0f678a;
min-height: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
color: #3c5c75;
font-size: 11px;
font-weight: 600;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transform: rotate(-12deg);
transform-origin: center top;
}
.wdtransf-agg-widget .wdtransf-agg-chart-empty {
color: #4f6880;
font-size: 12px;
padding: 8px 0;
}
@media (max-width: 767px) {
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
font-size: 16px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
grid-template-columns: 1fr;
min-height: 170px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
display: none;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
height: 145px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
height: 108px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
transform: none;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,447 @@
var WdTransfLojaWidget = SuperWidget.extend({
datasetName: "transferenciav2",
batchSize: 1000,
rowsCache: [],
isIncrementalLoading: false,
loadOffset: 0,
batchToken: 0,
lastChunkMarker: "",
noPagingMode: false,
groupKeyCandidates: ["estabelecimento", "filialOrigem", "lojaOrigem", "centroCusto", "filialDestino", "lojaDestino"],
emptyLabel: "Nao informado",
bindings: {
local: {},
global: {}
},
init: function() {
this.$widget = $("#MyWidget_" + this.instanceId);
this.bindEvents();
this.loadData();
},
bindEvents: function() {
var self = this;
self.$widget.on("click", "[data-action='reload']", function() {
self.loadData();
});
self.$widget.on("change", "[data-role='topN']", function() {
self.render();
});
self.$widget.on("input", "[data-role='search']", function() {
self.render();
});
self.$widget.on("keypress", "[data-role='search']", function(e) {
if (e.which === 13) {
e.preventDefault();
self.render();
}
});
},
loadData: function() {
this.batchToken++;
this.rowsCache = [];
this.loadOffset = 0;
this.lastChunkMarker = "";
this.noPagingMode = false;
this.isIncrementalLoading = true;
this.setLoading(true);
this.setMessage("Carregando solicitacoes...", "info");
this.render();
this.loadNextBatch(this.batchToken);
},
loadNextBatch: function(token) {
var self = this;
if (token !== self.batchToken) return;
self.fetchDatasetBatch(self.batchSize, self.loadOffset, function(err, rows) {
if (token !== self.batchToken) return;
if (err) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Erro ao carregar dataset: " + err, "danger");
return;
}
rows = rows || [];
if (!rows.length) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
var chunkMarker = self.buildChunkMarker(rows[0]);
if (self.loadOffset > 0 && chunkMarker && chunkMarker === self.lastChunkMarker) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Paginacao do dataset nao evoluiu (sqlStart/offset). Verifique suporte no ambiente.", "warning");
return;
}
self.lastChunkMarker = chunkMarker;
self.rowsCache = self.rowsCache.concat(rows);
self.loadOffset += rows.length;
self.render();
self.setMessage("Carregando solicitacoes... " + self.formatNumber(self.rowsCache.length) + " registro(s).", "info");
if (self.noPagingMode) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
if (rows.length < self.batchSize) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
setTimeout(function() {
self.loadNextBatch(token);
}, 0);
});
},
fetchDatasetBatch: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
try {
if (typeof DatasetFactory !== "undefined" && typeof DatasetFactory.getDataset === "function" &&
typeof ConstraintType !== "undefined" && typeof DatasetFactory.createConstraint === "function") {
var constraints = self.noPagingMode ? null : self.buildFactoryPagingConstraints(limit, offset);
var ds = DatasetFactory.getDataset(self.datasetName, null, constraints, null);
var rows = (ds && ds.values) ? ds.values : [];
if (!rows.length && offset === 0 && !self.noPagingMode) {
var dsNoPaging = DatasetFactory.getDataset(self.datasetName, null, null, null);
var rowsNoPaging = (dsNoPaging && dsNoPaging.values) ? dsNoPaging.values : [];
if (rowsNoPaging.length) {
self.noPagingMode = true;
callback(null, rowsNoPaging);
return;
}
}
callback(null, rows);
return;
}
} catch (e) {
// fallback REST
}
this.fetchDatasetBatchViaRest(limit, offset, callback);
},
buildFactoryPagingConstraints: function(limit, offset) {
var constraints = [];
constraints.push(DatasetFactory.createConstraint("sqlLimit", String(limit), String(limit), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlStart", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("offset", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlOffset", String(offset), String(offset), ConstraintType.MUST));
return constraints;
},
fetchDatasetBatchViaRest: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
function readRows(resp) {
if (resp && resp.content && resp.content.values) return resp.content.values;
if (resp && resp.values) return resp.values;
return [];
}
function request(usePaging, done) {
var constraints = usePaging ? self.buildRestPagingConstraints(limit, offset) : [];
$.ajax({
url: "/api/public/ecm/dataset/datasets",
type: "POST",
contentType: "application/json; charset=UTF-8",
dataType: "json",
data: JSON.stringify({
name: self.datasetName,
fields: [],
constraints: constraints,
order: []
})
}).done(function(resp) {
done(null, readRows(resp) || []);
}).fail(function(xhr) {
var detail = xhr && (xhr.responseText || xhr.statusText || xhr.status);
done(detail || "falha na API REST de datasets", []);
});
}
request(!self.noPagingMode, function(err, rows) {
if (err) {
callback(err);
return;
}
if (!rows.length && offset === 0 && !self.noPagingMode) {
request(false, function(err2, rows2) {
if (err2) {
callback(err2);
return;
}
if (rows2.length) {
self.noPagingMode = true;
}
callback(null, rows2 || []);
});
return;
}
callback(null, rows || []);
});
},
buildRestPagingConstraints: function(limit, offset) {
return [
{ _field: "sqlLimit", _initialValue: String(limit), _finalValue: String(limit), _type: 1 },
{ _field: "sqlStart", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "offset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "sqlOffset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 }
];
},
buildChunkMarker: function(row) {
if (!row) return "";
var id = this.pick(row, ["metadata#id", "id", "WKNumProces", "processInstanceId"]);
var state = this.pick(row, ["activity", "WKNumState", "state"]);
return (id || "-") + "|" + (state || "-");
},
render: function() {
var grouped = this.aggregateRows(this.rowsCache);
var filteredGroups = this.filterGroups(grouped);
var shownGroups = this.applyTopN(filteredGroups);
this.renderChart(shownGroups, this.rowsCache.length);
},
aggregateRows: function(rows) {
var map = {};
var key;
for (var i = 0; i < (rows || []).length; i++) {
key = this.resolveGroupValue(rows[i]) || this.emptyLabel;
if (!map[key]) {
map[key] = {
name: key,
count: 0
};
}
map[key].count++;
}
var list = [];
for (var name in map) {
if (map.hasOwnProperty(name)) {
list.push(map[name]);
}
}
list.sort(function(a, b) {
if (b.count !== a.count) return b.count - a.count;
return String(a.name).localeCompare(String(b.name));
});
return list;
},
filterGroups: function(groups) {
var $search = this.$widget.find("[data-role='search']");
if (!$search.length) return groups.slice(0);
var search = $.trim(String($search.val() || "")).toLowerCase();
if (!search) return groups.slice(0);
var out = [];
for (var i = 0; i < groups.length; i++) {
var g = groups[i];
if (String(g.name || "").toLowerCase().indexOf(search) !== -1) {
out.push(g);
}
}
return out;
},
applyTopN: function(groups) {
var $top = this.$widget.find("[data-role='topN']");
if (!$top.length) return groups.slice(0);
var raw = $.trim(String($top.val() || "0"));
var topN = parseInt(raw, 10);
if (isNaN(topN) || topN < 0) topN = 0;
if (topN === 0) return groups.slice(0);
return groups.slice(0, topN);
},
renderKpis: function(allGroups, shownGroups) {
var totalSolicitacoes = this.rowsCache.length;
var totalGrupos = allGroups.length;
var solicitacoesExibidas = 0;
for (var i = 0; i < shownGroups.length; i++) {
solicitacoesExibidas += Number(shownGroups[i].count || 0);
}
this.$widget.find("[data-role='kpiTotalSolicitacoes']").text(this.formatNumber(totalSolicitacoes));
this.$widget.find("[data-role='kpiTotalGrupos']").text(this.formatNumber(totalGrupos));
this.$widget.find("[data-role='kpiSolicitacoesExibidas']").text(this.formatNumber(solicitacoesExibidas));
},
renderChart: function(groups, totalRows) {
var html = [];
if (!groups.length) {
var emptyMsg = this.isIncrementalLoading ?
"Carregando dados..." :
"Nenhum registro para os filtros informados.";
html.push("<div class='wdtransf-agg-chart-empty'>" + this.escapeHtml(emptyMsg) + "</div>");
this.$widget.find("[data-role='chartBars']").html(html.join(""));
return;
}
var bars = [];
for (var i = 0; i < groups.length; i++) {
var item = groups[i];
var count = Number(item.count || 0);
var percentTotal = totalRows > 0 ? (count * 100 / totalRows) : 0;
bars.push(
"<div class='wdtransf-agg-vchart-item'>" +
"<div class='wdtransf-agg-vchart-value'>" + this.escapeHtml(this.formatPercent(percentTotal)) + "</div>" +
"<div class='wdtransf-agg-vchart-bar-wrap'>" +
"<div class='wdtransf-agg-vchart-bar' style='height:" + percentTotal.toFixed(2) + "%;'></div>" +
"</div>" +
"<div class='wdtransf-agg-vchart-label' title='" + this.escapeHtml(item.name) + "'>" + this.escapeHtml(item.name) + "</div>" +
"</div>"
);
}
var minWidth = Math.max(groups.length * 86, 360);
html.push(
"<div class='wdtransf-agg-vchart-legend'>" +
"<span class='wdtransf-agg-vchart-legend-item'>" +
"<span class='wdtransf-agg-vchart-legend-swatch'></span>Participacao (%)" +
"</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart'>" +
"<div class='wdtransf-agg-vchart-axis'>" +
"<span>100%</span><span>50%</span><span>0%</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart-scroll'>" +
"<div class='wdtransf-agg-vchart-plot' style='min-width:" + minWidth + "px;'>" +
"<div class='wdtransf-agg-vchart-grid grid-100'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-50'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-0'></div>" +
"<div class='wdtransf-agg-vchart-bars'>" + bars.join("") + "</div>" +
"</div>" +
"</div>" +
"</div>"
);
this.$widget.find("[data-role='chartBars']").html(html.join(""));
},
resolveGroupValue: function(row) {
return this.pick(row || {}, this.groupKeyCandidates);
},
pick: function(row, keys) {
for (var i = 0; i < keys.length; i++) {
var value = row[keys[i]];
if (value !== null && value !== undefined && String(value).trim() !== "") {
return String(value).trim();
}
}
return "";
},
formatNumber: function(value) {
var n = Number(value || 0);
if (isNaN(n)) return "0";
return n.toLocaleString("pt-BR");
},
formatPercent: function(value) {
var n = Number(value || 0);
if (isNaN(n)) n = 0;
return n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + "%";
},
renderUpdatedAt: function() {
var now = new Date();
var stamp = now.toLocaleDateString("pt-BR") + " " + now.toLocaleTimeString("pt-BR");
this.$widget.find("[data-role='updatedAt']").text("Atualizado em: " + stamp);
},
setLoading: function(isLoading) {
this.$widget.toggleClass("is-loading", !!isLoading);
if (isLoading) {
this.setMessage("Carregando dados...", "info");
}
},
setMessage: function(text, type) {
var $msg = this.$widget.find("[data-role='message']");
$msg.removeClass("is-info is-success is-warning is-danger");
if (!text) {
$msg.hide().text("");
return;
}
var className = "is-info";
if (type === "success") className = "is-success";
if (type === "warning") className = "is-warning";
if (type === "danger") className = "is-danger";
$msg.addClass(className).text(text).show();
},
escapeHtml: function(text) {
return String(text == null ? "" : text)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\"/g, "&quot;")
.replace(/'/g, "&#39;");
}
});

View File

@ -0,0 +1,19 @@
application.type=widget
application.code=wdtransfmotorista
application.title=wdtransfmotorista
application.description=wdtransfmotorista
application.fluig.version=null
application.category=SYSTEM
application.renderer=freemarker
developer.code=Andrey Cunha
developer.name=Andrey Cunha
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
edit.file=edit.ftl
locale.file.base.name=wdtransfmotorista
application.resource.js.1=/resources/js/wdtransfmotorista.js
application.resource.css.2=/resources/css/wdtransfmotorista.css
hash=4a16315e9e66fa7d797b3f6b1fb365b69f9a4ce2

View File

@ -0,0 +1,5 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="WdTransfMotoristaWidget.instance()">
</div>

View File

@ -0,0 +1,11 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdtransf-agg-widget" data-params="WdTransfMotoristaWidget.instance()">
<div class="wdtransf-agg-shell">
<div class="wdtransf-agg-chart-wrap">
<h3 class="wdtransf-agg-title">Transferencias por Motorista</h3>
<div class="wdtransf-agg-chart" data-role="chartBars">
<div class="wdtransf-agg-chart-empty">Carregando dados...</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wdtransfmotorista</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,181 @@
.wdtransf-agg-widget .wdtransf-agg-shell {
background: #f4f7fb;
border: 1px solid #d8e3ee;
border-radius: 12px;
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
background: #e8ecf1;
border: 1px solid #d3dde8;
border-radius: 16px;
padding: 10px 12px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
margin: 0 0 8px;
color: #00507c;
font-size: 18px;
font-weight: 700;
text-align: center;
}
.wdtransf-agg-widget .wdtransf-agg-chart {
display: flex;
flex-direction: column;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend {
margin-bottom: 4px;
color: #486680;
font-size: 12px;
font-weight: 600;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-item {
display: inline-flex;
align-items: center;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-swatch {
display: inline-block;
width: 16px;
height: 10px;
border-radius: 2px;
background: #0f678a;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
display: grid;
grid-template-columns: 36px 1fr;
gap: 8px;
align-items: end;
min-height: 195px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
height: 160px;
display: flex;
flex-direction: column;
justify-content: space-between;
color: #57728b;
font-size: 11px;
text-align: right;
padding-right: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-scroll {
overflow-x: auto;
overflow-y: hidden;
padding-bottom: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
position: relative;
height: 160px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid {
position: absolute;
left: 0;
right: 0;
border-top: 1px solid #ced9e4;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-100 { top: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-50 { top: 50%; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-0 { bottom: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-bars {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
align-items: flex-end;
gap: 10px;
padding: 0 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-item {
width: 64px;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-value {
color: #1e4e71;
font-size: 11px;
font-weight: 700;
line-height: 1;
min-height: 12px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
width: 30px;
height: 120px;
display: flex;
align-items: flex-end;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar {
width: 100%;
border-radius: 4px 4px 0 0;
background: #0f678a;
min-height: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
color: #3c5c75;
font-size: 11px;
font-weight: 600;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transform: rotate(-12deg);
transform-origin: center top;
}
.wdtransf-agg-widget .wdtransf-agg-chart-empty {
color: #4f6880;
font-size: 12px;
padding: 8px 0;
}
@media (max-width: 767px) {
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
font-size: 16px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
grid-template-columns: 1fr;
min-height: 170px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
display: none;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
height: 145px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
height: 108px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
transform: none;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,447 @@
var WdTransfMotoristaWidget = SuperWidget.extend({
datasetName: "transferenciav2",
batchSize: 1000,
rowsCache: [],
isIncrementalLoading: false,
loadOffset: 0,
batchToken: 0,
lastChunkMarker: "",
noPagingMode: false,
groupKeyCandidates: ["motoristaEntregaNome", "motoristaColetaNome", "motoristaEntregaLogin", "motoristaColetaLogin", "motoristaNome"],
emptyLabel: "Nao informado",
bindings: {
local: {},
global: {}
},
init: function() {
this.$widget = $("#MyWidget_" + this.instanceId);
this.bindEvents();
this.loadData();
},
bindEvents: function() {
var self = this;
self.$widget.on("click", "[data-action='reload']", function() {
self.loadData();
});
self.$widget.on("change", "[data-role='topN']", function() {
self.render();
});
self.$widget.on("input", "[data-role='search']", function() {
self.render();
});
self.$widget.on("keypress", "[data-role='search']", function(e) {
if (e.which === 13) {
e.preventDefault();
self.render();
}
});
},
loadData: function() {
this.batchToken++;
this.rowsCache = [];
this.loadOffset = 0;
this.lastChunkMarker = "";
this.noPagingMode = false;
this.isIncrementalLoading = true;
this.setLoading(true);
this.setMessage("Carregando solicitacoes...", "info");
this.render();
this.loadNextBatch(this.batchToken);
},
loadNextBatch: function(token) {
var self = this;
if (token !== self.batchToken) return;
self.fetchDatasetBatch(self.batchSize, self.loadOffset, function(err, rows) {
if (token !== self.batchToken) return;
if (err) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Erro ao carregar dataset: " + err, "danger");
return;
}
rows = rows || [];
if (!rows.length) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
var chunkMarker = self.buildChunkMarker(rows[0]);
if (self.loadOffset > 0 && chunkMarker && chunkMarker === self.lastChunkMarker) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Paginacao do dataset nao evoluiu (sqlStart/offset). Verifique suporte no ambiente.", "warning");
return;
}
self.lastChunkMarker = chunkMarker;
self.rowsCache = self.rowsCache.concat(rows);
self.loadOffset += rows.length;
self.render();
self.setMessage("Carregando solicitacoes... " + self.formatNumber(self.rowsCache.length) + " registro(s).", "info");
if (self.noPagingMode) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
if (rows.length < self.batchSize) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
setTimeout(function() {
self.loadNextBatch(token);
}, 0);
});
},
fetchDatasetBatch: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
try {
if (typeof DatasetFactory !== "undefined" && typeof DatasetFactory.getDataset === "function" &&
typeof ConstraintType !== "undefined" && typeof DatasetFactory.createConstraint === "function") {
var constraints = self.noPagingMode ? null : self.buildFactoryPagingConstraints(limit, offset);
var ds = DatasetFactory.getDataset(self.datasetName, null, constraints, null);
var rows = (ds && ds.values) ? ds.values : [];
if (!rows.length && offset === 0 && !self.noPagingMode) {
var dsNoPaging = DatasetFactory.getDataset(self.datasetName, null, null, null);
var rowsNoPaging = (dsNoPaging && dsNoPaging.values) ? dsNoPaging.values : [];
if (rowsNoPaging.length) {
self.noPagingMode = true;
callback(null, rowsNoPaging);
return;
}
}
callback(null, rows);
return;
}
} catch (e) {
// fallback REST
}
this.fetchDatasetBatchViaRest(limit, offset, callback);
},
buildFactoryPagingConstraints: function(limit, offset) {
var constraints = [];
constraints.push(DatasetFactory.createConstraint("sqlLimit", String(limit), String(limit), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlStart", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("offset", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlOffset", String(offset), String(offset), ConstraintType.MUST));
return constraints;
},
fetchDatasetBatchViaRest: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
function readRows(resp) {
if (resp && resp.content && resp.content.values) return resp.content.values;
if (resp && resp.values) return resp.values;
return [];
}
function request(usePaging, done) {
var constraints = usePaging ? self.buildRestPagingConstraints(limit, offset) : [];
$.ajax({
url: "/api/public/ecm/dataset/datasets",
type: "POST",
contentType: "application/json; charset=UTF-8",
dataType: "json",
data: JSON.stringify({
name: self.datasetName,
fields: [],
constraints: constraints,
order: []
})
}).done(function(resp) {
done(null, readRows(resp) || []);
}).fail(function(xhr) {
var detail = xhr && (xhr.responseText || xhr.statusText || xhr.status);
done(detail || "falha na API REST de datasets", []);
});
}
request(!self.noPagingMode, function(err, rows) {
if (err) {
callback(err);
return;
}
if (!rows.length && offset === 0 && !self.noPagingMode) {
request(false, function(err2, rows2) {
if (err2) {
callback(err2);
return;
}
if (rows2.length) {
self.noPagingMode = true;
}
callback(null, rows2 || []);
});
return;
}
callback(null, rows || []);
});
},
buildRestPagingConstraints: function(limit, offset) {
return [
{ _field: "sqlLimit", _initialValue: String(limit), _finalValue: String(limit), _type: 1 },
{ _field: "sqlStart", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "offset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "sqlOffset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 }
];
},
buildChunkMarker: function(row) {
if (!row) return "";
var id = this.pick(row, ["metadata#id", "id", "WKNumProces", "processInstanceId"]);
var state = this.pick(row, ["activity", "WKNumState", "state"]);
return (id || "-") + "|" + (state || "-");
},
render: function() {
var grouped = this.aggregateRows(this.rowsCache);
var filteredGroups = this.filterGroups(grouped);
var shownGroups = this.applyTopN(filteredGroups);
this.renderChart(shownGroups, this.rowsCache.length);
},
aggregateRows: function(rows) {
var map = {};
var key;
for (var i = 0; i < (rows || []).length; i++) {
key = this.resolveGroupValue(rows[i]) || this.emptyLabel;
if (!map[key]) {
map[key] = {
name: key,
count: 0
};
}
map[key].count++;
}
var list = [];
for (var name in map) {
if (map.hasOwnProperty(name)) {
list.push(map[name]);
}
}
list.sort(function(a, b) {
if (b.count !== a.count) return b.count - a.count;
return String(a.name).localeCompare(String(b.name));
});
return list;
},
filterGroups: function(groups) {
var $search = this.$widget.find("[data-role='search']");
if (!$search.length) return groups.slice(0);
var search = $.trim(String($search.val() || "")).toLowerCase();
if (!search) return groups.slice(0);
var out = [];
for (var i = 0; i < groups.length; i++) {
var g = groups[i];
if (String(g.name || "").toLowerCase().indexOf(search) !== -1) {
out.push(g);
}
}
return out;
},
applyTopN: function(groups) {
var $top = this.$widget.find("[data-role='topN']");
if (!$top.length) return groups.slice(0);
var raw = $.trim(String($top.val() || "0"));
var topN = parseInt(raw, 10);
if (isNaN(topN) || topN < 0) topN = 0;
if (topN === 0) return groups.slice(0);
return groups.slice(0, topN);
},
renderKpis: function(allGroups, shownGroups) {
var totalSolicitacoes = this.rowsCache.length;
var totalGrupos = allGroups.length;
var solicitacoesExibidas = 0;
for (var i = 0; i < shownGroups.length; i++) {
solicitacoesExibidas += Number(shownGroups[i].count || 0);
}
this.$widget.find("[data-role='kpiTotalSolicitacoes']").text(this.formatNumber(totalSolicitacoes));
this.$widget.find("[data-role='kpiTotalGrupos']").text(this.formatNumber(totalGrupos));
this.$widget.find("[data-role='kpiSolicitacoesExibidas']").text(this.formatNumber(solicitacoesExibidas));
},
renderChart: function(groups, totalRows) {
var html = [];
if (!groups.length) {
var emptyMsg = this.isIncrementalLoading ?
"Carregando dados..." :
"Nenhum registro para os filtros informados.";
html.push("<div class='wdtransf-agg-chart-empty'>" + this.escapeHtml(emptyMsg) + "</div>");
this.$widget.find("[data-role='chartBars']").html(html.join(""));
return;
}
var bars = [];
for (var i = 0; i < groups.length; i++) {
var item = groups[i];
var count = Number(item.count || 0);
var percentTotal = totalRows > 0 ? (count * 100 / totalRows) : 0;
bars.push(
"<div class='wdtransf-agg-vchart-item'>" +
"<div class='wdtransf-agg-vchart-value'>" + this.escapeHtml(this.formatPercent(percentTotal)) + "</div>" +
"<div class='wdtransf-agg-vchart-bar-wrap'>" +
"<div class='wdtransf-agg-vchart-bar' style='height:" + percentTotal.toFixed(2) + "%;'></div>" +
"</div>" +
"<div class='wdtransf-agg-vchart-label' title='" + this.escapeHtml(item.name) + "'>" + this.escapeHtml(item.name) + "</div>" +
"</div>"
);
}
var minWidth = Math.max(groups.length * 86, 360);
html.push(
"<div class='wdtransf-agg-vchart-legend'>" +
"<span class='wdtransf-agg-vchart-legend-item'>" +
"<span class='wdtransf-agg-vchart-legend-swatch'></span>Participacao (%)" +
"</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart'>" +
"<div class='wdtransf-agg-vchart-axis'>" +
"<span>100%</span><span>50%</span><span>0%</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart-scroll'>" +
"<div class='wdtransf-agg-vchart-plot' style='min-width:" + minWidth + "px;'>" +
"<div class='wdtransf-agg-vchart-grid grid-100'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-50'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-0'></div>" +
"<div class='wdtransf-agg-vchart-bars'>" + bars.join("") + "</div>" +
"</div>" +
"</div>" +
"</div>"
);
this.$widget.find("[data-role='chartBars']").html(html.join(""));
},
resolveGroupValue: function(row) {
return this.pick(row || {}, this.groupKeyCandidates);
},
pick: function(row, keys) {
for (var i = 0; i < keys.length; i++) {
var value = row[keys[i]];
if (value !== null && value !== undefined && String(value).trim() !== "") {
return String(value).trim();
}
}
return "";
},
formatNumber: function(value) {
var n = Number(value || 0);
if (isNaN(n)) return "0";
return n.toLocaleString("pt-BR");
},
formatPercent: function(value) {
var n = Number(value || 0);
if (isNaN(n)) n = 0;
return n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + "%";
},
renderUpdatedAt: function() {
var now = new Date();
var stamp = now.toLocaleDateString("pt-BR") + " " + now.toLocaleTimeString("pt-BR");
this.$widget.find("[data-role='updatedAt']").text("Atualizado em: " + stamp);
},
setLoading: function(isLoading) {
this.$widget.toggleClass("is-loading", !!isLoading);
if (isLoading) {
this.setMessage("Carregando dados...", "info");
}
},
setMessage: function(text, type) {
var $msg = this.$widget.find("[data-role='message']");
$msg.removeClass("is-info is-success is-warning is-danger");
if (!text) {
$msg.hide().text("");
return;
}
var className = "is-info";
if (type === "success") className = "is-success";
if (type === "warning") className = "is-warning";
if (type === "danger") className = "is-danger";
$msg.addClass(className).text(text).show();
},
escapeHtml: function(text) {
return String(text == null ? "" : text)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\"/g, "&quot;")
.replace(/'/g, "&#39;");
}
});

View File

@ -0,0 +1,19 @@
application.type=widget
application.code=wdtransfreg
application.title=wdtransfreg
application.description=wdtransfreg
application.fluig.version=null
application.category=SYSTEM
application.renderer=freemarker
developer.code=Andrey Cunha
developer.name=Andrey Cunha
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
edit.file=edit.ftl
locale.file.base.name=wdtransfreg
application.resource.js.1=/resources/js/wdtransfreg.js
application.resource.css.2=/resources/css/wdtransfreg.css
hash=4a16315e9e66fa7d797b3f6b1fb365b69f9a4ce2

View File

@ -0,0 +1,5 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="WdTransfRegWidget.instance()">
</div>

View File

@ -0,0 +1,11 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdtransf-agg-widget" data-params="WdTransfRegWidget.instance()">
<div class="wdtransf-agg-shell">
<div class="wdtransf-agg-chart-wrap">
<h3 class="wdtransf-agg-title">Transferencias por UF de Origem</h3>
<div class="wdtransf-agg-chart" data-role="chartBars">
<div class="wdtransf-agg-chart-empty">Carregando dados...</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wdtransfreg</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,181 @@
.wdtransf-agg-widget .wdtransf-agg-shell {
background: #f4f7fb;
border: 1px solid #d8e3ee;
border-radius: 12px;
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
background: #e8ecf1;
border: 1px solid #d3dde8;
border-radius: 16px;
padding: 10px 12px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
margin: 0 0 8px;
color: #00507c;
font-size: 18px;
font-weight: 700;
text-align: center;
}
.wdtransf-agg-widget .wdtransf-agg-chart {
display: flex;
flex-direction: column;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend {
margin-bottom: 4px;
color: #486680;
font-size: 12px;
font-weight: 600;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-item {
display: inline-flex;
align-items: center;
gap: 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-legend-swatch {
display: inline-block;
width: 16px;
height: 10px;
border-radius: 2px;
background: #0f678a;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
display: grid;
grid-template-columns: 36px 1fr;
gap: 8px;
align-items: end;
min-height: 195px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
height: 160px;
display: flex;
flex-direction: column;
justify-content: space-between;
color: #57728b;
font-size: 11px;
text-align: right;
padding-right: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-scroll {
overflow-x: auto;
overflow-y: hidden;
padding-bottom: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
position: relative;
height: 160px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid {
position: absolute;
left: 0;
right: 0;
border-top: 1px solid #ced9e4;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-100 { top: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-50 { top: 50%; }
.wdtransf-agg-widget .wdtransf-agg-vchart-grid.grid-0 { bottom: 0; }
.wdtransf-agg-widget .wdtransf-agg-vchart-bars {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
align-items: flex-end;
gap: 10px;
padding: 0 6px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-item {
width: 64px;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-value {
color: #1e4e71;
font-size: 11px;
font-weight: 700;
line-height: 1;
min-height: 12px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
width: 30px;
height: 120px;
display: flex;
align-items: flex-end;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar {
width: 100%;
border-radius: 4px 4px 0 0;
background: #0f678a;
min-height: 2px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
color: #3c5c75;
font-size: 11px;
font-weight: 600;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transform: rotate(-12deg);
transform-origin: center top;
}
.wdtransf-agg-widget .wdtransf-agg-chart-empty {
color: #4f6880;
font-size: 12px;
padding: 8px 0;
}
@media (max-width: 767px) {
.wdtransf-agg-widget .wdtransf-agg-chart-wrap {
padding: 8px;
}
.wdtransf-agg-widget .wdtransf-agg-title {
font-size: 16px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart {
grid-template-columns: 1fr;
min-height: 170px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-axis {
display: none;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-plot {
height: 145px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-bar-wrap {
height: 108px;
}
.wdtransf-agg-widget .wdtransf-agg-vchart-label {
transform: none;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,447 @@
var WdTransfRegWidget = SuperWidget.extend({
datasetName: "transferenciav2",
batchSize: 1000,
rowsCache: [],
isIncrementalLoading: false,
loadOffset: 0,
batchToken: 0,
lastChunkMarker: "",
noPagingMode: false,
groupKeyCandidates: ["ufOrigem", "UF_ORIGEM", "UF", "uf"],
emptyLabel: "Nao informado",
bindings: {
local: {},
global: {}
},
init: function() {
this.$widget = $("#MyWidget_" + this.instanceId);
this.bindEvents();
this.loadData();
},
bindEvents: function() {
var self = this;
self.$widget.on("click", "[data-action='reload']", function() {
self.loadData();
});
self.$widget.on("change", "[data-role='topN']", function() {
self.render();
});
self.$widget.on("input", "[data-role='search']", function() {
self.render();
});
self.$widget.on("keypress", "[data-role='search']", function(e) {
if (e.which === 13) {
e.preventDefault();
self.render();
}
});
},
loadData: function() {
this.batchToken++;
this.rowsCache = [];
this.loadOffset = 0;
this.lastChunkMarker = "";
this.noPagingMode = false;
this.isIncrementalLoading = true;
this.setLoading(true);
this.setMessage("Carregando solicitacoes...", "info");
this.render();
this.loadNextBatch(this.batchToken);
},
loadNextBatch: function(token) {
var self = this;
if (token !== self.batchToken) return;
self.fetchDatasetBatch(self.batchSize, self.loadOffset, function(err, rows) {
if (token !== self.batchToken) return;
if (err) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Erro ao carregar dataset: " + err, "danger");
return;
}
rows = rows || [];
if (!rows.length) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
var chunkMarker = self.buildChunkMarker(rows[0]);
if (self.loadOffset > 0 && chunkMarker && chunkMarker === self.lastChunkMarker) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Paginacao do dataset nao evoluiu (sqlStart/offset). Verifique suporte no ambiente.", "warning");
return;
}
self.lastChunkMarker = chunkMarker;
self.rowsCache = self.rowsCache.concat(rows);
self.loadOffset += rows.length;
self.render();
self.setMessage("Carregando solicitacoes... " + self.formatNumber(self.rowsCache.length) + " registro(s).", "info");
if (self.noPagingMode) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
if (rows.length < self.batchSize) {
self.isIncrementalLoading = false;
self.setLoading(false);
self.render();
self.setMessage("Dados carregados: " + self.formatNumber(self.rowsCache.length) + " registro(s).", "success");
return;
}
setTimeout(function() {
self.loadNextBatch(token);
}, 0);
});
},
fetchDatasetBatch: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
try {
if (typeof DatasetFactory !== "undefined" && typeof DatasetFactory.getDataset === "function" &&
typeof ConstraintType !== "undefined" && typeof DatasetFactory.createConstraint === "function") {
var constraints = self.noPagingMode ? null : self.buildFactoryPagingConstraints(limit, offset);
var ds = DatasetFactory.getDataset(self.datasetName, null, constraints, null);
var rows = (ds && ds.values) ? ds.values : [];
if (!rows.length && offset === 0 && !self.noPagingMode) {
var dsNoPaging = DatasetFactory.getDataset(self.datasetName, null, null, null);
var rowsNoPaging = (dsNoPaging && dsNoPaging.values) ? dsNoPaging.values : [];
if (rowsNoPaging.length) {
self.noPagingMode = true;
callback(null, rowsNoPaging);
return;
}
}
callback(null, rows);
return;
}
} catch (e) {
// fallback REST
}
this.fetchDatasetBatchViaRest(limit, offset, callback);
},
buildFactoryPagingConstraints: function(limit, offset) {
var constraints = [];
constraints.push(DatasetFactory.createConstraint("sqlLimit", String(limit), String(limit), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlStart", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("offset", String(offset), String(offset), ConstraintType.MUST));
constraints.push(DatasetFactory.createConstraint("sqlOffset", String(offset), String(offset), ConstraintType.MUST));
return constraints;
},
fetchDatasetBatchViaRest: function(limit, offset, callback) {
var self = this;
if (self.noPagingMode && offset > 0) {
callback(null, []);
return;
}
function readRows(resp) {
if (resp && resp.content && resp.content.values) return resp.content.values;
if (resp && resp.values) return resp.values;
return [];
}
function request(usePaging, done) {
var constraints = usePaging ? self.buildRestPagingConstraints(limit, offset) : [];
$.ajax({
url: "/api/public/ecm/dataset/datasets",
type: "POST",
contentType: "application/json; charset=UTF-8",
dataType: "json",
data: JSON.stringify({
name: self.datasetName,
fields: [],
constraints: constraints,
order: []
})
}).done(function(resp) {
done(null, readRows(resp) || []);
}).fail(function(xhr) {
var detail = xhr && (xhr.responseText || xhr.statusText || xhr.status);
done(detail || "falha na API REST de datasets", []);
});
}
request(!self.noPagingMode, function(err, rows) {
if (err) {
callback(err);
return;
}
if (!rows.length && offset === 0 && !self.noPagingMode) {
request(false, function(err2, rows2) {
if (err2) {
callback(err2);
return;
}
if (rows2.length) {
self.noPagingMode = true;
}
callback(null, rows2 || []);
});
return;
}
callback(null, rows || []);
});
},
buildRestPagingConstraints: function(limit, offset) {
return [
{ _field: "sqlLimit", _initialValue: String(limit), _finalValue: String(limit), _type: 1 },
{ _field: "sqlStart", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "offset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 },
{ _field: "sqlOffset", _initialValue: String(offset), _finalValue: String(offset), _type: 1 }
];
},
buildChunkMarker: function(row) {
if (!row) return "";
var id = this.pick(row, ["metadata#id", "id", "WKNumProces", "processInstanceId"]);
var state = this.pick(row, ["activity", "WKNumState", "state"]);
return (id || "-") + "|" + (state || "-");
},
render: function() {
var grouped = this.aggregateRows(this.rowsCache);
var filteredGroups = this.filterGroups(grouped);
var shownGroups = this.applyTopN(filteredGroups);
this.renderChart(shownGroups, this.rowsCache.length);
},
aggregateRows: function(rows) {
var map = {};
var key;
for (var i = 0; i < (rows || []).length; i++) {
key = this.resolveGroupValue(rows[i]) || this.emptyLabel;
if (!map[key]) {
map[key] = {
name: key,
count: 0
};
}
map[key].count++;
}
var list = [];
for (var name in map) {
if (map.hasOwnProperty(name)) {
list.push(map[name]);
}
}
list.sort(function(a, b) {
if (b.count !== a.count) return b.count - a.count;
return String(a.name).localeCompare(String(b.name));
});
return list;
},
filterGroups: function(groups) {
var $search = this.$widget.find("[data-role='search']");
if (!$search.length) return groups.slice(0);
var search = $.trim(String($search.val() || "")).toLowerCase();
if (!search) return groups.slice(0);
var out = [];
for (var i = 0; i < groups.length; i++) {
var g = groups[i];
if (String(g.name || "").toLowerCase().indexOf(search) !== -1) {
out.push(g);
}
}
return out;
},
applyTopN: function(groups) {
var $top = this.$widget.find("[data-role='topN']");
if (!$top.length) return groups.slice(0);
var raw = $.trim(String($top.val() || "0"));
var topN = parseInt(raw, 10);
if (isNaN(topN) || topN < 0) topN = 0;
if (topN === 0) return groups.slice(0);
return groups.slice(0, topN);
},
renderKpis: function(allGroups, shownGroups) {
var totalSolicitacoes = this.rowsCache.length;
var totalGrupos = allGroups.length;
var solicitacoesExibidas = 0;
for (var i = 0; i < shownGroups.length; i++) {
solicitacoesExibidas += Number(shownGroups[i].count || 0);
}
this.$widget.find("[data-role='kpiTotalSolicitacoes']").text(this.formatNumber(totalSolicitacoes));
this.$widget.find("[data-role='kpiTotalGrupos']").text(this.formatNumber(totalGrupos));
this.$widget.find("[data-role='kpiSolicitacoesExibidas']").text(this.formatNumber(solicitacoesExibidas));
},
renderChart: function(groups, totalRows) {
var html = [];
if (!groups.length) {
var emptyMsg = this.isIncrementalLoading ?
"Carregando dados..." :
"Nenhum registro para os filtros informados.";
html.push("<div class='wdtransf-agg-chart-empty'>" + this.escapeHtml(emptyMsg) + "</div>");
this.$widget.find("[data-role='chartBars']").html(html.join(""));
return;
}
var bars = [];
for (var i = 0; i < groups.length; i++) {
var item = groups[i];
var count = Number(item.count || 0);
var percentTotal = totalRows > 0 ? (count * 100 / totalRows) : 0;
bars.push(
"<div class='wdtransf-agg-vchart-item'>" +
"<div class='wdtransf-agg-vchart-value'>" + this.escapeHtml(this.formatPercent(percentTotal)) + "</div>" +
"<div class='wdtransf-agg-vchart-bar-wrap'>" +
"<div class='wdtransf-agg-vchart-bar' style='height:" + percentTotal.toFixed(2) + "%;'></div>" +
"</div>" +
"<div class='wdtransf-agg-vchart-label' title='" + this.escapeHtml(item.name) + "'>" + this.escapeHtml(item.name) + "</div>" +
"</div>"
);
}
var minWidth = Math.max(groups.length * 86, 360);
html.push(
"<div class='wdtransf-agg-vchart-legend'>" +
"<span class='wdtransf-agg-vchart-legend-item'>" +
"<span class='wdtransf-agg-vchart-legend-swatch'></span>Participacao (%)" +
"</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart'>" +
"<div class='wdtransf-agg-vchart-axis'>" +
"<span>100%</span><span>50%</span><span>0%</span>" +
"</div>" +
"<div class='wdtransf-agg-vchart-scroll'>" +
"<div class='wdtransf-agg-vchart-plot' style='min-width:" + minWidth + "px;'>" +
"<div class='wdtransf-agg-vchart-grid grid-100'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-50'></div>" +
"<div class='wdtransf-agg-vchart-grid grid-0'></div>" +
"<div class='wdtransf-agg-vchart-bars'>" + bars.join("") + "</div>" +
"</div>" +
"</div>" +
"</div>"
);
this.$widget.find("[data-role='chartBars']").html(html.join(""));
},
resolveGroupValue: function(row) {
return this.pick(row || {}, this.groupKeyCandidates);
},
pick: function(row, keys) {
for (var i = 0; i < keys.length; i++) {
var value = row[keys[i]];
if (value !== null && value !== undefined && String(value).trim() !== "") {
return String(value).trim();
}
}
return "";
},
formatNumber: function(value) {
var n = Number(value || 0);
if (isNaN(n)) return "0";
return n.toLocaleString("pt-BR");
},
formatPercent: function(value) {
var n = Number(value || 0);
if (isNaN(n)) n = 0;
return n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + "%";
},
renderUpdatedAt: function() {
var now = new Date();
var stamp = now.toLocaleDateString("pt-BR") + " " + now.toLocaleTimeString("pt-BR");
this.$widget.find("[data-role='updatedAt']").text("Atualizado em: " + stamp);
},
setLoading: function(isLoading) {
this.$widget.toggleClass("is-loading", !!isLoading);
if (isLoading) {
this.setMessage("Carregando dados...", "info");
}
},
setMessage: function(text, type) {
var $msg = this.$widget.find("[data-role='message']");
$msg.removeClass("is-info is-success is-warning is-danger");
if (!text) {
$msg.hide().text("");
return;
}
var className = "is-info";
if (type === "success") className = "is-success";
if (type === "warning") className = "is-warning";
if (type === "danger") className = "is-danger";
$msg.addClass(className).text(text).show();
},
escapeHtml: function(text) {
return String(text == null ? "" : text)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\"/g, "&quot;")
.replace(/'/g, "&#39;");
}
});

View File

@ -1,6 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_481" class="java.beans.XMLDecoder"> <java version="1.8.0_481" class="java.beans.XMLDecoder">
<object class="java.util.HashMap"> <object class="java.util.HashMap">
<void method="put">
<string>volume</string>
<array class="java.lang.String" length="1">
<void index="0">
<string>Default</string>
</void>
</array>
</void>
<void method="put"> <void method="put">
<string>mecanismoGrupo</string> <string>mecanismoGrupo</string>
<object class="java.util.ArrayList"> <object class="java.util.ArrayList">
@ -710,6 +718,203 @@
</void> </void>
</array> </array>
</void> </void>
<void method="put">
<string>camposFormulario, documentoId = 43582</string>
<array class="java.lang.String" length="64">
<void index="0">
<string>activity</string>
</void>
<void index="1">
<string>categoriaItem</string>
</void>
<void index="2">
<string>centroCusto</string>
</void>
<void index="3">
<string>chaveNfe</string>
</void>
<void index="4">
<string>codigoItem</string>
</void>
<void index="5">
<string>codigoProdutoItem</string>
</void>
<void index="6">
<string>currentUserId</string>
</void>
<void index="7">
<string>currentUsermail</string>
</void>
<void index="8">
<string>currentUserName</string>
</void>
<void index="9">
<string>dataAbertura</string>
</void>
<void index="10">
<string>dataColeta</string>
</void>
<void index="11">
<string>dataEmissaoApiNfe</string>
</void>
<void index="12">
<string>dataEmissaoNfe</string>
</void>
<void index="13">
<string>dataEntradaNfeConsulta</string>
</void>
<void index="14">
<string>dataEntrega</string>
</void>
<void index="15">
<string>dataValidacaoGestor</string>
</void>
<void index="16">
<string>descricao</string>
</void>
<void index="17">
<string>emailSolicitante</string>
</void>
<void index="18">
<string>estabelecimento</string>
</void>
<void index="19">
<string>excelUpload</string>
</void>
<void index="20">
<string>fdAnexo_Coleta</string>
</void>
<void index="21">
<string>fdAnexo_Entrega</string>
</void>
<void index="22">
<string>fdAnexo_recebimento</string>
</void>
<void index="23">
<string>fnAnexo_Nfe</string>
</void>
<void index="24">
<string>formMode</string>
</void>
<void index="25">
<string>fornecedorNfeConsulta</string>
</void>
<void index="26">
<string>gestorEmail</string>
</void>
<void index="27">
<string>gestorEmailE</string>
</void>
<void index="28">
<string>gestorNome</string>
</void>
<void index="29">
<string>gestorNomeE</string>
</void>
<void index="30">
<string>gestor_cc</string>
</void>
<void index="31">
<string>gestor_cce</string>
</void>
<void index="32">
<string>invoiceIdNfeConsulta</string>
</void>
<void index="33">
<string>itensNfeConsulta</string>
</void>
<void index="34">
<string>itensNfeJson</string>
</void>
<void index="35">
<string>justificativa</string>
</void>
<void index="36">
<string>justificativaDecisaoGestor</string>
</void>
<void index="37">
<string>justificativaDecisaoItens</string>
</void>
<void index="38">
<string>lojaNfeConsulta</string>
</void>
<void index="39">
<string>motoristaColetaLogin</string>
</void>
<void index="40">
<string>motoristaColetaNome</string>
</void>
<void index="41">
<string>motoristaEntregaLogin</string>
</void>
<void index="42">
<string>motoristaEntregaNome</string>
</void>
<void index="43">
<string>motoristaEntregaSelecionado</string>
</void>
<void index="44">
<string>nomerecebedor</string>
</void>
<void index="45">
<string>numeroNfeConsulta</string>
</void>
<void index="46">
<string>operacaoNfeConsulta</string>
</void>
<void index="47">
<string>productIdItem</string>
</void>
<void index="48">
<string>qtdDivergenciasNfe</string>
</void>
<void index="49">
<string>quantidadeItem</string>
</void>
<void index="50">
<string>requesterId</string>
</void>
<void index="51">
<string>requesterMail</string>
</void>
<void index="52">
<string>requesterName</string>
</void>
<void index="53">
<string>serieNfeConsulta</string>
</void>
<void index="54">
<string>situacaoNfeConsulta</string>
</void>
<void index="55">
<string>storeIdNfeConsulta</string>
</void>
<void index="56">
<string>tipoMotoristaEntrega</string>
</void>
<void index="57">
<string>ufDestino</string>
</void>
<void index="58">
<string>ufOrigem</string>
</void>
<void index="59">
<string>userValidacaoGestor</string>
</void>
<void index="60">
<string>usuarioEmissorNfe</string>
</void>
<void index="61">
<string>validacaoItens</string>
</void>
<void index="62">
<string>valorNfeConsulta</string>
</void>
<void index="63">
<string>WKNumProces</string>
</void>
</array>
</void>
<void method="put"> <void method="put">
<string>mecanismo</string> <string>mecanismo</string>
<array class="[Ljava.lang.Object;" length="12"> <array class="[Ljava.lang.Object;" length="12">
@ -835,5 +1040,543 @@
</void> </void>
</array> </array>
</void> </void>
<void method="put">
<string>forms</string>
<object class="java.util.LinkedList">
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>FLUIGADHOC</string>
</void>
<void property="documentDescription">
<string>FLUIGADHOC</string>
</void>
<void property="documentId">
<int>3</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>FLUIGADHOCPROCESS</string>
</void>
<void property="documentDescription">
<string>FLUIGADHOCPROCESS</string>
</void>
<void property="documentId">
<int>4</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_tipo_ocorrencia</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_tipo_ocorrencia</string>
</void>
<void property="documentId">
<int>14</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_abertura_chamado</string>
</void>
<void property="documentDescription">
<string>totvsflow_abertura_chamado</string>
</void>
<void property="documentId">
<int>15</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSFormulariodeAberturadechamado</string>
</void>
<void property="documentDescription">
<string>Formulário de Abertura de chamado</string>
</void>
<void property="documentId">
<int>20</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>Abertura_de_chamados</string>
</void>
<void property="documentDescription">
<string>Solicitação de abertura de chamados</string>
</void>
<void property="documentId">
<int>21</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSvistoriadeServico</string>
</void>
<void property="documentDescription">
<string>vistoriadeServico</string>
</void>
<void property="documentId">
<int>24</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSFormulariodeReservadesala</string>
</void>
<void property="documentDescription">
<string>Formulário de Reserva de sala</string>
</void>
<void property="documentId">
<int>34</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_centrocusto</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_centrocusto</string>
</void>
<void property="documentId">
<int>103</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_cadastro_item</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_cadastro_item</string>
</void>
<void property="documentId">
<int>104</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_estabelecimento</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_estabelecimento</string>
</void>
<void property="documentId">
<int>105</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_solicitacao_compras</string>
</void>
<void property="documentDescription">
<string>totvsflow_solicitacao_compras</string>
</void>
<void property="documentId">
<int>165</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>aberturadechamado_manutencao</string>
</void>
<void property="documentDescription">
<string>aberturadechamado_manutencao</string>
</void>
<void property="documentId">
<int>400</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>Solicitacao_transferencia</string>
</void>
<void property="documentDescription">
<string>Solicitacao_transferencia</string>
</void>
<void property="documentId">
<int>590</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>recrutamento</string>
</void>
<void property="documentDescription">
<string>recrutamento</string>
</void>
<void property="documentId">
<int>823</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_aniversariantes</string>
</void>
<void property="documentDescription">
<string>Aniversariantes</string>
</void>
<void property="documentId">
<int>7690</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_cardapio</string>
</void>
<void property="documentDescription">
<string>Cardápio do Dia</string>
</void>
<void property="documentId">
<int>7695</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_convenios</string>
</void>
<void property="documentDescription">
<string>Convênios</string>
</void>
<void property="documentId">
<int>7703</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_news</string>
</void>
<void property="documentDescription">
<string>Notícias</string>
</void>
<void property="documentId">
<int>7709</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>compras_digital</string>
</void>
<void property="documentDescription">
<string>compras_digital</string>
</void>
<void property="documentId">
<int>9305</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_formulario_processo_admissao</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Formulario_Processo_Admissao_Protheus</string>
</void>
<void property="documentId">
<int>9626</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_cadastro_status</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Status</string>
</void>
<void property="documentId">
<int>9627</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_configuracoes</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Configuracoes</string>
</void>
<void property="documentId">
<int>9628</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_cadastro_jornada</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Jornada</string>
</void>
<void property="documentId">
<int>9629</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_tipo_documento</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Tipo_Documento</string>
</void>
<void property="documentId">
<int>9630</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_dataset</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Dataset</string>
</void>
<void property="documentId">
<int>9631</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_configuracao</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Configuracoes</string>
</void>
<void property="documentId">
<int>9632</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_beneficio</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Beneficios</string>
</void>
<void property="documentId">
<int>9633</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_compl_contrato</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Comp_Contrato</string>
</void>
<void property="documentId">
<int>9634</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_funcao_jornada</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Funcao_Jornada</string>
</void>
<void property="documentId">
<int>9635</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_dataset_estrutura</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Dataset_Estrutura</string>
</void>
<void property="documentId">
<int>9636</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_grupo_tipo_contrato</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Grupo_Tipo_Contrato</string>
</void>
<void property="documentId">
<int>9637</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_tipo_contrato</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Tipo_Contrato</string>
</void>
<void property="documentId">
<int>9638</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_traducao_campo_valor</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Traducao_Campo_Valor</string>
</void>
<void property="documentId">
<int>9639</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_restricoes_cpf</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Formulario_Restricao_CPF</string>
</void>
<void property="documentId">
<int>9640</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_compl_vt</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Compl_VT</string>
</void>
<void property="documentId">
<int>9641</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_traducao_campo</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Traducao_Campo</string>
</void>
<void property="documentId">
<int>9995</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>desligamento</string>
</void>
<void property="documentDescription">
<string>desligamento</string>
</void>
<void property="documentId">
<int>12959</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>checklist</string>
</void>
<void property="documentDescription">
<string>checklist</string>
</void>
<void property="documentId">
<int>40213</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_lancamento_documento</string>
</void>
<void property="documentDescription">
<string>totvsflow_lancamento_documento</string>
</void>
<void property="documentId">
<int>41254</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>transferência</string>
</void>
<void property="documentDescription">
<string>transferência</string>
</void>
<void property="documentId">
<int>43582</int>
</void>
</object>
</void>
</object>
</void>
</object> </object>
</java> </java>

View File

@ -29,10 +29,10 @@
<processDefinitionVersionPK> <processDefinitionVersionPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
</processDefinitionVersionPK> </processDefinitionVersionPK>
<versionDescription></versionDescription> <versionDescription></versionDescription>
<formId>590</formId> <formId>43582</formId>
<editionMode>true</editionMode> <editionMode>true</editionMode>
<updateAttachmentsVersion>true</updateAttachmentsVersion> <updateAttachmentsVersion>true</updateAttachmentsVersion>
<controlsAttachmentsSecurity>false</controlsAttachmentsSecurity> <controlsAttachmentsSecurity>false</controlsAttachmentsSecurity>
@ -826,7 +826,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>1</expressionOrder> <expressionOrder>1</expressionOrder>
<version>46</version> <version>49</version>
<sequence>2</sequence> <sequence>2</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;gestor_cce&quot;) != &quot;&quot;</condition> <condition>hAPI.getCardValue(&quot;gestor_cce&quot;) != &quot;&quot;</condition>
@ -840,7 +840,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>2</expressionOrder> <expressionOrder>2</expressionOrder>
<version>46</version> <version>49</version>
<sequence>2</sequence> <sequence>2</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>true</condition> <condition>true</condition>
@ -854,7 +854,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>1</expressionOrder> <expressionOrder>1</expressionOrder>
<version>46</version> <version>49</version>
<sequence>46</sequence> <sequence>46</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;validacaoItens&quot;) == &quot;entregue&quot; &amp;&amp; hAPI.getCardValue(&quot;dataEntradaNfeConsulta&quot;) != &quot;&quot;</condition> <condition>hAPI.getCardValue(&quot;validacaoItens&quot;) == &quot;entregue&quot; &amp;&amp; hAPI.getCardValue(&quot;dataEntradaNfeConsulta&quot;) != &quot;&quot;</condition>
@ -866,7 +866,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>2</expressionOrder> <expressionOrder>2</expressionOrder>
<version>46</version> <version>49</version>
<sequence>46</sequence> <sequence>46</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>true</condition> <condition>true</condition>
@ -878,7 +878,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>1</expressionOrder> <expressionOrder>1</expressionOrder>
<version>46</version> <version>49</version>
<sequence>107</sequence> <sequence>107</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;AL&quot;</condition> <condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;AL&quot;</condition>
@ -892,7 +892,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>2</expressionOrder> <expressionOrder>2</expressionOrder>
<version>46</version> <version>49</version>
<sequence>107</sequence> <sequence>107</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;BA&quot;</condition> <condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;BA&quot;</condition>
@ -906,7 +906,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>3</expressionOrder> <expressionOrder>3</expressionOrder>
<version>46</version> <version>49</version>
<sequence>107</sequence> <sequence>107</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;SE&quot;</condition> <condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;SE&quot;</condition>
@ -920,7 +920,7 @@
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<expressionOrder>4</expressionOrder> <expressionOrder>4</expressionOrder>
<version>46</version> <version>49</version>
<sequence>107</sequence> <sequence>107</sequence>
</conditionProcessStatePK> </conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;&quot;</condition> <condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;&quot;</condition>
@ -929,6 +929,34 @@
<engineAllocationId>Pool Grupo</engineAllocationId> <engineAllocationId>Pool Grupo</engineAllocationId>
<conditionType>0</conditionType> <conditionType>0</conditionType>
</ConditionProcessState> </ConditionProcessState>
<ConditionProcessState>
<conditionProcessStatePK>
<companyId>1</companyId>
<processId>Transferência Ginseng</processId>
<expressionOrder>5</expressionOrder>
<version>49</version>
<sequence>107</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;VDC&quot;</condition>
<destinationSequenceId>31</destinationSequenceId>
<engineAllocationConfiguration>&lt;AssignmentController&gt;&lt;Group&gt;motoristaBA&lt;/Group&gt;&lt;/AssignmentController&gt;</engineAllocationConfiguration>
<engineAllocationId>Pool Grupo</engineAllocationId>
<conditionType>0</conditionType>
</ConditionProcessState>
<ConditionProcessState>
<conditionProcessStatePK>
<companyId>1</companyId>
<processId>Transferência Ginseng</processId>
<expressionOrder>6</expressionOrder>
<version>49</version>
<sequence>107</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;ufOrigem&quot;) == &quot;SE&quot;</condition>
<destinationSequenceId>31</destinationSequenceId>
<engineAllocationConfiguration>&lt;AssignmentController&gt;&lt;Group&gt;motoristaSE&lt;/Group&gt;&lt;/AssignmentController&gt;</engineAllocationConfiguration>
<engineAllocationId>Pool Grupo</engineAllocationId>
<conditionType>0</conditionType>
</ConditionProcessState>
</list> </list>
<list> <list>
<ProcessLink> <ProcessLink>
@ -1378,7 +1406,7 @@ function notifyTemplate(templateCode, destinoEmail, requesterId, params, process
} }
function buildProcessLink(processNumber) { function buildProcessLink(processNumber) {
var BASE_URL_FALLBACK = &quot;https://comerciode188007.fluig.cloudtotvs.com.br&quot;; var BASE_URL_FALLBACK = &quot;https://comerciode188006.fluig.cloudtotvs.com.br&quot;;
var baseUrl = safeTrim(getValue(&quot;WKServerURL&quot;)); var baseUrl = safeTrim(getValue(&quot;WKServerURL&quot;));
var companyId = safeTrim(getValue(&quot;WKCompany&quot;)); var companyId = safeTrim(getValue(&quot;WKCompany&quot;));
if (baseUrl === &quot;&quot;) baseUrl = BASE_URL_FALLBACK; if (baseUrl === &quot;&quot;) baseUrl = BASE_URL_FALLBACK;
@ -1640,7 +1668,7 @@ function onlyDigits(value) {
<processLinkBendPK> <processLinkBendPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
<linkSequence>5</linkSequence> <linkSequence>5</linkSequence>
<bendSequence>1</bendSequence> <bendSequence>1</bendSequence>
</processLinkBendPK> </processLinkBendPK>
@ -1651,7 +1679,7 @@ function onlyDigits(value) {
<processLinkBendPK> <processLinkBendPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
<linkSequence>5</linkSequence> <linkSequence>5</linkSequence>
<bendSequence>2</bendSequence> <bendSequence>2</bendSequence>
</processLinkBendPK> </processLinkBendPK>
@ -1662,7 +1690,7 @@ function onlyDigits(value) {
<processLinkBendPK> <processLinkBendPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
<linkSequence>7</linkSequence> <linkSequence>7</linkSequence>
<bendSequence>1</bendSequence> <bendSequence>1</bendSequence>
</processLinkBendPK> </processLinkBendPK>
@ -1673,7 +1701,7 @@ function onlyDigits(value) {
<processLinkBendPK> <processLinkBendPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
<linkSequence>26</linkSequence> <linkSequence>26</linkSequence>
<bendSequence>1</bendSequence> <bendSequence>1</bendSequence>
</processLinkBendPK> </processLinkBendPK>
@ -1684,7 +1712,7 @@ function onlyDigits(value) {
<processLinkBendPK> <processLinkBendPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
<linkSequence>61</linkSequence> <linkSequence>61</linkSequence>
<bendSequence>1</bendSequence> <bendSequence>1</bendSequence>
</processLinkBendPK> </processLinkBendPK>
@ -1695,7 +1723,7 @@ function onlyDigits(value) {
<processLinkBendPK> <processLinkBendPK>
<companyId>1</companyId> <companyId>1</companyId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<version>46</version> <version>49</version>
<linkSequence>85</linkSequence> <linkSequence>85</linkSequence>
<bendSequence>1</bendSequence> <bendSequence>1</bendSequence>
</processLinkBendPK> </processLinkBendPK>
@ -1751,6 +1779,24 @@ function onlyDigits(value) {
<fieldDescription>Justificativa</fieldDescription> <fieldDescription>Justificativa</fieldDescription>
<slotId>5</slotId> <slotId>5</slotId>
</ProcessFormField> </ProcessFormField>
<ProcessFormField>
<processFormFieldPK>
<companyId>1</companyId>
<processId>Transferência Ginseng</processId>
<fieldId>motoristaColetaNome</fieldId>
</processFormFieldPK>
<fieldDescription>Motorista Coleta</fieldDescription>
<slotId>6</slotId>
</ProcessFormField>
<ProcessFormField>
<processFormFieldPK>
<companyId>1</companyId>
<processId>Transferência Ginseng</processId>
<fieldId>motoristaEntregaNome</fieldId>
</processFormFieldPK>
<fieldDescription>Motorista Entrega</fieldDescription>
<slotId>7</slotId>
</ProcessFormField>
<ProcessFormField> <ProcessFormField>
<processFormFieldPK> <processFormFieldPK>
<companyId>1</companyId> <companyId>1</companyId>
@ -1758,7 +1804,7 @@ function onlyDigits(value) {
<fieldId>requesterName</fieldId> <fieldId>requesterName</fieldId>
</processFormFieldPK> </processFormFieldPK>
<fieldDescription>requesterName</fieldDescription> <fieldDescription>requesterName</fieldDescription>
<slotId>6</slotId> <slotId>8</slotId>
</ProcessFormField> </ProcessFormField>
</list> </list>
<list> <list>
@ -1780,7 +1826,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>4</stateSequence> <stateSequence>4</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>title</appField> <appField>title</appField>
@ -1790,7 +1836,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>4</stateSequence> <stateSequence>4</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>description</appField> <appField>description</appField>
@ -1800,7 +1846,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>4</stateSequence> <stateSequence>4</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>highlight</appField> <appField>highlight</appField>
@ -1810,7 +1856,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>4</stateSequence> <stateSequence>4</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>approve</appField> <appField>approve</appField>
@ -1820,7 +1866,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>4</stateSequence> <stateSequence>4</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>reject</appField> <appField>reject</appField>
@ -1830,7 +1876,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>6</stateSequence> <stateSequence>6</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>title</appField> <appField>title</appField>
@ -1840,7 +1886,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>6</stateSequence> <stateSequence>6</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>description</appField> <appField>description</appField>
@ -1850,7 +1896,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>6</stateSequence> <stateSequence>6</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>highlight</appField> <appField>highlight</appField>
@ -1860,7 +1906,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>6</stateSequence> <stateSequence>6</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>approve</appField> <appField>approve</appField>
@ -1870,7 +1916,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>6</stateSequence> <stateSequence>6</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>reject</appField> <appField>reject</appField>
@ -1880,7 +1926,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>24</stateSequence> <stateSequence>24</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>title</appField> <appField>title</appField>
@ -1890,7 +1936,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>24</stateSequence> <stateSequence>24</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>description</appField> <appField>description</appField>
@ -1900,7 +1946,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>24</stateSequence> <stateSequence>24</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>highlight</appField> <appField>highlight</appField>
@ -1910,7 +1956,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>24</stateSequence> <stateSequence>24</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>approve</appField> <appField>approve</appField>
@ -1920,7 +1966,7 @@ function onlyDigits(value) {
<id>0</id> <id>0</id>
<tenantId>0</tenantId> <tenantId>0</tenantId>
<processId>Transferência Ginseng</processId> <processId>Transferência Ginseng</processId>
<processVersion>46</processVersion> <processVersion>49</processVersion>
<stateSequence>24</stateSequence> <stateSequence>24</stateSequence>
<appKey>approval</appKey> <appKey>approval</appKey>
<appField>reject</appField> <appField>reject</appField>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 49 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -4405,7 +4405,7 @@
<bpmn2:BpmnEndEvent extendedFields="&lt;list/&gt;" id="endcancel39" incoming="flow53" name="Cancelado" notificaRequisitante="true" signalId="0" type="65"/> <bpmn2:BpmnEndEvent extendedFields="&lt;list/&gt;" id="endcancel39" incoming="flow53" name="Cancelado" notificaRequisitante="true" signalId="0" type="65"/>
<bpmn2:BpmnGateway condition="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;1&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;validacaoItens&amp;quot;) == &amp;quot;entregue&amp;quot; &amp;amp;&amp;amp; hAPI.getCardValue(&amp;quot;dataEntradaNfeConsulta&amp;quot;) != &amp;quot;&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;servicetask99&lt;/targetTask&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;2&lt;/order&gt;&#10; &lt;expression&gt;true&lt;/expression&gt;&#10; &lt;targetTask&gt;task24&lt;/targetTask&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10;&lt;/list&gt;" extendedFields="&lt;list/&gt;" id="exclusivegateway46" incoming="flow47" name="Validar produto" outgoing="flow48 flow100" type="120"/> <bpmn2:BpmnGateway condition="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;1&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;validacaoItens&amp;quot;) == &amp;quot;entregue&amp;quot; &amp;amp;&amp;amp; hAPI.getCardValue(&amp;quot;dataEntradaNfeConsulta&amp;quot;) != &amp;quot;&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;servicetask99&lt;/targetTask&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;2&lt;/order&gt;&#10; &lt;expression&gt;true&lt;/expression&gt;&#10; &lt;targetTask&gt;task24&lt;/targetTask&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10;&lt;/list&gt;" extendedFields="&lt;list/&gt;" id="exclusivegateway46" incoming="flow47" name="Validar produto" outgoing="flow48 flow100" type="120"/>
<bpmn2:BpmnTask authNotify="true" esforcoCalculo="0" executionAttempts="0" expediente="Expediente BackOffice, Log&#237;stica e Motorista" extendedFields="&lt;list/&gt;" frequency="0" id="task57" incoming="flow98" loopType="0" managerAssignmentControllerString="&lt;org.eclipse.bpmn2.impl.AssignmentControllerFormField&gt;&#10; &lt;formField&gt;motoristaEntregaLogin&lt;/formField&gt;&#10; &lt;mechanismName&gt;Campo Formul&#225;rio&lt;/mechanismName&gt;&#10;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerFormField&gt;" managerMechanism="Campo Formul&#225;rio" name="Entregar Produto" outgoing="flow61 flow85" prazoConclusao="960.0" selecionaColaboradores="1" type="80"/> <bpmn2:BpmnTask authNotify="true" esforcoCalculo="0" executionAttempts="0" expediente="Expediente BackOffice, Log&#237;stica e Motorista" extendedFields="&lt;list/&gt;" frequency="0" id="task57" incoming="flow98" loopType="0" managerAssignmentControllerString="&lt;org.eclipse.bpmn2.impl.AssignmentControllerFormField&gt;&#10; &lt;formField&gt;motoristaEntregaLogin&lt;/formField&gt;&#10; &lt;mechanismName&gt;Campo Formul&#225;rio&lt;/mechanismName&gt;&#10;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerFormField&gt;" managerMechanism="Campo Formul&#225;rio" name="Entregar Produto" outgoing="flow61 flow85" prazoConclusao="960.0" selecionaColaboradores="1" type="80"/>
<bpmn2:BpmnProcess author="" cardIndex="590" category="Transfer&#234;ncia" complementsLevel="1" deadlineTime="2880.0" descriptorFields="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;centroCusto&lt;/id&gt;&#10; &lt;label&gt;Filial Destino&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;dataAbertura&lt;/id&gt;&#10; &lt;label&gt;Data de abertura&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;dataEmissaoNfe&lt;/id&gt;&#10; &lt;label&gt;dataEmissaoNfe&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;estabelecimento&lt;/id&gt;&#10; &lt;label&gt;Filial Emitente&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;justificativa&lt;/id&gt;&#10; &lt;label&gt;Justificativa&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;requesterName&lt;/id&gt;&#10; &lt;label&gt;requesterName&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10;&lt;/list&gt;" expedient="Default" extendedFields="&lt;list/&gt;" formSource="server" id="Transfer&#234;ncia Ginseng" instruction="Este flow permite abertura de solicita&#231;&#227;o de transfer&#234;ncias automatizadas, informando qual item ser&#225; transferido e direcionado para as aprova&#231;&#245;es corretas." keyWord="" managerAssignmentController="&lt;org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;&#10; &lt;groupId&gt;CD&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Grupo&lt;/mechanismName&gt;&#10;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;" managerMechanism="Grupo" mobileReady="true" name="Transfer&#234;ncia Ginseng" notifyRequisitionerComplements="true" notifyResponsibleComplements="true" serverId="Producao" updateAttachment="true" version="46" volume="Default"/> <bpmn2:BpmnProcess author="" cardIndex="43582" category="Transfer&#234;ncia" complementsLevel="1" deadlineTime="2880.0" descriptorFields="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;centroCusto&lt;/id&gt;&#10; &lt;label&gt;Filial Destino&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;dataAbertura&lt;/id&gt;&#10; &lt;label&gt;Data de abertura&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;dataEmissaoNfe&lt;/id&gt;&#10; &lt;label&gt;dataEmissaoNfe&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;estabelecimento&lt;/id&gt;&#10; &lt;label&gt;Filial Emitente&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;justificativa&lt;/id&gt;&#10; &lt;label&gt;Justificativa&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;motoristaColetaNome&lt;/id&gt;&#10; &lt;label&gt;Motorista Coleta&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;motoristaEntregaNome&lt;/id&gt;&#10; &lt;label&gt;Motorista Entrega&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;requesterName&lt;/id&gt;&#10; &lt;label&gt;requesterName&lt;/label&gt;&#10; &lt;cardIndex&gt;590 - Solicitacao_transferencia&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10;&lt;/list&gt;" expedient="Default" extendedFields="&lt;list/&gt;" formSource="server" id="Transfer&#234;ncia Ginseng" instruction="Este flow permite abertura de solicita&#231;&#227;o de transfer&#234;ncias automatizadas, informando qual item ser&#225; transferido e direcionado para as aprova&#231;&#245;es corretas." keyWord="" managerAssignmentController="&lt;org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;&#10; &lt;groupId&gt;CD&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Grupo&lt;/mechanismName&gt;&#10;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;" managerMechanism="Grupo" mobileReady="true" name="Transfer&#234;ncia Ginseng" notifyRequisitionerComplements="true" notifyResponsibleComplements="true" serverId="Producao" updateAttachment="true" version="50" volume="Default"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow3" name="" sourceRef="startevent1" targetRef="exclusivegateway2"/> <bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow3" name="" sourceRef="startevent1" targetRef="exclusivegateway2"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow5" movementAccessLinkDescription="" movementDescription="" movementTitle="" name="Gestor Identificado" sourceRef="exclusivegateway2" targetRef="task4"/> <bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow5" movementAccessLinkDescription="" movementDescription="" movementTitle="" name="Gestor Identificado" sourceRef="exclusivegateway2" targetRef="task4"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow7" name="Loja sem Gestor" sourceRef="exclusivegateway2" targetRef="task6"/> <bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow7" name="Loja sem Gestor" sourceRef="exclusivegateway2" targetRef="task6"/>
@ -4430,7 +4430,7 @@
<bpmn2:BpmnTask authNotify="true" esforcoCalculo="0" executionAttempts="0" expediente="" frequency="0" id="task104" incoming="flow105" loopType="0" managerMechanism="" name="Verificar problema de lan&#231;amento" outgoing="flow106" selecionaColaboradores="1" type="80"/> <bpmn2:BpmnTask authNotify="true" esforcoCalculo="0" executionAttempts="0" expediente="" frequency="0" id="task104" incoming="flow105" loopType="0" managerMechanism="" name="Verificar problema de lan&#231;amento" outgoing="flow106" selecionaColaboradores="1" type="80"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow105" name="" sourceRef="intermediateerror103" targetRef="task104"/> <bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow105" name="" sourceRef="intermediateerror103" targetRef="task104"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow106" name="" sourceRef="task104" targetRef="servicetask99"/> <bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow106" name="" sourceRef="task104" targetRef="servicetask99"/>
<bpmn2:BpmnGateway condition="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;1&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;AL&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaAL&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;2&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;BA&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaBA&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;3&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;SE&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaSE&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;4&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;CD&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10;&lt;/list&gt;" id="exclusivegateway107" incoming="flow108" name="Validar rota" outgoing="flow109" type="120"/> <bpmn2:BpmnGateway condition="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;1&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;AL&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaAL&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;2&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;BA&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaBA&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;3&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;SE&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaSE&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;4&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;CD&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;5&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;VDC&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaBA&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;6&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;ufOrigem&amp;quot;) == &amp;quot;SE&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;task31&lt;/targetTask&gt;&#10; &lt;mechanism&gt;Pool Grupo&lt;/mechanism&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;&gt;&#10; &lt;groupId&gt;motoristaSE&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Pool Grupo&lt;/mechanismName&gt;&#10; &lt;/mecanismoAtribuicaoConfiguracao&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10;&lt;/list&gt;" id="exclusivegateway107" incoming="flow108" name="Validar rota" outgoing="flow109" type="120"/>
<bpmn2:SequenceFlow atividadeFluxo="Enviar para coleta" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow108" name="Enviar para rota" sourceRef="task6" targetRef="exclusivegateway107"/> <bpmn2:SequenceFlow atividadeFluxo="Enviar para coleta" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow108" name="Enviar para rota" sourceRef="task6" targetRef="exclusivegateway107"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow109" name="" sourceRef="exclusivegateway107" targetRef="task31"/> <bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow109" name="" sourceRef="exclusivegateway107" targetRef="task31"/>
</xmi:XMI> </xmi:XMI>

View File

@ -126,7 +126,7 @@ function notifyTemplate(templateCode, destinoEmail, requesterId, params, process
} }
function buildProcessLink(processNumber) { function buildProcessLink(processNumber) {
var BASE_URL_FALLBACK = "https://comerciode188007.fluig.cloudtotvs.com.br"; var BASE_URL_FALLBACK = "https://comerciode188006.fluig.cloudtotvs.com.br";
var baseUrl = safeTrim(getValue("WKServerURL")); var baseUrl = safeTrim(getValue("WKServerURL"));
var companyId = safeTrim(getValue("WKCompany")); var companyId = safeTrim(getValue("WKCompany"));
if (baseUrl === "") baseUrl = BASE_URL_FALLBACK; if (baseUrl === "") baseUrl = BASE_URL_FALLBACK;