/* ═══ CYPHER-HR Setup Wizard Module ═══ */ const Setup = { step: 1, status: null, defaultPolicies: [ { leave_type: 'Casual Leave', monthly_limit: 2, is_enabled: true, description: 'General personal leave' }, { leave_type: 'Half Day', monthly_limit: 4, is_enabled: true, description: 'Half day leave' }, { leave_type: 'Medical', monthly_limit: 2, is_enabled: true, description: 'Medical/sick leave' }, { leave_type: 'Hajj', monthly_limit: 1, is_enabled: false, description: 'Hajj pilgrimage leave' }, { leave_type: 'Umrah', monthly_limit: 1, is_enabled: false, description: 'Umrah pilgrimage leave' }, { leave_type: 'Christmas', monthly_limit: 1, is_enabled: true, description: 'Christmas holiday' }, { leave_type: 'Easter', monthly_limit: 1, is_enabled: true, description: 'Easter holiday' }, { leave_type: 'Halloween', monthly_limit: 1, is_enabled: false, description: 'Halloween holiday' }, { leave_type: 'Marriage', monthly_limit: 1, is_enabled: true, description: 'Marriage leave' }, ], init(status) { this.status = status; if (status.hasCompany) this.step = 2; if (status.hasAdmin) this.step = 3; this.render(); }, render() { App.setView(`

CYPHER-HR

Let's set up your HR system

${this.step > 1 ? icon('check', 14) : '1'}
Company
${this.step > 2 ? icon('check', 14) : '2'}
Admin
3
Policies
${this.getStepContent()}
`); }, getStepContent() { if (this.step === 1) return `

${icon('building', 22)} Company Profile

`; if (this.step === 2) return `

${icon('shield', 22)} Create Admin Account

`; if (this.step === 3) return `

${icon('calendar', 22)} Leave Policies

Configure leave types and monthly limits

${this.defaultPolicies.map((p, i) => `
${p.leave_type}
`).join('')}
`; }, async saveCompany(e) { e.preventDefault(); const err = document.getElementById('setupError'); err.style.display = 'none'; try { await App.api('/api/setup/company', { method: 'POST', body: JSON.stringify({ company_name: document.getElementById('companyName').value, industry: document.getElementById('companyIndustry').value }) }); this.step = 2; this.render(); } catch (error) { err.textContent = error.message; err.style.display = 'block'; } }, async saveAdmin(e) { e.preventDefault(); const err = document.getElementById('setupError'); err.style.display = 'none'; try { await App.api('/api/setup/admin', { method: 'POST', body: JSON.stringify({ first_name: document.getElementById('adminFirst').value, last_name: document.getElementById('adminLast').value, email: document.getElementById('adminEmail').value, password: document.getElementById('adminPassword').value }) }); this.step = 3; this.render(); } catch (error) { err.textContent = error.message; err.style.display = 'block'; } }, async savePolicies(e) { e.preventDefault(); const err = document.getElementById('setupError'); err.style.display = 'none'; try { const policies = this.defaultPolicies.map((p, i) => ({ leave_type: p.leave_type, monthly_limit: parseInt(document.getElementById(`pol_lim_${i}`).value) || 1, is_enabled: document.getElementById(`pol_en_${i}`).checked, description: p.description })); await App.api('/api/setup/policies', { method: 'POST', body: JSON.stringify({ policies }) }); App.toast('Setup complete! Please log in.'); Login.show(); } catch (error) { err.textContent = error.message; err.style.display = 'block'; } } };