211 строки
7.5 KiB
Python
211 строки
7.5 KiB
Python
import api
|
|
import database
|
|
from fsm import FSM
|
|
from models import iso_datetime, Message, FSMContext, InputFile
|
|
import keyboards
|
|
import re
|
|
|
|
|
|
async def start(message: Message, state: FSMContext):
|
|
await state.reset_state()
|
|
await state.reset_data()
|
|
await message.answer(
|
|
text='Здравствуйте, %s!\nЧем могу помочь?' % message.from_user.first_name,
|
|
reply_markup=keyboards.start(),
|
|
)
|
|
await FSM.start.set()
|
|
|
|
|
|
async def select_category(message: Message, state: FSMContext):
|
|
await message.answer(
|
|
text='Выберете категорию.',
|
|
reply_markup=await keyboards.categories(),
|
|
)
|
|
await FSM.select_category.set()
|
|
|
|
|
|
async def select_subcategory(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='<b>%(name)s</b>\n\n%(description)s\n\nВыберете подкатегорию.' % dict(data['category']),
|
|
parse_mode='HTML',
|
|
reply_markup=await keyboards.subcategories(data['category']),
|
|
)
|
|
await FSM.select_subcategory.set()
|
|
|
|
|
|
async def select_date(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer_photo(
|
|
photo=InputFile('./static/images/%d.%d.png' % (
|
|
data['subcategory'].category.id,
|
|
data['subcategory'].id
|
|
)),
|
|
caption='<b>%(name)s</b>\n\n%(description)s\n\nВыберете дату.' % dict(data['subcategory']),
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.dates(data['free_to_order']),
|
|
)
|
|
await FSM.select_date.set()
|
|
|
|
|
|
async def select_time_range(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='Выберете время.',
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.time_ranges(data['free_to_order'], data['date']),
|
|
)
|
|
await FSM.select_time_range.set()
|
|
|
|
|
|
async def input_email_address(message: Message, state: FSMContext):
|
|
await message.answer(
|
|
text='Введите адрес электронной почты для связи.',
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.back(),
|
|
)
|
|
await FSM.input_email_address.set()
|
|
|
|
|
|
async def input_phone_number(message: Message, state: FSMContext):
|
|
await message.answer(
|
|
text='Введите номер телефона для связи.',
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.back(),
|
|
)
|
|
await FSM.input_phone_number.set()
|
|
|
|
|
|
async def input_comment(message: Message, state: FSMContext):
|
|
await message.answer(
|
|
text='Опишите вашу проблему.',
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.back(),
|
|
)
|
|
await FSM.input_comment.set()
|
|
|
|
|
|
async def confirm_order(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='<b>Категория:</b> %s - %s.\n<b>Дата:</b> %s.\n<b>Время:</b> %s.\n<b>Адрес электронной почты:</b> %s.\n<b>Номер телефона:</b> %s.\n<b>Описание проблемы:</b>\n%s' % (
|
|
data['category'].name,
|
|
data['subcategory'].name,
|
|
data['date'].strftime('%d.%m.%Y'),
|
|
'%s - %s' % (
|
|
data['time_range'].start_time.strftime('%H:%M'),
|
|
data['time_range'].end_time.strftime('%H:%M'),
|
|
),
|
|
data['email_address'],
|
|
data['phone_number'],
|
|
data['comment'],
|
|
),
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.order_confirmation(),
|
|
)
|
|
await FSM.confirm_order.set()
|
|
|
|
|
|
async def success_sign_up(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='<b>Обращение %s успешно оформлено!</b>\nВ указанное время с вами свяжется наш специалист.\nСпасибо за обращение!' % data['issue_key'],
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.main_menu(),
|
|
)
|
|
await FSM.success_sign_up.set()
|
|
|
|
|
|
async def select_order(message: Message, state: FSMContext):
|
|
issues = await database.read_issues(message.from_user.id)
|
|
if len(issues) > 0:
|
|
await message.answer(
|
|
text='Выберете обращение.',
|
|
reply_markup=keyboards.issues(issues),
|
|
)
|
|
return await FSM.select_order.set()
|
|
await message.answer(
|
|
text='У вас нет активных обращений.',
|
|
reply_markup=keyboards.main_menu(),
|
|
)
|
|
await FSM.no_orders.set()
|
|
|
|
|
|
async def select_operation(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
issue = await api.read_issue(data['issue'].id)
|
|
datetime_start = re.match(iso_datetime, issue.fields.customfield_10035)
|
|
datetime_end = re.match(iso_datetime, issue.fields.customfield_10036)
|
|
await message.answer(
|
|
text='<b>Категория:</b> %s.\n<b>Дата:</b> %s.\n<b>Время:</b> %s.\n<b>Адрес электронной почты:</b> %s.\n<b>Номер телефона:</b> %s.\n<b>Описание проблемы:</b>\n%s' % (
|
|
issue.fields.customfield_10033,
|
|
'%s.%s.%s' % (
|
|
datetime_start[3],
|
|
datetime_start[2],
|
|
datetime_start[1],
|
|
),
|
|
'%s:%s - %s:%s' % (
|
|
datetime_start[4],
|
|
datetime_start[5],
|
|
datetime_end[4],
|
|
datetime_end[5],
|
|
),
|
|
issue.fields.customfield_10037,
|
|
issue.fields.customfield_10038,
|
|
issue.fields.customfield_10039,
|
|
),
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.operations(),
|
|
)
|
|
await FSM.select_operation.set()
|
|
|
|
|
|
async def reschedule_order_select_date(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='Выберете дату.',
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.dates(data['free_to_order']),
|
|
)
|
|
await FSM.reschedule_order_select_date.set()
|
|
|
|
|
|
async def reschedule_order_select_time_range(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='Выберете время.',
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.time_ranges(data['free_to_order'], data['date']),
|
|
)
|
|
await FSM.reschedule_order_select_time_range.set()
|
|
|
|
|
|
async def success_reschedule_order(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='<b>Обращение %s успешно изменено!</b>\nВ указанное время с вами свяжется наш специалист.\nСпасибо за обращение!' % data['order'].id,
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.my_orders(),
|
|
)
|
|
await FSM.success_reschedule_order.set()
|
|
|
|
|
|
async def cancel_order(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='Отменить обращение %s?' % data['issue'].key,
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.cancel_order(),
|
|
)
|
|
await FSM.cancel_order.set()
|
|
|
|
|
|
async def success_cancel_order(message: Message, state: FSMContext):
|
|
data = await state.get_data()
|
|
await message.answer(
|
|
text='Обращение %s успешно отменено!' % data['issue'].key,
|
|
parse_mode='HTML',
|
|
reply_markup=keyboards.my_orders(),
|
|
)
|
|
await FSM.success_cancel_order.set()
|