This page describes two sub-modules of fleet. The maintenance sub-module in src/cluster_erp/modules/fleet/maintenance/ holds maintenance plans and the reminders the engine computes from them. The workorders sub-module in src/cluster_erp/modules/fleet/workorders/ holds work orders, their items, and their spare-part lines. The module overview and the end-to-end maintenance diagram are on fleet module.
Scope and source¶
- Defined in:
src/cluster_erp/modules/fleet/models.py(FleetMaintenancePlan,FleetMaintenanceReminder,FleetWorkOrder,FleetWorkOrderItem,FleetWorkOrderPart),maintenance/services.py(FleetPlanService,FleetReminderService),workorders/services.py(FleetWorkOrderService), and theroutes.pyandmetadata.pyfiles of both folders. - Count: 5 tables, 23 routes (9 in
maintenance/routes.py, 14 inworkorders/routes.py), 9ActionMetaentries (4 inmaintenance/metadata.py, 5 inworkorders/metadata.py).
Plan fields¶
| Name | Meaning | Source |
|---|---|---|
name, task |
Plan name and the work to do | src/cluster_erp/modules/fleet/models.py:321-322 |
asset_id, class_id |
Target: exactly one asset or one class | src/cluster_erp/modules/fleet/models.py:323-328, src/cluster_erp/modules/fleet/maintenance/services.py:99-106 |
interval_days |
Calendar interval | src/cluster_erp/modules/fleet/models.py:329 |
meter_kind, meter_interval |
Meter interval on a meter kind | src/cluster_erp/modules/fleet/models.py:330-331 |
threshold_value, threshold_direction |
Due when the displayed counter is above or below the value |
src/cluster_erp/modules/fleet/models.py:332-333 |
calculate_from, start_date |
schedule (fixed cadence from the start date) or last_completion (default) |
src/cluster_erp/modules/fleet/models.py:334-337, src/cluster_erp/modules/fleet/models.py:67 |
lead_days, tolerance_days |
Days before due that count as due soon (default 14), grace days before overdue (default 0) | src/cluster_erp/modules/fleet/models.py:338-339 |
season_from, season_to |
Season window as MM-DD |
src/cluster_erp/modules/fleet/models.py:340-341 |
suppressed_by_plan_id |
A covering plan that keeps this plan's reminder quiet while it is due | src/cluster_erp/modules/fleet/models.py:342-344 |
Reminder engine¶
A reminder (FleetMaintenanceReminder) is engine output, one live row per plan and asset. Its status is computed and never edited (src/cluster_erp/modules/fleet/maintenance/services.py:17-19).
- A plan needs at least one rule: a day interval, a meter interval, or a meter threshold. A threshold needs a direction, and a season needs both boundaries in
MM-DD(src/cluster_erp/modules/fleet/maintenance/services.py:99-143). - The calendar rule steps from the start date in
schedulemode, or adds the interval to the last completion (src/cluster_erp/modules/fleet/maintenance/services.py:508-518). - The meter rule turns the remaining usage into days through the meter's daily rate over the last five valid readings (
src/cluster_erp/modules/fleet/maintenance/services.py:48,src/cluster_erp/modules/fleet/maintenance/services.py:520-546). - When both a calendar date and a meter date exist, the earlier one wins. A date outside the season moves to the next season start (
src/cluster_erp/modules/fleet/maintenance/services.py:273-288,src/cluster_erp/modules/fleet/maintenance/services.py:578-586). - A threshold hit makes the reminder due today and latches until a completion after the hit (
src/cluster_erp/modules/fleet/maintenance/services.py:548-577). - The status is
snoozedwhile a snooze date lies ahead,overdueafter due date plus tolerance,due_soonfrom due date minus lead days, andokotherwise (src/cluster_erp/modules/fleet/maintenance/services.py:588-597). - A plan with
suppressed_by_plan_idgetsis_suppressedwhile the covering reminder is due (src/cluster_erp/modules/fleet/maintenance/services.py:438-461). - Editing a plan recomputes its reminders and retires the ones that no longer match. Deleting a plan retires all its reminders (
src/cluster_erp/modules/fleet/maintenance/services.py:175-254).
The engine runs when a reading is posted, an asset is created, a plan changes, a reminder action runs, or a work order completes (src/cluster_erp/modules/fleet/meters/services.py:311, src/cluster_erp/modules/fleet/assets/services.py:244-248, src/cluster_erp/modules/fleet/maintenance/services.py:403). POST /maintenance/reminders/recompute runs it for one asset or for all assets that are not disposed (src/cluster_erp/modules/fleet/maintenance/routes.py:141-153, src/cluster_erp/modules/fleet/maintenance/services.py:409-416). A scheduled call of recompute_all was not found in src/, deploy/, webapp/, or gated_apps/.
| Action | Label | Condition | Endpoint | Source |
|---|---|---|---|---|
create_work_order |
Create Work Order | none | POST /maintenance/reminders/{id}/actions/create_work_order |
src/cluster_erp/modules/fleet/maintenance/metadata.py:318-326 |
complete |
Record Completion | none | POST /maintenance/reminders/{id}/actions/complete |
src/cluster_erp/modules/fleet/maintenance/metadata.py:327-343 |
snooze |
Snooze | status is ok, due_soon, or overdue |
POST /maintenance/reminders/{id}/actions/snooze |
src/cluster_erp/modules/fleet/maintenance/metadata.py:344-363 |
unsnooze |
Wake Up | status is snoozed |
POST /maintenance/reminders/{id}/actions/unsnooze |
src/cluster_erp/modules/fleet/maintenance/metadata.py:364-373 |
Snoozing needs a future date. Completion refuses a future date, records the current life-to-date of the plan's meter, and clears the snooze (src/cluster_erp/modules/fleet/maintenance/services.py:340-389).
Work order fields¶
| Name | Meaning | Source |
|---|---|---|
code |
Business key from the sequence fleet_work_order |
src/cluster_erp/modules/fleet/models.py:391, src/cluster_erp/modules/fleet/workorders/services.py:108 |
asset_id, title, description |
Asset and work description | src/cluster_erp/modules/fleet/models.py:393-395 |
status, priority |
Default draft and normal |
src/cluster_erp/modules/fleet/models.py:396-397, src/cluster_erp/modules/fleet/models.py:70-71 |
planned_date, started_at, completed_at |
Dates | src/cluster_erp/modules/fleet/models.py:398-400 |
is_external, vendor_party_id, purchase_request_id |
External service, vendor party, linked purchase request | src/cluster_erp/modules/fleet/models.py:404-406 |
reminder_id |
The reminder that opened the order | src/cluster_erp/modules/fleet/models.py:408 |
currency, labor_cost, external_cost, parts_cost, total_cost |
Costs Numeric(18, 2); parts and total are computed |
src/cluster_erp/modules/fleet/models.py:409-413 |
completion_odometer |
Odometer recorded at completion | src/cluster_erp/modules/fleet/models.py:414 |
An item (FleetWorkOrderItem) has a typed source: scheduled_maintenance, fault, inspection_defect, form, issue, or manual (src/cluster_erp/modules/fleet/models.py:71-78, src/cluster_erp/modules/fleet/models.py:418-433). A part line (FleetWorkOrderPart) carries the mandatory product, model, and version, a warehouse, a quantity, a unit cost, and a status planned or issued (src/cluster_erp/modules/fleet/models.py:436-452).
Work order statuses and actions¶
stateDiagram-v2 [*] --> draft draft --> open: release open --> in_progress: start open --> completed: complete in_progress --> completed: complete draft --> cancelled: cancel open --> cancelled: cancel
In prose: an order starts as draft, is released to open, can be started, and is completed from open or in_progress. It can be cancelled from draft or open (src/cluster_erp/modules/fleet/workorders/services.py:47-53).
| Action | Label | Condition | Endpoint | Source |
|---|---|---|---|---|
release |
Release | status is draft |
POST /work-orders/{id}/actions/release |
src/cluster_erp/modules/fleet/workorders/metadata.py:82-90 |
start |
Start Work | status is open |
POST /work-orders/{id}/actions/start |
src/cluster_erp/modules/fleet/workorders/metadata.py:91-97 |
complete |
Complete | status is open or in_progress |
POST /work-orders/{id}/actions/complete |
src/cluster_erp/modules/fleet/workorders/metadata.py:98-122 |
cancel |
Cancel | status is draft or open |
POST /work-orders/{id}/actions/cancel |
src/cluster_erp/modules/fleet/workorders/metadata.py:123-131 |
issue |
Issue from Stock | part status is planned |
POST /work-order-parts/{id}/actions/issue |
src/cluster_erp/modules/fleet/workorders/metadata.py:448-456 |
Work order rules¶
- A new order checks the asset and, when given, the purchase request through
GetPurchaseRequestById. An order opened from a reminder gets a first item with sourcescheduled_maintenance(src/cluster_erp/modules/fleet/workorders/services.py:103-121,src/cluster_erp/modules/fleet/workorders/services.py:367-396). - Items and parts can change only while the order is
draft,open, orin_progress(src/cluster_erp/modules/fleet/workorders/services.py:55,src/cluster_erp/modules/fleet/workorders/services.py:544-550). - A part line checks the product breakdown through
ensure_product_breakdownand needs a positive quantity. Its total is quantity times unit cost, rounded withROUND_HALF_EVENto two decimals (src/cluster_erp/modules/fleet/workorders/services.py:412-446). - Issuing a part locks the line, needs a released order, and posts
PostGoodsIssueto inventory with the order as reference. A refusal from inventory fails the action (src/cluster_erp/modules/fleet/workorders/services.py:464-514). - An issued part line cannot be removed, and an order with issued parts cannot be cancelled (
src/cluster_erp/modules/fleet/workorders/services.py:448-462,src/cluster_erp/modules/fleet/workorders/services.py:158-166). parts_costis the sum of part totals;total_costadds labour, external, and parts costs when any of them is set (src/cluster_erp/modules/fleet/workorders/services.py:528-542).- Completion needs every planned part issued or removed and a date not in the future. It can record an odometer reading with source
work_order, completes every linked reminder, and returns the asset to service when no other order is open (src/cluster_erp/modules/fleet/workorders/services.py:191-295). - Only a
draftorcancelledorder can be deleted; the delete setsdeleted_at(src/cluster_erp/modules/fleet/workorders/services.py:177-189).
Routes¶
| Router | Paths | Source |
|---|---|---|
plan_router |
/maintenance/plans list, create, read, update, delete |
src/cluster_erp/modules/fleet/maintenance/routes.py:25, src/cluster_erp/modules/fleet/maintenance/routes.py:31-86 |
reminder_router |
/maintenance/reminders list, read, action, POST /recompute |
src/cluster_erp/modules/fleet/maintenance/routes.py:26-28, src/cluster_erp/modules/fleet/maintenance/routes.py:89-153 |
wo_router |
/work-orders list, create, read, update, action, delete |
src/cluster_erp/modules/fleet/workorders/routes.py:27, src/cluster_erp/modules/fleet/workorders/routes.py:32-120 |
wo_item_router |
/work-order-items list, create, update, delete |
src/cluster_erp/modules/fleet/workorders/routes.py:28, src/cluster_erp/modules/fleet/workorders/routes.py:123-170 |
wo_part_router |
/work-order-parts list, create, issue, delete |
src/cluster_erp/modules/fleet/workorders/routes.py:29, src/cluster_erp/modules/fleet/workorders/routes.py:173-217 |
The delete routes of items and parts set deleted_at on the line (src/cluster_erp/modules/fleet/workorders/services.py:349-355, src/cluster_erp/modules/fleet/workorders/services.py:448-462).
Terms introduced¶
| Term | Code identifier | Definition | Turkish term | Source |
|---|---|---|---|---|
| maintenance plan | FleetMaintenancePlan |
The organisation's rule for when an asset or a class needs a maintenance task. | Bakım planı | src/cluster_erp/modules/fleet/models.py:314 |
| maintenance reminder | FleetMaintenanceReminder |
The computed due state of one plan for one asset. | Bakım hatırlatması | src/cluster_erp/modules/fleet/models.py:348 |
| part line | FleetWorkOrderPart |
A spare part planned on a work order and issued from stock. | Parça satırı | src/cluster_erp/modules/fleet/models.py:436 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.