diff --git a/glasof_exporter/wizard/glasof_wizard.py b/glasof_exporter/wizard/glasof_wizard.py index 4a2b386b2..1e9ddc12d 100644 --- a/glasof_exporter/wizard/glasof_wizard.py +++ b/glasof_exporter/wizard/glasof_wizard.py @@ -174,7 +174,7 @@ class GlassofExporterWizard(models.TransientModel): else: firstname = inv.partner_id.firstname or '' lastname = inv.partner_id.lastname or '' - + worksheet.write(nrow, 0, inv.number) worksheet.write(nrow, 1, inv.date_invoice, xls_cell_format_date) worksheet.write(nrow, 2, '') @@ -209,7 +209,7 @@ class GlassofExporterWizard(models.TransientModel): worksheet.write(nrow, 21, 'S') worksheet.write(nrow, 22, '') if inv.type == 'out_refund': - worksheet.write(nrow, 23, inv.origin) + worksheet.write(nrow, 23, inv.invoice_origin) else: worksheet.write(nrow, 23, '') worksheet.write(nrow, 24, '') @@ -242,7 +242,7 @@ class GlassofExporterWizard(models.TransientModel): 'xls_invoices_binary': base64.encodestring(file_data.read()), } - + def export(self): towrite = {} if self.export_journals: diff --git a/hotel_channel_connector/models/hotel_reservation/common.py b/hotel_channel_connector/models/hotel_reservation/common.py index b1515f793..3b2918e93 100644 --- a/hotel_channel_connector/models/hotel_reservation/common.py +++ b/hotel_channel_connector/models/hotel_reservation/common.py @@ -6,8 +6,6 @@ from odoo.exceptions import UserError from odoo.addons.queue_job.job import job from odoo.addons.component.core import Component from odoo.addons.component_event import skip_if -from odoo.addons import decimal_precision as dp - class ChannelHotelReservation(models.Model): _name = 'channel.hotel.reservation' @@ -34,7 +32,7 @@ class ChannelHotelReservation(models.Model): default=False) channel_total_amount = fields.Monetary(string='Channel Total Amount', - readonly=True, digits=dp.get_precision('Product Price')) + readonly=True, digits=('Product Price')) # Inherit binding constrain becouse two reservations can have # the same external_id @@ -72,20 +70,20 @@ class ChannelHotelReservation(models.Model): return importer.fetch_bookings(dfrom, dto) @job(default_channel='root.channel') - + def cancel_reservation(self): with self.backend_id.work_on(self._name) as work: exporter = work.component(usage='hotel.reservation.exporter') return exporter.cancel_reservation(self) @job(default_channel='root.channel') - + def mark_booking(self): with self.backend_id.work_on(self._name) as work: exporter = work.component(usage='hotel.reservation.exporter') return exporter.mark_booking(self) - + def unlink(self): vals = [] for record in self: @@ -116,7 +114,7 @@ class ChannelHotelReservation(models.Model): class HotelReservation(models.Model): _inherit = 'hotel.reservation' - + def _set_access_for_channel_fields(self): for record in self: user = self.env['res.users'].browse(self.env.uid) @@ -215,7 +213,7 @@ class HotelReservation(models.Model): return reservation_id - + def write(self, vals): if self._context.get('connector_no_export', True) and \ (vals.get('checkin') or vals.get('checkout') or @@ -267,7 +265,7 @@ class HotelReservation(models.Model): res = super().write(vals) return res - + def generate_copy_values(self, checkin=False, checkout=False): self.ensure_one() res = super().generate_copy_values(checkin=checkin, checkout=checkout) @@ -282,7 +280,7 @@ class HotelReservation(models.Model): }) return res - + def action_reservation_checkout(self): for record in self: if record.state != 'cancelled': @@ -299,7 +297,7 @@ class HotelReservation(models.Model): return (json_reservs, json_tooltips) - + def mark_as_readed(self): self.write({'to_assign': False}) diff --git a/hotel_channel_connector/models/hotel_room_type/common.py b/hotel_channel_connector/models/hotel_room_type/common.py index 616bc0981..9f3af8fd1 100644 --- a/hotel_channel_connector/models/hotel_room_type/common.py +++ b/hotel_channel_connector/models/hotel_room_type/common.py @@ -3,7 +3,6 @@ from odoo import api, models, fields, _ from odoo.exceptions import ValidationError -from odoo.addons import decimal_precision as dp from odoo.addons.queue_job.job import job from odoo.addons.component.core import Component from odoo.addons.component_event import skip_if @@ -45,9 +44,9 @@ class ChannelHotelRoomType(models.Model): "the maximum simultaneous availability and " "the total room count for the given room type.") - min_price = fields.Float('Min. Price', default=5.0, digits=dp.get_precision('Product Price'), + min_price = fields.Float('Min. Price', default=5.0, digits=('Product Price'), help="Setup the min price to prevent incidents while editing your prices.") - max_price = fields.Float('Max. Price', default=200.0, digits=dp.get_precision('Product Price'), + max_price = fields.Float('Max. Price', default=200.0, digits=('Product Price'), help="Setup the max price to prevent incidents while editing your prices.") @api.constrains('default_quota', 'default_max_avail', 'total_rooms_count') @@ -87,7 +86,7 @@ class ChannelHotelRoomType(models.Model): raise ValidationError(_("OTA's capacity can't be greater than room type capacity")) - + @api.constrains('channel_short_code') def _check_channel_short_code(self): for record in self: @@ -95,7 +94,7 @@ class ChannelHotelRoomType(models.Model): raise ValidationError(_("Chanel short code can't be longer than 4 characters")) @job(default_channel='root.channel') - + def create_room(self): self.ensure_one() if not self.external_id: @@ -104,7 +103,7 @@ class ChannelHotelRoomType(models.Model): exporter.create_room(self) @job(default_channel='root.channel') - + def modify_room(self): self.ensure_one() if self.external_id: @@ -113,7 +112,7 @@ class ChannelHotelRoomType(models.Model): exporter.modify_room(self) @job(default_channel='root.channel') - + def delete_room(self): self.ensure_one() if self.external_id: @@ -145,7 +144,7 @@ class HotelRoomType(models.Model): _("You can not archive a room type with active rooms.") + " " + _("Please, change the %s room(s) to other room type.") % str(record.total_rooms_count)) - + def get_restrictions(self, date, restriction_plan_id): self.ensure_one() restriction = self.env['hotel.room.type.restriction.item'].search([ @@ -155,7 +154,7 @@ class HotelRoomType(models.Model): ], limit=1) return restriction - + def open_channel_bind_ids(self): channel_bind_ids = self.mapped('channel_bind_ids') action = self.env.ref('hotel_channel_connector.channel_hotel_room_type_action').read()[0] @@ -176,12 +175,12 @@ class HotelRoomType(models.Model): 'default_total_rooms_count': self.total_rooms_count} return action - + def disconnect_channel_bind_ids(self): # TODO: multichannel rooms is not implemented self.channel_bind_ids.with_context({'connector_no_export': True}).unlink() - + def write(self, vals): if 'active' in vals and vals.get('active') is False: self.channel_bind_ids.unlink() diff --git a/pms/__manifest__.py b/pms/__manifest__.py index 35c2ee80c..177efba2f 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -20,7 +20,9 @@ 'mail', 'account_payment_return', 'partner_firstname', - 'email_template_qweb' + 'email_template_qweb', + 'sales_team', + 'sale' ], 'data': [ 'security/pms_security.xml', @@ -75,4 +77,4 @@ 'qweb': [ 'static/src/xml/pms_base_templates.xml', ], -} \ No newline at end of file +} diff --git a/pms/data/cron_jobs.xml b/pms/data/cron_jobs.xml index 27b8d2a64..20d8bf032 100644 --- a/pms/data/cron_jobs.xml +++ b/pms/data/cron_jobs.xml @@ -3,17 +3,6 @@ - - - Inform Guest About Reservation Before 24 Hours - 1 - days - -1 - - - model.reservation_reminder_24hrs() - - Automatic Checkout on past reservations @@ -26,7 +15,7 @@ model.autocheckout() - + diff --git a/pms/data/menus.xml b/pms/data/menus.xml index a6dde37ec..25fce53b3 100644 --- a/pms/data/menus.xml +++ b/pms/data/menus.xml @@ -1,7 +1,7 @@ - diff --git a/pms/demo/pms_demo.xml b/pms/demo/pms_demo.xml index 9d1629efc..7c01ff3eb 100644 --- a/pms/demo/pms_demo.xml +++ b/pms/demo/pms_demo.xml @@ -430,7 +430,7 @@ - + Economic ECO 21.00 @@ -440,7 +440,7 @@ - + Single SNG 20.00 diff --git a/pms/models/inherited_ir_http.py b/pms/models/inherited_ir_http.py index e9337fb49..77caa06aa 100644 --- a/pms/models/inherited_ir_http.py +++ b/pms/models/inherited_ir_http.py @@ -28,6 +28,7 @@ class IrHttp(models.AbstractModel): user.company_id = user.pms_property_id.company_id res['company_id'] = user.pms_property_id.company_id.id else: + return res #TODO Review method raise MissingError( _("Wrong property and company access settings for this user. " "Please review property and company for user %s") % user.name) diff --git a/pms/models/pms_board_service.py b/pms/models/pms_board_service.py index 4ee367001..a3174e3a4 100644 --- a/pms/models/pms_board_service.py +++ b/pms/models/pms_board_service.py @@ -1,7 +1,6 @@ # Copyright 2017 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, models, fields -from odoo.addons import decimal_precision as dp class PmsBoardService(models.Model): @@ -9,40 +8,31 @@ class PmsBoardService(models.Model): _description = "Board Services" # Fields declaration - name = fields.Char( - 'Board Name', - translate=True, - size=64, - required=True, - index=True) + name = fields.Char("Board Name", translate=True, size=64, required=True, index=True) board_service_line_ids = fields.One2many( - 'pms.board.service.line', - 'pms_board_service_id') + "pms.board.service.line", "pms_board_service_id" + ) pms_property_ids = fields.Many2many( - 'pms.property', - string='Properties', - required=False, - ondelete='restrict') + "pms.property", string="Properties", required=False, ondelete="restrict" + ) pms_board_service_room_type_ids = fields.One2many( - 'pms.board.service.room.type', - 'pms_board_service_id') - price_type = fields.Selection([ - ('fixed', 'Fixed'), - ('percent', 'Percent')], - string='Type', - default='fixed', - required=True) + "pms.board.service.room.type", "pms_board_service_id" + ) + price_type = fields.Selection( + [("fixed", "Fixed"), ("percent", "Percent")], + string="Type", + default="fixed", + required=True, + ) amount = fields.Float( - 'Amount', - digits=dp.get_precision('Product Price'), - compute='_compute_board_amount', - store=True) + "Amount", digits=("Product Price"), compute="_compute_board_amount", store=True + ) # Compute and Search methods - @api.depends('board_service_line_ids.amount') + @api.depends("board_service_line_ids.amount") def _compute_board_amount(self): for record in self: total = 0 for service in record.board_service_line_ids: total += service.amount - record.update({'amount': total}) + record.update({"amount": total}) diff --git a/pms/models/pms_board_service_line.py b/pms/models/pms_board_service_line.py index 3c3e996c3..6fbba0ea3 100644 --- a/pms/models/pms_board_service_line.py +++ b/pms/models/pms_board_service_line.py @@ -1,12 +1,11 @@ # Copyright 2017 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models -from odoo.addons import decimal_precision as dp class PmsBoardServiceLine(models.Model): - _name = 'pms.board.service.line' - _description = 'Services on Board Service included' + _name = "pms.board.service.line" + _description = "Services on Board Service included" # Default methods def _get_default_price(self): @@ -15,24 +14,18 @@ class PmsBoardServiceLine(models.Model): # Fields declaration pms_board_service_id = fields.Many2one( - 'pms.board.service', - 'Board Service', - ondelete='cascade', - required=True) - product_id = fields.Many2one( - 'product.product', - string='Product', - required=True) + "pms.board.service", "Board Service", ondelete="cascade", required=True + ) + product_id = fields.Many2one("product.product", string="Product", required=True) pms_property_ids = fields.Many2many( - 'pms.property', - related='pms_board_service_id.pms_property_ids') + "pms.property", related="pms_board_service_id.pms_property_ids" + ) amount = fields.Float( - 'Amount', - digits=dp.get_precision('Product Price'), - default=_get_default_price) + "Amount", digits=("Product Price"), default=_get_default_price + ) # Constraints and onchanges - @api.onchange('product_id') + @api.onchange("product_id") def onchange_product_id(self): if self.product_id: - self.update({'amount': self.product_id.list_price}) + self.update({"amount": self.product_id.list_price}) diff --git a/pms/models/pms_board_service_room_type.py b/pms/models/pms_board_service_room_type.py index 0b262c8b6..191cf3de2 100644 --- a/pms/models/pms_board_service_room_type.py +++ b/pms/models/pms_board_service_room_type.py @@ -1,7 +1,6 @@ # Copyright 2017 Dario # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models, _ -from odoo.addons import decimal_precision as dp from odoo.exceptions import UserError @@ -13,7 +12,7 @@ class PmsBoardServiceRoomType(models.Model): _description = 'Board Service included in Room' # Default Methods ang Gets - + def name_get(self): result = [] for res in self: @@ -58,7 +57,7 @@ class PmsBoardServiceRoomType(models.Model): required=True) amount = fields.Float( 'Amount', - digits=dp.get_precision('Product Price'), + digits=('Product Price'), compute='_compute_board_amount', store=True) @@ -100,7 +99,7 @@ class PmsBoardServiceRoomType(models.Model): can't repeat without pricelist")) # Action methods - + def open_board_lines_form(self): action = self.env.ref( 'pms.action_pms_board_service_room_type_view').read()[0] @@ -130,7 +129,7 @@ class PmsBoardServiceRoomType(models.Model): ) return super(PmsBoardServiceRoomType, self).create(vals) - + def write(self, vals): if 'pms_board_service_id' in vals: vals.update( diff --git a/pms/models/pms_board_service_room_type_line.py b/pms/models/pms_board_service_room_type_line.py index 30dc1f18d..ec6df2781 100644 --- a/pms/models/pms_board_service_room_type_line.py +++ b/pms/models/pms_board_service_room_type_line.py @@ -1,8 +1,6 @@ # Copyright 2017 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import fields, models -from odoo.addons import decimal_precision as dp - class PmsBoardServiceRoomTypeLine(models.Model): _name = 'pms.board.service.room.type.line' @@ -20,5 +18,4 @@ class PmsBoardServiceRoomTypeLine(models.Model): required=True, readonly=True) # TODO def default_amount "amount of service" - amount = fields.Float('Amount', digits=dp.get_precision( - 'Product Price'), default=0.0) + amount = fields.Float('Amount', digits=('Product Price'), default=0.0) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 2863d0b26..4f2ed3670 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -11,6 +11,7 @@ from odoo.tools import ( class PmsCheckinPartner(models.Model): _name = 'pms.checkin.partner' + _description = 'Partner Checkins' # Default Methods ang Gets def _default_reservation_id(self): @@ -111,7 +112,7 @@ class PmsCheckinPartner(models.Model): track_visibility='onchange') # Constraints and onchanges - + @api.constrains('exit_date', 'enter_date') def _check_exit_date(self): for record in self: @@ -133,7 +134,7 @@ class PmsCheckinPartner(models.Model): _('Departure date, is prior to arrival. Check it now. %s') % date_out) - + @api.onchange('partner_id') def _check_partner_id(self): for record in self: @@ -152,7 +153,7 @@ class PmsCheckinPartner(models.Model): _('This guest is already registered in the room')) # Action methods - + def action_on_board(self): for record in self: if record.reservation_id.checkin > fields.Date.today(): @@ -185,7 +186,7 @@ class PmsCheckinPartner(models.Model): "type": "ir.actions.do_nothing", } - + def action_done(self): for record in self: if record.state == 'booking': diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index ca11acba5..6153ba647 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -282,7 +282,7 @@ class PmsFolio(models.Model): move_ids = folio.reservation_ids.mapped('move_line_ids').\ mapped('move_id').filtered(lambda r: r.type in [ 'out_invoice', 'out_refund']) - invoice_ids |= folio.service_ids.mapped('move_line_ids').mapped( + invoice_ids = folio.service_ids.mapped('move_line_ids').mapped( 'move_id').filtered(lambda r: r.type in [ 'out_invoice', 'out_refund']) # TODO: Search for invoices which have been 'cancelled' @@ -290,7 +290,7 @@ class PmsFolio(models.Model): # use like as origin may contains multiple references # (e.g. 'SO01, SO02') refunds = invoice_ids.search([ - ('origin', 'like', folio.name), + ('invoice_origin', 'like', folio.name), ('company_id', '=', folio.company_id.id)]).filtered( lambda r: r.type in ['out_invoice', 'out_refund']) invoice_ids |= refunds.filtered( @@ -301,8 +301,8 @@ class PmsFolio(models.Model): for inv in invoice_ids: refund_ids += refund_ids.search([ ('type', '=', 'out_refund'), - ('origin', '=', inv.number), - ('origin', '!=', False), + ('invoice_origin', '=', inv.number), + ('invoice_origin', '!=', False), ('journal_id', '=', inv.journal_id.id)]) # Ignore the status of the deposit product deposit_product_id = self.env['sale.advance.payment.inv'].\ @@ -331,7 +331,7 @@ class PmsFolio(models.Model): folio.update({ 'invoice_count': len(set(move_ids.ids + refund_ids.ids)), - 'invoice_ids': move_ids.ids + refund_ids.ids, + 'move_ids': move_ids.ids + refund_ids.ids, 'invoice_status': invoice_status }) @@ -357,7 +357,7 @@ class PmsFolio(models.Model): @api.depends('amount_total', 'payment_ids', 'return_ids', 'reservation_type', 'state') - + def compute_amount(self): acc_pay_obj = self.env['account.payment'] for record in self: @@ -466,7 +466,7 @@ class PmsFolio(models.Model): self.has_checkout_to_send = False # Constraints and onchanges - + @api.onchange('partner_id') def onchange_partner_id(self): """ @@ -484,7 +484,7 @@ class PmsFolio(models.Model): }) return - addr = self.partner_id.address_get(['move']) + addr = self.partner_id.address_get(['invoice']) pricelist = self.partner_id.property_product_pricelist and \ self.partner_id.property_product_pricelist.id or \ self.env.user.pms_property_id.default_pricelist_id.id @@ -506,7 +506,7 @@ class PmsFolio(models.Model): values['team_id'] = self.partner_id.team_id.id self.update(values) - + @api.onchange('pricelist_id') def onchange_pricelist_id(self): values = {'reservation_type': self.env['pms.folio']. @@ -517,7 +517,7 @@ class PmsFolio(models.Model): self.update(values) # Action methods - + def action_pay(self): self.ensure_one() partner = self.partner_id.id @@ -541,7 +541,7 @@ class PmsFolio(models.Model): 'target': 'new', } - + def open_moves_folio(self): invoices = self.mapped('move_ids') action = self.env.ref('account.action_move_out_invoice_type').read()[0] @@ -555,7 +555,7 @@ class PmsFolio(models.Model): action = {'type': 'ir.actions.act_window_close'} return action - + def action_return_payments(self): self.ensure_one() return_move_ids = [] @@ -582,7 +582,7 @@ class PmsFolio(models.Model): 'domain': [('id', 'in', return_move_ids)], } - + def action_checks(self): self.ensure_one() rooms = self.mapped('reservation_ids.id') @@ -596,7 +596,7 @@ class PmsFolio(models.Model): 'target': 'new', } - + def send_reservation_mail(self): ''' This function opens a window to compose an email, @@ -642,7 +642,7 @@ class PmsFolio(models.Model): 'force_send': True } - + def send_exit_mail(self): ''' This function opens a window to compose an email, @@ -688,7 +688,7 @@ class PmsFolio(models.Model): 'force_send': True } - + def send_cancel_mail(self): ''' This function opens a window to compose an email, @@ -773,14 +773,14 @@ class PmsFolio(models.Model): else: return 'normal' - + def action_done(self): reservation_ids = self.mapped('reservation_ids') for line in reservation_ids: if line.state == "booking": line.action_reservation_checkout() - + def action_cancel(self): for folio in self: for reservation in folio.reservation_ids.filtered( @@ -791,7 +791,7 @@ class PmsFolio(models.Model): }) return True - + def action_confirm(self): for folio in self.filtered(lambda folio: folio.partner_id not in folio.message_partner_ids): @@ -814,7 +814,7 @@ class PmsFolio(models.Model): CHECKIN/OUT PROCESS """ - + def _compute_checkin_partner_count(self): for record in self: if record.reservation_type == 'normal' and record.reservation_ids: @@ -830,7 +830,7 @@ class PmsFolio(models.Model): record.checkin_partner_pending_count = sum( mapped_checkin_partner_count) - + def get_grouped_reservations_json(self, state, import_all=False): self.ensure_one() info_grouped = [] @@ -873,7 +873,7 @@ class PmsFolio(models.Model): reverse=True), key=lambda k: k['room_type']['id']) - + def _get_tax_amount_by_group(self): self.ensure_one() res = {} diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index b27bc2b24..25dc6f776 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -11,7 +11,6 @@ from odoo.tools import ( DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT) from odoo import models, fields, api, _ -from odoo.addons import decimal_precision as dp import logging _logger = logging.getLogger(__name__) @@ -301,24 +300,24 @@ class PmsReservation(models.Model): string='To Invoice', store=True, readonly=True, - digits=dp.get_precision('Product Unit of Measure')) + digits=('Product Unit of Measure')) qty_invoiced = fields.Float( compute='_get_invoice_qty', string='Invoiced', store=True, readonly=True, - digits=dp.get_precision('Product Unit of Measure')) + digits=('Product Unit of Measure')) price_subtotal = fields.Monetary( string='Subtotal', readonly=True, store=True, - digits=dp.get_precision('Product Price'), + digits=('Product Price'), compute='_compute_amount_reservation') price_total = fields.Monetary( string='Total', readonly=True, store=True, - digits=dp.get_precision('Product Price'), + digits=('Product Price'), compute='_compute_amount_reservation') price_tax = fields.Float( string='Taxes', @@ -329,17 +328,17 @@ class PmsReservation(models.Model): string='Services Total', readonly=True, store=True, - digits=dp.get_precision('Product Price'), + digits=('Product Price'), compute='_compute_amount_room_services') price_room_services_set = fields.Monetary( string='Room Services Total', readonly=True, store=True, - digits=dp.get_precision('Product Price'), + digits=('Product Price'), compute='_compute_amount_set') discount = fields.Float( string='Discount (€)', - digits=dp.get_precision('Discount'), + digits=('Discount'), compute='_compute_discount', store=True) @@ -419,10 +418,11 @@ class PmsReservation(models.Model): def _compute_localizator(self): for record in self: if record.folio_id: + #TODO: Review Datetime type no char v13 localizator = re.sub("[^0-9]", "", record.folio_id.name) - checkout = int(re.sub("[^0-9]", "", record.checkout)) - checkin = int(re.sub("[^0-9]", "", record.checkin)) - localizator += str((checkin + checkout) % 99) + # checkout = int(re.sub("[^0-9]", "", record.checkout)) + # checkin = int(re.sub("[^0-9]", "", record.checkin)) + # localizator += str((checkin + checkout) % 99) record.localizator = localizator @api.depends('service_ids.price_total') @@ -512,7 +512,7 @@ class PmsReservation(models.Model): reservation period: %s ') % occupied_name raise ValidationError(warning_msg) - + @api.constrains('checkin_partner_ids') def _max_checkin_partner_ids(self): for record in self: @@ -554,7 +554,7 @@ class PmsReservation(models.Model): } self.update(values) - + @api.onchange('pricelist_id') def onchange_pricelist_id(self): values = {'reservation_type': self.env['pms.folio']. @@ -569,7 +569,7 @@ class PmsReservation(models.Model): self.update({'partner_id': self.env.user.company_id.partner_id.id}) - + @api.onchange('checkin_partner_ids') def onchange_checkin_partner_ids(self): for record in self: @@ -640,7 +640,7 @@ class PmsReservation(models.Model): for service in services: service.onchange_product_id() - + @api.onchange('checkin', 'checkout', 'room_id') def onchange_room_availabiltiy_domain(self): self.ensure_one() @@ -704,7 +704,7 @@ class PmsReservation(models.Model): service.price_unit = service._compute_price_unit() # Action methods - + def open_invoices_reservation(self): invoices = self.folio_id.mapped('move_ids') action = self.env.ref('account.action_move_out_invoice_type').read()[0] @@ -721,7 +721,7 @@ class PmsReservation(models.Model): 'default_folio_id': self.folio_id.id} return action - + def create_invoice(self): action = self.env.ref( 'pms.action_view_folio_advance_payment_inv').read()[0] @@ -729,7 +729,7 @@ class PmsReservation(models.Model): 'default_folio_id': self.folio_id.id} return action - + def open_folio(self): action = self.env.ref( 'pms.open_pms_folio1_form_tree_all').read()[0] @@ -741,7 +741,7 @@ class PmsReservation(models.Model): action = {'type': 'ir.actions.act_window_close'} return action - + def open_reservation_form(self): action = self.env.ref( 'pms.open_pms_reservation_form_tree_all').read()[0] @@ -750,12 +750,12 @@ class PmsReservation(models.Model): action['res_id'] = self.id return action - + def action_pay_folio(self): self.ensure_one() return self.folio_id.action_pay() - + def action_pay_reservation(self): self.ensure_one() partner = self.partner_id.id @@ -795,7 +795,7 @@ class PmsReservation(models.Model): return super(PmsReservation, self).name_search( name='', args=args, operator='ilike', limit=limit) - + def name_get(self): result = [] for res in self: @@ -853,7 +853,7 @@ class PmsReservation(models.Model): record.confirm() return record - + def write(self, vals): if self.notify_update(vals): vals.update({ @@ -937,7 +937,7 @@ class PmsReservation(models.Model): return record # Business methods - + def _computed_shared(self): # Has this reservation more charges associates in folio?, # Yes?, then, this is share folio ;) @@ -948,7 +948,7 @@ class PmsReservation(models.Model): or any(record.folio_id.service_ids.filtered( lambda x: x.reservation_id.id != record.id)) - + def compute_board_services(self, vals): """ We must compute service_ids when we have a board_service_id without @@ -963,7 +963,7 @@ class PmsReservation(models.Model): return True return False - + def compute_qty_service_day(self, vals): """ Compute if it is necesary calc price in write/create @@ -1047,7 +1047,7 @@ class PmsReservation(models.Model): subtype='mt_comment', body=msg) return True - + def notify_update(self, vals): if 'checkin' in vals or \ 'checkout' in vals or \ @@ -1058,12 +1058,12 @@ class PmsReservation(models.Model): return True return False - + def overbooking_button(self): self.ensure_one() self.overbooking = not self.overbooking - + def generate_copy_values(self, checkin=False, checkout=False): self.ensure_one() return { @@ -1091,7 +1091,7 @@ class PmsReservation(models.Model): STATE WORKFLOW ----------------------------------------------------- """ - + def confirm(self): ''' @param self: object pointer @@ -1130,7 +1130,7 @@ class PmsReservation(models.Model): splitted_reservs.confirm() return True - + def button_done(self): ''' @param self: object pointer @@ -1139,7 +1139,7 @@ class PmsReservation(models.Model): record.action_reservation_checkout() return True - + def action_cancel(self): for record in self: cancel_reason = 'intime' if self._context.get( @@ -1166,7 +1166,7 @@ class PmsReservation(models.Model): splitted_reservs.action_cancel() record.folio_id.compute_amount() - + def compute_cancelation_reason(self): self.ensure_one() pricelist = self.pricelist_id @@ -1184,7 +1184,7 @@ class PmsReservation(models.Model): return 'intime' return False - + def draft(self): for record in self: record.state = 'draft' @@ -1207,7 +1207,7 @@ class PmsReservation(models.Model): """ PRICE PROCESS ------------------------------------------------------ """ - + def compute_price_out_vals(self, vals): """ Compute if It is necesary calc price in write/create @@ -1220,7 +1220,7 @@ class PmsReservation(models.Model): return True return False - + def _compute_cancelled_discount(self): self.ensure_one() pricelist = self.pricelist_id @@ -1378,7 +1378,7 @@ class PmsReservation(models.Model): CHECKIN/OUT PROCESS ------------------------------------------------ """ - + def _compute_checkin_partner_count(self): _logger.info('_compute_checkin_partner_count') for record in self: @@ -1392,14 +1392,14 @@ class PmsReservation(models.Model): record.checkin_partner_pending_count = 0 # https://www.odoo.com/es_ES/forum/ayuda-1/question/calculated-fields-in-search-filter-possible-118501 - + def _search_checkin_partner_pending(self, operator, value): self.ensure_one() recs = self.search([]).filtered( lambda x: x.checkin_partner_pending_count > 0) return [('id', 'in', [x.id for x in recs])] if recs else [] - + def action_reservation_checkout(self): for record in self: record.state = 'done' @@ -1421,7 +1421,7 @@ class PmsReservation(models.Model): splitted_reservs.update({'state': 'done'}) return True - + def action_checks(self): self.ensure_one() action = self.env.ref( @@ -1437,7 +1437,7 @@ class PmsReservation(models.Model): RESERVATION SPLITTED ----------------------------------------------- """ - + def split(self, nights): for record in self: date_start_dt = fields.Date.from_string(record.checkin) @@ -1490,7 +1490,7 @@ class PmsReservation(models.Model): }) return True - + def unify(self): self.ensure_one() if not self.splitted: @@ -1570,7 +1570,7 @@ class PmsReservation(models.Model): }) return True - + def open_master(self): self.ensure_one() if not self.parent_reservation: @@ -1586,15 +1586,15 @@ class PmsReservation(models.Model): MAILING PROCESS """ - + def send_reservation_mail(self): return self.folio_id.send_reservation_mail() - + def send_exit_mail(self): return self.folio_id.send_exit_mail() - + def send_cancel_mail(self): return self.folio_id.send_cancel_mail() @@ -1602,7 +1602,7 @@ class PmsReservation(models.Model): INVOICING PROCESS """ - + def _compute_tax_ids(self): for record in self: # If company_id is set, always filter taxes by the company @@ -1613,7 +1613,7 @@ class PmsReservation(models.Model): lambda r: not record.company_id or r.company_id == folio.company_id) - + def set_call_center_user(self): user = self.env['res.users'].browse(self.env.uid) return user.has_group('pms.group_pms_call') diff --git a/pms/models/pms_reservation_line.py b/pms/models/pms_reservation_line.py index 6cb69f7c3..6b0e1f0d5 100644 --- a/pms/models/pms_reservation_line.py +++ b/pms/models/pms_reservation_line.py @@ -2,16 +2,16 @@ # Copyright 2017 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import models, fields, api, _ -from odoo.addons import decimal_precision as dp from odoo.exceptions import ValidationError class PmsReservationLine(models.Model): _name = "pms.reservation.line" + _description = "Reservations by day" _order = "date" # Default Methods ang Gets - + def name_get(self): result = [] for res in self: @@ -44,13 +44,13 @@ class PmsReservationLine(models.Model): state = fields.Selection(related='reservation_id.state') price = fields.Float( string='Price', - digits=dp.get_precision('Product Price')) + digits=('Product Price')) cancel_discount = fields.Float( string='Cancel Discount (%)', - digits=dp.get_precision('Discount'), default=0.0) + digits=('Discount'), default=0.0) discount = fields.Float( string='Discount (%)', - digits=dp.get_precision('Discount'), default=0.0) + digits=('Discount'), default=0.0) # Constraints and onchanges @api.constrains('date') diff --git a/pms/models/pms_room_type_restriction.py b/pms/models/pms_room_type_restriction.py index d944ebfe1..7591be257 100644 --- a/pms/models/pms_room_type_restriction.py +++ b/pms/models/pms_room_type_restriction.py @@ -7,6 +7,7 @@ class PmsRoomTypeRestriction(models.Model): """ The room type restriction is used as a daily restriction plan for room types and therefore is related only with one property. """ _name = 'pms.room.type.restriction' + _description = 'Reservation restriction plan' # Default methods @api.model diff --git a/pms/models/pms_room_type_restriction_item.py b/pms/models/pms_room_type_restriction_item.py index 3a74bcd76..b3029d19b 100644 --- a/pms/models/pms_room_type_restriction_item.py +++ b/pms/models/pms_room_type_restriction_item.py @@ -6,6 +6,7 @@ from odoo.exceptions import ValidationError class PmsRoomTypeRestrictionItem(models.Model): _name = 'pms.room.type.restriction.item' + _description = 'Reservation restriction by day' # Field Declarations restriction_id = fields.Many2one('pms.room.type.restriction', @@ -29,7 +30,7 @@ class PmsRoomTypeRestrictionItem(models.Model): day for the same room type!')] # Constraints and onchanges - + @api.constrains('min_stay', 'min_stay_arrival', 'max_stay', 'max_stay_arrival') def _check_min_stay(self): diff --git a/pms/models/pms_service.py b/pms/models/pms_service.py index be5021433..6cdd56aba 100644 --- a/pms/models/pms_service.py +++ b/pms/models/pms_service.py @@ -7,7 +7,6 @@ from odoo.tools import ( float_compare, DEFAULT_SERVER_DATE_FORMAT) from datetime import timedelta -from odoo.addons import decimal_precision as dp import logging _logger = logging.getLogger(__name__) @@ -17,7 +16,7 @@ class PmsService(models.Model): _description = 'Services and its charges' # Default methods - + def name_get(self): result = [] for rec in self: @@ -123,22 +122,22 @@ class PmsService(models.Model): price_unit = fields.Float( 'Unit Price', required=True, - digits=dp.get_precision('Product Price'), default=0.0) + digits=('Product Price'), default=0.0) discount = fields.Float( string='Discount (%)', - digits=dp.get_precision('Discount'), default=0.0) + digits=('Discount'), default=0.0) qty_to_invoice = fields.Float( compute='_get_to_invoice_qty', string='To Invoice', store=True, readonly=True, - digits=dp.get_precision('Product Unit of Measure')) + digits=('Product Unit of Measure')) qty_invoiced = fields.Float( compute='_get_invoice_qty', string='Invoiced', store=True, readonly=True, - digits=dp.get_precision('Product Unit of Measure')) + digits=('Product Unit of Measure')) price_subtotal = fields.Monetary( string='Subtotal', readonly=True, @@ -337,7 +336,7 @@ class PmsService(models.Model): record.update(vals) # Action methods - + def open_service_ids(self): action = self.env.ref('pms.action_pms_services_form').read()[0] action['views'] = [ @@ -387,7 +386,7 @@ class PmsService(models.Model): record = super(PmsService, self).create(vals) return record - + def write(self, vals): # If you write product, We must check if its necesary create or delete # service lines @@ -439,7 +438,7 @@ class PmsService(models.Model): line[field], line) return res - + def compute_lines_out_vals(self, vals): """ Compute if It is necesary service days in write/create @@ -453,7 +452,7 @@ class PmsService(models.Model): return True return False - + def _compute_tax_ids(self): for record in self: # If company_id is set, always filter taxes by the company @@ -466,7 +465,7 @@ class PmsService(models.Model): lambda r: not record.company_id or r.company_id == origin.company_id) - + def _get_display_price(self, product): folio = self.folio_id or self.env.context.get('default_folio_id') reservation = self.reservation_id or self.env.context.get( @@ -499,7 +498,7 @@ class PmsService(models.Model): # negative discounts (= surcharge) are included in the display price return max(base_price, final_price) - + def _compute_price_unit(self): self.ensure_one() folio = self.folio_id or self.env.context.get('default_folio_id') diff --git a/pms/models/pms_service_line.py b/pms/models/pms_service_line.py index 9b9f5c48a..c410e7bbd 100644 --- a/pms/models/pms_service_line.py +++ b/pms/models/pms_service_line.py @@ -7,6 +7,7 @@ from odoo.exceptions import ValidationError class PmsServiceLine(models.Model): _name = "pms.service.line" + _description = "Service by day" _order = "date" # Fields declaration diff --git a/pms/security/ir.model.access.csv b/pms/security/ir.model.access.csv index a73e4e250..7962107df 100644 --- a/pms/security/ir.model.access.csv +++ b/pms/security/ir.model.access.csv @@ -22,6 +22,8 @@ user_access_pms_board_service_line,user_access_pms_board_service_line,model_pms_ user_access_account_partial_reconcile,user_access_account_partial_reconcile,account.model_account_partial_reconcile,pms.group_pms_user,1,1,1,1 user_access_pms_cancelation_rule,user_access_pms_cancelation_rule,model_pms_cancelation_rule,pms.group_pms_user,1,0,0,0 user_access_account_full_reconcile,user_access_account_full_reconcile,account.model_account_full_reconcile,pms.group_pms_user,1,1,1,1 +call_access_pms_cancelation_rule,call_access_pms_cancelation_rule,model_pms_cancelation_rule,base.group_user,1,0,0,0 +user_access_property,user_access_property,model_pms_property,pms.group_pms_user,1,0,0,0 manager_access_pms_floor,manager_access_pms_floor,model_pms_floor,pms.group_pms_manager,1,1,1,1 manager_access_pms_amenity,manager_access_pms_amenity,model_pms_amenity,pms.group_pms_manager,1,1,1,1 manager_access_pms_amenity_type,manager_access_pms_amenity_type,model_pms_amenity_type,pms.group_pms_manager,1,1,1,1 @@ -42,6 +44,7 @@ manager_access_pms_room_type,manager_access_pms_room_type,model_pms_room_type,pm manager_access_pms_board_service_room_type,manager_access_pms_board_service_room_type,model_pms_board_service_room_type,pms.group_pms_manager,1,1,1,1 manager_access_pms_board_service_room_type_line,manager_access_pms_board_service_room_type_line,model_pms_board_service_room_type_line,pms.group_pms_manager,1,1,1,1 manager_access_pms_board_service_line,manager_access_pms_board_service_line,model_pms_board_service_line,pms.group_pms_manager,1,1,1,1 +manager_access_property,manager_access_property,model_pms_property,pms.group_pms_manager,1,1,1,1 manager_access_pms_cancelation_rule,manager_access_pms_cancelation_rule,model_pms_cancelation_rule,base.group_user,1,1,1,1 call_access_pms_floor,call_access_pms_floor,model_pms_floor,pms.group_pms_call,1,0,0,0 call_access_pms_amenity,call_access_pms_amenity,model_pms_amenity,pms.group_pms_call,1,0,0,0 @@ -63,4 +66,4 @@ call_access_pms_room_type,call_access_pms_room_type,model_pms_room_type,pms.grou call_access_pms_board_service_room_type,call_access_pms_board_service_room_type,model_pms_board_service_room_type,pms.group_pms_call,1,0,0,0 call_access_pms_board_service_room_type_line,call_access_pms_board_service_room_type_line,model_pms_board_service_room_type_line,pms.group_pms_call,1,0,0,0 call_access_pms_board_service_line,call_access_pms_board_service_line,model_pms_board_service_line,pms.group_pms_call,1,0,0,0 -call_access_pms_cancelation_rule,call_access_pms_cancelation_rule,model_pms_cancelation_rule,base.group_user,1,0,0,0 +call_access_property,call_access_property,model_pms_property,pms.group_pms_call,1,0,0,0 diff --git a/pms/views/inherited_account_payment_views.xml b/pms/views/inherited_account_payment_views.xml index b1f1dd3c8..4cef0a53a 100644 --- a/pms/views/inherited_account_payment_views.xml +++ b/pms/views/inherited_account_payment_views.xml @@ -30,7 +30,7 @@ attrs="{'invisible': [('state','=','draft')]}"/> @@ -96,7 +98,7 @@ icon="fa-money" name="action_pay_folio" attrs="{'invisible': ['|',('folio_pending_amount','<=',0)]}"> -
+
@@ -107,7 +109,7 @@