Skip to content

Quality Control

Who this is for

QC technicians and anyone who tests incoming devices. You'll use this after devices are received but before they go out the door.

What you'll accomplish: test a batch of just-received devices, assign a grade, capture any diagnostic results, and mark them cleared for sale.

Before you start: the devices need to be received (their receiving manifest must be complete). If you can see them in All Devices with status Available, they're ready for QC.

QC is a default sale-readiness gate

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

However, the Mark QC Complete button itself still requires an M360 session ID and an assigned grade. In the normal UI, the button is hidden until the device is In QC and has M360 data. If you do not use M360, ask admin/support about the controlled placeholder-session process or use a manager sale-readiness exception later in the sales flow.


QC status at a glance

Pending QC  →  In QC  →  QC Complete   (typical path)
                     →  QC Failed      (device has a problem)

QC Failed   →  Pending QC   (reset for a re-test)

Every device starts at Pending QC the moment it's received. You walk it through the states by using the QC Handoff wizard and then marking it complete or failed on the device form.

Device form showing QC status


Step 1 — Open the QC Handoff wizard

Go to Inventory → Device Inventory → QC Handoff.

QC Handoff wizard

The wizard pulls everything currently in Pending QC status. Narrow the list with any combination of:

  • Manifest — all devices from one specific shipment
  • Purchase Order — everything from a specific PO (which may span multiple manifests)
  • Product — only a specific model, e.g. iPhone 14 Pro
  • Date range — receivables from a window (e.g. this week)

Pick the devices you're about to test, then click Hand Off to QC. Their status flips from Pending QC to In QC and a movement record is written to the audit log.


Step 2 — Run diagnostics (M360)

If you have M360 integration enabled, the diagnostic test is run outside Odoo (M360 is a separate testing app) and the results come back into Odoo via a sync.

Sync options

  • Manual sync — click the Sync M360 button on the device form after you finish a test
  • Auto sync — if the M360 cron is enabled, Odoo pulls new session data periodically

What M360 gives you

Shows up as Source
Battery Health % M360 session
Carrier Check — Clean / Financed / Blacklisted M360 session
iCloud Status — Off / On / Unknown M360 session
MDM Status — None / Present / Removed M360 session
M360 Session ID The ID of the test session on M360's side
Diagnostics Summary Short text summary from M360
Report URL Link to the full M360 report

Device form showing M360 data

No M360?

The QC Complete button requires an M360 session ID to be set. Options:

  • Ask admin/support to stamp a placeholder session ID — use this only when the business wants manual QC to count as QC complete
  • Skip QC Complete only as an exception — leave the device in Pending QC only when a manager approves the sale-readiness exception in the allocation or retail-sale workflow.
  • Enable M360 integration — even with a minimal test configuration, a sync populates the session ID and unblocks the button

Use Cosmetic Notes and Functional Notes on the device form for manual QC records regardless of M360 status.


Step 3 — Assign a grade

On the device form, set Grade. The four standard values and what they mean at Reyder:

Grade Typical condition
Excellent Like new — no scratches, all functions perfect
Good Light use — minor cosmetic wear, fully functional
Fair Moderate use — visible wear, but fully functional
Poor Heavy use — cosmetic damage, may have functional issues

Grade affects the price the device can list at and the commission calculation on consignment sales — so getting it right matters.

Grades are configured under Configuration → Device Grades if you need to add a new one or change the list.

Device grades configuration


Step 4 — Mark QC Complete

On the device form, click Mark QC Complete.

Status flips to QC Complete and a movement is written. The device is now marked as tested — that's it.

QC Complete requirements

The button appears or succeeds only when:

  • Device is currently In QC (not Pending QC).
  • M360 session ID is set (m360_session_id). Without it, the button is hidden in the UI and direct calls raise: ValidationError: Cannot mark QC Complete without M360 data.
  • Grade is assigned (grade_id). Without it: ValidationError: Cannot mark QC Complete without a grade assigned.

If the button is missing, confirm the device is In QC and has M360 data. If the button appears but raises, assign the missing grade and try again.

If the device failed

Click Mark QC Failed instead. Use the Cosmetic/Functional Notes to describe why.

A failed device stays in the system — it's not deleted — but the status tells the team "don't sell this as-is." If the issue gets fixed (e.g. battery replaced), click Reset to QC on the form; it goes back to Pending QC and can be re-tested.


Common problems

A device I'm looking for isn't in the QC Handoff wizard

Two likely reasons: (a) its receiving manifest isn't marked complete yet — go back to the manifest and close it out. (b) it's already past Pending QC (e.g. someone already ran handoff on it). Search All Devices by the IMEI and check its QC status directly.

I marked a device QC Complete but it doesn't show Grade anywhere

This shouldn't be possible — the QC Complete action requires Grade to be set. If you're seeing a QC Complete device with no grade, that state was produced via direct database writes bypassing the action button. Correct by assigning a grade manually.

M360 sync fails with a timeout

The M360 API can be slow. Try the manual sync button again after a minute. If repeated attempts fail, check Settings → Inventory → M360 QC Integration — the API key and endpoint URL live there.

Can I sell a device that's still Pending QC?

Not by default. The allocation wizard, delivery completion, and retail-sale confirmation all check sale readiness. A Sales Manager or Inventory Manager can use the QC/cost exception override with a required reason; non-managers must complete QC first.


Under the hood

Technical details for developers

Model: stock.lot (extended)

QC state machine — actions on the device form: - action_handoff_to_qc()pending_qcin_qc - action_mark_qc_complete() — → qc_complete - action_mark_qc_failed() — → qc_failed - action_reset_to_qc()qc_failedpending_qc

Key fields

Field Type Notes
qc_status Selection pending_qc / in_qc / qc_complete / qc_failed
grade_id Many2one device.grade Condition grade
battery_health Integer 0–100 From M360
carrier_check Selection clean / financed / blacklisted / unknown
icloud_status Selection off / on / unknown / na
mdm_status Selection none / present / removed
m360_session_id Char M360 test session ID
intake_date Date Set automatically at receiving
test_date Date Set when handed off to QC
tested_by Many2one res.users Set when handed off to QC

Current sale gate

Allocation, delivery, and retail sale confirmation require qc_complete by default. Devices that are still pending_qc, in_qc, or qc_failed can only move through sale flows with a Sales Manager or Inventory Manager override reason, which is logged for audit.

The field-level requirements on action_mark_qc_complete() itself still validate m360_session_id and grade_id before transitioning to qc_complete.

M360 sync

  • Manual: action_sync_m360() on the device form
  • Cron: m360_cron in data/m360_cron.xml — disabled by default after --neutralize; re-enable in Settings → Technical → Scheduled Actions if you want the auto-pull