feat: refs #6802 Clientes-gestionados-por-equipos #2516

Open
carlosap wants to merge 26 commits from 6802-Clientes-gestionados-por-equipos into dev
183 changed files with 1886 additions and 2238 deletions

View File

@ -57,6 +57,22 @@ module.exports = Self => {
if (print) await Self.rawSql('CALL vn.collection_printSticker(?,NULL)', [id], myOptions); if (print) await Self.rawSql('CALL vn.collection_printSticker(?,NULL)', [id], myOptions);
for (let ticket of tickets) {
Review

Aço no te que vore en la tasca no? Vuic dir, es un feature

Aço no te que vore en la tasca no? Vuic dir, es un feature
if (ticket.observaciones) {
let observations = ticket.observaciones.split(' ');
for (let observation of observations) {
const departmentFk = ticket.departmentFk;
if (observation.startsWith('#') || observation.startsWith('@')) {
await models.Chat.send(ctx,
observation,
$t('ticketCommercial', {ticket: ticket.ticketFk, departmentFk})
);
}
}
}
}
return getCollection(id, tickets, sales, placements, myOptions); return getCollection(id, tickets, sales, placements, myOptions);
}; };
@ -127,15 +143,15 @@ module.exports = Self => {
async function getBarcodes(ticketId, options) { async function getBarcodes(ticketId, options) {
const query = const query =
`SELECT s.id movementId, `SELECT s.id movementId,
b.code, b.code,
c.id c.id
FROM vn.sale s FROM vn.sale s
LEFT JOIN vn.itemBarcode b ON b.itemFk = s.itemFk LEFT JOIN vn.itemBarcode b ON b.itemFk = s.itemFk
LEFT JOIN vn.buy c ON c.itemFk = s.itemFk LEFT JOIN vn.buy c ON c.itemFk = s.itemFk
LEFT JOIN vn.entry e ON e.id = c.entryFk LEFT JOIN vn.entry e ON e.id = c.entryFk
LEFT JOIN vn.travel tr ON tr.id = e.travelFk LEFT JOIN vn.travel tr ON tr.id = e.travelFk
WHERE s.ticketFk = ? WHERE s.ticketFk = ?
AND tr.landed >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)`; AND tr.landed >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)`;
return Self.rawSql(query, [ticketId], options); return Self.rawSql(query, [ticketId], options);
} }

View File

@ -114,10 +114,10 @@ module.exports = Self => {
st.code stateCode, st.code stateCode,
ac.username ac.username
FROM sectorCollection sc FROM sectorCollection sc
JOIN sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id JOIN sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id
JOIN saleGroup sg ON sg.id = ss.saleGroupFk JOIN saleGroup sg ON sg.id = ss.saleGroupFk
LEFT JOIN saleGroupDetail sgd ON sgd.saleGroupFk = sg.id LEFT JOIN saleGroupDetail sgd ON sgd.saleGroupFk = sg.id
JOIN sale s ON s.id = sgd.saleFk JOIN sale s ON s.id = sgd.saleFk
LEFT JOIN parking p2 ON p2.id = sg.parkingFk LEFT JOIN parking p2 ON p2.id = sg.parkingFk
JOIN item i ON i.id = s.itemFk JOIN item i ON i.id = s.itemFk
JOIN itemShelvingSale iss ON iss.saleFk = s.id JOIN itemShelvingSale iss ON iss.saleFk = s.id
@ -127,8 +127,8 @@ module.exports = Self => {
LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk
LEFT JOIN origin o ON o.id = i.originFk LEFT JOIN origin o ON o.id = i.originFk
LEFT JOIN state st ON st.id = sg.stateFk LEFT JOIN state st ON st.id = sg.stateFk
LEFT JOIN account.user ac ON ac.id = sg.userFk LEFT JOIN account.user ac ON ac.id = iss.userFk
WHERE sc.id = ? WHERE sc.id = ?
AND sgd.saleGroupFk AND sgd.saleGroupFk
GROUP BY s.id, ish.id, p.code, p2.code`, [id, id], myOptions); GROUP BY s.id, ish.id, p.code, p2.code`, [id, id], myOptions);
if (print) if (print)
@ -136,22 +136,22 @@ module.exports = Self => {
const collection = {collectionFk: id, tickets: []}; const collection = {collectionFk: id, tickets: []};
if (tickets && tickets.length) { if (tickets?.length) {
for (const ticket of tickets) { for (const ticket of tickets) {
const ticketId = ticket.ticketFk; const ticketId = ticket.ticketFk;
if (ticket.observation) { if (ticket.observation) {
for (observation of ticket.observation?.split(' ')) { for (let observation of ticket.observation?.split(' ')) {
if (['#', '@'].includes(observation.charAt(0))) { if (['#', '@'].includes(observation.charAt(0))) {
promises.push(Self.app.models.Chat.send(ctx, observation, promises.push(Self.app.models.Chat.send(ctx, observation,
$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 departmentId: ticket.departmentFk
}))); })));
} }
} }
} }
if (sales && sales.length) { if (sales?.length) {
const barcodes = await Self.rawSql(` const barcodes = await Self.rawSql(`
SELECT s.id saleFk, b.code, c.id SELECT s.id saleFk, b.code, c.id
FROM sale s FROM sale s
@ -166,7 +166,7 @@ module.exports = Self => {
for (const sale of sales) { for (const sale of sales) {
if (sale.ticketFk === ticketId) { if (sale.ticketFk === ticketId) {
sale.Barcodes = []; sale.Barcodes = [];
if (barcodes && barcodes.length) { if (barcodes?.length) {
for (const barcode of barcodes) { for (const barcode of barcodes) {
if (barcode.saleFk === sale.saleFk) { if (barcode.saleFk === sale.saleFk) {
for (const prop in barcode) { for (const prop in barcode) {

View File

@ -1,5 +1,5 @@
USE `util`; USE `util`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -1165,7 +1165,7 @@ INSERT INTO `versionLog` VALUES ('vn-database','11423','00-firstScript.sql','jen
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `account`; USE `account`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -1550,7 +1550,7 @@ INSERT INTO `mailConfig` VALUES (1,'verdnatura.es');
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `salix`; USE `salix`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -1605,7 +1605,6 @@ INSERT INTO `ACL` VALUES (73,'Expedition','*','READ','ALLOW','ROLE','employee',N
INSERT INTO `ACL` VALUES (74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryAssistant',NULL); INSERT INTO `ACL` VALUES (74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryAssistant',NULL);
INSERT INTO `ACL` VALUES (75,'Expedition','*','WRITE','ALLOW','ROLE','production',NULL); INSERT INTO `ACL` VALUES (75,'Expedition','*','WRITE','ALLOW','ROLE','production',NULL);
INSERT INTO `ACL` VALUES (76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (77,'WorkerMana','*','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (78,'TicketTracking','*','WRITE','ALLOW','ROLE','production',NULL); INSERT INTO `ACL` VALUES (78,'TicketTracking','*','WRITE','ALLOW','ROLE','production',NULL);
INSERT INTO `ACL` VALUES (79,'Ticket','state','*','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (79,'Ticket','state','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (80,'Sale','deleteSales','*','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (80,'Sale','deleteSales','*','ALLOW','ROLE','employee',NULL);
@ -2053,7 +2052,7 @@ INSERT INTO `ACL` VALUES (595,'Ticket','isEditable','READ','ALLOW','ROLE','emplo
INSERT INTO `ACL` VALUES (596,'Ticket','setDeleted','WRITE','ALLOW','ROLE','salesPerson',NULL); INSERT INTO `ACL` VALUES (596,'Ticket','setDeleted','WRITE','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (597,'Ticket','restore','WRITE','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (597,'Ticket','restore','WRITE','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (598,'Ticket','getSales','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (598,'Ticket','getSales','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (599,'Ticket','getSalesPersonMana','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (599,'Ticket','getDepartmentMana','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (600,'Ticket','filter','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (600,'Ticket','filter','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (601,'Ticket','makeInvoice','WRITE','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (601,'Ticket','makeInvoice','WRITE','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (602,'Ticket','updateEditableTicket','WRITE','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (602,'Ticket','updateEditableTicket','WRITE','ALLOW','ROLE','employee',NULL);
@ -2503,7 +2502,7 @@ INSERT INTO `defaultViewMultiConfig` VALUES ('routesList','{\"ID\":true,\"worker
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `vn`; USE `vn`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -2942,7 +2941,7 @@ INSERT INTO `workerTimeControlError` VALUES (9,'UNDEFINED_ERROR','Error sin defi
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `cache`; USE `cache`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -2967,7 +2966,7 @@ INSERT INTO `cache` VALUES (14,'lastBuy','23:59:00');
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `hedera`; USE `hedera`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -3239,7 +3238,7 @@ INSERT INTO `tpvResponse` VALUES (9999,'Operación que ha sido redirigida al emi
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `sage`; USE `sage`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

View File

@ -1,5 +1,5 @@
USE `mysql`; USE `mysql`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
@ -2250,7 +2250,7 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','buy_getUltimate','
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
USE `mysql`; USE `mysql`;
/*M!999999\- enable the sandbox mode */ /*M!999999\- enable the sandbox mode */
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

File diff suppressed because it is too large Load Diff

View File

@ -393,20 +393,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`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`businessTypeFk`,`typeFk`) INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`businessTypeFk`,`typeFk`, `departmentFk`)
VALUES VALUES
(1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'), (1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
(1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'), (1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
(1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'), (1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
(1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal'), (1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 18, 0, 'florist','normal', 155),
(1105, 'Max Eisenhardt', '251628698', 'MAGNETO', 'Rogue', 'UNKNOWN WHEREABOUTS', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 18, 0, 'florist','normal'), (1105, 'Max Eisenhardt', '251628698', 'MAGNETO', 'Rogue', 'UNKNOWN WHEREABOUTS', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 18, 0, 'florist','normal', 155),
(1106, 'DavidCharlesHaller', '53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 19, 0, 'florist','normal'), (1106, 'DavidCharlesHaller','53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com',NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, 19, 0, 'florist','normal', 155),
(1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 19, 0, 'florist','normal'), (1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 19, 0, 'florist','normal', 155),
(1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 19, 0, 'florist','normal'), (1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA','Gotham',46460,1111111111,222222222,1,'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 19, 0, 'florist','normal', 155),
(1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 0, 'florist','normal'), (1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 0, 'florist','normal', 155),
(1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, NULL, 1, 'florist','normal'), (1110, 'Jessica Jones', '58282869H', 'JESSICA JONES','Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, NULL,1, 'florist','normal', 155),
(1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 0, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'), (1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL,0, 'others','loses', 155),
(1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 0, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'); (1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL,0, 'others','loses', 155);
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`) INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), UPPER(CONCAT(name, 'Street')), 'GOTHAM', 46460, 0, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1 SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), UPPER(CONCAT(name, 'Street')), 'GOTHAM', 46460, 0, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1
@ -1876,18 +1876,17 @@ INSERT INTO `vn`.`clientContact`(`id`, `clientFk`, `name`, `phone`)
(3, 1101, 'contact 3', 222333444), (3, 1101, 'contact 3', 222333444),
(4, 1102, 'contact 1', 876543219); (4, 1102, 'contact 1', 876543219);
INSERT INTO `vn`.`workerManaExcluded`(`workerFk`) INSERT INTO `vn`.`departmentManaExcluded`(`departmentFk`)
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 hacemos alguna modificacion en alguna tabla que utiliza para calcularlo ya no seria correcto
La otra manera es poner el calculo con los 2 trabajadores que utilizamos ahora mismo para los tickets 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(155);
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
@ -2188,15 +2187,6 @@ INSERT INTO `vn`.`smsConfig` (`id`, `uri`, `title`, `apiKey`)
VALUES VALUES
('1', 'https://api.gateway360.com/api/3.0/sms/send', 'Verdnatura', '5715476da95b46d686a5a255e6459523'); ('1', 'https://api.gateway360.com/api/3.0/sms/send', 'Verdnatura', '5715476da95b46d686a5a255e6459523');
INSERT INTO `vn`.`sharingClient`(`id`, `workerFk`, `started`, `ended`, `clientFk`)
VALUES
(1, 19, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 1101),
(2, 18, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 1106);
INSERT INTO `vn`.`sharingCart`(`id`, `workerFk`, `started`, `ended`, `workerSubstitute`, `created`)
VALUES
(1, 18, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 19, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY));
CALL `vn`.zoneGeo_calcTree(); -- this is an auto calculate for table vn.zoneGeo, columns: path,lft,rgt,depth,sons CALL `vn`.zoneGeo_calcTree(); -- this is an auto calculate for table vn.zoneGeo, columns: path,lft,rgt,depth,sons
INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`) INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`)
@ -4111,4 +4101,4 @@ INSERT IGNORE INTO vn.vehicleType (id, name)
VALUES (1,'vehículo empresa'), VALUES (1,'vehículo empresa'),
(2, 'furgoneta'), (2, 'furgoneta'),
(3, 'cabeza tractora'), (3, 'cabeza tractora'),
(4, 'remolque'); (4, 'remolque');

View File

@ -1,53 +1,52 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`analisis_ventas_update`() CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`analisis_ventas_update`()
BEGIN BEGIN
DECLARE vLastMonth DATE; DECLARE vLastMonth DATE;
SET vLastMonth = util.firstDayOfMonth(TIMESTAMPADD(MONTH, -1, util.VN_CURDATE())); SET vLastMonth = util.firstDayOfMonth(TIMESTAMPADD(MONTH, -1, util.VN_CURDATE()));
DELETE FROM analisis_ventas DELETE FROM analisis_ventas
WHERE Año > YEAR(vLastMonth) WHERE Año > YEAR(vLastMonth)
OR (Año = YEAR(vLastMonth) AND Mes >= MONTH(vLastMonth)); OR (Año = YEAR(vLastMonth) AND Mes >= MONTH(vLastMonth));
INSERT INTO analisis_ventas ( INSERT INTO analisis_ventas (
Familia, Familia,
Reino, Reino,
Comercial, departmentFk,
Review

No veo que hayas cambiado el nombre de la columna

No veo que hayas cambiado el nombre de la columna
Comprador, Comprador,
Provincia, Provincia,
almacen, almacen,
Año, Año,
Mes, Mes,
Semana, Semana,
Vista, Vista,
Importe Importe
) )
SELECT SELECT
it.name, it.name,
ic.name, ic.name,
w.code, c.departmentFk,
w2.code, w.code,
p.name, p.name,
wa.name, wa.name,
tm.year, tm.year,
tm.month, tm.month,
tm.week, tm.week,
dm.description, dm.description,
bt.importe bt.importe
FROM bs.ventas bt FROM bs.ventas bt
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 JOIN vn.agencyMode am ON am.id = t.agencyModeFk
JOIN vn.agencyMode am ON am.id = t.agencyModeFk LEFT JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk
LEFT JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk LEFT JOIN vn.address a ON a.id = t.addressFk
LEFT JOIN vn.address a ON a.id = t.addressFk LEFT JOIN vn.province p ON p.id = a.provinceFk
LEFT JOIN vn.province p ON p.id = a.provinceFk LEFT JOIN vn.warehouse wa ON wa.id = t.warehouseFk
LEFT JOIN vn.warehouse wa ON wa.id = t.warehouseFk WHERE bt.fecha >= vLastMonth AND ic.merchandise;
WHERE bt.fecha >= vLastMonth AND ic.merchandise; END$$
END$$ DELIMITER ;
DELIMITER ;

View File

@ -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 departmentName,
c.payMethodFk pay_met_id,
c.dueDay Vencimiento
FROM newDefaulters nd
LEFT JOIN vn.client c ON c.id = nd.client
LEFT JOIN vn.department d ON d.id = c.departmentFk;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -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 ;

View File

@ -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 ;

View File

@ -20,10 +20,10 @@ BEGIN
DELETE FROM payMethodClientEvolution DELETE FROM payMethodClientEvolution
WHERE dated < vFourYearsAgo; WHERE dated < vFourYearsAgo;
DELETE FROM salesByclientSalesPerson DELETE FROM salesByclientSalesPerson
WHERE dated < vFourYearsAgo; WHERE dated < vFourYearsAgo;
DELETE FROM m3 DELETE FROM m3
WHERE fecha < vTwoYearAgo; WHERE fecha < vTwoYearAgo;
DELETE FROM salesByItemTypeDay DELETE FROM salesByItemTypeDay

View File

@ -0,0 +1,60 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`clientDied_calc`(
vDays INT,
vCountryCode VARCHAR(2)
)
BEGIN
/**
* Recalcula los clientes inactivos y hace insert en la tabla clientDied
* estableciendo hasta 3 avisos en función del periodo y el código de país.
*
* @param vDays El número de días a considerar para la inactividad del cliente
* @param vCountryCode El código del país para filtrar los clientes
*/
DECLARE vFirstPeriod , vSecondPeriod, vThridPeriod DATE;
SET vFirstPeriod = util.VN_CURDATE() - INTERVAL vDays DAY;
SET vSecondPeriod = util.VN_CURDATE() - INTERVAL vDays * 2 DAY;
SET vThridPeriod = util.VN_CURDATE() - INTERVAL vDays * 3 DAY;
DELETE cd.* FROM clientDied cd
JOIN (
SELECT c.id FROM vn.client c
JOIN vn.country co ON co.id = c.countryFk
WHERE co.code = vCountryCode
) sub ON sub.id = cd.clientFk;
INSERT INTO clientDied (clientFk, lastInvoiced, warning)
SELECT c.id,
sub.lastShipped,
CASE
WHEN lastShipped < vThridPeriod OR lastShipped IS NULL THEN 'third'
WHEN lastShipped < vSecondPeriod THEN 'second'
WHEN lastShipped < vFirstPeriod THEN 'first'
END
FROM vn.client c
JOIN vn.country co ON co .id = c.countryFk
JOIN vn.department w ON w.id = c.departmentFk
LEFT JOIN (
SELECT c.id, DATE(MAX(t.shipped)) lastShipped
FROM vn.client c
LEFT JOIN vn.ticket t ON t.clientFk = c.id
LEFT JOIN vn.country co ON co.id = c.countryFk
WHERE co.code = vCountryCode
AND (t.shipped <= util.VN_CURDATE() OR t.shipped IS NULL)
GROUP BY c.id
) sub ON sub.id = c.id
LEFT JOIN vn.clientObservation cob ON cob.clientFk = c.id
AND cob.created > vThridPeriod
WHERE (sub.lastShipped < vFirstPeriod OR sub.lastShipped IS NULL)
AND c.created < vThridPeriod
AND co.code = vCountryCode
AND cob.`text` IS NULL
AND c.id NOT IN (
SELECT DISTINCT clientFk
FROM vn.ticket
WHERE refFk IS NULL
AND shipped >= vFirstPeriod
)
GROUP BY c.id;
END$$
DELIMITER ;

View File

@ -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.departmentFk = c.departmentFk
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

View File

@ -12,40 +12,40 @@ BEGIN
-- Ventas totales del ultimo año -- Ventas totales del ultimo año
UPDATE indicators UPDATE indicators
SET lastYearSales = SET lastYearSales =
(SELECT SUM(importe + recargo) (SELECT SUM(importe + recargo)
FROM ventas v FROM ventas v
JOIN vn.company c ON c.id = v.empresa_id JOIN vn.company c ON c.id = v.empresa_id
JOIN vn.companyGroup cg ON cg.id = c.companyGroupFk JOIN vn.companyGroup cg ON cg.id = c.companyGroupFk
WHERE fecha BETWEEN oneYearBefore AND vDated WHERE fecha BETWEEN oneYearBefore AND vDated
AND cg.code = 'Verdnatura' AND cg.code = 'Verdnatura'
) )
WHERE updated = vDated; WHERE updated = vDated;
-- Greuge total acumulado -- Greuge total acumulado
UPDATE indicators UPDATE indicators
SET totalGreuge = SET totalGreuge =
(SELECT SUM(amount) (SELECT SUM(amount)
FROM vn.greuge FROM vn.greuge
WHERE shipped <= vDated WHERE shipped <= vDated
) )
WHERE updated = vDated; WHERE updated = vDated;
-- Tasa de morosidad con respecto a las ventas del último mes -- Tasa de morosidad con respecto a las ventas del último mes
UPDATE indicators UPDATE indicators
SET latePaymentRate = SET latePaymentRate =
(SELECT SUM(amount) (SELECT SUM(amount)
FROM bi.defaulters FROM bi.defaulters
WHERE date = vDated AND amount > 0) WHERE date = vDated AND amount > 0)
/ /
(SELECT SUM(importe + recargo) (SELECT SUM(importe + recargo)
FROM ventas FROM ventas
WHERE fecha BETWEEN oneMonthBefore AND vDated) WHERE fecha BETWEEN oneMonthBefore AND vDated)
WHERE updated = vDated; WHERE updated = vDated;
-- Número de trabajadores activos -- Número de trabajadores activos
UPDATE indicators UPDATE indicators
SET countEmployee = SET countEmployee =
(SELECT CAST(SUM(ct.hoursWeek) / 40 AS DECIMAL (10, 2)) (SELECT CAST(SUM(ct.hoursWeek) / 40 AS DECIMAL (10, 2))
FROM vn.business b FROM vn.business b
JOIN vn.calendarType ct ON ct.id = b.calendarTypeFk JOIN vn.calendarType ct ON ct.id = b.calendarTypeFk
@ -54,17 +54,17 @@ BEGIN
) )
WHERE updated = vDated; WHERE updated = vDated;
-- Maná medio acumulado por comercial -- Maná medio acumulado
UPDATE indicators UPDATE indicators
SET averageMana = SET averageMana =
(SELECT AVG(amount) (SELECT AVG(amount)
FROM vn.workerMana FROM vn.departmentMana
) )
WHERE updated = vDated; WHERE updated = vDated;
-- Número de clientes que han comprado en los últimos 30 dias -- Número de clientes que han comprado en los últimos 30 dias
UPDATE indicators UPDATE indicators
SET lastMonthActiveClients = SET lastMonthActiveClients =
(SELECT COUNT(DISTINCT t.clientFk) (SELECT COUNT(DISTINCT t.clientFk)
FROM vn.ticket t FROM vn.ticket t
WHERE t.shipped BETWEEN oneMonthBefore AND vDated WHERE t.shipped BETWEEN oneMonthBefore AND vDated
@ -73,9 +73,9 @@ BEGIN
-- Número de clientes que no han comprado en los últimos 30 dias, pero compraron en los 30 anteriores -- Número de clientes que no han comprado en los últimos 30 dias, pero compraron en los 30 anteriores
UPDATE indicators UPDATE indicators
SET lastMonthLostClients = SET lastMonthLostClients =
(SELECT COUNT(lm.clientFk) (SELECT COUNT(lm.clientFk)
FROM FROM
(SELECT DISTINCT t.clientFk (SELECT DISTINCT t.clientFk
FROM vn.ticket t FROM vn.ticket t
WHERE t.shipped BETWEEN oneMonthBefore AND vDated WHERE t.shipped BETWEEN oneMonthBefore AND vDated
@ -92,9 +92,9 @@ BEGIN
-- Número de clientes que han comprado en los últimos 30 dias, pero no compraron en los 30 anteriores -- Número de clientes que han comprado en los últimos 30 dias, pero no compraron en los 30 anteriores
UPDATE indicators UPDATE indicators
SET lastMonthNewClients = SET lastMonthNewClients =
(SELECT COUNT(cm.clientFk) (SELECT COUNT(cm.clientFk)
FROM FROM
(SELECT DISTINCT t.clientFk (SELECT DISTINCT t.clientFk
FROM vn.ticket t FROM vn.ticket t
WHERE t.shipped BETWEEN oneMonthBefore AND vDated WHERE t.shipped BETWEEN oneMonthBefore AND vDated
@ -120,7 +120,7 @@ BEGIN
-- Cálculo de las ventas agrupado por semanas -- Cálculo de las ventas agrupado por semanas
SELECT week INTO vWeek SELECT week INTO vWeek
FROM vn.time FROM vn.time
WHERE dated = vDated; WHERE dated = vDated;
TRUNCATE salesByWeek; TRUNCATE salesByWeek;
@ -134,12 +134,12 @@ BEGIN
-- Indicador Ventas semana actual -- Indicador Ventas semana actual
UPDATE indicators i UPDATE indicators i
JOIN salesByWeek s ON s.week= vWeek JOIN salesByWeek s ON s.week= vWeek
AND s.year = YEAR(vDated) AND s.year = YEAR(vDated)
SET i.thisWeekSales = s.sales SET i.thisWeekSales = s.sales
WHERE updated = vDated; WHERE updated = vDated;
-- Indicador ventas semana actual en el año pasado -- Indicador ventas semana actual en el año pasado
UPDATE indicators i UPDATE indicators i
JOIN salesByWeek s ON s.week = vWeek JOIN salesByWeek s ON s.week = vWeek
AND s.year = YEAR(vDated)-1 AND s.year = YEAR(vDated)-1

View File

@ -14,51 +14,51 @@ BEGIN
SELECT id INTO vManaId SELECT id INTO vManaId
FROM vn.component WHERE code = 'mana'; FROM vn.component WHERE code = 'mana';
SELECT id INTO vManaAutoId SELECT id INTO vManaAutoId
FROM vn.component WHERE code = 'autoMana'; FROM vn.component WHERE code = 'autoMana';
SELECT id INTO vClaimManaId SELECT id INTO vClaimManaId
FROM vn.component WHERE code = 'manaClaim'; FROM vn.component WHERE code = 'manaClaim';
SELECT id INTO vManaBankId SELECT id INTO vManaBankId
FROM vn.accounting WHERE code = 'mana'; FROM vn.accounting WHERE code = 'mana';
SELECT id INTO vManaGreugeTypeId SELECT id INTO vManaGreugeTypeId
FROM vn.greugeType WHERE code = 'mana'; FROM vn.greugeType WHERE code = 'mana';
SELECT manaFromDays, manaToDays SELECT manaFromDays, manaToDays
INTO vManaFromDays, vManaToDays INTO vManaFromDays, vManaToDays
FROM vn.salespersonConfig; FROM vn.manaConfig;
SELECT MAX(dated) INTO vFromDated SELECT MAX(dated) INTO vFromDated
FROM vn.clientManaCache; FROM vn.clientManaCache;
DELETE FROM vn.clientManaCache DELETE FROM vn.clientManaCache
WHERE dated = vFromDated; WHERE dated = vFromDated;
SELECT MAX(dated) INTO vFromDated SELECT MAX(dated) INTO vFromDated
FROM vn.clientManaCache; FROM vn.clientManaCache;
IF vFromDated IS NULL THEN IF vFromDated IS NULL THEN
SELECT manaDateFrom SELECT manaDateFrom
INTO vFromDated INTO vFromDated
FROM vn.salespersonConfig; FROM vn.manaConfig;
END IF; END IF;
WHILE vFromDated + INTERVAL vManaToDays DAY < util.VN_CURDATE() DO WHILE vFromDated + INTERVAL vManaToDays DAY < util.VN_CURDATE() DO
SELECT vFromDated + INTERVAL vManaToDays DAY, SELECT vFromDated + INTERVAL vManaToDays DAY,
vFromDated - INTERVAL vManaFromDays DAY vFromDated - INTERVAL vManaFromDays DAY
INTO vToDated, INTO vToDated,
vForDeleteDated; vForDeleteDated;
DELETE FROM vn.clientManaCache DELETE FROM vn.clientManaCache
WHERE dated <= vForDeleteDated; WHERE dated <= vForDeleteDated;
INSERT INTO vn.clientManaCache(clientFk, mana, dated) INSERT INTO vn.clientManaCache(clientFk, mana, dated)
SELECT Id_Cliente, SELECT Id_Cliente,
SUM(mana), SUM(mana),
vToDated vToDated
FROM ( FROM (
SELECT a.clientFk Id_Cliente, s.quantity * sc.value mana SELECT a.clientFk Id_Cliente, s.quantity * sc.value mana
FROM vn.ticket t FROM vn.ticket t
@ -66,19 +66,19 @@ BEGIN
JOIN vn.sale s ON s.ticketFk = t.id JOIN vn.sale s ON s.ticketFk = t.id
JOIN vn.saleComponent sc ON sc.saleFk = s.id JOIN vn.saleComponent sc ON sc.saleFk = s.id
WHERE sc.componentFk IN (vManaAutoId, vManaId, vClaimManaId) WHERE sc.componentFk IN (vManaAutoId, vManaId, vClaimManaId)
AND t.shipped > vFromDated AND t.shipped > vFromDated
AND DATE(t.shipped) <= vToDated AND DATE(t.shipped) <= vToDated
UNION ALL UNION ALL
SELECT clientFk, - amountPaid SELECT clientFk, - amountPaid
FROM vn.receipt FROM vn.receipt
WHERE bankFk = vManaBankId WHERE bankFk = vManaBankId
AND payed > vFromDated AND payed > vFromDated
AND payed <= vToDated AND payed <= vToDated
UNION ALL UNION ALL
SELECT clientFk, amount SELECT clientFk, amount
FROM vn.greuge FROM vn.greuge
WHERE greugeTypeFk = vManaGreugeTypeId WHERE greugeTypeFk = vManaGreugeTypeId
AND shipped > vFromDated AND shipped > vFromDated
AND shipped <= vToDated AND shipped <= vToDated
UNION ALL UNION ALL
SELECT clientFk, mana SELECT clientFk, mana

View File

@ -1,27 +1,27 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`manaSpellers_actualize`() CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`manaSpellers_actualize`()
BEGIN 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.departmentFk,
FLOOR(SUM(s.amount) / 12) amount FLOOR(SUM(s.amount) / 12) amount
FROM salesByclientSalesPerson s FROM salesByclientSalesPerson 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.departmentFk
)avgPortfolioWeight ON avgPortfolioWeight.lastSalesPersonFk = wm.workerFk )avgPortfolioWeight ON avgPortfolioWeight.departmentFk = dm.departmentFk
JOIN vn.salespersonConfig spc JOIN vn.manaConfig mc
SET wm.pricesModifierRate = SET dm.pricesModifierRate =
IFNULL( IFNULL(
GREATEST( GREATEST(
spc.manaMinRate, mc.manaMinRate,
LEAST( LEAST(
spc.manaMaxRate, mc.manaMaxRate,
ROUND( - wm.amount / avgPortfolioWeight.amount, 3) ROUND( - dm.amount / avgPortfolioWeight.amount, 3)
) )
) )
,0); ,0);

View File

@ -0,0 +1,25 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`porfolio_add`()
BEGIN
/**
* Inserta en la tabla @bs.portfolio las ventas desde el año pasado
* agrupadas por equipo, año y mes
*/
DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1;
CALL util.time_generate(
MAKEDATE(vYear, 1),
(SELECT MAX(dated) FROM sale)
);
INSERT INTO portfolio(yeared, monthed , saleDepartmentFk, Amount)
SELECT t.`year`, t.`month`, w.code, SUM(s.amount)
FROM tmp.time t
JOIN sale s on t.dated = s.dated
JOIN vn.client c on c.id = s.clientFk
JOIN vn.department d ON d.id = c.departmentFk
GROUP BY d.id, t.`year`, t.`month`;
DROP TEMPORARY TABLE tmp.time;
END$$
DELIMITER ;

View File

@ -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 ;

View File

@ -2,9 +2,9 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesByclientSalesPerson_add`(vDatedFrom DATE) CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesByclientSalesPerson_add`(vDatedFrom DATE)
BEGIN BEGIN
/** /**
* Agrupa las ventas por cliente/comercial/fecha en la tabla bs.salesByclientSalesPerson * Agrupa las ventas por cliente/fecha en la tabla bs.salesByclientSalesPerson
* El asociación cliente/comercial/fecha, se mantiene correcta en el tiempo * El asociación cliente/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,27 +12,26 @@ BEGIN
SET vDatedFrom = util.VN_CURDATE() - INTERVAL 1 MONTH; SET vDatedFrom = util.VN_CURDATE() - INTERVAL 1 MONTH;
END IF; END IF;
UPDATE salesByclientSalesPerson UPDATE salesByclientSalesPerson
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 salesByclientSalesPerson(
dated, dated,
salesPersonFk, salesPersonFk,
clientFk, clientFk,
amount, amount,
equalizationTax) equalizationTax)
SELECT s.dated, SELECT dated,
c.salesPersonFk, NULL,
s.clientFk, clientFk,
SUM(s.amount), SUM(amount),
SUM(s.surcharge) SUM(surcharge)
FROM sale s FROM sale
JOIN vn.client c on s.clientFk = c.id WHERE dated BETWEEN vDatedFrom AND util.yesterday()
WHERE s.dated BETWEEN vDatedFrom AND util.yesterday() GROUP BY dated, clientFk
GROUP BY s.dated, c.salesPersonFk, s.clientFk
ON DUPLICATE KEY UPDATE amount= VALUES(amount), ON DUPLICATE KEY UPDATE amount= VALUES(amount),
equalizationTax= VALUES(equalizationTax); equalizationTax= VALUES(equalizationTax);

View File

@ -0,0 +1,64 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`salesDepartmentEvolution_add`()
BEGIN
/**
* Calcula los datos para los gráficos de evolución agrupado por departmentFk y día.
* Recalcula automáticamente los 3 últimos meses para comprobar si hay algún cambio.
*/
DECLARE vDated DATE;
SELECT MAX(dated) - INTERVAL 3 MONTH INTO vDated
FROM salesDepartmentEvolution;
DELETE FROM salesDepartmentEvolution
WHERE dated >= vDated;
IF ISNULL(vDated) THEN
SELECT MIN(dated) INTO vDated
FROM salesByClientDepartment;
INSERT INTO salesByClientDepartment(
departmentFk,
dated,
amount,
equalizationTax,
amountNewBorn
)
SELECT departmentFk,
dated,
amount,
equalizationTax,
amountNewBorn
FROM salesByClientDepartment
WHERE dated = vDated
GROUP BY departmentFk;
SET vDated = vDated + INTERVAL 1 DAY;
END IF;
WHILE vDated < util.VN_CURDATE() DO
REPLACE salesByClientDepartment(departmentFk, dated, amount)
SELECT departmentFk, vDated, amount
FROM(SELECT departmentFk, SUM(amount) amount
FROM(SELECT departmentFk, amount
FROM salesByClientDepartment
WHERE dated = vDated - INTERVAL 1 DAY
UNION ALL
SELECT departmentFk, amount
FROM salesByClientDepartment
WHERE dated = vDated
UNION ALL
SELECT departmentFk, - amount
FROM salesByClientDepartment
WHERE dated = vDated - INTERVAL 1 YEAR
)sub
GROUP BY departmentFk
)sub
GROUP BY departmentFk;
SET vDated = vDated + INTERVAL 1 DAY;
END WHILE;
END$$
DELIMITER ;

View File

@ -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 ;

View File

@ -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.salesByClientSalesPerson_add(util.VN_CURDATE()- INTERVAL 45 DAY);
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -9,16 +9,16 @@ BEGIN
DECLARE vIsEktSender BOOLEAN; DECLARE vIsEktSender BOOLEAN;
IF NEW.OrderStatus = vOrderStatusDenied AND NOT (NEW.OrderStatus <=> OLD.OrderStatus) THEN IF NEW.OrderStatus = vOrderStatusDenied AND NOT (NEW.OrderStatus <=> OLD.OrderStatus) THEN
SELECT s.id INTO vSaleFk SELECT s.id INTO vSaleFk
FROM vn.sale s FROM vn.sale s
JOIN vn.ticket t ON s.ticketFk = t.id JOIN vn.ticket t ON s.ticketFk = t.id
JOIN vn.item i ON i.id = s.itemFk JOIN vn.item i ON i.id = s.itemFk
JOIN deliveryInformation di ON di.ID = NEW.deliveryInformationID JOIN deliveryInformation di ON di.ID = NEW.deliveryInformationID
WHERE t.clientFk = NEW.EndUserPartyGLN AND t.shipped >= util.VN_CURDATE() WHERE t.clientFk = NEW.EndUserPartyGLN AND t.shipped >= util.VN_CURDATE()
AND i.supplyResponseFk = NEW.supplyResponseID AND i.supplyResponseFk = NEW.supplyResponseID
LIMIT 1; LIMIT 1;
UPDATE vn.sale s UPDATE vn.sale s
JOIN vn.ticket t ON s.ticketFk = t.id JOIN vn.ticket t ON s.ticketFk = t.id
JOIN vn.item i ON i.id = s.itemFk JOIN vn.item i ON i.id = s.itemFk
@ -26,38 +26,20 @@ BEGIN
SET s.quantity = 0 SET s.quantity = 0
WHERE t.clientFk = NEW.EndUserPartyGLN AND t.shipped >= util.VN_CURDATE() WHERE t.clientFk = NEW.EndUserPartyGLN AND t.shipped >= util.VN_CURDATE()
AND i.supplyResponseFk = NEW.supplyResponseID; AND i.supplyResponseFk = NEW.supplyResponseID;
INSERT INTO vn.mail (sender, `subject`, body)
SELECT IF(u.id IS NOT NULL AND c.email IS NOT NULL,
c.email,
CONCAT(account.user_getNameFromId(c.salesPersonFk), '@verdnatura.es')
),
'Producto no disponible en Floramondo',
CONCAT('El artículo ', s.concept, ' del ticket ', t.id , ' ha sido cancelado por Floramondo. ',
' Se ha actualizado la cantidad de ', OLD.quantity,' a 0. ',
IF (u.id IS NOT NULL AND c.email IS NOT NULL ,
CONCAT('https://shop.verdnatura.es/#!form=ecomerce%2Fticket&ticket=', t.id ),
CONCAT('https://salix.verdnatura.es/#!/ticket/', t.id ,'/summary')))
FROM vn.sale s
JOIN vn.ticket t ON t.id = s.ticketFk
JOIN vn.`client` c ON c.id = t.clientFk
LEFT JOIN account.user u ON u.id= c.salesPersonFk AND u.name IN ('ruben', 'ismaelalcolea')
WHERE s.id = vSaleFk;
END IF;
END IF;
IF NEW.OrderStatus = vOrderStatusOK AND NOT (NEW.OrderStatus <=> OLD.OrderStatus) THEN IF NEW.OrderStatus = vOrderStatusOK AND NOT (NEW.OrderStatus <=> OLD.OrderStatus) THEN
SELECT v.isEktSender INTO vIsEktSender SELECT v.isEktSender INTO vIsEktSender
FROM edi.VMPSettings v FROM edi.VMPSettings v
JOIN edi.supplyResponse sr ON sr.vmpID = v.VMPID JOIN edi.supplyResponse sr ON sr.vmpID = v.VMPID
WHERE sr.id = NEW.supplyResponseID; WHERE sr.id = NEW.supplyResponseID;
IF NOT vIsEktSender THEN IF NOT vIsEktSender THEN
CALL edi.ekt_add(NEW.id); CALL edi.ekt_add(NEW.id);
END IF; END IF;
IF NEW.barcode THEN IF NEW.barcode THEN
@ -66,7 +48,7 @@ BEGIN
SELECT i.id, NEW.barcode SELECT i.id, NEW.barcode
FROM vn.item i FROM vn.item i
WHERE i.supplyResponseFk = NEW.supplyResponseID; WHERE i.supplyResponseFk = NEW.supplyResponseID;
END IF; END IF;
END IF; END IF;

View File

@ -0,0 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`client_unassignDepartment`
ON SCHEDULE EVERY 1 DAY
STARTS '2023-06-01 03:30:00.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL client_unassignDepartment$$
DELIMITER ;

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `vn`.`client_unassignSalesPerson`
ON SCHEDULE EVERY 1 DAY
STARTS '2023-06-01 03:30:00.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL client_unassignSalesPerson$$
DELIMITER ;

View File

@ -1,95 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`catalog_componentReverse`(vWarehouse INT,
vCost DECIMAL(10,3),
vM3 DECIMAL(10,3),
vAddressFk INT,
vZoneFk INT)
RETURNS decimal(10,3)
DETERMINISTIC
BEGIN
/* Calcula los componentes para un cliente a partir de un coste y volumen
* @param vWarehouse
* @param vCost Valor de coste del articulo
* @param vM3 m3 del articulo
* @param vAddressFk
* @param vZoneFk
* @return vRetailedPrice precio de venta sin iva
* @return tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
*/
DECLARE vBoxVolume BIGINT;
DECLARE vCustomer INT;
DECLARE vComponentRecovery INT DEFAULT 17;
DECLARE vComponentMana INT DEFAULT 39;
DECLARE vDeliveryComponent INT DEFAULT 15;
DECLARE vComponentMargin INT DEFAULT 29;
DECLARE vComponentCost INT DEFAULT 28;
DECLARE vRetailedPrice DECIMAL(10,2);
DECLARE vItem INT DEFAULT 98;
SELECT volume INTO vBoxVolume
FROM vn.packaging
WHERE id = '94';
SELECT clientFk INTO vCustomer FROM address WHERE id = vAddressFk;
DROP TEMPORARY TABLE IF EXISTS tmp.catalog_component;
CREATE TEMPORARY TABLE tmp.catalog_component (
`warehouseFk` INT UNSIGNED NOT NULL,
`itemFk` INT NOT NULL,
`componentFk` INT UNSIGNED NOT NULL,
`cost` DECIMAL(10,4) NOT NULL,
INDEX `itemWarehouse` USING BTREE (`itemFk` ASC, `warehouseFk` ASC),
UNIQUE INDEX `itemWarehouseComponent` (`itemFk` ASC, `warehouseFk` ASC, `componentFk` ASC));
-- Cost
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
SELECT vWarehouse, vItem, vComponentCost, vCost
FROM vn.rate
WHERE dated <= util.VN_CURDATE()
AND warehouseFk = vWarehouse
ORDER BY dated DESC
LIMIT 1;
-- Margen
-- No se aplica margen, cau 12589
/* INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
SELECT vWarehouse, vItem, vComponentMargin, (vCost / ((100 - rate2) / 100)) - vCost
FROM vn.rate
WHERE dated <= util.VN_CURDATE()
AND warehouseFk = vWarehouse
ORDER BY dated DESC
LIMIT 1;
*/
-- Recobro
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
SELECT vWarehouse, vItem, vComponentRecovery, ROUND(LEAST(recobro,0.25), 3)
FROM bi.claims_ratio
WHERE Id_Cliente = vCustomer AND recobro > 0.009;
-- Componente de maná automático, en función del maná acumulado por el comercial.
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
SELECT vWarehouse, vItem, vComponentMana, ROUND(wm.pricesModifierRate, 3)
FROM client c
JOIN vn.workerMana wm ON c.salesPersonFk = wm.workerFk
WHERE wm.isPricesModifierActivated AND c.id = vCustomer LIMIT 1;
-- Reparto
INSERT INTO tmp.catalog_component (warehouseFk, itemFk, componentFk, cost)
SELECT vWarehouse, vItem, vDeliveryComponent,
ROUND(
vM3
* (z.price - z.bonus)
* z.inflation
/ vBoxVolume, 4
)
FROM zone z
WHERE z.id = vZoneFk;
-- Precio de venta
SELECT SUM(cost) INTO vRetailedPrice
FROM tmp.catalog_component;
RETURN vRetailedPrice;
END$$
DELIMITER ;

View File

@ -1,11 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`clientGetSalesPerson`(vClientFk INT, vDated DATE)
RETURNS int(11)
DETERMINISTIC
BEGIN
/**
* DEPRECATED: use client_getSalesPerson
**/
RETURN client_getSalesPerson(vClientFk, vDated);
END$$
DELIMITER ;

View File

@ -31,7 +31,7 @@ BEGIN
FROM tClient t FROM tClient t
JOIN `client` c ON c.id = t.clientFk JOIN `client` c ON c.id = t.clientFk
WHERE c.isActive WHERE c.isActive
AND c.salesPersonFk AND c.departmentFk
LIMIT 1; LIMIT 1;
DROP TEMPORARY TABLE tClient; DROP TEMPORARY TABLE tClient;

View File

@ -1,74 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPerson`(vClientFk INT, vDated DATE)
RETURNS int(11)
DETERMINISTIC
BEGIN
/**
* Dado un id cliente y una fecha, devuelve su comercial para ese dia, teniendo
* en cuenta la jerarquía de las tablas: 1º la de sharingclient, 2º la de
* sharingcart y tercero la de clientes.
*
* @param vClientFk El id del cliente
* @param vDated Fecha a comprobar
* @return El id del comercial para la fecha dada
**/
DECLARE vSalesPersonFk INT DEFAULT NULL;
DECLARE vWorkerSubstituteFk INT DEFAULT NULL;
DECLARE vLoop BOOLEAN;
-- Obtiene el comercial original y el de sharingclient
SELECT c.salesPersonFk, s.workerFk
INTO vSalesPersonFk, vWorkerSubstituteFk
FROM client c
LEFT JOIN sharingClient s
ON c.id = s.clientFk
AND vDated BETWEEN s.started AND s.ended
WHERE c.id = vClientFk
ORDER BY s.id
LIMIT 1;
-- Si no hay ninguno en sharingclient busca en sharingcart
IF vWorkerSubstituteFk IS NOT NULL
THEN
SET vSalesPersonFk = vWorkerSubstituteFk;
ELSEIF vSalesPersonFk IS NOT NULL
THEN
DROP TEMPORARY TABLE IF EXISTS tmp.stack;
CREATE TEMPORARY TABLE tmp.stack
(INDEX (substitute))
ENGINE = MEMORY
SELECT vSalesPersonFk substitute;
l: LOOP
SELECT workerSubstitute INTO vWorkerSubstituteFk
FROM sharingCart
WHERE util.VN_CURDATE() BETWEEN started AND ended
AND workerFk = vSalesPersonFk
ORDER BY id
LIMIT 1;
IF vWorkerSubstituteFk IS NULL THEN
LEAVE l;
END IF;
SELECT COUNT(*) > 0 INTO vLoop
FROM tmp.stack WHERE substitute = vWorkerSubstituteFk;
IF vLoop THEN
LEAVE l;
END IF;
INSERT INTO tmp.stack SET
substitute = vWorkerSubstituteFk;
SET vSalesPersonFk = vWorkerSubstituteFk;
END LOOP;
DROP TEMPORARY TABLE tmp.stack;
END IF;
RETURN vSalesPersonFk;
END$$
DELIMITER ;

View File

@ -1,23 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPersonByTicket`(vTicketFk INT)
RETURNS int(11)
DETERMINISTIC
BEGIN
/**
* Dado un id ticket, devuelve su comercial.
* Para más información ir a client_getSalesPerson()
*
* @param vClientFk El id del cliente
* @param vDated Fecha a comprobar
* @return El id del comercial para la fecha dada
**/
DECLARE vClientFk INT;
DECLARE vDated DATE;
SELECT clientFk, shipped
INTO vClientFk, vDated
FROM ticket WHERE id = vTicketFk;
RETURN client_getSalesPerson(vClientFk, vDated);
END$$
DELIMITER ;

View File

@ -1,26 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPersonCode`(vClientFk INT, vDated DATE)
RETURNS varchar(3) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
DETERMINISTIC
BEGIN
/**
* Dado un id cliente y una fecha, devuelve su comercial.
* Para más información ir a client_getSalesPerson()
*
* @param vClientFk El id del cliente
* @param vDated Fecha a comprobar
* @return El código del comercial para la fecha dada
**/
DECLARE vWorkerCode CHAR(3);
DECLARE vSalesPersonFk INT;
SET vSalesPersonFk = client_getSalesPerson(vClientFk, vDated);
SELECT code
INTO vWorkerCode
FROM worker
WHERE id = vSalesPersonFk;
RETURN vWorkerCode;
END$$
DELIMITER ;

View File

@ -1,23 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPersonCodeByTicket`(vTicketFk INT)
RETURNS varchar(3) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
DETERMINISTIC
BEGIN
/**
* Dado un id ticket, devuelve su comercial.
* Para más información ir a client_getSalesPerson()
*
* @param vClientFk El id del cliente
* @param vDated Fecha a comprobar
* @return El código del comercial para la fecha dada
**/
DECLARE vClientFk INT;
DECLARE vDated DATE;
SELECT clientFk, shipped
INTO vClientFk, vDated
FROM ticket WHERE id = vTicketFk;
RETURN client_getSalesPersonCode(vClientFk, vDated);
END$$
DELIMITER ;

View File

@ -174,12 +174,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.departmentFk = dm.departmentFk
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

View File

@ -45,8 +45,6 @@ BEGIN
JOIN ticket t ON tobs.ticketFk = t.id JOIN ticket t ON tobs.ticketFk = t.id
WHERE t.shipped < v5Years; WHERE t.shipped < v5Years;
DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < v1Years; DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < v1Years;
DELETE FROM sharingCart where ended < v2Months;
DELETE FROM sharingClient where ended < v2Months;
DELETE tw.* FROM ticketWeekly tw DELETE tw.* FROM ticketWeekly tw
LEFT JOIN sale s ON s.ticketFk = tw.ticketFk LEFT JOIN sale s ON s.ticketFk = tw.ticketFk
LEFT JOIN ticketRequest tr ON tr.ticketFk = tw.ticketFk LEFT JOIN ticketRequest tr ON tr.ticketFk = tw.ticketFk

View File

@ -1,29 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`clientDebtSpray`(vClientFk INT)
BEGIN
/* Reparte el saldo de un cliente en greuge en la cartera que corresponde, y desasigna el comercial
*
*
*/
DECLARE vClientDebt DOUBLE;
SELECT vn.client_getDebt(vClientFk, util.VN_CURDATE()) INTO vClientDebt;
INSERT INTO vn.greuge(clientFk, description, amount, shipped, greugeTypeFk)
VALUES (vClientFk, 'Saldo pendiente', vClientDebt, util.VN_CURDATE(), 5);
CALL vn.clientGreugeSpray(vClientFk, TRUE, '', TRUE);
INSERT INTO vn.greuge(clientFk, description, amount, shipped, greugeTypeFk)
SELECT vClientFk, 'Liquidación cliente', sum(amount), util.VN_CURDATE(), 5
FROM vn.greuge
WHERE clientFk = vClientFk;
UPDATE vn.client
SET salesPersonFk = NULL
WHERE id = vClientFk;
END$$
DELIMITER ;

View File

@ -1,7 +1,11 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`clientGreugeSpray`(IN vClientFk INT, IN onlyForHisOwner BOOL, IN vWorkerCode VARCHAR(3), IN vWithMana BOOLEAN) CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clientGreugeSpray`(
IN vClientFk INT,
IN vIsOnlyForHisOwner BOOL,
IN vDepartmentCode VARCHAR(45),
IN vWithMana BOOLEAN
)
BEGIN 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 departmentFk 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.departmentFk = c.departmentFk
Review

Llevar vn

Llevar vn
Review

este esta perque esta dins dun with

este esta perque esta dins dun with
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.departmentFk = IF(vIsOnlyForHisOwner, vOwner, dm.departmentFk)
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 ;

View File

@ -8,7 +8,7 @@ BEGIN
FROM tmp.clientGetDebt c FROM tmp.clientGetDebt c
LEFT JOIN clientRisk r ON r.clientFk = c.clientFk LEFT JOIN clientRisk r ON r.clientFk = c.clientFk
GROUP BY c.clientFk GROUP BY c.clientFk
HAVING SUM(IFNULL(r.amount,0)) = 0; HAVING SUM(IFNULL(r.amount, 0)) = 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
@ -16,22 +16,26 @@ BEGIN
CREATE TEMPORARY TABLE tmp.clientGetDebt CREATE TEMPORARY TABLE tmp.clientGetDebt
SELECT cd.clientFk SELECT cd.clientFk
FROM bs.clientDied cd FROM bs.clientDied cd
LEFT JOIN clientProtected cp ON cp.clientFk = cd.clientFk LEFT JOIN clientProtected cp ON cp.clientFk = cd.clientFk
JOIN client c ON c.id = cd.clientFk JOIN client c ON c.id = cd.clientFk
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
WHERE cd.warning = 'third' WHERE cd.warning = 'third'
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.departmentFk 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
Review

Llevar vn

Llevar vn
SET departmentFk = NULL
WHERE id = vClientFk;
FETCH rs INTO vClientFk; FETCH rs INTO vClientFk;
END WHILE; END WHILE;
CLOSE rs; CLOSE rs;

View File

@ -1,8 +1,8 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`client_unassignSalesPerson`() CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`client_unassignDepartment`()
BEGIN BEGIN
/** /**
* Elimina la asignación de salesPersonFk de la ficha del clientes * Elimina la asignación de departmentFk de la ficha del clientes
* que no han realizado una compra en los últimos 3 meses y reparte * 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 departmentNoUnassign sd ON sp.departmentFk = c.departmentFk
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.departmentFk 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 departmentFk = NULL
WHERE id = vClientFk; WHERE id = vClientFk;
END LOOP; END LOOP;
CLOSE vCursor; CLOSE vCursor;

View File

@ -20,15 +20,15 @@ BEGIN
WHERE c.typeFk = 'normal' WHERE c.typeFk = 'normal'
AND a.id IS NULL AND a.id IS NULL
AND u.active AND u.active
AND c.created < util.VN_CURDATE() - INTERVAL vMonths MONTH AND c.created < util.VN_CURDATE() - INTERVAL vMonths MONTH
AND NOT u.role = (SELECT id FROM `role` WHERE name = 'supplier') AND NOT u.role = (SELECT id FROM `role` WHERE name = 'supplier')
AND u.id NOT IN ( AND u.id NOT IN (
SELECT DISTINCT c.id SELECT DISTINCT c.id
FROM client c FROM client c
LEFT JOIN ticket t ON t.clientFk = c.id LEFT JOIN ticket t ON t.clientFk = c.id
WHERE c.salesPersonFk IS NOT NULL WHERE c.departmentFk IS NOT NULL
OR t.created > util.VN_CURDATE() - INTERVAL vMonths MONTH OR t.created > util.VN_CURDATE() - INTERVAL vMonths MONTH
OR shipped > util.VN_CURDATE() - INTERVAL vMonths MONTH OR shipped > util.VN_CURDATE() - INTERVAL vMonths MONTH
); );
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -4,31 +4,32 @@ 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, departmentFk)
*/
DECLARE vItemPackingTypeFk VARCHAR(1); DECLARE vItemPackingTypeFk VARCHAR(1);
DECLARE vYesterday DATE; DECLARE vYesterday DATE;
-- Si los sacadores son los de pruebas, pinta los colores -- Si los sacadores son los de pruebas, pinta los colores
SELECT itemPackingTypeFk SELECT itemPackingTypeFk
INTO vItemPackingTypeFk INTO vItemPackingTypeFk
FROM collection FROM collection
WHERE id = vParamFk; WHERE id = vParamFk;
SET vYesterday = util.yesterday(); SET vYesterday = util.yesterday();
WITH observation AS ( WITH observation AS (
SELECT tob.ticketFk, tob.description SELECT tob.ticketFk, tob.description
FROM vn.ticketObservation tob FROM vn.ticketObservation tob
JOIN vn.ticketCollection tc ON tc.ticketFk = tob.ticketFk JOIN vn.ticketCollection tc ON tc.ticketFk = tob.ticketFk
JOIN vn.observationType ot ON ot.id = tob.observationTypeFk AND ot.`code` = 'itemPicker' JOIN vn.observationType ot ON ot.id = tob.observationTypeFk AND ot.`code` = 'itemPicker'
WHERE tc.collectionFk = vParamFk OR tc.ticketFk = vParamFk WHERE tc.collectionFk = vParamFk OR tc.ticketFk = vParamFk
) )
SELECT t.id ticketFk, SELECT t.id ticketFk,
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.departmentFk,
Review

Quien llama a esto soportará que le retorne departmentFk o salesPersonFk? Es decir, se ha cambiado también?

Quien llama a esto soportará que le retorne departmentFk o salesPersonFk? Es decir, se ha cambiado también?
Review

es salix front, si

es salix front, si
IFNULL(ob.description,'') observaciones, IFNULL(ob.description,'') observaciones,
cc.rgb, cc.rgb,
p.code parkingCode, p.code parkingCode,
@ -36,41 +37,39 @@ BEGIN
FROM vn.ticket t FROM vn.ticket t
LEFT JOIN vn.ticketCollection tc ON t.id = tc.ticketFk LEFT JOIN vn.ticketCollection tc ON t.id = tc.ticketFk
LEFT JOIN vn.collection c2 ON c2.id = tc.collectionFk LEFT JOIN vn.collection c2 ON c2.id = tc.collectionFk
LEFT JOIN vn.collectionColors cc LEFT JOIN vn.collectionColors cc
ON cc.wagon = tc.wagon ON cc.wagon = tc.wagon
AND cc.shelve = tc.`level` AND cc.shelve = tc.`level`
AND cc.trainFk = c2.trainFk AND cc.trainFk = c2.trainFk
LEFT JOIN vn.zone z ON z.id = t.zoneFk LEFT JOIN vn.zone z ON z.id = t.zoneFk
LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk
LEFT JOIN vn.client c ON c.id = t.clientFk LEFT JOIN vn.client c ON c.id = t.clientFk
LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
LEFT JOIN observation ob ON ob.ticketFk = t.id LEFT JOIN observation ob ON ob.ticketFk = t.id
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
LEFT JOIN vn.parking p ON tp.parkingFk = p.id LEFT JOIN vn.parking p ON tp.parkingFk = p.id
LEFT JOIN vn.packingSiteAdvanced ps ON ps.ticketFk = t.id LEFT JOIN vn.packingSiteAdvanced ps ON ps.ticketFk = t.id
WHERE t.id = vParamFk WHERE t.id = vParamFk
AND t.shipped >= vYesterday AND t.shipped >= vYesterday
UNION UNION
SELECT t.id ticketFk, SELECT t.id ticketFk,
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.departmentFk,
ob.description, ob.description,
IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb`, IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb`,
p.code parkingCode, p.code parkingCode,
IF (ps.ticketFk, TRUE, FALSE) isAdvanced IF (ps.ticketFk, TRUE, FALSE) isAdvanced
FROM vn.ticket t FROM vn.ticket t
JOIN vn.ticketCollection tc ON t.id = tc.ticketFk JOIN vn.ticketCollection tc ON t.id = tc.ticketFk
LEFT JOIN vn.collection c2 ON c2.id = tc.collectionFk LEFT JOIN vn.collection c2 ON c2.id = tc.collectionFk
LEFT JOIN vn.collectionColors cc LEFT JOIN vn.collectionColors cc
ON cc.wagon = tc.wagon ON cc.wagon = tc.wagon
AND cc.shelve = tc.`level` AND cc.shelve = tc.`level`
AND cc.trainFk = c2.trainFk AND cc.trainFk = c2.trainFk
LEFT JOIN vn.zone z ON z.id = t.zoneFk LEFT JOIN vn.zone z ON z.id = t.zoneFk
LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk
LEFT JOIN vn.client c ON c.id = t.clientFk LEFT JOIN vn.client c ON c.id = t.clientFk
LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
LEFT JOIN observation ob ON ob.ticketFk = t.id LEFT JOIN observation ob ON ob.ticketFk = t.id
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
LEFT JOIN vn.parking p ON tp.parkingFk = p.id LEFT JOIN vn.parking p ON tp.parkingFk = p.id
@ -81,18 +80,18 @@ BEGIN
NULL `level`, NULL `level`,
am.name agencyName, am.name agencyName,
t.warehouseFk, t.warehouseFk,
c.salesPersonFk, c.departmentFk,
ob.description, ob.description,
NULL `rgb`, NULL `rgb`,
p.code parkingCode, p.code parkingCode,
IF (ps.ticketFk, TRUE, FALSE) isAdvanced IF (ps.ticketFk, TRUE, FALSE) isAdvanced
FROM vn.sectorCollection sc FROM vn.sectorCollection sc
JOIN vn.sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id JOIN vn.sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id
JOIN vn.saleGroup sg ON sg.id = ss.saleGroupFk JOIN vn.saleGroup sg ON sg.id = ss.saleGroupFk
JOIN vn.ticket t ON t.id = sg.ticketFk JOIN vn.ticket t ON t.id = sg.ticketFk
LEFT JOIN vn.zone z ON z.id = t.zoneFk LEFT JOIN vn.zone z ON z.id = t.zoneFk
LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk
LEFT JOIN observation ob ON ob.ticketFk = t.id LEFT JOIN observation ob ON ob.ticketFk = t.id
LEFT JOIN vn.client c ON c.id = t.clientFk LEFT JOIN vn.client c ON c.id = t.clientFk
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
LEFT JOIN vn.parking p ON tp.parkingFk = p.id LEFT JOIN vn.parking p ON tp.parkingFk = p.id

View File

@ -1,41 +1,41 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemSale_byWeek`(vWeek INT, IN vYear INT, vItemFk INT, vWarehouseFk INT) CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemSale_byWeek`(vWeek INT, IN vYear INT, vItemFk INT, vWarehouseFk INT)
BEGIN BEGIN
DECLARE vStarted DATE; DECLARE vStarted DATE;
DECLARE vEnded DATETIME; DECLARE vEnded DATETIME;
SELECT MIN(dated), util.dayEnd(MAX(dated)) INTO vStarted, vEnded SELECT MIN(dated), util.dayEnd(MAX(dated)) INTO vStarted, vEnded
FROM `time` t FROM `time` t
WHERE CONCAT(vYear, LPAD(vWeek, 2, 0)) = t.period; WHERE CONCAT(vYear, LPAD(vWeek, 2, 0)) = t.period;
SELECT t.shipped, SELECT t.shipped,
w.name warehouse, w.name warehouse,
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,
s.price, s.price,
s.priceFixed, s.priceFixed,
s.discount, s.discount,
tls.name stateName, tls.name stateName,
sb.buyFk, sb.buyFk,
s.id saleFk, s.id saleFk,
wk.id salesPersonFk d.id departmentFk,
d.name departmentName
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.departmentFk
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
LEFT JOIN item ig ON ig.id = b.itemOriginalFk LEFT JOIN item ig ON ig.id = b.itemOriginalFk
WHERE s.itemFk = vItemFk WHERE s.itemFk = vItemFk
AND t.shipped BETWEEN vStarted AND vEnded AND t.shipped BETWEEN vStarted AND vEnded
AND IF(vWarehouseFk = 0, w.hasComission , t.warehouseFk = vWarehouseFk) AND IF(vWarehouseFk = 0, w.hasComission , t.warehouseFk = vWarehouseFk)

View File

@ -1,36 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`manaSpellersRequery`(vWorkerFk INTEGER)
`whole_proc`:
BEGIN
/**
* Guarda en workerMana el mana consumido por un trabajador
*
* @param vWorkerFk Id Trabajador
*/
DECLARE vWorkerIsExcluded BOOLEAN;
SELECT COUNT(*) INTO vWorkerIsExcluded
FROM workerManaExcluded
WHERE workerFk = vWorkerFk;
IF vWorkerIsExcluded THEN
LEAVE whole_proc;
END IF;
CREATE OR REPLACE TEMPORARY TABLE tmp.client
SELECT id
FROM client
WHERE salesPersonFk = vWorkerFk;
CALL client_getMana();
INSERT INTO workerMana (workerFk, amount)
SELECT vWorkerFk, sum(mana)
FROM tmp.clientMana
ON DUPLICATE KEY UPDATE amount = VALUES(amount);
DROP TEMPORARY TABLE
tmp.client,
tmp.clientMana;
END$$
DELIMITER ;

View File

@ -0,0 +1,35 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`manaSpellers_requery`(
vDepartmentFk INTEGER
)
BEGIN
jgallego marked this conversation as resolved
Review

Quitar, no hace falta

Quitar, no hace falta
/**
* Guarda en departmentMana el mana consumido por un departamento
*
* @param vDepartmentFk Id department
*/
DECLARE vIsDepartmentExcluded BOOLEAN;
SELECT COUNT(*) INTO vIsDepartmentExcluded
FROM departmentManaExcluded
WHERE departmentFk = vDepartmentFk;
IF NOT vIsDepartmentExcluded THEN
CREATE OR REPLACE TEMPORARY TABLE tmp.client
SELECT id
FROM client
WHERE departmentFk = vDepartmentFk;
CALL client_getMana();
INSERT INTO departmentMana (departmentFk, amount)
SELECT vDepartmentFk, SUM(mana)
FROM tmp.clientMana
ON DUPLICATE KEY UPDATE amount = VALUES(amount);
DROP TEMPORARY TABLE
tmp.client,
tmp.clientMana;
END IF;
END$$
DELIMITER ;

View File

@ -38,7 +38,7 @@ proc: BEGIN
SELECT s.ticketFk, SELECT s.ticketFk,
LEFT(CONCAT('F: ', GROUP_CONCAT(CONCAT(i.id, ' ', i.longName) SEPARATOR ', ')), 250) itemShortage, LEFT(CONCAT('F: ', GROUP_CONCAT(CONCAT(i.id, ' ', i.longName) SEPARATOR ', ')), 250) itemShortage,
LEFT(CONCAT('R: ', GROUP_CONCAT(CONCAT(i2.id, ' ', i2.longName) SEPARATOR ', ')), 250) itemDelay, LEFT(CONCAT('R: ', GROUP_CONCAT(CONCAT(i2.id, ' ', i2.longName) SEPARATOR ', ')), 250) itemDelay,
LEFT(CONCAT('I: ', GROUP_CONCAT(CONCAT(i3.id, ' ', i3.longName) SEPARATOR ', ')), 250) itemLost LEFT(CONCAT('I: ', GROUP_CONCAT(CONCAT(i3.id, ' ', i3.longName) SEPARATOR ', ')), 250) itemLost
FROM tmp.saleProblems sp FROM tmp.saleProblems sp
JOIN vn.sale s ON s.id = sp.saleFk JOIN vn.sale s ON s.id = sp.saleFk
LEFT JOIN vn.item i ON i.id = s.itemFk AND sp.hasItemShortage LEFT JOIN vn.item i ON i.id = s.itemFk AND sp.hasItemShortage
@ -74,13 +74,13 @@ proc: BEGIN
IF(tpr.hasTicketRequest, ' COD 100',''), IF(tpr.hasTicketRequest, ' COD 100',''),
IF(tpr.isTaxDataChecked, '',' FICHA INCOMPLETA'), IF(tpr.isTaxDataChecked, '',' FICHA INCOMPLETA'),
IF(tpr.hasComponentLack, ' COMPONENTES', ''), IF(tpr.hasComponentLack, ' COMPONENTES', ''),
IF(HOUR(util.VN_NOW()) < IF(HOUR(t.shipped), HOUR(t.shipped), COALESCE(HOUR(zc.hour),HOUR(z.hour))) IF(HOUR(util.VN_NOW()) < IF(HOUR(t.shipped), HOUR(t.shipped), COALESCE(HOUR(zc.hour),HOUR(z.hour)))
AND tpr.isTooLittle, ' PEQUEÑO', '') AND tpr.isTooLittle, ' PEQUEÑO', '')
) AS char(255))) problem, ) AS char(255))) problem,
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 departmentCode,
p.id provinceFk, p.id provinceFk,
tls.productionOrder, tls.productionOrder,
IFNULL(tls.alertLevel, al.id) alertLevel, IFNULL(tls.alertLevel, al.id) alertLevel,
@ -96,23 +96,23 @@ proc: BEGIN
ag.isOwn, ag.isOwn,
rm.bufferFk rm.bufferFk
FROM tmp.productionTicket tt FROM tmp.productionTicket tt
JOIN vn.ticket t ON tt.ticketFk = t.id JOIN ticket t ON tt.ticketFk = t.id
JOIN vn.alertLevel al ON al.code = 'FREE' JOIN alertLevel al ON al.code = 'FREE'
LEFT JOIN vn.ticketStateToday tst ON tst.ticketFk = t.id LEFT JOIN ticketStateToday tst ON tst.ticketFk = t.id
LEFT JOIN vn.`state` st ON st.id = tst.state LEFT JOIN `state` st ON st.id = tst.state
LEFT JOIN vn.client c ON c.id = t.clientFk LEFT JOIN client c ON c.id = t.clientFk
LEFT JOIN vn.worker wk ON wk.id = c.salesPersonFk LEFT JOIN department d ON d.id = c.departmentFk
JOIN vn.address a ON a.id = t.addressFk JOIN address a ON a.id = t.addressFk
LEFT JOIN vn.province p ON p.id = a.provinceFk LEFT JOIN province p ON p.id = a.provinceFk
JOIN vn.agencyMode am ON am.id = t.agencyModeFk JOIN agencyMode am ON am.id = t.agencyModeFk
JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
JOIN vn.agency ag ON ag.id = am.agencyFk JOIN agency ag ON ag.id = am.agencyFk
LEFT JOIN vn.ticketState tls ON tls.ticketFk = tt.ticketFk LEFT JOIN ticketState tls ON tls.ticketFk = tt.ticketFk
LEFT JOIN vn.ticketLastUpdated tlu ON tlu.ticketFk = tt.ticketFk LEFT JOIN ticketLastUpdated tlu ON tlu.ticketFk = tt.ticketFk
LEFT JOIN vn.worker w ON w.id = tls.userFk LEFT JOIN worker w ON w.id = tls.userFk
LEFT JOIN vn.routesMonitor rm ON rm.routeFk = t.routeFk LEFT JOIN routesMonitor rm ON rm.routeFk = t.routeFk
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk LEFT JOIN `zone` z ON z.id = t.zoneFk
LEFT JOIN vn.zoneClosure zc ON zc.zoneFk = t.zoneFk LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
AND DATE(t.shipped) = zc.dated AND DATE(t.shipped) = zc.dated
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
LEFT JOIN vn.parking pk ON pk.id = tp.parkingFk LEFT JOIN vn.parking pk ON pk.id = tp.parkingFk
@ -120,7 +120,7 @@ proc: BEGIN
LEFT JOIN saleProblemsDescription sp ON sp.ticketFk = tt.ticketFk LEFT JOIN saleProblemsDescription sp ON sp.ticketFk = tt.ticketFk
WHERE t.warehouseFk = vWarehouseFk WHERE t.warehouseFk = vWarehouseFk
AND dm.code IN ('AGENCY', 'DELIVERY', 'PICKUP'); AND dm.code IN ('AGENCY', 'DELIVERY', 'PICKUP');
UPDATE tmp.productionBuffer pb UPDATE tmp.productionBuffer pb
JOIN ( JOIN (
SELECT pb.ticketFk, GROUP_CONCAT(p.code) previaParking SELECT pb.ticketFk, GROUP_CONCAT(p.code) previaParking

View File

@ -8,7 +8,7 @@ BEGIN
* @param vRouteFk * @param vRouteFk
* @select Información de los tickets * @select Información de los tickets
*/ */
SELECT t.id Id, SELECT t.id Id,
t.clientFk Client, t.clientFk Client,
a.id Address, a.id Address,
a.nickname ClientName, a.nickname ClientName,
@ -23,20 +23,21 @@ 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, de.pbxQueue departmentPhone,
jgallego marked this conversation as resolved
Review

Quien se espera esto soportará departmentPhone o dará error?

Quien se espera esto soportará departmentPhone o dará error?
tob.description Note, tob.description Note,
t.isSigned Signed, t.isSigned Signed,
t.priority, t.priority,
t.cmrFk t.cmrFk
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 department de ON de.id = c.departmentFk
LEFT JOIN 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
JOIN delivery d ON t.id = d.ticketFk JOIN delivery d ON t.id = d.ticketFk
JOIN ticket ti ON ti.routeFk = vRouteFk JOIN ticket ti ON ti.routeFk = vRouteFk
AND ti.id = t.id AND ti.id = t.id
AND ti.clientFk = t.clientFk AND ti.clientFk = t.clientFk
GROUP BY addressFk GROUP BY addressFk

View File

@ -15,7 +15,7 @@ BEGIN
w.code workerCode, w.code workerCode,
sgd.saleFk, sgd.saleFk,
iss.quantity pickedQuantity, iss.quantity pickedQuantity,
c.salesPersonFk c.departmentFk
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

View File

@ -25,7 +25,6 @@ BEGIN
origin.futureState, origin.futureState,
origin.futureIpt, origin.futureIpt,
dest.ipt, dest.ipt,
origin.workerFk,
origin.futureLiters, origin.futureLiters,
origin.futureLines, origin.futureLines,
dest.shipped, dest.shipped,
@ -56,7 +55,6 @@ BEGIN
origin.saleClonedFk origin.saleClonedFk
FROM ( FROM (
SELECT s.ticketFk, SELECT s.ticketFk,
c.salesPersonFk workerFk,
t.shipped, t.shipped,
t.totalWithVat, t.totalWithVat,
st.name futureState, st.name futureState,
@ -74,11 +72,10 @@ BEGIN
t.warehouseFk, t.warehouseFk,
t.companyFk, t.companyFk,
t.agencyModeFk, t.agencyModeFk,
wd.departmentFk, c.departmentFk,
sc.saleClonedFk sc.saleClonedFk
FROM ticket t FROM ticket t
JOIN client c ON c.id = t.clientFk JOIN client c ON c.id = t.clientFk
JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
JOIN sale s ON s.ticketFk = t.id JOIN sale s ON s.ticketFk = t.id
LEFT JOIN saleCloned sc ON sc.saleClonedFk = s.id LEFT JOIN saleCloned sc ON sc.saleClonedFk = s.id
JOIN saleVolume sv ON sv.saleFk = s.id JOIN saleVolume sv ON sv.saleFk = s.id
@ -115,7 +112,7 @@ BEGIN
t.landed, t.landed,
t.agencyModeFk, t.agencyModeFk,
SEC_TO_TIME( SEC_TO_TIME(
COALESCE(HOUR(t.shipped), HOUR(zc.hour), HOUR(z.hour)) * 3600 + COALESCE(HOUR(t.shipped), HOUR(zc.hour), HOUR(z.hour)) * 3600 +
COALESCE(MINUTE(t.shipped), MINUTE(zc.hour), MINUTE(z.hour)) * 60 COALESCE(MINUTE(t.shipped), MINUTE(zc.hour), MINUTE(z.hour)) * 60
) preparation ) preparation
FROM ticket t FROM ticket t

View File

@ -1,6 +1,6 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_cloneWeekly`( CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_cloneWeekly`(
vDateFrom DATE, vDateFrom DATE,
vDateTo DATE vDateTo DATE
) )
BEGIN BEGIN
@ -32,7 +32,7 @@ BEGIN
t.addressFk, t.addressFk,
tt.agencyModeFk, tt.agencyModeFk,
ti.dated ti.dated
FROM ticketWeekly tt FROM ticketWeekly tt
JOIN ticket t ON tt.ticketFk = t.id JOIN ticket t ON tt.ticketFk = t.id
JOIN tmp.time ti JOIN tmp.time ti
WHERE WEEKDAY(ti.dated) = tt.weekDay; WHERE WEEKDAY(ti.dated) = tt.weekDay;
@ -44,12 +44,12 @@ BEGIN
OPEN vTickets; OPEN vTickets;
l: LOOP l: LOOP
SET vDone = FALSE; SET vDone = FALSE;
FETCH vTickets INTO FETCH vTickets INTO
vTicketFk, vTicketFk,
vClientFk, vClientFk,
vWarehouseFk, vWarehouseFk,
vCompanyFk, vCompanyFk,
vAddressFk, vAddressFk,
vAgencyModeFk, vAgencyModeFk,
vShipment; vShipment;
@ -63,17 +63,17 @@ BEGIN
JOIN saleCloned sc ON sc.saleOriginalFk = saleOrig.id JOIN saleCloned sc ON sc.saleOriginalFk = saleOrig.id
JOIN sale saleClon ON saleClon.id = sc.saleClonedFk JOIN sale saleClon ON saleClon.id = sc.saleClonedFk
JOIN ticket tClon ON tClon.id = saleClon.ticketFk JOIN ticket tClon ON tClon.id = saleClon.ticketFk
WHERE tOrig.id = vTicketFk WHERE tOrig.id = vTicketFk
AND tClon.isDeleted = FALSE AND tClon.isDeleted = FALSE
AND DATE(tClon.shipped) = vShipment) AND DATE(tClon.shipped) = vShipment)
THEN THEN
ITERATE l; ITERATE l;
END IF; END IF;
IF vAgencyModeFk IS NULL THEN IF vAgencyModeFk IS NULL THEN
SELECT agencyModeFk INTO vAgencyModeFk SELECT agencyModeFk INTO vAgencyModeFk
FROM address FROM address
WHERE clientFk = vClientFk WHERE clientFk = vClientFk
AND isDefaultAddress; AND isDefaultAddress;
END IF; END IF;
@ -94,17 +94,17 @@ BEGIN
FALSE, FALSE,
vNewTicket); vNewTicket);
UPDATE ticket UPDATE ticket
SET clonedFrom = vTicketFk SET clonedFrom = vTicketFk
WHERE id = vNewTicket; WHERE id = vNewTicket;
INSERT INTO sale (ticketFk, INSERT INTO sale (ticketFk,
itemFk, itemFk,
concept, concept,
quantity, quantity,
price, price,
discount, discount,
priceFixed, priceFixed,
isPriceFixed) isPriceFixed)
SELECT vNewTicket, SELECT vNewTicket,
itemFk, itemFk,
@ -120,7 +120,7 @@ BEGIN
INSERT IGNORE INTO saleCloned(saleOriginalFk, saleClonedFk) INSERT IGNORE INTO saleCloned(saleOriginalFk, saleClonedFk)
SELECT saleOriginal.id, saleClon.id SELECT saleOriginal.id, saleClon.id
FROM sale saleOriginal FROM sale saleOriginal
JOIN sale saleClon ON saleOriginal.itemFk = saleClon.itemFk JOIN sale saleClon ON saleOriginal.itemFk = saleClon.itemFk
AND saleOriginal.quantity = saleClon.quantity AND saleOriginal.quantity = saleClon.quantity
WHERE saleOriginal.ticketFk = vTicketFk WHERE saleOriginal.ticketFk = vTicketFk
AND saleClon.ticketFk = vNewTicket; AND saleClon.ticketFk = vNewTicket;
@ -150,43 +150,42 @@ BEGIN
buyed, buyed,
requesterFk, requesterFk,
attenderFk, attenderFk,
vNewTicket vNewTicket
FROM ticketRequest FROM ticketRequest
WHERE ticketFk = vTicketFk; WHERE ticketFk = vTicketFk;
INSERT INTO ticketObservation( INSERT INTO ticketObservation(
ticketFk, ticketFk,
observationTypeFk, observationTypeFk,
description) description)
VALUES( VALUES(
vNewTicket, vNewTicket,
vObservationSalesPersonFk, vObservationSalesPersonFk,
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),' ');
INSERT INTO ticketObservation(ticketFk, INSERT INTO ticketObservation(ticketFk,
observationTypeFk, observationTypeFk,
description) description)
VALUES( VALUES(
vNewTicket, vNewTicket,
vObservationItemPickerFk, vObservationItemPickerFk,
'ATENCION: Contiene lineas de TURNO') 'ATENCION: Contiene lineas de TURNO')
ON DUPLICATE KEY UPDATE description = ON DUPLICATE KEY UPDATE description =
CONCAT(ticketObservation.description,VALUES(description),' '); CONCAT(ticketObservation.description,VALUES(description),' ');
IF vLanding IS NULL THEN IF vLanding IS NULL THEN
SELECT IFNULL(d.notificationEmail, e.email) INTO vEmail
SELECT d.notificationEmail INTO vEmail
FROM client c FROM client c
JOIN account.emailUser e ON e.userFk = c.salesPersonFk LEFT JOIN department d ON d.id = c.departmentFk
LEFT JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
LEFT JOIN department d ON d.id = wd.departmentFk
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 ',
vTicketFk,' para el dia: ', vShipment); vTicketFk,' para el dia: ', vShipment);
SET vMessage = CONCAT('No se ha podido clonar el ticket ', vTicketFk, SET vMessage = CONCAT('No se ha podido clonar el ticket ', vTicketFk,
' para el dia: ', vShipment, ' para el dia: ', vShipment,
' porque no hay una zona de envío disponible. Se ha creado el ticket: ', ' porque no hay una zona de envío disponible. Se ha creado el ticket: ',
vNewTicket, ' pero ha que revisar las fechas y la agencia'); vNewTicket, ' pero ha que revisar las fechas y la agencia');

View File

@ -1,36 +1,33 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`workerDisable`(vUserId int) CREATE OR REPLACE DEFINER=`vn`@`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 UPDATE account.user
WHERE id = vUserId;
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,
c.hasCoreVnl = FALSE,
UPDATE `client` c c.isActive = FALSE,
SET c.salesPersonFk = null c.isTaxDataChecked = FALSE
WHERE c.salesPersonFk = vUserId; WHERE c.id = vUserFk;
UPDATE locker l UPDATE locker l
SET l.workerFk = NULL SET l.workerFk = NULL
WHERE l.workerFk = vUserId; WHERE l.workerFk = vUserId;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -23,21 +23,18 @@ BEGIN
WHERE landed BETWEEN vLanded AND util.dayEnd(vLanded) WHERE landed BETWEEN vLanded AND util.dayEnd(vLanded)
AND NOT isDeleted AND NOT isDeleted
) )
SELECT c.id, SELECT c.id clientFk,
c.name, c.name,
c.phone, c.phone,
bt.description, bt.description,
c.salesPersonFk, c.departmentFk,
u.name username, d.name departmentName,
jgallego marked this conversation as resolved
Review

Aquí habrá que cambiar grafana que es el único servicio que utiliza este proc, apuntar para el día de subida a producción que no se nos pase, ya que es una herramienta que gastan mucho los comerciales

Aquí habrá que cambiar grafana que es el único servicio que utiliza este proc, apuntar para el día de subida a producción que no se nos pase, ya que es una herramienta que gastan mucho los comerciales
aai.invoiced, aai.invoiced,
cnb.lastShipped, cnb.lastShipped,
IF(cwt.clientFk, TRUE, FALSE) hasTicket IF(cwt.clientFk, TRUE, FALSE) hasTicket
FROM vn.client c FROM vn.client c
JOIN vn.worker w ON w.id = c.salesPersonFk
JOIN vn.workerDepartment wd ON wd.workerFk = w.id
JOIN vn.department d ON d.id = wd.departmentFk
LEFT JOIN clientWithTicket cwt ON cwt.clientFk = c.id LEFT JOIN clientWithTicket cwt ON cwt.clientFk = c.id
LEFT JOIN account.`user` u ON u.id = c.salesPersonFk LEFT JOIN vn.department d ON d.id = c.departmentFk
JOIN vn.`address` a ON a.clientFk = c.id JOIN vn.`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

View File

@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`client_beforeInsert`
BEGIN BEGIN
SET NEW.editorFk = account.myUser_getId(); SET NEW.editorFk = account.myUser_getId();
SET NEW.accountingAccount = 4300000000 + NEW.id; SET NEW.accountingAccount = 4300000000 + NEW.id;
SET NEW.lastSalesPersonFk = NEW.salesPersonFk; SET NEW.lastdepartmentFk = NEW.departmentFk;
SET NEW.geoFk = client_getGeo(NEW.id); SET NEW.geoFk = client_getGeo(NEW.id);
IF (NEW.phone <> '') THEN IF (NEW.phone <> '') THEN
@ -15,5 +15,6 @@ BEGIN
IF (NEW.mobile <> '') THEN IF (NEW.mobile <> '') THEN
CALL pbx.phone_isValid(NEW.mobile); CALL pbx.phone_isValid(NEW.mobile);
END IF; END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -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.departmentFk;
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.departmentFk IS NULL AND OLD.departmentFk 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,10 +63,6 @@ BEGIN
END IF; END IF;
END IF; END IF;
IF NOT (NEW.salesPersonFk <=> OLD.salesPersonFk) THEN
SET NEW.lastSalesPersonFk = IFNULL(NEW.salesPersonFk, OLD.salesPersonFk);
END IF;
IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN
SET NEW.isTaxDataChecked = 0; SET NEW.isTaxDataChecked = 0;
END IF; END IF;

View File

@ -0,0 +1,10 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`departmentMana_beforeInsert`
BEFORE INSERT ON `departmentMana`
FOR EACH ROW
BEGIN
IF (SELECT EXISTS(SELECT TRUE FROM departmentManaExcluded WHERE departmentFk = NEW.departmentFk)) THEN
CALL util.throw('Department is excluded from mana');
END IF;
END$$
DELIMITER ;

View File

@ -0,0 +1,10 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`departmentMana_beforeUpdate`
BEFORE UPDATE ON `departmentMana`
FOR EACH ROW
BEGIN
IF (SELECT EXISTS(SELECT TRUE FROM departmentManaExcluded WHERE departmentFk = NEW.departmentFk)) THEN
CALL util.throw('Department is excluded from mana');
END IF;
END$$
DELIMITER ;

View File

@ -1,11 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingCart_beforeDelete`
BEFORE DELETE ON `sharingCart`
FOR EACH ROW
BEGIN
DELETE sc FROM sharingCartDaily sc
WHERE sc.dated BETWEEN OLD.started AND OLD.ended AND
sc.ownerFk = OLD.workerFk AND
sc.substituteFk = OLD.workerSubstitute;
END$$
DELIMITER ;

View File

@ -1,15 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingCart_beforeInsert`
BEFORE INSERT ON `sharingCart`
FOR EACH ROW
BEGIN
IF NEW.workerFk = NEW.workerSubstitute THEN
CALL util.throw ('worker and workerSubstitute must be different');
ELSE
INSERT IGNORE INTO sharingCartDaily (ownerFk, substituteFk, dated)
SELECT NEW.workerFk, NEW.workerSubstitute, dated
FROM time
WHERE dated BETWEEN NEW.started AND NEW.ended;
END IF;
END$$
DELIMITER ;

View File

@ -1,21 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingCart_beforeUpdate`
BEFORE UPDATE ON `sharingCart`
FOR EACH ROW
BEGIN
IF NEW.workerFk = NEW.workerSubstitute THEN
CALL util.throw ('worker and workerSubstitute must be different');
ELSE
DELETE sc FROM sharingCartDaily sc
WHERE sc.dated BETWEEN OLD.started AND OLD.ended AND
sc.ownerFk = OLD.workerFk AND
sc.substituteFk = OLD.workerSubstitute;
INSERT IGNORE INTO sharingCartDaily (ownerFk, substituteFk, dated)
SELECT NEW.workerFk, NEW.workerSubstitute, dated
FROM time
WHERE dated BETWEEN NEW.started AND NEW.ended;
END IF;
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingClient_beforeInsert`
BEFORE INSERT ON `sharingClient`
FOR EACH ROW
BEGIN
SET NEW.ended = GREATEST(util.VN_CURDATE(),NEW.ended);
SET NEW.started = GREATEST(util.VN_CURDATE(),NEW.started);
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`sharingClient_beforeUpdate`
BEFORE UPDATE ON `sharingClient`
FOR EACH ROW
BEGIN
SET NEW.ended = GREATEST(util.VN_CURDATE(),NEW.ended);
SET NEW.started = GREATEST(util.VN_CURDATE(),NEW.started);
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerManaExcluded_beforeInsert`
BEFORE INSERT ON `workerManaExcluded`
FOR EACH ROW
BEGIN
DELETE FROM workerMana
WHERE workerFk = NEW.workerFk;
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerManaExcluded_beforeUpdate`
BEFORE UPDATE ON `workerManaExcluded`
FOR EACH ROW
BEGIN
DELETE FROM workerMana
WHERE workerFk = NEW.workerFk;
END$$
DELIMITER ;

View File

@ -1,10 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerMana_beforeInsert`
BEFORE INSERT ON `workerMana`
FOR EACH ROW
BEGIN
IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN
CALL util.throw('Worker is excluded from mana');
END IF;
END$$
DELIMITER ;

View File

@ -1,10 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerMana_beforeUpdate`
BEFORE UPDATE ON `workerMana`
FOR EACH ROW
BEGIN
IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN
CALL util.throw('Worker is excluded from mana');
END IF;
END$$
DELIMITER ;

View File

@ -1,26 +1,16 @@
CREATE OR REPLACE DEFINER=`vn`@`localhost` CREATE OR REPLACE DEFINER=`vn`@`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`.`departmentFk` AS `departmentFk`,
`cn`.`firstShipped` AS `firstShipped` `s`.`dated` AS `dated`,
FROM ( `cn`.`firstShipped` AS `firstShipped`
( FROM
( ((`bs`.`clientNewBorn` `cn`
( JOIN `bs`.`sale` `s` ON
`bs`.`clientNewBorn` `cn` (`cn`.`firstShipped` + interval 1 year > `s`.`dated`
JOIN `bs`.`ventas` `v` ON( and `s`.`clientFk` = `cn`.`clientFk`))
`cn`.`firstShipped` + INTERVAL 1 year > `v`.`fecha` JOIN `vn`.`client` `c` ON
AND `v`.`Id_Cliente` = `cn`.`clientFk` (`c`.`id` = `s`.`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')

View File

@ -1,16 +0,0 @@
CREATE OR REPLACE DEFINER=`vn`@`localhost`
SQL SECURITY DEFINER
VIEW `vn`.`salesPersonSince`
AS SELECT `b`.`workerFk` AS `workerFk`,
min(`b`.`started`) AS `started`
FROM (
(
`vn`.`business` `b`
JOIN `vn`.`worker` `w` ON(`w`.`id` = `b`.`workerFk`)
)
LEFT JOIN `vn`.`professionalCategory` `pc` ON(
`pc`.`id` = `b`.`workerBusinessProfessionalCategoryFk`
)
)
WHERE `pc`.`description` = 'Aux ventas'
GROUP BY `b`.`workerFk`

View File

@ -0,0 +1,21 @@
CREATE OR REPLACE DEFINER=`vn`@`localhost`
SQL SECURITY DEFINER
VIEW `ticketDepartment` AS
SELECT
`t`.`id` AS `ticketFk`,
`c`.`departmentFk` AS `departmentFk`,
`d`.`name` AS `departmentName`
FROM
(
(
`ticket` `t`
LEFT JOIN `client` `c` ON
(
`c`.`id` = `t`.`clientFk`
)
)
LEFT JOIN `department` `d` ON
(
`d`.`id` = `c`.`departmentFk`
)
);

View File

@ -39,7 +39,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`.`departmentFk` AS `departmentFk`,
`c`.`isVies` AS `vies`, `c`.`isVies` AS `vies`,
`c`.`bankEntityFk` AS `bankEntityFk`, `c`.`bankEntityFk` AS `bankEntityFk`,
`c`.`typeFk` AS `typeFk` `c`.`typeFk` AS `typeFk`

View File

@ -0,0 +1,117 @@
ALTER TABLE vn.client
ADD IF NOT EXISTS departmentFk INT(11) DEFAULT NULL NULL;
ALTER TABLE vn.client
ADD IF NOT EXISTS lastDepartmentFk INT(11) DEFAULT NULL NULL;
ALTER TABLE vn.client
ADD CONSTRAINT client_department_FK FOREIGN KEY IF NOT EXISTS (departmentFk)
REFERENCES vn.department(id) ON DELETE RESTRICT ON UPDATE CASCADE;
ALTER TABLE vn.client
ADD CONSTRAINT client_lastDepartment_FK FOREIGN KEY IF NOT EXISTS (lastDepartmentFk)
REFERENCES vn.department(id) ON DELETE RESTRICT ON UPDATE CASCADE;
UPDATE vn.client c
JOIN vn.worker w ON w.id = c.salesPersonFk
JOIN vn.business b ON b.id = w.businessFk
SET c.departmentFk = b.departmentFk;
DROP TABLE IF EXISTS vn.departmentMana;
CREATE OR REPLACE TABLE `vn`.`departmentMana` (
`departmentFk` int(10) NOT NULL,
`size` int(11) NOT NULL DEFAULT 300,
`amount` int(11) NOT NULL DEFAULT 0,
`pricesModifierRate` double NOT NULL DEFAULT 0,
`isPricesModifierActivated` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`departmentFk`),
KEY `departmentMana_idx` (`departmentFk`),
CONSTRAINT `departmentMana_Department_FK` FOREIGN KEY (`departmentFk`)
REFERENCES `vn`.`department` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
DROP TABLE IF EXISTS bs.salesByClient;
CREATE OR REPLACE TABLE `bs`.`salesByClient` (
`dated` date NOT NULL DEFAULT '0000-00-00',
`departmentFk` int(10) DEFAULT NULL,
`clientFk` int(11) NOT NULL,
`amount` decimal(10,3) NOT NULL DEFAULT 0.000,
`equalizationTax` decimal(10,3) NOT NULL DEFAULT 0.000,
`amountNewBorn` decimal(10,3) NOT NULL DEFAULT 0.000,
PRIMARY KEY (`dated`,`clientFk`),
KEY `salesByClient_clientFk` (`clientFk`),
KEY `salesByClient_departmentFk` (`departmentFk`),
KEY `salesByClient_dated` (`dated`,`clientFk`,`amount`),
CONSTRAINT `salesByClient_clientFk_FK`
FOREIGN KEY (`clientFk`) REFERENCES `vn`.`client` (`id`) ON UPDATE CASCADE,
CONSTRAINT `salesByClient_department_FK`
FOREIGN KEY (`departmentFk`) REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Ventas diarias por cliente y departamento';
INSERT INTO bs.salesByClient(
dated,
departmentFk,
clientFk,
amount,
equalizationTax,
amountNewBorn)
SELECT ss.dated, c.departmentFk, ss.clientFk, ss.amount, ss.equalizationTax, ss.amountNewBorn
FROM bs.salesByclientSalesPerson ss
JOIN vn.client c ON c.id = ss.clientFk;
DROP TABLE IF EXISTS `vn`.`departmentNoUnassign`;
CREATE OR REPLACE TABLE `vn`.`departmentNoUnassign` (
`departmentFk` int(10) NOT NULL,
PRIMARY KEY (`departmentFk`),
CONSTRAINT `departmentNoUnassign_FK` FOREIGN KEY (`departmentFk`) REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci
COMMENT='Lista de departamentos comerciales que no se desasignarán automáticamente sus clientes';
DROP TABLE IF EXISTS `bs`.`portfolio`;
CREATE OR REPLACE TABLE `bs`.`portfolio` (
`departmentFk` int(10) NOT NULL,
`yeared` int(4) NOT NULL,
`monthed` int(2) NOT NULL,
`amount` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`departmentFk`,`yeared`,`monthed`),
KEY `portfolio_departmentFk` (`departmentFk`),
CONSTRAINT `portfolio_salesDepartment_department_FK`
FOREIGN KEY (`departmentFk`) REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
CREATE OR REPLACE TABLE `bs`.`salesDepartmentEvolution` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dated` date NOT NULL DEFAULT '0000-00-00',
`departmentFk` int(10) DEFAULT NULL,
`amount` decimal(10,3) NOT NULL DEFAULT 0.000,
`equalizationTax` decimal(10,3) NOT NULL DEFAULT 0.000,
`amountNewBorn` decimal(10,3) NOT NULL DEFAULT 0.000,
PRIMARY KEY (`id`),
KEY `salesDepartmentEvolution_salesDepartment` (`departmentFk`),
CONSTRAINT `salesDepartmentEvolution_salesDepartment_department_FK` FOREIGN KEY (`departmentFk`)
REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
RENAME TABLE vn.salespersonConfig TO vn.manaConfig;
ALTER TABLE vn.company ADD IF NOT EXISTS phone varchar(15) DEFAULT NULL NULL;
CREATE OR REPLACE TABLE `vn`.`departmentManaExcluded` (
`departmentFk` int(10) NOT NULL,
PRIMARY KEY (`departmentFk`),
CONSTRAINT `departmentManaExcluded_FK` FOREIGN KEY (`departmentFk`)
REFERENCES `vn`.`department` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci
COMMENT='Departamentos de venta que tienen que estar excluidos del cálculo del maná';
RENAME TABLE vn.workerManaExcluded TO vn.workerManaExcluded__;
ALTER TABLE vn.workerManaExcluded__
COMMENT='Usuarios que tienen que estar excluidos del cálculo del maná
@deprecated 2024-07-16';
UPDATE `salix`.`ACL` SET property = 'getDepartmentMana' WHERE property = 'getSalesPersonMana';

View File

@ -0,0 +1,6 @@
UPDATE `vn`.`client` c
LEFT JOIN `vn`.workerDepartment wd ON
c.salesPersonFk = wd.workerFk
LEFT JOIN account.`user` u ON u.id = c.salesPersonFk
LEFT JOIN `vn`.department d ON d.id = wd.departmentFk
SET c.departmentFk = d.id

View File

@ -0,0 +1,12 @@
RENAME TABLE vn.sharingCart TO vn.sharingCart__;
ALTER TABLE vn.sharingCart__
COMMENT='deprecated 2025-02-18';
RENAME TABLE vn.sharingCartDaily TO vn.sharingCartDaily__;
ALTER TABLE vn.sharingCartDaily__
COMMENT='deprecated 2025-02-18';
RENAME TABLE vn.sharingClient TO vn.sharingClient__;
ALTER TABLE vn.sharingClient__
COMMENT='deprecated 2025-02-18';

View File

@ -1,5 +0,0 @@
DELETE FROM vn.workerMana
WHERE workerFk IN (
SELECT workerFk
FROM vn.workerManaExcluded
);

View File

@ -313,7 +313,7 @@ export default {
clientDefaulter: { clientDefaulter: {
anyClient: 'vn-client-defaulter tbody > tr', anyClient: 'vn-client-defaulter tbody > tr',
firstClientName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(2) > span', firstClientName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(2) > span',
firstSalesPersonName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(4) > span', departmentName: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(4)',
firstObservation: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(9) > vn-textarea[ng-model="defaulter.observation"]', firstObservation: 'vn-client-defaulter tbody > tr:nth-child(2) > td:nth-child(9) > vn-textarea[ng-model="defaulter.observation"]',
allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check', allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check',
addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]', addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]',

View File

@ -17,13 +17,6 @@ describe('Ticket Edit sale path', () => {
await browser.close(); await browser.close();
}); });
it(`should click on the first sale claim icon to navigate over there`, async() => {
await page.waitToClick(selectors.ticketSales.firstSaleClaimIcon);
await page.waitForNavigation();
await page.goBack();
await page.goBack();
});
it('should navigate to the tickets index', async() => { it('should navigate to the tickets index', async() => {
await page.waitToClick(selectors.globalItems.applicationsMenuButton); await page.waitToClick(selectors.globalItems.applicationsMenuButton);
await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);

View File

@ -199,7 +199,7 @@
"This ticket is already invoiced": "This ticket is already invoiced", "This ticket is already invoiced": "This ticket is already invoiced",
"Negative basis of tickets: 23": "Negative basis of tickets: 23", "Negative basis of tickets: 23": "Negative basis of tickets: 23",
"Booking completed": "Booking complete", "Booking completed": "Booking complete",
"The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the sales person {{salesPersonId}} is in preparation", "The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the department {{departmentId}} is in preparation",
"You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets", "You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets",
"Bank entity must be specified": "Bank entity must be specified", "Bank entity must be specified": "Bank entity must be specified",
"Try again": "Try again", "Try again": "Try again",

View File

@ -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 department": "No se puede cambiar la forma de pago si no hay departamento asignado",
"can't be blank": "El campo no puede estar vacío", "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",

View File

@ -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 department": "Impossible de changer le mode de paiement s'il n'y a pas de service commercial",
"can't be blank": "Não pode ficar em branco", "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",
@ -326,7 +326,7 @@
"Fill all the fields": "Remplissez tous les champs", "Fill all the fields": "Remplissez tous les champs",
"The response is not a PDF": "La réponse n'est pas un PDF", "The response is not a PDF": "La réponse n'est pas un PDF",
"Booking completed": "Réservation terminée", "Booking completed": "Réservation terminée",
"The ticket is in preparation": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) du commercial {{salesPersonId}} est en préparation", "The ticket is in preparation": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) du département {{departmentId}} est en préparation",
"The notification subscription of this worker cant be modified": "L'abonnement à la notification de ce travailleur ne peut pas être modifié", "The notification subscription of this worker cant be modified": "L'abonnement à la notification de ce travailleur ne peut pas être modifié",
"User disabled": "Utilisateur désactivé", "User disabled": "Utilisateur désactivé",
"The amount cannot be less than the minimum": "La quantité ne peut pas être inférieure à la quantité minimale", "The amount cannot be less than the minimum": "La quantité ne peut pas être inférieure à la quantité minimale",
@ -369,4 +369,4 @@
"The web user's email already exists": "L'email de l'internaute existe déjà", "The web user's email already exists": "L'email de l'internaute existe déjà",
"Incorrect delivery order alert on route": "Alerte de bon de livraison incorrect sur l'itinéraire: {{ route }} zone : {{ zone }}", "Incorrect delivery order alert on route": "Alerte de bon de livraison incorrect sur l'itinéraire: {{ route }} zone : {{ zone }}",
"Ticket has been delivered out of order": "Le ticket {{ticket}} de la route {{{fullUrl}}} a été livré hors service." "Ticket has been delivered out of order": "Le ticket {{ticket}} de la route {{{fullUrl}}} a été livré hors service."
} }

View File

@ -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 department": "Não é possível alterar o método de pagamento se não houver departamento de vendas",
"can't be blank": "não pode estar em branco", "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",
@ -326,7 +326,7 @@
"Fill all the fields": "Preencha todos os campos", "Fill all the fields": "Preencha todos os campos",
"The response is not a PDF": "A resposta não é um PDF", "The response is not a PDF": "A resposta não é um PDF",
"Booking completed": "Reserva concluída", "Booking completed": "Reserva concluída",
"The ticket is in preparation": "O ticket está em preparação [{{ticketId}}]({{{ticketUrl}}}) comercial {{salesPersonId}}", "The ticket is in preparation": "O ticket está em preparação [{{ticketId}}]({{{ticketUrl}}}) do departamento {{departmentId}}",
"The notification subscription of this worker cant be modified": "A inscrição de notificação deste trabalhador não pode ser modificada", "The notification subscription of this worker cant be modified": "A inscrição de notificação deste trabalhador não pode ser modificada",
"User disabled": "Usuário desativado", "User disabled": "Usuário desativado",
"The amount cannot be less than the minimum": "O valor não pode ser menor que o mínimo", "The amount cannot be less than the minimum": "O valor não pode ser menor que o mínimo",
@ -368,4 +368,4 @@
"The web user's email already exists": "O e-mail do utilizador da web já existe.", "The web user's email already exists": "O e-mail do utilizador da web já existe.",
"Incorrect delivery order alert on route": "Alerta de ordem de entrega incorreta na rota: {{ route }} zona: {{ zone }}", "Incorrect delivery order alert on route": "Alerta de ordem de entrega incorreta na rota: {{ route }} zona: {{ zone }}",
"Ticket has been delivered out of order": "O ticket {{ticket}} da rota {{{fullUrl}}} foi entregue fora de ordem." "Ticket has been delivered out of order": "O ticket {{ticket}} da rota {{{fullUrl}}} foi entregue fora de ordem."
} }

View File

@ -1,14 +1,12 @@
const app = require('vn-loopback/server/server'); const app = require('vn-loopback/server/server');
describe('claimstate isEditable()', () => { describe('claimstate isEditable()', () => {
const salesPersonId = 18;
const claimManagerId = 72; const claimManagerId = 72;
it('should return false if the given state does not exist', async() => { it('should return false if the given state does not exist', async() => {
const tx = await app.models.Claim.beginTransaction({}); const tx = await app.models.Claim.beginTransaction({});
try { try {
const options = {transaction: tx}; const options = {transaction: tx};
const ctx = {req: {accessToken: {userId: claimManagerId}}}; const ctx = {req: {accessToken: {userId: claimManagerId}}};
const result = await app.models.ClaimState.isEditable(ctx, 9999, options); const result = await app.models.ClaimState.isEditable(ctx, 9999, options);
@ -26,7 +24,7 @@ describe('claimstate isEditable()', () => {
try { try {
const options = {transaction: tx}; const options = {transaction: tx};
const salesPersonId = 18;
const ctx = {req: {accessToken: {userId: salesPersonId}}}; const ctx = {req: {accessToken: {userId: salesPersonId}}};
const result = await app.models.ClaimState.isEditable(ctx, 3, options); const result = await app.models.ClaimState.isEditable(ctx, 3, options);

View File

@ -44,7 +44,6 @@ module.exports = Self => {
Self.claimPickupEmail = async ctx => { Self.claimPickupEmail = async ctx => {
const models = Self.app.models; const models = Self.app.models;
const $t = ctx.req.__; // $translate const $t = ctx.req.__; // $translate
const url = await Self.app.models.Url.getUrl();
const args = Object.assign({}, ctx.args); const args = Object.assign({}, ctx.args);
const params = { const params = {
@ -61,20 +60,27 @@ module.exports = Self => {
include: { include: {
relation: 'client', relation: 'client',
scope: { scope: {
fields: ['name', 'salesPersonFk'] fields: ['name', 'departmentFk'],
include: {
relation: 'department',
scope: {
fields: ['id', 'chatName']
}
}
} }
} }
}); });
const message = $t('Claim pickup order sent', { const department = claim.client().department();
claimId: args.id, if (department) {
clientName: claim.client().name, const url = await Self.app.models.Url.getUrl();
claimUrl: `${url}claim/${args.id}/summary`, const message = $t('Claim pickup order sent', {
}); claimId: args.id,
const salesPersonId = claim.client().salesPersonFk; clientName: claim.client().name,
if (salesPersonId) claimUrl: `${url}claim/${args.id}/summary`,
await models.Chat.sendCheckingPresence(ctx, salesPersonId, message); });
await models.Chat.send(ctx, `#${department.chatName}`, message);
}
const email = new Email('claim-pickup-order', params); const email = new Email('claim-pickup-order', params);
return email.send(); return email.send();

View File

@ -47,10 +47,11 @@ module.exports = Self => {
include: { include: {
relation: 'client', relation: 'client',
scope: { scope: {
fields: ['id', 'departmentFk'],
include: { include: {
relation: 'salesPersonUser', relation: 'department',
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 department = ticket.client().department();
if (salesPerson) { if (department) {
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, `#${department.chatName}`, message);
} }
if (tx) await tx.commit(); if (tx) await tx.commit();

View File

@ -51,9 +51,9 @@ module.exports = Self => {
http: {source: 'query'} http: {source: 'query'}
}, },
{ {
arg: 'salesPersonFk', arg: 'departmentFk',
type: 'number', type: 'number',
description: 'The salesPerson id', description: 'The department id',
http: {source: 'query'} http: {source: 'query'}
}, },
{ {
@ -158,8 +158,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 'departmentFk':
return {'c.salesPersonFk': value}; return {'c.departmentFk': value};
case 'attenderFk': case 'attenderFk':
return {'cl.workerFk': value}; return {'cl.workerFk': value};
case 'created': case 'created':

View File

@ -53,9 +53,9 @@ module.exports = Self => {
{ {
relation: 'client', relation: 'client',
scope: { scope: {
fields: ['salesPersonFk', 'name'], fields: ['departmentFk', 'name'],
include: { include: {
relation: 'salesPersonUser', relation: 'department',
scope: { scope: {
fields: ['id', 'name'] fields: ['id', 'name']
} }

View File

@ -41,21 +41,21 @@ 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) {
const destination = claimEnd.claimDestination(); const destination = claimEnd.claimDestination();
const sale = await getSale(claimEnd.saleFk, myOptions); const sale = await getSale(claimEnd.saleFk, myOptions);
const addressId = destination && destination.addressFk; const addressId = destination?.addressFk;
let address; let address;
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 department = sale.ticket().client().department();
if (salesPerson) { if (department) {
const nickname = address && address.nickname || destination.description; const nickname = 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', {
quantity: sale.quantity, quantity: sale.quantity,
@ -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, `#${department.chatName}`, message);
} }
if (!address) continue; if (!address) continue;
@ -120,10 +120,11 @@ module.exports = Self => {
include: { include: {
relation: 'client', relation: 'client',
scope: { scope: {
fields: ['departmentFk'],
include: { include: {
relation: 'salesPersonUser', relation: 'department',
scope: { scope: {
fields: ['id', 'name'] fields: ['id', 'chatName']
} }
} }
} }

View File

@ -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, '#es_vip_equipo', 'Trash');
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4); expect(chatModel.send).toHaveBeenCalledTimes(4);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
@ -71,17 +71,17 @@ 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);
for (claimEnd of claimEnds) for (let claimEnd of claimEnds)
await claimEnd.updateAttributes({claimDestinationFk: okDestination}, options); await claimEnd.updateAttributes({claimDestinationFk: okDestination}, options);
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, '#es_vip_equipo', 'Bueno');
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4); expect(chatModel.send).toHaveBeenCalledTimes(4);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
@ -90,23 +90,23 @@ describe('claim regularizeClaim()', () => {
} }
}); });
it('should send a chat message to the salesPerson when claim isPickUp is enabled', async() => { it('should send a chat message to the department when claim isPickUp is enabled', async() => {
const tx = await models.Claim.beginTransaction({}); const tx = await models.Claim.beginTransaction({});
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);
for (claimEnd of claimEnds) for (let claimEnd of claimEnds)
await claimEnd.updateAttributes({claimDestinationFk: okDestination}, options); await claimEnd.updateAttributes({claimDestinationFk: okDestination}, options);
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, '#es_vip_equipo', 'Bueno');
expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4); expect(chatModel.send).toHaveBeenCalledTimes(4);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {

View File

@ -31,11 +31,11 @@ describe('Update Claim', () => {
const newClaim = await app.models.Claim.create(originalData, options); const newClaim = await app.models.Claim.create(originalData, options);
const forbiddenState = 3; const forbiddenState = 3;
const salesPersonId = 18; const userId = 18;
const ctx = { const ctx = {
req: { req: {
accessToken: { accessToken: {
userId: salesPersonId userId
} }
}, },
args: { args: {
@ -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) {

View File

@ -63,13 +63,19 @@ module.exports = Self => {
include: { include: {
relation: 'client', relation: 'client',
scope: { scope: {
fields: ['departmentFk'],
include: { include: {
relation: 'salesPersonUser' relation: 'department',
scope: {
fields: ['id', 'chatName']
}
} }
} }
} }
}, myOptions); }, myOptions);
const department = claim.client().department();
const changedPickup = args.pickup && args.pickup != claim.pickup; const changedPickup = args.pickup && args.pickup != claim.pickup;
if (args.claimStateFk) { if (args.claimStateFk) {
@ -84,12 +90,16 @@ 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 (department) {
if (salesPerson && args.claimStateFk) { if (changedPickup && updatedClaim.pickup)
const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions); await notifyPickUp(ctx, department, claim);
await notifyStateChange(ctx, salesPerson.id, claim, newState.description);
if (newState.code == 'canceled') if (args.claimStateFk) {
await notifyStateChange(ctx, claim.workerFk, claim, newState.description); const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
await notifyStateChange(ctx, department, claim, newState.description);
if (newState.code == 'canceled')
await notifyStateChange(ctx, claim.workerFk, claim, newState.description);
}
} }
if (tx) await tx.commit(); if (tx) await tx.commit();
@ -101,7 +111,7 @@ module.exports = Self => {
} }
}; };
async function notifyStateChange(ctx, workerId, claim, newState) { async function notifyStateChange(ctx, department, claim, newState) {
const models = Self.app.models; const models = Self.app.models;
const url = await models.Url.getUrl(); const url = await models.Url.getUrl();
const $t = ctx.req.__; const $t = ctx.req.__;
@ -112,6 +122,20 @@ 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, `#${department.chatName}`, message);
}
async function notifyPickUp(ctx, department, claim) {
const models = Self.app.models;
const url = await models.Url.getUrl();
const $t = ctx.req.__; // $translate
const message = $t('Claim will be picked', {
claimId: claim.id,
clientName: claim.client().name,
claimUrl: `${url}claim/${claim.id}/summary`,
claimPickup: $t(claim.pickup)
});
await models.Chat.send(ctx, `#${department.chatName}`, message);
} }
}; };

View File

@ -37,9 +37,9 @@
<vn-label-value <vn-label-value
label="Salesperson"> label="Salesperson">
<span <span
ng-click="workerDescriptor.show($event, $ctrl.claim.client.salesPersonFk)" ng-click="workerDescriptor.show($event, $ctrl.claim.client.departmentFk)"
class="link"> class="link">
{{$ctrl.claim.client.salesPersonUser.name}} {{$ctrl.claim.client.department.name}}
</span> </span>
</vn-label-value> </vn-label-value>
<vn-label-value <vn-label-value

View File

@ -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 departmentFk: 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 lastdepartmentFk: last sales department
rating: rating rating: rating
recommendedCredit: recommended credit recommendedCredit: recommended credit

View File

@ -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 departmentFk: 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 lastdepartmentFk: último departmaneto comercial
rating: clasificación rating: clasificación
recommendedCredit: crédito recomendado recommendedCredit: crédito recomendado

View File

@ -29,26 +29,26 @@ 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 departmentEmail
FROM client c FROM client c
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk JOIN department d ON d.id = c.departmentFk
JOIN ticket t ON t.clientFk = c.id JOIN 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]);
for (const client of clients) { for (const client of clients) {
try { try {
const args = { const args = {
id: client.clientFk, id: client.clientFk,
recipient: client.clientEmail, recipient: client.clientEmail,
replyTo: client.salesPersonEmail, replyTo: client.departmentEmail,
from: params.from, from: params.from,
to: params.to to: params.to
}; };

View File

@ -68,7 +68,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, departmentFk: data.departmentFk,
postcode: data.postcode, postcode: data.postcode,
street: data.street, street: data.street,
city: data.city, city: data.city,

View File

@ -23,7 +23,7 @@ module.exports = Self => {
description: 'The client name', description: 'The client name',
}, },
{ {
arg: 'salesPersonFk', arg: 'departmentFk',
type: 'number', type: 'number',
}, },
{ {
@ -92,7 +92,7 @@ module.exports = Self => {
case 'sageTransactionTypeFk': case 'sageTransactionTypeFk':
return {'stt.CodigoTransaccion': value}; return {'stt.CodigoTransaccion': value};
case 'name': case 'name':
case 'salesPersonFk': case 'departmentFk':
case 'fi': case 'fi':
case 'socialName': case 'socialName':
case 'city': case 'city':
@ -138,8 +138,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 departmentFk,
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,
@ -149,7 +149,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.departmentFk
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

View File

@ -22,7 +22,7 @@ module.exports = Self => {
description: 'The client name', description: 'The client name',
}, },
{ {
arg: 'salesPersonFk', arg: 'salesDeparmentFk',
type: 'number', type: 'number',
}, },
{ {
@ -126,7 +126,7 @@ module.exports = Self => {
{'a.provinceFk': value} {'a.provinceFk': value}
]}; ]};
case 'name': case 'name':
case 'salesPersonFk': case 'departmentFk':
case 'fi': case 'fi':
case 'socialName': case 'socialName':
case 'email': case 'email':
@ -146,7 +146,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,
@ -154,14 +153,14 @@ 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 departmentFk,
u.name AS salesPerson, d.name departmentName,
co.name AS country co.name AS country
FROM client c FROM client c
LEFT JOIN account.user u ON u.id = c.salesPersonFk LEFT JOIN department d ON d.id = c.departmentFk
LEFT JOIN province p ON p.id = c.provinceFk LEFT JOIN province p ON p.id = c.provinceFk
LEFT JOIN country co ON co.id = c.countryFk LEFT JOIN country co ON co.id = c.countryFk
JOIN address a ON a.clientFk = c.id JOIN address a ON a.clientFk = c.id

View File

@ -42,7 +42,7 @@ module.exports = function(Self) {
} }
}, },
{ {
relation: 'salesPersonUser', relation: 'department',
scope: { scope: {
fields: ['id', 'name'] fields: ['id', 'name']
} }

View File

@ -36,7 +36,8 @@ describe('Client Create', () => {
street: 'WALL STREET', street: 'WALL STREET',
city: 'New York', city: 'New York',
businessTypeFk: 'florist', businessTypeFk: 'florist',
provinceFk: 1 provinceFk: 1,
departmentFk: 155
}; };
try { try {

View File

@ -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 = 155;
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: {departmentFk: 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.departmentFk).toEqual(salesDepartmementId);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {

View File

@ -86,14 +86,14 @@ describe('client filter()', () => {
} }
}); });
it('should return the clients matching the "salesPersonFk" argument', async() => { it('should return the clients matching the "departmentFk" argument', async() => {
const tx = await models.Client.beginTransaction({}); const tx = await models.Client.beginTransaction({});
const salesPersonId = 18; const departmentId = 155;
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: {departmentFk: departmentId}};
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.departmentFk).toEqual(departmentId);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {

View File

@ -46,7 +46,7 @@ module.exports = Self => {
} }
}, },
{ {
relation: 'salesPersonUser', relation: 'department',
scope: { scope: {
fields: ['id', 'name'] fields: ['id', 'name']
} }

View File

@ -38,8 +38,7 @@ module.exports = Self => {
Object.assign(myOptions, options); Object.assign(myOptions, options);
const where = buildFilter(ctx.args, (param, value) => { const where = buildFilter(ctx.args, (param, value) => {
switch (param) { if (param === 'search') {
case 'search':
return {or: [ return {or: [
{'c.id': value}, {'c.id': value},
{'c.name': {like: `%${value}%`}} {'c.name': {like: `%${value}%`}}
@ -57,16 +56,17 @@ module.exports = Self => {
let stmt = new ParameterizedSQL( let stmt = new ParameterizedSQL(
`CREATE OR REPLACE TEMPORARY TABLE tmp.defaulters `CREATE OR REPLACE TEMPORARY TABLE tmp.defaulters
WITH clientObservations AS WITH wClientObservations AS
(SELECT clientFk,text, created, workerFk (SELECT clientFk,text, created, workerFk
FROM vn.clientObservation FROM vn.clientObservation
GROUP BY clientFk GROUP BY clientFk
ORDER BY created DESC ORDER BY created DESC
)SELECT c.id clientFk, )SELECT c.id clientFk,
c.name clientName, c.name clientName,
c.salesPersonFk,
c.businessTypeFk = 'worker' isWorker, c.businessTypeFk = 'worker' isWorker,
u.name salesPersonName, c.departmentFk,
c.businessTypeFk,
de.name departmentName,
d.amount, d.amount,
co.created, co.created,
co.text observation, co.text observation,
@ -78,15 +78,13 @@ module.exports = Self => {
c.countryFk, c.countryFk,
pm.name payMethod, pm.name payMethod,
r.finished IS NULL hasRecovery, r.finished IS NULL hasRecovery,
dp.id departmentFk, de.notificationEmail departmentEmail
dp.name departmentName,
dp.notificationEmail departmentEmail
FROM defaulter d FROM defaulter d
JOIN client c ON c.id = d.clientFk JOIN client c ON c.id = d.clientFk
JOIN country cn ON cn.id = c.countryFk JOIN country cn ON cn.id = c.countryFk
JOIN payMethod pm ON pm.id = c.payMethodFk JOIN payMethod pm ON pm.id = c.payMethodFk
LEFT JOIN clientObservations co ON co.clientFk = c.id LEFT JOIN wClientObservations co ON co.clientFk = c.id
LEFT JOIN account.user u ON u.id = c.salesPersonFk LEFT JOIN department de ON de.id = c.departmentFk
LEFT JOIN account.user uw ON uw.id = co.workerFk LEFT JOIN account.user uw ON uw.id = co.workerFk
LEFT JOIN ( LEFT JOIN (
SELECT r1.started, r1.clientFk, r1.finished SELECT r1.started, r1.clientFk, r1.finished
@ -99,9 +97,7 @@ module.exports = Self => {
AND r1.started = r2.maxStarted AND r1.started = r2.maxStarted
WHERE r1.finished WHERE r1.finished
GROUP BY r1.clientFk GROUP BY r1.clientFk
) r ON r.clientFk = c.id ) r ON r.clientFk = c.id`);
LEFT JOIN workerDepartment wd ON wd.workerFk = u.id
LEFT JOIN department dp ON dp.id = wd.departmentFk`);
stmt.merge(conn.makeWhere(filter.where)); stmt.merge(conn.makeWhere(filter.where));
stmts.push(stmt); stmts.push(stmt);

View File

@ -126,12 +126,12 @@ module.exports = Self => {
done(); done();
} }
Self.validate('payMethod', hasSalesMan, { Self.validate('payMethod', hasDepartment, {
message: 'Cannot change the payment method if no salesperson' message: 'Cannot change the payment method if no department'
}); });
function hasSalesMan(err) { function hasDepartment(err) {
if (this.payMethod && !this.salesPersonUser) if (this.payMethod && !this.department)
err(); err();
} }
@ -283,9 +283,8 @@ module.exports = Self => {
const finalState = getFinalState(ctx); const finalState = getFinalState(ctx);
const payMethodWithIban = 4; const payMethodWithIban = 4;
// Validate socialName format
const hasChanges = orgData && changes; const hasChanges = orgData && changes;
const socialName = changes && changes.socialName || orgData && orgData.socialName; const socialName = changes?.socialName || orgData?.socialName;
const isTaxDataChecked = hasChanges && (changes.isTaxDataChecked || orgData.isTaxDataChecked); const isTaxDataChecked = hasChanges && (changes.isTaxDataChecked || orgData.isTaxDataChecked);
const socialNameChanged = hasChanges const socialNameChanged = hasChanges
@ -296,7 +295,7 @@ module.exports = Self => {
if ((socialNameChanged || isTaxDataCheckedChanged) && !isAlpha(socialName)) if ((socialNameChanged || isTaxDataCheckedChanged) && !isAlpha(socialName))
throw new UserError(`The social name has an invalid format`); throw new UserError(`The social name has an invalid format`);
if (changes.salesPerson === null) { if (changes.department === null) {
changes.credit = 0; changes.credit = 0;
changes.discount = 0; changes.discount = 0;
changes.payMethodFk = 5; // Credit card changes.payMethodFk = 5; // Credit card
@ -358,18 +357,17 @@ 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 departmentId = instance.departmentFk;
if (salesPersonId) { if (departmentId) {
// Send email to client const department = await models.Department.findById(departmentId);
if (instance.email) { if (instance.email) {
const {Email} = require('vn-print'); const {Email} = require('vn-print');
const worker = await models.EmailUser.findById(salesPersonId);
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: department.notificationEmail
}; };
const email = new Email('payment-update', params); const email = new Email('payment-update', params);
await email.send(); await email.send();
@ -381,19 +379,15 @@ 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, `#${department.chatName}`, message);
} }
} }
const workerIdBefore = oldInstance.salesPersonFk; if (oldInstance.departmentFk != newInstance.departmentFk)
const workerIdAfter = newInstance.salesPersonFk; await Self.notifyAssignment(instance, oldInstance.departmentFk, newInstance.departmentFk);
const assignmentChanged = workerIdBefore != workerIdAfter;
if (assignmentChanged)
await Self.notifyAssignment(instance, workerIdBefore, workerIdAfter);
}); });
// Send notification on client worker assignment Self.notifyAssignment = async function notifyAssignment(client, previousDepartmentId, currentDepartmentId) {
Self.notifyAssignment = async function notifyAssignment(client, previousWorkerId, currentWorkerId) {
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;
@ -401,38 +395,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: {
id: previousDepartmentId
}
}); });
previousWorker.user = worker && worker.user().name;
previousWorker.name = worker && worker.user().nickname;
} }
if (currentDepartmentId) {
if (currentWorkerId) { currentDepartment = await models.Department.findOne({
const worker = await models.Worker.findById(currentWorkerId, { field: ['name', 'chatName'],
include: {relation: 'user'} where: {
id: currentDepartmentId
}
}); });
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

Some files were not shown because too many files have changed in this diff Show More