Ручной ввод: без обязательных галок, удаление черновика, запрет количества больше остатка; отказ НРД по поручению — красным
- ручных отметок перед отправкой нет: автор виден по учётной записи, клиент/счёт/остаток/
бумага проверены сверкой с DEPO при сохранении; блокировка в QUIK — необязательно,
по умолчанию не требуется (модуль неторговых поручений сейчас не используется)
- «Удалить черновик» в карточке (POST /admin/manual/{id}/delete), только для черновиков
- количество не больше остатка на торговом разделе: проверка в форме (по выбранной бумаге)
и на сервере при сохранении (по счёту DEPO) — поручение с превышением не сохраняется
- отчёт MS010 с отказом: orderResponse.Rejected, OutgoingDeal.Rejected; шаг «Операция
завершена отказом» и бейдж — красные в карточках исходящего и входящего; онлайн-статус
«поручение 16 завершено отказом НРД»
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -25,19 +25,16 @@ func TestManualSendBlockers(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
o := manualTestOrder()
|
||||
b := manualSendBlockers(rc, o)
|
||||
if len(b) != len(manualPreChecks)+1 { // все отметки + способ блокировки в QUIK
|
||||
t.Fatalf("без отметок: %v", b)
|
||||
}
|
||||
o.Checks = map[string]ManualMark{}
|
||||
for _, c := range manualPreChecks {
|
||||
o.Checks[c.Key] = ManualMark{Done: true}
|
||||
// Ручных отметок нет, блокировка в QUIK по умолчанию не требуется: черновик готов сразу.
|
||||
if b := manualSendBlockers(rc, o); len(b) != 0 {
|
||||
t.Fatalf("готовый черновик: %v", b)
|
||||
}
|
||||
o.QuikMode = "manual"
|
||||
if b = manualSendBlockers(rc, o); len(b) != 1 || !strings.Contains(b[0], "номер поручения") {
|
||||
if b := manualSendBlockers(rc, o); len(b) != 1 || !strings.Contains(b[0], "номер поручения") {
|
||||
t.Fatalf("ручная блокировка без номера: %v", b)
|
||||
}
|
||||
o.QuikInstr = "123"
|
||||
var b []string
|
||||
if b = manualSendBlockers(rc, o); len(b) != 0 {
|
||||
t.Fatalf("всё заполнено: %v", b)
|
||||
}
|
||||
@@ -113,19 +110,16 @@ func TestManualPages(t *testing.T) {
|
||||
if o.DocSeries != "0000" || o.Account != "СЧЁТ-1" || len(o.Securities) != 1 || o.Securities[0].ISIN != "RU0009029540" {
|
||||
t.Fatalf("данные: %+v", o)
|
||||
}
|
||||
if rec = do("GET", "/admin/manual/1", nil); rec.Code != 200 || !strings.Contains(rec.Body.String(), "Отправить пока нельзя") {
|
||||
if rec = do("GET", "/admin/manual/1", nil); rec.Code != 200 || !strings.Contains(rec.Body.String(), "Сверка пройдена, поручение готово") {
|
||||
t.Fatalf("карточка: %d %s", rec.Code, rec.Body.String())
|
||||
}
|
||||
chk := url.Values{"quik_mode": {"none"}}
|
||||
for _, c := range manualPreChecks {
|
||||
chk.Set("check_"+c.Key, "1")
|
||||
}
|
||||
chk := url.Values{"quik_mode": {"manual"}, "quik_instr": {"77"}}
|
||||
do("POST", "/admin/manual/1/checks", chk)
|
||||
o, _ = globalManual.Get(1)
|
||||
if len(manualSendBlockers(rc, o)) != 0 || o.Checks["paper"].At.IsZero() {
|
||||
t.Fatalf("отметки: %+v %v", o.Checks, manualSendBlockers(rc, o))
|
||||
if len(manualSendBlockers(rc, o)) != 0 || o.QuikMode != "manual" {
|
||||
t.Fatalf("блокировка вручную: %+v %v", o.QuikMode, manualSendBlockers(rc, o))
|
||||
}
|
||||
if rec = do("GET", "/admin/manual/1", nil); !strings.Contains(rec.Body.String(), "Все проверки и отметки пройдены") {
|
||||
if rec = do("GET", "/admin/manual/1", nil); !strings.Contains(rec.Body.String(), "Сверка пройдена, поручение готово") {
|
||||
t.Fatalf("готово к отправке: %s", rec.Body.String())
|
||||
}
|
||||
// Изменение данных сбрасывает отметки.
|
||||
@@ -135,6 +129,15 @@ func TestManualPages(t *testing.T) {
|
||||
if o, _ = globalManual.Get(1); len(o.Checks) != 0 {
|
||||
t.Fatalf("отметки должны сброситься: %+v", o.Checks)
|
||||
}
|
||||
// Черновик можно удалить; отклонённое — нет.
|
||||
do("POST", "/admin/manual/save", url.Values{"paper_date": {"2026-09-17"}, "last_name": {"Пётр"}, "first_name": {"П"}, "birth_date": {"1980-01-02"},
|
||||
"doc_type": {"21"}, "doc_series": {"0000"}, "doc_number": {"000001"}, "account": {"счёт-2"}, "recv_inn": {"7702165310"}, "sec_isin": {"ru0009029540"}, "sec_qty": {"1"}, "do": {"save"}})
|
||||
if rec = do("POST", "/admin/manual/2/delete", nil); rec.Code != http.StatusSeeOther || !strings.Contains(rec.Header().Get("Location"), "/admin/manual?") {
|
||||
t.Fatalf("удаление черновика: %d %s", rec.Code, rec.Header().Get("Location"))
|
||||
}
|
||||
if _, ok := globalManual.Get(2); ok {
|
||||
t.Fatal("черновик не удалён")
|
||||
}
|
||||
do("POST", "/admin/manual/1/decline", url.Values{"reason": {"нет подписи клиента"}})
|
||||
o, _ = globalManual.Get(1)
|
||||
if o.Status != "declined" || o.DeclinedAt.Before(time.Now().Add(-time.Minute)) {
|
||||
|
||||
Reference in New Issue
Block a user