Files
Odoo-Modules/fusion_clock/data/ir_cron_data.xml
gsinghpal ab3e6fa1e2 feat(fusion_clock): auto-wipe clock-in/out photos after a retention window
Privacy/space housekeeping for the kiosk verification selfies. A new daily cron
(_cron_fusion_wipe_old_photos) deletes the photo attachments on attendances
whose clock-in is older than fusion_clock.photo_retention_days (default 60).
Only the images are removed — attendance records, worked hours and penalties
are kept. Clearing the attachment-backed binary reclaims filestore space.

- Configurable in Settings → Fusion Clock → NFC Kiosk ("Auto-Wipe Photos After
  (days)"); set 0 to disable.
- Wipes all three photo fields (NFC check-in/out + legacy portal photo),
  batched with per-batch savepoints.
- tests/test_photo_retention.py covers wipe-old / keep-recent / retention=0.

Verified live on entech (19.0.3.11.7) via a rollback-only dry run: a 70-day
shift's photos were wiped (record + 8h hours preserved) while a 5-day shift's
photo was kept; nothing persisted. 0 attendances currently exceed 60 days.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 20:19:22 -04:00

77 lines
3.4 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- Auto Clock-Out Cron: runs every 15 minutes -->
<record id="cron_auto_clock_out" model="ir.cron">
<field name="name">Fusion Clock: Auto Clock-Out</field>
<field name="model_id" ref="hr_attendance.model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model._cron_fusion_auto_clock_out()</field>
<field name="interval_number">15</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">50</field>
</record>
<!-- Report Generation Cron: runs daily at 1:00 AM -->
<record id="cron_generate_reports" model="ir.cron">
<field name="name">Fusion Clock: Generate Period Reports</field>
<field name="model_id" ref="fusion_clock.model_fusion_clock_report"/>
<field name="state">code</field>
<field name="code">model._cron_generate_period_reports()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active">True</field>
<field name="priority">60</field>
</record>
<!-- Absence Check Cron: runs daily at midnight -->
<record id="cron_check_absences" model="ir.cron">
<field name="name">Fusion Clock: Daily Absence Check</field>
<field name="model_id" ref="hr_attendance.model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model._cron_fusion_check_absences()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active">True</field>
<field name="priority">55</field>
</record>
<!-- Employee Reminder Cron: runs every 15 minutes -->
<record id="cron_employee_reminders" model="ir.cron">
<field name="name">Fusion Clock: Employee Reminders</field>
<field name="model_id" ref="hr_attendance.model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model._cron_fusion_employee_reminders()</field>
<field name="interval_number">15</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">70</field>
</record>
<!-- Weekly Summary Cron: runs daily (checks if Monday internally) -->
<record id="cron_weekly_summary" model="ir.cron">
<field name="name">Fusion Clock: Weekly Summary</field>
<field name="model_id" ref="hr_attendance.model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model._cron_fusion_weekly_summary()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active">True</field>
<field name="priority">80</field>
</record>
<!-- Photo Wipe Cron: runs daily, deletes clock photos past the retention window -->
<record id="cron_wipe_old_photos" model="ir.cron">
<field name="name">Fusion Clock: Wipe Old Clock Photos</field>
<field name="model_id" ref="hr_attendance.model_hr_attendance"/>
<field name="state">code</field>
<field name="code">model._cron_fusion_wipe_old_photos()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active">True</field>
<field name="priority">65</field>
</record>
</odoo>