Skip to content
TAQNIX
Odoo ModulesWordPress PluginsWordPress ThemesShopify ThemesApp TemplatesScripts & UtilitiesBlogSell on TAQNIX

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.
The site app on a phone and a tablet, and the project in Odoo.
The site app on a phone and a tablet, and the project in Odoo.
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

ItemWhat it is
taqnix_construction_jobsite.zipThe 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.zipThe 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.txtHistory of the versions.

How a working day runs

MomentWhoWhat happensIn Odoo
MorningForemanOpens 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 dayForemanAdds 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 shiftForemanRuns 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 morningProject managerApproves the log or rejects it with a reason; follows the critical pins.Approved log, a to-do for the foreman after a rejection.
Any timeQuantity surveyorCompares 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

ItemDetails
Odoo19.0 Community or Enterprise. Project, Timesheets, Purchase, Inventory and Invoicing are installed automatically with the module.
Chart of accountsAny localization; the purchase orders and vendor bills use it. Costs of the logs are posted on the analytic account of the project.
AddressA 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 tabletsAndroid 8 or newer, or iPhone / iPad with iOS 15 or newer, with a camera and GPS. A tablet is best for the drawings.
WeatherThe 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 appA 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 accountsGoogle Play Console and Apple Developer Program, or internal distribution to your own staff.

Install the Odoo module

  1. Unzip the package. Inside is taqnix_construction_jobsite.zip; unzip it to get the folder taqnix_construction_jobsite.
  2. Copy the folder into one of the addons_path folders of your Odoo server and restart Odoo.
  3. Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
  4. 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

  1. 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).
  2. Give users the groups Foreman, Quantity Surveyor or Project Manager (chapter 13).
  3. Mark your subcontractors (Configuration → Subcontractors) and set their trades and the rate cards (chapter 8).
  4. Add the equipment with its rates and fuel prices (chapter 9).
  5. Enter the budget of the site by labor, equipment, material and other (chapter 10) and tick the site on its purchase orders.
  6. Upload the drawings (PDF or pictures) (chapter 11).
  7. 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.
The Jobsite tab of a project: foremen, geofence, budget and actual.
The Jobsite tab of a project: foremen, geofence, budget and actual.
FieldWhat it does
ForemenUsers 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 radiusWhere 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 siteOn: 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 completePhysical 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 cards: the most specific card wins.
Rate cards: the most specific card wins.
Rate used (in this order)Example
Card of the project and the subcontractorGulf MEP on Marina Heights: 26.00 per hour
Card of the projectAll masons on Marina Heights: 17.50
Card of the subcontractorSteelworks United everywhere: 18.50
Default rate of the tradeMEP: 24.00
Cards can have datesA 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).
Subcontractors with their trades.
Subcontractors with their trades.

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.
The fleet with last meter readings and rates.
The fleet with last meter readings and rates.
SettingMeaning
Hourly rateCharge-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 includedFuel is charged on top unless the hire is wet (fuel included).
Last meter readingUpdated 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:
LineWhere the actual cost comes from
LaborThe crew lines of the submitted (or approved) daily logs: man-hours × rates, posted on the analytic account of the project.
EquipmentThe machine lines of the logs: hours, idle, fuel.
MaterialValidated 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.
OtherAny other analytic cost of the site account (timesheets of your own staff, expenses).
Budget versus actual of all sites: variance, percent used, cost performance index.
Budget versus actual of all sites: variance, percent used, cost performance index.
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.
Cost analysis by week and type.
Cost analysis by week and type.
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.
The drawings of the sites with their open pins.
The drawings of the sites with their open pins.
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.
The plan viewer in Odoo with the pins of the sheet.
The plan viewer in Odoo with the pins of the sheet.
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

Jobsite → Configuration → Settings.
Jobsite → Configuration → Settings.
SettingMeaning
Foreman signature to submitThe foreman signs on the screen; the signature is stored on the log and printed on the report.
Post the costsWhen the foreman submits (default: the budget moves the same day) or when the manager approves.
Block submission outside the site, default radiusDefaults copied to new projects.
Remind foremen about missing logsAfter the chosen local hour a foreman who has not started the day's log gets a to-do.
Delivery ticket / plate photo is mandatoryThe app refuses a delivery without them.
Over-delivery tolerance (%)How much more than ordered a delivery may bring.
Material actuals fromValidated receipts or posted vendor bills.
Photo size, qualityThe app shrinks photos on the phone before sending.

Roles and devices

Group (Construction Jobsite)Can
ForemanSign in to the app for the assigned sites: daily logs, punch list, drawings, deliveries. Cannot see rates, costs or budgets.
Quantity SurveyorEverything a foreman can on all sites, plus rates, costs, budget versus actual; closes and reopens pins.
Project ManagerEverything, 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.
Devices that signed in.
Devices that signed in.

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.
Sign-in.
Sign-in.
The site picker with the distance and the state of today's log.
The site picker with the distance and the state of today's log.

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.
The dashboard in light mode (best in sunlight).
The dashboard in light mode (best in sunlight).
Dark mode.
Dark mode.
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).
The weather card.
The weather card.

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.
The crew counters with man-hours.
The crew counters with man-hours.
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.
The machine log.
The machine log.

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.
Delays by category.
Delays by category.
Photos of the day.
Photos of the day.
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.
The signature sign-off.
The signature sign-off.

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.
The drawings of the site.
The drawings of the site.
A plan with the pins of all severities: pinch to zoom, drag to pan.
A plan with the pins of all severities: pinch to zoom, drag to pan.
  1. 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.
  2. 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.
  3. 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.
  4. Save: the pin stays on the plan and goes to Odoo with the next sync.
Placing a pin.
Placing a pin.
Marking up the photo.
Marking up the photo.

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:
ChangeWhoRule
Open → In reviewAny jobsite userThe subcontractor is looking at it.
In review → RectifiedForemanAt least one after photo is required.
Rectified → ClosedProject manager or quantity surveyorThe inspector accepts the work.
Rectified or Closed → OpenProject manager or quantity surveyorReopening needs a comment.
A pin with its photos, history and the next action.
A pin with its photos, history and the next action.
The punch list with filters by status, severity, trade and subcontractor.
The punch list with filters by status, severity, trade and subcontractor.
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.
The punch list in Odoo.
The punch list in Odoo.
A pin in Odoo with its status buttons.
A pin in Odoo with its status buttons.

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).
Open purchase orders of the site.
Open purchase orders of the site.
  1. 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.
  2. The app warns about differences: short (a backorder will be created), over-delivery beyond the tolerance (blocked), nothing received.
  3. 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.
  4. Optionally the driver signs. Press Save receipt.
Quantities with the discrepancy warning.
Quantities with the discrepancy warning.
Ticket and plate photos with the scanned ticket number.
Ticket and plate photos with the scanned ticket number.
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.
The result: complete or partial with the backorder.
The result: complete or partial with the backorder.
The GRN in Odoo with its receipts.
The GRN in Odoo with its receipts.

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.
SituationWhat happens
Basement without signalWork as usual; the app shows offline and the number of waiting items.
Back onlineThe outbox is sent in order; photos follow their parent record; the status chip turns green.
The log was already submittedOdoo answers locked; the Sync issues screen explains it.
A delivery for an order with nothing to receive, an over-delivery, a missing photoThe operation is refused with a plain message in Sync issues; retry after fixing, or discard (with confirmation).
Two foremen drop pins at onceBoth are saved; each pin has its own ID.
Offline: the queue of waiting items.
Offline: the queue of waiting items.
Sync issues with Retry and Discard.
Sync issues with Retry and Discard.

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.
Daily logs with man-hours, delay hours and (for managers) costs.
Daily logs with man-hours, delay hours and (for managers) costs.
A log in Odoo: weather, crews with rates, totals and costs.
A log in Odoo: weather, crews with rates, totals and costs.
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.
The daily log report.
The daily log report.

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.
Cost analysis pivot.
Cost analysis pivot.
Daily logs in the calendar.
Daily logs in the calendar.
Managers see the budget versus actual in the app too.
Managers see the budget versus actual in the app too.

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.
The plan viewer on a tablet.
The plan viewer on a tablet.
The punch list beside the plan.
The punch list beside the plan.
The dashboard on a tablet.
The dashboard on a tablet.

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:
  1. Install Flutter 3.41 or newer (flutter doctor must be green for your platforms).
  2. 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
  3. Replace the placeholder icon in assets/branding and run flutter pub get.
  4. Android: flutter build apk --release (or appbundle for Google Play). iPhone and iPad: flutter build ios --release, then archive in Xcode.
  5. Install the app on the phones. The language (English or Arabic) and the theme (light, dark, automatic) are in the app settings.
App settings: language, theme, units, storage.
App settings: language, theme, units, storage.
The dashboard in Arabic (right to left).
The dashboard in Arabic (right to left).
The plan viewer in Arabic.
The plan viewer in Arabic.
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": "..."}]}'
CallUse
POST /auth/loginToken, roles and sites.
GET /bootstrapTrades, 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>/fileThe drawing with an ETag (its SHA-256).
GET /projects/<id>/purchase-linesOpen purchase lines of the site.
GET /projects/<id>/budgetBudget 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

ProblemCause and fix
The app says no site is assignedAdd the user to Foremen on the project (Jobsite tab) and make sure Jobsite reporting is ticked.
A foreman cannot submit: outside the siteThe site enforces the geofence: check the coordinates and radius on the project, or give a reason.
The log shows costs 0Costs 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 0Tick 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 appThe purchase order must be confirmed, marked with the site and still have something to receive in Inventory.
A delivery is refused: missing photoTake the ticket and the plate photos, or switch those requirements off in the settings.
A pin cannot be set to rectifiedAdd an after photo first.
The plan does not appear in Odoo's viewerUpload 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 filledThe phone has no connection: type it. The weather service needs the position of the site.
The app cannot reach an http serverAndroid 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.