diff --git a/data_providers/constants.js b/data_providers/constants.js new file mode 100644 index 0000000..508d90e --- /dev/null +++ b/data_providers/constants.js @@ -0,0 +1,171 @@ +const organs = [ + 'не предусмотренный код', + 'Судебные органы', + 'Судебный пристав', + 'Таможенные органы', + 'Органы социальной защиты', + 'Нотариус', + 'ОВД или иные правоохр. органы', + 'ОВД или иные правоохр. органы (прочие)' +]; + +const ogr = [ + '', + 'Запрет на регистрационные действия', + 'Запрет на снятие с учета', + 'Запрет на регистрационные действия и прохождение ГТО', + 'Утилизация (для транспорта не старше 5 лет)', + 'Аннулирование' +]; + +const typeAuto = { + '01':'Грузовые автомобили бортовые', + '02':'Грузовые автомобили шасси', + '03':'Грузовые автомобили фургоны', + '04':'Грузовые автомобили тягачи седельные', + '05':'Грузовые автомобили самосвалы', + '06':'Грузовые автомобили рефрижераторы', + '07':'Грузовые автомобили цистерны', + '08':'Грузовые автомобили с гидроманипулятором', + '09':'Грузовые автомобили прочие', + '21':'Легковые автомобили универсал', + '22':'Легковые автомобили комби (хэтчбек)', + '23':'Легковые автомобили седан', + '24':'Легковые автомобили лимузин', + '25':'Легковые автомобили купе', + '26':'Легковые автомобили кабриолет', + '27':'Легковые автомобили фаэтон', + '28':'Легковые автомобили пикап', + '29':'Легковые автомобили прочие', + '41':'Автобусы длиной не более 5 м', + '42':'Автобусы длиной более 5 м, но не более 8 м', + '43':'Автобусы длиной более 8 м, но не более 12 м', + '44':'Автобусы сочлененные длиной более 12 м', + '49':'Автобусы прочие', + '51':'Специализированные автомобили автоцистерны', + '52':'Специализированные автомобили санитарные', + '53':'Специализированные автомобили автокраны', + '54':'Специализированные автомобили заправщики', + '55':'Специализированные автомобили мастерские', + '56':'Специализированные автомобили автопогрузчики', + '57':'Специализированные автомобили эвакуаторы', + '58':'Специализированные пассажирские транспортные средства', + '59':'Специализированные автомобили прочие', + '71':'Мотоциклы', + '72':'Мотороллеры и мотоколяски', + '73':'Мотовелосипеды и мопеды', + '74':'Мотонарты', + '80':'Прицепы самосвалы', + '81':'Прицепы к легковым автомобилям', + '82':'Прицепы общего назначения к грузовым автомобилям', + '83':'Прицепы цистерны', + '84':'Прицепы тракторные', + '85':'Прицепы вагоны-дома передвижные', + '86':'Прицепы со специализированными кузовами', + '87':'Прицепы трейлеры', + '88':'Прицепы автобуса', + '89':'Прицепы прочие', + '91':'Полуприцепы с бортовой платформой', + '92':'Полуприцепы самосвалы', + '93':'Полуприцепы фургоны', + '95':'Полуприцепы цистерны', + '99':'Полуприцепы прочие', + '31':'Трактора', + '32':'Самоходные машины и механизмы', + '33':'Трамваи', + '34':'Троллейбусы', + '35':'Велосипеды', + '36':'Гужевой транспорт', + '38':'Подвижной состав железных дорог', + '39':'Иной' +}; + +const typeOperation = { + '01':'Регистрация новых, произведенных в России или везенных, а также ввезенных в Россию бывших в эксплуатации, в том числе временно на срок более 6 месяцев, испытательной техники.', + '02':'Ранее зарегистрированных в регистрирующих органах', + '03':'Изменение собственника (владельца) в результате совершения сделки, вступления в наследство, слияние и разделение капитала у юридического лица, переход права по договору лизинга, судебные решения и др.', + '04':'Изменение данных о собственнике (владельце)', + '05':'Изменение данных о транспортном средстве, в том числе изменение технических характеристик и (или) назначения (типа) транспортного средства', + '06':'Выдача взамен утраченных или пришедших в негодность государственных регистрационных знаков, регистрационных документов, паспортов транспортных средств.', + '07':'Прекращение регистрации ', + '08':'Снятие с учета в связи с убытием за пределы Российской Федерации', + '09':'Снятие с учета в связи с утилизацией', + '11':'первичная регистрация', + '12':'регистрация снятых с учета', + '13':'временная регистрация ТС (на срок проведения проверок, на срок временной прописки, регистрация испытательной техники)', + '14':'временный учет (временная регистрация места пребывания ТС без выдачи документов)', + '15':'регистрация ТС, ввезенных из-за пределов Российской Федерации', + '16':'регистрация ТС, прибывших из других регионов Российской Федерации', + '17':'регистрация ТС по новому месту жительства собственника, прибывшего из другого субъекта Российской Федерации, с 18', + '21':'постановка на постоянный учет в связи со сверкой', + '22':'постановка на оперативный учет', + '23':'постановка на постоянный учет', + '24':'постановка в розыск утраченной спецпродукции', + '25':'постановка уничтоженной спецпродукции', + '26':'учет изготовленной и отгруженной спецпродукции (по информации предприятий-изготовителей)', + '27':'учет выданной и распределенной спецпродукции (по информации подразделений ГИБДД)', + '28':'учет закрепленной спецпродукции', + '29':'учет ПТС, выданных заводами-изготовителями', + '30':'учет ПТС, выданных таможенными органами', + '31':'резерв', + '32':'Оформление первичного материала по административному правонарушению', + '33':'учет лиц в розыске', + '34':'учет утраченного оружия', + '35':'первичная выдача после обучения', + '36':'первичная выдача после самоподготовки', + '37':'замена в связи с утратой', + '38':'замена в связи с истечением срока действия', + '39':'открытие новой категории', + '40':'выдача международного водительского удостоверения', + '41':'замена государственного регистрационного знака', + '42':'выдача дубликата регистрационного документа', + '43':'выдача (замена) паспорта ТС', + '44':'замена номерного агрегата, цвета, изменение конструкции ТС', + '45':'изменение Ф.И.О. (наименования) владельца', + '46':'изменение места жительства (юридического адреса) владельца в пределах территории обслуживания регистрационным пунктом', + '47':'наличие запретов и ограничений', + '48':'снятие запретов и ограничений', + '49':'регистрация залога ТС', + '50':'прекращение регистрации залога ТС', + '51':'коррекция иных реквизитов', + '52':'выдача акта технического осмотра', + '53':'проведение ГТО', + '54':'постоянная регистрация ТС по окончанию временной', + '55':'коррекция реквизитов по информации налоговых органов', + '56':'коррекция реквизитов при проведении ГТО', + '57':'Оформление этапа производства по делу об АП', + '59':'коррекция реквизитов', + '61':'в связи с изменением места регистрации', + '62':'в связи с прекращением права собственности (отчуждение, конфискация ТС)', + '63':'в связи с вывозом ТС за пределы Российской Федерации', + '64':'в связи с окончанием срока временной регистрации', + '65':'в связи с утилизацией', + '66':'в связи с признанием регистрации недействительной', + '67':'снятие с временного учета', + '68':'снятие с учета в связи с кражей или угоном', + '69':'постановка с одновременным снятием с учета', + '71':'с ОУ в связи с обнаружением', + '72':'с ОУ за давностью лет', + '73':'с ОУ в связи с не подтверждением', + '74':'с ОУ в связи с переводом на ПУ', + '75':'с ПУ в связи с обнаружением', + '76':'с ПУ за давностью лет', + '77':'чистка ФКУ \'ГИАЦ МВД России\'', + '78':'наложенных ограничений', + '81':'документов в связи с обнаружением', + '82':'удаление ошибочно введенной записи', + '83':'удаление в связи со сверкой', + '84':'перевод в архив в связи с корректировкой', + '91':'по наследству с заменой государственных регистрационных знаков', + '92':'по наследству с сохранением государственных регистрационных знаков за новым собственником (наследником)', + '93':'по сделкам, произведенным в любой форме (купля-продажа, дарение, др.) с заменой государственных регистрационных знаков', + '94':'по сделкам, произведенным в любой форме (купля-продажа, дарение, др.) с сохранением государственных регистрационных', + '95':'учет прекращения действия водительского удостоверения', + '96':'учет восстановления действия водительского удостоверения', + '97':'учет приостановления действия права управления ТС по постановлению судебного пристава-исполнителя о временном', + '98':'учет отмены приостановления действия права управления ТС по постановлению судебного пристава-исполнителя о временном ограничении на пользование должников специальным правом' +}; + +module.exports = { + organs, ogr, typeAuto, typeOperation +}; \ No newline at end of file diff --git a/data_providers/vin01.js b/data_providers/vin01.js index 3cf3544..da9232d 100644 --- a/data_providers/vin01.js +++ b/data_providers/vin01.js @@ -1,6 +1,8 @@ const fetch = require('node-fetch'); +const Vehicle = require('../models/vehicle'); const baseUrl = 'https://vin01.ru/v2'; +const reportBaseUrl = 'https://vin01.ru/api/gibddApp.php'; class Vin01Provider { static async getVin(number, token) { @@ -10,11 +12,33 @@ class Vin01Provider { if(json.success && json.code == 200) { return json.data.vin; } else { - console.log('=========================================================='); - console.log(JSON.stringify(json)); throw Error('Vin01 provider failed to get VIN'); } } + + static async getReport(number, token) { + let vin = await Vin01Provider.getVin(number, token); + let result = await fetch(reportBaseUrl, { + method: 'POST', + body: new URLSearchParams({ + typeCheckValue: 'history', + vinValue: vin, + key: token + }) + }); + let json = await result.json(); + + if(json.status == 200) { + let vehicle = Vehicle.fromVin01(json.data); + vehicle.number = number; + return vehicle; + } else { + let vehicle = new Vehicle(); + vehicle.vin1 = vin; + return vehicle; + //throw Error('Vin01 provider failed to get gibdd info'); + } + } } module.exports = Vin01Provider; \ No newline at end of file diff --git a/models/vehicle.js b/models/vehicle.js index 4c214d7..8bbca8f 100644 --- a/models/vehicle.js +++ b/models/vehicle.js @@ -1,3 +1,5 @@ +const Constants = require('constants'); + class Vehicle { brand model @@ -15,6 +17,7 @@ class Vehicle { photos addedDate addedBy + ownershipPeriods static fromAvtocod(report) { //console.log(JSON.stringify(report)); @@ -50,9 +53,40 @@ class Vehicle { return v; } - // updateFromVin01(report) { + static fromVin01(report) { + let main = report.RequestResult.vehicle; - // } + let v = new Vehicle(); + v.brand = { name: { original: main.model } }; + v.category = main.category; + v.engine = { + number: main.engineNumber, + powerHp: main.powerHp, + powerKw: main.powerKwt, + volume: main.engineVolume + }; + v.year = main.year; + v.vin1 = main.vin; + v.vin2 = main.bodyNumber; + v.color = main.color; + + v.ownershipPeriods = report.RequestResult.ownershipPeriods.ownershipPeriod.map(p => { + let period = { + lastOperation: Constants[p.lastOperation] ?? p.lastOperation, + ownerType: p.simplePersonType.toLowerCase() == 'legal' ? 'legal' : 'individual', + from: Date.parse(p.from), + to: 0 + }; + if('to' in p) { + period.to = Date.parse(p.to); + } + return period; + }); + + v.addedDate = Date.now(); + + return v; + } } module.exports = Vehicle; diff --git a/routes/vehicles.js b/routes/vehicles.js index d8e2b9d..8a2cb71 100644 --- a/routes/vehicles.js +++ b/routes/vehicles.js @@ -23,17 +23,18 @@ router.post('/check', async (req, res) => { let all = [autocodPromise]; if(googleIdToken) { - let vin01Promise = Vin01Provider.getVin(number, googleIdToken); + let vin01Promise = Vin01Provider.getReport(number, googleIdToken); all.push(vin01Promise); } let [autocod, vin01] = await Promise.allSettled(all); if(autocod.status == 'fulfilled') { let vehicle = autocod.value; vehicle.addedBy = login; - if(vin01?.status == 'fulfilled') { - vehicle.vin1 = vin01.value; - } else { - console.log(vin01.reason); + if(vin01?.status == 'fulfilled' && vin01.value?.brand?.name?.original == vehicle?.brand?.name?.original) { + vehicle.vin1 = vin01.value.vin1; + vehicle.vin2 = vin01.value.vin2; + vehicle.color = vin01.value.color; + vehicle.ownershipPeriods = vin01.value.ownershipPeriods; } await collection.replaceOne({ number }, vehicle, { upsert: true }); res.status(201).send({ success: true, data: vehicle });