‹ Operations Portal
Horizon Hospitality Management · Controllers' Office

Housekeeping Payroll Audit Console

Work the weekly submission through every SOP checkpoint, validate productivity against the hourly minimum, log discrepancies in approved format, and generate the submission email — then assign final status.

SOP CHECKPOINTS
0%
01
Verify Submission Package
Step 1
02
Room Accountability Review
Step 2
03
Housekeeping Report Validation
Step 3
04
Weekly Assignment Validation
Step 4
06
Punch History Validation
Step 6
09
Correction Review
Step 9
2·3
Room-Level Service Ledger
Who · What Room · What Service

Attribute every room to a housekeeper and a service type. This is the pay record: it drives each housekeeper's credited rooms and productivity, and auto-flags duplicates, DND conflicts, and zero-DND days — naming who claimed each room.

Add rooms

Housekeeper names autofill from the roster in Productivity below. One room per record — paste a whole assignment at once.

Ledger

DateHousekeeperRoomService
No rooms attributed yet. Use “Add rooms” above.

By Housekeeper

HousekeeperDepartureStayoverRefreshDNDOOOCreditedHrsRms/HrFlag
No housekeepers in ledger.

By Day

DateOccupiedCredited cleanedDNDOOOFlags
No dated records yet.
07
Productivity Validation
Rooms ÷ Hours
Rooms Sold (W.E.)
Rooms Cleaned (W.E.)

HHMI Housekeepers

Rooms cleaned
Hours worked
Rooms / hour

Temp / Agency

Rooms cleaned
Hours worked
Rooms / hour

Housekeeper Roster — enter each housekeeper & their hours; rooms come from the Service Ledger above

HousekeeperPay typeHoursRooms (ledger)Rms/hrFlag
No housekeepers added.

Rooms and Rms/hr are pulled from the Service Ledger by name — attribute rooms there. Per SOP 2025: HHMI hourly housekeepers must clean a minimum of 2 rooms/hour; the minimum does not apply to agency staff (paid per contract).

05
Staffing Agencies Used
Contractor Report

Select every agency appearing on this week's Contractor Report. Agency contact & invoicing is handled by the Controllers' Office only.

⚠ New Agency Flagged A new agency this week requires: contract, rate information, and contact information before payroll can be released. Final status should be set to "Missing Contract / Rate" until received.
08
Discrepancy Log
Approved Format

Logged in SOP format: MM/DD/YYYY – [issue]. Please confirm which is correct.

No discrepancies logged.

10
Final Status
Assign One
Complete – No Agency
Ready to Send to Agency
Query – Waiting on GM
Missing Reports
Missing Contract / Rate
Correction Review Required
Late Submission
Copied to clipboard
`}; } function doPrint(){ if(!window._generated){ generate(); } // ensure there is content to print // Open the clean report in a new window and print it — works on downloaded files and most browsers const {html}=buildReportHTML(); let w=null; try{ w=window.open('','_blank'); }catch(e){ w=null; } if(w && w.document){ w.document.open(); w.document.write(html); w.document.close(); w.focus(); setTimeout(()=>{ try{w.print();}catch(e){} },350); return; } // Popups/print blocked (e.g. sandboxed preview): try native print, else download the report try{ window.print(); } catch(e){ downloadReport(); showToast('Print blocked here — report downloaded; open it to print'); } } function downloadReport(){ if(!window._generated){ generate(); } const {prop,we,html}=buildReportHTML(); try{ const blob=new Blob([html],{type:'text/html'}); const a=document.createElement('a');a.href=URL.createObjectURL(blob); a.download=`HHMI_HSKP_Audit_${prop.replace(/[^\w]/g,'_')}_${we}.html`; document.body.appendChild(a); a.click(); a.remove(); showToast('Report downloaded'); }catch(e){ showToast('Download blocked in this view'); } } function resetAll(){ if(!confirm('Clear all entries on this audit?')) return; // Clear without reloading the page (reload is blocked in sandboxed views) document.querySelectorAll('input[type=text],input[type=date],input[type=number],textarea').forEach(el=>el.value=''); document.querySelectorAll('select').forEach(s=>s.selectedIndex=0); document.querySelectorAll('input[type=checkbox]').forEach(c=>c.checked=false); document.querySelectorAll('.agency-chip.sel').forEach(c=>c.classList.remove('sel')); document.querySelectorAll('.status-opt.sel').forEach(o=>o.classList.remove('sel')); emps=[]; discs=[]; selAgencies=new Set(); selStatus=''; ledger=[]; occByDate={}; reconFindings=[]; document.getElementById('ledRooms').value=''; document.getElementById('ledHk').value=''; window._generated=false; const out=document.getElementById('output'); out.classList.remove('show'); out.innerHTML=''; renderEmps(); renderDiscs(); renderLedger(); recalc(); updateProgress(); window.scrollTo({top:0,behavior:'smooth'}); showToast('Audit cleared'); } /* Defensive event wiring — works even where inline onclick handlers are restricted */ function wire(id,fn){const el=document.getElementById(id); if(el) el.addEventListener('click',fn);} wire('btnGenerate',generate); wire('btnPrint',doPrint); wire('btnReset',resetAll); /* init */ renderEmps(); renderLedger(); recalc(); updateProgress();