diff --git a/Ginseng_chamados/datasets/.project b/Ginseng_chamados/datasets/.project new file mode 100644 index 0000000..2fb354a --- /dev/null +++ b/Ginseng_chamados/datasets/.project @@ -0,0 +1,17 @@ + + + datasets + + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/Ginseng_chamados/datasets/.settings/.jsdtscope b/Ginseng_chamados/datasets/.settings/.jsdtscope new file mode 100644 index 0000000..cca691f --- /dev/null +++ b/Ginseng_chamados/datasets/.settings/.jsdtscope @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Ginseng_chamados/datasets/.settings/org.eclipse.wst.jsdt.ui.superType.container b/Ginseng_chamados/datasets/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..49c8cd4 --- /dev/null +++ b/Ginseng_chamados/datasets/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.JRE_CONTAINER \ No newline at end of file diff --git a/Ginseng_chamados/datasets/.settings/org.eclipse.wst.jsdt.ui.superType.name b/Ginseng_chamados/datasets/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..11006e2 --- /dev/null +++ b/Ginseng_chamados/datasets/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Global \ No newline at end of file diff --git a/Ginseng_chamados/forms/.project b/Ginseng_chamados/forms/.project new file mode 100644 index 0000000..e269f56 --- /dev/null +++ b/Ginseng_chamados/forms/.project @@ -0,0 +1,17 @@ + + + forms + + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/Ginseng_chamados/forms/.settings/.jsdtscope b/Ginseng_chamados/forms/.settings/.jsdtscope new file mode 100644 index 0000000..cca691f --- /dev/null +++ b/Ginseng_chamados/forms/.settings/.jsdtscope @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Ginseng_chamados/forms/.settings/org.eclipse.wst.jsdt.ui.superType.container b/Ginseng_chamados/forms/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..49c8cd4 --- /dev/null +++ b/Ginseng_chamados/forms/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.JRE_CONTAINER \ No newline at end of file diff --git a/Ginseng_chamados/forms/.settings/org.eclipse.wst.jsdt.ui.superType.name b/Ginseng_chamados/forms/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..11006e2 --- /dev/null +++ b/Ginseng_chamados/forms/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Global \ No newline at end of file diff --git a/Lançamento de documentos/.vscode/servers.json b/Lançamento de documentos/.vscode/servers.json index 9854b91..0c5f368 100644 --- a/Lançamento de documentos/.vscode/servers.json +++ b/Lançamento de documentos/.vscode/servers.json @@ -2,15 +2,16 @@ "version": "1.0.0", "configurations": [ { - "id": "cafi5jey9zammnjzp2n5z2h8lutld7", - "name": "Fluig produção", + "id": "kcd262syqgmnhlewwba1vu2pgu6b", + "name": "Fluig producao", "host": "comerciode188006.fluig.cloudtotvs.com.br", "ssl": true, "port": 443, "username": "andrey.cunha", - "password": "eyJpdiI6ImQwNjBhYWU1NzM3ZjVhNzU0ZWExOWYwZGZiNDEzNWI3Iiwic2FsdCI6IjQ0NmVjYTQ4OTY3ZWViOTc3NmRjY2E4M2UyYzc2NGViIiwidGV4dCI6ImNmZWRiYzFlODFjY2EwOTUzOWZlMGVlMTMzZWIwNzA0In0=", + "password": "eyJpdiI6IjM5OWJjNjRiOGQ3Yjg5ZWEwYzk0Yzk4NWU5YjI5ODk4Iiwic2FsdCI6ImZjMzVmM2FmMDRhNjljNjA1YThiYzJjYTI5ZjU3NTgyIiwidGV4dCI6ImYwNDA2ZWYxOTM1N2FmMzYyYWZiODc4ZThjMmMzM2ZiIn0=", "userCode": "andrey.cunha", "confirmExporting": false, + "hasBrowser": false, "companyId": 1 } ] diff --git a/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/.metadata b/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/.metadata index ab065a3..6d0b785 100644 Binary files a/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/.metadata and b/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/.metadata differ diff --git a/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/totvsflow_lancamento_documento.html b/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/totvsflow_lancamento_documento.html index 62ad23e..9a20dc8 100644 --- a/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/totvsflow_lancamento_documento.html +++ b/Lançamento de documentos/lançamentos/forms/41254 - totvsflow_lancamento_documento/totvsflow_lancamento_documento.html @@ -79,7 +79,7 @@ -

Lançamento de documento

+

Lançamento de documento

@@ -90,7 +90,7 @@

 Dados do documento 

-
Dados referentes ao documento que será lançado.
+
Dados referentes ao documento que será lançado.

@@ -113,11 +113,11 @@ + obrigatório

- + *
- + Tipo de cadastro * + obrigatório

* @@ -176,7 +176,7 @@ mask="00.000.000/0000-00" class="form-control" readonly /> + obrigatório

@@ -199,7 +199,7 @@ />

@@ -207,8 +207,9 @@ @@ -219,13 +220,13 @@
- * + * + obrigatório

@@ -245,8 +246,8 @@ * -

Utilize a aba anexos para anexar o documento ou o botão - abaixo. Anexo obrigatório.

+

Utilize a aba anexos para anexar o documento ou o botão + abaixo. Anexo obrigatório.

@@ -258,21 +259,21 @@

 Descrição dos serviços +  Descrição dos serviços  

-
Descrição detalhada dos serviços prestados e as possíveis informações complementares.
+
Descrição detalhada dos serviços prestados e as possíveis informações complementares.

- Descrição dos serviços * + obrigatório

@@ -294,10 +295,10 @@
-
-
-
-
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
@@ -926,7 +1031,35 @@ $("#msgJustificativa").show(); 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) { $(".divJustiDecisaoGestor").addClass("has-error"); $("#justiDecisaoGestor").show(); diff --git a/Transferência Ginseng/.settings/org.eclipse.core.resources.prefs b/Transferência Ginseng/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..5fed4cd --- /dev/null +++ b/Transferência Ginseng/.settings/org.eclipse.core.resources.prefs @@ -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 diff --git a/Transferência Ginseng/.vscode/servers.json b/Transferência Ginseng/.vscode/servers.json index 4a764ca..a51223c 100644 --- a/Transferência Ginseng/.vscode/servers.json +++ b/Transferência Ginseng/.vscode/servers.json @@ -13,6 +13,19 @@ "confirmExporting": false, "hasBrowser": false, "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 } ] } \ No newline at end of file diff --git a/Transferência Ginseng/datasets/ds_LojasTransf.js b/Transferência Ginseng/datasets/ds_LojasTransf.js index 1273d55..63db996 100644 --- a/Transferência Ginseng/datasets/ds_LojasTransf.js +++ b/Transferência Ginseng/datasets/ds_LojasTransf.js @@ -119,7 +119,7 @@ function parseConstraints(constraints) { var out = { pdv: "", loja: "", - onlyAtivo: true, + onlyAtivo: false, termoLivre: "" }; diff --git a/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js b/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js index 259ac84..99642cf 100644 --- a/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js +++ b/Transferência Ginseng/datasets/ds_fiscal_invoice_by_keys.js @@ -38,14 +38,14 @@ function createDataset(fields, constraints, sortFields) { } var auth = resolveAuth(constraints); + var authVariants = buildAuthVariants(auth); var diagnostics = []; + var query = "page=1&page_size=50&key=" + key + "&sort_by=updatedAt&sort_order=desc"; var endpoints = [ - "/fiscal-invoices?key=" + key, - "fiscal-invoices?key=" + key, - "/fiscal/invoices?key=" + key, - "/fiscal/invoice?key=" + key, - "/invoice?key=" + key + "/v2/vendas/rgb-transferencias?" + query, + "v2/vendas/rgb-transferencias?" + query, + "/rgb-transferencias?" + query ]; var apiObj = null; @@ -56,15 +56,21 @@ function createDataset(fields, constraints, sortFields) { var clientService = fluigAPI.getAuthorizeClientService(); for (var i = 0; i < endpoints.length; i++) { var endpoint = endpoints[i]; - var resp = invokeAuthorizedGet(clientService, endpoint, auth); - diagnostics.push(endpoint + " => HTTP " + trim(resp.status)); - var parsed = parseApiPayload(resp.body); - if (parsed && trim(parsed.message)) { - lastApiMessage = trim(parsed.message); + for (var a = 0; a < authVariants.length; a++) { + var authVariant = authVariants[a]; + var resp = invokeAuthorizedGet(clientService, endpoint, authVariant); + diagnostics.push(endpoint + " [" + authVariant.name + "] => HTTP " + trim(resp.status)); + 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)) { - apiObj = parsed; - hitInfo = endpoint; + if (apiObj) { break; } } @@ -74,21 +80,26 @@ function createDataset(fields, constraints, sortFields) { if (!apiObj) { var directUrls = [ - "https://api.grupoginseng.com.br/fiscal-invoices?key=" + key, - "https://api.grupoginseng.com.br/fiscal/invoice?key=" + key + "https://api.grupoginseng.com.br/v2/vendas/rgb-transferencias?" + query ]; for (var d = 0; d < directUrls.length; d++) { var url = directUrls[d]; - var directResp = fetchDirect(url, 30000, auth); - diagnostics.push(url + " => HTTP " + trim(directResp.status)); - var parsedDirect = parseApiPayload(directResp.body); - if (parsedDirect && trim(parsedDirect.message)) { - lastApiMessage = trim(parsedDirect.message); + for (var da = 0; da < authVariants.length; da++) { + var directAuthVariant = authVariants[da]; + var directResp = fetchDirect(url, 30000, directAuthVariant); + diagnostics.push(url + " [" + directAuthVariant.name + "] => HTTP " + trim(directResp.status)); + 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)) { - apiObj = parsedDirect; - hitInfo = url; + if (apiObj) { break; } } @@ -103,34 +114,33 @@ function createDataset(fields, constraints, sortFields) { return dataset; } - if (!apiObj.success || !apiObj.data) { + var dataNfe = extractInvoiceData(apiObj, key); + if (!dataNfe) { addErrorRow(dataset, trim(apiObj.message) || "NFe nao encontrada. Fonte: " + hitInfo); return dataset; } - - var dataNfe = apiObj.data || {}; - var itens = dataNfe.itens || []; + var itens = resolveItems(dataNfe); var itensJson = JSON.stringify(buildNfeItems(itens)); dataset.addRow([ "true", "OK (" + hitInfo + ")", - trim(dataNfe.key), - trim(dataNfe.invoiceNumber), - trim(dataNfe.serie), - formatIsoDate(dataNfe.emissionDate), - formatIsoDate(dataNfe.operationDate), - trim(dataNfe.supplierName), - trim(dataNfe.documentValue), - trim(dataNfe.totalItemsValue), - trim(dataNfe.situation), - trim(dataNfe.fiscalOperationDescription), + trim(dataNfe.key || dataNfe.nfeKey || dataNfe.chave || key), + trim(dataNfe.invoiceNumber || dataNfe.numeroNota || dataNfe.numero || dataNfe.number), + trim(dataNfe.serie || dataNfe.series), + formatIsoDate(dataNfe.emissionDate || dataNfe.issueDate || dataNfe.invoiceDate), + formatIsoDate(dataNfe.operationDate || dataNfe.transactionDate || dataNfe.operation_at), + trim(dataNfe.supplierName || dataNfe.supplier || dataNfe.fornecedor || dataNfe.emitente), + trim(dataNfe.documentValue || dataNfe.totalValue || dataNfe.valorDocumento || dataNfe.amount), + trim(dataNfe.totalItemsValue || dataNfe.itemsValue || dataNfe.valorItens || dataNfe.totalValue), + trim(dataNfe.situation || dataNfe.status), + trim(dataNfe.fiscalOperationDescription || dataNfe.operationDescription || dataNfe.naturezaOperacao), String(itens.length), itensJson, - trim(dataNfe.storeId), - trim(dataNfe.invoiceId), - trim(dataNfe.emitterEmployeeId), - formatIsoDateTime(dataNfe.updatedAt) + trim(dataNfe.storeId || dataNfe.pdv || dataNfe.storeCode || dataNfe.lojaId), + trim(dataNfe.invoiceId || dataNfe.id_venda || dataNfe.id || dataNfe.transferId), + trim(dataNfe.emitterEmployeeId || dataNfe.emitterId || dataNfe.usuarioEmissor), + formatIsoDateTime(dataNfe.updatedAt || dataNfe.modifiedAt || dataNfe.lastUpdate) ]); } catch (e) { addErrorRow(dataset, "Erro ao consultar a NFe: " + e); @@ -187,11 +197,12 @@ function addErrorRow(dataset, message) { function getConstraintValue(constraints, fieldName) { if (!constraints || !fieldName) return ""; + var target = String(fieldName).toLowerCase(); for (var i = 0; i < constraints.length; i++) { var c = constraints[i]; if (!c || !c.fieldName) continue; - if (String(c.fieldName) === String(fieldName)) { + if (String(c.fieldName).toLowerCase() === target) { return c.initialValue; } } @@ -199,7 +210,13 @@ function getConstraintValue(constraints, fieldName) { } function resolveAuth(constraints) { - var token = trim(getConstraintValue(constraints, "token")); + var token = trim(getFirstConstraintValue(constraints, [ + "token", + "accessToken", + "xAccessToken", + "bearerToken", + "access_token" + ])); if (!token) { try { token = trim(java.lang.System.getenv("GINSENG_FISCAL_TOKEN")); @@ -210,8 +227,16 @@ function resolveAuth(constraints) { token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhcGlnaW5zZW5nIiwiZXhwIjoxNzg3NDQ4MDY3fQ.GJqcIJBkMIfp_q_KRzgGuAHWWo93j3FWo3TObKqlAwA"; } - var basicUser = trim(getConstraintValue(constraints, "basicUser")); - var basicPass = trim(getConstraintValue(constraints, "basicPass")); + var basicUser = trim(getFirstConstraintValue(constraints, [ + "basicUser", + "username", + "user" + ])); + var basicPass = trim(getFirstConstraintValue(constraints, [ + "basicPass", + "password", + "pass" + ])); // Fallback operacional para homologacao, conforme credenciais validadas em teste manual. if (!basicUser) basicUser = "fluig"; @@ -224,19 +249,84 @@ function resolveAuth(constraints) { }; } -function invokeAuthorizedGet(clientService, endpoint, auth) { - var authHeader = resolveAuthHeader(auth); - var headers = { "Accept": "application/json" }; - if (authHeader) { - headers.Authorization = authHeader; - if (auth && auth.token) { - headers["x-access-token"] = auth.token; +function getFirstConstraintValue(constraints, names) { + if (!names || !(names instanceof Array)) return ""; + for (var i = 0; i < names.length; i++) { + var val = getConstraintValue(constraints, names[i]); + if (trim(val)) return val; + } + 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 = { companyId: String(getValue("WKCompany") || "1"), - serviceCode: "GinsengAPI2", + serviceCode: "Fastapi", endpoint: endpoint, method: "get", timeoutService: "30000", @@ -284,12 +374,113 @@ function parseApiPayload(bodyText) { } function isApiSuccess(obj) { - if (!obj || !obj.data) return false; + if (!obj) return false; if (obj.success === true) return true; if (String(obj.success).toLowerCase() === "true") return true; + if (obj.data || obj.items || obj.result || obj.content) return true; 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) { var conn = null; var reader = null; @@ -305,10 +496,12 @@ function fetchDirect(url, timeoutMs, auth) { conn.setReadTimeout(timeoutMs || 30000); conn.setRequestProperty("Accept", "application/json"); - var authHeader = resolveAuthHeader(auth); - if (authHeader) { - conn.setRequestProperty("Authorization", authHeader); - if (auth.token) conn.setRequestProperty("x-access-token", auth.token); + var authHeaders = {}; + applyAuthHeaders(authHeaders, auth); + for (var h in authHeaders) { + if (!authHeaders.hasOwnProperty(h)) continue; + if (!authHeaders[h]) continue; + conn.setRequestProperty(h, String(authHeaders[h])); } var status = conn.getResponseCode(); @@ -331,18 +524,30 @@ function fetchDirect(url, timeoutMs, auth) { } } -function resolveAuthHeader(auth) { - auth = auth || {}; - if (auth.basicUser && auth.basicPass) { - var raw = String(auth.basicUser) + ":" + String(auth.basicPass); - var bytes = new java.lang.String(raw).getBytes("UTF-8"); - var encoded = java.util.Base64.getEncoder().encodeToString(bytes); - return "Basic " + String(encoded); +function applyAuthHeaders(headers, authVariant) { + headers = headers || {}; + authVariant = authVariant || {}; + + var authorization = trim(authVariant.authorization); + var xAccessToken = trim(authVariant.xAccessToken); + + if (authorization) { + headers.Authorization = authorization; } - if (auth.token) { - return "Bearer " + String(auth.token); + if (xAccessToken) { + 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) { @@ -354,7 +559,8 @@ function buildNfeItems(items) { out.push({ productId: trim(item.productId), 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) }); } diff --git a/Transferência Ginseng/datasets/ds_rgb_products_v2.js b/Transferência Ginseng/datasets/ds_rgb_products_v2.js index cf0783c..d3bbc87 100644 --- a/Transferência Ginseng/datasets/ds_rgb_products_v2.js +++ b/Transferência Ginseng/datasets/ds_rgb_products_v2.js @@ -32,7 +32,7 @@ function createDataset(fields, constraints, sortFields) { var clientService = fluigAPI.getAuthorizeClientService(); var data = { companyId: String(getValue("WKCompany") || "1"), - serviceCode: "GINSENG APITESTE", + serviceCode: "GinsengAPI2", endpoint: "/dados_rgb_products", method: "get", timeoutService: "60000", diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/.metadata b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/.metadata index 0a702dd..826ba41 100644 Binary files a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/.metadata and b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/.metadata differ diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js index f99f2af..fdcf849 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/events/validateForm.js @@ -39,7 +39,7 @@ function validateForm(form) { } var qtdDivergenciasNfe = parseInt(String(form.getValue("qtdDivergenciasNfe") || "0"), 10); if (!isNaN(qtdDivergenciasNfe) && qtdDivergenciasNfe > 0) { - message += "Existem " + qtdDivergenciasNfe + " divergencia(s) entre a solicitacao e a NFe.
"; + message += "Existem " + qtdDivergenciasNfe + " divergencia(s) entre a base aprovada e a NFe.
"; hasErros = true; } if (form.getValue("usuarioEmissorNfe") == "") { diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js index 535fd70..1adb2af 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/script.js @@ -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 () { // Quando clicar em "Adicionar arquivo" $('#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 @@ -10,10 +36,7 @@ $(document).ready(function () { const file = this.files[0]; if (file) { - $('#nomeArquivoExcel').text('Arquivo selecionado: ' + file.name); - $('#btnAdicionarExcel').hide(); - $('#btnRemoverExcel').show(); - + updateExcelImportUi(file.name); carregarItensDoExcel('excelUpload'); // chama sua função } }); @@ -21,9 +44,17 @@ $(document).ready(function () { // Quando clicar em "Remover arquivo" $('#btnRemoverExcel').on('click', function () { $('#excelUpload').val(''); - $('#nomeArquivoExcel').text('Nenhum arquivo selecionado'); - $('#btnAdicionarExcel').show(); - $('#btnRemoverExcel').hide(); + updateExcelImportUi(""); + getExcelAttachmentField().val(""); + + 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 () { @@ -45,8 +76,28 @@ $(document).ready(function () { 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(); + 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() || ""); @@ -194,11 +245,17 @@ $(document).ready(function () { updateConferenciaNfeVisibility(activity); } + syncQuantidadeAprovadaAllRows(); + toggleQuantidadeAprovadaGestorByActivity(activity); + agendarRefreshTabelaAprovacao(activity); + updateExcelImportUi(getExcelAttachmentField().val()); + formatarMoedasTabela("preco___"); //formatarMoedasTabela("precoIndica___"); formatarMoedasTabela("ValorTotal"); displayBtnFiles(); + invisibleBtnUpload("fnAnexo_PlanilhaItens"); invisibleBtnUpload("fnAnexo_Nfe"); invisibleBtnUpload("fdAnexo_Coleta"); 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) { var current = String(activity || ""); var pills = $("#transferStatus .status-pill"); @@ -331,6 +402,296 @@ function getCurrentDate() { 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( + "" + + "" + rowsFound + "" + + "" + escapeHtml(itemLabel) + "" + + "" + escapeHtml(qtdSolicitadaLabel) + "" + + "" + + "" + + "" + + "" + escapeHtml(status) + "" + + "" + ); + }); + + if (!rowsFound) { + html.push("Sem itens para validação."); + } + + $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() { var escolha = String($("input[name='tipoMotoristaEntrega']:checked").val() || ""); if (!escolha) { @@ -607,6 +968,10 @@ function updateConferenciaNfeVisibility(activity) { } var ATTACHMENT_PLUGIN_CONFIG = { + fnAnexo_PlanilhaItens: { + filename: EXCEL_ATTACHMENT_DESCRIPTION, + accept: ".xlsx,.xls" + }, fnAnexo_Nfe: { filename: "Nota Fiscal", accept: ".pdf,.xml,image/*" @@ -666,6 +1031,10 @@ function initAttachmentPlugins() { } 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; var solicitacao = String($("#WKNumProces").val() || "").trim(); if (!solicitacao) return "Nota Fiscal"; @@ -785,7 +1154,7 @@ function processarConferenciaNfe() { if (req.qty === 0 && nfe.qty > 0) { status = "Somente NFe"; } else if (nfe.qty === 0 && req.qty > 0) { - status = "Somente solicitacao"; + status = "Somente base"; } else if (Math.abs(req.qty - nfe.qty) > 0.00001) { status = "Quantidade divergente"; } @@ -821,20 +1190,21 @@ function parseItensNfeJson() { function buildSolicitacaoMap() { var out = {}; - $("input[name^='quantidadeItem___']").each(function () { - var name = $(this).attr("name") || ""; - var indice = name.split("___")[1]; - if (!indice) return; + $(collectQuantidadeItemFields()).each(function (i) { + var $qtd = $(this); + var $row = $qtd.closest("tr"); + 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; - var productId = String($("#productIdItem___" + indice).val() || "").trim(); - var code = resolveSolicitacaoItemCode(indice, $(this)); - var descricao = String($("#codigoItem___" + indice).val() || "").trim(); + var productId = String(getCampoItem("productIdItem", indice, $row).val() || "").trim(); + var code = resolveSolicitacaoItemCode(indice, $qtd); + var descricao = String(getCampoItem("codigoItem", indice, $row).val() || "").trim(); - var key = resolveConferenciaKey(productId, code, "ROW:" + indice); - var label = productId ? ("PID " + productId) : (code || descricao || ("Linha " + indice)); + var key = resolveConferenciaKey(productId, code, "ROW:" + rowKey); + var label = productId ? ("PID " + productId) : (code || descricao || ("Linha " + rowKey)); if (!out[key]) { out[key] = { qty: 0, label: label }; @@ -844,6 +1214,21 @@ function buildSolicitacaoMap() { 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) { var code = String($("#codigoProdutoItem___" + indice).val() || "").trim(); if (code) return normalizeCodigoComparacao(code); @@ -975,7 +1360,7 @@ function renderTabelaConferencia(rows, totalItens, divergencias, mensagem, tipo) var itemNfe = row.key; var qtdNfe = formatConferenciaNumero(row.nfeQty); - if (row.status === "Somente solicitacao") { + if (row.status === "Somente base") { itemNfe = "-"; qtdNfe = "0"; } else if (row.status === "Somente NFe") { @@ -1018,7 +1403,7 @@ function montarResumoDivergenciasConferencia(limit) { var itemNfe = String($(cols[2]).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 ""; @@ -1138,35 +1523,52 @@ var beforeSendValidate = function (numState, nextState) { } else if ($("#justificativa").val() == "") { $("#justificativa").parent("div").addClass("errorValidate"); 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 { - $("input[id^='quantidadeItem___']").each(function (index, value) { - var linha = $(value).attr("name").split("___")[1]; + $(collectQuantidadeItemFields()).each(function () { + var $qtd = $(this); + var $row = $qtd.closest("tr"); + var linha = getIndiceCampoPaiFilho($qtd); + if (!linha) return; - if ( - $("#descricao___" + linha).val() == "" && - $("#quantidadeItem___" + linha).val() == "" - ) { - remove_row(value); + var $descricao = getCampoItem("descricao", linha, $row); + var descricaoValor = $.trim(String($descricao.val() || "")); + var qtdValor = $.trim(String($qtd.val() || "")); + if (!descricaoValor && !qtdValor) { + var $btnRemove = $row.find("button[onclick*='remove_row']"); + if ($btnRemove.length) { + remove_row($btnRemove.get(0)); + } } }); - $("input[id^='quantidadeItem___']").each(function (index, value) { - var linha = $(value).attr("name").split("___")[1]; + var itensInformados = 0; + $(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() == "") { - $("#descricao___" + linha) - .parent("div") - .addClass("errorValidate"); - throw "Selecione o item " + (index + 1) + "."; - } else if ($("#quantidadeItem___" + linha).val() == "") { - $("#quantidadeItem___" + linha) - .parent("div") - .addClass("errorValidate"); - throw "Preencha a quantidade do item " + (index + 1) + "."; + var descricaoValor = $.trim(String($descricao.val() || "")); + var qtdValor = $.trim(String($qtd.val() || "")); + if (!descricaoValor && !qtdValor) return; + + itensInformados++; + + if (!descricaoValor) { + $descricao.parent("div").addClass("errorValidate"); + throw "Selecione o item " + itensInformados + "."; + } + + 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."; } } @@ -1176,6 +1578,8 @@ var beforeSendValidate = function (numState, nextState) { $("#justificativaDecisaoGestor").parent("div").addClass("errorValidate"); throw "'Justificativa da decisão' é obrigatória para reprovar."; } + } else { + validarQuantidadeAprovadaGestor(); } } else if (numState == 6) { var chaveNfe = normalizeNfeKey($("#chaveNfe").val()); @@ -1199,7 +1603,7 @@ var beforeSendValidate = function (numState, nextState) { var qtdDivergencias = parseInt($("#qtdDivergenciasNfe").val() || "0", 10); if (!isNaN(qtdDivergencias) && qtdDivergencias > 0) { 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) { msg += " Produtos: " + produtos + "."; } @@ -1247,6 +1651,7 @@ var beforeSendValidate = function (numState, nextState) { throw "'Data da entrega' é obrigatória."; } if (String($("#nomerecebedor").val() || "").trim() == "") { + $("#nomerecebedor").parent("div").addClass("errorValidate"); throw "'Nome de quem recebeu a mercadoria' é obrigatório."; } } else if (numState == 18) { @@ -1354,6 +1759,7 @@ function setSelectedZoomItem(selectedItem) { $("#productIdItem" + "___" + indice).val(itemProductId); $("#categoriaItem" + "___" + indice).val(itemCategoria); processarConferenciaNfe(); + toggleQuantidadeAprovadaGestorByActivity($("#activity").val()); } } @@ -1395,7 +1801,9 @@ function removedZoomItem(removedItem) { $("#productIdItem___" + linha[1]).val(""); $("#categoriaItem___" + linha[1]).val(""); $("#quantidadeItem___" + linha[1]).val(""); + $("#quantidadeAprovadaGestor___" + linha[1]).val(""); processarConferenciaNfe(); + toggleQuantidadeAprovadaGestorByActivity($("#activity").val()); } } @@ -1404,13 +1812,17 @@ function removedZoomItem(removedItem) { $("#codigoProdutoItem" + "___" + indice).val(""); $("#productIdItem" + "___" + indice).val(""); $("#categoriaItem" + "___" + indice).val(""); + $("#quantidadeAprovadaGestor" + "___" + indice).val(""); processarConferenciaNfe(); + toggleQuantidadeAprovadaGestorByActivity($("#activity").val()); } } function add_new_row(table) { var row = wdkAddChild(table); updt_line(); + toggleQuantidadeAprovadaGestorByActivity($("#activity").val()); + syncQuantidadeAprovadaAllRows(); } function updt_line() { @@ -1424,6 +1836,7 @@ function remove_row(element) { fnWdkRemoveChild(element); updt_line(); processarConferenciaNfe(); + toggleQuantidadeAprovadaGestorByActivity($("#activity").val()); } @@ -1820,6 +2233,10 @@ function getAllowedAttachmentInputs() { return []; } + if (activity === "0" || activity === "1") { + return ["fnAnexo_PlanilhaItens"]; + } + if (activity === "6") { return ["fnAnexo_Nfe"]; } @@ -1958,18 +2375,22 @@ function hasFileFluig(fileDescription){ //Quando o Fluig finalizar o upload e o anexo for escolhido 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]; + 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 const dt = new DataTransfer(); 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 - $("#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 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 +} diff --git a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html index d9a87af..bafdf34 100644 --- a/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html +++ b/Transferência Ginseng/forms/totvsflow_solicitacao_transferencia/totvsflow_solicitacao_transferencia.html @@ -315,6 +315,10 @@
+
+ + +
@@ -322,7 +326,7 @@

Itens da Transferência

- Colunas esperadas: codigo/codigoItem e quantidade/quantidadeItem. + Colunas esperadas: codigo e quantidade. Coloque a planilha no botão verde com seta para cima.
Nenhum arquivo selecionado +
+ + +
@@ -338,10 +346,10 @@ # - Código do item - Quantidade + Código do item + Quantidade Descrição - Categoria + Categoria @@ -364,6 +372,7 @@ + @@ -393,6 +402,37 @@

Aprovação Filial Emitente

+
+
+
+ Se a quantidade de algum item estiver diferente, preencha a coluna Qtd. aprovada gestor nesta validação. + Campo em branco = mesma quantidade solicitada. Valor 0 = sem estoque. +
+
+
+
+
+ +
+ + + + + + + + + + + + + + + +
#ItemQtd. solicitadaQtd. aprovada gestorStatus
Sem itens para validação.
+
+
+
@@ -432,7 +472,7 @@
- + Campo rastreável para consulta posterior da nota fiscal.
@@ -556,7 +596,7 @@
- +
@@ -565,7 +605,7 @@

Validação do Recebimento

-

Conferência da NFe x Solicitação

+

Conferência da NFe x Base Aprovada

Consulte a chave da NFe para gerar o confronto dos itens.
@@ -573,8 +613,8 @@ - - + + @@ -636,6 +676,7 @@ + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/application.info b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/application.info new file mode 100644 index 0000000..0f74423 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/application.info @@ -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 diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/edit.ftl b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/edit.ftl new file mode 100644 index 0000000..ce2d0ae --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/edit.ftl @@ -0,0 +1,5 @@ +
+ +
+ + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/view.ftl b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/view.ftl new file mode 100644 index 0000000..195c487 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/view.ftl @@ -0,0 +1,97 @@ +
+
+
+
+

Monitor de Transferencias

+

Fonte: dataset transferenciav2

+
+ Atualizando... +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + + +
+
+
+
Total carregado
+
0
+
+
+
+
+
Em transito
+
0
+
+
+
+
+
Aguard. recebimento
+
0
+
+
+
+
+
Em problema
+
0
+
+
+
+
+
Finalizadas
+
0
+
+
+
+ +
+
Funil por etapa
+
+
+ +
+
Detalhes das transferencias
+
+
Item solicitadoQtd. solicitadaItem baseQtd. base Item emitido na NFe Qtd. emitida na NFe Status
+ + + + + + + + + + + + + + + +
ProcessoSolicitanteOrigemDestinoData aberturaAtividade
Carregando dados...
+
+
+
Exibindo 0 de 0
+
+ + Pagina 0 de 0 + +
+
+
+
+
+ diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf.properties b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_en_US.properties b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_en_US.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_en_US.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_es.properties b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_es.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_es.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_pt_BR.properties b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_pt_BR.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/resources/wdtransf_pt_BR.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/WEB-INF/jboss-web.xml b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..b9da1d9 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,5 @@ + + + /wdtransf + false + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/WEB-INF/web.xml b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..6797e41 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + + + 30 + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/css/wdtransf.css b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/css/wdtransf.css new file mode 100644 index 0000000..1513620 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/css/wdtransf.css @@ -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; + } +} diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/images/icon.png b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/images/icon.png new file mode 100644 index 0000000..102160c Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/images/icon.png differ diff --git a/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/js/wdtransf.js b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/js/wdtransf.js new file mode 100644 index 0000000..a22e539 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransf/src/main/webapp/resources/js/wdtransf.js @@ -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 = [""]; + + 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( + "" + ); + } + } + + 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( + "
" + + "" + this.escapeHtml(stage.label) + "" + + "
" + + "
" + + "
" + + "" + this.formatNumber(count) + "" + + "
" + ); + } + + 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("" + this.escapeHtml(emptyMsg) + ""); + 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( + "" + + "" + this.escapeHtml(base.processo) + "" + + "" + this.escapeHtml(base.solicitante) + "" + + "" + this.escapeHtml(base.origem) + "" + + "" + this.escapeHtml(base.destino) + "" + + "" + this.escapeHtml(base.dataAbertura) + "" + + "" + this.escapeHtml(base.atividadeCode) + "" + + "" + ); + } + + 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, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } +}); + + diff --git a/Transferência Ginseng/wcm/widget/wdtransf/target/wdtransf.war b/Transferência Ginseng/wcm/widget/wdtransf/target/wdtransf.war new file mode 100644 index 0000000..4a9e6a5 Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransf/target/wdtransf.war differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/application.info b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/application.info new file mode 100644 index 0000000..731ef14 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/application.info @@ -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 diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/edit.ftl b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/edit.ftl new file mode 100644 index 0000000..8bbc59a --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/edit.ftl @@ -0,0 +1,5 @@ +
+ +
+ + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/view.ftl b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/view.ftl new file mode 100644 index 0000000..9867032 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/view.ftl @@ -0,0 +1,11 @@ +
+
+
+

Transferencias por Analista

+
+
Carregando dados...
+
+
+
+
+ diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista.properties b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_en_US.properties b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_en_US.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_en_US.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_es.properties b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_es.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_es.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_pt_BR.properties b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_pt_BR.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/resources/wdtransfanalista_pt_BR.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/jboss-web.xml b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..0503b47 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,5 @@ + + + /wdtransfanalista + false + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/web.xml b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..6797e41 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + + + 30 + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/css/wdtransfanalista.css b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/css/wdtransfanalista.css new file mode 100644 index 0000000..3bddf18 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/css/wdtransfanalista.css @@ -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; + } +} diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/images/icon.png b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/images/icon.png new file mode 100644 index 0000000..102160c Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/images/icon.png differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/js/wdtransfanalista.js b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/js/wdtransfanalista.js new file mode 100644 index 0000000..bf8b3b9 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfanalista/src/main/webapp/resources/js/wdtransfanalista.js @@ -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("
" + this.escapeHtml(emptyMsg) + "
"); + 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( + "
" + + "
" + this.escapeHtml(this.formatPercent(percentTotal)) + "
" + + "
" + + "
" + + "
" + + "
" + this.escapeHtml(item.name) + "
" + + "
" + ); + } + + var minWidth = Math.max(groups.length * 86, 360); + + html.push( + "
" + + "" + + "Participacao (%)" + + "" + + "
" + + "
" + + "
" + + "100%50%0%" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + bars.join("") + "
" + + "
" + + "
" + + "
" + ); + + 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, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/'/g, "'"); + } +}); + + + + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfanalista/target/wdtransfanalista.war b/Transferência Ginseng/wcm/widget/wdtransfanalista/target/wdtransfanalista.war new file mode 100644 index 0000000..2b3397b Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfanalista/target/wdtransfanalista.war differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/application.info b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/application.info new file mode 100644 index 0000000..22e266b --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/application.info @@ -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 diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/edit.ftl b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/edit.ftl new file mode 100644 index 0000000..7fc0b61 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/edit.ftl @@ -0,0 +1,5 @@ +
+ +
+ + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/view.ftl b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/view.ftl new file mode 100644 index 0000000..61157c2 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/view.ftl @@ -0,0 +1,11 @@ +
+
+
+

Transferencias por Loja

+
+
Carregando dados...
+
+
+
+
+ diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja.properties b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_en_US.properties b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_en_US.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_en_US.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_es.properties b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_es.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_es.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_pt_BR.properties b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_pt_BR.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/resources/wdtransfloja_pt_BR.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/jboss-web.xml b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..2b51b44 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,5 @@ + + + /wdtransfloja + false + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/web.xml b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..6797e41 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + + + 30 + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/css/wdtransfloja.css b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/css/wdtransfloja.css new file mode 100644 index 0000000..3bddf18 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/css/wdtransfloja.css @@ -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; + } +} diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/images/icon.png b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/images/icon.png new file mode 100644 index 0000000..102160c Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/images/icon.png differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/js/wdtransfloja.js b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/js/wdtransfloja.js new file mode 100644 index 0000000..55c3ceb --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfloja/src/main/webapp/resources/js/wdtransfloja.js @@ -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("
" + this.escapeHtml(emptyMsg) + "
"); + 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( + "
" + + "
" + this.escapeHtml(this.formatPercent(percentTotal)) + "
" + + "
" + + "
" + + "
" + + "
" + this.escapeHtml(item.name) + "
" + + "
" + ); + } + + var minWidth = Math.max(groups.length * 86, 360); + + html.push( + "
" + + "" + + "Participacao (%)" + + "" + + "
" + + "
" + + "
" + + "100%50%0%" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + bars.join("") + "
" + + "
" + + "
" + + "
" + ); + + 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, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/'/g, "'"); + } +}); + + + + + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfloja/target/wdtransfloja.war b/Transferência Ginseng/wcm/widget/wdtransfloja/target/wdtransfloja.war new file mode 100644 index 0000000..1de0a6f Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfloja/target/wdtransfloja.war differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/application.info b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/application.info new file mode 100644 index 0000000..0c03559 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/application.info @@ -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 diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/edit.ftl b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/edit.ftl new file mode 100644 index 0000000..4367a53 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/edit.ftl @@ -0,0 +1,5 @@ +
+ +
+ + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/view.ftl b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/view.ftl new file mode 100644 index 0000000..a966b90 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/view.ftl @@ -0,0 +1,11 @@ +
+
+
+

Transferencias por Motorista

+
+
Carregando dados...
+
+
+
+
+ diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista.properties b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_en_US.properties b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_en_US.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_en_US.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_es.properties b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_es.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_es.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_pt_BR.properties b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_pt_BR.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/resources/wdtransfmotorista_pt_BR.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/jboss-web.xml b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..fcc943a --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,5 @@ + + + /wdtransfmotorista + false + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/web.xml b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..6797e41 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + + + 30 + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/css/wdtransfmotorista.css b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/css/wdtransfmotorista.css new file mode 100644 index 0000000..3bddf18 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/css/wdtransfmotorista.css @@ -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; + } +} diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/images/icon.png b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/images/icon.png new file mode 100644 index 0000000..102160c Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/images/icon.png differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/js/wdtransfmotorista.js b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/js/wdtransfmotorista.js new file mode 100644 index 0000000..7cff568 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfmotorista/src/main/webapp/resources/js/wdtransfmotorista.js @@ -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("
" + this.escapeHtml(emptyMsg) + "
"); + 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( + "
" + + "
" + this.escapeHtml(this.formatPercent(percentTotal)) + "
" + + "
" + + "
" + + "
" + + "
" + this.escapeHtml(item.name) + "
" + + "
" + ); + } + + var minWidth = Math.max(groups.length * 86, 360); + + html.push( + "
" + + "" + + "Participacao (%)" + + "" + + "
" + + "
" + + "
" + + "100%50%0%" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + bars.join("") + "
" + + "
" + + "
" + + "
" + ); + + 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, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/'/g, "'"); + } +}); + + + + + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfmotorista/target/wdtransfmotorista.war b/Transferência Ginseng/wcm/widget/wdtransfmotorista/target/wdtransfmotorista.war new file mode 100644 index 0000000..251a191 Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfmotorista/target/wdtransfmotorista.war differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/application.info b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/application.info new file mode 100644 index 0000000..1a11a57 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/application.info @@ -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 diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/edit.ftl b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/edit.ftl new file mode 100644 index 0000000..960b2aa --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/edit.ftl @@ -0,0 +1,5 @@ +
+ +
+ + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/view.ftl b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/view.ftl new file mode 100644 index 0000000..c0538ae --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/view.ftl @@ -0,0 +1,11 @@ +
+
+
+

Transferencias por UF de Origem

+
+
Carregando dados...
+
+
+
+
+ diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg.properties b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_en_US.properties b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_en_US.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_en_US.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_es.properties b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_es.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_es.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_pt_BR.properties b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_pt_BR.properties new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/resources/wdtransfreg_pt_BR.properties @@ -0,0 +1,2 @@ + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/jboss-web.xml b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..3b62310 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/jboss-web.xml @@ -0,0 +1,5 @@ + + + /wdtransfreg + false + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/web.xml b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..6797e41 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + + + 30 + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/css/wdtransfreg.css b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/css/wdtransfreg.css new file mode 100644 index 0000000..3bddf18 --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/css/wdtransfreg.css @@ -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; + } +} diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/images/icon.png b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/images/icon.png new file mode 100644 index 0000000..102160c Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/images/icon.png differ diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/js/wdtransfreg.js b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/js/wdtransfreg.js new file mode 100644 index 0000000..259481a --- /dev/null +++ b/Transferência Ginseng/wcm/widget/wdtransfreg/src/main/webapp/resources/js/wdtransfreg.js @@ -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("
" + this.escapeHtml(emptyMsg) + "
"); + 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( + "
" + + "
" + this.escapeHtml(this.formatPercent(percentTotal)) + "
" + + "
" + + "
" + + "
" + + "
" + this.escapeHtml(item.name) + "
" + + "
" + ); + } + + var minWidth = Math.max(groups.length * 86, 360); + + html.push( + "
" + + "" + + "Participacao (%)" + + "" + + "
" + + "
" + + "
" + + "100%50%0%" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + + "
" + bars.join("") + "
" + + "
" + + "
" + + "
" + ); + + 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, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/'/g, "'"); + } +}); + + + + + + + diff --git a/Transferência Ginseng/wcm/widget/wdtransfreg/target/wdtransfreg.war b/Transferência Ginseng/wcm/widget/wdtransfreg/target/wdtransfreg.war new file mode 100644 index 0000000..0b828d6 Binary files /dev/null and b/Transferência Ginseng/wcm/widget/wdtransfreg/target/wdtransfreg.war differ diff --git a/Transferência Ginseng/workflow/.resources/Producao.ws.cache b/Transferência Ginseng/workflow/.resources/Producao.ws.cache index a749668..a3982db 100644 --- a/Transferência Ginseng/workflow/.resources/Producao.ws.cache +++ b/Transferência Ginseng/workflow/.resources/Producao.ws.cache @@ -1,6 +1,14 @@ + + volume + + + Default + + + mecanismoGrupo @@ -710,6 +718,203 @@ + + camposFormulario, documentoId = 43582 + + + activity + + + categoriaItem + + + centroCusto + + + chaveNfe + + + codigoItem + + + codigoProdutoItem + + + currentUserId + + + currentUsermail + + + currentUserName + + + dataAbertura + + + dataColeta + + + dataEmissaoApiNfe + + + dataEmissaoNfe + + + dataEntradaNfeConsulta + + + dataEntrega + + + dataValidacaoGestor + + + descricao + + + emailSolicitante + + + estabelecimento + + + excelUpload + + + fdAnexo_Coleta + + + fdAnexo_Entrega + + + fdAnexo_recebimento + + + fnAnexo_Nfe + + + formMode + + + fornecedorNfeConsulta + + + gestorEmail + + + gestorEmailE + + + gestorNome + + + gestorNomeE + + + gestor_cc + + + gestor_cce + + + invoiceIdNfeConsulta + + + itensNfeConsulta + + + itensNfeJson + + + justificativa + + + justificativaDecisaoGestor + + + justificativaDecisaoItens + + + lojaNfeConsulta + + + motoristaColetaLogin + + + motoristaColetaNome + + + motoristaEntregaLogin + + + motoristaEntregaNome + + + motoristaEntregaSelecionado + + + nomerecebedor + + + numeroNfeConsulta + + + operacaoNfeConsulta + + + productIdItem + + + qtdDivergenciasNfe + + + quantidadeItem + + + requesterId + + + requesterMail + + + requesterName + + + serieNfeConsulta + + + situacaoNfeConsulta + + + storeIdNfeConsulta + + + tipoMotoristaEntrega + + + ufDestino + + + ufOrigem + + + userValidacaoGestor + + + usuarioEmissorNfe + + + validacaoItens + + + valorNfeConsulta + + + WKNumProces + + + mecanismo @@ -835,5 +1040,543 @@ + + forms + + + + + FLUIGADHOC + + + FLUIGADHOC + + + 3 + + + + + + + FLUIGADHOCPROCESS + + + FLUIGADHOCPROCESS + + + 4 + + + + + + + totvsflow_dataset_tipo_ocorrencia + + + totvsflow_dataset_tipo_ocorrencia + + + 14 + + + + + + + totvsflow_abertura_chamado + + + totvsflow_abertura_chamado + + + 15 + + + + + + + DSFormulariodeAberturadechamado + + + Formulário de Abertura de chamado + + + 20 + + + + + + + Abertura_de_chamados + + + Solicitação de abertura de chamados + + + 21 + + + + + + + DSvistoriadeServico + + + vistoriadeServico + + + 24 + + + + + + + DSFormulariodeReservadesala + + + Formulário de Reserva de sala + + + 34 + + + + + + + totvsflow_dataset_centrocusto + + + totvsflow_dataset_centrocusto + + + 103 + + + + + + + totvsflow_dataset_cadastro_item + + + totvsflow_dataset_cadastro_item + + + 104 + + + + + + + totvsflow_dataset_estabelecimento + + + totvsflow_dataset_estabelecimento + + + 105 + + + + + + + totvsflow_solicitacao_compras + + + totvsflow_solicitacao_compras + + + 165 + + + + + + + aberturadechamado_manutencao + + + aberturadechamado_manutencao + + + 400 + + + + + + + Solicitacao_transferencia + + + Solicitacao_transferencia + + + 590 + + + + + + + recrutamento + + + recrutamento + + + 823 + + + + + + + kit_aniversariantes + + + Aniversariantes + + + 7690 + + + + + + + kit_cardapio + + + Cardápio do Dia + + + 7695 + + + + + + + kit_convenios + + + Convênios + + + 7703 + + + + + + + kit_news + + + Notícias + + + 7709 + + + + + + + compras_digital + + + compras_digital + + + 9305 + + + + + + + dpf_di_formulario_processo_admissao + + + Digte_Public_Form_Di_Formulario_Processo_Admissao_Protheus + + + 9626 + + + + + + + dpf_cadastro_status + + + Digte_Public_Form_Status + + + 9627 + + + + + + + dpf_configuracoes + + + Digte_Public_Form_Configuracoes + + + 9628 + + + + + + + dpf_cadastro_jornada + + + Digte_Public_Form_Jornada + + + 9629 + + + + + + + dpf_tipo_documento + + + Digte_Public_Form_Tipo_Documento + + + 9630 + + + + + + + dpf_dataset + + + Digte_Public_Form_Dataset + + + 9631 + + + + + + + dpf_di_configuracao + + + Digte_Public_Form_Di_Configuracoes + + + 9632 + + + + + + + dpf_di_beneficio + + + Digte_Public_Form_Di_Beneficios + + + 9633 + + + + + + + dpf_di_compl_contrato + + + Digte_Public_Form_Di_Comp_Contrato + + + 9634 + + + + + + + dpf_di_funcao_jornada + + + Digte_Public_Form_Di_Funcao_Jornada + + + 9635 + + + + + + + dpf_dataset_estrutura + + + Digte_Public_Form_Di_Dataset_Estrutura + + + 9636 + + + + + + + dpf_grupo_tipo_contrato + + + Digte_Public_Form_Grupo_Tipo_Contrato + + + 9637 + + + + + + + dpf_tipo_contrato + + + Digte_Public_Form_Tipo_Contrato + + + 9638 + + + + + + + dpf_di_traducao_campo_valor + + + Digte_Public_Form_Di_Traducao_Campo_Valor + + + 9639 + + + + + + + dpf_di_restricoes_cpf + + + Digte_Public_Form_Di_Formulario_Restricao_CPF + + + 9640 + + + + + + + dpf_di_compl_vt + + + Digte_Public_Form_Di_Compl_VT + + + 9641 + + + + + + + dpf_di_traducao_campo + + + Digte_Public_Form_Di_Traducao_Campo + + + 9995 + + + + + + + desligamento + + + desligamento + + + 12959 + + + + + + + checklist + + + checklist + + + 40213 + + + + + + + totvsflow_lancamento_documento + + + totvsflow_lancamento_documento + + + 41254 + + + + + + + transferência + + + transferência + + + 43582 + + + + + diff --git a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml index 538ae9c..3997177 100644 --- a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml +++ b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.ecm30.xml @@ -29,10 +29,10 @@ 1 Transferência Ginseng - 46 + 49 - 590 + 43582 true true false @@ -826,7 +826,7 @@ 1 Transferência Ginseng 1 - 46 + 49 2 hAPI.getCardValue("gestor_cce") != "" @@ -840,7 +840,7 @@ 1 Transferência Ginseng 2 - 46 + 49 2 true @@ -854,7 +854,7 @@ 1 Transferência Ginseng 1 - 46 + 49 46 hAPI.getCardValue("validacaoItens") == "entregue" && hAPI.getCardValue("dataEntradaNfeConsulta") != "" @@ -866,7 +866,7 @@ 1 Transferência Ginseng 2 - 46 + 49 46 true @@ -878,7 +878,7 @@ 1 Transferência Ginseng 1 - 46 + 49 107 hAPI.getCardValue("ufOrigem") == "AL" @@ -892,7 +892,7 @@ 1 Transferência Ginseng 2 - 46 + 49 107 hAPI.getCardValue("ufOrigem") == "BA" @@ -906,7 +906,7 @@ 1 Transferência Ginseng 3 - 46 + 49 107 hAPI.getCardValue("ufOrigem") == "SE" @@ -920,7 +920,7 @@ 1 Transferência Ginseng 4 - 46 + 49 107 hAPI.getCardValue("ufOrigem") == "" @@ -929,6 +929,34 @@ Pool Grupo 0 + + + 1 + Transferência Ginseng + 5 + 49 + 107 + + hAPI.getCardValue("ufOrigem") == "VDC" + 31 + <AssignmentController><Group>motoristaBA</Group></AssignmentController> + Pool Grupo + 0 + + + + 1 + Transferência Ginseng + 6 + 49 + 107 + + hAPI.getCardValue("ufOrigem") == "SE" + 31 + <AssignmentController><Group>motoristaSE</Group></AssignmentController> + Pool Grupo + 0 + @@ -1378,7 +1406,7 @@ function notifyTemplate(templateCode, destinoEmail, requesterId, params, process } 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 companyId = safeTrim(getValue("WKCompany")); if (baseUrl === "") baseUrl = BASE_URL_FALLBACK; @@ -1640,7 +1668,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 49 5 1 @@ -1651,7 +1679,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 49 5 2 @@ -1662,7 +1690,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 49 7 1 @@ -1673,7 +1701,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 49 26 1 @@ -1684,7 +1712,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 49 61 1 @@ -1695,7 +1723,7 @@ function onlyDigits(value) { 1 Transferência Ginseng - 46 + 49 85 1 @@ -1751,6 +1779,24 @@ function onlyDigits(value) { Justificativa 5 + + + 1 + Transferência Ginseng + motoristaColetaNome + + Motorista Coleta + 6 + + + + 1 + Transferência Ginseng + motoristaEntregaNome + + Motorista Entrega + 7 + 1 @@ -1758,7 +1804,7 @@ function onlyDigits(value) { requesterName requesterName - 6 + 8 @@ -1780,7 +1826,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 4 approval title @@ -1790,7 +1836,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 4 approval description @@ -1800,7 +1846,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 4 approval highlight @@ -1810,7 +1856,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 4 approval approve @@ -1820,7 +1866,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 4 approval reject @@ -1830,7 +1876,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 6 approval title @@ -1840,7 +1886,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 6 approval description @@ -1850,7 +1896,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 6 approval highlight @@ -1860,7 +1906,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 6 approval approve @@ -1870,7 +1916,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 6 approval reject @@ -1880,7 +1926,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 24 approval title @@ -1890,7 +1936,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 24 approval description @@ -1900,7 +1946,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 24 approval highlight @@ -1910,7 +1956,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 24 approval approve @@ -1920,7 +1966,7 @@ function onlyDigits(value) { 0 0 Transferência Ginseng - 46 + 49 24 approval reject diff --git a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.png b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.png index 51df293..d5bc181 100644 Binary files a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.png and b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.png differ diff --git a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg index de42702..c285733 100644 --- a/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg +++ b/Transferência Ginseng/workflow/.resources/Solicitação de transferência.processimage.svg @@ -1,2 +1,2 @@ -MotoristaAnalista de suprimentosLogisticaGerente de lojaSolicitação de TransferênciaValidarLojaAprovarTransferênciaEmitir NFEde TransfReceberProdutosVerificarproblemaColetarProdutoValidarprodutoEntregarProdutoConsultarEntradaVerificarproblema delançamentoValidarrotaGestor IdentificadoLoja sem GestorAjuste de transferênciaAprovarConfirmar recebimentoReprovarReprovarCancelarValidar produtosrecebidosFinalizarEntregar produtoEnviar para rota +MotoristaAnalista de suprimentosLogisticaGerente de lojaSolicitação de TransferênciaValidarLojaAprovarTransferênciaEmitir NFEde TransfReceberProdutosVerificarproblemaColetarProdutoValidarprodutoEntregarProdutoConsultarEntradaVerificarproblema delançamentoValidarrotaGestor IdentificadoLoja sem GestorAjuste de transferênciaAprovarConfirmar recebimentoReprovarReprovarCancelarValidar produtosrecebidosFinalizarEntregar produtoEnviar para rota diff --git a/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process b/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process index 1444688..116949b 100644 --- a/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process +++ b/Transferência Ginseng/workflow/diagrams/Solicitação de transferência.process @@ -4405,7 +4405,7 @@ - + @@ -4430,7 +4430,7 @@ - + \ No newline at end of file diff --git a/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js b/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js index 0220c19..9501070 100644 --- a/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js +++ b/Transferência Ginseng/workflow/scripts/Solicitação de transferência.beforeTaskSave.js @@ -126,7 +126,7 @@ function notifyTemplate(templateCode, destinoEmail, requesterId, params, process } 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 companyId = safeTrim(getValue("WKCompany")); if (baseUrl === "") baseUrl = BASE_URL_FALLBACK;