Пример #1
0
def handle_delivery(update, context):
    query = update.callback_query
    chat_id = query.message.chat_id
    print(query.message.text)
    if query.data.split(' ')[1] == 'delivery':
        button, delivery, lon, lat = query.data.split(' ')
        customer_cart = moltin.get_cart(chat_id)
        restaurant_address = location.get_delivery_raidus(lon,
                                                          lat)['restaurant']
        cart_description = get_cart_details(customer_cart)
        restaurant_chat_id = moltin.get_restaurant_chat_id(restaurant_address)
        context.bot.send_message(chat_id=restaurant_chat_id,
                                 text=cart_description)
        context.bot.send_location(chat_id=restaurant_chat_id,
                                  latitude=lat,
                                  longitude=lon)
        context.job_queue.run_once(send_reminder, 5, context=chat_id)
        return "HANDLE_PAYMENT"
    else:
        button, pickup, lon, lat = query.data.split(' ')
        restaurant_address = location.get_delivery_raidus(lon,
                                                          lat)['restaurant']
        query.message.reply_text(
            f'Спасибо за покупку, ожидаем вас в течение часа, по адрессу:\n{restaurant_address}'
        )
Пример #2
0
def handle_cart(bot, update):
    chat_id, data = get_chat_id_and_reply(update)
    cart, buttons = moltin.get_cart(chat_id)
    message = update.callback_query.message
    if data == 'cart':

        delete_item_buttons = [[
            InlineKeyboardButton(text=b[0], callback_data=b[1])
        ] for b in buttons]
        keyboard = [
            *delete_item_buttons,
            [InlineKeyboardButton('В меню', callback_data='menu')],
            [InlineKeyboardButton('Оплатить', callback_data='waiting_mail')]
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        bot.send_message(chat_id=chat_id, text=cart, reply_markup=reply_markup)
        bot.delete_message(chat_id=message.chat_id,
                           message_id=message.message_id)
        return 'HANDLE_CART'
    if data == 'menu':
        return handle_start(bot, update)
    elif data == 'waiting_mail':
        email_request = 'Для оформления заказа пришлите, пожалуйста, почту'
        bot.edit_message_text(chat_id=chat_id,
                              text=email_request,
                              message_id=message.message_id)
        return 'WAITING_MAIL'
    else:
        moltin.delete_item_from_cart(chat_id, data)
        update.callback_query.data = 'cart'
        return handle_cart(bot, update)
Пример #3
0
def send_invoice(bot, update):
    query = update.callback_query
    chat_id = query.message.chat_id
    cart = get_cart(chat_id)
    title = f'Заказ {chat_id}'
    description = 'Пицца'
    payload = 'Pizza_payment'
    provider_token = TELEGRAM_PAYMENT_TOKEN
    start_parameter = TELEGRAM_PAYMENT_PARAMETER
    currency = 'RUB'
    prices = [
        LabeledPrice(f'{pizza["name"]}, {pizza["quantity"]} шт.',
                     pizza['unit_price'] * INVOICE_PRICE_MULTIPLIER)
        for pizza in cart['products'] if pizza["name"] != DELIVERY_ITEM_NAME
    ]
    delivery = next(item for item in cart['products']
                    if item['name'] == DELIVERY_ITEM_NAME)
    prices.append(
        LabeledPrice(delivery['name'],
                     delivery['unit_price'] * INVOICE_PRICE_MULTIPLIER))

    bot.sendInvoice(chat_id, title, description, payload, provider_token,
                    start_parameter, currency, prices)

    return 'WAITING PAYMENT'
Пример #4
0
def add_delivery_order(bot, update, delivery_price, customer_location):
    query = update.callback_query
    chat_id = query.message.chat_id
    message_id = query.message.message_id

    longitude, latitude = customer_location
    customer_location = {
        'longitude': longitude,
        'latitude': latitude,
        'delivery-price': delivery_price,
        'customer_id': chat_id,
    }
    add_customer_location(customer_location)
    add_delivery_to_cart(chat_id, delivery_price)

    cart = get_cart(chat_id)
    cart_text = get_cart_items_text(cart)

    customer_text = f'Доставим пицу в течении часа после оплаты.\n\n{cart_text}'
    keyboard = [[InlineKeyboardButton('💳 Оплатить', callback_data='payment')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    bot.edit_message_text(text=customer_text,
                          chat_id=chat_id,
                          message_id=message_id,
                          reply_markup=reply_markup)

    return 'WAITING PAYMENT'
Пример #5
0
def send_cart(bot, update):
    query = update.callback_query
    chat_id = query.message.chat_id
    cart = get_cart(chat_id)
    keyboard = [[InlineKeyboardButton('В меню', callback_data='menu')]]

    if cart['products']:
        text_rows = [
            '{0}\n{1}\n{2} per kg\n{3} kg in cart for {4}'.format(
                product['name'], product['description'], product['unit_price'],
                product['quantity'], product['total_price'])
            for product in cart['products']
        ]
        text_rows.append(f'Total: {cart["total_price"]}')
        text = '\n\n'.join(text_rows)

        keyboard.extend([[
            InlineKeyboardButton(f' Убрать {product["name"]}',
                                 callback_data=product['id'])
        ] for product in cart['products']])
        keyboard.append(
            [InlineKeyboardButton('Оформить заказ', callback_data='checkout')])

    else:
        text = 'You don\'t have any items in your cart.'

    reply_markup = InlineKeyboardMarkup(keyboard)
    bot.edit_message_text(text=text,
                          chat_id=chat_id,
                          message_id=query.message.message_id,
                          reply_markup=reply_markup)

    logger.debug(f'Cart sent')
    return 'HANDLE_CART'
Пример #6
0
def handle_menu(bot, update, job_queue):
    message_id, chat_id, query_data = get_query_data(update)
    if query_data == 'goto_cart':
        cart, products, total = get_cart(chat_id)
        display_cart(bot, cart, products, total, chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_CART'
    display_description(bot, query_data, chat_id)
    bot.delete_message(chat_id=chat_id, message_id=message_id)
    return 'HANDLE_DESCRIPTION'
def handle_description(bot, update):
    call_back = update.callback_query.data
    chat_id = str(update.callback_query.message.chat_id)
    _id, name, quantity = call_back.split(',')
    moltin.get_cart(moltin.cart_url, chat_id, headers)
    payload_cart = {
        "data": {
            "id": _id,
            "type": "cart_item",
            "quantity": int(quantity)
        }
    }
    headers.update({'Content-Type': 'application/json'})
    moltin.add_product_to_cart(moltin.operation_cart_url, headers,
                               payload_cart, chat_id)
    bot.answer_callback_query(callback_query_id=update.callback_query.id,
                              text=f"product was added to cart.",
                              show_alert=False)

    return 'HANDLE_DESCRIPTION'
Пример #8
0
def create_basket_buttons(user_id=None):
    user_basket = moltin.get_cart(user_id)
    keyboard = []
    for product in user_basket:
        pr_name = product['name']
        pr_id = product['cart_id']
        keyboard.append(
            [InlineKeyboardButton(f'Удалить {pr_name}', callback_data=pr_id)])
    keyboard.append(
        [InlineKeyboardButton("Назад в меню", callback_data='back_to_menu')])
    keyboard.append(
        [InlineKeyboardButton("Оформить заказ", callback_data='sell')])
    return InlineKeyboardMarkup(keyboard)
Пример #9
0
def send_order_to_courier(bot, update):
    customer_id = update.message.chat_id
    customer_location = get_customer_location(str(customer_id))
    pizzeria_id, _ = get_nearest_pizzeria(customer_location)
    courier_id = get_pizzeria(pizzeria_id)['courier-id']
    cart = get_cart(customer_id)
    cart_text = get_cart_items_text(cart)
    courier_text = f'Заказ {customer_id}\n\n{cart_text}\n\nЗАКАЗ ОПЛАЧЕН'
    bot.send_message(chat_id=courier_id, text=courier_text)
    longitude, latitude = customer_location
    bot.send_location(chat_id=courier_id,
                      latitude=latitude,
                      longitude=longitude)
Пример #10
0
def create_basket_buttons(user_id=None):
    user_basket = moltin.get_cart(user_id)
    keyboard = VkKeyboard()
    for product in user_basket:
        pr_name = product["name"]
        cart_id = product["cart_id"]
        keyboard.add_button(f"Удалить {pr_name}", payload=json.dumps(cart_id))
        keyboard.add_line()
    keyboard.add_button("Назад в меню",
                        payload=json.dumps("back"),
                        color=VkKeyboardColor.POSITIVE)
    keyboard.add_line()
    keyboard.add_button("Оформить заказ",
                        payload=json.dumps("order"),
                        color=VkKeyboardColor.NEGATIVE)
    return keyboard.get_keyboard()
Пример #11
0
def handle_checkout_payment(bot, update, job_queue):
    message_id, chat_id, query_data = get_query_data(update)
    cart, products, total = get_cart(chat_id)
    if query_data == 'goto_payment_cash':
        bot.send_message(text=f'Договорились! Напоминаем, что вы заказали:\n{products}\nСумма:{total} руб.', chat_id=chat_id)
    elif query_data == 'goto_payment_card':
        title = 'Оплата заказа'
        description = f'{products}\nСумма:{total} руб.'
        payload = PAYMENT_PAYLOAD
        provider_token = os.getenv('PAYMENT_TOKEN_TRANZZO')
        start_parameter = 'test-payment'
        currency = 'RUB'
        price = total
        prices = [LabeledPrice('Test', price * 100)]
        bot.sendInvoice(chat_id, title, description, payload, provider_token,
                        start_parameter, currency, prices)
    bot.delete_message(chat_id=chat_id, message_id=message_id)
Пример #12
0
def handle_basket(headers, params, recipient_id, message):
    if message == 'back_to_menu':
        menu_elements = create_all_menu()
        request_content = {
            'recipient': {
                'id': recipient_id
            },
            'message': {
                'attachment': {
                    'type': 'template',
                    'payload': {
                        'template_type': 'generic',
                        'image_aspect_ratio': 'square',
                        'elements': menu_elements,
                    },
                }
            },
        }
        response = requests.post(url=FB_API,
                                 params=params,
                                 headers=headers,
                                 json=request_content)
        response.raise_for_status()
        return 'HANDLE_MENU'
    elif message == 'order':
        send_message(
            recipient_id,
            message=
            'Где вы находитесь? Введите адрес для выбора ближайшей пиццерии.',
        )
        return 'HANDLE_ORDER'
    elif message.split()[0] == 'add':
        product_id = message.split()[1]
        moltin.put_in_cart(recipient_id, product_id, 1)
        send_message(recipient_id, message='Добавили еще 1 пиццу.')
        create_basket_menu(recipient_id)
        return 'HANDLE_BASKET'
    elif message.split()[0] == 'remove':
        product_id = message.split()[1]
        user_cart = moltin.get_cart(recipient_id)
        product_id_in_cart = next(product['cart_id'] for product in user_cart
                                  if product['product_id'] == product_id)
        moltin.delete_item_in_cart(recipient_id, product_id_in_cart)
        send_message(recipient_id, message='Удалили из корзины.')
        create_basket_menu(recipient_id)
        return 'HANDLE_BASKET'
Пример #13
0
def handle_description(bot, update, job_queue):
    message_id, chat_id, query_data = get_query_data(update)
    if query_data == 'goto_menu':
        display_menu(bot, chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_MENU'
    elif query_data == 'goto_cart':
        cart, products, total = get_cart(chat_id)
        display_cart(bot, cart, products, total, chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_CART'
    else:
        product_id = query_data
        cart, products, total = add_to_cart(chat_id, product_id)
        display_cart(bot, cart, products, total, chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_CART'
Пример #14
0
def handle_cart(bot, update, job_queue):
    message_id, chat_id, query_data = get_query_data(update)
    if query_data == 'goto_menu':
        display_menu(bot, chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_MENU'
    elif query_data == 'goto_checkout_geo':
        bot.send_message(text=f'ОФОРМЛЕНИЕ ЗАКАЗА:\nДля доставки вашей пиццы'
                                ' отправьте нам геолокацию или адрес текстом.',
                        chat_id=chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_CHECKOUT_GEO'
    else:
        delete_from_cart(chat_id, query_data)
        cart, products, total = get_cart(chat_id)
        display_cart(bot, cart, products, total, chat_id)
        bot.delete_message(chat_id=chat_id, message_id=message_id)
        return 'HANDLE_CART'
Пример #15
0
def handle_description(update, context):
    query = update.callback_query
    reference = query.message.chat_id
    if query.data.split(' ')[1] == 'cart':
        final_amount = moltin.get_cart_total_sum(reference)
        cart_descriptions = moltin.get_cart(reference)
        reply_markup = get_keyboard(cart_descriptions)
        cart_details = get_cart_details(cart_descriptions)
        query.message.reply_text(
            f'{cart_details}\n\nСумма заказа: {final_amount["formatted"]}$',
            reply_markup=reply_markup)
        context.bot.delete_message(chat_id=query.message.chat_id,
                                   message_id=query.message.message_id)
        return "HANDLE_CART"
    else:
        button, product_id, quantity = query.data.split(' ')
        moltin.add_product_to_cart(reference, product_id, quantity)
        update.callback_query.answer('Добавленно в корзину')
Пример #16
0
def handle_checkout_receipt(bot, update, job_queue):
    global database
    message_id, chat_id, query_data = get_query_data(update)
    cart, products, total = get_cart(chat_id)
    customer_id = database.get(f'{chat_id}_id_customer').decode('utf-8')
    latitude, longitude, nearest_shop_id = get_customer(customer_id)
    address, courier_telegram_id = get_address(nearest_shop_id)
    keyboard = [[InlineKeyboardButton('ПО КАРТЕ', callback_data='goto_payment_card')],
                [InlineKeyboardButton('НАЛИЧНЫМИ', callback_data='goto_payment_cash')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    if query_data == 'goto_checkout_delivery':
        bot.send_location(latitude=latitude, longitude=longitude, chat_id=courier_telegram_id)
        bot.send_message(text=f'Заказ:\n{products}\nСумма:{total} руб.',
                        chat_id=courier_telegram_id)
        #job_queue.run_once(add_reminder, REMINDER_TIME, context=chat_id)
        bot.send_message(text=f'Заказ принят и скоро будет доставлен! Как будете оплачивать?', chat_id=chat_id, reply_markup=reply_markup)
    elif query_data == 'goto_checkout_pickup':
        bot.send_message(text=f'Отлично! Ждем вас по адресу: {address}. Как будете оплачивать?', chat_id=chat_id, reply_markup=reply_markup)
    bot.delete_message(chat_id=chat_id, message_id=message_id)
    return 'HANDLE_CHECKOUT_PAYMENT'
Пример #17
0
def handle_cart(update, context):
    query = update.callback_query
    if query.data.split(' ')[1] == 'pay':
        query.message.reply_text(
            "Пришлите пожалуйста свою геолокацию или напишите ваш район")
        return "HANDLE_WAITING"
    else:
        product_id = query.data.split(' ')[1]
        reference = query.message.chat_id
        moltin.delete_product_from_cart(reference, product_id)
        final_amount = moltin.get_cart_total_sum(reference)
        cart_descriptions = moltin.get_cart(reference)
        reply_markup = get_keyboard(cart_descriptions)
        cart_details = get_cart_details(cart_descriptions)
        query.message.reply_text(
            f'{cart_details}\n\nСумма заказа: {final_amount["formatted"]}$',
            reply_markup=reply_markup)
        context.bot.delete_message(chat_id=query.message.chat_id,
                                   message_id=query.message.message_id)
        return "HANDLE_CART"
Пример #18
0
def handle_menu(update, context):
    query = update.callback_query
    reference = query.message.chat_id
    if query.data.split(' ')[1] == 'cart':
        final_amount = moltin.get_cart_total_sum(reference)
        cart_descriptions = moltin.get_cart(reference)
        reply_markup = get_keyboard(cart_descriptions)
        cart_details = get_cart_details(cart_descriptions)
        query.message.reply_text(
            f'{cart_details}\n\nСумма заказа: {final_amount["formatted"]}',
            reply_markup=reply_markup)
        context.bot.delete_message(chat_id=query.message.chat_id,
                                   message_id=query.message.message_id)
        return "HANDLE_CART"

    else:
        product_id = query.data.split(' ')[1]
        description = moltin.get_product_description(product_id)
        image_url = moltin.get_image_url(product_id)
        keyboard = [[
            InlineKeyboardButton('1 шт.',
                                 callback_data='button ' + product_id + ' 1'),
            InlineKeyboardButton('2 шт.',
                                 callback_data='button ' + product_id + ' 2'),
            InlineKeyboardButton('5 шт.',
                                 callback_data='button ' + product_id + ' 5')
        ], [InlineKeyboardButton('Назад', callback_data='back')
            ], [InlineKeyboardButton('Корзина', callback_data='button cart')]]
        reply_markup = InlineKeyboardMarkup(keyboard)
        context.bot.send_photo(
            chat_id=query.message.chat_id,
            caption=description,
            photo=image_url,
            reply_markup=reply_markup,
        )
        context.bot.delete_message(chat_id=query.message.chat_id,
                                   message_id=query.message.message_id)
        return 'HANDLE_DESCRIPTION'
Пример #19
0
def send_cart(bot, update):
    query = update.callback_query
    chat_id = query.message.chat_id
    cart = get_cart(chat_id)
    text = get_cart_items_text(cart)
    keyboard = [[InlineKeyboardButton('В меню', callback_data='menu')]]

    if text:
        keyboard.extend([[
            InlineKeyboardButton(f' Убрать {product["name"]}',
                                 callback_data=product['id'])
        ] for product in cart['products']])
        keyboard.append(
            [InlineKeyboardButton('Оформить заказ', callback_data='checkout')])

    else:
        text = 'Ваша корзина пуста'

    reply_markup = InlineKeyboardMarkup(keyboard)
    bot.edit_message_text(text=text,
                          chat_id=chat_id,
                          message_id=query.message.message_id,
                          reply_markup=reply_markup)
    return 'HANDLE_CART'
Пример #20
0
def update_cart(bot, update, access_token):
    query = update.callback_query

    button_menu = [InlineKeyboardButton("Меню", callback_data="Меню")]
    button_pay = [InlineKeyboardButton("Оплатить", callback_data="Оплатить")]

    cart_items = moltin.get_cart_items(access_token, query.message.chat_id)
    cart = moltin.get_cart(access_token, query.message.chat_id)
    total_price = cart['data']['meta']['display_price']['with_tax']['formatted']

    products_in_cart = []
    keyboard = []
    for product_in_cart in cart_items['data']:
        product_name = product_in_cart['name']
        description = product_in_cart['description']
        price = product_in_cart['meta']['display_price']['with_tax']['unit']['formatted']
        quantity = product_in_cart['quantity']
        all_price = product_in_cart['meta']['display_price']['with_tax']['value']['formatted']

        button = [InlineKeyboardButton(f'Убрать из корзины {product_name}', callback_data=product_in_cart['id'])]
        keyboard.append(button)
        products_in_cart.append(f'{product_name}\n'
                                f'{description}\n'
                                f'{price}per kg\n'
                                f'{quantity}kg in cart for {all_price}\n\n')

    keyboard.append(button_menu)
    keyboard.append(button_pay)
    reply_markup = InlineKeyboardMarkup(keyboard)
    cart_text = ''.join(products_in_cart)

    telegram_bot.del_old_message(bot, update)
    bot.send_message(chat_id=query.message.chat_id, text=f'{cart_text}\n'
                                                         f'*Всего на сумму:\n'
                                                         f'{total_price}*', reply_markup=reply_markup,
                                                         parse_mode=ParseMode.MARKDOWN)
Пример #21
0
def create_basket_menu(headers, params, recipient_id):
    total = moltin.get_total(recipient_id)
    user_cart = moltin.get_cart(recipient_id)

    menu_elements = [{
        'title':
        f'Ваш заказ на сумму: {total}',
        'image_url':
        BASKET_IMG_URL,
        'buttons': [
            {
                'type': 'postback',
                'title': 'Оформить заказ',
                'payload': 'order'
            },
            {
                'type': 'postback',
                'title': 'Назад в меню',
                'payload': 'back_to_menu',
            },
        ],
    }]
    for product in user_cart:
        product_id = product['product_id']
        pizza_data = json.loads(
            db.get(product_id)) or moltin.get_by_id(product)
        pizza_name = pizza_data['name']
        pizza_desc = pizza_data['description']
        pizza_price = pizza_data['meta']['display_price']['with_tax'][
            'formatted']
        image_id = pizza_data['relationships']['main_image']['data']['id']
        image_url = db.get(image_id) or moltin.get_picture(image_id)
        data = {
            'title':
            f'{pizza_name}, {pizza_price}',
            'subtitle':
            pizza_desc,
            'image_url':
            image_url,
            'buttons': [
                {
                    'type': 'postback',
                    'title': 'Добавить еще одну',
                    'payload': f'add {product_id}',
                },
                {
                    'type': 'postback',
                    'title': 'Удалить',
                    'payload': f'remove {product_id}',
                },
            ],
        }
        menu_elements.append(data)
    request_content = {
        'recipient': {
            'id': recipient_id
        },
        'message': {
            'attachment': {
                'type': 'template',
                'payload': {
                    'template_type': 'generic',
                    'image_aspect_ratio': 'square',
                    'elements': menu_elements,
                },
            }
        },
    }
    response = requests.post(url=FB_API,
                             params=params,
                             headers=headers,
                             json=request_content)
    response.raise_for_status()
Пример #22
0
def add_delivery_to_cart(cart_id, delivery_price):
    cart = get_cart(cart_id)
    if not is_delivery_in_cart(cart):
        add_cart_custom_item(cart_id, DELIVERY_ITEM_NAME, delivery_price)