From 9aac933dcb8f1c7bef3caf5c03b1fbee8412c96d Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 26 Oct 2022 21:09:52 +0200 Subject: [PATCH] Initialize v16 branch --- .../__init__.py | 1 - .../__manifest__.py | 23 -- .../models/__init__.py | 2 - .../models/account_fiscal_position.py | 21 -- .../models/res_partner.py | 25 -- .../views/account_fiscal_position_view.xml | 23 -- account_invoice_update_wizard/__manifest__.py | 2 +- .../__manifest__.py | 2 +- account_menu_usability/__manifest__.py | 2 +- account_move_label_copy/__manifest__.py | 2 +- account_usability/__manifest__.py | 2 +- base_company_extension/__manifest__.py | 2 +- base_dynamic_list/__manifest__.py | 2 +- base_mail_sender_bcc/__manifest__.py | 2 +- base_partner_one2many_phone/__manifest__.py | 2 +- base_partner_ref/__manifest__.py | 2 +- base_usability/__manifest__.py | 2 +- crm_usability/__manifest__.py | 2 +- delivery_usability/__manifest__.py | 2 +- eradicate_quick_create/__manifest__.py | 2 +- hr_contract_usability/__manifest__.py | 2 +- link_tracker_usability/__manifest__.py | 2 +- mail_no_portal/__manifest__.py | 2 +- mail_usability/__manifest__.py | 2 +- mrp_average_cost/__init__.py | 3 - mrp_average_cost/__manifest__.py | 33 --- mrp_average_cost/data/mrp_data.xml | 23 -- mrp_average_cost/models/__init__.py | 3 - mrp_average_cost/models/mrp.py | 271 ------------------ mrp_average_cost/security/ir.model.access.csv | 7 - .../security/mrp_average_cost_security.xml | 10 - mrp_average_cost/views/mrp_view.xml | 128 --------- mrp_no_product_template_menu/__init__.py | 0 mrp_no_product_template_menu/__manifest__.py | 30 -- mrp_no_product_template_menu/mrp_view.xml | 21 -- mrp_usability/__manifest__.py | 2 +- partner_tree_default_account/__manifest__.py | 2 +- partner_tree_default_base/__manifest__.py | 2 +- partner_tree_default_contacts/__manifest__.py | 2 +- pos_config_single_user/__manifest__.py | 2 +- pos_product_tree_default/__manifest__.py | 2 +- pos_usability/__manifest__.py | 2 +- product_category_tax/__manifest__.py | 2 +- product_manager_group/__manifest__.py | 2 +- product_manager_group_stock/__manifest__.py | 2 +- product_no_translation/__manifest__.py | 2 +- product_print_zpl_barcode/__manifest__.py | 2 +- product_usability/__manifest__.py | 2 +- purchase_product_tree_default/__manifest__.py | 2 +- purchase_stock_usability/__manifest__.py | 2 +- purchase_usability/__manifest__.py | 2 +- sale_confirm_wizard/__manifest__.py | 2 +- sale_no_configurator_button/__init__.py | 0 sale_no_configurator_button/__manifest__.py | 31 -- .../views/sale_view.xml | 12 - sale_no_optional_product/__manifest__.py | 2 +- sale_no_preview_button/__manifest__.py | 2 +- sale_order_add_bom/__manifest__.py | 2 +- sale_order_route/__manifest__.py | 2 +- sale_product_tree_default/__manifest__.py | 2 +- .../__init__.py | 0 .../__manifest__.py | 29 -- .../i18n/fr.po | 29 -- ...sale_purchase_no_product_template_menu.pot | 25 -- .../view.xml | 63 ---- sale_stock_usability/__manifest__.py | 2 +- sale_usability/__manifest__.py | 2 +- sales_team_usability/__manifest__.py | 2 +- shopinvader_usability/__manifest__.py | 1 + stock_account_usability/__manifest__.py | 2 +- stock_inventory_usability/__init__.py | 1 - stock_inventory_usability/__manifest__.py | 18 -- stock_inventory_usability/models/__init__.py | 1 - .../models/stock_inventory.py | 17 -- .../views/stock_inventory.xml | 27 -- stock_no_product_template_menu/__init__.py | 0 .../__manifest__.py | 26 -- stock_no_product_template_menu/view.xml | 16 -- .../__manifest__.py | 2 +- stock_product_tree_default/__manifest__.py | 2 +- stock_reception_usability/__init__.py | 1 - stock_reception_usability/__manifest__.py | 24 -- stock_reception_usability/models/__init__.py | 2 - .../models/stock_move.py | 36 --- .../views/stock_picking.xml | 17 -- stock_usability/__manifest__.py | 2 +- stock_valuation_xlsx/__manifest__.py | 2 +- web_tab_title/__manifest__.py | 1 + 88 files changed, 50 insertions(+), 1047 deletions(-) delete mode 100644 account_fiscal_position_payable_receivable/__init__.py delete mode 100644 account_fiscal_position_payable_receivable/__manifest__.py delete mode 100644 account_fiscal_position_payable_receivable/models/__init__.py delete mode 100644 account_fiscal_position_payable_receivable/models/account_fiscal_position.py delete mode 100644 account_fiscal_position_payable_receivable/models/res_partner.py delete mode 100644 account_fiscal_position_payable_receivable/views/account_fiscal_position_view.xml delete mode 100644 mrp_average_cost/__init__.py delete mode 100644 mrp_average_cost/__manifest__.py delete mode 100644 mrp_average_cost/data/mrp_data.xml delete mode 100644 mrp_average_cost/models/__init__.py delete mode 100644 mrp_average_cost/models/mrp.py delete mode 100644 mrp_average_cost/security/ir.model.access.csv delete mode 100644 mrp_average_cost/security/mrp_average_cost_security.xml delete mode 100644 mrp_average_cost/views/mrp_view.xml delete mode 100644 mrp_no_product_template_menu/__init__.py delete mode 100644 mrp_no_product_template_menu/__manifest__.py delete mode 100644 mrp_no_product_template_menu/mrp_view.xml delete mode 100644 sale_no_configurator_button/__init__.py delete mode 100644 sale_no_configurator_button/__manifest__.py delete mode 100644 sale_no_configurator_button/views/sale_view.xml delete mode 100644 sale_purchase_no_product_template_menu/__init__.py delete mode 100644 sale_purchase_no_product_template_menu/__manifest__.py delete mode 100644 sale_purchase_no_product_template_menu/i18n/fr.po delete mode 100644 sale_purchase_no_product_template_menu/i18n/sale_purchase_no_product_template_menu.pot delete mode 100644 sale_purchase_no_product_template_menu/view.xml delete mode 100644 stock_inventory_usability/__init__.py delete mode 100644 stock_inventory_usability/__manifest__.py delete mode 100644 stock_inventory_usability/models/__init__.py delete mode 100644 stock_inventory_usability/models/stock_inventory.py delete mode 100644 stock_inventory_usability/views/stock_inventory.xml delete mode 100644 stock_no_product_template_menu/__init__.py delete mode 100644 stock_no_product_template_menu/__manifest__.py delete mode 100644 stock_no_product_template_menu/view.xml delete mode 100644 stock_reception_usability/__init__.py delete mode 100644 stock_reception_usability/__manifest__.py delete mode 100644 stock_reception_usability/models/__init__.py delete mode 100644 stock_reception_usability/models/stock_move.py delete mode 100644 stock_reception_usability/views/stock_picking.xml diff --git a/account_fiscal_position_payable_receivable/__init__.py b/account_fiscal_position_payable_receivable/__init__.py deleted file mode 100644 index 0650744..0000000 --- a/account_fiscal_position_payable_receivable/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import models diff --git a/account_fiscal_position_payable_receivable/__manifest__.py b/account_fiscal_position_payable_receivable/__manifest__.py deleted file mode 100644 index 88dbc65..0000000 --- a/account_fiscal_position_payable_receivable/__manifest__.py +++ /dev/null @@ -1,23 +0,0 @@ -# © 2016-2017 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - "name": "Account Fiscal Position Payable Receivable", - "version": "12.0.1.0.0", - "category": "Accounting & Finance", - "license": "AGPL-3", - "summary": "Configure payable/receivable accounts on fiscal positions", - "description": """ -Account Fiscal Position Payable Receivable -========================================== - -This module allows to configure a special *Partner Receivable Account* and a special *Partner Payable Account* on fiscal positions. This is used in the onchange of the fiscal position of partners. - -This module has been written by Alexis de Lattre from Akretion . - """, - "author": "Akretion", - "website": "http://www.akretion.com", - "depends": ["account"], - "data": ["views/account_fiscal_position_view.xml"], - "installable": False, -} diff --git a/account_fiscal_position_payable_receivable/models/__init__.py b/account_fiscal_position_payable_receivable/models/__init__.py deleted file mode 100644 index b52c676..0000000 --- a/account_fiscal_position_payable_receivable/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import account_fiscal_position -from . import res_partner diff --git a/account_fiscal_position_payable_receivable/models/account_fiscal_position.py b/account_fiscal_position_payable_receivable/models/account_fiscal_position.py deleted file mode 100644 index eb549da..0000000 --- a/account_fiscal_position_payable_receivable/models/account_fiscal_position.py +++ /dev/null @@ -1,21 +0,0 @@ -# © 2016-2017 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models, fields - - -class AccountFiscalPosition(models.Model): - _inherit = "account.fiscal.position" - - receivable_account_id = fields.Many2one( - "account.account", - string="Partner Receivable Account", - company_dependent=True, - domain=[("internal_type", "=", "receivable")], - ) - payable_account_id = fields.Many2one( - "account.account", - string="Partner Payable Account", - company_dependent=True, - domain=[("internal_type", "=", "payable")], - ) diff --git a/account_fiscal_position_payable_receivable/models/res_partner.py b/account_fiscal_position_payable_receivable/models/res_partner.py deleted file mode 100644 index e76a0e0..0000000 --- a/account_fiscal_position_payable_receivable/models/res_partner.py +++ /dev/null @@ -1,25 +0,0 @@ -# © 2016-2017 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models, api - - -class ResPartner(models.Model): - _inherit = "res.partner" - - @api.onchange("property_account_position_id") - def fiscal_position_receivable_payable_change(self): - fp = self.property_account_position_id - ipo = self.env["ir.property"] - if fp.receivable_account_id: - self.property_account_receivable_id = fp.receivable_account_id - else: - self.property_account_receivable_id = ipo.get( - "property_account_receivable_id", "res.partner" - ) - if fp.payable_account_id: - self.property_account_payable_id = fp.payable_account_id - else: - self.property_account_payable_id = ipo.get( - "property_account_payable_id", "res.partner" - ) diff --git a/account_fiscal_position_payable_receivable/views/account_fiscal_position_view.xml b/account_fiscal_position_payable_receivable/views/account_fiscal_position_view.xml deleted file mode 100644 index 45321f1..0000000 --- a/account_fiscal_position_payable_receivable/views/account_fiscal_position_view.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - receivable_payable.fiscal_position_form - account.fiscal.position - - - - - - - - - - - diff --git a/account_invoice_update_wizard/__manifest__.py b/account_invoice_update_wizard/__manifest__.py index f133e87..dd60e4e 100644 --- a/account_invoice_update_wizard/__manifest__.py +++ b/account_invoice_update_wizard/__manifest__.py @@ -18,5 +18,5 @@ 'wizard/account_move_update_view.xml', 'views/account_move.xml', ], - 'installable': True, + 'installable': False, } diff --git a/account_invoice_update_wizard_payment_mode/__manifest__.py b/account_invoice_update_wizard_payment_mode/__manifest__.py index 32a7de0..921238f 100644 --- a/account_invoice_update_wizard_payment_mode/__manifest__.py +++ b/account_invoice_update_wizard_payment_mode/__manifest__.py @@ -12,6 +12,6 @@ 'website': 'https://github.com/akretion/odoo-usability', 'depends': ['account_invoice_update_wizard', 'account_payment_partner'], 'data': ['wizard/account_move_update_view.xml'], - 'installable': True, + 'installable': False, 'auto_install': True, } diff --git a/account_menu_usability/__manifest__.py b/account_menu_usability/__manifest__.py index 851328a..86483bb 100644 --- a/account_menu_usability/__manifest__.py +++ b/account_menu_usability/__manifest__.py @@ -14,5 +14,5 @@ 'data': [ 'views/account_menu.xml', ], - 'installable': True, + 'installable': False, } diff --git a/account_move_label_copy/__manifest__.py b/account_move_label_copy/__manifest__.py index 367ff19..1eb6b3c 100644 --- a/account_move_label_copy/__manifest__.py +++ b/account_move_label_copy/__manifest__.py @@ -25,5 +25,5 @@ I don't recommend the use of this module. 'data': [ 'views/account_move.xml', ], - 'installable': True, + 'installable': False, } diff --git a/account_usability/__manifest__.py b/account_usability/__manifest__.py index 3635867..f99fb0f 100644 --- a/account_usability/__manifest__.py +++ b/account_usability/__manifest__.py @@ -40,5 +40,5 @@ 'report/invoice_report.xml', ], 'qweb': ['static/src/xml/account_payment.xml'], - 'installable': True, + 'installable': False, } diff --git a/base_company_extension/__manifest__.py b/base_company_extension/__manifest__.py index 3ae3559..ef50d36 100644 --- a/base_company_extension/__manifest__.py +++ b/base_company_extension/__manifest__.py @@ -13,5 +13,5 @@ # I depend on base_usability only for _report_company_legal_name() 'depends': ['base_usability'], 'data': ['company_view.xml'], - 'installable': True, + 'installable': False, } diff --git a/base_dynamic_list/__manifest__.py b/base_dynamic_list/__manifest__.py index 816b9f0..a2e7d5d 100644 --- a/base_dynamic_list/__manifest__.py +++ b/base_dynamic_list/__manifest__.py @@ -58,5 +58,5 @@ Limitation: when you want to have different access rights on these lists dependi 'security/ir.model.access.csv', 'views/dynamic_list.xml', ], - 'installable': True, + 'installable': False, } diff --git a/base_mail_sender_bcc/__manifest__.py b/base_mail_sender_bcc/__manifest__.py index db52c3a..763d85a 100644 --- a/base_mail_sender_bcc/__manifest__.py +++ b/base_mail_sender_bcc/__manifest__.py @@ -17,5 +17,5 @@ With this module, when Odoo sends an outgoing email, it adds the sender as Bcc ( 'author': 'Akretion', 'website': 'https://github.com/akretion/odoo-usability', 'depends': ['base'], - 'installable': True, + 'installable': False, } diff --git a/base_partner_one2many_phone/__manifest__.py b/base_partner_one2many_phone/__manifest__.py index d28b288..e6cb7f7 100644 --- a/base_partner_one2many_phone/__manifest__.py +++ b/base_partner_one2many_phone/__manifest__.py @@ -26,6 +26,6 @@ It has been developped by brother Bernard from Barroux Abbey and Alexis de Lattr 'partner_phone_view.xml', 'security/ir.model.access.csv', ], - 'installable': True, + 'installable': False, 'post_init_hook': 'migrate_to_partner_phone', } diff --git a/base_partner_ref/__manifest__.py b/base_partner_ref/__manifest__.py index dcf9a36..45ff5a0 100644 --- a/base_partner_ref/__manifest__.py +++ b/base_partner_ref/__manifest__.py @@ -22,5 +22,5 @@ Base Partner Reference 'website': 'http://www.akretion.com', 'depends': ['base'], 'data': ['views/res_partner.xml'], - 'installable': True, + 'installable': False, } diff --git a/base_usability/__manifest__.py b/base_usability/__manifest__.py index 8d611d9..4252f31 100644 --- a/base_usability/__manifest__.py +++ b/base_usability/__manifest__.py @@ -22,5 +22,5 @@ 'views/ir_sequence.xml', 'views/ir_property.xml', ], - 'installable': True, + 'installable': False, } diff --git a/crm_usability/__manifest__.py b/crm_usability/__manifest__.py index e5394dc..b55f023 100644 --- a/crm_usability/__manifest__.py +++ b/crm_usability/__manifest__.py @@ -21,5 +21,5 @@ This module has been written by Alexis de Lattre from Akretion 'data': [ 'views/crm_lead.xml', ], - 'installable': True, + 'installable': False, } diff --git a/delivery_usability/__manifest__.py b/delivery_usability/__manifest__.py index 1ec0678..776c780 100644 --- a/delivery_usability/__manifest__.py +++ b/delivery_usability/__manifest__.py @@ -23,5 +23,5 @@ This module has been written by Alexis de Lattre from Akretion -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - 'name': 'MRP Average Cost', - 'version': '12.0.1.0.0', # WARNING: we'll probably not port this module to v14, because part of its feature is now provided by the module mrp_account - 'category': 'Manufactuing', - 'license': 'AGPL-3', - 'summary': 'Update standard_price upon validation of a manufacturing order', - 'description': """ -MRP Average Cost -================ - -By default, the official stock module updates the standard_price of a product that has costing_method = 'average' when validating an incoming picking. But the official 'mrp' module doesn't do that when you validate a manufactuging order. - -This module adds this feature : when you validate a manufacturing order of a product that has costing method = 'average', the standard_price of the product will be updated by taking into account the standard_price of each raw material and also a number of work hours defined on the BOM. - -Together with this module, I recommend the use of my module product_usability, available in the same branch, which contains a backport of the model product.price.history from v8 to v7. - -This module has been written by Alexis de Lattre from Akretion . - """, - 'author': 'Akretion', - 'website': 'http://www.akretion.com', - 'depends': ['mrp'], - 'data': [ - 'security/mrp_average_cost_security.xml', - 'security/ir.model.access.csv', - 'data/mrp_data.xml', - 'views/mrp_view.xml', - ], - 'installable': False, -} diff --git a/mrp_average_cost/data/mrp_data.xml b/mrp_average_cost/data/mrp_data.xml deleted file mode 100644 index 1d087c8..0000000 --- a/mrp_average_cost/data/mrp_data.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Labour Hours - 3 - - - - - Update Cost Price of products with Phantom BOM - - - 1 - days - -1 - - - code - model._phantom_update_product_standard_price() - - - diff --git a/mrp_average_cost/models/__init__.py b/mrp_average_cost/models/__init__.py deleted file mode 100644 index 8104f48..0000000 --- a/mrp_average_cost/models/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from . import mrp diff --git a/mrp_average_cost/models/mrp.py b/mrp_average_cost/models/mrp.py deleted file mode 100644 index 8648c0f..0000000 --- a/mrp_average_cost/models/mrp.py +++ /dev/null @@ -1,271 +0,0 @@ -# Copyright (C) 2016-2019 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models, fields, api, _ -import odoo.addons.decimal_precision as dp -from odoo.exceptions import UserError -from odoo.tools import float_compare, float_is_zero -import logging - -logger = logging.getLogger(__name__) - - -class MrpBomLabourLine(models.Model): - _name = 'mrp.bom.labour.line' - _description = 'Labour lines on BOM' - - bom_id = fields.Many2one( - comodel_name='mrp.bom', - string='Labour Lines', - ondelete='cascade') - - labour_time = fields.Float( - string='Labour Time', - required=True, - digits=dp.get_precision('Labour Hours'), - help="Average labour time for the production of " - "items of the BOM, in hours.") - - labour_cost_profile_id = fields.Many2one( - comodel_name='labour.cost.profile', - string='Labour Cost Profile', - required=True) - - note = fields.Text( - string='Note') - - _sql_constraints = [( - 'labour_time_positive', - 'CHECK (labour_time >= 0)', - "The value of the field 'Labour Time' must be positive or 0.")] - - -class MrpBom(models.Model): - _inherit = 'mrp.bom' - - @api.depends( - 'labour_line_ids.labour_time', - 'labour_line_ids.labour_cost_profile_id.hour_cost') - def _compute_total_labour_cost(self): - for bom in self: - cost = 0.0 - for lline in bom.labour_line_ids: - cost += lline.labour_time *\ - lline.labour_cost_profile_id.hour_cost - bom.total_labour_cost = cost - - @api.depends( - 'bom_line_ids.product_id.standard_price', - 'total_labour_cost', 'extra_cost') - def _compute_total_cost(self): - for bom in self: - comp_cost = 0.0 - for line in bom.bom_line_ids: - comp_price = line.product_id.standard_price - comp_qty_product_uom = line.product_uom_id._compute_quantity( - line.product_qty, line.product_id.uom_id) - comp_cost += comp_price * comp_qty_product_uom - total_cost = comp_cost + bom.extra_cost + bom.total_labour_cost - bom.total_components_cost = comp_cost - bom.total_cost = total_cost - - labour_line_ids = fields.One2many( - 'mrp.bom.labour.line', 'bom_id', string='Labour Lines') - total_labour_cost = fields.Float( - compute='_compute_total_labour_cost', readonly=True, - digits=dp.get_precision('Product Price'), - string="Total Labour Cost", store=True) - extra_cost = fields.Float( - string='Extra Cost', track_visibility='onchange', - digits=dp.get_precision('Product Price'), - help="Extra cost for the production of the quantity of " - "items of the BOM, in company currency. " - "You can use this field to enter the cost of the consumables " - "that are used to produce the product but are not listed in " - "the BOM") - total_components_cost = fields.Float( - compute='_compute_total_cost', readonly=True, - digits=dp.get_precision('Product Price'), - string='Total Components Cost') - total_cost = fields.Float( - compute='_compute_total_cost', readonly=True, - string='Total Cost', - digits=dp.get_precision('Product Price'), - help="Total Cost = Total Components Cost + " - "Total Labour Cost + Extra Cost") - company_currency_id = fields.Many2one( - related='company_id.currency_id', string='Company Currency') - - @api.model - def _phantom_update_product_standard_price(self): - logger.info('Start to auto-update cost price from phantom bom') - boms = self.search([('type', '=', 'phantom')]) - boms.with_context( - product_price_history_origin='Automatic update of Phantom BOMs')\ - .manual_update_product_standard_price() - logger.info('End of the auto-update cost price from phantom bom') - return True - - def manual_update_product_standard_price(self): - if 'product_price_history_origin' not in self._context: - self = self.with_context( - product_price_history_origin='Manual update from BOM') - precision = self.env['decimal.precision'].precision_get( - 'Product Price') - for bom in self: - wproduct = bom.product_id - if not wproduct: - wproduct = bom.product_tmpl_id - if float_compare( - wproduct.standard_price, bom.total_cost, - precision_digits=precision): - wproduct.with_context().write( - {'standard_price': bom.total_cost}) - logger.info( - 'Cost price updated to %s on product %s', - bom.total_cost, wproduct.display_name) - return True - - -class MrpBomLine(models.Model): - _inherit = 'mrp.bom.line' - - standard_price = fields.Float( - related='product_id.standard_price', - readonly=True, - string='Standard Price') - - -class LabourCostProfile(models.Model): - _name = 'labour.cost.profile' - _inherit = ['mail.thread'] - _description = 'Labour Cost Profile' - - name = fields.Char( - string='Name', - required=True, - track_visibility='onchange') - - hour_cost = fields.Float( - string='Cost per Hour', - required=True, - digits=dp.get_precision('Product Price'), - track_visibility='onchange', - help="Labour cost per hour per person in company currency") - - company_id = fields.Many2one( - comodel_name='res.company', - string='Company', - required=True, - default=lambda self: self.env['res.company']._company_default_get()) - - company_currency_id = fields.Many2one( - related='company_id.currency_id', - readonly=True, - store=True, - string='Company Currency') - - @api.depends('name', 'hour_cost', 'company_currency_id.symbol') - def name_get(self): - res = [] - for record in self: - res.append((record.id, u'%s (%s %s)' % ( - record.name, record.hour_cost, - record.company_currency_id.symbol))) - return res - - -class MrpProduction(models.Model): - _inherit = 'mrp.production' - - unit_cost = fields.Float( - string='Unit Cost', readonly=True, - digits=dp.get_precision('Product Price'), - help="This cost per unit in the unit of measure of the product " - "in company currency takes into account " - "the cost of the raw materials and the labour cost defined on" - "the BOM.") - - company_currency_id = fields.Many2one( - related='company_id.currency_id', readonly=True, - string='Company Currency') - - def compute_order_unit_cost(self): - self.ensure_one() - mo_total_price = 0.0 # In the UoM of the M0 - labor_cost_per_unit = 0.0 # In the UoM of the product - extra_cost_per_unit = 0.0 # In the UoM of the product - subcontract_cost_per_unit = 0.0 - # I read the raw materials MO, not on BOM, in order to make - # it work with the "dynamic" BOMs (few raw material are auto-added - # on the fly on MO) - prec = self.env['decimal.precision'].precision_get( - 'Product Unit of Measure') - for raw_smove in self.move_raw_ids: - # I don't filter on state, in order to make it work with - # partial productions - # For partial productions, mo.product_qty is not updated - # so we compute with fully qty and we compute with all raw - # materials (consumed or not), so it gives a good price - # per unit at the end - raw_price = raw_smove.product_id.standard_price - raw_material_cost = raw_price * raw_smove.product_qty - logger.info( - 'MO %s product %s: raw_material_cost=%s', - self.name, raw_smove.product_id.display_name, - raw_material_cost) - mo_total_price += raw_material_cost - if self.bom_id: - bom = self.bom_id - # if not bom.total_labour_cost: - # raise orm.except_orm( - # _('Error:'), - # _("Total Labor Cost is 0 on bill of material '%s'.") - # % bom.name) - if float_is_zero(bom.product_qty, precision_digits=prec): - raise UserError(_( - "Missing Product Quantity on bill of material '%s'.") - % bom.display_name) - bom_qty_product_uom = bom.product_uom_id._compute_quantity( - bom.product_qty, bom.product_tmpl_id.uom_id) - assert bom_qty_product_uom > 0, 'BoM qty should be positive' - labor_cost_per_unit = bom.total_labour_cost / bom_qty_product_uom - extra_cost_per_unit = bom.extra_cost / bom_qty_product_uom - if bom.type == 'subcontract': - one_finished_move = self.env['stock.move'].search([ - ('production_id', '=', self.id), - ('product_id', '=', self.product_id.id), - ('move_dest_ids', '!=', False)], limit=1) - if one_finished_move: - subcontract_cost_per_unit = one_finished_move.move_dest_ids[0].price_unit - # mo_standard_price and labor_cost_per_unit are - # in the UoM of the product (not of the MO/BOM) - mo_qty_product_uom = self.product_uom_id._compute_quantity( - self.product_qty, self.product_id.uom_id) - assert mo_qty_product_uom > 0, 'MO qty should be positive' - mo_standard_price = mo_total_price / mo_qty_product_uom - logger.info( - 'MO %s: labor_cost_per_unit=%s extra_cost_per_unit=%s ' - 'subcontract_cost_per_unit=%s', - self.name, labor_cost_per_unit, extra_cost_per_unit, - subcontract_cost_per_unit) - mo_standard_price += labor_cost_per_unit - mo_standard_price += extra_cost_per_unit - mo_standard_price += subcontract_cost_per_unit - return mo_standard_price - - def post_inventory(self): - '''This is the method where _action_done() is called on finished move - So we write on 'price_unit' of the finished move and THEN we call - super() which will call _action_done() which itself calls - product_price_update_before_done()''' - for order in self: - if order.product_id.cost_method == 'average': - unit_cost = order.compute_order_unit_cost() - order.write({'unit_cost': unit_cost}) - logger.info('MO %s: unit_cost=%s', order.name, unit_cost) - order.move_finished_ids.filtered( - lambda x: x.product_id == order.product_id).write({ - 'price_unit': unit_cost}) - return super(MrpProduction, self).post_inventory() diff --git a/mrp_average_cost/security/ir.model.access.csv b/mrp_average_cost/security/ir.model.access.csv deleted file mode 100644 index c8eda4f..0000000 --- a/mrp_average_cost/security/ir.model.access.csv +++ /dev/null @@ -1,7 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_labour_cost_profile_read,Read access on labour.cost.profile to MRP user,model_labour_cost_profile,mrp.group_mrp_user,1,0,0,0 -access_labour_cost_profile_read_stock,Read access on labour.cost.profile to Stock user,model_labour_cost_profile,stock.group_stock_user,1,0,0,0 -access_labour_cost_profile_full,Full access on labour.cost.profile to MRP manager,model_labour_cost_profile,mrp.group_mrp_manager,1,1,1,1 -access_mrp_bom_labour_line_read,Read access on mrp.bom.labour.line to MRP user,model_mrp_bom_labour_line,mrp.group_mrp_user,1,0,0,0 -access_mrp_bom_labour_line_read_stock,Read access on mrp.bom.labour.line to Stock user,model_mrp_bom_labour_line,stock.group_stock_user,1,0,0,0 -access_mrp_bom_labour_line_full,Full access on mrp.bom.labour.line to MRP manager,model_mrp_bom_labour_line,mrp.group_mrp_manager,1,1,1,1 diff --git a/mrp_average_cost/security/mrp_average_cost_security.xml b/mrp_average_cost/security/mrp_average_cost_security.xml deleted file mode 100644 index 03bef1d..0000000 --- a/mrp_average_cost/security/mrp_average_cost_security.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Labour Cost Profile multi-company - - ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])] - - - diff --git a/mrp_average_cost/views/mrp_view.xml b/mrp_average_cost/views/mrp_view.xml deleted file mode 100644 index 6caef87..0000000 --- a/mrp_average_cost/views/mrp_view.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - mrp_average_cost.mrp.bom.form - mrp.bom - - - - - - - - - - - mrp_bom_labour_line.tree - mrp.bom.labour.line - - - - - - - - - - - - mrp_bom_labour_line.form - mrp.bom.labour.line - -
- - - -
-
-
- - - - - labour_cost_profile_form - labour.cost.profile - -
- - - - - - -
-
-
- - - labour_cost_profile_tree - labour.cost.profile - - - - - - - - - - - Labour Cost Profile - labour.cost.profile - tree,form - - - - - - mrp_average_cost.mrp_production_form - - mrp.production - - - - - - - - - -
diff --git a/mrp_no_product_template_menu/__init__.py b/mrp_no_product_template_menu/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/mrp_no_product_template_menu/__manifest__.py b/mrp_no_product_template_menu/__manifest__.py deleted file mode 100644 index bc4dbad..0000000 --- a/mrp_no_product_template_menu/__manifest__.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2016-2019 Akretion France (http://www.akretion.com/) -# @author: Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - 'name': 'MRP No Product Template Menu', - 'version': '12.0.1.0.0', - 'category': 'Manufacturing', - 'license': 'AGPL-3', - 'summary': "Replace product.template menu entries by product.product menu", - 'description': """ -MRP No Product Template -======================= - -This module replaces the menu entry for product.template by menu entries -for product.product in the *Manufacturing > Master Data* menu. - -This module also switches to the tree view by default -for Product menu entries, instead of the kanban view. - -This module has been written by Alexis de Lattre -from Akretion . - """, - 'author': 'Akretion', - 'website': 'http://www.akretion.com', - 'depends': ['mrp', 'sale_purchase_no_product_template_menu'], - 'auto_install': True, - 'data': ['mrp_view.xml'], - 'installable': False, -} diff --git a/mrp_no_product_template_menu/mrp_view.xml b/mrp_no_product_template_menu/mrp_view.xml deleted file mode 100644 index c185036..0000000 --- a/mrp_no_product_template_menu/mrp_view.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - Products - product.product - tree,form,kanban - {'search_default_consumable': 1, 'default_type': 'product'} - - - - - - - diff --git a/mrp_usability/__manifest__.py b/mrp_usability/__manifest__.py index 19876ed..c3d2a0f 100644 --- a/mrp_usability/__manifest__.py +++ b/mrp_usability/__manifest__.py @@ -16,5 +16,5 @@ 'views/product_template.xml', # 'report/mrp_report.xml' # TODO ], - 'installable': True, + 'installable': False, } diff --git a/partner_tree_default_account/__manifest__.py b/partner_tree_default_account/__manifest__.py index 31ef12a..cb87036 100644 --- a/partner_tree_default_account/__manifest__.py +++ b/partner_tree_default_account/__manifest__.py @@ -21,5 +21,5 @@ This module has been written by Alexis de Lattre 'website': 'http://www.akretion.com', 'depends': ['account'], 'data': ['views/res_partner.xml'], - 'installable': True, + 'installable': False, } diff --git a/partner_tree_default_base/__manifest__.py b/partner_tree_default_base/__manifest__.py index 5a2282e..ed3580e 100644 --- a/partner_tree_default_base/__manifest__.py +++ b/partner_tree_default_base/__manifest__.py @@ -21,5 +21,5 @@ This module has been written by Alexis de Lattre 'website': 'http://www.akretion.com', 'depends': ['base'], 'data': ['views/res_partner.xml'], - 'installable': True, + 'installable': False, } diff --git a/partner_tree_default_contacts/__manifest__.py b/partner_tree_default_contacts/__manifest__.py index 3ed82f0..782adf2 100644 --- a/partner_tree_default_contacts/__manifest__.py +++ b/partner_tree_default_contacts/__manifest__.py @@ -21,5 +21,5 @@ This module has been written by Alexis de Lattre 'website': 'http://www.akretion.com', 'depends': ['contacts'], 'data': ['views/res_partner.xml'], - 'installable': True, + 'installable': False, } diff --git a/pos_config_single_user/__manifest__.py b/pos_config_single_user/__manifest__.py index 4e276e9..3399c91 100644 --- a/pos_config_single_user/__manifest__.py +++ b/pos_config_single_user/__manifest__.py @@ -20,5 +20,5 @@ This module has been written by Alexis de Lattre from Akretion for 'data': [ 'views/stock_picking.xml', ], - 'installable': True, + 'installable': False, } diff --git a/purchase_usability/__manifest__.py b/purchase_usability/__manifest__.py index 84d197c..dd65bc6 100644 --- a/purchase_usability/__manifest__.py +++ b/purchase_usability/__manifest__.py @@ -16,5 +16,5 @@ 'views/purchase_report.xml', 'views/account_move.xml', ], - 'installable': True, + 'installable': False, } diff --git a/sale_confirm_wizard/__manifest__.py b/sale_confirm_wizard/__manifest__.py index bbe3068..f78474d 100644 --- a/sale_confirm_wizard/__manifest__.py +++ b/sale_confirm_wizard/__manifest__.py @@ -34,5 +34,5 @@ This module has been written by Alexis de Lattre from Akretion 'views/sale_order.xml', 'security/ir.model.access.csv', ], - 'installable': True, + 'installable': False, } diff --git a/sale_no_configurator_button/__init__.py b/sale_no_configurator_button/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/sale_no_configurator_button/__manifest__.py b/sale_no_configurator_button/__manifest__.py deleted file mode 100644 index d305324..0000000 --- a/sale_no_configurator_button/__manifest__.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2020 Akretion (https://www.akretion.com). -# @author Sébastien BEAU -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -{ - "name": "Sale no configurator button", - "summary": "Hide 'configure a product' from sale line", - "version": "12.0.1.0.0", - "category": "Usabability", - "website": "www.akretion.com", - "author": " Akretion", - "license": "AGPL-3", - "application": False, - "installable": False, - "external_dependencies": { - "python": [], - "bin": [], - }, - "depends": [ - "sale", - ], - "data": [ - "views/sale_view.xml", - ], - "demo": [ - ], - "qweb": [ - ] -} - - diff --git a/sale_no_configurator_button/views/sale_view.xml b/sale_no_configurator_button/views/sale_view.xml deleted file mode 100644 index 64473c1..0000000 --- a/sale_no_configurator_button/views/sale_view.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - sale.order - - - - - - - diff --git a/sale_no_optional_product/__manifest__.py b/sale_no_optional_product/__manifest__.py index 1536d51..d5261e1 100644 --- a/sale_no_optional_product/__manifest__.py +++ b/sale_no_optional_product/__manifest__.py @@ -11,7 +11,7 @@ "author": " Akretion", "license": "AGPL-3", "application": False, - "installable": True, + "installable": False, "external_dependencies": { "python": [], "bin": [], diff --git a/sale_no_preview_button/__manifest__.py b/sale_no_preview_button/__manifest__.py index e5b014b..8d1588a 100644 --- a/sale_no_preview_button/__manifest__.py +++ b/sale_no_preview_button/__manifest__.py @@ -11,7 +11,7 @@ "author": " Akretion", "license": "AGPL-3", "application": False, - "installable": True, + "installable": False, "external_dependencies": { "python": [], "bin": [], diff --git a/sale_order_add_bom/__manifest__.py b/sale_order_add_bom/__manifest__.py index accd0ed..be95344 100644 --- a/sale_order_add_bom/__manifest__.py +++ b/sale_order_add_bom/__manifest__.py @@ -25,5 +25,5 @@ This module has been written by Alexis de Lattre from Akretion 'views/stock_picking.xml', 'security/ir.model.access.csv', ], - 'installable': True, + 'installable': False, } diff --git a/sale_order_route/__manifest__.py b/sale_order_route/__manifest__.py index 8f1ec51..cc5acfb 100644 --- a/sale_order_route/__manifest__.py +++ b/sale_order_route/__manifest__.py @@ -18,5 +18,5 @@ This module has been written by Alexis de Lattre from Akretion 'website': 'http://www.akretion.com', 'depends': ['sale_stock'], 'data': ['views/sale_order.xml'], - 'installable': True, + 'installable': False, } diff --git a/sale_product_tree_default/__manifest__.py b/sale_product_tree_default/__manifest__.py index 4f7b7a5..0a68728 100644 --- a/sale_product_tree_default/__manifest__.py +++ b/sale_product_tree_default/__manifest__.py @@ -18,5 +18,5 @@ 'data': [ 'views/product_template.xml' ], - 'installable': True, + 'installable': False, } diff --git a/sale_purchase_no_product_template_menu/__init__.py b/sale_purchase_no_product_template_menu/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/sale_purchase_no_product_template_menu/__manifest__.py b/sale_purchase_no_product_template_menu/__manifest__.py deleted file mode 100644 index 6ecf370..0000000 --- a/sale_purchase_no_product_template_menu/__manifest__.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2015-2019 Akretion France (http://www.akretion.com/) -# @author: Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - "name": "Sale Purchase No Product Template Menu", - "version": "14.0.1.0.0", - "category": "Sale and Purchase", - "license": "AGPL-3", - "summary": "Replace product.template menu entries by product.product menu entries", - "description": """ -Sale Purchase No Product Template -================================= - -This module replaces the menu entries for product.template by menu entries for product.product in the *Sales* and *Purchases* menu entries. With this module, the only menu entry for product.template is in the menu *Sales > Configuration > Product Categories and Attributes*. - -This module also switches to the tree view by default for Product menu entries, instead of the kanban view. - -This module has been written by Alexis de Lattre from Akretion . - """, - "author": "Akretion", - "website": "http://www.akretion.com", - "depends": [ - "purchase", - "sale", - ], - "data": ["view.xml"], - "installable": True, -} diff --git a/sale_purchase_no_product_template_menu/i18n/fr.po b/sale_purchase_no_product_template_menu/i18n/fr.po deleted file mode 100644 index be99427..0000000 --- a/sale_purchase_no_product_template_menu/i18n/fr.po +++ /dev/null @@ -1,29 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_purchase_no_product_template_menu -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2022-03-28 17:19+0200\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: \n" -"X-Generator: Poedit 3.0\n" - -#. module: sale_purchase_no_product_template_menu -#: model:ir.ui.menu,name:sale_purchase_no_product_template_menu.sale_config_product_template_menu -msgid "Product Templates" -msgstr "Modèles d'article" - -#. module: sale_purchase_no_product_template_menu -#: model:ir.actions.act_window,name:sale_purchase_no_product_template_menu.product_product_action_purchased -#: model:ir.actions.act_window,name:sale_purchase_no_product_template_menu.product_product_action_sell -msgid "Products" -msgstr "Articles" diff --git a/sale_purchase_no_product_template_menu/i18n/sale_purchase_no_product_template_menu.pot b/sale_purchase_no_product_template_menu/i18n/sale_purchase_no_product_template_menu.pot deleted file mode 100644 index a8c86b0..0000000 --- a/sale_purchase_no_product_template_menu/i18n/sale_purchase_no_product_template_menu.pot +++ /dev/null @@ -1,25 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_purchase_no_product_template_menu -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 14.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: sale_purchase_no_product_template_menu -#: model:ir.ui.menu,name:sale_purchase_no_product_template_menu.sale_config_product_template_menu -msgid "Product Templates" -msgstr "" - -#. module: sale_purchase_no_product_template_menu -#: model:ir.actions.act_window,name:sale_purchase_no_product_template_menu.product_product_action_purchased -#: model:ir.actions.act_window,name:sale_purchase_no_product_template_menu.product_product_action_sell -msgid "Products" -msgstr "" diff --git a/sale_purchase_no_product_template_menu/view.xml b/sale_purchase_no_product_template_menu/view.xml deleted file mode 100644 index 0bf6ca1..0000000 --- a/sale_purchase_no_product_template_menu/view.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - Products - product.product - tree,form,kanban - {'search_default_filter_to_purchase': 1} - - - - - - - - - - - - Products - product.product - tree,form,kanban - {'search_default_filter_to_sell': 1} - - - - - - - - - - - - - Product Templates - tree,form,kanban - - {} - - - - - - - - - tree,form,kanban - - - - diff --git a/sale_stock_usability/__manifest__.py b/sale_stock_usability/__manifest__.py index 1d9c449..f925052 100644 --- a/sale_stock_usability/__manifest__.py +++ b/sale_stock_usability/__manifest__.py @@ -28,5 +28,5 @@ This module has been written by Alexis de Lattre from Akretion - - - - Inventory form view - stock_inventory_usability extension - stock.inventory - - - - 1 - - - 1 - - - 1 - - - - - - - - diff --git a/stock_no_product_template_menu/__init__.py b/stock_no_product_template_menu/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/stock_no_product_template_menu/__manifest__.py b/stock_no_product_template_menu/__manifest__.py deleted file mode 100644 index 82db039..0000000 --- a/stock_no_product_template_menu/__manifest__.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2019 Akretion France (http://www.akretion.com/) -# @author: Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - 'name': 'Stock No Product Template Menu', - 'version': '12.0.1.0.0', - 'category': 'Stock', - 'license': 'AGPL-3', - 'summary': "Replace product.template menu entries by product.product menu entries", - 'description': """ -Stock No Product Template -========================= - -This module replaces the menu entries for product.template by menu entries for product.product in the *Inventory* menu entry. With this module, the only menu entry for product.template is in the menu *Sales > Configuration > Product Categories and Attributes*. - -This module also switches to the tree view by default for Product menu entries, instead of the kanban view. - -This module has been written by Alexis de Lattre from Akretion . - """, - 'author': 'Akretion', - 'website': 'http://www.akretion.com', - 'depends': ['stock'], - 'data': ['view.xml'], - 'installable': True, -} diff --git a/stock_no_product_template_menu/view.xml b/stock_no_product_template_menu/view.xml deleted file mode 100644 index 081064b..0000000 --- a/stock_no_product_template_menu/view.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - diff --git a/stock_picking_type_default_partner/__manifest__.py b/stock_picking_type_default_partner/__manifest__.py index 6ee5c77..d8a1826 100644 --- a/stock_picking_type_default_partner/__manifest__.py +++ b/stock_picking_type_default_partner/__manifest__.py @@ -21,5 +21,5 @@ This module has been written by Alexis de Lattre from Akretion -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -{ - "name": "Stock relation usability", - "summary": "SUMMARY", - "version": "14.0.1.0.0", - "category": "Inventory, Logistic, Storage", - "website": "http://www.akretion.com", - "author": "Akretion", - "license": "AGPL-3", - "application": False, - "installable": True, - "depends": [ - "stock", - "purchase", - ], - "data": [ - "views/stock_picking.xml", - ], - "demo": [], - "qweb": [], -} diff --git a/stock_reception_usability/models/__init__.py b/stock_reception_usability/models/__init__.py deleted file mode 100644 index ede7a8e..0000000 --- a/stock_reception_usability/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import stock_move - diff --git a/stock_reception_usability/models/stock_move.py b/stock_reception_usability/models/stock_move.py deleted file mode 100644 index bba5408..0000000 --- a/stock_reception_usability/models/stock_move.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2021 Akretion (). -# @author Kévin Roche -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import api, fields, models - - -class StockMove(models.Model): - _inherit = "stock.move" - - location_dest_list = fields.Text( - string="Locations", compute="_compute_locations_dest_list" - ) - - @api.depends( - "move_line_ids", "move_line_ids.location_dest_id", "move_line_ids.qty_done" - ) - def _compute_locations_dest_list(self): - for move in self: - data = [] - separator = ", " - dest_list = move.move_line_ids.location_dest_id - for dest in dest_list: - lines_qty = move.move_line_ids.search( - [("move_id", "=", move.id), ("location_dest_id", "=", dest.id)] - ).mapped("qty_done") - quantity = int(sum(lines_qty)) - location = dest.name - data.append("{}: {}".format(quantity, location)) - move.location_dest_list = separator.join(data) - - def _compute_is_quantity_done_editable(self): - super()._compute_is_quantity_done_editable() - for move in self: - if len(move.move_line_ids) == 1 and move.show_details_visible: - move.is_quantity_done_editable = True diff --git a/stock_reception_usability/views/stock_picking.xml b/stock_reception_usability/views/stock_picking.xml deleted file mode 100644 index a15d02d..0000000 --- a/stock_reception_usability/views/stock_picking.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - stock.picking - - - - - - - {'column_invisible': [('parent.state', '=', 'done')]} - - - - diff --git a/stock_usability/__manifest__.py b/stock_usability/__manifest__.py index 5a59eeb..c66e7cd 100644 --- a/stock_usability/__manifest__.py +++ b/stock_usability/__manifest__.py @@ -40,5 +40,5 @@ This module has been written by Alexis de Lattre from Akretion