diff --git a/CHANGELOG.md b/CHANGELOG.md
index a3e1ef4a15..e89f394b07 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,13 +8,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2316.01] - 2023-05-04
### Added
--
-
-### Changed
-
+### Changed
+- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
+
### Fixed
--
+-
+
## [2314.01] - 2023-04-20
diff --git a/back/methods/image/upload.js b/back/methods/image/upload.js
index 143da275e6..1de0064f6a 100644
--- a/back/methods/image/upload.js
+++ b/back/methods/image/upload.js
@@ -1,7 +1,6 @@
const UserError = require('vn-loopback/util/user-error');
-const fs = require('fs-extra');
+const fs = require('fs/promises');
const path = require('path');
-const uuid = require('uuid');
module.exports = Self => {
Self.remoteMethodCtx('upload', {
@@ -36,7 +35,7 @@ module.exports = Self => {
const fileOptions = {};
const args = ctx.args;
- let srcFile;
+ let tempFilePath;
try {
const hasWriteRole = await models.ImageCollection.hasWriteRole(ctx, args.collection);
if (!hasWriteRole)
@@ -53,15 +52,20 @@ module.exports = Self => {
});
const file = await TempContainer.getFile(tempContainer.name, uploadedFile.name);
- srcFile = path.join(file.client.root, file.container, file.name);
+ tempFilePath = path.join(file.client.root, file.container, file.name);
- const fileName = `${uuid.v4()}.png`;
- await models.Image.registerImage(args.collection, srcFile, fileName, args.id);
- } catch (e) {
- if (fs.existsSync(srcFile))
- await fs.unlink(srcFile);
+ const fileName = `${args.id}.png`;
- throw e;
+ await models.Image.resize({
+ collectionName: args.collection,
+ srcFile: tempFilePath,
+ fileName: fileName,
+ entityId: args.id
+ });
+ } finally {
+ try {
+ await fs.unlink(tempFilePath);
+ } catch (error) { }
}
};
};
diff --git a/back/model-config.json b/back/model-config.json
index 91061eb32e..c930d979fa 100644
--- a/back/model-config.json
+++ b/back/model-config.json
@@ -131,9 +131,6 @@
"UserConfigView": {
"dataSource": "vn"
},
- "UserLog": {
- "dataSource": "vn"
- },
"Warehouse": {
"dataSource": "vn"
},
diff --git a/back/models/image.js b/back/models/image.js
index 3d3b03879f..61c6199b8e 100644
--- a/back/models/image.js
+++ b/back/models/image.js
@@ -1,161 +1,110 @@
const fs = require('fs-extra');
-const sharp = require('sharp');
const path = require('path');
-const readChunk = require('read-chunk');
-const imageType = require('image-type');
-const bmp = require('bmp-js');
+const gm = require('gm');
module.exports = Self => {
require('../methods/image/download')(Self);
require('../methods/image/upload')(Self);
- // Function extracted from jimp package (utils)
- function scan(image, x, y, w, h, f) {
- // round input
- x = Math.round(x);
- y = Math.round(y);
- w = Math.round(w);
- h = Math.round(h);
-
- for (let _y = y; _y < y + h; _y++) {
- for (let _x = x; _x < x + w; _x++) {
- const idx = (image.bitmap.width * _y + _x) << 2;
- f.call(image, _x, _y, idx);
- }
- }
-
- return image;
- }
-
- // Function extracted from jimp package (type-bmp)
- function fromAGBR(bitmap) {
- return scan({bitmap}, 0, 0, bitmap.width, bitmap.height, function(
- x,
- y,
- index
- ) {
- const alpha = this.bitmap.data[index + 0];
- const blue = this.bitmap.data[index + 1];
- const green = this.bitmap.data[index + 2];
- const red = this.bitmap.data[index + 3];
-
- this.bitmap.data[index + 0] = red;
- this.bitmap.data[index + 1] = green;
- this.bitmap.data[index + 2] = blue;
- this.bitmap.data[index + 3] = bitmap.is_with_alpha ? alpha : 0xff;
- }).bitmap;
- }
-
- Self.registerImage = async(collectionName, srcFilePath, fileName, entityId) => {
+ Self.resize = async function({collectionName, srcFile, fileName, entityId}) {
const models = Self.app.models;
- const tx = await Self.beginTransaction({});
- const myOptions = {transaction: tx};
- try {
- const collection = await models.ImageCollection.findOne({
+ const collection = await models.ImageCollection.findOne(
+ {
fields: [
'id',
- 'name',
'maxWidth',
'maxHeight',
'model',
- 'property'
+ 'property',
],
where: {name: collectionName},
include: {
relation: 'sizes',
scope: {
- fields: ['width', 'height', 'crop']
- }
- }
- }, myOptions);
+ fields: ['width', 'height', 'crop'],
+ },
+ },
+ }
+ );
- const data = {
+ // Insert image row
+ await models.Image.upsertWithWhere(
+ {
name: fileName,
collectionFk: collectionName
- };
- const newImage = await Self.upsertWithWhere(data, {
+ },
+ {
name: fileName,
collectionFk: collectionName,
- updated: Date.vnNow()
- }, myOptions);
-
- // Resizes and saves the image
- const container = await models.ImageContainer.container(collectionName);
- const rootPath = container.client.root;
- const collectionDir = path.join(rootPath, collectionName);
- const dstDir = path.join(collectionDir, 'full');
- const dstFile = path.join(dstDir, fileName);
-
- const buffer = readChunk.sync(srcFilePath, 0, 12);
- const type = imageType(buffer);
-
- let sharpOptions;
- let imgSrc = srcFilePath;
- if (type.mime == 'image/bmp') {
- const bmpBuffer = fs.readFileSync(srcFilePath);
- const bmpData = fromAGBR(bmp.decode(bmpBuffer));
- imgSrc = bmpData.data;
- sharpOptions = {
- raw: {
- width: bmpData.width,
- height: bmpData.height,
- channels: 4
- },
- failOn: 'none'
- };
+ updated: Date.vnNow() / 1000,
}
+ );
- const resizeOpts = {
- withoutEnlargement: true,
- fit: 'inside'
- };
+ // Update entity image file name
+ const model = models[collection.model];
+ if (!model) throw new Error('No matching model found');
- await fs.mkdir(dstDir, {recursive: true});
- await sharp(imgSrc, sharpOptions)
- .resize(collection.maxWidth, collection.maxHeight, resizeOpts)
- .png()
- .toFile(dstFile);
+ const entity = await model.findById(entityId);
+ if (entity) {
+ await entity.updateAttribute(
+ collection.property,
+ fileName
+ );
+ }
- const sizes = collection.sizes();
- for (let size of sizes) {
- const dstDir = path.join(collectionDir, `${size.width}x${size.height}`);
- const dstFile = path.join(dstDir, fileName);
- const resizeOpts = {
- withoutEnlargement: true,
- fit: size.crop ? 'cover' : 'inside'
- };
+ // Resize
+ const container = await models.ImageContainer.container(
+ collectionName
+ );
+ const rootPath = container.client.root;
+ const collectionDir = path.join(rootPath, collectionName);
- await fs.mkdir(dstDir, {recursive: true});
- await sharp(imgSrc, sharpOptions)
- .resize(size.width, size.height, resizeOpts)
- .png()
- .toFile(dstFile);
- }
+ // To max size
+ const {maxWidth, maxHeight} = collection;
+ const fullSizePath = path.join(collectionDir, 'full');
+ const toFullSizePath = `${fullSizePath}/${fileName}`;
- const model = models[collection.model];
+ await fs.mkdir(fullSizePath, {recursive: true});
+ await new Promise((resolve, reject) => {
+ gm(srcFile)
+ .resize(maxWidth, maxHeight, '>')
+ .setFormat('png')
+ .quality(100)
+ .write(toFullSizePath, function(err) {
+ if (err) reject(err);
+ if (!err) resolve();
+ });
+ });
- if (!model)
- throw new Error('Matching model not found');
+ // To collection sizes
+ for (const size of collection.sizes()) {
+ const {width, height} = size;
- const item = await model.findById(entityId, null, myOptions);
- if (item) {
- await item.updateAttribute(
- collection.property,
- fileName,
- myOptions
- );
- }
+ const sizePath = path.join(collectionDir, `${width}x${height}`);
+ const toSizePath = `${sizePath}/${fileName}`;
- if (fs.existsSync(srcFilePath))
- await fs.unlink(srcFilePath);
+ await fs.mkdir(sizePath, {recursive: true});
+ await new Promise((resolve, reject) => {
+ const gmInstance = gm(srcFile);
- await tx.commit();
+ if (size.crop) {
+ gmInstance
+ .resize(width, height, '^')
+ .gravity('Center')
+ .crop(width, height);
+ }
- return newImage;
- } catch (e) {
- await tx.rollback();
- throw e;
+ if (!size.crop) gmInstance.resize(width, height, '>');
+
+ gmInstance
+ .setFormat('png')
+ .quality(100)
+ .write(toSizePath, function(err) {
+ if (err) reject(err);
+ if (!err) resolve();
+ });
+ });
}
};
};
diff --git a/db/changes/230801/00-ticketConfig.sql b/db/changes/230801/00-ticketConfig.sql
new file mode 100644
index 0000000000..ca63dbf638
--- /dev/null
+++ b/db/changes/230801/00-ticketConfig.sql
@@ -0,0 +1 @@
+ALTER TABLE `vn`.`ticketConfig` ADD daysForWarningClaim INT DEFAULT 2 NOT NULL COMMENT 'dias restantes hasta que salte el aviso de reclamación fuerade plazo';
diff --git a/db/changes/231202/00-delivery.sql b/db/changes/231202/00-delivery.sql
new file mode 100644
index 0000000000..3a92691839
--- /dev/null
+++ b/db/changes/231202/00-delivery.sql
@@ -0,0 +1,74 @@
+DROP TABLE `vn`.`dmsRecover`;
+
+ALTER TABLE `vn`.`delivery` DROP FOREIGN KEY delivery_FK;
+ALTER TABLE `vn`.`delivery` DROP COLUMN addressFk;
+ALTER TABLE `vn`.`delivery` ADD ticketFk INT NOT NULL;
+ALTER TABLE `vn`.`delivery` ADD CONSTRAINT delivery_ticketFk_FK FOREIGN KEY (`ticketFk`) REFERENCES `vn`.`ticket`(`id`);
+
+DELETE FROM `salix`.`ACL` WHERE `property` = 'saveSign';
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
+ VALUES
+ ('Ticket','saveSign','WRITE','ALLOW','employee');
+
+DROP PROCEDURE IF EXISTS vn.route_getTickets;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`route_getTickets`(vRouteFk INT)
+BEGIN
+/**
+ * Pasado un RouteFk devuelve la información
+ * de sus tickets.
+ *
+ * @param vRouteFk
+ *
+ * @select Información de los tickets
+ */
+
+ SELECT
+ t.id Id,
+ t.clientFk Client,
+ a.id Address,
+ t.packages Packages,
+ a.street AddressName,
+ a.postalCode PostalCode,
+ a.city City,
+ sub2.itemPackingTypeFk PackingType,
+ c.phone ClientPhone,
+ c.mobile ClientMobile,
+ a.phone AddressPhone,
+ a.mobile AddressMobile,
+ d.longitude Longitude,
+ d.latitude Latitude,
+ wm.mediaValue SalePersonPhone,
+ tob.Note Note,
+ t.isSigned Signed
+ FROM ticket t
+ JOIN client c ON t.clientFk = c.id
+ JOIN address a ON t.addressFk = a.id
+ LEFT JOIN delivery d ON t.id = d.ticketFk
+ LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
+ LEFT JOIN
+ (SELECT tob.description Note, t.id
+ FROM ticketObservation tob
+ JOIN ticket t ON tob.ticketFk = t.id
+ JOIN observationType ot ON ot.id = tob.observationTypeFk
+ WHERE t.routeFk = vRouteFk
+ AND ot.code = 'delivery'
+ )tob ON tob.id = t.id
+ LEFT JOIN
+ (SELECT sub.ticketFk,
+ CONCAT('(', GROUP_CONCAT(DISTINCT sub.itemPackingTypeFk ORDER BY sub.items DESC SEPARATOR ','), ') ') itemPackingTypeFk
+ FROM (SELECT s.ticketFk , i.itemPackingTypeFk, COUNT(*) items
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id,i.itemPackingTypeFk)sub
+ GROUP BY sub.ticketFk
+ ) sub2 ON sub2.ticketFk = t.id
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id
+ ORDER BY t.priority;
+END$$
+DELIMITER ;
diff --git a/db/changes/231203/00-delivery.sql b/db/changes/231203/00-delivery.sql
new file mode 100644
index 0000000000..0815ec421f
--- /dev/null
+++ b/db/changes/231203/00-delivery.sql
@@ -0,0 +1,67 @@
+DELETE FROM `salix`.`ACL` WHERE `property` = 'saveSign';
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
+ VALUES
+ ('Ticket','saveSign','WRITE','ALLOW','employee');
+
+DROP PROCEDURE IF EXISTS vn.route_getTickets;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`route_getTickets`(vRouteFk INT)
+BEGIN
+/**
+ * Pasado un RouteFk devuelve la información
+ * de sus tickets.
+ *
+ * @param vRouteFk
+ *
+ * @select Información de los tickets
+ */
+
+ SELECT
+ t.id Id,
+ t.clientFk Client,
+ a.id Address,
+ t.packages Packages,
+ a.street AddressName,
+ a.postalCode PostalCode,
+ a.city City,
+ sub2.itemPackingTypeFk PackingType,
+ c.phone ClientPhone,
+ c.mobile ClientMobile,
+ a.phone AddressPhone,
+ a.mobile AddressMobile,
+ d.longitude Longitude,
+ d.latitude Latitude,
+ wm.mediaValue SalePersonPhone,
+ tob.Note Note,
+ t.isSigned Signed
+ FROM ticket t
+ JOIN client c ON t.clientFk = c.id
+ JOIN address a ON t.addressFk = a.id
+ LEFT JOIN delivery d ON t.id = d.ticketFk
+ LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
+ LEFT JOIN
+ (SELECT tob.description Note, t.id
+ FROM ticketObservation tob
+ JOIN ticket t ON tob.ticketFk = t.id
+ JOIN observationType ot ON ot.id = tob.observationTypeFk
+ WHERE t.routeFk = vRouteFk
+ AND ot.code = 'delivery'
+ )tob ON tob.id = t.id
+ LEFT JOIN
+ (SELECT sub.ticketFk,
+ CONCAT('(', GROUP_CONCAT(DISTINCT sub.itemPackingTypeFk ORDER BY sub.items DESC SEPARATOR ','), ') ') itemPackingTypeFk
+ FROM (SELECT s.ticketFk , i.itemPackingTypeFk, COUNT(*) items
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id,i.itemPackingTypeFk)sub
+ GROUP BY sub.ticketFk
+ ) sub2 ON sub2.ticketFk = t.id
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id
+ ORDER BY t.priority;
+END$$
+DELIMITER ;
diff --git a/db/changes/231204/00-rollbackDelivery.sql b/db/changes/231204/00-rollbackDelivery.sql
new file mode 100644
index 0000000000..d7fa6b5879
--- /dev/null
+++ b/db/changes/231204/00-rollbackDelivery.sql
@@ -0,0 +1,83 @@
+CREATE TABLE `vn`.`dmsRecover` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ticketFk` int(11) DEFAULT NULL,
+ `sign` text DEFAULT NULL,
+ `created` timestamp NULL DEFAULT current_timestamp(),
+ PRIMARY KEY (`id`),
+ KEY `ticketFk_idx` (`ticketFk`),
+ CONSTRAINT `ticketFk` FOREIGN KEY (`ticketFk`) REFERENCES `ticket` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE=InnoDB AUTO_INCREMENT=31917 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+ALTER TABLE `vn`.`delivery` ADD addressFk INT;
+
+DROP PROCEDURE IF EXISTS `vn`.`route_getTickets`;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`route_getTickets`(vRouteFk INT)
+BEGIN
+/**
+ * Pasado un RouteFk devuelve la información
+ * de sus tickets.
+ *
+ * @param vRouteFk
+ * @select Información de los tickets
+ */
+SELECT *
+ FROM (
+ SELECT t.id Id,
+ t.clientFk Client,
+ a.id Address,
+ a.nickname ClientName,
+ t.packages Packages,
+ a.street AddressName,
+ a.postalCode PostalCode,
+ a.city City,
+ sub2.itemPackingTypeFk PackingType,
+ c.phone ClientPhone,
+ c.mobile ClientMobile,
+ a.phone AddressPhone,
+ a.mobile AddressMobile,
+ d.longitude Longitude,
+ d.latitude Latitude,
+ wm.mediaValue SalePersonPhone,
+ tob.description Note,
+ t.isSigned Signed,
+ t.priority
+ FROM ticket t
+ JOIN client c ON t.clientFk = c.id
+ JOIN address a ON t.addressFk = a.id
+ LEFT JOIN delivery d ON d.addressFk = a.id
+ LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
+ LEFT JOIN(
+ SELECT tob.description, t.id
+ FROM ticketObservation tob
+ JOIN ticket t ON tob.ticketFk = t.id
+ JOIN observationType ot ON ot.id = tob.observationTypeFk
+ WHERE t.routeFk = vRouteFk
+ AND ot.code = 'delivery'
+ )tob ON tob.id = t.id
+ LEFT JOIN(
+ SELECT sub.ticketFk,
+ CONCAT('(',
+ GROUP_CONCAT(DISTINCT sub.itemPackingTypeFk
+ ORDER BY sub.items DESC SEPARATOR ','),
+ ') ') itemPackingTypeFk
+ FROM (
+ SELECT s.ticketFk, i.itemPackingTypeFk, COUNT(*) items
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id, i.itemPackingTypeFk
+ )sub
+ GROUP BY sub.ticketFk
+ )sub2 ON sub2.ticketFk = t.id
+ WHERE t.routeFk = vRouteFk
+ ORDER BY d.id DESC
+ LIMIT 10000000000000000000
+ )sub3
+ GROUP BY sub3.id
+ ORDER BY sub3.priority;
+END$$
+DELIMITER ;
diff --git a/db/changes/231401/00-hotfixDelivery.sql b/db/changes/231401/00-hotfixDelivery.sql
new file mode 100644
index 0000000000..4628cc1dba
--- /dev/null
+++ b/db/changes/231401/00-hotfixDelivery.sql
@@ -0,0 +1,70 @@
+DROP TABLE IF EXISTS `vn`.`dmsRecover`;
+
+ALTER TABLE `vn`.`delivery` DROP COLUMN addressFk;
+ALTER TABLE `vn`.`delivery` DROP CONSTRAINT delivery_ticketFk_FK;
+ALTER TABLE `vn`.`delivery` DROP COLUMN ticketFk;
+ALTER TABLE `vn`.`delivery` ADD ticketFk INT DEFAULT NULL;
+ALTER TABLE `vn`.`delivery` ADD CONSTRAINT delivery_ticketFk_FK FOREIGN KEY (`ticketFk`) REFERENCES `vn`.`ticket`(`id`);
+
+DROP PROCEDURE IF EXISTS vn.route_getTickets;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`route_getTickets`(vRouteFk INT)
+BEGIN
+/**
+ * Pasado un RouteFk devuelve la información
+ * de sus tickets.
+ *
+ * @param vRouteFk
+ *
+ * @select Información de los tickets
+ */
+
+ SELECT
+ t.id Id,
+ t.clientFk Client,
+ a.id Address,
+ t.packages Packages,
+ a.street AddressName,
+ a.postalCode PostalCode,
+ a.city City,
+ sub2.itemPackingTypeFk PackingType,
+ c.phone ClientPhone,
+ c.mobile ClientMobile,
+ a.phone AddressPhone,
+ a.mobile AddressMobile,
+ d.longitude Longitude,
+ d.latitude Latitude,
+ wm.mediaValue SalePersonPhone,
+ tob.Note Note,
+ t.isSigned Signed
+ FROM ticket t
+ JOIN client c ON t.clientFk = c.id
+ JOIN address a ON t.addressFk = a.id
+ LEFT JOIN delivery d ON t.id = d.ticketFk
+ LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
+ LEFT JOIN
+ (SELECT tob.description Note, t.id
+ FROM ticketObservation tob
+ JOIN ticket t ON tob.ticketFk = t.id
+ JOIN observationType ot ON ot.id = tob.observationTypeFk
+ WHERE t.routeFk = vRouteFk
+ AND ot.code = 'delivery'
+ )tob ON tob.id = t.id
+ LEFT JOIN
+ (SELECT sub.ticketFk,
+ CONCAT('(', GROUP_CONCAT(DISTINCT sub.itemPackingTypeFk ORDER BY sub.items DESC SEPARATOR ','), ') ') itemPackingTypeFk
+ FROM (SELECT s.ticketFk , i.itemPackingTypeFk, COUNT(*) items
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id,i.itemPackingTypeFk)sub
+ GROUP BY sub.ticketFk
+ ) sub2 ON sub2.ticketFk = t.id
+ WHERE t.routeFk = vRouteFk
+ GROUP BY t.id
+ ORDER BY t.priority;
+END$$
+DELIMITER ;
diff --git a/db/changes/231601/.gitkeep b/db/changes/231601/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/db/changes/231601/00-observationEmailACL.sql b/db/changes/231601/00-observationEmailACL.sql
new file mode 100644
index 0000000000..1a5d475e85
--- /dev/null
+++ b/db/changes/231601/00-observationEmailACL.sql
@@ -0,0 +1,3 @@
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('Defaulter', 'observationEmail', 'WRITE', 'ALLOW', 'ROLE', 'employee');
diff --git a/db/changes/231601/00-userRoleLog.sql b/db/changes/231601/00-userRoleLog.sql
new file mode 100644
index 0000000000..ae5da13cb3
--- /dev/null
+++ b/db/changes/231601/00-userRoleLog.sql
@@ -0,0 +1,4 @@
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('UserLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('RoleLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index b504244ea8..7e8b91fa1e 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -414,7 +414,7 @@ export default {
saveFieldsButton: '.vn-popover.shown vn-button[label="Save"] > button'
},
itemFixedPrice: {
- add: 'vn-fixed-price vn-icon-button[icon="add_circle"]',
+ add: 'vn-fixed-price vn-icon-button[vn-tooltip="Add fixed price"]',
firstItemID: 'vn-fixed-price tr:nth-child(2) vn-autocomplete[ng-model="price.itemFk"]',
fourthFixedPrice: 'vn-fixed-price tr:nth-child(5)',
fourthItemID: 'vn-fixed-price tr:nth-child(5) vn-autocomplete[ng-model="price.itemFk"]',
@@ -427,7 +427,18 @@ export default {
fourthEnded: 'vn-fixed-price tr:nth-child(5) vn-date-picker[ng-model="price.ended"]',
fourthDeleteIcon: 'vn-fixed-price tr:nth-child(5) > td:nth-child(9) > vn-icon-button[icon="delete"]',
orderColumnId: 'vn-fixed-price th[field="itemFk"]',
- removeWarehouseFilter: 'vn-searchbar > form > vn-textfield > div.container > div.prepend > prepend > div > span:nth-child(1) > vn-icon > i'
+ removeWarehouseFilter: 'vn-searchbar > form > vn-textfield > div.container > div.prepend > prepend > div > span:nth-child(1) > vn-icon > i',
+ generalSearchFilter: 'vn-fixed-price-search-panel vn-textfield[ng-model="$ctrl.filter.search"]',
+ reignFilter: 'vn-fixed-price-search-panel vn-horizontal.item-category vn-one',
+ typeFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="$ctrl.filter.typeFk"]',
+ buyerFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="$ctrl.filter.buyerFk"]',
+ warehouseFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="$ctrl.filter.warehouseFk"]',
+ mineFilter: 'vn-fixed-price-search-panel vn-check[ng-model="$ctrl.filter.mine"]',
+ hasMinPriceFilter: 'vn-fixed-price-search-panel vn-check[ng-model="$ctrl.filter.hasMinPrice"]',
+ addTag: 'vn-fixed-price-search-panel vn-icon-button[icon="add_circle"]',
+ tagFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="itemTag.tagFk"]',
+ tagValueFilter: 'vn-fixed-price-search-panel vn-autocomplete[ng-model="itemTag.value"]',
+ chip: 'vn-fixed-price-search-panel vn-chip > vn-icon'
},
itemCreateView: {
temporalName: 'vn-item-create vn-textfield[ng-model="$ctrl.item.provisionalName"]',
@@ -989,9 +1000,9 @@ export default {
saveButton: 'vn-worker-basic-data button[type=submit]'
},
workerNotes: {
- addNoteFloatButton: 'vn-float-button',
- note: 'vn-textarea[ng-model="$ctrl.note.text"]',
- saveButton: 'button[type=submit]',
+ addNoteFloatButton: 'vn-worker-note vn-icon[icon="add"]',
+ note: 'vn-note-worker-create vn-textarea[ng-model="$ctrl.note.text"]',
+ saveButton: 'vn-note-worker-create button[type=submit]',
firstNoteText: 'vn-worker-note .text'
},
workerPbx: {
diff --git a/e2e/paths/02-client/13_log.spec.js b/e2e/paths/02-client/13_log.spec.js
index 8f186d8427..5292b1a658 100644
--- a/e2e/paths/02-client/13_log.spec.js
+++ b/e2e/paths/02-client/13_log.spec.js
@@ -28,22 +28,4 @@ describe('Client log path', () => {
it('should navigate to the log section', async() => {
await page.accessToSection('client.card.log');
});
-
- it('should check the previous value of the last logged change', async() => {
- let lastModificationPreviousValue = await page
- .waitToGetProperty(selectors.clientLog.lastModificationPreviousValue, 'innerText');
-
- expect(lastModificationPreviousValue).toContain('DavidCharlesHaller');
- });
-
- it('should check the current value of the last logged change', async() => {
- let lastModificationPreviousValue = await page
- .waitToGetProperty(selectors.clientLog.lastModificationPreviousValue, 'innerText');
-
- let lastModificationCurrentValue = await page.
- waitToGetProperty(selectors.clientLog.lastModificationCurrentValue, 'innerText');
-
- expect(lastModificationPreviousValue).toEqual('DavidCharlesHaller');
- expect(lastModificationCurrentValue).toEqual('this is a test');
- });
});
diff --git a/e2e/paths/02-client/21_defaulter.spec.js b/e2e/paths/02-client/21_defaulter.spec.js
index 0eb16441f9..97e62abef4 100644
--- a/e2e/paths/02-client/21_defaulter.spec.js
+++ b/e2e/paths/02-client/21_defaulter.spec.js
@@ -50,7 +50,7 @@ describe('Client defaulter path', () => {
expect(message.text).toContain(`The message can't be empty`);
});
- it('shoul checked all defaulters', async() => {
+ it('should checked all defaulters', async() => {
await page.loginAndModule('insurance', 'client');
await page.accessToSection('client.defaulter');
diff --git a/e2e/paths/03-worker/08_add_notes.spec.js b/e2e/paths/03-worker/08_add_notes.spec.js
index eb2e4c041e..bdc475c90c 100644
--- a/e2e/paths/03-worker/08_add_notes.spec.js
+++ b/e2e/paths/03-worker/08_add_notes.spec.js
@@ -7,7 +7,7 @@ describe('Worker Add notes path', () => {
beforeAll(async() => {
browser = await getBrowser();
page = browser.page;
- await page.loginAndModule('employee', 'worker');
+ await page.loginAndModule('hr', 'worker');
await page.accessToSearchResult('Bruce Banner');
await page.accessToSection('worker.card.note.index');
});
diff --git a/e2e/paths/04-item/10_item_log.spec.js b/e2e/paths/04-item/10_item_log.spec.js
index 6a7bd7ae22..dc467044dc 100644
--- a/e2e/paths/04-item/10_item_log.spec.js
+++ b/e2e/paths/04-item/10_item_log.spec.js
@@ -42,23 +42,4 @@ describe('Item log path', () => {
await page.waitForSelector(selectors.itemsIndex.createItemButton);
await page.waitForState('item.index');
});
-
- it(`should search for the created item and navigate to it's log section`, async() => {
- await page.accessToSearchResult('Knowledge artifact');
- await page.accessToSection('item.card.log');
- });
-
- it(`should confirm the log is showing 4 entries`, async() => {
- await page.waitForSelector(selectors.itemLog.anyLineCreated);
- const anyLineCreatedCount = await page.countElement(selectors.itemLog.anyLineCreated);
-
- expect(anyLineCreatedCount).toEqual(4);
- });
-
- xit(`should confirm the log is showing the intrastat for the created item`, async() => {
- const fifthLineCreatedProperty = await page
- .waitToGetProperty(selectors.itemLog.fifthLineCreatedProperty, 'innerText');
-
- expect(fifthLineCreatedProperty).toEqual('05080000');
- });
});
diff --git a/e2e/paths/04-item/13_fixedPrice.spec.js b/e2e/paths/04-item/13_fixedPrice.spec.js
index ec8238b871..df3b4f7a39 100644
--- a/e2e/paths/04-item/13_fixedPrice.spec.js
+++ b/e2e/paths/04-item/13_fixedPrice.spec.js
@@ -4,20 +4,69 @@ import getBrowser from '../../helpers/puppeteer';
describe('Item fixed prices path', () => {
let browser;
let page;
+ let httpRequest;
+
beforeAll(async() => {
browser = await getBrowser();
page = browser.page;
await page.loginAndModule('buyer', 'item');
await page.accessToSection('item.fixedPrice');
+ page.on('request', req => {
+ if (req.url().includes(`FixedPrices/filter`))
+ httpRequest = req.url();
+ });
});
afterAll(async() => {
await browser.close();
});
+ it('should filter using all the fields', async() => {
+ await page.write(selectors.itemFixedPrice.generalSearchFilter, 'item');
+ await page.keyboard.press('Enter');
+
+ expect(httpRequest).toContain('search=item');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ await page.click(selectors.itemFixedPrice.reignFilter);
+
+ expect(httpRequest).toContain('categoryFk');
+
+ await page.autocompleteSearch(selectors.itemFixedPrice.typeFilter, 'Alstroemeria');
+
+ expect(httpRequest).toContain('typeFk');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ await page.autocompleteSearch(selectors.itemFixedPrice.buyerFilter, 'buyerNick');
+
+ expect(httpRequest).toContain('buyerFk');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ await page.autocompleteSearch(selectors.itemFixedPrice.warehouseFilter, 'Algemesi');
+
+ expect(httpRequest).toContain('warehouseFk');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ await page.click(selectors.itemFixedPrice.mineFilter);
+
+ expect(httpRequest).toContain('mine=true');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ await page.click(selectors.itemFixedPrice.hasMinPriceFilter);
+
+ expect(httpRequest).toContain('hasMinPrice=true');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ await page.click(selectors.itemFixedPrice.addTag);
+ await page.autocompleteSearch(selectors.itemFixedPrice.tagFilter, 'Color');
+ await page.autocompleteSearch(selectors.itemFixedPrice.tagValueFilter, 'Brown');
+
+ expect(httpRequest).toContain('tags');
+
+ await page.click(selectors.itemFixedPrice.chip);
+ });
+
it('should click on the add new fixed price button', async() => {
- await page.waitToClick(selectors.itemFixedPrice.removeWarehouseFilter);
- await page.waitForSpinnerLoad();
await page.waitToClick(selectors.itemFixedPrice.add);
await page.waitForSelector(selectors.itemFixedPrice.fourthFixedPrice);
});
@@ -36,10 +85,7 @@ describe('Item fixed prices path', () => {
});
it('should reload the section and check the created price has the expected ID', async() => {
- await page.accessToSection('item.index');
- await page.accessToSection('item.fixedPrice');
- await page.waitToClick(selectors.itemFixedPrice.removeWarehouseFilter);
- await page.waitForSpinnerLoad();
+ await page.goto(`http://localhost:5000/#!/item/fixed-price`);
const result = await page.waitToGetProperty(selectors.itemFixedPrice.fourthItemID, 'value');
diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
index f9b5209818..323646d298 100644
--- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
+++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
@@ -249,6 +249,7 @@ describe('Ticket Edit sale path', () => {
await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox);
await page.waitToClick(selectors.ticketSales.moreMenu);
await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
+ await page.waitToClick(selectors.globalItems.acceptButton);
await page.waitForState('claim.card.basicData');
});
diff --git a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js b/e2e/paths/05-ticket/02_expeditions_and_log.spec.js
index ae5e2fb0cb..edccd55610 100644
--- a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js
+++ b/e2e/paths/05-ticket/02_expeditions_and_log.spec.js
@@ -29,20 +29,4 @@ describe('Ticket expeditions and log path', () => {
expect(result).toEqual(3);
});
-
- it(`should confirm the expedition deleted is shown now in the ticket log`, async() => {
- await page.accessToSection('ticket.card.log');
- const user = await page
- .waitToGetProperty(selectors.ticketLog.user, 'innerText');
-
- const action = await page
- .waitToGetProperty(selectors.ticketLog.action, 'innerText');
-
- const id = await page
- .waitToGetProperty(selectors.ticketLog.id, 'innerText');
-
- expect(user).toContain('production');
- expect(action).toContain('Deletes');
- expect(id).toEqual('2');
- });
});
diff --git a/e2e/paths/05-ticket/17_log.spec.js b/e2e/paths/05-ticket/17_log.spec.js
index 32829ee747..e1da2df44c 100644
--- a/e2e/paths/05-ticket/17_log.spec.js
+++ b/e2e/paths/05-ticket/17_log.spec.js
@@ -31,30 +31,4 @@ describe('Ticket log path', () => {
expect(message.text).toContain('Data saved!');
});
-
- it('should navigate to the log section', async() => {
- await page.accessToSection('ticket.card.log');
- });
-
- it('should set the viewport width to 1920 to see the table full width', async() => {
- await page.setViewport({
- width: 1920,
- height: 0,
- });
-
- const result = await page.waitToGetProperty(selectors.ticketLog.firstTD, 'innerText');
-
- expect(result.length).not.toBeGreaterThan('20');
- });
-
- it('should set the viewport width to 800 to see the table shrink and move data to the 1st column', async() => {
- await page.setViewport({
- width: 800,
- height: 0,
- });
-
- const result = await page.waitToGetProperty(selectors.ticketLog.firstTD, 'innerText');
-
- expect(result.length).toBeGreaterThan('15');
- });
});
diff --git a/e2e/paths/11-zone/02_descriptor.spec.js b/e2e/paths/11-zone/02_descriptor.spec.js
index 12a1c8f682..f3c0e7740f 100644
--- a/e2e/paths/11-zone/02_descriptor.spec.js
+++ b/e2e/paths/11-zone/02_descriptor.spec.js
@@ -29,14 +29,4 @@ describe('Zone descriptor path', () => {
expect(count).toEqual(0);
});
-
- it('should check the ticket whom lost the zone and see evidence on the logs', async() => {
- await page.waitToClick(selectors.globalItems.homeButton);
- await page.selectModule('ticket');
- await page.accessToSearchResult('20');
- await page.accessToSection('ticket.card.log');
- const lastChanges = await page.waitToGetProperty(selectors.ticketLog.changes, 'innerText');
-
- expect(lastChanges).toContain('1');
- });
});
diff --git a/e2e/paths/13-supplier/02_basic_data.spec.js b/e2e/paths/13-supplier/02_basic_data.spec.js
index 9d86e11d40..72ea6d8909 100644
--- a/e2e/paths/13-supplier/02_basic_data.spec.js
+++ b/e2e/paths/13-supplier/02_basic_data.spec.js
@@ -64,14 +64,4 @@ describe('Supplier basic data path', () => {
expect(result).toEqual('Some notes');
});
-
- it('should navigate to the log section', async() => {
- await page.accessToSection('supplier.card.log');
- });
-
- it('should check the changes have been recorded', async() => {
- const result = await page.waitToGetProperty('vn-tr table tr:nth-child(3) td.after', 'innerText');
-
- expect(result).toEqual('Some notes');
- });
});
diff --git a/front/salix/components/upload-photo/index.js b/front/salix/components/upload-photo/index.js
index da1fda9235..c9774d0370 100644
--- a/front/salix/components/upload-photo/index.js
+++ b/front/salix/components/upload-photo/index.js
@@ -162,14 +162,8 @@ export default class UploadPhoto extends Component {
if (!this.newPhoto.files)
throw new Error(`Select an image`);
- const viewportType = this.viewportSelection;
- const output = viewportType.output;
const options = {
type: 'blob',
- size: {
- width: output.width,
- height: output.height
- }
};
return this.editor.result(options)
.then(blob => this.newPhoto.blob = blob)
diff --git a/loopback/common/methods/vn-model/specs/crud.spec.js b/loopback/common/methods/vn-model/specs/crud.spec.js
index 4aa35c14df..56af72bd94 100644
--- a/loopback/common/methods/vn-model/specs/crud.spec.js
+++ b/loopback/common/methods/vn-model/specs/crud.spec.js
@@ -1,6 +1,20 @@
const app = require('vn-loopback/server/server');
+const LoopBackContext = require('loopback-context');
describe('Model crud()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
let insertId;
const barcodeModel = app.models.ItemBarcode;
diff --git a/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js b/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js
index 1c4d53266d..a3dba14d71 100644
--- a/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js
+++ b/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('Model rewriteDbError()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should extend rewriteDbError properties to any model passed', () => {
const exampleModel = models.ItemTag;
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index e9fd672091..c3c8d234da 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -154,5 +154,6 @@
"Valid priorities: 1,2,3": "Valid priorities: 1,2,3",
"Warehouse inventory not set": "Almacén inventario no está establecido",
"Component cost not set": "Componente coste no está estabecido",
- "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2"
-}
+ "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2",
+ "Description cannot be blank": "Description cannot be blank"
+}
\ No newline at end of file
diff --git a/loopback/server/connectors/vn-mysql.js b/loopback/server/connectors/vn-mysql.js
index a6fd3351a1..b08f69cb16 100644
--- a/loopback/server/connectors/vn-mysql.js
+++ b/loopback/server/connectors/vn-mysql.js
@@ -1,41 +1,9 @@
const mysql = require('mysql');
const MySQL = require('loopback-connector-mysql').MySQL;
const EnumFactory = require('loopback-connector-mysql').EnumFactory;
-const { Transaction, SQLConnector, ParameterizedSQL } = require('loopback-connector');
+const {Transaction, SQLConnector, ParameterizedSQL} = require('loopback-connector');
const fs = require('fs');
-const limitSet = new Set([
- 'save',
- 'updateOrCreate',
- 'replaceOrCreate',
- 'replaceById',
- 'update'
-]);
-
-const opOpts = {
- update: [
- 'update',
- 'replaceById',
- // |insert
- 'save',
- 'updateOrCreate',
- 'replaceOrCreate'
- ],
- delete: [
- 'destroy',
- 'destroyAll'
- ],
- insert: [
- 'create'
- ]
-};
-
-const opMap = new Map();
-for (const op in opOpts) {
- for (const met of opOpts[op])
- opMap.set(met, op);
-}
-
class VnMySQL extends MySQL {
/**
* Promisified version of execute().
@@ -253,49 +221,49 @@ class VnMySQL extends MySQL {
}
create(model, data, opts, cb) {
- const ctx = { data };
+ const ctx = {data};
this.invokeMethod('create',
arguments, model, ctx, opts, cb);
}
createAll(model, data, opts, cb) {
- const ctx = { data };
+ const ctx = {data};
this.invokeMethod('createAll',
arguments, model, ctx, opts, cb);
}
save(model, data, opts, cb) {
- const ctx = { data };
+ const ctx = {data};
this.invokeMethod('save',
arguments, model, ctx, opts, cb);
}
updateOrCreate(model, data, opts, cb) {
- const ctx = { data };
+ const ctx = {data};
this.invokeMethod('updateOrCreate',
arguments, model, ctx, opts, cb);
}
replaceOrCreate(model, data, opts, cb) {
- const ctx = { data };
+ const ctx = {data};
this.invokeMethod('replaceOrCreate',
arguments, model, ctx, opts, cb);
}
destroyAll(model, where, opts, cb) {
- const ctx = { where };
+ const ctx = {where};
this.invokeMethod('destroyAll',
arguments, model, ctx, opts, cb);
}
update(model, where, data, opts, cb) {
- const ctx = { where, data };
+ const ctx = {where, data};
this.invokeMethod('update',
arguments, model, ctx, opts, cb);
}
replaceById(model, id, data, opts, cb) {
- const ctx = { id, data };
+ const ctx = {id, data};
this.invokeMethod('replaceById',
arguments, model, ctx, opts, cb);
}
@@ -316,45 +284,17 @@ class VnMySQL extends MySQL {
async invokeMethodP(method, args, model, ctx, opts) {
const Model = this.getModelDefinition(model).model;
- const settings = Model.definition.settings;
let tx;
if (!opts.transaction) {
tx = await Transaction.begin(this, {});
- opts = Object.assign({ transaction: tx, httpCtx: opts.httpCtx }, opts);
+ opts = Object.assign({transaction: tx, httpCtx: opts.httpCtx}, opts);
}
try {
- // Fetch old values (update|delete) or login
- let where, id, data, idName, limit, op, oldInstances, newInstances;
- const hasGrabUser = settings.log && settings.log.grabUser;
- if (hasGrabUser) {
- const userId = opts.httpCtx && opts.httpCtx.active.accessToken.userId;
- const user = await Model.app.models.Account.findById(userId, { fields: ['name'] }, opts);
+ const userId = opts.httpCtx && opts.httpCtx.active.accessToken.userId;
+ if (userId) {
+ const user = await Model.app.models.Account.findById(userId, {fields: ['name']}, opts);
await this.executeP(`CALL account.myUser_loginWithName(?)`, [user.name], opts);
- } else {
- where = ctx.where;
- id = ctx.id;
- data = ctx.data;
- idName = this.idName(model);
-
- limit = limitSet.has(method);
-
- op = opMap.get(method);
-
- if (!where) {
- if (id) where = { [idName]: id };
- else where = { [idName]: data[idName] };
- }
-
- // Fetch old values
- switch (op) {
- case 'update':
- case 'delete':
- // Single entity operation
- const stmt = this.buildSelectStmt(op, data, idName, model, where, limit);
- stmt.merge(`FOR UPDATE`);
- oldInstances = await this.executeStmt(stmt, opts);
- }
}
const res = await new Promise((resolve, reject) => {
@@ -366,38 +306,7 @@ class VnMySQL extends MySQL {
super[method].apply(this, fnArgs);
});
- if (hasGrabUser)
- await this.executeP(`CALL account.myUser_logout()`, null, opts);
- else {
- // Fetch new values
- const ids = [];
-
- switch (op) {
- case 'insert':
- case 'update': {
- switch (method) {
- case 'createAll':
- for (const row of res[0])
- ids.push(row[idName]);
- break;
- case 'create':
- ids.push(res[0]);
- break;
- case 'update':
- if (data[idName] != null)
- ids.push(data[idName]);
- break;
- }
-
- const newWhere = ids.length ? {[idName]: {inq: ids}} : where;
-
- const stmt = this.buildSelectStmt(op, data, idName, model, newWhere, limit);
- newInstances = await this.executeStmt(stmt, opts);
- }
- }
-
- await this.createLogRecord(oldInstances, newInstances, model, opts);
- }
+ if (userId) await this.executeP(`CALL account.myUser_logout()`, null, opts);
if (tx) await tx.commit();
return res;
} catch (err) {
@@ -405,125 +314,6 @@ class VnMySQL extends MySQL {
throw err;
}
}
-
- buildSelectStmt(op, data, idName, model, where, limit) {
- const Model = this.getModelDefinition(model).model;
- const properties = Object.keys(Model.definition.properties);
-
- const fields = data ? Object.keys(data) : [];
- if (op == 'delete')
- properties.forEach(property => fields.push(property));
- else {
- const log = Model.definition.settings.log;
- fields.push(idName);
- if (log.relation) fields.push(Model.relations[log.relation].keyFrom);
- if (log.showField) fields.push(log.showField);
- else {
- const showFieldNames = ['name', 'description', 'code', 'nickname'];
- for (const field of showFieldNames) {
- if (properties.includes(field)) {
- log.showField = field;
- fields.push(field);
- break;
- }
- }
- }
- }
-
- const stmt = new ParameterizedSQL(
- 'SELECT ' +
- this.buildColumnNames(model, { fields }) +
- ' FROM ' +
- this.tableEscaped(model)
- );
- stmt.merge(this.buildWhere(model, where));
- if (limit) stmt.merge(`LIMIT 1`);
-
- return stmt;
- }
-
- async createLogRecord(oldInstances, newInstances, model, opts) {
- function setActionType() {
- if (oldInstances && newInstances)
- return 'update';
- else if (!oldInstances && newInstances)
- return 'insert';
- return 'delete';
- }
-
- const action = setActionType();
- if (!newInstances && action != 'delete') return;
-
- const Model = this.getModelDefinition(model).model;
- const models = Model.app.models;
- const definition = Model.definition;
- const log = definition.settings.log;
-
- const primaryKey = this.idName(model);
- const originRelation = log.relation;
- const originFkField = originRelation
- ? Model.relations[originRelation].keyFrom
- : primaryKey;
-
- // Prevent adding logs when deleting a principal entity (Client, Zone...)
- if (action == 'delete' && !originRelation) return;
-
- function map(instances) {
- const map = new Map();
- if (!instances) return;
- for (const instance of instances)
- map.set(instance[primaryKey], instance);
- return map;
- }
-
- const changedModel = definition.name;
- const userFk = opts.httpCtx && opts.httpCtx.active.accessToken.userId;
- const oldMap = map(oldInstances);
- const newMap = map(newInstances);
- const ids = (oldMap || newMap).keys();
-
- const logEntries = [];
-
- function insertValuesLogEntry(logEntry, instance) {
- logEntry.originFk = instance[originFkField];
- logEntry.changedModelId = instance[primaryKey];
- if (log.showField) logEntry.changedModelValue = instance[log.showField];
- }
-
- for (const id of ids) {
- const oldI = oldMap && oldMap.get(id);
- const newI = newMap && newMap.get(id);
-
- const logEntry = {
- action,
- userFk,
- changedModel,
- };
-
- if (newI) {
- insertValuesLogEntry(logEntry, newI);
- // Delete unchanged properties
- if (oldI) {
- Object.keys(oldI).forEach(prop => {
- const hasChanges = oldI[prop] instanceof Date ?
- oldI[prop]?.getTime() != newI[prop]?.getTime() :
- oldI[prop] != newI[prop];
-
- if (!hasChanges) {
- delete oldI[prop];
- delete newI[prop];
- }
- });
- }
- } else
- insertValuesLogEntry(logEntry, oldI);
-
- logEntry.oldInstance = oldI;
- logEntry.newInstance = newI;
- logEntries.push(logEntry);
- }
- await models[log.model].create(logEntries, opts);
- }
}
exports.VnMySQL = VnMySQL;
@@ -544,7 +334,7 @@ exports.initialize = function initialize(dataSource, callback) {
if (callback) {
if (dataSource.settings.lazyConnect) {
- process.nextTick(function () {
+ process.nextTick(function() {
callback();
});
} else
@@ -552,13 +342,13 @@ exports.initialize = function initialize(dataSource, callback) {
}
};
-MySQL.prototype.connect = function (callback) {
+MySQL.prototype.connect = function(callback) {
const self = this;
const options = generateOptions(this.settings);
if (this.client) {
if (callback) {
- process.nextTick(function () {
+ process.nextTick(function() {
callback(null, self.client);
});
}
@@ -567,7 +357,7 @@ MySQL.prototype.connect = function (callback) {
function connectionHandler(options, callback) {
const client = mysql.createPool(options);
- client.getConnection(function (err, connection) {
+ client.getConnection(function(err, connection) {
const conn = connection;
if (!err) {
if (self.debug)
@@ -647,30 +437,27 @@ function generateOptions(settings) {
return options;
}
-
SQLConnector.prototype.all = function find(model, filter, options, cb) {
const self = this;
// Order by id if no order is specified
filter = filter || {};
const stmt = this.buildSelect(model, filter, options);
- this.execute(stmt.sql, stmt.params, options, function (err, data) {
- if (err) {
+ this.execute(stmt.sql, stmt.params, options, function(err, data) {
+ if (err)
return cb(err, []);
- }
try {
- const objs = data.map(function (obj) {
+ const objs = data.map(function(obj) {
return self.fromRow(model, obj);
});
if (filter && filter.include) {
self.getModelDefinition(model).model.include(
objs, filter.include, options, cb,
);
- } else {
+ } else
cb(null, objs);
- }
} catch (error) {
- cb(error, [])
+ cb(error, []);
}
});
};
diff --git a/modules/account/back/model-config.json b/modules/account/back/model-config.json
index c697bd3b9f..057a487dd4 100644
--- a/modules/account/back/model-config.json
+++ b/modules/account/back/model-config.json
@@ -23,6 +23,9 @@
"RoleConfig": {
"dataSource": "vn"
},
+ "RoleLog": {
+ "dataSource": "vn"
+ },
"RoleInherit": {
"dataSource": "vn"
},
@@ -41,10 +44,13 @@
"UserAccount": {
"dataSource": "vn"
},
+ "UserLog": {
+ "dataSource": "vn"
+ },
"UserPassword": {
"dataSource": "vn"
},
"UserSync": {
"dataSource": "vn"
}
-}
\ No newline at end of file
+}
diff --git a/modules/account/back/models/role-log.json b/modules/account/back/models/role-log.json
new file mode 100644
index 0000000000..b4fc3daf99
--- /dev/null
+++ b/modules/account/back/models/role-log.json
@@ -0,0 +1,58 @@
+{
+ "name": "RoleLog",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "account.roleLog"
+ }
+ },
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "forceId": false
+ },
+ "originFk": {
+ "type": "number",
+ "required": true
+ },
+ "userFk": {
+ "type": "number"
+ },
+ "action": {
+ "type": "string",
+ "required": true
+ },
+ "changedModel": {
+ "type": "string"
+ },
+ "oldInstance": {
+ "type": "object"
+ },
+ "newInstance": {
+ "type": "object"
+ },
+ "creationDate": {
+ "type": "date"
+ },
+ "changedModelId": {
+ "type": "number"
+ },
+ "changedModelValue": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ },
+ "relations": {
+ "user": {
+ "type": "belongsTo",
+ "model": "Account",
+ "foreignKey": "userFk"
+ }
+ },
+ "scope": {
+ "order": ["creationDate DESC", "id DESC"]
+ }
+}
diff --git a/back/models/user-log.json b/modules/account/back/models/user-log.json
similarity index 94%
rename from back/models/user-log.json
rename to modules/account/back/models/user-log.json
index 43ccbfa438..5169d99b05 100644
--- a/back/models/user-log.json
+++ b/modules/account/back/models/user-log.json
@@ -3,7 +3,7 @@
"base": "VnModel",
"options": {
"mysql": {
- "table": "userLog"
+ "table": "account.userLog"
}
},
"properties": {
@@ -16,7 +16,7 @@
"type": "number",
"required": true
},
- "userFk": {
+ "userFk": {
"type": "number"
},
"action": {
@@ -50,7 +50,7 @@
"type": "belongsTo",
"model": "Account",
"foreignKey": "userFk"
- }
+ }
},
"scope": {
"order": ["creationDate DESC", "id DESC"]
diff --git a/modules/account/front/index.js b/modules/account/front/index.js
index 0cd0c49555..695f369677 100644
--- a/modules/account/front/index.js
+++ b/modules/account/front/index.js
@@ -19,3 +19,5 @@ import './ldap';
import './samba';
import './accounts';
import './privileges';
+import './user-log';
+import './role-log';
diff --git a/modules/account/front/locale/es.yml b/modules/account/front/locale/es.yml
index 18e2c06a18..7988cbda6d 100644
--- a/modules/account/front/locale/es.yml
+++ b/modules/account/front/locale/es.yml
@@ -8,4 +8,5 @@ Role: Rol
Mail aliases: Alias de correo
Account not enabled: Cuenta no habilitada
Inherited roles: Roles heredados
-Go to the user: Ir al usuario
\ No newline at end of file
+Go to the user: Ir al usuario
+Log: Histórico
diff --git a/modules/account/front/role-log/index.html b/modules/account/front/role-log/index.html
new file mode 100644
index 0000000000..9e2b151b54
--- /dev/null
+++ b/modules/account/front/role-log/index.html
@@ -0,0 +1 @@
+
diff --git a/modules/account/front/role-log/index.js b/modules/account/front/role-log/index.js
new file mode 100644
index 0000000000..02448ccaa5
--- /dev/null
+++ b/modules/account/front/role-log/index.js
@@ -0,0 +1,7 @@
+import ngModule from '../module';
+import Section from 'salix/components/section';
+
+ngModule.vnComponent('vnRoleLog', {
+ template: require('./index.html'),
+ controller: Section,
+});
diff --git a/modules/account/front/routes.json b/modules/account/front/routes.json
index a6f2f5d3f5..cc66df103c 100644
--- a/modules/account/front/routes.json
+++ b/modules/account/front/routes.json
@@ -20,12 +20,14 @@
{"state": "account.card.roles", "icon": "group"},
{"state": "account.card.mailForwarding", "icon": "forward"},
{"state": "account.card.aliases", "icon": "email"},
- {"state": "account.card.privileges", "icon": "badge"}
+ {"state": "account.card.privileges", "icon": "badge"},
+ {"state": "account.card.log", "icon": "history"}
],
"role": [
{"state": "account.role.card.basicData", "icon": "settings"},
{"state": "account.role.card.subroles", "icon": "groups"},
- {"state": "account.role.card.inherited", "icon": "account_tree"}
+ {"state": "account.role.card.inherited", "icon": "account_tree"},
+ {"state": "account.role.card.log", "icon": "history"}
],
"alias": [
{"state": "account.alias.card.basicData", "icon": "settings"},
@@ -80,6 +82,18 @@
"description": "Basic data",
"acl": ["hr"]
},
+ {
+ "url" : "/log",
+ "state": "account.card.log",
+ "component": "vn-user-log",
+ "description": "Log"
+ },
+ {
+ "url" : "/log",
+ "state": "account.role.card.log",
+ "component": "vn-role-log",
+ "description": "Log"
+ },
{
"url": "/roles",
"state": "account.card.roles",
diff --git a/modules/account/front/user-log/index.html b/modules/account/front/user-log/index.html
new file mode 100644
index 0000000000..5a77ed7b9f
--- /dev/null
+++ b/modules/account/front/user-log/index.html
@@ -0,0 +1 @@
+
diff --git a/modules/account/front/user-log/index.js b/modules/account/front/user-log/index.js
new file mode 100644
index 0000000000..7cd0bb378d
--- /dev/null
+++ b/modules/account/front/user-log/index.js
@@ -0,0 +1,7 @@
+import ngModule from '../module';
+import Section from 'salix/components/section';
+
+ngModule.vnComponent('vnUserLog', {
+ template: require('./index.html'),
+ controller: Section,
+});
diff --git a/modules/claim/back/methods/claim/specs/updateClaim.spec.js b/modules/claim/back/methods/claim/specs/updateClaim.spec.js
index 113df35c9a..d367fb89f6 100644
--- a/modules/claim/back/methods/claim/specs/updateClaim.spec.js
+++ b/modules/claim/back/methods/claim/specs/updateClaim.spec.js
@@ -1,6 +1,20 @@
const app = require('vn-loopback/server/server');
+const LoopBackContext = require('loopback-context');
describe('Update Claim', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
const newDate = Date.vnNew();
const originalData = {
ticketFk: 3,
diff --git a/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js b/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js
index 12ab45faca..2f16d002cb 100644
--- a/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js
+++ b/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js
@@ -1,6 +1,20 @@
const app = require('vn-loopback/server/server');
+const LoopBackContext = require('loopback-context');
describe('Update Claim', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
const newDate = Date.vnNew();
const original = {
ticketFk: 3,
diff --git a/modules/claim/back/models/claim-beginning.json b/modules/claim/back/models/claim-beginning.json
index afa21f817b..d355881e85 100644
--- a/modules/claim/back/models/claim-beginning.json
+++ b/modules/claim/back/models/claim-beginning.json
@@ -1,11 +1,6 @@
{
"name": "ClaimBeginning",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "relation": "claim",
- "showField": "quantity"
- },
"options": {
"mysql": {
"table": "claimBeginning"
diff --git a/modules/claim/back/models/claim-development.json b/modules/claim/back/models/claim-development.json
index 02061fab7b..b0f352f50e 100644
--- a/modules/claim/back/models/claim-development.json
+++ b/modules/claim/back/models/claim-development.json
@@ -1,10 +1,6 @@
{
"name": "ClaimDevelopment",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "relation": "claim"
- },
"options": {
"mysql": {
"table": "claimDevelopment"
diff --git a/modules/claim/back/models/claim-dms.json b/modules/claim/back/models/claim-dms.json
index a215b6bb75..26c90fd690 100644
--- a/modules/claim/back/models/claim-dms.json
+++ b/modules/claim/back/models/claim-dms.json
@@ -1,18 +1,14 @@
{
"name": "ClaimDms",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "relation": "claim"
- },
"options": {
"mysql": {
"table": "claimDms"
}
},
"allowedContentTypes": [
- "image/png",
- "image/jpeg",
+ "image/png",
+ "image/jpeg",
"image/jpg"
],
"properties": {
@@ -34,4 +30,4 @@
"foreignKey": "dmsFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/claim/back/models/claim-end.json b/modules/claim/back/models/claim-end.json
index 12d79f71b2..9f12ff93a0 100644
--- a/modules/claim/back/models/claim-end.json
+++ b/modules/claim/back/models/claim-end.json
@@ -1,10 +1,6 @@
{
"name": "ClaimEnd",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "relation": "claim"
- },
"options": {
"mysql": {
"table": "claimEnd"
diff --git a/modules/claim/back/models/claim-observation.json b/modules/claim/back/models/claim-observation.json
index e882ad09d6..2d418b76e9 100644
--- a/modules/claim/back/models/claim-observation.json
+++ b/modules/claim/back/models/claim-observation.json
@@ -1,10 +1,6 @@
{
"name": "ClaimObservation",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "relation": "claim"
- },
"options": {
"mysql": {
"table": "claimObservation"
@@ -40,4 +36,4 @@
"foreignKey": "claimFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/claim/back/models/claim-state.json b/modules/claim/back/models/claim-state.json
index 2fd6d48456..f5bde4168c 100644
--- a/modules/claim/back/models/claim-state.json
+++ b/modules/claim/back/models/claim-state.json
@@ -1,11 +1,6 @@
{
"name": "ClaimState",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "relation": "claim",
- "showField": "description"
- },
"options": {
"mysql": {
"table": "claimState"
diff --git a/modules/claim/back/models/claim.json b/modules/claim/back/models/claim.json
index 4b26720e52..a7db1f3e1f 100644
--- a/modules/claim/back/models/claim.json
+++ b/modules/claim/back/models/claim.json
@@ -1,10 +1,6 @@
{
"name": "Claim",
"base": "Loggable",
- "log": {
- "model": "ClaimLog",
- "showField": "id"
- },
"options": {
"mysql": {
"table": "claim"
diff --git a/modules/client/back/models/address.json b/modules/client/back/models/address.json
index 0dcbbf7fe1..5f962677d8 100644
--- a/modules/client/back/models/address.json
+++ b/modules/client/back/models/address.json
@@ -2,11 +2,6 @@
"name": "Address",
"description": "Client addresses",
"base": "Loggable",
- "log": {
- "model": "ClientLog",
- "relation": "client",
- "showField": "nickname"
- },
"options": {
"mysql": {
"table": "address"
@@ -88,4 +83,4 @@
"foreignKey": "customsAgentFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/client/back/models/client-contact.json b/modules/client/back/models/client-contact.json
index 514ebbf5e8..3f71ab79e6 100644
--- a/modules/client/back/models/client-contact.json
+++ b/modules/client/back/models/client-contact.json
@@ -2,11 +2,6 @@
"name": "ClientContact",
"description": "Client phone contacts",
"base": "Loggable",
- "log": {
- "model": "ClientLog",
- "relation": "client",
- "showField": "name"
- },
"options": {
"mysql": {
"table": "clientContact"
@@ -33,4 +28,4 @@
"foreignKey": "clientFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/client/back/models/client-dms.json b/modules/client/back/models/client-dms.json
index 88b4349dfa..14b19498e3 100644
--- a/modules/client/back/models/client-dms.json
+++ b/modules/client/back/models/client-dms.json
@@ -1,11 +1,6 @@
{
"name": "ClientDms",
"base": "Loggable",
- "log": {
- "model":"ClientLog",
- "relation": "client",
- "showField": "dmsFk"
- },
"options": {
"mysql": {
"table": "clientDms"
diff --git a/modules/client/back/models/client-observation.json b/modules/client/back/models/client-observation.json
index d3059377db..b8852b186d 100644
--- a/modules/client/back/models/client-observation.json
+++ b/modules/client/back/models/client-observation.json
@@ -2,10 +2,6 @@
"name": "ClientObservation",
"description": "Client notes",
"base": "Loggable",
- "log": {
- "model": "ClientLog",
- "relation": "client"
- },
"options": {
"mysql": {
"table": "clientObservation"
diff --git a/modules/client/back/models/client-sample.json b/modules/client/back/models/client-sample.json
index fc64cd949a..6430b66ae5 100644
--- a/modules/client/back/models/client-sample.json
+++ b/modules/client/back/models/client-sample.json
@@ -1,11 +1,6 @@
{
"name": "ClientSample",
"base": "Loggable",
- "log": {
- "model": "ClientLog",
- "relation": "client",
- "showField": "type"
- },
"options": {
"mysql": {
"table": "clientSample"
diff --git a/modules/client/back/models/client.json b/modules/client/back/models/client.json
index 21db28eaf1..6b40aff8e9 100644
--- a/modules/client/back/models/client.json
+++ b/modules/client/back/models/client.json
@@ -1,10 +1,6 @@
{
"name": "Client",
"base": "Loggable",
- "log": {
- "model":"ClientLog",
- "showField": "id"
- },
"options": {
"mysql": {
"table": "client"
@@ -260,4 +256,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/client/back/models/greuge.json b/modules/client/back/models/greuge.json
index 625bf4e283..9cc056260d 100644
--- a/modules/client/back/models/greuge.json
+++ b/modules/client/back/models/greuge.json
@@ -1,11 +1,6 @@
{
"name": "Greuge",
"base": "Loggable",
- "log": {
- "model": "ClientLog",
- "relation": "client",
- "showField": "description"
- },
"options": {
"mysql": {
"table": "greuge"
@@ -58,4 +53,4 @@
"foreignKey": "userFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/client/back/models/recovery.json b/modules/client/back/models/recovery.json
index de4183924d..5ea89197da 100644
--- a/modules/client/back/models/recovery.json
+++ b/modules/client/back/models/recovery.json
@@ -1,10 +1,6 @@
{
"name": "Recovery",
"base": "Loggable",
- "log": {
- "model": "ClientLog",
- "relation": "client"
- },
"options": {
"mysql": {
"table": "recovery"
@@ -38,4 +34,4 @@
"foreignKey": "clientFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/client/front/locale/es.yml b/modules/client/front/locale/es.yml
index adbca8dbfe..45ae339145 100644
--- a/modules/client/front/locale/es.yml
+++ b/modules/client/front/locale/es.yml
@@ -64,3 +64,4 @@ Compensation Account: Cuenta para compensar
Amount to return: Cantidad a devolver
Delivered amount: Cantidad entregada
Unpaid: Impagado
+There is no zona: No hay zona
\ No newline at end of file
diff --git a/modules/client/front/postcode/locale/es.yml b/modules/client/front/postcode/locale/es.yml
index 782690e885..29d0d7af9c 100644
--- a/modules/client/front/postcode/locale/es.yml
+++ b/modules/client/front/postcode/locale/es.yml
@@ -8,4 +8,5 @@ The province can't be empty: La provincia no puede quedar vacía
The country can't be empty: El país no puede quedar vacío
The postcode has been created. You can save the data now: Se ha creado el código postal. Ahora puedes guardar los datos
The city has been created: Se ha creado la ciudad
-The province has been created: Se ha creado la provincia
\ No newline at end of file
+The province has been created: Se ha creado la provincia
+Autonomy: Autonomia
\ No newline at end of file
diff --git a/modules/entry/back/models/buy.json b/modules/entry/back/models/buy.json
index de2ddffd68..379e55427e 100644
--- a/modules/entry/back/models/buy.json
+++ b/modules/entry/back/models/buy.json
@@ -1,11 +1,6 @@
{
"name": "Buy",
"base": "Loggable",
- "log": {
- "model": "EntryLog",
- "relation": "entry",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "buy"
diff --git a/modules/entry/back/models/entry-observation.json b/modules/entry/back/models/entry-observation.json
index 0c63dd6632..cdf0c5e6ed 100644
--- a/modules/entry/back/models/entry-observation.json
+++ b/modules/entry/back/models/entry-observation.json
@@ -1,10 +1,6 @@
{
"name": "EntryObservation",
"base": "Loggable",
- "log": {
- "model": "EntryLog",
- "relation": "entry"
- },
"options": {
"mysql": {
"table": "entryObservation"
diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json
index 5aa1757589..3933f6a34c 100644
--- a/modules/entry/back/models/entry.json
+++ b/modules/entry/back/models/entry.json
@@ -1,10 +1,6 @@
{
"name": "Entry",
"base": "Loggable",
- "log": {
- "model":"EntryLog",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "entry"
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js
index e0f191962e..42ebe52b37 100644
--- a/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('invoiceIn clone()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should return the cloned invoiceIn and also clone invoiceInDueDays and invoiceInTaxes if there are any referencing the invoiceIn', async() => {
const userId = 1;
const ctx = {
diff --git a/modules/invoiceIn/back/models/invoice-in-tax.json b/modules/invoiceIn/back/models/invoice-in-tax.json
index 7890201616..1f68476c3a 100644
--- a/modules/invoiceIn/back/models/invoice-in-tax.json
+++ b/modules/invoiceIn/back/models/invoice-in-tax.json
@@ -1,10 +1,6 @@
{
"name": "InvoiceInTax",
"base": "Loggable",
- "log": {
- "model": "InvoiceInLog",
- "relation": "invoiceIn"
- },
"options": {
"mysql": {
"table": "invoiceInTax"
@@ -55,4 +51,4 @@
"foreignKey": "transactionTypeSageFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/invoiceIn/back/models/invoice-in.json b/modules/invoiceIn/back/models/invoice-in.json
index c6a736b06a..7548998668 100644
--- a/modules/invoiceIn/back/models/invoice-in.json
+++ b/modules/invoiceIn/back/models/invoice-in.json
@@ -1,9 +1,6 @@
{
"name": "InvoiceIn",
"base": "Loggable",
- "log": {
- "model": "InvoiceInLog"
- },
"options": {
"mysql": {
"table": "invoiceIn"
diff --git a/modules/invoiceOut/back/methods/invoiceOut/createPdf.js b/modules/invoiceOut/back/methods/invoiceOut/createPdf.js
index e565162377..23b6c9e04c 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/createPdf.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/createPdf.js
@@ -56,7 +56,7 @@ module.exports = Self => {
reference: invoiceOut.ref,
recipientId: invoiceOut.clientFk
});
- const stream = await invoiceReport.toPdfStream();
+ const buffer = await invoiceReport.toPdfStream();
const issued = invoiceOut.issued;
const year = issued.getFullYear().toString();
@@ -66,7 +66,7 @@ module.exports = Self => {
const fileName = `${year}${invoiceOut.ref}.pdf`;
// Store invoice
- print.storage.write(stream, {
+ await print.storage.write(buffer, {
type: 'invoice',
path: `${year}/${month}/${day}`,
fileName: fileName
diff --git a/modules/invoiceOut/front/global-invoicing/index.js b/modules/invoiceOut/front/global-invoicing/index.js
index 0ac0223b46..0aa6a4a24d 100644
--- a/modules/invoiceOut/front/global-invoicing/index.js
+++ b/modules/invoiceOut/front/global-invoicing/index.js
@@ -100,16 +100,23 @@ class Controller extends Section {
};
this.$http.post(`InvoiceOuts/invoiceClient`, params)
+ .then(() => this.invoiceNext())
.catch(res => {
- this.errors.unshift({
- address,
- message: res.data.error.message
- });
+ const message = res.data?.error?.message || res.message;
+ if (res.status >= 400 && res.status < 500) {
+ this.errors.unshift({address, message});
+ this.invoiceNext();
+ } else {
+ this.invoicing = false;
+ this.status = 'done';
+ throw new UserError(`Critical invoicing error, proccess stopped`);
+ }
})
- .finally(() => {
- this.addressIndex++;
- this.invoiceOut();
- });
+ }
+
+ invoiceNext() {
+ this.addressIndex++;
+ this.invoiceOut();
}
get nAddresses() {
diff --git a/modules/invoiceOut/front/global-invoicing/locale/es.yml b/modules/invoiceOut/front/global-invoicing/locale/es.yml
index 242b5a93ff..5b1f7e8839 100644
--- a/modules/invoiceOut/front/global-invoicing/locale/es.yml
+++ b/modules/invoiceOut/front/global-invoicing/locale/es.yml
@@ -17,4 +17,5 @@ Ended process: Proceso finalizado
Invoice out: Facturar
One client: Un solo cliente
Choose a valid client: Selecciona un cliente válido
-Stop: Parar
\ No newline at end of file
+Stop: Parar
+Critical invoicing error, proccess stopped: Error crítico al facturar, proceso detenido
\ No newline at end of file
diff --git a/modules/item/back/methods/item-image-queue/download.js b/modules/item/back/methods/item-image-queue/download.js
index 5f1b460fcd..eb952daa4b 100644
--- a/modules/item/back/methods/item-image-queue/download.js
+++ b/modules/item/back/methods/item-image-queue/download.js
@@ -1,9 +1,7 @@
const axios = require('axios');
-const uuid = require('uuid');
const fs = require('fs/promises');
const {createWriteStream} = require('fs');
const path = require('path');
-const gm = require('gm');
module.exports = Self => {
Self.remoteMethod('download', {
@@ -27,13 +25,9 @@ module.exports = Self => {
const maxAttempts = 3;
const collectionName = 'catalog';
- const tx = await Self.beginTransaction({});
-
let tempFilePath;
let queueRow;
try {
- const myOptions = {transaction: tx};
-
queueRow = await Self.findOne(
{
fields: ['id', 'itemFk', 'url', 'attempts'],
@@ -44,58 +38,14 @@ module.exports = Self => {
},
},
order: 'priority, attempts, updated',
- },
- myOptions
+ }
);
if (!queueRow) return;
- const collection = await models.ImageCollection.findOne(
- {
- fields: [
- 'id',
- 'maxWidth',
- 'maxHeight',
- 'model',
- 'property',
- ],
- where: {name: collectionName},
- include: {
- relation: 'sizes',
- scope: {
- fields: ['width', 'height', 'crop'],
- },
- },
- },
- myOptions
- );
-
- const fileName = `${uuid.v4()}.png`;
+ const fileName = `${queueRow.itemFk}.png`;
tempFilePath = path.join(tempPath, fileName);
- // Insert image row
- await models.Image.create(
- {
- name: fileName,
- collectionFk: collectionName,
- updated: Date.vnNow(),
- },
- myOptions
- );
-
- // Update item
- const model = models[collection.model];
- if (!model) throw new Error('No matching model found');
-
- const item = await model.findById(queueRow.itemFk, null, myOptions);
- if (item) {
- await item.updateAttribute(
- collection.property,
- fileName,
- myOptions
- );
- }
-
// Download remote image
const response = await axios.get(queueRow.url, {
responseType: 'stream',
@@ -108,71 +58,22 @@ module.exports = Self => {
writeStream.on('error', error => reject(error));
});
- // Resize
- const container = await models.ImageContainer.container(
- collectionName
- );
- const rootPath = container.client.root;
- const collectionDir = path.join(rootPath, collectionName);
-
- // To max size
- const {maxWidth, maxHeight} = collection;
- const fullSizePath = path.join(collectionDir, 'full');
- const toFullSizePath = `${fullSizePath}/${fileName}`;
-
- await fs.mkdir(fullSizePath, {recursive: true});
- await new Promise((resolve, reject) => {
- gm(tempFilePath)
- .resize(maxWidth, maxHeight, '>')
- .setFormat('png')
- .write(toFullSizePath, function(err) {
- if (err) reject(err);
- if (!err) resolve();
- });
+ await models.Image.resize({
+ collectionName: collectionName,
+ srcFile: tempFilePath,
+ fileName: fileName,
+ entityId: queueRow.itemFk
});
- // To collection sizes
- for (const size of collection.sizes()) {
- const {width, height} = size;
-
- const sizePath = path.join(collectionDir, `${width}x${height}`);
- const toSizePath = `${sizePath}/${fileName}`;
-
- await fs.mkdir(sizePath, {recursive: true});
- await new Promise((resolve, reject) => {
- const gmInstance = gm(tempFilePath);
-
- if (size.crop) {
- gmInstance
- .resize(width, height, '^')
- .gravity('Center')
- .crop(width, height);
- }
-
- if (!size.crop) gmInstance.resize(width, height, '>');
-
- gmInstance
- .setFormat('png')
- .write(toSizePath, function(err) {
- if (err) reject(err);
- if (!err) resolve();
- });
- });
- }
-
try {
await fs.unlink(tempFilePath);
} catch (error) { }
- await queueRow.destroy(myOptions);
+ await queueRow.destroy();
// Restart queue
Self.download();
-
- await tx.commit();
} catch (error) {
- await tx.rollback();
-
if (queueRow.attempts < maxAttempts) {
await queueRow.updateAttributes({
error: error,
diff --git a/modules/item/back/methods/item/specs/updateTaxes.spec.js b/modules/item/back/methods/item/specs/updateTaxes.spec.js
index 66d2ce81c4..793e43de8f 100644
--- a/modules/item/back/methods/item/specs/updateTaxes.spec.js
+++ b/modules/item/back/methods/item/specs/updateTaxes.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('item updateTaxes()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should throw an error if the taxClassFk is blank', async() => {
const tx = await models.Item.beginTransaction({});
const options = {transaction: tx};
diff --git a/modules/item/back/methods/tag/specs/onSubmit.spec.js b/modules/item/back/methods/tag/specs/onSubmit.spec.js
index f24aad7e48..1e96d9e81f 100644
--- a/modules/item/back/methods/tag/specs/onSubmit.spec.js
+++ b/modules/item/back/methods/tag/specs/onSubmit.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('tag onSubmit()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should delete a tag', async() => {
const tx = await models.Item.beginTransaction({});
const options = {transaction: tx};
diff --git a/modules/item/back/models/item-barcode.json b/modules/item/back/models/item-barcode.json
index e2ce347cb8..12068a65fe 100644
--- a/modules/item/back/models/item-barcode.json
+++ b/modules/item/back/models/item-barcode.json
@@ -1,11 +1,6 @@
{
"name": "ItemBarcode",
"base": "Loggable",
- "log": {
- "model": "ItemLog",
- "relation": "item",
- "showField": "code"
- },
"options": {
"mysql": {
"table": "itemBarcode"
@@ -27,6 +22,6 @@
"type": "belongsTo",
"model": "Item",
"foreignKey": "itemFk"
- }
+ }
}
}
diff --git a/modules/item/back/models/item-botanical.json b/modules/item/back/models/item-botanical.json
index 8d8fd389f7..8a8bba8703 100644
--- a/modules/item/back/models/item-botanical.json
+++ b/modules/item/back/models/item-botanical.json
@@ -1,10 +1,6 @@
{
"name": "ItemBotanical",
"base": "Loggable",
- "log": {
- "model": "ItemLog",
- "relation": "item"
- },
"options": {
"mysql": {
"table": "itemBotanical"
@@ -34,4 +30,4 @@
"foreignKey": "specieFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json
index 339b9ab6e4..b24edfc53d 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -20,9 +20,9 @@
},
"created": {
"type": "date"
- },
- "isChecked": {
- "type": "boolean"
+ },
+ "isChecked": {
+ "type": "boolean"
}
},
"relations": {
diff --git a/modules/item/back/models/item-tag.json b/modules/item/back/models/item-tag.json
index 5660b36288..0742f8d3ff 100644
--- a/modules/item/back/models/item-tag.json
+++ b/modules/item/back/models/item-tag.json
@@ -1,11 +1,6 @@
{
"name": "ItemTag",
"base": "Loggable",
- "log": {
- "model": "ItemLog",
- "relation": "item",
- "showField": "value"
- },
"options": {
"mysql": {
"table": "itemTag"
diff --git a/modules/item/back/models/item-tax-country.json b/modules/item/back/models/item-tax-country.json
index f10a9eb727..002be97d81 100644
--- a/modules/item/back/models/item-tax-country.json
+++ b/modules/item/back/models/item-tax-country.json
@@ -1,11 +1,6 @@
{
"name": "ItemTaxCountry",
"base": "Loggable",
- "log": {
- "model": "ItemLog",
- "relation": "item",
- "showField": "countryFk"
- },
"options": {
"mysql": {
"table": "itemTaxCountry"
@@ -47,4 +42,4 @@
"foreignKey": "taxClassFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/item/back/models/item.json b/modules/item/back/models/item.json
index d6b3c27adc..4a7e04002d 100644
--- a/modules/item/back/models/item.json
+++ b/modules/item/back/models/item.json
@@ -1,11 +1,6 @@
{
"name": "Item",
"base": "Loggable",
- "log": {
- "model": "ItemLog",
- "showField": "id",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "item"
diff --git a/modules/item/front/fixed-price-search-panel/index.html b/modules/item/front/fixed-price-search-panel/index.html
index 5c8a58674e..ebe2102772 100644
--- a/modules/item/front/fixed-price-search-panel/index.html
+++ b/modules/item/front/fixed-price-search-panel/index.html
@@ -1,136 +1,215 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{name}}
+
+ {{category.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tags
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Id/{{$ctrl.$t('Name')}}: {{$ctrl.filter.search}}
+
+
+ {{$ctrl.$t('Category')}}: {{category.selection.name}}
+
+
+ {{$ctrl.$t('Type')}}: {{type.selection.name}}
+
+
+ {{$ctrl.$t('Buyer')}}: {{buyer.selection.nickname}}
+
+
+ {{$ctrl.$t('Warehouse')}}: {{warehouse.selection.name}}
+
+
+ {{$ctrl.$t('Started')}}: {{$ctrl.filter.started | date:'dd/MM/yyyy'}}
+
+
+ {{$ctrl.$t('Ended')}}: {{$ctrl.filter.ended | date:'dd/MM/yyyy'}}
+
+
+ {{$ctrl.$t('For me')}}: {{$ctrl.filter.mine ? '✓' : '✗'}}
+
+
+ {{$ctrl.$t('Minimum price')}}: {{$ctrl.filter.hasMinPrice ? '✓' : '✗'}}
+
+
+ {{$ctrl.showTagInfo(chipTag)}}
+
+
+
diff --git a/modules/item/front/fixed-price-search-panel/index.js b/modules/item/front/fixed-price-search-panel/index.js
index ec13765fde..0882eb5ac4 100644
--- a/modules/item/front/fixed-price-search-panel/index.js
+++ b/modules/item/front/fixed-price-search-panel/index.js
@@ -1,19 +1,60 @@
import ngModule from '../module';
import SearchPanel from 'core/components/searchbar/search-panel';
+import './style.scss';
class Controller extends SearchPanel {
- get filter() {
- return this.$.filter;
+ constructor($element, $) {
+ super($element, $);
}
- set filter(value = {}) {
- if (!value.tags) value.tags = [{}];
+ $onInit() {
+ this.filter = {
+ tags: []
+ };
+ }
- this.$.filter = value;
+ changeCategory(id) {
+ if (this.filter.categoryFk != id) {
+ this.filter.categoryFk = id;
+ this.addFilters();
+ }
+ }
+
+ removeItemFilter(param) {
+ this.filter[param] = null;
+ if (param == 'categoryFk') this.filter['typeFk'] = null;
+ this.addFilters();
+ }
+
+ removeTag(tag) {
+ const index = this.filter.tags.indexOf(tag);
+ if (index > -1) this.filter.tags.splice(index, 1);
+ this.addFilters();
+ }
+
+ onKeyPress($event) {
+ if ($event.key === 'Enter')
+ this.addFilters();
+ }
+
+ addFilters() {
+ for (let i = 0; i < this.filter.tags.length; i++) {
+ if (!this.filter.tags[i].value)
+ this.filter.tags.splice(i, 1);
+ }
+ return this.model.addFilter({}, this.filter);
+ }
+
+ showTagInfo(itemTag) {
+ if (!itemTag.tagFk) return itemTag.value;
+ return `${this.tags.find(tag => tag.id == itemTag.tagFk).name}: ${itemTag.value}`;
}
}
ngModule.vnComponent('vnFixedPriceSearchPanel', {
template: require('./index.html'),
- controller: Controller
+ controller: Controller,
+ bindings: {
+ model: '<'
+ }
});
diff --git a/modules/item/front/fixed-price-search-panel/index.spec.js b/modules/item/front/fixed-price-search-panel/index.spec.js
new file mode 100644
index 0000000000..597bc108e8
--- /dev/null
+++ b/modules/item/front/fixed-price-search-panel/index.spec.js
@@ -0,0 +1,56 @@
+import './index.js';
+
+describe('Item', () => {
+ describe('Component vnFixedPriceSearchPanel', () => {
+ let $element;
+ let controller;
+
+ beforeEach(ngModule('item'));
+
+ beforeEach(angular.mock.inject($componentController => {
+ $element = angular.element(``);
+ controller = $componentController('vnFixedPriceSearchPanel', {$element});
+ controller.model = {addFilter: () => {}};
+ }));
+
+ describe('removeItemFilter()', () => {
+ it(`should remove param from filter`, () => {
+ controller.filter = {tags: [], categoryFk: 1, typeFk: 1};
+ const expectFilter = {tags: [], categoryFk: null, typeFk: null};
+
+ controller.removeItemFilter('categoryFk');
+
+ expect(controller.filter).toEqual(expectFilter);
+ });
+ });
+
+ describe('removeTag()', () => {
+ it(`should remove tag from filter`, () => {
+ const tag = {tagFk: 1, value: 'Value'};
+ controller.filter = {tags: [tag]};
+ const expectFilter = {tags: []};
+
+ controller.removeTag(tag);
+
+ expect(controller.filter).toEqual(expectFilter);
+ });
+ });
+
+ describe('showTagInfo()', () => {
+ it(`should show tag value`, () => {
+ const tag = {value: 'Value'};
+ const result = controller.showTagInfo(tag);
+
+ expect(result).toEqual('Value');
+ });
+
+ it(`should show tag name and value`, () => {
+ const tag = {tagFk: 1, value: 'Value'};
+ controller.tags = [{id: 1, name: 'tagName'}];
+ const result = controller.showTagInfo(tag);
+
+ expect(result).toEqual('tagName: Value');
+ });
+ });
+ });
+});
diff --git a/modules/item/front/fixed-price-search-panel/style.scss b/modules/item/front/fixed-price-search-panel/style.scss
new file mode 100644
index 0000000000..a63f84f3b3
--- /dev/null
+++ b/modules/item/front/fixed-price-search-panel/style.scss
@@ -0,0 +1,71 @@
+@import "variables";
+
+vn-fixed-price-search-panel vn-side-menu {
+ .menu {
+ min-width: $right-menu-width;
+ }
+ & > div {
+ .input {
+ padding-left: $spacing-md;
+ padding-right: $spacing-md;
+ border-color: $color-spacer;
+ border-bottom: $border-thin;
+ }
+ .horizontal {
+ padding-left: $spacing-md;
+ padding-right: $spacing-md;
+ grid-auto-flow: column;
+ grid-column-gap: $spacing-sm;
+ align-items: center;
+ }
+ .tags {
+ padding: $spacing-md;
+ padding-bottom: 0%;
+ padding-top: 0%;
+ align-items: center;
+ }
+ .chips {
+ display: flex;
+ flex-wrap: wrap;
+ padding: $spacing-md;
+ overflow: hidden;
+ max-width: 100%;
+ border-color: $color-spacer;
+ border-top: $border-thin;
+ }
+ .item-category {
+ padding: $spacing-sm;
+ justify-content: flex-start;
+ align-items: flex-start;
+ flex-wrap: wrap;
+
+ vn-autocomplete[vn-id="category"] {
+ display: none;
+ }
+
+ & > vn-one {
+ padding: $spacing-sm;
+ min-width: 33.33%;
+ text-align: center;
+ box-sizing: border-box;
+
+ & > vn-icon {
+ padding: $spacing-sm;
+ background-color: $color-font-secondary;
+ border-radius: 50%;
+ cursor: pointer;
+
+ &.active {
+ background-color: $color-main;
+ color: #fff;
+ }
+ & > i:before {
+ font-size: 2.6rem;
+ width: 16px;
+ height: 16px;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/modules/item/front/fixed-price/index.html b/modules/item/front/fixed-price/index.html
index a82fd27428..9a143d10d9 100644
--- a/modules/item/front/fixed-price/index.html
+++ b/modules/item/front/fixed-price/index.html
@@ -14,16 +14,10 @@
order="name">
-
-
+
+
{
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
const rows = [
{
routeFk: 2,
diff --git a/modules/route/back/models/route.json b/modules/route/back/models/route.json
index 3b12f4ee67..cdb64dd715 100644
--- a/modules/route/back/models/route.json
+++ b/modules/route/back/models/route.json
@@ -1,10 +1,6 @@
{
"name": "Route",
"base": "Loggable",
- "log": {
- "model":"RouteLog",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "route"
diff --git a/modules/shelving/back/models/shelving.json b/modules/shelving/back/models/shelving.json
index 508ac428f0..5f60318a52 100644
--- a/modules/shelving/back/models/shelving.json
+++ b/modules/shelving/back/models/shelving.json
@@ -1,10 +1,6 @@
{
"name": "Shelving",
"base": "Loggable",
- "log": {
- "model": "ShelvingLog",
- "showField": "id"
- },
"options": {
"mysql": {
"table": "shelving"
diff --git a/modules/supplier/back/models/supplier-account.json b/modules/supplier/back/models/supplier-account.json
index 2ee83338b3..bc9cf0e24b 100644
--- a/modules/supplier/back/models/supplier-account.json
+++ b/modules/supplier/back/models/supplier-account.json
@@ -1,10 +1,6 @@
{
"name": "SupplierAccount",
"base": "Loggable",
- "log": {
- "model":"SupplierLog",
- "relation": "supplier"
- },
"options": {
"mysql": {
"table": "supplierAccount"
@@ -35,4 +31,4 @@
"foreignKey": "bankEntityFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/supplier/back/models/supplier-address.json b/modules/supplier/back/models/supplier-address.json
index 302f15e4b1..001b3a31ff 100644
--- a/modules/supplier/back/models/supplier-address.json
+++ b/modules/supplier/back/models/supplier-address.json
@@ -2,11 +2,6 @@
"name": "SupplierAddress",
"description": "Supplier addresses",
"base": "Loggable",
- "log": {
- "model": "SupplierLog",
- "relation": "supplier",
- "showField": "name"
- },
"options": {
"mysql": {
"table": "supplierAddress"
@@ -52,4 +47,4 @@
"foreignKey": "supplierFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/supplier/back/models/supplier-contact.json b/modules/supplier/back/models/supplier-contact.json
index 9e13c33a83..f928cd2043 100644
--- a/modules/supplier/back/models/supplier-contact.json
+++ b/modules/supplier/back/models/supplier-contact.json
@@ -1,10 +1,6 @@
{
"name": "SupplierContact",
"base": "Loggable",
- "log": {
- "model":"SupplierLog",
- "relation": "supplier"
- },
"options": {
"mysql": {
"table": "supplierContact"
@@ -50,4 +46,4 @@
"permission": "ALLOW"
}
]
-}
\ No newline at end of file
+}
diff --git a/modules/supplier/back/models/supplier.json b/modules/supplier/back/models/supplier.json
index ee2c4fbbd1..b6245ef324 100644
--- a/modules/supplier/back/models/supplier.json
+++ b/modules/supplier/back/models/supplier.json
@@ -1,9 +1,6 @@
{
"name": "Supplier",
"base": "Loggable",
- "log": {
- "model":"SupplierLog"
- },
"options": {
"mysql": {
"table": "supplier"
diff --git a/modules/supplier/front/agency-term/create/index.html b/modules/supplier/front/agency-term/create/index.html
index 29d7b9b6aa..728e981469 100644
--- a/modules/supplier/front/agency-term/create/index.html
+++ b/modules/supplier/front/agency-term/create/index.html
@@ -22,7 +22,7 @@
value-field="id"
rule>
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/modules/supplier/front/consumption/index.html b/modules/supplier/front/consumption/index.html
index 9e3bdac17d..e6c86abe3e 100644
--- a/modules/supplier/front/consumption/index.html
+++ b/modules/supplier/front/consumption/index.html
@@ -47,9 +47,11 @@
-
- {{::buy.itemName}}
-
+
+ {{::buy.itemName}}
+
@@ -89,3 +91,7 @@
message="The consumption report will be sent"
on-accept="$ctrl.sendEmail()">
+
+
diff --git a/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js
index 14bdf7aea6..61937989e2 100644
--- a/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js
+++ b/modules/ticket/back/methods/expedition/specs/deleteExpeditions.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('ticket deleteExpeditions()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should delete the selected expeditions', async() => {
const tx = await models.Expedition.beginTransaction({});
diff --git a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js
index ac397d38e5..5f211543ee 100644
--- a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js
+++ b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('ticket moveExpeditions()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should move the selected expeditions to new ticket', async() => {
const tx = await models.Expedition.beginTransaction({});
const ctx = {
diff --git a/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js b/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js
index 49413cf44e..de2817d87b 100644
--- a/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js
+++ b/modules/ticket/back/methods/ticket-request/specs/confirm.spec.js
@@ -1,6 +1,20 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('ticket-request confirm()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
let ctx = {
req: {
accessToken: {userId: 9},
diff --git a/modules/ticket/back/methods/ticket-request/specs/deny.spec.js b/modules/ticket/back/methods/ticket-request/specs/deny.spec.js
index 95fd0e84dc..875a75921c 100644
--- a/modules/ticket/back/methods/ticket-request/specs/deny.spec.js
+++ b/modules/ticket/back/methods/ticket-request/specs/deny.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('ticket-request deny()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should return the denied ticket request', async() => {
const tx = await models.TicketRequest.beginTransaction({});
diff --git a/modules/ticket/back/methods/ticket/closure.js b/modules/ticket/back/methods/ticket/closure.js
index d5fa58e7bd..9b3355d6c3 100644
--- a/modules/ticket/back/methods/ticket/closure.js
+++ b/modules/ticket/back/methods/ticket/closure.js
@@ -46,7 +46,7 @@ module.exports = async function(Self, tickets, reqArgs = {}) {
const fileName = `${year}${invoiceOut.ref}.pdf`;
// Store invoice
- storage.write(stream, {
+ await storage.write(stream, {
type: 'invoice',
path: `${year}/${month}/${day}`,
fileName: fileName
diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js
index ab1c32d1bd..39347f418d 100644
--- a/modules/ticket/back/methods/ticket/saveSign.js
+++ b/modules/ticket/back/methods/ticket/saveSign.js
@@ -34,6 +34,8 @@ module.exports = Self => {
const models = Self.app.models;
const myOptions = {};
let tx;
+ let dms;
+ let gestDocCreated = false;
if (typeof options == 'object')
Object.assign(myOptions, options);
@@ -96,11 +98,12 @@ module.exports = Self => {
warehouseId: ticket.warehouseFk,
companyId: ticket.companyFk,
dmsTypeId: dmsType.id,
- reference: id,
- description: `Ticket ${id} Cliente ${ticket.client().name} Ruta ${ticket.route().id}`,
+ reference: '',
+ description: `Firma del cliente - Ruta ${ticket.route().id}`,
hasFile: true
};
- await models.Ticket.uploadFile(ctxUploadFile, id, myOptions);
+ dms = await models.Dms.uploadFile(ctxUploadFile, myOptions);
+ gestDocCreated = true;
}
try {
@@ -118,12 +121,16 @@ module.exports = Self => {
throw new UserError('This ticket cannot be signed because it has not been boxed');
else if (!await gestDocExists(args.tickets[i])) {
if (args.location) setLocation(args.tickets[i]);
- await createGestDoc(args.tickets[i]);
+ if (!gestDocCreated) await createGestDoc(args.tickets[i]);
+ await models.TicketDms.create({ticketFk: args.tickets[i], dmsFk: dms[0].id}, myOptions);
+ const ticket = await models.Ticket.findById(args.tickets[i], null, myOptions);
+ await ticket.updateAttribute('isSigned', true, myOptions);
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [args.tickets[i], 'DELIVERED'], myOptions);
}
}
if (tx) await tx.commit();
+ return;
} catch (e) {
if (tx) await tx.rollback();
throw e;
diff --git a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js
index d65c876549..ef6422be2b 100644
--- a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js
@@ -17,6 +17,17 @@ describe('ticket componentUpdate()', () => {
let componentValue;
beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
const deliveryComponenet = await models.Component.findOne({where: {code: 'delivery'}});
deliveryComponentId = deliveryComponenet.id;
componentOfSaleSeven = `SELECT value
@@ -180,9 +191,6 @@ describe('ticket componentUpdate()', () => {
}
};
- spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
- active: ctx.req
- });
const oldTicket = await models.Ticket.findById(ticketID, null, options);
await models.Ticket.componentUpdate(ctx, options);
diff --git a/modules/ticket/back/models/expedition.json b/modules/ticket/back/models/expedition.json
index d74c56d2cc..e32a3b23d1 100644
--- a/modules/ticket/back/models/expedition.json
+++ b/modules/ticket/back/models/expedition.json
@@ -1,10 +1,6 @@
{
"name": "Expedition",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket"
- },
"options": {
"mysql": {
"table": "expedition"
@@ -59,4 +55,3 @@
}
}
}
-
\ No newline at end of file
diff --git a/modules/ticket/back/models/sale.json b/modules/ticket/back/models/sale.json
index 7b8cf501b0..72ca1f5e06 100644
--- a/modules/ticket/back/models/sale.json
+++ b/modules/ticket/back/models/sale.json
@@ -1,12 +1,6 @@
{
"name": "Sale",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket",
- "showField": "concept",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "sale"
diff --git a/modules/ticket/back/models/specs/ticket-packaging.spec.js b/modules/ticket/back/models/specs/ticket-packaging.spec.js
index f2834643dd..6d59456a3f 100644
--- a/modules/ticket/back/models/specs/ticket-packaging.spec.js
+++ b/modules/ticket/back/models/specs/ticket-packaging.spec.js
@@ -1,6 +1,20 @@
const app = require('vn-loopback/server/server');
+const LoopBackContext = require('loopback-context');
describe('ticket model TicketTracking', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
let ticketTrackingId;
afterAll(async() => {
diff --git a/modules/ticket/back/models/ticket-config.json b/modules/ticket/back/models/ticket-config.json
index a1c96e7f6a..d757fbd1a4 100644
--- a/modules/ticket/back/models/ticket-config.json
+++ b/modules/ticket/back/models/ticket-config.json
@@ -14,6 +14,15 @@
},
"scopeDays": {
"type": "number"
+ },
+ "pickingDelay": {
+ "type": "number"
+ },
+ "packagingInvoicingDated": {
+ "type": "date"
+ },
+ "daysForWarningClaim": {
+ "type": "number"
}
}
}
diff --git a/modules/ticket/back/models/ticket-dms.json b/modules/ticket/back/models/ticket-dms.json
index 8bcff254c6..071999be7f 100644
--- a/modules/ticket/back/models/ticket-dms.json
+++ b/modules/ticket/back/models/ticket-dms.json
@@ -1,10 +1,6 @@
{
"name": "TicketDms",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket"
- },
"options": {
"mysql": {
"table": "ticketDms"
@@ -29,4 +25,4 @@
"foreignKey": "dmsFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/ticket/back/models/ticket-observation.json b/modules/ticket/back/models/ticket-observation.json
index 9035e44405..64e49b2170 100644
--- a/modules/ticket/back/models/ticket-observation.json
+++ b/modules/ticket/back/models/ticket-observation.json
@@ -1,10 +1,6 @@
{
"name": "TicketObservation",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket"
- },
"options": {
"mysql": {
"table": "ticketObservation"
diff --git a/modules/ticket/back/models/ticket-packaging.json b/modules/ticket/back/models/ticket-packaging.json
index 533f4064cd..6c94c810e6 100644
--- a/modules/ticket/back/models/ticket-packaging.json
+++ b/modules/ticket/back/models/ticket-packaging.json
@@ -1,10 +1,6 @@
{
"name": "TicketPackaging",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket"
- },
"options": {
"mysql": {
"table": "ticketPackaging"
diff --git a/modules/ticket/back/models/ticket-refund.json b/modules/ticket/back/models/ticket-refund.json
index 8fd0e23063..d344a3f1c8 100644
--- a/modules/ticket/back/models/ticket-refund.json
+++ b/modules/ticket/back/models/ticket-refund.json
@@ -6,10 +6,6 @@
"table": "ticketRefund"
}
},
- "log": {
- "model": "TicketLog",
- "relation": "originalTicket"
- },
"properties": {
"id": {
"id": true,
diff --git a/modules/ticket/back/models/ticket-request.json b/modules/ticket/back/models/ticket-request.json
index 01601c7f6c..f8407792ef 100644
--- a/modules/ticket/back/models/ticket-request.json
+++ b/modules/ticket/back/models/ticket-request.json
@@ -1,10 +1,6 @@
{
"name": "TicketRequest",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket"
- },
"options": {
"mysql": {
"table": "ticketRequest"
@@ -64,4 +60,4 @@
"foreignKey": "itemFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/ticket/back/models/ticket-service.json b/modules/ticket/back/models/ticket-service.json
index 347b6b976e..f1dbede133 100644
--- a/modules/ticket/back/models/ticket-service.json
+++ b/modules/ticket/back/models/ticket-service.json
@@ -1,11 +1,6 @@
{
"name": "TicketService",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket",
- "showField": "description"
- },
"options": {
"mysql": {
"table": "ticketService"
@@ -59,4 +54,4 @@
"foreignKey": "ticketServiceTypeFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/ticket/back/models/ticket-tracking.json b/modules/ticket/back/models/ticket-tracking.json
index e80e2f8f4a..8b5ce0b643 100644
--- a/modules/ticket/back/models/ticket-tracking.json
+++ b/modules/ticket/back/models/ticket-tracking.json
@@ -1,16 +1,11 @@
{
"name": "TicketTracking",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket",
- "showField": "stateFk"
- },
- "options": {
- "mysql": {
- "table": "ticketTracking"
- }
- },
+ "options": {
+ "mysql": {
+ "table": "ticketTracking"
+ }
+ },
"properties": {
"id": {
"id": true,
@@ -48,4 +43,3 @@
}
}
}
-
\ No newline at end of file
diff --git a/modules/ticket/back/models/ticket-weekly.json b/modules/ticket/back/models/ticket-weekly.json
index d81baf4adb..c5e485aa23 100644
--- a/modules/ticket/back/models/ticket-weekly.json
+++ b/modules/ticket/back/models/ticket-weekly.json
@@ -1,11 +1,6 @@
{
"name": "TicketWeekly",
"base": "Loggable",
- "log": {
- "model": "TicketLog",
- "relation": "ticket",
- "showField": "ticketFk"
- },
"options": {
"mysql": {
"table": "ticketWeekly"
@@ -32,4 +27,4 @@
"foreignKey": "agencyModeFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/ticket/back/models/ticket.json b/modules/ticket/back/models/ticket.json
index dabda838a6..b2e87362f5 100644
--- a/modules/ticket/back/models/ticket.json
+++ b/modules/ticket/back/models/ticket.json
@@ -1,11 +1,6 @@
{
"name": "Ticket",
"base": "Loggable",
- "log": {
- "model":"TicketLog",
- "showField": "id",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "ticket"
diff --git a/modules/ticket/front/sale/index.html b/modules/ticket/front/sale/index.html
index 6fc986e8f1..6c37230aef 100644
--- a/modules/ticket/front/sale/index.html
+++ b/modules/ticket/front/sale/index.html
@@ -481,6 +481,13 @@
on-accept="$ctrl.transferSales($ctrl.transfer.ticketId)">
+
+
+
Add claim
+
{
+ this.ticketConfig = res.data;
+ });
+ }
get isClaimable() {
if (this.ticket) {
@@ -184,6 +194,16 @@ class Controller extends Section {
}
createClaim() {
+ const timeDifference = new Date().getTime() - new Date(this.ticket.shipped).getTime();
+ const pastDays = Math.floor(timeDifference / 86400000);
+
+ if (pastDays >= this.ticketConfig[0].daysForWarningClaim)
+ this.$.claimConfirm.show();
+ else
+ this.onCreateClaimAccepted();
+ }
+
+ onCreateClaimAccepted() {
const sales = this.selectedValidSales();
const params = {ticketId: this.ticket.id, sales: sales};
this.resetChanges();
diff --git a/modules/ticket/front/sale/index.spec.js b/modules/ticket/front/sale/index.spec.js
index 8585503cc4..c35ed3d9af 100644
--- a/modules/ticket/front/sale/index.spec.js
+++ b/modules/ticket/front/sale/index.spec.js
@@ -45,6 +45,7 @@ describe('Ticket', () => {
$scope.model = crudModel;
$scope.editDiscount = {relocate: () => {}, hide: () => {}};
$scope.editPricePopover = {relocate: () => {}};
+ $scope.claimConfirm = {show: () => {}};
$httpBackend = _$httpBackend_;
Object.defineProperties($state.params, {
id: {
@@ -61,6 +62,10 @@ describe('Ticket', () => {
controller.card = {reload: () => {}};
controller._ticket = ticket;
controller._sales = sales;
+ controller.ticketConfig = [
+ {daysForWarningClaim: 1}
+ ];
+ $httpBackend.expect('GET', 'TicketConfigs').respond(200);
}));
describe('ticket() setter', () => {
@@ -113,7 +118,6 @@ describe('Ticket', () => {
it('should make an HTTP GET query and return the worker mana', () => {
controller.edit = {};
const expectedAmount = 250;
-
$httpBackend.expect('GET', 'Tickets/1/getSalesPersonMana').respond(200, expectedAmount);
$httpBackend.expect('GET', 'Sales/usesMana').respond(200);
$httpBackend.expect('GET', 'WorkerManas/getCurrentWorkerMana').respond(200, expectedAmount);
@@ -279,7 +283,17 @@ describe('Ticket', () => {
});
describe('createClaim()', () => {
- it('should perform a query and call windows open', () => {
+ it('should call to the claimConfirm show() method', () => {
+ jest.spyOn(controller.$.claimConfirm, 'show').mockReturnThis();
+
+ controller.createClaim();
+
+ expect(controller.$.claimConfirm.show).toHaveBeenCalledWith();
+ });
+ });
+
+ describe('onCreateClaimAccepted()', () => {
+ it('should perform a query and call window open', () => {
jest.spyOn(controller, 'resetChanges').mockReturnThis();
jest.spyOn(controller.$state, 'go').mockReturnThis();
@@ -290,7 +304,7 @@ describe('Ticket', () => {
const expectedParams = {ticketId: 1, sales: [firstSale]};
$httpBackend.expect('POST', `Claims/createFromSales`, expectedParams).respond(200, {id: 1});
- controller.createClaim();
+ controller.onCreateClaimAccepted();
$httpBackend.flush();
expect(controller.resetChanges).toHaveBeenCalledWith();
diff --git a/modules/ticket/front/sale/locale/es.yml b/modules/ticket/front/sale/locale/es.yml
index 41ba52d17a..bb61db8243 100644
--- a/modules/ticket/front/sale/locale/es.yml
+++ b/modules/ticket/front/sale/locale/es.yml
@@ -40,4 +40,5 @@ Refund: Abono
Promotion mana: Maná promoción
Claim mana: Maná reclamación
History: Historial
-Select lines to see the options: Seleccione lineas para ver las opciones
+Do you want to continue?: ¿Desea continuar?
+Claim out of time: Reclamación fuera de plazo
diff --git a/modules/travel/back/methods/travel/specs/createThermograph.spec.js b/modules/travel/back/methods/travel/specs/createThermograph.spec.js
index 742e2dc181..e812eae708 100644
--- a/modules/travel/back/methods/travel/specs/createThermograph.spec.js
+++ b/modules/travel/back/methods/travel/specs/createThermograph.spec.js
@@ -1,6 +1,20 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('Travel createThermograph()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
const travelId = 3;
const currentUserId = 1102;
const thermographId = '138350-0';
diff --git a/modules/travel/back/models/travel-thermograph.json b/modules/travel/back/models/travel-thermograph.json
index 754df1c3e9..08eec2847c 100644
--- a/modules/travel/back/models/travel-thermograph.json
+++ b/modules/travel/back/models/travel-thermograph.json
@@ -1,14 +1,9 @@
{
"name": "TravelThermograph",
"base": "Loggable",
- "log": {
- "model":"TravelLog",
- "relation": "travel",
- "showField": "ref"
- },
"options": {
"mysql": {
- "table": "travelThermograph"
+ "table": "travelThermograph"
}
},
"properties": {
diff --git a/modules/travel/back/models/travel.json b/modules/travel/back/models/travel.json
index 7dd9f5bba0..95d4581214 100644
--- a/modules/travel/back/models/travel.json
+++ b/modules/travel/back/models/travel.json
@@ -1,11 +1,6 @@
{
"name": "Travel",
"base": "Loggable",
- "log": {
- "model":"TravelLog",
- "showField": "ref",
- "grabUser": true
- },
"options": {
"mysql": {
"table": "travel"
diff --git a/modules/worker/back/models/worker-dms.json b/modules/worker/back/models/worker-dms.json
index 575cfbc243..e9a9f17730 100644
--- a/modules/worker/back/models/worker-dms.json
+++ b/modules/worker/back/models/worker-dms.json
@@ -1,11 +1,6 @@
{
"name": "WorkerDms",
"base": "Loggable",
- "log": {
- "model":"ClientLog",
- "relation": "worker",
- "showField": "dmsFk"
- },
"options": {
"mysql": {
"table": "workerDocument"
diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json
index d21094f26c..1a9b6ba69e 100644
--- a/modules/worker/back/models/worker.json
+++ b/modules/worker/back/models/worker.json
@@ -2,10 +2,6 @@
"name": "Worker",
"description": "Company employees",
"base": "Loggable",
- "log": {
- "model":"WorkerLog",
- "showField": "firstName"
- },
"options": {
"mysql": {
"table": "worker"
diff --git a/modules/zone/back/methods/zone/specs/clone.spec.js b/modules/zone/back/methods/zone/specs/clone.spec.js
index 92392d7892..1b73939126 100644
--- a/modules/zone/back/methods/zone/specs/clone.spec.js
+++ b/modules/zone/back/methods/zone/specs/clone.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('agency clone()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should clone a zone', async() => {
const tx = await models.Zone.beginTransaction({});
diff --git a/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js b/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js
index a34132be40..fbe96fc5f8 100644
--- a/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js
+++ b/modules/zone/back/methods/zone/specs/exclusionGeo.spec.js
@@ -1,6 +1,20 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('zone exclusionGeo()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
const zoneId = 1;
const today = Date.vnNew();
diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js
index 562e62f5fd..746a2d0bd9 100644
--- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js
+++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js
@@ -1,6 +1,21 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('zone toggleIsIncluded()', () => {
+ beforeAll(async() => {
+ const activeCtx = {
+ accessToken: {userId: 9},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
it('should return the created location with isIncluded true', async() => {
const tx = await models.Zone.beginTransaction({});
diff --git a/modules/zone/back/models/zone-event.json b/modules/zone/back/models/zone-event.json
index 7cf4b83011..e477dad6aa 100644
--- a/modules/zone/back/models/zone-event.json
+++ b/modules/zone/back/models/zone-event.json
@@ -1,10 +1,6 @@
{
"name": "ZoneEvent",
"base": "Loggable",
- "log": {
- "model":"ZoneLog",
- "relation": "zone"
- },
"options": {
"mysql": {
"table": "zoneEvent"
@@ -57,4 +53,4 @@
"foreignKey": "zoneFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/zone/back/models/zone-exclusion.json b/modules/zone/back/models/zone-exclusion.json
index e8088cd448..00c9145cda 100644
--- a/modules/zone/back/models/zone-exclusion.json
+++ b/modules/zone/back/models/zone-exclusion.json
@@ -1,10 +1,6 @@
{
"name": "ZoneExclusion",
"base": "Loggable",
- "log": {
- "model":"ZoneLog",
- "relation": "zone"
- },
"options": {
"mysql": {
"table": "zoneExclusion"
@@ -27,4 +23,4 @@
"foreignKey": "zoneFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/zone/back/models/zone-included.json b/modules/zone/back/models/zone-included.json
index 595f47a784..61633a3c71 100644
--- a/modules/zone/back/models/zone-included.json
+++ b/modules/zone/back/models/zone-included.json
@@ -1,11 +1,6 @@
{
"name": "ZoneIncluded",
"base": "Loggable",
- "log": {
- "model": "ZoneLog",
- "relation": "zone",
- "showField": "isIncluded"
- },
"options": {
"mysql": {
"table": "zoneIncluded"
@@ -32,4 +27,4 @@
"foreignKey": "geoFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/zone/back/models/zone-warehouse.json b/modules/zone/back/models/zone-warehouse.json
index 003e4e3c29..b222e95e72 100644
--- a/modules/zone/back/models/zone-warehouse.json
+++ b/modules/zone/back/models/zone-warehouse.json
@@ -1,10 +1,6 @@
{
"name": "ZoneWarehouse",
"base": "Loggable",
- "log": {
- "model":"ZoneLog",
- "relation": "zone"
- },
"options": {
"mysql": {
"table": "zoneWarehouse"
@@ -32,4 +28,4 @@
"foreignKey": "warehouseFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/zone/back/models/zone.json b/modules/zone/back/models/zone.json
index 06ea5ca2bd..c86da3d3e9 100644
--- a/modules/zone/back/models/zone.json
+++ b/modules/zone/back/models/zone.json
@@ -1,10 +1,6 @@
{
"name": "Zone",
"base": "Loggable",
- "log": {
- "model":"ZoneLog",
- "showField": "name"
- },
"options": {
"mysql": {
"table": "zone"
@@ -59,7 +55,7 @@
"exclusions": {
"type": "hasMany",
"model": "ZoneExclusion",
- "foreignKey": "zoneFk"
+ "foreignKey": "zoneFk"
},
"warehouses": {
"type": "hasMany",
@@ -72,4 +68,4 @@
"foreignKey": "zoneFk"
}
}
-}
\ No newline at end of file
+}
diff --git a/package-lock.json b/package-lock.json
index 7e86dbba9c..e59a073c77 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "salix-back",
- "version": "23.08.01",
+ "version": "23.12.01",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "salix-back",
- "version": "23.08.01",
+ "version": "23.12.01",
"license": "GPL-3.0",
"dependencies": {
"axios": "^1.2.2",
@@ -41,7 +41,6 @@
"puppeteer": "^18.0.5",
"read-chunk": "^3.2.0",
"require-yaml": "0.0.1",
- "sharp": "^0.31.3",
"smbhash": "0.0.1",
"strong-error-handler": "^2.3.2",
"uuid": "^3.3.3",
@@ -5444,17 +5443,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/color": {
- "version": "4.2.3",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
- "engines": {
- "node": ">=12.5.0"
- }
- },
"node_modules/color-convert": {
"version": "2.0.1",
"license": "MIT",
@@ -5469,14 +5457,6 @@
"version": "1.1.4",
"license": "MIT"
},
- "node_modules/color-string": {
- "version": "1.9.1",
- "license": "MIT",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
"node_modules/color-support": {
"version": "1.1.3",
"license": "ISC",
@@ -6149,6 +6129,7 @@
},
"node_modules/deep-extend": {
"version": "0.6.0",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=4.0.0"
@@ -7630,13 +7611,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/expand-template": {
- "version": "2.0.3",
- "license": "(MIT OR WTFPL)",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/expand-tilde": {
"version": "2.0.2",
"dev": true,
@@ -8891,10 +8865,6 @@
"assert-plus": "^1.0.0"
}
},
- "node_modules/github-from-package": {
- "version": "0.0.0",
- "license": "MIT"
- },
"node_modules/glob": {
"version": "7.2.0",
"license": "ISC",
@@ -11516,6 +11486,7 @@
},
"node_modules/ini": {
"version": "1.3.8",
+ "dev": true,
"license": "ISC"
},
"node_modules/internal-ip": {
@@ -11645,10 +11616,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-arrayish": {
- "version": "0.3.2",
- "license": "MIT"
- },
"node_modules/is-bigint": {
"version": "1.0.4",
"dev": true,
@@ -15610,10 +15577,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/napi-build-utils": {
- "version": "1.0.2",
- "license": "MIT"
- },
"node_modules/natural-compare": {
"version": "1.4.0",
"dev": true,
@@ -15655,43 +15618,6 @@
"node": ">=4.0.0"
}
},
- "node_modules/node-abi": {
- "version": "3.28.0",
- "license": "MIT",
- "dependencies": {
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-abi/node_modules/lru-cache": {
- "version": "6.0.0",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-abi/node_modules/semver": {
- "version": "7.3.8",
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-abi/node_modules/yallist": {
- "version": "4.0.0",
- "license": "ISC"
- },
"node_modules/node-addon-api": {
"version": "5.0.0",
"license": "MIT"
@@ -17539,30 +17465,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/prebuild-install": {
- "version": "7.1.1",
- "license": "MIT",
- "dependencies": {
- "detect-libc": "^2.0.0",
- "expand-template": "^2.0.3",
- "github-from-package": "0.0.0",
- "minimist": "^1.2.3",
- "mkdirp-classic": "^0.5.3",
- "napi-build-utils": "^1.0.1",
- "node-abi": "^3.3.0",
- "pump": "^3.0.0",
- "rc": "^1.2.7",
- "simple-get": "^4.0.0",
- "tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0"
- },
- "bin": {
- "prebuild-install": "bin.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/precond": {
"version": "0.2.3",
"engines": {
@@ -18057,6 +17959,7 @@
},
"node_modules/rc": {
"version": "1.2.8",
+ "dev": true,
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"dependencies": {
"deep-extend": "^0.6.0",
@@ -19786,55 +19689,6 @@
"node": ">=8"
}
},
- "node_modules/sharp": {
- "version": "0.31.3",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
- "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==",
- "hasInstallScript": true,
- "dependencies": {
- "color": "^4.2.3",
- "detect-libc": "^2.0.1",
- "node-addon-api": "^5.0.0",
- "prebuild-install": "^7.1.1",
- "semver": "^7.3.8",
- "simple-get": "^4.0.1",
- "tar-fs": "^2.1.1",
- "tunnel-agent": "^0.6.0"
- },
- "engines": {
- "node": ">=14.15.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/sharp/node_modules/lru-cache": {
- "version": "6.0.0",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/sharp/node_modules/semver": {
- "version": "7.3.8",
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/sharp/node_modules/yallist": {
- "version": "4.0.0",
- "license": "ISC"
- },
"node_modules/shebang-command": {
"version": "2.0.0",
"license": "MIT",
@@ -19893,77 +19747,6 @@
"version": "3.0.7",
"license": "ISC"
},
- "node_modules/simple-concat": {
- "version": "1.0.1",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/simple-get": {
- "version": "4.0.1",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "decompress-response": "^6.0.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- }
- },
- "node_modules/simple-get/node_modules/decompress-response": {
- "version": "6.0.0",
- "license": "MIT",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/simple-get/node_modules/mimic-response": {
- "version": "3.1.0",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/simple-swizzle": {
- "version": "0.2.2",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
"node_modules/simple-update-notifier": {
"version": "1.0.7",
"dev": true,
@@ -20864,6 +20647,7 @@
},
"node_modules/strip-json-comments": {
"version": "2.0.1",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -30018,13 +29802,6 @@
"object-visit": "^1.0.0"
}
},
- "color": {
- "version": "4.2.3",
- "requires": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- }
- },
"color-convert": {
"version": "2.0.1",
"requires": {
@@ -30034,13 +29811,6 @@
"color-name": {
"version": "1.1.4"
},
- "color-string": {
- "version": "1.9.1",
- "requires": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
"color-support": {
"version": "1.1.3"
},
@@ -30487,7 +30257,8 @@
}
},
"deep-extend": {
- "version": "0.6.0"
+ "version": "0.6.0",
+ "dev": true
},
"deep-is": {
"version": "0.1.4"
@@ -31501,9 +31272,6 @@
}
}
},
- "expand-template": {
- "version": "2.0.3"
- },
"expand-tilde": {
"version": "2.0.2",
"dev": true,
@@ -32389,9 +32157,6 @@
"assert-plus": "^1.0.0"
}
},
- "github-from-package": {
- "version": "0.0.0"
- },
"glob": {
"version": "7.2.0",
"requires": {
@@ -34296,7 +34061,8 @@
"version": "2.0.4"
},
"ini": {
- "version": "1.3.8"
+ "version": "1.3.8",
+ "dev": true
},
"internal-ip": {
"version": "4.3.0",
@@ -34372,9 +34138,6 @@
"has-tostringtag": "^1.0.0"
}
},
- "is-arrayish": {
- "version": "0.3.2"
- },
"is-bigint": {
"version": "1.0.4",
"dev": true,
@@ -37151,9 +36914,6 @@
"to-regex": "^3.0.1"
}
},
- "napi-build-utils": {
- "version": "1.0.2"
- },
"natural-compare": {
"version": "1.4.0",
"dev": true
@@ -37182,29 +36942,6 @@
"nocache": {
"version": "2.1.0"
},
- "node-abi": {
- "version": "3.28.0",
- "requires": {
- "semver": "^7.3.5"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.3.8",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0"
- }
- }
- },
"node-addon-api": {
"version": "5.0.0"
},
@@ -38439,23 +38176,6 @@
"version": "3.3.1",
"dev": true
},
- "prebuild-install": {
- "version": "7.1.1",
- "requires": {
- "detect-libc": "^2.0.0",
- "expand-template": "^2.0.3",
- "github-from-package": "0.0.0",
- "minimist": "^1.2.3",
- "mkdirp-classic": "^0.5.3",
- "napi-build-utils": "^1.0.1",
- "node-abi": "^3.3.0",
- "pump": "^3.0.0",
- "rc": "^1.2.7",
- "simple-get": "^4.0.0",
- "tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0"
- }
- },
"precond": {
"version": "0.2.3"
},
@@ -38789,6 +38509,7 @@
},
"rc": {
"version": "1.2.8",
+ "dev": true,
"requires": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
@@ -40001,38 +39722,6 @@
"kind-of": "^6.0.2"
}
},
- "sharp": {
- "version": "0.31.3",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
- "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==",
- "requires": {
- "color": "^4.2.3",
- "detect-libc": "^2.0.1",
- "node-addon-api": "^5.0.0",
- "prebuild-install": "^7.1.1",
- "semver": "^7.3.8",
- "simple-get": "^4.0.1",
- "tar-fs": "^2.1.1",
- "tunnel-agent": "^0.6.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.3.8",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0"
- }
- }
- },
"shebang-command": {
"version": "2.0.0",
"requires": {
@@ -40073,34 +39762,6 @@
"signal-exit": {
"version": "3.0.7"
},
- "simple-concat": {
- "version": "1.0.1"
- },
- "simple-get": {
- "version": "4.0.1",
- "requires": {
- "decompress-response": "^6.0.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- },
- "dependencies": {
- "decompress-response": {
- "version": "6.0.0",
- "requires": {
- "mimic-response": "^3.1.0"
- }
- },
- "mimic-response": {
- "version": "3.1.0"
- }
- }
- },
- "simple-swizzle": {
- "version": "0.2.2",
- "requires": {
- "is-arrayish": "^0.3.1"
- }
- },
"simple-update-notifier": {
"version": "1.0.7",
"dev": true,
@@ -40746,7 +40407,8 @@
}
},
"strip-json-comments": {
- "version": "2.0.1"
+ "version": "2.0.1",
+ "dev": true
},
"strong-error-handler": {
"version": "2.3.2",
diff --git a/package.json b/package.json
index 607367e7b6..8d6c5340ba 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,6 @@
"puppeteer": "^18.0.5",
"read-chunk": "^3.2.0",
"require-yaml": "0.0.1",
- "sharp": "^0.31.3",
"smbhash": "0.0.1",
"strong-error-handler": "^2.3.2",
"uuid": "^3.3.3",
diff --git a/print/core/cluster.js b/print/core/cluster.js
index 23b3d88e9c..d54044fa26 100644
--- a/print/core/cluster.js
+++ b/print/core/cluster.js
@@ -4,40 +4,38 @@ const {cpus} = require('os');
module.exports = {
init() {
- if (!this.pool) {
- Cluster.launch({
- concurrency: Cluster.CONCURRENCY_CONTEXT,
- maxConcurrency: cpus().length,
- puppeteerOptions: {
- headless: true,
- args: [
- '--no-sandbox',
- '--disable-setuid-sandbox',
- '--no-zygote'
- ]
- }
- })
- .then(cluster => {
- this.pool = cluster;
+ if (this.pool) return;
+ Cluster.launch({
+ concurrency: Cluster.CONCURRENCY_CONTEXT,
+ maxConcurrency: cpus().length,
+ puppeteerOptions: {
+ headless: true,
+ args: [
+ '--no-sandbox',
+ '--disable-setuid-sandbox',
+ '--no-zygote'
+ ]
+ }
+ }).then(cluster => {
+ this.pool = cluster;
- log4js.configure({
- appenders: {
- out: {type: 'stdout'}
- },
- categories: {default: {appenders: ['out'], level: 'info'}},
- });
+ log4js.configure({
+ appenders: {
+ out: {type: 'stdout'}
+ },
+ categories: {default: {appenders: ['out'], level: 'info'}},
+ });
- const logger = log4js.getLogger();
+ const logger = log4js.getLogger();
- cluster.on('taskerror', (err, data, willRetry) => {
- if (willRetry)
- logger.warn(`[Print] => ${err.message}\nThis job will be retried`);
- else
- logger.error(`[Print] => ${err.message}`);
- });
+ cluster.on('taskerror', (err, data, willRetry) => {
+ if (willRetry)
+ logger.warn(`[Print] => ${err.message}\nThis job will be retried`);
+ else
+ logger.error(`[Print] => ${err.message}`);
+ });
- cluster.on('queue', () => logger.info('Printing task initialized by pool'));
- });
- }
+ cluster.on('queue', () => logger.info('Printing task initialized by pool'));
+ });
}
};
diff --git a/print/core/report.js b/print/core/report.js
index c5182d1a81..23cffac2c4 100644
--- a/print/core/report.js
+++ b/print/core/report.js
@@ -32,28 +32,31 @@ class Report extends Component {
if (fs.existsSync(fullPath))
options = require(optionsPath);
- return new Promise(resolve => {
+ return new Promise((resolve, reject) => {
Cluster.pool.queue({}, async({page}) => {
- await page.emulateMediaType('screen');
- await page.setContent(template);
+ try {
+ await page.emulateMediaType('screen');
+ await page.setContent(template);
- const element = await page.$('#pageFooter');
+ const element = await page.$('#pageFooter');
- let footer = '\n';
- if (element) {
- footer = await page.evaluate(el => {
- const html = el.innerHTML;
- el.remove();
- return html;
- }, element);
+ let footer = '\n';
+ if (element) {
+ footer = await page.evaluate(el => {
+ const html = el.innerHTML;
+ el.remove();
+ return html;
+ }, element);
+ }
+
+ options.headerTemplate = '\n';
+ options.footerTemplate = footer;
+
+ const buffer = await page.pdf(options);
+ resolve(buffer);
+ } catch (err) {
+ reject(err);
}
-
- options.headerTemplate = '\n';
- options.footerTemplate = footer;
-
- const stream = await page.pdf(options);
-
- resolve(stream);
});
});
}
diff --git a/print/core/storage.js b/print/core/storage.js
index 063a2fbec2..66f7ce98a9 100644
--- a/print/core/storage.js
+++ b/print/core/storage.js
@@ -3,26 +3,14 @@ const path = require('path');
const fs = require('fs-extra');
module.exports = {
- async write(stream, options) {
+ async write(buffer, options) {
const storage = config.storage[options.type];
-
if (!storage) return;
const src = path.join(storage.root, options.path);
const fileSrc = path.join(src, options.fileName);
await fs.mkdir(src, {recursive: true});
-
- const writeStream = fs.createWriteStream(fileSrc);
- writeStream.on('open', () => writeStream.write(stream));
- writeStream.on('finish', () => writeStream.end());
-
- return new Promise(resolve => {
- writeStream.on('close', () => resolve());
- });
- },
-
- load(type, data) {
-
+ await fs.writeFile(fileSrc, buffer);
}
};