Zoho Projects में CodeX Scripts उन्नत शर्तीय तर्क स्क्रिप्ट हैं जो विशिष्ट नियमों और सत्यापनों को लागू करने में मदद करती हैं। उपयोगकर्ता नियंत्रित कर सकते हैं कि समय लॉग कैसे और कब बनाए जा सकते हैं, अपडेट किए जा सकते हैं, अवरुद्ध किए जा सकते हैं या स्थिति बदली जा सकती है।
उपयोगकर्ताओं को समय लॉग करने से प्रतिबंधित करें जो Task को आवंटित कुल कार्य घंटों से अधिक हो। यह स्क्रिप्ट उन Task के लिए लॉगिंग को भी अवरुद्ध करती है जिन्हें कोई कार्य घंटे निर्दिष्ट नहीं किए गए हैं।
- function main() {
- try {
- let url = "https://projects.zoho.com";
- let records = current.record;
- let violations = [];
- function parseToMinutes(s) {
- if (!s) return 0;
- let str = String(s);
- if (str.indexOf(":") === -1) return (parseFloat(str) || 0) * 60;
- let p = str.split(":");
- return (parseInt(p[0], 10) || 0) * 60 + (parseInt(p[1], 10) || 0);
- }
- function formatMinutes(m) {
- let h = Math.floor(m / 60);
- let mins = m % 60;
- return h + ":" + (mins < 10 ? "0" : "") + mins;
- }
- let taskLogs = [];
- let projectTaskMap = {};
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let linked = record.module_detail;
- if (!linked || linked.name !== "Task") continue;
- taskLogs.push(record);
- let projId = String(record.project_id);
- if (!projectTaskMap[projId]) projectTaskMap[projId] = {};
- projectTaskMap[projId][linked.id] = true;
- }
- if (taskLogs.length === 0) return;
- let allTasks = [];
- let projectIds = Object.keys(projectTaskMap);
- if (projectIds.length === 1) {
- let projId = projectIds[0];
- let taskIds = Object.keys(projectTaskMap[projId]);
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: taskIds }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- } else {
- let uniqueMap = {};
- for (let i = 0; i < projectIds.length; i++) {
- let ids = Object.keys(projectTaskMap[projectIds[i]]);
- for (let j = 0; j < ids.length; j++) uniqueMap[ids[j]] = true;
- }
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: Object.keys(uniqueMap) }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- let returnedIds = {};
- for (let i = 0; i < allTasks.length; i++) returnedIds[String(allTasks[i].id)] = true;
- let missingByProject = {};
- for (let i = 0; i < projectIds.length; i++) {
- let projId = projectIds[i];
- let taskIds = Object.keys(projectTaskMap[projId]);
- for (let j = 0; j < taskIds.length; j++) {
- if (!returnedIds[taskIds[j]]) {
- if (!missingByProject[projId]) missingByProject[projId] = [];
- missingByProject[projId].push(taskIds[j]);
- }
- }
- }
- let missingProjIds = Object.keys(missingByProject);
- for (let i = 0; i < missingProjIds.length && i < 2; i++) {
- let projId = missingProjIds[i];
- let mFilter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: missingByProject[projId] }], pattern: "1" });
- let mReq = new HttpRequest();
- mReq.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(mFilter)}`);
- mReq.method("GET");
- mReq.connection("zprojects");
- let moreTasks = mReq.execute().asJson().statusMessage.responseText.tasks || [];
- for (let k = 0; k < moreTasks.length; k++) allTasks.push(moreTasks[k]);
- }
- }
- let taskWorkMap = {};
- let taskNameMap = {};
- for (let i = 0; i < allTasks.length; i++) {
- let task = allTasks[i];
- let id = String(task.id);
- taskNameMap[id] = task.name;
- taskWorkMap[id] = {
- totalWork: parseToMinutes(task.owners_and_work.total_work),
- alreadyLogged: parseToMinutes(task.log_hours.total_hours)
- };
- }
- let batchPerTask = {};
- for (let i = 0; i < taskLogs.length; i++) {
- let record = taskLogs[i];
- let taskId = String(record.module_detail.id);
- if (!batchPerTask[taskId]) batchPerTask[taskId] = { totalMinutes: 0, logIds: [] };
- batchPerTask[taskId].totalMinutes += parseToMinutes(record.log_hour);
- batchPerTask[taskId].logIds.push(record.id);
- }
- let batchTaskIds = Object.keys(batchPerTask);
- for (let i = 0; i < batchTaskIds.length; i++) {
- let taskId = batchTaskIds[i];
- let info = taskWorkMap[taskId];
- let batch = batchPerTask[taskId];
- if (!info) continue;
- if (info.totalWork === 0) {
- violations.push({ taskId: taskId, taskName: taskNameMap[taskId], totalWork: "00:00", reason: "No work hours allocated" });
- continue;
- }
- let totalAfterLog = info.alreadyLogged + batch.totalMinutes;
- if (totalAfterLog > info.totalWork) {
- violations.push({ taskId: taskId, taskName: taskNameMap[taskId], totalWork: formatMinutes(info.totalWork), alreadyLogged: formatMinutes(info.alreadyLogged), newBatch: formatMinutes(batch.totalMinutes), reason: "Would exceed work hours" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
अनिर्दिष्ट Task या समस्याओं के लिए समय लॉग को सीमित करें
समय लॉगिंग केवल उन Task या समस्याओं के लिए अनुमति दें जिनके पास कम से कम एक स्वामी निर्दिष्ट है। अनिर्दिष्ट कार्य आइटम्स के विरुद्ध लॉग को अस्वीकार कर दिया जाता है।
- function main() {
- try {
- let url = "https://projects.zoho.com";
- let records = current.record;
- let violations = [];
- let taskLogs = [];
- let projectTaskMap = {};
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let linked = record.module_detail;
- if (!linked || linked.name !== "Task") continue;
- taskLogs.push(record);
- let projId = String(record.project_id);
- if (!projectTaskMap[projId]) projectTaskMap[projId] = {};
- projectTaskMap[projId][linked.id] = true;
- }
- if (taskLogs.length === 0) return;
- let allTasks = [];
- let projectIds = Object.keys(projectTaskMap);
- if (projectIds.length === 1) {
- let projId = projectIds[0];
- let taskIds = Object.keys(projectTaskMap[projId]);
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: taskIds }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- } else {
- let uniqueMap = {};
- for (let i = 0; i < projectIds.length; i++) {
- let ids = Object.keys(projectTaskMap[projectIds[i]]);
- for (let j = 0; j < ids.length; j++) uniqueMap[ids[j]] = true;
- }
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: Object.keys(uniqueMap) }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- let returnedIds = {};
- for (let i = 0; i < allTasks.length; i++) returnedIds[String(allTasks[i].id)] = true;
- let missingByProject = {};
- for (let i = 0; i < projectIds.length; i++) {
- let projId = projectIds[i];
- let taskIds = Object.keys(projectTaskMap[projId]);
- for (let j = 0; j < taskIds.length; j++) {
- if (!returnedIds[taskIds[j]]) {
- if (!missingByProject[projId]) missingByProject[projId] = [];
- missingByProject[projId].push(taskIds[j]);
- }
- }
- }
- let missingProjIds = Object.keys(missingByProject);
- for (let i = 0; i < missingProjIds.length && i < 2; i++) {
- let projId = missingProjIds[i];
- let mFilter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: missingByProject[projId] }], pattern: "1" });
- let mReq = new HttpRequest();
- mReq.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(mFilter)}`);
- mReq.method("GET");
- mReq.connection("zprojects");
- let moreTasks = mReq.execute().asJson().statusMessage.responseText.tasks || [];
- for (let k = 0; k < moreTasks.length; k++) allTasks.push(moreTasks[k]);
- }
- }
- let taskOwnerMap = {};
- for (let i = 0; i < allTasks.length; i++) {
- let task = allTasks[i];
- let owners = task.owners_and_work.owners || [];
- let hasReal = false;
- for (let j = 0; j < owners.length; j++) {
- if (owners[j].zuid && owners[j].zuid !== 0) { hasReal = true; break; }
- }
- taskOwnerMap[String(task.id)] = hasReal;
- }
- for (let i = 0; i < taskLogs.length; i++) {
- let record = taskLogs[i];
- let taskId = String(record.module_detail.id);
- if (taskOwnerMap[taskId] === undefined) continue;
- if (!taskOwnerMap[taskId]) {
- violations.push({ logId: record.id, taskId: taskId, user: record.user ? record.user.name : "Unknown", reason: "Task is unassigned" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
सप्ताहांत समय लॉग को प्रतिबंधित करें
चयनित लॉग तारीख को मान्य करके उपयोगकर्ताओं को शनिवार और रविवार को समय लॉग करने से प्रतिबंधित करें।
- function main() {
- try {
- let records = current.record;
- let violations = [];
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let logDate = record.log_date;
- if (!logDate) continue;
- let parts = logDate.split("-");
- let date = new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2]));
- let day = date.getDay();
- if (day === 0 || day === 6) {
- violations.push({ logId: record.id, logDate: logDate, user: record.user ? record.user.name : "Unknown", day: day === 0 ? "Sunday" : "Saturday", reason: "Cannot log time on weekends" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
छुट्टियों पर समय लॉग को प्रतिबंधित करें
Zoho People से छुट्टी की जानकारी प्राप्त करके और चयनित लॉग तारीख को सत्यापित करके संगठन की छुट्टियों पर समय प्रविष्टियों को अवरुद्ध करें।
- function main() {
- try {
- let peopleUrl = "https://people.zoho.com";
- let records = current.record;
- let violations = [];
- let monthMap = {"Jan":"01","Feb":"02","Mar":"03","Apr":"04","May":"05","Jun":"06","Jul":"07","Aug":"08","Sep":"09","Oct":"10","Nov":"11","Dec":"12"};
- function peopleDateToISO(d) {
- let p = d.split("-");
- if (p.length !== 3) return d;
- return p[2] + "-" + (monthMap[p[1]] || "01") + "-" + (p[0].length === 1 ? "0" + p[0] : p[0]);
- }
- let years = {};
- for (let i = 0; i < records.length; i++) {
- if (records[i].log_date) years[records[i].log_date.substring(0, 4)] = true;
- }
- let holidaySet = {};
- let holidayNames = {};
- let yearKeys = Object.keys(years);
- for (let y = 0; y < yearKeys.length; y++) {
- let year = yearKeys[y];
- let req = new HttpRequest();
- req.url(`${peopleUrl}/people/api/leave/v2/holidays/get?from=01-Jan-${year}&to=31-Dec-${year}`);
- req.method("GET");
- req.connection("zpeople");
- let holidays = req.execute().asJson().statusMessage.responseText.data || [];
- for (let i = 0; i < holidays.length; i++) {
- let isoDate = peopleDateToISO(holidays[i].Date);
- holidaySet[isoDate] = true;
- holidayNames[isoDate] = holidays[i].Name;
- }
- }
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let logDate = record.log_date;
- if (!logDate) continue;
- if (holidaySet[logDate]) {
- violations.push({ logId: record.id, logDate: logDate, user: record.user ? record.user.name : "Unknown", holiday: holidayNames[logDate], reason: logDate + " is a holiday (" + holidayNames[logDate] + ")" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
छुट्टी या समय बंद के दौरान समय लॉग को प्रतिबंधित करें
Zoho People से छुट्टी के रिकॉर्ड का उपयोग करके, उपयोगकर्ताओं को उन दिनों पर समय लॉग करने से प्रतिबंधित करें जब वे अनुमोदित छुट्टी या समय बंद पर होते हैं।
- function main() {
- try {
- let peopleUrl = "https://people.zoho.com";
- let records = current.record;
- let violations = [];
- let monthMap = {"Jan":"01","Feb":"02","Mar":"03","Apr":"04","May":"05","Jun":"06","Jul":"07","Aug":"08","Sep":"09","Oct":"10","Nov":"11","Dec":"12"};
- function peopleDateToISO(d) {
- let p = d.split("-");
- if (p.length !== 3) return d;
- return p[2] + "-" + (monthMap[p[1]] || "01") + "-" + (p[0].length === 1 ? "0" + p[0] : p[0]);
- }
- function isoToPeopleDate(d) {
- let p = d.split("-");
- let m = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
- return p[2] + "-" + m[parseInt(p[1]) - 1] + "-" + p[0];
- }
- let minDate = null;
- let maxDate = null;
- let uniqueUsers = {};
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let logDate = record.log_date;
- if (logDate) {
- if (!minDate || logDate < minDate) minDate = logDate;
- if (!maxDate || logDate > maxDate) maxDate = logDate;
- }
- if (record.user && record.user.zuid) {
- uniqueUsers[String(record.user.zuid)] = true;
- }
- }
- if (!minDate) return;
- let req = new HttpRequest();
- req.url(`${peopleUrl}/api/v2/leavetracker/leaves/records?from=${encodeURIComponent(isoToPeopleDate(minDate))}&to=${encodeURIComponent(isoToPeopleDate(maxDate))}`);
- req.method("GET");
- req.connection("zpeople");
- let leaveRecordsMap = req.execute().asJson().statusMessage.responseText.records || {};
- let leaveIds = Object.keys(leaveRecordsMap);
- let userLeaveDayMap = {};
- for (let i = 0; i < leaveIds.length; i++) {
- let lr = leaveRecordsMap[leaveIds[i]];
- let zuid = String(lr.ZUID);
- if (!uniqueUsers[zuid]) continue;
- let days = lr.Days || {};
- let dayKeys = Object.keys(days);
- for (let d = 0; d < dayKeys.length; d++) {
- let leaveCount = parseFloat(days[dayKeys[d]].LeaveCount) || 0;
- if (leaveCount <= 0) continue;
- let isoDate = peopleDateToISO(dayKeys[d]);
- if (!userLeaveDayMap[zuid]) userLeaveDayMap[zuid] = {};
- userLeaveDayMap[zuid][isoDate] = { leaveType: lr.Leavetype || "", status: lr.ApprovalStatus || "" };
- }
- }
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let logDate = record.log_date;
- if (!logDate) continue;
- let recordZuid = record.user ? String(record.user.zuid) : "";
- if (!recordZuid) continue;
- let userDays = userLeaveDayMap[recordZuid];
- if (!userDays) continue;
- let dayLeave = userDays[logDate];
- if (!dayLeave) continue;
- violations.push({ logId: record.id, logDate: logDate, user: record.user.name, leaveType: dayLeave.leaveType, status: dayLeave.status, reason: "User is on " + dayLeave.leaveType + " (" + dayLeave.status + ")" });
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
केवल Task या Issue के स्वामियों के लिए समय लॉग की अनुमति दें
सुनिश्चित करें कि केवल Task या Issue के स्वामी के रूप में निर्दिष्ट उपयोगकर्ता ही इसके विरुद्ध समय लॉग कर सकें। अनिर्दिष्ट Task और अनधिकृत उपयोगकर्ता को अवरुद्ध किया जाता है।
- function main() {
- try {
- let url = "https://projects.zoho.com";
- let records = current.record;
- let violations = [];
- let taskLogs = [];
- let projectTaskMap = {};
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let linked = record.module_detail;
- if (!linked || linked.name === "general") continue;
- taskLogs.push(record);
- let projId = String(record.project_id);
- if (!projectTaskMap[projId]) projectTaskMap[projId] = {};
- projectTaskMap[projId][linked.id] = true;
- }
- if (taskLogs.length === 0) return;
- let allTasks = [];
- let projectIds = Object.keys(projectTaskMap);
- if (projectIds.length === 1) {
- let projId = projectIds[0];
- let taskIds = Object.keys(projectTaskMap[projId]);
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: taskIds }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- } else {
- let uniqueMap = {};
- for (let i = 0; i < projectIds.length; i++) {
- let ids = Object.keys(projectTaskMap[projectIds[i]]);
- for (let j = 0; j < ids.length; j++) uniqueMap[ids[j]] = true;
- }
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: Object.keys(uniqueMap) }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- let returnedIds = {};
- for (let i = 0; i < allTasks.length; i++) returnedIds[String(allTasks[i].id)] = true;
- let missingByProject = {};
- for (let i = 0; i < projectIds.length; i++) {
- let projId = projectIds[i];
- let taskIds = Object.keys(projectTaskMap[projId]);
- for (let j = 0; j < taskIds.length; j++) {
- if (!returnedIds[taskIds[j]]) {
- if (!missingByProject[projId]) missingByProject[projId] = [];
- missingByProject[projId].push(taskIds[j]);
- }
- }
- }
- let missingProjIds = Object.keys(missingByProject);
- for (let i = 0; i < missingProjIds.length && i < 2; i++) {
- let projId = missingProjIds[i];
- let mFilter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: missingByProject[projId] }], pattern: "1" });
- let mReq = new HttpRequest();
- mReq.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(mFilter)}`);
- mReq.method("GET");
- mReq.connection("zprojects");
- let moreTasks = mReq.execute().asJson().statusMessage.responseText.tasks || [];
- for (let k = 0; k < moreTasks.length; k++) allTasks.push(moreTasks[k]);
- }
- }
- let taskOwnerMap = {};
- for (let i = 0; i < allTasks.length; i++) {
- let task = allTasks[i];
- let owners = task.owners_and_work.owners || [];
- let realZpuids = [];
- for (let j = 0; j < owners.length; j++) {
- if (owners[j].zuid && owners[j].zuid !== 0) realZpuids.push(String(owners[j].zpuid));
- }
- taskOwnerMap[String(task.id)] = realZpuids;
- }
- for (let i = 0; i < taskLogs.length; i++) {
- let record = taskLogs[i];
- let taskId = String(record.module_detail.id);
- let userZpuid = record.user ? String(record.user.id) : String(current.user.id);
- let ownerZpuids = taskOwnerMap[taskId];
- if (!ownerZpuids) continue;
- if (ownerZpuids.length === 0) {
- violations.push({ logId: record.id, taskId: taskId, user: record.user ? record.user.name : "Unknown", reason: "Task अनिर्दिष्ट है" });
- } else if (ownerZpuids.indexOf(userZpuid) === -1) {
- violations.push({ logId: record.id, taskId: taskId, user: record.user ? record.user.name : "Unknown", reason: "उपयोगकर्ता Task के स्वामी नहीं हैं" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
समीक्षा में Tasks के लिए समय लॉग को प्रतिबंधित करें
उपयोगकर्ताओं को उन Tasks के विरुद्ध समय लॉग करने से प्रतिबंधित करें जिनकी अवस्था है समीक्षा में, सुनिश्चित करते हुए कि कार्य केवल सक्रिय निष्पादन अवस्थाओं के दौरान लॉग किया जाता है।
- function main() {
- try {
-
- let url = " https://projects.zoho.com";
- let records = current.record;
- let violations = [];
- let taskLogs = [];
- let projectTaskMap = {};
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let linked = record.module_detail;
- if (!linked || linked.name !== "Task") continue;
- taskLogs.push(record);
- let projId = String(record.project_id);
- if (!projectTaskMap[projId]) projectTaskMap[projId] = {};
- projectTaskMap[projId][linked.id] = true;
- }
- if (taskLogs.length === 0) return;
- let allTasks = [];
- let projectIds = Object.keys(projectTaskMap);
- if (projectIds.length === 1) {
- let projId = projectIds[0];
- let taskIds = Object.keys(projectTaskMap[projId]);
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: taskIds }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- } else {
- let uniqueMap = {};
- for (let i = 0; i < projectIds.length; i++) {
- let ids = Object.keys(projectTaskMap[projectIds[i]]);
- for (let j = 0; j < ids.length; j++) uniqueMap[ids[j]] = true;
- }
- let filter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: Object.keys(uniqueMap) }], pattern: "1" });
- let req = new HttpRequest();
- req.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(filter)}`);
- req.method("GET");
- req.connection("zprojects");
- allTasks = req.execute().asJson().statusMessage.responseText.tasks || [];
- let returnedIds = {};
- for (let i = 0; i < allTasks.length; i++) returnedIds[String(allTasks[i].id)] = true;
- let missingByProject = {};
- for (let i = 0; i < projectIds.length; i++) {
- let projId = projectIds[i];
- let taskIds = Object.keys(projectTaskMap[projId]);
- for (let j = 0; j < taskIds.length; j++) {
- if (!returnedIds[taskIds[j]]) {
- if (!missingByProject[projId]) missingByProject[projId] = [];
- missingByProject[projId].push(taskIds[j]);
- }
- }
- }
- let missingProjIds = Object.keys(missingByProject);
- for (let i = 0; i < missingProjIds.length && i < 2; i++) {
- let projId = missingProjIds[i];
- let mFilter = JSON.stringify({ criteria: [{ field_name: "id", criteria_condition: "contains", value: missingByProject[projId] }], pattern: "1" });
- let mReq = new HttpRequest();
- mReq.url(`${url}/api/v3/portal/${current.org.zohoOrgId}/projects/${projId}/tasks?page=1&per_page=200&filter=${encodeURIComponent(mFilter)}`);
- mReq.method("GET");
- mReq.connection("zprojects");
- let moreTasks = mReq.execute().asJson().statusMessage.responseText.tasks || [];
- for (let k = 0; k < moreTasks.length; k++) allTasks.push(moreTasks[k]);
- }
- }
- let taskStatusMap = {};
- let taskNameMap = {};
- for (let i = 0; i < allTasks.length; i++) {
- let task = allTasks[i];
- let id = String(task.id);
- taskStatusMap[id] = task.status;
- taskNameMap[id] = task.name;
- }
- for (let i = 0; i < taskLogs.length; i++) {
- let record = taskLogs[i];
- let taskId = String(record.module_detail.id);
- let status = taskStatusMap[taskId];
- if (!status) continue;
- if (status.name === 'In Review') {
- violations.push({ logId: record.id, taskId: taskId, taskName: taskNameMap[taskId], status: status.name, reason: "Task is in review" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
सामान्य समय लॉग को प्रतिबंधित करें
उन सामान्य समय लॉग को ब्लॉक करें जो Task या समस्या से जुड़े नहीं हैं, यह सुनिश्चित करते हुए कि हर समय प्रविष्टि किसी कार्य आइटम से जुड़ी है।
- function main() {
- try {
- let records = current.record;
- let violations = [];
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let linked = record.module_detail;
- if (linked && linked.name === "general") {
- violations.push({ logId: record.id, user: record.user ? record.user.name : "Unknown", reason: "General timelogs not allowed. Must link to a Task or Issue." });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
समय लॉग को वर्तमान दिन तक सीमित करें
केवल वर्तमान तारीख के लिए समय लॉग करने की अनुमति दें। स्क्रिप्ट पिछली तारीख और भविष्य की तारीख वाली दोनों समय प्रविष्टियों को ब्लॉक करती है।
- function main() {
- try {
- let records = current.record;
- let violations = [];
- let now = new Date();
- let todayStr = now.getFullYear() + "-" +
- (now.getMonth() + 1 < 10 ? "0" : "") + (now.getMonth() + 1) + "-" +
- (now.getDate() < 10 ? "0" : "") + now.getDate();
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let logDate = record.log_date;
- if (!logDate) continue;
- if (logDate !== todayStr) {
- violations.push({ logId: record.id, logDate: logDate, today: todayStr, user: record.user ? record.user.name : "Unknown", reason: logDate < todayStr ? "Cannot log for past dates" : "Cannot log for future dates" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }
Tasks के लिए समय लॉग को प्रतिबंधित करें
उपयोगकर्ताओं को Tasks के विरुद्ध समय लॉग करने से प्रतिबंधित करें। इसका उपयोग उन परिस्थितियों में किया जा सकता है जहाँ समय लॉगिंग केवल समस्याओं या सामान्य लॉग के लिए अनुमति दी जाती है।
- function main() {
- try {
- let records = current.record;
- let violations = [];
- for (let i = 0; i < records.length; i++) {
- let record = records[i];
- let linked = record.module_detail;
- if (linked && linked.name === "Task") {
- violations.push({ logId: record.id, user: record.user ? record.user.name : "Unknown", reason: "Logging time against Tasks is not allowed" });
- }
- }
- if (violations.length > 0) {
- throw new ScriptError(JSON.stringify({ violations: violations }));
- }
- } catch (err) {
- throw new ScriptError(err);
- }
- }