Своя организация в настройках (справочник НРД или вручную) вместо зашитого ИНН; ручной ввод: поиск клиента и бумаг в DEPO, одна бумага на поручение
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
package lkgateway
|
||||
|
||||
// org.go — наша организация (депозитарий) в M2M: код участника, ИНН, наименование.
|
||||
// Задаётся при настройке: выбором себя из справочника участников НРД или вручную. От неё зависят
|
||||
// ИНН передающего/зачисляющего депозитария в пакетах, код отправителя (канал ИШ) и код фирмы в QUIK.
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var regexpMCCode = regexp.MustCompile(`^[A-Z]{2}[0-9A-Z]{10}$`)
|
||||
|
||||
// handbookParticipants — участники M2M из справочника НРД (без мест расчётов).
|
||||
func handbookParticipants() []HandbookEntry {
|
||||
raw, err := os.ReadFile(handbookFile)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
var hb struct {
|
||||
Participants []HandbookEntry `json:"participants"`
|
||||
}
|
||||
if json.Unmarshal(raw, &hb) != nil {
|
||||
return nil
|
||||
}
|
||||
var out []HandbookEntry
|
||||
for _, p := range hb.Participants {
|
||||
if p.Kind != "place" && p.INN != "" {
|
||||
out = append(out, p)
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// handbookByCode — участник по MC-коду.
|
||||
func handbookByCode(code string) (HandbookEntry, bool) {
|
||||
code = strings.ToUpper(strings.TrimSpace(code))
|
||||
if code == "" {
|
||||
return HandbookEntry{}, false
|
||||
}
|
||||
for _, p := range handbookParticipants() {
|
||||
if strings.EqualFold(p.Code, code) {
|
||||
return p, true
|
||||
}
|
||||
}
|
||||
return HandbookEntry{}, false
|
||||
}
|
||||
|
||||
// orgCode — код участника M2M нашей организации: из настроек, иначе депозитарный код в НРД.
|
||||
func orgCode(s Settings) string {
|
||||
return strings.ToUpper(strings.TrimSpace(pick(s.NSD.OrgCode, s.NSD.DeponentCode)))
|
||||
}
|
||||
|
||||
// orgINN — ИНН нашей организации: из настроек, иначе по коду из справочника участников.
|
||||
func orgINN(s Settings) string {
|
||||
if inn := strings.TrimSpace(s.NSD.OrgINN); inn != "" {
|
||||
return inn
|
||||
}
|
||||
if p, ok := handbookByCode(orgCode(s)); ok {
|
||||
return p.INN
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// orgName — наименование нашей организации.
|
||||
func orgName(s Settings) string {
|
||||
if n := strings.TrimSpace(s.NSD.OrgName); n != "" {
|
||||
return n
|
||||
}
|
||||
if p, ok := handbookByCode(orgCode(s)); ok {
|
||||
return p.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// saveOrg — POST /admin/setup/org: организация выбрана из справочника (hb=код) или введена вручную.
|
||||
func (h *setupHandlers) saveOrg(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "method", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
s := h.rc.Snapshot().NSD
|
||||
code := strings.ToUpper(strings.TrimSpace(r.FormValue("org_code")))
|
||||
inn := strings.TrimSpace(r.FormValue("org_inn"))
|
||||
name := strings.TrimSpace(r.FormValue("org_name"))
|
||||
if hb := strings.TrimSpace(r.FormValue("hb")); hb != "" {
|
||||
if p, ok := handbookByCode(hb); ok {
|
||||
code, inn, name = strings.ToUpper(p.Code), p.INN, pick(p.FullName, p.Name)
|
||||
}
|
||||
}
|
||||
if inn != "" && !manualINNRe.MatchString(inn) {
|
||||
setupFlash(w, r, "Организация: ИНН юридического лица — 10 цифр")
|
||||
return
|
||||
}
|
||||
if code != "" && !regexpMCCode.MatchString(code) {
|
||||
setupFlash(w, r, "Организация: код участника — вида MC0000000000")
|
||||
return
|
||||
}
|
||||
changedCode := code != s.OrgCode
|
||||
s.OrgCode, s.OrgINN, s.OrgName = code, inn, name
|
||||
if s.DeponentCode == "" {
|
||||
s.DeponentCode = code
|
||||
}
|
||||
if err := h.rc.UpdateNSD(s); err != nil {
|
||||
setupFlash(w, r, "Организация: ошибка сохранения: "+err.Error())
|
||||
return
|
||||
}
|
||||
msg := "Организация сохранена: " + pick(name, "—") + ", ИНН " + pick(inn, "—") + ", код " + pick(code, "—")
|
||||
if changedCode {
|
||||
msg += ". Код отправителя применится после перезапуска bj-server."
|
||||
}
|
||||
setupFlash(w, r, msg)
|
||||
}
|
||||
Reference in New Issue
Block a user