floriday/utils.js

743 lines
20 KiB
JavaScript
Raw Normal View History

import moment from 'moment';
import fetch from 'node-fetch';
2023-01-11 12:13:22 +00:00
import { models } from './models/index.js';
2023-02-08 11:31:54 +00:00
import { v4 as uuidv4 } from 'uuid';
import chalk from 'chalk';
2023-04-03 19:02:00 +00:00
import ora from 'ora';
const env = process.env;
2023-01-11 13:37:46 +00:00
/**
* Gets the Access Token from the client config table
*
* @param {sequelize.models} models
* @returns {Date} tokenExpirationDate formated as YYYY-MM-DD HH:mm:ss
*/
2023-04-06 08:56:52 +00:00
export async function requestToken() {
2023-05-05 09:48:44 +00:00
let spinner;
try {
spinner = ora(`Requesting new token...`).start();
const clientConfigData = await models.clientConfig.findOne();
let tokenExpirationDate;
if (clientConfigData)
tokenExpirationDate = clientConfigData.tokenExpiration;
if (!tokenExpirationDate || moment().isAfter(tokenExpirationDate)) {
let clientId, clientSecret
if (JSON.parse(env.USE_SECRETS_DB)) {
clientId = clientConfigData.clientId;
clientSecret = clientConfigData.clientSecret;
} else {
clientId = env.CLIENT_ID
clientSecret = env.CLIENT_SECRET
};
const data = {
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
scope: 'role:app catalog:read supply:read organization:read network:write network:read'
};
const body = Object.keys(data)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
.join('&');
const response = await fetch(env.API_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body,
});
const responseData = await response.json();
if (response.ok)
spinner.succeed();
else {
spinner.fail();
criticalError(new Error(`Token request failed with status: ${response.status} - ${response.statusText}`));
}
let tokenExpirationDate = moment()
.add(responseData.expires_in, 's')
.format('YYYY-MM-DD HH:mm:ss');
await updateClientConfig(
clientId,
clientSecret,
responseData.access_token,
tokenExpirationDate
);
return tokenExpirationDate;
2023-04-24 10:46:06 +00:00
} else {
2023-05-05 09:48:44 +00:00
spinner.text = 'Using stored token...'
spinner.succeed();
return tokenExpirationDate;
2023-04-24 10:46:06 +00:00
}
2023-05-05 09:48:44 +00:00
} catch (err) {
spinner.fail();
throw err;
2023-04-24 10:46:06 +00:00
}
}
2023-04-06 08:56:52 +00:00
/**
* Returns the current token
*
* @returns {string}
*/
export async function getCurrentToken() {
2023-04-24 10:46:06 +00:00
let data = await models.clientConfig.findOne();
return data.currentToken
}
2023-05-08 10:18:14 +00:00
/**
* Check the floriday data config
*/
export async function checkConfig() {
const spinner = ora(`Checking config...`).start();
const excludedEnvVars = ['VSCODE_GIT_ASKPASS_EXTRA_ARGS'];
const requiredEnvVars = Object.keys(env);
const filteredEnvVars = requiredEnvVars.filter(reqEnvVar => !excludedEnvVars.includes(reqEnvVar));
for (const reqEnvVar of filteredEnvVars) {
if (!process.env[reqEnvVar]) {
spinner.fail();
throw new Error(`You haven't provided the ${reqEnvVar} environment variable`);
}
}
2023-05-08 11:02:31 +00:00
const clientConfigData = await models.clientConfig.findOne();
if (!clientConfigData)
await updateClientConfig(env.CLIENT_ID, env.CLIENT_SECRET);
2023-05-08 10:18:14 +00:00
spinner.succeed();
}
2023-04-24 10:46:06 +00:00
2023-04-06 08:56:52 +00:00
/**
* Returns the expiration data of current token
*
* @returns {string}
*/
export async function getCurrentTokenExpiration() {
2023-04-24 10:46:06 +00:00
let data = await models.clientConfig.findOne();
return data.tokenExpiration
}
/**
2023-04-06 08:56:52 +00:00
* Updates the Access Token in the client config table
*
* @param {String} clientId
* @param {String} clientSecret
* @param {String} accessToken
* @param {String} tokenExpirationDate
*/
export async function updateClientConfig(clientId, clientSecret, accessToken, tokenExpirationDate) {
2023-05-05 09:48:44 +00:00
try {
const spinner = ora(`Updating token...`).start();
if (!JSON.parse(process.env.USE_SECRETS_DB))
clientId = clientSecret = null
await models.clientConfig.upsert({
id: 1,
clientId: clientId,
clientSecret: clientSecret,
currentToken: accessToken,
tokenExpiration: tokenExpirationDate
});
spinner.succeed();
} catch (error) {
spinner.fail();
console.log('There was a error while updating the client config');
console.log(error);
}
}
2023-01-11 12:13:22 +00:00
/**
* pauses the execution of the script for the given amount of milliseconds
*
* @param {integer} ms
* @returns A promise that resolves after ms milliseconds.
*/
export async function sleep(ms) {
2023-04-24 10:46:06 +00:00
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
2023-01-11 12:13:22 +00:00
}
2023-01-16 13:52:08 +00:00
/**
* Recieves an array of functions and executes them in a queue with the given concurrency
*
* @param {Array} fnArray
* @param {Number} concurrency
* @returns
*/
export async function asyncQueue(fnArray, concurrency = 1) {
2023-01-16 13:52:08 +00:00
2023-04-24 10:46:06 +00:00
const results = []; // 1
2023-01-16 13:52:08 +00:00
2023-04-24 10:46:06 +00:00
const queue = fnArray.map((fn, index) => () => fn().then((result) => results[index] = result));
2023-01-16 13:52:08 +00:00
2023-04-24 10:46:06 +00:00
const run = async () => { // 2
const fn = queue.shift();
if (fn) {
await fn();
await run();
}
};
2023-01-16 13:52:08 +00:00
2023-04-24 10:46:06 +00:00
const promises = []; // 3
while (concurrency--) { // 4
promises.push(run());
}
2023-01-16 13:52:08 +00:00
2023-04-24 10:46:06 +00:00
await Promise.all(promises); // 5
2023-01-24 12:51:44 +00:00
2023-04-24 10:46:06 +00:00
return results;
2023-01-16 13:52:08 +00:00
}
// 1. Create an array of functions that will be executed in a queue
// 2. Create a function that will execute the functions in the queue
// 3. Create an array of promises that will execute the run function
// 4. Execute the run function while the concurrency is greater than 0
// 5. Return the results
2023-01-11 12:13:22 +00:00
/**
2023-02-03 12:56:34 +00:00
* Syncs the sequence number for the given model
* if no params are given it will reset all the sequence number to 0
2023-01-11 12:13:22 +00:00
*
2023-02-03 12:56:34 +00:00
* @param {Number} current - current sequence number
* @param {String} model - model name
* @param {Number} maximumSequenceNumber - maximum sequence number
* @returns
2023-01-11 12:13:22 +00:00
*/
export async function syncSequence(current = 0, model = null , maximumSequenceNumber = 0){
2023-04-24 10:46:06 +00:00
if (model == null && current == 0){
try {
const spinner = ora(`Syncing sequence...`).start();
let mockModels = [
'suppliers',
'tradeItems',
'supplyLines',
];
let i = 1;
for (let mockModel in mockModels) {
spinner.text = `Syncing ${i++} sequences...`
const element = mockModels[mockModel];
await syncSequence(0, element);
}
spinner.succeed();
} catch (err) {
spinner.fail();
throw new Error(err);
}
} else if (current) {
let tx = await models.sequelize.transaction();
try {
let sequence = await models.sequenceNumber.findOrCreate({
where: {
model: model
},
defaults: {
model: model,
sequenceNumber: current,
maximumSequenceNumber: maximumSequenceNumber
},
transaction: tx
});
if (sequence[1] == false){
await models.sequenceNumber.update({
sequenceNumber: current,
maximumSequenceNumber: maximumSequenceNumber
}, {
where: {
model: model
},
transaction: tx
});
}
await tx.commit();
} catch (error) {
await tx.rollback();
console.log(`Error while syncing sequence number for: ${model}: ${error}`);
}
}
}
export async function syncSuppliers(){
2023-04-24 10:46:06 +00:00
let spinner = ora('Preparing to load suppliers...').start();
try {
let headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${await getCurrentToken()}`,
'X-Api-Key': process.env.API_KEY,
2023-04-24 10:46:06 +00:00
};
const response = await fetch(`${env.API_URL}/organizations/current-max-sequence`, {
2023-04-24 10:46:06 +00:00
method: 'GET',
headers,
2023-04-24 10:46:06 +00:00
});
if (!response.ok) {
spinner.fail();
criticalError(new Error(`Max sequence request failed with status: ${response.status} - ${response.statusText}`));
}
const maxSequenceNumber = await response.json();
let timeFinish, timeToGoSec, timeToGoMin, timeLeft;
for (let curSequenceNumber = 0; curSequenceNumber <= maxSequenceNumber; curSequenceNumber++) {
let timeStart = new moment();
let query = `${env.API_URL}/organizations/sync/${curSequenceNumber}?organizationType=SUPPLIER`;
2023-04-24 10:46:06 +00:00
let response = await fetch(query, {
method: 'GET',
headers
});
let data = await response.json();
2023-04-24 10:46:06 +00:00
let suppliers = data.results;
for (let supplier of suppliers) {
curSequenceNumber = supplier.sequenceNumber;
spinner.text = `Syncing suppliers, ${maxSequenceNumber - curSequenceNumber} are missing`
if (timeFinish)
spinner.text = spinner.text + ` (${timeLeft})`
await models.supplier.upsert({
2023-05-09 09:59:21 +00:00
supplierOrganizationId: supplier.organizationId,
2023-04-24 10:46:06 +00:00
sequenceNumber: supplier.sequenceNumber,
2023-05-09 09:59:21 +00:00
companyGln: supplier.companyGln ? supplier.companyGln : null,
name: supplier.name ? supplier.name : null,
commercialName: supplier.commercialName ? supplier.commercialName : null,
email: supplier.email ? supplier.email : null,
phone: supplier.phone ? supplier.phone : null,
website: supplier.website ? supplier.website : null,
rfhRelationId: supplier.rfhRelationId ? supplier.rfhRelationId : null,
paymentProviders: supplier.paymentProviders.length ? `${supplier.paymentProviders}` : null,
endDate: supplier.endDate ? supplier.endDate : null,
mailingAddress: supplier.mailingAddress ? supplier.mailingAddress : null,
physicalAddress: supplier.physicalAddress ? supplier.physicalAddress : null,
2023-04-24 10:46:06 +00:00
});
};
2023-04-24 10:46:06 +00:00
await syncSequence(curSequenceNumber, 'suppliers', maxSequenceNumber);
timeFinish = new moment();
timeToGoSec = (timeFinish.diff(timeStart, 'seconds') * (maxSequenceNumber - curSequenceNumber) / 1000)
timeToGoMin = Math.trunc(timeToGoSec / 60)
if (!timeToGoMin)
timeLeft = `${Math.trunc(timeToGoSec)} sec`
else
timeLeft = `${timeToGoMin} min`
}
spinner.text = `Syncing suppliers...`;
2023-04-24 10:46:06 +00:00
spinner.succeed()
}
catch (err) {
spinner.fail();
throw new Error(err);
}
2023-01-24 12:51:44 +00:00
}
2023-04-06 08:56:52 +00:00
export async function syncConn(){
2023-04-24 10:46:06 +00:00
const spinner = ora(`Syncing connections...`).start();
try {
let connections = await models.connection.findAll();
let headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${await getCurrentToken()}`,
'X-Api-Key': process.env.API_KEY
};
let remoteConnections = await fetch(`${env.API_URL}/connections`, {
2023-04-24 10:46:06 +00:00
method: 'GET',
headers
});
remoteConnections = await remoteConnections.json();
let i = 1;
for (let connection of connections){
spinner.text = `Syncing ${i++} connections...`
2023-05-05 09:48:44 +00:00
if (connection.isConnected == false)
2023-04-24 10:46:06 +00:00
continue;
2023-05-09 09:59:21 +00:00
let remoteConnection = remoteConnections.find(remoteConnection => remoteConnection == connection.supplierOrganizationId);
2023-04-24 10:46:06 +00:00
if (remoteConnection == undefined){
console.log('Connection: ', connection, 'does not exist in the remote server');
console.log('Creating remote connection');
2023-05-09 09:59:21 +00:00
await fetch(`${env.API_URL}/connections/${connection.supplierOrganizationId}`, {
2023-04-24 10:46:06 +00:00
method: 'PUT',
headers
});
await models.connection.update({ isConnected: true }, {
where: {
2023-05-09 09:59:21 +00:00
supplierOrganizationId: connection.supplierOrganizationId
2023-04-24 10:46:06 +00:00
}
});
await models.supplier.update({ isConnected: true }, {
where: {
2023-05-09 09:59:21 +00:00
supplierOrganizationId: connection.supplierOrganizationId
2023-04-24 10:46:06 +00:00
}
});
} else {
await models.connection.update({ isConnected: true }, {
where: {
2023-05-09 09:59:21 +00:00
supplierOrganizationId: connection.supplierOrganizationId
2023-04-24 10:46:06 +00:00
}
});
await models.supplier.update({ isConnected: true }, {
where: {
2023-05-09 09:59:21 +00:00
supplierOrganizationId: connection.supplierOrganizationId
2023-04-24 10:46:06 +00:00
}
});
}
}
spinner.succeed();
} catch (err) {
spinner.fail();
throw new Error(err);
}
2023-02-10 09:42:54 +00:00
}
export async function syncTradeItems(){
2023-04-24 10:46:06 +00:00
const spinner = ora(`Syncing trade items...`).start();
const suppliers = await models.supplier.findAll();
let i = 1;
for (let supplier of suppliers) {
if (!supplier.isConnected) continue;
2023-05-09 09:59:21 +00:00
let query = `${env.API_URL}/trade-items?supplierOrganizationId=${supplier.supplierOrganizationId}`;
2023-04-24 10:46:06 +00:00
let headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${await getCurrentToken()}`,
'X-Api-Key': process.env.API_KEY
};
try {
let request = await fetch(query, {
method: 'GET',
headers
});
let tradeItems = await request.json();
if (!tradeItems.length)
continue;
for (let tradeItem of tradeItems) {
await insertItem(tradeItem, supplier);
2023-05-08 12:55:18 +00:00
spinner.text = `Syncing ${i++} trade items...`
2023-04-24 10:46:06 +00:00
};
2023-05-08 12:55:18 +00:00
} catch (err) {
2023-04-24 10:46:06 +00:00
spinner.fail();
2023-05-08 12:55:18 +00:00
throw err;
2023-04-24 10:46:06 +00:00
}
}
spinner.succeed()
2023-01-16 13:52:08 +00:00
}
2023-02-14 13:36:05 +00:00
/**
2023-05-09 09:59:21 +00:00
* Syncs the supply lines for suppliers that are connected to do this,
* it fetches all the supply lines for every tradeitem of the suppliers
2023-02-14 13:36:05 +00:00
*/
export async function syncSupplyLines(){
2023-04-24 10:46:06 +00:00
try {
let currentSequenceNumber = await models.sequenceNumber.findOne({ // TODO: Mirar como manejar este error
where: {
model: 'supplyLines'
}
});
2023-05-08 11:02:31 +00:00
const spinner = ora(`Syncing supply lines...`).start();
2023-04-24 10:46:06 +00:00
let suppliers = await models.supplier.findAll({
where: {
isConnected: true
}
});
let tradeItems = await models.tradeItem.findAll({
where: {
2023-05-09 09:59:21 +00:00
supplierOrganizationId: suppliers.map(supplier => supplier.supplierOrganizationId)
2023-04-24 10:46:06 +00:00
}
});
let promises = [];
let headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${await getCurrentToken()}`,
'X-Api-Key': process.env.API_KEY
};
// Launch a promise for each supplier
2023-05-09 09:59:21 +00:00
for (let tradeItem of tradeItems) {
let supplier = suppliers.find(supplier => supplier.supplierOrganizationId == tradeItem.supplierOrganizationId);
2023-04-24 10:46:06 +00:00
let promise = new Promise(async (resolve) => {
try {
let url = `${env.API_URL}/supply-lines/sync/0`
2023-04-24 10:46:06 +00:00
const params = new URLSearchParams({
2023-05-09 09:59:21 +00:00
supplierOrganizationId: supplier.supplierOrganizationId,
2023-04-24 10:46:06 +00:00
tradeItemId: tradeItem.tradeItemId,
postFilterSelectedTradeItems: false
});
let request = await fetch(`${url}?${params.toString()}`, {
2023-04-24 10:46:06 +00:00
method: 'GET',
headers
});
2023-05-09 09:59:21 +00:00
if (request.status == 429) { // Too many request
resolve([]);
return;
}
2023-04-24 10:46:06 +00:00
let supplyLines = await request.json();
2023-05-09 09:59:21 +00:00
if (!supplyLines.results.length) {
2023-04-24 10:46:06 +00:00
resolve([]);
return;
}
resolve(supplyLines);
2023-05-09 09:59:21 +00:00
} catch (err) {
2023-04-24 10:46:06 +00:00
console.log('Error while syncing supply lines for: ', supplier.commercialName, ' - ' , tradeItem.name);
2023-05-09 09:59:21 +00:00
console.log(err);
2023-04-24 10:46:06 +00:00
resolve([]);
}
});
promises.push(promise);
}
let supplyLines = await Promise.all(promises);
let maximumSequenceNumber;
2023-05-09 09:59:21 +00:00
2023-04-24 10:46:06 +00:00
for (let supplyLine of supplyLines) {
maximumSequenceNumber = supplyLine.maximumSequenceNumber;
supplyLine = supplyLine.results;
try {
2023-05-09 09:59:21 +00:00
if (supplyLine) {
for (let line of supplyLine) {
2023-04-24 10:46:06 +00:00
2023-05-09 09:59:21 +00:00
let tradeItem = await models.tradeItem.findOne({
2023-04-24 10:46:06 +00:00
where: {
tradeItemId: line.tradeItemId
}
});
2023-05-09 09:59:21 +00:00
2023-04-24 10:46:06 +00:00
if (!tradeItem) {
console.log('Trade item not found for supply line: ', line.supplyLineId);
2023-05-09 09:59:21 +00:00
console.log('Requesting data for trade item id: ', line.tradeItemId);
let queryTradeItem = await fetch(`${env.API_URL}/trade-items?tradeItemIds=${line.tradeItemId}`, {
method: 'GET',
headers
});
let tradeItem = await queryTradeItem.json();
if (tradeItem.length == 0) {
console.log('Trade item not found for supply line: ', line.supplyLineId);
console.log('Trade item id: ', line.tradeItemId);
continue;
}
let supplier = await models.supplier.findOne({
where: {
supplierOrganizationId: tradeItem[0].supplierOrganizationId
}
});
await insertItem(tradeItem[0], supplier);
tradeItem = await models.tradeItem.findOne({
where: {
tradeItemId: line.tradeItemId
}
});
if (!tradeItem) {
console.log('Trade item not found for supply line: ', line.supplyLineId);
console.log('Trade item id: ', line.tradeItemId);
continue;
}
2023-04-24 10:46:06 +00:00
}
2023-05-09 09:59:21 +00:00
await models.supplyLine.upsert({
supplyLineId: line.supplyLineId,
status: line.status,
supplierOrganizationId: line.supplierOrganizationId,
pricePerPiece_currency: line.pricePerPiece.currency,
pricePerPiece_value: line.pricePerPiece.value,
numberOfPieces: line.numberOfPieces,
deliveryPeriod_startDateTime: line.deliveryPeriod.startDateTime,
deliveryPeriod_endDateTime: line.deliveryPeriod.endDateTime,
orderPeriod_startDateTime: line.orderPeriod.startDateTime,
orderPeriod_endDateTime: line.orderPeriod.endDateTime,
warehouseId: line.warehouseId,
sequenceNumber: line.sequenceNumber,
type: line.type,
isDeleted: line.isDeleted,
salesUnit: line.salesUnit,
agreementReference_code: line.agreementReference.code ? line.agreementReference.code : null,
agreementReference_description: line.agreementReference.description ? line.agreementReference.description : null,
isLimited: line.isLimited,
isCustomerSpecific: line.isCustomerSpecific,
tradeItemId: line.tradeItemId,
});
2023-04-24 10:46:06 +00:00
}
}
} catch (err) {
spinner.fail();
2023-05-09 09:59:21 +00:00
throw err;
2023-04-24 10:46:06 +00:00
}
}
spinner.succeed();
console.log('Found', suppliers.length, 'connected suppliers');
2023-05-09 09:59:21 +00:00
await syncSequence(currentSequenceNumber, 'supplyLines' ,maximumSequenceNumber);
2023-04-24 10:46:06 +00:00
} catch (err) {
2023-05-09 09:59:21 +00:00
throw err;
2023-04-24 10:46:06 +00:00
}
2023-02-10 09:42:54 +00:00
}
export async function insertItem(tradeItem, supplier) {
2023-04-24 10:46:06 +00:00
try {
// Temporal connection to all suppliers that have trade items
let currentSupp = await models.supplier.findOne({
where: {
2023-05-09 09:59:21 +00:00
supplierOrganizationId: tradeItem.supplierOrganizationId
2023-04-24 10:46:06 +00:00
}
});
currentSupp.isConnected = true;
2023-05-08 12:55:18 +00:00
let tx = await models.sequelize.transaction();
2023-04-24 10:46:06 +00:00
await currentSupp.save({transaction: tx});
await models.connection.upsert({
2023-05-09 09:59:21 +00:00
supplierOrganizationId: tradeItem.supplierOrganizationId,
2023-04-24 10:46:06 +00:00
connect: true,
}, {transaction: tx});
// -----
await models.tradeItem.upsert({
tradeItemId: tradeItem.tradeItemId,
supplierOrganizationId: tradeItem.supplierOrganizationId,
code: tradeItem.code,
gtin: tradeItem.gtin,
vbnProductCode: tradeItem.vbnProductCode,
name: tradeItem.name,
isDeleted: tradeItem.isDeleted,
sequenceNumber: tradeItem.sequenceNumber,
tradeItemVersion: tradeItem.tradeItemVersion,
isCustomerSpecific: tradeItem.isCustomerSpecific,
isHiddenInCatalog: tradeItem.isHiddenInCatalog,
},
{transaction: tx});
let characteristics = tradeItem.characteristics;
for (let characteristic of characteristics) {
await models.characteristic.upsert({
vbnCode: characteristic.vbnCode,
vbnValueCode: characteristic.vbnValueCode,
2023-05-09 09:59:21 +00:00
tradeItemId: tradeItem.tradeItemId,
2023-04-24 10:46:06 +00:00
}, {transaction: tx});
}
let seasonalPeriods = tradeItem.seasonalPeriods;
for (let seasonalPeriod of seasonalPeriods) {
await models.seasonalPeriod.upsert({
startWeek: seasonalPeriod.startWeek,
endWeek: seasonalPeriod.endWeek,
2023-05-09 09:59:21 +00:00
tradeItemId: tradeItem.tradeItemId,
2023-04-24 10:46:06 +00:00
}, {transaction: tx});
}
let photos = tradeItem.photos;
2023-05-08 12:55:18 +00:00
for (let photo of photos)
2023-04-24 10:46:06 +00:00
await models.photo.upsert({
id: photo.id,
url: photo.url,
type: photo.type,
primary: photo.primary,
2023-05-09 09:59:21 +00:00
tradeItemId: tradeItem.tradeItemId,
2023-04-24 10:46:06 +00:00
}, {transaction: tx});
let packingConfigurations = tradeItem.packingConfigurations;
for (let packingConfiguration of packingConfigurations) {
let uuid = uuidv4();
await models.packingConfiguration.upsert({
packingConfigurationId: uuid,
piecesPerPackage: packingConfiguration.piecesPerPackage,
bunchesPerPackage: packingConfiguration.bunchesPerPackage,
photoUrl: packingConfiguration.photoUrl,
packagesPerLayer: packingConfiguration.packagesPerLayer,
layersPerLoadCarrier: packingConfiguration.layersPerLoadCarrier,
additionalPricePerPiece : JSON.stringify(packingConfiguration.additionalPricePerPiece),
transportHeightInCm: packingConfiguration.transportHeightInCm,
loadCarrierType: packingConfiguration.loadCarrierType,
isPrimary: packingConfiguration.isPrimary,
2023-05-09 09:59:21 +00:00
tradeItemId: tradeItem.tradeItemId,
2023-04-24 10:46:06 +00:00
}, {transaction: tx});
2023-05-08 12:55:18 +00:00
2023-04-24 10:46:06 +00:00
await models.package.upsert({
vbnPackageCode: packingConfiguration.package.vbnPackageCode,
customPackageId: packingConfiguration.package.customPackageId,
packingConfigurationFk: uuid,
}, {transaction: tx});
}
let countryOfOriginIsoCodes = tradeItem.countryOfOriginIsoCodes;
countryOfOriginIsoCodes ??= 0;
for (let countryOfOriginIsoCode of countryOfOriginIsoCodes) {
await models.countryOfOriginIsoCode.upsert({
isoCode: countryOfOriginIsoCode,
2023-05-09 09:59:21 +00:00
tradeItemId: tradeItem.tradeItemId,
2023-04-24 10:46:06 +00:00
}, {transaction: tx});
}
let botanicalNames = tradeItem.botanicalNames;
for (let botanicalName of botanicalNames) {
await models.botanicalName.upsert({
name: botanicalName.name,
2023-05-09 09:59:21 +00:00
tradeItemId: tradeItem.tradeItemId,
2023-04-24 10:46:06 +00:00
}, {transaction: tx});
}
await tx.commit();
} catch (error) {
await tx.rollback();
console.log('Error while syncing trade items for: ', supplier.commercialName);
console.log(error);
}
2023-02-14 12:34:54 +00:00
}
/**
* Throw critical error
*
* @param {err}
**/
export async function criticalError(err) {
2023-05-05 09:48:44 +00:00
console.log(chalk.red.bold(`[CRITICAL]`), chalk.red(`${err.message}`));
2023-04-24 10:46:06 +00:00
process.exit();
}