Attendance with GPS Late Check In Penalty
Most Advanced Attendance Software.
Attendance with GPS Late Check In Penalty Key Features
Geo-Location Validation:
I) Compares the employee’s mobile check-in location with the pre-set office location.
II) Flags "Out-of-Office" check-ins.
Late Arrival Tracking:
I) Compares check-in time against official work start time.
II) Calculates minutes late.
Automatic Penalty Application:
I) Applies deductions (leave or monetary) for violations.
II) Runs via cron job to ensure automation.
Manager Notifications:
I) Option to notify managers of repeated offenders.
Configurable Rules:
I) Admin can set:Allowed late minutes.
II) Geo-fence radius.
III) Penalty amount/type.
Attendance with GPS Late Check In Penalty Screenshots
Attendance List View
Shows geo-status ("In Location" or "Out of Location") and late minutes.

Attendance Form View
Displays location validation results for each check-in.
Services
Odoo Customization
Odoo Implementation
Odoo Support
Odoo Integration
Odoo Migration
Odoo Consultancy
Got questions or need help? Get in touch.
hello@appscomp.com| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Employees (hr) • Discuss (mail) |
| Lines of code | 55 |
| Technical Name |
attendance_geofence_penalty |
| License | LGPL-3 |
| Website | https://www.appscomp.com |
Please log in to comment on this module
Error when try to install
Odoo Server Error
RPC_ERROR
Odoo Server Error
Occured on localhost:8069 on model ir.module.module on 2026-06-27 08:47:20 GMT
Traceback (most recent call last): File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 605, in _tag_root f(rec) File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 460, in _tag_record record = model._load_records([data], self.mode == 'update') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\models.py", line 5196, in _load_records records = self._load_records_create([data['values'] for data in to_create]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\models.py", line 5103, in _load_records_create records = self.create(vals_list) ^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\decorators.py", line 365, in create return method(self, vals_list) ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\base\models\ir_cron.py", line 140, in create return super().create(vals_list) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\decorators.py", line 365, in create return method(self, vals_list) ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\mail\models\mail_thread.py", line 328, in create threads = super(MailThread, self).create(vals_list) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\decorators.py", line 365, in create return method(self, vals_list) ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\models.py", line 4654, in create raise ValueError(f"Invalid field {field_name!r} in {self._name!r}") ValueError: Invalid field 'numbercall' in 'ir.cron' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "D:\Program Files\Odoo 19\server\odoo\http.py", line 2329, in _serve_db return service_model.retrying(serve_func, env=self.env) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\service\model.py", line 188, in retrying result = func() ^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\http.py", line 2384, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\http.py", line 2599, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\base\models\ir_http.py", line 353, in _dispatch result = endpoint(**request.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\http.py", line 838, in route_wrapper result = endpoint(self, *args, **params_ok) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\web\controllers\dataset.py", line 38, in call_button action = call_kw(request.env[model], method, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\service\model.py", line 97, in call_kw result = method(recs, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\base\models\ir_module.py", line 72, in check_and_log return method(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\base\models\ir_module.py", line 492, in button_immediate_install return self._button_immediate_function(self.env.registry[self._name].button_install) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\addons\base\models\ir_module.py", line 637, in _button_immediate_function registry = modules.registry.Registry.new(self.env.cr.dbname, update_module=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\tools\func.py", line 88, in locked return func(inst, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Program Files\Odoo 19\server\odoo\orm\registry.py", line 183, in new load_modules( File "D:\Program Files\Odoo 19\server\odoo\modules\loading.py", line 464, in load_modules load_module_graph( File "D:\Program Files\Odoo 19\server\odoo\modules\loading.py", line 217, in load_module_graph load_data(env, idref, 'init', kind='data', package=package) File "D:\Program Files\Odoo 19\server\odoo\modules\loading.py", line 59, in load_data convert_file(env, package.name, filename, idref, mode, noupdate=kind == 'demo') File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 693, in convert_file convert_xml_import(env, module, fp, idref, mode, noupdate) File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 792, in convert_xml_import obj.parse(doc.getroot()) File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 663, in parse self._tag_root(de) File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 605, in _tag_root f(rec) File "D:\Program Files\Odoo 19\server\odoo\tools\convert.py", line 618, in _tag_root raise ParseError('while parsing %s:%s, somewhere inside\n%s' % ( odoo.tools.convert.ParseError: while parsing file:/d:/program%20files/odoo%2019/sessions/addons/19.0/attendance_geofence_penalty/data/attendance_cron.xml:3, somewhere inside <record id="ir_cron_attendance_penalty" model="ir.cron"> <field name="name">Attendance Penalty Check</field> <field name="model_id" ref="model_hr_attendance"/> <field name="state">code</field> <field name="code">model._cron_apply_penalties()</field> <field name="interval_number">1</field> <field name="interval_type">days</field> <field name="numbercall">-1</field> <field name="active" eval="True"/> </record> The above server error caused the following client error: RPC_ERROR: Odoo Server Error RPC_ERROR at makeErrorFromResponse (http://localhost:8069/web/assets/9b516cc/web.assets_web.min.js:3184:165) at XMLHttpRequest.<anonymous> (http://localhost:8069/web/assets/9b516cc/web.assets_web.min.js:3191:13)There are no comments yet!