ATF for a workflow studio flow
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
13 hours ago
Hi There,
i want to make a ATF for a workflow studio flow.
I have made this script. But i cannot make it work.
What is wrong? How can i most simply test a flow where the first 3 days of the week it makes a task and the last 2 days of the week it does not make a test.
// ===================== CONFIG =====================
// Je mag sys_id (32 chars) of interne naam (x_scope.subflow) invullen:
var SUBFLOW_ID_OR_NAME = 'db3746d287dd9a10467fec280cbb3591';
// Exacte short description van de verwachte extra taak (EARLY-WEEK case -> MOET bestaan)
var TASK_SHORT_DESC = 'Disable setup inkooporders week';
// Als je subflow een record-input verwacht, vul deze in (anders leeg laten):
// vb: RECORD_INPUT_NAME = 'record'
var RECORD_INPUT_NAME = ''; // bv. 'record' (laat leeg als niet nodig)
var RECORD_SYS_ID = ''; // bij voorkeur een bestaand record sys_id
var PARENT_TABLE = ''; // OF: tabelnaam zodat we een record pakken/maken
// ==================================================
var answer = true;
// (0) Inputs opbouwen
var inputs = {};
if (RECORD_INPUT_NAME) {
if (RECORD_SYS_ID) {
inputs[RECORD_INPUT_NAME] = RECORD_SYS_ID;
} else if (PARENT_TABLE) {
var parent = new GlideRecord(PARENT_TABLE);
parent.orderByDesc('sys_updated_on');
parent.setLimit(1);
parent.query();
if (!parent.next()) {
parent = new GlideRecord(PARENT_TABLE);
parent.initialize();
if (parent.isValidField('short_description')) parent.short_description = 'ATF Parent for Flow ' + gs.generateGUID();
if (parent.isValidField('name')) parent.name = 'ATF Parent for Flow ' + gs.generateGUID();
if (parent.isValidField('description')) parent.description = 'Created by ATF';
try {
var newId = parent.insert();
if (!newId) {
gs.addErrorMessage('Kon geen parent record aanmaken op ' + PARENT_TABLE + '. Vul RECORD_SYS_ID in of controleer verplichte velden.');
answer = false;
}
} catch (eIns) {
gs.addErrorMessage('Fout bij aanmaken parent record op ' + PARENT_TABLE + ': ' + eIns);
answer = false;
}
}
if (answer) inputs[RECORD_INPUT_NAME] = String(parent.getUniqueValue());
} else {
gs.addErrorMessage('Subflow verwacht waarschijnlijk een record-input. Vul RECORD_SYS_ID óf PARENT_TABLE in, of laat RECORD_INPUT_NAME leeg.');
answer = false;
}
}
// (1) sys_id -> interne naam resolven om scope issues te vermijden
var target = SUBFLOW_ID_OR_NAME;
if (answer && /^[0-9a-f]{32}$/.test(SUBFLOW_ID_OR_NAME)) {
var f = new GlideRecord('sys_hub_flow');
if (!f.get(SUBFLOW_ID_OR_NAME)) {
gs.addErrorMessage('Subflow sys_id niet gevonden in sys_hub_flow: ' + SUBFLOW_ID_OR_NAME);
answer = false;
} else {
var internalName = f.getValue('internal_name');
if (!internalName) {
var scopeName = (f.sys_scope && f.sys_scope.scope) ? String(f.sys_scope.scope) : '';
var plainName = String(f.getValue('name') || '').replace(/\s+/g, '_').toLowerCase();
internalName = (scopeName && plainName) ? (scopeName + '.' + plainName) : '';
}
if (!internalName) {
gs.addErrorMessage('Kon interne naam van subflow niet bepalen; controleer sys_hub_flow record.');
answer = false;
} else {
target = internalName;
gs.info('ATF: Subflow internal name resolved to: ' + target);
}
}
}
// (2) Subflow NON-BLOCKING starten en eventuele 'waiting state' errors negeren
if (answer) {
try {
if (sn_fd && sn_fd.FlowAPI && typeof sn_fd.FlowAPI.startSubflow === 'function') {
sn_fd.FlowAPI.startSubflow(target, inputs); // non-blocking
} else if (sn_fd && sn_fd.FlowAPI && typeof sn_fd.FlowAPI.executeSubflow === 'function') {
// executeSubflow kan fout geven wanneer flow paust; behandel dat als 'gestart'
try {
sn_fd.FlowAPI.executeSubflow(target, inputs, 600000);
} catch (eWait) {
var msg = String(eWait);
if (msg.indexOf('wachttoestand') >= 0 || msg.indexOf('waiting state') >= 0) {
gs.info('ATF: Flow is in wachttoestand; ga door met polling.');
} else {
throw eWait;
}
}
} else if (sn_fd && sn_fd.FlowAPI && typeof sn_fd.FlowAPI.getRunner === 'function') {
// runner in background om waits te tolereren
sn_fd.FlowAPI.getRunner().subflow(target).withInputs(inputs).run();
} else {
gs.addErrorMessage('sn_fd.FlowAPI niet beschikbaar in deze instance/scope.');
answer = false;
}
} catch (e) {
gs.addErrorMessage('Subflow starten faalde: ' + e);
answer = false;
}
}
// (3) Langer poll'en op de verwachte taak (tot 3 min)
if (answer) {
var found = false;
var attempts = 90; // 90 * 2s = 180s
var sleepMs = 2000;
// tasks van de laatste 10 minuten
var since = new GlideDateTime();
since.addMinutesUTC(-10);
for (var i = 0; i < attempts; i++) {
var t = new GlideRecord('task');
t.addQuery('short_description', TASK_SHORT_DESC);
t.addQuery('sys_created_on', '>=', since);
t.orderByDesc('sys_created_on');
t.setLimit(1);
t.query();
if (t.hasNext()) { found = true; break; }
gs.sleep(sleepMs);
}
if (!found) {
gs.addErrorMessage('FAIL: Verwachte taak "' + TASK_SHORT_DESC + '" niet gevonden (flow kan gepauzeerd zijn of voorwaarde niet gehaald).');
answer = false;
} else {
gs.addInfoMessage('PASS: Extra taak gevonden (early-week case).');
}
}
// Einde: geen 'return' in ATF server-side step
answer;