mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[ADD] Reservation type automation
This commit is contained in:
@@ -12,9 +12,7 @@ from . import hotel_room
|
||||
from . import hotel_room_amenities
|
||||
from . import hotel_room_amenities_type
|
||||
from . import hotel_room_type
|
||||
# from . import hotel_service_line
|
||||
from . import hotel_service
|
||||
# from . import hotel_service_type
|
||||
from . import inherit_account_invoice
|
||||
# from . import inherit_product_category
|
||||
from . import inherit_product_product
|
||||
|
||||
@@ -352,19 +352,14 @@ class HotelFolio(models.Model):
|
||||
#~ 'fiscal_position_id': False,
|
||||
#~ })
|
||||
return
|
||||
|
||||
addr = self.partner_id.address_get(['invoice'])
|
||||
#TEMP:
|
||||
values = { 'user_id': self.partner_id.user_id.id or self.env.uid,
|
||||
'pricelist_id':self.partner_id.property_product_pricelist and \
|
||||
self.partner_id.property_product_pricelist.id or \
|
||||
self.env['ir.default'].sudo().get('res.config.settings', 'parity_pricelist_id')}
|
||||
#~ values = {
|
||||
#~ 'pricelist_id': self.partner_id.property_product_pricelist and \
|
||||
#~ self.partner_id.property_product_pricelist.id or False,
|
||||
#~ 'partner_invoice_id': addr['invoice'],
|
||||
#~ 'user_id': self.partner_id.user_id.id or self.env.uid
|
||||
#~ }
|
||||
values = {'user_id': self.partner_id.user_id.id or self.env.uid,
|
||||
'pricelist_id':self.partner_id.property_product_pricelist and \
|
||||
self.partner_id.property_product_pricelist.id or \
|
||||
self.env['ir.default'].sudo().get('res.config.settings', 'parity_pricelist_id'),
|
||||
'reservation_type': self.env['hotel.folio'].calcule_reservation_type(
|
||||
self.partner_id.is_staff,
|
||||
self.reservation_type)}
|
||||
if self.env['ir.config_parameter'].sudo().get_param('sale.use_sale_note') and \
|
||||
self.env.user.company_id.sale_note:
|
||||
values['note'] = self.with_context(
|
||||
@@ -374,6 +369,15 @@ class HotelFolio(models.Model):
|
||||
values['team_id'] = self.partner_id.team_id.id
|
||||
self.update(values)
|
||||
|
||||
@api.model
|
||||
def calcule_reservation_type(self, is_staff, current_type):
|
||||
if current_type == 'out':
|
||||
return 'out'
|
||||
elif is_staff:
|
||||
return 'staff'
|
||||
else:
|
||||
return 'normal'
|
||||
|
||||
@api.multi
|
||||
def action_invoice_create(self, grouped=False, states=None):
|
||||
'''
|
||||
|
||||
@@ -448,9 +448,17 @@ class HotelReservation(models.Model):
|
||||
'pricelist_id': self.partner_id.property_product_pricelist and \
|
||||
self.partner_id.property_product_pricelist.id or \
|
||||
self.env['ir.default'].sudo().get('res.config.settings', 'parity_pricelist_id'),
|
||||
'reservation_type': self.env['hotel.folio'].calcule_reservation_type(
|
||||
self.partner_id.is_staff,
|
||||
self.reservation_type)
|
||||
}
|
||||
self.update(values)
|
||||
|
||||
@api.onchange('reservation_type')
|
||||
def assign_partner_company_on_out_service(self):
|
||||
if self.reservation_type == 'out':
|
||||
self.update({'partner_id': self.env.user.company_id.partner_id.id})
|
||||
|
||||
# When we need to overwrite the prices even if they were already established
|
||||
@api.onchange('room_type_id', 'pricelist_id', 'reservation_type')
|
||||
def onchange_overwrite_price_by_day(self):
|
||||
|
||||
@@ -1,243 +0,0 @@
|
||||
# Copyright 2017 Alexandre Díaz
|
||||
# Copyright 2017 Dario Lodeiros
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
import time
|
||||
import logging
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||
from odoo.exceptions import UserError
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
from odoo.addons import decimal_precision as dp
|
||||
|
||||
|
||||
class HotelServiceLine(models.Model):
|
||||
_name = 'hotel.service.line'
|
||||
_description = 'hotel Service line'
|
||||
|
||||
@api.one
|
||||
def copy(self, default=None):
|
||||
'''
|
||||
@param self: object pointer
|
||||
@param default: dict of default values to be set
|
||||
'''
|
||||
line_id = self.service_line_id.id
|
||||
sale_line_obj = self.env['sale.order.line'].browse(line_id)
|
||||
return sale_line_obj.copy(default=default)
|
||||
|
||||
@api.multi
|
||||
def _amount_line(self, field_name, arg):
|
||||
'''
|
||||
@param self: object pointer
|
||||
@param field_name: Names of fields.
|
||||
@param arg: User defined arguments
|
||||
'''
|
||||
total_amount = 0
|
||||
for record in self:
|
||||
line = record.service_line_id
|
||||
total_amount += line._amount_line(field_name, arg)
|
||||
return total_amount
|
||||
|
||||
@api.multi
|
||||
def _number_packages(self, field_name, arg):
|
||||
'''
|
||||
@param self: object pointer
|
||||
@param field_name: Names of fields.
|
||||
@param arg: User defined arguments
|
||||
'''
|
||||
total_packages = 0
|
||||
for record in self:
|
||||
line = record.service_line_id
|
||||
total_packages = line._number_packages(field_name, arg)
|
||||
return total_packages
|
||||
|
||||
@api.model
|
||||
def _service_checkin(self):
|
||||
if 'checkin' in self._context:
|
||||
return self._context['checkin']
|
||||
return time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
|
||||
@api.model
|
||||
def _service_checkout(self):
|
||||
if 'checkout' in self._context:
|
||||
return self._context['checkout']
|
||||
return time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
|
||||
@api.model
|
||||
def _default_ser_room_line(self):
|
||||
if 'room_lines' in self.env.context and self.env.context['room_lines']:
|
||||
ids = [item[1] for item in self.env.context['room_lines']]
|
||||
return self.env['hotel.reservation'].search([('id', 'in', ids)],
|
||||
limit=1)
|
||||
return False
|
||||
|
||||
# The record's name
|
||||
name = fields.Char('Service line', required=True)
|
||||
# services in the hotel are products
|
||||
product_id = fields.Many2one('product.product', 'Service')
|
||||
|
||||
list_price = fields.Float(
|
||||
related='product_id.list_price')
|
||||
|
||||
# TODO refactor to services_ids
|
||||
# services_line_id = fields.Many2one('hotel.services', 'Service Line',
|
||||
# ondelete='cascade')
|
||||
# FIXME You can add services to a folio ?
|
||||
folio_id = fields.Many2one('hotel.folio', 'Folio', ondelete='cascade')
|
||||
|
||||
channel_type = fields.Selection([
|
||||
('door', 'Door'),
|
||||
('mail', 'Mail'),
|
||||
('phone', 'Phone'),
|
||||
('call', 'Call Center'),
|
||||
('web', 'Web')], 'Sales Channel')
|
||||
|
||||
ser_checkin = fields.Date('From Date', required=True,
|
||||
default=_service_checkin)
|
||||
ser_checkout = fields.Date('To Date', required=True,
|
||||
default=_service_checkout)
|
||||
ser_room_line = fields.Many2one('hotel.reservation', 'Room',
|
||||
default=_default_ser_room_line)
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
"""
|
||||
Overrides orm create method.
|
||||
@param self: The object pointer
|
||||
@param vals: dictionary of fields value.
|
||||
@return: new record set for hotel service line.
|
||||
"""
|
||||
if 'folio_id' in vals:
|
||||
folio = self.env['hotel.folio'].browse(vals['folio_id'])
|
||||
vals.update({'order_id': folio.order_id.id})
|
||||
user = self.env['res.users'].browse(self.env.uid)
|
||||
if user.has_group('hotel.group_hotel_call'):
|
||||
vals.update({'channel_type': 'call'})
|
||||
return super(HotelServiceLine, self).create(vals)
|
||||
|
||||
# ~ @api.multi
|
||||
# ~ def unlink(self):
|
||||
# ~ """
|
||||
# ~ Overrides orm unlink method.
|
||||
# ~ @param self: The object pointer
|
||||
# ~ @return: True/False.
|
||||
# ~ """
|
||||
# ~ s_line_obj = self.env['sale.order.line']
|
||||
# ~ for line in self:
|
||||
# ~ if line.service_line_id:
|
||||
# ~ sale_unlink_obj = s_line_obj.browse([line.service_line_id.id])
|
||||
# ~ sale_unlink_obj.unlink()
|
||||
# ~ return super(HotelServiceLine, self).unlink()
|
||||
|
||||
@api.onchange('product_id')
|
||||
def product_id_change_hotel(self):
|
||||
'''
|
||||
@param self: object pointer
|
||||
'''
|
||||
if self.product_id:
|
||||
write_vals = {}
|
||||
if not (self.folio_id and self.folio_id.partner_id) and \
|
||||
self.ser_room_line:
|
||||
write_vals.update({'folio_id': self.ser_room_line.folio_id.id})
|
||||
write_vals.update({
|
||||
'name': self.product_id.name,
|
||||
'price_unit': self.product_id.lst_price,
|
||||
'product_uom': self.product_id.uom_id,
|
||||
'price_unit': self.product_id.price,
|
||||
})
|
||||
self.update(write_vals)
|
||||
|
||||
#~ self.price_unit = tax_obj._fix_tax_included_price(prod.price,
|
||||
#~ prod.taxes_id,
|
||||
#~ self.tax_id)
|
||||
|
||||
# ~ _logger.info(self._context)
|
||||
# ~ if 'folio_id' in self._context:
|
||||
# ~ _logger.info(self._context)
|
||||
# ~ domain_rooms = []
|
||||
# ~ rooms_lines = self.env['hotel.reservation'].search([('folio_id','=',folio_id)])
|
||||
# ~ room_ids = room_lines.mapped('id')
|
||||
# ~ domain_rooms.append(('id','in',room_ids))
|
||||
# ~ return {'domain': {'ser_room_line': domain_rooms}}
|
||||
#
|
||||
# ~ @api.onchange('folio_id')
|
||||
# ~ def folio_id_change(self):
|
||||
# ~ self.ensure_one()
|
||||
# ~ _logger.info(self.mapped('folio_id.room_lines'))
|
||||
# ~ rooms = self.mapped('folio_id.room_lines.id')
|
||||
# ~ return {'domain': {'ser_room_line': rooms}}
|
||||
|
||||
#~ @api.onchange('product_uom')
|
||||
#~ def product_uom_change(self):
|
||||
#~ '''
|
||||
#~ @param self: object pointer
|
||||
#~ '''
|
||||
# ~ if not self.product_uom:
|
||||
# ~ self.price_unit = 0.0
|
||||
# ~ return
|
||||
# ~ self.price_unit = self.product_id.lst_price
|
||||
# ~ if self.folio_id.partner_id:
|
||||
# ~ prod = self.product_id.with_context(
|
||||
# ~ lang=self.folio_id.partner_id.lang,
|
||||
# ~ partner=self.folio_id.partner_id.id,
|
||||
# ~ quantity=1,
|
||||
# ~ date_order=self.folio_id.date_order,
|
||||
# ~ pricelist=self.folio_id.pricelist_id.id,
|
||||
# ~ uom=self.product_uom.id
|
||||
# ~ )
|
||||
# ~ tax_obj = self.env['account.tax']
|
||||
# ~ self.price_unit = tax_obj._fix_tax_included_price(prod.price,
|
||||
# ~ prod.taxes_id,
|
||||
# ~ self.tax_id)
|
||||
|
||||
@api.onchange('ser_checkin', 'ser_checkout')
|
||||
def on_change_checkout(self):
|
||||
'''
|
||||
When you change checkin or checkout it will checked it
|
||||
and update the qty of hotel service line
|
||||
-----------------------------------------------------------------
|
||||
@param self: object pointer
|
||||
'''
|
||||
now_utc = fields.Date.today()
|
||||
if not self.ser_checkin:
|
||||
self.ser_checkin = now_utc
|
||||
if not self.ser_checkout:
|
||||
self.ser_checkout = now_utc
|
||||
chkin_utc_dt = fields.Date.from_string(self.ser_checkin)
|
||||
chkout_utc_dt = fields.Date.from_string(self.ser_checkout)
|
||||
if chkout_utc_dt < chkin_utc_dt:
|
||||
raise UserError(_('Checkout must be greater or equal checkin date'))
|
||||
if self.ser_checkin and self.ser_checkout:
|
||||
diffDate = abs((self.ser_checkout - self.ser_checkin).days) + 1
|
||||
# FIXME: Finalize method!
|
||||
|
||||
@api.multi
|
||||
def button_confirm(self):
|
||||
'''
|
||||
@param self: object pointer
|
||||
'''
|
||||
self.ensure_one()
|
||||
self.service_line_id.button_confirm()
|
||||
|
||||
@api.multi
|
||||
def button_done(self):
|
||||
'''
|
||||
@param self: object pointer
|
||||
'''
|
||||
self.ensure_one()
|
||||
self.service_line_id.button_done()
|
||||
|
||||
@api.one
|
||||
def copy_data(self, default=None):
|
||||
'''
|
||||
@param self: object pointer
|
||||
@param default: dict of default values to be set
|
||||
'''
|
||||
sale_line_obj = self.env['sale.order.line'].browse(self.service_line_id.id)
|
||||
return sale_line_obj.copy_data(default=default)
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for record in self:
|
||||
record.service_line_id.unlink()
|
||||
return super(HotelServiceLine, self).unlink()
|
||||
@@ -1,23 +0,0 @@
|
||||
# Copyright 2017 Alexandre Díaz
|
||||
# Copyright 2017 Dario Lodeiros
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class HotelServiceType(models.Model):
|
||||
_name = "hotel.service.type"
|
||||
_description = "Service Type"
|
||||
|
||||
name = fields.Char('Service Type', required=True)
|
||||
# Used for activate records
|
||||
active = fields.Boolean('Active?', default=True)
|
||||
|
||||
# ser_id = fields.Many2one('product.category', 'category', required=True,
|
||||
# delegate=True, index=True, ondelete='cascade')
|
||||
service_ids = fields.One2many('hotel.services', 'service_type_id',
|
||||
'Services in this category')
|
||||
|
||||
# @api.multi
|
||||
# def unlink(self):
|
||||
# # self.ser_id.unlink()
|
||||
# return super(HotelServiceType, self).unlink()
|
||||
@@ -24,3 +24,13 @@ class ResPartner(models.Model):
|
||||
reservations_count = fields.Integer('Reservations',
|
||||
compute='_compute_reservations_count')
|
||||
folios_count = fields.Integer('Folios', compute='_compute_folios_count')
|
||||
is_staff = fields.Boolean('Is Staff')
|
||||
|
||||
""" TODO
|
||||
@api.onchange('is_staff')
|
||||
def onchange_staff(self):
|
||||
staff_listprice = TODO: Search the pricelist checked like staff_listprice
|
||||
if staff_listprice:
|
||||
values = {'pricelist_id': staff_listprice}
|
||||
self.update(values)
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user