diff --git a/hr_personal_equipment_stock/README.rst b/hr_personal_equipment_stock/README.rst
index 1c4ccde4ecc..c2dae0380bb 100644
--- a/hr_personal_equipment_stock/README.rst
+++ b/hr_personal_equipment_stock/README.rst
@@ -17,13 +17,13 @@ Hr Personal Equipment Stock
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github
- :target: https://github.com/OCA/hr/tree/14.0/hr_personal_equipment_stock
+ :target: https://github.com/OCA/hr/tree/16.0/hr_personal_equipment_stock
:alt: OCA/hr
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/hr-14-0/hr-14-0-hr_personal_equipment_stock
+ :target: https://translation.odoo-community.org/projects/hr-16-0/hr-16-0-hr_personal_equipment_stock
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/hr&target_branch=14.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/hr&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,7 @@ 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.
@@ -80,6 +80,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/hr `_ project on GitHub.
+This module is part of the `OCA/hr `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/hr_personal_equipment_stock/__manifest__.py b/hr_personal_equipment_stock/__manifest__.py
index 07b95a8fd7e..13c953e9379 100644
--- a/hr_personal_equipment_stock/__manifest__.py
+++ b/hr_personal_equipment_stock/__manifest__.py
@@ -5,7 +5,7 @@
"name": "Hr Personal Equipment Stock",
"summary": """
This addon allows to integrate hr_personal_equipment_request with stock""",
- "version": "14.0.1.0.0",
+ "version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "Creu Blanca,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/hr",
diff --git a/hr_personal_equipment_stock/models/hr_personal_equipment.py b/hr_personal_equipment_stock/models/hr_personal_equipment.py
index 1728648ddf3..3840031c47e 100644
--- a/hr_personal_equipment_stock/models/hr_personal_equipment.py
+++ b/hr_personal_equipment_stock/models/hr_personal_equipment.py
@@ -111,8 +111,9 @@ def _action_launch_procurement_rule(self):
return True
def _accept_request(self):
- super()._accept_request()
+ res = super()._accept_request()
self._action_launch_procurement_rule()
+ return res
def _validate_allocation_vals(self):
res = super()._validate_allocation_vals()
diff --git a/hr_personal_equipment_stock/models/stock_move.py b/hr_personal_equipment_stock/models/stock_move.py
index 6a2cb9840e6..90ddcd0cf8e 100644
--- a/hr_personal_equipment_stock/models/stock_move.py
+++ b/hr_personal_equipment_stock/models/stock_move.py
@@ -25,9 +25,10 @@ def _prepare_merge_move_sort_method(self, move):
return keys_sorted
def _action_cancel(self):
- super()._action_cancel()
+ res = super()._action_cancel()
for rec in self.sudo():
if not rec.personal_equipment_id.qty_delivered:
rec.personal_equipment_id.update({"state": "cancelled"})
else:
rec.personal_equipment_id.update({"state": "valid"})
+ return res
diff --git a/hr_personal_equipment_stock/models/stock_picking.py b/hr_personal_equipment_stock/models/stock_picking.py
index d0cc3062a75..d918a0b2e63 100644
--- a/hr_personal_equipment_stock/models/stock_picking.py
+++ b/hr_personal_equipment_stock/models/stock_picking.py
@@ -11,7 +11,7 @@ class StockPicking(models.Model):
equipment_request_id = fields.Many2one(related="group_id.equipment_request_id")
def _action_done(self):
- super()._action_done()
+ res = super()._action_done()
if self.equipment_request_id:
for move in self.move_ids_without_package:
if move.state == "done":
@@ -28,3 +28,4 @@ def _action_done(self):
if qty_done:
if qty_initial <= qty_done:
line.validate_allocation()
+ return res
diff --git a/hr_personal_equipment_stock/static/description/index.html b/hr_personal_equipment_stock/static/description/index.html
index 4576fd60886..28a161e3fa5 100644
--- a/hr_personal_equipment_stock/static/description/index.html
+++ b/hr_personal_equipment_stock/static/description/index.html
@@ -1,4 +1,3 @@
-
@@ -9,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -275,7 +275,7 @@
margin-left: 2em ;
margin-right: 2em }
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +301,7 @@
span.pre {
white-space: pre }
-span.problematic {
+span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -369,7 +369,7 @@ Hr Personal Equipment Stock
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e9bc6ce5958557b4e98dd58142582801580d20a5ffcb89549d5cad0fbe26c14d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module integrates stock with hr_personal_equipment_request module.
When the equipment request is accepted, a stock request is generated and a “stock.move” is created for each request line.
If the “stock.move” is marked as done, the corresponding allocations are marked as valid if the quantity_delivered is equal to the requested quantity.
@@ -397,7 +397,7 @@
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.
@@ -417,11 +417,13 @@
This module is maintained by the OCA.
-
+
+
+
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/hr project on GitHub.
+
This module is part of the OCA/hr project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/hr_personal_equipment_stock/tests/test_hr_personal_equipment_stock.py b/hr_personal_equipment_stock/tests/test_hr_personal_equipment_stock.py
index d5782f01275..204b0074a90 100644
--- a/hr_personal_equipment_stock/tests/test_hr_personal_equipment_stock.py
+++ b/hr_personal_equipment_stock/tests/test_hr_personal_equipment_stock.py
@@ -6,50 +6,51 @@
class TestHRPersonalEquipment(TransactionCase):
- def setUp(self):
- super().setUp()
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
- self.warehouse = self.env.ref("stock.warehouse0")
- self.company = self.env.ref("base.main_company")
- self.ressuply_loc = self.env["stock.location"].create(
+ cls.warehouse = cls.env.ref("stock.warehouse0")
+ cls.company = cls.env.ref("base.main_company")
+ cls.ressuply_loc = cls.env["stock.location"].create(
{
"name": "Warehouse Test",
- "location_id": self.warehouse.view_location_id.id,
+ "location_id": cls.warehouse.view_location_id.id,
}
)
- self.location_employee = self.env["stock.location"].create(
+ cls.location_employee = cls.env["stock.location"].create(
{
"name": "Employee Personal Equipment Virtual Location",
- "location_id": self.warehouse.view_location_id.id,
+ "location_id": cls.warehouse.view_location_id.id,
"usage": "transit",
"is_personal_equipment_location": True,
}
)
- self.route = self.env["stock.location.route"].create(
+ cls.route = cls.env["stock.location.route"].create(
{
"name": "Employee Personal Equipment Route",
"product_categ_selectable": False,
"product_selectable": True,
- "company_id": self.company.id,
+ "company_id": cls.company.id,
"sequence": 10,
}
)
- self.env["stock.rule"].create(
+ cls.env["stock.rule"].create(
{
"name": "Employee Personal Equipment Rule",
- "route_id": self.route.id,
- "location_src_id": self.ressuply_loc.id,
- "location_id": self.location_employee.id,
+ "route_id": cls.route.id,
+ "location_src_id": cls.ressuply_loc.id,
+ "location_id": cls.location_employee.id,
"action": "pull",
- "picking_type_id": self.warehouse.int_type_id.id,
+ "picking_type_id": cls.warehouse.int_type_id.id,
"procure_method": "make_to_stock",
- "warehouse_id": self.warehouse.id,
- "company_id": self.company.id,
+ "warehouse_id": cls.warehouse.id,
+ "company_id": cls.company.id,
"propagate_cancel": "False",
}
)
- self.user = (
- self.env["res.users"]
+ cls.user = (
+ cls.env["res.users"]
.sudo()
.create(
{
@@ -57,156 +58,148 @@ def setUp(self):
"login": "user@test.com",
"email": "user@test.com",
"groups_id": [
- (4, self.env.ref("base.group_user").id),
- (4, self.env.ref("hr.group_hr_user").id),
- (4, self.env.ref("stock.group_stock_manager").id),
+ (4, cls.env.ref("base.group_user").id),
+ (4, cls.env.ref("hr.group_hr_user").id),
+ (4, cls.env.ref("stock.group_stock_manager").id),
],
}
)
)
- self.employee = self.env["hr.employee"].create(
- {"name": "Employee Test", "user_id": self.user.id}
+ cls.employee = cls.env["hr.employee"].create(
+ {"name": "Employee Test", "user_id": cls.user.id}
)
- self.product_personal_equipment_1 = self.env["product.template"].create(
+ cls.product_personal_equipment_1 = cls.env["product.template"].create(
{
"name": "Product Test Personal Equipment",
"is_personal_equipment": True,
- "route_ids": [(6, 0, self.route.ids)],
+ "route_ids": [(6, 0, cls.route.ids)],
"qty_available": 100,
"type": "product",
- "uom_id": self.env.ref("uom.product_uom_unit").id,
+ "uom_id": cls.env.ref("uom.product_uom_unit").id,
}
)
- self.product_personal_equipment_2 = self.env["product.template"].create(
+ cls.product_personal_equipment_2 = cls.env["product.template"].create(
{
"name": "Service Test Personal Equipment 2",
"is_personal_equipment": True,
"type": "service",
- "uom_id": self.env.ref("uom.product_uom_unit").id,
+ "uom_id": cls.env.ref("uom.product_uom_unit").id,
}
)
lines = [
{
"name": "Personal Equipment 1",
- "product_id": self.product_personal_equipment_1.product_variant_id.id,
+ "product_id": cls.product_personal_equipment_1.product_variant_id.id,
"quantity": 3,
- "product_uom_id": self.env.ref("uom.product_uom_unit").id,
+ "product_uom_id": cls.env.ref("uom.product_uom_unit").id,
},
{
"name": "Personal Equipment 2",
- "product_id": self.product_personal_equipment_2.product_variant_id.id,
+ "product_id": cls.product_personal_equipment_2.product_variant_id.id,
"quantity": 2,
- "product_uom_id": self.env.ref("uom.product_uom_unit").id,
+ "product_uom_id": cls.env.ref("uom.product_uom_unit").id,
},
]
- self.personal_equipment_request = (
- self.env["hr.personal.equipment.request"]
- .with_user(self.user.id)
+ cls.personal_equipment_request = (
+ cls.env["hr.personal.equipment.request"]
+ .with_user(cls.user.id)
.create(
{
"name": "Personal Equipment Request Test",
"line_ids": [(0, 0, line) for line in lines],
- "location_id": self.location_employee.id,
+ "location_id": cls.location_employee.id,
}
)
)
# hr.personal.equipment.request
- def test_get_procurement_group_without_group_set(self):
- self.assertEqual(self.personal_equipment_request.state, "draft")
- self.assertFalse(self.personal_equipment_request.procurement_group_id)
- self.assertFalse(
- self.personal_equipment_request.line_ids[0].procurement_group_id
- )
- self.personal_equipment_request.accept_request()
- self.assertEqual(self.personal_equipment_request.state, "accepted")
- self.assertTrue(self.personal_equipment_request.procurement_group_id)
- self.assertTrue(
- self.personal_equipment_request.line_ids[0].procurement_group_id
- )
-
- def test_get_procurement_group_with_group_set(self):
- self.assertEqual(self.personal_equipment_request.state, "draft")
- procurement_group_id = self.env["procurement.group"].create(
+ def test_get_procurement_group_without_group_set(cls):
+ cls.assertEqual(cls.personal_equipment_request.state, "draft")
+ cls.assertFalse(cls.personal_equipment_request.procurement_group_id)
+ cls.assertFalse(cls.personal_equipment_request.line_ids[0].procurement_group_id)
+ cls.personal_equipment_request.accept_request()
+ cls.assertEqual(cls.personal_equipment_request.state, "accepted")
+ cls.assertTrue(cls.personal_equipment_request.procurement_group_id)
+ cls.assertTrue(cls.personal_equipment_request.line_ids[0].procurement_group_id)
+
+ def test_get_procurement_group_with_group_set(cls):
+ cls.assertEqual(cls.personal_equipment_request.state, "draft")
+ procurement_group_id = cls.env["procurement.group"].create(
{"move_type": "direct"}
)
- self.personal_equipment_request.procurement_group_id = procurement_group_id.id
- self.assertTrue(self.personal_equipment_request.procurement_group_id)
- self.assertTrue(
- self.personal_equipment_request.line_ids[0].procurement_group_id
- )
- self.personal_equipment_request.accept_request()
- self.assertEqual(self.personal_equipment_request.state, "accepted")
- self.assertTrue(self.personal_equipment_request.procurement_group_id)
- self.assertTrue(
- self.personal_equipment_request.line_ids[0].procurement_group_id
- )
- self.assertEqual(
- self.personal_equipment_request.procurement_group_id.id,
+ cls.personal_equipment_request.procurement_group_id = procurement_group_id.id
+ cls.assertTrue(cls.personal_equipment_request.procurement_group_id)
+ cls.assertTrue(cls.personal_equipment_request.line_ids[0].procurement_group_id)
+ cls.personal_equipment_request.accept_request()
+ cls.assertEqual(cls.personal_equipment_request.state, "accepted")
+ cls.assertTrue(cls.personal_equipment_request.procurement_group_id)
+ cls.assertTrue(cls.personal_equipment_request.line_ids[0].procurement_group_id)
+ cls.assertEqual(
+ cls.personal_equipment_request.procurement_group_id.id,
procurement_group_id.id,
)
- def test_compute_picking_count(self):
- self.assertEqual(self.personal_equipment_request.picking_count, 0)
- self.personal_equipment_request.accept_request()
- self.assertEqual(self.personal_equipment_request.picking_count, 1)
+ def test_compute_picking_count(cls):
+ cls.assertEqual(cls.personal_equipment_request.picking_count, 0)
+ cls.personal_equipment_request.accept_request()
+ cls.assertEqual(cls.personal_equipment_request.picking_count, 1)
# hr.personal.equipment
- def test_skip_procurement(self):
- self.personal_equipment_request.line_ids[0]._compute_skip_procurement()
- self.assertFalse(self.personal_equipment_request.line_ids[0].skip_procurement)
- self.personal_equipment_request.line_ids[1]._compute_skip_procurement()
- self.assertTrue(self.personal_equipment_request.line_ids[1].skip_procurement)
+ def test_skip_procurement(cls):
+ cls.personal_equipment_request.line_ids[0]._compute_skip_procurement()
+ cls.assertFalse(cls.personal_equipment_request.line_ids[0].skip_procurement)
+ cls.personal_equipment_request.line_ids[1]._compute_skip_procurement()
+ cls.assertTrue(cls.personal_equipment_request.line_ids[1].skip_procurement)
- def test_compute_qty_delivered(self):
- self.personal_equipment_request.accept_request()
- allocation = self.personal_equipment_request.line_ids[0]
+ def test_compute_qty_delivered(cls):
+ cls.personal_equipment_request.accept_request()
+ allocation = cls.personal_equipment_request.line_ids[0]
move = allocation.move_ids[0]
move.quantity_done = allocation.quantity
- picking = self.personal_equipment_request.picking_ids[0]
+ picking = cls.personal_equipment_request.picking_ids[0]
picking._action_done()
- self.assertEqual(allocation.qty_delivered, allocation.quantity)
- self.assertEqual(allocation.state, "valid")
+ cls.assertEqual(allocation.qty_delivered, allocation.quantity)
+ cls.assertEqual(allocation.state, "valid")
- def test_quantity_delivered_skip_procurement(self):
- allocation = self.personal_equipment_request.line_ids[1]
- self.personal_equipment_request.accept_request()
+ def test_quantity_delivered_skip_procurement(cls):
+ allocation = cls.personal_equipment_request.line_ids[1]
+ cls.personal_equipment_request.accept_request()
allocation.validate_allocation()
- self.assertEqual(allocation.qty_delivered, allocation.quantity)
+ cls.assertEqual(allocation.qty_delivered, allocation.quantity)
- def test_action_launch_procurement_rule_raise_error(self):
- allocation = self.personal_equipment_request.line_ids[0]
+ def test_action_launch_procurement_rule_raise_error(cls):
+ allocation = cls.personal_equipment_request.line_ids[0]
allocation.location_id = None
- with self.assertRaises(UserError):
- self.personal_equipment_request.accept_request()
+ with cls.assertRaises(UserError):
+ cls.personal_equipment_request.accept_request()
# stock.move
- def test_action_cancel_with_qty_delivered(self):
- allocation = self.personal_equipment_request.line_ids[0]
- self.personal_equipment_request.accept_request()
- self.assertEqual(allocation.state, "accepted")
- picking = self.personal_equipment_request.picking_ids[0]
+ def test_action_cancel_with_qty_delivered(cls):
+ allocation = cls.personal_equipment_request.line_ids[0]
+ cls.personal_equipment_request.accept_request()
+ cls.assertEqual(allocation.state, "accepted")
+ picking = cls.personal_equipment_request.picking_ids[0]
picking.action_cancel()
- self.assertEqual(allocation.qty_delivered, 0)
- self.assertEqual(allocation.state, "cancelled")
+ cls.assertEqual(allocation.qty_delivered, 0)
+ cls.assertEqual(allocation.state, "cancelled")
- def test_action_cancel_without_qty_delivered(self):
- allocation = self.personal_equipment_request.line_ids[0]
- self.personal_equipment_request.accept_request()
- self.assertEqual(allocation.state, "accepted")
+ def test_action_cancel_without_qty_delivered(cls):
+ allocation = cls.personal_equipment_request.line_ids[0]
+ cls.personal_equipment_request.accept_request()
+ cls.assertEqual(allocation.state, "accepted")
move = allocation.move_ids[0]
move.quantity_done = allocation.quantity - 1
- picking = self.personal_equipment_request.picking_ids[0]
+ picking = cls.personal_equipment_request.picking_ids[0]
picking._action_done()
- back_order = self.personal_equipment_request.picking_ids[1]
+ back_order = cls.personal_equipment_request.picking_ids[1]
back_order.action_cancel()
- self.assertEqual(allocation.qty_delivered, allocation.quantity - 1)
- self.assertEqual(allocation.state, "valid")
+ cls.assertEqual(allocation.qty_delivered, allocation.quantity - 1)
+ cls.assertEqual(allocation.state, "valid")
- def test_action_view_pickings(self):
- action = self.personal_equipment_request.action_view_pickings()
- self.assertEqual(action["name"], "Transfers")
+ def test_action_view_pickings(cls):
+ action = cls.personal_equipment_request.action_view_pickings()
+ cls.assertEqual(action["name"], "Transfers")