From 94b9c79090b20da577ba3fc107f130c6bd50512b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Bertolani?= <gaston.bertolani@gmail.com> Date: Fri, 26 Oct 2018 16:32:54 -0300 Subject: [PATCH 1/4] [ADD]Group by product_product or product_template --- i18n/es_AR.mo | Bin 0 -> 1321 bytes i18n/es_AR.po | 99 ++++++++++++++++++++++++++++ models/barcode_scanning.py | 59 ++++++++++++----- models/picking_split_config.py | 4 ++ views/picking_split_config_view.xml | 2 + 5 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 i18n/es_AR.mo create mode 100644 i18n/es_AR.po diff --git a/i18n/es_AR.mo b/i18n/es_AR.mo new file mode 100644 index 0000000000000000000000000000000000000000..72d1868fa02d4bc45dadbfbf12c3d5cb8a2a59a0 GIT binary patch literal 1321 zcmbV~J#Q2-5QYteuLF{RkO&AN(}5Hpdj~;b`H(^`iB95@Q*uGHzFp^HvTHA1Z$v1m z;0Mq^n=%xLhKA}SN@^seH2eS>ItqBbyO$3ngoGvEbK@C%-kF{4GefTk)@kgE*qhkr zu*VPJ2kQlR0elG_1vkMH;1*Z`Ka}i)Ct-gE4}xF8QE(d^0l%001rEa=LC`7i5_lFI z2N^g8o(DCU=LN@bXS1|F9xC#F0iDiorTr5;4*SSZk#7`q?^19KoB-Xs^Cefy^XH(` z`KCPI0-cUerTqhRI))Du0vUNMkk{x4cfMS2T%8EZ``~&6NqLW)E?4sr>|@xj*RJ+` zYbvl(E4mbLMcXo1ld4CjwOWxqGOgo;s}0bZbe_k8OdG+i2x%9`<zKBxL#9c@H;RyE zgFN7=r7a!G6^U2`<Oj=1IJmpdhX0Su19Q&kEZK1`C6TlPah+8`gIri<cwR!BA!%38 zOvxvipouUD$Sb%^Qj}Lsit?(^Ds8p6Oj4_ZwH;TNn?Q%6>f%Y;=*J?ktQoS0!lY=E zPZvV1>5?$(c)eDudX+_yXk%F`?a7ec&w45AXrETv3v5xWOLvJiP_<9%UTu=qJXXI+ zYZHF`7W1xqUd1(nbqrT&#H}_yy>ky|s+aMeU>(6@ywz&9W_A_0r1&CMC|uk~@Uj(8 z?KSjYs@pVJ<t7#O?s8|AP433I1S`U@8HMujiG4cRmA2B3(7cGvY7?hOG)U}IkyakD zIiUo4>r}P12+{j`)vMm9kblig|6TtrC-XY)8bQN7-zh*l^0^5$McW2{g&G9MI<<y} znlu~qiVRUBMkwHc?7vr6N&j_ZWz1=uPgZ$MaeLt4fz5a%pA{F7`fncGDW)3rJ5f$$ xIdo*sWQpE;uqP5S;ECv>h^5sS>)jd5HNuGrOfejo!hpLXsfZIJQvRPq_!~bxVAcQt literal 0 HcmV?d00001 diff --git a/i18n/es_AR.po b/i18n/es_AR.po new file mode 100644 index 0000000..000ecae --- /dev/null +++ b/i18n/es_AR.po @@ -0,0 +1,99 @@ +# 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 de Picking" + +#. 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 +#: 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 69789cd..b74e81b 100644 --- a/models/barcode_scanning.py +++ b/models/barcode_scanning.py @@ -26,22 +26,54 @@ from odoo.exceptions import Warning 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 + + @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] + + group_lst = [] + if source == 'product': + for i, barcode in enumerate(lines): + if not i % picking_group: + group_lst.append(barcode) + index = int(i / picking_group) + group_lst[index] += barcode + 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 + @api.multi + def confirm_picking(self): + picking_obj = self.env['stock.picking'] + move_obj = self.env['stock.move'] + picking_split_conf_obj = self.env['scan.picking.split.config'] + barcode_picking_line_obj = self.env['stock.picking.barcode.picking.line'] + + picking_split_conf = self._get_picking_split_conf() picking_group = picking_split_conf.picking_group + #Si tiene negativo lo hacemos como siempre if picking_group <= 0: res = super(StockPickingBarcodeScan, self).confirm_picking() return res @@ -53,18 +85,9 @@ class StockPickingBarcodeScan(models.Model): 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) for groups in group_lst: picking_vals = self._prepare_picking() diff --git a/models/picking_split_config.py b/models/picking_split_config.py index 2c15865..e22a566 100644 --- a/models/picking_split_config.py +++ b/models/picking_split_config.py @@ -29,6 +29,10 @@ 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', diff --git a/views/picking_split_config_view.xml b/views/picking_split_config_view.xml index fde64a7..14b8771 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> -- GitLab From 5a4a1f3fe28067ae5268fb73c673b5ed6c4c1eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Bertolani?= <gaston.bertolani@gmail.com> Date: Mon, 29 Oct 2018 17:09:23 -0300 Subject: [PATCH 2/4] [FIX]Group product_product --- models/barcode_scanning.py | 15 +++++++-------- models/picking_split_config.py | 5 ++++- views/picking_split_config_view.xml | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/models/barcode_scanning.py b/models/barcode_scanning.py index b74e81b..a465940 100644 --- a/models/barcode_scanning.py +++ b/models/barcode_scanning.py @@ -45,11 +45,15 @@ class StockPickingBarcodeScan(models.Model): group_lst = [] if source == 'product': - for i, barcode in enumerate(lines): + 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) + group_lst.append(barcode_lines_obj) index = int(i / picking_group) - group_lst[index] += barcode + 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') @@ -73,11 +77,6 @@ class StockPickingBarcodeScan(models.Model): picking_split_conf = self._get_picking_split_conf() picking_group = picking_split_conf.picking_group - #Si tiene negativo lo hacemos como siempre - if picking_group <= 0: - res = super(StockPickingBarcodeScan, self).confirm_picking() - return res - pick_to_filter = [] location = self._get_location_src() location_dest = self._get_location_dest() diff --git a/models/picking_split_config.py b/models/picking_split_config.py index e22a566..7f8f4be 100644 --- a/models/picking_split_config.py +++ b/models/picking_split_config.py @@ -37,5 +37,8 @@ class ScanPickingSplitConfig(models.Model): _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 14b8771..b8130c5 100644 --- a/views/picking_split_config_view.xml +++ b/views/picking_split_config_view.xml @@ -48,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> -- GitLab From d3cbfb01876926fc66c0ca4f508404ab9f4b282f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Bertolani?= <gaston.bertolani@gmail.com> Date: Wed, 31 Oct 2018 12:00:30 -0300 Subject: [PATCH 3/4] [ADD]Internal Operations --- README.rst | 38 -------------------------------------- i18n/es_AR.po | 23 ++++++++++++++++++++++- models/barcode_scanning.py | 30 +++++++++++++++++------------- 3 files changed, 39 insertions(+), 52 deletions(-) delete mode 100644 README.rst diff --git a/README.rst b/README.rst deleted file mode 100644 index 73ac770..0000000 --- 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.po b/i18n/es_AR.po index 000ecae..9fe875b 100644 --- a/i18n/es_AR.po +++ b/i18n/es_AR.po @@ -75,7 +75,12 @@ 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 de Picking" +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 @@ -83,6 +88,21 @@ msgstr "Grupo de Picking" 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!" @@ -97,3 +117,4 @@ msgstr "scan.picking.split.config" #: 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 a465940..5a077df 100644 --- a/models/barcode_scanning.py +++ b/models/barcode_scanning.py @@ -22,6 +22,8 @@ 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' @@ -67,17 +69,18 @@ class StockPickingBarcodeScan(models.Model): group_lst[index] += barcode_lines return group_lst - @api.multi - def confirm_picking(self): + 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'] - barcode_picking_line_obj = self.env['stock.picking.barcode.picking.line'] + pick_to_filter = [] + if not self.barcode_line_ids: + return True + + operation_type = self.picking_type_id.code picking_split_conf = self._get_picking_split_conf() picking_group = picking_split_conf.picking_group - - pick_to_filter = [] location = self._get_location_src() location_dest = self._get_location_dest() @@ -88,6 +91,7 @@ class StockPickingBarcodeScan(models.Model): 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) @@ -97,22 +101,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 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 -- GitLab From 136da12e6a83a13d85173331756c5fae93fc2632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Bertolani?= <gaston.bertolani@gmail.com> Date: Wed, 31 Oct 2018 13:04:03 -0300 Subject: [PATCH 4/4] [FIX]Split only picking out --- models/barcode_scanning.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/models/barcode_scanning.py b/models/barcode_scanning.py index 5a077df..51f4ff3 100644 --- a/models/barcode_scanning.py +++ b/models/barcode_scanning.py @@ -73,12 +73,17 @@ class StockPickingBarcodeScan(models.Model): 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 - operation_type = self.picking_type_id.code picking_split_conf = self._get_picking_split_conf() picking_group = picking_split_conf.picking_group location = self._get_location_src() @@ -102,7 +107,7 @@ class StockPickingBarcodeScan(models.Model): po_line=po_line, so_line=so_line) new_move = move_obj.create(move_vals) barcode_line_state = 'done' - if not self.operation_scan_id: + if operation_type == 'internal' and not self.operation_scan_id: barcode_line_state = 'to_receive' barcode_line.write({ 'picking_id': picking.id, -- GitLab