diff --git a/setup/stock_picking_report_summary/odoo/addons/stock_picking_report_summary b/setup/stock_picking_report_summary/odoo/addons/stock_picking_report_summary new file mode 120000 index 0000000..f33ae5b --- /dev/null +++ b/setup/stock_picking_report_summary/odoo/addons/stock_picking_report_summary @@ -0,0 +1 @@ +../../../../stock_picking_report_summary \ No newline at end of file diff --git a/setup/stock_picking_report_summary/setup.py b/setup/stock_picking_report_summary/setup.py new file mode 100644 index 0000000..28c57bb --- /dev/null +++ b/setup/stock_picking_report_summary/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_picking_report_summary/__manifest__.py b/stock_picking_report_summary/__manifest__.py index 2a3d7d8..794438a 100644 --- a/stock_picking_report_summary/__manifest__.py +++ b/stock_picking_report_summary/__manifest__.py @@ -6,8 +6,7 @@ "name": "Stock Picking Report Summary", "summary": "Stock Picking Report Summary", "version": "12.0.1.1.0", - "author": "Grap, " - "Odoo Community Association (OCA)", + "author": "Grap, " "Odoo Community Association (OCA)", "maintainers": ["quentinDupont", "legalsylvain"], "website": "https://github.com/OCA/stock-logistics-reporting", "category": "Warehouse Management", @@ -15,12 +14,12 @@ "depends": [ "stock", ], - 'data': [ - 'reports/report_paperformat.xml', - 'reports/report_print_picking_summary.xml', - 'reports/report_print_picking_summary_template.xml', - 'views/view_picking_summary_wizard.xml', - 'views/action.xml', + "data": [ + "reports/report_paperformat.xml", + "reports/report_print_picking_summary.xml", + "reports/report_print_picking_summary_template.xml", + "views/view_picking_summary_wizard.xml", + "views/action.xml", ], "installable": True, } diff --git a/stock_picking_report_summary/models/picking_summary_wizard.py b/stock_picking_report_summary/models/picking_summary_wizard.py index ba480c8..0dafd38 100644 --- a/stock_picking_report_summary/models/picking_summary_wizard.py +++ b/stock_picking_report_summary/models/picking_summary_wizard.py @@ -3,87 +3,104 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import api, fields, models + from odoo.addons import decimal_precision as dp class PickingSummaryWizard(models.TransientModel): - _name = 'picking.summary.wizard' - _description = 'Picking Summary Wizard' + _name = "picking.summary.wizard" + _description = "Picking Summary Wizard" # Columns Section - print_summary = fields.Boolean( - string='Print Summary', default=True) + print_summary = fields.Boolean(string="Print Summary", default=True) - print_detail = fields.Boolean( - string='Print Detail', default=True) + print_detail = fields.Boolean(string="Print Detail", default=True) print_unity_in_list = fields.Boolean( - string='Print Unit in Pickings List', default=True) + string="Print Unit in Pickings List", default=True + ) - print_prices = fields.Boolean( - string='Print Standard Prices', default=False) + print_prices = fields.Boolean(string="Print Standard Prices", default=False) product_line_ids = fields.One2many( - comodel_name='picking.summary.wizard.product', - inverse_name='wizard_id', - default=lambda self: self._default_product_line_ids()) + comodel_name="picking.summary.wizard.product", + inverse_name="wizard_id", + default=lambda self: self._default_product_line_ids(), + ) standard_price_total = fields.Float( - compute='_compute_standard_price_total', - digits=dp.get_precision('Product Price')) + compute="_compute_standard_price_total", + digits=dp.get_precision("Product Price"), + ) picking_line_ids = fields.One2many( - comodel_name='picking.summary.wizard.picking', - inverse_name='wizard_id', - default=lambda self: self._default_picking_line_ids()) + comodel_name="picking.summary.wizard.picking", + inverse_name="wizard_id", + default=lambda self: self._default_picking_line_ids(), + ) picking_line_qty = fields.Integer( - string='Number of Selected Picking', readonly=True, - default=lambda self: self._default_picking_line_qty()) + string="Number of Selected Picking", + readonly=True, + default=lambda self: self._default_picking_line_qty(), + ) # Default Section def _default_picking_line_qty(self): - return len(self._context.get('active_ids', [])) + return len(self._context.get("active_ids", [])) def _default_picking_line_ids(self): - picking_obj = self.env['stock.picking'] + picking_obj = self.env["stock.picking"] res = [] - picking_ids = self._context.get('active_ids', []) + picking_ids = self._context.get("active_ids", []) for picking in picking_obj.browse(picking_ids): - res.append((0, 0, { - 'picking_id': picking.id, - })) + res.append( + ( + 0, + 0, + { + "picking_id": picking.id, + }, + ) + ) return res def _default_product_line_ids(self): - picking_obj = self.env['stock.picking'] + picking_obj = self.env["stock.picking"] res = [] product_lines = {} - picking_ids = self.env.context.get('active_ids', []) + picking_ids = self.env.context.get("active_ids", []) # move.product_qty is real quantity with referent uom for picking in picking_obj.browse(picking_ids): for move in picking.move_lines: if move.product_id.id not in product_lines.keys(): product_lines[move.product_id.id] = { - 'name': move.product_id.name, - 'categ': move.product_id.categ_id.name.capitalize(), - 'qty': move.product_qty + "name": move.product_id.name, + "categ": move.product_id.categ_id.name.capitalize(), + "qty": move.product_qty, } else: - old_qty = product_lines[move.product_id.id]['qty'] + old_qty = product_lines[move.product_id.id]["qty"] product_lines[move.product_id.id] = { - 'name': move.product_id.name, - 'categ': move.product_id.categ_id.name.capitalize(), - 'qty': old_qty + move.product_qty + "name": move.product_id.name, + "categ": move.product_id.categ_id.name.capitalize(), + "qty": old_qty + move.product_qty, } # Arranged in alphabetical order for category then product name product_lines_sorted = sorted( - product_lines.items(), key=lambda x: (x[1]['categ'], x[1]['name'])) + product_lines.items(), key=lambda x: (x[1]["categ"], x[1]["name"]) + ) for product_id, name_qty in product_lines_sorted: - res.append((0, 0, { - 'product_id': product_id, - 'quantity_total': name_qty['qty'], - })) + res.append( + ( + 0, + 0, + { + "product_id": product_id, + "quantity_total": name_qty["qty"], + }, + ) + ) return res # Compute Section @@ -91,4 +108,5 @@ class PickingSummaryWizard(models.TransientModel): def _compute_standard_price_total(self): self.ensure_one() self.standard_price_total = sum( - self.mapped('product_line_ids.standard_price_total')) + self.mapped("product_line_ids.standard_price_total") + ) diff --git a/stock_picking_report_summary/models/picking_summary_wizard_picking.py b/stock_picking_report_summary/models/picking_summary_wizard_picking.py index d0231b8..4e18cbe 100644 --- a/stock_picking_report_summary/models/picking_summary_wizard_picking.py +++ b/stock_picking_report_summary/models/picking_summary_wizard_picking.py @@ -6,9 +6,9 @@ from openerp import fields, models class PickingSummaryWizardPicking(models.TransientModel): - _name = 'picking.summary.wizard.picking' - _description = 'Picking Summary Wizard Picking' + _name = "picking.summary.wizard.picking" + _description = "Picking Summary Wizard Picking" - wizard_id = fields.Many2one(comodel_name='picking.summary.wizard') + wizard_id = fields.Many2one(comodel_name="picking.summary.wizard") - picking_id = fields.Many2one(comodel_name='stock.picking') + picking_id = fields.Many2one(comodel_name="stock.picking") diff --git a/stock_picking_report_summary/models/picking_summary_wizard_product.py b/stock_picking_report_summary/models/picking_summary_wizard_product.py index db38042..ba2741e 100644 --- a/stock_picking_report_summary/models/picking_summary_wizard_product.py +++ b/stock_picking_report_summary/models/picking_summary_wizard_product.py @@ -3,29 +3,32 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import api, fields, models + from odoo.addons import decimal_precision as dp class PickingSummaryWizardProduct(models.TransientModel): - _name = 'picking.summary.wizard.product' - _description = 'Picking Summary Wizard Product' + _name = "picking.summary.wizard.product" + _description = "Picking Summary Wizard Product" - wizard_id = fields.Many2one(comodel_name='picking.summary.wizard') + wizard_id = fields.Many2one(comodel_name="picking.summary.wizard") - product_id = fields.Many2one(comodel_name='product.product') + product_id = fields.Many2one(comodel_name="product.product") quantity_total = fields.Float() standard_price = fields.Float( - related='product_id.standard_price', - digits=dp.get_precision('Product Price')) + related="product_id.standard_price", digits=dp.get_precision("Product Price") + ) standard_price_total = fields.Float( - compute='_compute_standard_price_total', - digits=dp.get_precision('Product Price')) + compute="_compute_standard_price_total", + digits=dp.get_precision("Product Price"), + ) @api.multi def _compute_standard_price_total(self): for line in self: - line.standard_price_total =\ + line.standard_price_total = ( line.product_id.standard_price * line.quantity_total + ) diff --git a/stock_picking_report_summary/reports/report_paperformat.xml b/stock_picking_report_summary/reports/report_paperformat.xml index 1687a82..eb38092 100644 --- a/stock_picking_report_summary/reports/report_paperformat.xml +++ b/stock_picking_report_summary/reports/report_paperformat.xml @@ -1,4 +1,4 @@ - +

@@ -28,26 +31,51 @@ Category Quantity Unity - Standard Unit Price - Total price + Standard Unit Price + Total price - + - - + + - + - + - - + + - - + + @@ -56,7 +84,9 @@ Standard Price Total - + @@ -71,26 +101,47 @@ Product Quantity - Unity + Unity - + - - + - - + - + - + - + - - + + @@ -98,7 +149,9 @@ - + diff --git a/stock_picking_report_summary/views/action.xml b/stock_picking_report_summary/views/action.xml index ac0d83f..1f15c7a 100644 --- a/stock_picking_report_summary/views/action.xml +++ b/stock_picking_report_summary/views/action.xml @@ -1,4 +1,4 @@ - +