Skip to content

Troubleshooting

How this page is organized

By symptom — the thing you're seeing or the thing that isn't working. Each entry has likely causes and steps to resolve, in order of most-likely first.


Table of common symptoms


Can't allocate a device to an SO

Check these in order:

  1. Device status. Open the device in All Devices. Status must be Available. If it's Reserved, another SO has it. If it's Sold or Returned, it's out of stock.
  2. Already on this order. The unique constraint blocks the same IMEI from being allocated to the same SO twice. Check the Device Allocation tab on the SO.
  3. Company scope. For Reyder to allocate an Axis-owned device, the Reyder-Axis consignment agreement must be Active. Check Agreements and confirm state.
  4. Active allocation on another SO. Search All Devices for the IMEI and open its form — the Allocations smart button shows any existing allocation. Cancel that allocation if it's stale.

Device Allocation tab is missing on the sales order

The tab can be hidden when no devices are allocated yet, and the Allocate button currently lives inside that tab. If this happens on a brand-new quotation, stop and escalate to admin/support.

What to send support:

  • Sales order number.
  • Product line and quantity.
  • Screenshot showing the missing tab.
  • Whether this is a new quotation or an edited/cancelled order.

Admins can use Admin Support Runbook — Device Allocation tab missing for the temporary recovery and longer-term fix.


Commission shows as $0

  1. No active agreement. Check Agreements and confirm the Reyder-Axis agreement is Active. A Draft, Suspended, or Terminated agreement won't produce commission.
  2. Commission type is None. Open the agreement and confirm the type is Percentage of Sale or Fixed Amount.
  3. Rate stored wrong. commission_rate is a decimal: 0.15 = 15%, not 15. If the field shows 15% in the UI but commission is astronomically high, someone entered 15 — open the agreement, fix to 0.15, save.
  4. Sale price is 0. Open the allocation and check unit_price. If it's 0, commission = 0 regardless of rate.

No settlement report after a delivery

Settlement reports only exist for consignment devices. If Reyder sold a Reyder-owned device, no settlement is needed.

  1. Check device owner. Open the device. If owner_company_id = Reyder, no report — the sale is a direct sale, not consignment.
  2. Active agreement. Axis device + Reyder seller requires an active agreement. No active agreement means no report.
  3. Delivery didn't complete. The report is created by _process_customer_delivery() which runs on packing box ship / manifest complete. Confirm the manifest state is Done, not In Progress. Check server logs for Python errors around the completion time.

Vendor bill not created when settlement confirmed

  1. Settlement journal missing. Go to Settings → Inventory → Consignment Settlement and set Settlement Journal. If that's not set, the code falls back to the first available purchase journal. If no purchase journal exists either, the vendor bill soft-fails — a chatter warning is posted on the settlement report and it stays in Confirmed state with vendor_bill_id empty. Check the report's chatter for the warning, configure a journal, and re-run by calling _create_settlement_vendor_bill() on the report via the shell.
  2. total_owner_amount is 0. No vendor bill is created for a zero-value settlement. Check the settlement report's Financial Summary.

Settlement won't mark paid

Mark as Paid is intentionally guarded. It only works on confirmed consignee reports after the linked vendor bill is paid/reconciled in Odoo.

  1. You're on the owner report. Owner reports are view-only for payment status. Open the paired consignee report and mark that side paid.
  2. Vendor bill is not paid yet. Open the Vendor Bill smart button and check payment_state. The report blocks until the bill is paid.
  3. No vendor bill is linked. Fix the settlement journal/purchase journal issue first, then create the bill before marking paid.

Barcode scanner not matching IMEIs

  1. Exact-match required. stock.lot.name must match the scanned string character-for-character. Leading zeros and trailing whitespace matter. Scan into a notepad first to see exactly what the gun produces.
  2. Wrong manifest state. Receiving manifests must be Awaiting Upload, Uploaded, or In Progress. Delivery scans happen on the packing box — check the box state is Packing.
  3. IMEI not on the manifest. For receiving, unexpected scans create a new line flagged as unexpected — that's normal, not an error. For delivery, an unexpected scan auto-allocates (v2.26+) unless the IMEI is already on another open order. Shipment still re-checks QC/cost readiness before posting.

Manifest won't Mark Complete

  1. Receiving manifest — every line must be Received or explicitly Missing. Any line in Expected blocks completion. Either scan the remaining devices or edit the lines and mark missing.
  2. Delivery manifest — typically completes via the packing box being marked shipped, not directly. If you're trying to mark the manifest complete manually, the number of picked devices must match the SO quantity (over-delivery is rejected).

Receiving GL entry didn't post

Receiving-path accounting still soft-fails on missing config (unlike delivery COGS, which hard-fails). If one of the three accounting fields isn't set, the manifest posts a chatter warning listing what's missing and still completes — leaving stock on hand with no GL impact.

Ask an admin to check Settings → Inventory → Device Inventory Accounting:

  • Device Stock Journal
  • Device Valuation Account
  • Device Stock Input Account

All three must be set. If the manifest is already Done and no GL entry posted, check the chatter on the manifest for the warning, fix the config, and have admin/support re-run the accounting entry from Admin Support Runbook — Re-run a missing receiving GL entry.


COGS entry missing after a sale

  1. Accounts missing. Device COGS Account and Device Valuation Account must both be configured (same settings page as above). v2.28 raises hard errors.
  2. purchase_cost is 0 on the device. COGS is computed from purchase_cost. If the device was received without cost (CSV didn't include it, no manual entry), the COGS entry is $0. Fix purchase_cost on the device and re-process if needed.

Inter-company PO didn't auto-create

The inter-company partner on the destination side isn't linked to the destination company. Open Contacts, find the partner record, and check Company is set. Blank company means Odoo doesn't know to mirror the SO.

Also confirm is_inter_company is set on the source SO — the flag is automatic when the customer is an inter-company partner, but if someone changed the customer after confirmation, the flag may not be synced.


Axis user is seeing Reyder data

Most common root cause: the Axis user was accidentally added to Reyder's Allowed Companies.

  1. Open Settings → Users, edit the Axis user.
  2. Allowed Companies should list only Axis Mobile. Remove Reyder if it's there.
  3. Save. Have the user log out and back in — the cids cookie needs to refresh.

If you're testing data separation as admin, stop — admin belongs to both companies by design. Test as axis_user instead.

See Security & Multi-Company for the full verification procedure.


Retail sale import fails

  1. Column headers. Headers are normalized (lowercased, whitespace → underscore) and matched by substring — IMEI, imei, IMEI Number, Device IMEI all work; same for Sale Price, price, Unit Price. You need one column whose name contains imei and one that contains price. Optional Sale Date column can be present or missing.
  2. IMEIs must exist. The import can't receive new devices; it can only record sales of existing ones. Any IMEI not matching a stock.lot row errors out with the row number.
  3. Devices must be retail-reserved to the partner. The import validates is_retail_reserved=True AND retail_partner_id matches the sale's partner. Reserve devices first via the Reserve/Release wizard, then import.

Retail reservation not auto-closing

Auto-close triggers when remaining_count reaches 0 (all reserved devices have been retailed).


QC Complete button rejects the device

The Mark QC Complete button moves a device from In QC to QC Complete. Check these in order:

  • Device must currently be In QC. If it's Pending QC, run it through the QC Handoff wizard first.
  • M360 session ID must be set. Without it, the button is hidden in the normal UI. Sync M360 first, or have admin/support use Admin Support Runbook — Stamp a manual QC session ID if the business accepts manual QC.
  • Grade must be assigned. Without it, clicking the button raises: "Cannot mark QC Complete without a grade assigned."

If you do not need the device in QC Complete, a Sales Manager or Inventory Manager can instead approve a QC/cost exception in the sale workflow.

QC status does block sale readiness by default. If you're blocked in allocation, delivery, or retail sale confirmation, complete QC or use the manager override with a reason.


Enterprise subscription banner after copying a prod DB

You copied a production DB to local dev and now see "This database has expired" or "enterprise subscription invalid."

This is a support/admin task, not an operator workflow. Use Admin Support Runbook — Neutralize a copied production database.


Frequently asked questions

What's the difference between owner and consignee settlement reports?

The owner report lines show only IMEI / model / grade / owner amount, with report-level totals for reconciliation. No customer name, sale date, sale price, SO number, or per-device commission is stored on owner-report lines. The consignee report shows everything. Data separation is enforced at the database level, not just in the UI. See Settlement Reports.

How is commission calculated?

For percentage type: commission = sale_price × commission_rate, where commission_rate is stored as a decimal (0.15 = 15%). For fixed type: commission = min(commission_rate, sale_price) — capped to avoid negative owner amount.

Can there be multiple consignment agreements between the same two companies?

No. A database UNIQUE(owner_company_id, consignee_company_id) constraint enforces one agreement per ordered pair. To change terms, edit the existing agreement — don't delete and recreate (that breaks historical references).

What happens when I cancel an SO?

Device reservations release (back to Available), allocation records move to Cancelled, and any draft delivery manifest is cancelled. Confirmed manifests, posted invoices, and completed settlements are not affected.

Where do I configure accounts?

Settings → Inventory → Device Inventory Accounting for Device Stock Journal, Valuation, Stock Input, and COGS. Settings → Inventory → Consignment Settlement for the Settlement Journal.

Can I sell a device before QC is complete?

Not by default. Allocation, delivery, and retail sale confirmation require qc_status='qc_complete'. A Sales Manager or Inventory Manager can approve a QC/cost exception with a required reason; the override is logged on the device and source document.


Admin-only recovery

If the fix requires shell access, record-rule simulation, module upgrade, or production database neutralization, use Admin Support Runbook. Keep this page focused on symptoms users can recognize and the information they should send to support.

**Re-enable a specific cron after neutralize:**
```sql
UPDATE ir_cron SET active=true WHERE cron_name ILIKE '%m360%';
```