From 74698b7e9b7f22bd6d3316b52bd8eb56e6abfed8 Mon Sep 17 00:00:00 2001 From: Vasily Popov <1005220@mail.ru> Date: Sun, 7 Aug 2022 20:13:38 +0300 Subject: [PATCH 1/3] addea Founders --- api/model/model.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/api/model/model.go b/api/model/model.go index 7a1a9c5..92bc779 100644 --- a/api/model/model.go +++ b/api/model/model.go @@ -280,7 +280,13 @@ type ( Name string `json:"name"` Post string `json:"post"` } `json:"management"` - Founders string `json:"founders"` + Founders []*struct { + Ogrn string `json:"ogrn"` + Inn string `json:"inn"` + Name string `json:"name"` + Hid string `json:"hid"` + Type string `json:"type"` + } `json:"founders"` Managers string `json:"managers"` BranchType string `json:"branch_type"` BranchCount int `json:"branch_count"` From 73529e1779df6245ee19dbebb8ba6432fef0893e Mon Sep 17 00:00:00 2001 From: Alexander Zhuravlev Date: Mon, 8 Aug 2022 03:03:33 +0300 Subject: [PATCH 2/3] Party fields. --- api/model/model.go | 141 ++++++++++++++++++++++---- api/model/model_test.go | 142 +++++--------------------- api/model/test/bank.json | 121 ++++++++++++++++++++++ api/model/test/party.json | 207 ++++++++++++++++++++++++++++++++++++++ api/suggest/model.go | 1 + 5 files changed, 472 insertions(+), 140 deletions(-) create mode 100644 api/model/test/bank.json create mode 100644 api/model/test/party.json diff --git a/api/model/model.go b/api/model/model.go index 92bc779..c8f654f 100644 --- a/api/model/model.go +++ b/api/model/model.go @@ -63,6 +63,23 @@ const ( FMSTypePoliceState = 3 // Отделение полиции ) +const ( + PartyFounderTypeLegal PartyFounderType = "LEGAL" + PartyFounderTypePhysical PartyFounderType = "PHYSICAL" +) + +const ( + PartyManagerTypeEmployee PartyManagerType = "EMPLOYEE" + PartyManagerTypeForeigner PartyManagerType = "FOREIGNER" + PartyManagerTypeLegal PartyManagerType = "LEGAL" +) + +const ( + PartySMBCategoryMicro PartySMBCategory = "MICRO" + PartySMBCategorySmall PartySMBCategory = "SMALL" + PartySMBCategoryMedium PartySMBCategory = "MEDIUM" +) + type ( // BoundValue type wrapper for suggest bounds // full documentation https://confluence.hflabs.ru/pages/viewpage.action?pageId=222888017 @@ -232,9 +249,12 @@ type ( } // Bank base struct for dadata.Bank + // https://confluence.hflabs.ru/pages/viewpage.action?pageId=262996078 Bank struct { Opf *OrganizationOPF `json:"opf"` Name *BankName `json:"name"` + Inn string `json:"inn"` // ИНН (начиная с версии 20.3) + Kpp string `json:"kpp"` // КПП (начиная с версии 20.3) Bic string `json:"bic"` // Банковский идентификационный код (БИК) ЦБ РФ Swift string `json:"swift"` // Банковский идентификационный код в системе SWIFT Okpo string `json:"okpo"` // Код ОКПО @@ -272,22 +292,20 @@ type ( LiquidationDate int64 `json:"liquidation_date"` // Дата ликвидации } + PartySMBCategory string + // Party base struct for dadata.Party (rus Организация) + // https://confluence.hflabs.ru/pages/viewpage.action?pageId=204669122 Party struct { - Kpp string `json:"kpp"` - Capital string `json:"capital"` + Kpp string `json:"kpp"` + Capital *PartyCapital `json:"capital"` // Уставной капитал компании Management *struct { - Name string `json:"name"` - Post string `json:"post"` - } `json:"management"` - Founders []*struct { - Ogrn string `json:"ogrn"` - Inn string `json:"inn"` - Name string `json:"name"` - Hid string `json:"hid"` - Type string `json:"type"` - } `json:"founders"` - Managers string `json:"managers"` + Name string `json:"name"` // ФИО руководителя + Post string `json:"post"` // Должность руководителя + Disqualified *bool `json:"disqualified"` // true, если в состав руководства входят дисквалифицированные лица (19.7+) + } `json:"management"` // Руководитель + Founders []*PartyFounder `json:"founders"` // Учредители компании + Managers []*PartyManager `json:"managers"` // Руководители компании BranchType string `json:"branch_type"` BranchCount int `json:"branch_count"` Source string `json:"source"` @@ -317,14 +335,95 @@ type ( Code string `json:"code"` Name string `json:"name"` } `json:"okveds"` - Authorities string `json:"authorities"` - Documents string `json:"documents"` - Licenses string `json:"licenses"` - Address *AddressResponse `json:"address"` - Phones string `json:"phones"` - Emails string `json:"emails"` - OgrnDate int64 `json:"ogrn_date"` - OkvedType string `json:"okved_type"` + Authorities *struct { + FtsRegistration *PartyAuthority `json:"fts_registration"` // ИФНС регистрации + FtsReport *PartyAuthority `json:"fts_report"` // ИФНС отчётности + Pf *PartyAuthority `json:"pf"` // Отделение Пенсионного фонда + Sif *PartyAuthority `json:"sif"` // Отделение Фонда соц. страхования + } `json:"authorities"` // Сведения о налоговой, ПФР и ФСС + Documents *struct { + FtsRegistration *PartyDocument `json:"fts_registration"` // Свидетельство о регистрации в налоговой + FtsReport *PartyDocument `json:"fts_report"` // Сведения об учете в налоговом органе + PfRegistration *PartyDocument `json:"pf_registration"` // Свидетельство о регистрации в Пенсионном фонде + SifRegistration *PartyDocument `json:"sif_registration"` // Свидетельство о регистрации в Фонде соц. страхования + Smb *struct { + Type string `json:"type"` // Тип документа + Category PartySMBCategory `json:"category"` // Категория (MICRO, SMALL, MEDIUM) + IssueDate int64 `json:"issue_date"` // Дата включения организации в реестр + } `json:"smb"` // Запись в реестре малого и среднего предпринимательства (19.6+) + } `json:"documents"` // Документы + Licenses []*PartyLicense `json:"licenses"` // Лицензии + Address *AddressResponse `json:"address"` + Phones []*PartyPhone `json:"phones"` // Телефоны + Emails []*PartyEmail `json:"emails"` // Адреса эл. почты + OgrnDate int64 `json:"ogrn_date"` + OkvedType string `json:"okved_type"` + } + + // PartyCapital - уставной капитал компании + PartyCapital struct { + Type string `json:"type"` // Тип капитала + Value float64 `json:"value"` // Размер капитала + } + + // PartyManagerType - тип руководителя + PartyManagerType string + + // PartyManager - руководитель компании + PartyManager struct { + Ogrn string `json:"ogrn"` // ОГРН руководителя (для юрлиц) + Inn string `json:"inn"` // ИНН руководителя + Name string `json:"name"` // Наименование руководителя (для юрлиц) + Post string `json:"post"` // Должность руководителя (для физлиц) + Hid string `json:"hid"` // Внутренний идентификатор + Type PartyManagerType `json:"type"` // Тип руководителя + } + + // PartyFounderType - тип учредителя + PartyFounderType string + + // PartyFounder - учредитель компании. + PartyFounder struct { + Ogrn string `json:"ogrn"` // ОГРН учредителя (для юрлиц) + Inn string `json:"inn"` // ИНН учредителя + Name string `json:"name"` // Наименование учредителя (для юрлиц) + Hid string `json:"hid"` // Внутренний идентификатор + Type PartyFounderType `json:"type"` // Тип учредителя (LEGAL / PHYSICAL) + } + + PartyAuthority struct { + Type string `json:"type"` // Код гос. органа + Code string `json:"code"` // Код отделения + Name string `json:"name"` // Наименование отделения + Address string `json:"address"` // Адрес отделения одной строкой + } + + // PartyDocument - документ + PartyDocument struct { + Type string `json:"type"` // Тип документа + Series string `json:"series"` // Серия документа + Number string `json:"number"` // Номер документа + IssueDate int64 `json:"issue_date"` // Дата выдачи + IssueAuthority string `json:"issue_authority"` // Код подразделения + } + + // PartyPhone - телефон организации + PartyPhone struct { + Value string `json:"value"` // Телефон одной строкой + UnrestrictedValue string `json:"unrestricted_value"` // Телефон одной строкой + } + + // PartyEmail - email организации + PartyEmail struct { + Value string `json:"value"` // Адрес эл. почты одной строкой + UnrestrictedValue string `json:"unrestricted_value"` // Адрес эл. почты одной строкой + } + + // PartyLicense - лицензия + PartyLicense struct { + Series string `json:"series"` // Серия документа + Number string `json:"number"` // Номер документа + // todo } // Country base struct for dadata.Country diff --git a/api/model/model_test.go b/api/model/model_test.go index 62abfea..8081b7f 100644 --- a/api/model/model_test.go +++ b/api/model/model_test.go @@ -2,137 +2,41 @@ package model import ( "encoding/json" - "strings" + "os" "testing" "github.com/stretchr/testify/assert" ) func TestBank_Recursive(t *testing.T) { - srcData := `{ - "opf": { - "type": "BANK", - "full": null, - "short": null - }, - "name": { - "payment": "ПАО СБЕРБАНК", - "full": null, - "short": "СБЕРБАНК РОССИИ" - }, - "bic": "111", - "swift": "SABRRUMMXXX", - "okpo": null, - "correspondent_account": "30101810400000000225", - "registration_number": "1481", - "rkc": { - "opf": { - "type": "BANK", - "full": null, - "short": null - }, - "name": { - "payment": "ПАО СБЕРБАНК", - "full": null, - "short": "СБЕРБАНК РОССИИ" - }, - "bic": "222", - "swift": "SABRRUMMXXX", - "okpo": null, - "correspondent_account": "30101810400000000225", - "registration_number": "1481", - "rkc": { - "opf": { - "type": "BANK", - "full": null, - "short": null - }, - "name": { - "payment": "ПАО СБЕРБАНК", - "full": null, - "short": "СБЕРБАНК РОССИИ" - }, - "bic": "333", - "swift": "SABRRUMMXXX", - "okpo": null, - "correspondent_account": "30101810400000000225", - "registration_number": "1481", - "rkc": { - "opf": { - "type": "BANK", - "full": null, - "short": null - }, - "name": { - "payment": "ПАО СБЕРБАНК", - "full": null, - "short": "СБЕРБАНК РОССИИ" - }, - "bic": "444", - "swift": "SABRRUMMXXX", - "okpo": null, - "correspondent_account": "30101810400000000225", - "registration_number": "1481", - "rkc": null, - "address": { - "value": "г Москва, ул Вавилова, д 19", - "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", - "data": {} - }, - "phones": null, - "state": { - "status": "ACTIVE", - "actuality_date": 1548201600000, - "registration_date": 677376000000, - "liquidation_date": null - } - }, - "address": { - "value": "г Москва, ул Вавилова, д 19", - "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", - "data": {} - }, - "phones": null, - "state": { - "status": "ACTIVE", - "actuality_date": 1548201600000, - "registration_date": 677376000000, - "liquidation_date": null - } - }, - "address": { - "value": "г Москва, ул Вавилова, д 19", - "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", - "data": {} - }, - "phones": null, - "state": { - "status": "ACTIVE", - "actuality_date": 1548201600000, - "registration_date": 677376000000, - "liquidation_date": null - } - }, - "address": { - "value": "г Москва, ул Вавилова, д 19", - "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", - "data": {} - }, - "phones": null, - "state": { - "status": "ACTIVE", - "actuality_date": 1548201600000, - "registration_date": 677376000000, - "liquidation_date": null - } - }` + testBankReader, err := os.Open("test/bank.json") + if err != nil { + t.Error(err) + } + defer testBankReader.Close() bank := Bank{} - err := json.NewDecoder(strings.NewReader(srcData)).Decode(&bank) + err = json.NewDecoder(testBankReader).Decode(&bank) assert.NoError(t, err) assert.Equal(t, "111", bank.Bic) assert.Equal(t, "222", bank.Rkc.Bic) assert.Equal(t, "333", bank.Rkc.Rkc.Bic) assert.Equal(t, "444", bank.Rkc.Rkc.Rkc.Bic) } + +func TestParty(t *testing.T) { + testPartyReader, err := os.Open("test/party.json") + if err != nil { + t.Error(err) + } + defer testPartyReader.Close() + + model := Party{} + + err = json.NewDecoder(testPartyReader).Decode(&model) + assert.NoError(t, err) + assert.Equal(t, 2, len(model.Founders)) + assert.Equal(t, PartyFounderTypeLegal, model.Founders[0].Type) + assert.Equal(t, PartySMBCategorySmall, model.Documents.Smb.Category) +} diff --git a/api/model/test/bank.json b/api/model/test/bank.json new file mode 100644 index 0000000..ac0d4e4 --- /dev/null +++ b/api/model/test/bank.json @@ -0,0 +1,121 @@ +{ + "opf": { + "type": "BANK", + "full": null, + "short": null + }, + "name": { + "payment": "ПАО СБЕРБАНК", + "full": null, + "short": "СБЕРБАНК РОССИИ" + }, + "bic": "111", + "swift": "SABRRUMM012", + "inn": "7707083893", + "kpp": "773601001", + "okpo": null, + "correspondent_account": "30101810400000000225", + "treasury_accounts": null, + "registration_number": "1481", + "payment_city": "г. Москва", + "rkc": { + "opf": { + "type": "BANK", + "full": null, + "short": null + }, + "name": { + "payment": "ПАО СБЕРБАНК", + "full": null, + "short": "СБЕРБАНК РОССИИ" + }, + "bic": "222", + "swift": "SABRRUMMXXX", + "okpo": null, + "correspondent_account": "30101810400000000225", + "registration_number": "1481", + "rkc": { + "opf": { + "type": "BANK", + "full": null, + "short": null + }, + "name": { + "payment": "ПАО СБЕРБАНК", + "full": null, + "short": "СБЕРБАНК РОССИИ" + }, + "bic": "333", + "swift": "SABRRUMMXXX", + "okpo": null, + "correspondent_account": "30101810400000000225", + "registration_number": "1481", + "rkc": { + "opf": { + "type": "BANK", + "full": null, + "short": null + }, + "name": { + "payment": "ПАО СБЕРБАНК", + "full": null, + "short": "СБЕРБАНК РОССИИ" + }, + "bic": "444", + "swift": "SABRRUMMXXX", + "okpo": null, + "correspondent_account": "30101810400000000225", + "registration_number": "1481", + "rkc": null, + "address": { + "value": "г Москва, ул Вавилова, д 19", + "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", + "data": {} + }, + "phones": null, + "state": { + "status": "ACTIVE", + "actuality_date": 1548201600000, + "registration_date": 677376000000, + "liquidation_date": null + } + }, + "address": { + "value": "г Москва, ул Вавилова, д 19", + "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", + "data": {} + }, + "phones": null, + "state": { + "status": "ACTIVE", + "actuality_date": 1548201600000, + "registration_date": 677376000000, + "liquidation_date": null + } + }, + "address": { + "value": "г Москва, ул Вавилова, д 19", + "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", + "data": {} + }, + "phones": null, + "state": { + "status": "ACTIVE", + "actuality_date": 1548201600000, + "registration_date": 677376000000, + "liquidation_date": null + } + }, + "address": { + "value": "г Москва, ул Вавилова, д 19", + "unrestricted_value": "г Москва, Академический р-н, ул Вавилова, д 19", + "data": {} + }, + "phones": null, + "state": { + "status": "ACTIVE", + "actuality_date": 1548201600000, + "registration_date": 677376000000, + "liquidation_date": null + } +} diff --git a/api/model/test/party.json b/api/model/test/party.json new file mode 100644 index 0000000..a72d43e --- /dev/null +++ b/api/model/test/party.json @@ -0,0 +1,207 @@ +{ + "kpp": "773101001", + "capital": { "type": "УСТАВНЫЙ КАПИТАЛ", "value": 51348.0 }, + "management": { + "name": "Чех Илья Игоревич", + "post": "ГЕНЕРАЛЬНЫЙ ДИРЕКТОР", + "disqualified": null + }, + "founders": [ + { + "ogrn": null, + "inn": null, + "name": "КОМПАНИЯ ХОМО АУКТУС ЛИМИТЕД", + "hid": "cada330cd8bdf8362b7653bc0b45cd743bbd3ff344b32f7b898c4b8d144a7fd4", + "type": "LEGAL", + "share": { "value": 77.8998, "type": "PERCENT" } + }, + { + "ogrn": "1187746709358", + "inn": "7728437776", + "name": "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"УК ДАЛЬНЕВОСТОЧНЫЙ ФОНД ВЫСОКИХ ТЕХНОЛОГИЙ\"", + "hid": "0ff0c9392d0b91c58559633b37531cfcc9555563b3aee8ca20ad5e6c987896f2", + "type": "LEGAL", + "share": { "value": 22.1002, "type": "PERCENT" } + } + ], + "managers": [ + { + "inn": "781303761704", + "fio": { + "surname": "Чех", + "name": "Илья", + "patronymic": "Игоревич", + "gender": "MALE", + "source": "ЧЕХ ИЛЬЯ ИГОРЕВИЧ", + "qc": null + }, + "post": "ГЕНЕРАЛЬНЫЙ ДИРЕКТОР", + "hid": "e680692ab083c142ceee2a09e57529c6d740c95c5216520a35d325c9edbcad64", + "type": "EMPLOYEE" + } + ], + "predecessors": null, + "successors": null, + "branch_type": "MAIN", + "branch_count": 0, + "source": null, + "qc": null, + "hid": "baf582914d601bc5246e881b07dfa6e336091a3857bebc3bf389aa0b4073223c", + "type": "LEGAL", + "state": { + "status": "ACTIVE", + "code": null, + "actuality_date": 1611273600000, + "registration_date": 1423094400000, + "liquidation_date": null + }, + "opf": { + "type": "2014", + "code": "12300", + "full": "Общество с ограниченной ответственностью", + "short": "ООО" + }, + "name": { + "full_with_opf": "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"МОТОРИКА\"", + "short_with_opf": "ООО \"МОТОРИКА\"", + "latin": null, + "full": "МОТОРИКА", + "short": "МОТОРИКА" + }, + "inn": "7719402047", + "ogrn": "1157746078984", + "okpo": "27539247", + "okato": "45268569000", + "oktmo": "45321000000", + "okogu": "4210011", + "okfs": "34", + "okved": "72.19", + "okveds": [ + { + "main": true, + "type": "2014", + "code": "72.19", + "name": "Научные исследования и разработки в области естественных и технических наук прочие" + } + ], + "authorities": { + "fts_registration": { + "type": "FEDERAL_TAX_SERVICE", + "code": "7746", + "name": "Межрайонная инспекция Федеральной налоговой службы № 46 по г. Москве", + "address": "125373, г.Москва, Походный проезд, домовладение 3, стр.2" + }, + "fts_report": { + "type": "FEDERAL_TAX_SERVICE", + "code": "7731", + "name": "Инспекция Федеральной налоговой службы № 31 по г.Москве", + "address": null + }, + "pf": { + "type": "PENSION_FUND", + "code": "087803", + "name": "Государственное учреждение - Главное Управление Пенсионного фонда РФ №2 Управление №7 по г. Москве и Московской области муниципальный район Можайский г.Москвы", + "address": null + }, + "sif": { + "type": "SOCIAL_INSURANCE_FUND", + "code": "7738", + "name": "Филиал №38 Государственного учреждения - Московского регионального отделения Фонда социального страхования Российской Федерации", + "address": null + } + }, + "documents": { + "fts_registration": { + "type": "FTS_REGISTRATION", + "series": "77", + "number": "016942308", + "issue_date": 1423094400000, + "issue_authority": "7746" + }, + "fts_report": { + "type": "FTS_REPORT", + "series": null, + "number": null, + "issue_date": 1519084800000, + "issue_authority": "7731" + }, + "pf_registration": { + "type": "PF_REGISTRATION", + "series": null, + "number": "087803025754", + "issue_date": 1519689600000, + "issue_authority": "087803" + }, + "sif_registration": { + "type": "SIF_REGISTRATION", + "series": null, + "number": "772406613777381", + "issue_date": 1512432000000, + "issue_authority": "7738" + }, + "smb": { + "category": "SMALL", + "type": "SMB", + "series": null, + "number": null, + "issue_date": 1565384400000, + "issue_authority": null + } + }, + "licenses": [ + { + "series": "123123", + "number": "456456" + }, + { + "series": "234234", + "number": "567567" + } + ], + "finance": { + "tax_system": null, + "income": 90183000.0, + "expense": 128338000.0, + "debt": null, + "penalty": null, + "year": 2019 + }, + "phones": [ + { + "value": "+7 911 2410309", + "unrestricted_value": "+7 911 2410309", + "data": { + "contact": null, + "source": "+7 911 241 0309", + "qc": null, + "type": "Мобильный", + "number": "2410309", + "extension": null, + "provider": "ПАО \"Мобильные ТелеСистемы\"", + "country": null, + "region": "Санкт-Петербург и Ленинградская область", + "city": null, + "timezone": "UTC+3", + "country_code": "7", + "city_code": "911", + "qc_conflict": null + } + } + ], + "emails": [ + { + "value": "INFO@MOTORICA.ORG", + "unrestricted_value": "INFO@MOTORICA.ORG", + "data": { + "local": "INFO", + "domain": "MOTORICA.ORG", + "type": null, + "source": "info@motorica.org", + "qc": null + } + } + ], + "ogrn_date": 1423094400000, + "okved_type": "2014", + "employee_count": 59 +} diff --git a/api/suggest/model.go b/api/suggest/model.go index 9d73fa8..db170e7 100644 --- a/api/suggest/model.go +++ b/api/suggest/model.go @@ -99,6 +99,7 @@ type ( } // PartySuggestion api response for party + // https://confluence.hflabs.ru/pages/viewpage.action?pageId=204669122 PartySuggestion struct { Value string `json:"value"` UnrestrictedValue string `json:"unrestricted_value"` From 37e8b549338a8ad8958fce3279a3c444d5f17eb7 Mon Sep 17 00:00:00 2001 From: Alexander Zhuravlev Date: Mon, 8 Aug 2022 03:28:15 +0300 Subject: [PATCH 3/3] Fio object. Party manager and founder FIO field. --- api/model/model.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/api/model/model.go b/api/model/model.go index c8f654f..6737a16 100644 --- a/api/model/model.go +++ b/api/model/model.go @@ -80,6 +80,12 @@ const ( PartySMBCategoryMedium PartySMBCategory = "MEDIUM" ) +const ( + GenderMale Gender = "MALE" + GenderFemale Gender = "FEMALE" + GenderUnknown Gender = "UNKNOWN" // Не удалось однозначно определить +) + type ( // BoundValue type wrapper for suggest bounds // full documentation https://confluence.hflabs.ru/pages/viewpage.action?pageId=222888017 @@ -377,6 +383,7 @@ type ( Post string `json:"post"` // Должность руководителя (для физлиц) Hid string `json:"hid"` // Внутренний идентификатор Type PartyManagerType `json:"type"` // Тип руководителя + Fio *FIO `json:"fio"` // ФИО руководителя (для физлиц) } // PartyFounderType - тип учредителя @@ -389,6 +396,7 @@ type ( Name string `json:"name"` // Наименование учредителя (для юрлиц) Hid string `json:"hid"` // Внутренний идентификатор Type PartyFounderType `json:"type"` // Тип учредителя (LEGAL / PHYSICAL) + Fio *FIO `json:"fio"` // ФИО учредителя (для физлиц) } PartyAuthority struct { @@ -443,4 +451,18 @@ type ( RegionCode string `json:"region_code"` Type string `json:"type"` } + + Gender string + + FIO struct { + Surname string `json:"surname"` // Фамилия + Name string `json:"name"` // Имя + Patronymic string `json:"patronymic"` // Отчество + Gender Gender `json:"gender"` // Пол + // Код качества. + // 0 - если все части ФИО найдены в справочниках. + // 1 - если в ФИО есть часть не из справочника. + QC string `json:"qc"` + Source string `json:"source"` + } )