বাকি আছে (To Do)
চলমান (In Progress)
রিভিউ (Under Review)
সম্পন্ন (Completed)
সকল টাস্ক রেকর্ডস
ওয়েবসাইট আপডেট ও অ্যাসাইনকৃত কাজের তালিকা
| ID | টাস্ক শিরোনাম | ওয়েবসাইট পেজ | ক্যাটাগরি | স্ট্যাটাস | প্রায়োরিটি | অ্যাসাইনি | ভার্সন | ডেডলাইন | অ্যাকশন |
|---|
Changelog
রিয়েলটাইম ডিপ্লয়মেন্ট ট্র্যাকার
ওয়েবসাইট আপডেট ও ভার্সন রিলিজ লগ
আপনার ওয়েবসাইটের প্রতিটি কোড রিলিজ, লাইভ আপডেট ও প্যাচ হিস্ট্রি এখানে সংরক্ষিত থাকে।
ডিপ্লয়মেন্ট হিস্ট্রি টাইমলাইন
৫টি রিলিজ রেকর্ড
সর্বমোট টাস্ক
0
সব ক্যাটাগরি মিলিয়ে
সম্পন্ন হার
0%
চলমান কাজ
0
ইন-প্রগ্রেস ও রিভিউ
লাইভ রিলিজ
0
সফল ডিপ্লয়মেন্ট
ক্যাটাগরি ভিত্তিক টাস্ক বন্টন
ওয়েবসাইট পেজ ভিত্তিক আপডেট (Affected Routes)
টিম মেম্বার ও রোল ভিত্তিক টাস্ক প্রগ্রেস
সিস্টেম অডিট লগ ও অ্যাক্টিভিটি ট্র্যাকার
ইউজার লগইন, স্ট্যাটাস পরিবর্তন, কনফিগ আপডেট ও রিলিজ ডিপ্লয়মেন্টের রেকর্ড
| Log ID | সময়কাল (Timestamp) | ইউজার ও রোল | অ্যাকশন টাইপ | টার্গেট আইটেম | বিস্তারিত বিবরণ (Details Log) | সিভিয়ারিটি |
|---|
টিম ডিরেক্টরি ও রোল ম্যানেজমেন্ট
সিস্টেমের অনুমোদিত ইউজার, ইমেইল, রোল পারমিশন এবং অ্যাকাউন্ট স্ট্যাটাস
| User ID | নাম (Full Name) | ইমেইল (Login Email) | রোল (Role) | ডিপার্টমেন্ট | স্ট্যাটাস | সর্বশেষ লগইন | অ্যাকশন |
|---|
রোল ভিত্তিক অ্যাক্সেস পারমিশন ম্যাট্রিক্স (RBAC Policy)
| সিস্টেম ফিচার / অ্যাকশন | Admin | Developer | QA | Viewer |
|---|---|---|---|---|
| কানবান বোর্ড, টাস্ক তালিকা, অ্যানালিটিক্স ও CSV এক্সপোর্ট | ✓ | ✓ | ✓ | ✓ |
| নতুন টাস্ক তৈরি, এডিট ও কানবান স্ট্যাটাস পরিবর্তন | ✓ | ✓ | ✓ (QA/Review) | ✕ (Read-Only) |
| ওয়েবসাইট রিলিজ আপডেট লগ প্রকাশ ও অডিট লগ ভিউ | ✓ | ✓ | ✓ | ✕ |
| টাস্ক মুছে ফেলা (Delete) ও রিলিজ রেকর্ড ডিলিট | ✓ | ✕ | ✕ | ✕ |
| ইউজার ম্যানেজমেন্ট, সরাসরি শিট ভিউ ও কনফিগারেশন | ✓ | ✕ | ✕ | ✕ |
ক্লাউড স্প্রেডশিট ডাটাবেস সংযোগ
Admin Verifiedসিস্টেমের সকল টাস্ক, রিলিজ লগ, অডিট রেকর্ড ও ইউজার ডেটা এনক্রিপ্টেড ক্লাউড শিটের সাথে সিঙ্ককৃত।
Google Apps Script Web App URL সংযোগ
ক্লাউড ডাটাবেসে নতুন টাস্ক বা আপডেট দ্বিমুখী লাইভ সেভ করার জন্য আপনার Apps Script Web App URL এখানে যুক্ত করুন। (শুধুমাত্র Admin পরিবর্তন করতে পারবেন)
Google Apps Script ইন্টিগ্রেশন কোড (Admin Only)
// Google Apps Script (Code.gs) for WebTask Manager — Complete Cloud Sync API
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s1 = ss.getSheets()[0];
var s2 = ss.getSheets()[1];
var s3 = ss.getSheets()[2];
var s4 = ss.getSheets()[3];
return ContentService.createTextOutput(JSON.stringify({
status: "success",
tasks: formatRows(s1 ? s1.getDataRange().getValues() : []),
updates: formatRows(s2 ? s2.getDataRange().getValues() : []),
auditLogs: formatRows(s3 ? s3.getDataRange().getValues() : []),
users: formatRows(s4 ? s4.getDataRange().getValues() : [])
})).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
try {
var params = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var nowStr = Utilities.formatDate(new Date(), "GMT+6", "yyyy-MM-dd HH:mm:ss");
var shortNow = Utilities.formatDate(new Date(), "GMT+6", "yyyy-MM-dd HH:mm");
if (params.type === "ADD_TASK" && sheets[0]) {
sheets[0].appendRow([
params.task.id, params.task.title, params.task.page, params.task.category,
params.task.status, params.task.priority, params.task.assignedTo,
params.task.version, params.task.dueDate, shortNow, params.task.notes
]);
} else if (params.type === "UPDATE_TASK" && sheets[0]) {
var t = params.task;
updateRowById(sheets[0], 0, t.id, [
t.id, t.title, t.page, t.category, t.status, t.priority,
t.assignedTo, t.version, t.dueDate, shortNow, t.notes
]);
} else if (params.type === "DELETE_TASK" && sheets[0]) {
deleteRowById(sheets[0], 0, params.taskId);
} else if (params.type === "ADD_UPDATE" && sheets[1]) {
sheets[1].appendRow([
params.update.id, params.update.version, params.update.title,
params.update.page, params.update.date, params.update.status, params.update.summary
]);
} else if (params.type === "DELETE_UPDATE" && sheets[1]) {
deleteRowById(sheets[1], 0, params.updateId);
} else if (params.type === "ADD_AUDIT_LOG" && sheets[2]) {
var a = params.audit;
sheets[2].appendRow([
a.id, a.timestamp || nowStr, a.userName, a.userRole, a.actionType, a.targetItem, a.details, a.severity || "Low"
]);
} else if (params.type === "ADD_USER" && sheets[3]) {
var u = params.user;
sheets[3].appendRow([
u.id, u.name, u.email, u.password, u.role, u.department, u.status || "Active", u.lastLogin || "-"
]);
} else if (params.type === "UPDATE_USER" && sheets[3]) {
var u = params.user;
updateRowById(sheets[3], 0, u.id, [
u.id, u.name, u.email, u.password, u.role, u.department, u.status || "Active", u.lastLogin || shortNow
]);
} else if (params.type === "DELETE_USER" && sheets[3]) {
deleteRowById(sheets[3], 0, params.userId);
}
return ContentService.createTextOutput(JSON.stringify({status: "success"})).setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({status: "error", message: err.toString()})).setMimeType(ContentService.MimeType.JSON);
}
}
function updateRowById(sheet, colIdx, id, rowVals) {
if (!sheet) return;
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][colIdx]) === String(id)) {
sheet.getRange(i + 1, 1, 1, rowVals.length).setValues([rowVals]);
return;
}
}
}
function deleteRowById(sheet, colIdx, id) {
if (!sheet) return;
var data = sheet.getDataRange().getValues();
for (var i = data.length - 1; i >= 1; i--) {
if (String(data[i][colIdx]) === String(id)) {
sheet.deleteRow(i + 1);
return;
}
}
}
function formatRows(data) {
if (!data || data.length <= 1) return [];
var headers = data[0], rows = [];
for (var i = 1; i < data.length; i++) {
var item = {};
for (var j = 0; j < headers.length; j++) item[headers[j]] = data[i][j];
rows.push(item);
}
return rows;
}