A build-to-order Odoo module for guarding companies that turns client sites, posts and shift patterns into a rostered schedule, captures patrol and incident logs against real guard attendance, and converts those hours into payroll input and contract invoices. ECOSIRE scopes, builds, installs and supports it on your Odoo 17, 18 or 19 database. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $499.00 USD; request a quote for a scoped proposal.
示意预览A build-to-order Odoo module for guarding companies that turns client sites,
posts and shift patterns into a rostered schedule, captures patrol and incident logs against real guard attendance, and converts those hours into payroll input and contract invoices.
ECOSIRE scopes, builds, installs and supports it on your Odoo 17, 18 or 19 database.
无需自行搭建——由 ECOSIRE 构建、安装并提供支持的可用应用。
以一次性构建价格开始。我们在启动时与您共同确定范围。
ECOSIRE 在您的 Odoo 上构建、配置并安装。
约 2–4 周内上线,并提供上线后的支持期。
A guarding company does not sell products or project hours — it sells covered posts. A client contract says "two unarmed guards at Gate A, 24/7, plus one supervisor on the day shift", and every operational and financial question follows from whether those posts were actually manned. Odoo out of the box has no idea what a post is. You can approximate a roster in Planning (Enterprise only), record hours in Attendances, and raise an invoice in Sales, but nothing joins them: the control-room WhatsApp group decides reliefs, a spreadsheet tracks who covered which site, patrol sheets stay on paper at the guardhouse, and at month-end someone reconciles three sources by hand to answer "did we bill this client for hours we never covered, and did we pay a guard for a shift he did not work?". That reconciliation gap is where guarding companies lose margin and where contract disputes start.
This module adds the missing operational spine as proper Odoo models. A security.site record carries the client res.partner, geolocation, site instructions and contract reference; each site owns security.post lines that define required coverage — post name, shift pattern, headcount, required guard grade or licence class, and armed/unarmed flag. A roster generator expands post requirements into security.shift records across a date range, and assignment links each shift to an hr.employee guard, validating with a Python constraint that the guard holds a valid, unexpired licence for that post type and is not already booked on an overlapping shift. Relief and absence handling is a first-class flow, not a note: an unfilled or abandoned shift moves to a relief_required state, an automated action escalates it to the duty supervisor, and the replacement is recorded with a reason code so the reason a post went uncovered survives into reporting. Patrol and incident capture is a security.patrol.log model with checkpoint lines, timestamps and photo attachments, and a security.incident model with severity, category, narrative, and a QWeb PDF incident report you can hand a client the same day.
The financial half is what makes it pay for itself. Actual shift hours — worked, not planned — feed two directions. Toward payroll, a wizard aggregates approved shifts per employee per period into attendance or payslip input lines (hr.payslip.input on the Enterprise payroll stack, or a clean export for whatever payroll you run), with configurable rules for overtime, night differential and public-holiday premiums. Toward revenue, contract billing computes each period's invoiceable amount from the billing model you actually use: fixed monthly rate per post, hourly rate by guard grade, or a hybrid with deductions for uncovered hours. The billing wizard produces a draft account.move with one line per site and post, plus a QWeb backup schedule listing every shift billed — the annexure your client's procurement team asks for. Everything is standard Odoo underneath: ir.model.access.csv plus record rules so a site supervisor sees only their own sites while operations managers see the region, @api.depends computed fields for coverage percentage and unfilled-hours totals, and the XML-RPC/JSON-RPC API left open so an existing guard-tour device, biometric clock or client portal can post checkpoint scans straight into the log.
We build this to order for your Odoo 17.0, 18.0 or 19.0 database and your actual contracts. Nothing here is a pre-built download — the module ships after a scoping call in which we walk through your site types, shift patterns, licence classes, overtime rules and how each client contract prices coverage, because those five things differ enough between guarding companies that a generic module would be re-written anyway. Typical delivery is 2 to 4 weeks from confirmed scope. It runs on Odoo Community where possible; features that depend on Enterprise apps — notably the payroll payslip integration and Planning-style Gantt views — are flagged during scoping so you know exactly what your edition supports and what we deliver as a Community-safe alternative. You receive the full source, deployed and tested on a staging copy of your database before it touches production.
Runs 20 to 200+ posts across client sites and needs one system that answers whether every contracted post was manned, who covered the reliefs, and which sites are eroding margin through unbilled overtime. Currently reconciles a rostering spreadsheet, a WhatsApp control-room group and paper patrol sheets by hand every month.
Fills gaps in real time. Needs a shift board that shows unfilled and abandoned posts immediately, a shortlist of eligible off-duty guards with valid licences for that post type, and a one-click relief assignment that records the reason so it is defensible later.
Invoices dozens of clients on different bases: fixed monthly per post, hourly by guard grade, or with deductions for uncovered hours. Needs invoices generated from actual covered hours with a backup schedule annexure the client's procurement team will accept without a dispute.
Pays guards on hours actually worked, with overtime, night differential and public-holiday premiums. Needs payroll input derived from approved, reconciled shift records rather than re-keyed from a roster spreadsheet, and needs licence expiries surfaced before a guard is deployed on an invalid credential.
| 标准 | 伊科西尔 | 定制建造 | 竞争对手 | Odoo 原生 |
|---|---|---|---|---|
| Concept of a contracted post | security.site and security.post are first-class models with headcount, shift pattern, licence class and rate basis | Achievable, but the data model is designed from scratch by your developer or contractor | Usually a generic shift or job model borrowed from field-service, with no post-coverage concept | No equivalent — Odoo has projects, tasks and planning slots, not contracted posts |
| Relief and no-show handling | Dedicated relief_required state, supervisor escalation via automated action, coded gap reasons that flow into reporting | Depends entirely on whether it was specified up front; usually added later after a dispute | Typically a manual reassignment with no reason capture | Handled outside Odoo — control-room phone calls and a spreadsheet |
| Guard licence and certification control | Licence register on hr.employee with expiry dates, warning actions, and assignment blocked on expired credentials | Possible, but licence-class validation logic is easy to under-specify | Often stored as a free-text field with no enforcement at assignment | HR stores documents; nothing prevents deploying a guard on an expired licence |
| Shift hours to payroll | Wizard aggregating approved hours into hr.payslip.input or a clean export, with overtime, night and holiday rules | Built to your rules, but overtime and premium logic is where most DIY projects overrun | Usually stops at attendance; payroll mapping is left to you | Attendances exist, but the roster-to-payroll link is manual re-keying |
| Contract invoicing basis | Fixed per post, hourly by grade, or hybrid with deductions — plus a QWeb backup schedule annexure per invoice | Whatever you specify; each additional billing model is additional scope | Commonly a single billing model, most often flat hourly | Manual invoice lines typed from a reconciled spreadsheet |
| Patrol and incident evidence | Checkpoint logs with timestamps, GPS and photos, plus incident records with a same-day client PDF | Buildable, but mobile capture and attachment handling adds real effort | Often patrol logging only, without an incident report a client will accept | Paper sheets at the guardhouse, or a note in chatter |
| Data access separation | Record rules so supervisors see only their sites, ops sees the region, finance sees billing without operational detail | Depends on the developer's discipline with ir.model.access.csv and record rules | Frequently a single group with all-or-nothing access | Standard Odoo groups, with no site-level scoping for guarding roles |
| Version fit and maintenance | Built for your exact Odoo 17/18/19 series, full source, private git repo handover, documented upgrade path | You own it entirely, including every future migration with no prior guarding-domain reference | You wait for the vendor's version release, and customisation is limited to what they exposed | Upgrades cleanly — because there is nothing guarding-specific to upgrade |
Typical delivery is 2 to 4 weeks from confirmed scope. This is not an existing apps.odoo.com download — ECOSIRE builds it for your database. The sequence is: a short scoping call to map your site types, shift patterns, licence classes, overtime rules and contract pricing models; a written scope and quotation; development against your Odoo version; UAT on a staging copy of your production database; then go-live with a rollback plan. Complex integrations (guard-tour hardware, biometric clocks, a client portal) can extend that window, and we say so before you commit.
The core — sites, posts, rostering, reliefs, patrol and incident logs, billing — runs on Odoo Community. Two areas depend on Enterprise: the payslip-input integration relies on the Enterprise payroll app, and Gantt-style roster views come from Enterprise web widgets. On Community we deliver a payroll export in your provider's format instead of payslip input, and list/kanban/calendar roster views instead of Gantt. We confirm your edition during scoping so there are no surprises.
Delivery includes a post-go-live support window for defect fixes and configuration adjustments within the agreed scope. Because you receive the full source and a private git repository with commit history, your own team or any other Odoo partner can maintain it — you are not locked in. Ongoing enhancement work, additional sites or contract models beyond the delivered scope, and migration to a future Odoo major version are quoted separately; we include upgrade notes so that migration is planned, not archaeology.
Yes, where the device exposes an API or an exportable file. The module leaves Odoo's XML-RPC and JSON-RPC endpoints open, so checkpoint scans and clock-in events can be posted directly into security.patrol.log and hr.attendance from external hardware or middleware. During scoping we review your specific device and confirm whether it is a direct API integration, a scheduled file import, or a middleware job — that determination affects the quotation, so we do it before quoting, not after.
Uncovered hours are recorded, not hidden. Every shift carries a state and, if unfilled or relieved, a coded reason. The billing engine then applies your contract's rule: some contracts bill the fixed monthly rate regardless, others deduct uncovered hours at the post's rate, others apply a penalty. Each generated invoice comes with a QWeb backup schedule listing shifts billed, so the client sees the same arithmetic you do.
We audit your installed apps and any existing customisations before writing code. The module extends standard models (res.partner, hr.employee, hr.attendance, account.move) rather than replacing them, and we test on a staging copy of your real database — with your real module set — during UAT precisely to catch conflicts before production. If an existing module already owns part of this territory, we tell you during scoping whether to extend it or replace it.
We build for Odoo 17.0, 18.0 and 19.0. You get a build targeting the exact series you run in production — we do not ship a single codebase with version branches, because that ages badly. If you are mid-upgrade, tell us during scoping and we will target the version you will be on at go-live.
A build-to-order Odoo module for guarding companies that turns client sites, posts and shift patterns into a rostered schedule, captures patrol and incident logs against real guard attendance, and converts those hours into payroll input and contract invoices. ECOSIRE scopes, builds, installs and supports it on your Odoo 17, 18 or 19 database.