From 99ae12a4e2d17e64553727e569e596d507c27208 Mon Sep 17 00:00:00 2001 From: "Rinaldi Firdaus (Quartile)" <122415281+rinaldifirdaus@users.noreply.github.com> Date: Tue, 9 May 2023 13:21:14 +0700 Subject: [PATCH] [3409][IMP] stock_product_shelfinfo: create new model area1 & area2 and change the fields type to many2one on product.shelfinfo model #24 [IMP] stock_product_shelfinfo: create new model area1 & area2 and change the fields type to many2one on product.shelfinfo model --- stock_product_shelfinfo/README.rst | 7 ++ stock_product_shelfinfo/__manifest__.py | 4 + .../data/menuitem_data.xml | 9 ++ stock_product_shelfinfo/i18n/ja.po | 104 ++++++++++++++++-- stock_product_shelfinfo/models/__init__.py | 3 + .../models/product_shelf_area1.py | 13 +++ .../models/product_shelf_area2.py | 13 +++ .../models/product_shelf_position.py | 13 +++ .../models/product_shelfinfo.py | 22 ++-- stock_product_shelfinfo/readme/CONFIGURE.rst | 3 + .../security/ir.model.access.csv | 6 + .../static/description/index.html | 27 +++-- .../views/product_shelf_area1_views.xml | 37 +++++++ .../views/product_shelf_area2_views.xml | 37 +++++++ .../views/product_shelf_position_views.xml | 37 +++++++ .../views/product_shelfinfo_views.xml | 36 +++++- .../views/product_template_views.xml | 6 +- 17 files changed, 339 insertions(+), 38 deletions(-) create mode 100644 stock_product_shelfinfo/data/menuitem_data.xml create mode 100644 stock_product_shelfinfo/models/product_shelf_area1.py create mode 100644 stock_product_shelfinfo/models/product_shelf_area2.py create mode 100644 stock_product_shelfinfo/models/product_shelf_position.py create mode 100644 stock_product_shelfinfo/readme/CONFIGURE.rst create mode 100644 stock_product_shelfinfo/views/product_shelf_area1_views.xml create mode 100644 stock_product_shelfinfo/views/product_shelf_area2_views.xml create mode 100644 stock_product_shelfinfo/views/product_shelf_position_views.xml diff --git a/stock_product_shelfinfo/README.rst b/stock_product_shelfinfo/README.rst index ff6fd05b..3bf0e126 100644 --- a/stock_product_shelfinfo/README.rst +++ b/stock_product_shelfinfo/README.rst @@ -28,6 +28,13 @@ relevant transactions and reports to facilitate warehouse operations. .. contents:: :local: +Configuration +============= + +Go to the menu items under *Inventory > Settings > Product Shelf Info* and create +area 1, area 2 and position records to be selected in the product shelf information +accordingly. + Usage ===== diff --git a/stock_product_shelfinfo/__manifest__.py b/stock_product_shelfinfo/__manifest__.py index bbe66e42..324859ad 100644 --- a/stock_product_shelfinfo/__manifest__.py +++ b/stock_product_shelfinfo/__manifest__.py @@ -9,9 +9,13 @@ "license": "AGPL-3", "depends": ["stock"], "data": [ + "data/menuitem_data.xml", "security/ir.model.access.csv", "security/product_shelfinfo_security.xml", "reports/report_stockpicking_operations.xml", + "views/product_shelf_area1_views.xml", + "views/product_shelf_area2_views.xml", + "views/product_shelf_position_views.xml", "views/product_shelfinfo_views.xml", "views/product_template_views.xml", "views/stock_picking_views.xml", diff --git a/stock_product_shelfinfo/data/menuitem_data.xml b/stock_product_shelfinfo/data/menuitem_data.xml new file mode 100644 index 00000000..7708923c --- /dev/null +++ b/stock_product_shelfinfo/data/menuitem_data.xml @@ -0,0 +1,9 @@ + + + + diff --git a/stock_product_shelfinfo/i18n/ja.po b/stock_product_shelfinfo/i18n/ja.po index 29d458c9..15cc95e3 100644 --- a/stock_product_shelfinfo/i18n/ja.po +++ b/stock_product_shelfinfo/i18n/ja.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-20 05:24+0000\n" -"PO-Revision-Date: 2023-03-20 05:24+0000\n" +"POT-Creation-Date: 2023-05-07 02:02+0000\n" +"PO-Revision-Date: 2023-05-07 02:02+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +15,14 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__active +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__active +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__active +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__active +msgid "Active" +msgstr "有効" + #. module: stock_product_shelfinfo #. odoo-python #: code:addons/stock_product_shelfinfo/models/product_shelfinfo.py:0 @@ -22,15 +30,25 @@ msgstr "" msgid "" "Another record already exists for the given combination of product, location" " and company." -msgstr "そのプロダクト、ロケーション、会社の組み合わせに対するレコードは既に存在しています。" +msgstr "指定のプロダクト・ロケーション・会社の組み合わせで既にレコードが存在しています。" #. module: stock_product_shelfinfo -#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__area1 +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelf_area1_search_view +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelf_area2_search_view +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelf_position_search_view +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelfinfo_search_view +msgid "Archived" +msgstr "アーカイブ済" + +#. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__area1_id +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelfinfo_search_view msgid "Area1" msgstr "場所1" #. module: stock_product_shelfinfo -#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__area2 +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__area2_id +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelfinfo_search_view msgid "Area2" msgstr "場所2" @@ -40,16 +58,25 @@ msgid "Company" msgstr "会社" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__create_uid +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__create_uid +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__create_uid #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__create_uid msgid "Created by" msgstr "作成者" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__create_date +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__create_date +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__create_date #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__create_date msgid "Created on" msgstr "作成日" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__display_name +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__display_name +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__display_name #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__display_name msgid "Display Name" msgstr "表示名" @@ -65,9 +92,12 @@ msgid "Group By" msgstr "グループ化" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__id +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__id +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__id #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__id msgid "ID" -msgstr "ID" +msgstr "" #. module: stock_product_shelfinfo #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__ref @@ -75,16 +105,25 @@ msgid "Internal Reference" msgstr "内部参照" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1____last_update +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2____last_update +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position____last_update #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo____last_update msgid "Last Modified on" msgstr "最終更新日" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__write_uid +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__write_uid +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__write_uid #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__write_uid msgid "Last Updated by" msgstr "最終更新者" #. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__write_date +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__write_date +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__write_date #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__write_date msgid "Last Updated on" msgstr "最終更新日" @@ -101,7 +140,15 @@ msgid "Memo" msgstr "メモ" #. module: stock_product_shelfinfo -#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__position +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area1__name +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_area2__name +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelf_position__name +msgid "Name" +msgstr "名称" + +#. module: stock_product_shelfinfo +#: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__position_id +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelfinfo_search_view msgid "Position" msgstr "位置" @@ -112,6 +159,21 @@ msgstr "位置" msgid "Product" msgstr "プロダクト" +#. module: stock_product_shelfinfo +#: model:ir.model,name:stock_product_shelfinfo.model_product_shelf_area1 +msgid "Product Shelf Area 1" +msgstr "プロダクト棚場所1" + +#. module: stock_product_shelfinfo +#: model:ir.model,name:stock_product_shelfinfo.model_product_shelf_area2 +msgid "Product Shelf Area 2" +msgstr "プロダクト棚場所2" + +#. module: stock_product_shelfinfo +#: model:ir.ui.menu,name:stock_product_shelfinfo.menu_stock_product_shelfinfo +msgid "Product Shelf Info" +msgstr "プロダクト棚情報" + #. module: stock_product_shelfinfo #: model:ir.actions.act_window,name:stock_product_shelfinfo.action_product_shelfinfo_view #: model:ir.ui.menu,name:stock_product_shelfinfo.menu_product_shelfinfo @@ -119,6 +181,11 @@ msgstr "プロダクト" msgid "Product Shelf Information" msgstr "棚情報" +#. module: stock_product_shelfinfo +#: model:ir.model,name:stock_product_shelfinfo.model_product_shelf_position +msgid "Product Shelf Position" +msgstr "プロダクト棚位置" + #. module: stock_product_shelfinfo #: model:ir.model,name:stock_product_shelfinfo.model_product_shelfinfo #: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelfinfo_search_view @@ -138,7 +205,21 @@ msgstr "プロダクトバリアント" #. module: stock_product_shelfinfo #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_product_shelfinfo__sequence msgid "Sequence" -msgstr "シークエンス" +msgstr "順序" + +#. module: stock_product_shelfinfo +#: model:ir.actions.act_window,name:stock_product_shelfinfo.action_product_shelf_area1_view +#: model:ir.ui.menu,name:stock_product_shelfinfo.menu_product_shelf_area1_config +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelf_area1_search_view +msgid "Shelf Area 1" +msgstr "棚場所1" + +#. module: stock_product_shelfinfo +#: model:ir.actions.act_window,name:stock_product_shelfinfo.action_product_shelf_area2_view +#: model:ir.ui.menu,name:stock_product_shelfinfo.menu_product_shelf_area2_config +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelf_area2_search_view +msgid "Shelf Area 2" +msgstr "棚場所2" #. module: stock_product_shelfinfo #: model:ir.model.fields,field_description:stock_product_shelfinfo.field_stock_move__shelfinfo_src_id @@ -157,6 +238,13 @@ msgstr "棚情報(移動先)" msgid "Shelf Information" msgstr "棚情報" +#. module: stock_product_shelfinfo +#: model:ir.actions.act_window,name:stock_product_shelfinfo.action_product_shelf_position_view +#: model:ir.ui.menu,name:stock_product_shelfinfo.menu_product_shelf_position_config +#: model_terms:ir.ui.view,arch_db:stock_product_shelfinfo.product_shelf_position_search_view +msgid "Shelf Position" +msgstr "棚位置" + #. module: stock_product_shelfinfo #: model:ir.model,name:stock_product_shelfinfo.model_stock_move msgid "Stock Move" diff --git a/stock_product_shelfinfo/models/__init__.py b/stock_product_shelfinfo/models/__init__.py index 3d0a4af4..317e0e9b 100644 --- a/stock_product_shelfinfo/models/__init__.py +++ b/stock_product_shelfinfo/models/__init__.py @@ -1,4 +1,7 @@ from . import product_product +from . import product_shelf_area1 +from . import product_shelf_area2 +from . import product_shelf_position from . import product_shelfinfo from . import product_template from . import stock_move diff --git a/stock_product_shelfinfo/models/product_shelf_area1.py b/stock_product_shelfinfo/models/product_shelf_area1.py new file mode 100644 index 00000000..8faed87c --- /dev/null +++ b/stock_product_shelfinfo/models/product_shelf_area1.py @@ -0,0 +1,13 @@ +# Copyright 2023 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductShelfArea1(models.Model): + _name = "product.shelf.area1" + _description = "Product Shelf Area 1" + _order = "name" + + name = fields.Char(required=True) + active = fields.Boolean(default=True) diff --git a/stock_product_shelfinfo/models/product_shelf_area2.py b/stock_product_shelfinfo/models/product_shelf_area2.py new file mode 100644 index 00000000..e2265964 --- /dev/null +++ b/stock_product_shelfinfo/models/product_shelf_area2.py @@ -0,0 +1,13 @@ +# Copyright 2023 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductShelfArea2(models.Model): + _name = "product.shelf.area2" + _description = "Product Shelf Area 2" + _order = "name" + + name = fields.Char(required=True) + active = fields.Boolean(default=True) diff --git a/stock_product_shelfinfo/models/product_shelf_position.py b/stock_product_shelfinfo/models/product_shelf_position.py new file mode 100644 index 00000000..35214af0 --- /dev/null +++ b/stock_product_shelfinfo/models/product_shelf_position.py @@ -0,0 +1,13 @@ +# Copyright 2023 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductShelfPosition(models.Model): + _name = "product.shelf.position" + _description = "Product Shelf Position" + _order = "name" + + name = fields.Char(required=True) + active = fields.Boolean(default=True) diff --git a/stock_product_shelfinfo/models/product_shelfinfo.py b/stock_product_shelfinfo/models/product_shelfinfo.py index 2bd9c6d4..d672c058 100644 --- a/stock_product_shelfinfo/models/product_shelfinfo.py +++ b/stock_product_shelfinfo/models/product_shelfinfo.py @@ -31,12 +31,13 @@ class ProductShelfinfo(models.Model): default=lambda self: self.env.company, required=True, ) - area1 = fields.Char(required=True) - area2 = fields.Char() - position = fields.Char() + area1_id = fields.Many2one("product.shelf.area1", required=True) + area2_id = fields.Many2one("product.shelf.area2") + position_id = fields.Many2one("product.shelf.position") memo = fields.Char() ref = fields.Char("Internal Reference") sequence = fields.Integer(default=1) + active = fields.Boolean(default=True) @api.constrains("product_id", "location_id", "company_id") def _check_product_location_unique(self): @@ -57,14 +58,13 @@ def _check_product_location_unique(self): ) ) - @api.depends("area1", "area2", "position") + @api.depends("area1_id", "area2_id", "position_id") def _compute_name(self): for record in self: - record.name = record.area1 record.name = "" - if record.area1: - record.name += record.area1 - if record.area2: - record.name += "-" + record.area2 - if record.position: - record.name += "-" + record.position + if record.area1_id: + record.name += record.area1_id.name + if record.area2_id: + record.name += "-" + record.area2_id.name + if record.position_id: + record.name += "-" + record.position_id.name diff --git a/stock_product_shelfinfo/readme/CONFIGURE.rst b/stock_product_shelfinfo/readme/CONFIGURE.rst new file mode 100644 index 00000000..d167a405 --- /dev/null +++ b/stock_product_shelfinfo/readme/CONFIGURE.rst @@ -0,0 +1,3 @@ +Go to the menu items under *Inventory > Settings > Product Shelf Info* and create +area 1, area 2 and position records to be selected in the product shelf information +accordingly. diff --git a/stock_product_shelfinfo/security/ir.model.access.csv b/stock_product_shelfinfo/security/ir.model.access.csv index 410265a9..d5b1e513 100644 --- a/stock_product_shelfinfo/security/ir.model.access.csv +++ b/stock_product_shelfinfo/security/ir.model.access.csv @@ -1,3 +1,9 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_product_shelfinfo_user,access.product.shelfinfo.user,model_product_shelfinfo,stock.group_stock_user,1,0,0,0 access_product_shelfinfo_manager,access.product.shelfinfo.manager,model_product_shelfinfo,stock.group_stock_manager,1,1,1,1 +access_product_shelf_area1_user,access.product.shelf.area1.user,model_product_shelf_area1,stock.group_stock_user,1,0,0,0 +access_product_shelf_area1_manager,access.product.shelf.area1.manager,model_product_shelf_area1,stock.group_stock_manager,1,1,1,1 +access_product_shelf_area2_user,access.product.shelf.area2.user,model_product_shelf_area2,stock.group_stock_user,1,0,0,0 +access_product_shelf_area2_manager,access.product.shelf.area2.manager,model_product_shelf_area2,stock.group_stock_manager,1,1,1,1 +access_product_shelf_position_user,access.product.shelf.position.user,model_product_shelf_position,stock.group_stock_user,1,0,0,0 +access_product_shelf_position_manager,access.product.shelf.position.manager,model_product_shelf_position,stock.group_stock_manager,1,1,1,1 diff --git a/stock_product_shelfinfo/static/description/index.html b/stock_product_shelfinfo/static/description/index.html index e9dfc770..3ce6cd7c 100644 --- a/stock_product_shelfinfo/static/description/index.html +++ b/stock_product_shelfinfo/static/description/index.html @@ -374,17 +374,24 @@

Stock Product Shelf Information

Table of contents

+
+

Configuration

+

Go to the menu items under Inventory > Settings > Product Shelf Info and create +area 1, area 2 and position records to be selected in the product shelf information +accordingly.

+
-

Usage

+

Usage

Go to Inventory > Products > Product Shelf Information and create records for combinations of product, location and company. These records show in product forms (Inventory tab) as well.

@@ -393,7 +400,7 @@

Usage

report, to facilitate the picking/store operations.

-

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 smashing it by providing a detailed and welcomed @@ -401,15 +408,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

-

Maintainers

+

Maintainers

This module is part of the qrtl/axls-custom project on GitHub.

You are welcome to contribute.

diff --git a/stock_product_shelfinfo/views/product_shelf_area1_views.xml b/stock_product_shelfinfo/views/product_shelf_area1_views.xml new file mode 100644 index 00000000..5c7df9e2 --- /dev/null +++ b/stock_product_shelfinfo/views/product_shelf_area1_views.xml @@ -0,0 +1,37 @@ + + + + product.shelf.area1.tree + product.shelf.area1 + tree + + + + + + + + product.shelf.area1.search + product.shelf.area1 + + + + + + + + Shelf Area 1 + product.shelf.area1 + tree + + + diff --git a/stock_product_shelfinfo/views/product_shelf_area2_views.xml b/stock_product_shelfinfo/views/product_shelf_area2_views.xml new file mode 100644 index 00000000..0ab6f3cd --- /dev/null +++ b/stock_product_shelfinfo/views/product_shelf_area2_views.xml @@ -0,0 +1,37 @@ + + + + product.shelf.area2.tree + product.shelf.area2 + tree + + + + + + + + product.shelf.area2.search + product.shelf.area2 + + + + + + + + Shelf Area 2 + product.shelf.area2 + tree + + + diff --git a/stock_product_shelfinfo/views/product_shelf_position_views.xml b/stock_product_shelfinfo/views/product_shelf_position_views.xml new file mode 100644 index 00000000..4952b64f --- /dev/null +++ b/stock_product_shelfinfo/views/product_shelf_position_views.xml @@ -0,0 +1,37 @@ + + + + product.shelf.position.tree + product.shelf.position + tree + + + + + + + + product.shelf.position.search + product.shelf.position + + + + + + + + Shelf Position + product.shelf.position + tree + + + diff --git a/stock_product_shelfinfo/views/product_shelfinfo_views.xml b/stock_product_shelfinfo/views/product_shelfinfo_views.xml index f5c4384c..934797bc 100644 --- a/stock_product_shelfinfo/views/product_shelfinfo_views.xml +++ b/stock_product_shelfinfo/views/product_shelfinfo_views.xml @@ -24,9 +24,10 @@ /> - - - + + + + @@ -51,9 +52,9 @@ groups="base.group_multi_company" optional="show" /> - - - + + + @@ -67,7 +68,15 @@ + + + + + + + diff --git a/stock_product_shelfinfo/views/product_template_views.xml b/stock_product_shelfinfo/views/product_template_views.xml index d73e15e6..c44e12b3 100644 --- a/stock_product_shelfinfo/views/product_template_views.xml +++ b/stock_product_shelfinfo/views/product_template_views.xml @@ -23,9 +23,9 @@ groups="base.group_multi_company" optional="hide" /> - - - + + +