refs #4823 Added clockPresalesSupply

This commit is contained in:
Guillermo Bonet 2023-05-30 11:22:39 +02:00
parent f4be5fbc09
commit 52d2e783c8
4 changed files with 156 additions and 2 deletions

View File

@ -58,7 +58,8 @@ class Floriday {
await utils.syncConnections(); await utils.syncConnections();
await utils.syncSupplyLines(); await utils.syncSupplyLines();
// ------------------------ // Deshabilitado porque no hay de momento
// await utils.syncClockPresalesSupply();
} catch (err) { } catch (err) {
if (err.name === 'SequelizeConnectionRefusedError') throw err; if (err.name === 'SequelizeConnectionRefusedError') throw err;

View File

@ -36,6 +36,7 @@ import sequenceNumber from './config/sequenceNumber.js';
// Supply Line Models // Supply Line Models
import supplyLine from './supplyLine/supplyLine.js'; import supplyLine from './supplyLine/supplyLine.js';
import volumePrices from './supplyLine/volumePrices.js'; import volumePrices from './supplyLine/volumePrices.js';
import clockPresalesSupply from './supplyLine/clockPresalesSupply.js';
// Organization Models // Organization Models
import organization from './organization/organization.js'; import organization from './organization/organization.js';
@ -69,6 +70,7 @@ let models = {
seasonalPeriod: seasonalPeriod(sequelize), seasonalPeriod: seasonalPeriod(sequelize),
supplyLine: supplyLine(sequelize), supplyLine: supplyLine(sequelize),
volumePrices: volumePrices(sequelize), volumePrices: volumePrices(sequelize),
clockPresalesSupply: clockPresalesSupply(sequelize),
package: packageModel(sequelize), package: packageModel(sequelize),
}; };
@ -137,6 +139,18 @@ try {
foreignKey: 'organizationId', foreignKey: 'organizationId',
targetKey: 'organizationId', targetKey: 'organizationId',
}); });
models.clockPresalesSupply.belongsTo(models.supplyLine, {
foreignKey: 'supplyLineId',
targetKey: 'supplyLineId',
});
models.clockPresalesSupply.belongsTo(models.tradeItem, {
foreignKey: 'tradeItemId',
targetKey: 'tradeItemId',
});
models.clockPresalesSupply.belongsTo(models.organization, {
foreignKey: 'organizationId',
targetKey: 'organizationId',
});
} catch (err) { } catch (err) {
criticalError(err); criticalError(err);
} }

View File

@ -0,0 +1,63 @@
import { Sequelize } from 'sequelize';
const clockPresalesSupply = {
supplyLineId: {
type: Sequelize.STRING,
primaryKey: true,
},
status: {
type: Sequelize.STRING,
},
tradeItemId: {
type: Sequelize.STRING,
},
pricePerPiece_currency: {
type: Sequelize.STRING,
},
pricePerPiece_value: {
type: Sequelize.DECIMAL(10,2),
},
deliveryNoteReference: {
type: Sequelize.STRING,
},
numberOfPieces: {
type: Sequelize.INTEGER,
},
packingConfigurations: {
type: Sequelize.JSON,
},
tradePeriod_startDateTime: {
type: Sequelize.DATE,
},
tradePeriod_endDateTime: {
type: Sequelize.DATE,
},
organizationId: {
type: Sequelize.STRING,
},
tradeInstrument: {
type: Sequelize.STRING,
},
salesChannel: {
type: Sequelize.STRING,
},
sequenceNumber: {
type: Sequelize.INTEGER,
},
creationDateTime: {
type: Sequelize.DATE,
},
lastModifiedDateTime: {
type: Sequelize.DATE,
},
};
export default (sequelize) => {
return sequelize.define(
'supplyLine_clockPresalesSupply',
clockPresalesSupply, {
timestamps: false,
freezeTableName: true,
}
);
};

View File

@ -1,4 +1,5 @@
import { models } from './models/sequelize.js'; import { models } from './models/sequelize.js';
import { Op } from 'sequelize';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import axios from 'axios'; import axios from 'axios';
import moment from 'moment'; import moment from 'moment';
@ -323,6 +324,58 @@ export async function syncSupplyLines() {
} }
} }
/**
* Sync the lock presales supply for supply lines of today.
*/
export async function syncClockPresalesSupply() {
const spinner = ora(`Syncing clock presales supply...`).start();
const supplyLines = await models.supplyLine.findAll({
attributes: ['supplyLineId'],
where: {
lastSync: {
[Op.between]: [moment().startOf('day').toDate(), moment().endOf('day').toDate()]
}
}
});
let i = 0, x = 1;
for (let supplyLine of supplyLines) {
spinner.text = `Syncing ${i} clock presales supplies of [${x++}|${supplyLines.length}] supply lines...`
try {
let response = await vnRequest('GET', `${env.API_URL}/auction/clock-presales-supply/${supplyLine.supplyLineId}`, null, null, spinner)
if (response.response.status == 404) continue; // Not Found
const clockPresalesSupplies = response.data;
for (let clockPresalesSupply of clockPresalesSupplies) {
// Check if the organization exists, and if it doesn't, create it
let organization = await models.organization.findOne({
where: { organizationId: clockPresalesSupply.supplierOrganizationId }
});
if (!organization) {
let organization = (await vnRequest('GET', `${env.API_URL}/organizations/${clockPresalesSupply.supplierOrganizationId}`, null, null, spinner)).data;
await insertOrganization(organization);
}
// Check if the trade item exists, and if it doesn't, create it
let tradeItem = await models.tradeItem.findOne({
where: { tradeItemId: clockPresalesSupply.tradeItemId }
});
if (!tradeItem) {
let tradeItem = (await vnRequest('GET', `${env.API_URL}/trade-items/${clockPresalesSupply.tradeItemId}`, null, null, spinner)).data;
await insertItem(tradeItem);
}
await insertClockPresalesSupply(clockPresalesSupply);
spinner.text = `Syncing ${i++} clock presales supplies of [${x}|${supplyLines.length}] supply lines...`
};
} catch (err) {
spinner.fail();
throw err;
}
}
spinner.succeed()
}
/** /**
* Insert trade item and dependences in the database. * Insert trade item and dependences in the database.
* *
@ -415,6 +468,27 @@ export async function insertItem(tradeItem) {
} }
} }
/**
* Insert clock presales supply in the database.
*
* @param {Array} clockPresalesSupply
*/
export async function insertClockPresalesSupply(clockPresalesSupply) {
const tx = await models.sequelize.transaction();
try {
await models.clockPresalesSupply.upsert({
...clockPresalesSupply,
pricePerPiece_currency: clockPresalesSupply.pricePerPiece.currency,
pricePerPiece_value: clockPresalesSupply.pricePerPiece.value,
organizationId: clockPresalesSupply.supplierOrganizationId,
});
await tx.commit();
} catch (err) {
await tx.rollback();
throw err;
}
}
/** /**
* Insert warehouse in the database. * Insert warehouse in the database.
* *
@ -561,6 +635,8 @@ export async function vnRequest(method, url, data, headers, spinner) {
case 'ECONNREFUSED': case 'ECONNREFUSED':
case 'ERR_BAD_REQUEST': case 'ERR_BAD_REQUEST':
switch (err.response.status) { switch (err.response.status) {
case 404: // Not found
return err;
case 504: case 504:
case 502: case 502:
if (spinner) spinner.warn(); if (spinner) spinner.warn();
@ -571,7 +647,7 @@ export async function vnRequest(method, url, data, headers, spinner) {
case 429: // Too Many Requests case 429: // Too Many Requests
if (spinner) spinner.warn(); if (spinner) spinner.warn();
warning(err); warning(err);
await sleep(30000); await sleep(60000);
if (spinner) spinner.start(); if (spinner) spinner.start();
break; break;
case 401: // Unauthorized case 401: // Unauthorized