Invoicing (sales invoices)#
ELT invoices mostly from two sources:
- Field Service tasks — when work is done, the task’s hours + expenses + products flow to the invoice
- Direct invoices — e.g. periodic invoice for a contract customer, advance payment, non-task-based
Typical flow: task → invoice#
- Installer marks the task done (state = “Done”).
- Foreman approves hours and expenses weekly (Approvals).
- 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.
- 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.
- Confirm: Action → Post.
- Sending to customer and Netvisor:
- To customer: Action → Send & Print (PDF + email).
- To Netvisor: see Netvisor integration.
Invoice structure#
Odoo’s account.move parts:
| Part | Contents |
|---|---|
| Customer | Customer (not location) |
| Invoice Date | Invoicing date, defaults to today |
| Due Date | Default +30 days |
| Invoice Lines | Hours (service), expenses (service), products (storable) |
| Total | Total 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_pricefield 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:
- Open the Posted invoice.
- Action → “Reverse” → Reverse Entry.
- Odoo creates a “credit note” with the same total, negative.
- 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.