Browse Source

commit inicial

Rodney Enciso Arias 8 years ago
commit
ed3fa3616e

+ 11 - 0
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 <www.cybrosys.com>

+ 23 - 0
__init__.py

@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import models

BIN
__init__.pyc


+ 40 - 0
__openerp__.py

@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Merge Same Products in Sale Order Lines',
+    'version': '0.1',
+    'description': """This module will merge order lines/invoice lines with same product in Sale, Purchase & Invoice""",
+    'author': 'Cybrosys Techno Solutions',
+    'company': 'Cybrosys Techno Solutions',
+    'website': 'http://www.cybrosys.com',
+    'summary': "This module will merge order lines/invoice lines with same product in Sale, Purchase & Invoice",
+    'category': 'Sales Management',
+    'depends': ['account', 'base', 'sale', 'purchase'],
+    'license': 'AGPL-3',
+    'data': [],
+    'demo': [],
+    'images': ['static/description/banner.jpg'],
+    'installable': True,
+    'auto_install': False,
+
+}

+ 40 - 0
__openerp__.py~

@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Merge Same Products in Sale Order Lines',
+    'version': '0.1',
+    'description': """This module will merge order lines/invoice lines with same product in Sale, Purchase & Invoice""",
+    'author': 'Cybrosys Techno Solutions',
+    'company': 'Cybrosys Techno Solutions',
+    'website': 'http://www.cybrosys.com',
+    'summary': "This module will merge order lines/invoice lines with same product in Sale, Purchase & Invoice",
+    'category': 'sale',
+    'depends': ['account', 'base', 'sale', 'purchase'],
+    'license': 'AGPL-3',
+    'data': [],
+    'demo': [],
+    'images': ['static/description/banner.jpg'],
+    'installable': True,
+    'auto_install': False,
+
+}

+ 26 - 0
models/__init__.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import merge_in_sales
+import merge_in_purchase
+import merge_in_invoice
+

BIN
models/__init__.pyc


+ 139 - 0
models/merge_in_invoice.py

@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+from openerp import api, models
+
+
+class AccountInvoiceAppend(models.Model):
+    _inherit = "account.invoice"
+
+    @api.model
+    def create(self, vals):
+        if "invoice_line" in vals.keys():
+            product_list = []
+            for obj in vals['invoice_line']:
+                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'])
+                        list_new = vals['invoice_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]['quantity']
+                                    if count == 1:
+                                        new_list.append(ele)
+                            for att in new_list:
+                                if obj == att[2]['product_id']:
+                                    att[2]['quantity'] = qty
+                        vals['invoice_line'] = new_list
+        res = super(AccountInvoiceAppend, self).create(vals)
+        return res
+
+    @api.one
+    def write(self, vals):
+        product_list_ext = []
+        product_list_new = []
+        if "invoice_line" in vals.keys():
+            new_list = vals['invoice_line']
+            for att in new_list:
+                if att[0] == 4:
+                    s = self.invoice_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'])
+            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.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 += 1
+                    for att1 in new_list:
+                        if att1[0] == 4:
+                            o = self.invoice_line.browse(att1[1])
+                            if o.product_id.id == obj:
+                                o.quantity = pro_qty
+            for obj1 in product_list_new:
+                pro_qty = 0
+                count = 0
+                if obj 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'] == obj:
+                                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.browse(att2[1])
+                            if o.product_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.browse(att3[1])
+                    if "quantity" in att3[2]:
+                        o.quantity = att3[2]['quantity']
+            vals['invoice_line'] = pro_list
+        res = super(AccountInvoiceAppend, self).write(vals)
+        return res
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

BIN
models/merge_in_invoice.pyc


+ 119 - 0
models/merge_in_purchase.py

@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+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:
+                    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[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
+            for obj1 in product_list_new:
+                pro_qty = 0
+                count = 0
+                if obj not in product_list_ext:
+                    for att1 in new_list:
+                        if att1[0] == 0:
+                            if att1[2]['product_id'] == obj1:
+                                pro_qty += 1
+                    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 == 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
+

BIN
models/merge_in_purchase.pyc


+ 145 - 0
models/merge_in_sales.py

@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    Cybrosys Technologies Pvt. Ltd.
+#    Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
+#    Author: Niyas Raphy(<http://www.cybrosys.com>)
+#    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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+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.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:
+                    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[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
+            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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

BIN
models/merge_in_sales.pyc


BIN
static/description/banner.jpg


BIN
static/description/cybro_logo.png


BIN
static/description/icon.png


+ 109 - 0
static/description/index.html

@@ -0,0 +1,109 @@
+<section class="oe_container">
+     <div class="oe_row oe_spaced">
+        <h2 class="oe_slogan">Merging Same Product Line</h2>
+        <h3 class="oe_slogan">It helps to merge same products in order lines & invoice lines</h3>
+         <h4 class="oe_slogan">Author : Cybrosys Techno Solutions, www.cybrosys.com</h4>
+    </div>
+
+    <div class="oe_row oe_spaced">
+        <div class="oe_span12">
+            <p class='oe_mt32'>
+                &#x261B;This module enables the feature to merge same products in the sale order line , purchase order line & invoice line into one on saving.
+            </p>
+            <div class="oe_centeralign oe_websiteonly">
+            </div>
+        </div>
+    </div>
+</section>
+
+<section class="oe_container oe_dark">
+    <div class="oe_row">
+        <h2 class="oe_slogan">Sale Order</h2>
+        <div class="oe_span6">
+            <p class='oe_mt32'>
+                Before saving the sale order<br>
+            </p>
+            <div class="oe_row_img oe_centered">
+                <img class="oe_picture oe_screenshot" src="sale_before_save.png">
+            </div>
+        </div>
+        <div class="oe_span6">
+            <p class='oe_mt32'>
+               After saving the sale order <br>
+
+            </p>
+            <div class="oe_row_img oe_centered">
+                <img class="oe_picture oe_screenshot" src="sale_order_after.png">
+            </div>
+        </div>
+    </div>
+</section>
+
+<section class="oe_container oe_dark">
+    <div class="oe_row">
+        <h2 class="oe_slogan">Purchase Order</h2>
+        <div class="oe_span6">
+            <p class='oe_mt32'>
+                Before saving the order<br>
+
+            </p>
+            <div class="oe_row_img oe_centered">
+                <img class="oe_picture oe_screenshot" src="purchase_before_save.png">
+            </div>
+        </div>
+        <div class="oe_span6">
+            <p class='oe_mt32'>
+                After saving the order <br>
+
+            </p>
+            <div class="oe_row_img oe_centered">
+                <img class="oe_picture oe_screenshot" src="purchase_after.png">
+            </div>
+        </div>
+    </div>
+</section>
+
+<section class="oe_container oe_dark">
+    <div class="oe_row">
+        <h2 class="oe_slogan">Invoice</h2>
+        <div class="oe_span6">
+            <p class='oe_mt32'>
+                Before saving the order<br>
+
+            </p>
+            <div class="oe_row_img oe_centered">
+                <img class="oe_picture oe_screenshot" src="invoice_before_save.png">
+            </div>
+        </div>
+        <div class="oe_span6">
+            <p class='oe_mt32'>
+                After saving the order <br>
+
+            </p>
+            <div class="oe_row_img oe_centered">
+                <img class="oe_picture oe_screenshot" src="invoice_after.png">
+            </div>
+        </div>
+    </div>
+</section>
+
+<section class="oe_container oe_dark">
+    <h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2>
+    <div class="oe_slogan" style="margin-top:10px !important;">
+        <a  class="btn btn-primary btn-lg mt8"
+            style="color: #FFFFFF !important;" href="http://www.cybrosys.com"><i
+            class="fa fa-envelope"></i> Email </a> <a
+            class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
+            href="http://www.cybrosys.com/contact/"><i
+            class="fa fa-phone"></i> Contact Us </a> <a
+            class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
+            href="http://www.cybrosys.com/odoo-customization-and-installation/"><i
+            class="fa fa-check-square"></i> Request Customization </a>
+    </div>
+            <img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block">
+</section>
+
+
+
+
+

BIN
static/description/invoice_after.png


BIN
static/description/invoice_before_save.png


BIN
static/description/purchase_after.png


BIN
static/description/purchase_before_save.png


BIN
static/description/sale_before_save.png


BIN
static/description/sale_order_after.png