Andrey Cunha b8a84962ce att
2026-03-16 18:24:24 -03:00

268 lines
7.4 KiB
JavaScript

function defineStructure() {
addColumn("Code");
addColumn("Description");
addColumn("codigoDescricao");
addColumn("descricao");
addColumn("sku");
addColumn("id");
addColumn("brand");
addColumn("ncmId");
}
function onSync(lastSyncDate) {}
function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
dataset.addColumn("Code");
dataset.addColumn("Description");
dataset.addColumn("codigoDescricao");
dataset.addColumn("descricao");
dataset.addColumn("sku");
dataset.addColumn("id");
dataset.addColumn("brand");
dataset.addColumn("ncmId");
try {
var filtro = parseConstraints(constraints);
var clientService = fluigAPI.getAuthorizeClientService();
var data = {
companyId: String(getValue("WKCompany") || "1"),
serviceCode: "GINSENG APITESTE",
endpoint: "/dados_rgb_products",
method: "get",
timeoutService: "60000",
params: {}
};
var vo = clientService.invoke(JSON.stringify(data));
var statusHttp = vo ? String(vo.getHttpStatusResult() || "") : "";
var retorno = vo ? String(vo.getResult() || "") : "";
// Fallback: se o servico integrado estiver com endpoint/base incorreto, chama URL direta.
if (statusHttp !== "200" || !retorno) {
var direct = fetchDirect("https://api.grupoginseng.com.br/dados_rgb_products", 60000);
statusHttp = String(direct.status || statusHttp);
retorno = direct.body || retorno;
}
if (!retorno) {
addDiagRow(dataset, "Sem retorno da API (HTTP " + statusHttp + ")");
return dataset;
}
var obj = parseJsonSafe(retorno);
if (!obj) {
addDiagRow(dataset, "Falha no JSON da API (HTTP " + statusHttp + ")");
return dataset;
}
var itens = extractItems(obj);
if (!itens || !itens.length) {
addDiagRow(dataset, "API sem itens (HTTP " + statusHttp + ")");
return dataset;
}
var searchNorm = normalize(filtro.search);
var maxRows = filtro.maxRows;
for (var i = 0; i < itens.length; i++) {
var item = itens[i] || {};
if (item.discontinued === true) {
continue;
}
if (item.purchaseBlocked === true) {
continue;
}
var code = trim(item.sku);
var desc = trim(item.description);
var codigoDescricao = code + " - " + desc;
var brand = trim(item.brand);
var blob = normalize([code, desc, brand, trim(item.id)].join(" "));
if (searchNorm && searchNorm.length >= 2 && blob.indexOf(searchNorm) === -1) {
continue;
}
dataset.addRow([
code,
desc,
codigoDescricao,
desc,
code,
trim(item.id),
brand,
trim(item.ncmId)
]);
if (dataset.rowsCount >= maxRows) {
break;
}
}
if (dataset.rowsCount === 0) {
addDiagRow(dataset, "Sem produtos apos filtros (busca: " + filtro.search + ")");
}
} catch (e) {
addDiagRow(dataset, "Erro ao consultar API: " + e);
}
return dataset;
}
function onMobileSync(user) {}
function parseConstraints(constraints) {
var out = {
search: "",
maxRows: 200
};
if (!constraints) {
return out;
}
for (var i = 0; i < constraints.length; i++) {
var c = constraints[i];
if (!c || !c.fieldName) continue;
var name = String(c.fieldName);
var value = cleanSearchValue(c.initialValue);
if (name === "sqlLimit") {
var n = parseInt(value, 10);
if (!isNaN(n) && n > 0 && n <= 1000) {
out.maxRows = n;
}
continue;
}
if (
value &&
name !== "metadata#id" &&
name !== "metadata#active" &&
name !== "sqlLimit"
) {
if (!out.search || value.length > out.search.length) {
out.search = value;
}
}
}
return out;
}
function cleanSearchValue(v) {
var s = trim(v);
s = s.replace(/[%*_]/g, "");
// Evita que flags comuns do Fluig virem termo de busca
if (s === "true" || s === "false" || s === "on" || s === "off" || s === "1") {
return "";
}
return trim(s);
}
function normalize(v) {
return trim(v).toLowerCase();
}
function trim(v) {
return String(v == null ? "" : v).trim();
}
function parseJsonSafe(text) {
try {
return JSON.parse(text);
} catch (e) {
return null;
}
}
function extractItems(obj) {
if (!obj) return [];
if (obj instanceof Array) return obj;
if (obj.data && obj.data instanceof Array) return obj.data;
if (obj.content) {
if (obj.content instanceof Array) return obj.content;
if (typeof obj.content === "string") {
var parsedContent = parseJsonSafe(obj.content);
if (parsedContent && parsedContent.data && parsedContent.data instanceof Array) {
return parsedContent.data;
}
if (parsedContent && parsedContent instanceof Array) {
return parsedContent;
}
}
if (obj.content.data && obj.content.data instanceof Array) return obj.content.data;
}
if (obj.result) {
if (obj.result instanceof Array) return obj.result;
if (typeof obj.result === "string") {
var parsedResult = parseJsonSafe(obj.result);
if (parsedResult && parsedResult.data && parsedResult.data instanceof Array) {
return parsedResult.data;
}
}
}
return [];
}
function addDiagRow(dataset, msg) {
dataset.addRow([
"DEBUG",
String(msg),
String(msg),
String(msg),
"",
"",
"",
""
]);
}
function fetchDirect(url, timeoutMs) {
var conn = null;
var reader = null;
try {
var URL = java.net.URL;
var HttpURLConnection = java.net.HttpURLConnection;
var InputStreamReader = java.io.InputStreamReader;
var BufferedReader = java.io.BufferedReader;
var StringBuilder = java.lang.StringBuilder;
conn = new URL(url).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(timeoutMs || 30000);
conn.setReadTimeout(timeoutMs || 30000);
conn.setRequestProperty("Accept", "application/json");
var status = conn.getResponseCode();
var stream = (status >= 200 && status < 300) ? conn.getInputStream() : conn.getErrorStream();
if (stream == null) {
return { status: status, body: "" };
}
reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
var sb = new StringBuilder();
var line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return {
status: status,
body: String(sb.toString())
};
} catch (e) {
return { status: 0, body: "" };
} finally {
try { if (reader) reader.close(); } catch (e1) {}
try { if (conn) conn.disconnect(); } catch (e2) {}
}
}