7167-testToMaster_2414 #2244

Merged
alexm merged 643 commits from 7167-testToMaster_2414 into master 2024-04-04 05:32:41 +00:00
27 changed files with 276 additions and 148 deletions
Showing only changes of commit 625c498f26 - Show all commits

View File

@ -88,7 +88,7 @@ module.exports = Self => {
warehouseFk: args.warehouseId,
reference: args.reference,
description: args.description,
contentType: args.contentType,
contentType: uploadedFile.type,
hasFile: args.hasFile
};
const extension = await models.DmsContainer.getFileExtension(uploadedFile.name);

View File

@ -3068,3 +3068,6 @@ INSERT INTO `vn`.`cmr` (id,truckPlate,observations,senderInstruccions,paymentIns
VALUES (1,'123456A','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',442,1,2,1,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet'),
(2,'123456N','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',69,3,4,2,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet'),
(3,'123456B','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',567,5,6,69,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet');
UPDATE vn.department
SET workerFk = null;

View File

@ -16,7 +16,7 @@ BEGIN
LEFT JOIN vn.supplier s
ON s.id = bp.supplierFk
LEFT JOIN vn.bank b
ON b.id = bp.bankFk
ON b.id = bp.accountingFk
WHERE bp.insuranceExpired = util.VN_CURDATE();
END$$
DELIMITER ;

View File

@ -48,7 +48,7 @@ BEGIN
IF vCounter > 0 OR vASIEN > 0 THEN
UPDATE vn2008.XDiario x
UPDATE XDiario x
JOIN ledgerConfig lc ON lc.lastBookEntry = x.ASIEN
SET x.ASIEN = vASIEN;

View File

@ -75,7 +75,7 @@ BEGIN
SET vDated = DATE(vTimed);
SELECT IF(pc.name = 'Conductor +3500kg',
SELECT IF(pc.code = 'driveCE',
wc.dayBreakDriver,
wc.dayBreak),
wc.shortWeekBreak,

View File

@ -1,14 +0,0 @@
CREATE OR REPLACE DEFINER=`root`@`localhost`
SQL SECURITY DEFINER
VIEW `vn`.`doc`
AS SELECT `g`.`id` AS `id`,
`g`.`sref` AS `sref`,
`g`.`brief` AS `brief`,
`g`.`emp_id` AS `companyFk`,
`g`.`orden` AS `order`,
`g`.`file` AS `file`,
`g`.`original` AS `original`,
`g`.`trabajador_id` AS `workerFk`,
`g`.`odbc_date` AS `created`,
`g`.`warehouse_id` AS `warehouseFk`
FROM `vn2008`.`gestdoc` `g`

View File

@ -1,9 +1,11 @@
CREATE OR REPLACE DEFINER=`root`@`localhost`
SQL SECURITY DEFINER
VIEW `vn2008`.`credit`
AS SELECT `c`.`id` AS `id`,
AS SELECT
`c`.`id` AS `id`,
`c`.`clientFk` AS `Id_Cliente`,
`c`.`workerFk` AS `Id_Trabajador`,
`c`.`amount` AS `amount`,
`c`.`created` AS `odbc_date`
FROM `vn`.`clientCredit` `c`
FROM
`vn`.`clientCredit` `c`

View File

@ -0,0 +1,8 @@
CREATE OR REPLACE DEFINER=`root`@`localhost`
SQL SECURITY DEFINER
VIEW `vn2008`.`versiones`
AS SELECT `m`.`app` AS `programa`,
`m`.`version` AS `version`,
0 AS `critical`
FROM `vn`.`mdbVersion` `m`
WHERE `m`.`branchFk` = 'master'

View File

@ -0,0 +1,6 @@
CREATE OR REPLACE DEFINER=`root`@`localhost`
SQL SECURITY DEFINER
VIEW `vn2008`.`credit`AS
SELECT 1;
GRANT SELECT ON TABLE vn2008.credit TO financialBoss;

View File

@ -1,24 +1,33 @@
ALTER TABLE IF EXISTS vn2008.gastos_resumen DROP FOREIGN KEY IF EXISTS gastos_resumen_expense_FK;
ALTER TABLE IF EXISTS `vn2008`.`gastos_resumen` RENAME `vn`.`expenseManual`;
ALTER TABLE IF EXISTS `vn`.`expenseManual`
ALTER TABLE `vn`.`expenseManual`
CHANGE COLUMN IF EXISTS `Id_Gasto` `expenseFk` varchar(10) NOT NULL,
CHANGE COLUMN IF EXISTS `importe` `amount` decimal(10,2) DEFAULT NULL,
CHANGE COLUMN IF EXISTS `empresa_id` `companyFk` int(11) NOT NULL;
ALTER TABLE IF EXISTS vn.expenseManual COLLATE=utf8mb3_general_ci;
ALTER TABLE vn.expenseManual COLLATE=utf8mb3_general_ci;
ALTER TABLE IF EXISTS vn.expenseManual MODIFY COLUMN IF EXISTS expenseFk varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL;
ALTER TABLE vn.expenseManual MODIFY COLUMN IF EXISTS expenseFk varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL;
ALTER TABLE IF EXISTS vn.expenseManual ADD CONSTRAINT expenseManual_expense_FK FOREIGN KEY IF NOT EXISTS (expenseFk) REFERENCES vn.expense(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE IF EXISTS vn.expenseManual MODIFY COLUMN IF EXISTS companyFk int(10) unsigned NOT NULL;
ALTER TABLE vn.expenseManual DROP PRIMARY KEY;
ALTER TABLE vn.expenseManual MODIFY COLUMN companyFk int(10) unsigned NULL;
ALTER TABLE vn.expenseManual ADD CONSTRAINT expenseManual_expense_FK FOREIGN KEY IF NOT EXISTS (expenseFk) REFERENCES vn.expense(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE vn.expenseManual ADD CONSTRAINT expenseManual_company_FK FOREIGN KEY IF NOT EXISTS (companyFk) REFERENCES vn.company(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE vn.expenseManual ADD IF NOT EXISTS id INT unsigned NOT NULL FIRST;
ALTER TABLE vn.expenseManual ADD CONSTRAINT expenseManual_pk PRIMARY KEY IF NOT EXISTS (id);
ALTER TABLE vn.expenseManual ADD CONSTRAINT expenseManual_unique UNIQUE KEY IF NOT EXISTS (expenseFk,`year`,`month`,companyFk);
ALTER TABLE vn.expenseManual MODIFY COLUMN IF EXISTS companyFk int(10) unsigned NOT NULL;
UPDATE vn.expenseManual
SET companyFK= NULL
WHERE companyFk= 0;
ALTER TABLE IF EXISTS vn.expenseManual ADD CONSTRAINT expenseManual_company_FK FOREIGN KEY IF NOT EXISTS (companyFk) REFERENCES vn.company(id) ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -0,0 +1,6 @@
ALTER TABLE vn.professionalCategory DROP COLUMN IF EXISTS code;
ALTER TABLE IF EXISTS vn.professionalCategory ADD COLUMN code VARCHAR(25) DEFAULT NULL;
UPDATE vn.professionalCategory
SET code = 'driverCE'
WHERE name = 'Conductor C + E';

View File

@ -28,7 +28,6 @@ module.exports = Self => {
Self.setRating = async function(ctx, id, rating, recommendedCredit, options) {
let tx;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
@ -42,6 +41,7 @@ module.exports = Self => {
const clientUpdated = await client.updateAttributes({
rating: rating,
recommendedCredit: recommendedCredit
}, myOptions);
if (tx) await tx.commit();

View File

@ -40,4 +40,26 @@ describe('Client setRating()', () => {
throw e;
}
});
it('should change rating and recommendedCredit to 0', async() => {
const tx = await models.Ticket.beginTransaction({});
try {
const options = {transaction: tx};
const clientId = 1101;
const newRating = 0;
const newRecommendedCredit = 0;
const updatedClient = await models.Client.setRating(ctx, clientId, newRating, newRecommendedCredit, options);
expect(updatedClient.rating).toEqual(newRating);
expect(updatedClient.recommendedCredit).toEqual(newRecommendedCredit);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
});

View File

@ -319,7 +319,8 @@ module.exports = Self => {
await Self.changeCredit(ctx, finalState, changes);
// Credit management changes
if (changes?.rating || changes?.recommendedCredit)
if (changes?.rating >= 0 || changes?.recommendedCredit >= 0)
await Self.changeCreditManagement(ctx, finalState, changes);
const oldInstance = {};

View File

@ -1,11 +1,7 @@
const models = require('vn-loopback/server/server').models;
describe('sale usesMana()', () => {
const ctx = {
req: {
accessToken: {userId: 18}
}
};
const ctx = {req: { accessToken: {userId: 18}}};
it('should return that the worker uses mana', async() => {
const tx = await models.Sale.beginTransaction({});
@ -45,4 +41,27 @@ describe('sale usesMana()', () => {
throw e;
}
});
it('should return that the worker does not use mana because it is excluded', async() => {
const tx = await models.Sale.beginTransaction({});
const buyerId = 35;
const franceDepartmentId = 133;
const buyerCtx = {req: {accessToken: {userId: buyerId}}};
try {
const options = {transaction: tx}
await models.WorkerManaExcluded.create({workerFk: buyerId}, options);
await models.Business.updateAll({workerFk: buyerId}, {departmentFk: franceDepartmentId}, options);
const usesMana = await models.Sale.usesMana(buyerCtx, options);
expect(usesMana).toBe(false);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
});

View File

@ -21,6 +21,9 @@ module.exports = Self => {
if (typeof options == 'object')
Object.assign(myOptions, options);
const isManaExcluded = await models.WorkerManaExcluded.findById(userId, null, myOptions);
if (isManaExcluded) return false;
const salesDepartment = await models.Department.findOne({where: {code: 'VT'}, fields: 'id'}, myOptions);
const departments = await models.Department.getLeaves(ctx, salesDepartment.id, null, myOptions);
const workerDepartment = await models.WorkerDepartment.findById(userId, null, myOptions);

View File

@ -33,8 +33,8 @@ module.exports = Self => {
const models = Self.app.models;
const myOptions = {userId: ctx.req.accessToken.userId};
let tx;
let ticket;
let externalTickets = [];
let dms;
let gestDocCreated = false;
if (typeof options == 'object')
Object.assign(myOptions, options);
@ -44,11 +44,6 @@ module.exports = Self => {
myOptions.transaction = tx;
}
const dmsTypeTicket = await models.DmsType.findOne({
where: {code: 'ticket'},
fields: ['id']
}, myOptions);
async function setLocation(ticketId) {
await models.Delivery.create({
ticketFk: ticketId,
@ -58,106 +53,102 @@ module.exports = Self => {
}, myOptions);
}
async function hasSignDms(ticketId) {
async function gestDocExists(ticketId) {
const ticketDms = await models.TicketDms.findOne({
where: {ticketFk: ticketId},
fields: ['dmsFk']
}, myOptions);
if (!ticketDms) return false;
const ticket = await models.Ticket.findById(ticketId, {fields: ['isSigned']}, myOptions);
if (ticket.isSigned == true)
return true;
else
await models.Dms.destroyAll({where: {reference: ticketId}}, myOptions);
return false;
}
async function createGestDoc(id) {
const ticket = await models.Ticket.findById(id,
{
include: [
{
relation: 'dms',
fields: ['id'],
relation: 'warehouse',
scope: {
where: {dmsTypeFk: dmsTypeTicket.id}
fields: ['id']
}
}
]
}, myOptions);
if (ticketDms?.dms()?.id) return true;
}
async function createGestDoc() {
const ctxUploadFile = Object.assign({}, ctx);
ctxUploadFile.args = {
warehouseId: ticket.warehouseFk,
companyId: ticket.companyFk,
dmsTypeId: dmsTypeTicket.id,
reference: ticket.id,
description: `Firma del cliente - Ruta ${ticket.route().id}`,
contentType: 'image/png',
hasFile: true
};
const dms = await models.Dms.uploadFile(ctxUploadFile, myOptions);
await models.TicketDms.create({ticketFk: ticket.id, dmsFk: dms[0].id}, myOptions);
}
try {
for (const ticketId of tickets) {
ticket = await models.Ticket.findById(ticketId, {
include: [{
relation: 'address',
}, {
relation: 'client',
scope: {
include: {
relation: 'province',
scope: {
include: {
relation: 'country',
scope: {
fields: ['code']
}
}
}
}
fields: ['name']
}
}, {
relation: 'route',
scope: {
fields: ['id']
}
}]
}
]
}, myOptions);
const dmsType = await models.DmsType.findOne({where: {code: 'Ticket'}, fields: ['id']}, myOptions);
const ctxUploadFile = Object.assign({}, ctx);
if (ticket.route() === null)
throw new UserError('Ticket without route');
ctxUploadFile.args = {
warehouseId: ticket.warehouseFk,
companyId: ticket.companyFk,
dmsTypeId: dmsType.id,
reference: '',
description: `Firma del cliente - Ruta ${ticket.route().id}`,
hasFile: false
};
dms = await models.Dms.uploadFile(ctxUploadFile, myOptions);
gestDocCreated = true;
}
const ticketState = await models.TicketState.findOne({
where: {ticketFk: ticketId},
try {
for (const ticketId of tickets) {
const ticketState = await models.TicketState.findOne(
{where: {ticketFk: ticketId},
fields: ['alertLevel']
}, myOptions);
const packedAlertLevel = await models.AlertLevel.findOne({
where: {code: 'PACKED'},
const packedAlertLevel = await models.AlertLevel.findOne({where: {code: 'PACKED'},
fields: ['id']
}, myOptions);
if (!ticketState)
throw new UserError('Ticket does not exist');
if (!ticket.route())
throw new UserError('Ticket without route');
if (ticketState.alertLevel < packedAlertLevel.id)
throw new UserError('This ticket cannot be signed because it has not been boxed');
if (await ticket.isSigned)
if (await gestDocExists(ticketId))
throw new UserError('Ticket is already signed');
if (location) await setLocation(ticketId);
if (!await hasSignDms(ticketId))
await createGestDoc(ticketId);
if (!gestDocCreated) await createGestDoc(ticketId);
await models.TicketDms.create({ticketFk: ticketId, dmsFk: dms[0].id}, myOptions);
const ticket = await models.Ticket.findById(ticketId, null, myOptions);
await ticket.updateAttribute('isSigned', true, myOptions);
const deliveryState = await models.State.findOne({
where: {code: 'DELIVERED'}
where: {
code: 'DELIVERED'
}
}, myOptions);
await models.Ticket.state(ctx, {
ticketFk: ticketId,
stateFk: deliveryState.id
}, myOptions);
}
if (ticket?.address()?.province()?.country()?.code != 'ES') {
await models.Ticket.saveCmr(ctx, [ticketId], myOptions);
externalTickets.push(ticketId);
}
}
if (tx) await tx.commit();
return;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
await models.Route.cmrEmail(ctx, externalTickets);
};
};

View File

@ -137,7 +137,8 @@ module.exports = Self => {
tb.type,
tb.businessFk,
tb.permissionRate,
d.isTeleworking
d.isTeleworking,
d.hasToRefill
FROM tmp.timeBusinessCalculate tb
JOIN account.user u ON u.id = tb.userFk
JOIN department d ON d.id = tb.departmentFk
@ -174,7 +175,7 @@ module.exports = Self => {
myOptions.transaction = tx;
try {
workerFk = day.workerFk;
if (day.timeWorkDecimal > 0 && day.timeWorkedDecimal == null
if (day.hasToRefill && day.timeWorkDecimal > 0 && day.timeWorkedDecimal == null
&& (day.permissionRate == null ? true : day.permissionRate)) {
if (day.timeTable == null) {
const timed = new Date(day.dated);

View File

@ -46,6 +46,31 @@ describe('workerTimeControl clockIn()', () => {
}
});
it('should throw an error trying to change a middle hour to out not resting 12h', async() => {
activeCtx.accessToken.userId = HHRRId;
const workerId = teamBossId;
const tx = await models.WorkerTimeControl.beginTransaction({});
try {
const options = {transaction: tx};
const entryTime = "2000-12-25T11:00:00.000Z";
ctx.args = {timed: entryTime, direction: 'in'};
await models.WorkerTimeControl.addTimeEntry(ctx, workerId, options);
const middleTime ="2000-12-26T11:00:00.000Z";
ctx.args = {timed: middleTime, direction: 'middle'};
const middleEntryTime = await models.WorkerTimeControl.addTimeEntry(ctx, workerId, options);
const direction = 'out';
await models.WorkerTimeControl.updateTimeEntry(ctx, middleEntryTime.id, direction, options);
await tx.rollback();
} catch (e) {
expect(e.message).toBe('Superado el tiempo máximo entre entrada y salida');
await tx.rollback();
}
});
describe('as Role errors', () => {
it('should add if the current user is team boss and the target user is himself', async() => {
activeCtx.accessToken.userId = teamBossId;
@ -110,16 +135,22 @@ describe('workerTimeControl clockIn()', () => {
todayAtOne.setHours(1, 0, 0, 0);
ctx.args = {timed: todayAtOne, direction: 'in'};
const createdTimeEntry = await models.WorkerTimeControl.addTimeEntry(ctx, workerId, options);
const entryTime = await models.WorkerTimeControl.addTimeEntry(ctx, workerId, options);
expect(entryTime.id).toBeDefined();
const todayAtTwo = Date.vnNew();
expect(createdTimeEntry.id).toBeDefined();
todayAtTwo.setHours(2, 0, 0, 0);
ctx.args = {timed: todayAtTwo, direction: 'middle'};
const middleTime = await models.WorkerTimeControl.addTimeEntry(ctx, workerId, options);
ctx.args = {direction: 'out'};
const updatedTimeEntry = await models.WorkerTimeControl.updateTimeEntry(
ctx, createdTimeEntry.id, options
const direction = 'out';
const {id:outTimeEntryId} = await models.WorkerTimeControl.updateTimeEntry(
ctx, middleTime.id, direction, options
);
expect(updatedTimeEntry.direction).toEqual('out');
const {direction: updatedDirection} = await models.WorkerTimeControl.findById(outTimeEntryId,{fields:['direction']},options);
expect(updatedDirection).toEqual('out');
await tx.rollback();
} catch (e) {
await tx.rollback();

View File

@ -26,32 +26,39 @@ module.exports = Self => {
}
});
Self.updateTimeEntry = async(ctx, id, options) => {
Self.updateTimeEntry = async(ctx, timeEntryId, direction, options) => {
const currentUserId = ctx.req.accessToken.userId;
const models = Self.app.models;
const args = ctx.args;
const myOptions = {};
let tx;
if (typeof options == 'object')
Object.assign(myOptions, options);
const targetTimeEntry = await Self.findById(id, null, myOptions);
const isSubordinate = await models.Worker.isSubordinate(ctx, targetTimeEntry.userFk, myOptions);
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
myOptions.transaction = tx;
}
try {
const {id, userFk, timed} = await Self.findById(timeEntryId, null, myOptions);
const isSubordinate = await models.Worker.isSubordinate(ctx, userFk, myOptions);
const isTeamBoss = await models.ACL.checkAccessAcl(ctx, 'Worker', 'isTeamBoss', 'WRITE');
const isHimself = currentUserId == targetTimeEntry.userFk;
const isHimself = currentUserId == userFk;
const notAllowed = isSubordinate === false || (isSubordinate && isHimself && !isTeamBoss);
if (notAllowed) throw new UserError(`You don't have enough privileges`);
if (notAllowed)
throw new UserError(`You don't have enough privileges`);
await models.WorkerTimeControl.deleteById(id, myOptions);
const timeEntryUpdatedId = await Self.clockIn(userFk, timed, direction, null, myOptions);
const timeEntryUpdated = await targetTimeEntry.updateAttributes({
direction: args.direction
}, myOptions);
await models.WorkerTimeControl.resendWeeklyHourEmail(ctx, userFk, timed, myOptions);
await models.WorkerTimeControl.resendWeeklyHourEmail(ctx, targetTimeEntry.userFk, targetTimeEntry.timed, myOptions);
return timeEntryUpdated;
if (tx) await tx.commit();
return timeEntryUpdatedId;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
};
};

View File

@ -139,9 +139,12 @@ describe('Worker new', () => {
});
it('should create a new worker', async() => {
const newWorker = await models.Worker.new({args: defaultWorker, req});
let newWorker;
try {
newWorker = await models.Worker.new({args: defaultWorker, req});
} finally {
await removeWorker(newWorker.id);
}
expect(newWorker.id).toBeDefined();
});
@ -173,9 +176,12 @@ describe('Worker new', () => {
}),
req
};
const newWorker = await models.Worker.new(newWorkerData);
let newWorker;
try {
newWorker = await models.Worker.new(newWorkerData);
} finally {
await models.Worker.destroyById(newWorker.id);
}
expect(newWorker.id).toEqual(bruceWayneId);
});

View File

@ -86,6 +86,9 @@
"WorkerMana": {
"dataSource": "vn"
},
"WorkerManaExcluded": {
"dataSource": "vn"
},
"WorkerMistake": {
"dataSource": "vn"
},

View File

@ -0,0 +1,22 @@
{
"name": "WorkerManaExcluded",
"base": "VnModel",
"options": {
"mysql": {
"table": "workerManaExcluded"
}
},
"properties": {
"workerFk": {
"id": true,
"type": "number"
}
},
"relations": {
"worker": {
"type": "belongsTo",
"model": "Worker",
"foreignKey": "workerFk"
}
}
}

View File

@ -415,11 +415,13 @@ class Controller extends Section {
throw new Error(`The entry type can't be empty`);
const query = `WorkerTimeControls/${entry.id}/updateTimeEntry`;
if (entry.direction !== entry.$orgRow.direction) {
this.$http.post(query, {direction: entry.direction})
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')))
.then(() => this.$.editEntry.hide())
.then(() => this.fetchHours())
.then(() => this.getMailStates(this.date));
}
} catch (e) {
this.vnApp.showError(this.$t(e.message));
}

View File

@ -130,7 +130,7 @@ describe('Component vnWorkerTimeControl', () => {
controller.$.model = {applyFilter: jest.fn().mockReturnValue(Promise.resolve())};
controller.date = today;
controller.fetchHours = jest.fn();
controller.selectedRow = {id: 1, timed: Date.vnNew(), direction: 'in'};
controller.selectedRow = {id: 1, timed: Date.vnNew(), direction: 'in', $orgRow: {direction: null}};
controller.$.editEntry = {
hide: () => {}
};

View File

@ -56,7 +56,7 @@
"@babel/plugin-syntax-dynamic-import": "^7.7.4",
"@babel/preset-env": "^7.11.0",
"@babel/register": "^7.7.7",
"@verdnatura/myt": "^1.6.7",
"@verdnatura/myt": "^1.6.8",
"angular-mocks": "^1.7.9",
"babel-jest": "^26.0.1",
"babel-loader": "^8.2.4",

View File

@ -131,8 +131,8 @@ devDependencies:
specifier: ^7.7.7
version: 7.23.7(@babel/core@7.23.9)
'@verdnatura/myt':
specifier: ^1.6.7
version: 1.6.7
specifier: ^1.6.8
version: 1.6.8
angular-mocks:
specifier: ^1.7.9
version: 1.8.3
@ -2633,8 +2633,8 @@ packages:
dev: false
optional: true
/@verdnatura/myt@1.6.7:
resolution: {integrity: sha512-t/Q1T3QzHpZFdxwIyQL/CV5g+HJvWE6Q65VeA9k0svZdX/vezgnQ21nkI+wuvIurIl6BXqq2Arx7EWYkAhGNNA==}
/@verdnatura/myt@1.6.8:
resolution: {integrity: sha512-jpadr6yAR9TQXPv+has5yOYAolR/YEzsxbLgMR7BoDrpLyVFLHJEy4Dfe+Hy11r3AmxCB/8lWM+La1YGvXMWOA==}
hasBin: true
dependencies:
'@sqltools/formatter': 1.2.5