# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. # License OPL-1 (Odoo Proprietary License v1.0) # Part of the Fusion Plating product family. from odoo import api, fields, models class FpCgpReceiptShipment(models.Model): """Movement log for controlled goods. Every receipt, shipment, or internal transfer of a controlled good must be logged and authorized by an Authorized Individual. Cross- border shipments additionally require an export permit reference. """ _name = 'fusion.plating.cgp.receipt.shipment' _description = 'Fusion Plating — CGP Receipt / Shipment' _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'date desc, id desc' name = fields.Char( string='Reference', required=True, copy=False, readonly=True, default=lambda self: self._default_name(), tracking=True, ) movement_type = fields.Selection( [ ('receipt', 'Receipt'), ('shipment', 'Shipment'), ('internal_transfer', 'Internal Transfer'), ], string='Movement Type', default='receipt', required=True, tracking=True, ) controlled_good_id = fields.Many2one( 'fusion.plating.cgp.controlled.good', string='Controlled Good', required=True, tracking=True, ) date = fields.Datetime( string='Date', default=lambda self: fields.Datetime.now(), tracking=True, ) quantity = fields.Float( string='Quantity', tracking=True, ) from_party = fields.Char( string='From', tracking=True, ) to_party = fields.Char( string='To', tracking=True, ) carrier = fields.Char( string='Carrier', tracking=True, ) manifest_ref = fields.Char( string='Manifest / Waybill', tracking=True, ) authorized_by_id = fields.Many2one( 'res.users', string='Authorized By', tracking=True, help='Must be an Authorized Individual.', ) export_permit_ref = fields.Char( string='Export Permit Ref', tracking=True, help='Export permit reference when the movement crosses the ' 'Canadian border.', ) state = fields.Selection( [ ('draft', 'Draft'), ('authorized', 'Authorized'), ('executed', 'Executed'), ('closed', 'Closed'), ], string='Status', default='draft', required=True, tracking=True, ) company_id = fields.Many2one( 'res.company', string='Company', default=lambda self: self.env.company, ) notes = fields.Html(string='Notes') active = fields.Boolean(default=True) @api.model def _default_name(self): seq = self.env['ir.sequence'].next_by_code('fusion.plating.cgp.movement') return seq or '/' @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get('name') or vals.get('name') == '/': vals['name'] = self._default_name() return super().create(vals_list) def action_authorize(self): self.write({'state': 'authorized'}) def action_execute(self): self.write({'state': 'executed'}) def action_close(self): self.write({'state': 'closed'}) def action_reset_to_draft(self): self.write({'state': 'draft'})