This commit is contained in:
2026-05-06 16:01:10 -03:00
parent f31f809ce7
commit 4a31410351
26 changed files with 22041 additions and 2083 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+18
View File
@@ -0,0 +1,18 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "totvs_language_debug",
"request": "launch",
"name": "TOTVS Language Debug",
"program": "${command:AskForProgramName}",
"cwb": "${workspaceFolder}",
"smartclientBin": "../totvs/bin/smartclient/smartclient.exe",
"isMultiSession": true,
"enableTableSync": true,
"extendFeatures": {
"charDetails": false
}
}
]
}
+18
View File
@@ -0,0 +1,18 @@
{
"version": "1.0.0",
"configurations": [
{
"id": "6ki8w4m1dpmor606g3n0y6sgduhc",
"name": "Ginseng Produção",
"host": "comerciode188006.fluig.cloudtotvs.com.br",
"ssl": true,
"port": 443,
"username": "andrey.cunha",
"password": "eyJpdiI6IjUyYTgyOGQ0ZGM1ZWI3ZjNhZWRlNTQ1ZWZiNzAwOWQwIiwic2FsdCI6IjYwYTZjODBjY2RiNDk5OWI3YTc0NmY1ZGY1NTgwOGI5IiwidGV4dCI6IjdmYTA2ZGFhODM1MWI2NzRmNTk1ZTEzMzc1NjMxZjQ1In0=",
"userCode": "andrey.cunha",
"confirmExporting": false,
"hasBrowser": false,
"companyId": 1
}
]
}
+4
View File
@@ -0,0 +1,4 @@
{
"totvsLanguageServer.welcomePage": false,
"totvsLanguageServer.editor.linter.includes": "C:\\25-04-14-P12-SMARTCLIENT_BUILD 20.3.2.12_WINDOWS_X64\\include"
}
-61
View File
@@ -1,61 +0,0 @@
function defineStructure() {
addColumn("codigo");
addColumn("descricao");
}
function onSync(lastSyncDate) {}
function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
var dataSource = "/jdbc/Protheus12"; // Nome da conexão cadastrada no Fluig
var ic = new javax.naming.InitialContext();
var ds = ic.lookup(dataSource);
var conn = ds.getConnection();
var stmt = null;
var rs = null;
try {
log.info("Iniciando execução do dataset...");
var sql = "SELECT b1_cod, b1_desc FROM sb1010 WHERE LEFT(b1_cod, 4) IN ('0001','0008', '0002', '0003', '0007', '0006', '0009', '0010', '0011', '0014','0016')";
log.info("Query SQL: " + sql);
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
dataset.addColumn("codigo");
dataset.addColumn("descricao");
var encontrados = {}; // Usando um objeto para evitar duplicação
while (rs.next()) {
var codigo = rs.getString("b1_cod");
var descricao = rs.getString("b1_desc");
if (!encontrados[codigo]) { // Verifica se já foi adicionado
encontrados[codigo] = true; // Marca como processado
log.info("Registro encontrado: " + codigo + " - " + descricao);
dataset.addRow([codigo, descricao]);
}
}
if (Object.keys(encontrados).length === 0) {
log.info("Nenhum registro encontrado para a consulta.");
}
} catch (e) {
log.error("Erro ao executar dataset: " + e.message);
} finally {
try {
if (rs) rs.close();
if (stmt) stmt.close();
if (conn) conn.close();
} catch (e) {
log.error("Erro ao fechar recursos: " + e.message);
}
}
return dataset;
}
function onMobileSync(user) {}
@@ -0,0 +1,345 @@
function defineStructure() {
addColumn("B1_COD");
addColumn("B1_DESC");
addColumn("B1_UM");
addColumn("B1_TIPO");
addColumn("B1_LOCPAD");
addColumn("B1_LOCALIZ");
addColumn("B1_CONTRAT");
addColumn("B1_PICM");
addColumn("B1_IPI");
addColumn("B1_RASTRO");
addColumn("B1_MSBLQL");
addColumn("TOTAL");
addColumn("HORA_CONSULTA");
addColumn("CODIGO_DESCRICAO");
setKey(["B1_COD"]);
addIndex(["B1_COD"]);
addIndex(["B1_DESC"]);
}
function onSync(lastSyncDate) {
var dataset = DatasetBuilder.newDataset();
addDatasetColumns(dataset);
var payload = fetchProdutos();
var produtos = payload.produtos || [];
log.info("[dsComprasProdutos.onSync] lastSyncDate=" + lastSyncDate + ", totalRecebido=" + produtos.length);
for (var i = 0; i < produtos.length; i++) {
var row = mapProdutoToRow(produtos[i], payload.total, payload.horaConsulta);
if (typeof dataset.addOrUpdateRow === "function") {
dataset.addOrUpdateRow(row);
} else {
dataset.addRow(row);
}
}
return dataset;
}
function createDataset(fields, constraints, sorts) {
var dataset = DatasetBuilder.newDataset();
addDatasetColumns(dataset);
var payload = fetchProdutos();
var produtos = payload.produtos || [];
var filtro = parseConstraints(constraints);
var count = 0;
log.info("[dsComprasProdutos.createDataset] totalRecebido=" + produtos.length + ", search=[" + filtro.search + "], maxRows=" + filtro.maxRows);
for (var i = 0; i < produtos.length; i++) {
var item = produtos[i] || {};
if (!matchProduto(item, filtro)) {
continue;
}
dataset.addRow(mapProdutoToRow(item, payload.total, payload.horaConsulta));
count++;
if (filtro.maxRows > 0 && count >= filtro.maxRows) {
break;
}
}
log.info("[dsComprasProdutos.createDataset] totalRetornado=" + count);
return dataset;
}
function onMobileSync(user) {
var sortFields = ["B1_COD"];
var constraints = [];
var fields = [
"B1_COD",
"B1_DESC",
"B1_UM",
"B1_TIPO",
"B1_LOCPAD",
"B1_LOCALIZ",
"B1_CONTRAT",
"B1_PICM",
"B1_IPI",
"B1_RASTRO",
"B1_MSBLQL",
"TOTAL",
"HORA_CONSULTA",
"CODIGO_DESCRICAO"
];
return {
fields: fields,
constraints: constraints,
sortFields: sortFields
};
}
function addDatasetColumns(dataset) {
dataset.addColumn("B1_COD");
dataset.addColumn("B1_DESC");
dataset.addColumn("B1_UM");
dataset.addColumn("B1_TIPO");
dataset.addColumn("B1_LOCPAD");
dataset.addColumn("B1_LOCALIZ");
dataset.addColumn("B1_CONTRAT");
dataset.addColumn("B1_PICM");
dataset.addColumn("B1_IPI");
dataset.addColumn("B1_RASTRO");
dataset.addColumn("B1_MSBLQL");
dataset.addColumn("TOTAL");
dataset.addColumn("HORA_CONSULTA");
dataset.addColumn("CODIGO_DESCRICAO");
}
function mapProdutoToRow(item, total, horaConsulta) {
var codigo = trim(item["B1_COD"]);
var descricao = trim(item["B1_DESC"]);
return [
codigo,
descricao,
trim(item["B1_UM"]),
trim(item["B1_TIPO"]),
trim(item["B1_LOCPAD"]),
trim(item["B1_LOCALIZ"]),
trim(item["B1_CONTRAT"]),
trim(item["B1_PICM"]),
trim(item["B1_IPI"]),
trim(item["B1_RASTRO"]),
trim(item["B1_MSBLQL"]),
trim(total),
trim(horaConsulta),
codigo + " - " + descricao
];
}
function fetchProdutos() {
var response = {
total: "",
horaConsulta: "",
produtos: []
};
try {
var clientService = fluigAPI.getAuthorizeClientService();
var endpoints = [
"/rest/uf_mata010/",
"/rest/uf_mata010",
"https://rest.grupoginseng.com.br/rest/uf_mata010/",
"https://rest.grupoginseng.com.br/rest/uf_mata010",
"/",
""
];
var lastStatus = "";
var lastRetorno = "";
for (var i = 0; i < endpoints.length; i++) {
var endpoint = endpoints[i];
var apiResp = invokePostprod(clientService, endpoint);
var statusHttp = apiResp.status;
var retorno = apiResp.body;
lastStatus = statusHttp;
lastRetorno = retorno;
log.info("[dsComprasProdutos] endpoint=[" + endpoint + "], HTTP status=" + statusHttp);
if (!retorno) {
continue;
}
var obj = parseApiResponseObject(retorno);
if (!obj || !(obj.produtos instanceof Array)) {
continue;
}
response.total = obj.total != null ? String(obj.total) : "";
response.horaConsulta = obj.hora_consulta != null ? String(obj.hora_consulta) : "";
response.produtos = obj.produtos;
log.info("[dsComprasProdutos] endpointOK=[" + endpoint + "], total=" + response.total + ", produtos=" + response.produtos.length + ", hora_consulta=" + response.horaConsulta);
return response;
}
var preview = trim(lastRetorno);
if (preview.length > 220) {
preview = preview.substring(0, 220) + "...";
}
log.error("[dsComprasProdutos] Nenhum endpoint retornou JSON válido. UltimoStatus=" + lastStatus + ", ultimoRetornoPreview=[" + preview + "]");
} catch (e) {
log.error("[dsComprasProdutos] Erro ao consultar API Postprod: " + e);
}
return response;
}
function invokePostprod(clientService, endpoint) {
var data = {
companyId: String(getValue("WKCompany") || "1"),
serviceCode: "Postprod",
endpoint: endpoint,
method: "get",
timeoutService: "60000",
params: {}
};
try {
var vo = clientService.invoke(JSON.stringify(data));
return {
status: vo ? String(vo.getHttpStatusResult() || "") : "",
body: vo ? String(vo.getResult() || "") : ""
};
} catch (e) {
return {
status: "EXCEPTION",
body: String(e)
};
}
}
function parseConstraints(constraints) {
var out = {
codigo: "",
descricao: "",
bloqueado: "",
search: "",
maxRows: 0
};
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 || "").toUpperCase();
var value = trim(c.initialValue);
if (name === "B1_COD" && value) {
out.codigo = cleanSearchValue(value);
continue;
}
if (name === "B1_DESC" && value) {
out.descricao = cleanSearchValue(value);
continue;
}
if (name === "B1_MSBLQL" && value) {
out.bloqueado = cleanSearchValue(value);
continue;
}
if ((name === "SEARCH" || name === "TERMO" || name === "FILTRO") && value) {
out.search = cleanSearchValue(value);
continue;
}
if (name === "SQLLIMIT" || name === "RESULTLIMIT") {
var n = parseInt(value, 10);
if (!isNaN(n) && n > 0) out.maxRows = n;
continue;
}
}
return out;
}
function matchProduto(item, filtro) {
var codigo = trim(item["B1_COD"]);
var descricao = trim(item["B1_DESC"]);
var um = trim(item["B1_UM"]);
var bloqueado = trim(item["B1_MSBLQL"]);
if (filtro.codigo && codigo !== filtro.codigo) {
return false;
}
if (filtro.descricao && normalize(descricao).indexOf(normalize(filtro.descricao)) === -1) {
return false;
}
if (filtro.bloqueado && bloqueado !== filtro.bloqueado) {
return false;
}
if (filtro.search) {
var blob = normalize([codigo, descricao, um, bloqueado].join(" "));
if (blob.indexOf(normalize(filtro.search)) === -1) {
return false;
}
}
return true;
}
function parseJsonSafe(text) {
try {
return JSON.parse(text);
} catch (e) {
return null;
}
}
function parseApiResponseObject(rawText) {
var root = parseJsonSafe(rawText);
if (!root) return null;
if (root.produtos instanceof Array) {
return root;
}
if (typeof root.content === "string") {
var inner = parseJsonSafe(root.content);
if (inner && inner.produtos instanceof Array) {
return inner;
}
}
if (root.content && root.content.produtos instanceof Array) {
return root.content;
}
if (typeof root.result === "string") {
var parsedResult = parseJsonSafe(root.result);
if (parsedResult && parsedResult.produtos instanceof Array) {
return parsedResult;
}
}
return null;
}
function cleanSearchValue(v) {
var s = trim(v);
s = s.replace(/[%*_]/g, "");
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();
}
+202 -108
View File
@@ -1,118 +1,212 @@
function defineStructure() {
}
function onSync(lastSyncDate) {
}
function createDataset(fields, constraints, sortFields) {
var ds = DatasetBuilder.newDataset();
ds.addColumn("codigo");
ds.addColumn("filial");
ds.addColumn("estabelecimento");
ds.addColumn("cep");
ds.addColumn("logradouro");
ds.addColumn("numero");
ds.addColumn("bairro");
ds.addColumn("cidade");
ds.addColumn("estado");
ds.addColumn("cnpj");
var dataset = DatasetBuilder.newDataset();
dataset.addColumn("PDV");
dataset.addColumn("LOJA");
dataset.addColumn("RESPONSAVEL_LOJA");
dataset.addColumn("REGIONAL");
dataset.addColumn("UF");
dataset.addColumn("CIDADE");
dataset.addColumn("STATUS");
dataset.addColumn("CANAL");
dataset.addColumn("ID");
dataset.addColumn("PROTHEUS");
dataset.addColumn("LOGIN_LOJA");
dataset.addColumn("COLLEAGUE_ID");
dataset.addColumn("USER_CREATE");
ds.addRow(new Array("010101","4494", "ESCRITÓRIO MATRIZ","57035-030","RUA DESPORTISTA HUMBERTO GUIMARAES","343","PONTA VERDE","MACEIÓ","AL","08.489.643/0001-52"));
ds.addRow(new Array("010102","3546", "LJ BIG BOMPREÇO GRUTA","57052-000","AVENIDA FERNANDES LIMA","3700","GRUTA DE LOURDES","MACEIÓ","AL","08.489.643/0003-14"));
ds.addRow(new Array("010103","4560", "LJ MACEIÓ SHOPPING TERREO","57031-532","AVENIDA GUSTAVO PAIVA","2900","MANGABEIRAS","MACEIÓ","AL","08.489.643/0004-03"));
ds.addRow(new Array("010104","5699", "LJ MOREIRA LIMA","57020-000","RUA MOREIRA LIMA","93","CENTRO","MACEIÓ","AL","08.489.643/0005-86"));
ds.addRow(new Array("010106","12522", "LJ MACEIÓ SHOPPING EXPANSÃO","57031-530","AVENIDA GUSTAVO PAIVA","2990","MANGABEIRAS","MACEIÓ","AL","08.489.643/0016-39"));
ds.addRow(new Array("010107","12828", "LJ GBARBOSA S.MARIS","57036-550","AV ENG. PAULO BRANDÃO NOGUEIRA","S/N","JATIÚCA","MACEIÓ","AL","08.489.643/0017-10"));
ds.addRow(new Array("010108","12838", "LJ RIO LARGO","57100-000","AV PRES GETULIO VARGAS","148","CENTRO","RIO LARGO","AL","08.489.643/0018-09"));
ds.addRow(new Array("010109","21647", "QUIOSQUE CARAJÁS MANGABEIRAS","57037-901","AV COMENDADOR GUSTAVO PAIVA","S/N","MANGABEIRAS","MACEIÓ","AL","08.489.643/0019-81"));
ds.addRow(new Array("010110","12817", "LJ SHOPPING PÁTIO","57073-470","AV MENINO MARCELO","3800","CIDADE UNIVERSITÁRIA","MACEIÓ","AL","08.489.643/0020-15"));
ds.addRow(new Array("010111","12824", "QUIOSQUE GBARBOSA TABULEIRO","57061-110","AVENIDA MACEIÓ","S/N","TABULEIRO","MACEIÓ","AL","08.489.643/0021-04"));
ds.addRow(new Array("010112","12823", "LJ PONTA VERDE","57035-330","RUA DEPUTADO JOSÉ LAGES","431","PONTA VERDE","MACEIÓ","AL","08.489.643/0022-87"));
ds.addRow(new Array("010113","20858", "QUIOSQUE SUPER GIRO","57010-003","AVENIDA SIQUEIRA CAMPOS","1368","PRADO","MACEIÓ","AL","08.489.643/0023-68"));
ds.addRow(new Array("010114","12820", "LJ ATACADÃO TABULEIRO","57082-160","AV DOUTOR DURVAL DE GOIS MONTEIRO","12650","TABULEIRO","MACEIÓ","AL","08.489.643/0024-49"));
ds.addRow(new Array("010115","12830", "LJ LIVRAMENTO","57020-030","RUA DO LIVRAMENTO","24","CENTRO","MACEIÓ","AL","08.489.643/0025-20"));
ds.addRow(new Array("010117","19103", "LJ UNICOMPRA PONTA VERDE","57035-060","RUA DURVAL GUIMARÃES","S/N","PONTA VERDE","MACEIÓ","AL","08.489.643/0027-91"));
ds.addRow(new Array("010118","12826", "LJ ASSAÍ MANGABEIRAS","57037-532","AV COMENDADOR GUSTAVO PAIVA","3261","MANGABEIRAS","MACEIÓ","AL","08.489.643/0028-72"));
ds.addRow(new Array("010119","12829", "LJ JACINTINHO","57041-000","RUA CLETO CAMPELO","2394","JACINTINHO","MACEIÓ","AL","08.489.643/0029-53"));
ds.addRow(new Array("010120","12818", "LJ GBARBOSA SERRARIA","57046-000","AVENIDA MENINO MARCELO","9730","SERRARIA","MACEIÓ","AL","08.489.643/0030-97"));
ds.addRow(new Array("010121","13427", "LJ SHOPPING CIDADE","57055-000","AVENIDA FERNANDES LIMA","679","FAROL","MACEIÓ","AL","08.489.643/0031-78"));
ds.addRow(new Array("010124","14617", "LJ PARQUE SHOPPING","57038-000","AVENIDA GUSTAVO PAIVA","5945","CRUZ DAS ALMAS",",MACEIÓ","AL","08.489.643/0034-10"));
ds.addRow(new Array("010126","14668", "LJ MIX MATHEUS ANTARES","57038-410","AVENIDA MENINO MARCELO","5300","ANTARES","MACEIÓ","AL","08.489.643/0036-82"));
ds.addRow(new Array("010128","20006", "LJ SÃO SEBASTIÃO","43850-000","PRAÇA DOZE DE OUTUBRO","65","CENTRO","SÃO SEBASTIÃO DO PASSÉ","BA","08.489.643/0038-44"));
ds.addRow(new Array("010130","20009", "LJ CANDEIAS BAIXO","43815-050","AVENIDA ANTONIO PATTERSON","196","TRIÂNGULO","CANDEIAS","BA","08.489.643/0040-69"));
ds.addRow(new Array("010131","20005", "LJ CANDEIAS CIMA","43805-000","RUA 13 DE MAIO","147","CENTRO","CANDEIAS","BA","08.489.643/0041-40"));
ds.addRow(new Array("010132","20056", "LJ SIMÕES FILHO","43700-000","AV LUÍS EDUARDO MAGALHÃES","109","CENTRO","SIMÕES FILHO","BA","08.489.643/0042-20"));
ds.addRow(new Array("010133","20057", "LJ CONCEIÇÃO COITÉ","48730-000","RUA DR AMÂNCIO MOTA","30","CENTRO","CONCEIÃO DO COITÉ","BA","08.489.643/0043-01"));
ds.addRow(new Array("010134","20441", "LJ LAGARTO","49400-000","AVENIDA LEANDRO MACIEL","36","CENTRO","LAGARTO","SE","08.489.643/0044-92"));
ds.addRow(new Array("010135","20968", "HIB ITABAIANINHA","49290-000","PRAÇA OLÍMPIO CAMPOS","154","CENTRO","ITABAIANINHA","SE","08.489.643/0059-79"));
ds.addRow(new Array("010136","20969", "HIB MARECHAL DEODORO","57160-000","RUA DR TAVARES BASTOS","03","CENTRO","MARECHAL DEODORO","AL","08.489.643/0054-64"));
ds.addRow(new Array("010137","20970", "VD SÃO SEBASTIÃO","43850-000","PRAÇA DOZE DE OUTUBRO","116","CENTRO","SÃO SEBASTIÃO DO PASSÉ","BA","08.489.643/0050-30"));
ds.addRow(new Array("010138","20986", "HIB OLINDINA","48470-000","AVENIDA ANTONIO MANGABEIRA","84","CENTRO","OLINDINA","BA","08.489.643/0055-45"));
ds.addRow(new Array("010139","20988", "HIB QUEIMADAS","48860-000","PRAÇA CORONEL FRANCISCO LANTYER","21","CENTRO","QUEIMADAS","BA","08.489.643/0051-11"));
ds.addRow(new Array("010140","20989", "HIB ENTRE RIOS","48180-000","AVENIDA JURACY MAGALHÃES","320","CENTRO","ENTRE RIOS","BA","08.489.643/0056-26"));
ds.addRow(new Array("010141","20991", "HIB CAMPO ALEGRE","57250-000","RUA DO COMÉRCIO","49","CENTRO","CAMPO ALEGRE","AL","08.489.643/0061-93"));
ds.addRow(new Array("010142","20992", "ER CONCEIÇÃO COITÉ","48730-000","RUA DR AMANCIO MOTA","35","CENTRO","CONCEIÇÃO DO COITÉ","BA","08.489.643/0045-73"));
ds.addRow(new Array("010143","20993", "ER CANDEIAS","43815-010","AV ANTONIO PATTERSON","213","TRIANGULO","CANDEIAS","BA","08.489.643/0046-54"));
ds.addRow(new Array("010144","20994", "ER SIMÕES FILHO","43700-000","AV LUÍS EDUARDO MAGALHÃES","109","CENTRO","SIMÕES FILHO","BA","08.489.643/0047-35"));
ds.addRow(new Array("010145","20995", "ER LAGARTO","49400-000","AVENIDA LEANDRO MACIEL","36","CENTRO","LAGARTO","SE","08.489.643/0060-02"));
ds.addRow(new Array("010146","20996", "ER ANTARES","57083-048","AV ANTONIO LISBOA DE AMORIM","220","ANTARES","MACEIÓ","AL","08.489.643/0057-07"));
ds.addRow(new Array("010147","20997", "ER PITANGUINHA","57052-050","AVENIDA FERNANDES LIMA","840","PITANGUINHA","MACEIÓ","AL","08.489.643/0058-98"));
ds.addRow(new Array("010148","20998", "CD TABULEIRO","57073-482","ESTRADA DA CODEAL","770","TABULEIRO","MACEIÓ","AL","08.489.643/0062-74"));
ds.addRow(new Array("010149","20999", "HIB ESPLANADA","48370-000","PRAÇA LADISLAU CAVALCANTE","31","CENTRO","ESPLANADA","BA","08.489.643/0053-83"));
ds.addRow(new Array("010150","21000", "HIB SANTALUZ","48880-000","RUA RIO BRANCO","96","CENTRO","SANTALUZ","BA","08.489.643/0052-00"));
ds.addRow(new Array("010151","21001", "HIB RIO REAL","48330-000","PC SEN ANTONIO CARLOS MAGALHÃES","146","CENTRO","RIO REAL","BA","08.489.643/0049-05"));
ds.addRow(new Array("010152","21007", "TÔ QUE TÔ MACEIÓ CENTRO","57020-220","AVENIDA MOREIRA LIMA","293","CENTRO","MACEIÓ","AL","08.489.643/0048-16"));
ds.addRow(new Array("010153","21068", "LJ ATAKAREJO SIMÕES FILHO","43700-000","AV ENG ELMO SEREJO DE FARIAS","2073","CONJ HAB VIDA NOVA","SIMÕES FILHO","BA","08.489.643/0063-55"));
ds.addRow(new Array("010154","21277", "LJ GBARBOSA SOCORRO","49160-000","AVENIDA 1","13","CONJ JOAO ALVES FILHO","NOSSA SENHORA DO SOCORRO","SE","08.489.643/0065-17"));
ds.addRow(new Array("010155","21278", "ER SOCORRO","49140-000","AVENIDA COLETORA A","597","CONJ MARCOS FREIRE I","NOSSA SENHORA DO SOCORRO","SE","08.489.643/0066-06"));
ds.addRow(new Array("010156","21495", "HIB BARRA DOS COQUEIROS","49140-000","AVENIDA OCEANICA","506","ANTONIO PEDRO","BARRA DOS COQUEIROS","SE","08.489.643/0067-89"));
ds.addRow(new Array("010157","21296", "LJ SHOPPING PRÊMIO SOCORRO","49160-000","AVENIDA COLETORA A","S/N","CONJ MARCOS FREIRE I","NOSSA SENHORA DO SOCRRO","SE","08.489.643/0064-36"));
ds.addRow(new Array("010159","21381", "LJ CAPIM GROSSO","44695-000","AV ACM","121","CENTRO","CAPIM-GROSSO","BA","08.489.643/0069-40"));
ds.addRow(new Array("010160","21383", "ER CAPIM GROSSO","44695-000","AV ACM","121","CENTRO","CAPIM-GROSSO","BA","08.489.643/0070-84"));
ds.addRow(new Array("010161","21375", "HIB IPIRÁ","44600-000","AVENIDA CESÁR CABRAL","15","CENTRO","IPIRÁ","BA","08.489.643/0071-65"));
ds.addRow(new Array("010162","21624", "MIX MATEUS TRAPICHE","57010-000","AVENIDA SIQUEIRA CAMPOS","1295","PRADO","MACEIÓ","AL","08.489.643/0072-46"));
ds.addRow(new Array("010163","22448", "ER CAMPO ALEGRE","57250-000","RUA DO COMÉRCIO","49","CENTRO","CAMPO ALEGRE","AL","08.489.643/0073-27"));
ds.addRow(new Array("010164","23475", "MIX MATEUS TABULEIRO","57082-160","AV DOUTOR DURVAL DE GOIS MONTEIRO","9207","TABULEIRO","MACEIÓ","AL","08.489.643/0074-08"));
ds.addRow(new Array("010165","22541", "ER RIO LARGO","57100-000","RUA JUDITH PAIVA","445","CENTRO","RIO LARGO","AL","08.489.643/0075-99"));
ds.addRow(new Array("010166","AMG", "AMG SERRARIA","57046-000","AVENIDA MENINO MARCELO","S/N","SERRARIA","MACEIÓ","AL","08.489.643/0076-70"));
ds.addRow(new Array("010167","23156", "SHOPPING CENTRO SUL","49400-000","AV CONTORNO BR","3795","SÃO JOSE","LAGARTO","SE","08.489.643/0077-50"));
ds.addRow(new Array("030101","910173", "QDB PARQUE SHOPPING","57038-000","AVENIDA COMENDADOR GUSTAVO PAIVA","5945","CRUZ DAS ALMAS","MACEIÓ","AL","20.318.877/0001-32"));
ds.addRow(new Array("030102","910291", "QDB MACEIO SHOPPING","57037-532","AVENIDA COMENDADOR GUSTAVO PAIVA","2900","MANGABEIRAS","MACEIÓ","AL","20.318.877/0002-13"));
ds.addRow(new Array("070101","23713", "MATRIZ - ZEFERINO CORREIA","45000-520","RUA ZEFERINO CORREIA","17","CENTRO","VITORIA DA CONQUISTA","BA","14.378.160/0001-83"));
ds.addRow(new Array("070102","23711", "HIB LIMA GUERRA","45000-390","AL. LIMA GUERRA","04","CENTRO","VITORIA DA CONQUISTA","BA","14.378.160/0005-07"));
ds.addRow(new Array("070103","23712", "HIB CANDIDO SALES","24157-000","AL. RIO BRANCO","373","CENTRO","CÂNDIDO SALES","BA","14.378.160/0006-98"));
ds.addRow(new Array("070104","23705", "LOJA SHOPPING CONQUISTA SUL","45055-900","AVENIDA JURACY MAGALHAES","3340","FELICIA","VITORIA DA CONQUISTA","BA","14.378.160/0013-17"));
ds.addRow(new Array("070105","23703", " VD BARRA CHOCA","45120-000","AV GETULIO VARGAS","98","CENTRO","CHOCA","BA","14.378.160/0016-60"));
ds.addRow(new Array("070106","23707", "LOJA BRASIL","45051-070","AV ITABUNA","2724","BRASIL","VITORIA DA CONQUISTA","BA","14.378.160/0011-55"));
ds.addRow(new Array("070107","23706", "LOJA ASSAI FELICIA","45055-686","AV ANEL DE CONTORNO","S/N","FELICIA","VITORIA DA CONQUISTA","BA","14.378.160/0012-36"));
ds.addRow(new Array("070108","23709", "LOJA SHOPPING CONQUISTA","45055-900","AV JURACY MAGALHAES","3340","FELICIA","VITORIA DA CONQUISTA","BA","14.378.160/0009-30"));
ds.addRow(new Array("070109","23704", "VD CONDEUBA","46200-000","PC NOSSA SENHORA APARECIDA","08","CENTRO","CONDEÚBA","BA","14.378.160/0015-89"));
ds.addRow(new Array("070110","23703", "LOJA BARRA CHOCA","45120-000","AV GETULIO VARGAS","98","CENTRO","CHOCA","BA","14.378.160/0016-60"));
ds.addRow(new Array("070111","23702", "LOJA PANVICON CENTER","45000-230","AVENIDA LAURO DE FREITAS","142","CENTRO","VITORIA DA CONQUISTA","BA","14.378.160/0017-40"));
ds.addRow(new Array("070112","23701", "LOJA NOVE DE NOVEMBRO","45000-370","PC NOVE DE NOVEMBRO","10","CENTRO","VITORIA DA CONQUISTA","BA","14.378.160/0018-21"));
ds.addRow(new Array("070113","23665", "LOJA UNIVERSIDADE","45031-000","AV OLIVIA FLORES","2500","UNIVERSIDADE","VITORIA DA CONQUISTA","BA","14.378.160/0021-27"));
ds.addRow(new Array("010172","24253", "LOJA IRECÊ CENTRO","44860-051","RUA AUGUSTO NUNES PEREIRA","162","CENTRO","IRECÊ","BA","08.489.643/0095-32"));
ds.addRow(new Array("010171","24254", "LOJA JOÃO DOURADO","44920-000","AVENIDA JOAQUIM AUGUSTO","212D","CENTRO","JOÃO DOURADO","BA","08.489.643/0089-94"));
ds.addRow(new Array("010173","24254", "ER IRECE","44860-169","AVENIDA EDVALDO SANTOS LOPES","438","CENTRO","IRECE","BA","08.489.643/0094-51"));
ds.addRow(new Array("010169","24257", "HIB MIGUEL CALMON","44720-000","PRAÇA LAURO DE FREITAS","180","CENTRO","MIGUEL CALMON","BA","08.489.643/0088-03"));
ds.addRow(new Array("010170","24258", "LOJA ATACADAO IRECE","44868-520","AVENIDA ATACADAO NOVO IRECE","01","NOVO IRECÊ","IRECÊ","BA","08.489.643/0093-70"));
ds.addRow(new Array("010175","24268", "LOJA JACOBINA","44702-342","RUA CORONEL TEIXEIRA","44","CENTRO","JACOBINA","BA","08.489.643/0097-02"));
ds.addRow(new Array("010176","24269", "ER JACOBINA","44702-358","AVENIDA MANOEL NOVAES","178","CENTRO","JACOBINA","BA","08.489.643/0096-13"));
ds.addRow(new Array("010174","24293", "HIB MORRO DO CHAPEU","44850-970","RUA PROJETADA 01","203","CENTRO","MORRO DO CHAPEU","BA","08.489.643/0099-66"));
ds.addRow(new Array("010168","23813", "HIB VALENTE","48890-000","RUA CASTRO ALVES","174","CENTRO","VALENTE","BA","08.489.643/0078-31"));
ds.addRow(new Array("010177","23711", "ER CONQUISTA","45000-390","ALAMEDA LIMA GUERRA","174","CENTRO","VITORIA DA CONQUISTA","BA","08.489.643/0100-34"));
try {
var clientService = fluigAPI.getAuthorizeClientService();
var data = {
companyId: String(getValue("WKCompany") || "1"),
serviceCode: "GINSENG API", // ajuste para o codigo do servico cadastrado no Fluig
endpoint: "/base_pdvs",
method: "get",
timeoutService: "60000",
params: {}
};
var vo = clientService.invoke(JSON.stringify(data));
var statusHttp = vo ? String(vo.getHttpStatusResult() || "") : "";
var retorno = vo ? String(vo.getResult() || "") : "";
if (!retorno) {
dataset.addRow(["", "Sem resposta da API (HTTP " + statusHttp + ")", "", "", "", "", "", "", "", "", "", "", ""]);
return dataset;
}
var objData = JSON.parse(retorno);
var success = !!objData.success;
var itens = objData.data || [];
return ds;
if (!success || !itens.length) {
var msg = trim(objData.message) || trim(objData.error) || "Sem lojas retornadas";
dataset.addRow(["", msg + " (HTTP " + statusHttp + ")", "", "", "", "", "", "", "", "", "", "", ""]);
return dataset;
}
var filtros = parseConstraints(constraints);
var colleagueCache = {};
for (var i = 0; i < itens.length; i++) {
var item = itens[i] || {};
var pdv = trim(item["PDV"]);
var loja = trim(item["PDV DESC"]);
var responsavel = trim(item["GESTAO"]) || trim(item["GESTAO"]);
var regional = trim(item["SUPERVISOR"]) || trim(item["SUPERVISOR"]);
var uf = trim(item["UF"]);
var cidade = trim(item["CIDADE"]);
var status = trim(item["STATUS"]);
var canal = trim(item["CANAL"]);
var id = trim(item["id"]);
var protheus = trim(item["PROTHEUS"] || item["protheus"] || item["Protheus"]);
var loginLoja = pdv ? (pdv + ".ginseng") : "";
var colleagueId = resolveColleagueIdByLogin(loginLoja);
var userCreate = getUserCreateStatus(loginLoja, colleagueCache);
if (filtros.onlyAtivo && status.toUpperCase() !== "ATIVO") {
continue;
}
if (filtros.pdv && pdv !== filtros.pdv) {
continue;
}
if (filtros.loja && normalize(loja).indexOf(normalize(filtros.loja)) === -1) {
continue;
}
if (filtros.termoLivre) {
var blob = normalize([
pdv,
loja,
responsavel,
regional,
uf,
cidade
].join(" "));
if (blob.indexOf(normalize(filtros.termoLivre)) === -1) {
continue;
}
}
dataset.addRow([
pdv,
loja,
responsavel,
regional,
uf,
cidade,
status,
canal,
id,
protheus,
loginLoja,
colleagueId,
userCreate
]);
}
if (dataset.rowsCount === 0) {
dataset.addRow(["", "Sem lojas apos filtros (HTTP " + statusHttp + ")", "", "", "", "", "", "", "", "", "", "", ""]);
}
} catch (e) {
dataset = DatasetBuilder.newDataset();
dataset.addColumn("ERRO");
dataset.addRow([String(e)]);
}
return dataset;
}
function onMobileSync(user) {
}
function parseConstraints(constraints) {
var out = {
pdv: "",
loja: "",
onlyAtivo: false,
termoLivre: ""
};
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 = trim(c.initialValue);
if (name === "PDV" && value) out.pdv = value;
if (name === "LOJA" && value) out.loja = value;
if (name === "onlyAtivo" && value.toLowerCase() === "false") out.onlyAtivo = false;
// Zoom costuma enviar constraints variadas de busca; capturamos termo livre.
if (
value &&
name !== "onlyAtivo" &&
name !== "metadata#id" &&
name !== "metadata#active" &&
name !== "sqlLimit"
) {
var cleaned = cleanSearchValue(value);
if (cleaned && (!out.termoLivre || cleaned.length > out.termoLivre.length)) {
out.termoLivre = cleaned;
}
}
}
return out;
}
function trim(v) {
return String(v == null ? "" : v).trim();
}
function normalize(v) {
return trim(v).toLowerCase();
}
function cleanSearchValue(v) {
var s = trim(v);
// remove curingas comuns de busca do Zoom/like
s = s.replace(/[%*_]/g, "");
return trim(s);
}
function getUserCreateStatus(loginLoja, cache) {
var login = trim(loginLoja);
if (!login) return "NAO";
if (cache.hasOwnProperty(login)) return cache[login];
try {
var cLogin = DatasetFactory.createConstraint("login", login, login, ConstraintType.MUST);
var cActive = DatasetFactory.createConstraint("active", "true", "true", ConstraintType.MUST);
var ds = DatasetFactory.getDataset("colleague", null, [cLogin, cActive], null);
var exists = !!(ds && ds.rowsCount > 0);
// fallback para ambientes onde o identificador esta em colleagueId
if (!exists) {
var cId = DatasetFactory.createConstraint("colleaguePK.colleagueId", login, login, ConstraintType.MUST);
ds = DatasetFactory.getDataset("colleague", null, [cId, cActive], null);
exists = !!(ds && ds.rowsCount > 0);
}
cache[login] = exists ? "OK" : "NAO";
return cache[login];
} catch (e) {
cache[login] = "NAO";
return "NAO";
}
}
function resolveColleagueIdByLogin(loginLoja) {
var login = trim(loginLoja);
if (!login) return "";
try {
var cLogin = DatasetFactory.createConstraint("login", login, login, ConstraintType.MUST);
var cActive = DatasetFactory.createConstraint("active", "true", "true", ConstraintType.MUST);
var ds = DatasetFactory.getDataset("colleague", null, [cLogin, cActive], null);
if (ds && ds.rowsCount > 0) {
return trim(ds.getValue(0, "colleaguePK.colleagueId"));
}
} catch (e) {}
return "";
}
+1 -1
View File
@@ -20,7 +20,7 @@ function createDataset(fields, constraints, sortFields) {
var data = {
companyId: "1",
serviceCode: "Postprod",
endpoint: "/rest/uf_mata010/",
endpoint: "/uf_mata010/",
method: "get",
timeoutService: "60000",
params: {}
@@ -18,7 +18,7 @@ function createDataset(fields, constraints, sortFields) {
}
log.info("Dados recebidos: " + jsonData);
var url = "https://rest.grupoginseng.com.br/rest_teste/uf_mata010";
var url = "https://rest.grupoginseng.com.br/rest/uf_mata010";
var urlObj = new java.net.URL(url);
var httpConn = urlObj.openConnection();
-84
View File
@@ -1,84 +0,0 @@
function onSync(lastSyncDate) {}
function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
// Define as colunas do dataset
dataset.addColumn("CODIGO");
dataset.addColumn("DESCRICAO");
dataset.addColumn("CNPJ");
dataset.addColumn("ENDERECO");
dataset.addColumn("COMPLEMENTO");
dataset.addColumn("BAIRRO");
dataset.addColumn("CIDADE");
dataset.addColumn("ESTADO");
dataset.addColumn("CEP");
dataset.addColumn("CODIGO_MUNICIPIO");
dataset.addColumn("BPCS");
dataset.addColumn("LOJA");
var dataSource = "/jdbc/Tabeladeloja"; // ajuste se necessário
var ic = new javax.naming.InitialContext();
var ds = ic.lookup(dataSource);
var conn = ds.getConnection();
var stmt = null;
var rs = null;
try {
log.info("Iniciando execução do dataset...");
var sql = ""
+ " SELECT "
+ " M0_CODFIL, M0_FILIAL, M0_CGC, M0_ENDENT, M0_COMPENT, "
+ " M0_BAIRENT, M0_CIDENT, M0_ESTENT, M0_CEPENT, M0_CODMUN, M0_TEL_PO "
+ " FROM SYS_COMPANY "
+ " WHERE (M0_CODFIL LIKE '0101%' OR M0_CODFIL LIKE '03%') "
+ " AND D_E_L_E_T_ = ' '";
log.info("Query SQL: " + sql);
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
var vistos = {};
while (rs.next()) {
var codigo = rs.getString("M0_CODFIL");
var descricao = rs.getString("M0_FILIAL");
var cnpj = rs.getString("M0_CGC");
var endereco = rs.getString("M0_ENDENT");
var complemento = rs.getString("M0_COMPENT");
var bairro = rs.getString("M0_BAIRENT");
var cidade = rs.getString("M0_CIDENT");
var estado = rs.getString("M0_ESTENT");
var cep = rs.getString("M0_CEPENT");
var ibge = rs.getString("M0_CODMUN");
var bpcs = rs.getString("M0_TEL_PO");
var loja = (bpcs ? bpcs.trim() : "") + "-" + (descricao ? descricao.trim() : "");
if (!vistos[codigo]) {
vistos[codigo] = true;
dataset.addRow([
codigo, descricao, cnpj, endereco, complemento, bairro,
cidade, estado, cep, ibge, bpcs, loja
]);
}
}
if (Object.keys(vistos).length === 0) {
log.info("Nenhum registro encontrado para a consulta.");
}
} catch (e) {
log.error("Erro ao executar dataset: " + e.message);
} finally {
try { if (rs) rs.close(); } catch (e) { log.error(e.message); }
try { if (stmt) stmt.close(); } catch (e) { log.error(e.message); }
try { if (conn) conn.close(); } catch (e) { log.error(e.message); }
}
return dataset;
}
function onMobileSync(user) {}
-98
View File
@@ -1,98 +0,0 @@
function defineStructure() {
dataset.addColumn("CODIGO");
dataset.addColumn("DESCRICAO");
dataset.addColumn("CNPJ");
dataset.addColumn("ENDERECO");
dataset.addColumn("COMPLEMENTO");
dataset.addColumn("BAIRRO");
dataset.addColumn("CIDADE");
dataset.addColumn("ESTADO");
dataset.addColumn("CEP");
dataset.addColumn("CODIGO_MUNICIPIO");
dataset.addColumn("BPCS");
dataset.addColumn("LOJA");
}
function onSync(lastSyncDate) {}
function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
var dataSource = "/jdbc/Tabeladeloja";
var ic = new javax.naming.InitialContext();
var ds = ic.lookup(dataSource);
var conn = ds.getConnection();
var stmt = null;
var rs = null;
try {
log.info("Iniciando execução do dataset...");
var sql = ""
+ " SELECT "
+ " M0_CODFIL, M0_FILIAL, M0_CGC, M0_ENDENT, M0_COMPENT, "
+ " M0_BAIRENT, M0_CIDENT, M0_ESTENT, M0_CEPENT, M0_CODMUN, M0_TEL_PO "
+ " FROM SYS_COMPANY "
+ " WHERE (M0_CODFIL LIKE '0101%' OR M0_CODFIL LIKE '03%') "
+ " AND D_E_L_E_T_ = ' '";
log.info("Query SQL: " + sql);
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
// As colunas aqui devem ter exatamente os MESMOS nomes do defineStructure:
dataset.addColumn("CODIGO");
dataset.addColumn("DESCRICAO");
dataset.addColumn("CNPJ");
dataset.addColumn("ENDERECO");
dataset.addColumn("COMPLEMENTO");
dataset.addColumn("BAIRRO");
dataset.addColumn("CIDADE");
dataset.addColumn("ESTADO");
dataset.addColumn("CEP");
dataset.addColumn("CODIGO_MUNICIPIO");
dataset.addColumn("BPCS");
dataset.addColumn("LOJA");
var vistos = {};
while (rs.next()) {
var codigo = rs.getString("M0_CODFIL");
var descricao = rs.getString("M0_FILIAL");
var cnpj = rs.getString("M0_CGC");
var endereco = rs.getString("M0_ENDENT");
var complemento = rs.getString("M0_COMPENT");
var bairro = rs.getString("M0_BAIRENT");
var cidade = rs.getString("M0_CIDENT");
var estado = rs.getString("M0_ESTENT");
var cep = rs.getString("M0_CEPENT");
var ibge = rs.getString("M0_CODMUN");
var bpcs = rs.getString("M0_TEL_PO");
var loja = (bpcs ? bpcs.trim() : "") + "-" + (descricao ? descricao.trim() : "");
if (!vistos[codigo]) {
vistos[codigo] = true;
dataset.addRow([
codigo, descricao, cnpj, endereco, complemento, bairro,
cidade, estado, cep, ibge, bpcs, loja
]);
}
}
if (Object.keys(vistos).length === 0) {
log.info("Nenhum registro encontrado para a consulta.");
}
} catch (e) {
log.error("Erro ao executar dataset: " + e.message);
} finally {
try { if (rs) rs.close(); } catch (e) { log.error(e.message); }
try { if (stmt) stmt.close(); } catch (e) { log.error(e.message); }
try { if (conn) conn.close(); } catch (e) { log.error(e.message); }
}
return dataset;
}
function onMobileSync(user) {}
+14 -13
View File
@@ -1,7 +1,6 @@
function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
// Definir colunas que queremos no retorno
dataset.addColumn("C1_FILIAL");
dataset.addColumn("C1_NUM");
dataset.addColumn("C1_ITEM");
@@ -15,6 +14,7 @@ function createDataset(fields, constraints, sortFields) {
dataset.addColumn("C1_CONTA");
dataset.addColumn("C1_SOLICIT");
dataset.addColumn("C1_EMISSAO");
dataset.addColumn("C1_APROV");
dataset.addColumn("C1_COTACAO");
dataset.addColumn("C1_PEDIDO");
dataset.addColumn("C1_ITEMPED");
@@ -23,8 +23,11 @@ function createDataset(fields, constraints, sortFields) {
dataset.addColumn("hora_consulta");
dataset.addColumn("sucesso");
function emptyRow() {
return ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "false"];
}
try {
// 🔎 Captura o número da SC passado como constraint
var numeroSC = null;
if (constraints != null) {
for (var i = 0; i < constraints.length; i++) {
@@ -35,17 +38,16 @@ function createDataset(fields, constraints, sortFields) {
}
if (!numeroSC) {
dataset.addRow(["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Erro: número SC não informado"]);
dataset.addRow(emptyRow());
return dataset;
}
// ⚙️ Monta requisição para o Protheus
var data = {
companyId: "1",
serviceCode: "Postprod", // ajuste conforme seu serviço cadastrado
endpoint: "/rest/uf_mata110/" + numeroSC,
serviceCode: "Postprod",
endpoint: "/UF_MATA110/" + numeroSC,
method: "get",
timeoutService: "10000",
timeoutService: "60000",
headers: {
"Content-Type": "application/json"
}
@@ -58,9 +60,7 @@ function createDataset(fields, constraints, sortFields) {
var result = JSON.parse(response.getResult());
if (result.sucesso && result.solicitacoes && result.solicitacoes.length > 0) {
var sc = result.solicitacoes[0]; // pega a primeira solicitação retornada
// ⚠️ Trata a cotação: ignora valores default
var sc = result.solicitacoes[0];
var cotacao = sc.C1_COTACAO || "";
if (cotacao == "000000" || cotacao == "000001") {
cotacao = "";
@@ -80,6 +80,7 @@ function createDataset(fields, constraints, sortFields) {
sc.C1_CONTA || "",
sc.C1_SOLICIT || "",
sc.C1_EMISSAO || "",
sc.C1_APROV || "",
cotacao,
sc.C1_PEDIDO || "",
sc.C1_ITEMPED || "",
@@ -89,13 +90,13 @@ function createDataset(fields, constraints, sortFields) {
"true"
]);
} else {
dataset.addRow(["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "false"]);
dataset.addRow(emptyRow());
}
} else {
dataset.addRow(["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "false"]);
dataset.addRow(emptyRow());
}
} catch (e) {
dataset.addRow(["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Erro: " + e.message]);
dataset.addRow(emptyRow());
}
return dataset;
@@ -58,27 +58,281 @@
margin-bottom: 24px;
}
.change-weight { font-weight: 400 !important; }
.sc-status-panel {
margin-top: 15px;
padding: 18px;
border: 1px solid #d8e1e8;
border-radius: 12px;
background: #f7fafc;
box-shadow: 0 2px 10px rgba(12, 50, 74, 0.08);
}
.sc-primary-grid,
.sc-secondary-grid {
display: grid;
grid-template-columns: repeat(3, minmax(220px, 1fr));
gap: 12px;
}
.sc-primary-grid {
margin-bottom: 12px;
}
.sc-secondary-grid {
gap: 8px 12px;
}
.sc-info {
background: #fff;
border-radius: 10px;
padding: 12px 14px;
min-height: 72px;
}
.sc-info--primary {
border-left: 4px solid #04506b;
box-shadow: inset 0 0 0 1px #d9e4ec;
}
.sc-info--secondary {
box-shadow: inset 0 0 0 1px #e3ebf2;
opacity: .96;
}
.sc-info--clickable {
cursor: pointer;
transition: box-shadow .2s ease, transform .2s ease;
}
.sc-info--clickable:hover {
transform: translateY(-1px);
box-shadow: inset 0 0 0 1px #c8d9e7, 0 4px 12px rgba(8, 47, 72, 0.1);
}
.sc-label {
font-size: 11px;
color: #4d6073;
letter-spacing: .04em;
text-transform: uppercase;
margin-bottom: 4px;
}
.sc-value {
font-size: 15px;
font-weight: 600;
color: #24313f;
word-break: break-word;
}
.sc-info--primary .sc-value {
font-size: 30px;
line-height: 1.1;
color: #102a43;
font-weight: 700;
letter-spacing: .01em;
}
.sc-hint {
display: block;
margin-top: 6px;
font-size: 11px;
color: #5f7386;
letter-spacing: .02em;
}
.sc-value.badge {
display: inline-flex;
align-items: center;
min-height: 30px;
padding: 6px 12px;
border-radius: 999px;
font-size: 12px;
font-weight: 700;
line-height: 1;
}
.sc-timeline-wrap {
margin-top: 16px;
padding-top: 0;
border-top: 1px solid transparent;
transition: background-color .25s ease, max-height .25s ease, opacity .25s ease, padding-top .25s ease;
max-height: 0;
opacity: 0;
overflow: hidden;
pointer-events: none;
}
.sc-timeline-wrap.is-open {
padding-top: 14px;
border-top-color: #d7e2eb;
max-height: 640px;
opacity: 1;
pointer-events: auto;
}
.sc-timeline-wrap.is-focus {
background: #f2f9ff;
border-radius: 8px;
}
.sc-timeline-title {
margin: 0 0 10px;
color: #12344d;
font-size: 14px;
font-weight: 700;
letter-spacing: .01em;
}
.sc-timeline {
list-style: none;
margin: 0;
padding: 0 0 0 18px;
position: relative;
}
.sc-timeline:before {
content: "";
position: absolute;
left: 5px;
top: 2px;
bottom: 2px;
width: 2px;
background: #c8d8e6;
}
.sc-timeline-item {
position: relative;
padding: 0 0 14px 16px;
}
.sc-timeline-item:last-child {
padding-bottom: 0;
}
.sc-timeline-item:before {
content: "";
position: absolute;
left: -18px;
top: 4px;
width: 10px;
height: 10px;
border-radius: 50%;
background: #92a9bf;
box-shadow: 0 0 0 2px #92a9bf;
border: 2px solid #fff;
}
.sc-timeline-item.done:before {
background: #1ab04a;
box-shadow: 0 0 0 2px #1ab04a;
}
.sc-timeline-item.pending:before {
background: #e6a229;
box-shadow: 0 0 0 2px #e6a229;
}
.sc-timeline-title-row {
display: flex;
align-items: baseline;
gap: 8px;
flex-wrap: wrap;
}
.sc-timeline-event {
color: #18354f;
font-size: 14px;
font-weight: 700;
}
.sc-timeline-time {
color: #6b7f92;
font-size: 12px;
font-weight: 500;
}
.sc-timeline-detail {
margin-top: 3px;
color: #3e556b;
font-size: 13px;
}
#tbCotacao {
table-layout: fixed;
width: 100%;
margin-bottom: 0;
}
#tbCotacao thead th {
background: #eef3f8;
color: #3b4d5f;
font-weight: 700;
}
#tbCotacao tbody tr:nth-child(odd) {
background: #f9fbfd;
}
#tbCotacao tbody td,
#tbCotacao thead th,
#tbCotacao tfoot td {
vertical-align: middle;
}
#tbCotacao th:nth-child(3),
#tbCotacao th:nth-child(4),
#tbCotacao th:nth-child(5),
#tbCotacao td:nth-child(3),
#tbCotacao td:nth-child(4),
#tbCotacao td:nth-child(5) {
text-align: right;
}
#tbCotacao td:nth-child(3) input,
#tbCotacao td:nth-child(4) input,
#tbCotacao td:nth-child(5) input {
text-align: right;
}
#tbCotacao tfoot .sc-total-label {
text-align: right;
font-weight: 700;
background: #edf3f8;
color: #324a60;
}
#tbCotacao tfoot .sc-total-value {
background: #edf3f8;
color: #12344d;
font-size: 15px;
font-weight: 700;
text-align: right;
}
@media (max-width: 992px) {
.sc-primary-grid,
.sc-secondary-grid {
grid-template-columns: repeat(2, minmax(180px, 1fr));
}
}
@media (max-width: 640px) {
.sc-primary-grid,
.sc-secondary-grid {
grid-template-columns: 1fr;
}
.sc-info--primary .sc-value {
font-size: 24px;
}
}
</style>
</head>
<body>
<div class="fluig-style-guide" style="background-color:white;">
<h1 id="rcorners" style="margin:0;">Solicitação de compra</h1>
<ul id="wizard-steps" class="steps m-t-20">
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Solicitação</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Validando necessidade</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Solicitando...</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Dados Adicionais</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Indicar Cotação</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Confirmação Cotação</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Aprovação Ccusto</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Aprovação GERF</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Aprovação CEO</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Receber Produto</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Problema</span></li>
<li class="step-item"><span class="step-bullet"></span><span class="step-label">Fim</span></li>
</ul>
<form name="form" role="form">
<!-- Campos ocultos -->
<input type="hidden" id="WKNumProces" name="WKNumProces">
@@ -115,10 +369,6 @@
<div class="row">
<div class="col-md-12">
<h2><i class="flaticon flaticon-tests-central icon-md" aria-hidden="true"></i>Dados da solicitação</h2>
<button type="button" class="btn btn-info btn-sm" id="btnHistorico"
style="background-color:#04506b; border-color:#04506b;">
<i class="fluigicon fluigicon-eye-open"></i> Ver Histórico
</button>
<h6>Dados referentes aos responsáveis pela abertura e pela solicitação do atual processo.</h6>
</div>
</div>
@@ -154,11 +404,16 @@
<input type="zoom" class="form-control" name="estabelecimento" id="estabelecimento" data-zoom="{
'displayKey':'LOJA',
'placeholder': 'Buscar nome do estabelecimento ou filial',
'datasetId':'dsSysCompan',
'datasetId':'dsFiliais',
'fields':[
{'field':'LOJA','label':'Filial','standard':'true','search':'true'},
{'field':'CNPJ','label':'CNPJ','standard':'true'},
{'field':'ESTADO','label':'ESTADO','standard':'true'}
{'field':'REGIONAL','label':'REGIONAL','standard':'true'},
{'field':'UF','label':'UF','standard':'true'},
{'field':'RESPONSAVEL_LOJA','label':'RESPONSAVEL_LOJA','visible':'false'},
{'field':'PDV','label':'PDV','visible':'false'},
{'field':'PROTHEUS','label':'PROTHEUS','visible':'false'},
{'field':'COLLEAGUE_ID','label':'COLLEAGUE_ID','visible':'false'},
{'field':'LOGIN_LOJA','label':'LOGIN_LOJA','visible':'false'}
]
}">
<p class="help-block" id="estabelecimentoFilial" style="display:none;position:absolute;font-size:12px;">
@@ -166,19 +421,9 @@
</p>
</div>
<div class="form-group col-md-3 col-xs-12 divCentroCusto alertaCampo">
<label for="zoom">Centro de custo <span class="required text-danger"><strong>*</strong></span></label>
<input type="zoom" class="form-control" name="centro_custo" id="centro_custo" data-zoom="{
'displayKey':'centroCusto',
'placeholder': 'Buscar número ou nome do centro de custo',
'datasetId':'ds_centroCusto',
'fields':[
{'field':'codigoCentroCusto','label':'Código','standard':'true','search':'true'},
{'field':'centroCusto','label':'Nome','search':'true'},
{'field':'gestorCentroCusto','label':'gestorCentroCusto','visible':'false'},
{'field':'idGestor','label':'idGestor','visible':'false'},
{'field':'emailGestor','label':'emailGestor','visible':'false'}
]
}">
<label>Gestor da loja <span class="required text-danger"><strong>*</strong></span></label>
<input type="text" class="form-control" name="centro_custo" id="centro_custo"
placeholder="Será preenchido automaticamente ao selecionar a filial" readonly>
<p class="help-block" id="centroCusto" style="display:none;position:absolute;font-size:12px;">
Preenchimento obrigatório
</p>
@@ -364,37 +609,53 @@
</div>
</div>
<div class="card" style="margin-top:15px; border-radius:8px; box-shadow:0 2px 5px rgba(0,0,0,0.1);">
<div class="card-body" style="padding:15px; background-color:#f9f9f9;">
<div class="row">
<div class="col-md-4">
<p><strong>Número:</strong> <span id="numeroSCProtheus_label">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Status:</strong> <span id="statusSCProtheus_label" class="badge bg-secondary">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Solicitante:</strong> <span id="solicitanteSCProtheus_label">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Emissão:</strong> <span id="emissaoSCProtheus_label">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Qtd. Itens:</strong> <span id="qtdItensSCProtheus_label">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Data da aprovação:</strong> <span id="dataCadastroSCProtheus_label">-</span> às <span id="horaCadastroSCProtheus_label">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Status:</strong> <span id="statusSC_label" class="badge bg-secondary">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Cotação:</strong> <span id="cotacaoSC_label">-</span></p>
</div>
<div class="col-md-4">
<p><strong>Pedido:</strong> <span id="pedidoSC_label">-</span></p>
</div>
<div class="sc-status-panel">
<div class="sc-primary-grid">
<div class="sc-info sc-info--primary sc-info--clickable" id="cardNumeroSC" title="Clique para ver a linha do tempo da SC">
<div class="sc-label">Número SC</div>
<div class="sc-value" id="numeroSCProtheus_label">-</div>
<span class="sc-hint" id="cardNumeroSCHint">Clique para ver a linha do tempo</span>
</div>
<div class="sc-info sc-info--primary">
<div class="sc-label">Status Cadastro</div>
<span class="sc-value badge bg-secondary" id="statusSCProtheus_label">-</span>
</div>
<div class="sc-info sc-info--primary">
<div class="sc-label">Andamento</div>
<span class="sc-value badge bg-secondary" id="statusSC_label">-</span>
</div>
</div>
<div class="sc-secondary-grid">
<div class="sc-info sc-info--secondary">
<div class="sc-label">Solicitante</div>
<div class="sc-value" id="solicitanteSCProtheus_label">-</div>
</div>
<div class="sc-info sc-info--secondary">
<div class="sc-label">Emissão</div>
<div class="sc-value" id="emissaoSCProtheus_label">-</div>
</div>
<div class="sc-info sc-info--secondary">
<div class="sc-label">Qtd. Itens</div>
<div class="sc-value" id="qtdItensSCProtheus_label">-</div>
</div>
<div class="sc-info sc-info--secondary">
<div class="sc-label">Data do Cadastro</div>
<div class="sc-value"><span id="dataCadastroSCProtheus_label">-</span> às <span id="horaCadastroSCProtheus_label">-</span></div>
</div>
<div class="sc-info sc-info--secondary">
<div class="sc-label">Cotação</div>
<div class="sc-value" id="cotacaoSC_label">-</div>
</div>
<div class="sc-info sc-info--secondary">
<div class="sc-label">Pedido</div>
<div class="sc-value" id="pedidoSC_label">-</div>
</div>
</div>
<div class="sc-timeline-wrap" id="scTimelineSection">
<h4 class="sc-timeline-title">Linha do tempo da SC</h4>
<ul class="sc-timeline" id="scTimeline"></ul>
</div>
</div>
</div>
@@ -430,6 +691,13 @@
<td><input type="checkbox" name="selecionado" id="selecionado" value="S"></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="4" class="sc-total-label">Total selecionado</td>
<td class="sc-total-value" id="valorTotalCotacaoLabel">R$ 0,00</td>
<td></td>
</tr>
</tfoot>
</table>
</div>
</div>
@@ -46,15 +46,21 @@ function recalcTotal() {
function setSelectedZoomItem(selectedItem) {
if (selectedItem.inputId === "estabelecimento") {
// joga o código da filial (cnpj, etc.)
$("#filialdest").val(selectedItem.CNPJ); // supondo que o dataset dsSysCompany devolva o campo CNPJ
$("#filialest").val(selectedItem.ESTADO); // supondo que o dataset dsSysCompany devolva o campo ESTADO
$("#filialprotheus").val(selectedItem.CODIGO); // supondo que o dataset dsSysCompany devolva o campo CODIGO
}
if (selectedItem.inputId === "centro_custo") {
// joga o código da filial (cnpj, etc.)
$("#gestor_cc").val(selectedItem.idGestor); // supondo que o dataset Centro_custo devolva o campo GestorCentroCusto
$("#codigocentroCusto").val(selectedItem.codigoCentroCusto); // supondo que o dataset Centro_custo devolva o campo GestorCentroCusto
// dsFiliais: guarda dados da filial e define gestor da próxima atividade
var codigoProtheus = String(selectedItem.PROTHEUS || selectedItem.protheus || "").trim();
$("#filialdest").val(selectedItem.LOJA || "");
$("#filialest").val(selectedItem.UF || "");
$("#filialprotheus").val(codigoProtheus);
$("#centro_custo").val(selectedItem.RESPONSAVEL_LOJA || selectedItem.LOJA || "");
$("#codigocentroCusto").val(codigoProtheus);
var gestorLoja = (selectedItem.COLLEAGUE_ID || selectedItem.LOGIN_LOJA || "").trim();
$("#gestor_cc").val(gestorLoja);
if (!codigoProtheus) {
console.warn("Filial selecionada sem campo PROTHEUS no dsFiliais.");
}
}
@@ -62,14 +68,18 @@ function setSelectedZoomItem(selectedItem) {
function removedZoomItem(removedItem) {
if (removedItem.inputId === "estabelecimento") {
// Quando remover a empresa, limpa os campos relacionados
$("#filialDesc").val('');
$("#filialest").val('');
// Quando remover a filial, limpa os campos relacionados
$("#filialdest").val("");
$("#filialest").val("");
$("#filialprotheus").val("");
$("#centro_custo").val("");
$("#codigocentroCusto").val("");
$("#gestor_cc").val("");
}
}
/* ========= Config ========= */
const DATASET_PRODUTOS = "dsProd"; // dataset de produtos
const DATASET_PRODUTOS = "dsComprasProdutos"; // dataset de produtos
let todosProdutos = [];
let paginaAtual = 1;
const itensPorPagina = 10;
@@ -120,7 +130,10 @@ function carregaListaProdutos(filtro) {
// Só chama o dataset se ainda não carregou nada
if (todosProdutos.length === 0) {
let dataset = DatasetFactory.getDataset(DATASET_PRODUTOS, null, null, null);
todosProdutos = dataset && dataset.values ? dataset.values : [];
const values = dataset && dataset.values ? dataset.values : [];
todosProdutos = values
.map(normalizarProduto)
.filter(p => p.codigo && p.descricao);
console.log("Produtos carregados do dataset:", todosProdutos.length);
}
@@ -171,10 +184,10 @@ function renderizaProdutos(filtro) {
</tr>`;
} else {
produtosPagina.forEach(produto => {
const codigo = escapeHTML(produto['codigo']);
const descricao = escapeHTML(produto['descricao']);
const um = escapeHTML(produto['medida'] || '');
const preco = produto['ultimo_preco'] || '0,00';
const codigo = escapeHTML(produto.codigo);
const descricao = escapeHTML(produto.descricao);
const um = escapeHTML(produto.medida || '');
const preco = produto.ultimo_preco || '0,00';
html += `
<tr>
@@ -200,6 +213,15 @@ function renderizaProdutos(filtro) {
renderizaPaginacao(produtosFiltrados.length);
}
function normalizarProduto(row) {
return {
codigo: String(row.B1_COD || row.codigo || "").trim(),
descricao: String(row.B1_DESC || row.descricao || "").trim(),
medida: String(row.B1_UM || row.medida || "").trim(),
ultimo_preco: String(row.B1_UPRC || row.ultimo_preco || "0,00").trim()
};
}
function renderizaPaginacao(totalItens) {
@@ -375,29 +397,325 @@ $(function () {
});
function valorCampo(id) {
return String($("#" + id).val() || "").trim();
}
function setLabel(id, valor) {
var texto = String(valor || "").trim();
$("#" + id).text(texto || "-");
}
function badgeClassByStatus(status) {
var s = String(status || "").toLowerCase();
if (!s) return "badge bg-secondary";
if (s.indexOf("erro") >= 0 || s.indexOf("reprov") >= 0 || s.indexOf("cancel") >= 0) return "badge bg-danger";
if (s.indexOf("sucesso") >= 0 || s.indexOf("aprov") >= 0 || s.indexOf("gerad") >= 0 || s.indexOf("liberad") >= 0) return "badge bg-success";
if (s.indexOf("aguard") >= 0 || s.indexOf("pend") >= 0) return "badge bg-warning";
return "badge bg-info";
}
function setBadge(selector, valor) {
var texto = String(valor || "").trim() || "-";
$(selector)
.text(texto)
.removeClass("bg-secondary bg-success bg-danger bg-warning bg-info")
.addClass(badgeClassByStatus(texto));
}
function normalizarStatusCadastro(statusCadastro, numeroSC) {
var numero = String(numeroSC || "").trim();
var status = String(statusCadastro || "").trim();
var s = status.toLowerCase();
if (!numero) return status;
if (!status) return "SC cadastrada com sucesso";
if (s.indexOf("sucesso") >= 0 || s.indexOf("cadastr") >= 0) return "SC cadastrada com sucesso";
return status;
}
function normalizarAndamento(andamento, cotacao, pedido) {
var atual = String(andamento || "").trim();
if (pedido) return "Pedido gerado";
if (cotacao && (!atual || atual.toLowerCase().indexOf("pedido") < 0)) return "Cotacao gerada";
return atual;
}
function normalizarDataProtheus(data) {
var d = String(data || "").trim();
if (/^\d{8}$/.test(d)) {
return d.substring(6, 8) + "/" + d.substring(4, 6) + "/" + d.substring(0, 4);
}
return d;
}
function limparNumeroDocumento(valor) {
var v = String(valor || "").trim();
if (!v || /^0+$/.test(v)) return "";
return v;
}
function comporDataHora(data, hora) {
var d = String(data || "").trim();
var h = String(hora || "").trim();
if (d && h && h !== "-") return d + " as " + h;
return d || h || "";
}
function montarEventosTimelineSC(dados) {
var eventos = [];
var momentoSolicitacao = comporDataHora(dados.dataCadastro, dados.horaCadastro);
var momentoSC = dados.emissao || momentoSolicitacao;
eventos.push({
classe: (dados.numero || dados.solicitante || momentoSolicitacao) ? "done" : "pending",
titulo: "Solicitacao criada",
momento: momentoSolicitacao,
detalhe: dados.solicitante ? "Solicitante: " + dados.solicitante : ""
});
if (dados.numero) {
eventos.push({
classe: "done",
titulo: "SC " + dados.numero + " cadastrada",
momento: momentoSC,
detalhe: dados.statusCadastro ? "Status: " + dados.statusCadastro : ""
});
} else {
eventos.push({
classe: "pending",
titulo: "Aguardando geracao da SC",
momento: "",
detalhe: "A SC sera exibida assim que for criada no Protheus."
});
}
if (dados.cotacao) {
eventos.push({
classe: "done",
titulo: "Cotacao " + dados.cotacao + " gerada",
momento: "",
detalhe: "Cotacao disponivel para analise."
});
} else {
eventos.push({
classe: "pending",
titulo: "Aguardando cotacao",
momento: "",
detalhe: "Ainda nao existe cotacao vinculada a SC."
});
}
if (dados.pedido) {
eventos.push({
classe: "done",
titulo: "Pedido " + dados.pedido + " gerado",
momento: "",
detalhe: "Compra convertida em pedido."
});
} else {
eventos.push({
classe: "pending",
titulo: "Aguardando pedido",
momento: "",
detalhe: "O pedido sera criado apos a aprovacao final da cotacao."
});
}
return eventos;
}
function renderizarTimelineSC(dados) {
var eventos = montarEventosTimelineSC(dados);
var html = eventos.map(function (evento) {
var titulo = escapeHTML(evento.titulo);
var momento = escapeHTML(evento.momento || "");
var detalhe = escapeHTML(evento.detalhe || "");
var classe = evento.classe === "done" ? "done" : "pending";
return [
'<li class="sc-timeline-item ' + classe + '">',
' <div class="sc-timeline-title-row">',
' <span class="sc-timeline-event">' + titulo + '</span>',
momento ? (' <span class="sc-timeline-time">' + momento + '</span>') : "",
" </div>",
detalhe ? (' <div class="sc-timeline-detail">' + detalhe + "</div>") : "",
"</li>"
].join("");
}).join("");
$("#scTimeline").html(html);
}
function focarTimelineSC() {
var secao = $("#scTimelineSection");
if (!secao.length) return;
secao.addClass("is-focus");
setTimeout(function () {
secao.removeClass("is-focus");
}, 900);
try {
secao.get(0).scrollIntoView({ behavior: "smooth", block: "nearest" });
} catch (e) {
// fallback para navegadores sem smooth scroll
secao.get(0).scrollIntoView();
}
}
function abrirTimelineSC() {
var secao = $("#scTimelineSection");
if (!secao.length) return;
secao.addClass("is-open");
$("#cardNumeroSCHint").text("Clique para ocultar a linha do tempo");
}
function fecharTimelineSC() {
var secao = $("#scTimelineSection");
if (!secao.length) return;
secao.removeClass("is-open is-focus");
$("#cardNumeroSCHint").text("Clique para ver a linha do tempo");
}
function alternarTimelineSC() {
var secao = $("#scTimelineSection");
if (!secao.length) return;
if (secao.hasClass("is-open")) {
fecharTimelineSC();
return;
}
abrirTimelineSC();
focarTimelineSC();
}
function montarStatusAndamento(scRow, cotacao, pedido) {
if (pedido) return "Pedido gerado";
if (cotacao) return "Cotacao gerada";
var statusApi = String(scRow.STATUS || "").trim();
if (statusApi) return statusApi;
var aprov = String(scRow.C1_APROV || "").trim().toUpperCase();
if (aprov === "B") return "Aguardando cotacao";
if (aprov === "L") return "Liberada";
if (aprov === "R") return "Reprovada";
if (aprov) return "Status Protheus: " + aprov;
return "";
}
function preencherResumoSC() {
var numero = valorCampo("numeroSCProtheus");
var statusCadastro = valorCampo("statusSCProtheus");
var solicitante = valorCampo("solicitanteSCProtheus");
var emissao = normalizarDataProtheus(valorCampo("emissaoSCProtheus"));
var qtdItens = valorCampo("qtdItensSCProtheus");
var dataCadastro = normalizarDataProtheus(valorCampo("dataCadastroSCProtheus"));
var horaCadastro = valorCampo("horaCadastroSCProtheus");
var cotacao = limparNumeroDocumento(valorCampo("cotacaoSCProtheus"));
var pedido = limparNumeroDocumento(valorCampo("pedidoSCProtheus"));
var andamento = valorCampo("statusAtendimento");
var statusCadastroPadrao = normalizarStatusCadastro(statusCadastro, numero);
if (!andamento && numero) {
if (pedido) andamento = "Pedido gerado";
else if (cotacao) andamento = "Cotacao gerada";
else andamento = "Em andamento";
}
andamento = normalizarAndamento(andamento, cotacao, pedido);
setLabel("numeroSCProtheus_label", numero);
setLabel("solicitanteSCProtheus_label", solicitante);
setLabel("emissaoSCProtheus_label", emissao);
setLabel("qtdItensSCProtheus_label", qtdItens);
setLabel("dataCadastroSCProtheus_label", dataCadastro);
setLabel("horaCadastroSCProtheus_label", horaCadastro);
setLabel("cotacaoSC_label", cotacao);
setLabel("pedidoSC_label", pedido);
setBadge("#statusSCProtheus_label", statusCadastroPadrao || (numero ? "SC cadastrada com sucesso" : ""));
setBadge("#statusSC_label", andamento);
renderizarTimelineSC({
numero: numero,
statusCadastro: statusCadastroPadrao,
andamento: andamento,
solicitante: solicitante,
emissao: emissao,
dataCadastro: dataCadastro,
horaCadastro: horaCadastro,
cotacao: cotacao,
pedido: pedido
});
}
function consultarAndamentoSC() {
var numero = valorCampo("numeroSCProtheus");
if (!numero || typeof DatasetFactory === "undefined" || typeof ConstraintType === "undefined") {
return;
}
try {
var cNumero = DatasetFactory.createConstraint("numeroSCProtheus", numero, numero, ConstraintType.MUST);
var ds = DatasetFactory.getDataset("ds_consultaSC", null, [cNumero], null);
var row = (ds && ds.values && ds.values.length > 0) ? ds.values[0] : null;
if (!row) return;
if (String(row.sucesso || "").toLowerCase() !== "true") return;
var cotacao = limparNumeroDocumento(row.C1_COTACAO);
var pedido = limparNumeroDocumento(row.C1_PEDIDO);
if (cotacao) $("#cotacaoSCProtheus").val(cotacao);
if (pedido) $("#pedidoSCProtheus").val(pedido);
if (row.C1_SOLICIT) $("#solicitanteSCProtheus").val(String(row.C1_SOLICIT).trim());
if (row.C1_EMISSAO) $("#emissaoSCProtheus").val(normalizarDataProtheus(row.C1_EMISSAO));
var andamento = montarStatusAndamento(row, cotacao, pedido);
if (andamento) $("#statusAtendimento").val(andamento);
preencherResumoSC();
} catch (e) {
console.warn("Nao foi possivel consultar andamento da SC no ds_consultaSC:", e);
}
}
$(document).ready(function () {
// Quando carregar a página, já pinta o status se tiver valor nos inputs
let status = $("#statusSCProtheus").val() || "";
let badgeClass = "badge bg-secondary";
preencherResumoSC();
consultarAndamentoSC();
if (status.toLowerCase().includes("sucesso")) badgeClass = "badge bg-success";
if (status.toLowerCase().includes("erro")) badgeClass = "badge bg-danger";
$("#statusSCProtheus_label")
.text(status || "-")
.removeClass()
.addClass(badgeClass);
$(document).on("click", "#cardNumeroSC", function () {
alternarTimelineSC();
});
});
function parseNumeroCotacao(valor) {
var texto = String(valor || "").trim();
if (!texto) return 0;
if (texto.indexOf(",") >= 0) {
texto = texto.replace(/\./g, "").replace(",", ".");
}
texto = texto.replace(/[^\d.-]/g, "");
return parseFloat(texto) || 0;
}
function recalcularTotalCotacao() {
var soma = 0;
$("input[name^='selecionado___']").each(function() {
var idx = $(this).attr("id").split("___")[1];
var idCampo = String($(this).attr("id") || "");
if (idCampo.indexOf("___") < 0) return;
var idx = idCampo.split("___")[1];
// pega qtd e preço da linha
var qtd = parseFloat($("#qtdc___" + idx).val() || "0");
var preco = parseFloat($("#preco___" + idx).val() || "0");
var qtd = parseNumeroCotacao($("#qtdc___" + idx).val() || "0");
var preco = parseNumeroCotacao($("#preco___" + idx).val() || "0");
// calcula total da linha
var total = qtd * preco;
@@ -413,6 +731,7 @@ function recalcularTotalCotacao() {
// Atualiza o hidden e dispara change pro Fluig gravar
$("#valorTotalCotacao").val(soma.toFixed(2)).trigger("change");
$("#valorTotalCotacaoLabel").text(floatToBRL(soma));
}
// dispara sempre que marcar/desmarcar
$(document).on("change", "input[name^='selecionado___']", function() {
@@ -1,283 +1,55 @@
function displayFields(form, customHTML) {
var activity = getValue('WKNumState');
var userId = getValue('WKUser');
var activity = parseInt(getValue("WKNumState"), 10);
var userId = getValue("WKUser");
var hoje = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date());
form.setShowDisabledFields(true);
form.setHidePrintLink(true);
form.setValue("WKNumProces", getValue('WKNumProces'));
form.setValue("activity", activity);
form.setValue("WKNumProces", getValue("WKNumProces"));
form.setValue("activity", String(activity));
form.setValue("formMode", form.getFormMode());
form.setValue("empresa", getValue("WKCompany"));
var c1 = DatasetFactory.createConstraint("colleagueId", userId, userId, ConstraintType.MUST);
var filter = new Array(c1);
var fields = new Array("colleagueName");
var retorno = DatasetFactory.getDataset("colleague", fields, filter, null);
var nomeUsuario = "";
var emailUsuario = "";
//requester
if (activity == 0) {
form.setValue("usuario_abertura", retorno.getValue(0, "colleagueName"));
form.setValue("requesterMail", retorno.getValue(0, "mail"));
form.setValue("requesterId", userId);
} else {
form.setValue("currentUserName", retorno.getValue(0, "colleagueName"));
form.setValue("currentUsermail", retorno.getValue(0, "mail"));
form.setValue("currentUserId", userId);
try {
var c1 = DatasetFactory.createConstraint("colleagueId", userId, userId, ConstraintType.MUST);
var constraints = [c1];
var fields = ["colleagueName", "mail"];
var dsColleague = DatasetFactory.getDataset("colleague", fields, constraints, null);
if (dsColleague && dsColleague.rowsCount > 0) {
nomeUsuario = dsColleague.getValue(0, "colleagueName") || "";
emailUsuario = dsColleague.getValue(0, "mail") || "";
}
} catch (e) {
log.error("[displayFields] Erro ao consultar colleague: " + e);
}
// ✅ Quando for atividade de aprovação do gestor
if (activity == 121) {
var hoje = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date());
form.setValue("user_validacao_gestor", retorno.getValue(0, "colleagueName"));
form.setValue("currentUserName", nomeUsuario);
form.setValue("currentUsermail", emailUsuario);
form.setValue("currentUserId", userId);
if (activity === 0 || activity === 1) {
form.setValue("requesterId", userId);
if (emailUsuario) {
form.setValue("requesterMail", emailUsuario);
}
if (!form.getValue("usuarioSolicitante") && nomeUsuario) {
form.setValue("usuarioSolicitante", nomeUsuario);
}
if (!form.getValue("emailSolicitante") && emailUsuario) {
form.setValue("emailSolicitante", emailUsuario);
}
}
if (activity === 121) {
if (nomeUsuario) {
form.setValue("user_validacao_gestor", nomeUsuario);
}
form.setValue("data_validacao_gestor", hoje);
}
if (activity == 133) {
var hoje = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date());
form.setValue("gestor_validacao_aprova", retorno.getValue(0, "colleagueName"));
form.setValue("data_validacao_aprova_gestor", hoje);
}
if (activity == 137) {
var hoje = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date());
form.setValue("user_validacao_aprova", retorno.getValue(0, "colleagueName"));
form.setValue("data_validacao_aprova", hoje);
}
if (activity == 147) {
var hoje = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date());
form.setValue("gerf_validacao_aprova", retorno.getValue(0, "colleagueName"));
form.setValue("data_validacao_aprova_gerf", hoje);
}
if (activity == 18) {
var hoje = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date());
form.setValue("userValidacaoItens", retorno.getValue(0, "colleagueName"));
form.setValue("dataValidacaoItens", hoje);
}
// ✅ Injetar dados da SC do Protheus (se já tiverem sido preenchidos no servicetask)
var camposSC = [
"numeroSCProtheus",
"statusSCProtheus",
"solicitanteSCProtheus",
"emissaoSCProtheus",
"qtdItensSCProtheus",
"dataCadastroSCProtheus",
"horaCadastroSCProtheus"
];
camposSC.forEach(function(campo) {
var valor = form.getValue(campo);
if (valor) {
customHTML.append("<script>$('#" + campo + "_label').text('" + valor + "');</script>");
}
});
// cor no status
var status = form.getValue("statusSCProtheus");
if (status) {
var badgeClass = "badge bg-secondary";
if (status.toLowerCase().indexOf("sucesso") >= 0) badgeClass = "badge bg-success";
if (status.toLowerCase().indexOf("erro") >= 0) badgeClass = "badge bg-danger";
customHTML.append("<script>$('#statusSCProtheus_label').removeClass().addClass('" + badgeClass + "').text('" + status + "');</script>");
}
// Consultar informações adicionais da SC no Protheus
var numSC = form.getValue("numeroSCProtheus");
if (numSC) {
try {
var c1 = DatasetFactory.createConstraint("numeroSCProtheus", numSC, numSC, ConstraintType.MUST);
var ds = DatasetFactory.getDataset("ds_consultaSC", null, [c1], null);
if (ds && ds.rowsCount > 0) {
var status = ds.getValue(0, "STATUS") || "";
var cotacao = ds.getValue(0, "C1_COTACAO") || "";
var pedido = ds.getValue(0, "C1_PEDIDO") || "";
// grava nos hidden inputs
form.setValue("statusAtendimento", status);
form.setValue("cotacaoSCProtheus", cotacao);
form.setValue("pedidoSCProtheus", pedido);
// mostra nos cards (HTML)
customHTML.append("<script>$('#statusSC_label').text('" + status + "');</script>");
customHTML.append("<script>$('#cotacaoSC_label').text('" + cotacao + "');</script>");
customHTML.append("<script>$('#pedidoSC_label').text('" + pedido + "');</script>");
}
} catch (e) {
log.error("❌ Erro ao consultar dataset ds_consultaSC: " + e);
}
}
try {
var msgs = [];
var numeroSC = form.getValue("numeroSCProtheus");
var cotacaoSC = form.getValue("cotacaoSCProtheus");
var pedidoSC = form.getValue("pedidoSCProtheus");
if (numeroSC) msgs.push("📌 Gerou SC Protheus nº " + numeroSC);
if (cotacaoSC) msgs.push("📌 SC originou Cotação nº " + cotacaoSC);
if (pedidoSC) msgs.push("📌 Cotação finalizou → Pedido nº " + pedidoSC);
if (msgs.length === 0) {
msgs.push("️ Nenhum dado de integração Protheus encontrado no formulário");
}
// Monta conteúdo HTML do histórico
var htmlHistorico = "<ul class='hist-list'>";
for (var i = 0; i < msgs.length; i++) {
htmlHistorico += "<li class='hist-item'>" + msgs[i] + "</li>";
}
htmlHistorico += "</ul>";
// Script para abrir modal ao clicar no botão
customHTML.append("<script>");
customHTML.append("$('#btnHistorico').off('click').on('click', function(){");
customHTML.append(" var myModal = FLUIGC.modal({");
customHTML.append(" title: 'Histórico do Processo',");
customHTML.append(" content: `" + htmlHistorico + "`,");
customHTML.append(" id: 'modalHistorico',");
customHTML.append(" size: 'large'");
customHTML.append(" });");
customHTML.append("});");
customHTML.append("</script>");
} catch (e) {
log.error("[displayFields] Erro ao montar histórico: " + e);
}
var numCot = form.getValue("cotacaoSCProtheus");
var numSC = form.getValue("numeroSCProtheus"); // pega a SC atual
function formatCurrency(v) {
if (!v || isNaN(v)) return "R$ 0,00";
var num = parseFloat(v).toFixed(2);
return "R$ " + num.replace(".", ",").replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
function formatDate(v) {
if (!v || v.length !== 8) return v || "";
var y = v.substring(0,4);
var m = v.substring(4,6);
var d = v.substring(6,8);
return d + "/" + m + "/" + y;
}
function formatPrazo(v) {
if (!v) return "";
return v + " dias úteis";
}
if (!numCot) {
customHTML.append("<script>");
customHTML.append("$('#cotacaoContainer').html('<p>⚠️ Cotação não informada no formulário.</p>');");
customHTML.append("</script>");
return;
}
var c = DatasetFactory.createConstraint("numCotacao", numCot, numCot, ConstraintType.MUST);
var ds = DatasetFactory.getDataset("dsComprasCotacao", null, [c], null);
var precoFormatado = formatCurrency(preco);
var totalFormatado = formatCurrency(total);
if (ds && ds.rowsCount > 0) {
for (var i = 0; i < ds.rowsCount; i++) {
var item = ds.getValue(i, "C8_ITEM");
var desc = ds.getValue(i, "B1_DESC");
var qtd = ds.getValue(i, "C8_QUANT");
var preco = ds.getValue(i, "C8_PRECO");
var total = ds.getValue(i, "C8_TOTAL");
// adiciona linha na tabela pai-filho
customHTML.append("<script>");
customHTML.append("var idx = wdkAddChild('tbCotacao');");
customHTML.append("$('#item___'+idx).val('" + item + "');");
customHTML.append("$('#produto___'+idx).val('" + desc + "');");
customHTML.append("$('#qtdc___'+idx).val('" + qtd + "');");
customHTML.append("$('#preco___' + idx).val('" + precoFormatado + "');");
customHTML.append("$('#total___' + idx).val('" + totalFormatado + "');");
customHTML.append("</script>");
}
} else {
customHTML.append("<script>$('#tbCotacao tbody').html('<tr><td colspan=6>⏳ Nenhum item encontrado.</td></tr>');</script>");
}
try {
var numPedido = form.getValue("pedidoSCProtheus"); // hidden no formulário
if (!numPedido) {
customHTML.append("<script>");
customHTML.append("$('#espelhoPedido').html('<span class=\"badge bg-warning\">⏳ O pedido ainda não foi criado</span>');");
customHTML.append("</script>");
return;
}
var c = DatasetFactory.createConstraint("numeroPed", numPedido, numPedido, ConstraintType.MUST);
var ds = DatasetFactory.getDataset("dsComprasGateway", null, [c], null);
if (!ds || ds.rowsCount === 0) {
customHTML.append("<script>");
customHTML.append("$('#espelhoPedido').html('<span class=\"badge bg-warning\">⏳ O pedido ainda não foi criado</span>');");
customHTML.append("</script>");
return;
}
var html = "";
for (var i = 0; i < ds.rowsCount; i++) {
var rowNum = ds.getValue(i, "C7_NUM");
var desc = ds.getValue(i, "B1_DESC");
var qtd = ds.getValue(i, "C7_QUANT");
var valor = ds.getValue(i, "C7_TOTAL");
var un = ds.getValue(i, "B1_UM");
var pr = ds.getValue(i, "C7_DATPRF");
html += "<div class='pedido-card'>"
+ " <div class='pedido-header'>Pedido nº " + (rowNum || "-") + "</div>"
+ " <div class='pedido-grid'>"
+ " <div class='pedido-box'><b>Descrição</b><br>" + (desc || "-") + "</div>"
+ " <div class='pedido-box'><b>Quantidade</b><br>" + parseInt(qtd || 0) + " " + (un || "") + "</div>"
+ " <div class='pedido-box'><b>Valor</b><br>" + formatCurrency(valor) + "</div>"
+ " <div class='pedido-box'><b>Data de Entrega</b><br>" + formatDate(pr) + "</div>"
+ " </div>"
+ "</div>";
}
customHTML.append("<script>");
customHTML.append("$('#espelhoPedido').html(" + JSON.stringify(html) + ");");
customHTML.append("</script>");
} catch (e) {
var msg = "❌ Erro displayFields Pedido: " + (e && e.message ? e.message : e);
log.error(msg);
customHTML.append("<script>");
customHTML.append("console.error(" + JSON.stringify(msg) + ");"); // aparece no console do navegador
customHTML.append("$('#espelhoPedido').html('<span class=\"badge bg-danger\">" + msg + "</span>');");
customHTML.append("</script>");
}
// Se estou na atividade do Gestor do CC (ex: 133)
if (activity == 133) {
// Copia a justificativa do solicitante para o campo de exibição
form.setValue("observacoesdosolicitante", form.getValue("observacoes"));
}
// Se estou na atividade do GERF (ex: 147)
if (activity == 147) {
form.setValue("justi_decisao__soli", form.getValue("observacoes")); // solicitante
form.setValue("justi_decisao_gc", form.getValue("justi_decisao_aprova_gestor")); // gestor
}
// Se estou na atividade do CEO (ex: 158)
if (activity == 158) {
form.setValue("justi_decisao_solic", form.getValue("observacoes")); // solicitante
form.setValue("justi_decisaogc", form.getValue("justi_decisao_aprova_gestor")); // gestor
form.setValue("justi_decisao_gerf", form.getValue("justi_decisao_aprova_gerente")); // gerente financeiro
}
}
}
@@ -2,6 +2,12 @@ function validateForm(form){
var msg = "";
var activity = getValue("WKNumState");
if (activity == 0 || activity == 1) {
if (form.getValue("gestor_cc") == "") {
msg += "Não foi possível identificar o gestor da loja selecionada. Selecione a filial novamente.\n";
}
}
// Só valida "Justificativa do Gestor" quando estiver na atividade do gestor (ex.: 5)
if (activity == 121) {
if (form.getValue("justi_decisao_gestor") == "") {
@@ -12,4 +18,4 @@ function validateForm(form){
if (msg != "") {
throw msg;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,10 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_461" class="java.beans.XMLDecoder">
<java version="1.8.0_202" class="java.beans.XMLDecoder">
<object class="java.util.HashMap">
<void method="put">
<string>camposFormulario, documentoId = 2297</string>
<array class="java.lang.String" length="0"/>
</void>
<void method="put">
<string>volume</string>
<array class="java.lang.String" length="1">
@@ -13,81 +9,6 @@
</void>
</array>
</void>
<void method="put">
<string>mecanismoGrupo</string>
<object class="java.util.ArrayList">
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Aprovadores Compras Nvl 3</string>
</void>
<void property="groupId">
<string>AprovadoresComprasNvl3</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Compras Indiretos</string>
</void>
<void property="groupId">
<string>ComprasIndiretos</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Obras e manutenção</string>
</void>
<void property="groupId">
<string>Manutencao</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Motoristas</string>
</void>
<void property="groupId">
<string>Motoristas</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Recrutamento</string>
</void>
<void property="groupId">
<string>Recrutamento</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Requisitantes de Vaga</string>
</void>
<void property="groupId">
<string>Requisitantesdevaga</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Tecnologia e Comunicação</string>
</void>
<void property="groupId">
<string>TIC</string>
</void>
</object>
</void>
</object>
</void>
<void method="put">
<string>expediente</string>
<array class="java.lang.String" length="4">
@@ -107,7 +28,7 @@
</void>
<void method="put">
<string>mecanismo</string>
<array class="[Ljava.lang.Object;" length="10">
<array class="[Ljava.lang.Object;" length="12">
<void index="0">
<array class="java.lang.Object" length="2">
<void index="0">
@@ -129,6 +50,26 @@
</array>
</void>
<void index="2">
<array class="java.lang.Object" length="2">
<void index="0">
<string>dpf_di_emp_filial_filtro</string>
</void>
<void index="1">
<string>dpf_di_emp_filial_filtro</string>
</void>
</array>
</void>
<void index="3">
<array class="java.lang.Object" length="2">
<void index="0">
<string>dpf_di_inicio_diadmissao</string>
</void>
<void index="1">
<string>dpf_di_inicio_diadmissao</string>
</void>
</array>
</void>
<void index="4">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Executor de Atividade</string>
@@ -138,7 +79,7 @@
</void>
</array>
</void>
<void index="3">
<void index="5">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Grupo</string>
@@ -148,7 +89,7 @@
</void>
</array>
</void>
<void index="4">
<void index="6">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Grupos do Colaborador</string>
@@ -158,7 +99,7 @@
</void>
</array>
</void>
<void index="5">
<void index="7">
<array class="java.lang.Object" length="2">
<void index="0">
<string>mecCustomAprov</string>
@@ -168,7 +109,7 @@
</void>
</array>
</void>
<void index="6">
<void index="8">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Papel</string>
@@ -178,7 +119,7 @@
</void>
</array>
</void>
<void index="7">
<void index="9">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição para um Grupo</string>
@@ -188,7 +129,7 @@
</void>
</array>
</void>
<void index="8">
<void index="10">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição para um Papel</string>
@@ -198,7 +139,7 @@
</void>
</array>
</void>
<void index="9">
<void index="11">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Usuário</string>
@@ -210,482 +151,5 @@
</void>
</array>
</void>
<void method="put">
<string>forms</string>
<object class="java.util.LinkedList">
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>FLUIGADHOC</string>
</void>
<void property="documentDescription">
<string>FLUIGADHOC</string>
</void>
<void property="documentId">
<int>3</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>FLUIGADHOCPROCESS</string>
</void>
<void property="documentDescription">
<string>FLUIGADHOCPROCESS</string>
</void>
<void property="documentId">
<int>4</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_tipo_ocorrencia</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_tipo_ocorrencia</string>
</void>
<void property="documentId">
<int>14</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_abertura_chamado</string>
</void>
<void property="documentDescription">
<string>totvsflow_abertura_chamado</string>
</void>
<void property="documentId">
<int>15</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSFormulariodeAberturadechamado</string>
</void>
<void property="documentDescription">
<string>Formulário de Abertura de chamado</string>
</void>
<void property="documentId">
<int>20</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>Abertura_de_chamados</string>
</void>
<void property="documentDescription">
<string>Solicitação de abertura de chamados</string>
</void>
<void property="documentId">
<int>21</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSvistoriadeServico</string>
</void>
<void property="documentDescription">
<string>vistoriadeServico</string>
</void>
<void property="documentId">
<int>24</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSFormulariodeReservadesala</string>
</void>
<void property="documentDescription">
<string>Formulário de Reserva de sala</string>
</void>
<void property="documentId">
<int>34</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_centrocusto</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_centrocusto</string>
</void>
<void property="documentId">
<int>103</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_cadastro_item</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_cadastro_item</string>
</void>
<void property="documentId">
<int>104</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_estabelecimento</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_estabelecimento</string>
</void>
<void property="documentId">
<int>105</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_solicitacao_compras</string>
</void>
<void property="documentDescription">
<string>totvsflow_solicitacao_compras</string>
</void>
<void property="documentId">
<int>165</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>aberturadechamado_manutencao</string>
</void>
<void property="documentDescription">
<string>aberturadechamado_manutencao</string>
</void>
<void property="documentId">
<int>400</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>Solicitacao_transferencia</string>
</void>
<void property="documentDescription">
<string>Solicitacao_transferencia</string>
</void>
<void property="documentId">
<int>590</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>recrutamento</string>
</void>
<void property="documentDescription">
<string>recrutamento</string>
</void>
<void property="documentId">
<int>823</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_aniversariantes</string>
</void>
<void property="documentDescription">
<string>Aniversariantes</string>
</void>
<void property="documentId">
<int>7690</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_cardapio</string>
</void>
<void property="documentDescription">
<string>Cardápio do Dia</string>
</void>
<void property="documentId">
<int>7695</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_convenios</string>
</void>
<void property="documentDescription">
<string>Convênios</string>
</void>
<void property="documentId">
<int>7703</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_news</string>
</void>
<void property="documentDescription">
<string>Notícias</string>
</void>
<void property="documentId">
<int>7709</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>compras_digital</string>
</void>
<void property="documentDescription">
<string>compras_digital</string>
</void>
<void property="documentId">
<int>9305</int>
</void>
</object>
</void>
</object>
</void>
<void method="put">
<string>camposFormulario, documentoId = 9305</string>
<array class="java.lang.String" length="69">
<void index="0">
<string>activity</string>
</void>
<void index="1">
<string>centro_custo</string>
</void>
<void index="2">
<string>ceo_validacao_aprova</string>
</void>
<void index="3">
<string>codigocentroCusto</string>
</void>
<void index="4">
<string>Codproduto</string>
</void>
<void index="5">
<string>cotacaoSCProtheus</string>
</void>
<void index="6">
<string>currentUserId</string>
</void>
<void index="7">
<string>currentUsermail</string>
</void>
<void index="8">
<string>currentUserName</string>
</void>
<void index="9">
<string>dataCadastroSCProtheus</string>
</void>
<void index="10">
<string>dataNec</string>
</void>
<void index="11">
<string>dataValidacaoItens</string>
</void>
<void index="12">
<string>data_validacao_aprova</string>
</void>
<void index="13">
<string>data_validacao_aprova_ceo</string>
</void>
<void index="14">
<string>data_validacao_aprova_gerf</string>
</void>
<void index="15">
<string>data_validacao_aprova_gestor</string>
</void>
<void index="16">
<string>data_validacao_gestor</string>
</void>
<void index="17">
<string>descProduto</string>
</void>
<void index="18">
<string>emailSolicitante</string>
</void>
<void index="19">
<string>emissaoSCProtheus</string>
</void>
<void index="20">
<string>empresa</string>
</void>
<void index="21">
<string>estabelecimento</string>
</void>
<void index="22">
<string>fdComprovante</string>
</void>
<void index="23">
<string>filialdest</string>
</void>
<void index="24">
<string>filialest</string>
</void>
<void index="25">
<string>filialprotheus</string>
</void>
<void index="26">
<string>fnComprovante</string>
</void>
<void index="27">
<string>formMode</string>
</void>
<void index="28">
<string>gerf_validacao_aprova</string>
</void>
<void index="29">
<string>gestor_cc</string>
</void>
<void index="30">
<string>gestor_validacao_aprova</string>
</void>
<void index="31">
<string>horaCadastroSCProtheus</string>
</void>
<void index="32">
<string>item</string>
</void>
<void index="33">
<string>justificativaDecisaoItens</string>
</void>
<void index="34">
<string>justificativaValidaProblema</string>
</void>
<void index="35">
<string>justi_decisao_aprova</string>
</void>
<void index="36">
<string>justi_decisao_aprova_ceo</string>
</void>
<void index="37">
<string>justi_decisao_aprova_gerente</string>
</void>
<void index="38">
<string>justi_decisao_aprova_gestor</string>
</void>
<void index="39">
<string>justi_decisao_gestor</string>
</void>
<void index="40">
<string>moreInfo</string>
</void>
<void index="41">
<string>numeroSCProtheus</string>
</void>
<void index="42">
<string>observacoes</string>
</void>
<void index="43">
<string>pedidoSCProtheus</string>
</void>
<void index="44">
<string>preco</string>
</void>
<void index="45">
<string>produto</string>
</void>
<void index="46">
<string>produtoCod</string>
</void>
<void index="47">
<string>produtoDesc</string>
</void>
<void index="48">
<string>produtoLink</string>
</void>
<void index="49">
<string>qtd</string>
</void>
<void index="50">
<string>qtdc</string>
</void>
<void index="51">
<string>qtdItensSCProtheus</string>
</void>
<void index="52">
<string>quantidade</string>
</void>
<void index="53">
<string>requesterId</string>
</void>
<void index="54">
<string>requesterMail</string>
</void>
<void index="55">
<string>selecionado</string>
</void>
<void index="56">
<string>solicitanteSCProtheus</string>
</void>
<void index="57">
<string>statusAtendimento</string>
</void>
<void index="58">
<string>statusSCProtheus</string>
</void>
<void index="59">
<string>tipoSolicitacao</string>
</void>
<void index="60">
<string>total</string>
</void>
<void index="61">
<string>urgencia</string>
</void>
<void index="62">
<string>userValidacaoItens</string>
</void>
<void index="63">
<string>user_validacao_aprova</string>
</void>
<void index="64">
<string>user_validacao_gestor</string>
</void>
<void index="65">
<string>usuarioSolicitante</string>
</void>
<void index="66">
<string>validacaoItens</string>
</void>
<void index="67">
<string>valorTotalCotacao</string>
</void>
<void index="68">
<string>WKNumProces</string>
</void>
</array>
</void>
</object>
</java>
@@ -29,7 +29,7 @@
<processDefinitionVersionPK>
<companyId>1</companyId>
<processId>Solicitação de compra - Ginseng</processId>
<version>8</version>
<version>86</version>
</processDefinitionVersionPK>
<versionDescription></versionDescription>
<formId>9305</formId>
@@ -1009,7 +1009,7 @@
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>1</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>46</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;validacaoItens&quot;) == &quot;entregue&quot;</condition>
@@ -1021,7 +1021,7 @@
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>2</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>46</sequence>
</conditionProcessStatePK>
<condition>true</condition>
@@ -1033,7 +1033,7 @@
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>1</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>128</sequence>
</conditionProcessStatePK>
<condition>parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &lt;= 100000.00</condition>
@@ -1047,7 +1047,7 @@
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>1</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>150</sequence>
</conditionProcessStatePK>
<condition>parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &gt;= 5001.00 &amp;&amp; &#xd;
@@ -1063,7 +1063,7 @@ parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &lt;= 50000.00&#xd;
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>2</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>150</sequence>
</conditionProcessStatePK>
<condition>true</condition>
@@ -1077,7 +1077,7 @@ parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &lt;= 50000.00&#xd;
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>1</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>154</sequence>
</conditionProcessStatePK>
<condition>parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &gt; 50000.00</condition>
@@ -1091,7 +1091,7 @@ parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &lt;= 50000.00&#xd;
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<expressionOrder>2</expressionOrder>
<version>8</version>
<version>86</version>
<sequence>154</sequence>
</conditionProcessStatePK>
<condition>parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &lt; 50000.00</condition>
@@ -1536,102 +1536,110 @@ parseFloat(hAPI.getCardValue(&quot;valorTotalCotacao&quot;)) &lt;= 50000.00&#xd;
<processId>Solicitação de compras </processId>
<version>1</version>
</workflowProcessEventPK>
<eventDescription>function toProtheusDate(d) {
if (!d) return &quot;&quot;;
if (d.indexOf(&quot;/&quot;) &gt; -1) {
var parts = d.split(&quot;/&quot;);
return parts[2] + parts[1] + parts[0]; // dd/MM/yyyy -&gt; yyyyMMdd
}
if (d.indexOf(&quot;-&quot;) &gt; -1) {
return d.replace(/-/g, &quot;&quot;); // yyyy-MM-dd -&gt; yyyyMMdd
}
return d; // já está no formato certo
}
function hojeProtheus() {
var d = new Date();
var yyyy = d.getFullYear();
var mm = d.getMonth() + 1;
var dd = d.getDate();
if (mm &lt; 10) mm = &quot;0&quot; + mm;
if (dd &lt; 10) dd = &quot;0&quot; + dd;
return &quot;&quot; + yyyy + mm + dd; // yyyyMMdd
}
function servicetask82(attempt, message) {
log.info(&quot;🚀 Iniciando servicetask82&quot;);
var qtdItens = hAPI.getChildrenIndexes(&quot;tbItens&quot;);
log.info(&quot;📦 Total de itens na tabela: &quot; + qtdItens.length);
var itens = [];
for (var i = 0; i &lt; qtdItens.length; i++) {
var index = qtdItens[i];
var item = {
&quot;C1_PRODUTO&quot;: String(hAPI.getCardValue(&quot;Codproduto___&quot; + index)),
&quot;C1_QUANT&quot;: Number(hAPI.getCardValue(&quot;qtd___&quot; + index)),
&quot;C1_DATPRF&quot;: toProtheusDate(String(hAPI.getCardValue(&quot;dataNec___&quot; + index)))
};
itens.push(item);
log.info(&quot;📌 Item adicionado: &quot; + JSON.stringify(item));
}
var payload = {
&quot;C1_SOLICIT&quot;: String(hAPI.getCardValue(&quot;usuarioSolicitante&quot;)),
&quot;C1_EMISSAO&quot;: hojeProtheus(),
&quot;C1_FILENT&quot;: String(hAPI.getCardValue(&quot;filialProtheus&quot;)).trim(),
&quot;C1_OBS&quot;: String(hAPI.getCardValue(&quot;observacoes&quot;)),
&quot;itens&quot;: itens
};
log.info(&quot;📦 Payload montado:&quot;);
log.info(JSON.stringify(payload));
var data1 = {
companyId: &apos;1&apos;,
serviceCode: &apos;Postprod&apos;,
endpoint: &apos;/rest/UF_MATA110&apos;,
method: &apos;post&apos;,
timeoutService: &apos;100&apos;,
params: payload, // objeto puro
headers: {
&apos;Content-Type&apos;: &apos;application/json&apos;
}
};
try {
var clientService = fluigAPI.getAuthorizeClientService();
var response = clientService.invoke(JSON.stringify(data1)); // SEMPRE stringify aqui
log.info(&quot;📬 Resposta da API Protheus:&quot;);
log.dir(response);
if (response &amp;&amp; response.getResult()) {
var result = JSON.parse(response.getResult());
if (result.sucesso) {
hAPI.setCardValue(&quot;numeroSCProtheus&quot;, result.C1_NUM || &quot;&quot;);
hAPI.setCardValue(&quot;statusSCProtheus&quot;, &quot;SC cadastrada com sucesso&quot;);
hAPI.setCardValue(&quot;solicitanteSCProtheus&quot;, result.C1_SOLICIT || &quot;&quot;);
hAPI.setCardValue(&quot;emissaoSCProtheus&quot;, result.C1_EMISSAO || &quot;&quot;);
hAPI.setCardValue(&quot;qtdItensSCProtheus&quot;, String(result.quantidade_itens || &quot;&quot;));
hAPI.setCardValue(&quot;dataCadastroSCProtheus&quot;, result.data_cadastro || &quot;&quot;);
hAPI.setCardValue(&quot;horaCadastroSCProtheus&quot;, result.hora_cadastro || &quot;&quot;);
} else {
hAPI.setCardValue(&quot;statusSCProtheus&quot;, &quot;Erro: &quot; + result.erro);
throw &quot;Erro Protheus: &quot; + result.message;
}
} else {
throw &quot;Sem resposta da API Protheus&quot;;
}
} catch (e) {
log.error(&quot;❌ Erro ao enviar SC para o Protheus: &quot; + e);
throw e;
}
log.info(&quot;🏁 Finalização da servicetask82&quot;);
}
<eventDescription>function toProtheusDate(d) {&#xd;
if (!d) return &quot;&quot;;&#xd;
if (d.indexOf(&quot;/&quot;) &gt; -1) {&#xd;
var parts = d.split(&quot;/&quot;);&#xd;
return parts[2] + parts[1] + parts[0]; // dd/MM/yyyy -&gt; yyyyMMdd&#xd;
}&#xd;
if (d.indexOf(&quot;-&quot;) &gt; -1) {&#xd;
return d.replace(/-/g, &quot;&quot;); // yyyy-MM-dd -&gt; yyyyMMdd&#xd;
}&#xd;
return d; // já está no formato certo&#xd;
}&#xd;
&#xd;
function hojeProtheus() {&#xd;
var d = new Date();&#xd;
var yyyy = d.getFullYear();&#xd;
var mm = d.getMonth() + 1;&#xd;
var dd = d.getDate();&#xd;
if (mm &lt; 10) mm = &quot;0&quot; + mm;&#xd;
if (dd &lt; 10) dd = &quot;0&quot; + dd;&#xd;
return &quot;&quot; + yyyy + mm + dd; // yyyyMMdd&#xd;
}&#xd;
&#xd;
function servicetask82(attempt, message) {&#xd;
log.info(&quot;🚀 Iniciando servicetask82&quot;);&#xd;
&#xd;
var qtdItens = hAPI.getChildrenIndexes(&quot;tbItens&quot;);&#xd;
log.info(&quot;📦 Total de itens na tabela: &quot; + qtdItens.length);&#xd;
&#xd;
var itens = [];&#xd;
for (var i = 0; i &lt; qtdItens.length; i++) {&#xd;
var index = qtdItens[i];&#xd;
var item = {&#xd;
&quot;C1_PRODUTO&quot;: String(hAPI.getCardValue(&quot;Codproduto___&quot; + index)),&#xd;
&quot;C1_QUANT&quot;: Number(hAPI.getCardValue(&quot;qtd___&quot; + index)),&#xd;
&quot;C1_DATPRF&quot;: toProtheusDate(String(hAPI.getCardValue(&quot;dataNec___&quot; + index)))&#xd;
};&#xd;
itens.push(item);&#xd;
log.info(&quot;📌 Item adicionado: &quot; + JSON.stringify(item));&#xd;
}&#xd;
&#xd;
var filial = String(hAPI.getCardValue(&quot;filialprotheus&quot;) || hAPI.getCardValue(&quot;filialProtheus&quot;) || &quot;&quot;).trim();&#xd;
if (!filial) {&#xd;
throw &quot;Campo de filial não preenchido no formulário (filialprotheus).&quot;;&#xd;
}&#xd;
&#xd;
var payload = {&#xd;
&quot;C1_SOLICIT&quot;: String(hAPI.getCardValue(&quot;usuarioSolicitante&quot;)),&#xd;
&quot;C1_EMISSAO&quot;: hojeProtheus(),&#xd;
&quot;C1_FILENT&quot;: filial,&#xd;
&quot;C1_OBS&quot;: String(hAPI.getCardValue(&quot;observacoes&quot;)),&#xd;
&quot;itens&quot;: itens&#xd;
};&#xd;
&#xd;
log.info(&quot;📦 Payload montado:&quot;);&#xd;
log.info(JSON.stringify(payload));&#xd;
&#xd;
var data1 = {&#xd;
companyId: &apos;1&apos;,&#xd;
serviceCode: &apos;Postprod&apos;,&#xd;
endpoint: &apos;/UF_MATA110&apos;,&#xd;
method: &apos;post&apos;,&#xd;
timeoutService: &apos;60000&apos;,&#xd;
params: payload, // objeto puro&#xd;
headers: {&#xd;
&apos;Content-Type&apos;: &apos;application/json&apos;&#xd;
}&#xd;
};&#xd;
&#xd;
try {&#xd;
var clientService = fluigAPI.getAuthorizeClientService();&#xd;
var response = clientService.invoke(JSON.stringify(data1)); // SEMPRE stringify aqui&#xd;
&#xd;
log.info(&quot;📬 Resposta da API Protheus:&quot;);&#xd;
if (response) {&#xd;
log.info(&quot;HTTP status: &quot; + response.getHttpStatusResult());&#xd;
log.info(&quot;Body: &quot; + response.getResult());&#xd;
}&#xd;
&#xd;
if (response &amp;&amp; response.getResult()) {&#xd;
var result = JSON.parse(response.getResult());&#xd;
if (result.sucesso) {&#xd;
hAPI.setCardValue(&quot;numeroSCProtheus&quot;, result.C1_NUM || &quot;&quot;);&#xd;
hAPI.setCardValue(&quot;statusSCProtheus&quot;, &quot;SC cadastrada com sucesso&quot;);&#xd;
hAPI.setCardValue(&quot;solicitanteSCProtheus&quot;, result.C1_SOLICIT || &quot;&quot;);&#xd;
hAPI.setCardValue(&quot;emissaoSCProtheus&quot;, result.C1_EMISSAO || &quot;&quot;);&#xd;
hAPI.setCardValue(&quot;qtdItensSCProtheus&quot;, String(result.quantidade_itens || &quot;&quot;));&#xd;
hAPI.setCardValue(&quot;dataCadastroSCProtheus&quot;, result.data_cadastro || &quot;&quot;);&#xd;
hAPI.setCardValue(&quot;horaCadastroSCProtheus&quot;, result.hora_cadastro || &quot;&quot;);&#xd;
} else {&#xd;
hAPI.setCardValue(&quot;statusSCProtheus&quot;, &quot;Erro: &quot; + result.erro);&#xd;
throw &quot;Erro Protheus: &quot; + result.message;&#xd;
}&#xd;
} else {&#xd;
throw &quot;Sem resposta da API Protheus&quot;;&#xd;
}&#xd;
} catch (e) {&#xd;
log.error(&quot;❌ Erro ao enviar SC para o Protheus: &quot; + e);&#xd;
throw e;&#xd;
}&#xd;
&#xd;
&#xd;
&#xd;
log.info(&quot;🏁 Finalização da servicetask82&quot;);&#xd;
}&#xd;
</eventDescription>
</WorkflowProcessEvent>
<WorkflowProcessEvent>
@@ -1641,25 +1649,25 @@ function servicetask82(attempt, message) {
<processId>Solicitação de compras </processId>
<version>1</version>
</workflowProcessEventPK>
<eventDescription>function servicetask114(attempt, message) {
log.info(&quot;🚀 ST92 — Verifica se já existe código de cotação no formulário&quot;);
var numSC = hAPI.getCardValue(&quot;numeroSCProtheus&quot;);
var numCot = hAPI.getCardValue(&quot;cotacaoSCProtheus&quot;);
log.info(&quot;📌 SC: &quot; + numSC + &quot; | Cotação: &quot; + numCot);
if (!numSC) {
throw &quot;❌ Número da SC não informado no formulário.&quot;;
}
// se não tiver cotação ainda, força o loop da atividade
if (!numCot || numCot === &quot;000000&quot; || numCot === &quot;000001&quot;) {
throw &quot;⏳ Cotação ainda não disponível para a SC &quot; + numSC;
}
// se já tiver código, só registra log e deixa o processo seguir
log.info(&quot;✅ Cotação &quot; + numCot + &quot; encontrada no formulário. Processo segue.&quot;);
<eventDescription>function servicetask114(attempt, message) {&#xd;
log.info(&quot;🚀 ST92 — Verifica se já existe código de cotação no formulário&quot;);&#xd;
&#xd;
var numSC = hAPI.getCardValue(&quot;numeroSCProtheus&quot;);&#xd;
var numCot = hAPI.getCardValue(&quot;cotacaoSCProtheus&quot;);&#xd;
&#xd;
log.info(&quot;📌 SC: &quot; + numSC + &quot; | Cotação: &quot; + numCot);&#xd;
&#xd;
if (!numSC) {&#xd;
throw &quot;❌ Número da SC não informado no formulário.&quot;;&#xd;
}&#xd;
&#xd;
// se não tiver cotação ainda, força o loop da atividade&#xd;
if (!numCot || numCot === &quot;000000&quot; || numCot === &quot;000001&quot;) {&#xd;
throw &quot;⏳ Cotação ainda não disponível para a SC &quot; + numSC;&#xd;
}&#xd;
&#xd;
// se já tiver código, só registra log e deixa o processo seguir&#xd;
log.info(&quot;✅ Cotação &quot; + numCot + &quot; encontrada no formulário. Processo segue.&quot;);&#xd;
}</eventDescription>
</WorkflowProcessEvent>
</list>
@@ -1801,7 +1809,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>26</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1812,7 +1820,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>125</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1823,7 +1831,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>126</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1834,7 +1842,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>127</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1845,7 +1853,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>129</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1856,7 +1864,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>142</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1867,7 +1875,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>144</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1878,7 +1886,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>152</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@@ -1889,7 +1897,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>152</linkSequence>
<bendSequence>2</bendSequence>
</processLinkBendPK>
@@ -1900,7 +1908,7 @@ function servicetask82(attempt, message) {
<processLinkBendPK>
<companyId>1</companyId>
<processId>Solicitação de compras </processId>
<version>8</version>
<version>86</version>
<linkSequence>161</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 62 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

@@ -9089,7 +9089,7 @@
<bpmn2:BpmnEndEvent extendedFields="&lt;list/&gt;" id="endcancel39" incoming="flow124" name="Cancelado" notificaRequisitante="true" signalId="0" type="65"/>
<bpmn2:BpmnGateway condition="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;1&lt;/order&gt;&#10; &lt;expression&gt;hAPI.getCardValue(&amp;quot;validacaoItens&amp;quot;) == &amp;quot;entregue&amp;quot;&lt;/expression&gt;&#10; &lt;targetTask&gt;endevent52&lt;/targetTask&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10; &lt;order&gt;2&lt;/order&gt;&#10; &lt;expression&gt;true&lt;/expression&gt;&#10; &lt;targetTask&gt;task24&lt;/targetTask&gt;&#10; &lt;conditionType&gt;0&lt;/conditionType&gt;&#10; &lt;/org.eclipse.bpmn2.impl.ConditionImpl&gt;&#10;&lt;/list&gt;" extendedFields="&lt;list/&gt;" id="exclusivegateway46" incoming="flow47" name="Validar compra" outgoing="flow48 flow78" type="120"/>
<bpmn2:BpmnEndEvent extendedFields="&lt;list/&gt;" id="endevent52" incoming="flow78" name="Fim" signalId="0" type="60"/>
<bpmn2:BpmnProcess author="" cardIndex="9305" category="Compras - Testes" complementsLevel="1" descriptorFields="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;descProduto&lt;/id&gt;&#10; &lt;label&gt;descProduto&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;empresa&lt;/id&gt;&#10; &lt;label&gt;empresa&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;estabelecimento&lt;/id&gt;&#10; &lt;label&gt;estabelecimento&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;filialdest&lt;/id&gt;&#10; &lt;label&gt;filialdest&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;numeroSCProtheus&lt;/id&gt;&#10; &lt;label&gt;numeroSCProtheus&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;pedidoSCProtheus&lt;/id&gt;&#10; &lt;label&gt;pedidoSCProtheus&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;quantidade&lt;/id&gt;&#10; &lt;label&gt;quantidade&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;solicitanteSCProtheus&lt;/id&gt;&#10; &lt;label&gt;solicitanteSCProtheus&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;urgencia&lt;/id&gt;&#10; &lt;label&gt;urgencia&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;valorTotalCotacao&lt;/id&gt;&#10; &lt;label&gt;valorTotalCotacao&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10;&lt;/list&gt;" expedient="Default" extendedFields="&lt;list/&gt;" formSource="server" id="Solicita&#231;&#227;o de compras " instruction="Este flow permite abertura de solicita&#231;&#227;o de compras automatizadas, informando qual item ser&#225; comprado e direcionado para as aprova&#231;&#245;es corretas." keyWord="" managerAssignmentController="&lt;org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;&#10; &lt;groupId&gt;TIC&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Grupo&lt;/mechanismName&gt;&#10;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;" name="Solicita&#231;&#227;o de compra - Ginseng" notifyRequisitionerComplements="true" notifyResponsibleComplements="true" serverId="Ginseng Produ&#231;&#227;o" version="8" volume="Default"/>
<bpmn2:BpmnProcess author="" cardIndex="9305" category="Compras - Testes" complementsLevel="1" descriptorFields="&lt;list&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;descProduto&lt;/id&gt;&#10; &lt;label&gt;descProduto&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;empresa&lt;/id&gt;&#10; &lt;label&gt;empresa&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;estabelecimento&lt;/id&gt;&#10; &lt;label&gt;estabelecimento&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;filialdest&lt;/id&gt;&#10; &lt;label&gt;filialdest&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;numeroSCProtheus&lt;/id&gt;&#10; &lt;label&gt;numeroSCProtheus&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;pedidoSCProtheus&lt;/id&gt;&#10; &lt;label&gt;pedidoSCProtheus&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;quantidade&lt;/id&gt;&#10; &lt;label&gt;quantidade&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;solicitanteSCProtheus&lt;/id&gt;&#10; &lt;label&gt;solicitanteSCProtheus&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;urgencia&lt;/id&gt;&#10; &lt;label&gt;urgencia&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10; &lt;id&gt;valorTotalCotacao&lt;/id&gt;&#10; &lt;label&gt;valorTotalCotacao&lt;/label&gt;&#10; &lt;cardIndex&gt;9305 - compras_digital&lt;/cardIndex&gt;&#10; &lt;/org.eclipse.bpmn2.impl.BpmnProcessFormField&gt;&#10;&lt;/list&gt;" expedient="Default" extendedFields="&lt;list/&gt;" formSource="server" id="Solicita&#231;&#227;o de compras " instruction="Este flow permite abertura de solicita&#231;&#227;o de compras automatizadas, informando qual item ser&#225; comprado e direcionado para as aprova&#231;&#245;es corretas." keyWord="" managerAssignmentController="&lt;org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;&#10; &lt;groupId&gt;TIC&lt;/groupId&gt;&#10; &lt;mechanismName&gt;Grupo&lt;/mechanismName&gt;&#10;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerGroup&gt;" name="Solicita&#231;&#227;o de compra - Ginseng" notifyRequisitionerComplements="true" notifyResponsibleComplements="true" serverId="Ginseng Produ&#231;&#227;o" version="86" volume="Default"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow26" name="" sourceRef="task24" targetRef="task18"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow47" name="" sourceRef="task18" targetRef="exclusivegateway46"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow48" name="Reprovar" sourceRef="exclusivegateway46" targetRef="task24"/>
@@ -9134,5 +9134,5 @@
<bpmn2:BpmnTask authNotify="true" esforcoCalculo="0" executionAttempts="0" expediente="" frequency="0" id="task158" incoming="flow159" loopType="0" name="Aprova&#231;&#227;o CEO" outgoing="flow160" selecionaColaboradores="1" type="80"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow159" name="" sourceRef="exclusivegateway154" targetRef="task158"/>
<bpmn2:SequenceFlow atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow160" name="" sourceRef="task158" targetRef="task18"/>
<bpmn2:SequenceFlow atividadeFluxo="Ajustar Solicita&#231;&#227;o" atividadeRetorno="" id="flow161" name="" sourceRef="task121" targetRef="startevent1"/>
<bpmn2:SequenceFlow atividadeFluxo="Ajustar Solicita&#231;&#227;o" atividadeRetorno="" extendedFields="&lt;list/&gt;" id="flow161" name="" sourceRef="task121" targetRef="startevent1"/>
</xmi:XMI>
@@ -38,10 +38,21 @@ function servicetask82(attempt, message) {
log.info("📌 Item adicionado: " + JSON.stringify(item));
}
var filial = String(
hAPI.getCardValue("filialprotheus") ||
hAPI.getCardValue("filialProtheus") ||
hAPI.getCardValue("codigocentroCusto") ||
""
).trim();
if (!filial) {
throw "Campo PROTHEUS da filial não preenchido no formulário (filialprotheus).";
}
log.info("🏬 Filial PROTHEUS enviada no C1_FILENT: " + filial);
var payload = {
"C1_SOLICIT": String(hAPI.getCardValue("usuarioSolicitante")),
"C1_EMISSAO": hojeProtheus(),
"C1_FILENT": String(hAPI.getCardValue("filialProtheus")).trim(),
"C1_FILENT": filial,
"C1_OBS": String(hAPI.getCardValue("observacoes")),
"itens": itens
};
@@ -52,9 +63,9 @@ function servicetask82(attempt, message) {
var data1 = {
companyId: '1',
serviceCode: 'Postprod',
endpoint: '/rest/UF_MATA110',
endpoint: '/UF_MATA110',
method: 'post',
timeoutService: '100',
timeoutService: '60000',
params: payload, // objeto puro
headers: {
'Content-Type': 'application/json'
@@ -66,21 +77,27 @@ function servicetask82(attempt, message) {
var response = clientService.invoke(JSON.stringify(data1)); // SEMPRE stringify aqui
log.info("📬 Resposta da API Protheus:");
log.dir(response);
if (response) {
log.info("HTTP status: " + response.getHttpStatusResult());
log.info("Body: " + response.getResult());
}
if (response && response.getResult()) {
var result = JSON.parse(response.getResult());
if (result.sucesso) {
hAPI.setCardValue("numeroSCProtheus", result.C1_NUM || "");
hAPI.setCardValue("statusSCProtheus", "SC cadastrada com sucesso");
hAPI.setCardValue("statusAtendimento", "Em andamento");
hAPI.setCardValue("solicitanteSCProtheus", result.C1_SOLICIT || "");
hAPI.setCardValue("emissaoSCProtheus", result.C1_EMISSAO || "");
hAPI.setCardValue("qtdItensSCProtheus", String(result.quantidade_itens || ""));
hAPI.setCardValue("dataCadastroSCProtheus", result.data_cadastro || "");
hAPI.setCardValue("horaCadastroSCProtheus", result.hora_cadastro || "");
} else {
hAPI.setCardValue("statusSCProtheus", "Erro: " + result.erro);
throw "Erro Protheus: " + result.message;
var erroMsg = result.erro || result.message || JSON.stringify(result);
hAPI.setCardValue("statusSCProtheus", "Erro: " + erroMsg);
hAPI.setCardValue("statusAtendimento", "Erro no envio");
throw "Erro Protheus: " + erroMsg;
}
} else {
throw "Sem resposta da API Protheus";