Invoicing (sales invoices)#

ELT invoices mostly from two sources:

  1. Field Service tasks — when work is done, the task’s hours + expenses + products flow to the invoice
  2. Direct invoices — e.g. periodic invoice for a contract customer, advance payment, non-task-based

Typical flow: task → invoice#

  1. Installer marks the task done (state = “Done”).
  2. Foreman approves hours and expenses weekly (Approvals).
  3. Office creates the invoice:
    • Open the task → Action → “Create Invoice”.
    • Odoo creates an account.move (Draft state).
    • The installer’s logged hours × installer rate, expenses and product lines flow over automatically.
  4. Review: open the Draft invoice.
    • Check that rows, prices, VAT classes are correct.
    • The Resolution text (installer’s summary) appears in the invoice header / memo — the customer sees this.
  5. Confirm: Action → Post.
  6. Sending to customer and Netvisor:

Invoice structure#

Odoo’s account.move parts:

PartContents
CustomerCustomer (not location)
Invoice DateInvoicing date, defaults to today
Due DateDefault +30 days
Invoice LinesHours (service), expenses (service), products (storable)
TotalTotal including VAT

Task linkage#

account.move.line.fsm_order_ids is a Many2many field showing which tasks the line comes from. One line can (rarely) relate to multiple tasks, and one task can (commonly) produce multiple lines.

**OCA's field is plural: `fsm_order_ids`, not `fsm_order_id`!** Domain searches using the wrong name crash with "Invalid field … in leaf". (200.x fixed.)

Price verification#

The installer’s PWA shows wholesale price. But the invoice price is sales price = wholesale + ELT margin. Margin calculation:

  • Typical margin is set in the product’s list_price field in Inventory.
  • Customer-specific exceptions are handled with Pricelists.
  • Always verify at invoice time before Post.

Hour-for-hour vs. estimate#

The Hour-for-hour toggle is on the task form. If on: bill the hours the installer actually logged. If off: an estimate can be used (e.g. for a fixed-price contract customer).

At ELT, mostly hour-for-hour on — it’s more transparent.

Credit notes#

If the customer complains or a mistake is found after the fact:

  1. Open the Posted invoice.
  2. Action → “Reverse” → Reverse Entry.
  3. Odoo creates a “credit note” with the same total, negative.
  4. Create a new invoice with corrected contents if needed.

Don’t try to edit a posted invoice — integrity breaks, the audit chain is lost.

VAT policy#

  • General Finland: 25.5% (VAT law change after 1 Sep 2024; exceptional product categories)
  • Healthcare: 14%, 10%
  • Export: 0%
  • EU intra-community: reverse charge (invoice 0%, customer pays in their own country)

VAT classes are configured in Inventory → Configuration → Taxes. Required field at the product level.

Troubleshooting#

Task’s ‘Create Invoice’ button doesn’t appear
- Is the task in **state = Done**? Only completed tasks can be invoiced. - Has **approval been done** on all hours and expenses? - Does your account have the **`group_account_invoice` group**?
Invoice line missing even though installer logged hours
Check: - Line is in **`is_billed=True` state** but no invoice exists → ask the developer, this is a conflict state. - Line is **not yet approved** → shows "Submitted" and doesn't flow to invoice. - Line is on **a different task** than you thought → check `account.move.line.fsm_order_ids`.
Invoice doesn’t go to Netvisor
See [Netvisor integration](../netvisor/) → "Sales invoices" section and troubleshooting.