att
This commit is contained in:
@@ -0,0 +1,267 @@
|
||||
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) {}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user