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) {} } }