# -*- coding: utf-8 -*- from odoo import http from werkzeug.exceptions import Forbidden from odoo.http import request from datetime import datetime, timedelta import logging from odoo import tools import time import werkzeug.urls from werkzeug.exceptions import NotFound from dateutil.relativedelta import relativedelta from odoo.addons.payment.controllers.post_processing import PaymentPostProcessing from odoo.addons.portal.controllers.portal import CustomerPortal from odoo.addons.sale.controllers import portal as sale_portal from odoo.osv import expression from odoo.tools.translate import _ from odoo import fields, models, api import hashlib import json import ast from odoo import SUPERUSER_ID from odoo.exceptions import AccessError, MissingError, ValidationError, UserError from builtins import int from odoo.fields import Command from odoo.addons.payment.controllers import portal as payment_portal import pytz import math from odoo.addons.website_sale.controllers.main import WebsiteSale from odoo.addons.payment.controllers.post_processing import PaymentPostProcessing utc_time = datetime.utcnow() _logger = logging.getLogger(__name__) from odoo import http from odoo.http import request class HotelRoomDashboardController(http.Controller): @http.route('/your_route', type='http', auth="user", csrf=False) def your_method(self): # Find the menu action by its XML ID action = request.env.ref('hotel_room_dashboard_view.hotel_compare_widget_client_actn') # Call the menu action result = action.read()[0] # Redirect or return the result as per your requirements return request.render('hotel_room_dashboard_view.hotel_dashboard_template', result) class PaymentPortal(payment_portal.PaymentPortal): @http.route( '/shop/payment/transaction/', type='json', auth='public', website=True ) def shop_payment_transaction(self, order_id, access_token, **kwargs): """ Create a draft transaction and return its processing values. :param int order_id: The sales order to pay, as a `sale.order` id :param str access_token: The access token used to authenticate the request :param dict kwargs: Locally unused data passed to `_create_transaction` :return: The mandatory values for the processing of the transaction :rtype: dict :raise: ValidationError if the invoice id or the access token is invalid """ try: # self._document_check_access('hotel.reservation', order_id, access_token) _logger.info("SESSION===>>>>>>>>>>>>>>%s",order_id) if request.session.get('reservation_order_id'): order_sudo = self._document_check_access('hotel.reservation', order_id, access_token) elif request.session.get('sale_order_id'): order_sudo = self._document_check_access('sale.order', order_id, access_token) except MissingError as error: raise error except AccessError: raise ValidationError("The access token is invalid.") if order_sudo.state == "cancel": raise ValidationError(_("The order has been canceled.")) if request.session.get('reservation_order_id'): if tools.float_compare(kwargs['amount'], order_sudo.total_cost1, precision_rounding=order_sudo.currency_id.rounding): raise ValidationError(_("The cart has been updated. Please refresh the page.")) elif request.session.get('sale_order_id'): if tools.float_compare(kwargs['amount'], order_sudo.amount_total, precision_rounding=order_sudo.currency_id.rounding): raise ValidationError(_("The cart has been updated. Please refresh the page.")) if order_id: if request.session.get('reservation_order_id'): order = request.env['hotel.reservation'].sudo().search( [('id', '=', int(order_id))]) request.session['reservation_last_order_id'] = order.id elif request.session.get('sale_order_id'): order = request.env['sale.order'].sudo().search( [('id', '=', int(order_id))]) request.session['sale_last_order_id'] = order.id # kwargs.update({ # 'reference_prefix': None, # Allow the reference to be computed based on the order # 'sale_order_id': order_id, # Include the SO to allow Subscriptions to tokenize the tx # }) if request.session.get('reservation_order_id'): kwargs.update({ 'reference_prefix': order.name, # Allow the reference to be computed based on the order 'reservation_id': order_id, # Include the SO to allow Subscriptions to tokenize the tx 'partner_id':order.partner_id.id, 'currency_id':order.currency_id.id, }) kwargs.pop('custom_create_values', None) # Don't allow passing arbitrary create values tx_sudo = self._create_transaction( custom_create_values={ 'reservation_ids': [Command.set([order_id])], }, **kwargs, ) elif request.session.get('sale_order_id'): kwargs.update({ 'reference_prefix': None, # Allow the reference to be computed based on the order 'sale_order_id': order_id, # Include the SO to allow Subscriptions to tokenize the tx }) kwargs.pop('custom_create_values', None) # Don't allow passing arbitrary create values tx_sudo = self._create_transaction( custom_create_values={'sale_order_ids': [Command.set([order_id])]}, **kwargs, ) # Store the new transaction into the transaction list and if there's an old one, we remove # it until the day the ecommerce supports multiple orders at the same time. last_tx_id = request.session.get('__website_sale_last_tx_id') last_tx = request.env['payment.transaction'].browse(last_tx_id).sudo().exists() # if last_tx: # PaymentPostProcessing.remove_transactions(last_tx) request.session['__website_sale_last_tx_id'] = tx_sudo.id return tx_sudo._get_processing_values() class PaymentPostProcessingInherit(PaymentPostProcessing): @http.route(['/payment/status'], type="http", auth="public", website=True, sitemap=False) def display_status(self, **kwargs): _logger.info("\n\n\n\n\n\n\nREQUEST PAYMENT STATUS===>>>>>>>>>>>>>>{}\n\n\n\n\n\n\n".format(request.session)) if not request.session.get('reservation_order_id'): if request.session.get('sale_order_id'): sale_order_id = request.env['sale.order'].sudo().search([('id','=', request.session.get('sale_order_id'))]) tx = request.website.sale_get_transaction() _logger.info("TRANSACTION===>>>>>>>>{}".format(tx.state)) if tx and tx.state == 'done': sale_order_id.sudo().write({ 'state': 'done' }) res = super(PaymentPostProcessingInherit, self).display_status() return res else: _logger.info("REQUEST===>>>>>>>>>>>>>{}".format(request.session)) tx = request.website.sale_get_transaction() _logger.info("REQUEST===>>>>>>>>>>>>>{}".format(tx)) if request.session.get('reservation_order_id'): order_id = request.website.get_reservation() order_id = request.env['hotel.reservation'].sudo().search([('id', '=', order_id)]) order = None # order_obj = request.env['payment.transaction'].browse(order_id) if tx and tx.state == 'done': if request.session.get('reservation_order_id'): order = tx.reservation_id if order_id: order_id.confirmed_reservation() payment_vals = { 'amt': tx.amount, 'reservation_id': order_id.id, 'payment_date': datetime.now().date(), 'deposit_recv_acc': order_id.partner_id.property_account_receivable_id.id, 'journal_id': tx.provider_id.journal_id.id, } _logger.info("@@@@@@@@@@@@@@@@@@@%s", payment_vals) if request.session.get('reservation_order_id'): wiz_obj = request.env['advance.payment.wizard'].sudo().with_context(active_model='hotel.reservation', active_id=order_id.id).create( payment_vals) wiz_obj.with_context(active_model='hotel.reservation').payment_process() _logger.info("WIZARD======>>>>>>>>>>%s", wiz_obj) order = order_id elif order_id: if request.session.get('reservation_order_id'): order_obj = request.env['hotel.reservation'].sudo().browse( order_id) tx = request.env['payment.transaction'].sudo().search( [('reservation_id', '=', order_obj.id.id), ('state', '=', 'draft')], limit=1) if request.session.get('sale_order_id'): order_obj = request.env['sale.order'].sudo().browse( order_id) tx = request.env['payment.transaction'].sudo().search( [('sale_order_ids', '=', order_obj.id.id), ('state', '=', 'draft')], limit=1) tx.write({'state': 'done'}) if request.session.get('sale_order_id'): order = request.session.get('sale_order_id') if request.session.get('reservation_order_id'): order = tx.reservation_id if order: order.confirmed_reservation() payment_vals = { 'amt': tx.amount, 'reservation_id': order.id, 'payment_date': datetime.now().date(), 'deposit_recv_acc': order.partner_id.property_account_receivable_id.id, 'journal_id': tx.acquirer_id.journal_id.id, } if request.session.get('reservation_order_id'): wiz_obj = request.env['advance.payment.wizard'].sudo().create(payment_vals) wiz_obj.with_context(active_model='hotel.reservation', active_id=order_id.id).payment_process() else: order = order_id if request.session.get('reservation_order_id'): return request.render("hotel_online.confirmation1", {'order': order}) class WebsiteShopInherit(WebsiteSale): @http.route(['/shop/cart/update'], type='http', auth="public", methods=['POST'], website=True, csrf=False) def cart_update(self, product_id, add_qty=1, set_qty=0, **kw): _logger.info("\n\n\n\n\n\nREQUEST===>>>>>>>>>>>>>>{}\n\n\n\n\n".format(request.session)) if not request.session.get('reservation_order_id'): res = super(WebsiteShopInherit, self).cart_update(product_id) return res else: _logger.info("PRODUCT ID===>>>>>>>>>>>>>{}".format(request.session)) product_id = request.env['product.template'].sudo().search( [('id', '=', product_id)]) vals = { 'product_id': product_id.id, 'name': product_id.name, 'product_uom': product_id.uom_id.id, 'product_uom_qty': add_qty, 'price_unit': product_id.list_price, } if product_id.taxes_id: vals.update({ 'tax_id': [(6, 0, [product_id.taxes_id.id])], }) _logger.info("RESERVATION ID====>>>>%s", request.session.get('reservation_order_id')) if request.session.get('reservation_order_id'): order = request.env['hotel.reservation'].sudo().search( [('id', '=', request.session.get('reservation_order_id'))]) other_items_id = request.env['other.items'].sudo().create(vals) vals.update({'other_items_id': order.id, }) if request.uid != 4: return request.redirect('/shop/payment') else: return request.redirect('/partner/checkout') @http.route(['/shop/cart/update_json'], type='json', auth="public", methods=['POST'], website=True, csrf=False) def cart_update_json(self, product_id, line_id=None, add_qty=None, set_qty=None, display=True, **kw): if not request.session.get('reservation_order_id'): _logger.info("PRODUCT ID========>>>>>>>{}".format(product_id)) res = super(WebsiteShopInherit, self).cart_update_json(product_id, line_id, add_qty, set_qty, display, **kw) return res else: _logger.info("PRODUCT ID===>>>>>>>>>>>>>{}".format(request.session)) product_id = request.env['product.template'].sudo().search( [('id', '=', product_id)]) vals = { 'product_id': product_id.id, 'name': product_id.name, 'product_uom': product_id.uom_id.id, 'product_uom_qty': add_qty, 'price_unit': product_id.list_price, } if product_id.taxes_id: vals.update({ 'tax_id': [(6, 0, [product_id.taxes_id.id])], }) _logger.info("RESERVATION ID====>>>>%s", request.session.get('reservation_order_id')) if request.session.get('reservation_order_id'): order = request.env['hotel.reservation'].sudo().search( [('id', '=', request.session.get('reservation_order_id'))]) vals.update({'other_items_id': order.id, }) other_items_id = request.env['other.items'].sudo().create(vals) _logger.info("OTHER ITEMS ID==========>>>>>>>>>>{}".format(other_items_id)) _logger.info("ORDER ID==========>>>>>>>>>>>>>>>>{}".format(order)) _logger.info("UID====>>>>>>>>>>>>>>{}".format(request.uid)) if request.uid != 4: return request.redirect('/shop/payment') else: _logger.info("REQUEST REDIRECT===>>>>>>>>>>>{}".format(request.session)) return request.redirect('/partner/checkout') class check(http.Controller): @http.route(['/page/hotel_online.product_show', '/page/product_show'], auth="public", website=True) def contact(self, **kwargs): #print "*********** contact ***********",self values = {} portal_id = request.env['hotel.room'].sudo().search([]) for port in portal_id: port.sudo().write({'state': 'draft'}) request.website.sale_reset() values.update({ 'home':True }) return request.render("hotel_online.product_show", values) @http.route('/product_screen/', type='http', auth='public', website=True) def get_products(self): result = {} values = {'product': False} return request.redirect_query("/page/hotel_online.product_show", values) @http.route('/product_search/', auth='public', website=True) def search_products(self, **kwargs): lst = [] res1 = [] res = [] room_ids1 = [] room_res = {} cnt = 0 result_list11 = [] count = [] result = {} rm_brw = [] date_values = list(kwargs.values()) if not (kwargs.get('from_date') and kwargs.get('to_date')): raise UserError("Please Enter Checkin Date And Checkout Date") self._uid = SUPERUSER_ID product_id = request.env['product.product'].sudo().search([]).ids room_idsss = request.env['hotel.room_type'].sudo().search([]).ids amenities_idsss = request.env['hotel.room_type'].sudo().search([]).ids services_idsss = request.env['hotel.services'].sudo().search([]).ids if room_idsss: room_res11 = {} room_brw = request.env['hotel.room_type'].sudo().browse(room_idsss) amenities_brw = request.env['hotel.room_type'].sudo().browse(amenities_idsss) services_brw = request.env['hotel.services'].sudo().browse(services_idsss) # values = ['Restaurant', 'Laundry', 'Housekeeping', 'GDS', 'Transportation', 'Themescape'] # icons = { # 'Restaurant': 'fa fa-cutlery', # 'Laundry': 'fa fa-shirtsinbulk', # 'Housekeeping': 'fa fa-wrench', # 'GDS': 'fa fa-globe', # 'Transportation': 'fa fa-truck', # 'Themescape': 'fa fa-magic' # } # desc = '' # desc += '
' # for value in values: # icon = icons.get(value, '') # desc += '
' # desc += f'
{value}' # desc += '
' # desc += '
' for rbrw in room_brw: room_res11 = {} res = [] res1 = [] img_lst = [] img_lst_ids = [] # rbrw.facilities = desc room_res11['type'] = rbrw.name, room_res11['description'] = rbrw.description # print("===rbrw*****************************************************===", rbrw) # print("===rbrw.description===", rbrw.description) room_res11['amenities'] = [] if amenities_idsss: amenities = rbrw.room_type_amenities for amenity in amenities: if amenity != False: room_res11['amenities'].append(amenity.name) else: pass # room_res11['facilities'] = rbrw.facilities img_lst = rbrw.img_ids user = request.env['res.users'].sudo().browse(request.uid) company = request.env.user.sudo().company_id if kwargs['from_date'] and kwargs['to_date']: room_res11['chkin'] = kwargs['from_date'] room_res11['chkout'] = kwargs['to_date'] for i in img_lst: img_lst_ids.append(i.id) if rbrw.img_ids: room_res11['image'] = img_lst_ids else: room_res11['image'] = '' room_ids111 = request.env['hotel.room'].sudo().search([]).ids if room_ids111: room_br11 = request.env['hotel.room'].sudo().browse( room_ids111) room_ids1 = [] room_res11['room_type_id'] = rbrw.id shop_ids = request.env['sale.shop'].sudo().search( [('company_id', '=', request.env.user.sudo().company_id.id)]).ids shop_brw = request.env['sale.shop'].sudo().browse( shop_ids[0]) room_res11['currency'] = shop_brw.pricelist_id.currency_id.symbol for r in room_br11: if r.product_id.product_tmpl_id.categ_id == rbrw.cat_id: room_ids1.append(r.id) for rm in room_ids1: rm1 = request.env['hotel.room'].sudo().browse(rm) # price1 = shop_brw.sudo().pricelist_id.price_get( # rm1.product_id.id, False, { # 'uom': rm1.product_id.uom_id.id, # 'date': kwargs['from_date'], # })[shop_brw.pricelist_id.id] if shop_brw.pricelist_id.id: price1 = shop_brw.sudo().pricelist_id._price_get(rm1.product_id, 0)[shop_brw.pricelist_id.id] else: price1 = 0 room_res11['price'] = round(price1, 2) book_his = request.env['hotel.room.booking.history'].sudo().search( [('history_id', '=', rm)]).ids _logger.info("BOOKING HISTORY===>>>>>%s", book_his) if book_his: room_book = '' book_brw = request.env['hotel.room.booking.history'].sudo().browse( book_his) for bk_his in book_brw: start_date = datetime.strptime( kwargs['from_date'], '%Y-%m-%d').date() end_date = datetime.strptime( kwargs['to_date'], '%Y-%m-%d').date() try: chkin_date = datetime.strptime( str(bk_his.check_in), '%Y-%m-%d %H:%M:%S').date() except Exception as e: chkin_date = datetime.strptime( str(bk_his.check_in), '%Y-%m-%d %H:%M:%S.%f').date() try: chkout_date = datetime.strptime( str(bk_his.check_out), '%Y-%m-%d %H:%M:%S').date() except Exception as e: chkout_date = datetime.strptime( str(bk_his.check_out), '%Y-%m-%d %H:%M:%S.%f').date() # if((start_date <= chkin_date and chkout_date <= end_date)or(start_date <= chkin_date and chkout_date >= end_date>chkin_date) or (start_date >= chkin_date and chkout_date >= end_date)or (start_date >= chkin_date and chkout_date >= end_date)): # "--chkout_date--", chkout_date) _logger.info("Booking History ===>>>>>%s", bk_his) if ((start_date <= chkin_date and ( chkout_date <= end_date or chkout_date >= end_date >= chkin_date)) or ( start_date >= chkin_date and chkout_date >= end_date) or ( start_date <= chkout_date <= end_date)): room_book = bk_his.history_id break else: if not bk_his.history_id in lst: lst.append(bk_his.history_id) if room_book in lst: lst.remove(room_book) for l in lst: rm_brw = l housek = request.env['hotel.housekeeping'].sudo().search( [('room_no', '=', rm_brw.product_id.id), ('state', '=', 'dirty')]) if not housek: if rm_brw.product_id.product_tmpl_id.categ_id == rbrw.cat_id: if not rm_brw in res1: res1.append(rm_brw) else: rm_brw = request.env['hotel.room'].sudo().browse(rm) if rm_brw.product_id.product_tmpl_id.categ_id == rbrw.cat_id: housek = request.env['hotel.housekeeping'].sudo().search( [('room_no', '=', rm_brw.product_id.id), ('state', '=', 'dirty')]) if not housek: res1.append(rm_brw) cnt = 0 count = [] adult = [] child = [] if rm_brw: for i in range(1, (int(rm_brw[0].max_adult) + 1)): adult.append(i) for i in range(1, (int(rm_brw[0].max_child) + 1)): child.append(i) for r in res1: cnt = cnt + 1 count.append(cnt) # print "aduultt--",adult,"--child--",child room_res11['count'] = count, room_res11['adult'] = adult, room_res11['child'] = child, # if amenities_idsss: # room_res11['amenities'] = [] # room_types = [entry['type'][0] for entry in result_list11] # # print("===room_types===", room_types) # for rbrw in amenities_brw: # # print("===rbrw===", rbrw.name) # room_res11['amenities'].append(rbrw.room_type_amenities.name) # print("===room_res11['amenities']===", room_res11['amenities']) room_res11['services'] = [] if services_idsss: for rbrw in services_brw: room_res11['services'].append(rbrw) result_list11.append(room_res11) values = { 'length': len(room_idsss), 'count': count, 'room_res': result_list11 # 'room_res': None } _logger.info("VALUES====>>>>>>>>>%s", values) return request.render("hotel_online.product_show", values) @http.route(['/page/hotel_online.booking_show', '/page/booking_show'], type='http', auth="public", website=True) def contact11(self, **kwargs): values = {} return request.render("hotel_online.booking_show", values) @http.route('/booking_screen/', type='http', auth='pubilc', website=True) def get_productsss(self): values = {'product': False} return http.local_redirect("/page/hotel_online.booking_show", values) @http.route(['/product/reserv/'], type='http', auth="public", website=True) def reserv_products(self, **kwargs): # cr, context , pool= request.cr, request.context, request.registry values = {} rm_types = [] room_id123 = [] room_data = [] lsttt = [] cnt = 0 tot = 0 tax = 0 dayss = 0 res1, lst = [], [] room_id = '' self._uid = SUPERUSER_ID user = request.env['res.users'].sudo().browse(request.uid) company = request.env.user.sudo().company_id # crt_cont = self.env['res.partner'].sudo.create({}) names = [value for key, value in kwargs.items() if key.startswith('name_') and value] # print(names) create_contact = request.env['res.partner'].sudo().create({'name': names[0]}) if request.uid != 4: user_id = request.env['res.users'].sudo().search( [('id', '=', request.uid)]) part_id = user_id.partner_id else: part_id = request.env['res.partner'].sudo().search( [('name', '=', 'Public user'), ('active', '=', False)]) shop_ids = request.env['sale.shop'].sudo().search( [('company_id', '=', company.id)]).ids shop_brw = request.env['sale.shop'].sudo().browse(shop_ids[0]) if 'chkin_id' in kwargs: newdate = kwargs['chkin_id'] + " 01:00:00" if 'chkout_id' in kwargs: newdate1 = kwargs['chkout_id'] + " 00:00:00" dt = datetime.strptime(time.strftime( '%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S').date() no = int(kwargs['len']) + 1 total_no_adults = 0 total_no_childs = 0 for ll in range(1, int(no)): lsttt.append(ll) for l1 in lsttt: no_of_childs = 0 no_of_adults = 0 record = {} str1 = 'type_' + str(l1) str2 = 'child_' + str(l1) str3 = 'adult_' + str(l1) str4 = 'sel_' + str(l1) str5 = 'no_room_' + str(l1) if str1 in kwargs: record.update({'room_type': int(kwargs[str1])}) if str2 in kwargs: record.update({'child': int(kwargs[str2])}) no_of_childs = int(kwargs[str2]) if str3 in kwargs: record.update({'adult': int(kwargs[str3])}) no_of_adults += int(kwargs[str3]) if str4 in kwargs: record.update({'chk': kwargs[str4]}) if str5 in kwargs: record.update({'no_room': int(kwargs[str5])}) if int(kwargs[str5]): if no_of_adults: total_no_adults += no_of_adults * int(kwargs[str5]) if no_of_childs: total_no_childs += no_of_childs * int(kwargs[str5]) if record: rm_types.append(record) room_id = request.session.get('reservation_order_id') _logger.info("RESERVATION ID====>>>>>>>>>%s", room_id) # room_id = request.env['hotel.reservation'].sudo().search( # [('id', '=', room_id)]) if not room_id: room_id = request.env['hotel.reservation'].sudo().create({ 'partner_id': create_contact.id, 'shop_id': shop_ids[0], 'adults': total_no_adults, 'childs': total_no_childs, 'pricelist_id': shop_brw.pricelist_id.id, 'source': 'through_web', 'date_order': time.strftime('%Y-%m-%d %H:%M:%S'), }) _logger.info("RESERVATION ID2====>>>>>>>>>%s", room_id) request.session['reservation_order_id'] = room_id.id else: room_id = request.env['hotel.reservation'].sudo().search( [('id', '=', room_id)]) tot_lines = 0 for rtype in rm_types: room_brwww = request.env['hotel.room_type'].sudo().browse( rtype['room_type']) ######################################################################################### room_ids111 = request.env['hotel.room'].sudo().search([]).ids if room_ids111: room_br11 = request.env['hotel.room'].sudo().browse( room_ids111) room_ids1 = [] for r in room_br11: housek = request.env['hotel.housekeeping'].sudo().search( [('room_no', '=', r.product_id.id), ('state', '=', 'dirty')]).ids if not housek: if r.product_id.product_tmpl_id.categ_id.id == room_brwww.cat_id.id: room_ids1.append(r.id) res1 = [] for rm in room_ids1: book_his = request.env['hotel.room.booking.history'].sudo().search( [('history_id', '=', rm)]).ids if book_his: room_book = '' book_brw = request.env['hotel.room.booking.history'].sudo().browse( book_his) for bk_his in book_brw: if kwargs['chkin_id'] and kwargs['chkout_id']: start_date = datetime.strptime( kwargs['chkin_id'], '%Y-%m-%d').date() end_date = datetime.strptime( kwargs['chkout_id'], '%Y-%m-%d').date() try: chkin_date = datetime.strptime( str(bk_his.check_in), '%Y-%m-%d %H:%M:%S').date() except Exception as e: chkin_date = datetime.strptime( str(bk_his.check_in), '%Y-%m-%d %H:%M:%S.%f').date() try: chkout_date = datetime.strptime( str(bk_his.check_out), '%Y-%m-%d %H:%M:%S').date() except Exception as e: chkout_date = datetime.strptime( str(bk_his.check_out), '%Y-%m-%d %H:%M:%S.%f').date() # if not ((start_date <= chkin_date and chkout_date <= end_date)or(start_date <= chkin_date and chkout_date >= end_date) or (start_date >= chkin_date and chkout_date >= end_date)or (start_date >= chkin_date and chkout_date >= end_date)): # lst.append(bk_his.history_id) if ((start_date <= chkin_date and ( chkout_date <= end_date or chkout_date >= end_date >= chkin_date)) or ( start_date >= chkin_date and chkout_date >= end_date) or ( start_date <= chkout_date <= end_date)): room_book = bk_his.history_id break else: if not bk_his.history_id in lst: lst.append(bk_his.history_id) if room_book in lst: lst.remove(room_book) for l in lst: rm_brw = l if rm_brw.product_id.product_tmpl_id.categ_id == room_brwww.cat_id: if not rm in res1 and not rm_brw in res1: res1.append(rm_brw) else: rm_brw = request.env['hotel.room'].sudo().browse(rm) if rm_brw.product_id.product_tmpl_id.categ_id == room_brwww.cat_id: res1.append(rm_brw) if 'no_room' in rtype and 'chk' in rtype: if rtype['chk'] == 'on': for lno in range(0, (int(rtype['no_room']))): no_of_days = (datetime.strptime(newdate1, '%Y-%m-%d %H:%M:%S') - datetime.strptime(newdate, '%Y-%m-%d %H:%M:%S')).total_seconds() no_of_days = no_of_days / 86400 no_of_days = "{:.2f}".format(no_of_days) _logger.info("DIFFERENCE==>>>>>>>>>{}".format(no_of_days)) no_of_days = math.ceil(float(no_of_days)) _logger.info("NO OF DAYS====>>>>>%s", no_of_days) cin = str(datetime.strptime( newdate, '%Y-%m-%d %H:%M:%S').date()) # price = shop_brw.sudo().pricelist_id.price_get( # res1[lno].product_id.id, no_of_days, { # 'uom': res1[lno].product_id.uom_id.id, # 'date': cin, # })[shop_brw.pricelist_id.id] if len(res1) > 0: price = shop_brw.sudo().pricelist_id._price_get(res1[lno].product_id, 0) for key,value in price.items(): price = value vals = { 'checkin': datetime.strptime(newdate, '%Y-%m-%d %H:%M:%S'), 'checkout': datetime.strptime(newdate1, '%Y-%m-%d %H:%M:%S'), 'categ_id': room_brwww.cat_id.id, 'room_number': res1[lno].product_id.id, # 'taxes_id': [(6, 0, [res1[lno].taxes_id.id])], 'line_id': room_id.id, 'price': price, 'number_of_days': no_of_days, } vals = self.set_checkin_checkout(vals) _logger.info("VALSSS===>>>>>>%s", vals) room_line_id = request.env['hotel.reservation.line'].sudo().create( vals) room_id.write({ 'room_no': [(4, res1[lno].product_id.id)], }) # room_id = request.env['hotel.reservation'].sudo().search([('id','=',room_id.id)]) _logger.info("\n\n\n\n\n\n ROOM ID===>>>>>>%s",room_line_id.line_id) if res1[lno].taxes_id.id: room_line_id.update( {'taxes_id': [(6, 0, [res1[lno].taxes_id.id])]}) room_line_id.line_id.sudo().compute() # room_id.sudo().compute() for rec in room_line_id: room_line_id = request.env['hotel.room'].sudo().search( [('product_id', '=', rec.room_number.id)]) _logger.info( "ROOM LINE ID=====>>>%s", room_line_id) vals = { 'partner_id': create_contact.id, 'check_in': rec.checkin, 'check_out': rec.checkout, 'history_id': room_line_id.id, 'product_id': rec.room_number.id, 'booking_id': room_id.id, 'state': 'draft', 'category_id': room_line_id.categ_id.id, 'name': rec.room_number.name, 'check_in_date': (rec.checkin).date(), 'check_out_date': (rec.checkout).date(), } _logger.info( "VALS Booking History=======>>>>>>>>>>>%s", vals) room_his_id = request.env['hotel.room.booking.history'].sudo().create(vals) dict = {} if 'no_room' in rtype and 'chk' in rtype: tot_lines = tot_lines + rtype['no_room'] room_brw = request.env['hotel.room_type'].sudo().browse( rtype['room_type']) for lll in range(1, (int(rtype['no_room'] + 1))): dict = {'rm_name': room_brw.name} if room_brw.img_ids: dict.update({'image': room_brw.img_ids[0].id}) if 'child' in rtype: dict.update({'child': int(rtype['child'])}) if 'adult' in rtype: dict.update({'adult': int(rtype['adult'])}) if 'chkin_id' in kwargs: dict.update({'chkin': kwargs['chkin_id']}) if 'chkout_id' in kwargs: dict.update({'chkout': kwargs['chkout_id']}) delta = (datetime.strptime(newdate1, '%Y-%m-%d %H:%M:%S')) - ( datetime.strptime(newdate, '%Y-%m-%d %H:%M:%S')) dayss = delta.total_seconds() dayss = dayss / 86400 dayss = "{:.2f}".format(dayss) _logger.info("DIFFERENCE==>>>>>>>>>{}".format(dayss)) dayss = math.ceil(float(dayss)) # if delta.days == 0: # nights = 1 # dayss = 1 # else: # nights = delta.days nights = dayss if delta: dict.update({'nights': nights}) dict.update({'img': company.currency_id.symbol}) room_search = request.env['hotel.room'].sudo().search( []).ids if room_search: for rm_sear in room_search: rm_brw = request.env['hotel.room'].sudo().browse( rm_sear) if rm_brw.product_id.product_tmpl_id.categ_id.id == room_brw.cat_id.id: price = rm_brw.lst_price * dayss tot = tot + rm_brw.lst_price tax = tax + price * \ (rm_brw.taxes_id.amount / 100) # tax = tax + 0.00 break dict.update({'price': "%.2f" % price, }) room_data.append(dict) values = { 'room_data': room_data, 'length': tot_lines, 'tot': "%.2f" % (tot * dayss), 'tax': "%.2f" % tax, 'tot_tax': "%.2f" % ((tot * dayss) + tax), 'room_id': room_id.id, } return request.render("hotel_online.booking_show", values) def set_checkin_checkout(self, vals): user_id = request.env['res.users'].sudo().search([('id', '=', 2)]) tz = pytz.timezone(user_id.tz) time_difference = tz.utcoffset(utc_time).total_seconds() _logger.info("TIME DIFFERENCE===>>>>>>>>>>>>>>>>>>{}".format(time_difference)) _logger.info("VALS SHOP ID===>>>>{}".format(vals.get('line_id'))) reservation_id = request.env['hotel.reservation'].sudo().search([('id', '=', vals.get('line_id'))]) _logger.info("RESERVATION ID===>>>>>>{}".format(reservation_id)) sale_shop_id = request.env['sale.shop'].sudo().search([('id', '=', reservation_id.shop_id.id)]) _logger.info("SALE SHOP ID ===>>>>>>>>>>>>>{}".format(sale_shop_id)) checkout_policy_id = request.env['checkout.configuration'].sudo().search([('shop_id', '=', sale_shop_id.id)]) if checkout_policy_id.name == 'custom': time = int(checkout_policy_id.time) checkin = vals.get('checkin') checkin = datetime(checkin.year, checkin.month, checkin.day) checkin = checkin + timedelta(hours=int(time)) checkout = vals.get('checkout') checkout = datetime(checkout.year, checkout.month, checkout.day) checkout = checkout + timedelta(hours=int(time)) checkout = checkout - timedelta(seconds=time_difference) checkin = checkin - timedelta(seconds=time_difference) _logger.info("\n\n\n\n\nVALS=====>>>>>>>>>>>>>>>>>>{}".format(checkout)) vals.update({'checkout': checkout, 'checkin': checkin}) else: now = datetime.now() current_time = now.strftime("%H:%M:%S") _logger.info("CURRENT TIME ===>>>>>>>>{}".format(current_time)) checkin = vals.get('checkin') _logger.info("CHECKIN TIME===>>>>>>>>>>>{}".format(type(checkin))) from_string = datetime.strptime(current_time, "%H:%M:%S") _logger.info("CHECKIN TIME===>>>>>>>>>>>{}".format(type(from_string))) checkin = checkin + timedelta(hours=from_string.hour, minutes=from_string.minute, seconds=from_string.second) _logger.info("CHECKIN TIME===>>>>>>>>>>>{}".format(checkin)) checkout = vals.get('checkout') checkout = checkout + timedelta(hours=from_string.hour, minutes=from_string.minute, seconds=from_string.second) vals.update({'checkout': checkout, 'checkin': checkin}) return vals @http.route(['/product_remove/'], type='http', auth="public", website=True) def remove_products(self, **kwargs): values = {} i = 0 tot = 0 room_data = [] if 'len' in kwargs: data = ast.literal_eval(kwargs['len'])['data'] for l in data: if 'room_type' in kwargs and 'rm_name' in l and str(l['rm_name']) == str(kwargs['room_type']): if 'adult' in kwargs and 'adult' in l and str(l['adult']) == str(kwargs['adult']): if 'child' in kwargs and 'child' in l and str(l['child']) == str(kwargs['child']): data.pop(i) i = i + 1 part_id = request.env['res.partner'].sudo().search( [('name', '=', 'Public user'), ('active', '=', False)], limit=1) reserv_se = request.env['hotel.reservation'].sudo().search( [('partner_id', '=', part_id)]) if reserv_se: for r_sear in reserv_se: reserv_br = request.env['hotel.reservation'].sudo().browse( r_sear) if datetime.strptime(reserv_br.date_order, '%Y-%m-%d %H:%M:%S').date() == datetime.strptime( time.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S').date(): if reserv_br.reservation_line: for rl in reserv_br.reservation_line: if 'chkin' in kwargs and 'chkout' in kwargs: rtse = request.env['hotel.room_type'].sudo().search( [('name', '=', kwargs['room_type'])]) rtypr_br = request.env['hotel.room_type'].sudo().browse( rtse) chin = datetime.strptime( rl.checkin, '%Y-%m-%d %H:%M:%S').date() kchin = datetime.strptime( kwargs['chkin'], '%Y-%m-%d').date() chout = datetime.strptime( rl.checkout, '%Y-%m-%d %H:%M:%S').date() kcout = datetime.strptime( kwargs['chkout'], '%Y-%m-%d').date() if (chin == kchin and (chout == kcout) and ( rl.categ_id.id == rtypr_br.cat_id.id)): request.env['hotel.reservation.line'].unlink( rl.id) break for d1 in data: tot = tot + d1['price'] values = { 'room_data': data, 'tot': tot} return request.render("hotel_online.booking_show", values) def checkout_values(self, data=None): countries = request.env['res.country'].sudo().search([]) states_ids = request.env['res.country.state'].sudo().search([]) # request.env['res.country.state'].sudo().browse([states_ids]) states = states_ids # partner = request.env['res.partner'].sudo().search( # [("user_id", "=", request.uid)]) user_id = request.env['res.users'].sudo().search([('id', '=', request.uid)]) partner = user_id.partner_id order = None shipping_id = data and data.get('shipping_id') or None shipping_ids = [] checkout = {} if not data: if request.uid != request.website.user_id.id: checkout.update(self.checkout_parse("billing", partner)) else: order1 = request.website.get_reservation() order = request.env['hotel.reservation'].sudo().browse(order1) if order.partner_id: domain = [("partner_id", "=", order.partner_id.id)] user_ids = request.env['res.users'].sudo().search( domain) if not user_ids or request.website.user_id.id not in user_ids: checkout.update(self.checkout_parse( "billing", order.partner_id)) else: checkout = self.checkout_parse('billing', data) # Default search by user country if not checkout.get('country_id'): country_code = request.session['geoip'].get('country_code') if country_code: country_ids = request.env['res.country'].search( [('code', '=', country_code)], limit=1) if country_ids: checkout['country_id'] = country_ids[0] values = { 'countries': countries, 'states': states, 'checkout': checkout, 'error': {}, 'has_check_vat': hasattr(request.env['res.partner'], 'check_vat'), 'only_services': order or False } # print "valuuuuuuuesssss of checkout_values",values return values mandatory_billing_fields = ["name", "phone", "email", "street", "city", "country_id"] optional_billing_fields = ["street", "state_id", "zip"] mandatory_shipping_fields = [ "name", "phone", "street", "city", "country_id"] optional_shipping_fields = ["state_id", "zip"] def checkout_parse(self, address_type, data, remove_prefix=False): """ data is a dict OR a partner browse record """ # set mandatory and optional fields assert address_type in ('billing', 'shipping') if address_type == 'billing': all_fields = self.mandatory_billing_fields + self.optional_billing_fields prefix = '' else: all_fields = self.mandatory_shipping_fields + self.optional_shipping_fields prefix = 'shipping_' # set data if isinstance(data, dict): query = dict((prefix + field_name, data[prefix + field_name]) for field_name in all_fields if prefix + field_name in data) else: query = dict((prefix + field_name, getattr(data, field_name)) for field_name in all_fields if getattr(data, field_name)) if address_type == 'billing' and data.parent_id: query[prefix + 'street'] = data.parent_id.name if query.get(prefix + 'state_id'): query[prefix + 'state_id'] = int(query[prefix + 'state_id']) if query.get(prefix + 'country_id'): query[prefix + 'country_id'] = int(query[prefix + 'country_id']) if not remove_prefix: return query return dict((field_name, data[prefix + field_name]) for field_name in all_fields if prefix + field_name in data) # Validation for billing information def checkout_form_validate(self, data): cr, uid, context, registry = request.cr, request.uid, request.context, request.registry error = dict() error_message = [] # Validation for field_name in self.mandatory_billing_fields: if not data.get(field_name): error[field_name] = 'missing' # email validation if data.get('email') and not tools.single_email_re.match(data.get('email')): error["email"] = 'error' error_message.append( _('Invalid Email! Please enter a valid email address.')) # vat validation if data.get("vat") and hasattr(registry["res.partner"], "check_vat"): if request.website.company_id.vat_check_vies: # force full VIES online check check_func = registry["res.partner"].vies_vat_check else: # quick and partial off-line checksum validation check_func = registry["res.partner"].simple_vat_check # if not check_func(cr, uid, vat_country, vat_number, context=None): # simple_vat_check # error["vat"] = 'error' if data.get("shipping_id") == -1: for field_name in self.mandatory_shipping_fields: field_name = 'shipping_' + field_name if not data.get(field_name): error[field_name] = 'missing' # error message for empty required fields if [err for err in list(error.values()) if err == 'missing']: error_message.append(_('Some required fields are empty.')) return error, error_message def checkout_form_save(self, checkout): # cr, uid, context, registry = request.cr, request.uid, request.context, request.registry order1 = request.website.get_reservation() order = request.env['hotel.reservation'].sudo().browse(order1) # order = request.website.get_reservation() orm_partner = request.env['res.partner'] orm_user = request.env['res.users'] order_obj = request.env['hotel.reservation'] # partner_lang = request.lang if request.lang in [lang.code for lang in request.website.language_ids] else None # print "partner_lang", partner_lang partner_lang = request.lang if request.lang in request.website.mapped( 'language_ids.code') else None billing_info = {} if partner_lang: billing_info['lang'] = partner_lang billing_info.update(self.checkout_parse('billing', checkout, True)) # set partner_id partner_id = None if request.uid != request.website.user_id.id: # partner_id = orm_user.browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id partner_id = orm_user.sudo().browse(request.uid).id elif order.partner_id: user_ids = request.env['res.users'].sudo().search( [("partner_id", "=", order.partner_id.id)]) if not user_ids or request.website.user_id.id not in user_ids: partner_id = order.partner_id.id # save partner informations if billing_info.get('country_id'): billing_info['property_account_position_id'] = request.env[ 'account.fiscal.position'].sudo()._get_fpos_by_region( billing_info['country_id'], billing_info.get( 'state_id') or False, billing_info.get('zip'), billing_info.get('vat') and True or False) if partner_id and request.website.partner_id.id != partner_id: partner_id1 = orm_partner.browse(partner_id) if not billing_info.get('state_id'): billing_info.pop('state_id') valiee = partner_id1.sudo().write(billing_info) else: # create partner partner_id = request.env['res.partner'].sudo().create(billing_info) order.write({'partner_id': partner_id}) order_info = { 'message_partner_ids': [(4, partner_id), (3, request.website.partner_id.id)], } zz = order_obj.sudo().write(order_info) @http.route(['/page/hotel_online.booking_show', '/partner/checkout'], type='http', auth="public", website=True) def checkout(self, **post): _logger.info("@@@@@@@@@@@@@@@%s", request.session) if request.session.get('sale_order_id'): cr, context = request.cr, request.context order_id = request.website.get_sale_order_id() redirection = self.checkout_redirection(order_id) _logger.info("REDIRECTION===>>>>>>>>>>{}".format(redirection)) if redirection: return redirection values = self.checkout_values() return request.render("hotel_online.res_partner_show", values) if request.session.get('reservation_order_id'): cr, context = request.cr, request.context reservation = request.website.get_reservation() redirection = self.checkout_redirection(reservation) _logger.info("REDIRECTION===>>>>>>>>>>{}".format(redirection)) if redirection: return redirection values = self.checkout_values() return request.render("hotel_online.res_partner_show", values) else: return request.redirect("/product_screen/") @http.route(['/custom/search/read'], type='json', auth="public", website=True) def custom_search_read(self, **post): reservation_obj = request.env['hotel.reservation'].sudo().search( [('id', '=', int(post['room_id']))]) if reservation_obj and len(reservation_obj) > 0: if reservation_obj.state == 'cancel': return False else: return True return False @http.route(['/partner_add/'], type='http', auth="public", website=True, csrf=False) def confirm_order(self, **post): _logger.info("POST====>>>>>%s", post) vals = { 'name': post.get('name'), 'email': post.get('email'), 'phone': post.get('phone'), 'street': post.get('street'), 'city': post.get('city'), 'zip': post.get('zip'), 'country_id': int(post.get('country_id')), } _logger.info("STATE ID===>>>>>%s", post.get('state_id')) if post.get('state_id'): vals.update({'state_id': int(post.get('state_id')), }) else: vals.update({'state_id': None}) _logger.info("VALS===>>>>%s", vals) user_id = request.env['res.users'].sudo().search( [('id', '=', request.uid)]) if user_id: partner_id = user_id.partner_id if partner_id: _logger.info("PARTNER ID===>>>>%s", partner_id) partner_id.sudo().write(vals) if request.session.get('sale_order_id'): order = request.website.get_sale_order_id() if request.session.get('reservation_order_id'): order = request.website.get_reservation() if not order: return request.redirect("/shop") redirection = self.checkout_redirection(order) if redirection: return redirection values = self.checkout_values(post) values["error"], values["error_message"] = self.checkout_form_validate( values["checkout"]) if values["error"]: return request.render("hotel_online.res_partner_show", values) self.checkout_form_save(values["checkout"]) _logger.info("PARTNER ID===>>>>%s", values) return request.redirect("/shop/payment") @http.route(['/shop/payment'], type='http', auth="public", website=True) def payment(self, **post): """ Payment step. This page proposes several payment means based on available payment.acquirer. State at this point : - a draft sales order with lines; otherwise, clean context / session and back to the shop - no transaction in context / session, or only a draft one, if the customer did go to a payment.acquirer website but closed the tab without paying / canceling """ # order = request.website.get_reservation() _logger.info("REQUEST SESSION SHOP PAYMENT===>>>>>>>>>>>>>>>>>>>{}".format(request.session)) if request.session.get('reservation_order_id'): order = request.website.get_reservation() order_browse = request.env['hotel.reservation'].sudo().browse(order) else: order = request.website.get_sale_order_id() order_browse = request.env['sale.order'].sudo().browse(order) if order: redirection = self.checkout_redirection(order) if redirection: return redirection render_values = self._get_shop_payment_values(order_browse, **post) if render_values['errors']: render_values.pop('acquirers', '') render_values.pop('tokens', '') _logger.info("RENDER VALUES====>>>>%s", render_values) print(request.session.get('reservation_order_id')) print(request.session.get('sale_order_id')) order = request.website.sale_get_order() request.session['website_sale_cart_quantity'] = order.cart_quantity if request.session.get('reservation_order_id'): print('1111111111111111') return request.render("hotel_online.payment123", render_values) else: print('2222222222222222222') return request.render("website_sale.payment", render_values) def _get_shop_payment_values(self, order, **kwargs): logged_in = not request.env.user._is_public() if request.session.get('reservation_order_id'): providers_sudo = request.env['payment.provider'].sudo()._get_compatible_providers( order.company_id.id, order.partner_id.id, order.remaining_amt, sale_order_id=order.id ) # In sudo mode to read the fields of acquirers, order and partner (if not logged in) payment_methods_sudo = request.env['payment.method'].sudo()._get_compatible_payment_methods( providers_sudo.ids, order.partner_id.id, currency_id=order.currency_id.id, ) else: providers_sudo = request.env['payment.provider'].sudo()._get_compatible_providers( order.company_id.id, order.partner_id.id, order.amount_total, currency_id=order.currency_id.id, sale_order_id=order.id, website_id=request.website.id, ) payment_methods_sudo = request.env['payment.method'].sudo()._get_compatible_payment_methods( providers_sudo.ids, partner_sudo.id, currency_id=currency.id, ) tokens = request.env['payment.token'].sudo()._get_available_tokens( providers_sudo.ids, order.partner_id.id, **kwargs ) if logged_in else request.env['payment.token'] # if request.session.get('reservation_order_id'): # fees_by_acquirer = { # acq_sudo: acq_sudo._compute_fees( # order.total_cost1, order.currency_id, order.partner_id.country_id # ) for acq_sudo in providers_sudo.filtered('fees_active') # } # else: # fees_by_provider = { # p_sudo: p_sudo._compute_fees( # order.amount_total, order.currency_id, order.partner_id.country_id # ) for p_sudo in providers_sudo.filtered('fees_active') # } # Prevent public partner from saving payment methods but force it for logged in partners # buying subscription products # show_tokenize_input = logged_in \ # and not request.env['payment.acquirer'].sudo()._is_tokenization_required( # sale_order_id=order.id # ) show_tokenize_input = logged_in \ and not request.env['payment.provider'].sudo()._is_tokenization_required( sale_order_id=order.id ) checkout_vals={ 'website_sale_order': order, 'errors': [], 'partner': order.partner_id, 'order': order, 'payment_action_id': request.env.ref('payment.action_payment_provider').id, # Payment form common (checkout and manage) values 'payment_methods_sudo': payment_methods_sudo, 'providers_sudo':providers_sudo, 'tokens_sudo': tokens, 'sale_order_id': order.id, # 'fees_by_acquirer': fees_by_acquirer, 'show_tokenize_input_mapping': PaymentPortal._compute_show_tokenize_input_mapping( providers_sudo, sale_order_id=order.id ), 'currency': order.currency_id, 'partner_id': order.partner_id.id, 'transaction_route': f'/shop/payment/transaction/{order.id}', 'landing_route': '/shop/payment/validate', } if request.session.get('reservation_order_id'): checkout_vals.update({ 'amount': order.total_cost1, 'access_token': order.access_token, }) else: checkout_vals.update({ 'amount': order.amount_total, 'access_token': order._portal_ensure_token(), }) return checkout_vals @http.route('/shop/payment/validate', type='http', auth="public", website=True, sitemap=False) def shop_payment_validate(self, transaction_id=None, sale_order_id=None, **post): """ Method that should be called by the server when receiving an update for a transaction. State at this point : - UDPATE ME """ order_sale_id = '' order_reserve_id = '' transaction_id = request.session.get('__website_sale_last_tx_id') if sale_order_id is None: if 'sale_last_order_id' in request.session: last_order_id = request.session['sale_last_order_id'] order = request.env['sale.order'].sudo().browse(last_order_id).exists() if 'reservation_last_order_id' in request.session: last_order_id = request.session['reservation_last_order_id'] if request.session.get('reservation_last_order_id'): order = request.env['hotel.reservation'].sudo().browse(last_order_id).exists() else: if request.session.get('sale_order_id'): order = request.env['sale.order'].sudo().browse(sale_order_id) assert order.id == request.session.get('sale_last_order_id') if request.session.get('reservation_order_id'): order = request.env['hotel.reservation'].sudo().browse(sale_order_id) assert order.id == request.session.get('reservation_last_order_id') if transaction_id: tx = request.env['payment.transaction'].sudo().browse(transaction_id) # assert tx in order.transaction_ids() elif order: tx = order.get_portal_last_transaction() else: tx = None _logger.info("\n\n\n\n\nREQUEST===>>>>>>>>>>>>>>>{}".format(request.session)) if request.session.get('sale_last_order_id'): order_sale_id = request.session.get('sale_last_order_id') if not order or (order.amount_total and not tx): return request.redirect('/shop') if request.session.get('reservation_last_order_id'): order_reserve_id = request.session.get('reservation_last_order_id') if order and not order.total_cost1 and not tx: return request.redirect(order.get_portal_url()) _logger.info("ORDER SALE ID==>>>>>>>>>>>00000000000000{}".format(order_sale_id)) if request.session.get('sale_order_id'): _logger.info("ORDER===>>>>>>>>>>>{}==={}>>>{}".format(order,order.amount_total, tx)) if order and not order.amount_total and not tx: _logger.info("BRO NEED HERE") order.with_context(send_email=True).action_confirm() return request.redirect(order.get_portal_url()) # clean context and session, then redirect to the confirmation page _logger.info("TRANSACTION========>>>>>>>>>>>>>>>>>>>>{}".format(tx)) if request.session.get('reservation_order_id'): self.payment_status() request.website.sale_reset() _logger.info("REQUEST===>>>>>>>>>>{}".format(request.session)) if tx.state == 'draft' : tx.sudo().write({ 'state': 'pending' }) if tx and tx.state == 'draft': _logger.info("DRAFT DRAFT DRAFT") return request.redirect('/shop') PaymentPostProcessing.remove_transactions(tx) _logger.info("ORDER SALE ID==>>>>>>>>>>>{}".format(order_sale_id)) if order_sale_id: _logger.info("HERE HERE") return request.redirect('/shop/confirmation') if order_reserve_id: return request.redirect('/shop/confirmation1') def payment_status(self): tx = request.website.sale_get_transaction() order_id = request.website.get_reservation() order_id = request.env['hotel.reservation'].sudo().search([('id', '=', order_id)]) order = None # order_obj = request.env['payment.transaction'].browse(order_id) if tx and tx.state == 'done': order = tx.reservation_id if order_id: order_id.confirmed_reservation() payment_vals = { 'amt': tx.amount, 'reservation_id': order_id.id, 'payment_date': datetime.now().date(), 'deposit_recv_acc': order_id.partner_id.property_account_receivable_id.id, 'journal_id': tx.acquirer_id.journal_id.id, } _logger.info("@@@@@@@@@@@@@@@@@@@%s", payment_vals) wiz_obj = request.env['advance.payment.wizard'].sudo().with_context(active_model='hotel.reservation', active_id=order_id.id).create( payment_vals) wiz_obj.with_context(active_model='hotel.reservation').payment_process() _logger.info("WIZARD======>>>>>>>>>>%s", wiz_obj) order = order_id elif order_id: order_obj = request.env['hotel.reservation'].sudo().browse( order_id) tx = request.env['payment.transaction'].sudo().search( [('sale_order_id', '=', order_obj.id.id), ('state', '=', 'draft')], limit=1) tx.write({'state': 'done'}) order = tx.sale_order_id if order: order.confirmed_reservation() payment_vals = { 'amt': tx.amount, 'reservation_id': order.id, 'payment_date': datetime.now().date(), 'deposit_recv_acc': order.partner_id.property_account_receivable_id.id, 'journal_id': tx.acquirer_id.journal_id.id, } wiz_obj = request.env['advance.payment.wizard'].sudo().create(payment_vals) wiz_obj.with_context(active_model='hotel.reservation', active_id=order_id.id).payment_process() else: order = order_id @http.route(['/shop/confirmation1'], type='http', auth="public", website=True) def payment_confirmation(self, **post): """ End of checkout process controller. Confirmation is basically seing the status of a sale.order. State at this point : - should not have any context / session info: clean them - take a sale.order id, because we request a sale.order and are not session dependant anymore """ sale_order_id = request.session.get('reservation_order_id') _logger.info("SALE ORDER IDDDDD========>>>>>>>%s", sale_order_id) if sale_order_id: order = request.env['hotel.reservation'].sudo().browse( sale_order_id) return request.render("hotel_online.confirmation1", {'order': order}) else: return request.redirect('/shop') # @http.route(['/payment/status'], type="http", auth="public", website=True, sitemap=False) # def payment_status_page(self, **kwargs): # tx = request.website.sale_get_transaction() # order_id = request.website.get_reservation() # order_id = request.env['hotel.reservation'].sudo().search([('id', '=', order_id)]) # order = None # # order_obj = request.env['payment.transaction'].browse(order_id) # if tx and tx.state == 'done': # order = tx.sale_order_id # if order_id: # order_id.confirmed_reservation() # payment_vals = { # 'amt': tx.amount, # 'reservation_id': order_id.id, # 'payment_date': datetime.now().date(), # 'deposit_recv_acc': order_id.partner_id.property_account_receivable_id.id, # 'journal_id': tx.provider_id .journal_id.id, # } # _logger.info("@@@@@@@@@@@@@@@@@@@%s", payment_vals) # wiz_obj = request.env['advance.payment.wizard'].sudo().with_context(active_model='hotel.reservation', # active_id=order_id.id).create( # payment_vals) # wiz_obj.with_context(active_model='hotel.reservation').payment_process() # _logger.info("WIZARD======>>>>>>>>>>%s", wiz_obj) # order = order_id # elif order_id: # order_obj = request.env['hotel.reservation'].sudo().browse( # order_id) # tx = request.env['payment.transaction'].sudo().search( # [('sale_order_id', '=', order_obj.id.id), ('state', '=', 'draft')], limit=1) # tx.write({'state': 'done'}) # order = tx.sale_order_id # if order: # order.confirmed_reservation() # payment_vals = { # 'amt': tx.amount, # 'reservation_id': order.id, # 'payment_date': datetime.now().date(), # 'deposit_recv_acc': order.partner_id.property_account_receivable_id.id, # 'journal_id': tx.acquirer_id.journal_id.id, # } # wiz_obj = request.env['advance.payment.wizard'].sudo().create(payment_vals) # wiz_obj.with_context(active_model='hotel.reservation', active_id=order_id.id).payment_process() # else: # order = order_id # # _logger.info("ORDER====>>>>>>>>>>>>>>>>>>>{}".format(order)) # return request.render("hotel_online.confirmation1", {'order': order}) @http.route('/shop/payment/token', type='http', auth='public', website=True, sitemap=False) def payment_token(self, pm_id=None, **kwargs): """ Method that handles payment using saved tokens :param int pm_id: id of the payment.token that we want to use to pay. """ # tx = request.website.sale_get_transaction() tx = request.website.sale_get_transaction( ) or request.env['payment.transaction'].sudo() order_id = request.website.get_reservation() order = request.env['hotel.reservation'].sudo().browse(order_id) if not request.env['payment.token'].sudo().search_count([('id', '=', pm_id)]): return request.redirect('/shop/?error=token_not_found') payment_token = request.env['payment.token'].sudo().search([ ('id', '=', pm_id)]) acquirer = payment_token.acquirer_id tx_type = 'form' if not acquirer.payment_flow == 's2s': tx_type = 'form_save' x = tx._check_or_create_sale_tx( order, acquirer, payment_token=payment_token, tx_type=tx_type) return request.redirect('/payment/process') @http.route('/shop/payment/get_status123/', type='json', auth="public", website=True) def payment_get_status(self, sale_order_id, **post): order = request.env['hotel.reservation'].sudo().browse(sale_order_id) assert order.id == request.session.get('reservation_order_id') if not order: return { 'state': 'error', 'message': '

%s

' % _('There seems to be an error with your request.'), } tx_ids = request.env['payment.transaction'].sudo().search([ '|', ('sale_order_id', '=', order.id), ('reference', '=', order.name) ]) if not tx_ids: if order.total_cost1: return { 'state': 'error', 'message': '

%s

' % _('There seems to be an error with your request.'), } else: state = 'done' message = "" validation = None else: # tx = request.env['payment.transaction'].sudo().browse(tx_ids) tx = tx_ids state = tx.state if state == 'done': message = '

%s

' % _('Your payment has been received.') elif state == 'cancel': message = '

%s

' % _( 'The payment seems to have been canceled.') elif state == 'pending' and tx.acquirer_id.validation == 'manual': message = '

%s

' % _( 'Your transaction is waiting confirmation.') if tx.acquirer_id.post_msg: message += tx.acquirer_id.post_msg else: message = '

%s

' % _( 'Your transaction is waiting confirmation.') # validation = tx.acquirer_id.validation return { 'state': state, 'message': message, 'validation': None } @http.route(['/other/items/unlink'], type='json', auth="public", website=True) def other_items_unlink(self, **post): _logger.info("POST========>>>>>>%s", post) other_items_id = request.env['other.items'].sudo().search( [('id', '=', int(post.get('other_items_id')))]) _logger.info("POST========>>>>>>%s", other_items_id) other_items_id.unlink() return True def checkout_redirection(self, order): if type(order) == int: order = request.env['hotel.reservation'].sudo().browse(order) if not order or order.state != 'draft': request.session['sale_order_id'] = None request.session['sale_transaction_id'] = None tx = request.env.context.get('website_sale_transaction') if tx and tx.state != 'draft': return request.redirect('/shop/payment/confirmation/%s' % order) # check() # reserv_list = [] class website(models.Model): _inherit = 'website' _columns = {} def get_image(self, a): if 'image' in list(a.keys()): return True else: return False def get_type(self, record1): categ_type = record1['type'] # print "\n\ncateg_type",categ_type categ_ids = self.env['product.category'].sudo().search( [('name', '=', categ_type[0])]) # print "categ_idsssssss",categ_ids categ_records = categ_ids[0] # print "categ_records",categ_records # if categ_records.type == 'view': # return False return True def check_next_image(self, main_record, sub_record): if len(main_record['image']) > sub_record: return 1 else: return 0 def image_url_new(self, record1, field, size=None): # print "====----image_url_new----===",self,record1,field """Returns a local url that points to the image field of a given browse record.""" lst = [] record = self.env['hotel.room.images'].sudo().browse(record1) cnt = 0 for r in record: cnt = cnt + 1 model = r._name sudo_record = r.sudo() id = '%s_%s' % (r.id, hashlib.sha1( (str(sudo_record.write_date) or str(sudo_record.create_date) or '').encode('utf-8')).hexdigest()[0:7]) if cnt == 1: size = '' if size is None else '/%s' % size else: size = '' if size is None else '%s' % size lst.append('/website/image/%s/%s/%s%s' % (model, id, field, size)) return lst def get_reservation(self): reservation_order_id = request.session.get('reservation_order_id') if not reservation_order_id: part_id1 = request.env['res.partner'].sudo().search( [('name', '=', 'Public user'), ('active', '=', False)]) reservation = request.env['hotel.reservation'].sudo().search( [('partner_id', '=', part_id1[0].id)]) reserv_list = reservation if reservation: reservation1 = request.env['hotel.reservation'].sudo().browse( reservation[0]) request.session['reservation_order_id'] = reservation1.id return reservation1.id return reservation_order_id def get_sale_order_id(self): order_id = request.session.get('sale_order_id') if not order_id: part_id1 = request.env['res.partner'].sudo().search( [('name', '=', 'Public user'), ('active', '=', False)]) sale_order_ids = request.env['sale.order'].sudo().search([('partner_id', '=', part_id1[0].id)]) if sale_order_ids: sale_order_id = request.env['sale.order'].sudo().browse(sale_order_ids[0]) request.session['sale_order_id'] = sale_order_id.id return sale_order_id.id return order_id def sale_get_transaction(self): transaction_obj = self.env['payment.transaction'] tx_id = request.session.get('__website_sale_last_tx_id') if tx_id: tx_ids = transaction_obj.sudo().search( [('id', '=', tx_id), ('state', 'not in', ['cancel'])]) if tx_ids: return tx_ids # return transaction_obj.browse(tx_ids) else: request.session['sale_transaction_id'] = False return False # def sale_reset(self): request.session.update({ 'sale_order_id': False, 'sale_transaction_id': False, 'sale_order_code_pricelist_id': False, 'reservation_order_id': False, }) # website() class ResCountry(models.Model): _inherit = 'res.country' def get_website_sale_countries(self, mode='billing'): return self.sudo().search([]) def get_website_sale_states(self, mode='billing'): return self.sudo().state_ids class CustomerPortal(CustomerPortal): def _prepare_home_portal_values(self, counters): values = super()._prepare_home_portal_values(counters) if 'reservation_count' in counters: values['reservation_count'] = request.env['hotel.reservation'].sudo().search_count([ ]) return values @http.route(['/my/reservations/', '/my/reservations/'], type='http', auth='public', website=True) def template_reservation_render(self, **kwargs): values = self._prepare_portal_layout_values() reservation_id = kwargs.get('reservation_id') if reservation_id: order = request.env['hotel.reservation'].sudo().browse(reservation_id) values.update({ 'order': order, 'page_name': 'reservation', 'default_url': '/my/reservations', }) return request.render('hotel_online.portal_my_reservations_detailed', values) reservations = request.env['hotel.reservation'].sudo().search([]) values.update({'reservations': reservations, 'default_url': '/my/reservations', 'page_name': 'page' }) return request.render('hotel_online.portal_my_reservations', values)