Files
Odoo-Modules/fusion-plating/fusion_plating_cgp/models/fp_cgp_receipt_shipment.py
gsinghpal be611876ad changes
2026-04-12 09:09:50 -04:00

126 lines
3.4 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.
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'})