UNPKG

rtech-struct

Version:

Rtech Platform Superstruct Entity

145 lines (138 loc) 4.96 kB
const s = require('superstruct') const Url = s.define('Url', require('is-url')) const { ZuluDateTimeStruct, Uuid } = require('./lib') const GpsA = require('./lib').gpsarray(s) const GpsS = require('./lib').gpsstring(s) const { placeChecker } = require('./place') const { multistep, packageV2, packageV1 } = require('./multistep') const { notes } = require('./notes') const Contact = require('./contact').auctionContact const Instance = process.env.NODE_APP_INSTANCE || 'DEMO' exports.auction = function (config = null) { let InstanceName = Instance let RelsMax = 10 if (config && config.app && config.app.usercodename) InstanceName = Instance if (config && config.shaq && config.shaq.relsmax) RelsMax = config.shaq.relsmax const currentDate = new Date() const values = { id: require('uuid').v4(), key: require('uuid').v4(), options: [], creator: 'DEMO', visible: 'private', reported_at: currentDate.toISOString(), valid_until: new Date(new Date(currentDate).setDate(currentDate.getDate() + 1)).toISOString(), valid_from: currentDate.toISOString(), type: 'auction', name: Instance + currentDate.getTime(), status: 'created', currency: 'EUR', source: [Instance], sourceName: [InstanceName], target: [], vehicles: [] } const type = s.type({ id: s.optional(Uuid), type: s.string(), key: s.size(s.string(), 8, 128), name: s.size(s.string(), 8, 128), status: s.enums([ 'created', 'cancelled', 'running', 'completed', 'expired', 'failed', 'searching', 'searched', 'validated' ]), reported_at: ZuluDateTimeStruct, archived_at: s.optional(ZuluDateTimeStruct), tracking_url: s.optional(Url), valid_until: ZuluDateTimeStruct, valid_from: ZuluDateTimeStruct, decision_from: ZuluDateTimeStruct, waybills: s.optional(s.size(s.string(), 8, 256)), creator: s.size(s.string(), 2, 32), visible: s.enums(['public', 'private']), options: s.optional( s.array( s.enums([ 'SHAQUPLOAD', 'BIDUPLOAD', 'AUTOINVITE', 'BIDCOMMENT', 'NOCHAT', 'LITE', 'PRICE_DETAIL', 'SHOW_CONTACT', 'PKG_V1', 'PKG_V2', 'MULTISTEP', 'CLOSE_AFTER_DECISION_FROM', 'SECRET_GETITNOW', 'BID_SCORING_PRICE' ]) ) ), source: s.size(s.array(s.size(s.string(), 2, 64)), 0, 5), target: s.size(s.array(s.size(s.string(), 2, 64)), 0, RelsMax), targetStatus: s.optional( s.size(s.array(s.enums(['', 'Removed', 'Disabled', 'Searching', 'NoSolution'])), 0, RelsMax) ), sourceName: s.optional(s.size(s.array(s.size(s.string(), 0, 128)), 0, 5)), sourceOwner: s.optional(s.size(s.array(s.size(s.string(), 0, 128)), 0, 5)), targetName: s.optional(s.size(s.array(s.size(s.string(), 0, 128)), 0, RelsMax)), targetOwner: s.optional(s.size(s.array(s.size(s.string(), 0, 128)), 0, RelsMax)), currency: s.enums(['EUR', 'DOLLAR']), bestbidprice: s.optional(s.number()), bestbid: s.optional(Uuid), getitnow: s.optional(s.number()), winningbid: s.optional(Uuid), puPlace: placeChecker, puLocation: s.optional(s.union([GpsA, GpsS])), puContact: s.optional(Contact), puDate: ZuluDateTimeStruct, extras: s.defaulted(s.optional(s.array(s.string())), []), puDateRange: s.optional(ZuluDateTimeStruct), dePlace: placeChecker, deLocation: s.optional(s.union([GpsA, GpsS])), deContact: s.optional(Contact), deDate: ZuluDateTimeStruct, deDateRange: s.optional(ZuluDateTimeStruct), files: s.optional(s.array(s.string())), vehicles: s.optional(s.array(s.string())), incoterm: s.optional(s.enums(['EXW', 'CIP', 'FCA', 'DAP', 'DPU', 'CPT', 'DDP', 'FAS', 'CFR', 'FOB', 'CIF'])), transport: s.optional(s.array(s.string())), dimension: s.dynamic((v, p) => { const options = p.branch.find((e) => e?.hasOwnProperty('options'))?.options || [] switch (true) { case options.includes('MULTISTEP'): return multistep(config) case options.includes('PKG_V1'): return packageV1 case options.includes('PKG_V2'): return packageV2 default: return packageV1 } }), stackable: s.optional(s.enums(['yes', 'no', 'No', 'Yes', 0, 1])), distance: s.optional(s.union([s.number(), s.string()])), notes: notes, tags: s.defaulted(s.optional(s.array(s.string())), []), click_and_get_price: s.optional(s.size(s.number(), 1, Infinity)) }) const struct = s.defaulted(type, values) return s.dynamic((value) => { if (value?.decision_from) { return struct } if (value?.reported_at) { return s.defaulted(struct, { decision_from: value.reported_at }) } return s.defaulted(struct, { decision_from: currentDate.toISOString() }) }) }