From d2fc9018ecb0335eef935a938c1bdfa77117931e Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Tue, 29 Jan 2019 18:30:34 +0100 Subject: [PATCH] [WIP] Discount, Massive Changes Prices --- hotel/models/hotel_folio.py | 2 +- hotel/models/hotel_reservation.py | 62 +++++++++++++++---- hotel/views/hotel_folio_views.xml | 8 +-- hotel/views/hotel_reservation_views.xml | 22 ++++--- .../views/inherited_account_invoice_views.xml | 3 - hotel/wizard/folio_make_invoice_advance.py | 4 -- .../wizard/massive_price_reservation_days.py | 24 +++---- .../wizard/massive_price_reservation_days.xml | 9 ++- 8 files changed, 83 insertions(+), 51 deletions(-) diff --git a/hotel/models/hotel_folio.py b/hotel/models/hotel_folio.py index 39b541045..c180c89fc 100644 --- a/hotel/models/hotel_folio.py +++ b/hotel/models/hotel_folio.py @@ -202,7 +202,7 @@ class HotelFolio(models.Model): compute='_amount_all', track_visibility='always') #Checkin Fields----------------------------------------------------- - checkin_partner_ids = fields.One2many('hotel.checkin.partner', 'reservation_id') + checkin_partner_ids = fields.One2many('hotel.checkin.partner', 'folio_id') booking_pending = fields.Integer('Booking pending', compute='_compute_checkin_partner_count') checkin_partner_count = fields.Integer('Checkin counter', diff --git a/hotel/models/hotel_reservation.py b/hotel/models/hotel_reservation.py index e6912e74a..f93fab504 100644 --- a/hotel/models/hotel_reservation.py +++ b/hotel/models/hotel_reservation.py @@ -78,6 +78,20 @@ class HotelReservation(models.Model): else: return default_departure_hour + @api.model + def _default_diff_invoicing(self): + """ + If the guest has an invoicing address set, + this method return diff_invoicing = True, else, return False + """ + if 'reservation_id' in self.env.context: + reservation = self.env['hotel.reservation'].browse([ + self.env.context['reservation_id'] + ]) + if reservation.partner_id.id == reservation.partner_invoice_id.id: + return False + return True + @api.depends('state', 'qty_to_invoice', 'qty_invoiced') def _compute_invoice_status(self): """ @@ -172,14 +186,12 @@ class HotelReservation(models.Model): ondelete='cascade') checkin = fields.Date('Check In', required=True, - default=_get_default_checkin, - track_visibility='onchange') + default=_get_default_checkin) checkout = fields.Date('Check Out', required=True, - default=_get_default_checkout, - track_visibility='onchange') - real_checkin = fields.Date('Real Check In', required=True, + default=_get_default_checkout) + real_checkin = fields.Date('Arrival', required=True, track_visibility='onchange') - real_checkout = fields.Date('Real Check Out', required=True, + real_checkout = fields.Date('Departure', required=True, track_visibility='onchange') arrival_hour = fields.Char('Arrival Hour', default=_get_default_arrival_hour, @@ -203,6 +215,9 @@ class HotelReservation(models.Model): partner_invoice_email = fields.Char(related="partner_invoice_id.email") partner_invoice_lang = fields.Selection(related="partner_invoice_id.lang") closure_reason_id = fields.Many2one(related='folio_id.closure_reason_id') + partner_invoice_type = fields.Selection(related="partner_invoice_id.type") + partner_invoice_parent_id = fields.Many2one(related="partner_invoice_id.parent_id") + partner_diff_invoicing = fields.Boolean('Bill to another Address', default='_default_diff_invoicing') company_id = fields.Many2one(related='folio_id.company_id', string='Company', store=True, readonly=True) reservation_line_ids = fields.One2many('hotel.reservation.line', 'reservation_id', @@ -307,8 +322,10 @@ class HotelReservation(models.Model): readonly=True, store=True, compute='_compute_amount_set') - # FIXME discount per night - discount = fields.Float(string='Discount (%)', digits=dp.get_precision('Discount'), default=0.0) + discount = fields.Float(string='Discount (€)', + digits=dp.get_precision('Discount'), + compute='_compute_discount', + store=True) analytic_tag_ids = fields.Many2many('account.analytic.tag', string='Analytic Tags') @@ -562,11 +579,14 @@ class HotelReservation(models.Model): @api.onchange('partner_id') def onchange_partner_id(self): + 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['ir.default'].sudo().get('res.config.settings', 'default_pricelist_id') values = { 'pricelist_id': pricelist, + 'partner_invoice_id': addr['invoice'], + 'partner_diff_invoicing': False if self.partner_id.id == addr['invoice'] else True } self.update(values) @@ -666,6 +686,21 @@ class HotelReservation(models.Model): ] return {'domain': {'room_id': domain_rooms}} + @api.onchange('partner_diff_invoicing') + def onchange_partner_diff_invoicing(self): + if self.partner_diff_invoicing == False: + self.update({'partner_invoice_id': self.partner_id.id}) + elif self.partner_id == self.partner_invoice_id: + self.update({'partner_invoice_id': self.partner_id.address_get(['invoice'])['invoice'] or None}) + + @api.onchange('partner_invoice_id') + def onchange_partner_invoice_id(self): + if self.partner_invoice_id and not self.partner_invoice_id.parent_id and \ + self.partner_invoice_id != self.partner_id: + self.update({ + 'partner_invoice_parent_id': self.partner_id.id, + 'partner_invoice_type': 'invoice'}) + @api.onchange('board_service_room_id') def onchange_board_service(self): if self.board_service_room_id: @@ -742,7 +777,6 @@ class HotelReservation(models.Model): for record in self: record.write({ 'state': 'cancelled', - 'discount': 100.0, }) if record.splitted: master_reservation = record.parent_reservation or record @@ -801,7 +835,13 @@ class HotelReservation(models.Model): return True return False - @api.depends('reservation_line_ids', 'reservation_line_ids.discount', 'tax_ids') + @api.depends('reservation_line_ids.discount') + def _compute_discount(self): + for record in self: + record.discount = sum(line.price * (1 - (line.discount or 0.0) * 0.01) \ + for line in record.reservation_line_ids) + + @api.depends('reservation_line_ids.price', 'discount', 'tax_ids') def _compute_amount_reservation(self): """ Compute the amounts of the reservation. @@ -810,7 +850,7 @@ class HotelReservation(models.Model): amount_room = sum(record.reservation_line_ids.mapped('price')) if amount_room > 0: product = record.room_type_id.product_id - price = amount_room * (1 - (record.discount or 0.0) * 0.01) + price = amount_room - record.discount taxes = record.tax_ids.compute_all(price, record.currency_id, 1, product=product) record.update({ 'price_tax': sum(t.get('amount', 0.0) for t in taxes.get('taxes', [])), diff --git a/hotel/views/hotel_folio_views.xml b/hotel/views/hotel_folio_views.xml index 820e27306..f43e8d7d2 100644 --- a/hotel/views/hotel_folio_views.xml +++ b/hotel/views/hotel_folio_views.xml @@ -132,6 +132,8 @@ + @@ -140,8 +142,6 @@ - @@ -179,10 +179,6 @@ nolabel="1" /> - - - - + + + + + + + - - - - - - + + + +