2701-есть флоу для оператора и красивый список накладных

This commit is contained in:
2026-01-27 06:31:38 +03:00
parent 8332b6ecda
commit 38a5143902
11 changed files with 1508 additions and 158 deletions

View File

@@ -1,6 +1,10 @@
package telegram
import "sync"
import (
"sync"
"github.com/google/uuid"
)
// Состояния пользователя
type State int
@@ -13,16 +17,32 @@ const (
StateAddServerConfirmName
StateAddServerInputName
StateBillingGiftURL
// Состояния редактора черновиков (начиная с 100)
StateDraftEditItemName State = 100 // Ожидание ввода нового названия позиции
StateDraftEditItemQty State = 101 // Ожидание ввода количества
StateDraftEditItemPrice State = 102 // Ожидание ввода цены
)
// UserContext хранит временные данные в процессе диалога
type UserContext struct {
State State
TempURL string
TempLogin string
TempPassword string
TempServerName string
State State
// Поля для добавления сервера
TempURL string
TempLogin string
TempPassword string
TempServerName string
// Поля для биллинга
BillingTargetURL string
// Поля редактора черновиков
EditingDraftID uuid.UUID // ID редактируемого черновика
EditingItemID uuid.UUID // ID редактируемой позиции (DraftInvoiceItem)
EditingItemIndex int // Порядковый номер позиции (1-based, для отображения пользователю)
DraftMenuMsgID int // ID сообщения со списком позиций (для обновления через EditMessage)
DraftCurrentPage int // Текущая страница пагинации (0-based)
}
// StateManager управляет состояниями
@@ -80,3 +100,36 @@ func (sm *StateManager) Reset(userID int64) {
defer sm.mu.Unlock()
delete(sm.states, userID)
}
// ResetDraftEditor сбрасывает только поля редактора черновика
func (sm *StateManager) ResetDraftEditor(userID int64) {
sm.mu.Lock()
defer sm.mu.Unlock()
if ctx, ok := sm.states[userID]; ok {
ctx.State = StateNone
ctx.EditingDraftID = uuid.Nil
ctx.EditingItemID = uuid.Nil
ctx.EditingItemIndex = 0
ctx.DraftMenuMsgID = 0
ctx.DraftCurrentPage = 0
}
}
// InitDraftEditor инициализирует FSM для редактора черновика
func (sm *StateManager) InitDraftEditor(userID int64, draftID uuid.UUID) {
sm.mu.Lock()
defer sm.mu.Unlock()
if _, ok := sm.states[userID]; !ok {
sm.states[userID] = &UserContext{}
}
ctx := sm.states[userID]
ctx.State = StateNone
ctx.EditingDraftID = draftID
ctx.EditingItemID = uuid.Nil
ctx.EditingItemIndex = 0
ctx.DraftMenuMsgID = 0
ctx.DraftCurrentPage = 0
}