Browse Source

Aug 20 [UPDT] Updated 'inventory_advanced_reports'

pull/332/merge
AjmalCybro 8 months ago
parent
commit
7a4cb6ea0e
  1. 9
      inventory_advanced_reports/README.rst
  2. 0
      inventory_advanced_reports/__init__.py
  3. 15
      inventory_advanced_reports/__manifest__.py
  4. 0
      inventory_advanced_reports/controllers/__init__.py
  5. 0
      inventory_advanced_reports/controllers/inventory_advanced_reports.py
  6. 8
      inventory_advanced_reports/doc/RELEASE_NOTES.md
  7. 0
      inventory_advanced_reports/report/__init__.py
  8. 0
      inventory_advanced_reports/report/age_breakdown_report.py
  9. 0
      inventory_advanced_reports/report/age_breakdown_report_views.xml
  10. 0
      inventory_advanced_reports/report/aging_report.py
  11. 71
      inventory_advanced_reports/report/fsn_report.py
  12. 0
      inventory_advanced_reports/report/fsn_report_views.xml
  13. 255
      inventory_advanced_reports/report/fsn_xyz_report.py
  14. 0
      inventory_advanced_reports/report/fsn_xyz_report_views.xml
  15. 284
      inventory_advanced_reports/report/out_of_stock_report.py
  16. 0
      inventory_advanced_reports/report/out_of_stock_report_views.xml
  17. 29
      inventory_advanced_reports/report/over_stock_report.py
  18. 0
      inventory_advanced_reports/report/over_stock_report_views.xml
  19. 25
      inventory_advanced_reports/report/stock_movement_report.py
  20. 0
      inventory_advanced_reports/report/stock_movement_report_views.xml
  21. 0
      inventory_advanced_reports/report/xyz_report.py
  22. 0
      inventory_advanced_reports/report/xyz_report_views.xml
  23. 0
      inventory_advanced_reports/security/ir.model.access.csv
  24. 0
      inventory_advanced_reports/static/description/assets/icons/check.png
  25. 0
      inventory_advanced_reports/static/description/assets/icons/chevron.png
  26. 0
      inventory_advanced_reports/static/description/assets/icons/cogs.png
  27. 0
      inventory_advanced_reports/static/description/assets/icons/consultation.png
  28. 0
      inventory_advanced_reports/static/description/assets/icons/ecom-black.png
  29. 0
      inventory_advanced_reports/static/description/assets/icons/education-black.png
  30. 0
      inventory_advanced_reports/static/description/assets/icons/hotel-black.png
  31. 0
      inventory_advanced_reports/static/description/assets/icons/license.png
  32. 0
      inventory_advanced_reports/static/description/assets/icons/lifebuoy.png
  33. 0
      inventory_advanced_reports/static/description/assets/icons/manufacturing-black.png
  34. 0
      inventory_advanced_reports/static/description/assets/icons/pos-black.png
  35. 0
      inventory_advanced_reports/static/description/assets/icons/puzzle.png
  36. 0
      inventory_advanced_reports/static/description/assets/icons/restaurant-black.png
  37. 0
      inventory_advanced_reports/static/description/assets/icons/service-black.png
  38. 0
      inventory_advanced_reports/static/description/assets/icons/trading-black.png
  39. 0
      inventory_advanced_reports/static/description/assets/icons/training.png
  40. 0
      inventory_advanced_reports/static/description/assets/icons/update.png
  41. 0
      inventory_advanced_reports/static/description/assets/icons/user.png
  42. 0
      inventory_advanced_reports/static/description/assets/icons/wrench.png
  43. 0
      inventory_advanced_reports/static/description/assets/misc/categories.png
  44. 0
      inventory_advanced_reports/static/description/assets/misc/check-box.png
  45. 0
      inventory_advanced_reports/static/description/assets/misc/compass.png
  46. 0
      inventory_advanced_reports/static/description/assets/misc/corporate.png
  47. 0
      inventory_advanced_reports/static/description/assets/misc/customer-support.png
  48. 0
      inventory_advanced_reports/static/description/assets/misc/cybrosys-logo.png
  49. 0
      inventory_advanced_reports/static/description/assets/misc/features.png
  50. 0
      inventory_advanced_reports/static/description/assets/misc/logo.png
  51. 0
      inventory_advanced_reports/static/description/assets/misc/pictures.png
  52. 0
      inventory_advanced_reports/static/description/assets/misc/pie-chart.png
  53. 0
      inventory_advanced_reports/static/description/assets/misc/reports-icon.png
  54. 0
      inventory_advanced_reports/static/description/assets/misc/right-arrow.png
  55. 0
      inventory_advanced_reports/static/description/assets/misc/star.png
  56. 0
      inventory_advanced_reports/static/description/assets/misc/support.png
  57. 0
      inventory_advanced_reports/static/description/assets/misc/whatsapp.png
  58. 0
      inventory_advanced_reports/static/description/assets/modules/1.png
  59. 0
      inventory_advanced_reports/static/description/assets/modules/2.png
  60. 0
      inventory_advanced_reports/static/description/assets/modules/3.png
  61. 0
      inventory_advanced_reports/static/description/assets/modules/4.png
  62. 0
      inventory_advanced_reports/static/description/assets/modules/5.png
  63. 0
      inventory_advanced_reports/static/description/assets/modules/6.png
  64. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 1.png
  65. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 2.png
  66. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 3.png
  67. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 4.png
  68. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 5.png
  69. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 0.png
  70. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 1.png
  71. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 2.png
  72. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 3.png
  73. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 4.png
  74. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 5.png
  75. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 6.png
  76. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 7.png
  77. 0
      inventory_advanced_reports/static/description/assets/screenshots/AGING 8.png
  78. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 1.png
  79. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 10.png
  80. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 2.png
  81. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 3.png
  82. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 4.png
  83. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 5.png
  84. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 6.png
  85. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 7.png
  86. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 8.png
  87. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN 9.png
  88. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 1.png
  89. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 2.png
  90. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 3.png
  91. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 4.png
  92. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 5.png
  93. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 6.png
  94. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 7.png
  95. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 8.png
  96. 0
      inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 9.png
  97. 0
      inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 1.png
  98. 0
      inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 2.png
  99. 0
      inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 3.png
  100. 0
      inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 4.png

9
inventory_advanced_reports/README.rst

@ -2,19 +2,14 @@
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3 :alt: License: LGPL-3
Advanced Inventory Reports Inventory Advanced Reports
========================== ==========================
Helps to Manage different types of Inventory Reports like FSN Report, Out Of Stock Report, etc. * This module provides inventory reports to help you manage your inventory properly.
Configuration Configuration
============= =============
- Additional configuration not required - Additional configuration not required
Installation
============
- www.odoo.com/documentation/16.0/setup/install.html
- Install our custom addon
License License
------- -------
Lesser General Public License, Version 3 (LGPL v3). Lesser General Public License, Version 3 (LGPL v3).

0
inventory_advanced_reports/__init__.py

15
inventory_advanced_reports/__manifest__.py

@ -20,11 +20,18 @@
# #
############################################################################### ###############################################################################
{ {
"name": "Advanced Inventory Reports", "name": "Inventory Advanced Reports",
"version": "16.0.1.0.0", "version": "16.0.1.0.1",
"category": 'Warehouse', "category": 'Warehouse',
"summary": "Helps to Manage different types of Inventory Reports like FSN Report, Out Of Stock Report, Inventory XYZ Report, etc.", "summary": "Inventory reports to help you to manage your inventory "
"description": "Helps to Manage different types of Inventory Reports like FSN Report, Out Of Stock Report, Inventory XYZ Report, etc", "properly",
"description": "This module allows you to generate inventory reports,users "
"can track Aging analysis, FSN classification (inventory "
"movement frequency classification), XYZ classification "
"(inventory classification based on stock value), FSN-XYZ "
"combined classification to define sales strategies for the "
"existing inventories. Overstock analysis, Out of Stock "
"analysis and Stock movements (inventory rotation).",
"author": "Cybrosys Techno Solutions", "author": "Cybrosys Techno Solutions",
'company': 'Cybrosys Techno Solutions', 'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions', 'maintainer': 'Cybrosys Techno Solutions',

0
inventory_advanced_reports/controllers/__init__.py

0
inventory_advanced_reports/controllers/inventory_advanced_reports.py

8
inventory_advanced_reports/doc/RELEASE_NOTES.md

@ -4,4 +4,10 @@
#### Version 16.0.1.0.0 #### Version 16.0.1.0.0
##### ADD ##### ADD
- Initial Commit for Advanced Inventory Reports - Initial Commit for Inventory Advanced Reports
#### 19.08.2024
#### Version 16.0.1.0.1
##### UPDT
- Fixed the issue in filtering of warehouses of same company

0
inventory_advanced_reports/report/__init__.py

0
inventory_advanced_reports/report/age_breakdown_report.py

0
inventory_advanced_reports/report/age_breakdown_report_views.xml

0
inventory_advanced_reports/report/aging_report.py

71
inventory_advanced_reports/report/fsn_report.py

@ -44,8 +44,7 @@ class FsnReport(models.AbstractModel):
end_date = data.get('end_date') end_date = data.get('end_date')
fsn = data.get('fsn') fsn = data.get('fsn')
if not start_date or not end_date: if not start_date or not end_date:
raise ValueError( raise ValueError("Missing start_date or end_date in the data")
"Missing start_date or end_date in the data")
start_date = datetime.strptime(start_date, '%Y-%m-%d') start_date = datetime.strptime(start_date, '%Y-%m-%d')
end_date = datetime.strptime(end_date, '%Y-%m-%d') end_date = datetime.strptime(end_date, '%Y-%m-%d')
filtered_product_stock = [] filtered_product_stock = []
@ -99,26 +98,26 @@ class FsnReport(models.AbstractModel):
END AS product_code_and_name, END AS product_code_and_name,
pc.complete_name AS category_name, pc.complete_name AS category_name,
company.id AS company_id, company.id AS company_id,
sw.id AS warehouse_id, COALESCE(sw_dest.id, sw_src.id) AS warehouse_id,
(SUM(CASE WHEN sm.date <= %s AND sld_dest.usage = 'internal' (SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END) - THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal' SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END)) AS opening_stock, THEN sm.product_uom_qty ELSE 0 END)) AS opening_stock,
(SUM(CASE WHEN sm.date <= %s AND sld_dest.usage = 'internal' (SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END) - THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal' SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END)) AS closing_stock, THEN sm.product_uom_qty ELSE 0 END)) AS closing_stock,
SUM(CASE WHEN sm.date BETWEEN %s AND %s SUM(CASE WHEN sm.date BETWEEN %s AND %s
AND sld_dest.usage = 'customer' AND sl_dest.usage = 'customer'
THEN sm.product_uom_qty ELSE 0 END) AS sales, THEN sm.product_uom_qty ELSE 0 END) AS sales,
((SUM(CASE WHEN sm.date <= %s ((SUM(CASE WHEN sm.date <= %s
AND sld_dest.usage = 'internal' AND sl_dest.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END) - THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal' SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END))+ THEN sm.product_uom_qty ELSE 0 END))+
(SUM(CASE WHEN sm.date <= %s AND sld_dest.usage = 'internal' (SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END) - THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal' SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END)))/2 AS average_stock THEN sm.product_uom_qty ELSE 0 END)))/2 AS average_stock
FROM FROM
stock_move sm stock_move sm
@ -131,11 +130,13 @@ class FsnReport(models.AbstractModel):
JOIN JOIN
res_company company ON company.id = sm.company_id res_company company ON company.id = sm.company_id
JOIN JOIN
stock_warehouse sw ON sw.company_id = company.id stock_location sl_dest ON sm.location_dest_id = sl_dest.id
JOIN
stock_location sl_src ON sm.location_id = sl_src.id
LEFT JOIN LEFT JOIN
stock_location sld_dest ON sm.location_dest_id = sld_dest.id stock_warehouse sw_dest ON sl_dest.warehouse_id = sw_dest.id
LEFT JOIN LEFT JOIN
stock_location sld_src ON sm.location_id = sld_src.id stock_warehouse sw_src ON sl_src.warehouse_id = sw_src.id
WHERE WHERE
sm.state = 'done' sm.state = 'done'
""" """
@ -143,46 +144,36 @@ class FsnReport(models.AbstractModel):
start_date, start_date, end_date, end_date, start_date, end_date, start_date, start_date, end_date, end_date, start_date, end_date,
start_date, start_date, end_date, end_date start_date, start_date, end_date, end_date
] ]
sub_queries = []
sub_params = []
param_count = 0
if product_ids or category_ids: if product_ids or category_ids:
query += " AND (" query += " AND ("
if product_ids: if product_ids:
product_ids = [product_id for product_id in product_ids]
query += "pp.id = ANY(%s)" query += "pp.id = ANY(%s)"
params.append(product_ids) params.append(product_ids)
param_count += 1
if product_ids and category_ids: if product_ids and category_ids:
query += " OR " query += " OR "
if category_ids: if category_ids:
category_ids = [category_id for category_id in category_ids]
query += "pt.categ_id IN %s" query += "pt.categ_id IN %s"
params.append(tuple(category_ids)) params.append(tuple(category_ids))
param_count += 1
if product_ids or category_ids: if product_ids or category_ids:
query += ")" query += ")"
if company_ids: if company_ids:
query += f" AND company.id IN %s" query += " AND company.id IN %s"
sub_params.append(tuple(company_ids)) params.append(tuple(company_ids))
param_count += 1
if warehouse_ids: if warehouse_ids:
query += f" AND sw.id IN %s" query += " AND (COALESCE(sw_dest.id, sw_src.id) IN %s)"
sub_params.append(tuple(warehouse_ids)) params.append(tuple(warehouse_ids))
param_count += 1
if sub_queries:
query += " AND " + " AND ".join(sub_queries)
query += """ query += """
GROUP BY pp.id, pt.categ_id,CASE GROUP BY pp.id, pt.categ_id,
WHEN pp.default_code IS NOT NULL CASE
THEN CONCAT(pp.default_code, ' - ', WHEN pp.default_code IS NOT NULL
pt.name->>'en_US') THEN CONCAT(pp.default_code, ' - ',
ELSE pt.name->>'en_US')
pt.name->>'en_US' ELSE
END, pc.complete_name, company.id, sw.id pt.name->>'en_US'
) AS subquery END, pc.complete_name, company.id, COALESCE(sw_dest.id, sw_src.id)
""" ) AS subquery
self.env.cr.execute(query, tuple(params + sub_params)) """
self.env.cr.execute(query, tuple(params))
result_data = self.env.cr.dictfetchall() result_data = self.env.cr.dictfetchall()
for fsn_data in result_data: for fsn_data in result_data:
if fsn_data.get('fsn_classification') == str(fsn): if fsn_data.get('fsn_classification') == str(fsn):

0
inventory_advanced_reports/report/fsn_report_views.xml

255
inventory_advanced_reports/report/fsn_xyz_report.py

@ -49,192 +49,163 @@ class FsnXyzReport(models.AbstractModel):
end_date = fields.datetime.strptime(end_date, '%Y-%m-%d') end_date = fields.datetime.strptime(end_date, '%Y-%m-%d')
filtered_product_stock = [] filtered_product_stock = []
query = """ query = """
SELECT SELECT
product_id, product_id,
product_code_and_name, product_code_and_name,
category_id, category_id,
category_name, category_name,
company_id, company_id,
warehouse_id, warehouse_id,
opening_stock, opening_stock,
closing_stock, closing_stock,
sales, sales,
average_stock, average_stock,
current_stock, current_stock,
stock_value, stock_value,
stock_percentage, stock_percentage,
CASE
WHEN sales > 0
THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END AS turnover_ratio,
CASE
WHEN
CASE CASE
WHEN sales > 0 WHEN sales > 0
THEN ROUND((sales / NULLIF(average_stock, 0)), 2) THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0 ELSE 0
END AS turnover_ratio, END > 3 THEN 'Fast Moving'
WHEN
CASE CASE
WHEN WHEN sales > 0
CASE THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
WHEN sales > 0 ELSE 0
THEN END >= 1 AND
ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END > 3 THEN 'Fast Moving'
WHEN
CASE
WHEN sales > 0
THEN
ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END >= 1 AND
CASE
WHEN sales > 0
THEN
ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END <= 3 THEN 'Slow Moving'
ELSE 'Non Moving'
END AS fsn_classification,
SUM(stock_percentage) OVER (ORDER BY stock_value DESC)
AS cumulative_stock_percentage,
CASE CASE
WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) < 70 WHEN sales > 0
THEN 'X' THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) >= 70 ELSE 0
AND SUM(stock_percentage) OVER (ORDER BY stock_value DESC) <= 90 END <= 3 THEN 'Slow Moving'
THEN 'Y' ELSE 'Non Moving'
ELSE 'Z' END AS fsn_classification,
END AS xyz_classification, SUM(stock_percentage) OVER (ORDER BY stock_value DESC) AS cumulative_stock_percentage,
CONCAT( CASE
CASE WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) < 70 THEN 'X'
WHEN WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) >= 70
CASE AND SUM(stock_percentage) OVER (ORDER BY stock_value DESC) <= 90 THEN 'Y'
WHEN sales > 0 ELSE 'Z'
THEN ROUND((sales / NULLIF(average_stock, 0)), 2) END AS xyz_classification,
ELSE 0 CONCAT(
END > 3 THEN 'F'
WHEN
CASE CASE
WHEN sales > 0 WHEN
THEN ROUND((sales / NULLIF(average_stock, 0)), 2) CASE
ELSE 0 WHEN sales > 0
END >= 1 AND THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END > 3 THEN 'F'
WHEN
CASE
WHEN sales > 0
THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END >= 1 AND
CASE
WHEN sales > 0
THEN ROUND((sales / NULLIF(average_stock, 0)), 2)
ELSE 0
END <= 3 THEN 'S'
ELSE 'N'
END,
CASE CASE
WHEN sales > 0 WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) < 70 THEN 'X'
THEN ROUND((sales / NULLIF(average_stock, 0)), 2) WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) >= 70
ELSE 0 AND SUM(stock_percentage) OVER (ORDER BY stock_value DESC) <= 90 THEN 'Y'
END <= 3 THEN 'S' ELSE 'Z'
ELSE 'N' END
END, ) AS combined_classification
CASE
WHEN SUM(stock_percentage) OVER (ORDER BY stock_value DESC) < 70
THEN 'X'
WHEN SUM(stock_percentage)
OVER (ORDER BY stock_value DESC) >= 70 AND SUM(stock_percentage)
OVER (ORDER BY stock_value DESC) <= 90 THEN 'Y'
ELSE 'Z'
END
) AS combined_classification
FROM FROM
(SELECT (SELECT
pp.id AS product_id, pp.id AS product_id,
pt.categ_id AS category_id, pt.categ_id AS category_id,
CASE CASE
WHEN pp.default_code IS NOT NULL WHEN pp.default_code IS NOT NULL
THEN CONCAT(pp.default_code, ' - ', THEN CONCAT(pp.default_code, ' - ', pt.name->>'en_US')
pt.name->>'en_US')
ELSE ELSE
pt.name->>'en_US' pt.name->>'en_US'
END AS product_code_and_name, END AS product_code_and_name,
pc.complete_name AS category_name, pc.complete_name AS category_name,
company.id AS company_id, company.id AS company_id,
sw.id AS warehouse_id, COALESCE(sw_dest.id, sw_src.id) AS warehouse_id,
SUM(svl.remaining_qty) AS current_stock, SUM(svl.remaining_qty) AS current_stock,
SUM(svl.remaining_value) AS stock_value, SUM(svl.remaining_value) AS stock_value,
COALESCE(ROUND((SUM(svl.remaining_value) / COALESCE(ROUND((SUM(svl.remaining_value) / NULLIF(SUM(SUM(svl.remaining_value)) OVER (), 0)) * 100, 2), 0) AS stock_percentage,
NULLIF(SUM(SUM(svl.remaining_value)) (SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END) -
OVER (), 0)) * 100, 2),0) AS stock_percentage, SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END)) AS opening_stock,
(SUM(CASE WHEN sm.date <= %s AND sld_dest.usage = 'internal' (SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END) -
THEN sm.product_uom_qty ELSE 0 END) - SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END)) AS closing_stock,
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal' SUM(CASE WHEN sm.date BETWEEN %s AND %s AND sl_dest.usage = 'customer' THEN sm.product_uom_qty ELSE 0 END) AS sales,
THEN sm.product_uom_qty ELSE 0 END)) AS opening_stock, ((SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END) -
(SUM(CASE WHEN sm.date <= %s AND sld_dest.usage = 'internal' SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END))+
THEN sm.product_uom_qty ELSE 0 END) - (SUM(CASE WHEN sm.date <= %s AND sl_dest.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal' SUM(CASE WHEN sm.date <= %s AND sl_src.usage = 'internal' THEN sm.product_uom_qty ELSE 0 END)))/2 AS average_stock
THEN sm.product_uom_qty ELSE 0 END)) AS closing_stock,
SUM(CASE WHEN sm.date BETWEEN %s AND %s
AND sld_dest.usage = 'customer'
THEN sm.product_uom_qty ELSE 0 END) AS sales,
((SUM(CASE WHEN sm.date <= %s
AND sld_dest.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END))+
(SUM(CASE WHEN sm.date <= %s AND sld_dest.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END) -
SUM(CASE WHEN sm.date <= %s AND sld_src.usage = 'internal'
THEN sm.product_uom_qty ELSE 0 END)))/2 AS average_stock
FROM FROM
stock_move sm stock_move sm
JOIN JOIN
product_product pp ON sm.product_id = pp.id product_product pp ON sm.product_id = pp.id
JOIN JOIN
product_template pt ON pp.product_tmpl_id = pt.id product_template pt ON pp.product_tmpl_id = pt.id
JOIN JOIN
product_category pc ON pt.categ_id = pc.id product_category pc ON pt.categ_id = pc.id
JOIN JOIN
res_company company ON company.id = sm.company_id res_company company ON company.id = sm.company_id
JOIN JOIN
stock_warehouse sw ON sw.company_id = company.id stock_location sl_dest ON sm.location_dest_id = sl_dest.id
JOIN JOIN
stock_valuation_layer svl ON svl.stock_move_id = sm.id stock_location sl_src ON sm.location_id = sl_src.id
LEFT JOIN LEFT JOIN
stock_location sld_dest ON sm.location_dest_id = sld_dest.id stock_warehouse sw_dest ON sl_dest.warehouse_id = sw_dest.id
LEFT JOIN LEFT JOIN
stock_location sld_src ON sm.location_id = sld_src.id stock_warehouse sw_src ON sl_src.warehouse_id = sw_src.id
WHERE JOIN
sm.state = 'done' stock_valuation_layer svl ON svl.stock_move_id = sm.id
AND pp.active = TRUE WHERE
AND pt.active = TRUE sm.state = 'done'
AND pt.type = 'product' AND pp.active = TRUE
AND svl.remaining_value IS NOT NULL AND pt.active = TRUE
AND pt.type = 'product'
AND svl.remaining_value IS NOT NULL
""" """
params = [ params = [
start_date, start_date, end_date, end_date, start_date, end_date, start_date, start_date, end_date, end_date, start_date, end_date,
start_date, start_date, end_date, end_date start_date, start_date, end_date, end_date
] ]
sub_queries = []
sub_params = []
param_count = 0
if product_ids or category_ids: if product_ids or category_ids:
query += " AND (" query += " AND ("
if product_ids: if product_ids:
product_ids = [product_id for product_id in product_ids] product_ids = [product_id for product_id in product_ids]
query += "pp.id = ANY(%s)" query += "pp.id = ANY(%s)"
params.append(product_ids) params.append(product_ids)
param_count += 1
if product_ids and category_ids: if product_ids and category_ids:
query += " OR " query += " OR "
if category_ids: if category_ids:
category_ids = [category_id for category_id in category_ids] category_ids = [category_id for category_id in category_ids]
query += "pt.categ_id IN %s" query += "pt.categ_id IN %s"
params.append(tuple(category_ids)) params.append(tuple(category_ids))
param_count += 1
if product_ids or category_ids: if product_ids or category_ids:
query += ")" query += ")"
if company_ids: if company_ids:
query += f" AND sm.company_id IN %s" query += " AND sm.company_id IN %s"
sub_params.append(tuple(company_ids)) params.append(tuple(company_ids))
param_count += 1
if warehouse_ids: if warehouse_ids:
query += f" AND sw.id IN %s" query += " AND (COALESCE(sw_dest.id, sw_src.id) IN %s)"
sub_params.append(tuple(warehouse_ids)) params.append(tuple(warehouse_ids))
param_count += 1
if sub_queries:
query += " AND " + " AND ".join(sub_queries)
query += """ query += """
GROUP BY GROUP BY
pp.id,pt.name, pt.categ_id,pc.complete_name, company.id, sw.id pp.id, pt.name, pt.categ_id, pc.complete_name, company.id, COALESCE(sw_dest.id, sw_src.id)
) AS subquery ) AS subquery
ORDER BY stock_value DESC ORDER BY stock_value DESC
""" """
self.env.cr.execute(query, tuple(params + sub_params)) self.env.cr.execute(query, tuple(params))
result_data = self.env.cr.dictfetchall() result_data = self.env.cr.dictfetchall()
for fsn_data in result_data: for fsn_data in result_data:
if ( if (

0
inventory_advanced_reports/report/fsn_xyz_report_views.xml

284
inventory_advanced_reports/report/out_of_stock_report.py

@ -45,103 +45,89 @@ class OutOfStockReport(models.AbstractModel):
raise ValueError( raise ValueError(
"Missing start_date or end_date in the data") "Missing start_date or end_date in the data")
query = """ query = """
SELECT SELECT
product_id, product_id,
product_code_and_name, product_code_and_name,
category_id, category_id,
category_name, category_name,
company_id, company_id,
current_stock, current_stock,
warehouse_id, warehouse_id,
incoming_quantity, incoming_quantity,
outgoing_quantity, outgoing_quantity,
virtual_stock, virtual_stock,
sales, sales,
ads, ads,
advance_stock_days, advance_stock_days,
ROUND(advance_stock_days * ads, 0) AS demanded_quantity, ROUND(advance_stock_days * ads, 0) AS demanded_quantity,
ROUND(CASE ROUND(CASE
WHEN ads = 0 THEN virtual_stock / 0.001 WHEN ads = 0 THEN virtual_stock / 0.001
ELSE virtual_stock / ads ELSE virtual_stock / ads
END,0) AS in_stock_days, END,0) AS in_stock_days,
ROUND(CASE ROUND(CASE
WHEN ads = 0 THEN GREATEST(advance_stock_days - WHEN ads = 0 THEN GREATEST(advance_stock_days - ROUND(virtual_stock / 0.001, 2), 0)
ROUND(virtual_stock / 0.001, 2), 0) ELSE GREATEST(advance_stock_days - ROUND(virtual_stock / ads, 2), 0)
ELSE GREATEST(advance_stock_days - END ,0) AS out_of_stock_days,
ROUND(virtual_stock / ads, 2), 0) ROUND(
END ,0) AS out_of_stock_days, CASE
ROUND( WHEN advance_stock_days = 0 THEN 0
ELSE
CASE CASE
WHEN advance_stock_days = 0 THEN 0 WHEN ads = 0 THEN GREATEST(advance_stock_days - ROUND(virtual_stock / 0.001, 2), 0)
ELSE ELSE GREATEST(advance_stock_days - ROUND(virtual_stock / ads, 2), 0)
CASE END
WHEN ads = 0 THEN GREATEST(advance_stock_days - END, 2
ROUND(virtual_stock / 0.001, 2), 0) ) AS out_of_stock_ratio,
ELSE GREATEST(advance_stock_days - ROUND(
ROUND(virtual_stock / ads, 2), 0) CASE
END WHEN ads = 0 THEN GREATEST(advance_stock_days - ROUND(virtual_stock / 0.001, 2), 0)
END, 2 ELSE GREATEST(advance_stock_days - ROUND(virtual_stock / ads, 2), 0)
) AS out_of_stock_ratio, END * ads, 0
ROUND( ) AS out_of_stock_qty,
CASE ROUND(
WHEN ads = 0 CASE
THEN WHEN virtual_stock = 0 THEN 0
GREATEST(advance_stock_days - ELSE sales / virtual_stock
ROUND(virtual_stock / 0.001, 2), 0) END, 2
ELSE GREATEST(advance_stock_days - ) AS turnover_ratio,
ROUND(virtual_stock / ads, 2), 0) CASE
END * ads, 0 WHEN
) AS out_of_stock_qty,
ROUND(
CASE
WHEN virtual_stock = 0 THEN 0
ELSE sales / virtual_stock
END, 2
) AS turnover_ratio,
CASE CASE
WHEN WHEN sales > 0 THEN ROUND((sales / NULLIF(virtual_stock, 0)), 2)
CASE ELSE 0
WHEN sales > 0 THEN END > 3 THEN 'Fast Moving'
ROUND((sales / NULLIF(virtual_stock, 0)), 2) WHEN
ELSE 0 CASE
END > 3 THEN 'Fast Moving' WHEN sales > 0 THEN ROUND((sales / NULLIF(virtual_stock, 0)), 2)
WHEN ELSE 0
CASE END >= 1 AND
WHEN sales > 0 THEN CASE
ROUND((sales / NULLIF(virtual_stock, 0)), 2) WHEN sales > 0 THEN ROUND((sales / NULLIF(virtual_stock, 0)), 2)
ELSE 0 ELSE 0
END >= 1 AND END <= 3 THEN 'Slow Moving'
CASE ELSE 'Non Moving'
WHEN sales > 0 THEN END AS fsn_classification
ROUND((sales / NULLIF(virtual_stock, 0)), 2) FROM(
ELSE 0 SELECT
END <= 3 THEN 'Slow Moving' CASE
ELSE 'Non Moving' WHEN pp.default_code IS NOT NULL
END AS fsn_classification THEN CONCAT(pp.default_code, ' - ', pt.name->>'en_US')
FROM( ELSE
SELECT pt.name->>'en_US'
CASE END AS product_code_and_name,
WHEN pp.default_code IS NOT NULL company.id AS company_id,
THEN CONCAT(pp.default_code, ' - ', company.name AS company_name,
pt.name->>'en_US') sm.product_id AS product_id,
ELSE pc.id AS category_id,
pt.name->>'en_US' pc.complete_name AS category_name,
END AS product_code_and_name, COALESCE(sld_dest.warehouse_id, sld_src.warehouse_id) AS warehouse_id,
company.id AS company_id, SUM(CASE
company.name AS company_name, WHEN sld_dest.usage = 'internal' AND sm.state IN ('assigned', 'confirmed', 'waiting')
sm.product_id AS product_id,
pc.id AS category_id,
pc.complete_name AS category_name,
sw.id AS warehouse_id,
SUM(CASE
WHEN sld_dest.usage = 'internal' AND sm.state IN
('assigned', 'confirmed', 'waiting')
THEN sm.product_uom_qty THEN sm.product_uom_qty
ELSE 0 ELSE 0
END) AS incoming_quantity, END) AS incoming_quantity,
SUM(CASE SUM(CASE
WHEN sld_src.usage = 'internal' AND sm.state IN WHEN sld_src.usage = 'internal' AND sm.state IN ('assigned', 'confirmed', 'waiting')
('assigned', 'confirmed', 'waiting')
THEN sm.product_uom_qty THEN sm.product_uom_qty
ELSE 0 ELSE 0
END) AS outgoing_quantity, END) AS outgoing_quantity,
@ -156,94 +142,86 @@ class OutOfStockReport(models.AbstractModel):
ELSE 0 ELSE 0
END) AS current_stock, END) AS current_stock,
SUM(CASE SUM(CASE
WHEN sld_dest.usage = 'internal' AND sm.state = 'done' WHEN sld_dest.usage = 'internal' AND sm.state = 'done'
THEN sm.product_uom_qty THEN sm.product_uom_qty
ELSE 0 ELSE 0
END) - END) -
SUM(CASE SUM(CASE
WHEN sld_src.usage = 'internal' AND sm.state = 'done' WHEN sld_src.usage = 'internal' AND sm.state = 'done'
THEN sm.product_uom_qty THEN sm.product_uom_qty
ELSE 0 ELSE 0
END)+ END)+
SUM(CASE SUM(CASE
WHEN sld_dest.usage = 'internal' AND sm.state WHEN sld_dest.usage = 'internal' AND sm.state IN ('assigned', 'confirmed', 'waiting')
IN ('assigned', 'confirmed', 'waiting') THEN sm.product_uom_qty THEN sm.product_uom_qty
ELSE 0 ELSE 0
END) - END) -
SUM(CASE SUM(CASE
WHEN sld_src.usage = 'internal' AND sm.state WHEN sld_src.usage = 'internal' AND sm.state IN ('assigned', 'confirmed', 'waiting')
IN ('assigned', 'confirmed', 'waiting') THEN sm.product_uom_qty THEN sm.product_uom_qty
ELSE 0 ELSE 0
END) AS virtual_stock, END) AS virtual_stock,
SUM(CASE WHEN sm.date BETWEEN %s AND %s SUM(CASE WHEN sm.date BETWEEN %s AND %s AND sld_dest.usage = 'customer'
AND sld_dest.usage = 'customer' THEN sm.product_uom_qty ELSE 0 END) AS sales,
THEN sm.product_uom_qty ELSE 0 END) AS sales, ROUND(SUM(CASE
ROUND(SUM(CASE WHEN sm.date BETWEEN %s AND %s AND sld_src.usage = 'internal'
WHEN sm.date BETWEEN %s AND %s AND sld_src.usage = 'internal' AND sm.state = 'done' THEN sm.product_uom_qty
AND sm.state = 'done' THEN sm.product_uom_qty ELSE 0
ELSE 0 END) / ((date %s - date %s)+1), 2) AS ads,
END) / ((date %s - date %s)+1), 2) AS ads, %s AS advance_stock_days
%s AS advance_stock_days FROM stock_move sm
FROM stock_move sm INNER JOIN product_product pp ON pp.id = sm.product_id
INNER JOIN product_product pp ON pp.id = sm.product_id INNER JOIN product_template pt ON pt.id = pp.product_tmpl_id
INNER JOIN product_template pt ON pt.id = pp.product_tmpl_id INNER JOIN res_company company ON company.id = sm.company_id
INNER JOIN res_company company ON company.id = sm.company_id INNER JOIN product_category pc ON pc.id = pt.categ_id
INNER JOIN stock_warehouse sw ON sw.company_id = company.id LEFT JOIN (
INNER JOIN product_category pc ON pc.id = pt.categ_id SELECT sm.id AS move_id, sld.usage, sw.id AS warehouse_id
LEFT JOIN ( FROM stock_location sld
SELECT sm.id AS move_id, usage INNER JOIN stock_move sm ON sld.id = sm.location_dest_id
FROM stock_location sld LEFT JOIN stock_warehouse sw ON sld.warehouse_id = sw.id
INNER JOIN stock_move sm ON sld.id = sm.location_dest_id ) sld_dest ON sm.id = sld_dest.move_id
) sld_dest ON sm.id = sld_dest.move_id LEFT JOIN (
LEFT JOIN ( SELECT sm.id AS move_id, sld.usage, sw.id AS warehouse_id
SELECT sm.id AS move_id, usage FROM stock_location sld
FROM stock_location sld INNER JOIN stock_move sm ON sld.id = sm.location_id
INNER JOIN stock_move sm ON sld.id = sm.location_id LEFT JOIN stock_warehouse sw ON sld.warehouse_id = sw.id
) sld_src ON sm.id = sld_src.move_id ) sld_src ON sm.id = sld_src.move_id
WHERE pp.active = TRUE WHERE pp.active = TRUE
AND pt.active = TRUE AND pt.active = TRUE
AND pt.type = 'product' AND pt.type = 'product'
""" """
params = [ params = [
start_date, end_date, start_date, end_date,
start_date, end_date, start_date, end_date,
end_date, start_date, end_date, start_date,
inventory_for_next_x_days inventory_for_next_x_days
] ]
sub_queries = []
sub_params = []
param_count = 0
if product_ids or category_ids: if product_ids or category_ids:
query += " AND (" query += " AND ("
if product_ids: if product_ids:
product_ids = [product_id for product_id in product_ids] product_ids = [product_id for product_id in product_ids]
query += "pp.id = ANY(%s)" query += "pp.id = ANY(%s)"
params.append(product_ids) params.append(product_ids)
param_count += 1
if product_ids and category_ids: if product_ids and category_ids:
query += " OR " query += " OR "
if category_ids: if category_ids:
category_ids = [category for category in category_ids] category_ids = [category for category in category_ids]
params.append(category_ids) params.append(category_ids)
query += "(pt.categ_id = ANY(%s))" query += "(pt.categ_id = ANY(%s))"
param_count += 1
if product_ids or category_ids: if product_ids or category_ids:
query += ")" query += ")"
if company_ids: if company_ids:
company_ids = [company for company in company_ids] company_ids = [company for company in company_ids]
query += " AND (sm.company_id = ANY(%s))" query += " AND (sm.company_id = ANY(%s))"
sub_params.append(company_ids) params.append(company_ids)
param_count += 1
if warehouse_ids: if warehouse_ids:
warehouse_ids = [warehouse for warehouse in warehouse_ids] warehouse_ids = [warehouse for warehouse in warehouse_ids]
query += " AND (sw.id = ANY(%s))" query += " AND (COALESCE(sw_dest.id, sw_src.id) IN %s)"
sub_params.append(warehouse_ids) params.append(warehouse_ids)
param_count += 1
if sub_queries:
query += " AND " + " AND ".join(sub_queries)
query += """ GROUP BY pp.id, pt.name, pc.id, company.id, sm.product_id, query += """ GROUP BY pp.id, pt.name, pc.id, company.id, sm.product_id,
sw.id) AS sub_query """ COALESCE(sld_dest.warehouse_id, sld_src.warehouse_id)
self.env.cr.execute(query, tuple(params + sub_params)) ) AS sub_query """
self.env.cr.execute(query, tuple(params))
result_data = self.env.cr.dictfetchall() result_data = self.env.cr.dictfetchall()
for data in result_data: for data in result_data:
product_id = data.get('product_id') product_id = data.get('product_id')

0
inventory_advanced_reports/report/out_of_stock_report_views.xml

29
inventory_advanced_reports/report/over_stock_report.py

@ -110,7 +110,7 @@ class OverStockReport(models.AbstractModel):
sm.product_id AS product_id, sm.product_id AS product_id,
pc.id AS category_id, pc.id AS category_id,
pc.complete_name AS category_name, pc.complete_name AS category_name,
sw.id AS warehouse_id, COALESCE(sld_dest.warehouse_id, sld_src.warehouse_id) AS warehouse_id,
SUM(CASE SUM(CASE
WHEN sld_dest.usage = 'internal' AND sm.state WHEN sld_dest.usage = 'internal' AND sm.state
IN ('assigned', 'confirmed', 'waiting') THEN sm.product_uom_qty IN ('assigned', 'confirmed', 'waiting') THEN sm.product_uom_qty
@ -164,17 +164,18 @@ class OverStockReport(models.AbstractModel):
INNER JOIN product_product pp ON pp.id = sm.product_id INNER JOIN product_product pp ON pp.id = sm.product_id
INNER JOIN product_template pt ON pt.id = pp.product_tmpl_id INNER JOIN product_template pt ON pt.id = pp.product_tmpl_id
INNER JOIN res_company company ON company.id = sm.company_id INNER JOIN res_company company ON company.id = sm.company_id
INNER JOIN stock_warehouse sw ON sw.company_id = company.id
INNER JOIN product_category pc ON pc.id = pt.categ_id INNER JOIN product_category pc ON pc.id = pt.categ_id
LEFT JOIN ( LEFT JOIN (
SELECT sm.id AS move_id, usage SELECT sm.id AS move_id, sld.usage, sw.id AS warehouse_id
FROM stock_location sld FROM stock_location sld
INNER JOIN stock_move sm ON sld.id = sm.location_dest_id INNER JOIN stock_move sm ON sld.id = sm.location_dest_id
LEFT JOIN stock_warehouse sw ON sld.warehouse_id = sw.id
) sld_dest ON sm.id = sld_dest.move_id ) sld_dest ON sm.id = sld_dest.move_id
LEFT JOIN ( LEFT JOIN (
SELECT sm.id AS move_id, usage SELECT sm.id AS move_id, sld.usage, sw.id AS warehouse_id
FROM stock_location sld FROM stock_location sld
INNER JOIN stock_move sm ON sld.id = sm.location_id INNER JOIN stock_move sm ON sld.id = sm.location_id
LEFT JOIN stock_warehouse sw ON sld.warehouse_id = sw.id
) sld_src ON sm.id = sld_src.move_id ) sld_src ON sm.id = sld_src.move_id
WHERE pp.active = TRUE WHERE pp.active = TRUE
AND pt.active = TRUE AND pt.active = TRUE
@ -186,40 +187,32 @@ class OverStockReport(models.AbstractModel):
end_date, start_date, end_date, start_date,
inventory_for_next_x_days inventory_for_next_x_days
] ]
sub_queries = []
sub_params = []
param_count = 0
if product_ids or category_ids: if product_ids or category_ids:
query += " AND (" query += " AND ("
if product_ids: if product_ids:
product_ids = [product_id for product_id in product_ids] product_ids = [product_id for product_id in product_ids]
query += "pp.id = ANY(%s)" query += "pp.id = ANY(%s)"
params.append(product_ids) params.append(product_ids)
param_count += 1
if product_ids and category_ids: if product_ids and category_ids:
query += " OR " query += " OR "
if category_ids: if category_ids:
category_ids = [category for category in category_ids] category_ids = [category for category in category_ids]
params.append(category_ids) params.append(category_ids)
query += "(pt.categ_id = ANY(%s))" query += "(pt.categ_id = ANY(%s))"
param_count += 1
if product_ids or category_ids: if product_ids or category_ids:
query += ")" query += ")"
if company_ids: if company_ids:
company_ids = [company for company in company_ids] company_ids = [company for company in company_ids]
query += " AND (sm.company_id = ANY(%s))" query += " AND (sm.company_id = ANY(%s))"
sub_params.append(company_ids) params.append(company_ids)
param_count += 1
if warehouse_ids: if warehouse_ids:
warehouse_ids = [warehouse for warehouse in warehouse_ids] warehouse_ids = [warehouse for warehouse in warehouse_ids]
query += " AND (sw.id = ANY(%s))" query += " AND (COALESCE(sld_dest.warehouse_id, sld_src.warehouse_id) = ANY(%s))"
sub_params.append(warehouse_ids) params.append(warehouse_ids)
param_count += 1
if sub_queries:
query += " AND " + " AND ".join(sub_queries)
query += """ GROUP BY pp.id, pt.name, pc.id, company.id, sm.product_id, query += """ GROUP BY pp.id, pt.name, pc.id, company.id, sm.product_id,
sw.id) AS sub_query """ COALESCE(sld_dest.warehouse_id, sld_src.warehouse_id)
self.env.cr.execute(query, tuple(params + sub_params)) ) AS sub_query """
self.env.cr.execute(query, tuple(params))
result_data = self.env.cr.dictfetchall() result_data = self.env.cr.dictfetchall()
for data in result_data: for data in result_data:
product_id = data.get('product_id') product_id = data.get('product_id')

0
inventory_advanced_reports/report/over_stock_report_views.xml

25
inventory_advanced_reports/report/stock_movement_report.py

@ -144,18 +144,12 @@ class StockMovementReport(models.AbstractModel):
AND %s AND sld_src.usage = 'transit' AND %s AND sld_src.usage = 'transit'
THEN sm.product_uom_qty ELSE 0 END) AS transit_out THEN sm.product_uom_qty ELSE 0 END) AS transit_out
""" """
params = [start_date, start_date, end_date, end_date, start_date, params = [start_date, start_date, end_date, end_date] + [start_date, end_date] * 12
end_date, start_date, end_date, start_date, end_date,
start_date, end_date, start_date, end_date, start_date,
end_date, start_date, end_date, start_date, end_date,
start_date, end_date, start_date, end_date, start_date,
end_date, start_date, end_date]
query += """ query += """
FROM stock_move sm FROM stock_move sm
INNER JOIN product_product pp ON pp.id = sm.product_id INNER JOIN product_product pp ON pp.id = sm.product_id
INNER JOIN product_template pt ON pt.id = pp.product_tmpl_id INNER JOIN product_template pt ON pt.id = pp.product_tmpl_id
INNER JOIN res_company company ON company.id = sm.company_id INNER JOIN res_company company ON company.id = sm.company_id
INNER JOIN stock_warehouse sw ON sw.company_id = company.id
INNER JOIN product_category pc ON pc.id = pt.categ_id INNER JOIN product_category pc ON pc.id = pt.categ_id
""" """
query += """ query += """
@ -163,31 +157,32 @@ class StockMovementReport(models.AbstractModel):
ON sm.location_dest_id = sld_dest.id ON sm.location_dest_id = sld_dest.id
LEFT JOIN stock_location sld_src LEFT JOIN stock_location sld_src
ON sm.location_id = sld_src.id ON sm.location_id = sld_src.id
LEFT JOIN
stock_warehouse sw_dest ON sld_dest.warehouse_id = sw_dest.id
LEFT JOIN
stock_warehouse sw_src ON sld_src.warehouse_id = sw_src.id
WHERE WHERE
sm.state = 'done' sm.state = 'done'
""" """
sub_queries = []
if product_ids: if product_ids:
product_ids = [product_id for product_id in product_ids] product_ids = [product_id for product_id in product_ids]
sub_queries.append("pp.id = ANY(%s)") query += " AND pp.id = ANY(%s)"
params.append(product_ids) params.append(product_ids)
if category_ids: if category_ids:
category_ids = [category for category in category_ids] category_ids = [category for category in category_ids]
sub_queries.append("pt.categ_id = ANY(%s)") query += " AND (pt.categ_id = ANY(%s))"
params.append(category_ids) params.append(category_ids)
if sub_queries:
query += " AND (" + " OR ".join(sub_queries) + ")"
if company_ids: if company_ids:
company_ids = [company for company in company_ids] company_ids = [company for company in company_ids]
query += " AND sm.company_id = ANY(%s)" query += " AND sm.company_id = ANY(%s)"
params.append(company_ids) params.append(company_ids)
if warehouse_ids: if warehouse_ids:
warehouse_ids = [warehouse for warehouse in warehouse_ids] warehouse_ids = [warehouse for warehouse in warehouse_ids]
query += " AND sw.id = ANY(%s)" query += " AND (COALESCE(sw_dest.id, sw_src.id) = ANY(%s))"
params.append(warehouse_ids) params.append(warehouse_ids)
query += """ query += """
GROUP BY pp.id,pt.name,pc.complete_name,company.name GROUP BY pp.id, pt.name, pc.complete_name, company.name
""" """
self.env.cr.execute(query, params) self.env.cr.execute(query, params)
result_data = self.env.cr.dictfetchall() result_data = self.env.cr.dictfetchall()
if result_data: if result_data:

0
inventory_advanced_reports/report/stock_movement_report_views.xml

0
inventory_advanced_reports/report/xyz_report.py

0
inventory_advanced_reports/report/xyz_report_views.xml

0
inventory_advanced_reports/security/ir.model.access.csv

0
inventory_advanced_reports/static/description/assets/icons/check.png

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

0
inventory_advanced_reports/static/description/assets/icons/chevron.png

Before

Width:  |  Height:  |  Size: 310 B

After

Width:  |  Height:  |  Size: 310 B

0
inventory_advanced_reports/static/description/assets/icons/cogs.png

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

0
inventory_advanced_reports/static/description/assets/icons/consultation.png

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

0
inventory_advanced_reports/static/description/assets/icons/ecom-black.png

Before

Width:  |  Height:  |  Size: 576 B

After

Width:  |  Height:  |  Size: 576 B

0
inventory_advanced_reports/static/description/assets/icons/education-black.png

Before

Width:  |  Height:  |  Size: 733 B

After

Width:  |  Height:  |  Size: 733 B

0
inventory_advanced_reports/static/description/assets/icons/hotel-black.png

Before

Width:  |  Height:  |  Size: 911 B

After

Width:  |  Height:  |  Size: 911 B

0
inventory_advanced_reports/static/description/assets/icons/license.png

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
inventory_advanced_reports/static/description/assets/icons/lifebuoy.png

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
inventory_advanced_reports/static/description/assets/icons/manufacturing-black.png

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

0
inventory_advanced_reports/static/description/assets/icons/pos-black.png

Before

Width:  |  Height:  |  Size: 878 B

After

Width:  |  Height:  |  Size: 878 B

0
inventory_advanced_reports/static/description/assets/icons/puzzle.png

Before

Width:  |  Height:  |  Size: 653 B

After

Width:  |  Height:  |  Size: 653 B

0
inventory_advanced_reports/static/description/assets/icons/restaurant-black.png

Before

Width:  |  Height:  |  Size: 905 B

After

Width:  |  Height:  |  Size: 905 B

0
inventory_advanced_reports/static/description/assets/icons/service-black.png

Before

Width:  |  Height:  |  Size: 839 B

After

Width:  |  Height:  |  Size: 839 B

0
inventory_advanced_reports/static/description/assets/icons/trading-black.png

Before

Width:  |  Height:  |  Size: 427 B

After

Width:  |  Height:  |  Size: 427 B

0
inventory_advanced_reports/static/description/assets/icons/training.png

Before

Width:  |  Height:  |  Size: 627 B

After

Width:  |  Height:  |  Size: 627 B

0
inventory_advanced_reports/static/description/assets/icons/update.png

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
inventory_advanced_reports/static/description/assets/icons/user.png

Before

Width:  |  Height:  |  Size: 988 B

After

Width:  |  Height:  |  Size: 988 B

0
inventory_advanced_reports/static/description/assets/icons/wrench.png

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
inventory_advanced_reports/static/description/assets/misc/categories.png

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
inventory_advanced_reports/static/description/assets/misc/check-box.png

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
inventory_advanced_reports/static/description/assets/misc/compass.png

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

0
inventory_advanced_reports/static/description/assets/misc/corporate.png

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
inventory_advanced_reports/static/description/assets/misc/customer-support.png

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

0
inventory_advanced_reports/static/description/assets/misc/cybrosys-logo.png

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

0
inventory_advanced_reports/static/description/assets/misc/features.png

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 589 B

0
inventory_advanced_reports/static/description/assets/misc/logo.png

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

0
inventory_advanced_reports/static/description/assets/misc/pictures.png

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

0
inventory_advanced_reports/static/description/assets/misc/pie-chart.png

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

0
inventory_advanced_reports/static/description/assets/misc/reports-icon.png

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
inventory_advanced_reports/static/description/assets/misc/right-arrow.png

Before

Width:  |  Height:  |  Size: 967 B

After

Width:  |  Height:  |  Size: 967 B

0
inventory_advanced_reports/static/description/assets/misc/star.png

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

0
inventory_advanced_reports/static/description/assets/misc/support.png

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

0
inventory_advanced_reports/static/description/assets/misc/whatsapp.png

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

0
inventory_advanced_reports/static/description/assets/modules/1.png

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

0
inventory_advanced_reports/static/description/assets/modules/2.png

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

0
inventory_advanced_reports/static/description/assets/modules/3.png

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

0
inventory_advanced_reports/static/description/assets/modules/4.png

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

0
inventory_advanced_reports/static/description/assets/modules/5.png

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

0
inventory_advanced_reports/static/description/assets/modules/6.png

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 1.png

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 2.png

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 3.png

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 4.png

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGE BREAKDOWN 5.png

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 0.png

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 1.png

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 2.png

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 3.png

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 4.png

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 5.png

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 6.png

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 7.png

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/AGING 8.png

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 1.png

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 10.png

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 2.png

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 3.png

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 4.png

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 5.png

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 6.png

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 7.png

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 8.png

Before

Width:  |  Height:  |  Size: 284 KiB

After

Width:  |  Height:  |  Size: 284 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN 9.png

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 1.png

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 2.png

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 3.png

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 4.png

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 5.png

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 6.png

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 7.png

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 8.png

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/FSN XYZ 9.png

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 1.png

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 2.png

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 3.png

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

0
inventory_advanced_reports/static/description/assets/screenshots/OUT OF STOCK 4.png

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save