diff --git a/hotel/models/hotel_room_type.py b/hotel/models/hotel_room_type.py index 6600a54d4..aade9f8bf 100644 --- a/hotel/models/hotel_room_type.py +++ b/hotel/models/hotel_room_type.py @@ -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 diff --git a/hotel_roommatik/models/inherited_hotel_checkin_partner.py b/hotel_roommatik/models/inherited_hotel_checkin_partner.py index 7243fa943..809b20e8a 100644 --- a/hotel_roommatik/models/inherited_hotel_checkin_partner.py +++ b/hotel_roommatik/models/inherited_hotel_checkin_partner.py @@ -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'] = {} diff --git a/hotel_roommatik/models/inherited_hotel_folio.py b/hotel_roommatik/models/inherited_hotel_folio.py index 4d2cdabdd..4a1fb00fd 100755 --- a/hotel_roommatik/models/inherited_hotel_folio.py +++ b/hotel_roommatik/models/inherited_hotel_folio.py @@ -1,7 +1,6 @@ # Copyright 2019 Jose Luis Algara (Alda hotels) # 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) diff --git a/hotel_roommatik/models/inherited_hotel_reservation.py b/hotel_roommatik/models/inherited_hotel_reservation.py index 856e12ec8..8d603db48 100644 --- a/hotel_roommatik/models/inherited_hotel_reservation.py +++ b/hotel_roommatik/models/inherited_hotel_reservation.py @@ -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)]) diff --git a/hotel_roommatik/models/inherited_hotel_room_type.py b/hotel_roommatik/models/inherited_hotel_room_type.py index e281243c3..a43041662 100644 --- a/hotel_roommatik/models/inherited_hotel_room_type.py +++ b/hotel_roommatik/models/inherited_hotel_room_type.py @@ -1,9 +1,13 @@ # Copyright 2019 Jose Luis Algara (Alda hotels) # 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 [] diff --git a/hotel_roommatik/models/inherited_res_partner.py b/hotel_roommatik/models/inherited_res_partner.py index 7a0354b3b..c967bce87 100755 --- a/hotel_roommatik/models/inherited_res_partner.py +++ b/hotel_roommatik/models/inherited_res_partner.py @@ -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'] diff --git a/hotel_roommatik/models/roommatik.py b/hotel_roommatik/models/roommatik.py index 3b0c0f5cb..b6e6b898b 100755 --- a/hotel_roommatik/models/roommatik.py +++ b/hotel_roommatik/models/roommatik.py @@ -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()