From 3a992a33e9b33e78e6399b0c27130f3bb2077930 Mon Sep 17 00:00:00 2001 From: Oso Tranquilo Date: Tue, 2 Mar 2021 08:57:18 +0100 Subject: [PATCH] [ADD] 14.0 pms housekeeping (#44) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [IMP] housekeeping first commint * [ADD] Demo data * [ADD] Models * [FIX] demo notes * [IMP] Housekeeping basics * [IMP] PMS Housekeeping Task and Rack management * [FIX] Icons and date parameter * [ADD] Today tasks kanban * [ADD] Housekeeping form View * [ADD] Housekeeping Lost & Found * [ADD] Precommit and README Co-authored-by: Darío Lodeiros --- pms/views/pms_room_views.xml | 1 + pms_housekeeping/README.rst | 78 ++++ pms_housekeeping/__init__.py | 1 + pms_housekeeping/__manifest__.py | 29 ++ pms_housekeeping/data/cron_jobs.xml | 21 + pms_housekeeping/demo/pms_housekeeping.xml | 65 +++ pms_housekeeping/models/__init__.py | 7 + pms_housekeeping/models/pms_housekeeping.py | 42 ++ .../models/pms_housekeeping_task.py | 32 ++ pms_housekeeping/models/pms_reservation.py | 13 + pms_housekeeping/models/pms_room.py | 140 ++++++ pms_housekeeping/readme/CONTRIBUTORS.rst | 2 + pms_housekeeping/readme/DESCRIPTION.rst | 5 + pms_housekeeping/security/ir.model.access.csv | 3 + pms_housekeeping/static/description/icon.png | Bin 0 -> 36423 bytes .../static/description/index.html | 423 ++++++++++++++++++ .../views/pms_housekeeping_task_view.xml | 34 ++ .../views/pms_housekeeping_views.xml | 257 +++++++++++ .../views/pms_reservation_view.xml | 15 + pms_housekeeping/views/pms_room_view.xml | 212 +++++++++ .../odoo/addons/pms_housekeeping | 1 + setup/pms_housekeeping/setup.py | 6 + 22 files changed, 1387 insertions(+) create mode 100644 pms_housekeeping/README.rst create mode 100644 pms_housekeeping/__init__.py create mode 100644 pms_housekeeping/__manifest__.py create mode 100644 pms_housekeeping/data/cron_jobs.xml create mode 100644 pms_housekeeping/demo/pms_housekeeping.xml create mode 100644 pms_housekeeping/models/__init__.py create mode 100644 pms_housekeeping/models/pms_housekeeping.py create mode 100644 pms_housekeeping/models/pms_housekeeping_task.py create mode 100644 pms_housekeeping/models/pms_reservation.py create mode 100644 pms_housekeeping/models/pms_room.py create mode 100644 pms_housekeeping/readme/CONTRIBUTORS.rst create mode 100644 pms_housekeeping/readme/DESCRIPTION.rst create mode 100644 pms_housekeeping/security/ir.model.access.csv create mode 100644 pms_housekeeping/static/description/icon.png create mode 100644 pms_housekeeping/static/description/index.html create mode 100644 pms_housekeeping/views/pms_housekeeping_task_view.xml create mode 100644 pms_housekeeping/views/pms_housekeeping_views.xml create mode 100644 pms_housekeeping/views/pms_reservation_view.xml create mode 100644 pms_housekeeping/views/pms_room_view.xml create mode 120000 setup/pms_housekeeping/odoo/addons/pms_housekeeping create mode 100644 setup/pms_housekeeping/setup.py diff --git a/pms/views/pms_room_views.xml b/pms/views/pms_room_views.xml index 9d3d47e37..0ffc2851b 100644 --- a/pms/views/pms_room_views.xml +++ b/pms/views/pms_room_views.xml @@ -3,6 +3,7 @@ pms.room.form pms.room +
diff --git a/pms_housekeeping/README.rst b/pms_housekeeping/README.rst new file mode 100644 index 000000000..15640e22b --- /dev/null +++ b/pms_housekeeping/README.rst @@ -0,0 +1,78 @@ +============ +Housekeeping +============ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpms-lightgray.png?logo=github + :target: https://github.com/OCA/pms/tree/14.0/pms_housekeeping + :alt: OCA/pms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pms-14-0/pms-14-0-pms_housekeeping + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/293/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is an all-in-one property management system (PMS) focused on medium-sized hotels +for managing every aspect of your property's daily operations. + +You can manage hotel properties with multi-hotel and multi-company support, including your rooms inventory, +reservations, check-in, daily reports, board services, rate and availability plans among other hotel functionalities. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Jose Luis Algara + +Contributors +~~~~~~~~~~~~ + +* Jose Luis Algara +* Darío Lodeiros + +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/pms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pms_housekeeping/__init__.py b/pms_housekeeping/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/pms_housekeeping/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/pms_housekeeping/__manifest__.py b/pms_housekeeping/__manifest__.py new file mode 100644 index 000000000..ca3528f27 --- /dev/null +++ b/pms_housekeeping/__manifest__.py @@ -0,0 +1,29 @@ +# Copyright 2020-21 Jose Luis Algara (Alda Hotels ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Housekeeping", + "version": "14.0.1.0.1", + "author": "Jose Luis Algara, " "Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": True, + "category": "pms", + "website": "https://github.com/OCA/pms", + "depends": [ + "pms", + "hr", + ], + "data": [ + # "wizard/housekeeping_rack.xml", + "views/pms_room_view.xml", + "views/pms_reservation_view.xml", + "views/pms_housekeeping_task_view.xml", + "views/pms_housekeeping_views.xml", + "security/ir.model.access.csv", + "data/cron_jobs.xml", + ], + "demo": [ + "demo/pms_housekeeping.xml", + ], + "installable": True, +} diff --git a/pms_housekeeping/data/cron_jobs.xml b/pms_housekeeping/data/cron_jobs.xml new file mode 100644 index 000000000..dcab72383 --- /dev/null +++ b/pms_housekeeping/data/cron_jobs.xml @@ -0,0 +1,21 @@ + + + + + + Automatic add all today housekeeping tasks + 1 + + days + -1 + + code + + + model.add_all_today_tasks() + + + diff --git a/pms_housekeeping/demo/pms_housekeeping.xml b/pms_housekeeping/demo/pms_housekeeping.xml new file mode 100644 index 000000000..e94183ba3 --- /dev/null +++ b/pms_housekeeping/demo/pms_housekeeping.xml @@ -0,0 +1,65 @@ + + + + + + Full clean + exit + + + Soft clean + occupied + + + Review + + + Inspect + + exit + + + Inspect + + occupied + + + + + + + to_do + + + + + + to_do + + + + + + draft + + + + + + draft + + + Need clean it again + + + + to_do + + + + + + draft + + + diff --git a/pms_housekeeping/models/__init__.py b/pms_housekeeping/models/__init__.py new file mode 100644 index 000000000..4ec8da670 --- /dev/null +++ b/pms_housekeeping/models/__init__.py @@ -0,0 +1,7 @@ +# Copyright 2021 Jose Luis Algara +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import pms_housekeeping_task +from . import pms_housekeeping +from . import pms_reservation +from . import pms_room diff --git a/pms_housekeeping/models/pms_housekeeping.py b/pms_housekeeping/models/pms_housekeeping.py new file mode 100644 index 000000000..f97a935d9 --- /dev/null +++ b/pms_housekeeping/models/pms_housekeeping.py @@ -0,0 +1,42 @@ +# Copyright 2020 Jose Luis Algara (Alda Hotels ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HouseKeeping(models.Model): + _name = "pms.housekeeping" + _description = "HouseKeeping" + # HouseKeeping 'log' + + # Fields declaration + + task_date = fields.Date( + string="Clean date", default=lambda self: fields.Datetime.now(), required=True + ) + task_start = fields.Datetime(string="Task start at") + task_end = fields.Datetime(string="Task end at") + room_id = fields.Many2one("pms.room", string="Room") + employee_id = fields.Many2one("hr.employee", string="Employee") + task_id = fields.Many2one("pms.housekeeping.task", string="Task", required=True) + notes = fields.Text("Internal Notes") + lostfound = fields.Text("Lost and Found") + state = fields.Selection( + string="Task State", + selection=[ + ("draft", "Draft"), + ("to_do", "To Do"), + ("in_progress", "In Progress"), + ("done", "Done"), + ], + default="draft", + ) + color = fields.Integer("Color Index") + + # Default Methods ang Gets + def name_get(self): + result = [] + for task in self: + name = task.task_id.name + result.append((task.id, name)) + return result diff --git a/pms_housekeeping/models/pms_housekeeping_task.py b/pms_housekeeping/models/pms_housekeeping_task.py new file mode 100644 index 000000000..86c180cc2 --- /dev/null +++ b/pms_housekeeping/models/pms_housekeeping_task.py @@ -0,0 +1,32 @@ +# Copyright 2020 Jose Luis Algara (Alda Hotels ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HouseKeepingTask(models.Model): + _name = "pms.housekeeping.task" + _description = "HouseKeeping Tasks" + # HouseKeeping 'Task types' + + # Fields declaration + active = fields.Boolean("Active", default=True) + name = fields.Char("Task Name", translate=True, required=True) + pms_property_ids = fields.Many2many( + "pms.property", string="Properties", required=False, ondelete="restrict" + ) + clean_type = fields.Selection( + string="Clean type", + selection=[ + ("occupied", "Occupied"), + ("exit", "Exit"), + ("picked_up", "Picked up"), + ("staff", "Staff"), + ("clean", "Clean"), + ("inspected", "Inspected"), + ("dont_disturb", "Don't disturb"), + ], + ) + def_employee_id = fields.Many2one( + "hr.employee", string="Employee assigned by default" + ) diff --git a/pms_housekeeping/models/pms_reservation.py b/pms_housekeeping/models/pms_reservation.py new file mode 100644 index 000000000..10cd05469 --- /dev/null +++ b/pms_housekeeping/models/pms_reservation.py @@ -0,0 +1,13 @@ +# Copyright 2021 Jose Luis Algara (Alda Hotels ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class PmsRoom(models.Model): + _inherit = "pms.reservation" + + dont_disturb = fields.Boolean( + string="Dont disturb", + default=False, + ) diff --git a/pms_housekeeping/models/pms_room.py b/pms_housekeeping/models/pms_room.py new file mode 100644 index 000000000..17a31b69d --- /dev/null +++ b/pms_housekeeping/models/pms_room.py @@ -0,0 +1,140 @@ +# Copyright 2021 Jose Luis Algara (Alda Hotels ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging +from datetime import datetime, timedelta + +from odoo import fields, models + +_logger = logging.getLogger(__name__) + + +def kanban_card_color(state): + colors = { + "occupied": 2, + "exit": 3, + "picked_up": 7, + "staff": 11, + "clean": 4, + "inspected": 10, + "dont_disturb": 9, + } + return colors[state] + + +class PmsRoom(models.Model): + _inherit = "pms.room" + + housekeeping_ids = fields.One2many( + string="Housekeeping tasks", + comodel_name="pms.housekeeping", + inverse_name="room_id", + domain=[("task_date", "=", datetime.now().date())], + ) + + clean_status = fields.Selection( + string="Clean type", + selection=[ + ("occupied", "Occupied"), + ("exit", "Exit"), + ("picked_up", "Picked up"), + ("staff", "Staff"), + ("clean", "Clean"), + ("inspected", "Inspected"), + ("dont_disturb", "Don't disturb"), + ], + compute="_compute_clean_status", + # store=True, + ) + + clean_employee_id = fields.Many2one( + "hr.employee", + string="Default employee", + help="Cleaning employee assigned by default", + ) + employee_picture = fields.Binary( + string="Employee picture", related="clean_employee_id.image_1920" + ) + + # @api.depends('clean_status_now') + def _compute_clean_status(self): + for room in self: + room.clean_status = room.get_clean_status() + return + + # Business methods + def get_clean_status(self, date_clean=False, margin_days=5): + status = "NONE" + if not date_clean: + date_clean = fields.Date.today() + reservations = self.env["pms.reservation.line"].search( + [ + ("room_id", "=", self.id), + ("date", "<=", date_clean + timedelta(days=margin_days)), + ("date", ">=", date_clean - timedelta(days=margin_days)), + ] + ) + today_res = reservations.filtered( + lambda reservation: reservation.date == date_clean + ) + yesterday_res = reservations.filtered( + lambda reservation: reservation.date == date_clean - (timedelta(days=1)) + ) + lasts_res = reservations.filtered( + lambda reservation: reservation.date < date_clean + ) + + if today_res.reservation_id.reservation_type == "out": + status = "dont_disturb" + return status + if len(today_res) == 0: + if len(yesterday_res) != 0: + status = "exit" + elif len(lasts_res) != 0: + status = "clean" + else: + # TODO hace cuantos dias se limpio o repaso.?? + status = "picked_up" + return status + else: + if yesterday_res.reservation_id != today_res.reservation_id: + status = "exit" + else: + if today_res.reservation_id.reservation_type == "staff": + status = "staff" + elif today_res.reservation_id.dont_disturb: + status = "dont_disturb" + else: + status = "occupied" + # TODO hace cuantos dias que la ocupa.?? + return status + + def add_today_tasks(self): + for room in self: + tasks = self.env["pms.housekeeping.task"].search( + [("clean_type", "=", room.clean_status)] + ) + for task in tasks: + new_task = self.env["pms.housekeeping"] + employee = ( + task.def_employee_id.id + if len(task.def_employee_id) > 0 + else room.clean_employee_id.id + ) + new_task.create( + { + "room_id": room.id, + "employee_id": employee, + "task_id": task.id, + "state": "draft", + "color": kanban_card_color(room.clean_status), + } + ) + return + + def add_all_today_tasks(self): + rooms = self.env["pms.room"].search([]) + _logger.warning("Init Add All today Task") + for room in rooms: + room.add_today_tasks() + return diff --git a/pms_housekeeping/readme/CONTRIBUTORS.rst b/pms_housekeeping/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..73917ee23 --- /dev/null +++ b/pms_housekeeping/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Jose Luis Algara +* Darío Lodeiros diff --git a/pms_housekeeping/readme/DESCRIPTION.rst b/pms_housekeeping/readme/DESCRIPTION.rst new file mode 100644 index 000000000..182da89bd --- /dev/null +++ b/pms_housekeeping/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module is an all-in-one property management system (PMS) focused on medium-sized hotels +for managing every aspect of your property's daily operations. + +You can manage hotel properties with multi-hotel and multi-company support, including your rooms inventory, +reservations, check-in, daily reports, board services, rate and availability plans among other hotel functionalities. diff --git a/pms_housekeeping/security/ir.model.access.csv b/pms_housekeeping/security/ir.model.access.csv new file mode 100644 index 000000000..5c5e86eae --- /dev/null +++ b/pms_housekeeping/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +user_access_pms_housekeeping,user_access_pms_housekeeping,model_pms_housekeeping,pms.group_pms_user,1,1,1,1 +user_access_pms_housekeeping_task,user_access_pms_housekeeping_task,model_pms_housekeeping_task,pms.group_pms_user,1,1,1,1 diff --git a/pms_housekeeping/static/description/icon.png b/pms_housekeeping/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..946adacbee4c4d1725c6fa55d831bd67c46de4ce GIT binary patch literal 36423 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 RyDUBX+8^jVh_!u4PvYi}|BT5~S`%@AJ(l zbgHY{iovAQD4tw;{S2Z(Ev7{1g&Dn0z^YBb% z?gB24-Z-}#s;Th3@|*~63=K|nM{~GPcYf!wFz(X4uWw|h4S?8D=$XcY+)9bfMcxx_ zafEl9k|7rVAg88ulqj^!acdbsXcar$vaK0?I_kVzk1S@d_p=pV?A=-cdLw2Qr3Ct>peeX#DqK*f4g z1f`N7F{@@7aPS5l2QSEhcLLe!l1HQ>2Zka*C(pWIDa z76h))z)xTIiD~hmtUB=mXF}Y-Ber^X{apGNuPK049xj?9$j{#)7oPAPM*`RgR-S!N z%O?DGMVv5!tdKzw(2p>j{JLQ@SfKqheK` zy}n39jmsXT-`A4B71gA4hzEN!U=2c15N$JP@?n8f32LK9^G`c&jVdwEiZCO_N%$|0 zSLXd6MD6w8QXisAa{OB5n;kX9$NFv;ZoB1{2tVA+u%5j>5r_-oWkTTwh`dQIHN}K^ zYW84q;_Rq>!XafijAe`N^uRLgU>x#i}wS}EXcsq{!-~hs?V$vP9tJR zTETC5ywPt?hek{ljPza*=HKM5#UwtXRMt1?yAvjqouGd)q|RT?=!g>zShL! z2ouc6zt_yk>$JrPAaS=>?z{zGQ2;nN)p3s>z;8J#;iE5KBJ8j!+|;87>^pN70Hsmw&vW=XH27|txY1&8iWMD(r(Y3!w<48k^vj3Q z_u!8WZ_W9h|C7aXT8M)|%=;L8} zDZnXK`E<>xr__K0DBtw@w%9NGa>wFlFW2`o*&g5mk9T)T&b{r+ANRZ2?%pb4vS1SM zX!~92pHFPO)N^LX*W0W8*Y4txmkHWl_Srfwx90WPsr6Sk>hCw7HVrtCIDP(4 zyZU4a6^4p{skTjeE;F8`*YK|+`r()`|jVj$69+Y zWErfH{F}o&Tleve$oP4a#HY$Izhd~WxW9J!ibo}uv*%Z>T(m($-R|U*XV3dU-7f|P zheeY(r>$gUXmDY55@lde(E_e5WMBZgk(GhLBLuki6{vz~Ar}LK5O6CL15g=o6);Sh zLLg|>9z!P=#2_W0VyLnSD}a}t!^{NrB0y$>m7$mkYOI6IM6w!cCa6&XavYM?5Hq1J zM6nuTCN`^K-odmQ<{eC{Vcx;88tP6gRzuy1;%kW23W31O{IG^3@Gu=jfTNiSJck8q zNUCTxAOajEB!z&-n8E`bW;HZ+Fd`A;&PBjOQ?P0RySI}IizbkJfngv3j7%)<1%|<$ dxBoc}7^F`##szzwbOA;=gQu&X%Q~loCIBh|33LDe literal 0 HcmV?d00001 diff --git a/pms_housekeeping/static/description/index.html b/pms_housekeeping/static/description/index.html new file mode 100644 index 000000000..27d8da212 --- /dev/null +++ b/pms_housekeeping/static/description/index.html @@ -0,0 +1,423 @@ + + + + + + +Housekeeping + + + +
+

Housekeeping

+ + +

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

+

This module is an all-in-one property management system (PMS) focused on medium-sized hotels +for managing every aspect of your property’s daily operations.

+

You can manage hotel properties with multi-hotel and multi-company support, including your rooms inventory, +reservations, check-in, daily reports, board services, rate and availability plans among other hotel functionalities.

+

Table of contents

+ +
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Jose Luis Algara
  • +
+
+
+

Contributors

+
    +
  • Jose Luis Algara
  • +
  • Darío Lodeiros
  • +
+
+
+

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/pms project on GitHub.

+

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

+
+
+
+ + diff --git a/pms_housekeeping/views/pms_housekeeping_task_view.xml b/pms_housekeeping/views/pms_housekeeping_task_view.xml new file mode 100644 index 000000000..7b1c963f0 --- /dev/null +++ b/pms_housekeeping/views/pms_housekeeping_task_view.xml @@ -0,0 +1,34 @@ + + + + + Housekeeping Tasks view + pms.housekeeping.task + tree + primary + + + + + + + + + + + + + Housekeeping Tasks + pms.housekeeping.task + tree,form + + + + + diff --git a/pms_housekeeping/views/pms_housekeeping_views.xml b/pms_housekeeping/views/pms_housekeeping_views.xml new file mode 100644 index 000000000..03b50692a --- /dev/null +++ b/pms_housekeeping/views/pms_housekeeping_views.xml @@ -0,0 +1,257 @@ + + + + Housekeeping tree view + pms.housekeeping + tree + primary + + + + + + + + + + + + + + + + + + + Housekeeping form view + pms.housekeeping + form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Housekeeping today tasks kanban view + pms.housekeeping + kanban + primary + + + + + + + + + + + +
+ +
+ + +
+ +
+
+ +
+ +
+ + + Employee image + +
+
+ + + +
+
+
+
+ + + + + + + + pms.housekeeping + + + + + + + + + + + + + + + + + + + + + + + + + + + Housekeeping + pms.housekeeping + tree,form + + + + Housekeeping + pms.housekeeping + [('task_date', '=',(context_today().strftime('%Y-%m-%d')))] + + kanban,tree,form + + + + + + + + diff --git a/pms_housekeeping/views/pms_reservation_view.xml b/pms_housekeeping/views/pms_reservation_view.xml new file mode 100644 index 000000000..79131a42d --- /dev/null +++ b/pms_housekeeping/views/pms_reservation_view.xml @@ -0,0 +1,15 @@ + + + + + view.model.form + pms.reservation + + + + + + + + + diff --git a/pms_housekeeping/views/pms_room_view.xml b/pms_housekeeping/views/pms_room_view.xml new file mode 100644 index 000000000..68d64fa82 --- /dev/null +++ b/pms_housekeeping/views/pms_room_view.xml @@ -0,0 +1,212 @@ + + + + + view.model.form + pms.room + + + + + + + + + + + + + Room rack form view + pms.room + form + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + Room rack tree view + pms.room + tree + + + + + + + + + + + + + + + pms.room + + + + + + + + + + + + + + + + + + + Room rack kanban view + pms.room + kanban + primary + + + + + + + +
+ +
+ +
+ + +
+ +
+ +
+ + + +
+
+
+
+ + + + + + + Housekeeping + pms.room + kanban,tree,form + + + + diff --git a/setup/pms_housekeeping/odoo/addons/pms_housekeeping b/setup/pms_housekeeping/odoo/addons/pms_housekeeping new file mode 120000 index 000000000..b9627f033 --- /dev/null +++ b/setup/pms_housekeeping/odoo/addons/pms_housekeeping @@ -0,0 +1 @@ +../../../../pms_housekeeping \ No newline at end of file diff --git a/setup/pms_housekeeping/setup.py b/setup/pms_housekeeping/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/pms_housekeeping/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)