You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							108 lines
						
					
					
						
							4.9 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU AFFERO
							 | 
						|
								#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
							 | 
						|
								#    (AGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import json
							 | 
						|
								from werkzeug.urls import url_encode
							 | 
						|
								from odoo import http, fields
							 | 
						|
								from odoo.http import request
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class MovieShow(http.Controller):
							 | 
						|
								    """ This class defines the HTTP routes and movie shows.
							 | 
						|
								        It provides functionality to render the movie template for user
							 | 
						|
								        interaction."""
							 | 
						|
								    @http.route(['/show'], type='http', auth="public", csrf=False, website=True)
							 | 
						|
								    def show_movies(self):
							 | 
						|
								        """ Function for rendering show page."""
							 | 
						|
								        movies = request.env['movie.movie'].search([('state', '=', 'ongoing')])
							 | 
						|
								        return http.request.render('show_booking_management.show_movie',
							 | 
						|
								                                   {'movies': movies})
							 | 
						|
								
							 | 
						|
								    @http.route(['/book_now/<int:movie_id>'], type='http', auth="public",
							 | 
						|
								                csrf=False, website=True)
							 | 
						|
								    def book_now(self, movie_id):
							 | 
						|
								        """ Function for rendering booking page while clicking the button book now."""
							 | 
						|
								        movie = request.env['movie.movie'].browse(movie_id)
							 | 
						|
								        return http.request.render('show_booking_management.book_movie',
							 | 
						|
								                                   {'movie': movie})
							 | 
						|
								
							 | 
						|
								    @http.route('/movie/book_ticket', type='http', auth='public', website=True,
							 | 
						|
								                methods=['POST'], csrf=False)
							 | 
						|
								    def book_ticket(self, **kwargs):
							 | 
						|
								        """ Function for submitting the form and rendering the seat selection chart."""
							 | 
						|
								        movie_id = request.env['movie.movie'].browse(
							 | 
						|
								            int(kwargs.get('movie_id')))
							 | 
						|
								        screen_id = request.env['movie.screen'].browse(
							 | 
						|
								            int(kwargs.get('screen')))
							 | 
						|
								        time_slot_id = request.env['time.slots'].browse(
							 | 
						|
								            int(kwargs.get('time_slots')))
							 | 
						|
								        booked_seats = request.env['movie.seats'].search([
							 | 
						|
								            ('screen_id', '=', screen_id.id),
							 | 
						|
								            ('time_slot_id', '=', int(kwargs.get('time_slots'))),
							 | 
						|
								            ('date', '=', kwargs.get('show_date')),
							 | 
						|
								            ('is_booked', '=', True)
							 | 
						|
								        ]).mapped('seat')
							 | 
						|
								
							 | 
						|
								        return http.request.render(
							 | 
						|
								            'show_booking_management.seat_selection_template',
							 | 
						|
								            {'screen': screen_id, 'movie': movie_id,
							 | 
						|
								             'time_slot_id': time_slot_id, 'booked_seats': booked_seats,
							 | 
						|
								             'booked_seats_count': len(booked_seats),
							 | 
						|
								             'available_seats_count': screen_id.total_seat_count - len(booked_seats),
							 | 
						|
								             'booking_date': kwargs.get('show_date')})
							 | 
						|
								
							 | 
						|
								    @http.route('/movie/confirm_booking', type='http', auth='public',
							 | 
						|
								                website=True, methods=['POST'], csrf=True)
							 | 
						|
								    def confirm_booking(self, **post):
							 | 
						|
								        """ Function for confirming the seats selection and creating invoice."""
							 | 
						|
								        selected_seats = request.httprequest.form.getlist('selected_seats')
							 | 
						|
								        movie = request.env['movie.movie'].browse(int(post.get('movie_id')))
							 | 
						|
								        product = request.env.ref('show_booking_management.product_1')
							 | 
						|
								        invoice = request.env['account.move'].sudo().create({
							 | 
						|
								            'move_type': 'out_invoice',
							 | 
						|
								            'invoice_origin': 'Movie',
							 | 
						|
								            'partner_id': request.env.user.partner_id.id,
							 | 
						|
								            'invoice_date': fields.Date.today(),
							 | 
						|
								            'state': 'draft',
							 | 
						|
								            'invoice_line_ids': [(0, 0, {
							 | 
						|
								                'name': f"Ticket for {movie.name} on {post.get('booking_date')}",
							 | 
						|
								                'product_id': product.id,
							 | 
						|
								                'quantity': len(selected_seats),
							 | 
						|
								                'price_unit': movie.price,
							 | 
						|
								            })],
							 | 
						|
								        })
							 | 
						|
								        if invoice:
							 | 
						|
								            invoice.sudo().action_post()
							 | 
						|
								        access_token = invoice._portal_ensure_token()
							 | 
						|
								        booking_data = {
							 | 
						|
								            'invoice_id': invoice.id,
							 | 
						|
								            'movie_id': int(post.get('movie_id')),
							 | 
						|
								            'screen_id': int(post.get('screen_id')),
							 | 
						|
								            'time_slot_id': int(post.get('time_slot_id')),
							 | 
						|
								            'booking_date': post.get('booking_date'),
							 | 
						|
								            'selected_seats': selected_seats,
							 | 
						|
								        }
							 | 
						|
								        request.session['movie_booking_data'] = json.dumps(booking_data)
							 | 
						|
								        params = {
							 | 
						|
								            'access_token': access_token,
							 | 
						|
								            'payment_method_id': post.get('payment_method_id'),
							 | 
						|
								        }
							 | 
						|
								        return request.redirect(f'/my/invoices/{invoice.id}?{url_encode(params)}')
							 | 
						|
								
							 |