Initial commit: OCA Mrp packages (117 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:05 +02:00
commit 277e84fd7a
4403 changed files with 395154 additions and 0 deletions

View file

@ -0,0 +1,45 @@
# Export Flattened BOM to Excel
Odoo addon: mrp_flattened_bom_xlsx
## Installation
```bash
pip install odoo-bringout-oca-manufacture-reporting-mrp_flattened_bom_xlsx
```
## Dependencies
This addon depends on:
- report_xlsx
- mrp
## Manifest Information
- **Name**: Export Flattened BOM to Excel
- **Version**: 16.0.1.1.0
- **Category**: Manufacturing
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/manufacture-reporting](https://github.com/OCA/manufacture-reporting) branch 16.0, addon `mrp_flattened_bom_xlsx`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Mrp_flattened_bom_xlsx Module - mrp_flattened_bom_xlsx
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for mrp_flattened_bom_xlsx. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,6 @@
# Dependencies
This addon depends on:
- [report_xlsx](../../odoo-bringout-oca-reporting-engine-report_xlsx)
- [mrp](../../odoo-bringout-oca-ocb-mrp)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon mrp_flattened_bom_xlsx or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-manufacture-reporting-mrp_flattened_bom_xlsx"
# or
uv pip install odoo-bringout-oca-manufacture-reporting-mrp_flattened_bom_xlsx"
```

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in mrp_flattened_bom_xlsx.
```mermaid
classDiagram
class mrp_bom
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: mrp_flattened_bom_xlsx. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon mrp_flattened_bom_xlsx
- License: LGPL-3

View file

@ -0,0 +1,27 @@
# Reports
Report definitions and templates in mrp_flattened_bom_xlsx.
```mermaid
classDiagram
class FlattenedBomXlsx
AbstractModel <|-- FlattenedBomXlsx
```
## Available Reports
### PDF/Document Reports
- **Export Flattened BOM Structure to Excel** (PDF/Print)
## Report Files
- **flattened_bom_xlsx.py** (Python logic)
- **flattened_bom_xlsx.xml** (XML template/definition)
- **__init__.py** (Python logic)
## Notes
- Named reports above are accessible through Odoo's reporting menu
- Python files define report logic and data processing
- XML files contain report templates, definitions, and formatting
- Reports are integrated with Odoo's printing and email systems

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon mrp_flattened_bom_xlsx
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,102 @@
=============================
Export Flattened BOM to Excel
=============================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e3a7d5db6265565365e57b3768193d8e83a07733a2d3acbc4bc08b3f6d392c84
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture--reporting-lightgray.png?logo=github
:target: https://github.com/OCA/manufacture-reporting/tree/16.0/mrp_flattened_bom_xlsx
:alt: OCA/manufacture-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/manufacture-reporting-16-0/manufacture-reporting-16-0-mrp_flattened_bom_xlsx
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/manufacture-reporting&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of the MRP capabilities of Odoo,
and allows you to export the flattened BOM to MS Excel .XLSX format.
A flattened bill of material removes the intermediate levels in the BOM
and connect the lowest levels directly to the highest level.
A list of the sum of lowest levels will be shown for every
BoM you export using this method.
It also maintains units correctly across all nested BOM's and take units
that have been defined in product Unit of Measure field.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to:
#. Go to 'Manufacturing / Products / Bill of Materials'
#. Select a BOM or more BOMS
*(Could be interesting to modify quantities of these BOMs)*
#. Go to 'Print / Export Flattened BOM to Excel'.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/manufacture-reporting/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/manufacture-reporting/issues/new?body=module:%20mrp_flattened_bom_xlsx%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* ForgeFlow
Contributors
~~~~~~~~~~~~
* Héctor Villarreal <hector.villarreal@forgeflow.com>
* Lois Rilo <lois.rilo@forgeflow.com>
* Joan Mateu <joan.mateu@forgeflow.com>
* Dhara Solanki <dhara.solanki@initos.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/manufacture-reporting <https://github.com/OCA/manufacture-reporting/tree/16.0/mrp_flattened_bom_xlsx>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
from . import models
from . import report

View file

@ -0,0 +1,15 @@
# Copyright 2018 ForgeFlow S.L.
# (http://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Export Flattened BOM to Excel",
"version": "16.0.1.1.0",
"category": "Manufacturing",
"author": "ForgeFlow, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/manufacture-reporting",
"license": "AGPL-3",
"depends": ["report_xlsx", "mrp"],
"data": ["report/flattened_bom_xlsx.xml"],
"installable": True,
}

View file

@ -0,0 +1,78 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_flattened_bom_xlsx
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \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: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "BOM Name"
msgstr "Naziv sastavnice"
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_mrp_bom
msgid "Bill of Material"
msgstr "Sastavnica"
#. module: mrp_flattened_bom_xlsx
#: model:ir.actions.report,name:mrp_flattened_bom_xlsx.flattened_bom_xlsx
msgid "Export Flattened BOM Structure to Excel"
msgstr "Izvezi strukturu spološtene sastavnice u Excel"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Flattened BOM"
msgstr "Sploštena sastavnica"
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_report_mrp_flattened_bom_xlsx_flattened_bom_xlsx
msgid "Flattened BOM XLSX"
msgstr "XLSX spološtena sastavnica"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Name"
msgstr "Naziv artikla"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Reference"
msgstr "Referenca proizvoda"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Quantity"
msgstr "Količina"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Reference"
msgstr "Referenca"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Unit of Measure"
msgstr "Jedinica mjere"

View file

@ -0,0 +1,81 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_flattened_bom_xlsx
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-27 13:06+0000\n"
"Last-Translator: Quentin Dupont <perso@quentindupont.fr>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.6.2\n"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "BOM Name"
msgstr "Nom de la Nomenclature"
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_mrp_bom
msgid "Bill of Material"
msgstr "Nomenclature"
#. module: mrp_flattened_bom_xlsx
#: model:ir.actions.report,name:mrp_flattened_bom_xlsx.flattened_bom_xlsx
msgid "Export Flattened BOM Structure to Excel"
msgstr "Export récursif de la Nomenclature format Excel"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Flattened BOM"
msgstr "Nomenclature récursive"
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_report_mrp_flattened_bom_xlsx_flattened_bom_xlsx
msgid "Flattened BOM XLSX"
msgstr "Nomenclature récursive XLSX"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Name"
msgstr "Nom du Produit"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Reference"
msgstr "Référence du Produit"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Quantity"
msgstr "Quantité"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Reference"
msgstr "Référence"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Unit of Measure"
msgstr "Unité de mesure"

View file

@ -0,0 +1,81 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_flattened_bom_xlsx
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-30 07:37+0000\n"
"PO-Revision-Date: 2023-05-30 07:37+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "BOM Name"
msgstr "Nome DiBa"
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_mrp_bom
msgid "Bill of Material"
msgstr "Distinta base"
#. module: mrp_flattened_bom_xlsx
#: model:ir.actions.report,name:mrp_flattened_bom_xlsx.flattened_bom_xlsx
msgid "Export Flattened BOM Structure to Excel"
msgstr "Esporta distinata base tecnica in Excel"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Flattened BOM"
msgstr "Distinta base tecnica"
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_report_mrp_flattened_bom_xlsx_flattened_bom_xlsx
msgid "Flattened BOM XLSX"
msgstr "XLSX distinta base tecnica"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Name"
msgstr "Nome prodotto"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Reference"
msgstr "Riferimento prodotto"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Quantity"
msgstr "Quantità"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Reference"
msgstr "Riferimento"
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Unit of Measure"
msgstr "Unità di misura"

View file

@ -0,0 +1,78 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_flattened_bom_xlsx
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \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: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "BOM Name"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_mrp_bom
msgid "Bill of Material"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#: model:ir.actions.report,name:mrp_flattened_bom_xlsx.flattened_bom_xlsx
msgid "Export Flattened BOM Structure to Excel"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Flattened BOM"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#: model:ir.model,name:mrp_flattened_bom_xlsx.model_report_mrp_flattened_bom_xlsx_flattened_bom_xlsx
msgid "Flattened BOM XLSX"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Name"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Product Reference"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Quantity"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Reference"
msgstr ""
#. module: mrp_flattened_bom_xlsx
#. odoo-python
#: code:addons/mrp_flattened_bom_xlsx/report/flattened_bom_xlsx.py:0
#, python-format
msgid "Unit of Measure"
msgstr ""

View file

@ -0,0 +1,46 @@
# Copyright 2018 ForgeFlow S.L.
# (http://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import models
class MrpBom(models.Model):
"""Defines bills of material for a product or a product template"""
_inherit = "mrp.bom"
def _get_flattened_totals(self, factor=1, totals=None):
"""Calculate the **unitary** product requirements of flattened BOM.
*Unit* means that the requirements are computed for one unit of the
default UoM of the product.
:returns: dict: keys are components and values are aggregated quantity
in the product default UoM.
"""
self.ensure_one()
if totals is None:
totals = {}
factor /= self.product_uom_id._compute_quantity(
self.product_qty, self.product_tmpl_id.uom_id, round=False
)
for line in self.bom_line_ids:
sub_bom = self.env["mrp.bom"]._bom_find(line.product_id)[line.product_id]
if sub_bom:
new_factor = factor * line.product_uom_id._compute_quantity(
line.product_qty, line.product_id.uom_id, round=False
)
sub_bom._get_flattened_totals(new_factor, totals)
else:
if totals.get(line.product_id):
totals[
line.product_id
] += factor * line.product_uom_id._compute_quantity(
line.product_qty, line.product_id.uom_id, round=False
)
else:
totals[
line.product_id
] = factor * line.product_uom_id._compute_quantity(
line.product_qty, line.product_id.uom_id, round=False
)
return totals

View file

@ -0,0 +1,4 @@
* Héctor Villarreal <hector.villarreal@forgeflow.com>
* Lois Rilo <lois.rilo@forgeflow.com>
* Joan Mateu <joan.mateu@forgeflow.com>
* Dhara Solanki <dhara.solanki@initos.com>

View file

@ -0,0 +1,11 @@
This module extends the functionality of the MRP capabilities of Odoo,
and allows you to export the flattened BOM to MS Excel .XLSX format.
A flattened bill of material removes the intermediate levels in the BOM
and connect the lowest levels directly to the highest level.
A list of the sum of lowest levels will be shown for every
BoM you export using this method.
It also maintains units correctly across all nested BOM's and take units
that have been defined in product Unit of Measure field.

View file

@ -0,0 +1,9 @@
To use this module, you need to:
#. Go to 'Manufacturing / Products / Bill of Materials'
#. Select a BOM or more BOMS
*(Could be interesting to modify quantities of these BOMs)*
#. Go to 'Print / Export Flattened BOM to Excel'.

View file

@ -0,0 +1,2 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import flattened_bom_xlsx

View file

@ -0,0 +1,70 @@
# Copyright 2018 ForgeFlow S.L.
# (http://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import logging
from odoo import models
from odoo.tools.translate import _
_logger = logging.getLogger(__name__)
class FlattenedBomXlsx(models.AbstractModel):
_name = "report.mrp_flattened_bom_xlsx.flattened_bom_xlsx"
_inherit = "report.report_xlsx.abstract"
_description = "Flattened BOM XLSX"
def print_flattened_bom_lines(self, bom, requirements, sheet, row):
i = row
sheet.write(i, 0, bom.product_tmpl_id.name or "")
sheet.write(i, 1, bom.code or "")
sheet.write(i, 2, bom.display_name or "")
sheet.write(i, 3, bom.product_qty)
sheet.write(i, 4, bom.product_uom_id.name or "")
sheet.write(i, 5, bom.code or "")
i += 1
for product, total_qty in requirements.items():
sheet.write(i, 1, product.default_code or "")
sheet.write(i, 2, product.display_name or "")
sheet.write(i, 3, total_qty or 0.0)
sheet.write(i, 4, product.uom_id.name or "")
sheet.write(i, 5, product.code or "")
i += 1
return i
def generate_xlsx_report(self, workbook, data, objects):
workbook.set_properties(
{"comments": "Created with Python and XlsxWriter from Odoo 11.0"}
)
sheet = workbook.add_worksheet(_("Flattened BOM"))
sheet.set_landscape()
sheet.fit_to_pages(1, 0)
sheet.set_zoom(80)
sheet.set_column(0, 0, 40)
sheet.set_column(1, 2, 20)
sheet.set_column(3, 3, 40)
sheet.set_column(4, 6, 20)
title_style = workbook.add_format(
{"bold": True, "bg_color": "#FFFFCC", "bottom": 1}
)
sheet_title = [
_("BOM Name"),
_("Product Reference"),
_("Product Name"),
_("Quantity"),
_("Unit of Measure"),
_("Reference"),
]
sheet.set_row(0, None, None, {"collapsed": 1})
sheet.write_row(1, 0, sheet_title, title_style)
sheet.freeze_panes(2, 0)
i = 2
for o in objects:
# We need to calculate the totals for the BoM qty and UoM:
starting_factor = o.product_uom_id._compute_quantity(
o.product_qty, o.product_tmpl_id.uom_id, round=False
)
totals = o._get_flattened_totals(factor=starting_factor)
i = self.print_flattened_bom_lines(o, totals, sheet, i)

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2018 ForgeFlow S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="flattened_bom_xlsx" model="ir.actions.report">
<field name="name">Export Flattened BOM Structure to Excel</field>
<field name="model">mrp.bom</field>
<field name="report_type">xlsx</field>
<field name="report_name">mrp_flattened_bom_xlsx.flattened_bom_xlsx</field>
<field name="report_file">mrp_bom</field>
<field name="binding_model_id" ref="mrp.model_mrp_bom" />
<field name="binding_type">report</field>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,444 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Export Flattened BOM to Excel</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="export-flattened-bom-to-excel">
<h1 class="title">Export Flattened BOM to Excel</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e3a7d5db6265565365e57b3768193d8e83a07733a2d3acbc4bc08b3f6d392c84
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/manufacture-reporting/tree/16.0/mrp_flattened_bom_xlsx"><img alt="OCA/manufacture-reporting" src="https://img.shields.io/badge/github-OCA%2Fmanufacture--reporting-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/manufacture-reporting-16-0/manufacture-reporting-16-0-mrp_flattened_bom_xlsx"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/manufacture-reporting&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module extends the functionality of the MRP capabilities of Odoo,
and allows you to export the flattened BOM to MS Excel .XLSX format.</p>
<p>A flattened bill of material removes the intermediate levels in the BOM
and connect the lowest levels directly to the highest level.</p>
<p>A list of the sum of lowest levels will be shown for every
BoM you export using this method.</p>
<p>It also maintains units correctly across all nested BOMs and take units
that have been defined in product Unit of Measure field.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>To use this module, you need to:</p>
<ol class="arabic">
<li><p class="first">Go to Manufacturing / Products / Bill of Materials</p>
</li>
<li><p class="first">Select a BOM or more BOMS</p>
<p><em>(Could be interesting to modify quantities of these BOMs)</em></p>
</li>
<li><p class="first">Go to Print / Export Flattened BOM to Excel.</p>
</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/manufacture-reporting/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/manufacture-reporting/issues/new?body=module:%20mrp_flattened_bom_xlsx%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Héctor Villarreal &lt;<a class="reference external" href="mailto:hector.villarreal&#64;forgeflow.com">hector.villarreal&#64;forgeflow.com</a>&gt;</li>
<li>Lois Rilo &lt;<a class="reference external" href="mailto:lois.rilo&#64;forgeflow.com">lois.rilo&#64;forgeflow.com</a>&gt;</li>
<li>Joan Mateu &lt;<a class="reference external" href="mailto:joan.mateu&#64;forgeflow.com">joan.mateu&#64;forgeflow.com</a>&gt;</li>
<li>Dhara Solanki &lt;<a class="reference external" href="mailto:dhara.solanki&#64;initos.com">dhara.solanki&#64;initos.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/manufacture-reporting/tree/16.0/mrp_flattened_bom_xlsx">OCA/manufacture-reporting</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
from . import test_flattened_bom

View file

@ -0,0 +1,115 @@
# Copyright 2018 ForgeFlow S.L.
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase
class TestFlattenedBom(TransactionCase):
@classmethod
def setUpClass(cls):
super(TestFlattenedBom, cls).setUpClass()
cls.product_obj = cls.env["product.product"]
cls.bom_obj = cls.env["mrp.bom"]
cls.bom_line_obj = cls.env["mrp.bom.line"]
cls.uom_dozen = cls.env.ref("uom.product_uom_dozen")
# Create products:
cls.product_top = cls.product_obj.create(
{"name": "Final Product", "type": "product", "standard_price": 300.0}
)
cls.product_sub_1 = cls.product_obj.create(
{"name": "L01-01", "type": "product", "standard_price": 300.0}
)
cls.product_sub_2 = cls.product_obj.create(
{"name": "L01-02", "type": "product", "standard_price": 300.0}
)
cls.component_1 = cls.product_obj.create(
{"name": "RM 01", "type": "product", "standard_price": 100.0}
)
cls.component_2 = cls.product_obj.create(
{"name": "RM 01", "type": "product", "standard_price": 75.0}
)
cls.component_3 = cls.product_obj.create(
{"name": "RM 03", "type": "product", "standard_price": 75.0}
)
# Create Bills of Materials:
cls.bom_top = cls.bom_obj.create(
{"product_tmpl_id": cls.product_top.product_tmpl_id.id}
)
cls.line_top_1 = cls.bom_line_obj.create(
{
"product_id": cls.product_sub_1.id,
"bom_id": cls.bom_top.id,
"product_qty": 2.0,
}
)
cls.line_top_2 = cls.bom_line_obj.create(
{
"product_id": cls.product_sub_2.id,
"bom_id": cls.bom_top.id,
"product_qty": 5.0,
}
)
cls.bom_sub_1 = cls.bom_obj.create(
{"product_tmpl_id": cls.product_sub_1.product_tmpl_id.id}
)
cls.line_sub_1_1 = cls.bom_line_obj.create(
{
"product_id": cls.component_1.id,
"bom_id": cls.bom_sub_1.id,
"product_qty": 2.0,
}
)
cls.line_sub_1_2 = cls.bom_line_obj.create(
{
"product_id": cls.component_2.id,
"bom_id": cls.bom_sub_1.id,
"product_qty": 5.0,
}
)
cls.bom_sub_2 = cls.bom_obj.create(
{"product_tmpl_id": cls.product_sub_2.product_tmpl_id.id}
)
cls.line_sub_2_1 = cls.bom_line_obj.create(
{
"product_id": cls.component_1.id,
"bom_id": cls.bom_sub_2.id,
"product_qty": 3.0,
}
)
cls.line_sub_2_2 = cls.bom_line_obj.create(
{
"product_id": cls.component_3.id,
"bom_id": cls.bom_sub_2.id,
"product_qty": 3.0,
}
)
def test_01_flattened_totals(self):
"""Test totals computation with a multi level BoM."""
flat_tot = self.bom_top._get_flattened_totals()
self.assertEqual(len(flat_tot), 3)
# Component 1 = 2*2 + 5*3 = 19
self.assertEqual(flat_tot.get(self.component_1), 19)
# Component 2 = 2*5 = 10
self.assertEqual(flat_tot.get(self.component_2), 10)
# Component 3 = 5*3 = 15
self.assertEqual(flat_tot.get(self.component_3), 15)
def test_02_different_uom(self):
"""Test totals computation with a multi level BoM and different UoM."""
self.bom_top.product_uom_id = self.uom_dozen
self.line_sub_2_1.product_uom_id = self.uom_dozen
flat_tot = self.bom_top._get_flattened_totals()
self.assertEqual(len(flat_tot), 3)
# Component 1 = 2*2 + 5*3*12 = 184 units -> 184/12 dozens
self.assertAlmostEqual(flat_tot.get(self.component_1), 184 / 12)
# Component 2 = 2*5 = 10 units -> 10/12 dozens
self.assertAlmostEqual(flat_tot.get(self.component_2), 10 / 12)
# Component 3 = 5*3 = 15 units -> 15/12 dozens
self.assertAlmostEqual(flat_tot.get(self.component_3), 15 / 12)

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-manufacture-reporting-mrp_flattened_bom_xlsx"
version = "16.0.0"
description = "Export Flattened BOM to Excel - Odoo addon"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-manufacture-reporting-report_xlsx>=16.0.0",
"odoo-bringout-oca-ocb-mrp>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["mrp_flattened_bom_xlsx"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]