Skip to content

Inter-Company Transfers

Who this is for

Operations and accounting. You'll use this when devices need to physically change ownership between Reyder Enterprises and Axis Mobile — e.g. Reyder bought stock from a supplier and is now moving some of it over to Axis to resell.

What you'll accomplish: move a batch of devices from one company to the other, with the accounting (sale on the source side, receipt on the destination side) automatically mirrored.


When to use this

  • Reyder received a PO from a supplier and some of those devices are actually being bought by Axis.
  • Axis bought stock directly but Reyder's warehouse will store and sell it — you need to transfer ownership back to Reyder.
  • One company is rebalancing stock to the other for operational reasons.

For moving devices between locations within the same company, use a Relocate warehouse task instead. Inter-company transfers are specifically for ownership changes.


How the transfer works

One transfer order generates two linked documents:

  • A sales order in the source company (Company A sells to Company B)
  • A purchase order in the destination company (Company B buys from Company A)

The two are linked by Odoo's inter-company mechanics. The destination's receiving manifest is not created when the PO is confirmed — it's created when the source's delivery manifest completes (to avoid duplicate manifests). So the destination waits until the source actually ships.

Transfer Order  →  Source SO (confirmed)
                      ↓ (inter-company mirror)
                   Dest PO (auto-created, confirmed, awaiting shipment)
                   Source delivery manifest / packing box completes
                   Dest Receiving Manifest (auto-created NOW)
                   Scan + Mark Complete
                   Devices now owned by destination company

Step 1 — Create the transfer order

Go to Inventory → Device Inventory → Inter-Company Transfers → New.

Inter-company transfers list

Fill in:

  • Source Company — who currently owns the devices
  • Destination Company — who will own them after transfer
  • Source Location — the warehouse/shelf the devices ship from
  • Destination Location — where they'll end up on the other side

Pick the devices

Choose a Selection Mode:

Mode What it does
By Manifest Pulls every device from a specific receiving manifest — useful when you want to transfer an entire inbound shipment
By Purchase Order Pulls every device from a specific PO (even if it was received across multiple manifests)
By Product Group Filters by model/storage/grade/color — useful when transferring a homogeneous batch

Pick the devices you want moved. Prices are set to the devices' purchase_cost automatically — inter-company transfers are at cost, not a marked-up price.

Transfer order form


Step 2 — Confirm the transfer

Click Create Sale Order on the transfer form.

The system:

  1. Creates and auto-confirms a sales order in the source company to the destination company's partner.
  2. Odoo's inter-company mirroring auto-creates a matching purchase order in the destination company with you (source company's partner) as the vendor. The PO is auto-confirmed.
  3. The source SO spawns a delivery manifest pre-filled with the IMEIs.
  4. The destination's receiving manifest is not yet created — it will spawn when the source's delivery manifest is marked complete. Destination users should expect the manifest to appear after the source ships, not immediately.

Transfer order state moves to Sale Created. Source has a delivery manifest to work; destination has a PO and is waiting.


Step 3 — Source ships

The source company's warehouse team treats this like any normal delivery:

  • Open the delivery manifest (smart button on the source SO).
  • Scan the IMEIs into the auto-created packing box (see Delivery Manifests).
  • Mark the box ready to ship, then mark it shipped.

On ship:

  • Devices are marked Sold in the source company.
  • COGS posts in the source company's books.
  • An inter-company customer invoice is created (out_invoice) — and via Odoo's mirroring, a draft vendor bill appears on the destination side for the same amount.

Step 4 — Destination receives

Once the source's delivery manifest completes, the system auto-creates the destination's receiving manifest. The destination company's warehouse treats this like any normal receipt:

  • Open the receiving manifest (smart button on the destination PO — appears once the source has shipped).
  • Click Start Manual Receiving or Continue Receiving, then scan the IMEIs in.
  • Mark the manifest complete.

If the receiving manifest isn't there yet

Check the source's delivery manifest. If it's still In Progress or Draft, the destination's receiving manifest hasn't been created yet — that happens only when the source's manifest transitions to Done. The destination team should wait for that handoff rather than creating a manifest manually.

On receive:

  • Devices' owner_company_id updates to the destination company.
  • Each device's stock.quant is now in the destination company's warehouse.
  • The receiving GL entry (DR Valuation / CR GRNI) posts in the destination company's books.

The devices are now owned by and stocked with the destination company.


Direct-to-owner delivery (optional)

If the destination company wants devices shipped straight from the supplier to their location (bypassing your warehouse entirely), check the Direct Owner Delivery option on the PO. Devices never transit the source warehouse — they ship direct from vendor to destination.

This is used when Axis buys devices that Reyder's ordering on their behalf but shouldn't physically handle.


Accounting summary

Source company

Event Entry
Delivery shipped DR COGS / CR Device Valuation
Customer invoice out_invoice to destination company, auto-posted

Destination company

Event Entry
Receiving manifest complete DR Device Valuation / CR GRNI
Vendor bill in_invoice from source company, draft — needs manual posting

The draft vendor bill on the destination side is deliberate. Your accountant reviews it before posting so the inter-company handoff is verified.

See Accounting Reference for full entry detail.


Configuration needed

Before the first transfer can run, confirm these settings:

Settings → Inventory → Inter-Company Device Transfers:

  • Inter-Company Partner — the Contact record representing the other company
  • Inter-Company Sale Journal — the sales journal used for cross-company invoices
  • Default Transfer Location — where receipts land by default

Inter-company transfer settings

These are per-company settings. Both Reyder and Axis need their side configured, with each pointing at the other.


Common problems

The inter-company PO didn't auto-create

The inter-company partner on the SO isn't linked correctly to the destination company. Open the partner record (destination side), scroll to the bottom, and verify Company is set. If it's blank, Odoo doesn't know to mirror the SO into a PO.

The destination has a PO but no receiving manifest

Expected behavior until the source ships. The destination manifest only spawns when the source's delivery manifest transitions to Done. Check the source side first — if it's still In Progress, wait. If the source says Done and the destination still has no manifest, investigate the _create_buyer_receiving_manifest() call path (check server logs around the completion event).

Devices show up in both companies after the transfer

Check the step that didn't complete. The ownership change happens on the receiving manifest complete step. If the source shipped but the destination didn't mark the receiving manifest complete, the devices are still owned by the source company — the manifest being open is what's blocking the ownership update. Complete it and the issue resolves.

The destination's vendor bill amount doesn't match the source's invoice

Both amounts are computed from purchase_cost summed across transferred IMEIs. If they differ, someone edited one of the two documents post-creation. Compare the line IMEIs and purchase_cost values. Repost if necessary.

Can I cancel a transfer in progress?

Only before the destination receives. Cancel the source SO and the transfer order — this releases the devices back to the source company. Once the destination's receiving manifest is complete, the ownership has transferred and you'd need a reverse transfer order to move them back.


Under the hood

Technical details for developers

Models

  • device.transfer.order — top-level transfer record
  • The source SO is a standard sale.order with is_inter_company = True
  • The destination PO is a standard purchase.order created by Odoo's multi-company invoice mirroring

State machine

draft → confirmed → sale_created → cancelled

Sale order creation

action_create_sale_order():

  1. sale.order.create(...) in source company with partner = destination's inter-company partner
  2. Pricing: each line's price_unit = lot.purchase_cost
  3. sale_order.action_confirm() — triggers overridden flow that calls _create_inter_company_po() to create the mirror PO in the destination company
  4. Delivery manifest auto-created with lines pre-filled from the allocations
  5. transfer_order.state = 'sale_created'

Ownership transfer on receive

device.manifest._quick_receive() on an inter-company receiving manifest:

  1. Row-level lock on the existing stock.lot in source company: SELECT ... FOR UPDATE
  2. Updates lot.owner_company_id to destination company
  3. Removes stock.quant in source location
  4. Creates stock.quant in destination location
  5. Creates device.movement with type inter_company_receive
  6. Updates lot.current_location_id

Configuration

  • ir.config_parameter: device_inventory.inter_company_partner_id, device_inventory.inter_company_sale_journal_id, device_inventory.default_transfer_location_id
  • Per-company: each company needs the other company's partner set

Direct-owner delivery

purchase.order.direct_owner_delivery = True bypasses intermediate warehousing — the lot's current_location_id goes directly to destination's receiving location on receipt, with no source-side stock.quant ever created.