diff --git a/merge_same_products/README.rst b/merge_same_products/README.rst new file mode 100644 index 000000000..2e5069c59 --- /dev/null +++ b/merge_same_products/README.rst @@ -0,0 +1,11 @@ +Merge Same Product Lines +======================== + + This module will merge the order lines/invoice with same product in the sale order line, purchase order line and account invoice line. + +Credits +======= +Cybrosys Techno Solutions +Author +------ +* Cybrosys diff --git a/merge_same_products/__init__.py b/merge_same_products/__init__.py new file mode 100644 index 000000000..93d36b2fd --- /dev/null +++ b/merge_same_products/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2009-TODAY Cybrosys Technologies(). +# Author: Niyas Raphy() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import models \ No newline at end of file diff --git a/merge_same_products/__openerp__.py b/merge_same_products/__openerp__.py new file mode 100644 index 000000000..a2ab11184 --- /dev/null +++ b/merge_same_products/__openerp__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2009-TODAY Cybrosys Technologies(). +# Author: Niyas Raphy() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Merge Same Product Line', + 'version': '0.1', + 'description': """""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': 'http://www.cybrosys.com', + 'summary': "This module will merge order lines/invoice line with same product in sale, purchase order lines and invoice line", + 'category': 'sale', + 'depends': ['account', 'base', 'sale', 'purchase'], + 'license': 'AGPL-3', + 'data': [], + 'demo': [], + 'installable': True, + 'auto_install': False, + +} diff --git a/merge_same_products/models/__init__.py b/merge_same_products/models/__init__.py new file mode 100644 index 000000000..0b754823a --- /dev/null +++ b/merge_same_products/models/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2009-TODAY Cybrosys Technologies(). +# Author: Niyas Raphy() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import sales_merge +import purchase_merge +import invoice_merge + diff --git a/merge_same_products/models/invoice_merge.py b/merge_same_products/models/invoice_merge.py new file mode 100644 index 000000000..92a795709 --- /dev/null +++ b/merge_same_products/models/invoice_merge.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2009-TODAY Cybrosys Technologies(). +# Author: Niyas Raphy() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from openerp import api, models + + +class AccountInvoiceAppend(models.Model): + _inherit = "account.invoice" + + @api.model + def create(self, vals): + if "invoice_line_ids" in vals.keys(): + product_list = [] + new_list = [] + check_list = [] + for obj in vals['invoice_line_ids']: + if obj[2]: + if "product_id" in obj[2]: + if obj[2]['product_id'] not in product_list: + product_list.append(obj[2]['product_id']) + for obj in product_list: + quantity = 0 + for obj1 in vals['invoice_line_ids']: + if obj1[2]['product_id'] == obj: + quantity += obj1[2]['quantity'] + for obj1 in vals['invoice_line_ids']: + if obj1[2]['product_id'] == obj: + obj1[2]['quantity'] = quantity + for obj2 in vals['invoice_line_ids']: + if obj2[2]['product_id'] not in check_list: + new_list.append(obj2) + check_list.append(obj2[2]['product_id']) + vals['invoice_line_ids'] = new_list + res = super(AccountInvoiceAppend, self).create(vals) + return res + + @api.multi + def write(self, vals): + product_list_ext = [] + product_list_new = [] + if "invoice_line_ids" in vals.keys(): + new_list = vals['invoice_line_ids'] + for att in new_list: + if att[0] == 4: + s = self.invoice_line_ids.browse(att[1]) + if s.product_id.id not in product_list_ext: + product_list_ext.append(s.product_id.id) + if att[0] == 0: + if att[2]['product_id'] not in product_list_new: + product_list_new.append(att[2]['product_id']) + if att[0] == 1: + s = self.invoice_line_ids.browse(att[1]) + if s.product_id.id not in product_list_ext: + product_list_ext.append(s.product_id.id) + pro_list = [] + + for obj in product_list_new: + pro_qty = 0 + if obj in product_list_ext: + for att in new_list: + if att[0] == 4: + o = self.invoice_line_ids.browse(att[1]) + if o.product_id.id == obj: + pro_qty += o.quantity + if att[1] == 0: + if att[2]['product_id'] == obj: + pro_qty += att[2]['quantity'] + if att[0] == 1: + o = self.invoice_line_ids.browse(att[1]) + if o.product_id.id == obj: + pro_qty += att[2]['quantity'] + for att1 in new_list: + if att1[0] == 4: + o = self.invoice_line_ids.browse(att1[1]) + if o.product_id.id == obj: + o.quantity = pro_qty + if att1[0] == 1: + o = self.invoice_line_ids.browse(att1[1]) + if o.product_id.id == obj: + att1[2]['quantity'] = pro_qty + + for obj1 in product_list_new: + pro_qty = 0 + count = 0 + if obj1 not in product_list_ext: + for att1 in new_list: + if att1[0] == 0: + if att1[2]['product_id'] == obj1: + pro_qty += att1[2]['quantity'] + for att2 in new_list: + if att2[0] == 0: + + if att2[2]['product_id'] == obj1: + count += 1 + if count == 1: + att2[2]['quantity'] = pro_qty + pro_list.append(att2) + for obj2 in product_list_ext: + if obj2 not in product_list_new: + for att2 in new_list: + if att2[0] == 4: + o = self.invoice_line_ids.browse(att2[1]) + if o.product_id.id == obj2: + pro_list.append(att2) + for att3 in new_list: + if att3[0] == 2: + pro_list.append(att3) + if att3[0] == 1: + o = self.invoice_line_ids.browse(att3[1]) + if "quantity" in att3[2]: + o.quantity = att3[2]['quantity'] + vals['invoice_line_ids'] = pro_list + res = super(AccountInvoiceAppend, self).write(vals) + return res + + + + + + + + + + + + + + + + + + + + + diff --git a/merge_same_products/models/purchase_merge.py b/merge_same_products/models/purchase_merge.py new file mode 100644 index 000000000..7220c6c27 --- /dev/null +++ b/merge_same_products/models/purchase_merge.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2009-TODAY Cybrosys Technologies(). +# Author: Niyas Raphy() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from openerp import api, models + + +class PurchaseOrderAppend(models.Model): + _inherit = "purchase.order" + + @api.model + def create(self, vals): + if "order_line" in vals.keys(): + product_list = [] + for obj in vals['order_line']: + if obj[2]['product_id'] not in product_list: + product_list.append(obj[2]['product_id']) + list_new = vals['order_line'] + new_list = [] + for obj in product_list: + count = 0 + qty = 0 + for ele in list_new: + if obj == ele[2]['product_id']: + count += 1 + qty += ele[2]['product_qty'] + if count == 1: + new_list.append(ele) + for att in new_list: + if obj == att[2]['product_id']: + att[2]['product_qty'] = qty + vals['order_line'] = new_list + res = super(PurchaseOrderAppend, self).create(vals) + return res + + @api.one + def write(self, vals): + product_list_ext = [] + product_list_new = [] + if "order_line" in vals.keys(): + new_list = vals['order_line'] + pro_list = [] + for att in new_list: + if att[0] == 4 or att[0] ==1: + s = self.order_line.browse(att[1]) + if s.product_id.id not in product_list_ext: + product_list_ext.append(s.product_id.id) + if att[0] == 0: + if att[2]['product_id'] not in product_list_new: + product_list_new.append(att[2]['product_id']) + for obj in product_list_new: + pro_qty = 0 + if obj in product_list_ext: + for att in new_list: + if att[0] == 4: + o = self.order_line.browse(att[1]) + if o.product_id.id == obj: + pro_qty += o.product_qty + if att[0] == 1: + o = self.order_line.browse(att[1]) + if o.product_id.id == obj: + pro_qty += att[2]['product_qty'] + if att[1] == 0: + if att[2]['product_id'] == obj: + pro_qty += att[2]['product_qty'] + for att1 in new_list: + if att1[0] == 4: + o = self.order_line.browse(att1[1]) + if o.product_id.id == obj: + o.product_qty = pro_qty + if att1[0] == 1: + o = self.order_line.browse(att1[1]) + if o.product_id.id == obj: + att1[2]['product_qty'] = pro_qty + for obj1 in product_list_new: + pro_qty = 0 + count = 0 + if obj1 not in product_list_ext: + for att1 in new_list: + if att1[0] == 0: + if att1[2]['product_id'] == obj1: + pro_qty += att1[2]['product_qty'] + for att2 in new_list: + if att2[0] == 0: + if att2[2]['product_id'] == obj: + count += 1 + if count == 1: + att2[2]['product_qty'] = pro_qty + pro_list.append(att2) + for obj2 in product_list_ext: + if obj2 not in product_list_new: + for att2 in new_list: + if att2[0] == 4: + o = self.order_line.browse(att2[1]) + if o.product_id.id == obj2: + pro_list.append(att2) + for obj2 in product_list_ext: + if obj2 in product_list_new: + for att2 in new_list: + if att2[0] == 1: + o = self.order_line.browse(att2[1]) + if o.product_id.id == obj2: + pro_list.append(att2) + for att3 in new_list: + if att3[0] == 2: + pro_list.append(att3) + if att3[0] == 1: + o = self.order_line.browse(att3[1]) + o.product_qty = att3[2]['product_qty'] + vals['order_line'] = pro_list + + res = super(PurchaseOrderAppend, self).write(vals) + return res diff --git a/merge_same_products/models/sales_merge.py b/merge_same_products/models/sales_merge.py new file mode 100644 index 000000000..c2693d2f4 --- /dev/null +++ b/merge_same_products/models/sales_merge.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2009-TODAY Cybrosys Technologies(). +# Author: Niyas Raphy() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from openerp import api, models + + +class SaleOrderAppend(models.Model): + _inherit = "sale.order" + + @api.model + def create(self, vals): + if "order_line" in vals.keys(): + product_list = [] + for obj in vals['order_line']: + if obj[2]['product_id'] not in product_list: + product_list.append(obj[2]['product_id']) + list_new = vals['order_line'] + new_list = [] + for obj in product_list: + count = 0 + qty = 0 + for element in list_new: + if obj == element[2]['product_id']: + qty += element[2]['product_uom_qty'] + for ele in list_new: + if obj == ele[2]['product_id']: + count += 1 + if count == 1: + ele[2]['product_uom_qty'] = qty + ele[2]['product_uos_qty'] = qty + new_list.append(ele) + vals['order_line'] = new_list + res = super(SaleOrderAppend, self).create(vals) + return res + + @api.multi + def write(self, vals): + product_list_ext = [] + product_list_new = [] + if "order_line" in vals.keys(): + new_list = vals['order_line'] + pro_list = [] + for att in new_list: + if att[0] == 4: + s = self.order_line.browse(att[1]) + if s.product_id not in product_list_ext: + product_list_ext.append(s.product_id.id) + if att[0] == 1: + s = self.order_line.browse(att[1]) + if s.product_id not in product_list_ext: + product_list_ext.append(s.product_id.id) + if att[0] == 0: + if att[2]['product_id'] not in product_list_new: + product_list_new.append(att[2]['product_id']) + for obj in product_list_new: + pro_qty = 0 + if obj in product_list_ext: + for att in new_list: + if att[0] == 4: + o = self.order_line.browse(att[1]) + if o.product_id.id == obj: + pro_qty += o.product_uom_qty + if att[0] == 1: + o = self.order_line.browse(att[1]) + if o.product_id.id == obj: + pro_qty += att[2]['product_uom_qty'] + if att[1] == 0: + if att[2]['product_id'] == obj: + pro_qty += att[2]['product_uom_qty'] + + for att1 in new_list: + if att1[0] == 4: + o = self.order_line.browse(att1[1]) + if o.product_id.id == obj: + o.product_uom_qty = pro_qty + o.product_uos_qty = pro_qty + if att1[0] == 1: + o = self.order_line.browse(att1[1]) + if o.product_id.id == obj: + att1[2]['product_uom_qty'] = pro_qty + o.product_uom_qty = pro_qty + for obj1 in product_list_new: + pro_qty = 0 + count = 0 + if obj1 not in product_list_ext: + for att1 in new_list: + if att1[0] == 0: + if att1[2]['product_id'] == obj1: + pro_qty += att1[2]['product_uom_qty'] + for att2 in new_list: + if att2[0] == 0: + if att2[2]['product_id'] == obj1: + count += 1 + if count == 1: + att2[2]['product_uom_qty'] = pro_qty + att2[2]['product_uos_qty'] = pro_qty + pro_list.append(att2) + + for obj2 in product_list_ext: + if obj2 not in product_list_new: + for att2 in new_list: + if att2[0] == 4: + o = self.order_line.browse(att2[1]) + if o.product_id.id == obj2: + pro_list.append(att2) + for att3 in new_list: + if att3[0] == 2: + pro_list.append(att3) + if att3[0] == 1: + o = self.order_line.browse(att3[1]) + o.product_uom_qty = att3[2]['product_uom_qty'] + + vals['order_line'] = pro_list + res = super(SaleOrderAppend, self).write(vals) + return res + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/merge_same_products/static/description/banner.jpg b/merge_same_products/static/description/banner.jpg new file mode 100644 index 000000000..dc70e2690 Binary files /dev/null and b/merge_same_products/static/description/banner.jpg differ diff --git a/merge_same_products/static/description/cybro_logo.png b/merge_same_products/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/merge_same_products/static/description/cybro_logo.png differ diff --git a/merge_same_products/static/description/icon.png b/merge_same_products/static/description/icon.png new file mode 100644 index 000000000..ffebbaba7 Binary files /dev/null and b/merge_same_products/static/description/icon.png differ diff --git a/merge_same_products/static/description/index.html b/merge_same_products/static/description/index.html new file mode 100644 index 000000000..256512f6d --- /dev/null +++ b/merge_same_products/static/description/index.html @@ -0,0 +1,110 @@ +
+
+

Merging Same Product Line

+

It helps to merge same products in order line & invoice line

+

Cybrosys Techno Solutions, www.cybrosys.com

+
+ +
+
+

+ ☛This module enables the feature to merge same products in the sale order line , purchase order line & invoice line into one on saving. +

+
+
+
+
+
+ +
+
+

Sale Order

+
+

+ Before saving the sale order
+

+
+ +
+
+
+

+ After saving the sale order
+ +

+
+ +
+
+
+
+ +
+
+

Purchase Order

+
+

+ Before saving the order
+ +

+
+ +
+
+
+

+ After saving the order
+ +

+
+ +
+
+
+
+ +
+
+

Invoice

+
+

+ Before saving the order
+ +

+
+ +
+
+
+

+ After saving the order
+ +

+
+ +
+
+
+
+ +
+

Need Any Help?

+ + +
+ + + + + + diff --git a/merge_same_products/static/description/invoice_after_save.png b/merge_same_products/static/description/invoice_after_save.png new file mode 100644 index 000000000..281cb3b58 Binary files /dev/null and b/merge_same_products/static/description/invoice_after_save.png differ diff --git a/merge_same_products/static/description/invoice_before_save.png b/merge_same_products/static/description/invoice_before_save.png new file mode 100644 index 000000000..42b830fe2 Binary files /dev/null and b/merge_same_products/static/description/invoice_before_save.png differ diff --git a/merge_same_products/static/description/purchase_after_save.png b/merge_same_products/static/description/purchase_after_save.png new file mode 100644 index 000000000..5cc57a9b2 Binary files /dev/null and b/merge_same_products/static/description/purchase_after_save.png differ diff --git a/merge_same_products/static/description/purchase_before_save.png b/merge_same_products/static/description/purchase_before_save.png new file mode 100644 index 000000000..39c855e75 Binary files /dev/null and b/merge_same_products/static/description/purchase_before_save.png differ diff --git a/merge_same_products/static/description/sale_after_save.png b/merge_same_products/static/description/sale_after_save.png new file mode 100644 index 000000000..68f75501e Binary files /dev/null and b/merge_same_products/static/description/sale_after_save.png differ diff --git a/merge_same_products/static/description/sale_before_save.png b/merge_same_products/static/description/sale_before_save.png new file mode 100644 index 000000000..2000fa874 Binary files /dev/null and b/merge_same_products/static/description/sale_before_save.png differ