mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP] roommatik api
This commit is contained in:
@@ -161,7 +161,7 @@ class HotelRoomType(models.Model):
|
||||
vals=vals,
|
||||
update_old_prices=False)
|
||||
rate_vals.update({
|
||||
room_type.code_type: [item[2] for item in \
|
||||
room_type.id: [item[2] for item in \
|
||||
room_vals['reservation_line_ids'] if item[2]]
|
||||
})
|
||||
return rate_vals
|
||||
|
||||
@@ -38,22 +38,21 @@ class HotelFolio(models.Model):
|
||||
'email': room_partner["Customer"]["Contact"]["Email"],
|
||||
'mobile': room_partner["Customer"]["Contact"]["Mobile"],
|
||||
'document_type': room_partner["Customer"][
|
||||
"IdentityDocument"]["Type"],
|
||||
"IdentityDocument"]["Type"],
|
||||
'document_number': room_partner["Customer"][
|
||||
"IdentityDocument"]["Number"],
|
||||
"IdentityDocument"]["Number"],
|
||||
'document_expedition_date': datetime.strptime(room_partner[
|
||||
"Customer"]["IdentityDocument"][
|
||||
"ExpiryDate"], "%d%m%Y").date(),
|
||||
"Customer"]["IdentityDocument"]["ExpiryDate"], "%d%m%Y").date(),
|
||||
'gender': room_partner["Customer"]["Sex"],
|
||||
'birthdate_date': datetime.strptime(room_partner[
|
||||
"Customer"]["Birthday"], "%d%m%Y").date(),
|
||||
"Customer"]["Birthday"], "%d%m%Y").date(),
|
||||
'code_ine_id': room_partner["Customer"][
|
||||
"Address"]["Province"],
|
||||
"Address"]["Province"],
|
||||
'state': 'booking',
|
||||
}
|
||||
try:
|
||||
record = self.env['hotel.checkin.partner'].create(
|
||||
checkin_partner_val)
|
||||
checkin_partner_val)
|
||||
_logger.info('ROOMMATIK check-in Document: %s in \
|
||||
(%s Reservation) ID:%s.',
|
||||
checkin_partner_val['document_number'],
|
||||
@@ -62,9 +61,6 @@ class HotelFolio(models.Model):
|
||||
stay['Id'] = record.id
|
||||
json_response = stay
|
||||
except:
|
||||
# Debug Stop -------------------
|
||||
import wdb; wdb.set_trace()
|
||||
# Debug Stop -------------------
|
||||
json_response = {'Estate': 'Error not create Checkin'}
|
||||
_logger.error('ROOMMATIK writing %s in reservation: %s).',
|
||||
checkin_partner_val['document_number'],
|
||||
@@ -102,7 +98,7 @@ class HotelFolio(models.Model):
|
||||
for idx, cpi in enumerate(reserva.reservation_id.checkin_partner_ids):
|
||||
stay['Customers'].append({'Customer': {}})
|
||||
stay['Customers'][idx]['Customer'] = self.env[
|
||||
'res.partner'].rm_get_a_customer(cpi.partner_id.id)
|
||||
'res.partner'].rm_get_a_customer(cpi.partner_id.id)
|
||||
stay['TimeInterval'] = {}
|
||||
stay['TimeInterval']['Id'] = {}
|
||||
stay['TimeInterval']['Name'] = {}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# Copyright 2019 Jose Luis Algara (Alda hotels) <osotranquilo@gmail.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
import json
|
||||
from odoo import api, models
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
@@ -10,36 +9,3 @@ _logger = logging.getLogger(__name__)
|
||||
class HotelFolio(models.Model):
|
||||
|
||||
_inherit = 'hotel.folio'
|
||||
|
||||
@api.model
|
||||
def rm_get_reservation(self, Code):
|
||||
# BÚSQUEDA DE RESERVA POR LOCALIZADOR
|
||||
folio_res = self.env['hotel.folio'].search([('id', '=', Code)])
|
||||
if any(folio_res):
|
||||
_logger.info('ROOMMATIK serving Folio: %s', folio_res.id)
|
||||
folio_lin = folio_res.room_lines
|
||||
json_response = {
|
||||
'Id': folio_res.id,
|
||||
'Arrival': folio_lin[0]['checkin'],
|
||||
'Departure': folio_lin[0]['checkout'],
|
||||
'Deposit': folio_res.amount_total,
|
||||
}
|
||||
for i, line in enumerate(folio_lin):
|
||||
total_chekins = folio_lin.checkin_partner_pending_count
|
||||
json_response.setdefault('Rooms', [i]).append({
|
||||
'Id': line.id,
|
||||
'Adults': line.adults,
|
||||
'IsAvailable': True if total_chekins > 0 else False,
|
||||
# IsAvailable “false” Rooms not need check-in
|
||||
'Price': line.price_total,
|
||||
'RoomTypeId': line.room_type_id.id,
|
||||
'RoomTypeName': line.room_type_id.name,
|
||||
'RoomName': line.room_id.name,
|
||||
})
|
||||
# Debug Stop -------------------
|
||||
# import wdb; wdb.set_trace()
|
||||
# Debug Stop -------------------
|
||||
else:
|
||||
_logger.warning('ROOMMATIK Not Found Folio search %s', Code)
|
||||
json_response = {'Error': 'Not Found ' + str(Code)}
|
||||
return json.dumps(json_response)
|
||||
|
||||
@@ -2,22 +2,64 @@
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, models, fields
|
||||
from odoo.tools import (
|
||||
DEFAULT_SERVER_DATE_FORMAT,
|
||||
DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
from datetime import datetime, timedelta
|
||||
from dateutil import tz
|
||||
import json
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
import random
|
||||
|
||||
|
||||
class HotelReservation(models.Model):
|
||||
|
||||
_inherit = 'hotel.reservation'
|
||||
|
||||
def _compute_localizator(self):
|
||||
random.seed(self.id)
|
||||
number = str(random.random())
|
||||
leters = "ABCEFGHJKL"
|
||||
locali = str(self.folio_id.id) + leters[int(number[11])]
|
||||
locali += number[2:10] + leters[int(number[12])]
|
||||
locali += str(self.id)
|
||||
self.localizator = locali
|
||||
return
|
||||
@api.model
|
||||
def rm_get_reservation(self, code):
|
||||
# BÚSQUEDA DE RESERVA POR LOCALIZADOR
|
||||
reservations = self._get_reservations_roommatik(code)
|
||||
reservations = reservations.filtered(
|
||||
lambda x: x.state in ('draft', 'confirm'))
|
||||
if any(reservations):
|
||||
default_arrival_hour = self.env['ir.default'].sudo().get(
|
||||
'res.config.settings', 'default_arrival_hour')
|
||||
checkin = "%s %s" % (reservations[0].checkin,
|
||||
default_arrival_hour)
|
||||
default_departure_hour = self.env['ir.default'].sudo().get(
|
||||
'res.config.settings', 'default_departure_hour')
|
||||
checkout = "%s %s" % (reservations[0].checkout,
|
||||
default_departure_hour)
|
||||
_logger.info('ROOMMATIK serving Folio: %s', reservations.ids)
|
||||
json_response = {
|
||||
'Reservation': {
|
||||
'Id': reservations[0].localizator,
|
||||
'Arrival': checkin,
|
||||
'Departure': checkout,
|
||||
'Deposit': reservations[0].folio_id.invoices_paid,
|
||||
}
|
||||
}
|
||||
for i, line in enumerate(reservations):
|
||||
total_chekins = line.checkin_partner_pending_count
|
||||
json_response['Reservation'].setdefault('Rooms', [i]).append({
|
||||
'Id': line.id,
|
||||
'Adults': line.adults,
|
||||
'IsAvailable': total_chekins > 0,
|
||||
# IsAvailable “false” Rooms not need check-in
|
||||
'Price': line.price_total,
|
||||
'RoomTypeId': line.room_type_id.id,
|
||||
'RoomTypeName': line.room_type_id.name,
|
||||
'RoomName': line.room_id.name,
|
||||
})
|
||||
else:
|
||||
_logger.warning('ROOMMATIK Not Found reservation search %s', code)
|
||||
json_response = {'Error': 'Not Found ' + str(code)}
|
||||
return json.dumps(json_response)
|
||||
|
||||
localizator = fields.Char('Localizator', compute='_compute_localizator')
|
||||
@api.model
|
||||
def _get_reservations_roommatik(self, code):
|
||||
return self.env['hotel.reservation'].search([
|
||||
'|', ('localizator', '=', code),
|
||||
('folio_id.name', '=', code)])
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
# Copyright 2019 Jose Luis Algara (Alda hotels) <osotranquilo@gmail.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, models
|
||||
from odoo import api, models, fields
|
||||
from datetime import datetime, timedelta
|
||||
from odoo.tools import (
|
||||
DEFAULT_SERVER_DATE_FORMAT,
|
||||
DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class HotelRoomType(models.Model):
|
||||
@@ -12,38 +16,53 @@ class HotelRoomType(models.Model):
|
||||
|
||||
@api.model
|
||||
def rm_get_all_room_type_rates(self):
|
||||
# types = self.env['hotel.room.type'].search(['active', '=', True])
|
||||
types = self.env['hotel.room.type'].search([])
|
||||
dfrom = datetime.now()
|
||||
dto = (dfrom + timedelta(hours=24))
|
||||
|
||||
room_types = self.env['hotel.room.type'].search([])
|
||||
tz_hotel = self.env['ir.default'].sudo().get(
|
||||
'res.config.settings', 'tz_hotel')
|
||||
dfrom = fields.Date.context_today(self.with_context(
|
||||
tz=tz_hotel))
|
||||
dto = (fields.Date.from_string(dfrom) + timedelta(days=1)).strftime(
|
||||
DEFAULT_SERVER_DATE_FORMAT)
|
||||
room_type_rates = []
|
||||
for i, type in enumerate(types):
|
||||
frees = self.check_availability_room_type(dfrom, dto, type.id)
|
||||
if any(frees):
|
||||
room_type_rates.append({
|
||||
"RoomType": {
|
||||
"Id": type.id,
|
||||
"Name": type.product_id.name,
|
||||
"GuestNumber": type.get_capacity()
|
||||
},
|
||||
"TimeInterval": {
|
||||
"Id": "1",
|
||||
"Name": "1 day",
|
||||
"Minutes": "1440"
|
||||
},
|
||||
"Price": "",
|
||||
"IsAvailable": "",
|
||||
})
|
||||
|
||||
for room_type in room_types:
|
||||
free_rooms = self.check_availability_room_type(dfrom, dto,
|
||||
room_type.id)
|
||||
rates = self.get_rate_room_types(
|
||||
room_type_ids=room_type.id,
|
||||
date_from=dfrom,
|
||||
days=1,
|
||||
partner_id=False)
|
||||
room_type_rates.append({
|
||||
"RoomType": {
|
||||
"Id": room_type.id,
|
||||
"Name": room_type.name,
|
||||
"GuestNumber": room_type.get_capacity()
|
||||
},
|
||||
"TimeInterval": {
|
||||
"Id": "1",
|
||||
"Name": "1 day",
|
||||
"Minutes": "1440"
|
||||
},
|
||||
"Price": rates['price'],
|
||||
"IsAvailable": any(free_rooms),
|
||||
})
|
||||
return room_type_rates
|
||||
|
||||
@api.model
|
||||
def rm_get_prices(self, start_date, time_interval, number_intervals, room_type, guest_number):
|
||||
# TODO: FALTA POR COMPLETO
|
||||
_logger = logging.getLogger(__name__)
|
||||
_logger.info('ROOMMATIK get prices date %s Room: %s for %s Guests',
|
||||
start_date,
|
||||
room_type,
|
||||
guest_number)
|
||||
return {'start_date': start_date, 'time_interval': time_interval, 'number_intervals': number_intervals}
|
||||
def rm_get_prices(self, start_date, number_intervals, room_type, guest_number):
|
||||
start_date = fields.Datetime.from_string(start_date)
|
||||
end_date = start_date + timedelta(days=number_intervals)
|
||||
dfrom = start_date.strftime(
|
||||
DEFAULT_SERVER_DATE_FORMAT)
|
||||
dto = end_date.strftime(
|
||||
DEFAULT_SERVER_DATE_FORMAT)
|
||||
free_rooms = self.check_availability_room_type(dfrom, dto,
|
||||
room_type.id)
|
||||
if free_rooms:
|
||||
rates = self.get_rate_room_types(
|
||||
room_type_ids=room_type.id,
|
||||
date_from=dfrom,
|
||||
days=number_intervals,
|
||||
partner_id=False)
|
||||
return [item['price'] for item in rates.get(room_type.id)]
|
||||
return []
|
||||
|
||||
@@ -27,7 +27,7 @@ class ResPartner(models.Model):
|
||||
partner_res[0].document_number,
|
||||
partner_res[0].id,)
|
||||
try:
|
||||
partner_res[0].update(self.rm_preare_customer(customer))
|
||||
partner_res[0].update(self.rm_prepare_customer(customer))
|
||||
write_custumer = partner_res[0]
|
||||
except:
|
||||
_logger.error('ROOMMATIK Rewriting [%s] in BD [ %s ] ID',
|
||||
@@ -36,7 +36,7 @@ class ResPartner(models.Model):
|
||||
else:
|
||||
# Create new customer
|
||||
try:
|
||||
write_custumer = self.create(self.rm_preare_customer(customer))
|
||||
write_custumer = self.create(self.rm_prepare_customer(customer))
|
||||
_logger.info('ROOMMATIK Writing %s Name: %s',
|
||||
customer['IdentityDocument']['Number'],
|
||||
customer['FirstName'])
|
||||
@@ -48,14 +48,16 @@ class ResPartner(models.Model):
|
||||
json_response = json.dumps(json_response)
|
||||
return json_response
|
||||
|
||||
def rm_preare_customer(self, customer):
|
||||
def rm_prepare_customer(self, customer):
|
||||
# Check Sex string
|
||||
if customer['Sex'] not in {'male', 'female'}:
|
||||
customer['Sex'] = ''
|
||||
# Check state_id
|
||||
city_srch = self.env['res.country.state'].search([
|
||||
('name', 'ilike', customer['Address']['Province'])])
|
||||
# Create Street2
|
||||
country = self.env['res.country'].search([
|
||||
('name', 'ilike', customer['Address']['Province'])])
|
||||
# Create Street2s
|
||||
street_2 = customer['Address']['House']
|
||||
street_2 += ' ' + customer['Address']['Flat']
|
||||
street_2 += ' ' + customer['Address']['Number']
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
|
||||
import json
|
||||
from datetime import datetime
|
||||
from odoo import api, models
|
||||
from odoo import api, models, fields
|
||||
from odoo.tools import (
|
||||
DEFAULT_SERVER_DATE_FORMAT,
|
||||
DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -14,10 +17,13 @@ class RoomMatik(models.Model):
|
||||
@api.model
|
||||
def rm_get_date(self):
|
||||
# RoomMatik API Gets the current business date/time. (MANDATORY)
|
||||
utc_s = '+01:00'
|
||||
# TODO Need know UTC in the machine/hotel
|
||||
tz_hotel = self.env['ir.default'].sudo().get(
|
||||
'res.config.settings', 'tz_hotel')
|
||||
self_tz = self.with_context(tz=tz_hotel)
|
||||
mynow = fields.Datetime.context_timestamp(self_tz, datetime.now()).\
|
||||
strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
json_response = {
|
||||
'dateTime': datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f") + utc_s
|
||||
'dateTime': mynow
|
||||
}
|
||||
json_response = json.dumps(json_response)
|
||||
return json_response
|
||||
@@ -26,7 +32,7 @@ class RoomMatik(models.Model):
|
||||
def rm_get_reservation(self, reservation_code):
|
||||
# RoomMatik Gets a reservation ready for check-in
|
||||
# through the provided code. (MANDATORY)
|
||||
apidata = self.env['hotel.folio']
|
||||
apidata = self.env['hotel.reservation']
|
||||
return apidata.rm_get_reservation(reservation_code)
|
||||
|
||||
@api.model
|
||||
@@ -62,12 +68,13 @@ class RoomMatik(models.Model):
|
||||
return apidata.rm_get_all_room_type_rates()
|
||||
|
||||
@api.model
|
||||
def rm_get_prices(self, start_date, time_interval, number_intervals, room_type, guest_number):
|
||||
def rm_get_prices(self, start_date, number_intervals, room_type, guest_number):
|
||||
# Gets some prices related to different dates of the same stay.
|
||||
# return ArrayOfDecimal
|
||||
room_type = self.env['hotel.room.type'].browse(room_type)
|
||||
_logger.info('ROOMMATIK Get Prices')
|
||||
apidata = self.env['hotel.room.type']
|
||||
return apidata.rm_get_prices(start_date, time_interval, number_intervals, room_type, guest_number)
|
||||
return apidata.rm_get_prices(start_date, number_intervals, room_type, guest_number)
|
||||
|
||||
# Debug Stop -------------------
|
||||
# import wdb; wdb.set_trace()
|
||||
|
||||
Reference in New Issue
Block a user