From d8240448c226f3ee3d4c558d131c2c284ad76ff5 Mon Sep 17 00:00:00 2001
From: n9-baker <nathan2.baker@live.uwe.ac.uk>
Date: Mon, 31 Mar 2025 15:10:02 +0100
Subject: [PATCH] working on createBooking..

---
 src/__pycache__/constants.cpython-38.pyc | Bin 507 -> 507 bytes
 src/__pycache__/dbfunc.cpython-38.pyc    | Bin 4544 -> 4550 bytes
 src/__pycache__/staffUser.cpython-38.pyc | Bin 4136 -> 5260 bytes
 src/dbfunc.py                            |   7 ++--
 src/staffUser.py                         |  47 ++++++++++++++++++++++-
 5 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/src/__pycache__/constants.cpython-38.pyc b/src/__pycache__/constants.cpython-38.pyc
index 5407becad84724af1ad69cce59b95785cada7604..5ea3abf5d9a57105ebe07c9c1a834cae2e71d7a8 100644
GIT binary patch
delta 20
bcmey({F|9Ol$V!_fq{WxLjS9c+#eVLJ>~{C

delta 20
bcmey({F|9Ol$V!_fq{X++5W~x?hlLrIgtg3

diff --git a/src/__pycache__/dbfunc.cpython-38.pyc b/src/__pycache__/dbfunc.cpython-38.pyc
index 80583cd309f5cd688e9e7ee73e1aeaff4cfd8f09..8346d03f6a931ec3d5de2fd06882ba260d0076ca 100644
GIT binary patch
delta 544
zcmX@0d`y`)l$V!_fq{YH>HJsewi9_}87EEDE>uh9OBG1rox_yEm%`t|5+#@-kRsT^
z5G9l%lp@^15G9<#7|ft4vT;`(tH=Qc28I%bW`<hk8s=iYbcSGts)ETrY&s?>>~onH
zGBPsMuq<GyVTH0-7c$hc)vy(3l`t(}PT>HFhBKsa1~Y*9T$5L^Nn7q>WT<6lWT=uV
zVOqeM!d=5Yn_(^!L}etyA{LP96wX@qI`#;LNQOM72(W%lp2WGE|FQKmPM*i1&COm|
znp#w8tNx2oeewm4TgF^$j4X^SOiWBXjAD#Jj9iQyj4X^?jBJbojBJb|i~@{B+6)W~
znoLEC3=9mnSW*&85+`5aloGoI^BhwRQ!yXN*Hv4p@+NV4@YFCaU|-0vkcp9@hH3I*
zK2^qjlTY$lPTtP7V6v5f=;R!3!O1P$CQ?N@3=9lK!XQExWHftneokp_UU8AZ<TJc-
zx|w;!sYNC6nRzAo@g<2#IjP|c3=G9epa@}tIGKf!gOQI>gi(S~V6z-gB_pHZ<Qcrl
zjCq^?@E&1g?4Ep(zh7JrWV}4cc-E5Af}GSM1CRhnq0(f3PIg9}$^8PZjLnm;3TU!f
ng8V5mnME*14CLioEGe1EB}K*{4JIJMa&m*9HLH?<IEN?zcL0Lp

delta 552
zcmX@6d_b8ul$V!_fq{YHM(mAruZg^}j9nA83*}OHQ}|jKq6AX-Qv_NVq6AX}Q-oR=
zqJ&ZygBdi1Hy)~E71_tYz)-@_%uvf*!(7al&JfH{l{YzrO{ab?(?Ui@h8mUyEH$i9
z7VAQWTDBUt;*1ie1<WbzAklD!6pmm9FrTxAZ8if`7h5<(Farxi30oF>7DqN$(GEt2
zT6RW;Dyb5t1)M2dHS92z;S7-si&#Krq;S--*Re-1L^9+tMKGkWa|APJawo3a%)#Ez
zIQb=u^5m5qlI(1SrKv@gwv*3t+*0FaV`O1uVPaz9VH9H&VB})tU}RzBVq{|!U}R$y
zVH992(qdp>n0$*<O6(rYlT0;C#e5*&SM8`On#{%J;Z(w2!?=KBAwx6cLMBFr8m0xD
z3mF(0O1Ktqr*J?#7|yWBBZU*}9iA-SEWT{6qC-&c$dzy{;GaB!>nx+d<T!3sHrA5T
zf}GUJP28r^w^&jVOA?EO85kIfWEmJ3Zm}ol=alB=6&LAGzR0c57%`cVM~YEovkXrq
zBcs9OX}rmd`I~?79${qcnY^FBUsMOAQ65C-fe3vN0aB*K!BM0L;uucu7jR{4nS511
llg)yGfk9JvGK*l20Lafp#vlbIAi`pDo1itTGKV;aC;)|YfQJA8

diff --git a/src/__pycache__/staffUser.cpython-38.pyc b/src/__pycache__/staffUser.cpython-38.pyc
index 343e76504ab6456f938f01a09af3c61b5601119a..f2c28d2f5ea35cd2431b03f79b2148e91e4e7a19 100644
GIT binary patch
delta 1523
zcmZ3X(4)y0%FD~ez`(%ZH~&?7i_Av8XPouy3=9k)?99NxP@Koez)-@F!r08n$WX#q
z!j!_)%-GCW3t}-hGuATIFs86%Gf!YFN~mFiu}YXzSX0<i*lQSPGt6a5;pk<qWv*dP
z;gn>kWiDY^z*@pq!`#fc5M(0D0@f6+8fK6>5Wj{wg{2;BTv!d$0`?T{g^aaKAT238
zHB2x?DZD9sEethGE({<CfMxj+vL(zZ0x5ziLN&}O!jcRiJzxj0)UbdYkRm9_P|E_=
zBT~Zxk_A~?!coK2%vi!$!_v%{UC%gyvB;-{6C{+vnau*?)i9@sN-~sify6`@YFSIT
zYZ$V4YM4{RBpGU$YFKNSQ^X}1QY3m=YuUhtOV+T#4d+dfs$ol!?qy<RNMQ*Eg{BNB
zH1jx07*b?GtU{2O9E6p^!V=7&DL+}7%c))}ASX4kI8`Atub{L<At^sUJ2Nj`Au}&6
zU$2UXD>x&+9K`o@v8vMM3QkQdDOSkLQ%K7%%1ta$P&ZUp$S+b*H&ifEFjiO4$jetq
zDJ@7X*0l1w#a)t=1Jzwz#KOS9P{mygF)Tha#a5HKNRfeo;TC6oacWL#a!F=>UXc<5
z149ubNF^^!WlCa6qU|q6g({w6kkxv{1v!}|w#gtxp!5X7ObiSRAmf8U2}y*3fgzot
zh9Q=xma&APhOwD(B2yttFhh|50|SF5<1OaQyb?{OTTFTew-_tHf~sJ$ND$;0E}NXp
z;*#Y2+yc8~kZB-e*%+7@s<bEX<r1&gv&qR%PRuE`(?h7M;(|CVGq1!piVNiB<f7En
zyy7SUka%WZdVF$XL1J=dNo5sRF<1)Z`zTI08{#vlLfc!c1x1<3skgXb0g#yz#R+1^
zmt@xGrfRYl@qhx!9OPPXki_Se<|d^U72o16$uCLFiHB(CfktC|N@7WB6;EbfacWTs
zh?8gwju$6LEEj7sfn%Xa9u(+Oo_S@7IhiR6P?syfV@9t^*fX!J9wG^kL%k|_-^}7-
zQ0joBodQTgDk-W|NK8-6%+u541N$ehq{s;5U{<iQTjCIN<I{@rbK^@AlX6ny%QI4o
zQj4TOUXuo?WGSgENWH}hj_q5_xrr6Gm~%5z@@_Hbq~_gXNy$tu0f$4BAk=4>c_sM}
zqcquz_(8^iLMVzA<dfnk9#8;+LKu{qqPRhVAYO7}L6I2)149%y)D)2P<Oy8LZcd<d
z#md3N!^puX!o<SJ#K`fFjhTayk5Pb$i;0U-0K{ShiSztpW9DHLU{YWbV3c7L0Ezu)
zV`5?AV&-C=yqjwgYmqer1H<GjZhywQ$-B7q`HMgfE3yDN(UO6IVY2`a3!^BiSdkS-
z)_SrLZ-4;0%;ZVD+Kg?J_wm+o%PY92mJ}<1{5DyMTW4}CAHQIcK1iz@h;RoHo|9Yo
z6c}er-o>pjIhK!O@;N?TR&ZQQ;@6jV1*vcW5niA$XHCn=Pb?|&1qt|p9Q~1BWO6dU
wJfq>{X8srfe^5xVmKLWL85Y?<q?N^l7#J7?7&#b00mZ|@SI?lx!NkT00JWZ!!vFvP

delta 405
zcmeCtT%o`h%FD~ez`($;Ht9xsqtHgaXPoMc3=9m+3=9m;3=9m#A`A=+B@7D~Qy3RA
zGBT7fH8V6ZrZ5FFXfjVO<#y7RPEO3pNlj5mE=o--Np;H4&(6$CSIA8*$;eOf(_}7^
zVqjn>k_HhXljn0vOn$^C%)tV(kC}^cvNiuA-do%yNjXq`#giZL`!fbl<`!0%e2$+(
zSd*oQhk=3N7FTgbetBkIdVFTe<T_sI%>@E1jB;imL(M^i1xO7~62$KKl*E$MB7@1D
zf&l`kN{TEezZBGFjGiniRL96Uc^$vP<WoZYl3)h}Lo6sRG6WfD1R_i(3kpbZ!X$Dh
za|?&E-eS(oE18@stS_q%vXdnxGr6S56vSjr%gIkHDY60Sw41y^*o={F@^j%B5qky(
whA7t3;?yF;TdV~|nRz8e0+R&=gePZ+@QDa8Ffa%(axn6MFbiKP2NN4307~6wr~m)}

diff --git a/src/dbfunc.py b/src/dbfunc.py
index 11ee058..828e58a 100644
--- a/src/dbfunc.py
+++ b/src/dbfunc.py
@@ -58,7 +58,6 @@ def select_from_table_where(table:str, condition:str, selection:str):
         condition (str): condition string in SQL format, eg; "WHERE username = %s AND password_hash = %s"
         *columns: excepts all aditinal arguments and converts them into SQL query following SELECT as arguments, if none SQL statemnt uses *.
     Returns:
-        Returns:
         list(dict())
     """
     conn = get_connection()
@@ -69,7 +68,7 @@ def select_from_table_where(table:str, condition:str, selection:str):
         #logging.debug(table, condition, selection)
         cursor = conn.cursor(dictionary=True)
         query = f"SELECT {selection} FROM {table} WHERE {condition}"
-        logging.debug(f"query={query}")
+        logging.debug(f"query='{query}'")
         cursor.execute(query)
         results = cursor.fetchall() # returns string in format str(dict(key:values))
         if not results:
@@ -85,7 +84,7 @@ def select_from_table_where(table:str, condition:str, selection:str):
     #    conn.close()
 
 # Function to INSERT data into any table
-def insert_into_table(table, data):
+def insert_into_table(table:str, data:dict):
     """Inserts data into a specified table."""
     conn = get_connection()
     if not conn:
@@ -96,7 +95,7 @@ def insert_into_table(table, data):
         columns = ', '.join(data.keys())
         values = ', '.join(['%s'] * len(data))
         query = f"INSERT INTO {table} ({columns}) VALUES ({values})"
-        cursor.execute(query, tuple(data.values()))
+        cursor.execute(query, data.values())
         conn.commit()
         logging.info("Data inserted successfully.")
         return True
diff --git a/src/staffUser.py b/src/staffUser.py
index 03edb2a..2d9b4e4 100644
--- a/src/staffUser.py
+++ b/src/staffUser.py
@@ -77,8 +77,51 @@ class StaffUser:
     def createBooking(self):
         """ Adds booking to db and returns ticket if succsessful.
         """
-        logging.debug("called createBooking method")
-        raise NotImplementedError()
+        # input data and validation loop
+        while True:
+            print("Please input booking info.")
+            
+            showing_id = int(input("\nShowing ID:"))
+            seats = input("\nSeats in format '1' or '1 2 3' (no dupes):")
+            if showing_id != None and seats != None:
+                # import showing data
+                showing_data = select_from_table_where(table="tblShowings",
+                                                       selection="*",
+                                                       condition=f"showing_id={showing_id}")
+                showing_data = showing_data[0]
+                logging.debug(type(showing_data))
+                logging.debug(f"showing_data={showing_data}")
+                # check if showing_data was returned from db
+                if showing_data != None:
+                    # validate selected seats
+                    seats = seats.split(" ")
+                    logging.debug(f"seats.split={seats}")
+                    seats = [int(x) for x in seats]      # use while seats are int, remove when seats are str.
+                    logging.debug(f"seats.int={seats}")
+                    seating_cap = select_from_table_where(table="tblScreens",
+                                                           selection="seating_capacity",
+                                                           condition=f"screen_id={showing_data['screen_id']}")
+                    seating_cap = seating_cap[0]['seating_capacity']
+                    logging.debug(f"seating_cap={seating_cap}")
+                    # check if seat selection in range
+                    if max(seats) <= int(seating_cap) and min(seats) > 0:
+                        # showing_id and seats exist, and seat selection is in range now save to tblBookings
+                        price = showing_data['price'] * len(seats)
+                        insert_data=dict(user_id=self.user_id, showing_id=showing_data['showing_id'], seat_numbers=seats, total_price=price, booking_date=showing_data['show_time'])
+                        logging.debug(f"insert_data={insert_data}")
+                        insert_into_table(table="tblBookings",
+                                          data=insert_data)
+                        return
+                        
+                    print("Invalid seating selection.")
+
+                else:
+                    print("Invalid showing_id.")
+                    
+            else:
+                print("Missing input please try again.")
+        
+            
 
     def veiwBookings(self) -> dict:
         """ Gets bookings from db
-- 
GitLab