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.
-
-
-
+
+
+
+
+
+
+
+
@@ -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 @@
UF destino
+
+ Analista solicitante
+
+
@@ -322,7 +326,7 @@
Itens da Transferência
@@ -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 .
+
+
+
+
+
+
Validação de itens e quantidades de saÃda
+
+
+
+
+ #
+ Item
+ Qtd. solicitada
+ Qtd. aprovada gestor
+ Status
+
+
+
+
+ Sem itens para validação.
+
+
+
+
+
+
Nome aprovação filial emitente
@@ -432,7 +472,7 @@
Chave de acesso para consulta
-
+
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 @@
- Item solicitado
- Qtd. solicitada
+ Item base
+ Qtd. base
Item emitido na NFe
Qtd. emitida na NFe
Status
@@ -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 @@
+
+
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 = ["Todas "];
+
+ 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.escapeHtml(code + " - " + this.getActivityLabel(code)) +
+ " "
+ );
+ }
+ }
+
+ 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 @@
+
+
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% " +
+ "
" +
+ "
" +
+ "
"
+ );
+
+ 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 @@
+
+
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% " +
+ "
" +
+ "
" +
+ "
"
+ );
+
+ 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 @@
+
+
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% " +
+ "
" +
+ "
" +
+ "
"
+ );
+
+ 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 @@
+
+
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% " +
+ "
" +
+ "
" +
+ "
"
+ );
+
+ 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 @@
-Motorista Analista de suprimentos Logistica Gerente de loja Solicitação de Transferência Validar Loja Aprovar Transferência Emitir NFE de Transf Receber Produtos Verificar problema Coletar Produto Validar produto Entregar Produto Consultar Entrada Verificar problema de lançamento Validar rota Gestor Identificado Loja sem Gestor Ajuste de transferência Aprovar Confirmar recebimento Reprovar Reprovar Cancelar Validar produtos recebidos Finalizar Entregar produto Enviar para rota
+Motorista Analista de suprimentos Logistica Gerente de loja Solicitação de Transferência Validar Loja Aprovar Transferência Emitir NFE de Transf Receber Produtos Verificar problema Coletar Produto Validar produto Entregar Produto Consultar Entrada Verificar problema de lançamento Validar rota Gestor Identificado Loja sem Gestor Ajuste de transferência Aprovar Confirmar recebimento Reprovar Reprovar Cancelar Validar produtos recebidos Finalizar Entregar produto Enviar 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;