Анкета участника: наименования из клиентской базы НРД, прямые кавычки
НРД ответил M2M37 на анкету 21.10: в FullName ушло краткое наименование из DEPO. Теперь полное, краткое и отображаемое берутся из карточки нашей фирмы в справочнике НРД (НРД сверяет именно с клиентской базой); отображаемое = краткое, как советует НРД. Английские — только введённые. Кавычки «» “” приводятся к прямым ", как в базе НРД. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -79,16 +79,18 @@ func participantFormPrefill(rc *RuntimeConfig) participantFormData {
|
|||||||
hb, ok = handbookByINN(d.INN)
|
hb, ok = handbookByINN(d.INN)
|
||||||
}
|
}
|
||||||
if ok {
|
if ok {
|
||||||
if d.FullName == "" {
|
// НРД сверяет наименования анкеты со своей клиентской базой (M2M37) — карточка в справочнике
|
||||||
d.FullName = strings.TrimSpace(pick(hb.FullName, hb.Name))
|
// НРД главнее DEPO: в DEPO «наименование» бывает кратким (21.10.2026 краткое ушло в FullName).
|
||||||
|
// Английские — только если их ввели: в справочнике есть лишь краткое, полного нет.
|
||||||
|
if n := strings.TrimSpace(hb.FullName); n != "" {
|
||||||
|
d.FullName = n
|
||||||
}
|
}
|
||||||
if d.ShortName == "" {
|
if n := strings.TrimSpace(hb.Name); n != "" && hb.FullName != "" {
|
||||||
d.ShortName = strings.TrimSpace(hb.Name)
|
d.ShortName, d.DisplayName = n, n // отображаемое НРД советует как краткое
|
||||||
}
|
}
|
||||||
if d.DisplayName == "" {
|
if strings.TrimSpace(hb.FullName) != "" {
|
||||||
d.DisplayName = strings.TrimSpace(pick(hb.DisplayName, hb.Name))
|
d.EngFull = ""
|
||||||
}
|
} else if d.EngFull == "" {
|
||||||
if d.EngFull == "" {
|
|
||||||
d.EngFull = strings.TrimSpace(hb.EngName)
|
d.EngFull = strings.TrimSpace(hb.EngName)
|
||||||
}
|
}
|
||||||
if hb.Kind == "broker" && d.BrokerCode == "" {
|
if hb.Kind == "broker" && d.BrokerCode == "" {
|
||||||
@@ -144,6 +146,16 @@ func participantFormValidate(d participantFormData) []string {
|
|||||||
return errs
|
return errs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pfQuotes — кавычки как в клиентской базе НРД: прямые ".
|
||||||
|
var pfQuotes = strings.NewReplacer("«", `"`, "»", `"`, "“", `"`, "”", `"`, "„", `"`)
|
||||||
|
|
||||||
|
// pfNames — наименования к виду базы НРД (кавычки, лишние пробелы).
|
||||||
|
func pfNames(d *participantFormData) {
|
||||||
|
for _, p := range []*string{&d.FullName, &d.ShortName, &d.DisplayName, &d.EngFull, &d.EngShort, &d.EngDisplay} {
|
||||||
|
*p = strings.Join(strings.Fields(pfQuotes.Replace(*p)), " ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// pfx — экранирование текста XML-элемента (только & < >); кавычки в тексте
|
// pfx — экранирование текста XML-элемента (только & < >); кавычки в тексте
|
||||||
// оставляем литеральными, как в образце анкеты НРД.
|
// оставляем литеральными, как в образце анкеты НРД.
|
||||||
var pfXMLEsc = strings.NewReplacer("&", "&", "<", "<", ">", ">")
|
var pfXMLEsc = strings.NewReplacer("&", "&", "<", "<", ">", ">")
|
||||||
@@ -153,6 +165,7 @@ func pfx(s string) string { return pfXMLEsc.Replace(strings.TrimSpace(s)) }
|
|||||||
// participantFormXML — анкета в виде XML-строки (UTF-8) по образцу НРД
|
// participantFormXML — анкета в виде XML-строки (UTF-8) по образцу НРД
|
||||||
// (M2MTransferParticipantForm.xsd). CreationTimestamp — по МСК.
|
// (M2MTransferParticipantForm.xsd). CreationTimestamp — по МСК.
|
||||||
func participantFormXML(d participantFormData) string {
|
func participantFormXML(d participantFormData) string {
|
||||||
|
pfNames(&d)
|
||||||
msk := time.FixedZone("МСК", 3*3600)
|
msk := time.FixedZone("МСК", 3*3600)
|
||||||
ts := time.Now().In(msk).Format("2006-01-02T15:04:05") + "(МСК)"
|
ts := time.Now().In(msk).Format("2006-01-02T15:04:05") + "(МСК)"
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
@@ -278,6 +291,7 @@ func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig, igwClient *i
|
|||||||
EngDisplay: r.FormValue("eng_display"), DepoCode: r.FormValue("depo"), BrokerCode: r.FormValue("broker"),
|
EngDisplay: r.FormValue("eng_display"), DepoCode: r.FormValue("depo"), BrokerCode: r.FormValue("broker"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pfNames(&d) // кавычки и пробелы — как в базе НРД, и в анкете, и в форме, и в статусе
|
||||||
errs := participantFormValidate(d)
|
errs := participantFormValidate(d)
|
||||||
|
|
||||||
if action == "download" {
|
if action == "download" {
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package lkgateway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Наименования в анкете — как в клиентской базе НРД: прямые кавычки, без лишних пробелов (M2M37).
|
||||||
|
func TestParticipantFormNames(t *testing.T) {
|
||||||
|
d := participantFormData{
|
||||||
|
INN: "7703807489", DepoCode: "MC0413600000",
|
||||||
|
FullName: "Общество с ограниченной ответственностью «Инвестиционная Компания “Фонтвьель»",
|
||||||
|
ShortName: "ООО «ИК «Фонтвьель»",
|
||||||
|
DisplayName: "ООО «ИК «Фонтвьель»",
|
||||||
|
}
|
||||||
|
x := participantFormXML(d)
|
||||||
|
for _, want := range []string{
|
||||||
|
`<m2m:FullName>Общество с ограниченной ответственностью "Инвестиционная Компания "Фонтвьель"</m2m:FullName>`,
|
||||||
|
`<m2m:ShortName>ООО "ИК "Фонтвьель"</m2m:ShortName>`,
|
||||||
|
`<m2m:DisplayName>ООО "ИК "Фонтвьель"</m2m:DisplayName>`,
|
||||||
|
} {
|
||||||
|
if !strings.Contains(x, want) {
|
||||||
|
t.Errorf("нет %s в\n%s", want, x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if strings.Contains(x, "<m2m:Eng>") {
|
||||||
|
t.Error("пустые английские наименования не должны попадать в анкету")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -121,7 +121,7 @@ func (r *RuntimeConfig) UpdateWorkHours(w WorkHoursSettings) error {
|
|||||||
return r.save()
|
return r.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
// saveWorkHours — POST /admin/setup/workhours (шаг «Время и сеть», Настройка → Сервер).
|
// saveWorkHours — POST /admin/setup/workhours (шаг «Время и сеть», Настройка → НРД).
|
||||||
func (h *setupHandlers) saveWorkHours(w http.ResponseWriter, r *http.Request) {
|
func (h *setupHandlers) saveWorkHours(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.Method != http.MethodPost {
|
if r.Method != http.MethodPost {
|
||||||
http.Error(w, "method", http.StatusMethodNotAllowed)
|
http.Error(w, "method", http.StatusMethodNotAllowed)
|
||||||
|
|||||||
Reference in New Issue
Block a user