62 lines
2.5 KiB
Python
62 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
# Part of the Fusion Plating product family.
|
|
#
|
|
# /fp/wo/<id> — scan-redirect endpoint.
|
|
#
|
|
# The WO box sticker embeds a QR code that encodes this URL. When
|
|
# warehouse staff scan the sticker with their phone / tablet /
|
|
# handheld scanner, the device opens the URL; this controller then
|
|
# redirects them to the work-order form inside Odoo's backend.
|
|
# Logged-out users land on the standard Odoo login page and bounce
|
|
# back after authenticating (Odoo's redirect handles the round-trip).
|
|
|
|
from odoo import http
|
|
from odoo.http import request
|
|
|
|
|
|
class FpWoScanController(http.Controller):
|
|
|
|
@http.route('/fp/wo/<int:wo_id>', type='http', auth='user', website=False)
|
|
def wo_scan_redirect(self, wo_id, **kwargs):
|
|
"""Redirect a scanned sticker to the right backend form.
|
|
|
|
Resolution order:
|
|
1. fp.job mapped from this MO id via legacy_mrp_production_id
|
|
(post-migration: physical stickers still encode the old MO
|
|
id, but the canonical record is now an fp.job)
|
|
2. mrp.production with this id (pre-migration callers, or if
|
|
the legacy mapping wasn't run)
|
|
3. mrp.workorder with this id (older stickers that encoded
|
|
the WO id rather than the MO id)
|
|
4. fall back to the jobs list so staff can search manually.
|
|
"""
|
|
env = request.env
|
|
|
|
# 1) New native model — preferred when migration has run.
|
|
if 'fp.job' in env and 'legacy_mrp_production_id' in env['fp.job']._fields:
|
|
job = env['fp.job'].sudo().search(
|
|
[('legacy_mrp_production_id', '=', wo_id)], limit=1)
|
|
if job:
|
|
return request.redirect(
|
|
'/odoo/action-fusion_plating.action_fp_job/%d' % job.id
|
|
)
|
|
|
|
# 2) Legacy MO/WO fallbacks (only if MRP is still installed).
|
|
if 'mrp.production' in env:
|
|
mo = env['mrp.production'].sudo().browse(wo_id).exists()
|
|
if mo:
|
|
return request.redirect(
|
|
'/odoo/action-mrp.mrp_production_action/%d' % mo.id
|
|
)
|
|
if 'mrp.workorder' in env:
|
|
wo = env['mrp.workorder'].sudo().browse(wo_id).exists()
|
|
if wo:
|
|
return request.redirect(
|
|
'/odoo/action-mrp.action_mrp_workorder/%d' % wo.id
|
|
)
|
|
|
|
# 3) Fall back to native jobs list.
|
|
return request.redirect('/odoo/plating-jobs')
|