# Farm & Crop Management for Agriculture

> Farm and crop management: cycles per field, a spray record an inspector can read, withholding periods that stop a harvest, cost per kilo.

- **What it is:** Farm and crop management: cycles per field, a spray record an inspector can read, withholding periods that stop a harvest, cost per kilo.
- **For:** Industries
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 119 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_farm
- **Not for:** Said before you buy, because it is the half that decides whether the app fits:; Count planned work: a spray planned for next week holds nothing back - only signed-off work counts.; Sign off an operation that names no product, or record work on a harvested or cancelled cycle unless marked as a late entry.
- **Manual:** https://docs.bambooforge.dev/bambooforge_farm/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_farm.action_bf_crop_cycle
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_farm
- **Manual last updated:** 2026-10-15

---
# Farm & Crop Management for Agriculture

Built around the two things a farm gets audited on and the one number
it never knows.

## The withholding period

- Every input carries a **withholding period** in days and the
  registration number off its label. Zero for a fertiliser; never zero
  for a plant protection product unless the label really says so.
- Signing off a spray sets an **earliest legal harvest date** on the
  crop cycle, taken from the longest period among the products applied.
  The cycle names the spray that is holding it.
- Harvesting before that date is **refused**, and the refusal names the
  product, the day it was applied and the number of days. Cutting
  inside a withholding period is a rejected load, a failed residue test
  and, in most places, an offence.
- The harvest date itself is **bounded**: not in the future, not before
  the crop went in the ground. A date in the future clears every
  withholding period ever recorded, which is the one keystroke that
  would walk a load straight out of the field.
- A spray **planned for next week** holds nothing back - only signed-off
  work counts. A spray still sitting as *planned* and **dated before the
  harvest** is a different animal: it is a withholding period nobody
  counted, and the harvest is refused until somebody says whether it
  happened.
- Work cannot be recorded or signed off on a cycle that has been
  **harvested, written off or cancelled** unless it is marked as a late
  entry. When a late entry proves the crop was cut inside a withholding
  period, a **red flag** is written on the cycle naming the day it was
  cut and the day it could legally have been.

## The spray record

- Product, batch, registration number, quantity, the **rate that
  actually went on per hectare**, the operator, the wind and the
  weather.
- An operation that says something was applied but **names no product**
  cannot be signed off. It is the entry an inspector reads first.
- A pesticide, herbicide or fungicide cannot be applied by an operator
  with **no spray licence** on file, and not with one that had
  **expired on the day**. The rule follows the product, not the box
  somebody ticked: a herbicide recorded under *Weeding* is still a
  herbicide and still needs a licensed operator.
- The withholding period and the registration are **copied onto the
  line as it is applied**, not read through a relation, and they are
  never typed in - anything a client, an import or an RPC call sends
  for them is dropped and re-read from the label. Correct a line from a
  fertiliser to a pesticide and it becomes a pesticide, period and all.
  If the label changes next year, what happened this year stays what
  happened this year.
- A signed entry is **locked**: its date, kind, operator, products,
  area, hours, rates and wind are what happened. Its state moves only
  through *Done* and *Cancel*, so it cannot be written back to
  cancelled and take its withholding period and its cost with it, and
  it cannot be repointed at another crop. Notes and the weather stay
  editable, because a note is not the record.
- **Who signed it off** is recorded from the session, next to the
  operator somebody typed in.
- A signed entry cannot be **deleted**, and neither can a cycle that
  carries one or that has been harvested or written off. Corrections
  are new entries; the field record is not something you tidy up.

## The costing

- Inputs, labour and machinery roll up from signed-off operations onto
  the cycle: **total, per hectare and per unit harvested**.
- The yield is measured against the **expected yield for that crop**,
  so a season ends with a variance rather than a feeling.
- A crop **written off** keeps its cost. The money was spent either
  way, and a failed field that shows zero teaches nobody anything.

## The land

- Live cycles on a field cannot add up to **more than its area**, and
  an operation cannot cover more hectares than were planted. The rule
  is checked from both ends: a field's area cannot be **corrected
  downwards** under the crops already standing on it, and the parcel is
  locked while it is checked, so two cycles entered at the same moment
  on two screens cannot both fit on ground that holds one of them.
- Harvesting, cancelling or writing off a cycle **frees the ground**
  again.
- Every cycle ever grown on a parcel stays on it - what went in, what
  it cost, what came off. Which is what the rotation, a buyer and an
  organic inspector all ask for.

## The season

- A crop cycle runs *planned -> growing -> harvested*, or is written
  off, or is cancelled while nothing has been done to it.
- The harvest is recorded through a short form that insists on a
  **weight** that is a weight and a moisture that is a percentage, and
  warns on screen while a spray - or a date in the future - stands in
  the way.
- Crops **coming due within a week** - and crops still held by a spray
  - land on the list of **whoever planned the cycle**, or of a manager
  if they have left the farm. Once each, even after the reminder has
  been dealt with, and the date on it follows the hold every time
  another spray is signed off.

## Roles

- **Field operator** - records what was done in the field and what was
  applied. Cannot plan a season, harvest, or configure.
- **Farm manager** - plans the season, opens and closes cycles, records
  the harvest, and configures farms, fields, crops and inputs.

## Installation

1. Copy `bambooforge_farm` into your addons path and update the app list, or install the ZIP from the Odoo Apps Store. Community only; it depends on `base`, `base_setup`, `mail`, `product` and `uom`.
2. Install **Farm & Crop Management for Agriculture**.
3. Create the farms, then the fields with their real measured area.
4. Create the crops with their unit and expected yield.
5. Create the inputs with their withholding days and registration numbers.
6. Put spray licence numbers on the operators' user records before the first spray, or the first spray cannot be signed off.

## How we make sure it works

Before every release, **128 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- A spray cannot be signed off on a written off cycle.
- A cycle cannot be planted on another company's field.
- A spray that names no product cannot be signed off.
- A cycle with work on it cannot be cancelled.
- A signed entry cannot be repointed at another cycle.

The complete list is in the source you receive.

## What it does not do

Said before you buy, because it is the half that decides whether the app fits:

- Count planned work: a spray planned for next week holds nothing back - only signed-off work counts.
- Sign off an operation that names no product, or record work on a harvested or cancelled cycle unless marked as a late entry.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Discuss, Products, Settings, Units of Measure apps. No extra Python package.

****Where does it show up?****

Under the **Farm** menu (Crop cycles, Field record, Fields, Configuration).

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.

## Support

[support@bambooforge.dev](mailto:support@bambooforge.dev)
