Merge pull request #14 from pallid/pallid-patch-1

Party fields specified.
This commit is contained in:
Alex 2022-08-08 03:30:22 +03:00 committed by GitHub
commit 8528cda7bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 494 additions and 134 deletions

View File

@ -63,6 +63,29 @@ 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"
)
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
@ -232,9 +255,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,16 +298,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 string `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"`
@ -311,14 +341,97 @@ 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"` // Тип руководителя
Fio *FIO `json:"fio"` // ФИО руководителя (для физлиц)
}
// 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)
Fio *FIO `json:"fio"` // ФИО учредителя (для физлиц)
}
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
@ -338,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"`
}
)

View File

@ -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)
}

121
api/model/test/bank.json Normal file
View File

@ -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
}
}

207
api/model/test/party.json Normal file
View File

@ -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
}

View File

@ -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"`