302 lines
8.9 KiB
JavaScript
302 lines
8.9 KiB
JavaScript
function defineStructure() {
|
|
addColumn("LOGIN");
|
|
addColumn("NOME");
|
|
addColumn("EMAIL");
|
|
addColumn("COLLEAGUE_ID");
|
|
addColumn("GROUP_ID");
|
|
}
|
|
|
|
function onSync(lastSyncDate) {}
|
|
function onMobileSync(user) {}
|
|
|
|
function createDataset(fields, constraints, sortFields) {
|
|
var dataset = DatasetBuilder.newDataset();
|
|
dataset.addColumn("LOGIN");
|
|
dataset.addColumn("NOME");
|
|
dataset.addColumn("EMAIL");
|
|
dataset.addColumn("COLLEAGUE_ID");
|
|
dataset.addColumn("GROUP_ID");
|
|
|
|
try {
|
|
var cfg = parseConstraints(constraints);
|
|
var members = getMembersFromGroup(cfg.groupId);
|
|
var termo = normalize(cfg.termoLivre);
|
|
var added = 0;
|
|
|
|
for (var i = 0; i < members.length; i++) {
|
|
var memberId = trim(members[i]);
|
|
if (!memberId) continue;
|
|
|
|
var col = getColleagueById(memberId);
|
|
if (!col) continue;
|
|
|
|
if (termo) {
|
|
var blob = normalize([
|
|
col.LOGIN,
|
|
col.NOME,
|
|
col.EMAIL,
|
|
col.COLLEAGUE_ID
|
|
].join(" "));
|
|
if (blob.indexOf(termo) === -1) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
dataset.addRow([
|
|
col.LOGIN,
|
|
col.NOME,
|
|
col.EMAIL,
|
|
col.COLLEAGUE_ID,
|
|
cfg.groupId
|
|
]);
|
|
added++;
|
|
}
|
|
|
|
if (added === 0) {
|
|
// Mantem dataset vazio para o zoom nao exibir usuarios fora do grupo.
|
|
}
|
|
} catch (e) {
|
|
safeLogError("[ds_motoristas_grupo] Erro no createDataset: " + e);
|
|
dataset = DatasetBuilder.newDataset();
|
|
dataset.addColumn("LOGIN");
|
|
dataset.addColumn("NOME");
|
|
dataset.addColumn("EMAIL");
|
|
dataset.addColumn("COLLEAGUE_ID");
|
|
dataset.addColumn("GROUP_ID");
|
|
}
|
|
|
|
return dataset;
|
|
}
|
|
|
|
function parseConstraints(constraints) {
|
|
var out = {
|
|
groupId: "Motoristas",
|
|
termoLivre: ""
|
|
};
|
|
|
|
if (!constraints) return out;
|
|
|
|
for (var i = 0; i < constraints.length; i++) {
|
|
var c = constraints[i];
|
|
if (!c) continue;
|
|
|
|
var field = getConstraintFieldName(c);
|
|
var value = getConstraintInitialValue(c);
|
|
if (!field) continue;
|
|
if (!value) continue;
|
|
|
|
if (
|
|
field === "GROUP_ID" ||
|
|
field === "groupId" ||
|
|
field === "group_id" ||
|
|
field === "colleagueGroupPK.groupId"
|
|
) {
|
|
out.groupId = value;
|
|
continue;
|
|
}
|
|
|
|
if (
|
|
field !== "metadata#id" &&
|
|
field !== "metadata#active" &&
|
|
field !== "sqlLimit"
|
|
) {
|
|
var cleaned = cleanSearchValue(value);
|
|
if (cleaned && (!out.termoLivre || cleaned.length > out.termoLivre.length)) {
|
|
out.termoLivre = cleaned;
|
|
}
|
|
}
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
function getMembersFromGroup(groupId) {
|
|
var members = {};
|
|
var out = [];
|
|
var gId = trim(groupId);
|
|
if (!gId) return out;
|
|
|
|
var fieldOptions = [
|
|
"colleagueGroupPK.groupId",
|
|
"groupId",
|
|
"group"
|
|
];
|
|
|
|
var groupCandidates = [gId];
|
|
var upper = gId.toUpperCase();
|
|
var lower = gId.toLowerCase();
|
|
if (groupCandidates.indexOf(upper) < 0) groupCandidates.push(upper);
|
|
if (groupCandidates.indexOf(lower) < 0) groupCandidates.push(lower);
|
|
|
|
var ds = null;
|
|
for (var g = 0; g < groupCandidates.length; g++) {
|
|
for (var i = 0; i < fieldOptions.length; i++) {
|
|
try {
|
|
var cGroup = DatasetFactory.createConstraint(fieldOptions[i], groupCandidates[g], groupCandidates[g], ConstraintType.MUST);
|
|
ds = DatasetFactory.getDataset("colleagueGroup", null, [cGroup], null);
|
|
if (ds && ds.rowsCount > 0) {
|
|
break;
|
|
}
|
|
} catch (e) {
|
|
safeLogError("[ds_motoristas_grupo] Erro consultando colleagueGroup (" + fieldOptions[i] + "=" + groupCandidates[g] + "): " + e);
|
|
ds = null;
|
|
}
|
|
}
|
|
if (ds && ds.rowsCount > 0) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!ds || ds.rowsCount === 0) {
|
|
// Fallback: alguns ambientes permitem filtrar direto no dataset colleague por groupId.
|
|
try {
|
|
var cGroupCol = DatasetFactory.createConstraint("groupId", gId, gId, ConstraintType.MUST);
|
|
ds = DatasetFactory.getDataset("colleague", null, [cGroupCol], null);
|
|
if (ds && ds.rowsCount > 0) {
|
|
for (var x = 0; x < ds.rowsCount; x++) {
|
|
var fallbackId = trim(
|
|
ds.getValue(x, "colleaguePK.colleagueId") ||
|
|
ds.getValue(x, "colleagueId") ||
|
|
ds.getValue(x, "login")
|
|
);
|
|
if (!fallbackId) continue;
|
|
if (members[fallbackId]) continue;
|
|
members[fallbackId] = true;
|
|
out.push(fallbackId);
|
|
}
|
|
}
|
|
} catch (eFallback) {
|
|
safeLogError("[ds_motoristas_grupo] Erro no fallback por groupId no colleague: " + eFallback);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
for (var r = 0; r < ds.rowsCount; r++) {
|
|
var colleagueId = trim(
|
|
ds.getValue(r, "colleagueGroupPK.colleagueId") ||
|
|
ds.getValue(r, "colleagueId") ||
|
|
ds.getValue(r, "login")
|
|
);
|
|
if (!colleagueId) continue;
|
|
if (members[colleagueId]) continue;
|
|
members[colleagueId] = true;
|
|
out.push(colleagueId);
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
function getColleagueById(colleagueId) {
|
|
var id = trim(colleagueId);
|
|
if (!id) return null;
|
|
|
|
var fieldsToTry = ["colleaguePK.colleagueId", "colleagueId", "login"];
|
|
var ds = null;
|
|
|
|
// 1) Tenta buscando somente ativos com diferentes campos.
|
|
for (var i = 0; i < fieldsToTry.length; i++) {
|
|
ds = getColleagueDataset(id, fieldsToTry[i], true);
|
|
if (ds && ds.rowsCount > 0) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 2) Fallback sem constraint de ativo (alguns ambientes tratam "active" de forma diferente).
|
|
if (!ds || ds.rowsCount === 0) {
|
|
for (var j = 0; j < fieldsToTry.length; j++) {
|
|
ds = getColleagueDataset(id, fieldsToTry[j], false);
|
|
if (ds && ds.rowsCount > 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!ds || ds.rowsCount === 0) return null;
|
|
|
|
var row = pickActiveRow(ds);
|
|
if (row < 0) row = 0;
|
|
|
|
var colleaguePkId = trim(
|
|
ds.getValue(row, "colleaguePK.colleagueId") ||
|
|
ds.getValue(row, "colleagueId") ||
|
|
ds.getValue(row, "login")
|
|
);
|
|
if (!colleaguePkId) return null;
|
|
|
|
return {
|
|
LOGIN: trim(ds.getValue(row, "login")),
|
|
NOME: trim(ds.getValue(row, "colleagueName")),
|
|
EMAIL: trim(ds.getValue(row, "mail")),
|
|
COLLEAGUE_ID: colleaguePkId
|
|
};
|
|
}
|
|
|
|
function getColleagueDataset(id, fieldName, onlyActive) {
|
|
try {
|
|
var constraints = [
|
|
DatasetFactory.createConstraint(fieldName, id, id, ConstraintType.MUST)
|
|
];
|
|
|
|
if (onlyActive) {
|
|
constraints.push(DatasetFactory.createConstraint("active", "true", "true", ConstraintType.MUST));
|
|
}
|
|
|
|
return DatasetFactory.getDataset("colleague", null, constraints, null);
|
|
} catch (e) {
|
|
safeLogError("[ds_motoristas_grupo] Erro consultando colleague (" + fieldName + "=" + id + ", active=" + onlyActive + "): " + e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function pickActiveRow(ds) {
|
|
if (!ds || ds.rowsCount <= 0) return -1;
|
|
|
|
for (var i = 0; i < ds.rowsCount; i++) {
|
|
var activeValue = trim(ds.getValue(i, "active") || ds.getValue(i, "colleaguePK.active"));
|
|
if (!activeValue) return i;
|
|
|
|
var n = normalize(activeValue);
|
|
if (n === "true" || n === "1" || n === "yes" || n === "sim" || n === "y" || n === "s" || n === "t") {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
function getConstraintFieldName(constraint) {
|
|
try {
|
|
if (constraint.fieldName) return String(constraint.fieldName);
|
|
if (constraint._field) return String(constraint._field);
|
|
if (typeof constraint.getFieldName === "function") return String(constraint.getFieldName());
|
|
} catch (e) {}
|
|
return "";
|
|
}
|
|
|
|
function getConstraintInitialValue(constraint) {
|
|
try {
|
|
if (constraint.initialValue != null) return trim(constraint.initialValue);
|
|
if (constraint._initialValue != null) return trim(constraint._initialValue);
|
|
if (typeof constraint.getInitialValue === "function") return trim(constraint.getInitialValue());
|
|
} catch (e) {}
|
|
return "";
|
|
}
|
|
|
|
function trim(v) {
|
|
return String(v == null ? "" : v).trim();
|
|
}
|
|
|
|
function normalize(v) {
|
|
return trim(v).toLowerCase();
|
|
}
|
|
|
|
function cleanSearchValue(v) {
|
|
return trim(v).replace(/[%*_]/g, "");
|
|
}
|
|
|
|
function safeLogError(message) {
|
|
try {
|
|
log.error(String(message));
|
|
} catch (e) {}
|
|
}
|