diff --git a/README.rst b/README.rst deleted file mode 100644 index 73ac770f75a138225a915a73f73c3e9ecb4286d7..0000000000000000000000000000000000000000 --- a/README.rst +++ /dev/null @@ -1,38 +0,0 @@ -Barcode massive scanning in inventory v11 -================================= - -This module will used for barcode massive scanning in inventory. -Depends -======= -[stock] addon Odoo - -Tech -==== -* [Python] - Models -* [XML] - Odoo views - -Installation -============ -- www.odoo.com/documentation/11.0/setup/install.html -- Install our custom addon - - -Bug Tracker -=========== -Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. - -Credits -======= -* Eynes - Ingenieria del software <https://www.eynes.com.ar> - -Author ------- - -Developer: Laureano Kloss, laureano.kloss@eynes.com.ar - -Maintainer ----------- - -This module is maintained by Eynes - Ingenieria del software. - -For support and more information, please visit https://www.eynes.com.ar diff --git a/i18n/es_AR.mo b/i18n/es_AR.mo new file mode 100644 index 0000000000000000000000000000000000000000..72d1868fa02d4bc45dadbfbf12c3d5cb8a2a59a0 Binary files /dev/null and b/i18n/es_AR.mo differ diff --git a/i18n/es_AR.po b/i18n/es_AR.po new file mode 100644 index 0000000000000000000000000000000000000000..9fe875b997177f172f928d4bab57ddebad45c1d3 --- /dev/null +++ b/i18n/es_AR.po @@ -0,0 +1,120 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * scanning_picking_split +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-26 18:19+0000\n" +"PO-Revision-Date: 2018-10-26 15:29-0300\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"Language: es\n" +"X-Generator: Poedit 2.0.4\n" + +#. module: scanning_picking_split +#: model:ir.actions.act_window,name:scanning_picking_split.action_scan_picking_split_config +msgid "Action Scan Picking Config" +msgstr "Action Scan Picking Config" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_company_id +msgid "Company" +msgstr "CompañÃa" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_name +msgid "Config Name" +msgstr "Nombre de configuracion" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_create_date +msgid "Created on" +msgstr "Creado en" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_id +msgid "ID" +msgstr "ID (identificación)" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config___last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: scanning_picking_split +#: model:ir.ui.view,arch_db:scanning_picking_split.view_scan_picking_split_config_tree +msgid "Picking Config" +msgstr "Configuracion de Picking" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_picking_group +msgid "Picking Group" +msgstr "Grupo por Picking" + +#. module: scanning_picking_split +#: sql_constraint:scan.picking.split.config:0 +msgid "Picking Group must be greater than 0!" +msgstr "El agrupamiento por picking debe ser mayor que 0!" + +#. module: scanning_picking_split +#: model:ir.ui.menu,name:scanning_picking_split.menu_scan_picking_split_config +#: model:ir.ui.view,arch_db:scanning_picking_split.view_scan_picking_split_config_form +msgid "Picking Split Config" +msgstr "Configuración del Remito" + +#. module: scanning_picking_split +#: selection:scan.picking.split.config,source:0 +msgid "Product" +msgstr "Producto" + +#. module: scanning_picking_split +#: model:ir.model.fields,field_description:scanning_picking_split.field_scan_picking_split_config_source +msgid "Source" +msgstr "Fuente" + +#. module: scanning_picking_split +#: selection:scan.picking.split.config,source:0 +msgid "Template" +msgstr "Template" + +#. module: scanning_picking_split +#: sql_constraint:scan.picking.split.config:0 +msgid "The configuration must be unique per company!" +msgstr "La configuración debe ser unica por empresa!" + +#. module: scanning_picking_split +#: model:ir.model,name:scanning_picking_split.model_scan_picking_split_config +msgid "scan.picking.split.config" +msgstr "scan.picking.split.config" + +#. module: scanning_picking_split +#: model:ir.model,name:scanning_picking_split.model_stock_picking_barcode_scan +msgid "stock.picking.barcode.scan" +msgstr "stock.picking.barcode.scan" + diff --git a/models/barcode_scanning.py b/models/barcode_scanning.py index 69789cd8abd5f61c4a331546866540d1e3a28c4b..51f4ff3ebd11a254a98e589987595d2afdff8bc3 100644 --- a/models/barcode_scanning.py +++ b/models/barcode_scanning.py @@ -22,50 +22,81 @@ from odoo import fields, models, api, _ from odoo.exceptions import Warning +from odoo.addons.inventory_barcode_massive_scanning.models.stock_picking import StockPickingBarcodeScan as BarcodeScan + class StockPickingBarcodeScan(models.Model): _inherit = 'stock.picking.barcode.scan' - @api.multi - def confirm_picking(self): - picking_obj = self.env['stock.picking'] - move_obj = self.env['stock.move'] + @api.model + def _get_picking_split_conf(self): picking_split_conf_obj = self.env['scan.picking.split.config'] - barcode_picking_line_obj = self.env['stock.picking.barcode.picking.line'] - #Nos fijamos la configuracion company = self.env.user.company_id picking_split_conf = picking_split_conf_obj.search([ ('company_id', '=', company.id)], limit=1) if not picking_split_conf: raise Warning('There is not set picking split config for this company') + return picking_split_conf - picking_group = picking_split_conf.picking_group + @api.model + def _get_barcode_line_groups(self, lines, picking_group, source): + barcode_lines_obj = self.env['stock.picking.barcode.scan.line'] + if picking_group <= 0 or not lines: + return [lines] - if picking_group <= 0: - res = super(StockPickingBarcodeScan, self).confirm_picking() - return res + group_lst = [] + if source == 'product': + products = lines.mapped('product_id') + product_ids = list(set(products.ids)) + for i, product_id in enumerate(product_ids): + if not i % picking_group: + group_lst.append(barcode_lines_obj) + index = int(i / picking_group) + barcode_lines = lines.filtered(lambda x: \ + x.product_id.id == product_id) + group_lst[index] += barcode_lines + else: + products = lines.mapped('product_id') + templates = products.mapped('product_tmpl_id') + template_ids = list(set(templates.ids)) + for i, template_id in enumerate(template_ids): + if not i % picking_group: + group_lst.append(barcode_lines_obj) + index = int(i / picking_group) + barcode_lines = lines.filtered(lambda x: \ + x.product_id.product_tmpl_id.id == template_id) + group_lst[index] += barcode_lines + return group_lst + def create_picking(self): + picking_obj = self.env['stock.picking'] + move_obj = self.env['stock.move'] + picking_split_conf_obj = self.env['scan.picking.split.config'] + operation_type = self.picking_type_id.code pick_to_filter = [] + + #Solamente para outs + if operation_type != 'outgoing': + res = super(StockPickingBarcodeScan, self).create_picking() + return res + + if not self.barcode_line_ids: + return True + + picking_split_conf = self._get_picking_split_conf() + picking_group = picking_split_conf.picking_group location = self._get_location_src() location_dest = self._get_location_dest() if not location or not location_dest: raise Warning('Origin or destination not set for stock picking type') - #create picking for scan not found - barcodes_to_picking = self.barcode_line_ids.filtered( - lambda x: x.state in ['draft']) - - #Armamos los grupos - barcode_lines_obj = self.env['stock.picking.barcode.scan.line'] - group_lst = [] - for i, barcode in enumerate(barcodes_to_picking): - if not i % picking_group: - group_lst.append(barcode_lines_obj) - index = int(i / picking_group) - group_lst[index] += barcode + conf_source = picking_split_conf.source + group_lst = self._get_barcode_line_groups(self.barcode_line_ids, + picking_group, conf_source) + pick_lst = [] for groups in group_lst: picking_vals = self._prepare_picking() picking = picking_obj.create(picking_vals) @@ -75,22 +106,22 @@ class StockPickingBarcodeScan(models.Model): move_vals = self._prepare_stock_move(barcode_line, picking, po_line=po_line, so_line=so_line) new_move = move_obj.create(move_vals) + barcode_line_state = 'done' + if operation_type == 'internal' and not self.operation_scan_id: + barcode_line_state = 'to_receive' barcode_line.write({ 'picking_id': picking.id, 'move_id': new_move.id, - 'state': 'done' + 'state': barcode_line_state }) picking.action_assign() - for move in picking.move_lines: move.write({'quantity_done': move.product_uom_qty}) pick_to_filter.append(picking.id) picking.action_done() - pick_set_ids = set(pick_to_filter) - for pick_set_id in list(pick_set_ids): - line_val = {'picking_id': pick_set_id} - barcode_picking_line = barcode_picking_line_obj.new((line_val)) - self.barcode_picking_line_ids += barcode_picking_line - self.write({'state': 'done'}) + new_picks = [(0, False, {'picking_id': pick_id}) for pick_id in pick_set_ids] + pick_lst.extend(new_picks) + + self.write({'barcode_picking_line_ids': pick_lst}) return True diff --git a/models/picking_split_config.py b/models/picking_split_config.py index 2c158652d2cdc803451360dc7ffcff9745be808d..7f8f4be4be201b91ca02e1f7cd6016b32021c685 100644 --- a/models/picking_split_config.py +++ b/models/picking_split_config.py @@ -29,9 +29,16 @@ class ScanPickingSplitConfig(models.Model): name = fields.Char('Config Name') picking_group = fields.Integer('Picking Group') company_id = fields.Many2one('res.company', 'Company', required=True) + source = fields.Selection([ + ('template', 'Template'), + ('product', 'Product') + ], default='template', string='Source', required=True) _sql_constraints = [ ('company_uniq', 'unique (company_id)', - 'The configuration must be unique per company!') + 'The configuration must be unique per company!'), + ('valid_picking_group', + 'picking_group > 0', + 'Picking Group must be greater than 0!') ] diff --git a/views/picking_split_config_view.xml b/views/picking_split_config_view.xml index fde64a743251611aa4aadf0277de29be325476f5..b8130c5f910e7e80537782c78e8e030a023dbbd7 100644 --- a/views/picking_split_config_view.xml +++ b/views/picking_split_config_view.xml @@ -10,6 +10,7 @@ <tree string="Picking Config"> <field name="picking_group"/> <field name="name"/> + <field name="source"/> <field name="company_id"/> </tree> </field> @@ -28,6 +29,7 @@ <field name="picking_group"/> </group> <group> + <field name="source"/> <field name="company_id"/> </group> </group> @@ -46,6 +48,6 @@ <menuitem id="menu_scan_picking_split_config" action="action_scan_picking_split_config" name="Picking Split Config" - parent="stock.menu_warehouse_report"/> + parent="stock.menu_stock_config_settings"/> </data> </odoo>