05/07 Phase 3: initial codes

This commit is contained in:
2026-05-07 12:17:19 -04:00
parent 6e5518c103
commit ce462c57b2
107 changed files with 6365 additions and 208 deletions
@@ -0,0 +1,43 @@
{% extends "tenant/layouts/base.html" %}
{% block title %}Commission & Pay{% endblock %}
{% block content %}
<h4 class="fw-bold mb-4">Commission & Pay Summary</h4>
{% if pay_periods %}
<div class="card shadow-sm mb-3">
<div class="card-header fw-semibold">Pay Periods</div>
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light"><tr><th>Period</th><th>Type</th><th>Base</th><th>Commission</th><th>Total</th><th>Status</th></tr></thead>
<tbody>
{% for pp in pay_periods %}
<tr>
<td class="small">{{ pp.period_start.strftime('%b %d') }}{{ pp.period_end.strftime('%b %d, %Y') }}</td>
<td class="small">{{ pp.pay_type.title() }}</td>
<td>${{ "%.2f"|format(pp.base_amount) }}</td>
<td>${{ "%.2f"|format(pp.commission_amount) }}</td>
<td class="fw-semibold">${{ "%.2f"|format(pp.total_amount) }}</td>
<td><span class="badge bg-{{ {'paid':'success','approved':'primary','draft':'secondary'}.get(pp.status,'secondary') }}">{{ pp.status }}</span></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endif %}
{% if commission_logs %}
<div class="card shadow-sm">
<div class="card-header fw-semibold">Recent Commissions</div>
<div class="table-responsive">
<table class="table table-sm mb-0">
<thead><tr><th>Period</th><th>Amount</th></tr></thead>
<tbody>
{% for log in commission_logs %}
<tr><td class="small">{{ log.period or '—' }}</td><td>${{ "%.2f"|format(log.amount) }}</td></tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endif %}
<a href="{{ url_for('staff_portal.index') }}" class="btn btn-outline-secondary btn-sm mt-3">Back</a>
{% endblock %}
@@ -0,0 +1,69 @@
{% extends "tenant/layouts/base.html" %}
{% block title %}Staff Portal{% endblock %}
{% block content %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="fw-bold mb-0">
<i class="bi bi-person-badge me-2"></i>Welcome, {{ staff.name }}
</h4>
<span class="text-muted small">{{ today.strftime('%A, %B %d') }}</span>
</div>
<!-- Clock in/out -->
<div class="card shadow-sm mb-3 {{ 'border-success' if current_clocking else '' }}">
<div class="card-body d-flex align-items-center justify-content-between">
<div>
{% if current_clocking %}
<span class="badge bg-success fs-6 me-2">On Shift</span>
<span class="text-muted small">Since {{ current_clocking.clocked_in_at.strftime('%I:%M %p') }}</span>
{% else %}
<span class="badge bg-secondary fs-6">Off Shift</span>
{% endif %}
</div>
<div>
{% if current_clocking %}
<form method="POST" action="{{ url_for('staff_portal.clock_out') }}" class="d-inline">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button class="btn btn-outline-danger">Clock Out</button>
</form>
{% else %}
<form method="POST" action="{{ url_for('staff_portal.clock_in') }}" class="d-inline">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button class="btn btn-success">Clock In</button>
</form>
{% endif %}
</div>
</div>
</div>
<!-- Today's appointments -->
<div class="card shadow-sm mb-3">
<div class="card-header fw-semibold">
Today's Appointments
<a href="{{ url_for('staff_portal.schedule') }}" class="btn btn-outline-secondary btn-sm float-end">Full Schedule</a>
</div>
{% if todays_appointments %}
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light"><tr><th>Time</th><th>Customer</th><th>Service</th><th>Status</th></tr></thead>
<tbody>
{% for a in todays_appointments %}
<tr>
<td class="fw-semibold">{{ a.start_time.strftime('%I:%M %p') }}</td>
<td>{{ a.customer.name if a.customer else 'Walk-in' }}</td>
<td class="small">{{ a.service.name if a.service else '—' }}</td>
<td><span class="badge bg-{{ {'confirmed':'primary','in_progress':'info','pending':'warning'}.get(a.status,'secondary') }}">{{ a.status }}</span></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="card-body text-muted small">No appointments scheduled for today.</div>
{% endif %}
</div>
<div class="row g-2">
<div class="col-6"><a href="{{ url_for('staff_portal.commission') }}" class="btn btn-outline-primary w-100">Commission & Pay</a></div>
<div class="col-6"><a href="{{ url_for('staff_portal.profile') }}" class="btn btn-outline-secondary w-100">My Profile</a></div>
</div>
{% endblock %}
@@ -0,0 +1,16 @@
{% extends "tenant/layouts/base.html" %}
{% block title %}My Profile{% endblock %}
{% block content %}
<h4 class="fw-bold mb-4">My Profile</h4>
<div class="card shadow-sm" style="max-width:400px;">
<div class="card-body">
<dl class="row mb-0">
<dt class="col-sm-4">Name</dt><dd class="col-sm-8">{{ staff.name }}</dd>
<dt class="col-sm-4">Phone</dt><dd class="col-sm-8">{{ staff.phone }}</dd>
<dt class="col-sm-4">Type</dt><dd class="col-sm-8">{{ staff.staff_type.replace('_',' ').title() }}</dd>
<dt class="col-sm-4">Pay Type</dt><dd class="col-sm-8">{{ staff.pay_type.title() }}</dd>
</dl>
</div>
</div>
<a href="{{ url_for('staff_portal.index') }}" class="btn btn-outline-secondary btn-sm mt-3">Back</a>
{% endblock %}
@@ -0,0 +1,28 @@
{% extends "tenant/layouts/base.html" %}
{% block title %}My Schedule{% endblock %}
{% block content %}
<h4 class="fw-bold mb-4">My Schedule — Next 7 Days</h4>
{% if appointments %}
<div class="card shadow-sm">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light"><tr><th>Date</th><th>Time</th><th>Customer</th><th>Service</th><th>Status</th></tr></thead>
<tbody>
{% for a in appointments %}
<tr>
<td class="small">{{ a.start_time.strftime('%b %d') }}</td>
<td class="fw-semibold">{{ a.start_time.strftime('%I:%M %p') }}</td>
<td>{{ a.customer.name if a.customer else 'Walk-in' }}</td>
<td class="small">{{ a.service.name if a.service else '—' }}</td>
<td><span class="badge bg-{{ {'confirmed':'primary','in_progress':'info','pending':'warning'}.get(a.status,'secondary') }}">{{ a.status }}</span></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% else %}
<div class="alert alert-light">No upcoming appointments in the next 7 days.</div>
{% endif %}
<a href="{{ url_for('staff_portal.index') }}" class="btn btn-outline-secondary btn-sm mt-3">Back</a>
{% endblock %}