feat: refs #6802 Clientes-gestionados-por-equipos #2516
|
@ -57,6 +57,22 @@ module.exports = Self => {
|
|||
|
||||
if (print) await Self.rawSql('CALL vn.collection_printSticker(?,NULL)', [id], myOptions);
|
||||
|
||||
for (let ticket of tickets) {
|
||||
|
||||
if (ticket.observaciones) {
|
||||
let observations = ticket.observaciones.split(' ');
|
||||
|
||||
for (let observation of observations) {
|
||||
const departmentFk = ticket.departmentFk;
|
||||
if (observation.startsWith('#') || observation.startsWith('@')) {
|
||||
await models.Chat.send(ctx,
|
||||
observation,
|
||||
$t('ticketCommercial', {ticket: ticket.ticketFk, departmentFk})
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return getCollection(id, tickets, sales, placements, myOptions);
|
||||
};
|
||||
|
||||
|
|
|
@ -127,7 +127,7 @@ module.exports = Self => {
|
|||
LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk
|
||||
LEFT JOIN origin o ON o.id = i.originFk
|
||||
LEFT JOIN state st ON st.id = sg.stateFk
|
||||
LEFT JOIN account.user ac ON ac.id = sg.userFk
|
||||
LEFT JOIN account.user ac ON ac.id = iss.userFk
|
||||
WHERE sc.id = ?
|
||||
AND sgd.saleGroupFk
|
||||
GROUP BY s.id, ish.id, p.code, p2.code`, [id, id], myOptions);
|
||||
|
@ -136,22 +136,22 @@ module.exports = Self => {
|
|||
|
||||
const collection = {collectionFk: id, tickets: []};
|
||||
|
||||
if (tickets && tickets.length) {
|
||||
if (tickets?.length) {
|
||||
for (const ticket of tickets) {
|
||||
const ticketId = ticket.ticketFk;
|
||||
if (ticket.observation) {
|
||||
for (observation of ticket.observation?.split(' ')) {
|
||||
for (let observation of ticket.observation?.split(' ')) {
|
||||
if (['#', '@'].includes(observation.charAt(0))) {
|
||||
promises.push(Self.app.models.Chat.send(ctx, observation,
|
||||
$t('The ticket is in preparation', {
|
||||
ticketId: ticketId,
|
||||
ticketUrl: `${url}ticket/${ticketId}/summary`,
|
||||
salesPersonId: ticket.salesPersonFk
|
||||
departmentId: ticket.departmentFk
|
||||
})));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sales && sales.length) {
|
||||
if (sales?.length) {
|
||||
const barcodes = await Self.rawSql(`
|
||||
SELECT s.id saleFk, b.code, c.id
|
||||
FROM sale s
|
||||
|
@ -166,7 +166,7 @@ module.exports = Self => {
|
|||
for (const sale of sales) {
|
||||
if (sale.ticketFk === ticketId) {
|
||||
sale.Barcodes = [];
|
||||
if (barcodes && barcodes.length) {
|
||||
if (barcodes?.length) {
|
||||
for (const barcode of barcodes) {
|
||||
if (barcode.saleFk === sale.saleFk) {
|
||||
for (const prop in barcode) {
|
||||
|
|
|
@ -1605,7 +1605,6 @@ INSERT INTO `ACL` VALUES (73,'Expedition','*','READ','ALLOW','ROLE','employee',N
|
|||
INSERT INTO `ACL` VALUES (74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryAssistant',NULL);
|
||||
INSERT INTO `ACL` VALUES (75,'Expedition','*','WRITE','ALLOW','ROLE','production',NULL);
|
||||
INSERT INTO `ACL` VALUES (76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (77,'WorkerMana','*','READ','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (78,'TicketTracking','*','WRITE','ALLOW','ROLE','production',NULL);
|
||||
INSERT INTO `ACL` VALUES (79,'Ticket','state','*','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (80,'Sale','deleteSales','*','ALLOW','ROLE','employee',NULL);
|
||||
|
@ -2053,7 +2052,7 @@ INSERT INTO `ACL` VALUES (595,'Ticket','isEditable','READ','ALLOW','ROLE','emplo
|
|||
INSERT INTO `ACL` VALUES (596,'Ticket','setDeleted','WRITE','ALLOW','ROLE','salesPerson',NULL);
|
||||
INSERT INTO `ACL` VALUES (597,'Ticket','restore','WRITE','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (598,'Ticket','getSales','READ','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (599,'Ticket','getSalesPersonMana','READ','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (599,'Ticket','getDepartmentMana','READ','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (600,'Ticket','filter','READ','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (601,'Ticket','makeInvoice','WRITE','ALLOW','ROLE','employee',NULL);
|
||||
INSERT INTO `ACL` VALUES (602,'Ticket','updateEditableTicket','WRITE','ALLOW','ROLE','employee',NULL);
|
||||
|
|
|
@ -3044,7 +3044,7 @@ BEGIN
|
|||
INSERT INTO claimLog
|
||||
SET `action` = 'delete',
|
||||
`changedModel` = 'ClaimBeginning',
|
||||
`changedModelId` = OLD.id,
|
||||
|
||||
`userFk` = account.myUser_getId();
|
||||
END */;;
|
||||
DELIMITER ;
|
||||
|
|
|
@ -393,20 +393,20 @@ INSERT INTO `vn`.`contactChannel`(`id`, `name`)
|
|||
(4, 'GCN Channel'),
|
||||
(5, 'The Newspaper');
|
||||
|
||||
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`businessTypeFk`,`typeFk`)
|
||||
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`businessTypeFk`,`typeFk`, `departmentFk`)
|
||||
VALUES
|
||||
(1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'),
|
||||
(1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'),
|
||||
(1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'),
|
||||
(1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'),
|
||||
(1105, 'Max Eisenhardt', '251628698', 'MAGNETO', 'Rogue', 'UNKNOWN WHEREABOUTS', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 18, 0, 'florist','normal'),
|
||||
(1106, 'DavidCharlesHaller', '53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 19, 0, 'florist','normal'),
|
||||
(1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 19, 0, 'florist','normal'),
|
||||
(1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 19, 0, 'florist','normal'),
|
||||
(1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 0, 'florist','normal'),
|
||||
(1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, NULL, 1, 'florist','normal'),
|
||||
(1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 0, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'),
|
||||
(1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 0, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses');
|
||||
(1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
|
||||
(1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
|
||||
(1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
|
||||
(1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
|
||||
(1105, 'Max Eisenhardt', '251628698', 'MAGNETO', 'Rogue', 'UNKNOWN WHEREABOUTS', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 18, 0, 'florist','normal', 155),
|
||||
(1106, 'DavidCharlesHaller','53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com',NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 19, 0, 'florist','normal', 155),
|
||||
(1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 19, 0, 'florist','normal', 155),
|
||||
(1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA','Gotham',46460,1111111111,222222222,1,'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 19, 0, 'florist','normal', 155),
|
||||
(1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 0, 'florist','normal', 155),
|
||||
(1110, 'Jessica Jones', '58282869H', 'JESSICA JONES','Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, NULL,1, 'florist','normal', 155),
|
||||
(1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL,0, 'others','loses', 155),
|
||||
(1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL,0, 'others','loses', 155);
|
||||
|
||||
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
||||
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), UPPER(CONCAT(name, 'Street')), 'GOTHAM', 46460, 0, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1
|
||||
|
@ -1876,18 +1876,17 @@ INSERT INTO `vn`.`clientContact`(`id`, `clientFk`, `name`, `phone`)
|
|||
(3, 1101, 'contact 3', 222333444),
|
||||
(4, 1102, 'contact 1', 876543219);
|
||||
|
||||
INSERT INTO `vn`.`workerManaExcluded`(`workerFk`)
|
||||
VALUES
|
||||
(9);
|
||||
INSERT INTO `vn`.`departmentManaExcluded`(`departmentFk`)
|
||||
VALUES (31);
|
||||
/*
|
||||
el mana de los trabajadores lo podemos poner a mano en la tabla si lo calculamos antes,
|
||||
pero si hazemos alguna modificacion en alguna tabla que utiliza para calcularlo ya no seria correcto
|
||||
el mana de los trabajadores lo podemos poner a mano en la tabla si lo calculamos antes,
|
||||
pero si hacemos alguna modificacion en alguna tabla que utiliza para calcularlo ya no seria correcto
|
||||
|
||||
La otra manera es poner el calculo con los 2 trabajadores que utilizamos ahora mismo para los tickets
|
||||
*/
|
||||
|
||||
call vn.manaSpellersRequery(19);
|
||||
call vn.manaSpellersRequery(18);
|
||||
call vn.manaSpellers_requery(155);
|
||||
call vn.manaSpellers_requery(31);
|
||||
|
||||
INSERT INTO `vn`.`clientSample`(`id`, `clientFk`, `typeFk`, `created`, `workerFk`, `userFk`, `companyFk`)
|
||||
VALUES
|
||||
|
@ -2188,15 +2187,6 @@ INSERT INTO `vn`.`smsConfig` (`id`, `uri`, `title`, `apiKey`)
|
|||
VALUES
|
||||
('1', 'https://api.gateway360.com/api/3.0/sms/send', 'Verdnatura', '5715476da95b46d686a5a255e6459523');
|
||||
|
||||
INSERT INTO `vn`.`sharingClient`(`id`, `workerFk`, `started`, `ended`, `clientFk`)
|
||||
VALUES
|
||||
(1, 19, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 1101),
|
||||
(2, 18, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 1106);
|
||||
|
||||
INSERT INTO `vn`.`sharingCart`(`id`, `workerFk`, `started`, `ended`, `workerSubstitute`, `created`)
|
||||
VALUES
|
||||
(1, 18, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 19, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY));
|
||||
|
||||
CALL `vn`.zoneGeo_calcTree(); -- this is an auto calculate for table vn.zoneGeo, columns: path,lft,rgt,depth,sons
|
||||
|
||||
INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`)
|
||||
|
|
|
@ -12,7 +12,7 @@ BEGIN
|
|||
INSERT INTO analisis_ventas (
|
||||
Familia,
|
||||
Reino,
|
||||
Comercial,
|
||||
departmentFk,
|
||||
guillermo
commented
No veo que hayas cambiado el nombre de la columna No veo que hayas cambiado el nombre de la columna
|
||||
Comprador,
|
||||
Provincia,
|
||||
almacen,
|
||||
|
@ -25,8 +25,8 @@ BEGIN
|
|||
SELECT
|
||||
it.name,
|
||||
ic.name,
|
||||
c.departmentFk,
|
||||
w.code,
|
||||
w2.code,
|
||||
p.name,
|
||||
wa.name,
|
||||
tm.year,
|
||||
|
@ -38,8 +38,7 @@ BEGIN
|
|||
LEFT JOIN vn.itemType it ON it.id = bt.tipo_id
|
||||
LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk
|
||||
LEFT JOIN vn.client c on c.id = bt.Id_Cliente
|
||||
LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
LEFT JOIN vn.worker w2 ON w2.id = it.workerFk
|
||||
LEFT JOIN vn.worker w ON w.id = it.workerFk
|
||||
JOIN vn.time tm ON tm.dated = bt.fecha
|
||||
JOIN vn.sale s ON s.id = bt.Id_Movimiento
|
||||
LEFT JOIN vn.ticket t ON t.id = s.ticketFk
|
||||
|
|
|
@ -1,24 +1,43 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`defaultersFromDate`(IN vDate DATE)
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`defaultersFromDate`(
|
||||
IN vDated DATE
|
||||
)
|
||||
BEGIN
|
||||
|
||||
SELECT t1.*, c.name Cliente, w.code workerCode, c.payMethodFk pay_met_id, c.dueDay Vencimiento
|
||||
FROM (
|
||||
-- Filtramos aquellos clientes cuyo saldo se ha incrementado de ayer a hoy
|
||||
select * from(
|
||||
select today.client, today.amount todayAmount, yesterday.amount yesterdayAmount, round(yesterday.amount - today.amount,2) as difference, defaulterSince
|
||||
from
|
||||
(select client, amount, defaulterSince
|
||||
from defaulters
|
||||
where date = vDate and hasChanged) today
|
||||
join
|
||||
(select client, amount
|
||||
from defaulters
|
||||
where date = TIMESTAMPADD(DAY,-1,vDate)) yesterday using(client)
|
||||
|
||||
having today.amount > 0 and difference <> 0
|
||||
) newDefaulters
|
||||
)t1 left join vn.client c ON c.id = t1.client
|
||||
left join vn.worker w ON w.id = c.salesPersonFk;
|
||||
/**
|
||||
* Retorna la info de clientes morosos a una fecha
|
||||
*
|
||||
* @param vDated Fecha a comprobar
|
||||
*/
|
||||
WITH todayDefaulters AS(
|
||||
SELECT client, amount, defaulterSince
|
||||
FROM bi.defaulters
|
||||
WHERE date = vDated
|
||||
AND hasChanged
|
||||
), yesterdayDefaulters AS(
|
||||
SELECT client, amount
|
||||
FROM bi.defaulters
|
||||
WHERE date = vDated - INTERVAL 1 DAY
|
||||
), newDefaulters AS(
|
||||
SELECT td.client,
|
||||
td.amount todayAmount,
|
||||
yd.amount yesterdayAmount,
|
||||
ROUND(yd.amount - td.amount, 2) difference,
|
||||
defaulterSince
|
||||
FROM todayDefaulters td
|
||||
JOIN yesterdayDefaulters yd ON yd.client = td.client
|
||||
WHERE td.amount > 0
|
||||
HAVING difference <> 0
|
||||
) SELECT nd.client,
|
||||
nd.todayAmount,
|
||||
nd.yesterdayAmount,
|
||||
nd.difference,
|
||||
nd.defaulterSince,
|
||||
c.name Cliente,
|
||||
d.name departmentName,
|
||||
c.payMethodFk pay_met_id,
|
||||
c.dueDay Vencimiento
|
||||
FROM newDefaulters nd
|
||||
LEFT JOIN vn.client c ON c.id = nd.client
|
||||
LEFT JOIN vn.department d ON d.id = c.departmentFk;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`campaignComparative`(vDateFrom DATE, vDateTo DATE)
|
||||
BEGIN
|
||||
SELECT
|
||||
workerName,
|
||||
id,
|
||||
name,
|
||||
CAST(SUM(previousAmmount) AS DECIMAL(10, 0)) AS previousAmmount,
|
||||
CAST(SUM(currentAmmount) AS DECIMAL(10, 0)) AS currentAmmount
|
||||
FROM (
|
||||
(SELECT
|
||||
CONCAT(w.firstname, ' ', w.lastName) AS workerName,
|
||||
c.id,
|
||||
c.name,
|
||||
SUM(v.importe) AS previousAmmount,
|
||||
0 currentAmmount
|
||||
FROM bs.ventas v
|
||||
INNER JOIN vn.`client` c ON v.Id_Cliente = c.id
|
||||
INNER JOIN vn.worker w ON c.salesPersonFk = w.id
|
||||
WHERE v.fecha BETWEEN DATE_ADD(vDateFrom, INTERVAL - 1 YEAR)
|
||||
AND DATE_ADD(vDateTo, INTERVAL - 1 YEAR)
|
||||
GROUP BY w.id, v.Id_Cliente)
|
||||
UNION ALL
|
||||
(SELECT
|
||||
CONCAT(w.firstname, ' ', w.lastName) AS workerName,
|
||||
c.id,
|
||||
c.name,
|
||||
0 AS previousAmmount,
|
||||
SUM(s.quantity * s.price) AS currentAmmount
|
||||
FROM vn.sale s
|
||||
JOIN vn.ticket t ON t.id = s.ticketFk
|
||||
JOIN vn.client c ON c.id = t.clientFk
|
||||
JOIN vn.worker w ON c.salesPersonFk = w.id
|
||||
WHERE t.shipped BETWEEN vDateFrom
|
||||
AND vDateTo
|
||||
GROUP BY w.id, c.id)
|
||||
) comparative
|
||||
GROUP BY workerName, id
|
||||
HAVING (previousAmmount <> 0 OR currentAmmount <> 0)
|
||||
ORDER BY workerName, id;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,27 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`carteras_add`()
|
||||
BEGIN
|
||||
/**
|
||||
* Inserta en la tabla @bs.carteras las ventas desde el año pasado
|
||||
* agrupadas por trabajador, año y mes
|
||||
*/
|
||||
DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1;
|
||||
|
||||
DELETE FROM bs.carteras WHERE Año >= vYear;
|
||||
|
||||
CALL util.time_generate(
|
||||
MAKEDATE(vYear, 1),
|
||||
(SELECT MAX(fecha) FROM ventas)
|
||||
);
|
||||
|
||||
INSERT INTO carteras(Año, Mes , CodigoTrabajador, Peso)
|
||||
SELECT t.`year`, t.`month`, w.code, SUM(v.importe)
|
||||
FROM tmp.time t
|
||||
JOIN ventas v on t.dated = v.fecha
|
||||
JOIN vn.client c on c.id = v.Id_Cliente
|
||||
JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
GROUP BY w.code, t.`year`, t.`month`;
|
||||
|
||||
DROP TEMPORARY TABLE tmp.time;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -0,0 +1,60 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`clientDied_calc`(
|
||||
vDays INT,
|
||||
vCountryCode VARCHAR(2)
|
||||
)
|
||||
BEGIN
|
||||
/**
|
||||
* Recalcula los clientes inactivos y hace insert en la tabla clientDied
|
||||
* estableciendo hasta 3 avisos en función del periodo y el código de país.
|
||||
*
|
||||
* @param vDays El número de días a considerar para la inactividad del cliente
|
||||
* @param vCountryCode El código del país para filtrar los clientes
|
||||
*/
|
||||
DECLARE vFirstPeriod , vSecondPeriod, vThridPeriod DATE;
|
||||
SET vFirstPeriod = util.VN_CURDATE() - INTERVAL vDays DAY;
|
||||
SET vSecondPeriod = util.VN_CURDATE() - INTERVAL vDays * 2 DAY;
|
||||
SET vThridPeriod = util.VN_CURDATE() - INTERVAL vDays * 3 DAY;
|
||||
|
||||
DELETE cd.* FROM clientDied cd
|
||||
JOIN (
|
||||
SELECT c.id FROM vn.client c
|
||||
JOIN vn.country co ON co.id = c.countryFk
|
||||
WHERE co.code = vCountryCode
|
||||
) sub ON sub.id = cd.clientFk;
|
||||
|
||||
INSERT INTO clientDied (clientFk, lastInvoiced, warning)
|
||||
SELECT c.id,
|
||||
sub.lastShipped,
|
||||
CASE
|
||||
WHEN lastShipped < vThridPeriod OR lastShipped IS NULL THEN 'third'
|
||||
WHEN lastShipped < vSecondPeriod THEN 'second'
|
||||
WHEN lastShipped < vFirstPeriod THEN 'first'
|
||||
END
|
||||
FROM vn.client c
|
||||
JOIN vn.country co ON co .id = c.countryFk
|
||||
JOIN vn.department w ON w.id = c.departmentFk
|
||||
LEFT JOIN (
|
||||
SELECT c.id, DATE(MAX(t.shipped)) lastShipped
|
||||
FROM vn.client c
|
||||
LEFT JOIN vn.ticket t ON t.clientFk = c.id
|
||||
LEFT JOIN vn.country co ON co.id = c.countryFk
|
||||
WHERE co.code = vCountryCode
|
||||
AND (t.shipped <= util.VN_CURDATE() OR t.shipped IS NULL)
|
||||
GROUP BY c.id
|
||||
) sub ON sub.id = c.id
|
||||
LEFT JOIN vn.clientObservation cob ON cob.clientFk = c.id
|
||||
AND cob.created > vThridPeriod
|
||||
WHERE (sub.lastShipped < vFirstPeriod OR sub.lastShipped IS NULL)
|
||||
AND c.created < vThridPeriod
|
||||
AND co.code = vCountryCode
|
||||
AND cob.`text` IS NULL
|
||||
AND c.id NOT IN (
|
||||
SELECT DISTINCT clientFk
|
||||
FROM vn.ticket
|
||||
WHERE refFk IS NULL
|
||||
AND shipped >= vFirstPeriod
|
||||
)
|
||||
GROUP BY c.id;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -33,9 +33,7 @@ BEGIN
|
|||
END
|
||||
FROM vn.client c
|
||||
JOIN vn.country co ON co .id = c.countryFk
|
||||
JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
JOIN vn.worker b ON b.id = w.bossFk
|
||||
JOIN vn.workerMana wm ON wm.workerFk = c.salesPersonFk
|
||||
JOIN vn.departmentMana dm ON dm.departmentFk = c.departmentFk
|
||||
LEFT JOIN (
|
||||
SELECT c.id, DATE(MAX(t.shipped)) lastShipped
|
||||
FROM vn.client c
|
||||
|
|
|
@ -54,11 +54,11 @@ BEGIN
|
|||
)
|
||||
WHERE updated = vDated;
|
||||
|
||||
-- Maná medio acumulado por comercial
|
||||
-- Maná medio acumulado
|
||||
UPDATE indicators
|
||||
SET averageMana =
|
||||
(SELECT AVG(amount)
|
||||
FROM vn.workerMana
|
||||
FROM vn.departmentMana
|
||||
)
|
||||
WHERE updated = vDated;
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
|
||||
SELECT manaFromDays, manaToDays
|
||||
INTO vManaFromDays, vManaToDays
|
||||
FROM vn.salespersonConfig;
|
||||
FROM vn.manaConfig;
|
||||
|
||||
SELECT MAX(dated) INTO vFromDated
|
||||
FROM vn.clientManaCache;
|
||||
|
@ -43,7 +43,7 @@ BEGIN
|
|||
IF vFromDated IS NULL THEN
|
||||
SELECT manaDateFrom
|
||||
INTO vFromDated
|
||||
FROM vn.salespersonConfig;
|
||||
FROM vn.manaConfig;
|
||||
END IF;
|
||||
|
||||
WHILE vFromDated + INTERVAL vManaToDays DAY < util.VN_CURDATE() DO
|
||||
|
|
|
@ -5,23 +5,23 @@ BEGIN
|
|||
* Recalcula el valor del campo con el modificador de precio
|
||||
* para el componente de maná automático.
|
||||
*/
|
||||
UPDATE vn.workerMana wm
|
||||
UPDATE vn.departmentMana dm
|
||||
JOIN (
|
||||
SELECT c.lastSalesPersonFk,
|
||||
SELECT c.departmentFk,
|
||||
FLOOR(SUM(s.amount) / 12) amount
|
||||
FROM salesByclientSalesPerson s
|
||||
JOIN vn.client c ON c.id = s.clientFk
|
||||
WHERE s.dated BETWEEN util.VN_CURDATE() - INTERVAL 1 YEAR AND util.VN_CURDATE()
|
||||
GROUP BY c.lastSalesPersonFk
|
||||
)avgPortfolioWeight ON avgPortfolioWeight.lastSalesPersonFk = wm.workerFk
|
||||
JOIN vn.salespersonConfig spc
|
||||
SET wm.pricesModifierRate =
|
||||
GROUP BY c.departmentFk
|
||||
)avgPortfolioWeight ON avgPortfolioWeight.departmentFk = dm.departmentFk
|
||||
JOIN vn.manaConfig mc
|
||||
SET dm.pricesModifierRate =
|
||||
IFNULL(
|
||||
GREATEST(
|
||||
spc.manaMinRate,
|
||||
mc.manaMinRate,
|
||||
LEAST(
|
||||
spc.manaMaxRate,
|
||||
ROUND( - wm.amount / avgPortfolioWeight.amount, 3)
|
||||
mc.manaMaxRate,
|
||||
ROUND( - dm.amount / avgPortfolioWeight.amount, 3)
|
||||
)
|
||||
)
|
||||
,0);
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`porfolio_add`()
|
||||
BEGIN
|
||||
/**
|
||||
* Inserta en la tabla @bs.portfolio las ventas desde el año pasado
|
||||
* agrupadas por equipo, año y mes
|
||||
*/
|
||||
DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1;
|
||||
|
||||
CALL util.time_generate(
|
||||
MAKEDATE(vYear, 1),
|
||||
(SELECT MAX(dated) FROM sale)
|
||||
);
|
||||
|
||||
INSERT INTO portfolio(yeared, monthed , saleDepartmentFk, Amount)
|
||||
SELECT t.`year`, t.`month`, w.code, SUM(s.amount)
|
||||
FROM tmp.time t
|
||||
JOIN sale s on t.dated = s.dated
|
||||
JOIN vn.client c on c.id = s.clientFk
|
||||
JOIN vn.department d ON d.id = c.departmentFk
|
||||
GROUP BY d.id, t.`year`, t.`month`;
|
||||
|
||||
DROP TEMPORARY TABLE tmp.time;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,20 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salePersonEvolutionAdd`(IN vDateStart DATETIME)
|
||||
BEGIN
|
||||
DELETE FROM bs.salePersonEvolution
|
||||
WHERE dated <= DATE_SUB(util.VN_CURDATE(), INTERVAL 1 YEAR);
|
||||
|
||||
|
||||
INSERT INTO bs.salePersonEvolution (dated, amount, equalizationTax, salesPersonFk)
|
||||
SELECT fecha dated,
|
||||
CAST(SUM(importe) AS DECIMAL(10,2) ) amount,
|
||||
CAST(SUM(recargo) AS DECIMAL(10,2) ) equalizationTax ,
|
||||
IFNULL(salesPersonFk,0) salesPersonFk
|
||||
FROM bs.ventas v
|
||||
JOIN vn.client c ON v.Id_Cliente = c.id
|
||||
JOIN vn.company co ON co.id = v.empresa_id
|
||||
WHERE co.code = "VNL" AND fecha >= vDateStart
|
||||
GROUP BY v.fecha,c.salesPersonFk
|
||||
ORDER BY salesPersonFk,dated ASC;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -2,8 +2,8 @@ DELIMITER $$
|
|||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesByclientSalesPerson_add`(vDatedFrom DATE)
|
||||
BEGIN
|
||||
/**
|
||||
* Agrupa las ventas por cliente/comercial/fecha en la tabla bs.salesByclientSalesPerson
|
||||
* El asociación cliente/comercial/fecha, se mantiene correcta en el tiempo
|
||||
* Agrupa las ventas por cliente/fecha en la tabla bs.salesByclientSalesPerson
|
||||
* El asociación cliente/fecha, se mantiene correcta en el tiempo
|
||||
*
|
||||
* @param vDatedFrom el cálculo se realizará desde la fecha introducida hasta ayer
|
||||
*/
|
||||
|
@ -24,15 +24,14 @@ BEGIN
|
|||
clientFk,
|
||||
amount,
|
||||
equalizationTax)
|
||||
SELECT s.dated,
|
||||
c.salesPersonFk,
|
||||
s.clientFk,
|
||||
SUM(s.amount),
|
||||
SUM(s.surcharge)
|
||||
FROM sale s
|
||||
JOIN vn.client c on s.clientFk = c.id
|
||||
WHERE s.dated BETWEEN vDatedFrom AND util.yesterday()
|
||||
GROUP BY s.dated, c.salesPersonFk, s.clientFk
|
||||
SELECT dated,
|
||||
NULL,
|
||||
clientFk,
|
||||
SUM(amount),
|
||||
SUM(surcharge)
|
||||
FROM sale
|
||||
WHERE dated BETWEEN vDatedFrom AND util.yesterday()
|
||||
GROUP BY dated, clientFk
|
||||
ON DUPLICATE KEY UPDATE amount= VALUES(amount),
|
||||
equalizationTax= VALUES(equalizationTax);
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesDepartmentEvolution_add`()
|
||||
BEGIN
|
||||
/**
|
||||
* Calcula los datos para los gráficos de evolución agrupado por departmentFk y día.
|
||||
* Recalcula automáticamente los 3 últimos meses para comprobar si hay algún cambio.
|
||||
*/
|
||||
DECLARE vDated DATE;
|
||||
|
||||
SELECT MAX(dated) - INTERVAL 3 MONTH INTO vDated
|
||||
FROM salesDepartmentEvolution;
|
||||
|
||||
DELETE FROM salesDepartmentEvolution
|
||||
WHERE dated >= vDated;
|
||||
|
||||
IF ISNULL(vDated) THEN
|
||||
SELECT MIN(dated) INTO vDated
|
||||
FROM salesByClientDepartment;
|
||||
|
||||
INSERT INTO salesByClientDepartment(
|
||||
departmentFk,
|
||||
dated,
|
||||
amount,
|
||||
equalizationTax,
|
||||
amountNewBorn
|
||||
)
|
||||
SELECT departmentFk,
|
||||
dated,
|
||||
amount,
|
||||
equalizationTax,
|
||||
amountNewBorn
|
||||
FROM salesByClientDepartment
|
||||
WHERE dated = vDated
|
||||
GROUP BY departmentFk;
|
||||
|
||||
SET vDated = vDated + INTERVAL 1 DAY;
|
||||
END IF;
|
||||
|
||||
WHILE vDated < util.VN_CURDATE() DO
|
||||
|
||||
REPLACE salesByClientDepartment(departmentFk, dated, amount)
|
||||
SELECT departmentFk, vDated, amount
|
||||
FROM(SELECT departmentFk, SUM(amount) amount
|
||||
FROM(SELECT departmentFk, amount
|
||||
FROM salesByClientDepartment
|
||||
WHERE dated = vDated - INTERVAL 1 DAY
|
||||
UNION ALL
|
||||
SELECT departmentFk, amount
|
||||
FROM salesByClientDepartment
|
||||
WHERE dated = vDated
|
||||
UNION ALL
|
||||
SELECT departmentFk, - amount
|
||||
FROM salesByClientDepartment
|
||||
WHERE dated = vDated - INTERVAL 1 YEAR
|
||||
)sub
|
||||
GROUP BY departmentFk
|
||||
)sub
|
||||
GROUP BY departmentFk;
|
||||
|
||||
SET vDated = vDated + INTERVAL 1 DAY;
|
||||
|
||||
END WHILE;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,65 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesPersonEvolution_add`()
|
||||
BEGIN
|
||||
/**
|
||||
* Calcula los datos para los gráficos de evolución agrupado por salesPersonFk y día.
|
||||
* Recalcula automáticamente los 3 últimos meses para comprobar si hay algún cambio.
|
||||
*/
|
||||
DECLARE vDated DATE;
|
||||
DECLARE vCont INT DEFAULT 1;
|
||||
|
||||
SELECT MAX(dated) - INTERVAL 3 MONTH INTO vDated
|
||||
FROM salesPersonEvolution;
|
||||
|
||||
DELETE FROM salesPersonEvolution
|
||||
WHERE dated >= vDated;
|
||||
|
||||
IF ISNULL(vDated) THEN
|
||||
SELECT MIN(dated) INTO vDated
|
||||
FROM salesByclientSalesPerson;
|
||||
|
||||
INSERT INTO salesPersonEvolution(
|
||||
salesPersonFk,
|
||||
dated,
|
||||
amount,
|
||||
equalizationTax,
|
||||
amountNewBorn
|
||||
)
|
||||
SELECT salesPersonFk,
|
||||
dated,
|
||||
amount,
|
||||
equalizationTax,
|
||||
amountNewBorn
|
||||
FROM salesByclientSalesPerson
|
||||
WHERE dated = vDated
|
||||
GROUP BY salesPersonFk;
|
||||
|
||||
SET vDated = vDated + INTERVAL 1 DAY;
|
||||
END IF;
|
||||
|
||||
WHILE vDated < util.VN_CURDATE() DO
|
||||
|
||||
SET vCont = vCont + 1;
|
||||
REPLACE salesPersonEvolution(salesPersonFk, dated, amount)
|
||||
SELECT salesPersonFk, vDated, amount
|
||||
FROM(SELECT salesPersonFk, SUM(amount) amount
|
||||
FROM(SELECT salesPersonFk, amount
|
||||
FROM salesPersonEvolution
|
||||
WHERE dated = vDated - INTERVAL 1 DAY
|
||||
UNION ALL
|
||||
SELECT salesPersonFk, amount
|
||||
FROM salesByclientSalesPerson
|
||||
WHERE dated = vDated
|
||||
UNION ALL
|
||||
SELECT salesPersonFk, - amount
|
||||
FROM salesByclientSalesPerson
|
||||
WHERE dated = vDated - INTERVAL 1 YEAR
|
||||
)sub
|
||||
GROUP BY salesPersonFk
|
||||
)sub
|
||||
GROUP BY salesPersonFk;
|
||||
|
||||
SET vDated = vDated + INTERVAL 1 DAY;
|
||||
END WHILE;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -2,7 +2,7 @@ DELIMITER $$
|
|||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`vendedores_add_launcher`()
|
||||
BEGIN
|
||||
|
||||
CALL bs.salesByclientSalesPerson_add(util.VN_CURDATE()- INTERVAL 45 DAY);
|
||||
CALL bs.salesByClientSalesPerson_add(util.VN_CURDATE()- INTERVAL 45 DAY);
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -27,26 +27,8 @@ BEGIN
|
|||
WHERE t.clientFk = NEW.EndUserPartyGLN AND t.shipped >= util.VN_CURDATE()
|
||||
AND i.supplyResponseFk = NEW.supplyResponseID;
|
||||
|
||||
INSERT INTO vn.mail (sender, `subject`, body)
|
||||
SELECT IF(u.id IS NOT NULL AND c.email IS NOT NULL,
|
||||
c.email,
|
||||
CONCAT(account.user_getNameFromId(c.salesPersonFk), '@verdnatura.es')
|
||||
),
|
||||
'Producto no disponible en Floramondo',
|
||||
CONCAT('El artículo ', s.concept, ' del ticket ', t.id , ' ha sido cancelado por Floramondo. ',
|
||||
' Se ha actualizado la cantidad de ', OLD.quantity,' a 0. ',
|
||||
IF (u.id IS NOT NULL AND c.email IS NOT NULL ,
|
||||
CONCAT('https://shop.verdnatura.es/#!form=ecomerce%2Fticket&ticket=', t.id ),
|
||||
CONCAT('https://salix.verdnatura.es/#!/ticket/', t.id ,'/summary')))
|
||||
FROM vn.sale s
|
||||
JOIN vn.ticket t ON t.id = s.ticketFk
|
||||
JOIN vn.`client` c ON c.id = t.clientFk
|
||||
LEFT JOIN account.user u ON u.id= c.salesPersonFk AND u.name IN ('ruben', 'ismaelalcolea')
|
||||
WHERE s.id = vSaleFk;
|
||||
|
||||
END IF;
|
||||
|
||||
|
||||
IF NEW.OrderStatus = vOrderStatusOK AND NOT (NEW.OrderStatus <=> OLD.OrderStatus) THEN
|
||||
|
||||
SELECT v.isEktSender INTO vIsEktSender
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`client_unassignDepartment`
|
||||
ON SCHEDULE EVERY 1 DAY
|
||||
STARTS '2023-06-01 03:30:00.000'
|
||||
ON COMPLETION PRESERVE
|
||||
ENABLE
|
||||
DO CALL client_unassignDepartment$$
|
||||
DELIMITER ;
|
|
@ -1,8 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `vn`.`client_unassignSalesPerson`
|
||||
ON SCHEDULE EVERY 1 DAY
|
||||
STARTS '2023-06-01 03:30:00.000'
|
||||
ON COMPLETION PRESERVE
|
||||
ENABLE
|
||||
DO CALL client_unassignSalesPerson$$
|
||||
DELIMITER ;
|
|
@ -1,95 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`catalog_componentReverse`(vWarehouse INT,
|
||||
vCost DECIMAL(10,3),
|
||||
vM3 DECIMAL(10,3),
|
||||
vAddressFk INT,
|
||||
vZoneFk INT)
|
||||
RETURNS decimal(10,3)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/* Calcula los componentes para un cliente a partir de un coste y volumen
|
||||
* @param vWarehouse
|
||||
* @param vCost Valor de coste del articulo
|
||||
* @param vM3 m3 del articulo
|
||||
* @param vAddressFk
|
||||
* @param vZoneFk
|
||||
* @return vRetailedPrice precio de venta sin iva
|
||||
* @return tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||
*/
|
||||
|
||||
DECLARE vBoxVolume BIGINT;
|
||||
DECLARE vCustomer INT;
|
||||
DECLARE vComponentRecovery INT DEFAULT 17;
|
||||
DECLARE vComponentMana INT DEFAULT 39;
|
||||
DECLARE vDeliveryComponent INT DEFAULT 15;
|
||||
DECLARE vComponentMargin INT DEFAULT 29;
|
||||
DECLARE vComponentCost INT DEFAULT 28;
|
||||
DECLARE vRetailedPrice DECIMAL(10,2);
|
||||
DECLARE vItem INT DEFAULT 98;
|
||||
|
||||
SELECT volume INTO vBoxVolume
|
||||
FROM vn.packaging
|
||||
WHERE id = '94';
|
||||
|
||||
SELECT clientFk INTO vCustomer FROM address WHERE id = vAddressFk;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp.catalog_component;
|
||||
CREATE TEMPORARY TABLE tmp.catalog_component (
|
||||
`warehouseFk` INT UNSIGNED NOT NULL,
|
||||
`itemFk` INT NOT NULL,
|
||||
`componentFk` INT UNSIGNED NOT NULL,
|
||||
`cost` DECIMAL(10,4) NOT NULL,
|
||||
INDEX `itemWarehouse` USING BTREE (`itemFk` ASC, `warehouseFk` ASC),
|
||||
UNIQUE INDEX `itemWarehouseComponent` (`itemFk` ASC, `warehouseFk` ASC, `componentFk` ASC));
|
||||
|
||||
-- Cost
|
||||
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||
SELECT vWarehouse, vItem, vComponentCost, vCost
|
||||
FROM vn.rate
|
||||
WHERE dated <= util.VN_CURDATE()
|
||||
AND warehouseFk = vWarehouse
|
||||
ORDER BY dated DESC
|
||||
LIMIT 1;
|
||||
|
||||
-- Margen
|
||||
-- No se aplica margen, cau 12589
|
||||
/* INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||
SELECT vWarehouse, vItem, vComponentMargin, (vCost / ((100 - rate2) / 100)) - vCost
|
||||
FROM vn.rate
|
||||
WHERE dated <= util.VN_CURDATE()
|
||||
AND warehouseFk = vWarehouse
|
||||
ORDER BY dated DESC
|
||||
LIMIT 1;
|
||||
*/
|
||||
-- Recobro
|
||||
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||
SELECT vWarehouse, vItem, vComponentRecovery, ROUND(LEAST(recobro,0.25), 3)
|
||||
FROM bi.claims_ratio
|
||||
WHERE Id_Cliente = vCustomer AND recobro > 0.009;
|
||||
|
||||
-- Componente de maná automático, en función del maná acumulado por el comercial.
|
||||
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||
SELECT vWarehouse, vItem, vComponentMana, ROUND(wm.pricesModifierRate, 3)
|
||||
FROM client c
|
||||
JOIN vn.workerMana wm ON c.salesPersonFk = wm.workerFk
|
||||
WHERE wm.isPricesModifierActivated AND c.id = vCustomer LIMIT 1;
|
||||
|
||||
-- Reparto
|
||||
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||
SELECT vWarehouse, vItem, vDeliveryComponent,
|
||||
ROUND(
|
||||
vM3
|
||||
* (z.price - z.bonus)
|
||||
* z.inflation
|
||||
/ vBoxVolume, 4
|
||||
)
|
||||
FROM zone z
|
||||
WHERE z.id = vZoneFk;
|
||||
|
||||
-- Precio de venta
|
||||
SELECT SUM(cost) INTO vRetailedPrice
|
||||
FROM tmp.catalog_component;
|
||||
|
||||
RETURN vRetailedPrice;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,11 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`clientGetSalesPerson`(vClientFk INT, vDated DATE)
|
||||
RETURNS int(11)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/**
|
||||
* DEPRECATED: use client_getSalesPerson
|
||||
**/
|
||||
RETURN client_getSalesPerson(vClientFk, vDated);
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -31,7 +31,7 @@ BEGIN
|
|||
FROM tClient t
|
||||
JOIN `client` c ON c.id = t.clientFk
|
||||
WHERE c.isActive
|
||||
AND c.salesPersonFk
|
||||
AND c.departmentFk
|
||||
LIMIT 1;
|
||||
|
||||
DROP TEMPORARY TABLE tClient;
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPerson`(vClientFk INT, vDated DATE)
|
||||
RETURNS int(11)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/**
|
||||
* Dado un id cliente y una fecha, devuelve su comercial para ese dia, teniendo
|
||||
* en cuenta la jerarquía de las tablas: 1º la de sharingclient, 2º la de
|
||||
* sharingcart y tercero la de clientes.
|
||||
*
|
||||
* @param vClientFk El id del cliente
|
||||
* @param vDated Fecha a comprobar
|
||||
* @return El id del comercial para la fecha dada
|
||||
**/
|
||||
DECLARE vSalesPersonFk INT DEFAULT NULL;
|
||||
DECLARE vWorkerSubstituteFk INT DEFAULT NULL;
|
||||
DECLARE vLoop BOOLEAN;
|
||||
|
||||
-- Obtiene el comercial original y el de sharingclient
|
||||
|
||||
SELECT c.salesPersonFk, s.workerFk
|
||||
INTO vSalesPersonFk, vWorkerSubstituteFk
|
||||
FROM client c
|
||||
LEFT JOIN sharingClient s
|
||||
ON c.id = s.clientFk
|
||||
AND vDated BETWEEN s.started AND s.ended
|
||||
WHERE c.id = vClientFk
|
||||
ORDER BY s.id
|
||||
LIMIT 1;
|
||||
|
||||
-- Si no hay ninguno en sharingclient busca en sharingcart
|
||||
|
||||
IF vWorkerSubstituteFk IS NOT NULL
|
||||
THEN
|
||||
SET vSalesPersonFk = vWorkerSubstituteFk;
|
||||
ELSEIF vSalesPersonFk IS NOT NULL
|
||||
THEN
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp.stack;
|
||||
CREATE TEMPORARY TABLE tmp.stack
|
||||
(INDEX (substitute))
|
||||
ENGINE = MEMORY
|
||||
SELECT vSalesPersonFk substitute;
|
||||
|
||||
l: LOOP
|
||||
SELECT workerSubstitute INTO vWorkerSubstituteFk
|
||||
FROM sharingCart
|
||||
WHERE util.VN_CURDATE() BETWEEN started AND ended
|
||||
AND workerFk = vSalesPersonFk
|
||||
ORDER BY id
|
||||
LIMIT 1;
|
||||
|
||||
IF vWorkerSubstituteFk IS NULL THEN
|
||||
LEAVE l;
|
||||
END IF;
|
||||
|
||||
SELECT COUNT(*) > 0 INTO vLoop
|
||||
FROM tmp.stack WHERE substitute = vWorkerSubstituteFk;
|
||||
|
||||
IF vLoop THEN
|
||||
LEAVE l;
|
||||
END IF;
|
||||
|
||||
INSERT INTO tmp.stack SET
|
||||
substitute = vWorkerSubstituteFk;
|
||||
|
||||
SET vSalesPersonFk = vWorkerSubstituteFk;
|
||||
END LOOP;
|
||||
|
||||
DROP TEMPORARY TABLE tmp.stack;
|
||||
END IF;
|
||||
|
||||
RETURN vSalesPersonFk;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,23 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPersonByTicket`(vTicketFk INT)
|
||||
RETURNS int(11)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/**
|
||||
* Dado un id ticket, devuelve su comercial.
|
||||
* Para más información ir a client_getSalesPerson()
|
||||
*
|
||||
* @param vClientFk El id del cliente
|
||||
* @param vDated Fecha a comprobar
|
||||
* @return El id del comercial para la fecha dada
|
||||
**/
|
||||
DECLARE vClientFk INT;
|
||||
DECLARE vDated DATE;
|
||||
|
||||
SELECT clientFk, shipped
|
||||
INTO vClientFk, vDated
|
||||
FROM ticket WHERE id = vTicketFk;
|
||||
|
||||
RETURN client_getSalesPerson(vClientFk, vDated);
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,26 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPersonCode`(vClientFk INT, vDated DATE)
|
||||
RETURNS varchar(3) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/**
|
||||
* Dado un id cliente y una fecha, devuelve su comercial.
|
||||
* Para más información ir a client_getSalesPerson()
|
||||
*
|
||||
* @param vClientFk El id del cliente
|
||||
* @param vDated Fecha a comprobar
|
||||
* @return El código del comercial para la fecha dada
|
||||
**/
|
||||
DECLARE vWorkerCode CHAR(3);
|
||||
DECLARE vSalesPersonFk INT;
|
||||
|
||||
SET vSalesPersonFk = client_getSalesPerson(vClientFk, vDated);
|
||||
|
||||
SELECT code
|
||||
INTO vWorkerCode
|
||||
FROM worker
|
||||
WHERE id = vSalesPersonFk;
|
||||
|
||||
RETURN vWorkerCode;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,23 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPersonCodeByTicket`(vTicketFk INT)
|
||||
RETURNS varchar(3) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/**
|
||||
* Dado un id ticket, devuelve su comercial.
|
||||
* Para más información ir a client_getSalesPerson()
|
||||
*
|
||||
* @param vClientFk El id del cliente
|
||||
* @param vDated Fecha a comprobar
|
||||
* @return El código del comercial para la fecha dada
|
||||
**/
|
||||
DECLARE vClientFk INT;
|
||||
DECLARE vDated DATE;
|
||||
|
||||
SELECT clientFk, shipped
|
||||
INTO vClientFk, vDated
|
||||
FROM ticket WHERE id = vTicketFk;
|
||||
|
||||
RETURN client_getSalesPersonCode(vClientFk, vDated);
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -174,12 +174,12 @@ BEGIN
|
|||
SELECT tcb.warehouseFk,
|
||||
tcb.itemFk,
|
||||
c2.id,
|
||||
ROUND(base * wm.pricesModifierRate, 3) manaAuto
|
||||
ROUND(base * dm.pricesModifierRate, 3) manaAuto
|
||||
FROM tmp.ticketComponentBase tcb
|
||||
JOIN `client` c on c.id = vClientFk
|
||||
JOIN workerMana wm ON c.salesPersonFk = wm.workerFk
|
||||
JOIN departmentMana dm ON c.departmentFk = dm.departmentFk
|
||||
JOIN vn.component c2 ON c2.code = 'autoMana'
|
||||
WHERE wm.isPricesModifierActivated
|
||||
WHERE dm.isPricesModifierActivated
|
||||
HAVING manaAuto <> 0;
|
||||
|
||||
-- Precios especiales
|
||||
|
|
|
@ -45,8 +45,6 @@ BEGIN
|
|||
JOIN ticket t ON tobs.ticketFk = t.id
|
||||
WHERE t.shipped < v5Years;
|
||||
DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < v1Years;
|
||||
DELETE FROM sharingCart where ended < v2Months;
|
||||
DELETE FROM sharingClient where ended < v2Months;
|
||||
DELETE tw.* FROM ticketWeekly tw
|
||||
LEFT JOIN sale s ON s.ticketFk = tw.ticketFk
|
||||
LEFT JOIN ticketRequest tr ON tr.ticketFk = tw.ticketFk
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`clientDebtSpray`(vClientFk INT)
|
||||
BEGIN
|
||||
|
||||
/* Reparte el saldo de un cliente en greuge en la cartera que corresponde, y desasigna el comercial
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
DECLARE vClientDebt DOUBLE;
|
||||
|
||||
SELECT vn.client_getDebt(vClientFk, util.VN_CURDATE()) INTO vClientDebt;
|
||||
|
||||
INSERT INTO vn.greuge(clientFk, description, amount, shipped, greugeTypeFk)
|
||||
VALUES (vClientFk, 'Saldo pendiente', vClientDebt, util.VN_CURDATE(), 5);
|
||||
|
||||
CALL vn.clientGreugeSpray(vClientFk, TRUE, '', TRUE);
|
||||
|
||||
INSERT INTO vn.greuge(clientFk, description, amount, shipped, greugeTypeFk)
|
||||
SELECT vClientFk, 'Liquidación cliente', sum(amount), util.VN_CURDATE(), 5
|
||||
FROM vn.greuge
|
||||
WHERE clientFk = vClientFk;
|
||||
|
||||
UPDATE vn.client
|
||||
SET salesPersonFk = NULL
|
||||
WHERE id = vClientFk;
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,7 +1,11 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`clientGreugeSpray`(IN vClientFk INT, IN onlyForHisOwner BOOL, IN vWorkerCode VARCHAR(3), IN vWithMana BOOLEAN)
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clientGreugeSpray`(
|
||||
IN vClientFk INT,
|
||||
IN vIsOnlyForHisOwner BOOL,
|
||||
IN vDepartmentCode VARCHAR(45),
|
||||
IN vWithMana BOOLEAN
|
||||
)
|
||||
BEGIN
|
||||
|
||||
DECLARE vGreuge DECIMAL(10,2);
|
||||
DECLARE vOwner INT;
|
||||
DECLARE vTotalSale INT;
|
||||
|
@ -9,65 +13,62 @@ BEGIN
|
|||
DECLARE vGreugeTypeMana INT DEFAULT 3;-- Maná
|
||||
DECLARE vMana DECIMAL(10,2);
|
||||
|
||||
SELECT vn.clientGetMana(vClientFk) INTO vMana;
|
||||
SELECT clientGetMana(vClientFk) INTO vMana;
|
||||
|
||||
IF vWithMana AND vMana THEN
|
||||
|
||||
INSERT INTO vn.greuge( clientFk,
|
||||
description,
|
||||
amount,
|
||||
shipped,
|
||||
greugeTypeFk)
|
||||
VALUES( vClientFk,
|
||||
'Desasignación',
|
||||
-1 * vMana,
|
||||
util.VN_CURDATE(),
|
||||
vGreugeTypeMana);
|
||||
|
||||
INSERT INTO greuge
|
||||
SET clientFk = vClientFk,
|
||||
description = 'Desasignación',
|
||||
amount = - vMana,
|
||||
shipped = util.VN_CURDATE(),
|
||||
greugeTypeFk = vGreugeTypeMana;
|
||||
END IF;
|
||||
|
||||
SELECT sum(amount) INTO vGreuge
|
||||
FROM vn.greuge
|
||||
SELECT SUM(amount) INTO vGreuge
|
||||
FROM greuge
|
||||
WHERE clientFk = vClientFk;
|
||||
|
||||
IF vGreuge != 0 THEN
|
||||
|
||||
IF LENGTH(vWorkerCode) = 0 THEN
|
||||
|
||||
SELECT salesPersonFk INTO vOwner
|
||||
FROM vn.client
|
||||
IF vGreuge THEN
|
||||
IF LENGTH(vDepartmentCode) THEN
|
||||
SELECT departmentFk INTO vOwner
|
||||
FROM client
|
||||
WHERE id = vClientFk;
|
||||
|
||||
ELSE
|
||||
|
||||
SELECT id INTO vOwner
|
||||
FROM vn.worker
|
||||
WHERE code = vWorkerCode COLLATE utf8_general_ci;
|
||||
|
||||
FROM department
|
||||
WHERE code = vDepartmentCode;
|
||||
END IF;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp.clientList;
|
||||
CREATE TEMPORARY TABLE tmp.clientList
|
||||
SELECT DISTINCT t.clientFk, floor(cr.yearSale / 12) monthSale
|
||||
IF vOwner IS NULL THEN
|
||||
CALL util.throw('The department is incorrect');
|
||||
END IF;
|
||||
|
||||
INSERT INTO greuge(clientFk, description, amount, shipped, greugeTypeFk)
|
||||
WITH greuges AS(
|
||||
SELECT DISTINCT t.clientFk, FLOOR(cr.yearSale / 12) monthSale
|
||||
FROM vn.ticket t
|
||||
JOIN vn.client c ON c.id = t.clientFk
|
||||
JOIN vn.workerMana wm ON wm.workerFk = c.salesPersonFk
|
||||
JOIN vn.departmentMana dm ON dm.departmentFk = c.departmentFk
|
||||
guillermo
commented
Llevar vn Llevar vn
jgallego
commented
este esta perque esta dins dun with este esta perque esta dins dun with
|
||||
JOIN vn.claimRatio cr ON cr.clientFk = c.id
|
||||
WHERE wm.workerFk = IF(onlyForHisOwner, vOwner, wm.workerFk)
|
||||
AND t.shipped >= TIMESTAMPADD(MONTH,-1,util.VN_CURDATE())
|
||||
AND c.id != vClientFk
|
||||
HAVING monthSale > 100;
|
||||
|
||||
SELECT SUM(monthSale) INTO vTotalSale
|
||||
FROM tmp.clientList;
|
||||
|
||||
INSERT INTO vn.greuge(clientFk, description, amount, shipped, greugeTypeFk)
|
||||
SELECT clientFk, CONCAT('Cliente: ',vClientFk), vGreuge * monthSale / vTotalSale, util.VN_CURDATE(), vGreugeTypeFk
|
||||
FROM tmp.clientList
|
||||
WHERE dm.departmentFk = IF(vIsOnlyForHisOwner, vOwner, dm.departmentFk)
|
||||
AND t.shipped >= util.VN_CURDATE() - INTERVAL 1 MONTH
|
||||
AND c.id <> vClientFk
|
||||
HAVING monthSale > 100
|
||||
), totalGreuge AS(
|
||||
SELECT SUM(monthSale) totalSale FROM greuges
|
||||
)SELECT g.clientFk,
|
||||
CONCAT('Cliente: ', vClientFk),
|
||||
vGreuge * g.monthSale / tgtotalSale,
|
||||
util.VN_CURDATE(),
|
||||
vGreugeTypeFk
|
||||
FROM greuges g
|
||||
JOIN totalGreuge tg
|
||||
UNION ALL
|
||||
SELECT vClientFk, 'Reparto greuge', -vGreuge, util.VN_CURDATE(), vGreugeTypeFk;
|
||||
|
||||
SELECT vClientFk,
|
||||
'Reparto greuge',
|
||||
-vGreuge,
|
||||
util.VN_CURDATE(),
|
||||
vGreugeTypeFk;
|
||||
END IF;
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -8,7 +8,7 @@ BEGIN
|
|||
FROM tmp.clientGetDebt c
|
||||
LEFT JOIN clientRisk r ON r.clientFk = c.clientFk
|
||||
GROUP BY c.clientFk
|
||||
HAVING SUM(IFNULL(r.amount,0)) = 0;
|
||||
HAVING SUM(IFNULL(r.amount, 0)) = 0;
|
||||
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||
|
||||
|
@ -25,13 +25,17 @@ BEGIN
|
|||
AND cp.clientFk IS NULL
|
||||
AND co.code NOT IN ('PT')
|
||||
AND a.name <> 'Canarias'
|
||||
AND c.salesPersonFk IS NOT NULL;
|
||||
AND c.departmentFk IS NOT NULL;
|
||||
|
||||
OPEN rs;
|
||||
FETCH rs INTO vClientFk;
|
||||
WHILE NOT vDone DO
|
||||
CALL vn.clientGreugeSpray(vClientFk, TRUE, '',TRUE);
|
||||
UPDATE vn.client SET salesPersonFk = NULL WHERE id = vClientFk;
|
||||
|
||||
UPDATE vn.client
|
||||
guillermo
commented
Llevar vn Llevar vn
|
||||
SET departmentFk = NULL
|
||||
WHERE id = vClientFk;
|
||||
|
||||
FETCH rs INTO vClientFk;
|
||||
END WHILE;
|
||||
CLOSE rs;
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`client_unassignSalesPerson`()
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`client_unassignDepartment`()
|
||||
BEGIN
|
||||
/**
|
||||
* Elimina la asignación de salesPersonFk de la ficha del clientes
|
||||
* Elimina la asignación de departmentFk de la ficha del clientes
|
||||
* que no han realizado una compra en los últimos 3 meses y reparte
|
||||
* su greuge entre el resto de clientes
|
||||
*/
|
||||
|
@ -22,16 +22,15 @@ BEGIN
|
|||
FROM bs.clientDied cd
|
||||
JOIN client c ON c.id = cd.clientFk
|
||||
LEFT JOIN clientProtected cp ON cp.clientFk = c.id
|
||||
LEFT JOIN salesPersonProtected sp ON sp.salesPersonFk = c.salesPersonFk
|
||||
LEFT JOIN departmentNoUnassign sd ON sp.departmentFk = c.departmentFk
|
||||
JOIN province p ON p.id = c.provinceFk
|
||||
LEFT JOIN autonomy a ON a.id = p.autonomyFk
|
||||
JOIN country co ON co.id = p.countryFk
|
||||
JOIN bs.clientDiedPeriod cdp ON cdp.countryFk = co.id
|
||||
WHERE cd.warning = 'third'
|
||||
AND cp.clientFk IS NULL
|
||||
AND sp.salesPersonFk IS NULL
|
||||
AND a.name <> 'Canarias'
|
||||
AND c.salesPersonFk IS NOT NULL;
|
||||
AND c.departmentFk IS NOT NULL;
|
||||
|
||||
OPEN vCursor;
|
||||
l: LOOP
|
||||
|
@ -42,7 +41,7 @@ BEGIN
|
|||
END IF;
|
||||
CALL clientGreugeSpray(vClientFk, TRUE, '', TRUE);
|
||||
UPDATE client
|
||||
SET salesPersonFk = NULL
|
||||
SET departmentFk = NULL
|
||||
WHERE id = vClientFk;
|
||||
END LOOP;
|
||||
CLOSE vCursor;
|
|
@ -26,7 +26,7 @@ BEGIN
|
|||
SELECT DISTINCT c.id
|
||||
FROM client c
|
||||
LEFT JOIN ticket t ON t.clientFk = c.id
|
||||
WHERE c.salesPersonFk IS NOT NULL
|
||||
WHERE c.departmentFk IS NOT NULL
|
||||
OR t.created > util.VN_CURDATE() - INTERVAL vMonths MONTH
|
||||
OR shipped > util.VN_CURDATE() - INTERVAL vMonths MONTH
|
||||
);
|
||||
|
|
|
@ -4,7 +4,8 @@ BEGIN
|
|||
/**
|
||||
* Selecciona los tickets de una colección/ticket/sectorCollection
|
||||
* @param vParamFk ticketFk/collectionFk/sectorCollection
|
||||
* @return Retorna ticketFk, level, agencyName, warehouseFk, salesPersonFk, observation
|
||||
* @return Retorna (ticketFk, level, agencyName, warehouseFk, observation,
|
||||
* rgb, departmentFk)
|
||||
*/
|
||||
DECLARE vItemPackingTypeFk VARCHAR(1);
|
||||
DECLARE vYesterday DATE;
|
||||
|
@ -28,7 +29,7 @@ BEGIN
|
|||
IF(!(vItemPackingTypeFk <=> 'V'), cc.code, CONCAT(SUBSTRING('ABCDEFGH', tc.wagon, 1), '-', tc.`level`)) `level`,
|
||||
am.name agencyName,
|
||||
t.warehouseFk,
|
||||
w.id salesPersonFk,
|
||||
c.departmentFk,
|
||||
guillermo
commented
Quien llama a esto soportará que le retorne departmentFk o salesPersonFk? Es decir, se ha cambiado también? Quien llama a esto soportará que le retorne departmentFk o salesPersonFk? Es decir, se ha cambiado también?
jgallego
commented
es salix front, si es salix front, si
|
||||
IFNULL(ob.description,'') observaciones,
|
||||
cc.rgb,
|
||||
p.code parkingCode,
|
||||
|
@ -43,7 +44,6 @@ BEGIN
|
|||
LEFT JOIN vn.zone z ON z.id = t.zoneFk
|
||||
LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk
|
||||
LEFT JOIN vn.client c ON c.id = t.clientFk
|
||||
LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
LEFT JOIN observation ob ON ob.ticketFk = t.id
|
||||
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
|
||||
LEFT JOIN vn.parking p ON tp.parkingFk = p.id
|
||||
|
@ -55,7 +55,7 @@ BEGIN
|
|||
IF(NOT(vItemPackingTypeFk <=> 'V'), cc.code, CONCAT(SUBSTRING('ABCDEFGH', tc.wagon, 1), '-', tc.`level`)) `level`,
|
||||
am.name agencyName,
|
||||
t.warehouseFk,
|
||||
w.id salesPersonFk,
|
||||
c.departmentFk,
|
||||
ob.description,
|
||||
IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb`,
|
||||
p.code parkingCode,
|
||||
|
@ -70,7 +70,6 @@ BEGIN
|
|||
LEFT JOIN vn.zone z ON z.id = t.zoneFk
|
||||
LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk
|
||||
LEFT JOIN vn.client c ON c.id = t.clientFk
|
||||
LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
LEFT JOIN observation ob ON ob.ticketFk = t.id
|
||||
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
|
||||
LEFT JOIN vn.parking p ON tp.parkingFk = p.id
|
||||
|
@ -81,7 +80,7 @@ BEGIN
|
|||
NULL `level`,
|
||||
am.name agencyName,
|
||||
t.warehouseFk,
|
||||
c.salesPersonFk,
|
||||
c.departmentFk,
|
||||
ob.description,
|
||||
NULL `rgb`,
|
||||
p.code parkingCode,
|
||||
|
|
|
@ -14,7 +14,6 @@ BEGIN
|
|||
s.ticketFk,
|
||||
t.nickname client,
|
||||
am.name agencyName,
|
||||
wk.code salesPerson,
|
||||
s.itemFk,
|
||||
IFNULL(CONCAT(ig.longName,' ',ig.`size`,' ',ig.subName), s.concept) AS concept,
|
||||
s.quantity,
|
||||
|
@ -24,14 +23,15 @@ BEGIN
|
|||
tls.name stateName,
|
||||
sb.buyFk,
|
||||
s.id saleFk,
|
||||
wk.id salesPersonFk
|
||||
d.id departmentFk,
|
||||
d.name departmentName
|
||||
FROM sale s
|
||||
JOIN ticket t ON t.id = s.ticketFk
|
||||
JOIN warehouse w ON w.id = t.warehouseFk
|
||||
JOIN address a ON a.id = t.addressFk
|
||||
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||
JOIN `client` c ON c.id = a.clientFk
|
||||
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
|
||||
LEFT JOIN department d ON d.id = c.departmentFk
|
||||
LEFT JOIN ticketLastState tls ON tls.ticketFk = t.id
|
||||
LEFT JOIN saleBuy sb ON sb.saleFk = s.id
|
||||
LEFT JOIN buy b ON b.id = sb.buyFk
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`manaSpellersRequery`(vWorkerFk INTEGER)
|
||||
`whole_proc`:
|
||||
BEGIN
|
||||
/**
|
||||
* Guarda en workerMana el mana consumido por un trabajador
|
||||
*
|
||||
* @param vWorkerFk Id Trabajador
|
||||
*/
|
||||
DECLARE vWorkerIsExcluded BOOLEAN;
|
||||
|
||||
SELECT COUNT(*) INTO vWorkerIsExcluded
|
||||
FROM workerManaExcluded
|
||||
WHERE workerFk = vWorkerFk;
|
||||
|
||||
IF vWorkerIsExcluded THEN
|
||||
LEAVE whole_proc;
|
||||
END IF;
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.client
|
||||
SELECT id
|
||||
FROM client
|
||||
WHERE salesPersonFk = vWorkerFk;
|
||||
|
||||
CALL client_getMana();
|
||||
|
||||
INSERT INTO workerMana (workerFk, amount)
|
||||
SELECT vWorkerFk, sum(mana)
|
||||
FROM tmp.clientMana
|
||||
ON DUPLICATE KEY UPDATE amount = VALUES(amount);
|
||||
|
||||
DROP TEMPORARY TABLE
|
||||
tmp.client,
|
||||
tmp.clientMana;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -0,0 +1,35 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`manaSpellers_requery`(
|
||||
vDepartmentFk INTEGER
|
||||
)
|
||||
BEGIN
|
||||
jgallego marked this conversation as resolved
guillermo
commented
Quitar, no hace falta Quitar, no hace falta
|
||||
/**
|
||||
* Guarda en departmentMana el mana consumido por un departamento
|
||||
*
|
||||
* @param vDepartmentFk Id department
|
||||
*/
|
||||
DECLARE vIsDepartmentExcluded BOOLEAN;
|
||||
|
||||
SELECT COUNT(*) INTO vIsDepartmentExcluded
|
||||
FROM departmentManaExcluded
|
||||
WHERE departmentFk = vDepartmentFk;
|
||||
|
||||
IF NOT vIsDepartmentExcluded THEN
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.client
|
||||
SELECT id
|
||||
FROM client
|
||||
WHERE departmentFk = vDepartmentFk;
|
||||
|
||||
CALL client_getMana();
|
||||
|
||||
INSERT INTO departmentMana (departmentFk, amount)
|
||||
SELECT vDepartmentFk, SUM(mana)
|
||||
FROM tmp.clientMana
|
||||
ON DUPLICATE KEY UPDATE amount = VALUES(amount);
|
||||
|
||||
DROP TEMPORARY TABLE
|
||||
tmp.client,
|
||||
tmp.clientMana;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -80,7 +80,7 @@ proc: BEGIN
|
|||
IFNULL(tls.state,2) state,
|
||||
w.code workerCode,
|
||||
DATE(t.shipped) shipped,
|
||||
wk.code salesPersonCode,
|
||||
d.code departmentCode,
|
||||
p.id provinceFk,
|
||||
tls.productionOrder,
|
||||
IFNULL(tls.alertLevel, al.id) alertLevel,
|
||||
|
@ -96,23 +96,23 @@ proc: BEGIN
|
|||
ag.isOwn,
|
||||
rm.bufferFk
|
||||
FROM tmp.productionTicket tt
|
||||
JOIN vn.ticket t ON tt.ticketFk = t.id
|
||||
JOIN vn.alertLevel al ON al.code = 'FREE'
|
||||
LEFT JOIN vn.ticketStateToday tst ON tst.ticketFk = t.id
|
||||
LEFT JOIN vn.`state` st ON st.id = tst.state
|
||||
LEFT JOIN vn.client c ON c.id = t.clientFk
|
||||
LEFT JOIN vn.worker wk ON wk.id = c.salesPersonFk
|
||||
JOIN vn.address a ON a.id = t.addressFk
|
||||
LEFT JOIN vn.province p ON p.id = a.provinceFk
|
||||
JOIN vn.agencyMode am ON am.id = t.agencyModeFk
|
||||
JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk
|
||||
JOIN vn.agency ag ON ag.id = am.agencyFk
|
||||
LEFT JOIN vn.ticketState tls ON tls.ticketFk = tt.ticketFk
|
||||
LEFT JOIN vn.ticketLastUpdated tlu ON tlu.ticketFk = tt.ticketFk
|
||||
LEFT JOIN vn.worker w ON w.id = tls.userFk
|
||||
LEFT JOIN vn.routesMonitor rm ON rm.routeFk = t.routeFk
|
||||
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
|
||||
LEFT JOIN vn.zoneClosure zc ON zc.zoneFk = t.zoneFk
|
||||
JOIN ticket t ON tt.ticketFk = t.id
|
||||
JOIN alertLevel al ON al.code = 'FREE'
|
||||
LEFT JOIN ticketStateToday tst ON tst.ticketFk = t.id
|
||||
LEFT JOIN `state` st ON st.id = tst.state
|
||||
LEFT JOIN client c ON c.id = t.clientFk
|
||||
LEFT JOIN department d ON d.id = c.departmentFk
|
||||
JOIN address a ON a.id = t.addressFk
|
||||
LEFT JOIN province p ON p.id = a.provinceFk
|
||||
JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||
JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
|
||||
JOIN agency ag ON ag.id = am.agencyFk
|
||||
LEFT JOIN ticketState tls ON tls.ticketFk = tt.ticketFk
|
||||
LEFT JOIN ticketLastUpdated tlu ON tlu.ticketFk = tt.ticketFk
|
||||
LEFT JOIN worker w ON w.id = tls.userFk
|
||||
LEFT JOIN routesMonitor rm ON rm.routeFk = t.routeFk
|
||||
LEFT JOIN `zone` z ON z.id = t.zoneFk
|
||||
LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
|
||||
AND DATE(t.shipped) = zc.dated
|
||||
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
|
||||
LEFT JOIN vn.parking pk ON pk.id = tp.parkingFk
|
||||
|
|
|
@ -8,7 +8,7 @@ BEGIN
|
|||
* @param vRouteFk
|
||||
* @select Información de los tickets
|
||||
*/
|
||||
SELECT t.id Id,
|
||||
SELECT t.id Id,
|
||||
t.clientFk Client,
|
||||
a.id Address,
|
||||
a.nickname ClientName,
|
||||
|
@ -23,7 +23,7 @@ SELECT t.id Id,
|
|||
a.mobile AddressMobile,
|
||||
d.longitude Longitude,
|
||||
d.latitude Latitude,
|
||||
wm.mediaValue SalePersonPhone,
|
||||
de.pbxQueue departmentPhone,
|
||||
jgallego marked this conversation as resolved
guillermo
commented
Quien se espera esto soportará departmentPhone o dará error? Quien se espera esto soportará departmentPhone o dará error?
|
||||
tob.description Note,
|
||||
t.isSigned Signed,
|
||||
t.priority,
|
||||
|
@ -31,7 +31,8 @@ SELECT t.id Id,
|
|||
FROM ticket t
|
||||
JOIN client c ON t.clientFk = c.id
|
||||
JOIN address a ON t.addressFk = a.id
|
||||
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
|
||||
LEFT JOIN department de ON de.id = c.departmentFk
|
||||
LEFT JOIN company co ON co.`code` = 'VNL'
|
||||
LEFT JOIN (
|
||||
SELECT t.addressFk, MAX(d.ticketFk) lastTicketFk
|
||||
FROM ticket t
|
||||
|
|
|
@ -15,7 +15,7 @@ BEGIN
|
|||
w.code workerCode,
|
||||
sgd.saleFk,
|
||||
iss.quantity pickedQuantity,
|
||||
c.salesPersonFk
|
||||
c.departmentFk
|
||||
FROM vn.sale s
|
||||
JOIN item i ON i.id = s.itemFk
|
||||
JOIN saleGroupDetail sgd ON sgd.saleFk = s.id
|
||||
|
|
|
@ -25,7 +25,6 @@ BEGIN
|
|||
origin.futureState,
|
||||
origin.futureIpt,
|
||||
dest.ipt,
|
||||
origin.workerFk,
|
||||
origin.futureLiters,
|
||||
origin.futureLines,
|
||||
dest.shipped,
|
||||
|
@ -56,7 +55,6 @@ BEGIN
|
|||
origin.saleClonedFk
|
||||
FROM (
|
||||
SELECT s.ticketFk,
|
||||
c.salesPersonFk workerFk,
|
||||
t.shipped,
|
||||
t.totalWithVat,
|
||||
st.name futureState,
|
||||
|
@ -74,11 +72,10 @@ BEGIN
|
|||
t.warehouseFk,
|
||||
t.companyFk,
|
||||
t.agencyModeFk,
|
||||
wd.departmentFk,
|
||||
c.departmentFk,
|
||||
sc.saleClonedFk
|
||||
FROM ticket t
|
||||
JOIN client c ON c.id = t.clientFk
|
||||
JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
LEFT JOIN saleCloned sc ON sc.saleClonedFk = s.id
|
||||
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||
|
|
|
@ -176,11 +176,10 @@ BEGIN
|
|||
CONCAT(ticketObservation.description,VALUES(description),' ');
|
||||
|
||||
IF vLanding IS NULL THEN
|
||||
SELECT IFNULL(d.notificationEmail, e.email) INTO vEmail
|
||||
|
||||
SELECT d.notificationEmail INTO vEmail
|
||||
FROM client c
|
||||
JOIN account.emailUser e ON e.userFk = c.salesPersonFk
|
||||
LEFT JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
|
||||
LEFT JOIN department d ON d.id = wd.departmentFk
|
||||
LEFT JOIN department d ON d.id = c.departmentFk
|
||||
WHERE c.id = vClientFk;
|
||||
|
||||
SET vSubject = CONCAT('Turnos - No se ha podido clonar correctamente el ticket ',
|
||||
|
|
|
@ -1,33 +1,30 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerDisable`(vUserId int)
|
||||
mainLabel:BEGIN
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerDisable`(vUserFk INT)
|
||||
l:BEGIN
|
||||
|
||||
IF (SELECT COUNT(*) FROM workerDisableExcluded WHERE workerFk = vUserId AND (dated > util.VN_CURDATE() OR dated IS NULL)) > 0 THEN
|
||||
LEAVE mainLabel;
|
||||
IF (SELECT COUNT(*)
|
||||
FROM workerDisableExcluded
|
||||
WHERE workerFk = vUserFk
|
||||
AND (dated > util.VN_CURDATE() OR dated IS NULL)) > 0 THEN
|
||||
LEAVE l;
|
||||
END IF;
|
||||
|
||||
DELETE cp FROM clientProtected cp
|
||||
JOIN client c ON c.id = cp.clientFk
|
||||
WHERE c.salesPersonFk = vUserId;
|
||||
|
||||
DELETE FROM account.account
|
||||
WHERE id = vUserId;
|
||||
DELETE FROM account.account WHERE id = vUserFk;
|
||||
|
||||
UPDATE account.user
|
||||
SET role = 2
|
||||
WHERE id = vUserId;
|
||||
WHERE id = vUserFk;
|
||||
|
||||
DELETE FROM pbx.sip
|
||||
WHERE user_id = vUserId;
|
||||
DELETE FROM pbx.sip WHERE user_id = vUserFk;
|
||||
|
||||
UPDATE `client` c
|
||||
JOIN payMethod p ON p.name = 'CONTADO'
|
||||
SET c.credit = 0, c.payMethodFk = p.id, hasCoreVnl = FALSE
|
||||
WHERE c.id = vUserId;
|
||||
|
||||
UPDATE `client` c
|
||||
SET c.salesPersonFk = null
|
||||
WHERE c.salesPersonFk = vUserId;
|
||||
SET c.credit = 0,
|
||||
c.payMethodFk = p.id,
|
||||
c.hasCoreVnl = FALSE,
|
||||
c.isActive = FALSE,
|
||||
c.isTaxDataChecked = FALSE
|
||||
WHERE c.id = vUserFk;
|
||||
|
||||
UPDATE locker l
|
||||
SET l.workerFk = NULL
|
||||
|
|
|
@ -23,21 +23,18 @@ BEGIN
|
|||
WHERE landed BETWEEN vLanded AND util.dayEnd(vLanded)
|
||||
AND NOT isDeleted
|
||||
)
|
||||
SELECT c.id,
|
||||
SELECT c.id clientFk,
|
||||
c.name,
|
||||
c.phone,
|
||||
bt.description,
|
||||
c.salesPersonFk,
|
||||
u.name username,
|
||||
c.departmentFk,
|
||||
d.name departmentName,
|
||||
jgallego marked this conversation as resolved
guillermo
commented
Aquí habrá que cambiar grafana que es el único servicio que utiliza este proc, apuntar para el día de subida a producción que no se nos pase, ya que es una herramienta que gastan mucho los comerciales Aquí habrá que cambiar grafana que es el único servicio que utiliza este proc, apuntar para el día de subida a producción que no se nos pase, ya que es una herramienta que gastan mucho los comerciales
|
||||
aai.invoiced,
|
||||
cnb.lastShipped,
|
||||
IF(cwt.clientFk, TRUE, FALSE) hasTicket
|
||||
FROM vn.client c
|
||||
JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
JOIN vn.workerDepartment wd ON wd.workerFk = w.id
|
||||
JOIN vn.department d ON d.id = wd.departmentFk
|
||||
LEFT JOIN clientWithTicket cwt ON cwt.clientFk = c.id
|
||||
LEFT JOIN account.`user` u ON u.id = c.salesPersonFk
|
||||
LEFT JOIN vn.department d ON d.id = c.departmentFk
|
||||
JOIN vn.`address` a ON a.clientFk = c.id
|
||||
JOIN vn.postCode pc ON pc.code = a.postalCode
|
||||
JOIN vn.town t ON t.id = pc.townFk AND t.provinceFk = a.provinceFk
|
||||
|
|
|
@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`client_beforeInsert`
|
|||
BEGIN
|
||||
SET NEW.editorFk = account.myUser_getId();
|
||||
SET NEW.accountingAccount = 4300000000 + NEW.id;
|
||||
SET NEW.lastSalesPersonFk = NEW.salesPersonFk;
|
||||
SET NEW.lastdepartmentFk = NEW.departmentFk;
|
||||
SET NEW.geoFk = client_getGeo(NEW.id);
|
||||
|
||||
IF (NEW.phone <> '') THEN
|
||||
|
@ -15,5 +15,6 @@ BEGIN
|
|||
IF (NEW.mobile <> '') THEN
|
||||
CALL pbx.phone_isValid(NEW.mobile);
|
||||
END IF;
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -45,18 +45,16 @@ BEGIN
|
|||
IF vText IS NOT NULL
|
||||
THEN
|
||||
INSERT INTO mail(receiver, replyTo, `subject`, body)
|
||||
SELECT
|
||||
CONCAT(IF(ac.id,u.name, 'jgallego'), '@verdnatura.es'),
|
||||
SELECT IFNULL(d.notificationEmail, 'jgallego@verdnatura.es'),
|
||||
'administracion@verdnatura.es',
|
||||
CONCAT('Cliente ', NEW.id),
|
||||
CONCAT('Recibida la documentación: ', vText)
|
||||
FROM worker w
|
||||
LEFT JOIN account.user u ON w.id = u.id AND u.active
|
||||
LEFT JOIN account.account ac ON ac.id = u.id
|
||||
WHERE w.id = NEW.salesPersonFk;
|
||||
FROM department d
|
||||
WHERE d.id = NEW.departmentFk;
|
||||
END IF;
|
||||
|
||||
IF NEW.salespersonFk IS NULL AND OLD.salespersonFk IS NOT NULL THEN
|
||||
|
||||
IF NEW.departmentFk IS NULL AND OLD.departmentFk IS NOT NULL THEN
|
||||
IF (SELECT COUNT(clientFk)
|
||||
FROM clientProtected
|
||||
WHERE clientFk = NEW.id
|
||||
|
@ -65,10 +63,6 @@ BEGIN
|
|||
END IF;
|
||||
END IF;
|
||||
|
||||
IF NOT (NEW.salesPersonFk <=> OLD.salesPersonFk) THEN
|
||||
SET NEW.lastSalesPersonFk = IFNULL(NEW.salesPersonFk, OLD.salesPersonFk);
|
||||
END IF;
|
||||
|
||||
IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN
|
||||
SET NEW.isTaxDataChecked = 0;
|
||||
END IF;
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`departmentMana_beforeInsert`
|
||||
BEFORE INSERT ON `departmentMana`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT EXISTS(SELECT TRUE FROM departmentManaExcluded WHERE departmentFk = NEW.departmentFk)) THEN
|
||||
CALL util.throw('Department is excluded from mana');
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -0,0 +1,10 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`departmentMana_beforeUpdate`
|
||||
BEFORE UPDATE ON `departmentMana`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT EXISTS(SELECT TRUE FROM departmentManaExcluded WHERE departmentFk = NEW.departmentFk)) THEN
|
||||
CALL util.throw('Department is excluded from mana');
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,11 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingCart_beforeDelete`
|
||||
BEFORE DELETE ON `sharingCart`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
DELETE sc FROM sharingCartDaily sc
|
||||
WHERE sc.dated BETWEEN OLD.started AND OLD.ended AND
|
||||
sc.ownerFk = OLD.workerFk AND
|
||||
sc.substituteFk = OLD.workerSubstitute;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,15 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingCart_beforeInsert`
|
||||
BEFORE INSERT ON `sharingCart`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.workerFk = NEW.workerSubstitute THEN
|
||||
CALL util.throw ('worker and workerSubstitute must be different');
|
||||
ELSE
|
||||
INSERT IGNORE INTO sharingCartDaily (ownerFk, substituteFk, dated)
|
||||
SELECT NEW.workerFk, NEW.workerSubstitute, dated
|
||||
FROM time
|
||||
WHERE dated BETWEEN NEW.started AND NEW.ended;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,21 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingCart_beforeUpdate`
|
||||
BEFORE UPDATE ON `sharingCart`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.workerFk = NEW.workerSubstitute THEN
|
||||
CALL util.throw ('worker and workerSubstitute must be different');
|
||||
ELSE
|
||||
DELETE sc FROM sharingCartDaily sc
|
||||
WHERE sc.dated BETWEEN OLD.started AND OLD.ended AND
|
||||
sc.ownerFk = OLD.workerFk AND
|
||||
sc.substituteFk = OLD.workerSubstitute;
|
||||
|
||||
INSERT IGNORE INTO sharingCartDaily (ownerFk, substituteFk, dated)
|
||||
SELECT NEW.workerFk, NEW.workerSubstitute, dated
|
||||
FROM time
|
||||
WHERE dated BETWEEN NEW.started AND NEW.ended;
|
||||
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,9 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingClient_beforeInsert`
|
||||
BEFORE INSERT ON `sharingClient`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.ended = GREATEST(util.VN_CURDATE(),NEW.ended);
|
||||
SET NEW.started = GREATEST(util.VN_CURDATE(),NEW.started);
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,9 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingClient_beforeUpdate`
|
||||
BEFORE UPDATE ON `sharingClient`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.ended = GREATEST(util.VN_CURDATE(),NEW.ended);
|
||||
SET NEW.started = GREATEST(util.VN_CURDATE(),NEW.started);
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,9 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerManaExcluded_beforeInsert`
|
||||
BEFORE INSERT ON `workerManaExcluded`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
DELETE FROM workerMana
|
||||
WHERE workerFk = NEW.workerFk;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,9 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerManaExcluded_beforeUpdate`
|
||||
BEFORE UPDATE ON `workerManaExcluded`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
DELETE FROM workerMana
|
||||
WHERE workerFk = NEW.workerFk;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,10 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerMana_beforeInsert`
|
||||
BEFORE INSERT ON `workerMana`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN
|
||||
CALL util.throw('Worker is excluded from mana');
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,10 +0,0 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerMana_beforeUpdate`
|
||||
BEFORE UPDATE ON `workerMana`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN
|
||||
CALL util.throw('Worker is excluded from mana');
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,26 +1,16 @@
|
|||
CREATE OR REPLACE DEFINER=`vn`@`localhost`
|
||||
SQL SECURITY DEFINER
|
||||
VIEW `vn`.`newBornSales`
|
||||
AS SELECT `v`.`importe` AS `amount`,
|
||||
`v`.`Id_Cliente` AS `clientFk`,
|
||||
`c`.`salesPersonFk` AS `userFk`,
|
||||
`v`.`fecha` AS `dated`,
|
||||
AS SELECT
|
||||
`s`.`amount` AS `amount`,
|
||||
`s`.`clientFk` AS `clientFk`,
|
||||
`c`.`departmentFk` AS `departmentFk`,
|
||||
`s`.`dated` AS `dated`,
|
||||
`cn`.`firstShipped` AS `firstShipped`
|
||||
FROM (
|
||||
(
|
||||
(
|
||||
(
|
||||
`bs`.`clientNewBorn` `cn`
|
||||
JOIN `bs`.`ventas` `v` ON(
|
||||
`cn`.`firstShipped` + INTERVAL 1 year > `v`.`fecha`
|
||||
AND `v`.`Id_Cliente` = `cn`.`clientFk`
|
||||
)
|
||||
)
|
||||
JOIN `vn`.`client` `c` ON(`c`.`id` = `v`.`Id_Cliente`)
|
||||
)
|
||||
JOIN `account`.`user` `u` ON(`u`.`id` = `c`.`salesPersonFk`)
|
||||
)
|
||||
JOIN `account`.`role` `r` ON(`r`.`id` = `u`.`role`)
|
||||
)
|
||||
WHERE `r`.`name` = 'salesPerson'
|
||||
AND `u`.`name` NOT IN ('ismaelalcolea', 'ruben')
|
||||
FROM
|
||||
((`bs`.`clientNewBorn` `cn`
|
||||
JOIN `bs`.`sale` `s` ON
|
||||
(`cn`.`firstShipped` + interval 1 year > `s`.`dated`
|
||||
and `s`.`clientFk` = `cn`.`clientFk`))
|
||||
JOIN `vn`.`client` `c` ON
|
||||
(`c`.`id` = `s`.`clientFk`));
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
CREATE OR REPLACE DEFINER=`vn`@`localhost`
|
||||
SQL SECURITY DEFINER
|
||||
VIEW `vn`.`salesPersonSince`
|
||||
AS SELECT `b`.`workerFk` AS `workerFk`,
|
||||
min(`b`.`started`) AS `started`
|
||||
FROM (
|
||||
(
|
||||
`vn`.`business` `b`
|
||||
JOIN `vn`.`worker` `w` ON(`w`.`id` = `b`.`workerFk`)
|
||||
)
|
||||
LEFT JOIN `vn`.`professionalCategory` `pc` ON(
|
||||
`pc`.`id` = `b`.`workerBusinessProfessionalCategoryFk`
|
||||
)
|
||||
)
|
||||
WHERE `pc`.`description` = 'Aux ventas'
|
||||
GROUP BY `b`.`workerFk`
|
|
@ -0,0 +1,21 @@
|
|||
CREATE OR REPLACE DEFINER=`vn`@`localhost`
|
||||
SQL SECURITY DEFINER
|
||||
VIEW `ticketDepartment` AS
|
||||
SELECT
|
||||
`t`.`id` AS `ticketFk`,
|
||||
`c`.`departmentFk` AS `departmentFk`,
|
||||
`d`.`name` AS `departmentName`
|
||||
FROM
|
||||
(
|
||||
(
|
||||
`ticket` `t`
|
||||
LEFT JOIN `client` `c` ON
|
||||
(
|
||||
`c`.`id` = `t`.`clientFk`
|
||||
)
|
||||
)
|
||||
LEFT JOIN `department` `d` ON
|
||||
(
|
||||
`d`.`id` = `c`.`departmentFk`
|
||||
)
|
||||
);
|
|
@ -39,7 +39,7 @@ AS SELECT `c`.`id` AS `id_cliente`,
|
|||
`c`.`creditInsurance` AS `creditInsurance`,
|
||||
`c`.`isCreatedAsServed` AS `isCreatedAsServed`,
|
||||
`c`.`hasInvoiceSimplified` AS `hasInvoiceSimplified`,
|
||||
`c`.`salesPersonFk` AS `Id_Trabajador`,
|
||||
`c`.`departmentFk` AS `departmentFk`,
|
||||
`c`.`isVies` AS `vies`,
|
||||
`c`.`bankEntityFk` AS `bankEntityFk`,
|
||||
`c`.`typeFk` AS `typeFk`
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
ALTER TABLE vn.client
|
||||
ADD IF NOT EXISTS departmentFk INT(11) DEFAULT NULL NULL;
|
||||
|
||||
ALTER TABLE vn.client
|
||||
ADD IF NOT EXISTS lastDepartmentFk INT(11) DEFAULT NULL NULL;
|
||||
|
||||
ALTER TABLE vn.client
|
||||
ADD CONSTRAINT client_department_FK FOREIGN KEY IF NOT EXISTS (departmentFk)
|
||||
REFERENCES vn.department(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE vn.client
|
||||
ADD CONSTRAINT client_lastDepartment_FK FOREIGN KEY IF NOT EXISTS (lastDepartmentFk)
|
||||
REFERENCES vn.department(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
UPDATE vn.client c
|
||||
JOIN vn.worker w ON w.id = c.salesPersonFk
|
||||
JOIN vn.business b ON b.id = w.businessFk
|
||||
SET c.departmentFk = b.departmentFk;
|
||||
|
||||
DROP TABLE IF EXISTS vn.departmentMana;
|
||||
CREATE OR REPLACE TABLE `vn`.`departmentMana` (
|
||||
`departmentFk` int(10) NOT NULL,
|
||||
`size` int(11) NOT NULL DEFAULT 300,
|
||||
`amount` int(11) NOT NULL DEFAULT 0,
|
||||
`pricesModifierRate` double NOT NULL DEFAULT 0,
|
||||
`isPricesModifierActivated` tinyint(1) NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`departmentFk`),
|
||||
KEY `departmentMana_idx` (`departmentFk`),
|
||||
CONSTRAINT `departmentMana_Department_FK` FOREIGN KEY (`departmentFk`)
|
||||
REFERENCES `vn`.`department` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS bs.salesByClient;
|
||||
CREATE OR REPLACE TABLE `bs`.`salesByClient` (
|
||||
`dated` date NOT NULL DEFAULT '0000-00-00',
|
||||
`departmentFk` int(10) DEFAULT NULL,
|
||||
`clientFk` int(11) NOT NULL,
|
||||
`amount` decimal(10,3) NOT NULL DEFAULT 0.000,
|
||||
`equalizationTax` decimal(10,3) NOT NULL DEFAULT 0.000,
|
||||
`amountNewBorn` decimal(10,3) NOT NULL DEFAULT 0.000,
|
||||
PRIMARY KEY (`dated`,`clientFk`),
|
||||
KEY `salesByClient_clientFk` (`clientFk`),
|
||||
KEY `salesByClient_departmentFk` (`departmentFk`),
|
||||
KEY `salesByClient_dated` (`dated`,`clientFk`,`amount`),
|
||||
CONSTRAINT `salesByClient_clientFk_FK`
|
||||
FOREIGN KEY (`clientFk`) REFERENCES `vn`.`client` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `salesByClient_department_FK`
|
||||
FOREIGN KEY (`departmentFk`) REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Ventas diarias por cliente y departamento';
|
||||
|
||||
INSERT INTO bs.salesByClient(
|
||||
dated,
|
||||
departmentFk,
|
||||
clientFk,
|
||||
amount,
|
||||
equalizationTax,
|
||||
amountNewBorn)
|
||||
SELECT ss.dated, c.departmentFk, ss.clientFk, ss.amount, ss.equalizationTax, ss.amountNewBorn
|
||||
FROM bs.salesByclientSalesPerson ss
|
||||
JOIN vn.client c ON c.id = ss.clientFk;
|
||||
|
||||
DROP TABLE IF EXISTS `vn`.`departmentNoUnassign`;
|
||||
|
||||
CREATE OR REPLACE TABLE `vn`.`departmentNoUnassign` (
|
||||
`departmentFk` int(10) NOT NULL,
|
||||
PRIMARY KEY (`departmentFk`),
|
||||
CONSTRAINT `departmentNoUnassign_FK` FOREIGN KEY (`departmentFk`) REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci
|
||||
COMMENT='Lista de departamentos comerciales que no se desasignarán automáticamente sus clientes';
|
||||
|
||||
DROP TABLE IF EXISTS `bs`.`portfolio`;
|
||||
|
||||
CREATE OR REPLACE TABLE `bs`.`portfolio` (
|
||||
`departmentFk` int(10) NOT NULL,
|
||||
`yeared` int(4) NOT NULL,
|
||||
`monthed` int(2) NOT NULL,
|
||||
`amount` decimal(10,2) DEFAULT NULL,
|
||||
PRIMARY KEY (`departmentFk`,`yeared`,`monthed`),
|
||||
KEY `portfolio_departmentFk` (`departmentFk`),
|
||||
CONSTRAINT `portfolio_salesDepartment_department_FK`
|
||||
FOREIGN KEY (`departmentFk`) REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||
|
||||
|
||||
CREATE OR REPLACE TABLE `bs`.`salesDepartmentEvolution` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`dated` date NOT NULL DEFAULT '0000-00-00',
|
||||
`departmentFk` int(10) DEFAULT NULL,
|
||||
`amount` decimal(10,3) NOT NULL DEFAULT 0.000,
|
||||
`equalizationTax` decimal(10,3) NOT NULL DEFAULT 0.000,
|
||||
`amountNewBorn` decimal(10,3) NOT NULL DEFAULT 0.000,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `salesDepartmentEvolution_salesDepartment` (`departmentFk`),
|
||||
CONSTRAINT `salesDepartmentEvolution_salesDepartment_department_FK` FOREIGN KEY (`departmentFk`)
|
||||
REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||
|
||||
RENAME TABLE vn.salespersonConfig TO vn.manaConfig;
|
||||
|
||||
ALTER TABLE vn.company ADD IF NOT EXISTS phone varchar(15) DEFAULT NULL NULL;
|
||||
|
||||
|
||||
CREATE OR REPLACE TABLE `vn`.`departmentManaExcluded` (
|
||||
`departmentFk` int(10) NOT NULL,
|
||||
PRIMARY KEY (`departmentFk`),
|
||||
CONSTRAINT `departmentManaExcluded_FK` FOREIGN KEY (`departmentFk`)
|
||||
REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci
|
||||
COMMENT='Departamentos de venta que tienen que estar excluidos del cálculo del maná';
|
||||
|
||||
|
||||
RENAME TABLE vn.workerManaExcluded TO vn.workerManaExcluded__;
|
||||
ALTER TABLE vn.workerManaExcluded__
|
||||
COMMENT='Usuarios que tienen que estar excluidos del cálculo del maná
|
||||
@deprecated 2024-07-16';
|
||||
|
||||
UPDATE `salix`.`ACL` SET property = 'getDepartmentMana' WHERE property = 'getSalesPersonMana';
|
|
@ -0,0 +1,6 @@
|
|||
UPDATE `vn`.`client` c
|
||||
LEFT JOIN `vn`.workerDepartment wd ON
|
||||
c.salesPersonFk = wd.workerFk
|
||||
LEFT JOIN account.`user` u ON u.id = c.salesPersonFk
|
||||
LEFT JOIN `vn`.department d ON d.id = wd.departmentFk
|
||||
SET c.departmentFk = d.id
|
|
@ -0,0 +1,12 @@
|
|||
RENAME TABLE vn.sharingCart TO vn.sharingCart__;
|
||||
ALTER TABLE vn.sharingCart__
|
||||
COMMENT='deprecated 2025-02-18';
|
||||
|
||||
RENAME TABLE vn.sharingCartDaily TO vn.sharingCartDaily__;
|
||||
ALTER TABLE vn.sharingCartDaily__
|
||||
COMMENT='deprecated 2025-02-18';
|
||||
|
||||
RENAME TABLE vn.sharingClient TO vn.sharingClient__;
|
||||
ALTER TABLE vn.sharingClient__
|
||||
COMMENT='deprecated 2025-02-18';
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
DELETE FROM vn.workerMana
|
||||
WHERE workerFk IN (
|
||||
SELECT workerFk
|
||||
FROM vn.workerManaExcluded
|
||||
);
|
|
@ -313,7 +313,7 @@ export default {
|
|||
clientDefaulter: {
|
||||
anyClient: 'vn-client-defaulter tbody > tr',
|
||||
firstClientName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(2) > span',
|
||||
firstSalesPersonName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(4) > span',
|
||||
departmentName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(4)',
|
||||
firstObservation: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(9) > vn-textarea[ng-model="defaulter.observation"]',
|
||||
allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check',
|
||||
addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]',
|
||||
|
|
|
@ -17,13 +17,6 @@ describe('Ticket Edit sale path', () => {
|
|||
await browser.close();
|
||||
});
|
||||
|
||||
it(`should click on the first sale claim icon to navigate over there`, async() => {
|
||||
await page.waitToClick(selectors.ticketSales.firstSaleClaimIcon);
|
||||
await page.waitForNavigation();
|
||||
await page.goBack();
|
||||
await page.goBack();
|
||||
});
|
||||
|
||||
it('should navigate to the tickets index', async() => {
|
||||
await page.waitToClick(selectors.globalItems.applicationsMenuButton);
|
||||
await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
|
||||
|
|
|
@ -199,7 +199,7 @@
|
|||
"This ticket is already invoiced": "This ticket is already invoiced",
|
||||
"Negative basis of tickets: 23": "Negative basis of tickets: 23",
|
||||
"Booking completed": "Booking complete",
|
||||
"The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the sales person {{salesPersonId}} is in preparation",
|
||||
"The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the department {{departmentId}} is in preparation",
|
||||
"You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets",
|
||||
"Bank entity must be specified": "Bank entity must be specified",
|
||||
"Try again": "Try again",
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"That payment method requires a BIC": "El método de pago seleccionado requiere un BIC",
|
||||
"State cannot be blank": "El estado no puede estar en blanco",
|
||||
"Worker cannot be blank": "El trabajador no puede estar en blanco",
|
||||
"Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado",
|
||||
"Cannot change the payment method if no department": "No se puede cambiar la forma de pago si no hay departamento asignado",
|
||||
"can't be blank": "El campo no puede estar vacío",
|
||||
"Observation type must be unique": "El tipo de observación no puede repetirse",
|
||||
"The credit must be an integer greater than or equal to zero": "The credit must be an integer greater than or equal to zero",
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"That payment method requires a BIC": "Este método de pagamento requer um BIC",
|
||||
"State cannot be blank": "O estado não pode ficar em branco",
|
||||
"Worker cannot be blank": "O trabalhador não pode ficar em branco",
|
||||
"Cannot change the payment method if no salesperson": "Não é possível alterar o método de pagamento se não houver vendedor",
|
||||
"Cannot change the payment method if no department": "Impossible de changer le mode de paiement s'il n'y a pas de service commercial",
|
||||
"can't be blank": "Não pode ficar em branco",
|
||||
"Observation type must be unique": "O tipo de observação deve ser único",
|
||||
"The credit must be an integer greater than or equal to zero": "O crédito deve ser um inteiro maior ou igual a zero",
|
||||
|
@ -326,7 +326,7 @@
|
|||
"Fill all the fields": "Remplissez tous les champs",
|
||||
"The response is not a PDF": "La réponse n'est pas un PDF",
|
||||
"Booking completed": "Réservation terminée",
|
||||
"The ticket is in preparation": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) du commercial {{salesPersonId}} est en préparation",
|
||||
"The ticket is in preparation": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) du département {{departmentId}} est en préparation",
|
||||
"The notification subscription of this worker cant be modified": "L'abonnement à la notification de ce travailleur ne peut pas être modifié",
|
||||
"User disabled": "Utilisateur désactivé",
|
||||
"The amount cannot be less than the minimum": "La quantité ne peut pas être inférieure à la quantité minimale",
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"That payment method requires a BIC": "Esse método de pagamento requer um BIC",
|
||||
"State cannot be blank": "O estado não pode estar em branco",
|
||||
"Worker cannot be blank": "O trabalhador não pode estar em branco",
|
||||
"Cannot change the payment method if no salesperson": "Não é possível alterar o método de pagamento se não houver vendedor",
|
||||
"Cannot change the payment method if no department": "Não é possível alterar o método de pagamento se não houver departamento de vendas",
|
||||
"can't be blank": "não pode estar em branco",
|
||||
"Observation type must be unique": "O tipo de observação deve ser único",
|
||||
"The credit must be an integer greater than or equal to zero": "O crédito deve ser um número inteiro maior ou igual a zero",
|
||||
|
@ -326,7 +326,7 @@
|
|||
"Fill all the fields": "Preencha todos os campos",
|
||||
"The response is not a PDF": "A resposta não é um PDF",
|
||||
"Booking completed": "Reserva concluída",
|
||||
"The ticket is in preparation": "O ticket está em preparação [{{ticketId}}]({{{ticketUrl}}}) comercial {{salesPersonId}}",
|
||||
"The ticket is in preparation": "O ticket está em preparação [{{ticketId}}]({{{ticketUrl}}}) do departamento {{departmentId}}",
|
||||
"The notification subscription of this worker cant be modified": "A inscrição de notificação deste trabalhador não pode ser modificada",
|
||||
"User disabled": "Usuário desativado",
|
||||
"The amount cannot be less than the minimum": "O valor não pode ser menor que o mínimo",
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
|
||||
describe('claimstate isEditable()', () => {
|
||||
const salesPersonId = 18;
|
||||
const claimManagerId = 72;
|
||||
it('should return false if the given state does not exist', async() => {
|
||||
const tx = await app.models.Claim.beginTransaction({});
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
const ctx = {req: {accessToken: {userId: claimManagerId}}};
|
||||
const result = await app.models.ClaimState.isEditable(ctx, 9999, options);
|
||||
|
||||
|
@ -26,7 +24,7 @@ describe('claimstate isEditable()', () => {
|
|||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
const salesPersonId = 18;
|
||||
const ctx = {req: {accessToken: {userId: salesPersonId}}};
|
||||
const result = await app.models.ClaimState.isEditable(ctx, 3, options);
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@ module.exports = Self => {
|
|||
Self.claimPickupEmail = async ctx => {
|
||||
const models = Self.app.models;
|
||||
const $t = ctx.req.__; // $translate
|
||||
const url = await Self.app.models.Url.getUrl();
|
||||
|
||||
const args = Object.assign({}, ctx.args);
|
||||
const params = {
|
||||
|
@ -61,20 +60,27 @@ module.exports = Self => {
|
|||
include: {
|
||||
relation: 'client',
|
||||
scope: {
|
||||
fields: ['name', 'salesPersonFk']
|
||||
fields: ['name', 'departmentFk'],
|
||||
include: {
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'chatName']
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const department = claim.client().department();
|
||||
if (department) {
|
||||
const url = await Self.app.models.Url.getUrl();
|
||||
const message = $t('Claim pickup order sent', {
|
||||
claimId: args.id,
|
||||
clientName: claim.client().name,
|
||||
claimUrl: `${url}claim/${args.id}/summary`,
|
||||
});
|
||||
const salesPersonId = claim.client().salesPersonFk;
|
||||
if (salesPersonId)
|
||||
await models.Chat.sendCheckingPresence(ctx, salesPersonId, message);
|
||||
|
||||
await models.Chat.send(ctx, `#${department.chatName}`, message);
|
||||
}
|
||||
const email = new Email('claim-pickup-order', params);
|
||||
|
||||
return email.send();
|
||||
|
|
|
@ -47,10 +47,11 @@ module.exports = Self => {
|
|||
include: {
|
||||
relation: 'client',
|
||||
scope: {
|
||||
fields: ['id', 'departmentFk'],
|
||||
include: {
|
||||
relation: 'salesPersonUser',
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'name']
|
||||
fields: ['id', 'chatName']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,8 +92,8 @@ module.exports = Self => {
|
|||
|
||||
await Promise.all(promises);
|
||||
|
||||
const salesPerson = ticket.client().salesPersonUser();
|
||||
if (salesPerson) {
|
||||
const department = ticket.client().department();
|
||||
if (department) {
|
||||
const url = await Self.app.models.Url.getUrl();
|
||||
|
||||
const message = $t('Created claim', {
|
||||
|
@ -102,7 +103,7 @@ module.exports = Self => {
|
|||
claimUrl: `${url}claim/${newClaim.id}/summary`,
|
||||
changes: changesMade
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
|
||||
await models.Chat.send(ctx, `#${department.chatName}`, message);
|
||||
}
|
||||
|
||||
if (tx) await tx.commit();
|
||||
|
|
|
@ -51,9 +51,9 @@ module.exports = Self => {
|
|||
http: {source: 'query'}
|
||||
},
|
||||
{
|
||||
arg: 'salesPersonFk',
|
||||
arg: 'departmentFk',
|
||||
type: 'number',
|
||||
description: 'The salesPerson id',
|
||||
description: 'The department id',
|
||||
http: {source: 'query'}
|
||||
},
|
||||
{
|
||||
|
@ -158,8 +158,8 @@ module.exports = Self => {
|
|||
return {'cl.id': {inq: claimIdsByItemFk}};
|
||||
case 'claimResponsibleFk':
|
||||
return {'cl.id': {inq: claimIdsByClaimResponsibleFk}};
|
||||
case 'salesPersonFk':
|
||||
return {'c.salesPersonFk': value};
|
||||
case 'departmentFk':
|
||||
return {'c.departmentFk': value};
|
||||
case 'attenderFk':
|
||||
return {'cl.workerFk': value};
|
||||
case 'created':
|
||||
|
|
|
@ -53,9 +53,9 @@ module.exports = Self => {
|
|||
{
|
||||
relation: 'client',
|
||||
scope: {
|
||||
fields: ['salesPersonFk', 'name'],
|
||||
fields: ['departmentFk', 'name'],
|
||||
include: {
|
||||
relation: 'salesPersonUser',
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'name']
|
||||
}
|
||||
|
|
|
@ -41,21 +41,21 @@ module.exports = Self => {
|
|||
relation: 'claimDestination',
|
||||
fields: ['addressFk']
|
||||
},
|
||||
where: {claimFk: claimFk}
|
||||
where: {claimFk}
|
||||
}, myOptions);
|
||||
|
||||
for (let claimEnd of claimEnds) {
|
||||
const destination = claimEnd.claimDestination();
|
||||
const sale = await getSale(claimEnd.saleFk, myOptions);
|
||||
const addressId = destination && destination.addressFk;
|
||||
const addressId = destination?.addressFk;
|
||||
|
||||
let address;
|
||||
if (addressId)
|
||||
address = await models.Address.findById(addressId, null, myOptions);
|
||||
|
||||
const salesPerson = sale.ticket().client().salesPersonUser();
|
||||
if (salesPerson) {
|
||||
const nickname = address && address.nickname || destination.description;
|
||||
const department = sale.ticket().client().department();
|
||||
if (department) {
|
||||
const nickname = address?.nickname || destination.description;
|
||||
const url = await Self.app.models.Url.getUrl();
|
||||
const message = $t('Sent units from ticket', {
|
||||
quantity: sale.quantity,
|
||||
|
@ -66,7 +66,7 @@ module.exports = Self => {
|
|||
ticketUrl: `${url}ticket/${sale.ticketFk}/sale`,
|
||||
itemUrl: `${url}item/${sale.itemFk}/summary`
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
|
||||
await models.Chat.send(ctx, `#${department.chatName}`, message);
|
||||
}
|
||||
|
||||
if (!address) continue;
|
||||
|
@ -120,10 +120,11 @@ module.exports = Self => {
|
|||
include: {
|
||||
relation: 'client',
|
||||
scope: {
|
||||
fields: ['departmentFk'],
|
||||
include: {
|
||||
relation: 'salesPersonUser',
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'name']
|
||||
fields: ['id', 'chatName']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ describe('claim regularizeClaim()', () => {
|
|||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
||||
|
||||
|
@ -55,8 +55,8 @@ describe('claim regularizeClaim()', () => {
|
|||
expect(trashTicket.addressFk).toEqual(trashAddress);
|
||||
expect(claimBefore.claimStateFk).toEqual(pendentState);
|
||||
expect(claimAfter.claimStateFk).toEqual(resolvedState);
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Trash');
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '#es_vip_equipo', 'Trash');
|
||||
expect(chatModel.send).toHaveBeenCalledTimes(4);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -71,17 +71,17 @@ describe('claim regularizeClaim()', () => {
|
|||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
||||
|
||||
for (claimEnd of claimEnds)
|
||||
for (let claimEnd of claimEnds)
|
||||
await claimEnd.updateAttributes({claimDestinationFk: okDestination}, options);
|
||||
|
||||
await models.Claim.regularizeClaim(ctx, claimId, options);
|
||||
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Bueno');
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '#es_vip_equipo', 'Bueno');
|
||||
expect(chatModel.send).toHaveBeenCalledTimes(4);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -90,23 +90,23 @@ describe('claim regularizeClaim()', () => {
|
|||
}
|
||||
});
|
||||
|
||||
it('should send a chat message to the salesPerson when claim isPickUp is enabled', async() => {
|
||||
it('should send a chat message to the department when claim isPickUp is enabled', async() => {
|
||||
const tx = await models.Claim.beginTransaction({});
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
||||
|
||||
for (claimEnd of claimEnds)
|
||||
for (let claimEnd of claimEnds)
|
||||
await claimEnd.updateAttributes({claimDestinationFk: okDestination}, options);
|
||||
|
||||
await models.Claim.regularizeClaim(ctx, claimId, options);
|
||||
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Bueno');
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '#es_vip_equipo', 'Bueno');
|
||||
expect(chatModel.send).toHaveBeenCalledTimes(4);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -31,11 +31,11 @@ describe('Update Claim', () => {
|
|||
const newClaim = await app.models.Claim.create(originalData, options);
|
||||
|
||||
const forbiddenState = 3;
|
||||
const salesPersonId = 18;
|
||||
const userId = 18;
|
||||
const ctx = {
|
||||
req: {
|
||||
accessToken: {
|
||||
userId: salesPersonId
|
||||
userId
|
||||
}
|
||||
},
|
||||
args: {
|
||||
|
@ -63,7 +63,7 @@ describe('Update Claim', () => {
|
|||
const newClaim = await app.models.Claim.create(originalData, options);
|
||||
|
||||
const chatModel = app.models.Chat;
|
||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
const pendingState = claimStatesMap.pending;
|
||||
const ctx = {
|
||||
|
@ -83,7 +83,7 @@ describe('Update Claim', () => {
|
|||
let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options);
|
||||
|
||||
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalled();
|
||||
expect(chatModel.send).toHaveBeenCalled();
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -101,7 +101,7 @@ describe('Update Claim', () => {
|
|||
const newClaim = await app.models.Claim.create(originalData, options);
|
||||
|
||||
const chatModel = app.models.Chat;
|
||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
const canceledState = claimStatesMap.canceled;
|
||||
const ctx = {
|
||||
|
@ -121,7 +121,7 @@ describe('Update Claim', () => {
|
|||
let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options);
|
||||
|
||||
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(2);
|
||||
expect(chatModel.send).toHaveBeenCalledTimes(2);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -139,7 +139,7 @@ describe('Update Claim', () => {
|
|||
const newClaim = await app.models.Claim.create(originalData, options);
|
||||
|
||||
const chatModel = app.models.Chat;
|
||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
const claimManagerId = 72;
|
||||
const ctx = {
|
||||
|
@ -162,7 +162,7 @@ describe('Update Claim', () => {
|
|||
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
||||
expect(updatedClaim.claimStateFk).toEqual(ctx.args.claimStateFk);
|
||||
expect(updatedClaim.workerFk).toEqual(ctx.args.workerFk);
|
||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalled();
|
||||
expect(chatModel.send).toHaveBeenCalled();
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -63,13 +63,19 @@ module.exports = Self => {
|
|||
include: {
|
||||
relation: 'client',
|
||||
scope: {
|
||||
fields: ['departmentFk'],
|
||||
include: {
|
||||
relation: 'salesPersonUser'
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'chatName']
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, myOptions);
|
||||
|
||||
const department = claim.client().department();
|
||||
|
||||
const changedPickup = args.pickup && args.pickup != claim.pickup;
|
||||
|
||||
if (args.claimStateFk) {
|
||||
|
@ -84,13 +90,17 @@ module.exports = Self => {
|
|||
delete args.ctx;
|
||||
const updatedClaim = await claim.updateAttributes(args, myOptions);
|
||||
|
||||
const salesPerson = claim.client().salesPersonUser();
|
||||
if (salesPerson && args.claimStateFk) {
|
||||
if (department) {
|
||||
if (changedPickup && updatedClaim.pickup)
|
||||
await notifyPickUp(ctx, department, claim);
|
||||
|
||||
if (args.claimStateFk) {
|
||||
const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
|
||||
await notifyStateChange(ctx, salesPerson.id, claim, newState.description);
|
||||
await notifyStateChange(ctx, department, claim, newState.description);
|
||||
if (newState.code == 'canceled')
|
||||
await notifyStateChange(ctx, claim.workerFk, claim, newState.description);
|
||||
}
|
||||
}
|
||||
|
||||
if (tx) await tx.commit();
|
||||
|
||||
|
@ -101,7 +111,7 @@ module.exports = Self => {
|
|||
}
|
||||
};
|
||||
|
||||
async function notifyStateChange(ctx, workerId, claim, newState) {
|
||||
async function notifyStateChange(ctx, department, claim, newState) {
|
||||
const models = Self.app.models;
|
||||
const url = await models.Url.getUrl();
|
||||
const $t = ctx.req.__;
|
||||
|
@ -112,6 +122,20 @@ module.exports = Self => {
|
|||
claimUrl: `${url}claim/${claim.id}/summary`,
|
||||
newState
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(ctx, workerId, message);
|
||||
await models.Chat.send(ctx, `#${department.chatName}`, message);
|
||||
}
|
||||
|
||||
async function notifyPickUp(ctx, department, claim) {
|
||||
const models = Self.app.models;
|
||||
const url = await models.Url.getUrl();
|
||||
const $t = ctx.req.__; // $translate
|
||||
|
||||
const message = $t('Claim will be picked', {
|
||||
claimId: claim.id,
|
||||
clientName: claim.client().name,
|
||||
claimUrl: `${url}claim/${claim.id}/summary`,
|
||||
claimPickup: $t(claim.pickup)
|
||||
});
|
||||
await models.Chat.send(ctx, `#${department.chatName}`, message);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -37,9 +37,9 @@
|
|||
<vn-label-value
|
||||
label="Salesperson">
|
||||
<span
|
||||
ng-click="workerDescriptor.show($event, $ctrl.claim.client.salesPersonFk)"
|
||||
ng-click="workerDescriptor.show($event, $ctrl.claim.client.departmentFk)"
|
||||
class="link">
|
||||
{{$ctrl.claim.client.salesPersonUser.name}}
|
||||
{{$ctrl.claim.client.department.name}}
|
||||
</span>
|
||||
</vn-label-value>
|
||||
<vn-label-value
|
||||
|
|
|
@ -35,7 +35,7 @@ columns:
|
|||
sageTaxTypeFk: sage tax type
|
||||
sageTransactionTypeFk: sage transaction type
|
||||
businessTypeFk: business type
|
||||
salesPersonFk: sales person
|
||||
departmentFk: sales department
|
||||
hasElectronicInvoice: electronic invoice
|
||||
payMethodFk: pay method
|
||||
provinceFk: province
|
||||
|
@ -50,6 +50,6 @@ columns:
|
|||
isCreatedAsServed: created as served
|
||||
hasInvoiceSimplified: simplified invoice
|
||||
typeFk: type
|
||||
lastSalesPersonFk: last salesperson
|
||||
lastdepartmentFk: last sales department
|
||||
rating: rating
|
||||
recommendedCredit: recommended credit
|
||||
|
|
|
@ -35,7 +35,7 @@ columns:
|
|||
sageTaxTypeFk: tipo impuesto sage
|
||||
sageTransactionTypeFk: tipo transacción Sage
|
||||
businessTypeFk: tipo negocio
|
||||
salesPersonFk: comercial
|
||||
departmentFk: departamento comercial
|
||||
hasElectronicInvoice: factura electrónica
|
||||
payMethodFk: método pago
|
||||
provinceFk: provincia
|
||||
|
@ -50,6 +50,6 @@ columns:
|
|||
isCreatedAsServed: creado como servido
|
||||
hasInvoiceSimplified: factura simple
|
||||
typeFk: tipo
|
||||
lastSalesPersonFk: último comercial
|
||||
lastdepartmentFk: último departmaneto comercial
|
||||
rating: clasificación
|
||||
recommendedCredit: crédito recomendado
|
||||
|
|
|
@ -29,17 +29,17 @@ module.exports = Self => {
|
|||
|
||||
const clients = await Self.rawSql(`
|
||||
SELECT
|
||||
c.id AS clientFk,
|
||||
c.email AS clientEmail,
|
||||
eu.email salesPersonEmail
|
||||
c.id clientFk,
|
||||
c.email clientEmail,
|
||||
d.notificationEmail departmentEmail
|
||||
FROM client c
|
||||
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
||||
JOIN department d ON d.id = c.departmentFk
|
||||
JOIN ticket t ON t.clientFk = c.id
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
JOIN item i ON i.id = s.itemFk
|
||||
JOIN itemType it ON it.id = i.typeFk
|
||||
WHERE c.id IN(?)
|
||||
AND it.isPackaging = FALSE
|
||||
AND NOT it.isPackaging
|
||||
AND DATE(t.shipped) BETWEEN ? AND ?
|
||||
GROUP BY c.id`, [params.clients, params.from, params.to]);
|
||||
|
||||
|
@ -48,7 +48,7 @@ module.exports = Self => {
|
|||
const args = {
|
||||
id: client.clientFk,
|
||||
recipient: client.clientEmail,
|
||||
replyTo: client.salesPersonEmail,
|
||||
replyTo: client.departmentEmail,
|
||||
from: params.from,
|
||||
to: params.to
|
||||
};
|
||||
|
|
|
@ -68,7 +68,7 @@ module.exports = function(Self) {
|
|||
fi: data.fi,
|
||||
socialName: data.socialName,
|
||||
email: data.email,
|
||||
salesPersonFk: data.salesPersonFk,
|
||||
departmentFk: data.departmentFk,
|
||||
postcode: data.postcode,
|
||||
street: data.street,
|
||||
city: data.city,
|
||||
|
|
|
@ -23,7 +23,7 @@ module.exports = Self => {
|
|||
description: 'The client name',
|
||||
},
|
||||
{
|
||||
arg: 'salesPersonFk',
|
||||
arg: 'departmentFk',
|
||||
type: 'number',
|
||||
},
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ module.exports = Self => {
|
|||
case 'sageTransactionTypeFk':
|
||||
return {'stt.CodigoTransaccion': value};
|
||||
case 'name':
|
||||
case 'salesPersonFk':
|
||||
case 'departmentFk':
|
||||
case 'fi':
|
||||
case 'socialName':
|
||||
case 'city':
|
||||
|
@ -138,8 +138,8 @@ module.exports = Self => {
|
|||
ct.name country,
|
||||
p.id AS provinceFk,
|
||||
p.name AS province,
|
||||
u.id AS salesPersonFk,
|
||||
u.name AS salesPerson,
|
||||
d.id departmentFk,
|
||||
d.name salesDeparment,
|
||||
bt.code AS businessTypeFk,
|
||||
bt.description AS businessType,
|
||||
pm.id AS payMethodFk,
|
||||
|
@ -149,7 +149,7 @@ module.exports = Self => {
|
|||
stt.CodigoTransaccion AS sageTransactionTypeFk,
|
||||
stt.Transaccion AS sageTransactionType
|
||||
FROM client c
|
||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||
LEFT JOIN department d ON d.id = c.departmentFk
|
||||
LEFT JOIN country ct ON ct.id = c.countryFk
|
||||
LEFT JOIN province p ON p.id = c.provinceFk
|
||||
LEFT JOIN businessType bt ON bt.code = c.businessTypeFk
|
||||
|
|
|
@ -22,7 +22,7 @@ module.exports = Self => {
|
|||
description: 'The client name',
|
||||
},
|
||||
{
|
||||
arg: 'salesPersonFk',
|
||||
arg: 'salesDeparmentFk',
|
||||
type: 'number',
|
||||
},
|
||||
{
|
||||
|
@ -126,7 +126,7 @@ module.exports = Self => {
|
|||
{'a.provinceFk': value}
|
||||
]};
|
||||
case 'name':
|
||||
case 'salesPersonFk':
|
||||
case 'departmentFk':
|
||||
case 'fi':
|
||||
case 'socialName':
|
||||
case 'email':
|
||||
|
@ -146,7 +146,6 @@ module.exports = Self => {
|
|||
c.socialName,
|
||||
c.phone,
|
||||
a.phone,
|
||||
c.mobile,
|
||||
c.city,
|
||||
a.city,
|
||||
c.postcode,
|
||||
|
@ -154,14 +153,14 @@ module.exports = Self => {
|
|||
c.email,
|
||||
c.isActive,
|
||||
c.isFreezed,
|
||||
p.id AS provinceClientFk,
|
||||
a.provinceFk AS provinceAddressFk,
|
||||
p.name AS province,
|
||||
u.id AS salesPersonFk,
|
||||
u.name AS salesPerson,
|
||||
p.id provinceClientFk,
|
||||
a.provinceFk provinceAddressFk,
|
||||
p.name province,
|
||||
d.id departmentFk,
|
||||
d.name departmentName,
|
||||
co.name AS country
|
||||
FROM client c
|
||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||
LEFT JOIN department d ON d.id = c.departmentFk
|
||||
LEFT JOIN province p ON p.id = c.provinceFk
|
||||
LEFT JOIN country co ON co.id = c.countryFk
|
||||
JOIN address a ON a.clientFk = c.id
|
||||
|
|
|
@ -42,7 +42,7 @@ module.exports = function(Self) {
|
|||
}
|
||||
},
|
||||
{
|
||||
relation: 'salesPersonUser',
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'name']
|
||||
}
|
||||
|
|
|
@ -36,7 +36,8 @@ describe('Client Create', () => {
|
|||
street: 'WALL STREET',
|
||||
city: 'New York',
|
||||
businessTypeFk: 'florist',
|
||||
provinceFk: 1
|
||||
provinceFk: 1,
|
||||
departmentFk: 155
|
||||
};
|
||||
|
||||
try {
|
||||
|
|
|
@ -86,14 +86,14 @@ describe('client extendedListFilter()', () => {
|
|||
}
|
||||
});
|
||||
|
||||
it('should return the clients matching the "salesPersonFk" argument', async() => {
|
||||
it('should return the clients matching the "salesDepartmementFk" argument', async() => {
|
||||
const tx = await models.Client.beginTransaction({});
|
||||
const salesPersonId = 18;
|
||||
const salesDepartmementId = 155;
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
const ctx = {req: {accessToken: {userId: 1}}, args: {salesPersonFk: salesPersonId}};
|
||||
const ctx = {req: {accessToken: {userId: 1}}, args: {departmentFk: salesDepartmementId}};
|
||||
const filter = {};
|
||||
const result = await models.Client.extendedListFilter(ctx, filter, options);
|
||||
|
||||
|
@ -101,7 +101,7 @@ describe('client extendedListFilter()', () => {
|
|||
const randomResultClient = result[randomIndex];
|
||||
|
||||
expect(result.length).toBeGreaterThanOrEqual(5);
|
||||
expect(randomResultClient.salesPersonFk).toEqual(salesPersonId);
|
||||
expect(randomResultClient.departmentFk).toEqual(salesDepartmementId);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -86,14 +86,14 @@ describe('client filter()', () => {
|
|||
}
|
||||
});
|
||||
|
||||
it('should return the clients matching the "salesPersonFk" argument', async() => {
|
||||
it('should return the clients matching the "departmentFk" argument', async() => {
|
||||
const tx = await models.Client.beginTransaction({});
|
||||
const salesPersonId = 18;
|
||||
const departmentId = 155;
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
const ctx = {req: {accessToken: {userId: 1}}, args: {salesPersonFk: salesPersonId}};
|
||||
const ctx = {req: {accessToken: {userId: 1}}, args: {departmentFk: departmentId}};
|
||||
const filter = {};
|
||||
const result = await models.Client.filter(ctx, filter, options);
|
||||
|
||||
|
@ -101,7 +101,7 @@ describe('client filter()', () => {
|
|||
const randomResultClient = result[randomIndex];
|
||||
|
||||
expect(result.length).toBeGreaterThanOrEqual(5);
|
||||
expect(randomResultClient.salesPersonFk).toEqual(salesPersonId);
|
||||
expect(randomResultClient.departmentFk).toEqual(departmentId);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -46,7 +46,7 @@ module.exports = Self => {
|
|||
}
|
||||
},
|
||||
{
|
||||
relation: 'salesPersonUser',
|
||||
relation: 'department',
|
||||
scope: {
|
||||
fields: ['id', 'name']
|
||||
}
|
||||
|
|
|
@ -38,8 +38,7 @@ module.exports = Self => {
|
|||
Object.assign(myOptions, options);
|
||||
|
||||
const where = buildFilter(ctx.args, (param, value) => {
|
||||
switch (param) {
|
||||
case 'search':
|
||||
if (param === 'search') {
|
||||
return {or: [
|
||||
{'c.id': value},
|
||||
{'c.name': {like: `%${value}%`}}
|
||||
|
@ -57,16 +56,17 @@ module.exports = Self => {
|
|||
|
||||
let stmt = new ParameterizedSQL(
|
||||
`CREATE OR REPLACE TEMPORARY TABLE tmp.defaulters
|
||||
WITH clientObservations AS
|
||||
WITH wClientObservations AS
|
||||
(SELECT clientFk,text, created, workerFk
|
||||
FROM vn.clientObservation
|
||||
GROUP BY clientFk
|
||||
ORDER BY created DESC
|
||||
)SELECT c.id clientFk,
|
||||
c.name clientName,
|
||||
c.salesPersonFk,
|
||||
c.businessTypeFk = 'worker' isWorker,
|
||||
u.name salesPersonName,
|
||||
c.departmentFk,
|
||||
c.businessTypeFk,
|
||||
de.name departmentName,
|
||||
d.amount,
|
||||
co.created,
|
||||
co.text observation,
|
||||
|
@ -78,15 +78,13 @@ module.exports = Self => {
|
|||
c.countryFk,
|
||||
pm.name payMethod,
|
||||
r.finished IS NULL hasRecovery,
|
||||
dp.id departmentFk,
|
||||
dp.name departmentName,
|
||||
dp.notificationEmail departmentEmail
|
||||
de.notificationEmail departmentEmail
|
||||
FROM defaulter d
|
||||
JOIN client c ON c.id = d.clientFk
|
||||
JOIN country cn ON cn.id = c.countryFk
|
||||
JOIN payMethod pm ON pm.id = c.payMethodFk
|
||||
LEFT JOIN clientObservations co ON co.clientFk = c.id
|
||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||
LEFT JOIN wClientObservations co ON co.clientFk = c.id
|
||||
LEFT JOIN department de ON de.id = c.departmentFk
|
||||
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
||||
LEFT JOIN (
|
||||
SELECT r1.started, r1.clientFk, r1.finished
|
||||
|
@ -99,9 +97,7 @@ module.exports = Self => {
|
|||
AND r1.started = r2.maxStarted
|
||||
WHERE r1.finished
|
||||
GROUP BY r1.clientFk
|
||||
) r ON r.clientFk = c.id
|
||||
LEFT JOIN workerDepartment wd ON wd.workerFk = u.id
|
||||
LEFT JOIN department dp ON dp.id = wd.departmentFk`);
|
||||
) r ON r.clientFk = c.id`);
|
||||
|
||||
stmt.merge(conn.makeWhere(filter.where));
|
||||
stmts.push(stmt);
|
||||
|
|
|
@ -126,12 +126,12 @@ module.exports = Self => {
|
|||
done();
|
||||
}
|
||||
|
||||
Self.validate('payMethod', hasSalesMan, {
|
||||
message: 'Cannot change the payment method if no salesperson'
|
||||
Self.validate('payMethod', hasDepartment, {
|
||||
message: 'Cannot change the payment method if no department'
|
||||
});
|
||||
|
||||
function hasSalesMan(err) {
|
||||
if (this.payMethod && !this.salesPersonUser)
|
||||
function hasDepartment(err) {
|
||||
if (this.payMethod && !this.department)
|
||||
err();
|
||||
}
|
||||
|
||||
|
@ -283,9 +283,8 @@ module.exports = Self => {
|
|||
const finalState = getFinalState(ctx);
|
||||
const payMethodWithIban = 4;
|
||||
|
||||
// Validate socialName format
|
||||
const hasChanges = orgData && changes;
|
||||
const socialName = changes && changes.socialName || orgData && orgData.socialName;
|
||||
const socialName = changes?.socialName || orgData?.socialName;
|
||||
const isTaxDataChecked = hasChanges && (changes.isTaxDataChecked || orgData.isTaxDataChecked);
|
||||
|
||||
const socialNameChanged = hasChanges
|
||||
|
@ -296,7 +295,7 @@ module.exports = Self => {
|
|||
if ((socialNameChanged || isTaxDataCheckedChanged) && !isAlpha(socialName))
|
||||
throw new UserError(`The social name has an invalid format`);
|
||||
|
||||
if (changes.salesPerson === null) {
|
||||
if (changes.department === null) {
|
||||
changes.credit = 0;
|
||||
changes.discount = 0;
|
||||
changes.payMethodFk = 5; // Credit card
|
||||
|
@ -358,18 +357,17 @@ module.exports = Self => {
|
|||
const $t = httpRequest.__;
|
||||
const url = await Self.app.models.Url.getUrl();
|
||||
|
||||
const salesPersonId = instance.salesPersonFk;
|
||||
const departmentId = instance.departmentFk;
|
||||
|
||||
if (salesPersonId) {
|
||||
// Send email to client
|
||||
if (departmentId) {
|
||||
const department = await models.Department.findById(departmentId);
|
||||
if (instance.email) {
|
||||
const {Email} = require('vn-print');
|
||||
const worker = await models.EmailUser.findById(salesPersonId);
|
||||
const params = {
|
||||
id: instance.id,
|
||||
recipientId: instance.id,
|
||||
recipient: instance.email,
|
||||
replyTo: worker.email
|
||||
replyTo: department.notificationEmail
|
||||
};
|
||||
const email = new Email('payment-update', params);
|
||||
await email.send();
|
||||
|
@ -381,19 +379,15 @@ module.exports = Self => {
|
|||
clientName: instance.name,
|
||||
url: fullUrl
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(httpCtx, salesPersonId, message);
|
||||
await models.Chat.send(httpCtx, `#${department.chatName}`, message);
|
||||
}
|
||||
}
|
||||
|
||||
const workerIdBefore = oldInstance.salesPersonFk;
|
||||
const workerIdAfter = newInstance.salesPersonFk;
|
||||
const assignmentChanged = workerIdBefore != workerIdAfter;
|
||||
if (assignmentChanged)
|
||||
await Self.notifyAssignment(instance, workerIdBefore, workerIdAfter);
|
||||
if (oldInstance.departmentFk != newInstance.departmentFk)
|
||||
await Self.notifyAssignment(instance, oldInstance.departmentFk, newInstance.departmentFk);
|
||||
});
|
||||
|
||||
// Send notification on client worker assignment
|
||||
Self.notifyAssignment = async function notifyAssignment(client, previousWorkerId, currentWorkerId) {
|
||||
Self.notifyAssignment = async function notifyAssignment(client, previousDepartmentId, currentDepartmentId) {
|
||||
const loopBackContext = LoopBackContext.getCurrentContext();
|
||||
const httpCtx = {req: loopBackContext.active};
|
||||
const httpRequest = httpCtx.req.http.req;
|
||||
|
@ -401,38 +395,38 @@ module.exports = Self => {
|
|||
const url = await Self.app.models.Url.getUrl();
|
||||
const models = Self.app.models;
|
||||
|
||||
let previousWorker = {name: $t('None')};
|
||||
let currentWorker = {name: $t('None')};
|
||||
if (previousWorkerId) {
|
||||
const worker = await models.Worker.findById(previousWorkerId, {
|
||||
include: {relation: 'user'}
|
||||
});
|
||||
previousWorker.user = worker && worker.user().name;
|
||||
previousWorker.name = worker && worker.user().nickname;
|
||||
let previousDepartment = {name: $t('None'), chatName: $t('None')};
|
||||
let currentDepartment = {name: $t('None'), chatName: $t('None')};
|
||||
if (previousDepartmentId) {
|
||||
previousDepartment = await models.Department.findOne({
|
||||
field: ['name', 'chatName'],
|
||||
where: {
|
||||
id: previousDepartmentId
|
||||
}
|
||||
});
|
||||
}
|
||||
if (currentDepartmentId) {
|
||||
currentDepartment = await models.Department.findOne({
|
||||
field: ['name', 'chatName'],
|
||||
where: {
|
||||
id: currentDepartmentId
|
||||
}
|
||||
|
||||
if (currentWorkerId) {
|
||||
const worker = await models.Worker.findById(currentWorkerId, {
|
||||
include: {relation: 'user'}
|
||||
});
|
||||
currentWorker.user = worker && worker.user().name;
|
||||
currentWorker.name = worker && worker.user().nickname;
|
||||
}
|
||||
|
||||
const fullUrl = `${url}client/${client.id}/basic-data`;
|
||||
const message = $t('Client assignment has changed', {
|
||||
clientId: client.id,
|
||||
clientName: client.name,
|
||||
url: fullUrl,
|
||||
previousWorkerName: previousWorker.name,
|
||||
currentWorkerName: currentWorker.name
|
||||
previousDepartmentName: previousDepartment.name,
|
||||
currentDepartmentName: currentDepartment.name
|
||||
});
|
||||
|
||||
if (previousWorkerId)
|
||||
await models.Chat.send(httpCtx, `@${previousWorker.user}`, message);
|
||||
if (previousDepartmentId)
|
||||
await models.Chat.send(httpCtx, `#${previousDepartment.chatName}`, message);
|
||||
|
||||
if (currentWorkerId)
|
||||
await models.Chat.send(httpCtx, `@${currentWorker.user}`, message);
|
||||
if (currentDepartmentId)
|
||||
await models.Chat.send(httpCtx, `#${currentDepartment.chatName}`, message);
|
||||
};
|
||||
|
||||
// Credit change validations
|
||||
|
|
|
@ -133,7 +133,7 @@
|
|||
"columnName": "businessTypeFk"
|
||||
}
|
||||
},
|
||||
"salesPersonFk": {
|
||||
"departmentFk": {
|
||||
"type": "number"
|
||||
},
|
||||
"hasElectronicInvoice": {
|
||||
|
@ -166,10 +166,10 @@
|
|||
"model": "PayMethod",
|
||||
"foreignKey": "payMethodFk"
|
||||
},
|
||||
"salesPersonUser": {
|
||||
"department": {
|
||||
"type": "belongsTo",
|
||||
"model": "VnUser",
|
||||
"foreignKey": "salesPersonFk"
|
||||
"model": "Department",
|
||||
"foreignKey": "departmentFk"
|
||||
},
|
||||
"province": {
|
||||
"type": "belongsTo",
|
||||
|
|
|
@ -51,9 +51,9 @@ module.exports = function(Self) {
|
|||
const data = ctx.instance;
|
||||
const insurance = await Self.findById(data.id, null, options);
|
||||
const client = insurance.classification().customer();
|
||||
const salesPerson = client.salesPersonUser();
|
||||
const department = client.department();
|
||||
|
||||
if (!salesPerson) return;
|
||||
if (!department) return;
|
||||
|
||||
const httpRequest = httpCtx.req.http.req;
|
||||
const $t = httpRequest.__;
|
||||
|
@ -65,6 +65,6 @@ module.exports = function(Self) {
|
|||
credit: data.credit,
|
||||
url: fullPath
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(httpCtx, salesPerson.id, message);
|
||||
await models.Chat.send(httpCtx, `@${department.chatName}`, message);
|
||||
});
|
||||
};
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Aço no te que vore en la tasca no? Vuic dir, es un feature