WIP: 6802-Clientes-gestionados-por-equipos #2516
|
@ -64,11 +64,11 @@ module.exports = Self => {
|
||||||
let observations = ticket.observaciones.split(' ');
|
let observations = ticket.observaciones.split(' ');
|
||||||
|
|
||||||
for (let observation of observations) {
|
for (let observation of observations) {
|
||||||
const salesPerson = ticket.salesPersonFk;
|
const salesDepartment = ticket.salesDepartmentFk;
|
||||||
if (observation.startsWith('#') || observation.startsWith('@')) {
|
if (observation.startsWith('#') || observation.startsWith('@')) {
|
||||||
await models.Chat.send(ctx,
|
await models.Chat.send(ctx,
|
||||||
observation,
|
observation,
|
||||||
$t('ticketCommercial', {ticket: ticket.ticketFk, salesPerson})
|
$t('ticketCommercial', {ticket: ticket.ticketFk, salesDepartment})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,7 @@ module.exports = Self => {
|
||||||
$t('The ticket is in preparation', {
|
$t('The ticket is in preparation', {
|
||||||
ticketId: ticketId,
|
ticketId: ticketId,
|
||||||
ticketUrl: `${url}ticket/${ticketId}/summary`,
|
ticketUrl: `${url}ticket/${ticketId}/summary`,
|
||||||
salesPersonId: ticket.salesPersonFk
|
salesDepartmentId: ticket.salesDepartmentFk
|
||||||
})));
|
})));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1314,7 +1314,7 @@ INSERT INTO `ACL` VALUES (73,'Expedition','*','READ','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryAssistant');
|
INSERT INTO `ACL` VALUES (74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryAssistant');
|
||||||
INSERT INTO `ACL` VALUES (75,'Expedition','*','WRITE','ALLOW','ROLE','production');
|
INSERT INTO `ACL` VALUES (75,'Expedition','*','WRITE','ALLOW','ROLE','production');
|
||||||
INSERT INTO `ACL` VALUES (76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (77,'WorkerMana','*','READ','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (77,'DepartmentMana','*','READ','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (78,'TicketTracking','*','WRITE','ALLOW','ROLE','production');
|
INSERT INTO `ACL` VALUES (78,'TicketTracking','*','WRITE','ALLOW','ROLE','production');
|
||||||
INSERT INTO `ACL` VALUES (79,'Ticket','state','*','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (79,'Ticket','state','*','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (80,'Sale','deleteSales','*','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (80,'Sale','deleteSales','*','ALLOW','ROLE','employee');
|
||||||
|
@ -1768,7 +1768,7 @@ INSERT INTO `ACL` VALUES (595,'Ticket','isEditable','READ','ALLOW','ROLE','emplo
|
||||||
INSERT INTO `ACL` VALUES (596,'Ticket','setDeleted','WRITE','ALLOW','ROLE','salesPerson');
|
INSERT INTO `ACL` VALUES (596,'Ticket','setDeleted','WRITE','ALLOW','ROLE','salesPerson');
|
||||||
INSERT INTO `ACL` VALUES (597,'Ticket','restore','WRITE','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (597,'Ticket','restore','WRITE','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (598,'Ticket','getSales','READ','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (598,'Ticket','getSales','READ','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (599,'Ticket','getSalesPersonMana','READ','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (599,'Ticket','getSalesDepartmentMana','READ','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (600,'Ticket','filter','READ','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (600,'Ticket','filter','READ','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (601,'Ticket','makeInvoice','WRITE','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (601,'Ticket','makeInvoice','WRITE','ALLOW','ROLE','employee');
|
||||||
INSERT INTO `ACL` VALUES (602,'Ticket','updateEditableTicket','WRITE','ALLOW','ROLE','employee');
|
INSERT INTO `ACL` VALUES (602,'Ticket','updateEditableTicket','WRITE','ALLOW','ROLE','employee');
|
||||||
|
|
|
@ -1831,7 +1831,6 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','marketingBoss','clientTaxArea'
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','clientTaxArea','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','clientTaxArea','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','client_checkBalance','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','client_checkBalance','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','buyer','absoluteInventoryHistory','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','buyer','absoluteInventoryHistory','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','salesPerson','client_getSalesPersonByTicket','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
|
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','pbx','developer','clientFromPhone','FUNCTION','juan@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','pbx','developer','clientFromPhone','FUNCTION','juan@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','util','production','log_addWithUser','PROCEDURE','juan@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','util','production','log_addWithUser','PROCEDURE','juan@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','adminBoss','balanceNestTree_addChild','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','adminBoss','balanceNestTree_addChild','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
|
@ -1846,7 +1845,6 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','claimManager','item_comparativ
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','entryEditor','item_getVolume','FUNCTION','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','entryEditor','item_getVolume','FUNCTION','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','clientgetmana','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','clientgetmana','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','buy_scan','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','buy_scan','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','buyer','client_getSalesPersonByTicket','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
|
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','hr','client_create','PROCEDURE','guillermo@db-proxy2.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','hr','client_create','PROCEDURE','guillermo@db-proxy2.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','entryEditor','entry_isintrastat','FUNCTION','guillermo@db-proxy2.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','entryEditor','entry_isintrastat','FUNCTION','guillermo@db-proxy2.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','manager','collection_make','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','manager','collection_make','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
|
||||||
|
@ -2070,7 +2068,6 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','cmrpallet_add','P
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','item_getbalance','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','item_getbalance','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','expedition_checkroute','FUNCTION','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','expedition_checkroute','FUNCTION','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','addnotefromdelivery','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','addnotefromdelivery','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','client_getSalesPerson','FUNCTION','guillermo@db-proxy2.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','buy_updatepacking','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','buy_updatepacking','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','buy_updategrouping','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','buy_updategrouping','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','buffer_settypebyname','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','buffer_settypebyname','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
|
||||||
|
|
|
@ -2743,7 +2743,7 @@ BEGIN
|
||||||
INSERT INTO claimLog
|
INSERT INTO claimLog
|
||||||
SET `action` = 'delete',
|
SET `action` = 'delete',
|
||||||
`changedModel` = 'ClaimBeginning',
|
`changedModel` = 'ClaimBeginning',
|
||||||
`changedModelId` = OLD.id,
|
|
||||||
`userFk` = account.myUser_getId();
|
`userFk` = account.myUser_getId();
|
||||||
END */;;
|
END */;;
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -371,20 +371,20 @@ INSERT INTO `vn`.`contactChannel`(`id`, `name`)
|
||||||
(4, 'GCN Channel'),
|
(4, 'GCN Channel'),
|
||||||
(5, 'The Newspaper');
|
(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`,`gestdocFk`,`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`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`businessTypeFk`,`typeFk`, `salesDepartmentFk`)
|
||||||
VALUES
|
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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'),
|
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 18, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 19, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 19, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 19, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 19, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, NULL, 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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, NULL, 0, 'florist','normal', 80),
|
||||||
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'),
|
(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, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses', 80),
|
||||||
(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, NULL, 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, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses', 80);
|
||||||
|
|
||||||
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
||||||
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
|
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
|
||||||
|
@ -1816,9 +1816,8 @@ INSERT INTO `vn`.`clientContact`(`id`, `clientFk`, `name`, `phone`)
|
||||||
(3, 1101, 'contact 3', 222333444),
|
(3, 1101, 'contact 3', 222333444),
|
||||||
(4, 1102, 'contact 1', 876543219);
|
(4, 1102, 'contact 1', 876543219);
|
||||||
|
|
||||||
INSERT INTO `vn`.`workerManaExcluded`(`workerFk`)
|
INSERT INTO `vn`.`departmentManaExcluded`(`salesDepartmentFk`)
|
||||||
VALUES
|
VALUES (31);
|
||||||
(9);
|
|
||||||
/*
|
/*
|
||||||
el mana de los trabajadores lo podemos poner a mano en la tabla si lo calculamos antes,
|
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
|
pero si hazemos alguna modificacion en alguna tabla que utiliza para calcularlo ya no seria correcto
|
||||||
|
@ -1826,8 +1825,8 @@ INSERT INTO `vn`.`workerManaExcluded`(`workerFk`)
|
||||||
La otra manera es poner el calculo con los 2 trabajadores que utilizamos ahora mismo para los tickets
|
La otra manera es poner el calculo con los 2 trabajadores que utilizamos ahora mismo para los tickets
|
||||||
*/
|
*/
|
||||||
|
|
||||||
call vn.manaSpellersRequery(19);
|
call vn.manaSpellers_requery(80);
|
||||||
call vn.manaSpellersRequery(18);
|
call vn.manaSpellers_requery(31);
|
||||||
|
|
||||||
INSERT INTO `vn`.`clientSample`(`id`, `clientFk`, `typeFk`, `created`, `workerFk`, `userFk`, `companyFk`)
|
INSERT INTO `vn`.`clientSample`(`id`, `clientFk`, `typeFk`, `created`, `workerFk`, `userFk`, `companyFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -12,7 +12,7 @@ BEGIN
|
||||||
INSERT INTO analisis_ventas (
|
INSERT INTO analisis_ventas (
|
||||||
Familia,
|
Familia,
|
||||||
Reino,
|
Reino,
|
||||||
Comercial,
|
salesDepartmentFk,
|
||||||
Comprador,
|
Comprador,
|
||||||
Provincia,
|
Provincia,
|
||||||
almacen,
|
almacen,
|
||||||
|
@ -25,8 +25,8 @@ BEGIN
|
||||||
SELECT
|
SELECT
|
||||||
it.name,
|
it.name,
|
||||||
ic.name,
|
ic.name,
|
||||||
|
c.salesDepartmentFk,
|
||||||
w.code,
|
w.code,
|
||||||
w2.code,
|
|
||||||
p.name,
|
p.name,
|
||||||
wa.name,
|
wa.name,
|
||||||
tm.year,
|
tm.year,
|
||||||
|
@ -38,8 +38,7 @@ BEGIN
|
||||||
LEFT JOIN vn.itemType it ON it.id = bt.tipo_id
|
LEFT JOIN vn.itemType it ON it.id = bt.tipo_id
|
||||||
LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk
|
LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk
|
||||||
LEFT JOIN vn.client c on c.id = bt.Id_Cliente
|
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 w ON w.id = it.workerFk
|
||||||
LEFT JOIN vn.worker w2 ON w2.id = it.workerFk
|
|
||||||
JOIN vn.time tm ON tm.dated = bt.fecha
|
JOIN vn.time tm ON tm.dated = bt.fecha
|
||||||
JOIN vn.sale s ON s.id = bt.Id_Movimiento
|
JOIN vn.sale s ON s.id = bt.Id_Movimiento
|
||||||
LEFT JOIN vn.ticket t ON t.id = s.ticketFk
|
LEFT JOIN vn.ticket t ON t.id = s.ticketFk
|
||||||
|
|
|
@ -1,24 +1,43 @@
|
||||||
DELIMITER $$
|
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
|
BEGIN
|
||||||
|
/**
|
||||||
SELECT t1.*, c.name Cliente, w.code workerCode, c.payMethodFk pay_met_id, c.dueDay Vencimiento
|
* Retorna la info de clientes morosos a una fecha
|
||||||
FROM (
|
*
|
||||||
-- Filtramos aquellos clientes cuyo saldo se ha incrementado de ayer a hoy
|
* @param vDated Fecha a comprobar
|
||||||
select * from(
|
*/
|
||||||
select today.client, today.amount todayAmount, yesterday.amount yesterdayAmount, round(yesterday.amount - today.amount,2) as difference, defaulterSince
|
WITH todayDefaulters AS(
|
||||||
from
|
SELECT client, amount, defaulterSince
|
||||||
(select client, amount, defaulterSince
|
FROM bi.defaulters
|
||||||
from defaulters
|
WHERE date = vDated
|
||||||
where date = vDate and hasChanged) today
|
AND hasChanged
|
||||||
join
|
), yesterdayDefaulters AS(
|
||||||
(select client, amount
|
SELECT client, amount
|
||||||
from defaulters
|
FROM bi.defaulters
|
||||||
where date = TIMESTAMPADD(DAY,-1,vDate)) yesterday using(client)
|
WHERE date = vDated - INTERVAL 1 DAY
|
||||||
|
), newDefaulters AS(
|
||||||
having today.amount > 0 and difference <> 0
|
SELECT td.client,
|
||||||
) newDefaulters
|
td.amount todayAmount,
|
||||||
)t1 left join vn.client c ON c.id = t1.client
|
yd.amount yesterdayAmount,
|
||||||
left join vn.worker w ON w.id = c.salesPersonFk;
|
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 salesDepartmentName,
|
||||||
|
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.salesDepartmentFk;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
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 ;
|
|
|
@ -20,7 +20,7 @@ BEGIN
|
||||||
DELETE FROM payMethodClientEvolution
|
DELETE FROM payMethodClientEvolution
|
||||||
WHERE dated < vFourYearsAgo;
|
WHERE dated < vFourYearsAgo;
|
||||||
|
|
||||||
DELETE FROM salesByclientSalesPerson
|
DELETE FROM salesByClientDepartment
|
||||||
WHERE dated < vFourYearsAgo;
|
WHERE dated < vFourYearsAgo;
|
||||||
|
|
||||||
DELETE FROM m3
|
DELETE FROM m3
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
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.salesDepartmentFk
|
||||||
|
JOIN vn.departmentMana dm ON dm.salesDepartmentFk = c.salesDepartmentFk
|
||||||
|
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
|
END
|
||||||
FROM vn.client c
|
FROM vn.client c
|
||||||
JOIN vn.country co ON co .id = c.countryFk
|
JOIN vn.country co ON co .id = c.countryFk
|
||||||
JOIN vn.worker w ON w.id = c.salesPersonFk
|
JOIN vn.departmentMana dm ON dm.salesDepartmentFk = c.salesDepartmentFk
|
||||||
JOIN vn.worker b ON b.id = w.bossFk
|
|
||||||
JOIN vn.workerMana wm ON wm.workerFk = c.salesPersonFk
|
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT c.id, DATE(MAX(t.shipped)) lastShipped
|
SELECT c.id, DATE(MAX(t.shipped)) lastShipped
|
||||||
FROM vn.client c
|
FROM vn.client c
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root``localhost` PROCEDURE `bs`.`comparativeCampaign`(vDateFrom DATE, vDateTo DATE)
|
||||||
|
BEGIN
|
||||||
|
SELECT deparmentName,
|
||||||
|
id clientFk,
|
||||||
|
name clientName,
|
||||||
|
CAST(SUM(previousAmmount) AS DECIMAL(10, 0)) previousAmmount,
|
||||||
|
CAST(SUM(currentAmmount) AS DECIMAL(10, 0)) currentAmmount
|
||||||
|
FROM ((SELECT
|
||||||
|
d.name deparmentName,
|
||||||
|
c.id,
|
||||||
|
c.name,
|
||||||
|
SUM(s.amount) previousAmmount,
|
||||||
|
0 currentAmmount
|
||||||
|
FROM sale s
|
||||||
|
JOIN vn.`client` c ON s.clientFk = c.id
|
||||||
|
JOIN vn.department d ON d.id = c.salesDepartmentFk
|
||||||
|
WHERE s.dated BETWEEN DATE_ADD(vDateFrom, INTERVAL - 1 YEAR)
|
||||||
|
AND DATE_ADD(vDateTo, INTERVAL - 1 YEAR)
|
||||||
|
GROUP BY d.id, s.clientFk)
|
||||||
|
UNION ALL
|
||||||
|
(SELECT
|
||||||
|
d.name deparmentName,
|
||||||
|
c.id,
|
||||||
|
c.name,
|
||||||
|
0 AS previousAmmount,
|
||||||
|
SUM(s.quantity * s.price) 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.department d ON d.id = c.salesDepartmentFk
|
||||||
|
WHERE t.shipped BETWEEN vDateFrom AND vDateTo
|
||||||
|
GROUP BY d.id, c.id)
|
||||||
|
) comparative
|
||||||
|
GROUP BY deparmentName, id
|
||||||
|
HAVING previousAmmount OR currentAmmount
|
||||||
|
ORDER BY deparmentName, id;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -29,7 +29,7 @@ BEGIN
|
||||||
|
|
||||||
SELECT manaFromDays, manaToDays
|
SELECT manaFromDays, manaToDays
|
||||||
INTO vManaFromDays, vManaToDays
|
INTO vManaFromDays, vManaToDays
|
||||||
FROM vn.salespersonConfig;
|
FROM vn.salesDepartmentConfig;
|
||||||
|
|
||||||
SELECT MAX(dated) INTO vFromDated
|
SELECT MAX(dated) INTO vFromDated
|
||||||
FROM vn.clientManaCache;
|
FROM vn.clientManaCache;
|
||||||
|
@ -43,7 +43,7 @@ BEGIN
|
||||||
IF vFromDated IS NULL THEN
|
IF vFromDated IS NULL THEN
|
||||||
SELECT manaDateFrom
|
SELECT manaDateFrom
|
||||||
INTO vFromDated
|
INTO vFromDated
|
||||||
FROM vn.salespersonConfig;
|
FROM vn.salesDepartmentConfig;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
WHILE vFromDated + INTERVAL vManaToDays DAY < util.VN_CURDATE() DO
|
WHILE vFromDated + INTERVAL vManaToDays DAY < util.VN_CURDATE() DO
|
||||||
|
|
|
@ -5,23 +5,23 @@ BEGIN
|
||||||
* Recalcula el valor del campo con el modificador de precio
|
* Recalcula el valor del campo con el modificador de precio
|
||||||
* para el componente de maná automático.
|
* para el componente de maná automático.
|
||||||
*/
|
*/
|
||||||
UPDATE vn.workerMana wm
|
UPDATE vn.departmentMana dm
|
||||||
JOIN (
|
JOIN (
|
||||||
SELECT c.lastSalesPersonFk,
|
SELECT c.lastSalesDepartmentFk,
|
||||||
FLOOR(SUM(s.amount) / 12) amount
|
FLOOR(SUM(s.amount) / 12) amount
|
||||||
FROM salesByclientSalesPerson s
|
FROM salesByClientDepartment s
|
||||||
JOIN vn.client c ON c.id = s.clientFk
|
JOIN vn.client c ON c.id = s.clientFk
|
||||||
WHERE s.dated BETWEEN util.VN_CURDATE() - INTERVAL 1 YEAR AND util.VN_CURDATE()
|
WHERE s.dated BETWEEN util.VN_CURDATE() - INTERVAL 1 YEAR AND util.VN_CURDATE()
|
||||||
GROUP BY c.lastSalesPersonFk
|
GROUP BY c.lastSalesDepartmentFk
|
||||||
)avgPortfolioWeight ON avgPortfolioWeight.lastSalesPersonFk = wm.workerFk
|
)avgPortfolioWeight ON avgPortfolioWeight.lastSalesDepartmentFk = dm.salesDepartmentFk
|
||||||
JOIN vn.salespersonConfig spc
|
JOIN vn.salesDepartmentConfig sdc
|
||||||
SET wm.pricesModifierRate =
|
SET dm.pricesModifierRate =
|
||||||
IFNULL(
|
IFNULL(
|
||||||
GREATEST(
|
GREATEST(
|
||||||
spc.manaMinRate,
|
sdc.manaMinRate,
|
||||||
LEAST(
|
LEAST(
|
||||||
spc.manaMaxRate,
|
sdc.manaMaxRate,
|
||||||
ROUND( - wm.amount / avgPortfolioWeight.amount, 3)
|
ROUND( - dm.amount / avgPortfolioWeight.amount, 3)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
,0);
|
,0);
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
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.salesDepartmentFk
|
||||||
|
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 ;
|
|
|
@ -1,8 +1,8 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesByclientSalesPerson_add`(vDatedFrom DATE)
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesByClientDepartments_add`(vDatedFrom DATE)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Agrupa las ventas por cliente/comercial/fecha en la tabla bs.salesByclientSalesPerson
|
* Agrupa las ventas por cliente/departamento/fecha en la tabla bs.salesByClientDepartment
|
||||||
* El asociación cliente/comercial/fecha, se mantiene correcta en el tiempo
|
* El asociación cliente/comercial/fecha, se mantiene correcta en el tiempo
|
||||||
*
|
*
|
||||||
* @param vDatedFrom el cálculo se realizará desde la fecha introducida hasta ayer
|
* @param vDatedFrom el cálculo se realizará desde la fecha introducida hasta ayer
|
||||||
|
@ -12,31 +12,31 @@ BEGIN
|
||||||
SET vDatedFrom = util.VN_CURDATE() - INTERVAL 1 MONTH;
|
SET vDatedFrom = util.VN_CURDATE() - INTERVAL 1 MONTH;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
UPDATE salesByclientSalesPerson
|
UPDATE salesByClientDepartment
|
||||||
SET amount = 0,
|
SET amount = 0,
|
||||||
equalizationTax = 0,
|
equalizationTax = 0,
|
||||||
amountNewBorn = 0
|
amountNewBorn = 0
|
||||||
WHERE dated BETWEEN vDatedFrom AND util.yesterday();
|
WHERE dated BETWEEN vDatedFrom AND util.yesterday();
|
||||||
|
|
||||||
INSERT INTO salesByclientSalesPerson(
|
INSERT INTO salesByClientDepartment(
|
||||||
dated,
|
dated,
|
||||||
salesPersonFk,
|
salesDepartmentFk,
|
||||||
clientFk,
|
clientFk,
|
||||||
amount,
|
amount,
|
||||||
equalizationTax)
|
equalizationTax)
|
||||||
SELECT s.dated,
|
SELECT s.dated,
|
||||||
c.salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
s.clientFk,
|
s.clientFk,
|
||||||
SUM(s.amount),
|
SUM(s.amount),
|
||||||
SUM(s.surcharge)
|
SUM(s.surcharge)
|
||||||
FROM sale s
|
FROM sale s
|
||||||
JOIN vn.client c on s.clientFk = c.id
|
JOIN vn.client c on s.clientFk = c.id
|
||||||
WHERE s.dated BETWEEN vDatedFrom AND util.yesterday()
|
WHERE s.dated BETWEEN vDatedFrom AND util.yesterday()
|
||||||
GROUP BY s.dated, c.salesPersonFk, s.clientFk
|
GROUP BY s.dated, c.salesDepartmentFk, s.clientFk
|
||||||
ON DUPLICATE KEY UPDATE amount= VALUES(amount),
|
ON DUPLICATE KEY UPDATE amount= VALUES(amount),
|
||||||
equalizationTax= VALUES(equalizationTax);
|
equalizationTax= VALUES(equalizationTax);
|
||||||
|
|
||||||
UPDATE salesByclientSalesPerson s
|
UPDATE salesByClientDepartment s
|
||||||
JOIN vn.newBornSales n ON n.dated = s.dated AND
|
JOIN vn.newBornSales n ON n.dated = s.dated AND
|
||||||
n.clientFk = s.clientFk
|
n.clientFk = s.clientFk
|
||||||
SET s.amountNewBorn = n.amount
|
SET s.amountNewBorn = n.amount
|
|
@ -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 salesDepartmentFk 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(
|
||||||
|
salesDepartmentFk,
|
||||||
|
dated,
|
||||||
|
amount,
|
||||||
|
equalizationTax,
|
||||||
|
amountNewBorn
|
||||||
|
)
|
||||||
|
SELECT salesDepartmentFk,
|
||||||
|
dated,
|
||||||
|
amount,
|
||||||
|
equalizationTax,
|
||||||
|
amountNewBorn
|
||||||
|
FROM salesByClientDepartment
|
||||||
|
WHERE dated = vDated
|
||||||
|
GROUP BY salesDepartmentFk;
|
||||||
|
|
||||||
|
SET vDated = vDated + INTERVAL 1 DAY;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
WHILE vDated < util.VN_CURDATE() DO
|
||||||
|
|
||||||
|
REPLACE salesByClientDepartment(salesDepartmentFk, dated, amount)
|
||||||
|
SELECT salesDepartmentFk, vDated, amount
|
||||||
|
FROM(SELECT salesDepartmentFk, SUM(amount) amount
|
||||||
|
FROM(SELECT salesDepartmentFk, amount
|
||||||
|
FROM salesByClientDepartment
|
||||||
|
WHERE dated = vDated - INTERVAL 1 DAY
|
||||||
|
UNION ALL
|
||||||
|
SELECT salesDepartmentFk, amount
|
||||||
|
FROM salesByClientDepartment
|
||||||
|
WHERE dated = vDated
|
||||||
|
UNION ALL
|
||||||
|
SELECT salesDepartmentFk, - amount
|
||||||
|
FROM salesByClientDepartment
|
||||||
|
WHERE dated = vDated - INTERVAL 1 YEAR
|
||||||
|
)sub
|
||||||
|
GROUP BY salesDepartmentFk
|
||||||
|
)sub
|
||||||
|
GROUP BY salesDepartmentFk;
|
||||||
|
|
||||||
|
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`()
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`vendedores_add_launcher`()
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
CALL bs.salesByclientSalesPerson_add(util.VN_CURDATE()- INTERVAL 45 DAY);
|
CALL bs.salesByclientSalesDepartment_add(util.VN_CURDATE()- INTERVAL 45 DAY);
|
||||||
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`client_unassignSalesPerson`
|
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`client_unassignSalesDepartment`
|
||||||
ON SCHEDULE EVERY 1 DAY
|
ON SCHEDULE EVERY 1 DAY
|
||||||
STARTS '2023-06-01 03:30:00.000'
|
STARTS '2023-06-01 03:30:00.000'
|
||||||
ON COMPLETION PRESERVE
|
ON COMPLETION PRESERVE
|
||||||
ENABLE
|
ENABLE
|
||||||
DO CALL client_unassignSalesPerson$$
|
DO CALL client_unassignSalesDepartment$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
|
@ -69,10 +69,10 @@ BEGIN
|
||||||
|
|
||||||
-- Componente de maná automático, en función del maná acumulado por el comercial.
|
-- Componente de maná automático, en función del maná acumulado por el comercial.
|
||||||
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||||
SELECT vWarehouse, vItem, vComponentMana, ROUND(wm.pricesModifierRate, 3)
|
SELECT vWarehouse, vItem, vComponentMana, ROUND(dm.pricesModifierRate, 3)
|
||||||
FROM client c
|
FROM client c
|
||||||
JOIN vn.workerMana wm ON c.salesPersonFk = wm.workerFk
|
JOIN vn.departmentMana dm ON c.salesDepartmentFk = dm.salesDepartmentFk
|
||||||
WHERE wm.isPricesModifierActivated AND c.id = vCustomer LIMIT 1;
|
WHERE dm.isPricesModifierActivated AND c.id = vCustomer LIMIT 1;
|
||||||
|
|
||||||
-- Reparto
|
-- Reparto
|
||||||
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
DELIMITER $$
|
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`clientGetSalesPerson`(vClientFk INT, vDated DATE)
|
|
||||||
RETURNS int(11)
|
|
||||||
DETERMINISTIC
|
|
||||||
BEGIN
|
|
||||||
/**
|
|
||||||
* DEPRECATED: use client_getSalesPerson
|
|
||||||
**/
|
|
||||||
RETURN client_getSalesPerson(vClientFk, vDated);
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
|
|
@ -1,74 +0,0 @@
|
||||||
DELIMITER $$
|
|
||||||
CREATE OR REPLACE DEFINER=`root`@`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=`root`@`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=`root`@`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=`root`@`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 ;
|
|
|
@ -138,12 +138,12 @@ BEGIN
|
||||||
SELECT tcb.warehouseFk,
|
SELECT tcb.warehouseFk,
|
||||||
tcb.itemFk,
|
tcb.itemFk,
|
||||||
c2.id,
|
c2.id,
|
||||||
ROUND(base * wm.pricesModifierRate, 3) manaAuto
|
ROUND(base * dm.pricesModifierRate, 3) manaAuto
|
||||||
FROM tmp.ticketComponentBase tcb
|
FROM tmp.ticketComponentBase tcb
|
||||||
JOIN `client` c on c.id = vClientFk
|
JOIN `client` c on c.id = vClientFk
|
||||||
JOIN workerMana wm ON c.salesPersonFk = wm.workerFk
|
JOIN departmentMana dm ON c.salesDepartmentFk = dm.salesDepartmentFk
|
||||||
JOIN vn.component c2 ON c2.code = 'autoMana'
|
JOIN vn.component c2 ON c2.code = 'autoMana'
|
||||||
WHERE wm.isPricesModifierActivated
|
WHERE dm.isPricesModifierActivated
|
||||||
HAVING manaAuto <> 0;
|
HAVING manaAuto <> 0;
|
||||||
|
|
||||||
-- Precios especiales
|
-- Precios especiales
|
||||||
|
|
|
@ -22,7 +22,7 @@ BEGIN
|
||||||
WHERE clientFk = vClientFk;
|
WHERE clientFk = vClientFk;
|
||||||
|
|
||||||
UPDATE vn.client
|
UPDATE vn.client
|
||||||
SET salesPersonFk = NULL
|
SET salesDepartmentFk = NULL
|
||||||
WHERE id = vClientFk;
|
WHERE id = vClientFk;
|
||||||
|
|
||||||
END$$
|
END$$
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`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
|
BEGIN
|
||||||
|
|
||||||
DECLARE vGreuge DECIMAL(10,2);
|
DECLARE vGreuge DECIMAL(10,2);
|
||||||
DECLARE vOwner INT;
|
DECLARE vOwner INT;
|
||||||
DECLARE vTotalSale INT;
|
DECLARE vTotalSale INT;
|
||||||
|
@ -9,65 +13,62 @@ BEGIN
|
||||||
DECLARE vGreugeTypeMana INT DEFAULT 3;-- Maná
|
DECLARE vGreugeTypeMana INT DEFAULT 3;-- Maná
|
||||||
DECLARE vMana DECIMAL(10,2);
|
DECLARE vMana DECIMAL(10,2);
|
||||||
|
|
||||||
SELECT vn.clientGetMana(vClientFk) INTO vMana;
|
SELECT clientGetMana(vClientFk) INTO vMana;
|
||||||
|
|
||||||
IF vWithMana AND vMana THEN
|
IF vWithMana AND vMana THEN
|
||||||
|
INSERT INTO greuge
|
||||||
INSERT INTO vn.greuge( clientFk,
|
SET clientFk = vClientFk,
|
||||||
description,
|
description = 'Desasignación',
|
||||||
amount,
|
amount = - vMana,
|
||||||
shipped,
|
shipped = util.VN_CURDATE(),
|
||||||
greugeTypeFk)
|
greugeTypeFk = vGreugeTypeMana;
|
||||||
VALUES( vClientFk,
|
|
||||||
'Desasignación',
|
|
||||||
-1 * vMana,
|
|
||||||
util.VN_CURDATE(),
|
|
||||||
vGreugeTypeMana);
|
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
SELECT sum(amount) INTO vGreuge
|
SELECT SUM(amount) INTO vGreuge
|
||||||
FROM vn.greuge
|
FROM greuge
|
||||||
WHERE clientFk = vClientFk;
|
WHERE clientFk = vClientFk;
|
||||||
|
|
||||||
IF vGreuge != 0 THEN
|
IF vGreuge THEN
|
||||||
|
IF LENGTH(vDepartmentCode) THEN
|
||||||
IF LENGTH(vWorkerCode) = 0 THEN
|
SELECT salesDepartmentFk INTO vOwner
|
||||||
|
FROM client
|
||||||
SELECT salesPersonFk INTO vOwner
|
|
||||||
FROM vn.client
|
|
||||||
WHERE id = vClientFk;
|
WHERE id = vClientFk;
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
|
|
||||||
SELECT id INTO vOwner
|
SELECT id INTO vOwner
|
||||||
FROM vn.worker
|
FROM department
|
||||||
WHERE code = vWorkerCode COLLATE utf8_general_ci;
|
WHERE code = vDepartmentCode;
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.clientList;
|
IF vOwner IS NULL THEN
|
||||||
CREATE TEMPORARY TABLE tmp.clientList
|
CALL util.throw('The department is incorrect');
|
||||||
SELECT DISTINCT t.clientFk, floor(cr.yearSale / 12) monthSale
|
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
|
FROM vn.ticket t
|
||||||
JOIN vn.client c ON c.id = t.clientFk
|
JOIN vn.client c ON c.id = t.clientFk
|
||||||
JOIN vn.workerMana wm ON wm.workerFk = c.salesPersonFk
|
JOIN vn.departmentMana dm ON dm.salesDepartmentFk = c.salesDepartmentFk
|
||||||
JOIN vn.claimRatio cr ON cr.clientFk = c.id
|
JOIN vn.claimRatio cr ON cr.clientFk = c.id
|
||||||
WHERE wm.workerFk = IF(onlyForHisOwner, vOwner, wm.workerFk)
|
WHERE dm.salesDepartmentFk = IF(vIsOnlyForHisOwner, vOwner, dm.salesDepartmentFk)
|
||||||
AND t.shipped >= TIMESTAMPADD(MONTH,-1,util.VN_CURDATE())
|
AND t.shipped >= util.VN_CURDATE() - INTERVAL 1 MONTH
|
||||||
AND c.id != vClientFk
|
AND c.id <> vClientFk
|
||||||
HAVING monthSale > 100;
|
HAVING monthSale > 100
|
||||||
|
), totalGreuge AS(
|
||||||
SELECT SUM(monthSale) INTO vTotalSale
|
SELECT SUM(monthSale) totalSale FROM greuges
|
||||||
FROM tmp.clientList;
|
)SELECT g.clientFk,
|
||||||
|
CONCAT('Cliente: ', vClientFk),
|
||||||
INSERT INTO vn.greuge(clientFk, description, amount, shipped, greugeTypeFk)
|
vGreuge * g.monthSale / tgtotalSale,
|
||||||
SELECT clientFk, CONCAT('Cliente: ',vClientFk), vGreuge * monthSale / vTotalSale, util.VN_CURDATE(), vGreugeTypeFk
|
util.VN_CURDATE(),
|
||||||
FROM tmp.clientList
|
vGreugeTypeFk
|
||||||
|
FROM greuges g
|
||||||
|
JOIN totalGreuge tg
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT vClientFk, 'Reparto greuge', -vGreuge, util.VN_CURDATE(), vGreugeTypeFk;
|
SELECT vClientFk,
|
||||||
|
'Reparto greuge',
|
||||||
|
-vGreuge,
|
||||||
|
util.VN_CURDATE(),
|
||||||
|
vGreugeTypeFk;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -25,13 +25,17 @@ BEGIN
|
||||||
AND cp.clientFk IS NULL
|
AND cp.clientFk IS NULL
|
||||||
AND co.code NOT IN ('PT')
|
AND co.code NOT IN ('PT')
|
||||||
AND a.name <> 'Canarias'
|
AND a.name <> 'Canarias'
|
||||||
AND c.salesPersonFk IS NOT NULL;
|
AND c.salesDepartmentFk IS NOT NULL;
|
||||||
|
|
||||||
OPEN rs;
|
OPEN rs;
|
||||||
FETCH rs INTO vClientFk;
|
FETCH rs INTO vClientFk;
|
||||||
WHILE NOT vDone DO
|
WHILE NOT vDone DO
|
||||||
CALL vn.clientGreugeSpray(vClientFk, TRUE, '',TRUE);
|
CALL vn.clientGreugeSpray(vClientFk, TRUE, '',TRUE);
|
||||||
UPDATE vn.client SET salesPersonFk = NULL WHERE id = vClientFk;
|
|
||||||
|
UPDATE vn.client
|
||||||
|
SET salesDepartmentFk = NULL
|
||||||
|
WHERE id = vClientFk;
|
||||||
|
|
||||||
FETCH rs INTO vClientFk;
|
FETCH rs INTO vClientFk;
|
||||||
END WHILE;
|
END WHILE;
|
||||||
CLOSE rs;
|
CLOSE rs;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`client_unassignSalesPerson`()
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`client_unassignSalesDepartment`()
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Elimina la asignación de salesPersonFk de la ficha del clientes
|
* Elimina la asignación de salesDepartmentFk de la ficha del clientes
|
||||||
* que no han realizado una compra en los últimos 3 meses y reparte
|
* que no han realizado una compra en los últimos 3 meses y reparte
|
||||||
* su greuge entre el resto de clientes
|
* su greuge entre el resto de clientes
|
||||||
*/
|
*/
|
||||||
|
@ -22,16 +22,15 @@ BEGIN
|
||||||
FROM bs.clientDied cd
|
FROM bs.clientDied cd
|
||||||
JOIN client c ON c.id = cd.clientFk
|
JOIN client c ON c.id = cd.clientFk
|
||||||
LEFT JOIN clientProtected cp ON cp.clientFk = c.id
|
LEFT JOIN clientProtected cp ON cp.clientFk = c.id
|
||||||
LEFT JOIN salesPersonProtected sp ON sp.salesPersonFk = c.salesPersonFk
|
LEFT JOIN salesDepartmentProtected sd ON sp.salesDepartmentFk = c.salesDepartmentFk
|
||||||
JOIN province p ON p.id = c.provinceFk
|
JOIN province p ON p.id = c.provinceFk
|
||||||
LEFT JOIN autonomy a ON a.id = p.autonomyFk
|
LEFT JOIN autonomy a ON a.id = p.autonomyFk
|
||||||
JOIN country co ON co.id = p.countryFk
|
JOIN country co ON co.id = p.countryFk
|
||||||
JOIN bs.clientDiedPeriod cdp ON cdp.countryFk = co.id
|
JOIN bs.clientDiedPeriod cdp ON cdp.countryFk = co.id
|
||||||
WHERE cd.warning = 'third'
|
WHERE cd.warning = 'third'
|
||||||
AND cp.clientFk IS NULL
|
AND cp.clientFk IS NULL
|
||||||
AND sp.salesPersonFk IS NULL
|
|
||||||
AND a.name <> 'Canarias'
|
AND a.name <> 'Canarias'
|
||||||
AND c.salesPersonFk IS NOT NULL;
|
AND c.salesDepartmentFk IS NOT NULL;
|
||||||
|
|
||||||
OPEN vCursor;
|
OPEN vCursor;
|
||||||
l: LOOP
|
l: LOOP
|
||||||
|
@ -42,7 +41,7 @@ BEGIN
|
||||||
END IF;
|
END IF;
|
||||||
CALL clientGreugeSpray(vClientFk, TRUE, '', TRUE);
|
CALL clientGreugeSpray(vClientFk, TRUE, '', TRUE);
|
||||||
UPDATE client
|
UPDATE client
|
||||||
SET salesPersonFk = NULL
|
SET salesDepartmentFk = NULL
|
||||||
WHERE id = vClientFk;
|
WHERE id = vClientFk;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
CLOSE vCursor;
|
CLOSE vCursor;
|
|
@ -1,10 +1,13 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`collection_getTickets`(vParamFk INT)
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`collection_getTickets`(
|
||||||
|
vParamFk INT
|
||||||
|
)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Selecciona los tickets de una colección/ticket/sectorCollection
|
* Selecciona los tickets de una colección/ticket/sectorCollection
|
||||||
* @param vParamFk ticketFk/collectionFk/sectorCollection
|
* @param vParamFk ticketFk/collectionFk/sectorCollection
|
||||||
* @return Retorna ticketFk, level, agencyName, warehouseFk, salesPersonFk, observation
|
* @return Retorna (ticketFk, level, agencyName, warehouseFk, observation,
|
||||||
|
* rgb, salesDepartmentFk)
|
||||||
*/
|
*/
|
||||||
DECLARE vItemPackingTypeFk VARCHAR(1);
|
DECLARE vItemPackingTypeFk VARCHAR(1);
|
||||||
DECLARE vYesterday DATE;
|
DECLARE vYesterday DATE;
|
||||||
|
@ -29,7 +32,7 @@ BEGIN
|
||||||
IF(!(vItemPackingTypeFk <=> 'V'), cc.code, CONCAT(SUBSTRING('ABCDEFGH', tc.wagon, 1), '-', tc.`level`)) `level`,
|
IF(!(vItemPackingTypeFk <=> 'V'), cc.code, CONCAT(SUBSTRING('ABCDEFGH', tc.wagon, 1), '-', tc.`level`)) `level`,
|
||||||
am.name agencyName,
|
am.name agencyName,
|
||||||
t.warehouseFk,
|
t.warehouseFk,
|
||||||
w.id salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
IFNULL(ob.description,'') observaciones,
|
IFNULL(ob.description,'') observaciones,
|
||||||
cc.rgb
|
cc.rgb
|
||||||
FROM vn.ticket t
|
FROM vn.ticket t
|
||||||
|
@ -51,7 +54,7 @@ BEGIN
|
||||||
IF(NOT(vItemPackingTypeFk <=> 'V'), cc.code, CONCAT(SUBSTRING('ABCDEFGH', tc.wagon, 1), '-', tc.`level`)) `level`,
|
IF(NOT(vItemPackingTypeFk <=> 'V'), cc.code, CONCAT(SUBSTRING('ABCDEFGH', tc.wagon, 1), '-', tc.`level`)) `level`,
|
||||||
am.name agencyName,
|
am.name agencyName,
|
||||||
t.warehouseFk,
|
t.warehouseFk,
|
||||||
w.id salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
ob.description,
|
ob.description,
|
||||||
IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb`
|
IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb`
|
||||||
FROM vn.ticket t
|
FROM vn.ticket t
|
||||||
|
@ -72,7 +75,7 @@ BEGIN
|
||||||
NULL `level`,
|
NULL `level`,
|
||||||
am.name agencyName,
|
am.name agencyName,
|
||||||
t.warehouseFk,
|
t.warehouseFk,
|
||||||
c.salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
ob.description,
|
ob.description,
|
||||||
NULL `rgb`
|
NULL `rgb`
|
||||||
FROM vn.sectorCollection sc
|
FROM vn.sectorCollection sc
|
||||||
|
|
|
@ -14,7 +14,6 @@ BEGIN
|
||||||
s.ticketFk,
|
s.ticketFk,
|
||||||
t.nickname client,
|
t.nickname client,
|
||||||
am.name agencyName,
|
am.name agencyName,
|
||||||
wk.code salesPerson,
|
|
||||||
s.itemFk,
|
s.itemFk,
|
||||||
IFNULL(CONCAT(ig.longName,' ',ig.`size`,' ',ig.subName), s.concept) AS concept,
|
IFNULL(CONCAT(ig.longName,' ',ig.`size`,' ',ig.subName), s.concept) AS concept,
|
||||||
s.quantity,
|
s.quantity,
|
||||||
|
@ -24,14 +23,15 @@ BEGIN
|
||||||
tls.name stateName,
|
tls.name stateName,
|
||||||
sb.buyFk,
|
sb.buyFk,
|
||||||
s.id saleFk,
|
s.id saleFk,
|
||||||
wk.id salesPersonFk
|
d.id salesDepartmentFk,
|
||||||
|
d.name salesDepartment
|
||||||
FROM sale s
|
FROM sale s
|
||||||
JOIN ticket t ON t.id = s.ticketFk
|
JOIN ticket t ON t.id = s.ticketFk
|
||||||
JOIN warehouse w ON w.id = t.warehouseFk
|
JOIN warehouse w ON w.id = t.warehouseFk
|
||||||
JOIN address a ON a.id = t.addressFk
|
JOIN address a ON a.id = t.addressFk
|
||||||
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||||
JOIN `client` c ON c.id = a.clientFk
|
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.salesDepartmentFk
|
||||||
LEFT JOIN ticketLastState tls ON tls.ticketFk = t.id
|
LEFT JOIN ticketLastState tls ON tls.ticketFk = t.id
|
||||||
LEFT JOIN saleBuy sb ON sb.saleFk = s.id
|
LEFT JOIN saleBuy sb ON sb.saleFk = s.id
|
||||||
LEFT JOIN buy b ON b.id = sb.buyFk
|
LEFT JOIN buy b ON b.id = sb.buyFk
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
DELIMITER $$
|
|
||||||
CREATE OR REPLACE DEFINER=`root`@`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,38 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`manaSpellers_requery`(
|
||||||
|
vSalesDepartmentFk INTEGER
|
||||||
|
)
|
||||||
|
`whole_proc`:
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Guarda en departmentMana el mana consumido por un departamento
|
||||||
|
*
|
||||||
|
* @param vSalesDepartmentFk Id department
|
||||||
|
*/
|
||||||
|
DECLARE vIsDepartmentExcluded BOOLEAN;
|
||||||
|
|
||||||
|
SELECT COUNT(*) INTO vIsDepartmentExcluded
|
||||||
|
FROM departmentManaExcluded
|
||||||
|
WHERE salesDepartmentFk = vSalesDepartmentFk;
|
||||||
|
|
||||||
|
IF vIsDepartmentExcluded THEN
|
||||||
|
LEAVE whole_proc;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tmp.client
|
||||||
|
SELECT id
|
||||||
|
FROM client
|
||||||
|
WHERE salesDepartmentFk = vSalesDepartmentFk;
|
||||||
|
|
||||||
|
CALL client_getMana();
|
||||||
|
|
||||||
|
INSERT INTO departmentMana (salesDepartmentFk, amount)
|
||||||
|
SELECT vSalesDepartmentFk, SUM(mana)
|
||||||
|
FROM tmp.clientMana
|
||||||
|
ON DUPLICATE KEY UPDATE amount = VALUES(amount);
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE
|
||||||
|
tmp.client,
|
||||||
|
tmp.clientMana;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -70,7 +70,7 @@ proc: BEGIN
|
||||||
IFNULL(tls.state,2) state,
|
IFNULL(tls.state,2) state,
|
||||||
w.code workerCode,
|
w.code workerCode,
|
||||||
DATE(t.shipped) shipped,
|
DATE(t.shipped) shipped,
|
||||||
wk.code salesPersonCode,
|
d.code salesDepartmentCode,
|
||||||
p.id provinceFk,
|
p.id provinceFk,
|
||||||
tls.productionOrder,
|
tls.productionOrder,
|
||||||
IFNULL(tls.alertLevel, al.id) alertLevel,
|
IFNULL(tls.alertLevel, al.id) alertLevel,
|
||||||
|
@ -91,7 +91,7 @@ proc: BEGIN
|
||||||
LEFT JOIN ticketStateToday tst ON tst.ticketFk = t.id
|
LEFT JOIN ticketStateToday tst ON tst.ticketFk = t.id
|
||||||
LEFT JOIN `state` st ON st.id = tst.state
|
LEFT JOIN `state` st ON st.id = tst.state
|
||||||
LEFT JOIN client c ON c.id = t.clientFk
|
LEFT JOIN client c ON c.id = t.clientFk
|
||||||
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
JOIN address a ON a.id = t.addressFk
|
JOIN address a ON a.id = t.addressFk
|
||||||
LEFT JOIN province p ON p.id = a.provinceFk
|
LEFT JOIN province p ON p.id = a.provinceFk
|
||||||
JOIN agencyMode am ON am.id = t.agencyModeFk
|
JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||||
|
|
|
@ -23,7 +23,7 @@ SELECT t.id Id,
|
||||||
a.mobile AddressMobile,
|
a.mobile AddressMobile,
|
||||||
d.longitude Longitude,
|
d.longitude Longitude,
|
||||||
d.latitude Latitude,
|
d.latitude Latitude,
|
||||||
wm.mediaValue SalePersonPhone,
|
CONCAT_WS(' - ', 'adfa', de.pbxQueue ) salesDepartmentPhone,
|
||||||
tob.description Note,
|
tob.description Note,
|
||||||
t.isSigned Signed,
|
t.isSigned Signed,
|
||||||
t.priority,
|
t.priority,
|
||||||
|
@ -31,7 +31,8 @@ SELECT t.id Id,
|
||||||
FROM ticket t
|
FROM ticket t
|
||||||
JOIN client c ON t.clientFk = c.id
|
JOIN client c ON t.clientFk = c.id
|
||||||
JOIN address a ON t.addressFk = a.id
|
JOIN address a ON t.addressFk = a.id
|
||||||
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
|
LEFT JOIN vn.department de ON de.id = c.salesDepartmentFk
|
||||||
|
LEFT JOIN vn.company co ON co.`code` = 'VNL'
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT t.addressFk, MAX(d.ticketFk) lastTicketFk
|
SELECT t.addressFk, MAX(d.ticketFk) lastTicketFk
|
||||||
FROM ticket t
|
FROM ticket t
|
||||||
|
|
|
@ -15,7 +15,7 @@ BEGIN
|
||||||
w.code workerCode,
|
w.code workerCode,
|
||||||
sgd.saleFk,
|
sgd.saleFk,
|
||||||
iss.quantity pickedQuantity,
|
iss.quantity pickedQuantity,
|
||||||
c.salesPersonFk
|
c.salesDepartmentFk
|
||||||
FROM vn.sale s
|
FROM vn.sale s
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
JOIN saleGroupDetail sgd ON sgd.saleFk = s.id
|
JOIN saleGroupDetail sgd ON sgd.saleFk = s.id
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(
|
||||||
|
vDateFuture DATE,
|
||||||
|
vDateToAdvance DATE,
|
||||||
|
vWarehouseFk INT
|
||||||
|
)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
||||||
|
@ -26,7 +30,7 @@ BEGIN
|
||||||
origin.futureState,
|
origin.futureState,
|
||||||
origin.futureIpt,
|
origin.futureIpt,
|
||||||
dest.ipt,
|
dest.ipt,
|
||||||
origin.workerFk,
|
origin.departmentFk,
|
||||||
origin.futureLiters,
|
origin.futureLiters,
|
||||||
origin.futureLines,
|
origin.futureLines,
|
||||||
dest.shipped,
|
dest.shipped,
|
||||||
|
@ -55,7 +59,7 @@ BEGIN
|
||||||
FROM (
|
FROM (
|
||||||
SELECT
|
SELECT
|
||||||
s.ticketFk,
|
s.ticketFk,
|
||||||
c.salesPersonFk workerFk,
|
c.salesDepartmentFk departmentFk,
|
||||||
t.shipped,
|
t.shipped,
|
||||||
t.totalWithVat,
|
t.totalWithVat,
|
||||||
st.name futureState,
|
st.name futureState,
|
||||||
|
|
|
@ -15,7 +15,7 @@ BEGIN
|
||||||
DECLARE vAgencyModeFk INT;
|
DECLARE vAgencyModeFk INT;
|
||||||
DECLARE vNewTicket INT;
|
DECLARE vNewTicket INT;
|
||||||
DECLARE vYear INT;
|
DECLARE vYear INT;
|
||||||
DECLARE vSalesPersonFK INT;
|
DECLARE vObservationTypeFkForSalesPerson INT;
|
||||||
DECLARE vItemPicker INT;
|
DECLARE vItemPicker INT;
|
||||||
|
|
||||||
DECLARE rsTicket CURSOR FOR
|
DECLARE rsTicket CURSOR FOR
|
||||||
|
@ -38,7 +38,7 @@ BEGIN
|
||||||
OPEN rsTicket;
|
OPEN rsTicket;
|
||||||
myLoop: LOOP
|
myLoop: LOOP
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE vSalesPersonEmail VARCHAR(150);
|
DECLARE vSalesDepartmentEmail VARCHAR(150);
|
||||||
DECLARE vIsDuplicateMail BOOL;
|
DECLARE vIsDuplicateMail BOOL;
|
||||||
DECLARE vSubject VARCHAR(150);
|
DECLARE vSubject VARCHAR(150);
|
||||||
DECLARE vMessage TEXT;
|
DECLARE vMessage TEXT;
|
||||||
|
@ -154,7 +154,7 @@ BEGIN
|
||||||
FROM ticketRequest
|
FROM ticketRequest
|
||||||
WHERE ticketFk =vTicketFk;
|
WHERE ticketFk =vTicketFk;
|
||||||
|
|
||||||
SELECT id INTO vSalesPersonFK
|
SELECT id INTO vObservationTypeFkForSalesPerson
|
||||||
FROM observationType
|
FROM observationType
|
||||||
WHERE code = 'salesPerson';
|
WHERE code = 'salesPerson';
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ BEGIN
|
||||||
description)
|
description)
|
||||||
VALUES(
|
VALUES(
|
||||||
vNewTicket,
|
vNewTicket,
|
||||||
vSalesPersonFK,
|
vObservationTypeFkForSalesPerson,
|
||||||
CONCAT('turno desde ticket: ',vTicketFk))
|
CONCAT('turno desde ticket: ',vTicketFk))
|
||||||
ON DUPLICATE KEY UPDATE description =
|
ON DUPLICATE KEY UPDATE description =
|
||||||
CONCAT(ticketObservation.description,VALUES(description),' ');
|
CONCAT(ticketObservation.description,VALUES(description),' ');
|
||||||
|
@ -185,9 +185,9 @@ BEGIN
|
||||||
|
|
||||||
IF (vLanding IS NULL) THEN
|
IF (vLanding IS NULL) THEN
|
||||||
|
|
||||||
SELECT e.email INTO vSalesPersonEmail
|
SELECT d.notificationEmail INTO vSalesDepartmentEmail
|
||||||
FROM client c
|
FROM client c
|
||||||
JOIN account.emailUser e ON e.userFk = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.saleDepartmentFk
|
||||||
WHERE c.id = vClientFk;
|
WHERE c.id = vClientFk;
|
||||||
|
|
||||||
SET vSubject = CONCAT('Turnos - No se ha podido clonar correctamente el ticket ',
|
SET vSubject = CONCAT('Turnos - No se ha podido clonar correctamente el ticket ',
|
||||||
|
@ -199,11 +199,11 @@ BEGIN
|
||||||
|
|
||||||
SELECT COUNT(*) INTO vIsDuplicateMail
|
SELECT COUNT(*) INTO vIsDuplicateMail
|
||||||
FROM mail
|
FROM mail
|
||||||
WHERE receiver = vSalesPersonEmail
|
WHERE receiver = vSalesDepartmentEmail
|
||||||
AND subject = vSubject;
|
AND subject = vSubject;
|
||||||
|
|
||||||
IF NOT vIsDuplicateMail THEN
|
IF NOT vIsDuplicateMail THEN
|
||||||
CALL mail_insert(vSalesPersonEmail, NULL, vSubject, vMessage);
|
CALL mail_insert(vSalesDepartmentEmail, NULL, vSubject, vMessage);
|
||||||
END IF;
|
END IF;
|
||||||
CALL ticket_setState(vNewTicket, 'FIXING');
|
CALL ticket_setState(vNewTicket, 'FIXING');
|
||||||
ELSE
|
ELSE
|
||||||
|
|
|
@ -1,33 +1,28 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`workerDisable`(vUserId int)
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`workerDisable`(vUserFk INT)
|
||||||
mainLabel:BEGIN
|
l:BEGIN
|
||||||
|
|
||||||
IF (SELECT COUNT(*) FROM workerDisableExcluded WHERE workerFk = vUserId AND (dated > util.VN_CURDATE() OR dated IS NULL)) > 0 THEN
|
IF (SELECT COUNT(*)
|
||||||
LEAVE mainLabel;
|
FROM workerDisableExcluded
|
||||||
|
WHERE workerFk = vUserFk
|
||||||
|
AND (dated > util.VN_CURDATE() OR dated IS NULL)) > 0 THEN
|
||||||
|
LEAVE l;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
DELETE cp FROM clientProtected cp
|
DELETE FROM account.account WHERE id = vUserFk;
|
||||||
JOIN client c ON c.id = cp.clientFk
|
|
||||||
WHERE c.salesPersonFk = vUserId;
|
|
||||||
|
|
||||||
DELETE FROM account.account
|
|
||||||
WHERE id = vUserId;
|
|
||||||
|
|
||||||
UPDATE account.user
|
UPDATE account.user
|
||||||
SET role = 2
|
SET role = 2
|
||||||
WHERE id = vUserId;
|
WHERE id = vUserFk;
|
||||||
|
|
||||||
DELETE FROM pbx.sip
|
DELETE FROM pbx.sip WHERE user_id = vUserFk;
|
||||||
WHERE user_id = vUserId;
|
|
||||||
|
|
||||||
UPDATE `client` c
|
UPDATE `client` c
|
||||||
JOIN payMethod p ON p.name = 'CONTADO'
|
JOIN payMethod p ON p.name = 'CONTADO'
|
||||||
SET c.credit = 0, c.payMethodFk = p.id, hasCoreVnl = FALSE
|
SET c.credit = 0,
|
||||||
WHERE c.id = vUserId;
|
c.payMethodFk = p.id,
|
||||||
|
hasCoreVnl = FALSE
|
||||||
UPDATE `client` c
|
WHERE c.id = vUserFk;
|
||||||
SET c.salesPersonFk = null
|
|
||||||
WHERE c.salesPersonFk = vUserId;
|
|
||||||
|
|
||||||
UPDATE locker l
|
UPDATE locker l
|
||||||
SET l.workerFk = NULL
|
SET l.workerFk = NULL
|
||||||
|
|
|
@ -29,13 +29,13 @@ BEGIN
|
||||||
c.name,
|
c.name,
|
||||||
c.phone,
|
c.phone,
|
||||||
bt.description,
|
bt.description,
|
||||||
c.salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
u.name username,
|
d.name departmentName,
|
||||||
aai.invoiced,
|
aai.invoiced,
|
||||||
cnb.lastShipped
|
cnb.lastShipped
|
||||||
FROM vn.client c
|
FROM vn.client c
|
||||||
JOIN notHasTicket ON notHasTicket.id = c.id
|
JOIN notHasTicket ON notHasTicket.id = c.id
|
||||||
LEFT JOIN account.`user` u ON u.id = c.salesPersonFk
|
LEFT JOIN vn.department d ON d.id = c.salesDepartmentFk
|
||||||
JOIN vn.`address` a ON a.clientFk = c.id
|
JOIN vn.`address` a ON a.clientFk = c.id
|
||||||
JOIN vn.postCode pc ON pc.code = a.postalCode
|
JOIN vn.postCode pc ON pc.code = a.postalCode
|
||||||
JOIN vn.town t ON t.id = pc.townFk AND t.provinceFk = a.provinceFk
|
JOIN vn.town t ON t.id = pc.townFk AND t.provinceFk = a.provinceFk
|
||||||
|
|
|
@ -16,6 +16,6 @@ BEGIN
|
||||||
|
|
||||||
SET NEW.accountingAccount = 4300000000 + NEW.id;
|
SET NEW.accountingAccount = 4300000000 + NEW.id;
|
||||||
|
|
||||||
SET NEW.lastSalesPersonFk = NEW.salesPersonFk;
|
SET NEW.lastSalesDepartmentFk = NEW.salesDepartmentFk;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -45,18 +45,16 @@ BEGIN
|
||||||
IF vText IS NOT NULL
|
IF vText IS NOT NULL
|
||||||
THEN
|
THEN
|
||||||
INSERT INTO mail(receiver, replyTo, `subject`, body)
|
INSERT INTO mail(receiver, replyTo, `subject`, body)
|
||||||
SELECT
|
SELECT IFNULL(d.notificationEmail, 'jgallego@verdnatura.es'),
|
||||||
CONCAT(IF(ac.id,u.name, 'jgallego'), '@verdnatura.es'),
|
|
||||||
'administracion@verdnatura.es',
|
'administracion@verdnatura.es',
|
||||||
CONCAT('Cliente ', NEW.id),
|
CONCAT('Cliente ', NEW.id),
|
||||||
CONCAT('Recibida la documentación: ', vText)
|
CONCAT('Recibida la documentación: ', vText)
|
||||||
FROM worker w
|
FROM department d
|
||||||
LEFT JOIN account.user u ON w.id = u.id AND u.active
|
WHERE d.id = NEW.salesDepartmentFk;
|
||||||
LEFT JOIN account.account ac ON ac.id = u.id
|
|
||||||
WHERE w.id = NEW.salesPersonFk;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF NEW.salespersonFk IS NULL AND OLD.salespersonFk IS NOT NULL THEN
|
|
||||||
|
IF NEW.salesDepartmentFk IS NULL AND OLD.salesDepartmentFk IS NOT NULL THEN
|
||||||
IF (SELECT COUNT(clientFk)
|
IF (SELECT COUNT(clientFk)
|
||||||
FROM clientProtected
|
FROM clientProtected
|
||||||
WHERE clientFk = NEW.id
|
WHERE clientFk = NEW.id
|
||||||
|
@ -65,8 +63,9 @@ BEGIN
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF NOT (NEW.salesPersonFk <=> OLD.salesPersonFk) THEN
|
|
||||||
SET NEW.lastSalesPersonFk = IFNULL(NEW.salesPersonFk, OLD.salesPersonFk);
|
IF NOT (NEW.salesDepartmentFk <=> OLD.salesDepartmentFk) THEN
|
||||||
|
SET NEW.lastSalesDepartmentFk = IFNULL(NEW.salesDepartmentFk, OLD.salesDepartmentFk);
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN
|
IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN
|
||||||
|
|
|
@ -1,26 +1,16 @@
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost`
|
CREATE OR REPLACE DEFINER=`root`@`localhost`
|
||||||
SQL SECURITY DEFINER
|
SQL SECURITY DEFINER
|
||||||
VIEW `vn`.`newBornSales`
|
VIEW `vn`.`newBornSales`
|
||||||
AS SELECT `v`.`importe` AS `amount`,
|
AS SELECT
|
||||||
`v`.`Id_Cliente` AS `clientFk`,
|
`s`.`amount` AS `amount`,
|
||||||
`c`.`salesPersonFk` AS `userFk`,
|
`s`.`clientFk` AS `clientFk`,
|
||||||
`v`.`fecha` AS `dated`,
|
`c`.`salesDepartmentFk` AS `salesDepartmentFk`,
|
||||||
|
`s`.`dated` AS `dated`,
|
||||||
`cn`.`firstShipped` AS `firstShipped`
|
`cn`.`firstShipped` AS `firstShipped`
|
||||||
FROM (
|
FROM
|
||||||
(
|
((`bs`.`clientNewBorn` `cn`
|
||||||
(
|
JOIN `bs`.`sale` `s` ON
|
||||||
(
|
(`cn`.`firstShipped` + interval 1 year > `s`.`dated`
|
||||||
`bs`.`clientNewBorn` `cn`
|
and `s`.`clientFk` = `cn`.`clientFk`))
|
||||||
JOIN `bs`.`ventas` `v` ON(
|
JOIN `vn`.`client` `c` ON
|
||||||
`cn`.`firstShipped` + INTERVAL 1 year > `v`.`fecha`
|
(`c`.`id` = `s`.`clientFk`));
|
||||||
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')
|
|
|
@ -40,7 +40,7 @@ AS SELECT `c`.`id` AS `id_cliente`,
|
||||||
`c`.`creditInsurance` AS `creditInsurance`,
|
`c`.`creditInsurance` AS `creditInsurance`,
|
||||||
`c`.`isCreatedAsServed` AS `isCreatedAsServed`,
|
`c`.`isCreatedAsServed` AS `isCreatedAsServed`,
|
||||||
`c`.`hasInvoiceSimplified` AS `hasInvoiceSimplified`,
|
`c`.`hasInvoiceSimplified` AS `hasInvoiceSimplified`,
|
||||||
`c`.`salesPersonFk` AS `Id_Trabajador`,
|
`c`.`salesDepartmentFk` AS `salesDepartmentFk`,
|
||||||
`c`.`isVies` AS `vies`,
|
`c`.`isVies` AS `vies`,
|
||||||
`c`.`bankEntityFk` AS `bankEntityFk`,
|
`c`.`bankEntityFk` AS `bankEntityFk`,
|
||||||
`c`.`typeFk` AS `typeFk`
|
`c`.`typeFk` AS `typeFk`
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
ALTER TABLE vn.client
|
||||||
|
ADD IF NOT EXISTS salesDepartmentFk INT(11) DEFAULT NULL NULL;
|
||||||
|
|
||||||
|
ALTER TABLE vn.client
|
||||||
|
ADD IF NOT EXISTS lastSalesDepartmentFk INT(11) DEFAULT NULL NULL;
|
||||||
|
|
||||||
|
ALTER TABLE vn.client
|
||||||
|
ADD CONSTRAINT client_department_FK FOREIGN KEY IF NOT EXISTS (salesDepartmentFk)
|
||||||
|
REFERENCES vn.department(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE vn.client
|
||||||
|
ADD CONSTRAINT client_lastDepartment_FK FOREIGN KEY IF NOT EXISTS (lastSalesDepartmentFk)
|
||||||
|
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.salesDepartmentFk = b.departmentFk;
|
||||||
|
|
||||||
|
UPDATE vn.client c
|
||||||
|
JOIN vn.worker w ON w.id = c.lastSalesPersonFk
|
||||||
|
JOIN vn.business b ON b.id = w.businessFk
|
||||||
|
SET c.lastSalesDepartmentFk = b.departmentFk;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS vn.departmentMana;
|
||||||
|
CREATE OR REPLACE TABLE `vn`.`departmentMana` (
|
||||||
|
`salesDepartmentFk` 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 (`salesDepartmentFk`),
|
||||||
|
KEY `departmentMana_idx` (`salesDepartmentFk`),
|
||||||
|
CONSTRAINT `departmentMana_salesDepartment_FK` FOREIGN KEY (`salesDepartmentFk`)
|
||||||
|
REFERENCES `vn`.`department` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS bs.salesByClientDepartment;
|
||||||
|
CREATE OR REPLACE TABLE `bs`.`salesByClientDepartment` (
|
||||||
|
`dated` date NOT NULL DEFAULT '0000-00-00',
|
||||||
|
`salesDepartmentFk` 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 `salesByClientDepartment_clientFk` (`clientFk`),
|
||||||
|
KEY `salesByClientDepartment_salesDepartmentFk` (`salesDepartmentFk`),
|
||||||
|
KEY `salesByClientDepartment_dated` (`dated`,`clientFk`,`amount`),
|
||||||
|
CONSTRAINT `salesByClientDepartment_clientFk_FK`
|
||||||
|
FOREIGN KEY (`clientFk`) REFERENCES `vn`.`client` (`id`) ON UPDATE CASCADE,
|
||||||
|
CONSTRAINT `salesByClientDepartment_department_FK`
|
||||||
|
FOREIGN KEY (`salesDepartmentFk`) 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.salesByClientDepartment(
|
||||||
|
dated,
|
||||||
|
salesDepartmentFk,
|
||||||
|
clientFk,
|
||||||
|
amount,
|
||||||
|
equalizationTax,
|
||||||
|
amountNewBorn)
|
||||||
|
SELECT ss.dated, b.departmentFk, ss.clientFk, ss.amount, ss.equalizationTax, ss.amountNewBorn
|
||||||
|
FROM bs.salesByclientSalesPerson ss
|
||||||
|
JOIN vn.worker w ON w.id = ss.salesPersonFk
|
||||||
|
JOIN vn.business b ON b.id = w.businessFk;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `vn`.`salesDepartmentProtected`;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TABLE `vn`.`salesDepartmentProtected` (
|
||||||
|
`salesDepartmentFk` int(10) NOT NULL,
|
||||||
|
PRIMARY KEY (`salesDepartmentFk`),
|
||||||
|
CONSTRAINT `salesDepartmentProtected_FK` FOREIGN KEY (`salesDepartmentFk`) 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';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE vn.observationType
|
||||||
|
SET description='Dto. Comercial',code='salesDepartment'
|
||||||
|
WHERE code = 'salesPerson';
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `bs`.`portfolio`;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TABLE `bs`.`portfolio` (
|
||||||
|
`salesDepartmentFk` int(10) NOT NULL,
|
||||||
|
`yeared` int(4) NOT NULL,
|
||||||
|
`monthed` int(2) NOT NULL,
|
||||||
|
`amount` decimal(10,2) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`salesDepartmentFk`,`yeared`,`monthed`),
|
||||||
|
KEY `portfolio_salesDepartmentFk` (`salesDepartmentFk`),
|
||||||
|
CONSTRAINT `portfolio_salesDepartment_department_FK`
|
||||||
|
FOREIGN KEY (`salesDepartmentFk`) 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',
|
||||||
|
`salesDepartmentFk` 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` (`salesDepartmentFk`),
|
||||||
|
CONSTRAINT `salesDepartmentEvolution_salesDepartment_department_FK` FOREIGN KEY (`salesDepartmentFk`)
|
||||||
|
REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||||
|
|
||||||
|
RENAME TABLE vn.salespersonConfig TO vn.salesDepartmentConfig;
|
||||||
|
|
||||||
|
ALTER TABLE vn.company ADD IF NOT EXISTS phone varchar(15) DEFAULT NULL NULL;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE TABLE `vn`.`departmentManaExcluded` (
|
||||||
|
`salesDepartmentFk` int(10) NOT NULL,
|
||||||
|
PRIMARY KEY (`salesDepartmentFk`),
|
||||||
|
CONSTRAINT `departmentManaExcluded_FK` FOREIGN KEY (`salesDepartmentFk`)
|
||||||
|
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';
|
|
@ -19,7 +19,7 @@
|
||||||
"That payment method requires a BIC": "El método de pago seleccionado requiere un BIC",
|
"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",
|
"State cannot be blank": "El estado no puede estar en blanco",
|
||||||
"Worker cannot be blank": "El trabajador 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 salesdepartment": "No se puede cambiar la forma de pago si no hay departamento comercial asignado",
|
||||||
"can't be blank": "El campo no puede estar vacío",
|
"can't be blank": "El campo no puede estar vacío",
|
||||||
"Observation type must be unique": "El tipo de observación no puede repetirse",
|
"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",
|
"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",
|
"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",
|
"State cannot be blank": "O estado não pode ficar em branco",
|
||||||
"Worker cannot be blank": "O trabalhador 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 salesdepartment": "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",
|
"can't be blank": "Não pode ficar em branco",
|
||||||
"Observation type must be unique": "O tipo de observação deve ser único",
|
"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",
|
"The credit must be an integer greater than or equal to zero": "O crédito deve ser um inteiro maior ou igual a zero",
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
"That payment method requires a BIC": "Esse método de pagamento requer um BIC",
|
"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",
|
"State cannot be blank": "O estado não pode estar em branco",
|
||||||
"Worker cannot be blank": "O trabalhador 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 salesdepartment": "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",
|
"can't be blank": "não pode estar em branco",
|
||||||
"Observation type must be unique": "O tipo de observação deve ser único",
|
"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",
|
"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",
|
||||||
|
|
|
@ -61,7 +61,13 @@ module.exports = Self => {
|
||||||
include: {
|
include: {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['name', 'salesPersonFk']
|
fields: ['name', 'salesDepartmentFk'],
|
||||||
|
include: {
|
||||||
|
relation: 'salesDepartment',
|
||||||
|
scope: {
|
||||||
|
fields: ['id', 'chatName']
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -71,9 +77,9 @@ module.exports = Self => {
|
||||||
clientName: claim.client().name,
|
clientName: claim.client().name,
|
||||||
claimUrl: `${url}claim/${args.id}/summary`,
|
claimUrl: `${url}claim/${args.id}/summary`,
|
||||||
});
|
});
|
||||||
const salesPersonId = claim.client().salesPersonFk;
|
const salesDepartment = claim.client().salesDepartment();
|
||||||
if (salesPersonId)
|
if (salesDepartment)
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPersonId, message);
|
await models.Chat.sendCheckingPresence(ctx, salesDepartment.chatName, message);
|
||||||
|
|
||||||
const email = new Email('claim-pickup-order', params);
|
const email = new Email('claim-pickup-order', params);
|
||||||
|
|
||||||
|
|
|
@ -47,10 +47,11 @@ module.exports = Self => {
|
||||||
include: {
|
include: {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
|
fields: ['id', 'salesDepartmentFk'],
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'chatName']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,8 +92,8 @@ module.exports = Self => {
|
||||||
|
|
||||||
await Promise.all(promises);
|
await Promise.all(promises);
|
||||||
|
|
||||||
const salesPerson = ticket.client().salesPersonUser();
|
const salesDepartment = ticket.client().salesDepartment();
|
||||||
if (salesPerson) {
|
if (salesDepartment) {
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
|
|
||||||
const message = $t('Created claim', {
|
const message = $t('Created claim', {
|
||||||
|
@ -102,7 +103,7 @@ module.exports = Self => {
|
||||||
claimUrl: `${url}claim/${newClaim.id}/summary`,
|
claimUrl: `${url}claim/${newClaim.id}/summary`,
|
||||||
changes: changesMade
|
changes: changesMade
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
|
@ -51,9 +51,9 @@ module.exports = Self => {
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'salesPersonFk',
|
arg: 'salesDepartmetnFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The salesPerson id',
|
description: 'The salesDepartment id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -164,8 +164,8 @@ module.exports = Self => {
|
||||||
return {'cl.id': {inq: claimIdsByItemFk}};
|
return {'cl.id': {inq: claimIdsByItemFk}};
|
||||||
case 'claimResponsibleFk':
|
case 'claimResponsibleFk':
|
||||||
return {'cl.id': {inq: claimIdsByClaimResponsibleFk}};
|
return {'cl.id': {inq: claimIdsByClaimResponsibleFk}};
|
||||||
case 'salesPersonFk':
|
case 'salesDepartmentFk':
|
||||||
return {'c.salesPersonFk': value};
|
return {'c.salesDepartmentFk': value};
|
||||||
case 'attenderFk':
|
case 'attenderFk':
|
||||||
return {'cl.workerFk': value};
|
return {'cl.workerFk': value};
|
||||||
case 'created':
|
case 'created':
|
||||||
|
|
|
@ -53,9 +53,9 @@ module.exports = Self => {
|
||||||
{
|
{
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['salesPersonFk', 'name'],
|
fields: ['salesDepartmentFk', 'name'],
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ module.exports = Self => {
|
||||||
relation: 'claimDestination',
|
relation: 'claimDestination',
|
||||||
fields: ['addressFk']
|
fields: ['addressFk']
|
||||||
},
|
},
|
||||||
where: {claimFk: claimFk}
|
where: {claimFk}
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
for (let claimEnd of claimEnds) {
|
for (let claimEnd of claimEnds) {
|
||||||
|
@ -53,8 +53,8 @@ module.exports = Self => {
|
||||||
if (addressId)
|
if (addressId)
|
||||||
address = await models.Address.findById(addressId, null, myOptions);
|
address = await models.Address.findById(addressId, null, myOptions);
|
||||||
|
|
||||||
const salesPerson = sale.ticket().client().salesPersonUser();
|
const salesDepartment = sale.ticket().client().salesDepartment();
|
||||||
if (salesPerson) {
|
if (salesDepartment) {
|
||||||
const nickname = address && address.nickname || destination.description;
|
const nickname = address && address.nickname || destination.description;
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
const message = $t('Sent units from ticket', {
|
const message = $t('Sent units from ticket', {
|
||||||
|
@ -66,7 +66,7 @@ module.exports = Self => {
|
||||||
ticketUrl: `${url}ticket/${sale.ticketFk}/sale`,
|
ticketUrl: `${url}ticket/${sale.ticketFk}/sale`,
|
||||||
itemUrl: `${url}item/${sale.itemFk}/summary`
|
itemUrl: `${url}item/${sale.itemFk}/summary`
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!address) continue;
|
if (!address) continue;
|
||||||
|
@ -121,9 +121,9 @@ module.exports = Self => {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'chatName']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ describe('claim regularizeClaim()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
||||||
|
|
||||||
|
@ -55,8 +55,8 @@ describe('claim regularizeClaim()', () => {
|
||||||
expect(trashTicket.addressFk).toEqual(trashAddress);
|
expect(trashTicket.addressFk).toEqual(trashAddress);
|
||||||
expect(claimBefore.claimStateFk).toEqual(pendentState);
|
expect(claimBefore.claimStateFk).toEqual(pendentState);
|
||||||
expect(claimAfter.claimStateFk).toEqual(resolvedState);
|
expect(claimAfter.claimStateFk).toEqual(resolvedState);
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Trash');
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es5_equipo', 'Trash');
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
|
expect(chatModel.send).toHaveBeenCalledTimes(4);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -71,7 +71,7 @@ describe('claim regularizeClaim()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
||||||
|
|
||||||
|
@ -80,8 +80,8 @@ describe('claim regularizeClaim()', () => {
|
||||||
|
|
||||||
await models.Claim.regularizeClaim(ctx, claimId, options);
|
await models.Claim.regularizeClaim(ctx, claimId, options);
|
||||||
|
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Bueno');
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es5_equipo', 'Bueno');
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
|
expect(chatModel.send).toHaveBeenCalledTimes(4);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -96,7 +96,7 @@ describe('claim regularizeClaim()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
claimEnds = await importTicket(ticketId, claimId, userId, options);
|
||||||
|
|
||||||
|
@ -105,8 +105,8 @@ describe('claim regularizeClaim()', () => {
|
||||||
|
|
||||||
await models.Claim.regularizeClaim(ctx, claimId, options);
|
await models.Claim.regularizeClaim(ctx, claimId, options);
|
||||||
|
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Bueno');
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es5_equipo', 'Bueno');
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
|
expect(chatModel.send).toHaveBeenCalledTimes(4);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -63,7 +63,7 @@ describe('Update Claim', () => {
|
||||||
const newClaim = await app.models.Claim.create(originalData, options);
|
const newClaim = await app.models.Claim.create(originalData, options);
|
||||||
|
|
||||||
const chatModel = app.models.Chat;
|
const chatModel = app.models.Chat;
|
||||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
const pendingState = claimStatesMap.pending;
|
const pendingState = claimStatesMap.pending;
|
||||||
const ctx = {
|
const ctx = {
|
||||||
|
@ -83,7 +83,7 @@ describe('Update Claim', () => {
|
||||||
let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options);
|
let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options);
|
||||||
|
|
||||||
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalled();
|
expect(chatModel.send).toHaveBeenCalled();
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -101,7 +101,7 @@ describe('Update Claim', () => {
|
||||||
const newClaim = await app.models.Claim.create(originalData, options);
|
const newClaim = await app.models.Claim.create(originalData, options);
|
||||||
|
|
||||||
const chatModel = app.models.Chat;
|
const chatModel = app.models.Chat;
|
||||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
const canceledState = claimStatesMap.canceled;
|
const canceledState = claimStatesMap.canceled;
|
||||||
const ctx = {
|
const ctx = {
|
||||||
|
@ -121,7 +121,7 @@ describe('Update Claim', () => {
|
||||||
let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options);
|
let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options);
|
||||||
|
|
||||||
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(2);
|
expect(chatModel.send).toHaveBeenCalledTimes(2);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -139,7 +139,7 @@ describe('Update Claim', () => {
|
||||||
const newClaim = await app.models.Claim.create(originalData, options);
|
const newClaim = await app.models.Claim.create(originalData, options);
|
||||||
|
|
||||||
const chatModel = app.models.Chat;
|
const chatModel = app.models.Chat;
|
||||||
spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
const claimManagerId = 72;
|
const claimManagerId = 72;
|
||||||
const ctx = {
|
const ctx = {
|
||||||
|
@ -162,7 +162,7 @@ describe('Update Claim', () => {
|
||||||
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
expect(updatedClaim.observation).toEqual(ctx.args.observation);
|
||||||
expect(updatedClaim.claimStateFk).toEqual(ctx.args.claimStateFk);
|
expect(updatedClaim.claimStateFk).toEqual(ctx.args.claimStateFk);
|
||||||
expect(updatedClaim.workerFk).toEqual(ctx.args.workerFk);
|
expect(updatedClaim.workerFk).toEqual(ctx.args.workerFk);
|
||||||
expect(chatModel.sendCheckingPresence).toHaveBeenCalled();
|
expect(chatModel.send).toHaveBeenCalled();
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -64,11 +64,16 @@ module.exports = Self => {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser'
|
relation: 'salesDepartment',
|
||||||
|
scope: {
|
||||||
|
fields: ['id', 'chatName']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
// Get sales person from claim client
|
||||||
|
const salesDepartment = claim.client().salesDepartment();
|
||||||
|
|
||||||
const changedPickup = args.pickup && args.pickup != claim.pickup;
|
const changedPickup = args.pickup && args.pickup != claim.pickup;
|
||||||
|
|
||||||
|
@ -84,14 +89,13 @@ module.exports = Self => {
|
||||||
delete args.ctx;
|
delete args.ctx;
|
||||||
const updatedClaim = await claim.updateAttributes(args, myOptions);
|
const updatedClaim = await claim.updateAttributes(args, myOptions);
|
||||||
|
|
||||||
const salesPerson = claim.client().salesPersonUser();
|
if (salesDepartment) {
|
||||||
if (salesPerson) {
|
|
||||||
if (changedPickup && updatedClaim.pickup)
|
if (changedPickup && updatedClaim.pickup)
|
||||||
await notifyPickUp(ctx, salesPerson.id, claim);
|
await notifyPickUp(ctx, salesDepartment, claim);
|
||||||
|
|
||||||
if (args.claimStateFk) {
|
if (args.claimStateFk) {
|
||||||
const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
|
const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
|
||||||
await notifyStateChange(ctx, salesPerson.id, claim, newState.description);
|
await notifyStateChange(ctx, salesDepartment, claim, newState.description);
|
||||||
if (newState.code == 'canceled')
|
if (newState.code == 'canceled')
|
||||||
await notifyStateChange(ctx, claim.workerFk, claim, newState.description);
|
await notifyStateChange(ctx, claim.workerFk, claim, newState.description);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +110,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
async function notifyStateChange(ctx, workerId, claim, newState) {
|
async function notifyStateChange(ctx, salesDepartment, claim, newState) {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const url = await models.Url.getUrl();
|
const url = await models.Url.getUrl();
|
||||||
const $t = ctx.req.__;
|
const $t = ctx.req.__;
|
||||||
|
@ -117,10 +121,10 @@ module.exports = Self => {
|
||||||
claimUrl: `${url}claim/${claim.id}/summary`,
|
claimUrl: `${url}claim/${claim.id}/summary`,
|
||||||
newState
|
newState
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, workerId, message);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function notifyPickUp(ctx, workerId, claim) {
|
async function notifyPickUp(ctx, salesDepartment, claim) {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const url = await models.Url.getUrl();
|
const url = await models.Url.getUrl();
|
||||||
const $t = ctx.req.__; // $translate
|
const $t = ctx.req.__; // $translate
|
||||||
|
@ -131,6 +135,6 @@ module.exports = Self => {
|
||||||
claimUrl: `${url}claim/${claim.id}/summary`,
|
claimUrl: `${url}claim/${claim.id}/summary`,
|
||||||
claimPickup: $t(claim.pickup)
|
claimPickup: $t(claim.pickup)
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, workerId, message);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,7 +35,7 @@ columns:
|
||||||
sageTaxTypeFk: sage tax type
|
sageTaxTypeFk: sage tax type
|
||||||
sageTransactionTypeFk: sage transaction type
|
sageTransactionTypeFk: sage transaction type
|
||||||
businessTypeFk: business type
|
businessTypeFk: business type
|
||||||
salesPersonFk: sales person
|
salesDepartmentFk: sales department
|
||||||
hasElectronicInvoice: electronic invoice
|
hasElectronicInvoice: electronic invoice
|
||||||
payMethodFk: pay method
|
payMethodFk: pay method
|
||||||
provinceFk: province
|
provinceFk: province
|
||||||
|
@ -50,6 +50,6 @@ columns:
|
||||||
isCreatedAsServed: created as served
|
isCreatedAsServed: created as served
|
||||||
hasInvoiceSimplified: simplified invoice
|
hasInvoiceSimplified: simplified invoice
|
||||||
typeFk: type
|
typeFk: type
|
||||||
lastSalesPersonFk: last salesperson
|
lastSalesDepartmentFk: last sales department
|
||||||
rating: rating
|
rating: rating
|
||||||
recommendedCredit: recommended credit
|
recommendedCredit: recommended credit
|
||||||
|
|
|
@ -35,7 +35,7 @@ columns:
|
||||||
sageTaxTypeFk: tipo impuesto sage
|
sageTaxTypeFk: tipo impuesto sage
|
||||||
sageTransactionTypeFk: tipo transacción Sage
|
sageTransactionTypeFk: tipo transacción Sage
|
||||||
businessTypeFk: tipo negocio
|
businessTypeFk: tipo negocio
|
||||||
salesPersonFk: comercial
|
salesDepartmentFk: departamento comercial
|
||||||
hasElectronicInvoice: factura electrónica
|
hasElectronicInvoice: factura electrónica
|
||||||
payMethodFk: método pago
|
payMethodFk: método pago
|
||||||
provinceFk: provincia
|
provinceFk: provincia
|
||||||
|
@ -50,6 +50,6 @@ columns:
|
||||||
isCreatedAsServed: creado como servido
|
isCreatedAsServed: creado como servido
|
||||||
hasInvoiceSimplified: factura simple
|
hasInvoiceSimplified: factura simple
|
||||||
typeFk: tipo
|
typeFk: tipo
|
||||||
lastSalesPersonFk: último comercial
|
lastSalesDepartmentFk: último departmaneto comercial
|
||||||
rating: clasificación
|
rating: clasificación
|
||||||
recommendedCredit: crédito recomendado
|
recommendedCredit: crédito recomendado
|
||||||
|
|
|
@ -29,17 +29,17 @@ module.exports = Self => {
|
||||||
|
|
||||||
const clients = await Self.rawSql(`
|
const clients = await Self.rawSql(`
|
||||||
SELECT
|
SELECT
|
||||||
c.id AS clientFk,
|
c.id clientFk,
|
||||||
c.email AS clientEmail,
|
c.email clientEmail,
|
||||||
eu.email salesPersonEmail
|
d.notificationEmail salesDepartmentEmail
|
||||||
FROM client c
|
FROM client c
|
||||||
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
JOIN ticket t ON t.clientFk = c.id
|
JOIN ticket t ON t.clientFk = c.id
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
JOIN itemType it ON it.id = i.typeFk
|
JOIN itemType it ON it.id = i.typeFk
|
||||||
WHERE c.id IN(?)
|
WHERE c.id IN(?)
|
||||||
AND it.isPackaging = FALSE
|
AND NOT it.isPackaging
|
||||||
AND DATE(t.shipped) BETWEEN ? AND ?
|
AND DATE(t.shipped) BETWEEN ? AND ?
|
||||||
GROUP BY c.id`, [params.clients, params.from, params.to]);
|
GROUP BY c.id`, [params.clients, params.from, params.to]);
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ module.exports = Self => {
|
||||||
const args = {
|
const args = {
|
||||||
id: client.clientFk,
|
id: client.clientFk,
|
||||||
recipient: client.clientEmail,
|
recipient: client.clientEmail,
|
||||||
replyTo: client.salesPersonEmail,
|
replyTo: client.salesDepartmentEmail,
|
||||||
from: params.from,
|
from: params.from,
|
||||||
to: params.to
|
to: params.to
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,7 +50,7 @@ module.exports = function(Self) {
|
||||||
fi: data.fi,
|
fi: data.fi,
|
||||||
socialName: data.socialName,
|
socialName: data.socialName,
|
||||||
email: data.email,
|
email: data.email,
|
||||||
salesPersonFk: data.salesPersonFk,
|
salesDepartmentFk: data.salesDepartmentFk,
|
||||||
postcode: data.postcode,
|
postcode: data.postcode,
|
||||||
street: data.street,
|
street: data.street,
|
||||||
city: data.city,
|
city: data.city,
|
||||||
|
|
|
@ -23,7 +23,7 @@ module.exports = Self => {
|
||||||
description: 'The client name',
|
description: 'The client name',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'salesPersonFk',
|
arg: 'salesDepartmentFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -80,7 +80,7 @@ module.exports = Self => {
|
||||||
? {'c.id': {inq: value}}
|
? {'c.id': {inq: value}}
|
||||||
: {'c.name': {like: `%${value}%`}};
|
: {'c.name': {like: `%${value}%`}};
|
||||||
case 'name':
|
case 'name':
|
||||||
case 'salesPersonFk':
|
case 'salesDepartmentFk':
|
||||||
case 'fi':
|
case 'fi':
|
||||||
case 'socialName':
|
case 'socialName':
|
||||||
case 'city':
|
case 'city':
|
||||||
|
@ -126,8 +126,8 @@ module.exports = Self => {
|
||||||
ct.name country,
|
ct.name country,
|
||||||
p.id AS provinceFk,
|
p.id AS provinceFk,
|
||||||
p.name AS province,
|
p.name AS province,
|
||||||
u.id AS salesPersonFk,
|
d.id salesDepartmentFk,
|
||||||
u.name AS salesPerson,
|
d.name salesDeparment,
|
||||||
bt.code AS businessTypeFk,
|
bt.code AS businessTypeFk,
|
||||||
bt.description AS businessType,
|
bt.description AS businessType,
|
||||||
pm.id AS payMethodFk,
|
pm.id AS payMethodFk,
|
||||||
|
@ -137,7 +137,7 @@ module.exports = Self => {
|
||||||
stt.CodigoTransaccion AS sageTransactionTypeFk,
|
stt.CodigoTransaccion AS sageTransactionTypeFk,
|
||||||
stt.Transaccion AS sageTransactionType
|
stt.Transaccion AS sageTransactionType
|
||||||
FROM client c
|
FROM client c
|
||||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
LEFT JOIN country ct ON ct.id = c.countryFk
|
LEFT JOIN country ct ON ct.id = c.countryFk
|
||||||
LEFT JOIN province p ON p.id = c.provinceFk
|
LEFT JOIN province p ON p.id = c.provinceFk
|
||||||
LEFT JOIN businessType bt ON bt.code = c.businessTypeFk
|
LEFT JOIN businessType bt ON bt.code = c.businessTypeFk
|
||||||
|
|
|
@ -23,7 +23,7 @@ module.exports = Self => {
|
||||||
description: 'The client name',
|
description: 'The client name',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'salesPersonFk',
|
arg: 'salesDeparmentFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -127,7 +127,7 @@ module.exports = Self => {
|
||||||
{'a.provinceFk': value}
|
{'a.provinceFk': value}
|
||||||
]};
|
]};
|
||||||
case 'name':
|
case 'name':
|
||||||
case 'salesPersonFk':
|
case 'salesDepartmentFk':
|
||||||
case 'fi':
|
case 'fi':
|
||||||
case 'socialName':
|
case 'socialName':
|
||||||
case 'email':
|
case 'email':
|
||||||
|
@ -147,7 +147,6 @@ module.exports = Self => {
|
||||||
c.socialName,
|
c.socialName,
|
||||||
c.phone,
|
c.phone,
|
||||||
a.phone,
|
a.phone,
|
||||||
c.mobile,
|
|
||||||
c.city,
|
c.city,
|
||||||
a.city,
|
a.city,
|
||||||
c.postcode,
|
c.postcode,
|
||||||
|
@ -155,13 +154,13 @@ module.exports = Self => {
|
||||||
c.email,
|
c.email,
|
||||||
c.isActive,
|
c.isActive,
|
||||||
c.isFreezed,
|
c.isFreezed,
|
||||||
p.id AS provinceClientFk,
|
p.id provinceClientFk,
|
||||||
a.provinceFk AS provinceAddressFk,
|
a.provinceFk provinceAddressFk,
|
||||||
p.name AS province,
|
p.name province,
|
||||||
u.id AS salesPersonFk,
|
d.id salesDepartmentFk,
|
||||||
u.name AS salesPerson
|
d.name salesDepartment
|
||||||
FROM client c
|
FROM client c
|
||||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
LEFT JOIN province p ON p.id = c.provinceFk
|
LEFT JOIN province p ON p.id = c.provinceFk
|
||||||
JOIN address a ON a.clientFk = c.id
|
JOIN address a ON a.clientFk = c.id
|
||||||
`
|
`
|
||||||
|
|
|
@ -42,7 +42,7 @@ module.exports = function(Self) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ describe('Client Create', () => {
|
||||||
street: 'WALL STREET',
|
street: 'WALL STREET',
|
||||||
city: 'New York',
|
city: 'New York',
|
||||||
businessTypeFk: 'florist',
|
businessTypeFk: 'florist',
|
||||||
|
salesDepartmentFk: 80,
|
||||||
provinceFk: 1
|
provinceFk: 1
|
||||||
};
|
};
|
||||||
const newAccountWithoutEmail = JSON.parse(JSON.stringify(newAccount));
|
const newAccountWithoutEmail = JSON.parse(JSON.stringify(newAccount));
|
||||||
|
|
|
@ -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 tx = await models.Client.beginTransaction({});
|
||||||
const salesPersonId = 18;
|
const salesDepartmementId = 80;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
const ctx = {req: {accessToken: {userId: 1}}, args: {salesPersonFk: salesPersonId}};
|
const ctx = {req: {accessToken: {userId: 1}}, args: {salesDepartmentFk: salesDepartmementId}};
|
||||||
const filter = {};
|
const filter = {};
|
||||||
const result = await models.Client.extendedListFilter(ctx, filter, options);
|
const result = await models.Client.extendedListFilter(ctx, filter, options);
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ describe('client extendedListFilter()', () => {
|
||||||
const randomResultClient = result[randomIndex];
|
const randomResultClient = result[randomIndex];
|
||||||
|
|
||||||
expect(result.length).toBeGreaterThanOrEqual(5);
|
expect(result.length).toBeGreaterThanOrEqual(5);
|
||||||
expect(randomResultClient.salesPersonFk).toEqual(salesPersonId);
|
expect(randomResultClient.salesDepartmentFk).toEqual(salesDepartmementId);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} 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 "salesDepartmentFk" argument', async() => {
|
||||||
const tx = await models.Client.beginTransaction({});
|
const tx = await models.Client.beginTransaction({});
|
||||||
const salesPersonId = 18;
|
const salesDepartmentId = 80;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
const ctx = {req: {accessToken: {userId: 1}}, args: {salesPersonFk: salesPersonId}};
|
const ctx = {req: {accessToken: {userId: 1}}, args: {salesDepartmentFk: salesDepartmentId}};
|
||||||
const filter = {};
|
const filter = {};
|
||||||
const result = await models.Client.filter(ctx, filter, options);
|
const result = await models.Client.filter(ctx, filter, options);
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ describe('client filter()', () => {
|
||||||
const randomResultClient = result[randomIndex];
|
const randomResultClient = result[randomIndex];
|
||||||
|
|
||||||
expect(result.length).toBeGreaterThanOrEqual(5);
|
expect(result.length).toBeGreaterThanOrEqual(5);
|
||||||
expect(randomResultClient.salesPersonFk).toEqual(salesPersonId);
|
expect(randomResultClient.salesDepartmentFk).toEqual(salesDepartmentId);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,9 +59,9 @@ module.exports = Self => {
|
||||||
SELECT
|
SELECT
|
||||||
DISTINCT c.id clientFk,
|
DISTINCT c.id clientFk,
|
||||||
c.name clientName,
|
c.name clientName,
|
||||||
c.salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
c.businessTypeFk,
|
c.businessTypeFk,
|
||||||
u.name salesPersonName,
|
de.name salesDepartmentName,
|
||||||
d.amount,
|
d.amount,
|
||||||
co.created,
|
co.created,
|
||||||
co.text observation,
|
co.text observation,
|
||||||
|
@ -77,7 +77,7 @@ module.exports = Self => {
|
||||||
JOIN vn.country cn ON cn.id = c.countryFk
|
JOIN vn.country cn ON cn.id = c.countryFk
|
||||||
JOIN vn.payMethod pm ON pm.id = c.payMethodFk
|
JOIN vn.payMethod pm ON pm.id = c.payMethodFk
|
||||||
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
||||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN department de ON de.id = c.salesDepartmentFk
|
||||||
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
||||||
WHERE
|
WHERE
|
||||||
d.created = ?
|
d.created = ?
|
||||||
|
|
|
@ -126,12 +126,12 @@ module.exports = Self => {
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
|
|
||||||
Self.validate('payMethod', hasSalesMan, {
|
Self.validate('payMethod', hasSalesDepartment, {
|
||||||
message: 'Cannot change the payment method if no salesperson'
|
message: 'Cannot change the payment method if no salesdepartment'
|
||||||
});
|
});
|
||||||
|
|
||||||
function hasSalesMan(err) {
|
function hasSalesDepartment(err) {
|
||||||
if (this.payMethod && !this.salesPersonUser)
|
if (this.payMethod && !this.salesDepartment)
|
||||||
err();
|
err();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,18 +356,18 @@ module.exports = Self => {
|
||||||
const $t = httpRequest.__;
|
const $t = httpRequest.__;
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
|
|
||||||
const salesPersonId = instance.salesPersonFk;
|
const salesDepartmentId = instance.salesDepartmentFk;
|
||||||
|
|
||||||
if (salesPersonId) {
|
if (salesDepartmentId) {
|
||||||
// Send email to client
|
// Send email to client
|
||||||
if (instance.email) {
|
if (instance.email) {
|
||||||
const {Email} = require('vn-print');
|
const {Email} = require('vn-print');
|
||||||
const worker = await models.EmailUser.findById(salesPersonId);
|
const salesDepartment = await models.department.findById(salesDepartmentId);
|
||||||
const params = {
|
const params = {
|
||||||
id: instance.id,
|
id: instance.id,
|
||||||
recipientId: instance.id,
|
recipientId: instance.id,
|
||||||
recipient: instance.email,
|
recipient: instance.email,
|
||||||
replyTo: worker.email
|
replyTo: salesDepartment.notificationEmail
|
||||||
};
|
};
|
||||||
const email = new Email('payment-update', params);
|
const email = new Email('payment-update', params);
|
||||||
await email.send();
|
await email.send();
|
||||||
|
@ -379,19 +379,16 @@ module.exports = Self => {
|
||||||
clientName: instance.name,
|
clientName: instance.name,
|
||||||
url: fullUrl
|
url: fullUrl
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(httpCtx, salesPersonId, message);
|
await models.Chat.send(httpCtx, `@${salesDepartment.chatName}`, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const workerIdBefore = oldInstance.salesPersonFk;
|
if (oldInstance.salesDepartmentFk != newInstance.salesDepartmentFk)
|
||||||
const workerIdAfter = newInstance.salesPersonFk;
|
await Self.notifyAssignment(instance, oldInstance.salesDepartmentFk, newInstance.salesDepartmentFk);
|
||||||
const assignmentChanged = workerIdBefore != workerIdAfter;
|
|
||||||
if (assignmentChanged)
|
|
||||||
await Self.notifyAssignment(instance, workerIdBefore, workerIdAfter);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Send notification on client worker assignment
|
// Send notification on client department assignment
|
||||||
Self.notifyAssignment = async function notifyAssignment(client, previousWorkerId, currentWorkerId) {
|
Self.notifyAssignment = async function notifyAssignment(client, previousDepartmentId, currentDepartmentId) {
|
||||||
const loopBackContext = LoopBackContext.getCurrentContext();
|
const loopBackContext = LoopBackContext.getCurrentContext();
|
||||||
const httpCtx = {req: loopBackContext.active};
|
const httpCtx = {req: loopBackContext.active};
|
||||||
const httpRequest = httpCtx.req.http.req;
|
const httpRequest = httpCtx.req.http.req;
|
||||||
|
@ -399,38 +396,38 @@ module.exports = Self => {
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
|
||||||
let previousWorker = {name: $t('None')};
|
let previousDepartment = {name: $t('None'), chatName: $t('None')};
|
||||||
let currentWorker = {name: $t('None')};
|
let currentDepartment = {name: $t('None'), chatName: $t('None')};
|
||||||
if (previousWorkerId) {
|
if (previousDepartmentId) {
|
||||||
const worker = await models.Worker.findById(previousWorkerId, {
|
previousDepartment = await models.Department.findOne({
|
||||||
include: {relation: 'user'}
|
field: ['name', 'chatName'],
|
||||||
});
|
where: {
|
||||||
previousWorker.user = worker && worker.user().name;
|
id: previousDepartmentId
|
||||||
previousWorker.name = worker && worker.user().nickname;
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
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 fullUrl = `${url}client/${client.id}/basic-data`;
|
||||||
const message = $t('Client assignment has changed', {
|
const message = $t('Client assignment has changed', {
|
||||||
clientId: client.id,
|
clientId: client.id,
|
||||||
clientName: client.name,
|
clientName: client.name,
|
||||||
url: fullUrl,
|
url: fullUrl,
|
||||||
previousWorkerName: previousWorker.name,
|
previousDepartmentName: previousDepartment.name,
|
||||||
currentWorkerName: currentWorker.name
|
currentDepartmentName: currentDepartment.name
|
||||||
});
|
});
|
||||||
|
|
||||||
if (previousWorkerId)
|
if (previousDepartmentId)
|
||||||
await models.Chat.send(httpCtx, `@${previousWorker.user}`, message);
|
await models.Chat.send(httpCtx, `@${previousDepartment.chatName}`, message);
|
||||||
|
|
||||||
if (currentWorkerId)
|
if (currentDepartmentId)
|
||||||
await models.Chat.send(httpCtx, `@${currentWorker.user}`, message);
|
await models.Chat.send(httpCtx, `@${currentDepartment.chatName}`, message);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Credit change validations
|
// Credit change validations
|
||||||
|
|
|
@ -133,7 +133,7 @@
|
||||||
"columnName": "businessTypeFk"
|
"columnName": "businessTypeFk"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"salesPersonFk": {
|
"salesDepartmentFk": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
},
|
},
|
||||||
"hasElectronicInvoice": {
|
"hasElectronicInvoice": {
|
||||||
|
@ -163,10 +163,10 @@
|
||||||
"model": "PayMethod",
|
"model": "PayMethod",
|
||||||
"foreignKey": "payMethodFk"
|
"foreignKey": "payMethodFk"
|
||||||
},
|
},
|
||||||
"salesPersonUser": {
|
"salesDepartment": {
|
||||||
"type": "belongsTo",
|
"type": "belongsTo",
|
||||||
"model": "VnUser",
|
"model": "Department",
|
||||||
"foreignKey": "salesPersonFk"
|
"foreignKey": "salesDepartmentFk"
|
||||||
},
|
},
|
||||||
"province": {
|
"province": {
|
||||||
"type": "belongsTo",
|
"type": "belongsTo",
|
||||||
|
|
|
@ -51,9 +51,9 @@ module.exports = function(Self) {
|
||||||
const data = ctx.instance;
|
const data = ctx.instance;
|
||||||
const insurance = await Self.findById(data.id, null, options);
|
const insurance = await Self.findById(data.id, null, options);
|
||||||
const client = insurance.classification().customer();
|
const client = insurance.classification().customer();
|
||||||
const salesPerson = client.salesPersonUser();
|
const salesDepartment = client.salesDepartment();
|
||||||
|
|
||||||
if (!salesPerson) return;
|
if (!salesDepartment) return;
|
||||||
|
|
||||||
const httpRequest = httpCtx.req.http.req;
|
const httpRequest = httpCtx.req.http.req;
|
||||||
const $t = httpRequest.__;
|
const $t = httpRequest.__;
|
||||||
|
@ -65,6 +65,6 @@ module.exports = function(Self) {
|
||||||
credit: data.credit,
|
credit: data.credit,
|
||||||
url: fullPath
|
url: fullPath
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(httpCtx, salesPerson.id, message);
|
await models.Chat.send(httpCtx, `@${salesDepartment.chatName}`, message);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -41,11 +41,11 @@
|
||||||
"include": {
|
"include": {
|
||||||
"relation": "customer",
|
"relation": "customer",
|
||||||
"scope": {
|
"scope": {
|
||||||
"fields": ["name", "salesPersonFk"],
|
"fields": ["name", "salesDepartmentFk"],
|
||||||
"include": {
|
"include": {
|
||||||
"relation": "salesPersonUser",
|
"relation": "salesDepartment",
|
||||||
"scope": {
|
"scope": {
|
||||||
"fields": ["id", "name"]
|
"fields": ["id", "chatName"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,8 @@ describe('Client Model', () => {
|
||||||
const ctx = {req: activeCtx};
|
const ctx = {req: activeCtx};
|
||||||
const chatModel = models.Chat;
|
const chatModel = models.Chat;
|
||||||
const instance = {id: 1101, name: 'Bruce Banner'};
|
const instance = {id: 1101, name: 'Bruce Banner'};
|
||||||
const previousWorkerId = 1106; // DavidCharlesHaller
|
const previousDepartmetnId = 80; // es5_equipo
|
||||||
const currentWorkerId = 1107; // HankPym
|
const currentDepartmetnId = 94; // es2_equipo
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||||
|
@ -29,26 +29,26 @@ describe('Client Model', () => {
|
||||||
it('should call to the Chat send() method for both workers', async() => {
|
it('should call to the Chat send() method for both workers', async() => {
|
||||||
spyOn(chatModel, 'send').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
await models.Client.notifyAssignment(instance, previousWorkerId, currentWorkerId);
|
await models.Client.notifyAssignment(instance, previousDepartmetnId, currentDepartmetnId);
|
||||||
|
|
||||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@davidcharleshaller', `Client assignment has changed`);
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es5_equipo', `Client assignment has changed`);
|
||||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@hankpym', `Client assignment has changed`);
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es2_equipo', `Client assignment has changed`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call to the Chat send() method for the previous worker', async() => {
|
it('should call to the Chat send() method for the previous worker', async() => {
|
||||||
spyOn(chatModel, 'send').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
await models.Client.notifyAssignment(instance, null, currentWorkerId);
|
await models.Client.notifyAssignment(instance, null, currentDepartmetnId);
|
||||||
|
|
||||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@hankpym', `Client assignment has changed`);
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es2_equipo', `Client assignment has changed`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call to the Chat send() method for the current worker', async() => {
|
it('should call to the Chat send() method for the current worker', async() => {
|
||||||
spyOn(chatModel, 'send').and.callThrough();
|
spyOn(chatModel, 'send').and.callThrough();
|
||||||
|
|
||||||
await models.Client.notifyAssignment(instance, previousWorkerId, null);
|
await models.Client.notifyAssignment(instance, previousDepartmetnId, null);
|
||||||
|
|
||||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@davidcharleshaller', `Client assignment has changed`);
|
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@es5_equipo', `Client assignment has changed`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ module.exports = Self => {
|
||||||
description: 'The item description',
|
description: 'The item description',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'salesPersonFk',
|
arg: 'buyerFkFk',
|
||||||
type: 'integer',
|
type: 'integer',
|
||||||
description: 'The buyer of the item',
|
description: 'The buyer of the item',
|
||||||
},
|
},
|
||||||
|
@ -118,7 +118,7 @@ module.exports = Self => {
|
||||||
return {'i.description': {like: `%${value}%`}};
|
return {'i.description': {like: `%${value}%`}};
|
||||||
case 'categoryFk':
|
case 'categoryFk':
|
||||||
return {'ic.id': value};
|
return {'ic.id': value};
|
||||||
case 'salesPersonFk':
|
case 'buyerFk':
|
||||||
return {'it.workerFk': value};
|
return {'it.workerFk': value};
|
||||||
case 'supplierFk':
|
case 'supplierFk':
|
||||||
return {'s.id': value};
|
return {'s.id': value};
|
||||||
|
|
|
@ -41,7 +41,13 @@ module.exports = Self => {
|
||||||
include: {
|
include: {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'email', 'isToBeMailed', 'salesPersonFk']
|
fields: ['id', 'email', 'isToBeMailed', 'salesDepartmentFk'],
|
||||||
|
include: {
|
||||||
|
relation: 'salesDepartment',
|
||||||
|
scope: {
|
||||||
|
fields: ['id', 'chatName']
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, options);
|
}, options);
|
||||||
|
@ -63,11 +69,10 @@ module.exports = Self => {
|
||||||
clientId: client.id,
|
clientId: client.id,
|
||||||
clientUrl: `${url}claim/${id}/summary`
|
clientUrl: `${url}claim/${id}/summary`
|
||||||
});
|
});
|
||||||
const salesPersonId = client.salesPersonFk;
|
|
||||||
|
|
||||||
if (salesPersonId)
|
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPersonId, message);
|
|
||||||
|
|
||||||
|
const salesDepartment = ticket.client().salesDepartment();
|
||||||
|
if (salesDepartment)
|
||||||
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message);
|
||||||
throw new UserError('Error when sending mail to client', 'mailNotSent');
|
throw new UserError('Error when sending mail to client', 'mailNotSent');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -62,22 +62,20 @@ module.exports = Self => {
|
||||||
cou.name country,
|
cou.name country,
|
||||||
c.id clientId,
|
c.id clientId,
|
||||||
c.socialName clientSocialName,
|
c.socialName clientSocialName,
|
||||||
u.nickname workerSocialName,
|
|
||||||
SUM(s.quantity * s.price * ( 100 - s.discount ) / 100) amount,
|
SUM(s.quantity * s.price * ( 100 - s.discount ) / 100) amount,
|
||||||
negativeBase.taxableBase,
|
negativeBase.taxableBase,
|
||||||
negativeBase.ticketFk,
|
negativeBase.ticketFk,
|
||||||
c.isActive,
|
c.isActive,
|
||||||
c.hasToInvoice,
|
c.hasToInvoice,
|
||||||
c.isTaxDataChecked,
|
c.isTaxDataChecked,
|
||||||
w.id comercialId,
|
c.salesDepartmentFk,
|
||||||
u.name workerName
|
d.name salesDepartmentName
|
||||||
FROM vn.ticket t
|
FROM vn.ticket t
|
||||||
JOIN vn.company co ON co.id = t.companyFk
|
JOIN vn.company co ON co.id = t.companyFk
|
||||||
JOIN vn.sale s ON s.ticketFk = t.id
|
JOIN vn.sale s ON s.ticketFk = t.id
|
||||||
JOIN vn.client c ON c.id = t.clientFk
|
JOIN vn.client c ON c.id = t.clientFk
|
||||||
JOIN vn.country cou ON cou.id = c.countryFk
|
JOIN vn.country cou ON cou.id = c.countryFk
|
||||||
LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
|
JOIN vn.department d ON d.id = c.salesDepartmentFk
|
||||||
JOIN account.user u ON u.id = w.id
|
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT ticketFk, taxableBase
|
SELECT ticketFk, taxableBase
|
||||||
FROM tmp.ticketAmount
|
FROM tmp.ticketAmount
|
||||||
|
|
|
@ -34,31 +34,24 @@ module.exports = Self => {
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const date = Date.vnNew();
|
|
||||||
date.setHours(0, 0, 0, 0);
|
|
||||||
const stmt = new ParameterizedSQL(`
|
const stmt = new ParameterizedSQL(`
|
||||||
SELECT
|
SELECT v.id,
|
||||||
v.id,
|
d.name salesDepartment,
|
||||||
u.name AS salesPerson,
|
c.salesDepartmentFk,
|
||||||
IFNULL(sc.workerSubstitute, c.salesPersonFk) AS salesPersonFk,
|
c.id clientFk,
|
||||||
c.id AS clientFk,
|
c.name clientName,
|
||||||
c.name AS clientName,
|
TIME(v.stamp) hour,
|
||||||
TIME(v.stamp) AS hour,
|
DATE(v.stamp) dated,
|
||||||
DATE(v.stamp) AS dated,
|
wd.workerFk
|
||||||
wtc.workerFk
|
|
||||||
FROM hedera.visitUser v
|
FROM hedera.visitUser v
|
||||||
JOIN client c ON c.id = v.userFk
|
JOIN client c ON c.id = v.userFk
|
||||||
JOIN account.user u ON c.salesPersonFk = u.id
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
LEFT JOIN sharingCart sc ON sc.workerFk = c.salesPersonFk
|
LEFT JOIN workerDepartment wd ON wd.departmentFk = d.id`);
|
||||||
AND ? BETWEEN sc.started AND sc.ended
|
|
||||||
LEFT JOIN workerTeamCollegues wtc
|
|
||||||
ON wtc.collegueFk = IFNULL(sc.workerSubstitute, c.salesPersonFk)`,
|
|
||||||
[date]);
|
|
||||||
|
|
||||||
if (!filter.where) filter.where = {};
|
if (!filter.where) filter.where = {};
|
||||||
|
|
||||||
const where = filter.where;
|
const where = filter.where;
|
||||||
where['wtc.workerFk'] = userId;
|
where['wd.workerFk'] = userId;
|
||||||
|
|
||||||
stmt.merge(conn.makeWhere(filter.where));
|
stmt.merge(conn.makeWhere(filter.where));
|
||||||
stmt.merge(`GROUP BY clientFk, v.stamp`);
|
stmt.merge(`GROUP BY clientFk, v.stamp`);
|
||||||
|
|
|
@ -36,32 +36,30 @@ module.exports = Self => {
|
||||||
|
|
||||||
const stmt = new ParameterizedSQL(`
|
const stmt = new ParameterizedSQL(`
|
||||||
SELECT
|
SELECT
|
||||||
c.id AS clientFk,
|
c.id clientFk,
|
||||||
c.name AS clientName,
|
c.name clientName,
|
||||||
a.nickname,
|
a.nickname,
|
||||||
o.id,
|
o.id,
|
||||||
o.date_make,
|
o.date_make,
|
||||||
o.date_send,
|
o.date_send,
|
||||||
o.customer_id,
|
o.customer_id,
|
||||||
COUNT(item_id) AS totalRows,
|
COUNT(item_id) totalRows,
|
||||||
ROUND(SUM(amount * price)) * 1 AS import,
|
ROUND(SUM(amount * price)) * 1 import,
|
||||||
u.id AS salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
u.name AS salesPerson,
|
d.name salesDepartment,
|
||||||
am.name AS agencyName
|
am.name agencyName
|
||||||
FROM hedera.order o
|
FROM hedera.order o
|
||||||
JOIN hedera.order_row orw ON o.id = orw.order_id
|
JOIN hedera.order_row orw ON o.id = orw.order_id
|
||||||
JOIN client c ON c.id = o.customer_id
|
JOIN client c ON c.id = o.customer_id
|
||||||
JOIN address a ON a.id = o.address_id
|
JOIN address a ON a.id = o.address_id
|
||||||
JOIN agencyMode am ON am.id = o.agency_id
|
JOIN agencyMode am ON am.id = o.agency_id
|
||||||
JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk`);
|
||||||
JOIN workerTeamCollegues wtc ON c.salesPersonFk = wtc.collegueFk`);
|
|
||||||
|
|
||||||
if (!filter.where) filter.where = {};
|
if (!filter.where) filter.where = {};
|
||||||
|
|
||||||
const where = filter.where;
|
const where = filter.where;
|
||||||
where['o.confirmed'] = false;
|
where['o.confirmed'] = false;
|
||||||
where['o.date_send'] = {gt: '2001-01-01'};
|
where['o.date_send'] = {gt: '2001-01-01'};
|
||||||
where['wtc.workerFk'] = userId;
|
|
||||||
|
|
||||||
stmt.merge(conn.makeWhere(filter.where));
|
stmt.merge(conn.makeWhere(filter.where));
|
||||||
stmt.merge(conn.makeGroupBy('o.id'));
|
stmt.merge(conn.makeGroupBy('o.id'));
|
||||||
|
|
|
@ -49,9 +49,9 @@ module.exports = Self => {
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: `The warehouse id filter`
|
description: `The warehouse id filter`
|
||||||
}, {
|
}, {
|
||||||
arg: 'salesPersonFk',
|
arg: 'salesDepartmentFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: `The salesperson id filter`
|
description: `The salesDepartment id filter`
|
||||||
}, {
|
}, {
|
||||||
arg: 'provinceFk',
|
arg: 'provinceFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
|
@ -60,10 +60,6 @@ module.exports = Self => {
|
||||||
arg: 'stateFk',
|
arg: 'stateFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: `The state id filter`
|
description: `The state id filter`
|
||||||
}, {
|
|
||||||
arg: 'myTeam',
|
|
||||||
type: 'boolean',
|
|
||||||
description: `Whether to show only tickets for the current logged user team (currently user tickets)`
|
|
||||||
}, {
|
}, {
|
||||||
arg: 'problems',
|
arg: 'problems',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
|
@ -112,22 +108,6 @@ module.exports = Self => {
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
// Apply filter by team
|
|
||||||
const teamMembersId = [];
|
|
||||||
if (args.myTeam != null) {
|
|
||||||
const worker = await models.Worker.findById(userId, {
|
|
||||||
include: {
|
|
||||||
relation: 'collegues'
|
|
||||||
}
|
|
||||||
}, myOptions);
|
|
||||||
const collegues = worker.collegues() || [];
|
|
||||||
for (let collegue of collegues)
|
|
||||||
teamMembersId.push(collegue.collegueFk);
|
|
||||||
|
|
||||||
if (teamMembersId.length == 0)
|
|
||||||
teamMembersId.push(userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctx.args && args.to) {
|
if (ctx.args && args.to) {
|
||||||
const dateTo = args.to;
|
const dateTo = args.to;
|
||||||
dateTo.setHours(23, 59, 0, 0);
|
dateTo.setHours(23, 59, 0, 0);
|
||||||
|
@ -143,15 +123,8 @@ module.exports = Self => {
|
||||||
return {'t.shipped': {gte: value}};
|
return {'t.shipped': {gte: value}};
|
||||||
case 'to':
|
case 'to':
|
||||||
return {'t.shipped': {lte: value}};
|
return {'t.shipped': {lte: value}};
|
||||||
case 'salesPersonFk':
|
case 'salesDepartmentFk':
|
||||||
return {'c.salesPersonFk': value};
|
return value ? {'c.salesDepartmentFk': value} : {};
|
||||||
case 'mine':
|
|
||||||
case 'myTeam':
|
|
||||||
if (value)
|
|
||||||
return {'c.salesPersonFk': {inq: teamMembersId}};
|
|
||||||
else
|
|
||||||
return {'c.salesPersonFk': {nin: teamMembersId}};
|
|
||||||
case 'id':
|
|
||||||
case 'clientFk':
|
case 'clientFk':
|
||||||
param = `t.${param}`;
|
param = `t.${param}`;
|
||||||
return {[param]: value};
|
return {[param]: value};
|
||||||
|
@ -187,12 +160,11 @@ module.exports = Self => {
|
||||||
am.name agencyMode,
|
am.name agencyMode,
|
||||||
am.id agencyModeFk,
|
am.id agencyModeFk,
|
||||||
st.name state,
|
st.name state,
|
||||||
wk.lastName salesPerson,
|
d.name salesDepartmentName,
|
||||||
ts.stateFk stateFk,
|
ts.stateFk stateFk,
|
||||||
ts.alertLevel alertLevel,
|
ts.alertLevel alertLevel,
|
||||||
ts.code alertLevelCode,
|
ts.code alertLevelCode,
|
||||||
u.name userName,
|
c.salesDepartmentFk,
|
||||||
c.salesPersonFk,
|
|
||||||
c.credit,
|
c.credit,
|
||||||
z.hour zoneLanding,
|
z.hour zoneLanding,
|
||||||
z.name zoneName,
|
z.name zoneName,
|
||||||
|
@ -211,8 +183,7 @@ module.exports = Self => {
|
||||||
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
LEFT JOIN state st ON st.id = ts.stateFk
|
LEFT JOIN state st ON st.id = ts.stateFk
|
||||||
LEFT JOIN client c ON c.id = t.clientFk
|
LEFT JOIN client c ON c.id = t.clientFk
|
||||||
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
LEFT JOIN account.user u ON u.id = wk.id
|
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT zoneFk,
|
SELECT zoneFk,
|
||||||
CAST(
|
CAST(
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe('SalesMonitor clientsFilter()', () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
const ctx = {req: {accessToken: {userId: 18}}, args: {}};
|
const ctx = {req: {accessToken: {}}, args: {}};
|
||||||
|
|
||||||
const from = Date.vnNew();
|
const from = Date.vnNew();
|
||||||
const to = Date.vnNew();
|
const to = Date.vnNew();
|
||||||
|
@ -20,7 +20,7 @@ describe('SalesMonitor clientsFilter()', () => {
|
||||||
};
|
};
|
||||||
const result = await models.SalesMonitor.clientsFilter(ctx, filter, options);
|
const result = await models.SalesMonitor.clientsFilter(ctx, filter, options);
|
||||||
|
|
||||||
expect(result.length).toEqual(3);
|
expect(result.length).toEqual(1);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -34,7 +34,7 @@ describe('SalesMonitor clientsFilter()', () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
const ctx = {req: {accessToken: {userId: 18}}, args: {}};
|
const ctx = {req: {accessToken: {}}, args: {}};
|
||||||
const yesterday = Date.vnNew();
|
const yesterday = Date.vnNew();
|
||||||
yesterday.setDate(yesterday.getDate() - 1);
|
yesterday.setDate(yesterday.getDate() - 1);
|
||||||
const today = Date.vnNew();
|
const today = Date.vnNew();
|
||||||
|
@ -42,13 +42,15 @@ describe('SalesMonitor clientsFilter()', () => {
|
||||||
today.setHours(23, 59, 59, 59);
|
today.setHours(23, 59, 59, 59);
|
||||||
|
|
||||||
const filter = {
|
const filter = {
|
||||||
|
|
||||||
where: {
|
where: {
|
||||||
'v.stamp': {between: [yesterday, today]}
|
'v.stamp': {between: [yesterday, today]}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = await models.SalesMonitor.clientsFilter(ctx, filter, options);
|
const result = await models.SalesMonitor.clientsFilter(ctx, filter, options);
|
||||||
|
|
||||||
expect(result.length).toEqual(5);
|
expect(result.length).toEqual(2);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -11,7 +11,7 @@ describe('SalesMonitor ordersFilter()', () => {
|
||||||
const filter = {order: 'date_make DESC'};
|
const filter = {order: 'date_make DESC'};
|
||||||
const result = await models.SalesMonitor.ordersFilter(ctx, filter, options);
|
const result = await models.SalesMonitor.ordersFilter(ctx, filter, options);
|
||||||
|
|
||||||
expect(result.length).toEqual(12);
|
expect(result.length).toEqual(15);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -161,7 +161,7 @@ describe('SalesMonitor salesFilter()', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should now return the tickets from the worker team', async() => {
|
it('should now return the tickets from the worker department', async() => {
|
||||||
const tx = await models.SalesMonitor.beginTransaction({});
|
const tx = await models.SalesMonitor.beginTransaction({});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -180,25 +180,6 @@ describe('SalesMonitor salesFilter()', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should now return the tickets that are not from the worker team', async() => {
|
|
||||||
const tx = await models.SalesMonitor.beginTransaction({});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const options = {transaction: tx};
|
|
||||||
|
|
||||||
const ctx = {req: {accessToken: {userId: 18}}, args: {myTeam: false}};
|
|
||||||
const filter = {};
|
|
||||||
const result = await models.SalesMonitor.salesFilter(ctx, filter, options);
|
|
||||||
|
|
||||||
expect(result.length).toEqual(4);
|
|
||||||
|
|
||||||
await tx.rollback();
|
|
||||||
} catch (e) {
|
|
||||||
await tx.rollback();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return the tickets sorted by problems descendant', async() => {
|
it('should return the tickets sorted by problems descendant', async() => {
|
||||||
const tx = await models.SalesMonitor.beginTransaction({});
|
const tx = await models.SalesMonitor.beginTransaction({});
|
||||||
|
|
||||||
|
|
|
@ -44,13 +44,9 @@ module.exports = Self => {
|
||||||
type: 'integer',
|
type: 'integer',
|
||||||
description: 'The agency mode id'
|
description: 'The agency mode id'
|
||||||
}, {
|
}, {
|
||||||
arg: 'workerFk',
|
arg: 'departmentFk',
|
||||||
type: 'integer',
|
type: 'integer',
|
||||||
description: 'The salesperson id'
|
description: 'The department id'
|
||||||
}, {
|
|
||||||
arg: 'myTeam',
|
|
||||||
type: 'boolean',
|
|
||||||
description: 'Whether to show only tickets for the current logged user team (currently user tickets)'
|
|
||||||
}, {
|
}, {
|
||||||
arg: 'isConfirmed',
|
arg: 'isConfirmed',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
|
@ -79,26 +75,6 @@ module.exports = Self => {
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const args = ctx.args;
|
const args = ctx.args;
|
||||||
|
|
||||||
// Apply filter by team
|
|
||||||
const teamMembersId = [];
|
|
||||||
if (args.myTeam != null) {
|
|
||||||
const worker = await models.Worker.findById(userId, {
|
|
||||||
include: {
|
|
||||||
relation: 'collegues'
|
|
||||||
}
|
|
||||||
}, myOptions);
|
|
||||||
const collegues = worker.collegues() || [];
|
|
||||||
for (let collegue of collegues)
|
|
||||||
teamMembersId.push(collegue.collegueFk);
|
|
||||||
|
|
||||||
if (teamMembersId.length == 0)
|
|
||||||
teamMembersId.push(userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args && args.myTeam)
|
|
||||||
args.teamIds = teamIds;
|
|
||||||
|
|
||||||
const where = buildFilter(args, (param, value) => {
|
const where = buildFilter(args, (param, value) => {
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case 'search':
|
case 'search':
|
||||||
|
@ -111,8 +87,8 @@ module.exports = Self => {
|
||||||
return {'o.date_send': {gte: value}};
|
return {'o.date_send': {gte: value}};
|
||||||
case 'to':
|
case 'to':
|
||||||
return {'o.date_send': {lte: value}};
|
return {'o.date_send': {lte: value}};
|
||||||
case 'workerFk':
|
case 'departmentFk':
|
||||||
return {'c.salesPersonFk': value};
|
return {'c.salesDepartmentFk': value};
|
||||||
case 'clientFk':
|
case 'clientFk':
|
||||||
return {'o.customer_id': value};
|
return {'o.customer_id': value};
|
||||||
case 'agencyModeFk':
|
case 'agencyModeFk':
|
||||||
|
@ -123,11 +99,6 @@ module.exports = Self => {
|
||||||
return {'o.id': value};
|
return {'o.id': value};
|
||||||
case 'isConfirmed':
|
case 'isConfirmed':
|
||||||
return {'o.confirmed': value ? 1 : 0};
|
return {'o.confirmed': value ? 1 : 0};
|
||||||
case 'myTeam':
|
|
||||||
if (value)
|
|
||||||
return {'c.salesPersonFk': {inq: teamMembersId}};
|
|
||||||
else
|
|
||||||
return {'c.salesPersonFk': {nin: teamMembersId}};
|
|
||||||
case 'showEmpty':
|
case 'showEmpty':
|
||||||
return {'o.total': {neq: value}};
|
return {'o.total': {neq: value}};
|
||||||
case 'id':
|
case 'id':
|
||||||
|
@ -157,9 +128,8 @@ module.exports = Self => {
|
||||||
o.source_app sourceApp,
|
o.source_app sourceApp,
|
||||||
o.confirmed isConfirmed,
|
o.confirmed isConfirmed,
|
||||||
c.name clientName,
|
c.name clientName,
|
||||||
c.salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
u.nickname workerNickname,
|
d.name salesDepartmentName,
|
||||||
u.name name,
|
|
||||||
co.code companyCode,
|
co.code companyCode,
|
||||||
zed.zoneFk,
|
zed.zoneFk,
|
||||||
zed.hourTheoretical,
|
zed.hourTheoretical,
|
||||||
|
@ -169,11 +139,10 @@ module.exports = Self => {
|
||||||
LEFT JOIN address a ON a.id = o.address_id
|
LEFT JOIN address a ON a.id = o.address_id
|
||||||
LEFT JOIN agencyMode am ON am.id = o.agency_id
|
LEFT JOIN agencyMode am ON am.id = o.agency_id
|
||||||
LEFT JOIN client c ON c.id = o.customer_id
|
LEFT JOIN client c ON c.id = o.customer_id
|
||||||
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
|
|
||||||
LEFT JOIN account.user u ON u.id = wk.id
|
|
||||||
LEFT JOIN company co ON co.id = o.company_id
|
LEFT JOIN company co ON co.id = o.company_id
|
||||||
LEFT JOIN orderTicket ot ON ot.orderFk = o.id
|
LEFT JOIN orderTicket ot ON ot.orderFk = o.id
|
||||||
LEFT JOIN ticket t ON t.id = ot.ticketFk
|
LEFT JOIN ticket t ON t.id = ot.ticketFk
|
||||||
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT zoneFk,
|
SELECT zoneFk,
|
||||||
CAST(
|
CAST(
|
||||||
|
|
|
@ -41,9 +41,9 @@ module.exports = Self => {
|
||||||
{
|
{
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['salesPersonFk', 'name'],
|
fields: ['salesDepartmentFk', 'name'],
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ module.exports = Self => {
|
||||||
a.city,
|
a.city,
|
||||||
am.name agencyModeName,
|
am.name agencyModeName,
|
||||||
u.nickname userNickname,
|
u.nickname userNickname,
|
||||||
vn.ticketTotalVolume(t.id) volume,
|
ticketTotalVolume(t.id) volume,
|
||||||
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) ipt,
|
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) ipt,
|
||||||
c.phone clientPhone,
|
c.phone clientPhone,
|
||||||
c.mobile clientMobile,
|
c.mobile clientMobile,
|
||||||
|
@ -59,14 +59,14 @@ module.exports = Self => {
|
||||||
a.mobile addressMobile,
|
a.mobile addressMobile,
|
||||||
a.longitude,
|
a.longitude,
|
||||||
a.latitude,
|
a.latitude,
|
||||||
wm.mediaValue salePersonPhone,
|
d.pbxQueue saleDepartmentPhone,
|
||||||
t.cmrFk,
|
t.cmrFk,
|
||||||
t.isSigned signed
|
t.isSigned signed
|
||||||
FROM vn.route r
|
FROM vn.route r
|
||||||
JOIN ticket t ON t.routeFk = r.id
|
JOIN ticket t ON t.routeFk = r.id
|
||||||
JOIN client c ON t.clientFk = c.id
|
JOIN client c ON t.clientFk = c.id
|
||||||
LEFT JOIN vn.sale s ON s.ticketFk = t.id
|
LEFT JOIN sale s ON s.ticketFk = t.id
|
||||||
LEFT JOIN vn.item i ON i.id = s.itemFk
|
LEFT JOIN item i ON i.id = s.itemFk
|
||||||
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
LEFT JOIN state st ON st.id = ts.stateFk
|
LEFT JOIN state st ON st.id = ts.stateFk
|
||||||
LEFT JOIN warehouse wh ON wh.id = t.warehouseFk
|
LEFT JOIN warehouse wh ON wh.id = t.warehouseFk
|
||||||
|
@ -80,7 +80,7 @@ module.exports = Self => {
|
||||||
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||||
LEFT JOIN account.user u ON u.id = r.workerFk
|
LEFT JOIN account.user u ON u.id = r.workerFk
|
||||||
LEFT JOIN vehicle v ON v.id = r.vehicleFk
|
LEFT JOIN vehicle v ON v.id = r.vehicleFk
|
||||||
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk`
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk`
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!filter.where) filter.where = {};
|
if (!filter.where) filter.where = {};
|
||||||
|
|
|
@ -48,9 +48,9 @@ module.exports = Self => {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'chatName']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,11 +67,10 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const deletedSales = await Promise.all(promises);
|
const deletedSales = await Promise.all(promises);
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
||||||
const salesPerson = ticket.client().salesPersonUser();
|
const salesDepartment = ticket.client().salesDepartment();
|
||||||
if (salesPerson) {
|
if (salesDepartment) {
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
|
|
||||||
const message = $t('Deleted sales from ticket', {
|
const message = $t('Deleted sales from ticket', {
|
||||||
|
@ -79,7 +78,7 @@ module.exports = Self => {
|
||||||
ticketUrl: `${url}ticket/${ticketId}/sale`,
|
ticketUrl: `${url}ticket/${ticketId}/sale`,
|
||||||
deletions: deletions
|
deletions: deletions
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message, myOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
return deletedSales;
|
return deletedSales;
|
||||||
|
|
|
@ -50,7 +50,7 @@ module.exports = Self => {
|
||||||
saldo: sale.quantity,
|
saldo: sale.quantity,
|
||||||
trabajador: sale.workerCode,
|
trabajador: sale.workerCode,
|
||||||
idMovimiento: sale.saleFk,
|
idMovimiento: sale.saleFk,
|
||||||
salesPersonFk: sale.salesPersonFk,
|
salesDepartmentFk: sale.salesDepartmentFk,
|
||||||
picked: sale.pickedQuantity,
|
picked: sale.pickedQuantity,
|
||||||
carros
|
carros
|
||||||
});
|
});
|
||||||
|
|
|
@ -74,17 +74,17 @@ module.exports = Self => {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'chatName']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
const salesPerson = ticket.client().salesPersonUser();
|
const salesDepartment = ticket.client().salesDepartment();
|
||||||
if (salesPerson) {
|
if (salesDepartment) {
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
|
|
||||||
const message = $t('Changed sale reserved state', {
|
const message = $t('Changed sale reserved state', {
|
||||||
|
@ -92,7 +92,7 @@ module.exports = Self => {
|
||||||
ticketUrl: `${url}ticket/${ticketId}/sale`,
|
ticketUrl: `${url}ticket/${ticketId}/sale`,
|
||||||
changes: changesMade
|
changes: changesMade
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message, myOptions);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName.chatName}`, message, myOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
|
const {ConsoleReporter} = require('jasmine');
|
||||||
const LoopBackContext = require('loopback-context');
|
const LoopBackContext = require('loopback-context');
|
||||||
|
|
||||||
describe('sale updatePrice()', () => {
|
describe('sale updatePrice()', () => {
|
||||||
|
@ -85,14 +86,16 @@ describe('sale updatePrice()', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set price as a decimal number and check the sale has the mana component changing the salesPersonMana', async() => {
|
it(`should set price as a decimal number and check the sale
|
||||||
|
has the mana component changing the SalesDepartmentMana`, async() => {
|
||||||
const tx = await models.Sale.beginTransaction({});
|
const tx = await models.Sale.beginTransaction({});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
const departmentId = 80;
|
||||||
|
|
||||||
const price = 5.4;
|
const price = 5.4;
|
||||||
const originalSalesPersonMana = await models.WorkerMana.findById(18, null, options);
|
const originalSalesDepartmentMana = await models.DepartmentMana.findById(departmentId, null, options);
|
||||||
const manaComponent = await models.Component.findOne({where: {code: 'mana'}}, options);
|
const manaComponent = await models.Component.findOne({where: {code: 'mana'}}, options);
|
||||||
const teamOne = 96;
|
const teamOne = 96;
|
||||||
const userId = ctx.req.accessToken.userId;
|
const userId = ctx.req.accessToken.userId;
|
||||||
|
@ -110,9 +113,9 @@ describe('sale updatePrice()', () => {
|
||||||
expect(updatedSale.price).toBe(price);
|
expect(updatedSale.price).toBe(price);
|
||||||
expect(createdSaleComponent.value).toEqual(-2.34);
|
expect(createdSaleComponent.value).toEqual(-2.34);
|
||||||
|
|
||||||
const updatedSalesPersonMana = await models.WorkerMana.findById(18, null, options);
|
const updatedSalesDepartmentMana = await models.DepartmentMana.findById(departmentId, null, options);
|
||||||
|
|
||||||
expect(updatedSalesPersonMana.amount).not.toEqual(originalSalesPersonMana.amount);
|
expect(updatedSalesDepartmentMana?.amount).not.toEqual(originalSalesDepartmentMana?.amount);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -45,14 +45,13 @@ describe('sale usesMana()', () => {
|
||||||
it('should return that the worker does not use mana because it is excluded', async() => {
|
it('should return that the worker does not use mana because it is excluded', async() => {
|
||||||
const tx = await models.Sale.beginTransaction({});
|
const tx = await models.Sale.beginTransaction({});
|
||||||
const buyerId = 35;
|
const buyerId = 35;
|
||||||
const franceDepartmentId = 133;
|
|
||||||
const buyerCtx = {req: {accessToken: {userId: buyerId}}};
|
const buyerCtx = {req: {accessToken: {userId: buyerId}}};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx}
|
const options = {transaction: tx};
|
||||||
|
|
||||||
await models.WorkerManaExcluded.create({workerFk: buyerId}, options);
|
const {departmentFk} = await models.WorkerDepartment.findById(buyerId, null, options);
|
||||||
await models.Business.updateAll({workerFk: buyerId}, {departmentFk: franceDepartmentId}, options);
|
await models.DepartmentManaExcluded.create({'salesDepartmentFk': departmentFk}, options);
|
||||||
|
|
||||||
const usesMana = await models.Sale.usesMana(buyerCtx, options);
|
const usesMana = await models.Sale.usesMana(buyerCtx, options);
|
||||||
|
|
||||||
|
|
|
@ -48,11 +48,10 @@ module.exports = Self => {
|
||||||
include: {
|
include: {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['salesPersonFk'],
|
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'chatName']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,22 +62,16 @@ module.exports = Self => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const sale = await models.Sale.findById(id, filter, myOptions);
|
const sale = await models.Sale.findById(id, filter, myOptions);
|
||||||
|
|
||||||
await models.Sale.canEdit(ctx, [id], myOptions);
|
await models.Sale.canEdit(ctx, [id], myOptions);
|
||||||
|
|
||||||
const oldPrice = sale.price;
|
const oldPrice = sale.price;
|
||||||
const userId = ctx.req.accessToken.userId;
|
|
||||||
|
|
||||||
const usesMana = await models.Sale.usesMana(ctx, myOptions);
|
const usesMana = await models.Sale.usesMana(ctx, myOptions);
|
||||||
const componentCode = usesMana ? 'mana' : 'buyerDiscount';
|
const componentCode = usesMana ? 'mana' : 'buyerDiscount';
|
||||||
const discount = await models.Component.findOne({where: {code: componentCode}}, myOptions);
|
const discount = await models.Component.findOne({where: {code: componentCode}}, myOptions);
|
||||||
const componentId = discount.id;
|
const componentId = discount.id;
|
||||||
const componentValue = newPrice - sale.price;
|
const componentValue = newPrice - sale.price;
|
||||||
|
|
||||||
const where = {
|
const where = {componentFk: componentId, saleFk: id};
|
||||||
componentFk: componentId,
|
|
||||||
saleFk: id
|
|
||||||
};
|
|
||||||
const saleComponent = await models.SaleComponent.findOne({where}, myOptions);
|
const saleComponent = await models.SaleComponent.findOne({where}, myOptions);
|
||||||
if (saleComponent) {
|
if (saleComponent) {
|
||||||
await models.SaleComponent.updateAll(where, {
|
await models.SaleComponent.updateAll(where, {
|
||||||
|
@ -92,12 +85,12 @@ module.exports = Self => {
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
}
|
}
|
||||||
await sale.updateAttributes({price: newPrice}, myOptions);
|
await sale.updateAttributes({price: newPrice}, myOptions);
|
||||||
|
const salesDepartment = sale.ticket().client().salesDepartment();
|
||||||
|
|
||||||
await Self.rawSql('CALL vn.manaSpellersRequery(?)', [userId], myOptions);
|
await Self.rawSql('CALL vn.manaSpellers_requery(?)', [salesDepartment.id], myOptions);
|
||||||
await Self.rawSql('CALL vn.ticket_recalc(?, NULL)', [sale.ticketFk], myOptions);
|
await Self.rawSql('CALL vn.ticket_recalc(?, NULL)', [sale.ticketFk], myOptions);
|
||||||
|
|
||||||
const salesPerson = sale.ticket().client().salesPersonUser();
|
if (salesDepartment) {
|
||||||
if (salesPerson) {
|
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
const message = $t('Changed sale price', {
|
const message = $t('Changed sale price', {
|
||||||
ticketId: sale.ticket().id,
|
ticketId: sale.ticket().id,
|
||||||
|
@ -109,7 +102,7 @@ module.exports = Self => {
|
||||||
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
|
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
|
||||||
itemUrl: `${url}item/${sale.itemFk}/summary`
|
itemUrl: `${url}item/${sale.itemFk}/summary`
|
||||||
});
|
});
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message, myOptions);
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message, myOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
|
@ -50,9 +50,9 @@ module.exports = Self => {
|
||||||
relation: 'client',
|
relation: 'client',
|
||||||
scope: {
|
scope: {
|
||||||
include: {
|
include: {
|
||||||
relation: 'salesPersonUser',
|
relation: 'salesDepartment',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'chatName']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,8 @@ module.exports = Self => {
|
||||||
originalQuantity: newQuantity
|
originalQuantity: newQuantity
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
const salesPerson = sale.ticket().client().salesPersonUser();
|
const salesDepartment = sale.ticket().client().salesDepartment();
|
||||||
if (salesPerson) {
|
if (salesDepartment) {
|
||||||
const url = await Self.app.models.Url.getUrl();
|
const url = await Self.app.models.Url.getUrl();
|
||||||
const change = $t('Changes in sales', {
|
const change = $t('Changes in sales', {
|
||||||
itemId: sale.itemFk,
|
itemId: sale.itemFk,
|
||||||
|
@ -85,8 +85,7 @@ module.exports = Self => {
|
||||||
changes: change,
|
changes: change,
|
||||||
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
|
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
|
||||||
});
|
});
|
||||||
|
await models.Chat.send(ctx, `@${salesDepartment.chatName}`, message, myOptions);
|
||||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message, myOptions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
|
@ -21,15 +21,16 @@ module.exports = Self => {
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const isManaExcluded = await models.WorkerManaExcluded.findById(userId, null, myOptions);
|
const {departmentFk} = await models.WorkerDepartment.findById(userId, null, myOptions);
|
||||||
|
const isManaExcluded = await models.DepartmentManaExcluded.findById(departmentFk, null, myOptions);
|
||||||
|
|
||||||
if (isManaExcluded) return false;
|
if (isManaExcluded) return false;
|
||||||
|
|
||||||
const salesDepartment = await models.Department.findOne({where: {code: 'VT'}, fields: 'id'}, myOptions);
|
const salesDepartment = await models.Department.findOne({where: {code: 'VT'}, fields: 'id'}, myOptions);
|
||||||
const departments = await models.Department.getLeaves(ctx, salesDepartment.id, null, myOptions);
|
const departments = await models.Department.getLeaves(ctx, salesDepartment.id, null, myOptions);
|
||||||
const workerDepartment = await models.WorkerDepartment.findById(userId, null, myOptions);
|
if (!departmentFk) return false;
|
||||||
if (!workerDepartment) return false;
|
|
||||||
|
|
||||||
const usesMana = departments.find(department => department.id == workerDepartment.departmentFk);
|
const usesMana = departments.find(department => department.id == departmentFk);
|
||||||
|
|
||||||
return usesMana ? true : false;
|
return usesMana ? true : false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -111,8 +111,8 @@ module.exports = Self => {
|
||||||
return {'t.shipped': {lte: value}};
|
return {'t.shipped': {lte: value}};
|
||||||
case 'warehouse':
|
case 'warehouse':
|
||||||
return {'w.id': value};
|
return {'w.id': value};
|
||||||
case 'salesPersonFk':
|
case 'salesDepartmentFk':
|
||||||
return {'c.salesPersonFk': value};
|
return {'c.salesDepartmentFk': value};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -143,9 +143,9 @@ module.exports = Self => {
|
||||||
t.warehouseFk,
|
t.warehouseFk,
|
||||||
t.clientFk,
|
t.clientFk,
|
||||||
w.name warehouse,
|
w.name warehouse,
|
||||||
u.nickname salesPersonNickname,
|
d.name salesDepartmentName,
|
||||||
ua.name attenderName,
|
ua.name attenderName,
|
||||||
c.salesPersonFk,
|
c.salesDepartmentFk,
|
||||||
ua2.name requesterName
|
ua2.name requesterName
|
||||||
FROM ticketRequest tr
|
FROM ticketRequest tr
|
||||||
LEFT JOIN ticketWeekly tw on tw.ticketFk = tr.ticketFk
|
LEFT JOIN ticketWeekly tw on tw.ticketFk = tr.ticketFk
|
||||||
|
@ -154,8 +154,7 @@ module.exports = Self => {
|
||||||
LEFT JOIN client c ON c.id = t.clientFk
|
LEFT JOIN client c ON c.id = t.clientFk
|
||||||
LEFT JOIN item i ON i.id = tr.itemFk
|
LEFT JOIN item i ON i.id = tr.itemFk
|
||||||
LEFT JOIN sale s ON s.id = tr.saleFk
|
LEFT JOIN sale s ON s.id = tr.saleFk
|
||||||
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk
|
||||||
LEFT JOIN account.user u ON u.id = wk.id
|
|
||||||
LEFT JOIN worker wka ON wka.id = tr.attenderFk
|
LEFT JOIN worker wka ON wka.id = tr.attenderFk
|
||||||
LEFT JOIN account.user ua ON ua.id = wka.id
|
LEFT JOIN account.user ua ON ua.id = wka.id
|
||||||
LEFT JOIN account.user ua2 ON ua2.id = tr.requesterFk`);
|
LEFT JOIN account.user ua2 ON ua2.id = tr.requesterFk`);
|
||||||
|
|
|
@ -53,13 +53,13 @@ module.exports = Self => {
|
||||||
const stmts = [];
|
const stmts = [];
|
||||||
|
|
||||||
const stmt = new ParameterizedSQL(
|
const stmt = new ParameterizedSQL(
|
||||||
`SELECT t.id AS ticketFk, c.id AS clientFk, c.name AS clientName, tw.weekDay,
|
`SELECT t.id ticketFk, c.id clientFk, c.name clientName, tw.weekDay,
|
||||||
wh.name AS warehouseName, u.id AS workerFk, u.name AS userName, u.nickName, tw.agencyModeFk
|
wh.name warehouseName, d.id AS departmentFk, d.name departmentName, tw.agencyModeFk
|
||||||
FROM ticketWeekly tw
|
FROM ticketWeekly tw
|
||||||
JOIN ticket t ON t.id = tw.ticketFk
|
JOIN ticket t ON t.id = tw.ticketFk
|
||||||
JOIN client c ON c.id = t.clientFk
|
JOIN client c ON c.id = t.clientFk
|
||||||
JOIN account.user u ON u.id = c.salesPersonFk
|
JOIN warehouse wh ON wh.id = t.warehouseFk
|
||||||
JOIN warehouse wh ON wh.id = t.warehouseFk`
|
LEFT JOIN department d ON d.id = c.salesDepartmentFk`
|
||||||
);
|
);
|
||||||
|
|
||||||
stmt.merge(conn.makeSuffix(filter));
|
stmt.merge(conn.makeSuffix(filter));
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue