from odoo import models, api, fields from odoo.exceptions import AccessError, UserError, ValidationError from datetime import timedelta, date, datetime import logging _logger = logging.getLogger(__name__) class BarcodingProduct(models.Model): _name = "barcoding.product" _description = "Barcoding Product" barcoding_product_line = fields.One2many('barcoding.product.line', 'barcoding_product_id', string='Barcoding Product Lines', auto_join=True) product_id = fields.Many2one('product.product', string="Product", tracking=3) quantity = fields.Float(string="Quantity", tracking=3) type = fields.Selection([('print', 'Print Barcode'), ('barcoding', 'Add Barcode To Product'), ('barcoding_box', 'Add Barcode Box To Product'), ('multiparts', 'Multiparts Product')], string='Type', default='print') barcode = fields.Char(string="Barcode") qty_pcs_box = fields.Char(string="Quantity Pcs Box") def check_duplicate_barcode(self): if self.type in ['barcoding_box', 'barcoding']: barcode_product = self.env['product.product'].search([('barcode', '=', self.barcode)]) if barcode_product: raise UserError('Barcode sudah digunakan {}'.format(barcode_product.display_name)) barcode_box = self.env['product.product'].search([('barcode_box', '=', self.barcode)]) if barcode_box: raise UserError('Barcode box sudah digunakan {}'.format(barcode_box.display_name)) @api.constrains('barcode') def _send_barcode_to_product(self): for record in self: record.check_duplicate_barcode() if record.type == 'barcoding_box': record.product_id.barcode_box = record.barcode record.product_id.qty_pcs_box = record.qty_pcs_box else: record.product_id.barcode = record.barcode @api.onchange('product_id', 'quantity') def _onchange_product_or_quantity(self): if self.product_id and self.quantity > 0: self.barcoding_product_line = [(5, 0, 0)] lines = [] for i in range(int(self.quantity)): lines.append((0, 0, { 'product_id': self.product_id.id, 'barcoding_product_id': self.id, 'sequence_with_total': f"{i+1}/{int(self.quantity)}" })) self.barcoding_product_line = lines def write(self, vals): res = super().write(vals) if 'quantity' in vals and self.type == 'multiparts': self._update_sequence_with_total() return res def _update_sequence_with_total(self): for rec in self: total = int(rec.quantity) for index, line in enumerate(rec.barcoding_product_line, start=1): line.sequence_with_total = f"{index}/{total}" class BarcodingProductLine(models.Model): _name = 'barcoding.product.line' _description = 'Barcoding Product Line' _order = 'barcoding_product_id, id' barcoding_product_id = fields.Many2one('barcoding.product', string='Barcoding Product Ref', required=True, ondelete='cascade', index=True, copy=False) product_id = fields.Many2one('product.product', string="Product") qr_code_variant = fields.Binary("QR Code Variant", related='product_id.qr_code_variant') sequence_with_total = fields.Char( string="Sequence" )