{{ headerIcon }}

{{ headerTitle }}

{{ headerSubtitle }}

{{ userDisplayRole }}
{{ userDisplayName }}
๐Ÿš— Driver Duty & Vehicle Mileage Portal
๐ŸŒ Browser Preview Mode Dev Test
{{ tag }} HH
๐Ÿ–๏ธ
Holiday Home detected: Special 30 AED rate applied & Tax-Free mode.
โ„น๏ธ
Monthly Contract: Request will be recorded in logs, but Odoo draft invoice is bypassed.
Partner: {{ customerDetails.partner_name }} Tax-Free Standard Tax
โš ๏ธ Multiple customers share this tag. Please be specific.
๐Ÿ“ฆ Services & Items {{ items.length }}
Item #{{ idx + 1 }}
Subtotal {{ ((item.qty || 0) * (item.price || 0)).toFixed(2) }} AED
Total Services {{ items.length }} items ({{ totalHours }} hrs)
Tax Status {{ isTaxFree ? 'TAX-FREE (Holiday Home)' : 'STANDARD TAX' }}
Total Amount {{ grandTotal.toFixed(2) }} AED
โœ“ Selected
โš ๏ธ
Media Files Required
Cannot send media report unless all photos/videos are attached. Tap buttons above to capture or pick files.
๐ŸŽฅ {{ f.name }}
{{ formatFileSize(f.size) }}
๐ŸŸข
Step 1: Start Your Duty
Enter your name, car plate number, and current starting odometer KM before starting your shift.

Check car odometer meter and enter current KM reading.

Duty In Progress
Driver:
{{ activeDuty.driver_name }}
Car Plate:
{{ activeDuty.vehicle_identifier }}
Starting KM:
{{ activeDuty.start_mileage }} km
Started At:
{{ formatDutyTime(activeDuty.started_at_utc) || activeDuty.shift_date }}
{{ calculatedDistance }} km driven
โš ๏ธ Ending mileage cannot be less than starting mileage ({{ activeDuty.start_mileage }} km)!
AED

Leave 0 if no petrol was purchased during this shift.

Required
๐Ÿ“‹ Shift History
No shift logs recorded yet.
๐Ÿš— {{ log.driver_name }} ({{ log.vehicle_identifier }}) In Progress {{ log.distance_km }} km
Date: {{ log.shift_date }} | Pickup: {{ log.last_pickup_time }} โ›ฝ {{ log.fuel_cost_aed }} AED
"{{ log.notes }}"
โฐ 4:00 AM Consolidation Queue
Jobs submitted by cleaners are staged here. At 4:00 AM Dubai time, jobs with multiple cleaners are consolidated into a single draft invoice.
โœจ
No Pending Staged Jobs
All reports have already been consolidated or created.
{{ grp.customer_tag }}
๐Ÿ“… {{ grp.job_date }} โ€ข ๐Ÿ“ {{ grp.location_info }}
{{ (grp.cleaners_list ? grp.cleaners_list.length : Object.keys(grp.cleaners || {}).length) }} Cleaners
Submitted By:
๐Ÿ‘ค {{ c.name }} (@{{ c.username }}) {{ c.hours }} hrs
๐Ÿงบ Laundry unique for booking: 1x charged (deduplicated across cleaners)
Consolidated Total: {{ grp.total_hours }} Hours Total

โœ๏ธ Edit Pending Booking

Adjust hours, services, customer, or remove items before 4:00 AM merge.

๐Ÿ‘ค {{ it.staff }} Item #{{ iidx + 1 }}
Updated Total: {{ editFormTotalHours }} hrs ({{ editFormTotalAed.toFixed(2) }} AED)
โœ“

{{ successResult.mode === 'media' ? 'Media Delivered!' : successResult.mode === 'driver' ? 'Shift Log Saved!' : successResult.mode === 'merge' ? 'Draft Invoices Created!' : (successResult.status === 'STAGED' ? 'Report Queued (04:00 AM)' : successResult.status === 'SKIPPED_MONTHLY' ? 'Monthly Logged' : 'Draft Invoice Created!') }}

{{ successResult.mode === 'media' ? 'Photos & videos sent to customer & archive.' : successResult.mode === 'driver' ? 'Shift record stored in database successfully.' : successResult.mode === 'merge' ? 'Consolidated draft invoices generated in Odoo.' : (successResult.status === 'STAGED' ? 'Hours combined with your team at 4:00 AM.' : successResult.status === 'SKIPPED_MONTHLY' ? 'Recorded in database successfully.' : 'Draft invoice generated in Odoo.') }}

Queue Status: Queued for 04:00 AM
Customer: {{ successResult.customer }}
Date: {{ successResult.date }}
Your Hours: {{ successResult.total_hours }} hrs ({{ successResult.total?.toFixed(2) }} AED)
Invoice ID: #{{ successResult.invoice_id }}
Customer: {{ successResult.customer }}
Date: {{ successResult.date }}
Total: {{ successResult.total?.toFixed(2) }} AED
Driver: {{ successResult.driver }}
Vehicle: {{ successResult.vehicle }}
Last Pickup: {{ successResult.last_pickup_time }}
Petrol Paid: {{ successResult.fuel_cost_aed }} AED
Distance Driven: {{ successResult.distance_km }} km
Draft Invoices Created: {{ successResult.consolidated_count ?? (successResult.invoices ? successResult.invoices.length : 0) }}
Monthly Skipped: {{ successResult.skipped_count ?? 0 }}
Recipient: {{ successResult.customer }}
Location: {{ successResult.location }}
Type: {{ successResult.type }}
Files Delivered: {{ successResult.files_count }} files
โŒ {{ errorMessage }}