-
+
+
+
+
+
+
+
+
@@ -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 0a702dd8c51b71cedd8d2835ba50b1563b9c1c4b..826ba41f2a3f2e76ec883ac163aa0767387b2c3f 100644
GIT binary patch
delta 73
zcmX@gx`lOv50folNl{{6aawB8;Z=FbnTf@P40R0L3=FI63Q8C_0*dleN|O`wOBncJ
T%2Gk9%8V*N>O>~bV$ucxyX_er
delta 63
zcmdnOdX#m857T6ICV72s1_ma-f)WOffTH}A(&WVa5(dfO{G80>%#uVPFTSKGF|Rl+
RwJ0?&IWw`MU~(suHUMPH6#W1I
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