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.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;