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