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
- Device Allocation tab is missing
- Commission shows as $0
- No settlement report after a delivery
- Vendor bill not created when settlement confirmed
- Settlement won't mark paid
- Barcode scanner not matching IMEIs
- Manifest won't Mark Complete
- Receiving GL entry didn't post
- COGS entry missing after a sale
- Inter-company PO didn't auto-create
- Axis user is seeing Reyder data
- Retail sale import fails
- Retail reservation not auto-closing
- QC Complete button rejects the device
- Enterprise subscription banner after DB copy
Can't allocate a device to an SO¶
Check these in order:
- Device status. Open the device in All Devices. Status must be
Available. If it'sReserved, another SO has it. If it'sSoldorReturned, it's out of stock. - 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.
- Company scope. For Reyder to allocate an Axis-owned device, the Reyder-Axis consignment agreement must be
Active. Check Agreements and confirm state. - 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¶
- No active agreement. Check Agreements and confirm the Reyder-Axis agreement is
Active. ADraft,Suspended, orTerminatedagreement won't produce commission. - Commission type is None. Open the agreement and confirm the type is
Percentage of SaleorFixed Amount. - Rate stored wrong.
commission_rateis a decimal:0.15= 15%, not15. If the field shows15%in the UI but commission is astronomically high, someone entered15— open the agreement, fix to0.15, save. - 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.
- Check device owner. Open the device. If
owner_company_id= Reyder, no report — the sale is a direct sale, not consignment. - Active agreement. Axis device + Reyder seller requires an active agreement. No active agreement means no report.
- Delivery didn't complete. The report is created by
_process_customer_delivery()which runs on packing box ship / manifest complete. Confirm the manifest state isDone, notIn Progress. Check server logs for Python errors around the completion time.
Vendor bill not created when settlement confirmed¶
- 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
Confirmedstate withvendor_bill_idempty. 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. total_owner_amountis 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.
- You're on the owner report. Owner reports are view-only for payment status. Open the paired consignee report and mark that side paid.
- Vendor bill is not paid yet. Open the Vendor Bill smart button and check
payment_state. The report blocks until the bill ispaid. - 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¶
- Exact-match required.
stock.lot.namemust 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. - Wrong manifest state. Receiving manifests must be
Awaiting Upload,Uploaded, orIn Progress. Delivery scans happen on the packing box — check the box state isPacking. - 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¶
- Receiving manifest — every line must be
Receivedor explicitlyMissing. Any line inExpectedblocks completion. Either scan the remaining devices or edit the lines and mark missing. - 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¶
- Accounts missing. Device COGS Account and Device Valuation Account must both be configured (same settings page as above). v2.28 raises hard errors.
purchase_costis 0 on the device. COGS is computed frompurchase_cost. If the device was received without cost (CSV didn't include it, no manual entry), the COGS entry is $0. Fixpurchase_coston 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.
- Open Settings → Users, edit the Axis user.
- Allowed Companies should list only Axis Mobile. Remove Reyder if it's there.
- Save. Have the user log out and back in — the
cidscookie 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¶
- Column headers. Headers are normalized (lowercased, whitespace → underscore) and matched by substring —
IMEI,imei,IMEI Number,Device IMEIall work; same forSale Price,price,Unit Price. You need one column whose name contains imei and one that contains price. OptionalSale Datecolumn can be present or missing. - IMEIs must exist. The import can't receive new devices; it can only record sales of existing ones. Any IMEI not matching a
stock.lotrow errors out with the row number. - Devices must be retail-reserved to the partner. The import validates
is_retail_reserved=TrueANDretail_partner_idmatches 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).
- Check
remaining_counton the reservation. If > 0, some devices haven't been sold yet. - If a retail sale was created outside the normal UI flow,
_check_auto_close()may not have been invoked. Have admin/support run the recovery from Admin Support Runbook — Re-check retail reservation auto-close.
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'sPending 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%';
```