193 lines
4.7 KiB
JavaScript
193 lines
4.7 KiB
JavaScript
const Constants = require('../data_providers/constants');
|
|
const Utils = require('../utils/utils');
|
|
const DebugInfo = require('./DebugInfo');
|
|
|
|
class Vehicle {
|
|
brand
|
|
model
|
|
color
|
|
year
|
|
category
|
|
engine
|
|
number
|
|
currentNumber
|
|
vin1
|
|
vin2
|
|
sts
|
|
pts
|
|
isRightWheel
|
|
isJapanese
|
|
photos
|
|
addedDate
|
|
addedBy
|
|
ownershipPeriods
|
|
events
|
|
notes
|
|
|
|
static fromAvtocod(report) {
|
|
//console.log(JSON.stringify(report));
|
|
let tech = report.fields.tech_data;
|
|
if(!tech) {
|
|
throw Error('Empty report');
|
|
}
|
|
|
|
let e = tech.engine;
|
|
|
|
let v = new Vehicle();
|
|
v.brand = { name: tech.brand.name, logo: tech.brand?.logotype?.uri };
|
|
v.category = report.fields.additional_info.vehicle.category.code;
|
|
v.engine = { number: e.number, volume: e.volume, powerHp: e.power.hp, powerKw: e.power.kw, fuelType: e.fuel?.type };
|
|
v.model = tech.model ? { name: tech.model.name } : null;
|
|
v.year = tech.year;
|
|
v.number = report.identifiers_query.query;
|
|
v.currentNumber = report.fields.identifiers.vehicle.reg_num;
|
|
v.pts = report.fields.identifiers.vehicle.pts;
|
|
v.sts = report.fields.identifiers.vehicle.sts;
|
|
v.vin1 = report.fields.identifiers.vehicle.vin;
|
|
v.vin2 = report.fields.identifiers.vehicle.body;
|
|
v.photos = report.fields.images.photos.items.map(p => {
|
|
return {
|
|
brand: p.vehicle.brand.name,
|
|
model: p.vehicle.model.name,
|
|
date: Date.parse(p.date.issued + ' GMT'),
|
|
url: p.uri
|
|
};
|
|
});
|
|
|
|
if(tech?.wheel?.position) {
|
|
v.isRightWheel = tech?.wheel?.position == 'RIGHT';
|
|
} else {
|
|
v.isRightWheel = null;
|
|
}
|
|
|
|
v.isJapanese = report.is_japanese_vehicle;
|
|
v.addedDate = Date.now();
|
|
v.updatedDate = v.addedDate;
|
|
v.events = [];
|
|
v.notes = [];
|
|
v.debugInfo = { autocod: new DebugInfo() };
|
|
|
|
return v;
|
|
}
|
|
|
|
static fromVin01History(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: parseFloat(main.powerHp),
|
|
powerKw: parseFloat(main.powerKwt),
|
|
volume: parseInt(main.engineVolume)
|
|
};
|
|
v.year = parseInt(main.year, 10);
|
|
v.vin1 = Utils.cyrillicToLatin(main.vin);
|
|
v.vin2 = Utils.cyrillicToLatin(main.bodyNumber);
|
|
v.color = main.color;
|
|
|
|
v.ownershipPeriods = report.RequestResult.ownershipPeriods.ownershipPeriod.map(p => {
|
|
let period = {
|
|
lastOperation: Constants.typeOperation[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();
|
|
v.updatedDate = v.addedDate;
|
|
v.events = [];
|
|
v.notes = [];
|
|
v.debugInfo = { vin01history: new DebugInfo() };
|
|
|
|
return v;
|
|
}
|
|
|
|
static fromVin01Base(report) {
|
|
let first = report[0];
|
|
|
|
let v = new Vehicle();
|
|
v.brand = { name: { original: first.brandmark, normalized: first.brand } };
|
|
v.model = { normalized: first.model };
|
|
v.category = first.ts_category;
|
|
v.year = parseInt(first.year);
|
|
v.vin1 = Utils.cyrillicToLatin(first.vin);
|
|
v.vin2 = Utils.cyrillicToLatin(first.body);
|
|
|
|
v.engine = {
|
|
powerHp: parseFloat(first.engine_power),
|
|
volume: parseInt(first.engine_volume),
|
|
number: first.engine
|
|
};
|
|
|
|
v.ownershipPeriods = report.map(p => {
|
|
let dateParams = p.last_operation_date.split('.').reverse().map(n => parseInt(n, 10));
|
|
dateParams[1] -= 1;
|
|
let date = (new Date(...dateParams)).getTime();
|
|
|
|
let period = {
|
|
from: date,
|
|
to: 0,
|
|
region: p.region,
|
|
registrationRegion: p.ts_registration_region,
|
|
locality: p.ts_locality,
|
|
lastOperation: Constants.typeOperation[p.tech_operation_code] ?? p.tech_operation_code,
|
|
ownerType: p.owner_category == '2' ? 'individual' : 'legal',
|
|
code: p.code
|
|
};
|
|
|
|
if(p.street && p.street != '-') {
|
|
period.street = p.street;
|
|
}
|
|
|
|
if(p.building && p.building != '-') {
|
|
period.building = p.building;
|
|
}
|
|
|
|
if(p.entity_inn && p.entity_inn != '-') {
|
|
period.inn = p.entity_inn;
|
|
}
|
|
|
|
return period;
|
|
});
|
|
|
|
v.addedDate = Date.now();
|
|
v.updatedDate = v.addedDate;
|
|
v.events = [];
|
|
v.notes = [];
|
|
v.debugInfo = { vin01base: new DebugInfo() };
|
|
|
|
return v;
|
|
}
|
|
|
|
mergeNotes(newNotes) {
|
|
if(this.notes) {
|
|
let map = new Map();
|
|
this.notes.forEach(item => map.set(item.id, item));
|
|
newNotes.forEach(item => map.set(item.id, item));
|
|
this.notes = [...map.values()];
|
|
} else {
|
|
this.notes = newNotes;
|
|
}
|
|
}
|
|
|
|
mergeEvents(newEvents) {
|
|
if(this.events) {
|
|
let map = new Map();
|
|
this.events.forEach(item => map.set(item.id, item));
|
|
newEvents.forEach(item => map.set(item.id, item));
|
|
this.events = [...map.values()];
|
|
} else {
|
|
this.events = newEvents;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = Vehicle;
|