diff --git a/pw_sale_total_qty/LICENSE b/pw_sale_total_qty/LICENSE
new file mode 100644
index 0000000..b01eaf1
--- /dev/null
+++ b/pw_sale_total_qty/LICENSE
@@ -0,0 +1,27 @@
+Odoo Proprietary License v1.0
+
+This software and associated files (the "Software") may only be used (executed,
+modified, executed after modifications) if you have purchased a valid license
+from the authors, typically via Odoo Apps, or if you have received a written
+agreement from the authors of the Software (see the COPYRIGHT file).
+
+You may develop Odoo modules that use the Software as a library (typically
+by depending on it, importing it and using its resources), but without copying
+any source code or material from the Software. You may distribute those
+modules under the license of your choice, provided that this license is
+compatible with the terms of the Odoo Proprietary License (For example:
+LGPL, MIT, or proprietary licenses similar to this one).
+
+It is forbidden to publish, distribute, sublicense, or sell copies of the Software
+or modified copies of the Software.
+
+The above copyright notice and this permission notice must be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/pw_sale_total_qty/__init__.py b/pw_sale_total_qty/__init__.py
new file mode 100644
index 0000000..03c48c1
--- /dev/null
+++ b/pw_sale_total_qty/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
diff --git a/pw_sale_total_qty/__manifest__.py b/pw_sale_total_qty/__manifest__.py
new file mode 100644
index 0000000..eba0aa7
--- /dev/null
+++ b/pw_sale_total_qty/__manifest__.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+{
+ "name": "Sale Order Total Quantity",
+ 'version': '16.0.1.0.1',
+ 'author': 'Preway IT Solutions',
+ 'category': 'Sales',
+ 'depends': ['sale'],
+ 'summary': 'This module helps you to show total qty, delivered qty, invoiced qty and remaining qty on sale order | Sale Order Total Quantity | Sale Total Qty | Total Quantity Of Sale Order Line',
+ 'description': """
+- Sale Order Total Quantity
+ """,
+ 'data': [
+ "views/sale_order_view.xml",
+ ],
+ 'price': 3.0,
+ 'currency': "EUR",
+ 'application': True,
+ 'installable': True,
+ "license": "LGPL-3",
+ "images":["static/description/Banner.png"],
+}
diff --git a/pw_sale_total_qty/i18n/fr.po b/pw_sale_total_qty/i18n/fr.po
new file mode 100644
index 0000000..8522be0
--- /dev/null
+++ b/pw_sale_total_qty/i18n/fr.po
@@ -0,0 +1,61 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * pw_sale_total_qty
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-31 13:03+0000\n"
+"PO-Revision-Date: 2024-12-31 13:03+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_remaining_delivery
+msgid "Pending Delivery Qty"
+msgstr "Quantités à livrer"
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_remaining_invoice
+msgid "Pending Invoice Qty"
+msgstr "Quantités à facturer"
+
+#. module: pw_sale_total_qty
+#: model:ir.model,name:pw_sale_total_qty.model_sale_order
+msgid "Sales Order"
+msgstr "Bon de commande"
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_total_qty_delivered
+msgid "Total Delivered Qty"
+msgstr "Total quantités livrées"
+
+#. module: pw_sale_total_qty
+#: model_terms:ir.ui.view,arch_db:pw_sale_total_qty.view_order_form_inherit_pw_total_qty
+msgid "Total Deliverted"
+msgstr "Total quantités"
+
+#. module: pw_sale_total_qty
+#: model_terms:ir.ui.view,arch_db:pw_sale_total_qty.view_order_form_inherit_pw_total_qty
+msgid "Total Demand"
+msgstr " Total commandé"
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_total_product_uom_qty
+msgid "Total Demand Qty"
+msgstr " Total quantités commandées"
+
+#. module: pw_sale_total_qty
+#: model_terms:ir.ui.view,arch_db:pw_sale_total_qty.view_order_form_inherit_pw_total_qty
+msgid "Total Invoiced"
+msgstr "Total facturé"
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_total_qty_invoiced
+msgid "Total Invoiced Qty"
+msgstr "Total quantités facturées"
diff --git a/pw_sale_total_qty/i18n/pw_sale_total_qty.pot b/pw_sale_total_qty/i18n/pw_sale_total_qty.pot
new file mode 100644
index 0000000..9884208
--- /dev/null
+++ b/pw_sale_total_qty/i18n/pw_sale_total_qty.pot
@@ -0,0 +1,61 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * pw_sale_total_qty
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-12-31 13:03+0000\n"
+"PO-Revision-Date: 2024-12-31 13:03+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_remaining_delivery
+msgid "Pending Delivery Qty"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_remaining_invoice
+msgid "Pending Invoice Qty"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model:ir.model,name:pw_sale_total_qty.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_total_qty_delivered
+msgid "Total Delivered Qty"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model_terms:ir.ui.view,arch_db:pw_sale_total_qty.view_order_form_inherit_pw_total_qty
+msgid "Total Deliverted"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model_terms:ir.ui.view,arch_db:pw_sale_total_qty.view_order_form_inherit_pw_total_qty
+msgid "Total Demand"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_total_product_uom_qty
+msgid "Total Demand Qty"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model_terms:ir.ui.view,arch_db:pw_sale_total_qty.view_order_form_inherit_pw_total_qty
+msgid "Total Invoiced"
+msgstr ""
+
+#. module: pw_sale_total_qty
+#: model:ir.model.fields,field_description:pw_sale_total_qty.field_sale_order__pw_total_qty_invoiced
+msgid "Total Invoiced Qty"
+msgstr ""
diff --git a/pw_sale_total_qty/models/__init__.py b/pw_sale_total_qty/models/__init__.py
new file mode 100644
index 0000000..0226d76
--- /dev/null
+++ b/pw_sale_total_qty/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import sale_order
diff --git a/pw_sale_total_qty/models/sale_order.py b/pw_sale_total_qty/models/sale_order.py
new file mode 100644
index 0000000..9ccfcca
--- /dev/null
+++ b/pw_sale_total_qty/models/sale_order.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+
+
+class SaleOrder(models.Model):
+ _inherit = 'sale.order'
+
+ pw_total_product_uom_qty = fields.Float(string="Total Demand Qty", compute='_compute_pw_total_product_uom_qty')
+ pw_total_qty_delivered = fields.Float(string="Total Delivered Qty", compute='_compute_pw_total_qty_delivered')
+ pw_total_qty_invoiced = fields.Float(string="Total Invoiced Qty", compute='_compute_pw_total_qty_invoiced')
+ pw_remaining_delivery = fields.Float(string="Pending Delivery Qty", compute="_compute_pw_remaining_delivery")
+ pw_remaining_invoice = fields.Float(string="Pending Invoice Qty", compute="_compute_pw_remaining_invoice")
+
+ @api.depends('order_line.product_uom_qty')
+ def _compute_pw_total_product_uom_qty(self):
+ for order in self:
+ order.pw_total_product_uom_qty = sum(order.order_line.mapped('product_uom_qty'))
+
+ @api.depends('order_line.qty_delivered')
+ def _compute_pw_total_qty_delivered(self):
+ for order in self:
+ order.pw_total_qty_delivered = sum(order.order_line.mapped('qty_delivered'))
+
+ @api.depends('order_line.qty_invoiced')
+ def _compute_pw_total_qty_invoiced(self):
+ for order in self:
+ order.pw_total_qty_invoiced = sum(order.order_line.mapped('qty_invoiced'))
+
+ @api.depends('order_line.product_uom_qty', 'order_line.qty_delivered')
+ def _compute_pw_remaining_delivery(self):
+ for order in self:
+ delivery_qty = sum(order.order_line.filtered(lambda x: x.product_id.type != 'service').mapped('product_uom_qty'))
+ delivered_qty = sum(order.order_line.mapped('qty_delivered'))
+ order.pw_remaining_delivery = delivery_qty - delivered_qty
+
+ @api.depends('pw_total_product_uom_qty', 'pw_total_qty_invoiced')
+ def _compute_pw_remaining_invoice(self):
+ for order in self:
+ order.pw_remaining_invoice = order.pw_total_product_uom_qty - order.pw_total_qty_invoiced
diff --git a/pw_sale_total_qty/static/description/Banner.png b/pw_sale_total_qty/static/description/Banner.png
new file mode 100644
index 0000000..372a766
Binary files /dev/null and b/pw_sale_total_qty/static/description/Banner.png differ
diff --git a/pw_sale_total_qty/static/description/icon.png b/pw_sale_total_qty/static/description/icon.png
new file mode 100644
index 0000000..d1a3fcc
Binary files /dev/null and b/pw_sale_total_qty/static/description/icon.png differ
diff --git a/pw_sale_total_qty/static/description/index.html b/pw_sale_total_qty/static/description/index.html
new file mode 100644
index 0000000..e872605
--- /dev/null
+++ b/pw_sale_total_qty/static/description/index.html
@@ -0,0 +1,45 @@
+
+
+
+
Sale Order Total Quantity
+
This module helps you to show total qty, delivered qty, invoiced qty and remaining qty on sale order
+
+
+
+
+
+
+
+
+ App Features
+
+
+
Show Total Demand Qty, Delivered and Invoiced Quantity on Sale Order
+
Show Remaining Delivery and Invoice Quantity on Sale Order
+
Also compatible with community and enterprise
+
+
+ Sale Order Total Quantity
+
+ Total Demand, Delivered, Invoiced, Pending Delivery and Pending Invoiced Quanatity on sale order. (Service product not count in pending delivery)
+
+
+
+
+
+
+
+
+
+
+ Contact US
+
+
Email : prewayit@gmail.com
+
+
+
Note: We give free support incase any bug or issue in our apps (Except data recovery).
+
+
+
diff --git a/pw_sale_total_qty/static/description/pw_logo.png b/pw_sale_total_qty/static/description/pw_logo.png
new file mode 100644
index 0000000..3809ff5
Binary files /dev/null and b/pw_sale_total_qty/static/description/pw_logo.png differ
diff --git a/pw_sale_total_qty/static/description/sale1.png b/pw_sale_total_qty/static/description/sale1.png
new file mode 100644
index 0000000..26fe920
Binary files /dev/null and b/pw_sale_total_qty/static/description/sale1.png differ
diff --git a/pw_sale_total_qty/views/sale_order_view.xml b/pw_sale_total_qty/views/sale_order_view.xml
new file mode 100644
index 0000000..c4487cd
--- /dev/null
+++ b/pw_sale_total_qty/views/sale_order_view.xml
@@ -0,0 +1,30 @@
+
+
+
+
+ sale.order.form.inherit.pw.total.qty
+ sale.order
+
+
+
+
+
+
+
+
+
+
+
+
+ Total Demand
+
+
+ Total Deliverted
+
+
+ Total Invoiced
+
+
+
+
+