# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. # License OPL-1 (Odoo Proprietary License v1.0) """Per-package row for outbound multi-piece shipments. Each fp.receiving has zero-or-more fp.outbound.package rows. When the operator clicks Generate Outbound Label, one stock.package + one carrier label is generated per row. Single-box scenario: the form auto-fills one row when the receiving's top-level weight/dim are set, so existing UX still works. Multi-box scenario: operator adds more rows. Each row gets its own tracking number + label PDF/ZPL stored back on the row after the API call returns. """ from odoo import fields, models class FpOutboundPackage(models.Model): _name = 'fp.outbound.package' _description = 'Fusion Plating — Outbound Package (per-box detail)' _order = 'sequence, id' receiving_id = fields.Many2one( 'fp.receiving', required=True, ondelete='cascade', index=True, ) sequence = fields.Integer(default=10) weight = fields.Float(string='Weight', digits=(10, 3)) length = fields.Float(string='Length', digits=(10, 2)) width = fields.Float(string='Width', digits=(10, 2)) height = fields.Float(string='Height', digits=(10, 2)) # Populated by the carrier API once Generate Label fires. tracking_number = fields.Char(readonly=True, copy=False) label_attachment_id = fields.Many2one( 'ir.attachment', string='Label', ondelete='set null', readonly=True, copy=False, ) # Computed convenience: filename of the label (for download UX). label_filename = fields.Char( related='label_attachment_id.name', readonly=True, )