Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 3963-ticket-advance
gitea/salix/pipeline/head There was a failure building this commit
Details
gitea/salix/pipeline/head There was a failure building this commit
Details
This commit is contained in:
commit
72c27f7176
|
@ -51,7 +51,7 @@ module.exports = Self => {
|
||||||
const dstFile = path.join(dmsContainer.client.root, pathHash, dms.file);
|
const dstFile = path.join(dmsContainer.client.root, pathHash, dms.file);
|
||||||
await fs.unlink(dstFile);
|
await fs.unlink(dstFile);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code != 'ENOENT')
|
if (err.code != 'ENOENT' && dms.file)
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
ALTER TABLE `vn`.`accountingType` ADD daysInFuture INT NULL;
|
|
||||||
ALTER TABLE `vn`.`accountingType` MODIFY COLUMN daysInFuture int(11) DEFAULT 0 NULL;
|
|
||||||
UPDATE `vn`.`accountingType` SET daysInFuture=1 WHERE id=8;
|
|
|
@ -1,4 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
|
||||||
VALUES
|
|
||||||
('ItemType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
|
|
||||||
('ItemType', '*', 'WRITE', 'ALLOW', 'ROLE', 'buyer');
|
|
|
@ -1,14 +0,0 @@
|
||||||
CREATE TABLE IF NOT EXISTS `vn`.`mdbBranch` (
|
|
||||||
`name` VARCHAR(255),
|
|
||||||
PRIMARY KEY(`name`)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vn`.`mdbVersion` (
|
|
||||||
`app` VARCHAR(255) NOT NULL,
|
|
||||||
`branchFk` VARCHAR(255) NOT NULL,
|
|
||||||
`version` INT,
|
|
||||||
CONSTRAINT `mdbVersion_branchFk` FOREIGN KEY (`branchFk`) REFERENCES `vn`.`mdbBranch` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT IGNORE INTO `salix`.`ACL` (`id`, `model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
|
||||||
VALUES(318, 'MdbVersion', '*', '*', 'ALLOW', 'ROLE', 'developer');
|
|
|
@ -1,13 +0,0 @@
|
||||||
CREATE TABLE `vn`.`chat` (
|
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`senderFk` int(10) unsigned DEFAULT NULL,
|
|
||||||
`recipient` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
||||||
`dated` date DEFAULT NULL,
|
|
||||||
`checkUserStatus` tinyint(1) DEFAULT NULL,
|
|
||||||
`message` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
|
|
||||||
`status` tinyint(1) DEFAULT NULL,
|
|
||||||
`attempts` int(1) DEFAULT NULL,
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `chat_FK` (`senderFk`),
|
|
||||||
CONSTRAINT `chat_FK` FOREIGN KEY (`senderFk`) REFERENCES `account`.`user` (`id`) ON UPDATE CASCADE
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
|
|
@ -1,8 +0,0 @@
|
||||||
ALTER TABLE `vn`.`creditInsurance` ADD creditClassificationFk int(11) NULL;
|
|
||||||
|
|
||||||
UPDATE `vn`.`creditInsurance` AS `destiny`
|
|
||||||
SET `destiny`.`creditClassificationFk`= (SELECT creditClassification FROM `vn`.`creditInsurance` AS `origin` WHERE `origin`.id = `destiny`.id);
|
|
||||||
|
|
||||||
ALTER TABLE `vn`.`creditInsurance`
|
|
||||||
ADD CONSTRAINT `creditInsurance_creditClassificationFk` FOREIGN KEY (`creditClassificationFk`)
|
|
||||||
REFERENCES `vn`.`creditClassification` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
@ -1,3 +0,0 @@
|
||||||
INSERT INTO `salix`.`defaultViewConfig` (tableCode, columns)
|
|
||||||
VALUES ('clientsDetail', '{"id":true,"phone":true,"city":true,"socialName":true,"salesPersonFk":true,"email":true,"name":false,"fi":false,"credit":false,"creditInsurance":false,"mobile":false,"street":false,"countryFk":false,"provinceFk":false,"postcode":false,"created":false,"businessTypeFk":false,"payMethodFk":false,"sageTaxTypeFk":false,"sageTransactionTypeFk":false,"isActive":false,"isVies":false,"isTaxDataChecked":false,"isEqualizated":false,"isFreezed":false,"hasToInvoice":false,"hasToInvoiceByAddress":false,"isToBeMailed":false,"hasLcr":false,"hasCoreVnl":false,"hasSepaVnl":false}');
|
|
||||||
|
|
|
@ -1,127 +0,0 @@
|
||||||
DROP PROCEDURE IF EXISTS `vn`.`ticket_doRefund`;
|
|
||||||
|
|
||||||
DELIMITER $$
|
|
||||||
$$
|
|
||||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_doRefund`(OUT vNewTicket INT)
|
|
||||||
BEGIN
|
|
||||||
/**
|
|
||||||
* Crea un ticket de abono a partir de tmp.sale y/o tmp.ticketService
|
|
||||||
*
|
|
||||||
* @return vNewTicket
|
|
||||||
*/
|
|
||||||
DECLARE vDone BIT DEFAULT 0;
|
|
||||||
DECLARE vClientFk MEDIUMINT;
|
|
||||||
DECLARE vWarehouse TINYINT;
|
|
||||||
DECLARE vCompany MEDIUMINT;
|
|
||||||
DECLARE vAddress MEDIUMINT;
|
|
||||||
DECLARE vRefundAgencyMode INT;
|
|
||||||
DECLARE vItemFk INT;
|
|
||||||
DECLARE vQuantity DECIMAL (10,2);
|
|
||||||
DECLARE vConcept VARCHAR(50);
|
|
||||||
DECLARE vPrice DECIMAL (10,2);
|
|
||||||
DECLARE vDiscount TINYINT;
|
|
||||||
DECLARE vSaleNew INT;
|
|
||||||
DECLARE vSaleMain INT;
|
|
||||||
DECLARE vZoneFk INT;
|
|
||||||
DECLARE vDescription VARCHAR(50);
|
|
||||||
DECLARE vTaxClassFk INT;
|
|
||||||
DECLARE vTicketServiceTypeFk INT;
|
|
||||||
DECLARE vOriginTicket INT;
|
|
||||||
|
|
||||||
DECLARE cSales CURSOR FOR
|
|
||||||
SELECT s.id, s.itemFk, - s.quantity, s.concept, s.price, s.discount
|
|
||||||
FROM tmp.sale s;
|
|
||||||
|
|
||||||
DECLARE cTicketServices CURSOR FOR
|
|
||||||
SELECT ts.description, - ts.quantity, ts.price, ts.taxClassFk, ts.ticketServiceTypeFk
|
|
||||||
FROM tmp.ticketService ts;
|
|
||||||
|
|
||||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
|
||||||
|
|
||||||
SELECT sub.ticketFk INTO vOriginTicket
|
|
||||||
FROM (
|
|
||||||
SELECT s.ticketFk
|
|
||||||
FROM tmp.sale s
|
|
||||||
UNION ALL
|
|
||||||
SELECT ts.ticketFk
|
|
||||||
FROM tmp.ticketService ts
|
|
||||||
) sub
|
|
||||||
LIMIT 1;
|
|
||||||
|
|
||||||
SELECT id INTO vRefundAgencyMode
|
|
||||||
FROM agencyMode WHERE `name` = 'ABONO';
|
|
||||||
|
|
||||||
SELECT clientFk, warehouseFk, companyFk, addressFk
|
|
||||||
INTO vClientFk, vWarehouse, vCompany, vAddress
|
|
||||||
FROM ticket
|
|
||||||
WHERE id = vOriginTicket;
|
|
||||||
|
|
||||||
SELECT id INTO vZoneFk
|
|
||||||
FROM zone WHERE agencyModeFk = vRefundAgencyMode
|
|
||||||
LIMIT 1;
|
|
||||||
|
|
||||||
INSERT INTO vn.ticket (
|
|
||||||
clientFk,
|
|
||||||
shipped,
|
|
||||||
addressFk,
|
|
||||||
agencyModeFk,
|
|
||||||
nickname,
|
|
||||||
warehouseFk,
|
|
||||||
companyFk,
|
|
||||||
landed,
|
|
||||||
zoneFk
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
vClientFk,
|
|
||||||
CURDATE(),
|
|
||||||
vAddress,
|
|
||||||
vRefundAgencyMode,
|
|
||||||
a.nickname,
|
|
||||||
vWarehouse,
|
|
||||||
vCompany,
|
|
||||||
CURDATE(),
|
|
||||||
vZoneFk
|
|
||||||
FROM address a
|
|
||||||
WHERE a.id = vAddress;
|
|
||||||
|
|
||||||
SET vNewTicket = LAST_INSERT_ID();
|
|
||||||
|
|
||||||
SET vDone := FALSE;
|
|
||||||
OPEN cSales;
|
|
||||||
FETCH cSales INTO vSaleMain, vItemFk, vQuantity, vConcept, vPrice, vDiscount;
|
|
||||||
|
|
||||||
WHILE NOT vDone DO
|
|
||||||
|
|
||||||
INSERT INTO vn.sale(ticketFk, itemFk, quantity, concept, price, discount)
|
|
||||||
VALUES( vNewTicket, vItemFk, vQuantity, vConcept, vPrice, vDiscount );
|
|
||||||
|
|
||||||
SET vSaleNew = LAST_INSERT_ID();
|
|
||||||
|
|
||||||
INSERT INTO vn.saleComponent(saleFk,componentFk,`value`)
|
|
||||||
SELECT vSaleNew,componentFk,`value`
|
|
||||||
FROM vn.saleComponent
|
|
||||||
WHERE saleFk = vSaleMain;
|
|
||||||
|
|
||||||
FETCH cSales INTO vSaleMain, vItemFk, vQuantity, vConcept, vPrice, vDiscount;
|
|
||||||
|
|
||||||
END WHILE;
|
|
||||||
CLOSE cSales;
|
|
||||||
|
|
||||||
SET vDone := FALSE;
|
|
||||||
OPEN cTicketServices;
|
|
||||||
FETCH cTicketServices INTO vDescription, vQuantity, vPrice, vTaxClassFk, vTicketServiceTypeFk;
|
|
||||||
|
|
||||||
WHILE NOT vDone DO
|
|
||||||
|
|
||||||
INSERT INTO vn.ticketService(description, quantity, price, taxClassFk, ticketFk, ticketServiceTypeFk)
|
|
||||||
VALUES(vDescription, vQuantity, vPrice, vTaxClassFk, vNewTicket, vTicketServiceTypeFk);
|
|
||||||
|
|
||||||
FETCH cTicketServices INTO vDescription, vQuantity, vPrice, vTaxClassFk, vTicketServiceTypeFk;
|
|
||||||
|
|
||||||
END WHILE;
|
|
||||||
CLOSE cTicketServices;
|
|
||||||
|
|
||||||
INSERT INTO vn.ticketRefund(refundTicketFk, originalTicketFk)
|
|
||||||
VALUES(vNewTicket, vOriginTicket);
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
|
|
@ -1,11 +0,0 @@
|
||||||
DELIMITER $$
|
|
||||||
$$
|
|
||||||
CREATE DEFINER=`root`@`localhost` TRIGGER `vn`.`creditInsurance_beforeInsert`
|
|
||||||
BEFORE INSERT ON `creditInsurance`
|
|
||||||
FOR EACH ROW
|
|
||||||
BEGIN
|
|
||||||
IF NEW.creditClassificationFk THEN
|
|
||||||
SET NEW.creditClassification = NEW.creditClassificationFk;
|
|
||||||
END IF;
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
|
|
@ -1 +0,0 @@
|
||||||
RENAME TABLE `edi`.`fileConfig` to `edi`.`tableConfig`;
|
|
|
@ -1,22 +0,0 @@
|
||||||
CREATE TABLE `edi`.`fileConfig`
|
|
||||||
(
|
|
||||||
name varchar(25) NOT NULL,
|
|
||||||
checksum text NULL,
|
|
||||||
keyValue tinyint(1) default true NOT NULL,
|
|
||||||
constraint fileConfig_pk
|
|
||||||
primary key (name)
|
|
||||||
);
|
|
||||||
|
|
||||||
create unique index fileConfig_name_uindex
|
|
||||||
on `edi`.`fileConfig` (name);
|
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `edi`.`fileConfig` (name, checksum, keyValue)
|
|
||||||
VALUES ('FEC010104', null, 0);
|
|
||||||
|
|
||||||
INSERT INTO `edi`.`fileConfig` (name, checksum, keyValue)
|
|
||||||
VALUES ('VBN020101', null, 1);
|
|
||||||
|
|
||||||
INSERT INTO `edi`.`fileConfig` (name, checksum, keyValue)
|
|
||||||
VALUES ('florecompc2', null, 1);
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
ALTER TABLE `vn`.`chat` MODIFY COLUMN message TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL NULL;
|
|
||||||
ALTER TABLE `vn`.`chat` MODIFY COLUMN dated DATETIME DEFAULT NULL NULL;
|
|
||||||
ALTER TABLE `vn`.`chat` ADD error TEXT NULL;
|
|
|
@ -1,3 +0,0 @@
|
||||||
ALTER TABLE `vn`.`creditInsurance`
|
|
||||||
ADD CONSTRAINT `creditInsurance_creditClassificationFk` FOREIGN KEY (`creditClassificationFk`)
|
|
||||||
REFERENCES `vn`.`creditClassification` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
@ -1,21 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (model,property,accessType,permission,principalType,principalId)
|
|
||||||
VALUES
|
|
||||||
('InvoiceOut','refund','WRITE','ALLOW','ROLE','invoicing'),
|
|
||||||
('InvoiceOut','refund','WRITE','ALLOW','ROLE','salesAssistant'),
|
|
||||||
('InvoiceOut','refund','WRITE','ALLOW','ROLE','claimManager'),
|
|
||||||
('Ticket','refund','WRITE','ALLOW','ROLE','invoicing'),
|
|
||||||
('Ticket','refund','WRITE','ALLOW','ROLE','salesAssistant'),
|
|
||||||
('Ticket','refund','WRITE','ALLOW','ROLE','claimManager'),
|
|
||||||
('Sale','refund','WRITE','ALLOW','ROLE','salesAssistant'),
|
|
||||||
('Sale','refund','WRITE','ALLOW','ROLE','claimManager'),
|
|
||||||
('TicketRefund','*','WRITE','ALLOW','ROLE','invoicing'),
|
|
||||||
('ClaimObservation','*','WRITE','ALLOW','ROLE','salesPerson'),
|
|
||||||
('ClaimObservation','*','READ','ALLOW','ROLE','salesPerson'),
|
|
||||||
('Client','setPassword','WRITE','ALLOW','ROLE','salesPerson'),
|
|
||||||
('Client','updateUser','WRITE','ALLOW','ROLE','salesPerson');
|
|
||||||
|
|
||||||
DELETE FROM `salix`.`ACL` WHERE id=313;
|
|
||||||
|
|
||||||
UPDATE `salix`.`ACL`
|
|
||||||
SET principalId='invoicing'
|
|
||||||
WHERE id=297;
|
|
|
@ -1,3 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (model,property,accessType,permission,principalType,principalId)
|
|
||||||
VALUES
|
|
||||||
('ShelvingLog','*','READ','ALLOW','ROLE','employee');
|
|
|
@ -1,4 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL`(`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
|
||||||
VALUES
|
|
||||||
('ZoneExclusionGeo', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
|
|
||||||
('ZoneExclusionGeo', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss');
|
|
|
@ -1,2 +0,0 @@
|
||||||
ALTER TABLE `vn2008`.`albaran_gestdoc` DROP FOREIGN KEY fk_albaran_gestdoc_gestdoc1;
|
|
||||||
ALTER TABLE `vn2008`.`albaran_gestdoc` ADD CONSTRAINT albaran_gestdoc_FK FOREIGN KEY (gestdoc_id) REFERENCES `vn`.`dms`(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
@ -1,3 +0,0 @@
|
||||||
alter table `vn`.`client`
|
|
||||||
add hasIncoterms tinyint(1) default 0 not null comment 'Received incoterms authorization from client';
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
DROP FUNCTION `account`.`userGetId`;
|
|
||||||
DROP FUNCTION `account`.`myUserGetName`;
|
|
||||||
DROP FUNCTION `account`.`myUserGetId`;
|
|
||||||
DROP FUNCTION `account`.`myUserHasRole`;
|
|
||||||
DROP FUNCTION `account`.`myUserHasRoleId`;
|
|
||||||
DROP FUNCTION `account`.`userGetName`;
|
|
||||||
DROP FUNCTION `account`.`userHasRole`;
|
|
||||||
DROP FUNCTION `account`.`userHasRoleId`;
|
|
||||||
DROP PROCEDURE `account`.`myUserLogout`;
|
|
||||||
DROP PROCEDURE `account`.`userLogin`;
|
|
||||||
DROP PROCEDURE `account`.`userLoginWithKey`;
|
|
||||||
DROP PROCEDURE `account`.`userLoginWithName`;
|
|
||||||
DROP PROCEDURE `account`.`userSetPassword`;
|
|
|
@ -1 +0,0 @@
|
||||||
ALTER TABLE `vn`.`item` MODIFY COLUMN description TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL NULL;
|
|
|
@ -1,10 +0,0 @@
|
||||||
UPDATE `vn`.`route` r
|
|
||||||
JOIN(SELECT r.id, wl.workcenterFk
|
|
||||||
FROM `vn`.`route` r
|
|
||||||
JOIN `vn`.`routeLog` rl ON rl.originFk = r.id
|
|
||||||
JOIN `vn`.`workerLabour` wl ON wl.workerFk = rl.userFk
|
|
||||||
AND r.created BETWEEN wl.started AND IFNULL(wl.ended, r.created)
|
|
||||||
WHERE r.created BETWEEN '2021-12-01' AND CURDATE()
|
|
||||||
AND rl.action = 'insert'
|
|
||||||
)sub ON sub.id = r.id
|
|
||||||
SET r.commissionWorkCenterFk = sub.workcenterFk;
|
|
|
@ -1,2 +0,0 @@
|
||||||
INSERT INTO `vn`.`sample` (code, description, isVisible, hasCompany, hasPreview, datepickerEnabled)
|
|
||||||
VALUES ('incoterms-authorization', 'Autorización de incoterms', 1, 1, 1, 0);
|
|
|
@ -1,18 +0,0 @@
|
||||||
ALTER TABLE `vn`.`itemShelving` DROP FOREIGN KEY itemShelving_fk2;
|
|
||||||
ALTER TABLE `vn`.`shelvingLog` DROP FOREIGN KEY shelvingLog_FK_ibfk_1;
|
|
||||||
ALTER TABLE `vn`.`smartTag` DROP FOREIGN KEY smartTag_shelving_fk;
|
|
||||||
ALTER TABLE `vn`.`workerShelving` DROP FOREIGN KEY workerShelving_shelving_fk;
|
|
||||||
|
|
||||||
ALTER TABLE `vn`.`shelving` DROP PRIMARY KEY;
|
|
||||||
ALTER TABLE `vn`.`shelving` ADD id INT auto_increment PRIMARY KEY NULL;
|
|
||||||
ALTER TABLE `vn`.`shelving` CHANGE id id int(11) auto_increment NOT NULL FIRST;
|
|
||||||
ALTER TABLE `vn`.`shelving` ADD CONSTRAINT shelving_UN UNIQUE KEY (code);
|
|
||||||
|
|
||||||
ALTER TABLE `vn`.`itemShelving` ADD CONSTRAINT itemShelving_fk2 FOREIGN KEY (shelvingFk) REFERENCES `vn`.`shelving`(code) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
||||||
ALTER TABLE `vn`.`shelvingLog` ADD CONSTRAINT shelvingLog_FK_ibfk_1 FOREIGN KEY (originFk) REFERENCES `vn`.`shelving`(code) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
||||||
ALTER TABLE `vn`.`smartTag` ADD CONSTRAINT smartTag_FK FOREIGN KEY (shelvingFk) REFERENCES `vn`.`shelving`(code) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
||||||
ALTER TABLE `vn`.`workerShelving` ADD CONSTRAINT workerShelving_FK_1 FOREIGN KEY (shelvingFk) REFERENCES `vn`.`shelving`(code) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE vn.shelvingLog DROP FOREIGN KEY shelvingLog_FK_ibfk_1;
|
|
||||||
ALTER TABLE vn.shelvingLog MODIFY COLUMN originFk INT NOT NULL;
|
|
||||||
ALTER TABLE vn.shelvingLog ADD CONSTRAINT shelvingLog_FK FOREIGN KEY (originFk) REFERENCES vn.shelving(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
@ -1,21 +0,0 @@
|
||||||
DROP PROCEDURE IF EXISTS `vn`.`ticketRefund_beforeUpsert`;
|
|
||||||
|
|
||||||
DELIMITER $$
|
|
||||||
$$
|
|
||||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticketRefund_beforeUpsert`(vRefundTicketFk INT, vOriginalTicketFk INT)
|
|
||||||
BEGIN
|
|
||||||
DECLARE vAlreadyExists BOOLEAN DEFAULT FALSE;
|
|
||||||
|
|
||||||
IF vRefundTicketFk = vOriginalTicketFk THEN
|
|
||||||
CALL util.throw('Original ticket and refund ticket has same id');
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
SELECT COUNT(*) INTO vAlreadyExists
|
|
||||||
FROM ticketRefund
|
|
||||||
WHERE originalTicketFk = vOriginalTicketFk;
|
|
||||||
|
|
||||||
IF vAlreadyExists > 0 THEN
|
|
||||||
CALL util.throw('This ticket is already a refund');
|
|
||||||
END IF;
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
|
|
@ -1,13 +0,0 @@
|
||||||
CREATE TABLE `vn`.`claimObservation` (
|
|
||||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
|
||||||
`claimFk` int(10) unsigned NOT NULL,
|
|
||||||
`workerFk` int(10) unsigned DEFAULT NULL,
|
|
||||||
`text` text COLLATE utf8_unicode_ci NOT NULL,
|
|
||||||
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `worker_key` (`workerFk`),
|
|
||||||
KEY `claim_key` (`claimFk`),
|
|
||||||
KEY `claimObservation_created_IDX` (`created`) USING BTREE,
|
|
||||||
CONSTRAINT `claimObservation_ibfk_1` FOREIGN KEY (`claimFk`) REFERENCES `vn`.`claim` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
|
||||||
CONSTRAINT `claimObservation_ibfk_2` FOREIGN KEY (`workerFk`) REFERENCES `vn`.`worker` (`id`) ON UPDATE CASCADE
|
|
||||||
) COMMENT='Todas las observaciones referentes a una reclamación'
|
|
|
@ -1,2 +0,0 @@
|
||||||
INSERT INTO `vn`.`claimObservation` (`claimFk`, `text`, `created`)
|
|
||||||
SELECT `id`, `observation`, `created` FROM `vn`.`claim`
|
|
|
@ -1,2 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (model,property,accessType,permission,principalType,principalId)
|
|
||||||
VALUES ('Parking','*','*','ALLOW','ROLE','employee')
|
|
|
@ -1,2 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (model,property,accessType,permission,principalType,principalId)
|
|
||||||
VALUES ('Shelving','*','*','ALLOW','ROLE','employee')
|
|
|
@ -1,3 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
|
||||||
VALUES
|
|
||||||
('OsTicket', '*', '*', 'ALLOW', 'ROLE', 'employee');
|
|
|
@ -1,3 +0,0 @@
|
||||||
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
|
||||||
VALUES
|
|
||||||
('OsTicketConfig', '*', '*', 'ALLOW', 'ROLE', 'it');
|
|
|
@ -1,16 +0,0 @@
|
||||||
CREATE TABLE `vn`.`osTicketConfig` (
|
|
||||||
`id` int(11) NOT NULL,
|
|
||||||
`host` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`user` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`password` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`oldStatus` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`newStatusId` int(11) DEFAULT NULL,
|
|
||||||
`action` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`day` int(11) DEFAULT NULL,
|
|
||||||
`comment` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`hostDb` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`userDb` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`passwordDb` varchar(100) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
|
||||||
`portDb` int(11) DEFAULT NULL,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
|
|
@ -22,7 +22,7 @@ USE `util`;
|
||||||
|
|
||||||
LOCK TABLES `config` WRITE;
|
LOCK TABLES `config` WRITE;
|
||||||
/*!40000 ALTER TABLE `config` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `config` DISABLE KEYS */;
|
||||||
INSERT INTO `config` VALUES (1,'10480',0,'production',NULL);
|
INSERT INTO `config` VALUES (1,'224602',0,'production',NULL);
|
||||||
/*!40000 ALTER TABLE `config` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `config` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|
|
@ -2566,10 +2566,6 @@ UPDATE `vn`.`route`
|
||||||
UPDATE `vn`.`route`
|
UPDATE `vn`.`route`
|
||||||
SET `invoiceInFk`=2
|
SET `invoiceInFk`=2
|
||||||
WHERE `id`=2;
|
WHERE `id`=2;
|
||||||
INSERT INTO `bs`.`salesPerson` (`workerFk`, `year`, `month`)
|
|
||||||
VALUES
|
|
||||||
(18, YEAR(util.VN_CURDATE()), MONTH(util.VN_CURDATE())),
|
|
||||||
(19, YEAR(util.VN_CURDATE()), MONTH(util.VN_CURDATE()));
|
|
||||||
|
|
||||||
INSERT INTO `bs`.`sale` (`saleFk`, `amount`, `dated`, `typeFk`, `clientFk`)
|
INSERT INTO `bs`.`sale` (`saleFk`, `amount`, `dated`, `typeFk`, `clientFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -81,9 +81,9 @@ N_CHANGES=0
|
||||||
|
|
||||||
for DIR_PATH in "$DIR/changes/"*; do
|
for DIR_PATH in "$DIR/changes/"*; do
|
||||||
DIR_NAME=$(basename $DIR_PATH)
|
DIR_NAME=$(basename $DIR_PATH)
|
||||||
DIR_VERSION=${DIR_NAME:0:5}
|
DIR_VERSION=${DIR_NAME:0:6}
|
||||||
|
|
||||||
if [[ ! "$DIR_NAME" =~ ^[0-9]{5}(-[a-zA-Z0-9]+)?$ ]]; then
|
if [[ ! "$DIR_NAME" =~ ^[0-9]{6}$ ]]; then
|
||||||
echo "[WARN] Ignoring wrong directory name: $DIR_NAME"
|
echo "[WARN] Ignoring wrong directory name: $DIR_NAME"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -37,7 +37,7 @@ export default class Controller extends Section {
|
||||||
|
|
||||||
const validations = window.validations;
|
const validations = window.validations;
|
||||||
value.forEach(log => {
|
value.forEach(log => {
|
||||||
const locale = validations[log.changedModel].locale ? validations[log.changedModel].locale : {};
|
const locale = validations[log.changedModel] && validations[log.changedModel].locale ? validations[log.changedModel].locale : {};
|
||||||
|
|
||||||
log.oldProperties = this.getInstance(log.oldInstance, locale);
|
log.oldProperties = this.getInstance(log.oldInstance, locale);
|
||||||
log.newProperties = this.getInstance(log.newInstance, locale);
|
log.newProperties = this.getInstance(log.newInstance, locale);
|
||||||
|
|
|
@ -91,7 +91,18 @@ module.exports = Self => {
|
||||||
case 'search':
|
case 'search':
|
||||||
return /^\d+$/.test(value)
|
return /^\d+$/.test(value)
|
||||||
? {'c.id': {inq: value}}
|
? {'c.id': {inq: value}}
|
||||||
: {'c.name': {like: `%${value}%`}};
|
: {or: [
|
||||||
|
{'c.name': {like: `%${value}%`}},
|
||||||
|
{'c.socialName': {like: `%${value}%`}},
|
||||||
|
]};
|
||||||
|
case 'phone':
|
||||||
|
return {or: [
|
||||||
|
{'c.phone': {like: `%${value}%`}},
|
||||||
|
{'c.mobile': {like: `%${value}%`}},
|
||||||
|
]};
|
||||||
|
case 'zoneFk':
|
||||||
|
param = 'a.postalCode';
|
||||||
|
return {[param]: {inq: postalCode}};
|
||||||
case 'name':
|
case 'name':
|
||||||
case 'salesPersonFk':
|
case 'salesPersonFk':
|
||||||
case 'fi':
|
case 'fi':
|
||||||
|
@ -100,12 +111,8 @@ module.exports = Self => {
|
||||||
case 'postcode':
|
case 'postcode':
|
||||||
case 'provinceFk':
|
case 'provinceFk':
|
||||||
case 'email':
|
case 'email':
|
||||||
case 'phone':
|
|
||||||
param = `c.${param}`;
|
param = `c.${param}`;
|
||||||
return {[param]: value};
|
return {[param]: {like: `%${value}%`}};
|
||||||
case 'zoneFk':
|
|
||||||
param = 'a.postalCode';
|
|
||||||
return {[param]: {inq: postalCode}};
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -119,6 +126,7 @@ module.exports = Self => {
|
||||||
c.fi,
|
c.fi,
|
||||||
c.socialName,
|
c.socialName,
|
||||||
c.phone,
|
c.phone,
|
||||||
|
c.mobile,
|
||||||
c.city,
|
c.city,
|
||||||
c.postcode,
|
c.postcode,
|
||||||
c.email,
|
c.email,
|
||||||
|
@ -132,7 +140,7 @@ module.exports = Self => {
|
||||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||||
LEFT JOIN province p ON p.id = c.provinceFk
|
LEFT JOIN province p ON p.id = c.provinceFk
|
||||||
JOIN vn.address a ON a.clientFk = c.id
|
JOIN vn.address a ON a.clientFk = c.id
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
stmt.merge(conn.makeWhere(filter.where));
|
stmt.merge(conn.makeWhere(filter.where));
|
||||||
|
|
|
@ -57,14 +57,16 @@ module.exports = Self => {
|
||||||
r.clientFk,
|
r.clientFk,
|
||||||
FALSE hasPdf,
|
FALSE hasPdf,
|
||||||
FALSE isInvoice,
|
FALSE isInvoice,
|
||||||
CASE WHEN at2.code LIKE 'compensation' THEN True ELSE False END as isCompensation
|
at2.id IS NOT NULL as isCompensation
|
||||||
FROM vn.receipt r
|
FROM vn.receipt r
|
||||||
LEFT JOIN vn.worker w ON w.id = r.workerFk
|
LEFT JOIN vn.worker w ON w.id = r.workerFk
|
||||||
LEFT JOIN account.user u ON u.id = w.userFk
|
LEFT JOIN account.user u ON u.id = w.userFk
|
||||||
JOIN vn.company c ON c.id = r.companyFk
|
JOIN vn.company c ON c.id = r.companyFk
|
||||||
JOIN vn.accounting a ON a.id = r.bankFk
|
LEFT JOIN vn.accounting a ON a.id = r.bankFk
|
||||||
JOIN vn.accountingType at2 ON at2.id = a.accountingTypeFk
|
LEFT JOIN vn.accountingType at2 ON at2.id = a.accountingTypeFk AND at2.code = 'compensation'
|
||||||
WHERE r.clientFk = ? AND r.companyFk = ?
|
WHERE
|
||||||
|
r.clientFk = ?
|
||||||
|
AND r.companyFk = ?
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT
|
SELECT
|
||||||
i.id,
|
i.id,
|
||||||
|
@ -81,13 +83,10 @@ module.exports = Self => {
|
||||||
i.clientFk,
|
i.clientFk,
|
||||||
i.hasPdf,
|
i.hasPdf,
|
||||||
TRUE isInvoice,
|
TRUE isInvoice,
|
||||||
CASE WHEN at2.code LIKE 'compensation' THEN True ELSE False END as isCompensation
|
NULL
|
||||||
FROM vn.invoiceOut i
|
FROM vn.invoiceOut i
|
||||||
JOIN vn.company c ON c.id = i.companyFk
|
JOIN vn.company c ON c.id = i.companyFk
|
||||||
JOIN vn.accounting a ON a.id = i.bankFk
|
|
||||||
JOIN vn.accountingType at2 ON at2.id = a.accountingTypeFk
|
|
||||||
WHERE i.clientFk = ? AND i.companyFk = ?
|
WHERE i.clientFk = ? AND i.companyFk = ?
|
||||||
ORDER BY payed DESC, created DESC
|
|
||||||
) t ORDER BY payed DESC, created DESC`,
|
) t ORDER BY payed DESC, created DESC`,
|
||||||
[
|
[
|
||||||
clientId,
|
clientId,
|
||||||
|
|
|
@ -27,7 +27,7 @@ module.exports = Self => {
|
||||||
message: 'Invalid email',
|
message: 'Invalid email',
|
||||||
allowNull: true,
|
allowNull: true,
|
||||||
allowBlank: true,
|
allowBlank: true,
|
||||||
with: /^[\w|.|-]+@[\w|-]+(\.[\w|-]+)*(,[\w|.|-]+@[\w|-]+(\.[\w|-]+)*)*$/
|
with: /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{1,61}[\W]*,{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{1,61})[\W]*$/
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.validatesLengthOf('postcode', {
|
Self.validatesLengthOf('postcode', {
|
||||||
|
|
|
@ -138,7 +138,7 @@ module.exports = Self => {
|
||||||
recipient: invoiceOut.client().email
|
recipient: invoiceOut.client().email
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
await models.InvoiceOut.invoiceEmail(ctx);
|
await models.InvoiceOut.invoiceEmail(ctx, invoiceOut.ref);
|
||||||
} catch (err) {}
|
} catch (err) {}
|
||||||
|
|
||||||
return invoiceId;
|
return invoiceId;
|
||||||
|
|
|
@ -11,6 +11,7 @@ describe('InvoiceOut createPdf()', () => {
|
||||||
const ctx = {req: activeCtx};
|
const ctx = {req: activeCtx};
|
||||||
|
|
||||||
it('should create a new PDF file and set true the hasPdf property', async() => {
|
it('should create a new PDF file and set true the hasPdf property', async() => {
|
||||||
|
pending('https://redmine.verdnatura.es/issues/4875');
|
||||||
const invoiceId = 1;
|
const invoiceId = 1;
|
||||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||||
active: activeCtx
|
active: activeCtx
|
||||||
|
|
|
@ -30,6 +30,7 @@ describe('InvoiceOut downloadZip()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return an error if the size of the files is too large', async() => {
|
it('should return an error if the size of the files is too large', async() => {
|
||||||
|
pending('https://redmine.verdnatura.es/issues/4875');
|
||||||
const tx = await models.InvoiceOut.beginTransaction({});
|
const tx = await models.InvoiceOut.beginTransaction({});
|
||||||
|
|
||||||
let error;
|
let error;
|
||||||
|
|
|
@ -51,6 +51,7 @@ describe('InvoiceOut filter()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return the invoice out matching hasPdf', async() => {
|
it('should return the invoice out matching hasPdf', async() => {
|
||||||
|
pending('https://redmine.verdnatura.es/issues/4875');
|
||||||
const tx = await models.InvoiceOut.beginTransaction({});
|
const tx = await models.InvoiceOut.beginTransaction({});
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
|
|
@ -33,36 +33,36 @@ module.exports = Self => {
|
||||||
|
|
||||||
const stmt = new ParameterizedSQL(
|
const stmt = new ParameterizedSQL(
|
||||||
`SELECT
|
`SELECT
|
||||||
t.id,
|
t.id,
|
||||||
t.packages,
|
t.packages,
|
||||||
t.warehouseFk,
|
t.warehouseFk,
|
||||||
t.nickname,
|
t.nickname,
|
||||||
t.clientFk,
|
t.clientFk,
|
||||||
t.priority,
|
t.priority,
|
||||||
t.addressFk,
|
t.addressFk,
|
||||||
st.code AS ticketStateCode,
|
st.code AS ticketStateCode,
|
||||||
st.name AS ticketStateName,
|
st.name AS ticketStateName,
|
||||||
wh.name AS warehouseName,
|
wh.name AS warehouseName,
|
||||||
tob.description AS ticketObservation,
|
tob.description AS ticketObservation,
|
||||||
a.street,
|
a.street,
|
||||||
a.postalCode,
|
a.postalCode,
|
||||||
a.city,
|
a.city,
|
||||||
am.name AS agencyModeName,
|
am.name AS agencyModeName,
|
||||||
u.nickname AS userNickname,
|
u.nickname AS userNickname,
|
||||||
vn.ticketTotalVolume(t.id) AS volume,
|
vn.ticketTotalVolume(t.id) AS volume,
|
||||||
tob.description
|
tob.description
|
||||||
FROM route r
|
FROM vn.route r
|
||||||
JOIN ticket t ON t.routeFk = r.id
|
JOIN ticket t ON t.routeFk = r.id
|
||||||
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
LEFT JOIN state st ON st.id = ts.stateFk
|
LEFT JOIN state st ON st.id = ts.stateFk
|
||||||
LEFT JOIN warehouse wh ON wh.id = t.warehouseFk
|
LEFT JOIN warehouse wh ON wh.id = t.warehouseFk
|
||||||
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
|
LEFT JOIN observationType ot ON ot.code = 'delivery'
|
||||||
LEFT JOIN observationType ot ON tob.observationTypeFk = ot.id
|
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
|
||||||
AND ot.code = 'delivery'
|
AND tob.observationTypeFk = ot.id
|
||||||
LEFT JOIN address a ON a.id = t.addressFk
|
LEFT 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
|
||||||
LEFT JOIN account.user u ON u.id = r.workerFk
|
LEFT JOIN account.user u ON u.id = r.workerFk
|
||||||
LEFT JOIN vehicle v ON v.id = r.vehicleFk`
|
LEFT JOIN vehicle v ON v.id = r.vehicleFk`
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!filter.where) filter.where = {};
|
if (!filter.where) filter.where = {};
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
type="number"
|
type="number"
|
||||||
label="Minimum M3"
|
label="Minimum M3"
|
||||||
ng-model="$ctrl.supplierAgencyTerm.minimumM3"
|
ng-model="$ctrl.supplierAgencyTerm.minimumM3"
|
||||||
|
step="0.01"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
@ -46,6 +47,7 @@
|
||||||
type="number"
|
type="number"
|
||||||
label="M3 Price"
|
label="M3 Price"
|
||||||
ng-model="$ctrl.supplierAgencyTerm.m3Price"
|
ng-model="$ctrl.supplierAgencyTerm.m3Price"
|
||||||
|
step="0.01"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
|
|
@ -137,9 +137,11 @@ module.exports = Self => {
|
||||||
const params = [args.id, args.shipped, args.warehouseFk];
|
const params = [args.id, args.shipped, args.warehouseFk];
|
||||||
const [salesMovable] = await Self.rawSql(query, params, myOptions);
|
const [salesMovable] = await Self.rawSql(query, params, myOptions);
|
||||||
|
|
||||||
|
const sales = await models.Sale.find({where: {ticketFk: args.id}}, myOptions);
|
||||||
const salesNewTicket = salesMovable.filter(sale => (sale.movable ? sale.movable : 0) >= sale.quantity);
|
const salesNewTicket = salesMovable.filter(sale => (sale.movable ? sale.movable : 0) >= sale.quantity);
|
||||||
|
|
||||||
if (salesNewTicket.length) {
|
const salesNewTicketLength = salesNewTicket.length;
|
||||||
|
if (salesNewTicketLength && sales.length != salesNewTicketLength) {
|
||||||
const newTicket = await models.Ticket.transferSales(ctx, args.id, null, salesNewTicket, myOptions);
|
const newTicket = await models.Ticket.transferSales(ctx, args.id, null, salesNewTicket, myOptions);
|
||||||
args.id = newTicket.id;
|
args.id = newTicket.id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ class Controller extends Component {
|
||||||
ticketHaveNegatives() {
|
ticketHaveNegatives() {
|
||||||
let haveNegatives = false;
|
let haveNegatives = false;
|
||||||
let haveNotNegatives = false;
|
let haveNotNegatives = false;
|
||||||
|
this.ticket.withoutNegatives = false;
|
||||||
const haveDifferences = this.ticket.sale.haveDifferences;
|
const haveDifferences = this.ticket.sale.haveDifferences;
|
||||||
|
|
||||||
this.ticket.sale.items.forEach(item => {
|
this.ticket.sale.items.forEach(item => {
|
||||||
|
@ -76,8 +77,9 @@ class Controller extends Component {
|
||||||
haveNotNegatives = true;
|
haveNotNegatives = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.ticket.withoutNegatives = true;
|
|
||||||
this.haveNegatives = (haveNegatives && haveNotNegatives && haveDifferences);
|
this.haveNegatives = (haveNegatives && haveNotNegatives && haveDifferences);
|
||||||
|
if (this.haveNegatives)
|
||||||
|
this.ticket.withoutNegatives = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
const Imap = require('imap');
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('checkInbox', {
|
||||||
|
description: 'Check an email inbox and process it',
|
||||||
|
accessType: 'READ',
|
||||||
|
returns:
|
||||||
|
{
|
||||||
|
arg: 'body',
|
||||||
|
type: 'file',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/checkInbox`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.checkInbox = async() => {
|
||||||
|
let imapConfig = await Self.app.models.WorkerTimeControlParams.findOne();
|
||||||
|
let imap = new Imap({
|
||||||
|
user: imapConfig.mailUser,
|
||||||
|
password: imapConfig.mailPass,
|
||||||
|
host: imapConfig.mailHost,
|
||||||
|
port: 993,
|
||||||
|
tls: true
|
||||||
|
});
|
||||||
|
let isEmailOk;
|
||||||
|
let uid;
|
||||||
|
let emailBody;
|
||||||
|
|
||||||
|
function openInbox(cb) {
|
||||||
|
imap.openBox('INBOX', true, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
imap.once('ready', function() {
|
||||||
|
openInbox(function(err, box) {
|
||||||
|
if (err) throw err;
|
||||||
|
const totalMessages = box.messages.total;
|
||||||
|
if (totalMessages == 0)
|
||||||
|
imap.end();
|
||||||
|
|
||||||
|
let f = imap.seq.fetch('1:*', {
|
||||||
|
bodies: ['HEADER.FIELDS (FROM SUBJECT)', '1'],
|
||||||
|
struct: true
|
||||||
|
});
|
||||||
|
f.on('message', function(msg, seqno) {
|
||||||
|
isEmailOk = false;
|
||||||
|
msg.on('body', function(stream, info) {
|
||||||
|
let buffer = '';
|
||||||
|
let bufferCopy = '';
|
||||||
|
stream.on('data', function(chunk) {
|
||||||
|
buffer = chunk.toString('utf8');
|
||||||
|
if (info.which === '1' && bufferCopy.length == 0)
|
||||||
|
bufferCopy = buffer.replace(/\s/g, ' ');
|
||||||
|
});
|
||||||
|
stream.on('end', function() {
|
||||||
|
if (bufferCopy.length > 0) {
|
||||||
|
emailBody = bufferCopy.toUpperCase().trim();
|
||||||
|
|
||||||
|
const bodyPositionOK = emailBody.match(/\bOK\b/i);
|
||||||
|
if (bodyPositionOK != null && (bodyPositionOK.index == 0 || bodyPositionOK.index == 122))
|
||||||
|
isEmailOk = true;
|
||||||
|
else
|
||||||
|
isEmailOk = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
msg.once('attributes', function(attrs) {
|
||||||
|
uid = attrs.uid;
|
||||||
|
});
|
||||||
|
msg.once('end', function() {
|
||||||
|
if (info.which === 'HEADER.FIELDS (FROM SUBJECT)') {
|
||||||
|
if (isEmailOk) {
|
||||||
|
imap.move(uid, 'exito', function(err) {
|
||||||
|
});
|
||||||
|
emailConfirm(buffer);
|
||||||
|
} else {
|
||||||
|
imap.move(uid, 'error', function(err) {
|
||||||
|
});
|
||||||
|
emailReply(buffer, emailBody);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
f.once('end', function() {
|
||||||
|
imap.end();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
imap.connect();
|
||||||
|
return 'Leer emails de gestion horaria';
|
||||||
|
};
|
||||||
|
|
||||||
|
async function emailConfirm(buffer) {
|
||||||
|
const now = new Date();
|
||||||
|
const from = JSON.stringify(Imap.parseHeader(buffer).from);
|
||||||
|
const subject = JSON.stringify(Imap.parseHeader(buffer).subject);
|
||||||
|
|
||||||
|
const timeControlDate = await getEmailDate(subject);
|
||||||
|
const week = timeControlDate[0];
|
||||||
|
const year = timeControlDate[1];
|
||||||
|
const user = await getUser(from);
|
||||||
|
let workerMail;
|
||||||
|
|
||||||
|
if (user.id != null) {
|
||||||
|
workerMail = await Self.app.models.WorkerTimeControlMail.findOne({
|
||||||
|
where: {
|
||||||
|
week: week,
|
||||||
|
year: year,
|
||||||
|
workerFk: user.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (workerMail != null) {
|
||||||
|
await workerMail.updateAttributes({
|
||||||
|
updated: now,
|
||||||
|
state: 'CONFIRMED'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function emailReply(buffer, emailBody) {
|
||||||
|
const now = new Date();
|
||||||
|
const from = JSON.stringify(Imap.parseHeader(buffer).from);
|
||||||
|
const subject = JSON.stringify(Imap.parseHeader(buffer).subject);
|
||||||
|
|
||||||
|
const timeControlDate = await getEmailDate(subject);
|
||||||
|
const week = timeControlDate[0];
|
||||||
|
const year = timeControlDate[1];
|
||||||
|
const user = await getUser(from);
|
||||||
|
let workerMail;
|
||||||
|
|
||||||
|
if (user.id != null) {
|
||||||
|
workerMail = await Self.app.models.WorkerTimeControlMail.findOne({
|
||||||
|
where: {
|
||||||
|
week: week,
|
||||||
|
year: year,
|
||||||
|
workerFk: user.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (workerMail != null) {
|
||||||
|
await workerMail.updateAttributes({
|
||||||
|
updated: now,
|
||||||
|
state: 'REVISE',
|
||||||
|
reason: emailBody
|
||||||
|
});
|
||||||
|
} else
|
||||||
|
await sendMail(user, subject, emailBody);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getUser(workerEmail) {
|
||||||
|
const userEmail = workerEmail.match(/(?<=<)(.*?)(?=>)/);
|
||||||
|
|
||||||
|
let [user] = await Self.rawSql(`SELECT u.id,u.name FROM account.user u
|
||||||
|
LEFT JOIN account.mailForward m on m.account = u.id
|
||||||
|
WHERE forwardTo =? OR
|
||||||
|
CONCAT(u.name,'@verdnatura.es') = ?`,
|
||||||
|
[userEmail[0], userEmail[0]]);
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getEmailDate(subject) {
|
||||||
|
const date = subject.match(/\d+/g);
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendMail(user, subject, emailBody) {
|
||||||
|
const sendTo = 'rrhh@verdnatura.es';
|
||||||
|
const emailSubject = subject + ' ' + user.name;
|
||||||
|
|
||||||
|
await Self.app.models.Mail.create({
|
||||||
|
receiver: sendTo,
|
||||||
|
subject: emailSubject,
|
||||||
|
body: emailBody
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -133,7 +133,7 @@ module.exports = Self => {
|
||||||
tb.permissionRate,
|
tb.permissionRate,
|
||||||
d.isTeleworking
|
d.isTeleworking
|
||||||
FROM tmp.timeBusinessCalculate tb
|
FROM tmp.timeBusinessCalculate tb
|
||||||
JOIN user u ON u.id = tb.userFk
|
JOIN account.user u ON u.id = tb.userFk
|
||||||
JOIN department d ON d.id = tb.departmentFk
|
JOIN department d ON d.id = tb.departmentFk
|
||||||
JOIN business b ON b.id = tb.businessFk
|
JOIN business b ON b.id = tb.businessFk
|
||||||
LEFT JOIN tmp.timeControlCalculate tc ON tc.userFk = tb.userFk AND tc.dated = tb.dated
|
LEFT JOIN tmp.timeControlCalculate tc ON tc.userFk = tb.userFk AND tc.dated = tb.dated
|
||||||
|
@ -143,7 +143,7 @@ module.exports = Self => {
|
||||||
IF(tc.timeWorkDecimal > 0, FALSE, IF(tb.timeWorkDecimal > 0, TRUE, FALSE)),
|
IF(tc.timeWorkDecimal > 0, FALSE, IF(tb.timeWorkDecimal > 0, TRUE, FALSE)),
|
||||||
TRUE))isTeleworkingWeek
|
TRUE))isTeleworkingWeek
|
||||||
FROM tmp.timeBusinessCalculate tb
|
FROM tmp.timeBusinessCalculate tb
|
||||||
LEFT JOIN tmp.timeControlCalculate tc ON tc.userFk = tb.userFk
|
LEFT JOIN tmp.timeControlCalculate tc ON tc.userFk = tb.userFk
|
||||||
AND tc.dated = tb.dated
|
AND tc.dated = tb.dated
|
||||||
GROUP BY tb.userFk
|
GROUP BY tb.userFk
|
||||||
HAVING isTeleworkingWeek > 0
|
HAVING isTeleworkingWeek > 0
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
require('../methods/worker-time-control-mail/checkInbox')(Self);
|
||||||
|
};
|
|
@ -49,4 +49,10 @@
|
||||||
|
|
||||||
.page-break-after {
|
.page-break-after {
|
||||||
page-break-after: always;
|
page-break-after: always;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ellipsize {
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue