diff --git a/hr_personal_equipment_stock/README.rst b/hr_personal_equipment_stock/README.rst new file mode 100644 index 00000000000..becc5df0e01 --- /dev/null +++ b/hr_personal_equipment_stock/README.rst @@ -0,0 +1,106 @@ +=========================== +Hr Personal Equipment Stock +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:fc5b579fad57f746f95989e01349e102d240d01825132f2a8b935a5b2499ccfb + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fhr-lightgray.png?logo=github + :target: https://github.com/OCA/hr/tree/18.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-18-0/hr-18-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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +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. In case a service +is added to the equipment request, it will skip the procurement method. +Instead, it has to be validated from the corresponding allocation. In +case a backorder is generated and cancelled afterwards, if qty_delivered +is not null, the allocation is marked as valid. If not, it is marked as +cancelled. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +This module is auto installed if the modules +"hr_personal_equipment_request" and "stock" are installed. + +Configuration +============= + + + +Usage +===== + + + +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Creu Blanca + +Contributors +------------ + +- Alba Riera + +Other credits +------------- + + + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/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/__init__.py b/hr_personal_equipment_stock/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/hr_personal_equipment_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/hr_personal_equipment_stock/__manifest__.py b/hr_personal_equipment_stock/__manifest__.py new file mode 100644 index 00000000000..4c04d44b963 --- /dev/null +++ b/hr_personal_equipment_stock/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Hr Personal Equipment Stock", + "summary": """ + This addon allows to integrate hr_personal_equipment_request with stock""", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "Creu Blanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/hr", + "depends": ["hr_personal_equipment_request", "stock"], + "data": [ + "views/stock_location.xml", + "views/stock_move.xml", + "views/procurement_group.xml", + "views/hr_personal_equipment.xml", + "views/hr_personal_equipment_request.xml", + "views/stock_picking.xml", + ], + "auto_install": True, + "installable": True, + "application": False, +} diff --git a/hr_personal_equipment_stock/i18n/es.po b/hr_personal_equipment_stock/i18n/es.po new file mode 100644 index 00000000000..da92c9105c0 --- /dev/null +++ b/hr_personal_equipment_stock/i18n/es.po @@ -0,0 +1,128 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_personal_equipment_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-02-18 21:33+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment +msgid "Adds personal equipment information and allocation" +msgstr "Agrega información y destribución de equipo personal" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__qty_delivered +msgid "Delivered Quantity" +msgstr "Cantidad Entregada" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_move__personal_equipment_id +msgid "Employee Personal Equipment" +msgstr "Equipamiento Personal de Empleado" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_procurement_group__equipment_request_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_picking__equipment_request_id +msgid "Equipment Request" +msgstr "Solicitud de equipamiento" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_location +msgid "Inventory Locations" +msgstr "Ubicaciones de inventario" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_location__is_personal_equipment_location +msgid "Is personal equipment location?" +msgstr "Es una ubicación de equipamiento personal?" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__location_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__location_id +msgid "Location" +msgstr "Ubicación" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "" +"Moves created through this stock request will be put in this procurement " +"group. If none is given, the moves generated by procurement rules will be " +"grouped into one big picking." +msgstr "" +"Los movimientos creados a través de esta solicitud de existencias se " +"colocarán en este grupo de compras. Si no se proporciona ninguno, los " +"movimientos generados por las reglas de adquisición se agruparán en una gran " +"selección." + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_ids +msgid "Picking" +msgstr "Transferencia" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_count +msgid "Picking Count" +msgstr "Cuenta de transferencias" + +#. module: hr_personal_equipment_stock +#: model_terms:ir.ui.view,arch_db:hr_personal_equipment_stock.hr_personal_equipment_request_form_view_picking +msgid "Pickings" +msgstr "Transferencias" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_procurement_group +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "Procurement Group" +msgstr "Grupo de Adquisiciones" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__skip_procurement +msgid "Skip Procurement" +msgstr "Saltar Adquisiciones" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_move +msgid "Stock Move" +msgstr "Movimiento de stock" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__move_ids +msgid "Stock Moves" +msgstr "Movimientos de existencias" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_rule +msgid "Stock Rule" +msgstr "Regla de existencias" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment_request +msgid "This model allows to create a personal equipment request" +msgstr "Este modelo permite crear solicitudes de equipamiento personal" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_picking +msgid "Transfer" +msgstr "Transferencia" + +#~ msgid "Display Name" +#~ msgstr "Mostrar Nombre" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" diff --git a/hr_personal_equipment_stock/i18n/es_PA.po b/hr_personal_equipment_stock/i18n/es_PA.po new file mode 100644 index 00000000000..73af7edd3d3 --- /dev/null +++ b/hr_personal_equipment_stock/i18n/es_PA.po @@ -0,0 +1,113 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_personal_equipment_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es_PA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment +msgid "Adds personal equipment information and allocation" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__qty_delivered +msgid "Delivered Quantity" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_move__personal_equipment_id +msgid "Employee Personal Equipment" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_procurement_group__equipment_request_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_picking__equipment_request_id +msgid "Equipment Request" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_location +msgid "Inventory Locations" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_location__is_personal_equipment_location +msgid "Is personal equipment location?" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__location_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__location_id +msgid "Location" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "" +"Moves created through this stock request will be put in this procurement " +"group. If none is given, the moves generated by procurement rules will be " +"grouped into one big picking." +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_ids +msgid "Picking" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_count +msgid "Picking Count" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model_terms:ir.ui.view,arch_db:hr_personal_equipment_stock.hr_personal_equipment_request_form_view_picking +msgid "Pickings" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_procurement_group +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "Procurement Group" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__skip_procurement +msgid "Skip Procurement" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__move_ids +msgid "Stock Moves" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_rule +msgid "Stock Rule" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment_request +msgid "This model allows to create a personal equipment request" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/hr_personal_equipment_stock/i18n/hr_personal_equipment_stock.pot b/hr_personal_equipment_stock/i18n/hr_personal_equipment_stock.pot new file mode 100644 index 00000000000..0f8318e2a7f --- /dev/null +++ b/hr_personal_equipment_stock/i18n/hr_personal_equipment_stock.pot @@ -0,0 +1,112 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_personal_equipment_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment +msgid "Adds personal equipment information and allocation" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__qty_delivered +msgid "Delivered Quantity" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_move__personal_equipment_id +msgid "Employee Personal Equipment" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_procurement_group__equipment_request_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_picking__equipment_request_id +msgid "Equipment Request" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_location +msgid "Inventory Locations" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_location__is_personal_equipment_location +msgid "Is personal equipment location?" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__location_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__location_id +msgid "Location" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "" +"Moves created through this stock request will be put in this procurement " +"group. If none is given, the moves generated by procurement rules will be " +"grouped into one big picking." +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_ids +msgid "Picking" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_count +msgid "Picking Count" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model_terms:ir.ui.view,arch_db:hr_personal_equipment_stock.hr_personal_equipment_request_form_view_picking +msgid "Pickings" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_procurement_group +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "Procurement Group" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__skip_procurement +msgid "Skip Procurement" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__move_ids +msgid "Stock Moves" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_rule +msgid "Stock Rule" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment_request +msgid "This model allows to create a personal equipment request" +msgstr "" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/hr_personal_equipment_stock/i18n/it.po b/hr_personal_equipment_stock/i18n/it.po new file mode 100644 index 00000000000..dc5623c8a06 --- /dev/null +++ b/hr_personal_equipment_stock/i18n/it.po @@ -0,0 +1,129 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_personal_equipment_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-06-01 13:10+0000\n" +"Last-Translator: Sergio Zanchetta \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment +msgid "Adds personal equipment information and allocation" +msgstr "Aggiunge informazioni e assegnazione su attrezzatura individuale" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__qty_delivered +msgid "Delivered Quantity" +msgstr "Quantità consegnata" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_move__personal_equipment_id +msgid "Employee Personal Equipment" +msgstr "Attrezzatura individuale dipendente" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_procurement_group__equipment_request_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_picking__equipment_request_id +msgid "Equipment Request" +msgstr "Richiesta attrezzatura" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_location +msgid "Inventory Locations" +msgstr "Ubicazioni di inventario" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_stock_location__is_personal_equipment_location +msgid "Is personal equipment location?" +msgstr "È una ubicazione per attrezzatura individuale?" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__location_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__location_id +msgid "Location" +msgstr "Ubicazione" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,help:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "" +"Moves created through this stock request will be put in this procurement " +"group. If none is given, the moves generated by procurement rules will be " +"grouped into one big picking." +msgstr "" +"I movimenti creati tramite questa richiesta di magazzino verranno inseriti " +"in questo gruppo di approvvigionamento. Se non ne viene fornito nessuno, i " +"movimenti generati dalle regole di approvvigionamento verranno raggruppati " +"in un unico grande prelievo." + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_ids +msgid "Picking" +msgstr "Prelievo" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__picking_count +msgid "Picking Count" +msgstr "Conteggio prelievi" + +#. module: hr_personal_equipment_stock +#: model_terms:ir.ui.view,arch_db:hr_personal_equipment_stock.hr_personal_equipment_request_form_view_picking +msgid "Pickings" +msgstr "Prelievi" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_procurement_group +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__procurement_group_id +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment_request__procurement_group_id +msgid "Procurement Group" +msgstr "Gruppo di approvvigionamento" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__skip_procurement +msgid "Skip Procurement" +msgstr "Ignora approvvigionamento" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_move +msgid "Stock Move" +msgstr "Movimento di magazzino" + +#. module: hr_personal_equipment_stock +#: model:ir.model.fields,field_description:hr_personal_equipment_stock.field_hr_personal_equipment__move_ids +msgid "Stock Moves" +msgstr "Movimenti di magazzino" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_rule +msgid "Stock Rule" +msgstr "Regola di giacenza" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_hr_personal_equipment_request +msgid "This model allows to create a personal equipment request" +msgstr "" +"Questo modello permette di creare una richiesta attrezzatura individuale" + +#. module: hr_personal_equipment_stock +#: model:ir.model,name:hr_personal_equipment_stock.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#~ msgid "Display Name" +#~ msgstr "Nome visualizzato" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" diff --git a/hr_personal_equipment_stock/models/__init__.py b/hr_personal_equipment_stock/models/__init__.py new file mode 100644 index 00000000000..509bac30a3a --- /dev/null +++ b/hr_personal_equipment_stock/models/__init__.py @@ -0,0 +1,7 @@ +from . import hr_personal_equipment_request +from . import hr_personal_equipment +from . import procurement_group +from . import stock_picking +from . import stock_move +from . import stock_rule +from . import stock_location diff --git a/hr_personal_equipment_stock/models/hr_personal_equipment.py b/hr_personal_equipment_stock/models/hr_personal_equipment.py new file mode 100644 index 00000000000..bd6555e72d8 --- /dev/null +++ b/hr_personal_equipment_stock/models/hr_personal_equipment.py @@ -0,0 +1,121 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class HrPersonalEquipment(models.Model): + _inherit = "hr.personal.equipment" + + location_id = fields.Many2one(related="equipment_request_id.location_id") + procurement_group_id = fields.Many2one( + "procurement.group", + "Procurement Group", + readonly=True, + help="Moves created through this stock request will be put in this " + "procurement group. If none is given, the moves generated by " + "procurement rules will be grouped into one big picking.", + related="equipment_request_id.procurement_group_id", + ) + qty_delivered = fields.Float( + "Delivered Quantity", + copy=False, + compute="_compute_qty_delivered", + compute_sudo=True, + store=True, + ) + move_ids = fields.One2many( + "stock.move", "personal_equipment_id", string="Stock Moves" + ) + skip_procurement = fields.Boolean(compute="_compute_skip_procurement") + + @api.depends("state", "product_id", "product_id.type") + def _compute_skip_procurement(self): + for record in self: + record.skip_procurement = record._skip_procurement() + + @api.depends( + "move_ids.state", + "move_ids.scrapped", + "move_ids.product_uom_qty", + "move_ids.product_uom", + ) + def _compute_qty_delivered(self): + for line in self: + qty = 0.0 + for move in line.move_ids.filtered( + lambda r, line=line: r.state == "done" + and line.product_id == r.product_id + ): + qty += move.product_uom._compute_quantity( + move.product_uom_qty, line.product_uom_id + ) + line.qty_delivered = qty + + def _skip_procurement(self): + return self.product_id.type == "service" + + def _prepare_procurement_values(self, group_id=False): + """Prepare specific key for moves or other components that + will be created from a procurement rule + coming from a stock request. This method could be override + in order to add other custom key that could be used in + move/po creation. + """ + return { + "group_id": group_id or self.procurement_group_id.id or False, + "partner_id": self.employee_id.user_id.partner_id.id, + "personal_equipment_id": self.id, + } + + def _get_company(self): + return self.employee_id.company_id or self.env.company + + def _action_launch_procurement_rule(self): + """ + Launch procurement group run method with required/custom + fields generated by a + equipment request. procurement group will launch '_run_move', + '_run_buy' or '_run_manufacture' + depending on the stock request product rule. + """ + errors = [] + for allocation in self: + if allocation.skip_procurement: + continue + + values = allocation._prepare_procurement_values( + group_id=allocation.procurement_group_id + ) + try: + # We launch with sudo because potentially we could create + # objects that the user is not authorized to create, such + # as PO. + procurement = self.env["procurement.group"].Procurement( + allocation.product_id, + allocation.quantity, + allocation.product_uom_id, + allocation.location_id, + allocation.equipment_request_id.name, + allocation.equipment_request_id.name, + allocation._get_company(), + values, + ) + self.env["procurement.group"].sudo().run([procurement]) + except UserError as error: + errors.append(error.args[0]) + if errors: + raise UserError("\n".join(errors)) + return True + + def _accept_request(self): + res = super()._accept_request() + self._action_launch_procurement_rule() + return res + + def _validate_allocation_vals(self): + res = super()._validate_allocation_vals() + if self.skip_procurement: + res["qty_delivered"] = self.quantity + return res diff --git a/hr_personal_equipment_stock/models/hr_personal_equipment_request.py b/hr_personal_equipment_stock/models/hr_personal_equipment_request.py new file mode 100644 index 00000000000..66e699b46cf --- /dev/null +++ b/hr_personal_equipment_stock/models/hr_personal_equipment_request.py @@ -0,0 +1,55 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class HrPersonalEquipmentRequest(models.Model): + _inherit = "hr.personal.equipment.request" + + location_id = fields.Many2one( + "stock.location", + ondelete="cascade", + required=True, + domain=[("is_personal_equipment_location", "=", True)], + ) + procurement_group_id = fields.Many2one( + "procurement.group", + "Procurement Group", + help="Moves created through this stock request will be put in this " + "procurement group. If none is given, the moves generated by " + "procurement rules will be grouped into one big picking.", + copy=False, + ) + picking_ids = fields.One2many("stock.picking", inverse_name="equipment_request_id") + picking_count = fields.Integer(compute="_compute_picking_count") + + @api.depends("picking_ids") + def _compute_picking_count(self): + for rec in self: + rec.picking_count = len(rec.picking_ids) + + def _get_procurement_group(self): + if self.procurement_group_id: + return self.procurement_group_id.id + return ( + self.env["procurement.group"].create(self._get_procurement_group_vals()).id + ) + + def _get_procurement_group_vals(self): + return { + "move_type": "direct", + "equipment_request_id": self.id, + "partner_id": self.employee_id.user_id.partner_id.id, + } + + def _accept_request_vals(self): + result = super()._accept_request_vals() + result["procurement_group_id"] = self._get_procurement_group() + return result + + def action_view_pickings(self): + self.ensure_one() + action = self.env.ref("stock.action_picking_tree_all").sudo().read()[0] + action["domain"] = [("equipment_request_id", "=", self.id)] + return action diff --git a/hr_personal_equipment_stock/models/procurement_group.py b/hr_personal_equipment_stock/models/procurement_group.py new file mode 100644 index 00000000000..4acfe931f58 --- /dev/null +++ b/hr_personal_equipment_stock/models/procurement_group.py @@ -0,0 +1,10 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProcurementGroup(models.Model): + _inherit = "procurement.group" + + equipment_request_id = fields.Many2one("hr.personal.equipment.request") diff --git a/hr_personal_equipment_stock/models/stock_location.py b/hr_personal_equipment_stock/models/stock_location.py new file mode 100644 index 00000000000..25b36fd1fb9 --- /dev/null +++ b/hr_personal_equipment_stock/models/stock_location.py @@ -0,0 +1,14 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockLocation(models.Model): + _inherit = "stock.location" + + is_personal_equipment_location = fields.Boolean( + string="Is personal equipment location?" + ) + # This field is used for filter purpose in the + # hr.personal.equipment.request location field diff --git a/hr_personal_equipment_stock/models/stock_move.py b/hr_personal_equipment_stock/models/stock_move.py new file mode 100644 index 00000000000..7819c8ce440 --- /dev/null +++ b/hr_personal_equipment_stock/models/stock_move.py @@ -0,0 +1,26 @@ +# Copyright 2021 Creu Blanca +# 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" + personal_equipment_id = fields.Many2one( + "hr.personal.equipment", "Employee Personal Equipment" + ) + + @api.model + def _prepare_merge_moves_distinct_fields(self): + distinct_fields = super()._prepare_merge_moves_distinct_fields() + distinct_fields.append("personal_equipment_id") + return distinct_fields + + def _action_cancel(self): + 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 new file mode 100644 index 00000000000..a609f63ee09 --- /dev/null +++ b/hr_personal_equipment_stock/models/stock_picking.py @@ -0,0 +1,29 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + equipment_request_id = fields.Many2one( + related="group_id.equipment_request_id", store=True + ) + + def _action_done(self): + res = super()._action_done() + for picking in self: + if picking.equipment_request_id: + for move in picking.move_ids_without_package: + if move.state == "done": + request_lines = ( + picking.equipment_request_id.sudo().line_ids.filtered( + lambda x, move=move: x.product_id == move.product_id + ) + ) + for line in request_lines: + if line.qty_delivered: + if line.quantity <= line.qty_delivered: + line.validate_allocation() + return res diff --git a/hr_personal_equipment_stock/models/stock_rule.py b/hr_personal_equipment_stock/models/stock_rule.py new file mode 100644 index 00000000000..50534754ac6 --- /dev/null +++ b/hr_personal_equipment_stock/models/stock_rule.py @@ -0,0 +1,33 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class StockRule(models.Model): + _inherit = "stock.rule" + + def _get_stock_move_values( + self, + product_id, + product_qty, + product_uom, + location_id, + name, + origin, + company_id, + values, + ): + result = super()._get_stock_move_values( + product_id, + product_qty, + product_uom, + location_id, + name, + origin, + company_id, + values, + ) + if values.get("personal_equipment_id"): + result["personal_equipment_id"] = values.get("personal_equipment_id") + return result diff --git a/hr_personal_equipment_stock/pyproject.toml b/hr_personal_equipment_stock/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/hr_personal_equipment_stock/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/hr_personal_equipment_stock/readme/CONFIGURE.md b/hr_personal_equipment_stock/readme/CONFIGURE.md new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/hr_personal_equipment_stock/readme/CONFIGURE.md @@ -0,0 +1 @@ + diff --git a/hr_personal_equipment_stock/readme/CONTRIBUTORS.md b/hr_personal_equipment_stock/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..8cca5ca33b2 --- /dev/null +++ b/hr_personal_equipment_stock/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Alba Riera \ diff --git a/hr_personal_equipment_stock/readme/CREDITS.md b/hr_personal_equipment_stock/readme/CREDITS.md new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/hr_personal_equipment_stock/readme/CREDITS.md @@ -0,0 +1 @@ + diff --git a/hr_personal_equipment_stock/readme/DESCRIPTION.md b/hr_personal_equipment_stock/readme/DESCRIPTION.md new file mode 100644 index 00000000000..9ed035e5f5e --- /dev/null +++ b/hr_personal_equipment_stock/readme/DESCRIPTION.md @@ -0,0 +1,10 @@ +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. In case a service +is added to the equipment request, it will skip the procurement method. +Instead, it has to be validated from the corresponding allocation. In +case a backorder is generated and cancelled afterwards, if qty_delivered +is not null, the allocation is marked as valid. If not, it is marked as +cancelled. diff --git a/hr_personal_equipment_stock/readme/INSTALL.md b/hr_personal_equipment_stock/readme/INSTALL.md new file mode 100644 index 00000000000..dfde6adfc43 --- /dev/null +++ b/hr_personal_equipment_stock/readme/INSTALL.md @@ -0,0 +1,2 @@ +This module is auto installed if the modules +"hr_personal_equipment_request" and "stock" are installed. diff --git a/hr_personal_equipment_stock/readme/USAGE.md b/hr_personal_equipment_stock/readme/USAGE.md new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/hr_personal_equipment_stock/readme/USAGE.md @@ -0,0 +1 @@ + diff --git a/hr_personal_equipment_stock/static/description/icon.png b/hr_personal_equipment_stock/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/hr_personal_equipment_stock/static/description/icon.png differ diff --git a/hr_personal_equipment_stock/static/description/index.html b/hr_personal_equipment_stock/static/description/index.html new file mode 100644 index 00000000000..a0763e5ea51 --- /dev/null +++ b/hr_personal_equipment_stock/static/description/index.html @@ -0,0 +1,450 @@ + + + + + +Hr Personal Equipment Stock + + + +
+

Hr Personal Equipment Stock

+ + +

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

+

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. In case a service +is added to the equipment request, it will skip the procurement method. +Instead, it has to be validated from the corresponding allocation. In +case a backorder is generated and cancelled afterwards, if qty_delivered +is not null, the allocation is marked as valid. If not, it is marked as +cancelled.

+

Table of contents

+ +
+

Installation

+

This module is auto installed if the modules +“hr_personal_equipment_request” and “stock” are installed.

+
+ +
+

Usage

+
+
+

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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Creu Blanca
  • +
+
+ + +
+

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.

+

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/__init__.py b/hr_personal_equipment_stock/tests/__init__.py new file mode 100644 index 00000000000..a0287cbf138 --- /dev/null +++ b/hr_personal_equipment_stock/tests/__init__.py @@ -0,0 +1 @@ +from . import test_hr_personal_equipment_stock 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 new file mode 100644 index 00000000000..2c27759dae2 --- /dev/null +++ b/hr_personal_equipment_stock/tests/test_hr_personal_equipment_stock.py @@ -0,0 +1,215 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError +from odoo.tests import TransactionCase + + +class TestHRPersonalEquipment(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + 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": cls.warehouse.view_location_id.id, + } + ) + cls.location_employee = cls.env["stock.location"].create( + { + "name": "Employee Personal Equipment Virtual Location", + "location_id": cls.warehouse.view_location_id.id, + "usage": "transit", + "is_personal_equipment_location": True, + } + ) + cls.route = cls.env["stock.route"].create( + { + "name": "Employee Personal Equipment Route", + "product_categ_selectable": False, + "product_selectable": True, + "company_id": cls.company.id, + "sequence": 10, + } + ) + cls.env["stock.rule"].create( + { + "name": "Employee Personal Equipment Rule", + "route_id": cls.route.id, + "location_src_id": cls.ressuply_loc.id, + "location_dest_id": cls.location_employee.id, + "action": "pull", + "picking_type_id": cls.warehouse.int_type_id.id, + "procure_method": "make_to_stock", + "warehouse_id": cls.warehouse.id, + "company_id": cls.company.id, + "propagate_cancel": False, + } + ) + cls.user = ( + cls.env["res.users"] + .sudo() + .create( + { + "name": "Test User", + "login": "user@test.com", + "email": "user@test.com", + "groups_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), + ], + } + ) + ) + cls.employee = cls.env["hr.employee"].create( + {"name": "Employee Test", "user_id": cls.user.id} + ) + cls.product_personal_equipment_1 = cls.env["product.template"].create( + { + "name": "Product Test Personal Equipment", + "is_personal_equipment": True, + "route_ids": [(6, 0, cls.route.ids)], + "qty_available": 100, + "type": "consu", + "uom_id": cls.env.ref("uom.product_uom_unit").id, + } + ) + cls.product_personal_equipment_2 = cls.env["product.template"].create( + { + "name": "Service Test Personal Equipment 2", + "is_personal_equipment": True, + "type": "service", + "uom_id": cls.env.ref("uom.product_uom_unit").id, + } + ) + lines = [ + { + "name": "Personal Equipment 1", + "product_id": cls.product_personal_equipment_1.product_variant_id.id, + "quantity": 3, + "product_uom_id": cls.env.ref("uom.product_uom_unit").id, + }, + { + "name": "Personal Equipment 2", + "product_id": cls.product_personal_equipment_2.product_variant_id.id, + "quantity": 2, + "product_uom_id": cls.env.ref("uom.product_uom_unit").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": 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( + {"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, + 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) + + # 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_compute_qty_delivered(self): + self.personal_equipment_request.accept_request() + allocation = self.personal_equipment_request.line_ids[0] + move = allocation.move_ids[0] + move.quantity = allocation.quantity + move.picked = True + picking = self.personal_equipment_request.picking_ids[0] + picking._action_done() + self.assertEqual(allocation.qty_delivered, allocation.quantity) + self.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() + allocation.validate_allocation() + self.assertEqual(allocation.qty_delivered, allocation.quantity) + + def test_action_launch_procurement_rule_raise_error(self): + allocation = self.personal_equipment_request.line_ids[0] + allocation.location_id = None + with self.assertRaises(UserError): + self.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] + picking.action_cancel() + self.assertEqual(allocation.qty_delivered, 0) + self.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") + move = allocation.move_ids[0] + move.quantity = allocation.quantity - 1 + move.picked = True + picking = self.personal_equipment_request.picking_ids[0] + picking._action_done() + back_order = self.personal_equipment_request.picking_ids[1] + back_order.action_cancel() + self.assertEqual(allocation.qty_delivered, allocation.quantity - 1) + self.assertEqual(allocation.state, "valid") + + def test_action_view_pickings(self): + action = self.personal_equipment_request.action_view_pickings() + self.assertEqual(action["name"], "Transfers") diff --git a/hr_personal_equipment_stock/views/hr_personal_equipment.xml b/hr_personal_equipment_stock/views/hr_personal_equipment.xml new file mode 100644 index 00000000000..1cfbf4fbdd8 --- /dev/null +++ b/hr_personal_equipment_stock/views/hr_personal_equipment.xml @@ -0,0 +1,48 @@ + + + + + hr.personal.equipment.form (in hr_personal_equipment_stock) + hr.personal.equipment + + + + + + + + + + + + + 1 + + + + + hr.personal.equipment.tree (in hr_personal_equipment_stock) + hr.personal.equipment + + + + + + + + diff --git a/hr_personal_equipment_stock/views/hr_personal_equipment_request.xml b/hr_personal_equipment_stock/views/hr_personal_equipment_request.xml new file mode 100644 index 00000000000..3688f729e7f --- /dev/null +++ b/hr_personal_equipment_stock/views/hr_personal_equipment_request.xml @@ -0,0 +1,69 @@ + + + + + hr.personal.equipment.request.form (in hr_personal_equipment_stock) + hr.personal.equipment.request + + + + + + + + + + + + + + + hr.personal.equipment.request.form (in hr_personal_equipment_stock) + hr.personal.equipment.request + + + + + + + + + hr.personal.equipment.request.tree (in hr_personal_equipment_stock) + hr.personal.equipment.request + + + + + + + + diff --git a/hr_personal_equipment_stock/views/procurement_group.xml b/hr_personal_equipment_stock/views/procurement_group.xml new file mode 100644 index 00000000000..d38e0c8a57e --- /dev/null +++ b/hr_personal_equipment_stock/views/procurement_group.xml @@ -0,0 +1,17 @@ + + + + + procurement.group.form (in hr_personal_equipment_stock) + procurement.group + + + + + + + + diff --git a/hr_personal_equipment_stock/views/stock_location.xml b/hr_personal_equipment_stock/views/stock_location.xml new file mode 100644 index 00000000000..022f622c072 --- /dev/null +++ b/hr_personal_equipment_stock/views/stock_location.xml @@ -0,0 +1,15 @@ + + + + + stock.location.form (in hr_personal_equipment_stock) + stock.location + + + + + + + + diff --git a/hr_personal_equipment_stock/views/stock_move.xml b/hr_personal_equipment_stock/views/stock_move.xml new file mode 100644 index 00000000000..99d2b58a2ba --- /dev/null +++ b/hr_personal_equipment_stock/views/stock_move.xml @@ -0,0 +1,15 @@ + + + + + stock.move.form (in hr_personal_equipment_stock) + stock.move + + + + + + + + diff --git a/hr_personal_equipment_stock/views/stock_picking.xml b/hr_personal_equipment_stock/views/stock_picking.xml new file mode 100644 index 00000000000..487618a7811 --- /dev/null +++ b/hr_personal_equipment_stock/views/stock_picking.xml @@ -0,0 +1,18 @@ + + + + + stock.picking.form(in hr_personal_equipment_stock) + stock.picking + + + + + + + +