From 3d61235e28f2e09efa2440df7e0adb38b3654d75 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Fri, 2 Apr 2021 21:40:45 -0300 Subject: [PATCH 01/43] [ADD] add fleet_vehicle_stock --- fleet_vehicle_stock/README.rst | 120 +++++ fleet_vehicle_stock/__init__.py | 1 + fleet_vehicle_stock/__manifest__.py | 31 ++ fleet_vehicle_stock/models/__init__.py | 7 + fleet_vehicle_stock/models/fleet_vehicle.py | 66 +++ .../models/fleet_vehicle_model.py | 14 + fleet_vehicle_stock/models/product_product.py | 14 + .../models/product_template.py | 52 ++ fleet_vehicle_stock/models/stock_move.py | 42 ++ .../models/stock_picking_type.py | 15 + .../models/stock_production_lot.py | 15 + fleet_vehicle_stock/readme/CONFIGURE.rst | 22 + fleet_vehicle_stock/readme/CONTRIBUTORS.rst | 1 + fleet_vehicle_stock/readme/CREDITS.rst | 3 + fleet_vehicle_stock/readme/DESCRIPTION.rst | 1 + fleet_vehicle_stock/readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 461 ++++++++++++++++++ fleet_vehicle_stock/tests/__init__.py | 4 + .../tests/test_fleet_vehicle.py | 98 ++++ fleet_vehicle_stock/views/fleet_vehicle.xml | 38 ++ .../views/fleet_vehicle_model.xml | 22 + fleet_vehicle_stock/views/product_product.xml | 42 ++ .../views/product_template.xml | 39 ++ .../views/stock_picking_type.xml | 20 + .../views/stock_production_lot.xml | 28 ++ 26 files changed, 1158 insertions(+) create mode 100644 fleet_vehicle_stock/README.rst create mode 100644 fleet_vehicle_stock/__init__.py create mode 100644 fleet_vehicle_stock/__manifest__.py create mode 100644 fleet_vehicle_stock/models/__init__.py create mode 100644 fleet_vehicle_stock/models/fleet_vehicle.py create mode 100644 fleet_vehicle_stock/models/fleet_vehicle_model.py create mode 100644 fleet_vehicle_stock/models/product_product.py create mode 100644 fleet_vehicle_stock/models/product_template.py create mode 100644 fleet_vehicle_stock/models/stock_move.py create mode 100644 fleet_vehicle_stock/models/stock_picking_type.py create mode 100644 fleet_vehicle_stock/models/stock_production_lot.py create mode 100644 fleet_vehicle_stock/readme/CONFIGURE.rst create mode 100644 fleet_vehicle_stock/readme/CONTRIBUTORS.rst create mode 100644 fleet_vehicle_stock/readme/CREDITS.rst create mode 100644 fleet_vehicle_stock/readme/DESCRIPTION.rst create mode 100644 fleet_vehicle_stock/readme/USAGE.rst create mode 100644 fleet_vehicle_stock/static/description/icon.png create mode 100644 fleet_vehicle_stock/static/description/index.html create mode 100644 fleet_vehicle_stock/tests/__init__.py create mode 100644 fleet_vehicle_stock/tests/test_fleet_vehicle.py create mode 100644 fleet_vehicle_stock/views/fleet_vehicle.xml create mode 100644 fleet_vehicle_stock/views/fleet_vehicle_model.xml create mode 100644 fleet_vehicle_stock/views/product_product.xml create mode 100644 fleet_vehicle_stock/views/product_template.xml create mode 100644 fleet_vehicle_stock/views/stock_picking_type.xml create mode 100644 fleet_vehicle_stock/views/stock_production_lot.xml diff --git a/fleet_vehicle_stock/README.rst b/fleet_vehicle_stock/README.rst new file mode 100644 index 000000000..8b5839d19 --- /dev/null +++ b/fleet_vehicle_stock/README.rst @@ -0,0 +1,120 @@ +=================== +Fleet Vehicle Stock +=================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Ffleet-lightgray.png?logo=github + :target: https://github.com/OCA/fleet/tree/12.0/fleet_vehicle_stock + :alt: OCA/fleet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/fleet-12-0/fleet-12-0-fleet_vehicle_stock + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/291/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is an add-on for the Fleet application in Odoo. It allows you to track your Fleet Vehicles in stock moves. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Products can be automatically converted into Fleet Vehicle. +This is only available only for products tracked by serial number. +This needs to be enabled both on Operation Types and Products. +For example, we may want to create the Fleet Vehicle on Delivery, +or on Receipts. + +To enable on Products: + +* Go to Inventory > Master Data > Products +* Open the Product form, Inventory tab +* On the "Traceability" section, make sure + "Tracking" is set to "By Unique Serial Number" +* Enable the "Creates Fleet Vehicle" checkbox +* Open Fleet tab +* Select Fleet Vehicle Model + +To enable on Operation Types: + +* Go to Inventory > Configuration > Operation Types +* Select the intended Operation Type ("Receipts" for example) +* On the "Traceability" section, enable the + "Create Fleet Vehicle" checkbox + +Usage +===== + +A completed stock move for a properly configured Product on a configured +stock Operation Type will automatically create a fleet vehicle. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Escodoo + +Contributors +~~~~~~~~~~~~ + +* Marcel Savegnago + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Escodoo - `https://www.escodoo.com.br `_ + +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. + +.. |maintainer-marcelsavegnago| image:: https://github.com/marcelsavegnago.png?size=40px + :target: https://github.com/marcelsavegnago + :alt: marcelsavegnago + +Current `maintainer `__: + +|maintainer-marcelsavegnago| + +This module is part of the `OCA/fleet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fleet_vehicle_stock/__init__.py b/fleet_vehicle_stock/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/fleet_vehicle_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/fleet_vehicle_stock/__manifest__.py b/fleet_vehicle_stock/__manifest__.py new file mode 100644 index 000000000..f4cc9b100 --- /dev/null +++ b/fleet_vehicle_stock/__manifest__.py @@ -0,0 +1,31 @@ +# Copyright 2021 - TODAY, Escodoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +{ + 'name': 'Fleet Vehicle Stock', + 'summary': """ + This module is an add-on for the Fleet application in Odoo. It allows + you to track your Fleet Vehicles in stock moves.""", + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'Escodoo,Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/fleet', + 'category': 'Human Resources/Fleet', + 'images': ['static/description/banner.png'], + 'maintainers': ['marcelsavegnago'], + 'depends': [ + 'stock', + 'fleet_vehicle_notebook', + ], + 'data': [ + 'views/stock_production_lot.xml', + 'views/stock_picking_type.xml', + 'views/product_template.xml', + 'views/product_product.xml', + 'views/fleet_vehicle.xml', + 'views/fleet_vehicle_model.xml', + ], + 'demo': [ + ], +} diff --git a/fleet_vehicle_stock/models/__init__.py b/fleet_vehicle_stock/models/__init__.py new file mode 100644 index 000000000..061ee23f7 --- /dev/null +++ b/fleet_vehicle_stock/models/__init__.py @@ -0,0 +1,7 @@ +from . import fleet_vehicle_model +from . import fleet_vehicle +from . import product_template +from . import stock_picking_type +from . import stock_production_lot +from . import stock_move +from . import product_product diff --git a/fleet_vehicle_stock/models/fleet_vehicle.py b/fleet_vehicle_stock/models/fleet_vehicle.py new file mode 100644 index 000000000..caa2ca05d --- /dev/null +++ b/fleet_vehicle_stock/models/fleet_vehicle.py @@ -0,0 +1,66 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class FleetVehicle(models.Model): + + _inherit = 'fleet.vehicle' + + product_id = fields.Many2one( + 'product.product', + string='Product', + ) + lot_id = fields.Many2one( + 'stock.production.lot', + string='Serial #', + ) + current_stock_location_id = fields.Many2one( + 'stock.location', string='Current Inventory Location', + compute='_compute_current_stock_loc_id') + + @api.depends('product_id', 'lot_id') + def _compute_current_stock_loc_id(self): + for rec in self: + if rec.lot_id: + quants = self.env['stock.quant'].search( + [('lot_id', '=', rec.lot_id.id)], order="id desc", + limit=1) + if quants and quants.location_id: + rec.current_stock_location_id = \ + quants.location_id.id + else: + rec.current_stock_location_id = False + else: + rec.current_stock_location_id = False + + @api.onchange('model_id') + def _onchange_model(self): + for rec in self: + rec.product_id = rec.model_id.product_id.id + + @api.onchange('product_id') + def _onchange_product(self): + for rec in self: + rec.lot_id = False + rec.current_stock_location_id = False + + @api.model + def create(self, vals): + res = super(FleetVehicle, self).create(vals) + if res.lot_id: + if 'lot_id' in vals: + res.lot_id.fleet_vehicle_id = res.id + return res + + @api.multi + def write(self, vals): + for rec in self: + prev_lot = rec.lot_id + res = super(FleetVehicle, rec).write(vals) + if prev_lot and (prev_lot != rec.lot_id): + prev_lot.fleet_vehicle_id = False + if rec.lot_id and 'lot_id' in vals: + rec.lot_id.fleet_vehicle_id = rec.id + return res diff --git a/fleet_vehicle_stock/models/fleet_vehicle_model.py b/fleet_vehicle_stock/models/fleet_vehicle_model.py new file mode 100644 index 000000000..0286df860 --- /dev/null +++ b/fleet_vehicle_stock/models/fleet_vehicle_model.py @@ -0,0 +1,14 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FleetVehicleModel(models.Model): + + _inherit = 'fleet.vehicle.model' + + product_id = fields.Many2one( + 'product.product', + string='Default Product', + ) diff --git a/fleet_vehicle_stock/models/product_product.py b/fleet_vehicle_stock/models/product_product.py new file mode 100644 index 000000000..adef1d55a --- /dev/null +++ b/fleet_vehicle_stock/models/product_product.py @@ -0,0 +1,14 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductProduct(models.Model): + + _inherit = 'product.product' + + fleet_vehicle_model_id = fields.Many2one( + 'fleet.vehicle.model', + string='Vehicle Model', + ) diff --git a/fleet_vehicle_stock/models/product_template.py b/fleet_vehicle_stock/models/product_template.py new file mode 100644 index 000000000..f622e75db --- /dev/null +++ b/fleet_vehicle_stock/models/product_template.py @@ -0,0 +1,52 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import pycompat + + +class ProductTemplate(models.Model): + + _inherit = 'product.template' + + create_fleet_vehicle = fields.Boolean( + string='Creates a Fleet Vehicle' + ) + fleet_vehicle_model_id = fields.Many2one( + 'fleet.vehicle.model', compute='_compute_fleet_vehicle_model_id', + inverse='_set_fleet_vehicle_model_id', store=True, string='Vehicle Model') + + @api.depends('product_variant_ids', 'product_variant_ids.fleet_vehicle_model_id') + def _compute_fleet_vehicle_model_id(self): + unique_variants = self.filtered( + lambda template: len(template.product_variant_ids) == 1) + for template in unique_variants: + template.fleet_vehicle_model_id = \ + template.product_variant_ids.fleet_vehicle_model_id + for template in (self - unique_variants): + template.fleet_vehicle_model_id = False + + @api.one + def _set_fleet_vehicle_model_id(self): + if len(self.product_variant_ids) == 1: + self.product_variant_ids.fleet_vehicle_model_id = \ + self.fleet_vehicle_model_id + + @api.model_create_multi + def create(self, vals_list): + templates = super(ProductTemplate, self).create(vals_list) + for template, vals in pycompat.izip(templates, vals_list): + related_vals = {} + if vals.get('fleet_vehicle_model_id'): + related_vals['fleet_vehicle_model_id'] = vals['fleet_vehicle_model_id'] + if related_vals: + template.write(related_vals) + return templates + + _sql_constraints = [ + ('non_product_tracking_for_vehicle_model', + "CHECK((tracking != 'serial' AND fleet_vehicle_model_id IS NULL) " + "OR (tracking = 'serial'))", + "It is mandatory to configure the traceability by serial number in order " + "to be able to configure the vehicle model of the fleet in this product."), + ] diff --git a/fleet_vehicle_stock/models/stock_move.py b/fleet_vehicle_stock/models/stock_move.py new file mode 100644 index 000000000..d21512714 --- /dev/null +++ b/fleet_vehicle_stock/models/stock_move.py @@ -0,0 +1,42 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, _ +from odoo.exceptions import UserError + + +class StockMove(models.Model): + _inherit = "stock.move" + + def _prepare_vehicle_values(self, move_line): + return {'name': '%s (%s)' % ( + move_line.product_id.name, move_line.lot_id.name), + 'model_id': move_line.product_id.fleet_vehicle_model_id.id, + 'product_id': move_line.product_id.id, + 'lot_id': move_line.lot_id.id, + 'current_stock_location_id': move_line.location_dest_id.id} + + def _action_done(self): + res = super()._action_done() + for rec in self: + + if ( + rec.product_id.product_tmpl_id.create_fleet_vehicle + and not rec.product_id.fleet_vehicle_model_id + ): + raise UserError( + _("The product '%s' is configure to create a fleet " + "vehicle but vehicle model is not configured in the " + "product.") % rec.product_id.name) + + if ( + rec.state == 'done' + and rec.picking_type_id.create_fleet_vehicle + and rec.product_tmpl_id.create_fleet_vehicle + and rec.product_id.fleet_vehicle_model_id + ): + for line in rec.move_line_ids: + vals = self._prepare_vehicle_values(line) + line.lot_id.fleet_vehicle_id = \ + rec.env['fleet.vehicle'].create(vals) + return res diff --git a/fleet_vehicle_stock/models/stock_picking_type.py b/fleet_vehicle_stock/models/stock_picking_type.py new file mode 100644 index 000000000..1d1c5cc65 --- /dev/null +++ b/fleet_vehicle_stock/models/stock_picking_type.py @@ -0,0 +1,15 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockPickingType(models.Model): + + _inherit = 'stock.picking.type' + + create_fleet_vehicle = fields.Boolean( + name='Create Fleet Vehicle', + help='Products with the "Creates a Fleet Vehicle" flag' + 'will automatically be converted to an Fleet Vehicle.' + ) diff --git a/fleet_vehicle_stock/models/stock_production_lot.py b/fleet_vehicle_stock/models/stock_production_lot.py new file mode 100644 index 000000000..55073d4ed --- /dev/null +++ b/fleet_vehicle_stock/models/stock_production_lot.py @@ -0,0 +1,15 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockProductionLot(models.Model): + + _inherit = 'stock.production.lot' + + fleet_vehicle_id = fields.Many2one( + 'fleet.vehicle', + string='Fleet Vehicle', + readonly=True, + ) diff --git a/fleet_vehicle_stock/readme/CONFIGURE.rst b/fleet_vehicle_stock/readme/CONFIGURE.rst new file mode 100644 index 000000000..c91da4494 --- /dev/null +++ b/fleet_vehicle_stock/readme/CONFIGURE.rst @@ -0,0 +1,22 @@ +Products can be automatically converted into Fleet Vehicle. +This is only available only for products tracked by serial number. +This needs to be enabled both on Operation Types and Products. +For example, we may want to create the Fleet Vehicle on Delivery, +or on Receipts. + +To enable on Products: + +* Go to Inventory > Master Data > Products +* Open the Product form, Inventory tab +* On the "Traceability" section, make sure + "Tracking" is set to "By Unique Serial Number" +* Enable the "Creates Fleet Vehicle" checkbox +* Open Fleet tab +* Select Fleet Vehicle Model + +To enable on Operation Types: + +* Go to Inventory > Configuration > Operation Types +* Select the intended Operation Type ("Receipts" for example) +* On the "Traceability" section, enable the + "Create Fleet Vehicle" checkbox diff --git a/fleet_vehicle_stock/readme/CONTRIBUTORS.rst b/fleet_vehicle_stock/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..61f9287b3 --- /dev/null +++ b/fleet_vehicle_stock/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Marcel Savegnago diff --git a/fleet_vehicle_stock/readme/CREDITS.rst b/fleet_vehicle_stock/readme/CREDITS.rst new file mode 100644 index 000000000..7762abc85 --- /dev/null +++ b/fleet_vehicle_stock/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Escodoo - `https://www.escodoo.com.br `_ diff --git a/fleet_vehicle_stock/readme/DESCRIPTION.rst b/fleet_vehicle_stock/readme/DESCRIPTION.rst new file mode 100644 index 000000000..3aefb45c2 --- /dev/null +++ b/fleet_vehicle_stock/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module is an add-on for the Fleet application in Odoo. It allows you to track your Fleet Vehicles in stock moves. diff --git a/fleet_vehicle_stock/readme/USAGE.rst b/fleet_vehicle_stock/readme/USAGE.rst new file mode 100644 index 000000000..f8310b927 --- /dev/null +++ b/fleet_vehicle_stock/readme/USAGE.rst @@ -0,0 +1,2 @@ +A completed stock move for a properly configured Product on a configured +stock Operation Type will automatically create a fleet vehicle. diff --git a/fleet_vehicle_stock/static/description/icon.png b/fleet_vehicle_stock/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/fleet_vehicle_stock/static/description/index.html b/fleet_vehicle_stock/static/description/index.html new file mode 100644 index 000000000..aad6eb146 --- /dev/null +++ b/fleet_vehicle_stock/static/description/index.html @@ -0,0 +1,461 @@ + + + + + + +Fleet Vehicle Stock + + + +
+

Fleet Vehicle Stock

+ + +

Beta License: AGPL-3 OCA/fleet Translate me on Weblate Try me on Runbot

+

This module is an add-on for the Fleet application in Odoo. It allows you to track your Fleet Vehicles in stock moves.

+

Table of contents

+ +
+

Configuration

+

Products can be automatically converted into Fleet Vehicle. +This is only available only for products tracked by serial number. +This needs to be enabled both on Operation Types and Products. +For example, we may want to create the Fleet Vehicle on Delivery, +or on Receipts.

+

To enable on Products:

+
    +
  • Go to Inventory > Master Data > Products
  • +
  • Open the Product form, Inventory tab
  • +
  • On the “Traceability” section, make sure +“Tracking” is set to “By Unique Serial Number”
  • +
  • Enable the “Creates Fleet Vehicle” checkbox
  • +
  • Open Fleet tab
  • +
  • Select Fleet Vehicle Model
  • +
+

To enable on Operation Types:

+
    +
  • Go to Inventory > Configuration > Operation Types
  • +
  • Select the intended Operation Type (“Receipts” for example)
  • +
  • On the “Traceability” section, enable the +“Create Fleet Vehicle” checkbox
  • +
+
+
+

Usage

+

A completed stock move for a properly configured Product on a configured +stock Operation Type will automatically create a fleet vehicle.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Escodoo
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainer:

+

marcelsavegnago

+

This module is part of the OCA/fleet project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/fleet_vehicle_stock/tests/__init__.py b/fleet_vehicle_stock/tests/__init__.py new file mode 100644 index 000000000..5a56fa0a4 --- /dev/null +++ b/fleet_vehicle_stock/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright (C) 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from . import test_fleet_vehicle diff --git a/fleet_vehicle_stock/tests/test_fleet_vehicle.py b/fleet_vehicle_stock/tests/test_fleet_vehicle.py new file mode 100644 index 000000000..fb918c443 --- /dev/null +++ b/fleet_vehicle_stock/tests/test_fleet_vehicle.py @@ -0,0 +1,98 @@ +# Copyright (C) 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestFleetVehicle(TransactionCase): + + def setUp(self): + super(TestFleetVehicle, self).setUp() + self.vehicle = self.env['fleet.vehicle'] + self.vehicle_model = self.env['fleet.vehicle.model'] + self.brand = self.env.ref('fleet.brand_opel') + self.stock_location = self.env.ref('stock.stock_location_customers') + self.product = self.env['product.template'] + + self.vehicle_model = self.vehicle_model.create({ + 'name': 'Test Vehicle Model', + 'brand_id': self.brand.id, + }) + + product1 = self.env['product.product'].create({ + 'name': 'Product A', + 'type': 'product', + 'fleet_vehicle_model_id': self.vehicle_model.id, + 'tracking': 'serial', + }) + + lot1 = self.env['stock.production.lot'].create({ + 'name': 'serial1', + 'product_id': product1.id, + }) + + lot2 = self.env['stock.production.lot'].create({ + 'name': 'serial2', + 'product_id': product1.id, + }) + + self.env['stock.quant'].create({ + 'product_id': product1.id, + 'location_id': self.stock_location.id, + 'quantity': 1.0, + 'lot_id': lot1.id, + }) + + self.vehicle = self.vehicle.create({ + 'model_id': self.vehicle_model.id, + 'product_id': product1.id, + 'lot_id': lot1.id, + 'current_stock_location_id': self.stock_location.id, + }) + + self.vehicle_without_quant = self.vehicle.create({ + 'model_id': self.vehicle_model.id, + 'product_id': product1.id, + 'lot_id': lot2.id, + }) + + self.vehicle_without_lot_id = self.vehicle.create({ + 'model_id': self.vehicle_model.id, + 'product_id': product1.id, + }) + + self.product2 = self.product.create({ + 'name': 'Product B', + 'type': 'product', + 'fleet_vehicle_model_id': self.vehicle_model.id, + 'tracking': 'serial', + }) + + def test_onchange_product(self): + vehicle = self.vehicle + vehicle._onchange_product() + self.assertFalse(vehicle.current_stock_location_id) + + def test_onchange_model(self): + vehicle = self.vehicle + vehicle._onchange_model() + self.assertTrue(vehicle.product_id == vehicle.model_id.product_id) + + def test_compute_current_stock_loc_id(self): + vehicle = self.vehicle + vehicle._compute_current_stock_loc_id() + self.assertTrue(vehicle.current_stock_location_id == self.stock_location) + + vehicle_without_quant = self.vehicle_without_quant + vehicle_without_quant._compute_current_stock_loc_id() + self.assertTrue(vehicle_without_quant.current_stock_location_id.id is False) + + vehicle_without_lot_id = self.vehicle_without_lot_id + vehicle_without_lot_id._compute_current_stock_loc_id() + self.assertTrue(vehicle_without_lot_id.current_stock_location_id.id is False) + + def test_set_fleet_vehicle_model_id(self): + product2 = self.product2 + product2._set_fleet_vehicle_model_id() + self.assertTrue(product2.product_variant_ids.fleet_vehicle_model_id == + product2.fleet_vehicle_model_id) diff --git a/fleet_vehicle_stock/views/fleet_vehicle.xml b/fleet_vehicle_stock/views/fleet_vehicle.xml new file mode 100644 index 000000000..d71ec0fff --- /dev/null +++ b/fleet_vehicle_stock/views/fleet_vehicle.xml @@ -0,0 +1,38 @@ + + + + + + + fleet.vehicle.form (in fleet_vehicle_stock) + fleet.vehicle + + + + + + + + + + + + + + + + fleet.vehicle.search (in fleet_vehicle_stock) + fleet.vehicle + + + + + + + + + + diff --git a/fleet_vehicle_stock/views/fleet_vehicle_model.xml b/fleet_vehicle_stock/views/fleet_vehicle_model.xml new file mode 100644 index 000000000..1cdea33ba --- /dev/null +++ b/fleet_vehicle_stock/views/fleet_vehicle_model.xml @@ -0,0 +1,22 @@ + + + + + + + fleet.vehicle.model.form (in fleet_vehicle_stock) + fleet.vehicle.model + + + + + + + + + + + + + diff --git a/fleet_vehicle_stock/views/product_product.xml b/fleet_vehicle_stock/views/product_product.xml new file mode 100644 index 000000000..f670f8ec1 --- /dev/null +++ b/fleet_vehicle_stock/views/product_product.xml @@ -0,0 +1,42 @@ + + + + + + + product.product.form (in fleet_vehicle_stock) + product.product + + + + + + + + + + + + + + product.product.view.form.easy (in fleet_vehicle_stock) + product.product + + + + + + + + + + + + + diff --git a/fleet_vehicle_stock/views/product_template.xml b/fleet_vehicle_stock/views/product_template.xml new file mode 100644 index 000000000..cc1402f7a --- /dev/null +++ b/fleet_vehicle_stock/views/product_template.xml @@ -0,0 +1,39 @@ + + + + + + + product.template.form (in fleet_vehicle_stock) + product.template + + + + + + + + + + + + + + product.template.product.form (in fleet_vehicle_stock) + product.template + + + + + + + + + + + + diff --git a/fleet_vehicle_stock/views/stock_picking_type.xml b/fleet_vehicle_stock/views/stock_picking_type.xml new file mode 100644 index 000000000..cef04c357 --- /dev/null +++ b/fleet_vehicle_stock/views/stock_picking_type.xml @@ -0,0 +1,20 @@ + + + + + + + stock.picking.type.form (in fleet_vehicle_stock) + stock.picking.type + + + + + + + + + + + diff --git a/fleet_vehicle_stock/views/stock_production_lot.xml b/fleet_vehicle_stock/views/stock_production_lot.xml new file mode 100644 index 000000000..dec300ac0 --- /dev/null +++ b/fleet_vehicle_stock/views/stock_production_lot.xml @@ -0,0 +1,28 @@ + + + + + + + stock.production.lot.form (in fleet_vehicle_stock) + stock.production.lot + + + + + + + + + + + + {'search_default_group_by_product': 1, + 'default_product_id': context.get('product_id', False)} + + + + From e957db475bf56a14797e9c68bb1e8bee7a01ca55 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 13 Apr 2021 15:14:21 +0000 Subject: [PATCH 02/43] [UPD] README.rst --- fleet_vehicle_stock/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fleet_vehicle_stock/static/description/index.html b/fleet_vehicle_stock/static/description/index.html index aad6eb146..fcec90cfc 100644 --- a/fleet_vehicle_stock/static/description/index.html +++ b/fleet_vehicle_stock/static/description/index.html @@ -3,7 +3,7 @@ - + Fleet Vehicle Stock -
-

Fleet Vehicle Stock

+
+ + +Odoo Community Association + +
+

Fleet Vehicle Stock

-

Beta License: AGPL-3 OCA/fleet Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/fleet Translate me on Weblate Try me on Runboat

This module is an add-on for the Fleet application in Odoo. It allows you to track your Fleet Vehicles in stock moves.

Table of contents

@@ -388,7 +393,7 @@

Fleet Vehicle Stock

-

Configuration

+

Configuration

Products can be automatically converted into Fleet Vehicle. This is only available only for products tracked by serial number. This needs to be enabled both on Operation Types and Products. For example, we may want @@ -412,42 +417,42 @@

Configuration

-

Usage

+

Usage

A completed stock move for a properly configured Product on a configured stock Operation Type will automatically create a fleet vehicle.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub 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.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Escodoo
-

Other credits

+

Other credits

The development of this module has been financially supported by:

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -457,10 +462,11 @@

Maintainers

promote its widespread use.

Current maintainer:

marcelsavegnago

-

This module is part of the OCA/fleet project on GitHub.

+

This module is part of the OCA/fleet project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
From 5e16943419b22b6c2289aa494f5064bfac8a3441 Mon Sep 17 00:00:00 2001 From: stferraro Date: Fri, 30 Jan 2026 18:00:43 -0400 Subject: [PATCH 40/43] [MIG] fleet_vehicle_stock: Migration to 19.0 [MIG] migrate module fleet_vehicle_stock odoo 19 version [FIX] fixes test [FIX] fixed errors pre-commit --- .pylintrc | 24 ------------------- fleet_vehicle_stock/__manifest__.py | 2 +- .../models/product_template.py | 16 ++++++------- fleet_vehicle_stock/models/stock_move.py | 11 ++++----- .../tests/test_fleet_vehicle.py | 4 ---- 5 files changed, 13 insertions(+), 44 deletions(-) diff --git a/.pylintrc b/.pylintrc index f3d017a8f..745c720f7 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,5 +1,3 @@ - - [MASTER] load-plugins=pylint_odoo score=n @@ -15,13 +13,6 @@ valid-odoo-versions=19.0 [MESSAGES CONTROL] disable=all -# This .pylintrc contains optional AND mandatory checks and is meant to be -# loaded in an IDE to have it check everything, in the hope this will make -# optional checks more visible to contributors who otherwise never look at a -# green travis to see optional checks that failed. -# .pylintrc-mandatory containing only mandatory checks is used the pre-commit -# config as a blocking check. - enable=anomalous-backslash-in-string, assignment-from-none, attribute-deprecated, @@ -90,25 +81,10 @@ enable=anomalous-backslash-in-string, translation-too-many-args, translation-unsupported-format, no-write-in-compute, - # messages that do not cause the lint step to fail - consider-merging-classes-inherited, - create-user-wo-reset-password, - dangerous-filter-wo-user, deprecated-module, - file-not-used, - invalid-commit, - missing-manifest-dependency, - missing-newline-extrafiles, - missing-readme, - no-utf8-coding-comment, - odoo-addons-relative-import, - old-api7-method-defined, redefined-builtin, - too-complex, - unnecessary-utf8-coding-comment, manifest-external-assets - [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} output-format=colorized diff --git a/fleet_vehicle_stock/__manifest__.py b/fleet_vehicle_stock/__manifest__.py index 8b95d83b9..066c9023d 100644 --- a/fleet_vehicle_stock/__manifest__.py +++ b/fleet_vehicle_stock/__manifest__.py @@ -7,7 +7,7 @@ "summary": """ This module is an add-on for the Fleet application in Odoo. It allows you to track your Fleet Vehicles in stock moves.""", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "license": "AGPL-3", "author": "Escodoo,Odoo Community Association (OCA)", "website": "https://github.com/OCA/fleet", diff --git a/fleet_vehicle_stock/models/product_template.py b/fleet_vehicle_stock/models/product_template.py index b2703bb4f..bd92fb880 100644 --- a/fleet_vehicle_stock/models/product_template.py +++ b/fleet_vehicle_stock/models/product_template.py @@ -45,12 +45,10 @@ def create(self, vals_list): template.write(related_vals) return templates - _sql_constraints = [ - ( - "non_product_tracking_for_vehicle_model", - "CHECK((tracking != 'serial' AND fleet_vehicle_model_id IS NULL) " - "OR (tracking = 'serial'))", - "It is mandatory to configure the traceability by serial number in order " - "to be able to configure the vehicle model of the fleet in this product.", - ), - ] + _non_product_tracking_for_vehicle_model = models.Constraint( + "CHECK((tracking != 'serial' AND fleet_vehicle_model_id IS NULL) " + "OR (tracking = 'serial'))", + "It is mandatory to configure the traceability by serial number in " + "order to be able to configure the vehicle model of the fleet in " + "this product.", + ) diff --git a/fleet_vehicle_stock/models/stock_move.py b/fleet_vehicle_stock/models/stock_move.py index b2df76b14..728b85d0f 100644 --- a/fleet_vehicle_stock/models/stock_move.py +++ b/fleet_vehicle_stock/models/stock_move.py @@ -1,7 +1,7 @@ # Copyright 2021 - TODAY, Marcel Savegnago # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import _, models +from odoo import models from odoo.exceptions import UserError @@ -25,12 +25,11 @@ def _action_done(self, cancel_backorder=False): and not rec.product_id.fleet_vehicle_model_id ): raise UserError( - _( - "The product '%s' is configured to create a fleet " - "vehicle but vehicle model is not configured in the " - "product." + self.env._( + "Product %(product_name)s will create a fleet vehicle " + "but model is missing.", + product_name=rec.product_id.name, ) - % rec.product_id.name ) if ( diff --git a/fleet_vehicle_stock/tests/test_fleet_vehicle.py b/fleet_vehicle_stock/tests/test_fleet_vehicle.py index 4e33bb4e1..fba9b9369 100644 --- a/fleet_vehicle_stock/tests/test_fleet_vehicle.py +++ b/fleet_vehicle_stock/tests/test_fleet_vehicle.py @@ -127,7 +127,6 @@ def test_stock_move_create_vehicle(self): move = self.env["stock.move"].create( { - "name": "Test Move", "product_id": self.product1.id, "product_uom_qty": 1.0, "product_uom": self.product1.uom_id.id, @@ -171,7 +170,6 @@ def test_stock_move_skip_vehicle_creation(self): move1 = self.env["stock.move"].create( { - "name": "Test Move Skip 1", "product_id": self.product1.id, "product_uom_qty": 1.0, "product_uom": self.product1.uom_id.id, @@ -208,7 +206,6 @@ def test_stock_move_skip_vehicle_creation(self): move2 = self.env["stock.move"].create( { - "name": "Test Move Skip 2", "product_id": self.product1.id, "product_uom_qty": 1.0, "product_uom": self.product1.uom_id.id, @@ -282,7 +279,6 @@ def test_stock_move_error(self): move = self.env["stock.move"].create( { - "name": "Test Move Error", "product_id": product_no_model.id, "product_uom_qty": 1.0, "location_id": self.env.ref("stock.stock_location_suppliers").id, From abb199c72efbf9622db2ec92bafca8aad18c6381 Mon Sep 17 00:00:00 2001 From: stferraro Date: Wed, 4 Feb 2026 23:20:30 -0400 Subject: [PATCH 41/43] [FIX] remove and change pylintrc --- .pylintrc | 81 ------------------------------------------------------- 1 file changed, 81 deletions(-) diff --git a/.pylintrc b/.pylintrc index 745c720f7..0c79e8bc4 100644 --- a/.pylintrc +++ b/.pylintrc @@ -2,90 +2,9 @@ load-plugins=pylint_odoo score=n -[ODOOLINT] -readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" -manifest-required-authors=Odoo Community Association (OCA) -manifest-required-keys=license -manifest-deprecated-keys=description,active -license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 -valid-odoo-versions=19.0 - [MESSAGES CONTROL] disable=all -enable=anomalous-backslash-in-string, - assignment-from-none, - attribute-deprecated, - dangerous-default-value, - development-status-allowed, - duplicate-key, - eval-used, - license-allowed, - manifest-author-string, - manifest-deprecated-key, - manifest-required-author, - manifest-required-key, - manifest-version-format, - method-compute, - method-inverse, - method-required-super, - method-search, - pointless-statement, - pointless-string-statement, - print-used, - redundant-keyword-arg, - reimported, - return-in-init, - sql-injection, - too-few-format-args, - translation-field, - translation-required, - unreachable, - use-vim-comment, - attribute-string-redundant, - consider-merging-classes-inherited, - context-overridden, - except-pass, - invalid-commit, - manifest-maintainers-list, - missing-readme, - missing-return, - odoo-addons-relative-import, - renamed-field-parameter, - resource-not-exist, - test-folder-imported, - translation-contains-variable, - translation-positional-used, - website-manifest-key-not-valid-uri, - external-request-timeout, - bad-builtin-groupby, - category-allowed, - deprecated-name-get, - deprecated-odoo-model-method, - inheritable-method-lambda, - inheritable-method-string, - invalid-email, - manifest-behind-migrations, - manifest-data-duplicated, - missing-odoo-file, - no-raise-unlink, - no-search-all, - no-wizard-in-models, - prohibited-method-override, - prefer-env-translation, - translation-format-interpolation, - translation-format-truncated, - translation-fstring-interpolation, - translation-not-lazy, - translation-too-few-args, - translation-too-many-args, - translation-unsupported-format, - no-write-in-compute, - deprecated-module, - redefined-builtin, - manifest-external-assets - [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} output-format=colorized -reports=no From 2eb24c652e687516685e40911a566e82b19910b1 Mon Sep 17 00:00:00 2001 From: stferraro Date: Wed, 4 Feb 2026 23:36:03 -0400 Subject: [PATCH 42/43] [FIX] changes minimal pylintrc failed pre-commit --- .pylintrc | 96 +++++++++++++++++++++++++++++++++++++++++++++ .pylintrc-mandatory | 1 - 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 0c79e8bc4..a7aec2a05 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,10 +1,106 @@ + + [MASTER] load-plugins=pylint_odoo score=n +[ODOOLINT] +readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest-required-authors=Odoo Community Association (OCA) +manifest-required-keys=license +manifest-deprecated-keys=description,active +license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid-odoo-versions=19.0 + [MESSAGES CONTROL] disable=all +# This .pylintrc contains optional AND mandatory checks and is meant to be +# loaded in an IDE to have it check everything, in the hope this will make +# optional checks more visible to contributors who otherwise never look at a +# green travis to see optional checks that failed. +# .pylintrc-mandatory containing only mandatory checks is used the pre-commit +# config as a blocking check. + +enable=anomalous-backslash-in-string, + assignment-from-none, + attribute-deprecated, + dangerous-default-value, + development-status-allowed, + duplicate-key, + eval-used, + license-allowed, + manifest-author-string, + manifest-deprecated-key, + manifest-required-author, + manifest-required-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + reimported, + return-in-init, + sql-injection, + too-few-format-args, + translation-field, + translation-required, + unreachable, + use-vim-comment, + attribute-string-redundant, + consider-merging-classes-inherited, + context-overridden, + except-pass, + invalid-commit, + manifest-maintainers-list, + missing-readme, + missing-return, + odoo-addons-relative-import, + renamed-field-parameter, + resource-not-exist, + test-folder-imported, + translation-contains-variable, + translation-positional-used, + website-manifest-key-not-valid-uri, + external-request-timeout, + bad-builtin-groupby, + category-allowed, + deprecated-name-get, + deprecated-odoo-model-method, + inheritable-method-lambda, + inheritable-method-string, + invalid-email, + manifest-behind-migrations, + manifest-data-duplicated, + missing-odoo-file, + no-raise-unlink, + no-search-all, + no-wizard-in-models, + prohibited-method-override, + prefer-env-translation, + translation-format-interpolation, + translation-format-truncated, + translation-fstring-interpolation, + translation-not-lazy, + translation-too-few-args, + translation-too-many-args, + translation-unsupported-format, + no-write-in-compute, + # messages that do not cause the lint step to fail + consider-merging-classes-inherited, + deprecated-module, + invalid-commit, + missing-readme, + odoo-addons-relative-import, + redefined-builtin, + manifest-external-assets + + [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} output-format=colorized +reports=no diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index 80567de1e..3f318cf2c 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -1,4 +1,3 @@ - [MASTER] load-plugins=pylint_odoo score=n From 4a00a7b7a1af8936a921943f2634e6deaf99846d Mon Sep 17 00:00:00 2001 From: Raul Ovalle Date: Fri, 27 Feb 2026 14:46:16 -0500 Subject: [PATCH 43/43] [IMP] Update product_template.xml: Adjust required condition for fleet vehicle model --- fleet_vehicle_stock/views/product_template.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fleet_vehicle_stock/views/product_template.xml b/fleet_vehicle_stock/views/product_template.xml index fbe8aea90..f82168e14 100644 --- a/fleet_vehicle_stock/views/product_template.xml +++ b/fleet_vehicle_stock/views/product_template.xml @@ -28,11 +28,12 @@ +