Skip to content

Commit 824c95f

Browse files
committed
fix(exchanges): Исправлено создание сделки продажи на ночное время
1 parent b3446fa commit 824c95f

File tree

1 file changed

+21
-59
lines changed
  • tgbot/dialogs/events/common/exchanges/create

1 file changed

+21
-59
lines changed

tgbot/dialogs/events/common/exchanges/create/buy.py

Lines changed: 21 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""Обработчики для диалога создания покупки на бирже."""
22

33
import logging
4-
import re
54
from datetime import datetime
65

76
from aiogram.types import CallbackQuery, Message
@@ -10,6 +9,10 @@
109
from aiogram_dialog.widgets.kbd import Button, ManagedCalendar
1110
from stp_database import MainRequestsRepo
1211

12+
from tgbot.dialogs.events.common.exchanges.create.sell import (
13+
create_datetime_for_shift,
14+
validate_time_range,
15+
)
1316
from tgbot.dialogs.states.common.exchanges import ExchangeCreateBuy, Exchanges
1417
from tgbot.services.notifications.subscription_matcher import (
1518
notify_matching_subscriptions,
@@ -60,72 +63,33 @@ async def on_buy_hours_input(
6063
data: str,
6164
) -> None:
6265
"""Обработчик ввода времени для покупки."""
63-
# Проверяем формат времени (09:00-13:00)
64-
time_pattern = r"^(\d{1,2}):(\d{2})-(\d{1,2}):(\d{2})$"
65-
match = re.match(time_pattern, data.strip())
66-
67-
if not match:
68-
await message.answer(
69-
"<b>❌ Неверный формат времени</b>\n\nИспользуй формат: 09:00-13:00"
70-
)
71-
return
72-
73-
start_hour, start_min, end_hour, end_min = map(int, match.groups())
74-
75-
# Проверяем валидность времени
76-
if not (
77-
0 <= start_hour <= 23
78-
and 0 <= start_min <= 59
79-
and 0 <= end_hour <= 23
80-
and 0 <= end_min <= 59
81-
):
82-
await message.answer("<b>❌ Неверное время</b>\n\nЧасы: 0-23, минуты: 0-59")
83-
return
84-
85-
if (start_min not in (0, 30)) or (end_min not in (0, 30)):
86-
await message.answer(
87-
"<b>❌ Неверное время</b>\n\nВремя должно начинаться и заканчиваться либо на 00 минутах, либо на 30 минутах часа"
88-
)
89-
return
90-
91-
start_time = f"{start_hour:02d}:{start_min:02d}"
92-
end_time = f"{end_hour:02d}:{end_min:02d}"
93-
94-
# Проверяем, что время начала меньше времени окончания
95-
start_minutes = start_hour * 60 + start_min
96-
end_minutes = end_hour * 60 + end_min
97-
98-
if start_minutes >= end_minutes:
99-
await message.answer(
100-
"<b>❌ Неверное время</b>\n\nВремя начала должно быть раньше времени окончания"
101-
)
66+
# Используем ту же валидацию, что и в sell exchange
67+
is_valid, error_message = validate_time_range(data)
68+
if not is_valid:
69+
await message.answer(f"<b>❌ {error_message}</b>")
10270
return
10371

104-
if end_minutes - start_minutes < 30:
105-
await message.answer(
106-
"<b>❌ Неверное время</b>\n\nМинимальная продолжительность: 30 минут"
107-
)
108-
return
72+
# Извлекаем время начала и окончания
73+
start_time_str, end_time_str = data.split("-")
74+
start_time_str = start_time_str.strip()
75+
end_time_str = end_time_str.strip()
10976

11077
# Создаем timestamp для start_time и end_time
11178
buy_date = dialog_manager.dialog_data.get("buy_date")
11279

11380
if buy_date:
114-
# Если дата выбрана, создаем полные timestamp
81+
# Если дата выбрана, создаем полные timestamp с учетом ночных смен
11582
shift_date = datetime.fromisoformat(buy_date)
116-
start_datetime = datetime.combine(
117-
shift_date.date(), datetime.strptime(start_time, "%H:%M").time()
118-
)
119-
end_datetime = datetime.combine(
120-
shift_date.date(), datetime.strptime(end_time, "%H:%M").time()
83+
start_datetime, end_datetime = create_datetime_for_shift(
84+
shift_date, start_time_str, end_time_str
12185
)
12286

12387
dialog_manager.dialog_data["start_time"] = start_datetime.isoformat()
12488
dialog_manager.dialog_data["end_time"] = end_datetime.isoformat()
12589
else:
12690
# Если дата не выбрана, сохраняем только время
127-
dialog_manager.dialog_data["start_time"] = start_time
128-
dialog_manager.dialog_data["end_time"] = end_time
91+
dialog_manager.dialog_data["start_time"] = start_time_str
92+
dialog_manager.dialog_data["end_time"] = end_time_str
12993

13094
# Переходим к вводу цены
13195
await dialog_manager.switch_to(ExchangeCreateBuy.price)
@@ -224,15 +188,13 @@ async def on_confirm_buy(
224188
start_time = datetime.fromisoformat(data["start_time"])
225189
end_time = datetime.fromisoformat(data["end_time"])
226190
else:
227-
# Если дата не указана, создаем timestamp с условной датой
191+
# Если дата не указана, создаем timestamp с условной датой с учетом ночных смен
228192
today = datetime.now().date()
229193
start_time_str = data["start_time"]
230194
end_time_str = data["end_time"]
231-
start_time = datetime.combine(
232-
today, datetime.strptime(start_time_str, "%H:%M").time()
233-
)
234-
end_time = datetime.combine(
235-
today, datetime.strptime(end_time_str, "%H:%M").time()
195+
today_datetime = datetime.combine(today, datetime.min.time())
196+
start_time, end_time = create_datetime_for_shift(
197+
today_datetime, start_time_str, end_time_str
236198
)
237199
else:
238200
# Если время не указано, устанавливаем весь день (00:00 - 23:59)

0 commit comments

Comments
 (0)