Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 3756-client_address_isLogifloraAllowed
This commit is contained in:
commit
8c2bc76b88
|
@ -30,8 +30,13 @@ module.exports = Self => {
|
||||||
const sender = await models.Account.findById(accessToken.userId);
|
const sender = await models.Account.findById(accessToken.userId);
|
||||||
const recipient = to.replace('@', '');
|
const recipient = to.replace('@', '');
|
||||||
|
|
||||||
if (sender.name != recipient)
|
if (sender.name != recipient) {
|
||||||
return sendMessage(sender, to, message);
|
await sendMessage(sender, to, message);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
async function sendMessage(sender, channel, message) {
|
async function sendMessage(sender, channel, message) {
|
||||||
|
|
|
@ -5,7 +5,7 @@ module.exports = Self => {
|
||||||
description: 'Sends a RocketChat message to a connected user or department channel',
|
description: 'Sends a RocketChat message to a connected user or department channel',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
arg: 'recipientId',
|
arg: 'workerId',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
required: true,
|
required: true,
|
||||||
description: 'The recipient user id'
|
description: 'The recipient user id'
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
DELETE FROM salix.ACL
|
DELETE FROM `salix`.`ACL`
|
||||||
WHERE model = 'ClaimEnd' AND property = 'importTicketSales';
|
WHERE model = 'ClaimEnd' AND property = 'importTicketSales';
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
INSERT INTO salix.ACL
|
INSERT INTO `salix`.`ACL`
|
||||||
(model, property, accessType, permission, principalType, principalId)
|
(model, property, accessType, permission, principalType, principalId)
|
||||||
VALUES('Collection', 'setSaleQuantity', '*', 'ALLOW', 'ROLE', 'employee');
|
VALUES('Collection', 'setSaleQuantity', '*', 'ALLOW', 'ROLE', 'employee');
|
|
@ -1,3 +1,3 @@
|
||||||
INSERT INTO salix.ACL
|
INSERT INTO `salix`.`ACL`
|
||||||
(model, property, accessType, permission, principalType, principalId)
|
(model, property, accessType, permission, principalType, principalId)
|
||||||
VALUES('Docuware', '*', '*', 'ALLOW', 'ROLE', 'employee');
|
VALUES('Docuware', '*', '*', 'ALLOW', 'ROLE', 'employee');
|
|
@ -1,3 +1,3 @@
|
||||||
UPDATE salix.defaultViewConfig
|
UPDATE `salix`.`defaultViewConfig`
|
||||||
SET `columns`='{"intrastat":false,"stemMultiplier":false,"landed":false,"producer":false}'
|
SET `columns`='{"intrastat":false,"stemMultiplier":false,"landed":false,"producer":false}'
|
||||||
WHERE tableCode ='itemsIndex';
|
WHERE tableCode ='itemsIndex';
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
INSERT INTO salix.ACL (model,property,accessType,principalId)
|
INSERT INTO `salix`.`ACL` (model,property,accessType,principalId)
|
||||||
VALUES ('AgencyTerm','*','*','administrative');
|
VALUES ('AgencyTerm','*','*','administrative');
|
||||||
|
|
|
@ -1,3 +1 @@
|
||||||
UPDATE `account`.`user`
|
UPDATE `account`.`user` SET `role` = 57 WHERE id IN (2294, 4365, 7294);
|
||||||
SET `role` = 57
|
|
||||||
WHERE id IN (2294, 4365, 7294);
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
DROP TRIGGER `vn`.`travelThermograph_beforeInsert`;
|
||||||
|
|
||||||
|
ALTER TABLE `vn`.`travelThermograph` CHANGE `temperature` `temperature__` enum('COOL','WARM','DRY') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;
|
||||||
|
|
||||||
|
CREATE OR REPLACE
|
||||||
|
ALGORITHM = UNDEFINED VIEW `vn2008`.`travel_thermograph` AS
|
||||||
|
select
|
||||||
|
`tt`.`thermographFk` AS `thermograph_id`,
|
||||||
|
`tt`.`created` AS `odbc_date`,
|
||||||
|
`tt`.`warehouseFk` AS `warehouse_id`,
|
||||||
|
`tt`.`travelFk` AS `travel_id`,
|
||||||
|
`tt`.`temperatureFk` AS `temperature`,
|
||||||
|
`tt`.`result` AS `result`,
|
||||||
|
`tt`.`dmsFk` AS `gestdoc_id`
|
||||||
|
from
|
||||||
|
`vn`.`travelThermograph` `tt`;
|
|
@ -0,0 +1,73 @@
|
||||||
|
DROP PROCEDURE IF EXISTS vn.timeControl_getError;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`timeControl_getError`(vDatedFrom DATETIME, vDatedTo DATETIME)
|
||||||
|
BEGIN
|
||||||
|
/*
|
||||||
|
* @param vDatedFrom
|
||||||
|
* @param vDatedTo
|
||||||
|
* @table tmp.`user`(userFk)
|
||||||
|
* Fichadas incorrectas de las cuales no se puede calcular horas trabajadas
|
||||||
|
* @return tmp.timeControlError (id)
|
||||||
|
*/
|
||||||
|
DECLARE vDayMaxTime INTEGER;
|
||||||
|
|
||||||
|
SET @journeyCounter := 0;
|
||||||
|
SET @lastUserFk := NULL;
|
||||||
|
|
||||||
|
SELECT dayMaxTime INTO vDayMaxTime
|
||||||
|
FROM workerTimeControlConfig LIMIT 1;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.timeControl;
|
||||||
|
CREATE TEMPORARY TABLE tmp.timeControl
|
||||||
|
(INDEX(id), INDEX(journeyCounter))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT sub.id,
|
||||||
|
sub.direction,
|
||||||
|
sub.timed,
|
||||||
|
IF(sub.direction = 'in' OR @hasOut OR sub.userFk <> @lastUserFk, @journeyCounter := @journeyCounter + 1, @journeyCounter) journeyCounter,
|
||||||
|
@lastUserFk := sub.userFk workerFk,
|
||||||
|
IF(sub.direction = 'out', @hasOut:= TRUE, @hasOut:= FALSE)
|
||||||
|
FROM (
|
||||||
|
SELECT DISTINCT wtc.id,
|
||||||
|
wtc.direction,
|
||||||
|
wtc.timed,
|
||||||
|
wtc.userFk
|
||||||
|
FROM workerTimeControl wtc
|
||||||
|
JOIN tmp.`user` w ON w.userFk = wtc.userFk
|
||||||
|
WHERE wtc.timed BETWEEN DATE_SUB(vDatedFrom, INTERVAL 1 DAY) AND DATE_ADD(vDatedTo, INTERVAL 1 DAY)
|
||||||
|
ORDER BY wtc.userFk, wtc.timed
|
||||||
|
) sub;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.timeControlAux;
|
||||||
|
CREATE TEMPORARY TABLE tmp.timeControlAux
|
||||||
|
(INDEX(id), INDEX(journeyCounter))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT * FROM tmp.timeControl;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.timeControlError;
|
||||||
|
CREATE TEMPORARY TABLE tmp.timeControlError
|
||||||
|
(INDEX(id))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT id
|
||||||
|
FROM tmp.timeControlAux tca
|
||||||
|
JOIN (SELECT journeyCounter,
|
||||||
|
UNIX_TIMESTAMP(MAX(timed)) - UNIX_TIMESTAMP(MIN(timed)) timeWork,
|
||||||
|
SUM(direction = 'in') totalIn,
|
||||||
|
SUM(direction = 'out') totalOut,
|
||||||
|
timed
|
||||||
|
FROM tmp.timeControl
|
||||||
|
GROUP BY journeyCounter
|
||||||
|
HAVING COUNT(*) MOD 2 = 1
|
||||||
|
OR totalIn <> 1
|
||||||
|
OR totalOut <> 1
|
||||||
|
OR timeWork >= vDayMaxTime
|
||||||
|
)sub ON sub.journeyCounter = tca.journeyCounter
|
||||||
|
WHERE sub.timed BETWEEN vDatedFrom AND vDatedTo;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.timeControl;
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.timeControlAux;
|
||||||
|
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -292,10 +292,10 @@ INSERT INTO `vn`.`contactChannel`(`id`, `name`)
|
||||||
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`,`mailAddress`,`hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`)
|
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`,`mailAddress`,`hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1101, 'Bruce Wayne', '84612325V', 'Batman', 'Alfred', '1007 Mountain Drive, Gotham', 'Silla', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1101, 'Bruce Wayne', '84612325V', 'Batman', 'Alfred', '1007 Mountain Drive, Gotham', 'Silla', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1102, 'Petter Parker', '87945234L', 'Spider man', 'Aunt May', '20 Ingram Street, Queens, USA', 'Silla', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1102, 'Petter Parker', '87945234L', 'Spider man', 'Aunt May', '20 Ingram Street, Queens, USA', 'Silla', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Silla', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 0, 19, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Silla', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Silla', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Silla', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Silla', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 8, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Silla', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Silla', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Silla', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Silla', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Silla', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Silla', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Silla', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5,CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
|
|
|
@ -392,7 +392,6 @@ export default {
|
||||||
name: 'vn-item-basic-data vn-textfield[ng-model="$ctrl.item.name"]',
|
name: 'vn-item-basic-data vn-textfield[ng-model="$ctrl.item.name"]',
|
||||||
relevancy: 'vn-item-basic-data vn-input-number[ng-model="$ctrl.item.relevancy"]',
|
relevancy: 'vn-item-basic-data vn-input-number[ng-model="$ctrl.item.relevancy"]',
|
||||||
origin: 'vn-autocomplete[ng-model="$ctrl.item.originFk"]',
|
origin: 'vn-autocomplete[ng-model="$ctrl.item.originFk"]',
|
||||||
compression: 'vn-item-basic-data vn-input-number[ng-model="$ctrl.item.compression"]',
|
|
||||||
generic: 'vn-autocomplete[ng-model="$ctrl.item.genericFk"]',
|
generic: 'vn-autocomplete[ng-model="$ctrl.item.genericFk"]',
|
||||||
isFragile: 'vn-check[ng-model="$ctrl.item.isFragile"]',
|
isFragile: 'vn-check[ng-model="$ctrl.item.isFragile"]',
|
||||||
longName: 'vn-textfield[ng-model="$ctrl.item.longName"]',
|
longName: 'vn-textfield[ng-model="$ctrl.item.longName"]',
|
||||||
|
|
|
@ -99,8 +99,8 @@ describe('Worker time control path', () => {
|
||||||
|
|
||||||
expect(result).toEqual(scanTime);
|
expect(result).toEqual(scanTime);
|
||||||
});
|
});
|
||||||
// 3736 check proc vn.timeControl_calculate
|
|
||||||
xit(`should check Hank Pym worked 6:40 hours`, async() => {
|
it(`should check Hank Pym worked 6:40 hours`, async() => {
|
||||||
await page.waitForTextInElement(selectors.workerTimeControl.mondayWorkedHours, '06:40 h.');
|
await page.waitForTextInElement(selectors.workerTimeControl.mondayWorkedHours, '06:40 h.');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -30,8 +30,6 @@ describe('Item Edit basic data path', () => {
|
||||||
await page.autocompleteSearch(selectors.itemBasicData.origin, 'Spain');
|
await page.autocompleteSearch(selectors.itemBasicData.origin, 'Spain');
|
||||||
await page.clearInput(selectors.itemBasicData.relevancy);
|
await page.clearInput(selectors.itemBasicData.relevancy);
|
||||||
await page.write(selectors.itemBasicData.relevancy, '1');
|
await page.write(selectors.itemBasicData.relevancy, '1');
|
||||||
await page.clearInput(selectors.itemBasicData.compression);
|
|
||||||
await page.write(selectors.itemBasicData.compression, '2');
|
|
||||||
await page.clearInput(selectors.itemBasicData.generic);
|
await page.clearInput(selectors.itemBasicData.generic);
|
||||||
await page.autocompleteSearch(selectors.itemBasicData.generic, '16');
|
await page.autocompleteSearch(selectors.itemBasicData.generic, '16');
|
||||||
await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
|
await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
|
||||||
|
@ -96,13 +94,6 @@ describe('Item Edit basic data path', () => {
|
||||||
expect(result).toEqual('Spain');
|
expect(result).toEqual('Spain');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should confirm the item compression was edited`, async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.compression, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the item generic was edited`, async() => {
|
it(`should confirm the item generic was edited`, async() => {
|
||||||
const result = await page
|
const result = await page
|
||||||
.waitToGetProperty(selectors.itemBasicData.generic, 'value');
|
.waitToGetProperty(selectors.itemBasicData.generic, 'value');
|
||||||
|
|
|
@ -97,11 +97,16 @@ module.exports = Self => {
|
||||||
{'cl.socialName': {like: `%${value}%`}}
|
{'cl.socialName': {like: `%${value}%`}}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
case 'client':
|
||||||
|
return {'cl.socialName': {like: `%${value}%`}};
|
||||||
|
case 'clientFk':
|
||||||
|
return {'cl.clientFk': value};
|
||||||
case 'id':
|
case 'id':
|
||||||
case 'claimStateFk':
|
case 'claimStateFk':
|
||||||
case 'priority':
|
case 'priority':
|
||||||
return {[`cl.${param}`]: value};
|
return {[`cl.${param}`]: value};
|
||||||
case 'salesPersonFk':
|
case 'salesPersonFk':
|
||||||
|
return {'cl.salesPersonFk': value};
|
||||||
case 'attenderFk':
|
case 'attenderFk':
|
||||||
return {'cl.workerFk': value};
|
return {'cl.workerFk': value};
|
||||||
case 'created':
|
case 'created':
|
||||||
|
@ -129,7 +134,8 @@ module.exports = Self => {
|
||||||
cs.description,
|
cs.description,
|
||||||
cl.created,
|
cl.created,
|
||||||
cs.priority,
|
cs.priority,
|
||||||
cl.claimStateFk
|
cl.claimStateFk,
|
||||||
|
c.salesPersonFk
|
||||||
FROM claim cl
|
FROM claim cl
|
||||||
LEFT JOIN client c ON c.id = cl.clientFk
|
LEFT JOIN client c ON c.id = cl.clientFk
|
||||||
LEFT JOIN worker w ON w.id = cl.workerFk
|
LEFT JOIN worker w ON w.id = cl.workerFk
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('checkDuplicatedData', {
|
||||||
|
description: 'Checks if a client has same email, mobile or phone than other client and send an email',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The client id'
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: 'object',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
verb: 'GET',
|
||||||
|
path: '/:id/checkDuplicatedData'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.checkDuplicatedData = async function(id, options) {
|
||||||
|
const myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const client = await Self.app.models.Client.findById(id, myOptions);
|
||||||
|
|
||||||
|
const emails = client.email ? client.email.split(',') : null;
|
||||||
|
|
||||||
|
const findParams = [];
|
||||||
|
if (emails.length) {
|
||||||
|
for (let email of emails)
|
||||||
|
findParams.push({email: email});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client.phone)
|
||||||
|
findParams.push({phone: client.phone});
|
||||||
|
|
||||||
|
if (client.mobile)
|
||||||
|
findParams.push({mobile: client.mobile});
|
||||||
|
|
||||||
|
const filterObj = {
|
||||||
|
where: {
|
||||||
|
and: [
|
||||||
|
{or: findParams},
|
||||||
|
{id: {neq: client.id}}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const clientSameData = await Self.findOne(filterObj, myOptions);
|
||||||
|
|
||||||
|
if (clientSameData) {
|
||||||
|
await Self.app.models.Mail.create({
|
||||||
|
receiver: 'direccioncomercial@verdnatura.es',
|
||||||
|
subject: `Cliente con email/teléfono/móvil duplicados`,
|
||||||
|
body: 'El cliente ' + client.id + ' comparte alguno de estos datos con el cliente ' + clientSameData.id +
|
||||||
|
'\n- Email: ' + client.email +
|
||||||
|
'\n- Teléfono: ' + client.phone +
|
||||||
|
'\n- Móvil: ' + client.mobile
|
||||||
|
}, myOptions);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
const models = require('vn-loopback/server/server').models;
|
||||||
|
|
||||||
|
describe('client checkDuplicated()', () => {
|
||||||
|
it('should send an mail if mobile/phone/email is duplicated', async() => {
|
||||||
|
const tx = await models.Client.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
const id = 1110;
|
||||||
|
const mailModel = models.Mail;
|
||||||
|
spyOn(mailModel, 'create');
|
||||||
|
|
||||||
|
await models.Client.checkDuplicatedData(id, options);
|
||||||
|
|
||||||
|
expect(mailModel.create).toHaveBeenCalled();
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,9 +1,7 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
const soap = require('soap');
|
|
||||||
|
|
||||||
describe('client sendSms()', () => {
|
describe('client sendSms()', () => {
|
||||||
it('should now send a message and log it', async() => {
|
it('should now send a message and log it', async() => {
|
||||||
spyOn(soap, 'createClientAsync').and.returnValue('a so fake client');
|
|
||||||
const tx = await models.Client.beginTransaction({});
|
const tx = await models.Client.beginTransaction({});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -26,10 +26,9 @@ describe('Client updatePortfolio', () => {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// task 3817
|
||||||
it('should keep the same portfolioWeight when a salesperson is unassigned of a client', async() => {
|
xit('should keep the same portfolioWeight when a salesperson is unassigned of a client', async() => {
|
||||||
const salesPersonId = 19;
|
const salesPersonId = 19;
|
||||||
|
|
||||||
const tx = await models.Client.beginTransaction({});
|
const tx = await models.Client.beginTransaction({});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -80,6 +80,7 @@ module.exports = Self => {
|
||||||
stmt.merge(conn.makeWhere(filter.where));
|
stmt.merge(conn.makeWhere(filter.where));
|
||||||
stmt.merge(`GROUP BY d.clientFk`);
|
stmt.merge(`GROUP BY d.clientFk`);
|
||||||
stmt.merge(conn.makeOrderBy(filter.order));
|
stmt.merge(conn.makeOrderBy(filter.order));
|
||||||
|
stmt.merge(conn.makeLimit(filter));
|
||||||
|
|
||||||
const itemsIndex = stmts.push(stmt) - 1;
|
const itemsIndex = stmts.push(stmt) - 1;
|
||||||
const sql = ParameterizedSQL.join(stmts, ';');
|
const sql = ParameterizedSQL.join(stmts, ';');
|
||||||
|
|
|
@ -30,6 +30,7 @@ module.exports = Self => {
|
||||||
require('../methods/client/consumption')(Self);
|
require('../methods/client/consumption')(Self);
|
||||||
require('../methods/client/createReceipt')(Self);
|
require('../methods/client/createReceipt')(Self);
|
||||||
require('../methods/client/updatePortfolio')(Self);
|
require('../methods/client/updatePortfolio')(Self);
|
||||||
|
require('../methods/client/checkDuplicated')(Self);
|
||||||
|
|
||||||
// Validations
|
// Validations
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,11 @@ class Controller extends Dialog {
|
||||||
super($element, $, $transclude);
|
super($element, $, $transclude);
|
||||||
|
|
||||||
this.vnReport = vnReport;
|
this.vnReport = vnReport;
|
||||||
|
|
||||||
|
const tomorrow = new Date();
|
||||||
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
||||||
this.receipt = {
|
this.receipt = {
|
||||||
payed: new Date()
|
payed: tomorrow
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ export default class Controller extends Section {
|
||||||
return this.$.watcher.submit().then(() => {
|
return this.$.watcher.submit().then(() => {
|
||||||
const query = `Clients/updatePortfolio`;
|
const query = `Clients/updatePortfolio`;
|
||||||
this.$http.get(query);
|
this.$http.get(query);
|
||||||
|
this.$http.get(`Clients/${this.$params.id}/checkDuplicatedData`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,10 @@ export default class Controller extends Section {
|
||||||
}
|
}
|
||||||
|
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
return this.$.watcher.submit().then(
|
return this.$.watcher.submit().then(json => {
|
||||||
json => this.$state.go('client.card.basicData', {id: json.data.id})
|
this.$state.go('client.card.basicData', {id: json.data.id});
|
||||||
);
|
this.$http.get(`Clients/${this.client.id}/checkDuplicatedData`);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
get province() {
|
get province() {
|
||||||
|
|
|
@ -23,6 +23,7 @@ export default class Client extends ModuleMain {
|
||||||
case 'id':
|
case 'id':
|
||||||
case 'fi':
|
case 'fi':
|
||||||
case 'postcode':
|
case 'postcode':
|
||||||
|
case 'provinceFk':
|
||||||
case 'salesPersonFk':
|
case 'salesPersonFk':
|
||||||
return {[param]: value};
|
return {[param]: value};
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
vn-click-stop="itemDescriptor.show($event, item.id)"
|
vn-click-stop="clientDescriptor.show($event, client.id)"
|
||||||
class="link">
|
class="link">
|
||||||
{{::client.id}}
|
{{::client.id}}
|
||||||
</span>
|
</span>
|
||||||
|
@ -83,7 +83,9 @@
|
||||||
</smart-table>
|
</smart-table>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
|
|
||||||
|
<vn-client-descriptor-popover
|
||||||
|
vn-id="clientDescriptor">
|
||||||
|
</vn-client-descriptor-popover>
|
||||||
<vn-popover vn-id="filters">
|
<vn-popover vn-id="filters">
|
||||||
<div class="vn-pa-lg">
|
<div class="vn-pa-lg">
|
||||||
<form ng-submit="$ctrl.onSendClientConsumption()">
|
<form ng-submit="$ctrl.onSendClientConsumption()">
|
||||||
|
@ -153,3 +155,6 @@
|
||||||
</vn-item>
|
</vn-item>
|
||||||
</slot-menu>
|
</slot-menu>
|
||||||
</vn-contextmenu>
|
</vn-contextmenu>
|
||||||
|
<vn-client-descriptor-popover
|
||||||
|
vn-id="clientDescriptor">
|
||||||
|
</vn-client-descriptor-popover>
|
|
@ -50,6 +50,15 @@
|
||||||
ng-model="filter.postcode">
|
ng-model="filter.postcode">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-autocomplete
|
||||||
|
ng-model="filter.provinceFk"
|
||||||
|
url="Provinces"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id"
|
||||||
|
label="Province">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
|
|
|
@ -112,9 +112,6 @@
|
||||||
"itemPackingTypeFk": {
|
"itemPackingTypeFk": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"compression": {
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
"hasKgPrice": {
|
"hasKgPrice": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"description": "Price per Kg"
|
"description": "Price per Kg"
|
||||||
|
|
|
@ -129,14 +129,6 @@
|
||||||
ng-model="$ctrl.item.density"
|
ng-model="$ctrl.item.density"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
|
||||||
vn-one
|
|
||||||
min="0"
|
|
||||||
step="0.01"
|
|
||||||
label="Compression"
|
|
||||||
ng-model="$ctrl.item.compression"
|
|
||||||
rule>
|
|
||||||
</vn-input-number>
|
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
label="Generic"
|
label="Generic"
|
||||||
|
|
|
@ -40,7 +40,6 @@ Create: Crear
|
||||||
Client card: Ficha del cliente
|
Client card: Ficha del cliente
|
||||||
Shipped: F. envío
|
Shipped: F. envío
|
||||||
stems: Tallos
|
stems: Tallos
|
||||||
Compression: Compresión
|
|
||||||
Density: Densidad
|
Density: Densidad
|
||||||
Search items by id, name or barcode: Buscar articulos por identificador, nombre o codigo de barras
|
Search items by id, name or barcode: Buscar articulos por identificador, nombre o codigo de barras
|
||||||
SalesPerson: Comercial
|
SalesPerson: Comercial
|
||||||
|
|
|
@ -94,9 +94,6 @@
|
||||||
<vn-label-value label="Density"
|
<vn-label-value label="Density"
|
||||||
value="{{$ctrl.summary.item.density}}">
|
value="{{$ctrl.summary.item.density}}">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
<vn-label-value label="Compression"
|
|
||||||
value="{{$ctrl.summary.item.compression}}">
|
|
||||||
</vn-label-value>
|
|
||||||
<vn-label-value label="Expense"
|
<vn-label-value label="Expense"
|
||||||
value="{{$ctrl.summary.item.expense.name}}">
|
value="{{$ctrl.summary.item.expense.name}}">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
const soap = require('soap');
|
|
||||||
|
|
||||||
describe('ticket sendSms()', () => {
|
describe('ticket sendSms()', () => {
|
||||||
it('should send a message and log it', async() => {
|
it('should send a message and log it', async() => {
|
||||||
|
@ -8,7 +7,6 @@ describe('ticket sendSms()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
spyOn(soap, 'createClientAsync').and.returnValue('a so fake client');
|
|
||||||
const ctx = {req: {accessToken: {userId: 9}}};
|
const ctx = {req: {accessToken: {userId: 9}}};
|
||||||
const id = 11;
|
const id = 11;
|
||||||
const destination = 222222222;
|
const destination = 222222222;
|
||||||
|
|
|
@ -20,9 +20,6 @@
|
||||||
"created": {
|
"created": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
},
|
},
|
||||||
"temperature": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"temperatureFk": {
|
"temperatureFk": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"required": true
|
"required": true
|
||||||
|
|
|
@ -158,7 +158,7 @@
|
||||||
<vn-tbody>
|
<vn-tbody>
|
||||||
<vn-tr ng-repeat="thermograph in $ctrl.travelThermographs">
|
<vn-tr ng-repeat="thermograph in $ctrl.travelThermographs">
|
||||||
<vn-td>{{thermograph.thermographFk}} </vn-td>
|
<vn-td>{{thermograph.thermographFk}} </vn-td>
|
||||||
<vn-td>{{thermograph.temperature}}</vn-td>
|
<vn-td>{{thermograph.temperatureFk}}</vn-td>
|
||||||
<vn-td>{{thermograph.result}}</vn-td>
|
<vn-td>{{thermograph.result}}</vn-td>
|
||||||
<vn-td>{{thermograph.warehouse.name}}</vn-td>
|
<vn-td>{{thermograph.warehouse.name}}</vn-td>
|
||||||
<vn-td expand>{{thermograph.created | date: 'dd/MM/yyyy'}}</vn-td>
|
<vn-td expand>{{thermograph.created | date: 'dd/MM/yyyy'}}</vn-td>
|
||||||
|
|
|
@ -78,7 +78,7 @@
|
||||||
class="clickable search-result">
|
class="clickable search-result">
|
||||||
<vn-td number>{{::zone.id}}</vn-td>
|
<vn-td number>{{::zone.id}}</vn-td>
|
||||||
<vn-td expand>{{::zone.name}}</vn-td>
|
<vn-td expand>{{::zone.name}}</vn-td>
|
||||||
<vn-td>{{::zone.agencyMode.name}}</vn-td>
|
<vn-td>{{::zone.agencyModeName}}</vn-td>
|
||||||
<vn-td shrink>{{::zone.hour | date: 'HH:mm'}}</vn-td>
|
<vn-td shrink>{{::zone.hour | date: 'HH:mm'}}</vn-td>
|
||||||
<vn-td number>{{::zone.price | currency: 'EUR':2}}</vn-td>
|
<vn-td number>{{::zone.price | currency: 'EUR':2}}</vn-td>
|
||||||
<vn-td shrink>
|
<vn-td shrink>
|
||||||
|
|
|
@ -104,7 +104,7 @@
|
||||||
"test": "jest --watch",
|
"test": "jest --watch",
|
||||||
"back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back",
|
"back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back",
|
||||||
"lint": "eslint ./ --cache --ignore-pattern .gitignore",
|
"lint": "eslint ./ --cache --ignore-pattern .gitignore",
|
||||||
"docker": "docker build -t salix-db ./db"
|
"docker": "docker build --progress=plain -t salix-db ./db"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"projects": [
|
"projects": [
|
||||||
|
|
Loading…
Reference in New Issue