Compare commits
81 Commits
c1018d465a
...
f044809f30
Author | SHA1 | Date |
---|---|---|
|
f044809f30 | |
|
0fd6a6360c | |
|
6e045868c3 | |
|
0f4377ff5d | |
|
950cce22df | |
|
bfdbbc0fdf | |
|
f18e90d6f3 | |
|
f09283b9c9 | |
|
4012b1756d | |
|
172e7566b5 | |
|
8276765225 | |
|
e7f6e61ea1 | |
|
c1d0ea7e27 | |
|
63a22a50f4 | |
|
18773f34de | |
|
4994a836c7 | |
|
7999a9bf93 | |
|
eb5fdd1940 | |
|
2f0c8d96d2 | |
|
753525d0ac | |
|
78c92af02f | |
|
95fa776e41 | |
|
8e976d2e4f | |
|
becd2e6f48 | |
|
d0c82f694e | |
|
838effadc0 | |
|
cc90b13668 | |
|
714345ab04 | |
|
57a1f2a1f6 | |
|
7bf89cd448 | |
|
dddd482317 | |
|
88a88640e5 | |
|
e00133458b | |
|
be0e835a37 | |
|
791687f271 | |
|
811a49275d | |
|
37dd3c00c5 | |
|
24984e8aca | |
|
242d675d28 | |
|
955828c63e | |
|
05d685c86b | |
|
e8c783ca68 | |
|
0a398fdd6c | |
|
7f1e3c66e2 | |
|
cff59d197d | |
|
337190ef6d | |
|
e5b7395e5c | |
|
88dfbd6da0 | |
|
3cb494c735 | |
|
7abf81f815 | |
|
4799151565 | |
|
995a99c661 | |
|
a756c3bc3a | |
|
b11b0642f8 | |
|
8c3d940987 | |
|
613327491b | |
|
100936d40b | |
|
3e30e77728 | |
|
38a5337f68 | |
|
243319b113 | |
|
72e9b69d7e | |
|
2d4fb9d2f8 | |
|
dbc3fc8007 | |
|
a31b689ae2 | |
|
5b6112720f | |
|
cc88fcbd9d | |
|
15936ddc55 | |
|
e3379b42a1 | |
|
db06620d7c | |
|
60fbb1d56e | |
|
c40dc134f8 | |
|
4383ebd7f1 | |
|
5d156e81ca | |
|
a2329e1276 | |
|
57b8b69ae9 | |
|
b453abdb3a | |
|
f4a9e7b74e | |
|
f00b264daa | |
|
1b60cd33d5 | |
|
50cb7964d9 | |
|
1d95c17a0b |
|
@ -7,7 +7,7 @@ describe('NotificationSubscription getList()', () => {
|
||||||
const notifications = await models.Notification.find({});
|
const notifications = await models.Notification.find({});
|
||||||
const totalAvailable = notifications.length - active.length;
|
const totalAvailable = notifications.length - active.length;
|
||||||
|
|
||||||
expect(active.length).toEqual(2);
|
expect(active.length).toEqual(3);
|
||||||
expect(available.length).toEqual(totalAvailable);
|
expect(available.length).toEqual(totalAvailable);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -2809,7 +2809,8 @@ INSERT INTO `util`.`notification` (`id`, `name`, `description`)
|
||||||
(3, 'not-main-printer-configured', 'A printer distinct than main has been configured'),
|
(3, 'not-main-printer-configured', 'A printer distinct than main has been configured'),
|
||||||
(4, 'supplier-pay-method-update', 'A supplier pay method has been updated'),
|
(4, 'supplier-pay-method-update', 'A supplier pay method has been updated'),
|
||||||
(5, 'modified-entry', 'An entry has been modified'),
|
(5, 'modified-entry', 'An entry has been modified'),
|
||||||
(6, 'book-entry-deleted', 'accounting entries deleted');
|
(6, 'book-entry-deleted', 'accounting entries deleted'),
|
||||||
|
(7, 'zone-included','An email to notify zoneCollisions');
|
||||||
|
|
||||||
INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`)
|
INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -2819,7 +2820,8 @@ INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`)
|
||||||
(3, 9),
|
(3, 9),
|
||||||
(4, 1),
|
(4, 1),
|
||||||
(5, 9),
|
(5, 9),
|
||||||
(6, 9);
|
(6, 9),
|
||||||
|
(7, 9);
|
||||||
|
|
||||||
INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`)
|
INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -2836,8 +2838,8 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`)
|
||||||
(2, 1109),
|
(2, 1109),
|
||||||
(1, 9),
|
(1, 9),
|
||||||
(1, 3),
|
(1, 3),
|
||||||
(6, 9);
|
(6, 9),
|
||||||
|
(7, 9);
|
||||||
|
|
||||||
INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`)
|
INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -15,7 +15,7 @@ BEGIN
|
||||||
|
|
||||||
SET vNewShipped = IFNULL(vNewShipped, util.VN_CURDATE());
|
SET vNewShipped = IFNULL(vNewShipped, util.VN_CURDATE());
|
||||||
|
|
||||||
CALL ticket_Clone(vTicketFk, vNewTicketFk, vWithWarehouse);
|
CALL ticket_Clone(vTicketFk, vNewTicketFk);
|
||||||
|
|
||||||
UPDATE ticket
|
UPDATE ticket
|
||||||
SET landed = TIMESTAMPADD(DAY, DATEDIFF(vNewShipped, shipped), landed),
|
SET landed = TIMESTAMPADD(DAY, DATEDIFF(vNewShipped, shipped), landed),
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
|
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getCollisions`()
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getCollisions`()
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
|
@ -10,6 +11,7 @@ BEGIN
|
||||||
DECLARE vZoneFk INT;
|
DECLARE vZoneFk INT;
|
||||||
DECLARE vIsDone INT DEFAULT FALSE;
|
DECLARE vIsDone INT DEFAULT FALSE;
|
||||||
DECLARE vTableCollisions TEXT;
|
DECLARE vTableCollisions TEXT;
|
||||||
|
DECLARE json_data JSON;
|
||||||
DECLARE cur1 CURSOR FOR SELECT zoneFk from tmp.zoneOption;
|
DECLARE cur1 CURSOR FOR SELECT zoneFk from tmp.zoneOption;
|
||||||
|
|
||||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vIsDone = TRUE;
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vIsDone = TRUE;
|
||||||
|
@ -77,45 +79,26 @@ BEGIN
|
||||||
GROUP BY z.agencyModeFk, zn.geoFk, zw.warehouseFk
|
GROUP BY z.agencyModeFk, zn.geoFk, zw.warehouseFk
|
||||||
HAVING count(*) > 1;
|
HAVING count(*) > 1;
|
||||||
|
|
||||||
SELECT '<table cellspacing="10">
|
-- Recojo los datos de la zona que ha dado conflicto
|
||||||
<tr>
|
SELECT JSON_ARRAYAGG(
|
||||||
<th>C.Postal</th>
|
JSON_OBJECT(
|
||||||
<th>Número de zona</th>
|
'zoneFk', zoneFk,
|
||||||
<th>Precio</th>
|
'zn', JSON_OBJECT('name', zn.name),
|
||||||
<th>Zona</th>
|
'z', JSON_OBJECT('name', z.name,'price', z.price),
|
||||||
<th>Almacén</th>
|
'w', JSON_OBJECT('name', w.name)
|
||||||
<th>Salix</th>
|
)
|
||||||
</tr>' INTO vTableCollisions;
|
) FROM tmp.zoneNodes zn
|
||||||
|
JOIN zone z ON z.id = zn.zoneFk
|
||||||
|
JOIN geoCollision gc ON gc.agencyModeFk = z.agencyModeFk AND zn.geoFk = gc.geoFk
|
||||||
|
JOIN warehouse w ON w.id = gc.warehouseFk
|
||||||
|
INTO json_data;
|
||||||
|
|
||||||
INSERT INTO mail (receiver,replyTo,subject,body)
|
-- Creo un registro de la notificacion 'zone-included' para reportar via email
|
||||||
SELECT 'pepe@verdnatura.es' receiver,
|
SELECT util.notification_send(
|
||||||
'noreply@verdnatura.es' replyTo,
|
'zone-included',
|
||||||
CONCAT('Colisiones en zonas ', util.VN_CURDATE()) subject,
|
JSON_OBJECT('zoneCollisions',json_data),
|
||||||
CONCAT(vTableCollisions,
|
account.myUser_getId()
|
||||||
GROUP_CONCAT(sub.td SEPARATOR ''),
|
);
|
||||||
'</table>') body
|
|
||||||
FROM(SELECT
|
|
||||||
CONCAT('<tr>
|
|
||||||
<td>', zn.name, '</td>
|
|
||||||
<td>', zoneFk,'</td>
|
|
||||||
<td>', z.price,'</td>
|
|
||||||
<td>', z.name,'</td>
|
|
||||||
<td>', w.name, '</td>
|
|
||||||
<td>', CONCAT('<a href="https://salix.verdnatura.es/#!/zone/',
|
|
||||||
zoneFk,
|
|
||||||
'/location?q=%7B%22search%22:%22',
|
|
||||||
zn.name,
|
|
||||||
'%22%7D">'
|
|
||||||
'https://salix.verdnatura.es/#!/zone/',
|
|
||||||
zoneFk,
|
|
||||||
'/location?q=%7B%22search%22:%22',
|
|
||||||
zn.name,
|
|
||||||
'%22%7D</a>'),'</td>
|
|
||||||
</tr>') td
|
|
||||||
FROM tmp.zoneNodes zn
|
|
||||||
JOIN zone z ON z.id = zn.zoneFk
|
|
||||||
JOIN geoCollision gc ON gc.agencyModeFk = z.agencyModeFk AND zn.geoFk = gc.geoFk
|
|
||||||
JOIN warehouse w ON w.id = gc.warehouseFk) sub;
|
|
||||||
|
|
||||||
DROP TEMPORARY TABLE
|
DROP TEMPORARY TABLE
|
||||||
geoCollision,
|
geoCollision,
|
||||||
|
|
|
@ -8,5 +8,6 @@ BEGIN
|
||||||
`changedModel` = 'zoneIncluded',
|
`changedModel` = 'zoneIncluded',
|
||||||
`changedModelId` = OLD.zoneFk,
|
`changedModelId` = OLD.zoneFk,
|
||||||
`userFk` = account.myUser_getId();
|
`userFk` = account.myUser_getId();
|
||||||
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeIn
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
BEGIN
|
BEGIN
|
||||||
SET NEW.editorFk = account.myUser_getId();
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
BEGIN
|
BEGIN
|
||||||
SET NEW.editorFk = account.myUser_getId();
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE util.notification MODIFY COLUMN id int(11) auto_increment NOT NULL;
|
|
@ -0,0 +1,15 @@
|
||||||
|
INSERT IGNORE INTO util.notification ( `name`,`description`)
|
||||||
|
VALUES
|
||||||
|
( 'zone-included','An email to notify zoneCollisions');
|
||||||
|
|
||||||
|
-- Change value if destionation user should be different
|
||||||
|
SET @DESTINATION_USER = "pepe";
|
||||||
|
|
||||||
|
SET @MaxId = LAST_INSERT_ID();
|
||||||
|
|
||||||
|
INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk)
|
||||||
|
VALUES(
|
||||||
|
@MaxId, (SELECT id from `account`.`user` where name = @DESTINATION_USER));
|
||||||
|
|
||||||
|
INSERT IGNORE INTO util.notificationAcl (notificationFk,roleFk)
|
||||||
|
SELECT @MaxId, (SELECT role from `account`.`user` where name = @DESTINATION_USER) FROM util.notification WHERE name= "zone-included";
|
|
@ -0,0 +1,2 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
|
||||||
|
VALUES('Ticket', 'clone', 'WRITE', 'ALLOW', 'ROLE', 'administrative');
|
|
@ -0,0 +1,54 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('clone', {
|
||||||
|
description: 'clone a ticket and return the new ticket id',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The ticket id',
|
||||||
|
http: {source: 'path'}
|
||||||
|
}, {
|
||||||
|
arg: 'shipped',
|
||||||
|
type: 'date',
|
||||||
|
}, {
|
||||||
|
arg: 'withWarehouse',
|
||||||
|
type: 'boolean',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: 'number',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/:id/clone`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.clone = async(ctx, id, shipped, withWarehouse, options) => {
|
||||||
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
||||||
|
let tx;
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
if (!myOptions.transaction) {
|
||||||
|
tx = await Self.beginTransaction({});
|
||||||
|
myOptions.transaction = tx;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const [, [{clonedTicketId}]] = await Self.rawSql(`
|
||||||
|
CALL vn.ticket_CloneAll(?, ?, ?, @clonedTicketId);
|
||||||
|
SELECT @clonedTicketId clonedTicketId;`,
|
||||||
|
[id, shipped, withWarehouse], myOptions);
|
||||||
|
|
||||||
|
if (tx) await tx.commit();
|
||||||
|
return clonedTicketId;
|
||||||
|
} catch (e) {
|
||||||
|
if (tx) await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -46,4 +46,6 @@ module.exports = function(Self) {
|
||||||
require('../methods/ticket/invoiceTicketsAndPdf')(Self);
|
require('../methods/ticket/invoiceTicketsAndPdf')(Self);
|
||||||
require('../methods/ticket/docuwareDownload')(Self);
|
require('../methods/ticket/docuwareDownload')(Self);
|
||||||
require('../methods/ticket/myLastModified')(Self);
|
require('../methods/ticket/myLastModified')(Self);
|
||||||
|
require('../methods/ticket/addSaleByCode')(Self);
|
||||||
|
require('../methods/ticket/clone')(Self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
require('./ticket-methods')(Self);
|
require('./ticket-methods')(Self);
|
||||||
require('../methods/ticket/state')(Self);
|
require('../methods/ticket/state')(Self);
|
||||||
require('../methods/ticket/addSaleByCode')(Self);
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
const LoopBackContext = require('loopback-context');
|
const LoopBackContext = require('loopback-context');
|
||||||
|
|
||||||
describe('zone toggleIsIncluded()', () => {
|
describe('zone toggleIsIncluded()', () => {
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
const activeCtx = {
|
const activeCtx = {
|
||||||
|
@ -58,7 +57,7 @@ describe('zone toggleIsIncluded()', () => {
|
||||||
|
|
||||||
await models.Zone.toggleIsIncluded(1, 20, false, options);
|
await models.Zone.toggleIsIncluded(1, 20, false, options);
|
||||||
|
|
||||||
let result = await models.Zone.toggleIsIncluded(1, 20, undefined, options);
|
const result = await models.Zone.toggleIsIncluded(1, 20, undefined, options);
|
||||||
|
|
||||||
expect(result).toEqual({count: 1});
|
expect(result).toEqual({count: 1});
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
"AgencyMode": {
|
"AgencyMode": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
"DeliveryMethod": {
|
"DeliveryMethod": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
"Zone": {
|
"Zone": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
const Stylesheet = require(`vn-print/core/stylesheet`);
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const vnPrintPath = path.resolve('print');
|
||||||
|
|
||||||
|
module.exports = new Stylesheet([
|
||||||
|
`${vnPrintPath}/common/css/spacing.css`,
|
||||||
|
`${vnPrintPath}/common/css/misc.css`,
|
||||||
|
`${vnPrintPath}/common/css/layout.css`,
|
||||||
|
`${vnPrintPath}/common/css/email.css`])
|
||||||
|
.mergeStyles();
|
|
@ -0,0 +1,7 @@
|
||||||
|
subject: Colisiones en zonas
|
||||||
|
title: "La zona {0} y localización {1} ha sido registrada en más de un sitio"
|
||||||
|
postalCode: C. Postal
|
||||||
|
zoneFk: Número de zona
|
||||||
|
price: Precio
|
||||||
|
zone: Zona
|
||||||
|
warehouse: Almacén
|
|
@ -0,0 +1,42 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html v-bind:lang="$i18n.locale">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width" />
|
||||||
|
<meta name="format-detection" content="telephone=no" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<table class="grid column-oriented">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{{ $t('postalCode') }}</th>
|
||||||
|
<th>{{ $t('zoneFk') }}</th>
|
||||||
|
<th>{{ $t('price') }}</th>
|
||||||
|
<th>{{ $t('zone') }}</th>
|
||||||
|
<th>{{ $t('warehouse') }}</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="zone in zoneCollisions">
|
||||||
|
<td>{{ zone.zn.name }}</td>
|
||||||
|
<td>{{ zone.zoneFk }}</td>
|
||||||
|
<td>{{ zone.z.price }}</td>
|
||||||
|
<td>{{ zone.z.name }}</td>
|
||||||
|
<td>{{ zone.w.name }}</td>
|
||||||
|
<td>
|
||||||
|
<a v-bind:href="'https://salix.verdnatura.es/#!/zone/'+
|
||||||
|
zone.zoneFk+
|
||||||
|
'/location?q=%7B%22search%22:%22'+
|
||||||
|
zone.zn.name+
|
||||||
|
'%22%7D'">
|
||||||
|
https://salix.verdnatura.es/#!/zone/
|
||||||
|
{{zone.zoneFk}}
|
||||||
|
/location?q=%7B%22search%22:%22
|
||||||
|
{{zone.zn.name}}
|
||||||
|
%22%7D</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,12 @@
|
||||||
|
const Component = require(`vn-print/core/component`);
|
||||||
|
const emailHeader = new Component('email-header');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: 'zone-included',
|
||||||
|
components: {
|
||||||
|
'email-header': emailHeader.build(),
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
zoneCollisions: {type: Array, required: true}
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue