async def task_sign(call: CallbackQuery): # await call.answer(cache_time = 60) # print("task_sign id = {}".format(call.from_user.id)) user_id = call.from_user.id enquiry = Enquiry(user_id) entities = enquiry.get_entities_for_paying("УПД подписан", "Нет") bonus = 0 count_entities = 0 for entity in entities: bonus += int(entity["f81291"]) count_entities += 1 # print("entities = {}".format(entities)) # print("bonus = {}".format(bonus)) summary_message = "Исполнитель <b>{}</b> запросил выплату в размере <b>{}</b> рублей по следующим заявкам, в количестве <b>{}</b> шт.".format( entities[0]["f79831"], bonus, count_entities) for manager in MANAGERS: await bot.send_message(manager, summary_message) for entity in entities: # print(format_enquiry_for_paying(entity)) await bot.send_message(manager, format_enquiry_for_paying(entity)) await call.answer( "Запрос на выплату в размере {} рублей по заявкам, в количестве {} шт. - отправлен" .format(bonus, count_entities), show_alert=True) #, cache_time = 120
async def statistics(message: Message, last_month = False): # print(f"statistics_current_month -> {message.from_user.id}") # print(f"statistics_current_month -> last_month = {last_month}") # await message.delete() enquiry = Enquiry(message.from_user.id) # first_date, end_date = create_date(last_month = last_month) count_setup_status = len(get_records(enquiry.get_entities_for_statistics(STATUS_SETUP), last_month = last_month)) # print('Заявок со статусом "Установлено" {} шт.'.format(count_setup_status)) entities = get_records(enquiry.get_entities_for_statistics(STATUS_UPD_SIGNED), last_month = last_month) amount = 0 count = 0 for entity in entities: amount += int(entity["f81291"]) count += 1 # print('Заявок со статусом "УПД подписано" {} шт., на общую сумму {} руб.'.format(count, amount)) entities = get_records(enquiry.get_entities_for_payed(), last_month = last_month) payed_amount = 0 payed_count = 0 for entity in entities: payed_amount += int(entity["f81291"]) payed_count += 1 strings = ['{} Заявок со статусом "Установлено" - <b>{}</b> шт.'.format(emojize(":one:"), count_setup_status), '{} Заявок со статусом "УПД подписано" - <b>{}</b> шт., на общую сумму - <b>{}</b> руб.'.format(emojize(":two:"), count, amount), '{} Оплачено всего <b>{}</b> заявок на сумму <b>{}</b> руб.'.format(emojize(":three:"), payed_count, payed_amount) ] # if last_month: # strings.insert(0, "<b>Предыдущий месяц</b>") # else: # strings.insert(0, "<b>Текущий месяц</b>") await message.answer("\n".join(strings), reply_markup = statistics_menu)
async def task_done_photo(message: types.Message, state: FSMContext): data_state = await state.get_data() id_task = data_state.get("id_task") date_day = (lambda x: "0" + x if len(x) == 1 else x)(str(datetime.date.today().day)) date_month = (lambda x: "0" + x if len(x) == 1 else x)(str(datetime.date.today().month)) date_year = str(datetime.date.today().year) file_id = None content_type = message.content_type if content_type == "photo": file_id = message.photo[-1].file_id if content_type == "document": if message.document.mime_type.__contains__('image'): file_id = message.document.file_id if file_id is None: # await message.answer("Загруженный файл не фотография.\nПовторите попытку!") await message.answer( "Заявка № <b>{}</b>\nФайл с фотографией УПД не загружен и не сохранён." .format(id_task)) file_path = "" else: await message.answer("Минутку, произвожу запись в БД...") dest_file = "photo_upd_{}{}{}_{}.jpg".format(date_year, date_month, date_day, id_task) source_file = await bot.get_file(file_id) # print(f"file_link = {dest_file}") file_path, is_saved = CloudStorage.save_file(source_file["file_path"], dest_file) await message.delete() if is_saved: await message.answer( "Заявка № <b>{}</b>\n{} Файл успешно сохранён и доступен по ссылке - {}" .format(id_task, emojize(":white_check_mark:"), file_path), disable_web_page_preview=True) else: await message.answer( "Заявка № <b>{}</b>\n{} Файл не удалось сохранить.".format( id_task, emojize(":bangbang:"))) enquiry = Enquiry(message.from_user.id) is_done = enquiry.update_table(id=id_task, f78321="УПД подписан", f81301=file_path) if is_done: await message.answer( "{} Запись в БД успешно обновлена! Заявка № <b>{}</b>, установлена в статус - <b>УПД подписан</b>" .format(emojize(":white_check_mark:"), str(id_task)), reply_markup=choice_request()) else: await message.answer( "Заявка № <b>{}</b>{} Запись в БД завершилось ошибкой!".format( id_task, emojize(":bangbang:"))) await state.finish()
async def task_to_plan_put_date(current_date, message, state): data_state = await state.get_data() id_task = data_state.get("id_task") date_full = str(current_date).split(".") await message.delete() if len(date_full) == 3: if date_full[0].isdigit() and date_full[1].isdigit( ) and date_full[2].isdigit() and len(date_full[0]) == 2 and len( date_full[1]) == 2 and len(date_full[2]) == 4: # print("date_full[1] = {}".format(len(date_full[1]))) date_day = date_full[0] date_month = date_full[1] date_year = date_full[2] full_date = "{}-{}-{} 00:00:00".format(date_year, date_month, date_day) short_date = "{}.{}.{}".format(date_day, date_month, date_year) # await state.update_data(date_day = date_day, date_month = date_month, date_year = date_year) await state.finish() enquiry = Enquiry(message.from_user.id) # enquiry = Enquiry('1771817746') # full_date = "2021-02-02 00:00:00" is_done = enquiry.update_table(id=id_task, f78311=full_date, f78321="Запланирован выезд") # is_done = True if is_done: await message.answer( "{} Заявка № <b>{}</b>, успешно запланирована на дату {}". format(emojize(":white_check_mark:"), str(id_task), short_date), reply_markup=inline_type_request_menu()) else: await message.answer( "Заявка № <b>{}</b>\n{} Запись в БД завершилось ошибкой!". format(id_task, emojize(":bangbang:"))) else: await message.answer( "Заявка № <b>{}</b>\n{} Вы ввели неверную дату, дата должна содержать только цифры.\n" "Введите плановую дату исполнения в формате дд.мм.гггг:". format(id_task, emojize(":exclamation:"))) else: await message.answer( "Заявка № <b>{}</b>\n{} Вы ввели неверную дату, " "пожалуйста, введите плановую дату исполнения в формате дд.мм.гггг:" .format(id_task, emojize(":exclamation:")))
async def callback_paginator_for_paying(call: CallbackQuery, state: FSMContext): # print(f'callback_paginator for paying -> {str(call.from_user.id)}') await state.reset_state(with_data=False) call_data = call.data state_name = "" # print(f"call_data = {call_data}") if call_data == 'signed': page = 1 state_name = get_state_name(str(call_data)) enquiries = Enquiry(call.from_user.id) # fetching data from DB entities = enquiries.get_entities_for_paying(state_name, "Нет") await state.update_data(request_data=entities, state_name=state_name, call_data=call_data) data_state = await state.get_data() request_data = data_state.get("request_data") # print(f"request_data = {request_data}") else: data_state = await state.get_data() request_data = data_state.get("request_data") # print(f"request_data = {request_data}") page = int(call.data.split('&')[1]) # print(f'page={str(page)}') paginator = InlineKeyboardPaginator( 0 if request_data is None else len(request_data), current_page=int(page), data_pattern='page&{page}') if len(request_data) if request_data is not None else 0 > 0: if data_state.get("call_data") == 'signed': paginator.add_after( InlineKeyboardButton( text="{} Запросить выплату для всех выполненных заявок". format(emojize(":bell:")), callback_data="task_sign&{}".format(request_data[ page - 1]["id"] if len(request_data) > 0 else []))) paginator.add_after( InlineKeyboardButton("{} Назад".format( emojize(":leftwards_arrow_with_hook:")), callback_data="choice_buttons")) await call.message.edit_text(format_enquiry_for_paying( request_data[page - 1] if len(request_data) > 0 else []), reply_markup=paginator.markup)
async def task_edit_distance_done(message: Message, state: FSMContext): distance_done = message.text if distance_done.isdigit(): # await state.update_data(distance = distance_done) data_state = await state.get_data() id_task = data_state.get("id_task") enquiry = Enquiry() is_done = enquiry.update_table(id = id_task, f78361 = int(distance_done)) if is_done: await message.answer("Заявка № <b>{}</b>\n{} Пробег по заявке № <b>{}</b> успешно отредактирован".format(id_task, emojize(":white_check_mark:"), str(id_task)), reply_markup = inline_back_to_setup()) else: await message.answer("Заявка № <b>{}</b>\n{} Запись в БД завершилось ошибкой!".format(id_task, emojize(":hangbang:"))) await state.finish() else: await message.answer("{} Растояние пробега должно быть числом.\nВведите растояние пробега в км (ноль, если заявка в черте города):".format(emojize(":exclamation:")), reply_markup = inline_back_to_setup())
async def task_act_photo(message: Message, state: FSMContext): data_state = await state.get_data() id_task = data_state.get("id_task") content_type = message.content_type file_id = None await message.delete() if content_type == "photo": file_id = message.photo[-1].file_id if content_type == "document": if message.document.mime_type.__contains__('image'): file_id = message.document.file_id if file_id is None: await message.answer("Заявка № <b>{}</b>\n{} Загруженный файл не фотография.\nПовторите попытку!".format(id_task, emojize(":exclamation:")), reply_markup = inline_back_to_setup()) # await message.answer("Файл с фотографией акта не загружен и не сохранён.") file_path = "" else: # await message.answer("Минутку, произвожу запись в БД...") source_file = await bot.get_file(file_id) # print(f"file_link = {file_link}") file_path, is_saved = CloudStorage.save_file(source_file["file_path"], create_filename("photo_act", id_task)) if is_saved: # await message.answer("{} Файл успешно сохранён и доступен по ссылке - {}".format(emojize(":white_check_mark:"), file_path), disable_web_page_preview = True) enquiry = Enquiry() is_done = enquiry.update_table(id = id_task, f81381 = file_path) if is_done: await message.answer("{} Акт выполненных работ по заявке № <b>{}</b>, успешно загружен.". format(emojize(":white_check_mark:"), str(id_task)), reply_markup = inline_back_to_setup()) else: await message.answer("Заявка № <b>{}</b>\n{} Запись в БД завершилось ошибкой!".format(id_task, emojize(":bangbang:")), reply_markup = inline_back_to_setup()) else: await message.answer("Заявка № <b>{}</b>\n{} Файл не удалось сохранить.".format(id_task, emojize(":bangbang:")), reply_markup = inline_back_to_setup()) await state.finish() await message.delete()
async def task_done_photo(message: types.Message, state: FSMContext): data_state = await state.get_data() id_task = data_state.get("id_task") distance = data_state.get("distance") date_day = data_state.get("date_day") date_month = data_state.get("date_month") date_year = data_state.get("date_year") full_date = "{}-{}-{} 00:00:00".format(date_year, date_month, date_day) file_id = None content_type = message.content_type if content_type == "photo": file_id = message.photo[-1].file_id if content_type == "document": if message.document.mime_type.__contains__('image'): file_id = message.document.file_id if file_id is None: # await message.answer("Загруженный файл не фотография.\nПовторите попытку!") await message.answer( "Заявка № <b>{}</b>\nФайл с фотографией акта не загружен и не сохранён." .format(id_task)) file_path = "" else: await message.answer("Минутку, произвожу запись в БД...") dest_file = "photo_act_{}{}{}_{}.jpg".format(date_year, date_month, date_day, id_task) source_file = await bot.get_file(file_id) # print(f"file_link = {file_link}") file_path, is_saved = CloudStorage.save_file(source_file["file_path"], dest_file) await message.delete() if is_saved: await message.answer( "Заявка № <b>{}</b>\n{} Файл успешно сохранён и доступен по ссылке - {}" .format(id_task, emojize(":white_check_mark:"), file_path), disable_web_page_preview=True) else: await message.answer( "Заявка № <b>{}</b>\n{} Файл не удалось сохранить.".format( id_task, emojize(":hangbang:"))) enquiry = Enquiry(message.from_user.id) # full_date = "2021-02-02 00:00:00" # distance = 1 is_done = enquiry.update_act(id=id_task, f78361=int(distance), f78311=full_date, f78321="Установлено", f81381=file_path) if is_done: await message.answer( "{} Запись в БД успешно обновлена! Заявка № <b>{}</b>, установлена в статус - <b>Установлено</b>" .format(emojize(":white_check_mark:"), str(id_task)), reply_markup=choice_request()) else: await message.answer( "Заявка № <b>{}</b>\n{} Запись в БД завершилось ошибкой!".format( id_task, emojize(":hangbang:"))) await state.finish()
async def callback_paginator(call: CallbackQuery, state: FSMContext): # print(f'callback_paginator -> {str(call.from_user.id)}') await state.reset_state(with_data=False) call_data = call.data state_name = "" # print(f"call_data = {call_data}") if call_data == 'assigned_to' or call_data == 'setup': page = 1 state_name = get_state_name(str(call_data)) enquiries = Enquiry(call.from_user.id) # enquiries = Enquiry('1771817746') # fetching data from DB entities = enquiries.get_entities(state_name) if call_data == "assigned_to": second_entities = enquiries.get_entities( get_state_name("trip_planned")) entities += second_entities await state.update_data(request_data=entities, state_name=state_name, call_data=call_data) data_state = await state.get_data() request_data = data_state.get("request_data") # print(f"request_data = {request_data}") else: data_state = await state.get_data() request_data = data_state.get("request_data") # print(f"request_data = {request_data}") page = int(call.data.split('#')[1]) # print(f'page={str(page)}') paginator = InlineKeyboardPaginator( 0 if request_data is None else len(request_data), current_page=int(page), data_pattern='page#{page}') if len(request_data) if request_data is not None else 0 > 0: if data_state.get("call_data") == 'assigned_to': # print("task_assign_to#{}".format(request_data[0]["id"])) paginator.add_after( InlineKeyboardButton( text="{} Запланировать".format(emojize(":clipboard:")), callback_data="task_to_plan#{}".format(request_data[ page - 1]["id"] if len(request_data) > 0 else []))) paginator.add_after( InlineKeyboardButton( text="{} Закрыть заявку".format(emojize(":closed_book:")), callback_data="task_close_inquire#{}".format(request_data[ page - 1]["id"] if len(request_data) > 0 else []))) if data_state.get("call_data") == 'setup': # print("task_setup#{}".format(request_data[0]["id"])) paginator.add_after( InlineKeyboardButton( text="{} Редактировать пробег".format(emojize(":car:")), callback_data="task_edit_distance#{}".format(request_data[ page - 1]["id"] if len(request_data) > 0 else []))) paginator.add_after( InlineKeyboardButton( text="{} Загрузить акт".format( emojize(":page_facing_up:")), callback_data="task_edit_act#{}".format(request_data[ page - 1]["id"] if len(request_data) > 0 else []))) paginator.add_after( InlineKeyboardButton( text="{} Загрузить УПД".format(emojize(":inbox_tray:")), callback_data="task_edit_upd#{}".format(request_data[ page - 1]["id"] if len(request_data) > 0 else []))) paginator.add_after( InlineKeyboardButton(text="{} Назад".format( emojize(":leftwards_arrow_with_hook:")), callback_data="choice_buttons")) await call.message.edit_text( format_enquiry(request_data[page - 1] if len(request_data) > 0 else []), reply_markup=paginator.markup)