Odoo Construction Daily Site Diary & Punch List documentation
A guide to the Odoo Construction Daily Site Diary & Punch List: installing the module, sites and geofence, trades and rate cards, equipment, budget versus actual, drawings and pins, the foreman's app, deliveries, offline sync, reports, the API and building the app.
Documents version 1.0.0Updated Oct 29, 2026
Start here
In plain words: This package gives you a complete construction daily site reporting and punch-list system for Odoo Community: an Odoo module (
taqnix_construction_jobsite) for the project office and the Flutter source code of the app for iPhone, iPad and Android that foremen use on site, with or without network coverage. The foreman writes the daily log (weather, delays, crews by subcontractor, machine hours and fuel, photos, signature), drops pins on the blueprints for defects, and checks deliveries against the purchase orders. The project office sees the costs against the budget the same day.Tip: Nothing here needs Odoo Enterprise: the module uses Project, Timesheets (for the analytic account of the project), Purchase, Inventory and Invoicing only. Maps, Gantt and other Enterprise screens are not used.
What is in the package
| Item | What it is |
|---|---|
taqnix_construction_jobsite.zip | The Odoo 19 module: sites with geofence and budget, daily logs, trades and rate cards, equipment, drawings and the punch list, deliveries (digital GRN), budget versus actual, reports, the API of the app, Arabic translation, automated tests. |
flutter-app-source.zip | The Flutter project (Android and iOS): offline database and outbox, sync engine, blueprint viewer with pin drop, daily log screens, delivery inspection with scanner and text recognition, English and Arabic, setup script and tests. |
documentation/ | This guide in English (index.html) and Arabic (index-ar.html), with PDFs, and API.md for developers. |
licensing/ | The licence (OPL-1: one purchase = one company and one app brand, updates included). |
preview-images/ | Screenshots of the app and of the Odoo screens. |
changelog.txt | History of the versions. |
How a working day runs
| Moment | Who | What happens | In Odoo |
|---|---|---|---|
| Morning | Foreman | Opens the site, the app records the weather from the phone's position (or he types it), starts the log and counts the crews on site. | A draft daily log for the site and the day. |
| During the day | Foreman | Adds machine hours and fuel, delays, photos; drops pins on the drawings; receives the deliveries that arrive. | Pins, a delivery (GRN) with its photos, a receipt validated in Inventory, a backorder when it is short. |
| End of shift | Foreman | Runs the checklist and signs on the screen: Submit shift. | The log is submitted; labor and equipment costs are posted to the analytic account of the site. |
| Next morning | Project manager | Approves the log or rejects it with a reason; follows the critical pins. | Approved log, a to-do for the foreman after a rejection. |
| Any time | Quantity surveyor | Compares the budget with the actual cost by labor, equipment, material and other; closes the rectified pins. | Budget versus actual, cost analysis, punch list. |
In plain words: Offline first. Concrete basements have no signal: every log, photo, pin and delivery is saved on the phone first and sent to Odoo when there is a connection, once, in order, with safe retries (chapter 21).
What you need
| Item | Details |
|---|---|
| Odoo | 19.0 Community or Enterprise. Project, Timesheets, Purchase, Inventory and Invoicing are installed automatically with the module. |
| Chart of accounts | Any localization; the purchase orders and vendor bills use it. Costs of the logs are posted on the analytic account of the project. |
| Address | A public https address for Odoo (the phones must reach it). On a closed network you can use an http address of the LAN if you build the app for it. |
| Phones and tablets | Android 8 or newer, or iPhone / iPad with iOS 15 or newer, with a camera and GPS. A tablet is best for the drawings. |
| Weather | The app can read the weather of the site for free from the Open-Meteo service when the phone is online (no key needed); offline the foreman types it. |
| A computer to build the app | A Mac for iPhone and Android (Windows or Linux can build Android only), about 30 GB free, Flutter 3.41 or newer, Android Studio and Xcode. |
| Store accounts | Google Play Console and Apple Developer Program, or internal distribution to your own staff. |
Install the Odoo module
- Unzip the package. Inside is
taqnix_construction_jobsite.zip; unzip it to get the foldertaqnix_construction_jobsite. - Copy the folder into one of the
addons_pathfolders of your Odoo server and restart Odoo. - Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
- Remove the “Apps” filter, search Construction Jobsite and press Install.
# or from the command line ./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_construction_jobsite --stop-after-init
In plain words: After the installation a new app Jobsite appears in the main menu. The installation also creates the trades (Carpentry, MEP, Masonry, Steel fixers, Concrete, Finishing, General labor), the sequences of the logs, the pins and the delivery notes, and a reminder for missing logs.
Important: Take a backup before installing on a production database, as for any module.
First setup in 30 minutes
- Open Jobsite → Configuration → Sites and create or open a project: tick Jobsite reporting, type the site code, the coordinates and the radius, and add the foremen (chapter 7).
- Give users the groups Foreman, Quantity Surveyor or Project Manager (chapter 13).
- Mark your subcontractors (Configuration → Subcontractors) and set their trades and the rate cards (chapter 8).
- Add the equipment with its rates and fuel prices (chapter 9).
- Enter the budget of the site by labor, equipment, material and other (chapter 10) and tick the site on its purchase orders.
- Upload the drawings (PDF or pictures) (chapter 11).
- Build the app with the setup script (chapter 25), install it on the phones, sign in and write a first log.
Tip: The demo data of the screenshots (Atlas Build Co.: two sites, drawings, pins, logs, purchase orders) is created by
tests/seed.py in the source package: it is a complete example of every setting.Sites, foremen and the geofence
In plain words: A site is a normal Odoo project with Jobsite reporting switched on. The Jobsite tab holds everything: code, address, the foremen who report on it, the coordinates and the radius of the geofence, the budget and the actual figures.
| Field | What it does |
|---|---|
| Foremen | Users who see this site in the app, write its logs and drop its pins. A foreman sees only the sites he is assigned to. |
| Latitude, Longitude, Geofence radius | Where the site is. The app shows the distance to the site and records, at submission, whether the phone was inside the radius. |
| Block submission outside the site | On: the foreman cannot submit the log outside the radius unless he types a reason (the project manager gets a to-do). Off: the log is flagged only. |
| Percent complete | Physical progress entered by the project manager; used for the cost performance index. |
In plain words: Several sites are normal: the app opens on a site picker with the distance to each site, and everything (logs, pins, plans, deliveries) stays separate per site.
Trades, subcontractors and rate cards
In plain words: Crews are logged by subcontractor and trade. A trade has a default hourly rate and an overtime multiplier; a rate card overrides it for a subcontractor, a project, or both.
| Rate used (in this order) | Example |
|---|---|
| Card of the project and the subcontractor | Gulf MEP on Marina Heights: 26.00 per hour |
| Card of the project | All masons on Marina Heights: 17.50 |
| Card of the subcontractor | Steelworks United everywhere: 18.50 |
| Default rate of the trade | MEP: 24.00 |
| Cards can have dates | A card that starts next month does not apply yet |
In plain words: Labor cost of a crew line = headcount × hourly rate × (regular hours + overtime hours × overtime multiplier). Foremen never see rates or costs: those fields are protected by access rights (quantity surveyors and project managers see them).
Equipment: owned and rented machines
In plain words: Each machine has a fleet number, a kind (excavator, crane, pump, generator, loader...), owned or rented (with the rental company), a meter in hours or kilometres, an hourly rate and a fuel unit and price. A machine can be limited to some sites.
| Setting | Meaning |
|---|---|
| Hourly rate | Charge-out rate of an owned machine or the rental rate, per active hour. |
| Idle billed (%) | Share of the rate charged for hours the machine stood (a rented crane is usually paid while it waits). |
| Breakdown billed (%) | Share charged for breakdown hours (normally 0). |
| Fuel price, Fuel included | Fuel is charged on top unless the hire is wet (fuel included). |
| Last meter reading | Updated at every submitted log; the app starts the next day from it. |
In plain words: Equipment cost of a line = active hours × rate + idle hours × rate × idle % + breakdown hours × rate × breakdown % + fuel × fuel price.
Budget versus actual
In plain words: Every site has a budget in four lines: labor, equipment, material and other. The actual cost comes from Odoo records you already keep:
| Line | Where the actual cost comes from |
|---|---|
| Labor | The crew lines of the submitted (or approved) daily logs: man-hours × rates, posted on the analytic account of the project. |
| Equipment | The machine lines of the logs: hours, idle, fuel. |
| Material | Validated receipts of the purchase orders marked with the site, valued at the order price (default), or posted vendor bills with the analytic account of the site: choose in the settings. |
| Other | Any other analytic cost of the site account (timesheets of your own staff, expenses). |
In plain words: Variance = budget − actual (negative means over budget). Percent used = actual ÷ budget. Cost performance index = earned value ÷ actual, where earned value = total budget × percent complete: above 1 you spend less than the work done is worth, below 1 more. Material committed shows the confirmed purchase orders still to be received.
Tip: Mark the site on the purchase order (field Jobsite) so its receipts count as the material cost of the site and appear in the app for delivery inspection.
Drawings and the plan viewer in Odoo
In plain words: Upload the sheets of each site under Jobsite → Site → Drawings: PDF (several pages are fine) or PNG, JPEG or SVG. Odoo stores the file, its hash and its page count; the app downloads a sheet once and keeps it on the device, so drawings work offline. For a PDF you can upload a picture of the first page as the preview shown in Odoo.
In plain words: Press Open the plan with its pins for the viewer in Odoo: every pin of the sheet is drawn at its exact position with the colour of its severity; click a pin to see it or open it; the project manager can add a pin by clicking on the plan.
In plain words: Pins use normalized coordinates: the position is stored as a share of the page width and height (0.0 to 1.0, origin at the top left), so a pin dropped on a phone appears at the same place on a tablet, in Odoo and on a printed copy.
Settings reference
| Setting | Meaning |
|---|---|
| Foreman signature to submit | The foreman signs on the screen; the signature is stored on the log and printed on the report. |
| Post the costs | When the foreman submits (default: the budget moves the same day) or when the manager approves. |
| Block submission outside the site, default radius | Defaults copied to new projects. |
| Remind foremen about missing logs | After the chosen local hour a foreman who has not started the day's log gets a to-do. |
| Delivery ticket / plate photo is mandatory | The app refuses a delivery without them. |
| Over-delivery tolerance (%) | How much more than ordered a delivery may bring. |
| Material actuals from | Validated receipts or posted vendor bills. |
| Photo size, quality | The app shrinks photos on the phone before sending. |
Roles and devices
| Group (Construction Jobsite) | Can |
|---|---|
| Foreman | Sign in to the app for the assigned sites: daily logs, punch list, drawings, deliveries. Cannot see rates, costs or budgets. |
| Quantity Surveyor | Everything a foreman can on all sites, plus rates, costs, budget versus actual; closes and reopens pins. |
| Project Manager | Everything, plus sites, trades, rate cards, equipment, approving and rejecting logs, settings. |
In plain words: Every phone that signs in appears in Configuration → Devices with its app version and the last time it was seen; delete a device to sign it out. Accounts with two-factor authentication cannot use the app.
The app: sign in and pick the site
In plain words: Enter the address of your Odoo, the login and the password. After signing in the app shows the sites of the user with the distance from the phone and a badge when the phone is inside the site's geofence.
The daily site dashboard
In plain words: The dashboard is the foreman's home: the shift status, the weather, the headcount tiles, the equipment health, delay hours, open punch items, today's deliveries and a big Submit shift button. A timeline lists what happened today.
In plain words: Weather. When the phone is online the app reads temperature, rain, wind and conditions for the site's position from the free Open-Meteo service and marks the source weather service. Offline, or if you disagree, tap the card and type the values (entered by the foreman), including the ground condition (dry, damp, wet, muddy, frozen, flooded).
Manpower and equipment counters
In plain words: Manpower. Add a line: the subcontractor, the trade, then use the large headcount counter (hold to repeat; every tap gives a vibration), set regular and overtime hours per worker, and see the man-hours at once. Same crews as the last log copies the crews of your previous log. Quantity surveyors and managers also see the estimated cost.
In plain words: Equipment. Pick a machine (owned or rented), the meter start comes from the last reading, type the end reading (active hours are suggested from the difference), idle and breakdown hours, the fuel taken and the operator. The app checks that the end reading is not below the start and that the hours of a machine do not exceed 24.
Delays, photos, notes and the signature
In plain words: Record delays by category (weather halt, client stoppage, permit delay, material shortage, equipment breakdown, labor shortage, safety stoppage, other) with the hours and a note. Add photos (progress, safety or general) with a caption; the app compresses them on the phone and keeps them until they are sent.
In plain words: Submit shift. The checklist shows what is still missing (weather, crews, meters, photos); then the foreman signs with his finger. The app records the distance to the site; outside the geofence it explains and, if the site enforces it, asks for a reason.
Blueprints and the pin-drop punch list
In plain words: Open Plans: the sheets of the site with their revision and whether they are available offline. The first time a sheet is downloaded (once per version); after that it opens instantly without network. PDFs are rendered natively, page by page, in vector quality, so lines stay sharp at any zoom; pictures use the same viewer.
- Zoom to the room, press Add pin (the large button at the bottom right), and tap the exact spot; a loupe helps to place it precisely.
- Write the title, choose the trade responsible and, if you know it, the subcontractor, the severity (low, medium, critical safety hazard) and the target date.
- Take a photo and mark it up with the pen, arrow, circle or text; the markup is kept as data and also drawn into the photo.
- Save: the pin stays on the plan and goes to Odoo with the next sync.
The punch list and its workflow
In plain words: Each pin goes through four statuses; Odoo enforces the rules, whether the change is made in the app or in Odoo:
| Change | Who | Rule |
|---|---|---|
| Open → In review | Any jobsite user | The subcontractor is looking at it. |
| In review → Rectified | Foreman | At least one after photo is required. |
| Rectified → Closed | Project manager or quantity surveyor | The inspector accepts the work. |
| Rectified or Closed → Open | Project manager or quantity surveyor | Reopening needs a comment. |
In plain words: A critical pin immediately creates a to-do for the project manager. In Odoo the Punch list is a kanban by status, a list, a graph and a pivot by subcontractor, and every pin has a chatter and a history.
Receiving deliveries: the digital GRN
In plain words: When a truck arrives, open Deliveries: the app lists the open purchase orders of the site with the remaining quantities (downloaded in advance, so it works offline).
- Pick the purchase order, then for each line type the quantity received now (and a rejected quantity with a reason and a condition if something is damaged or wrong); Receive all fills the remaining quantities.
- The app warns about differences: short (a backorder will be created), over-delivery beyond the tolerance (blocked), nothing received.
- Take the mandatory photos: the delivery ticket (weight ticket or bill of lading) and the vehicle plate. Scan the ticket number with the camera or read it with the on-device text recognition; the plate can be read the same way.
- Optionally the driver signs. Press Save receipt.
In plain words: In Odoo the receipt of the purchase order is validated with the quantities counted; if some are short a backorder is created and stays on the purchase order. The delivery (GRN) keeps the lines, the photos (also attached to the receipt), the signature and the position, and the received value counts as material cost.
Offline first and synchronisation
In plain words: Everything the foreman does is written to the phone's database first and to an outbox with an unchangeable sequence number and a unique ID. The app sends the outbox in order whenever there is a connection (and in the background), compressing photos first; Odoo applies each operation once, so a retry never creates a second pin or a second delivery.
| Situation | What happens |
|---|---|
| Basement without signal | Work as usual; the app shows offline and the number of waiting items. |
| Back online | The outbox is sent in order; photos follow their parent record; the status chip turns green. |
| The log was already submitted | Odoo answers locked; the Sync issues screen explains it. |
| A delivery for an order with nothing to receive, an over-delivery, a missing photo | The operation is refused with a plain message in Sync issues; retry after fixing, or discard (with confirmation). |
| Two foremen drop pins at once | Both are saved; each pin has its own ID. |
Approving logs and the daily log report
In plain words: The project manager opens Jobsite → Site → To approve (or does it in the app), checks the log and presses Approve, or Reject with a reason: the foreman gets a to-do, the costs of the log are removed, he corrects and submits again. Logs submitted outside the geofence carry a to-do for the manager.
In plain words: Print report makes the daily log PDF: weather, crews, machines, delays, deliveries, pins found, photos, the foreman's signature and the approval, ready to send to the client.
Reports
In plain words: Jobsite → Reporting has the Budget versus actual list of all sites and the Cost analysis pivot and graph by site, cost type, partner and week. Daily logs have a calendar, a pivot of man-hours by site and week and a graph; the punch list has a graph by trade and status and a pivot by subcontractor.
Tablets
In plain words: On a tablet (about 8 inch and up) the app uses two panes: the list on the left and the drawing or the detail on the right, so you can read the punch list while the plan is open.
Build and publish the app
In plain words: Unzip
flutter-app-source.zip. The README in the folder is the full guide; the short version:- Install Flutter 3.41 or newer (
flutter doctormust be green for your platforms). - Run the setup script with your server address and your package name; it also sets the app name and the accent colour:
dart run tools/setup.dart --url https://odoo.example.com --package com.yourcompany.jobsite
- Replace the placeholder icon in
assets/brandingand runflutter pub get. - Android:
flutter build apk --release(orappbundlefor Google Play). iPhone and iPad:flutter build ios --release, then archive in Xcode. - Install the app on the phones. The language (English or Arabic) and the theme (light, dark, automatic) are in the app settings.
Important: Android release builds need an https address. For a closed LAN you can enable local http as described in the app README.
API for developers
In plain words: Everything the app does is available through a small REST API (
/api/jobsite/v1); the contract is in documentation/API.md. Operations are idempotent and numbered, so you can also write your own client or import data.# is the server reachable?
curl https://odoo.example.com/api/jobsite/v1/ping
# {"ok": true, "api_version": 1, "server_time": "2026-10-27T05:00:00Z"}
# sign in (returns a token, the roles and the sites of the user)
curl -X POST https://odoo.example.com/api/jobsite/v1/auth/login -H 'Content-Type: application/json' \
-d '{"login": "faisal@example.com", "password": "...", "device": {"id": "phone-1", "platform": "ios"}}'
# drop a punch-list pin (idempotent: the same operation uuid is applied once; x and y are 0..1 of the page)
curl -X POST https://odoo.example.com/api/jobsite/v1/op/pin_create -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"uuid": "4c1f...", "pin": {"uuid": "a9d2...", "project_id": 2, "plan_id": 3, "page": 1, "x": 0.31, "y": 0.62,
"title": "Exposed rebar in the slab edge", "severity": "critical", "trade_id": 4}}'
# receive a delivery against a purchase order (short quantities create a backorder in Inventory)
curl -X POST https://odoo.example.com/api/jobsite/v1/op/delivery_receive -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"uuid": "77aa...", "delivery": {"uuid": "b1c3...", "project_id": 2, "purchase_id": 7, "ticket_no": "DN-88213", "plate": "DXB L 45219",
"lines": [{"po_line_id": 21, "received": 20}]}, "photos": [{"kind": "ticket", "image_b64": "..."}, {"kind": "plate", "image_b64": "..."}]}'| Call | Use |
|---|---|
POST /auth/login | Token, roles and sites. |
GET /bootstrap | Trades, subcontractors, equipment, plans, pins, logs, deliveries, settings. |
GET /changes?cursor= | Only what changed since the last sync. |
POST /sync, POST /op/<type> | An ordered batch of up to 100 operations or a single one (log_upsert, log_submit, pin_create, pin_status, photo_add, delivery_receive, ...). |
GET /plans/<id>/file | The drawing with an ETag (its SHA-256). |
GET /projects/<id>/purchase-lines | Open purchase lines of the site. |
GET /projects/<id>/budget | Budget versus actual (managers). |
Update, backup and uninstall
In plain words: Replace the module folder with the new version, restart Odoo and run
-u taqnix_construction_jobsite. Logs, pins, deliveries and settings are kept. Update the app by rebuilding from the new source; the API is versioned (/v1) and older apps keep working with newer modules within the same version.In plain words: Back up the database and the filestore as usual (drawings and photos are in the filestore). Uninstalling the module removes its records; the analytic cost lines it created, the purchase orders, receipts and invoices stay in Odoo.
Troubleshooting
| Problem | Cause and fix |
|---|---|
| The app says no site is assigned | Add the user to Foremen on the project (Jobsite tab) and make sure Jobsite reporting is ticked. |
| A foreman cannot submit: outside the site | The site enforces the geofence: check the coordinates and radius on the project, or give a reason. |
| The log shows costs 0 | Costs are posted when the log is submitted (or approved, see the settings) and need a rate: set the trade default rate or a rate card. |
| Material cost is 0 | Tick the site on the purchase order (field Jobsite) and validate receipts; or switch the material basis to vendor bills. |
| No open purchase orders in the app | The purchase order must be confirmed, marked with the site and still have something to receive in Inventory. |
| A delivery is refused: missing photo | Take the ticket and the plate photos, or switch those requirements off in the settings. |
| A pin cannot be set to rectified | Add an after photo first. |
| The plan does not appear in Odoo's viewer | Upload a picture of the first page in the Preview field when the drawing is a PDF; the app shows the PDF itself. |
| Weather is not filled | The phone has no connection: type it. The weather service needs the position of the site. |
| The app cannot reach an http server | Android release builds need https: use https, or enable local http for a closed LAN. |
Support
In plain words: Updates are free. Installation help and bug fixes are included for 6 months.
Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.