def add_to_cart(add_to_cart): # try: print("メニューIDは" + add_to_cart["menu_id"]) print("注文数量は" + add_to_cart["order_quantity"]) store_id=session['store_id'] table_number=session['table_number'] group_id=session['group_id'] menu_id=add_to_cart["menu_id"] order_quantity=add_to_cart["order_quantity"] # カートに加えられるアイテムが正しいか判定 store_id==db.session.query(Menu.STORE_ID).filter_by(STORE_ID=store_id, MENU_ID=menu_id).one() #order_status=0はかごに入ってる状態を示す order_status=0 # 既にオーダーされている種類であれば数量追加、なければ新規登録 try: existing_order=db.session.query(Order).filter_by(STORE_ID=store_id, TABLE_NUMBER=table_number, GROUP_ID=group_id, ORDER_STATUS=order_status, MENU_ID=menu_id).one() existing_order.ORDER_QUANTITY=existing_order.ORDER_QUANTITY + int(order_quantity) db.session.commit() db.session.close() except: db.session.add(Order(STORE_ID=store_id, TABLE_NUMBER=table_number, GROUP_ID=group_id, ORDER_STATUS=order_status, MENU_ID=menu_id, ORDER_QUANTITY=order_quantity)) db.session.commit() db.session.close() total_quantity=FlaskAPI.total_quantity(store_id, table_number, group_id, order_status) order_item=FlaskAPI.order_item(store_id, table_number, group_id, order_status, menu_id) print(order_item) print(type(order_item)) room=session['room'] emit("add_to_cart",{'total_quantity': total_quantity, 'order_item': order_item}, room=room)
def day_sales_data(): period_start = request.json['period_day'] store_id = session['store_id'] period_start = FlaskAPI.str_to_date(period_start) period_end = period_start + datetime.timedelta(days=1) #DBクエリの発行により情報を格納する order_data = db.session.query( Order.ORDER_ID, Menu.CLASS_1, Menu.CLASS_2, Menu.CLASS_3, Menu.PRICE, Order.ORDER_QUANTITY, Order.ORDER_STATUS, Order.TABLE_NUMBER, Order.GROUP_ID, Order.MENU_ID ).\ join(Order, Order.MENU_ID==Menu.MENU_ID).\ filter(Order.STORE_ID==store_id, Order.ORDER_TIMESTAMP>=period_start, Order.ORDER_TIMESTAMP<period_end).\ all() menu_list = db.session.query( Menu.MENU_ID, Menu.CLASS_1, Menu.CLASS_2, Menu.CLASS_3, Menu.PRICE ).\ filter(Menu.STORE_ID==store_id).\ all() db.session.close() period = [period_start, period_end] data = {'order_data': order_data, 'menu_list': menu_list, 'period': period} return jsonify(data)
def change_quantity(change_cart): try: print("注文IDは" + change_cart["order_id"]) print("注文数量が" + str(change_cart["order_quantity"]) + "になりました") store_id=session['store_id'] table_number=session['table_number'] group_id=session['group_id'] order_id=change_cart["order_id"] order_quantity=change_cart["order_quantity"] order_status=0 # カートに加えられるアイテムが正しいか判定エラーが出ればexceptに飛ばす order_item=db.session.query(Order).\ filter_by(ORDER_ID=order_id, STORE_ID=store_id).one() menu_id=order_item.MENU_ID # 注文数量が0の時、カートのステータスをカゴ落ち(1)に変更する if order_quantity<=0: order_item.ORDER_STATUS=1 print(order_item) # 数量の変更 order_item.ORDER_QUANTITY=order_quantity print(order_item) db.session.commit() db.session.close() total_quantity=FlaskAPI.total_quantity(store_id, table_number, group_id, order_status) room=session['room'] emit("change_cart",{'total_quantity': total_quantity, 'order_id': order_id, 'order_quantity':order_quantity}, room=room) except: room=session['room'] emit("server_to_client_connection","false", room=room)
def login(): session.clear() #エラーのセッションなどを持っている可能性があるので、クリアしている e_mail = request.form['e_mail'] password = request.form['password'] user = Staff.query.filter_by(E_MAIL=e_mail).first() if user is not None and FlaskAPI.verify_password(user.PASSWORD, password) == True: #パスワードOKの処理 login_user(user) session['loggin'] = True #これは必要ないが、どこかで見ている可能性があるので残しておく。 session['store_id'] = user.STORE_ID session['staff_id'] = user.STAFF_ID store_info = db.session.query(Store).filter( Store.STORE_ID == user.STORE_ID).one() session['store_name'] = store_info.STORE_NAME session['table_number'] = 0 session['tables'] = store_info.TABLES username_session = user.STORE_ID #デバック用 #bufへ店舗専用のディレクトリを作成する(初回ログインのみ) store_dir_path = app.config['BUF_DIR'] + "/" + str(user.STORE_ID) if (os.path.isdir(store_dir_path) == False): os.makedirs(store_dir_path) return redirect('/') else: #パスワードNGの処理 session['error'] = "メールアドレスもしくはパスワードが間違っています" return render_template('login.html')
def order_menu(): try: one_time_password = session['one_time_password'] one_time_password_check = db.session.query(Table.ONE_TIME_PASSWORD).\ filter(Table.ONE_TIME_PASSWORD==one_time_password).\ one() store_id = session['store_id'] table_number = session['table_number'] session['group_id'] = FlaskAPI.group_id() session['room'] = str(session['store_id']) + '_' + str( session['table_number']) + '_' + str(session['group_id']) class_2 = db.session.query(Menu.CLASS_1_ID, Menu.CLASS_2_ID, Menu.CLASS_2).filter(Menu.STORE_ID==store_id).\ group_by(Menu.CLASS_1_ID, Menu.CLASS_2_ID, Menu.CLASS_2).\ order_by(Menu.CLASS_2_ID).\ all() class_3 = db.session.query(Menu.MENU_ID, Menu.CLASS_1_ID, Menu.CLASS_2_ID, Menu.CLASS_3_ID, Menu.CLASS_3, Menu.PRICE).filter(Menu.STORE_ID==store_id).\ order_by(Menu.CLASS_3_ID).\ all() return render_template('order.html', class_2=class_2, class_3=class_3, table_number=table_number, one_time_password=one_time_password) except: return redirect("/logout")
def create_account(): #エラーのセッションなどを持っている可能性があるので、クリアしている session.clear() e_mail = request.form['e_mail'] password = FlaskAPI.hash_password(request.form['password']) # メールアドレスとパスワードが両方ある場合既に登録されているので、.one()がエラーを吐きexceptに飛ぶ。(.first()だとエラーにならないので注意) try: double_create_check = db.session.query(Staff).filter(Staff.E_MAIL==e_mail, Staff.PASSWORD!="").one() print(double_create_check.E_MAIL + "は既に存在しています") session['error'] = "そのメールアドレスは使用できません" return render_template('login.html') except NoResultFound as ex: print(ex) # メールアドレスは存在するが、パスワードが存在しない場合、招待されているので、tryで処理する。(STAFF_CLASSは招待時に付与される想定) try: staff = db.session.query(Staff).filter(Staff.E_MAIL==e_mail, Staff.PASSWORD=="").one() staff.update({PASSWORD: password}) db.session.commit() db.session.close() # 今の所、招待機能は追加していないので、エラーに飛ぶようにしている return render_template('error_1.html') # 上記2パターン以外の場合、純粋な新規登録なので下記で処理 except: db.session.add(Staff(E_MAIL=e_mail, PASSWORD=password, STAFF_CLASS_ID=1, STAFF_CLASS="Representative")) #代表者として登録。その際のIDは1とする。 store_create=db.session.query(Staff).filter(Staff.E_MAIL==e_mail).one() #登録した代表者のレコードを抽出 store_create.STORE_ID = store_create.STAFF_ID store_id=store_create.STAFF_ID #登録した代表者のSTAFF_IDを取得 db.session.add(Store(STORE_ID=store_id)) #代表者が登録された場合、新しいお店としてstoresテーブルに登録 db.session.commit() db.session.close() return redirect("/login")
def login(): session.clear() #エラーのセッションなどを持っている可能性があるので、クリアしている e_mail = request.form['e_mail'] password = request.form['password'] # メールアドレスが合致しているかで、アカウントがあるかを確認 try: login_user = db.session.query(Staff).filter(Staff.E_MAIL==e_mail).one() login_password = FlaskAPI.verify_password(login_user.PASSWORD, password) if login_password == True: #パスワードOKの処理 session['loggin'] = True session['store_id'] = login_user.STORE_ID session['staff_id'] = login_user.STAFF_ID store_info = db.session.query(Store).filter(Store.STORE_ID==login_user.STORE_ID).one() session['store_name'] = store_info.STORE_NAME session['table_number'] = 0 session['tables'] = store_info.TABLES username_session = login_user.STORE_ID#デバック用 #bufへ店舗専用のディレクトリを作成する(初回ログインのみ) store_dir_path = app.config['BUF_DIR'] + "/" + str(login_user.STORE_ID) if (os.path.isdir(store_dir_path) == False): os.makedirs(store_dir_path) print("{} is CREATE".format(store_dir_path)) return redirect('/') else: #パスワードNGの処理 session['error'] = "メールアドレスもしくはパスワードが間違っています" return render_template('login.html') except: session['error'] = "メールアドレスもしくはパスワードが間違っています" #この処理はアカウントが存在しない場合に起こるが、エラー文を変えるとリスクがあるので、パスワードエラーと同一の文章にしている return render_template('login.html')
def qr_generate(): store_id = session['store_id'] #DBクエリの発行により情報を格納する store_info = db.session.query(Store).filter( Store.STORE_ID == store_id).one() store_name = store_info.STORE_NAME tablenum = store_info.TABLES QR_name = [] QR_save_path = [] for i in range(tablenum): QR_string = str(store_id) + "-" + store_name + "-" + str(i + 1) QR_name.append("{}".format(QR_string)) QR_save_path.append(FlaskAPI.qrmaker(QR_string, store_id, store_name)) #QRのZipファイル化(ここは後々関数化予定) with zipfile.ZipFile(app.config['BUF_DIR'] + "/" + str(store_id) + "/" + "grandmenu.zip", 'w', compression=zipfile.ZIP_DEFLATED) as new_zip: for n in range(len(QR_save_path)): new_zip.write(QR_save_path[n], arcname="table_QR" + "/" + QR_name[n] + ".png") return render_template("/qrcode/zipdownload.html", tablenum=tablenum)
def check__submit_for_kitchin(table_number): store_id = session['store_id'] table_number = table_number['table_number'] group_id = FlaskAPI.group_id_for_kitchin(table_number) db.session.query(Order).filter( Order.STORE_ID == store_id, Order.TABLE_NUMBER == table_number, Order.GROUP_ID == group_id, Order.ORDER_STATUS == status_check_request).update( {Order.ORDER_STATUS: status_checked}) db.session.query(Order).filter( Order.STORE_ID == store_id, Order.TABLE_NUMBER == table_number, Order.GROUP_ID == group_id, or_(Order.ORDER_STATUS == status_orderd, Order.ORDER_STATUS == status_cooked)).update( {Order.ORDER_STATUS: status_checked}) db.session.query(Table).filter(Table.STORE_ID == store_id, Table.TABLE_NUMBER == table_number).update({ Table.TABLE_ACTIVATE: 0, Table.ONE_TIME_PASSWORD: None, Table.TOTAL_FEE: None }) db.session.commit() emit("checkout", {'table_number': table_number}, room=store_id)
def table_activate(table_number): # activate_statusをDBに書き込み、クライアント側に情報を戻して、反映する store_id = session['store_id'] table_number = table_number["table_number"] activate_status_befor = db.session.query(Table.TABLE_ACTIVATE).\ filter(Table.STORE_ID==store_id, Table.TABLE_NUMBER==table_number).\ scalar() type(activate_status_befor) if activate_status_befor == 0: while True: one_time_password = FlaskAPI.one_time_password() # one_time_password = '******' わざと無限ループを起こす場合に使用 one_time_password_exists = db.session.query(Table.ONE_TIME_PASSWORD).\ filter(Table.ONE_TIME_PASSWORD==one_time_password).\ scalar() if one_time_password != one_time_password_exists: activate_status_after = 1 break else: one_time_password = None activate_status_after = 0 db.session.query(Table).\ filter(Table.STORE_ID==store_id, Table.TABLE_NUMBER==table_number).\ update({Table.TABLE_ACTIVATE: activate_status_after, Table.ONE_TIME_PASSWORD: one_time_password}) db.session.commit() db.session.close() table_information = { 'table_number': table_number, 'activate_status': activate_status_after, 'one_time_password': one_time_password } emit("table_activate", table_information, room=store_id) emit("table_activate_origin", table_information)
def index(): # sessionに'login'がなければlogout処理 login_check = FlaskAPI.login_check() # 店舗名が登録されてなければ、store_settingに飛ばす try: store_id = session['store_id'] store_name = db.session.query(Store.STORE_NAME).filter(Store.STORE_ID==store_id, Store.STORE_NAME != "", Store.TABLES != None).one() return render_template('index.html',store_name=store_name) except: return redirect('/store_setting')
def one_time_password(one_time_password): session.clear() try: tables = db.session.query(Table).\ filter(Table.ONE_TIME_PASSWORD==one_time_password).\ one() session['store_id'] = tables.STORE_ID session['one_time_password'] = tables.ONE_TIME_PASSWORD session['table_number'] = tables.TABLE_NUMBER group_id = FlaskAPI.group_id() return redirect("/order_menu") except: return redirect("/logout")
def change_order_quantity(change_order_quantity): room = session['room'] order_id = change_order_quantity['order_id'] quantity = change_order_quantity['quantity'] order_timestamp = datetime.now() # 注文情報が正しいか確認 FlaskAPI.order_id_check(order_id) order_item = db.session.query(Order).filter_by(ORDER_ID=order_id).one() order_item.ORDER_QUANTITY = order_item.ORDER_QUANTITY + quantity # 注文数量が0の時、カートのステータスをカゴ落ち(1)に変更する if quantity <= 0: order_item.ORDER_STATUS = status_drop_cart order_item.ORDER_QUANTITY = 0 else: order_item.ORDER_QUANTITY = quantity order_item.ORDER_TIMESTAMP = order_timestamp db.session.commit() db.session.close() order_menu = FlaskAPI.order_item(order_id) emit('order_list_show', order_menu, room=room)
def order_submit(): print("オーダー決定") store_id=session['store_id'] table_number=session['table_number'] group_id=session['group_id'] order_status=2 db.session.query(Order).filter_by(STORE_ID=store_id, TABLE_NUMBER=table_number, GROUP_ID=group_id, ORDER_STATUS=0).update({Order.ORDER_STATUS: order_status}) db.session.commit() db.session.close() order_list=FlaskAPI.order_list(store_id, table_number, group_id, order_status) emit("add_to_order",order_list, room=store_id)
def cart_information(msg): # 受け取ったMessageを表示 print(msg) # store_id → table_table_number → group_id → room(そのテーブルに座っている人にだけ送るチャットルームみたいなもの)の順に変数を設定していく store_id=session['store_id'] # 店舗の場合はsessionにtable_numberを持っていないので、0を代入 if 'table_number' not in session: session['table_number']=0 table_number=session['table_number'] # 決済が完了しているグループのgroup_idをgroup_id_maxとして取得 group_id_max=db.session.query(func.max(Order.GROUP_ID)).filter_by(STORE_ID=store_id, TABLE_NUMBER=table_number, ORDER_STATUS=7).scalar() # group_id_maxに対して+1した数字が現在のgroup_id(group_id_maxがNoneの場合、その店のそのテーブルで注文する初めての客) if group_id_max is None: group_id=1 else: group_id=group_id_max + 1 session['group_id']=group_id # roomをセッションに持たせる session['room']=str(session['store_id']) + "_" + str(session['table_number']) + "_" + str(session['group_id']) session['store']=str(session['store_id']) room=session['room'] # roomというチャットスペースみたいなところに入る join_room(room) # カートの中身を見たいので、order_status=0を設定 order_status=0 # カートに入っている商品数を求める(order_statusの値を変更すれば、カートに入っているものや、注文済みのもの、決済が完了したものを見ることができる) total_quantity=FlaskAPI.total_quantity(store_id, table_number, group_id, order_status) # カートに入っている商品情報を求める(order_statusの値を変更すれば、カートに入っているものや、注文済みのもの、決済が完了したものを見ることができる) order_list=FlaskAPI.order_list(store_id, table_number, group_id, order_status) # roomのメンバーに情報を送信 emit("cart_information",{'total_quantity': total_quantity, 'order_list': order_list})
def add_to_cart(add_to_cart): store_id = session['store_id'] table_number = session['table_number'] group_id = session['group_id'] room = session['room'] menu_id = add_to_cart['menu_id'] quantity = add_to_cart['quantity'] order_timestamp = datetime.now() # 注文されたメニューが本当にその店のメニューかチェックする FlaskAPI.menu_id_check(menu_id) try: add_order = db.session.query(Order).\ filter_by( STORE_ID=store_id, TABLE_NUMBER=table_number, GROUP_ID=group_id, ORDER_STATUS=status_in_cart, MENU_ID=menu_id ).one() add_order.ORDER_QUANTITY = add_order.ORDER_QUANTITY + int(quantity) add_order.ORDER_TIMESTAMP = order_timestamp except: add_order = Order(STORE_ID=store_id, TABLE_NUMBER=table_number, GROUP_ID=group_id, ORDER_STATUS=status_in_cart, MENU_ID=menu_id, ORDER_QUANTITY=quantity, ORDER_TIMESTAMP=order_timestamp) db.session.add(add_order) db.session.commit() order_id = add_order.ORDER_ID order_menu = FlaskAPI.order_item(order_id) emit('order_list_show', order_menu, room=room)
def show_order(msg): # 受け取ったMessageを表示 print(msg) # store_id → table_table_number → group_id → room(そのテーブルに座っている人にだけ送るチャットルームみたいなもの)の順に変数を設定していく store_id=session['store_id'] # roomというチャットスペースみたいなところに入る join_room(store_id) # カートの中身を見たいので、order_status=0を設定 order_status=2 # カートに入っている商品情報を求める(order_statusの値を変更すれば、カートに入っているものや、注文済みのもの、決済が完了したものを見ることができる) order_list=FlaskAPI.order_list_all(store_id, order_status) # roomのメンバーに情報を送信 emit("show_order",order_list, room=store_id)
def show_menu(): if 'store_id' not in session: return redirect("/logout") else: session['group_id'] = FlaskAPI.group_id() store_id = session['store_id'] session['room'] = str(session['store_id']) + '_' + str( session['table_number']) + '_' + str(session['group_id']) class_2 = db.session.query(Menu.CLASS_1_ID, Menu.CLASS_2_ID, Menu.CLASS_2).filter(Menu.STORE_ID==store_id).\ group_by(Menu.CLASS_1_ID, Menu.CLASS_2_ID, Menu.CLASS_2).\ order_by(Menu.CLASS_2_ID).\ all() class_3 = db.session.query(Menu.MENU_ID, Menu.CLASS_1_ID, Menu.CLASS_2_ID, Menu.CLASS_3_ID, Menu.CLASS_3, Menu.PRICE).filter(Menu.STORE_ID==store_id).\ order_by(Menu.CLASS_3_ID).\ all() return render_template('show_menu.html', class_2=class_2, class_3=class_3)
def order_status_change(order_status_change): # order_status = 3は調理完了を示し、4は調理キャンセルを示す store_id = session['store_id'] order_id = order_status_change['order_id'] order_status = order_status_change['order_status'] order_timestamp = datetime.now() # オーダーステータスのアップデート order = db.session.query(Order).filter(Order.STORE_ID == store_id, Order.ORDER_ID == order_id).one() if order.ORDER_STATUS <= order_status: order.ORDER_STATUS = order_status order.ORDER_TIMESTAMP = order_timestamp db.session.commit() table_number = order.TABLE_NUMBER group_id = order.GROUP_ID db.session.close() # roomのメンバーに情報を送信 room = str(store_id) + '_' + str(table_number) + '_' + str(group_id) order_menu = FlaskAPI.order_item(order_id) emit("order_processing", order_id, room=store_id) emit("order_list_show", order_menu, room=room)