[WIP] roommatik api

This commit is contained in:
Dario Lodeiros
2019-04-23 10:55:34 +02:00
parent 816eed9de3
commit aff7edd26c
7 changed files with 131 additions and 99 deletions

View File

@@ -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

View File

@@ -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'] = {}

View File

@@ -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)

View File

@@ -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)])

View File

@@ -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 []

View File

@@ -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']

View File

@@ -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()