DEPO: тестовый прогон исходящего (копия сделки на реального клиента, имитация решения контрагента, формы 16 и MS010) + список сделок для прогона

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
zuevav
2026-09-22 21:33:14 +03:00
parent fc9f00a229
commit 79d0d6b76c
2 changed files with 117 additions and 0 deletions
+46
View File
@@ -29,6 +29,7 @@ import (
"sync"
"time"
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/m2mcore"
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/nsdadapter/igw"
)
@@ -350,6 +351,51 @@ func registerOutgoing(mux *http.ServeMux, a *admin, deps outgoingDeps) {
mux.HandleFunc("/admin/outgoing/", func(w http.ResponseWriter, r *http.Request) {
p := strings.TrimPrefix(r.URL.Path, "/admin/outgoing/")
switch {
case strings.HasSuffix(p, "/depo-sim"):
// тестовый прогон исходящего в DEPO с реальным клиентом (без отправки в НРД)
if r.Method != http.MethodPost {
http.Error(w, "method", http.StatusMethodNotAllowed)
return
}
guid := strings.TrimSuffix(p, "/depo-sim")
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Minute)
defer cancel()
newGUID, err := depoSimulateOutgoing(ctx, globalRC, deps.svc, guid, r.FormValue("ser"), r.FormValue("num"))
back := r.Referer()
if back == "" {
back = "/admin/claims"
}
if err != nil {
http.Redirect(w, r, back+"?flash="+urlQ("Прогон в DEPO: "+err.Error()), http.StatusSeeOther)
return
}
http.Redirect(w, r, back+"?flash="+urlQ("Прогон в DEPO записан: новый GUID "+newGUID+", клиент по паспорту "+r.FormValue("ser")+" "+r.FormValue("num")), http.StatusSeeOther)
case p == "depo-sim-list":
// список исходящих сделок для прогона: GUID, контрагент, клиент, решение
deals, _ := deps.svc.Repo().List(r.Context(), m2mcore.Filter{Limit: 500})
type row struct{ GUID, CP, Name, Created, Decision string }
var rows []row
for _, d := range deals {
if d == nil || d.Request == nil {
continue
}
inv := d.Request.Data.InvestorInformation
dec := "нет решения"
if d.Decision != nil {
var parts []string
for _, sec := range d.Decision.Data.Securities {
if sec.TransferDecision.Rejection != nil {
parts = append(parts, string(sec.ReferenceID)+":reject "+strings.Join(sec.TransferDecision.Rejection.Codes, ","))
} else {
parts = append(parts, string(sec.ReferenceID)+":confirm")
}
}
dec = strings.Join(parts, "; ")
}
rows = append(rows, row{string(d.GUID), handbookCodeByINN(string(d.Request.Data.ReceivingDepository.INN)), strings.TrimSpace(inv.LastName + " " + inv.FirstName), d.CreatedAt.Format("2006-01-02 15:04"), dec})
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
_ = json.NewEncoder(w).Encode(rows)
case strings.HasSuffix(p, "/submit-order"):
submitOutgoingOrder(w, r, deps, strings.TrimSuffix(p, "/submit-order"))
case strings.HasSuffix(p, "/order.xml"):