الأحد، 12 يوليو 2026

الرواتب

ح
الرواتب والمسيرات

إنشاء الرواتب ومراجعتها واعتمادها من صفحة واحدة.

أنشئ مسير الرواتب كمسودة، أرسله للمراجعة، ثم انتقل به إلى الاعتماد قبل الصرف.

صافي رواتب يوليو438,250 ر.س
موظفون داخل الكشف76 موظف
بانتظار الاعتماد0 مسير
خصومات ومكافآت31 بند

إدارة الرواتب

سجل كشوف الرواتب الشهرية مع حالة كل كشف والإجراءات المتاحة عليه.

الشهر مقفل مالياً بعد إنشاء المسير

تم إنشاء مسير يوليو 2026؛ لذلك لن يقبل النظام اعتماد مكافأة أو خصم أو جزاء أو استقطاع جديد لهذا الشهر. لإضافة بند مالي جديد: احذف المسير أولاً، اعتمد البند، ثم أنشئ المسير من جديد.

مسير الرواتبالفترةالموظفونالإجماليالخصوماتالسلفالصافيالحالةالإجراءات
يول
مسودة مسير رواتب يوليو 2026محفوظة ولم تُرسل للمراجعة
2026-07-01 إلى 2026-07-3176472,800 ر.س14,350 ر.س20,200 ر.س438,250 ر.سمسودة
يون
مسير رواتب يونيو 2026تم الصرف عبر أوامر الصرف
2026-06-01 إلى 2026-06-3074461,500 ر.س10,900 ر.س18,000 ر.س432,600 ر.سمصروف
ماي
مسير رواتب مايو 2026مراجعة محفوظة في الأرشيف
2026-05-01 إلى 2026-05-3172448,200 ر.س8,700 ر.س14,500 ر.س425,000 ر.سمعتمد

مراجعة الرواتب

راجع المسير كاملاً باعتباره لقطة مالية مغلقة للشهر، ثم اعتمد المراجعة أو ارفضها بسبب واضح.

المرحلة 2 من 3
لا توجد مسيرات قيد المراجعة حالياً. أرسل مسودة من صفحة إدارة الرواتب لتظهر هنا.

اعتماد الرواتب

اعتمد المسير الشهري المغلق أو ارفضه بسبب موثق. لا توجد اعتمادات مالية منفصلة بعد إنشاء المسير.

لا توجد مسيرات بانتظار الاعتماد حالياً. يعتمد النظام المسير الشهري كاملاً ولا ينشئ طلب فروقات مستقلاً بعد إقفاله.

سجل المسيرات المرفوضة

أرشيف مرجعي للمسيرات المرفوضة والمسودات المحذوفة مع حفظ السبب والتاريخ. هذه السجلات لا تقفل الشهر مالياً.

أرشيف محفوظ
المسيرات المرفوضة0
المسودات المحذوفة0
إجمالي السجلات المؤرشفة0
المرجعمسير الرواتبالفترةالموظفونالصافينوع الأرشفةالسببتاريخ الإجراءالمعاينة والتصدير
\n`; const blob=new Blob(["\ufeff",html],{type:"application/vnd.ms-excel;charset=utf-8"}),url=URL.createObjectURL(blob),link=document.createElement("a"); link.href=url;link.download=`payroll-draft-${month}.xls`;link.click();setTimeout(()=>URL.revokeObjectURL(url),1000);showToast("تم تصدير مسودة المسير بصيغة Excel."); }; const exportPayrollPdf = requestedMonth => { const month=(typeof requestedMonth==="string" && requestedMonth) || payrollModal?.querySelector("[data-payroll-month]")?.value || "2026-07"; const win=window.open("","_blank","width=1200,height=800");if(!win)return showToast("اسمح بالنوافذ المنبثقة لإكمال تصدير PDF."); win.document.write(`مسودة مسير الرواتب

مسودة مسير الرواتب

${payrollMonthLabel(month)}

دوام برو
${payrollDraftTableHtml()}`);win.document.close();setTimeout(()=>{win.focus();win.print()},350); }; const savePayrollDraft = () => { const month=payrollModal?.querySelector("[data-payroll-month]")?.value || "2026-07",label=payrollMonthLabel(month),totals=window.payrollDemoTotals||{}; const tbody=document.querySelector("[data-payroll-runs]"); setMonthSuppressed(month,false); tbody?.querySelectorAll('tr[data-draft-run="'+month+'"], tr[data-run-month="'+month+'"]').forEach(row=>row.remove()); tbody?.insertAdjacentHTML("afterbegin",`
${label.slice(0,3)}
مسودة مسير رواتب ${label}محفوظة ولم تُرسل للمراجعة
${month}-01 إلى نهاية الشهر${demoPayrollEmployees.length}${formatMoney((totals.gross||0)+(totals.rewards||0)+(totals.overtime||0))} ر.س${formatMoney(totals.deductions||0)} ر.س${formatMoney(totals.advances||0)} ر.س${formatMoney(totals.net||0)} ر.سمسودة
`); payrollWizardState.draftSaved=true;payrollModal.hidden=true;syncPayrollLocks();showTab("management");showToast("تم حفظ المسير كمسودة، وأُقفل الشهر مالياً حتى حذف المسير أو اكتمال اعتماده.");window.lucide?.createIcons(); }; const renderPayrollInlineDetail = (employeeId, shouldScroll = false) => { const detail = employeePayrollDetails[employeeId] || employeePayrollDetails["EMP-0001"] || employeePayrollDetails["EMP-0012"]; if (!detail) return; const map = { "[data-payroll-detail-name]": detail.name, "[data-payroll-detail-subtitle]": detail.subtitle, "[data-payroll-detail-net]": detail.net, "[data-payroll-detail-gosi]": detail.gosi, "[data-payroll-detail-absence]": detail.absence, "[data-payroll-detail-late]": detail.late, "[data-payroll-detail-other]": detail.other, "[data-payroll-detail-rewards]": detail.rewards }; Object.entries(map).forEach(([selector, value]) => { const node = payrollModal?.querySelector(selector); if (node) node.textContent = value; }); const card = payrollModal?.querySelector("[data-payroll-detail-card]"); if (card) { card.dataset.currentEmployee = employeeId; resetDeductionPanel(card); } const currentButton = payrollModal?.querySelector(`[data-payroll-employee-detail="${employeeId}"]`); if (currentButton) markSelectedRow(currentButton); if (shouldScroll) { const detailCard = payrollModal?.querySelector("[data-payroll-detail-card]"); if (detailCard) { detailCard.scrollIntoView({block:"start",behavior:"smooth"}); detailCard.classList.remove("attention"); void detailCard.offsetWidth; detailCard.classList.add("attention"); showToast("تم عرض تفاصيل راتب الموظف أسفل القائمة."); } } }; const renderEmployeeDetail = (employeeId, shouldScroll = false) => { const detail = employeePayrollDetails[employeeId] || employeePayrollDetails["EMP-0012"]; document.querySelector("[data-detail-name]").textContent = detail.name; document.querySelector("[data-detail-subtitle]").textContent = detail.subtitle; document.querySelector("[data-detail-net]").textContent = detail.net; document.querySelector("[data-detail-gosi]").textContent = detail.gosi; document.querySelector("[data-detail-absence]").textContent = detail.absence; document.querySelector("[data-detail-late]").textContent = detail.late; document.querySelector("[data-detail-other]").textContent = detail.other; document.querySelector("[data-detail-rewards]").textContent = detail.rewards; const card = document.querySelector("[data-detail-card]"); if (card) { card.dataset.currentEmployee = employeeId; resetDeductionPanel(card); } const currentButton = previewModal?.querySelector(`[data-employee-detail="${employeeId}"]`); if (currentButton) markSelectedRow(currentButton); if (shouldScroll && !previewModal?.hidden && card) { card.scrollIntoView({block:"start",behavior:"smooth"}); card.classList.remove("attention"); void card.offsetWidth; card.classList.add("attention"); showToast("تم عرض تفاصيل راتب الموظف أسفل جدول المعاينة."); } const select = document.querySelector("[data-ledger-employee]"); if (select) select.value = employeeId; filterLedger(); }; const filterLedger = () => { const employee = document.querySelector("[data-ledger-employee]")?.value || "all"; const type = document.querySelector("[data-ledger-type]")?.value || "all"; const query = (document.querySelector("[data-ledger-search]")?.value || "").trim(); document.querySelectorAll("[data-ledger-table] tbody tr").forEach(row => { const employeeMatch = employee === "all" || row.dataset.employee === employee; const typeMatch = type === "all" || row.dataset.type === type; const queryMatch = !query || row.textContent.includes(query); row.hidden = !(employeeMatch && typeMatch && queryMatch); }); }; const escapeHtml = value => String(value ?? "").replace(/[&<>"\']/g, char => ({"&":"&","<":"<",">":">","\"":""","\'":"'"}[char])); const runMonthFromRow = row => row?.dataset.runMonth || row?.dataset.draftRun || row?.querySelector("[data-export-month]")?.dataset.exportMonth || "2026-07"; const renderRunStage = (row, stage) => { if(!row) return; const month=runMonthFromRow(row); row.dataset.runMonth=month; const status=row.querySelector("[data-run-status]"); const caption=row.querySelector("[data-run-caption]"); const actions=row.querySelector("[data-run-actions]"); const preview=''; const pdf=''; const xls=''; if(stage==="draft"){ row.dataset.draftRun=month; if(status)status.innerHTML='مسودة'; if(caption)caption.textContent="محفوظة ولم تُرسل للمراجعة"; if(actions)actions.innerHTML=preview+''+pdf+xls+''; }else if(stage==="review"){ delete row.dataset.draftRun; if(status)status.innerHTML='قيد المراجعة'; if(caption)caption.textContent="أرسلت للمراجعة ولم تبدأ مرحلة الاعتماد"; if(actions)actions.innerHTML=preview+''+pdf+xls; }else if(stage==="approval"){ delete row.dataset.draftRun; delete row.dataset.rejectedRun; if(status)status.innerHTML='بانتظار الاعتماد'; if(caption)caption.textContent="اكتملت المراجعة وأرسل للاعتماد"; if(actions)actions.innerHTML=preview+''+pdf+xls; }else if(stage==="rejected"){ delete row.dataset.draftRun; row.dataset.rejectedRun=month; if(status)status.innerHTML='مرفوض مؤرشف'; if(caption)caption.innerHTML='نُقل إلى سجل المسيرات المرفوضة وفُتح الشهر مالياً.سبب الرفض: '+escapeHtml(row.dataset.rejectionReason || "غير محدد")+''; if(actions)actions.innerHTML=preview+pdf+xls; }else if(stage==="approved"){ delete row.dataset.draftRun; delete row.dataset.rejectedRun; if(status)status.innerHTML='معتمد'; if(caption)caption.textContent="اكتملت مراحل الإنشاء والمراجعة والاعتماد"; if(actions)actions.innerHTML=preview+pdf+xls; } syncPayrollLocks(); window.lucide?.createIcons(); }; const submitRunToReview = row => { renderRunStage(row,"review"); const reviewCard=document.querySelector("[data-review-card]"); const reviewEmpty=document.querySelector("[data-review-empty]"); if(reviewCard)reviewCard.hidden=false; if(reviewEmpty)reviewEmpty.hidden=true; showTab("review"); showToast("تم إرسال المسير للمراجعة. لن يظهر في الاعتماد قبل إتمام المراجعة."); }; const returnRunToDraft = row => { renderRunStage(row,"draft"); const reviewCard=document.querySelector("[data-review-card]"); const reviewEmpty=document.querySelector("[data-review-empty]"); if(reviewCard)reviewCard.hidden=true; if(reviewEmpty)reviewEmpty.hidden=false; showTab("management"); showToast("أعيد المسير إلى المسودة وأصبح قابلاً للتعديل أو الحذف."); }; const submitRunToApproval = row => { renderRunStage(row,"approval"); const reviewCard=document.querySelector("[data-review-card]"); const reviewEmpty=document.querySelector("[data-review-empty]"); const approvalCard=document.querySelector("[data-approval-card]"); if(reviewCard)reviewCard.hidden=true; if(reviewEmpty)reviewEmpty.hidden=false; if(approvalCard)approvalCard.hidden=false; showTab("approval"); showToast("اكتملت المراجعة وتم إرسال المسير إلى مرحلة الاعتماد."); }; const PAYROLL_LOCK_KEY="dwam.payroll.locked-months.v1"; const PAYROLL_ARCHIVE_KEY="dwam.payroll.archived-runs.v2"; const PAYROLL_SUPPRESSED_KEY="dwam.payroll.suppressed-months.v2"; const readStoredArray=key=>{try{const value=JSON.parse(localStorage.getItem(key)||"[]");return Array.isArray(value)?value:[]}catch(error){return []}}; const writeStoredArray=(key,value)=>localStorage.setItem(key,JSON.stringify(value)); const suppressedPayrollMonths=()=>readStoredArray(PAYROLL_SUPPRESSED_KEY); const setMonthSuppressed=(month,suppressed)=>{ const months=new Set(suppressedPayrollMonths()); suppressed?months.add(month):months.delete(month); writeStoredArray(PAYROLL_SUPPRESSED_KEY,[...months]); }; const archivedPayrollRuns=()=>readStoredArray(PAYROLL_ARCHIVE_KEY); const renderArchivedPayrollRuns=()=>{ const records=archivedPayrollRuns().sort((a,b)=>String(b.createdAt).localeCompare(String(a.createdAt))); const tbody=document.querySelector("[data-archived-payroll-runs]"); if(tbody)tbody.innerHTML=records.length?records.map(record=>{ const action=record.type==="rejected"?'مرفوض':'مسودة محذوفة'; const timestamp=new Date(record.createdAt).toLocaleString("ar-SA",{calendar:"gregory",dateStyle:"medium",timeStyle:"short"}); return ''+escapeHtml(record.reference)+'
'+escapeHtml((record.monthLabel||record.month).slice(0,3))+'
'+escapeHtml(record.name)+'سجل مرجعي غير نشط مالياً
'+escapeHtml(record.period)+''+escapeHtml(record.employees)+''+escapeHtml(record.net)+''+action+''+escapeHtml(record.reason)+''+escapeHtml(timestamp)+'
'; }).join(""):'لا توجد مسيرات مرفوضة أو مسودات محذوفة حتى الآن.'; const rejected=records.filter(record=>record.type==="rejected").length; const deleted=records.filter(record=>record.type==="deleted-draft").length; const rejectedOutput=document.querySelector("[data-archive-rejected-count]"); const deletedOutput=document.querySelector("[data-archive-deleted-count]"); const totalOutput=document.querySelector("[data-archive-total-count]"); if(rejectedOutput)rejectedOutput.textContent=rejected; if(deletedOutput)deletedOutput.textContent=deleted; if(totalOutput)totalOutput.textContent=records.length; window.lucide?.createIcons(); }; const archivePayrollRun=(row,type,reason)=>{ const month=runMonthFromRow(row); const cells=[...row.cells]; const records=archivedPayrollRuns(); records.push({ reference:(type==="rejected"?"REJ-":"DEL-")+Date.now(), type, month, monthLabel:monthArabicLabel(month), name:row.querySelector(".run-cell strong")?.textContent.trim() || "مسير رواتب "+monthArabicLabel(month), period:cells[1]?.textContent.trim() || month+"-01 إلى نهاية الشهر", employees:cells[2]?.textContent.trim() || "-", gross:cells[3]?.textContent.trim() || "-", deductions:cells[4]?.textContent.trim() || "-", advances:cells[5]?.textContent.trim() || "-", net:cells[6]?.textContent.trim() || "-", reason:reason || "لم يحدد السبب", createdAt:new Date().toISOString() }); writeStoredArray(PAYROLL_ARCHIVE_KEY,records); setMonthSuppressed(month,true); renderArchivedPayrollRuns(); return month; }; const restoreArchivedPayrollState=()=>{ const suppressed=new Set(suppressedPayrollMonths()); document.querySelectorAll("[data-payroll-runs] tr").forEach(row=>{if(suppressed.has(runMonthFromRow(row)))row.remove()}); renderArchivedPayrollRuns(); }; const rejectionModal=document.querySelector("[data-rejection-modal]"); const monthArabicLabel=month => ({"2026-05":"مايو 2026","2026-06":"يونيو 2026","2026-07":"يوليو 2026","2026-08":"أغسطس 2026"}[month] || month); const syncPayrollLocks=()=>{ const months=[...document.querySelectorAll("[data-payroll-runs] tr")].map(runMonthFromRow).filter(Boolean); localStorage.setItem(PAYROLL_LOCK_KEY,JSON.stringify([...new Set(months)])); const banner=document.querySelector("[data-month-lock-banner]"); const julyLocked=months.includes("2026-07"); if(banner)banner.hidden=!julyLocked; const pendingCount=[...document.querySelectorAll("[data-run-status]")].filter(node=>node.textContent.includes("بانتظار الاعتماد")).length; const pendingOutput=document.querySelector("[data-pending-payroll-count]"); if(pendingOutput)pendingOutput.textContent=pendingCount+" "+(pendingCount===1?"مسير":"مسيرات"); }; const currentWorkflowRow=()=>document.querySelector('[data-payroll-runs] tr[data-run-month="2026-07"], [data-payroll-runs] tr[data-draft-run="2026-07"], [data-payroll-runs] tr[data-rejected-run="2026-07"]'); const openRejectionModal=stage=>{ rejectionModal.dataset.stage=stage; rejectionModal.querySelector("[data-rejection-reason]").value=""; rejectionModal.querySelector("[data-rejection-error]").hidden=true; rejectionModal.hidden=false; setTimeout(()=>rejectionModal.querySelector("[data-rejection-reason]")?.focus(),0); }; const closeRejectionModal=()=>{rejectionModal.hidden=true}; const rejectCurrentPayroll=()=>{ const reason=rejectionModal.querySelector("[data-rejection-reason]").value.trim(); const error=rejectionModal.querySelector("[data-rejection-error]"); if(!reason){error.hidden=false;rejectionModal.querySelector("[data-rejection-reason]").focus();return} const row=currentWorkflowRow(); if(!row)return showToast("تعذر العثور على المسير المطلوب."); row.dataset.rejectionReason=reason; const month=archivePayrollRun(row,"rejected",reason); row.remove(); syncPayrollLocks(); document.querySelector("[data-review-card]").hidden=true; document.querySelector("[data-review-empty]").hidden=false; document.querySelector("[data-approval-card]").hidden=true; document.querySelector("[data-approval-empty]").hidden=false; closeRejectionModal(); showTab("rejected-log"); showToast("تم رفض المسير وأرشفته مع السبب، وفُتح "+monthArabicLabel(month)+" لإضافة البنود المالية وإنشاء مسير جديد."); }; const approveCurrentPayroll=()=>{ const row=currentWorkflowRow(); if(!row)return showToast("تعذر العثور على المسير المطلوب."); renderRunStage(row,"approved"); document.querySelector("[data-approval-card]").hidden=true; document.querySelector("[data-approval-empty]").hidden=false; showTab("management"); showToast("تم اعتماد مسير الرواتب كاملاً. لا توجد فروقات مالية مستقلة بعد الإقفال."); }; document.addEventListener("click", event => { const tab = event.target.closest("[data-payroll-tab]")?.dataset.payrollTab || event.target.closest("[data-tab-target]")?.dataset.tabTarget; if (tab) showTab(tab); if (event.target.closest("[data-open-payroll]")) { payrollModal.hidden = false; resetPayrollWizard(); } if (event.target.closest("[data-close-modal]")) payrollModal.hidden = true; if (event.target.closest("[data-payroll-next]")) advancePayrollWizard(); if (event.target.closest("[data-payroll-prev]") && payrollWizardState.index>0) setPayrollWizardStep(payrollWizardSteps[payrollWizardState.index-1]); const checkButton=event.target.closest("[data-run-payroll-check]"); if(checkButton)runPayrollCheck(checkButton.dataset.runPayrollCheck); const payrollDetail = event.target.closest("[data-payroll-employee-detail]"); if (payrollDetail) { markSelectedRow(payrollDetail); renderPayrollInlineDetail(payrollDetail.dataset.payrollEmployeeDetail); } const previewTrigger = event.target.closest("[data-preview-run]"); if (previewTrigger) { previewModal.hidden = false; renderEmployeeDetail(previewTrigger.dataset.employeeFocus || "EMP-0012"); } const employeeDetail = event.target.closest("[data-employee-detail]"); if (employeeDetail) { markSelectedRow(employeeDetail); renderEmployeeDetail(employeeDetail.dataset.employeeDetail); } const deductionCard = event.target.closest("[data-deduction-card]"); if (deductionCard) showDeductionDetails(deductionCard); const backToEmployees = event.target.closest("[data-back-to-employees]"); if (backToEmployees) { const layer = backToEmployees.closest("[data-payroll-modal], [data-preview-modal]"); const listPane = layer?.querySelector(".employee-list-pane"); listPane?.scrollIntoView({block:"nearest",behavior:"smooth"}); listPane?.querySelector("[data-payroll-employee-detail], [data-employee-detail]")?.focus(); } if (event.target.closest("[data-close-preview]")) { previewModal.hidden = true; showTab("management"); document.querySelector('[data-panel="management"]')?.scrollIntoView({block:"start",behavior:"smooth"}); } const toast = event.target.closest("[data-toast]")?.dataset.toast; if (toast) showToast(toast); if(event.target.closest("[data-save-payroll-draft]"))savePayrollDraft(); const pdfExport=event.target.closest("[data-payroll-export-pdf]"); if(pdfExport)exportPayrollPdf(pdfExport.dataset.exportMonth); const excelExport=event.target.closest("[data-payroll-export-excel]"); if(excelExport)exportPayrollExcel(excelExport.dataset.exportMonth); const deleteDraft=event.target.closest("[data-delete-draft]"); if(deleteDraft){const row=deleteDraft.closest("[data-draft-run]");if(row && confirm("حذف مسودة مسير الرواتب؟ ستُحفظ نسخة مرجعية في سجل المسيرات المرفوضة ويُفتح الشهر للبنود المالية.")){const month=archivePayrollRun(row,"deleted-draft","حذف منشئ المسير المسودة قبل إرسالها للمراجعة.");row.remove();syncPayrollLocks();showTab("rejected-log");showToast("تمت أرشفة المسودة المحذوفة وفتح "+monthArabicLabel(month)+" للبنود المالية.")}} const reviewTrigger=event.target.closest("[data-submit-review]"); if(reviewTrigger)submitRunToReview(reviewTrigger.closest("tr")); if(event.target.closest("[data-return-draft]")){ const row=document.querySelector('[data-payroll-runs] tr[data-run-month="2026-07"], [data-payroll-runs] tr[data-draft-run="2026-07"]'); returnRunToDraft(row); } if(event.target.closest("[data-submit-approval]")){ const row=currentWorkflowRow(); submitRunToApproval(row); } const rejectButton=event.target.closest("[data-reject-payroll]"); if(rejectButton)openRejectionModal(rejectButton.dataset.rejectPayroll); if(event.target.closest("[data-close-rejection]"))closeRejectionModal(); if(event.target.closest("[data-confirm-rejection]"))rejectCurrentPayroll(); if(event.target.closest("[data-approve-payroll]"))approveCurrentPayroll(); if (event.target.closest("[data-create-payroll]")) { const month=payrollModal?.querySelector("[data-payroll-month]")?.value || "2026-07"; let row=document.querySelector('[data-payroll-runs] tr[data-draft-run="'+month+'"], [data-payroll-runs] tr[data-run-month="'+month+'"]'); payrollModal.hidden = true; if(!row){savePayrollDraft();row=document.querySelector('[data-payroll-runs] tr[data-draft-run="'+month+'"]')} submitRunToReview(row); } }); document.addEventListener("input", event => { if (event.target.matches("[data-ledger-search]")) filterLedger(); }); document.addEventListener("change", event => { if (event.target.matches("[data-ledger-employee], [data-ledger-type]")) filterLedger(); if (event.target.matches("[data-payroll-month], [data-payroll-branch], [data-payroll-department], [data-payroll-kind]")) { payrollWizardState.checks.clear(); payrollModal?.querySelectorAll("[data-check-result]").forEach(node=>{node.hidden=true;node.innerHTML=""}); payrollModal?.querySelectorAll("[data-step-indicator]").forEach((indicator,index)=>indicator.classList.toggle("done",index===0)); const label=payrollModal?.querySelector("[data-draft-month-label]"); if(label)label.textContent=payrollMonthLabel(payrollModal?.querySelector("[data-payroll-month]")?.value); showToast("تم تحديث نطاق المسير، ويجب إعادة فحص جميع البنود لهذا النطاق."); } }); document.querySelector("[data-reset-ledger]")?.addEventListener("click", () => { document.querySelector("[data-ledger-employee]").value = "all"; document.querySelector("[data-ledger-type]").value = "all"; document.querySelector("[data-ledger-search]").value = ""; filterLedger(); }); document.addEventListener("keydown", event => { if (event.key === "Escape") { payrollModal.hidden = true; previewModal.hidden = true; rejectionModal.hidden = true; } }); restoreArchivedPayrollState(); syncPayrollLocks(); if (location.hash === "#approval") showTab("approval"); if (location.hash === "#rejected-log") showTab("rejected-log"); window.lucide?.createIcons();