Design BookMyShow: An Online Movie Ticket Booking System
Get started 
                    জয় শ্রী রাম
🕉 
Problem Statement:
Design BookMyShow using Object Oriented principles.
Solution:
Object Oriented Analysis Framework:
A big part of the Object Oriented Design is Object Oriented Analysis. Object Oriented Analysis helps us figure out what are the classes we need to have and what all would be the responsibilities (i.e, methods and properties) of these classes. We would use the below step by step framework to efficiently handle any Object Oriented Design problem.- 
            Identifying the Actors. In most cases, each actor type would become a class.
            
 
- 
            Identifying the 
                uses cases of the system we are building and the user activities that
                the actors will be engaged in.
            
            
 
- 
            Identifying all the Entities or Attributes that would eventually become the classes.
            
 
Before we can even use the framework, you need to ask clarifying questions to your interviewer to figure out what kind of system your interviewer wants you to design. Remember that your interviewer will intentionally keep the problem statement vague to see if you have the capability to gather the business requirements and analyse them to reach a viable design. In fact, what sets a great candidate apart from an average candidate is his/her ability to ask critical questions and analyse the requirements.
In this chapter, we will design a system like BookMyShow. The system would have a network of theater companies (like, big theater chains like AMC or Regal Cinemas or INOX , as well as small and regional movie theaters) in multiple cities and would contain all the information about movies currently playing and the ability to buy tickets for the available movie shows.
Now that we know what we are building, let's see how we can use our framework to come up with the Object Oriented Design for the system.
Step #1. Actors:
Let's think wh all are the ones that will using the system. The first class of users that come to mind are the movie watchers. Let's call them customrs. They will visit the website to buy movie tickets.Apart from buying tickets online, how else can they buy tickets ?
(1) Customers may call the customer care over the phone and make a booking.
(2) Customers may also just walk in and buy tickets from the cinema hall directly.
So, we have two more types of users who will be interacting with the system. They are:
- 
            Customer care representatives, whoc help customers make booking over the phone,
            
 
- Front Desk Assistants, who issue customers tickets at the cinema halls when a customer walks in and purchase a ticket. Front Desk Assistants are also responsible to check in the customers at the movie theater.
Also, someone from the company which owns the system needs to onboard the client theater companies in the system. We will call this person System Administrator.
It is important to understand how system administrator is different from theater administrator. Theater Administrators employees of the theater companies which are clients of the movie ticket booking system. So Theater Administrators will be employees of companies like AMC, INOX etc. Whereas System Administartors are employees of the company that owns the Online Movie Ticket Booking System, like BookMyShow, and are responsible for onboarding clients like AMC, INOX, Regal Cinemas etc on the system.
Step #2. User Activities and Use Cases of the System:
This is where you discuss the scope of your design with your interviewer. We would be focusing on the below use cases of the system:
- 
            System should be able to list the cities where affiliate cinemas are located.
            
 
- 
            Each theater company can have multiple movie halls and each movie hall can run multiple movie shows.
            
 
- 
            Once the customer selects a movie, the service should display the cinemas running that movie and its available shows.
            
 
- 
            The customer should be able to select a show at a particular theater and book their tickets.
            
 
- 
            The service should show the customer the different seat options available, like regular seats, premium seats,
            ADA compliant accessible seats, recliner seats etc.
            
 
- 
            Customers  should be able to pay with credit cards or cash.
            
 
- The system should ensure that no two customers can reserve the same seat.
Step #3. Entities:
- Theater Companies
- Theater Locations (Movie Hall / Cinema Hall / Theater / Multiplex)
- Movie
- Movie Show (a movie can can several shows in a cinema hall at different time or may be at the same time. Example: 2D and 3D version of a movie playing at the same time in two different shows at the same location.)
- Seat (a show will have seats for the movie watchers / customers.)
- Booking
- Payment
Object oriented Design and Class Implementation:
From our above analysis we get the below classes:
Actors: Customer, Customer Care Representative, Front Desk Assistant, Theater Administrator, System Administrator:
package OOD.TicketBookingSystem.User;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Member {
    private String id;
    private String name;
    private String email;
    private String phone;
    public Member(String id, String name, String email, String phone) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.phone = phone;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getId() {
        return id;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Member member = (Member) o;
        return id.equals(member.id);
    }
    @Override
    public int hashCode() {
        return id.hashCode();
    }
}
package OOD.TicketBookingSystem.User;
import OOD.TicketBookingSystem.Booking.Booking;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Customer extends Member {
    private List< Booking > currentBookings = new ArrayList<>();
    public Customer(String name, String email, String phone) {
        super(name, email, phone);
    }
    public boolean makeBooking(Booking booking) {
        // making a booking for a movie show
        // if booking goes through successfully:
        // add the booking to currentBookings list
        // currentBookings.add(booking);
        // return true
        // if the booking fails:
        // return false;
    }
    public List< Booking > getBookings() {
        return currentBookings;
    }
    public boolean cancelBooking(Booking booking) {
        // if the cancelation go through
        // remove the booking from currentBookings list and
        // return true
        //
        // otherwise return false
    }
}
package OOD.TicketBookingSystem.User;
import OOD.TicketBookingSystem.Booking.Booking;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class CustomerCareRepresentative extends Member {
    public CustomerCareRepresentative(String id, String name, String email, String phone) {
        super(id, name, email, phone);
    }
    public boolean createBooking(Booking booking) {
        // book a movie as requested by a customer
    }
}
package OOD.TicketBookingSystem.User;
import OOD.TicketBookingSystem.Booking.Booking;
/**
 * Created by Abhishek on 10/29/21.
 */
public class FrontDeskAssistant extends Member {
    public FrontDeskAssistant(String id, String name, String email, String phone) {
        super(id, name, email, phone);
    }
    public boolean createBookingAndIssueTicket(Booking booking) {
        // book a movie as requested by a customer
    }
    
    // check in a customer
    public boolean checkIn(Booking booking) {
        return booking.checkIn();
    }
}
package OOD.TicketBookingSystem.User;
import OOD.TicketBookingSystem.Movie.Movie;
import OOD.TicketBookingSystem.Theater.Show;
import OOD.TicketBookingSystem.Theater.MovieHall;
import OOD.TicketBookingSystem.Theater.TheaterCompany;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
// Administrator of a Theater Chain or Cinema Hall Company or Multiplex Chain
// Example: Administrator of AMC / Regal Cinemas / INOX etc
public class TheaterAdministrator extends Member {
    private TheaterCompany theaterCompany;
    public TheaterAdministrator(String id, String name, String email, String phone) {
        super(id, name, email, phone);
    }
    public boolean addMovie(Movie movie, MovieHall theater) {
        theater.addMovie(movie);
    }
    public boolean addShow(Show show, MovieHall theater) {
        theater.addShow(show);
    }
}
package OOD.TicketBookingSystem.User;
import OOD.TicketBookingSystem.Theater.TheaterCompany;
import OOD.TicketBookingSystem.TicketBookingSystem;
/**
 * Created by Abhishek Dey on 11/13/21.
 */
public class SystemAdministrator extends Member {
    private TicketBookingSystem system;
    public SystemAdministrator(TicketBookingSystem system) {
        this.system = system;
    }
    public void addNewTheaterCompany(TheaterCompany theaterCompany) {
        system.addTheaterCompany(theaterCompany);
    }
    public void removeTheaterCompany(TheaterCompany theaterCompany) {
        system.removeClient(theaterCompany);
    }
    public TicketBookingSystem getSystem() {
        return system;
    }
    public void setSystem(TicketBookingSystem system) {
        this.system = system;
    }
}
        Theater Company:
package OOD.TicketBookingSystem.MovieHall;
import OOD.TicketBookingSystem.Movie.Movie;
import java.util.Set;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class TheaterCompany {
    private String companyId;
    private String name;
    private java.util.Set< MovieHall > theatersOwned;
    private Address headQuarter;
    public TheaterCompany(String companyId, String name, Address headQuarter) {
        this.companyId = companyId;
        this.name = name;
        this.headQuarter = headQuarter;
    }
    public void addTheater(MovieHall theater) {
        theatersOwned.add(theater);
    }
    public void shutdownTheater(MovieHall theater) {
        theatersOwned.remove(theater);
    }
    public String getCompanyId() {
        return companyId;
    }
    public void updateCompanyId(String companyId) {
        this.companyId = companyId;
    }
    public String getName() {
        return name;
    }
    public void updateName(String name) {
        this.name = name;
    }
    public Set< MovieHall > getTheatersOwned() {
        return theatersOwned;
    }
    public Address getHeadQuarter() {
        return headQuarter;
    }
    public void updateHeadQuarter(Address headQuarter) {
        this.headQuarter = headQuarter;
    }
}
Movie Hall:
package OOD.TicketBookingSystem.MovieHall;
import OOD.TicketBookingSystem.Movie.Movie;
import java.util.HashSet;
import java.util.Set;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
// This class encapsulates cinema hall or theater (depending on
// which country you live in you may have different terms for theater or cinema hall or multiplex)
public class MovieHall { 
    private TheaterCompany owningCompany;
    private String name;
    private Set< Show > shows = new HashSet<>();
    private Set< Movie > moviesCurrentlyPlaying = new HashSet<>();
    public MovieHall(TheaterCompany owningCompany, String name, Set shows, Set moviesCurrentlyPlaying) {
        this.owningCompany = owningCompany;
        this.name = name;
    }
    public void addShow(Show show) {
        shows.add(show);
    }
    public void addMovie(Movie movie) {
        moviesCurrentlyPlaying.add(movie);
    }
    public boolean removeMovie(Movie movie) {
        if (!shows.contains(movie)) {
            moviesCurrentlyPlaying.remove(movie);
            return true;
        }
        return false;
    }
    public boolean removeShow(Show show) {
        if (!shows.contains(show)) {
            shows.remove(show);
            return true;
        }
        return false;
    }
}
  Movie Show:
package OOD.TicketBookingSystem.Theater;
import OOD.TicketBookingSystem.Movie.Movie;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
// This class encapsulates a Movie Show
public class Show {
    private int showId;
    private long createdOn;
    private String startTime; // example: 6:30PM
    private int durationInMin;
    private MovieHall playingAt;
    private Movie movie;
    public Show(int showId, String startTime, MovieHall playingAt, Movie movie) {
        this.showId = showId;
        this.createdOn = System.currentTimeMillis();
        this.startTime = startTime;
        this.playingAt = playingAt;
        this.movie = movie;
        this.durationInMin = movie.getDurationInMins();
    }
    public int getShowId() {
        return showId;
    }
    public void setShowId(int showId) {
        this.showId = showId;
    }
    public long getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(long createdOn) {
        this.createdOn = createdOn;
    }
    public String getStartTime() {
        return startTime;
    }
    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }
    public int getDurationInMin() {
        return durationInMin;
    }
    public void setDurationInMin(int durationInMin) {
        this.durationInMin = durationInMin;
    }
    public MovieHall getPlayingAt() {
        return playingAt;
    }
    public void setPlayingAt(MovieHall playingAt) {
        this.playingAt = playingAt;
    }
    public Movie getMovie() {
        return movie;
    }
    public void setMovie(Movie movie) {
        this.movie = movie;
    }
}
Movie Theater Seat:
package OOD.TicketBookingSystem.Theater;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Seat {
    public enum SeatType {
        REGULAR, PREMIUM, ACCESSIBLE, RECLINER
    }
    private int seatId;
    private boolean isReserved;
    private double price;
    private Show show;
    public boolean book() {
        if (!isReserved) {
            isReserved = true;
            return true;
        }
        return false;
    }
    public void markAsAvailable() {
        isReserved = false;
    }
    public int getSeatId() {
        return seatId;
    }
    public boolean isReserved() {
        return isReserved;
    }
    public double getPrice() {
        return price;
    }
    public void updatePrice(double price) {
        this.price = price;
    }
    public Show getShow() {
        return show;
    }
    public void updateShow(Show show) {
        this.show = show;
    }
}
Location Information:
package OOD.TicketBookingSystem.MovieHall;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Address {
    private String streetAddress;
    private String city;
    private String state;
    private String zipCode;
    private String country;
    public Address(String streetAddress, String city, String state, String zipCode, String country) {
        this.streetAddress = streetAddress;
        this.city = city;
        this.state = state;
        this.zipCode = zipCode;
        this.country = country;
    }
    public String getStreetAddress() {
        return streetAddress;
    }
    public void setStreetAddress(String streetAddress) {
        this.streetAddress = streetAddress;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public String getZipCode() {
        return zipCode;
    }
    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
}
Movie:
package OOD.TicketBookingSystem.Movie;
import OOD.TicketBookingSystem.Theater.Show;
import OOD.TicketBookingSystem.User.TheaterAdministrator;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Movie {
    private String title;
    private String description;
    private int durationInMins;
    private String language;
    private long releaseDate;
    private String genre;
    private TheaterAdministrator movieAddedBy;
    private List< Show > shows = new ArrayList<>();
    public Movie(
            String title,
            String description,
            int durationInMins,
            String language,
            long releaseDate,
            String genre,
            TheaterAdministrator movieAddedBy) {
        this.title = title;
        this.description = description;
        this.durationInMins = durationInMins;
        this.language = language;
        this.releaseDate = releaseDate;
        this.genre = genre;
        this.movieAddedBy = movieAddedBy;
    }
    public String getTitle() {
        return title;
    }
    public void updateTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void updateDescription(String description) {
        this.description = description;
    }
    public int getDurationInMins() {
        return durationInMins;
    }
    public void updateDurationInMins(int durationInMins) {
        this.durationInMins = durationInMins;
    }
    public String getLanguage() {
        return language;
    }
    public void updateLanguage(String language) {
        this.language = language;
    }
    public long getReleaseDate() {
        return releaseDate;
    }
    public void updateReleaseDate(long releaseDate) {
        this.releaseDate = releaseDate;
    }
    public String getGenre() {
        return genre;
    }
    public void updateGenre(String genre) {
        this.genre = genre;
    }
    public TheaterAdministrator getMovieAddedBy() {
        return movieAddedBy;
    }
    public void updateMovieAddedBy(TheaterAdministrator movieAddedBy) {
        this.movieAddedBy = movieAddedBy;
    }
    public List< Show > getShows() {
        return shows;
    }
    public void adShow(Show show) {
        shows.add(show);
    }
}
Booking:
package OOD.TicketBookingSystem.Booking;
import OOD.TicketBookingSystem.Theater.Show;
import OOD.TicketBookingSystem.Theater.Seat;
import java.util.List;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Booking {
    public enum BookingStatus {
        PENDING, CONFIRMED, CHECKED_IN, CANCELED
    }
    private String bookingNumber;
    private long createdOn;
    private BookingStatus status;
    private Show show;
    private List< Seat > seats;
    private Payment payment;
    public Booking(String bookingNumbe, Show show, List< Seat > seats, Payment payment) {
        this.bookingNumber = bookingNumber;
        this.createdOn = System.currentTimeMillis();
        this.status = BookingStatus.PENDING;
        this.show = show;
        this.seats = seats;
        this.payment = payment;
    }
    public boolean makePayment(Payment payment) {
        // if payments succeeds
        // this.payment = payment;
        // return true;
        // if paymeng is unsuccessful:
        // return false;
    }
    public boolean cancel() {
        if (status != BookingStatus.CHECKED_IN) {
            status = BookingStatus.CANCELED;
            return true;
        }
        return false;
    }
    public boolean reserveSeat(Seat seat) {
        return seat.book();
    }
    public boolean reserveSeats(List< Seat > requestedSeats) {
        for (Seat seat : requestedSeats) {
            if (!seat.book()) {
                unreserve(seats); // if we are not able to
                        // reserve all the requested seats we do NOT do partial booking
                return false;
            }
        }
        return true;
    }
    private void unreserve(List< Seat > seats) {
        for (Seat seat : seats) {
            if (!seat.isReserved()) {
                return;
            }
            seat.markAsAvailable();
        }
    }
    public boolean confirmBooking() {
        if (status == BookingStatus.PENDING) {
            status = BookingStatus.CONFIRMED;
            return true;
        }
        return false;
    }
    public boolean checkIn() {
        if (status == BookingStatus.CONFIRMED) {
            status = BookingStatus.CHECKED_IN;
            return true;
        }
        return false;
    }
}
Payment:
package OOD.TicketBookingSystem.Booking;
/**
 * Created by Abhishek Dey on 10/29/21.
 */
public class Payment {
    public enum PaymentStatus {
        UNPAID, PENDING, COMPLETED, DECLINED, CANCELLED, REFUNDED
    }
    public enum PaymentMethod {
        CASH, CREDIT_CARD
    }
    private double amount;
    private long createdOn;
    private int transactionId;
    private PaymentStatus status;
    private PaymentMethod paymentMethod;
    public Payment(double amount, int transactionId, PaymentStatus status, PaymentMethod paymentMethod) {
        this.amount = amount;
        this.createdOn = System.currentTimeMillis();
        this.transactionId = transactionId;
        this.paymentMethod = paymentMethod;
    }
    public void updatePauymentStatus(PaymentStatus status) {
        this.status = status;
    }
    public double getAmount() {
        return amount;
    }
    public long getCreatedOn() {
        return createdOn;
    }
    public int getTransactionId() {
        return transactionId;
    }
    public PaymentStatus getStatus() {
        return status;
    }
    public PaymentMethod getPaymentMethod() {
        return paymentMethod;
    }
    public void setPaymentMethod(PaymentMethod paymentMethod) {
        this.paymentMethod = paymentMethod;
    }
}
Python code:
class Member:
    def __init__(self, id, name, email, phone):
        self._id = id
        self._name = name
        self._email = email
        self._phone = phone
    def getName(self):
        return self._name
    def setName(self, name):
        self._name = name
    def getEmail(self):
        return self._email
    def setEmail(self, email):
        self._email = email
    def getPhone(self):
        return self._phone
    def setPhone(self, phone):
        self._phone = phone
    def getId(self):
        return self._id
    def equals(self, o):
        if self is o:
            return True
        if o is None or type(o) != Member:
            return False
        member = o
        return self._id == member._id
    def hashCode(self):
        return hash(self._id)
--------------------------------------------------
from OOD.TicketBookingSystem.Member import Member
class Customer(Member):
    def __init__(self, name, email, phone):
        self._currentBookings = []
        id = 0
        super().__init__(id, name, email, phone)
    def makeBooking(self, booking):
        pass
    def getBookings(self):
        return self._currentBookings
    def cancelBooking(self, booking):
        pass
----------------------------------------------------------
from OOD.TicketBookingSystem.Member import Member
class FrontDeskAssistant(Member):
    def __init__(self, id, name, email, phone):
        super().__init__(id, name, email, phone)
    def createBookingAndIssueTicket(self, booking):
        pass
    def checkIn(self, booking):
        return booking.checkIn()
-----------------------------------------------------------
from OOD.TicketBookingSystem.Member import Member
class TheaterAdministrator(Member):
    def __init__(self, id, name, email, phone):
        self._theaterCompany = None
        super().__init__(id, name, email, phone)
    def addMovie(self, movie, theater):
        theater.addMovie(movie)
    def addShow(self, show, theater):
        theater.addShow(show)
-----------------------------------------------------------
from OOD.TicketBookingSystem.Member import Member
class SystemAdministrator(Member):
    def __init__(self, system, id, name, email, phone):
        super().__init__(id, name, email, phone)
        self._system = system
    def addNewTheaterCompany(self, theaterCompany):
        self._system.addTheaterCompany(theaterCompany)
    def removeTheaterCompany(self, theaterCompany):
        self._system.removeClient(theaterCompany)
    def getSystem(self):
        return self._system
    def setSystem(self, system):
        self._system = system
-----------------------------------------------------------
from OOD.TicketBookingSystem.Member import Member
class SystemAdministrator(Member):
    def __init__(self, system, id, name, email, phone):
        super().__init__(id, name, email, phone)
        self._system = system
    def addNewTheaterCompany(self, theaterCompany):
        self._system.addTheaterCompany(theaterCompany)
    def removeTheaterCompany(self, theaterCompany):
        self._system.removeClient(theaterCompany)
    def getSystem(self):
        return self._system
    def setSystem(self, system):
        self._system = system
-----------------------------------------------------------
class MovieHall:
    def __init__(self, owningCompany, name, shows, moviesCurrentlyPlaying):
        self._owningCompany = None
        self._name = None
        self._shows = set()
        self._moviesCurrentlyPlaying = set()
        self._owningCompany = owningCompany
        self._name = name
    def addShow(self, show):
        self._shows.add(show)
    def addMovie(self, movie):
        self._moviesCurrentlyPlaying.add(movie)
    def removeMovie(self, movie):
        if movie not in self._shows:
            self._moviesCurrentlyPlaying.remove(movie)
            return True
        return False
    def removeShow(self, show):
        if show not in self._shows:
            self._shows.remove(show)
            return True
        return False
-----------------------------------------------------------
import time
class Show:
    def __init__(self, showId, startTime, playingAt, movie):
        self._showId = showId
        self._createdOn = round(time.time() * 1000)
        self._startTime = startTime
        self._playingAt = playingAt
        self._movie = movie
        self._durationInMin = movie.getDurationInMins()
    def getShowId(self):
        return self._showId
    def setShowId(self, showId):
        self._showId = showId
    def getCreatedOn(self):
        return self._createdOn
    def setCreatedOn(self, createdOn):
        self._createdOn = createdOn
    def getStartTime(self):
        return self._startTime
    def setStartTime(self, startTime):
        self._startTime = startTime
    def getDurationInMin(self):
        return self._durationInMin
    def setDurationInMin(self, durationInMin):
        self._durationInMin = durationInMin
    def getPlayingAt(self):
        return self._playingAt
    def setPlayingAt(self, playingAt):
        self._playingAt = playingAt
    def getMovie(self):
        return self._movie
    def setMovie(self, movie):
        self._movie = movie
----------------------------------------------------
from enum import Enum
class SeatType(Enum):
    REGULAR = 0
    PREMIUM = 1
    ACCESSIBLE = 2
    RECLINER = 3
class Seat:
    def __init__(self):
        self._seatId = 0
        self._isReserved = False
        self._price = 0
        self._show = None
    def book(self):
        if not self._isReserved:
            self._isReserved = True
            return True
        return False
    def markAsAvailable(self):
        self._isReserved = False
    def getSeatId(self):
        return self._seatId
    def isReserved(self):
        return self._isReserved
    def getPrice(self):
        return self._price
    def updatePrice(self, price):
        self._price = price
    def getShow(self):
        return self._show
    def updateShow(self, show):
        self._show = show
-----------------------------------------------------
class Address:
    def __init__(self, streetAddress, city, state, zipCode, country):
        self._streetAddress = streetAddress
        self._city = city
        self._state = state
        self._zipCode = zipCode
        self._country = country
    def getStreetAddress(self):
        return self._streetAddress
    def setStreetAddress(self, streetAddress):
        self._streetAddress = streetAddress
    def getCity(self):
        return self._city
    def setCity(self, city):
        self._city = city
    def getState(self):
        return self._state
    def setState(self, state):
        self._state = state
    def getZipCode(self):
        return self._zipCode
    def setZipCode(self, zipCode):
        self._zipCode = zipCode
    def getCountry(self):
        return self._country
    def setCountry(self, country):
        self._country = country
-----------------------------------------------------
class Movie:
    def __init__(self, title, description, durationInMins, language, releaseDate, genre, movieAddedBy):
        self._shows = []
        self._title = title
        self._description = description
        self._durationInMins = durationInMins
        self._language = language
        self._releaseDate = releaseDate
        self._genre = genre
        self._movieAddedBy = movieAddedBy
    def getTitle(self):
        return self._title
    def updateTitle(self, title):
        self._title = title
    def getDescription(self):
        return self._description
    def updateDescription(self, description):
        self._description = description
    def getDurationInMins(self):
        return self._durationInMins
    def updateDurationInMins(self, durationInMins):
        self._durationInMins = durationInMins
    def getLanguage(self):
        return self._language
    def updateLanguage(self, language):
        self._language = language
    def getReleaseDate(self):
        return self._releaseDate
    def updateReleaseDate(self, releaseDate):
        self._releaseDate = releaseDate
    def getGenre(self):
        return self._genre
    def updateGenre(self, genre):
        self._genre = genre
    def getMovieAddedBy(self):
        return self._movieAddedBy
    def updateMovieAddedBy(self, movieAddedBy):
        self._movieAddedBy = movieAddedBy
    def getShows(self):
        return self._shows
    def adShow(self, show):
        self._shows.append(show)
-------------------------------------------------
import time
from enum import Enum
class BookingStatus(Enum):
    PENDING = 0
    CONFIRMED = 1
    CHECKED_IN = 2
    CANCELED = 3
class Booking:
    def __init__(self, bookingNumber, show, seats, payment):
        self._bookingNumber = bookingNumber
        self._createdOn = round(time.time() * 1000)
        self._status = BookingStatus.PENDING
        self._show = show
        self._seats = seats
        self._payment = payment
    def makePayment(self, payment):
        pass
    def cancel(self):
        if self._status != BookingStatus.CHECKED_IN:
            self._status = BookingStatus.CANCELED
            return True
        return False
    def reserveSeat(self, seat):
        return seat.book()
    def reserveSeats(self, requestedSeats):
        for seat in requestedSeats:
            if not seat.book():
                self._unreserve(self._seats)
                return False
        return True
    def _unreserve(self, seats):
        for seat in seats:
            if not seat.isReserved():
                return
            seat.markAsAvailable()
    def confirmBooking(self):
        if self._status == BookingStatus.PENDING:
            self._status = BookingStatus.CONFIRMED
            return True
        return False
    def checkIn(self):
        if self._status == BookingStatus.CONFIRMED:
            self._status = BookingStatus.CHECKED_IN
            return True
        return False
-----------------------------------------------------------------
import time
from enum import Enum
class PaymentStatus(Enum):
    UNPAID = 0
    PENDING = 1
    COMPLETED = 2
    DECLINED = 3
    CANCELLED = 4
    REFUNDED = 5
    class PaymentMethod(Enum):
        CASH = 0
        CREDIT_CARD = 1
class Payment:
    def __init__(self, amount, transactionId, status, paymentMethod):
        self._status = status
        self._amount = amount
        self._createdOn = round(time.time() * 1000)
        self._transactionId = transactionId
        self._paymentMethod = paymentMethod
    def updatePauymentStatus(self, status):
        self._status = status
    def getAmount(self):
        return self._amount
    def getCreatedOn(self):
        return self._createdOn
    def getTransactionId(self):
        return self._transactionId
    def getStatus(self):
        return self._status
    def getPaymentMethod(self):
        return self._paymentMethod
    def setPaymentMethod(self, paymentMethod):
        self._paymentMethod = paymentMethod
   
    
    
 
             
             
             
            