refs #6553 changes models #2522

Open
carlossa wants to merge 22 commits from 6553-workerBusiness into dev
21 changed files with 519 additions and 283 deletions
Showing only changes of commit be0de3511b - Show all commits

View File

@ -28,7 +28,7 @@ Pull from repository.
Run this commands on project root directory to install Node dependencies. Run this commands on project root directory to install Node dependencies.
``` ```
$ npm install $ pnpm install
$ gulp install $ gulp install
``` ```

View File

@ -16,36 +16,51 @@ module.exports = Self => {
accessScopes: ['DEFAULT', 'read:multimedia']}); accessScopes: ['DEFAULT', 'read:multimedia']});
Self.renewToken = async function(ctx) { Self.renewToken = async function(ctx) {
const {accessToken: token} = ctx.req;
const {courtesyTime} = await models.AccessTokenConfig.findOne({
fields: ['courtesyTime']
});
const isNotExceeded = await Self.validateToken(ctx);
if (isNotExceeded)
return token;
// Schedule to remove current token
setTimeout(async() => {
try {
const exists = await models.AccessToken.findById(token.id);
exists && await Self.logout(token.id);
} catch (err) {
// eslint-disable-next-line no-console
console.error(err);
}
}, courtesyTime * 1000);
// Get scopes
let createTokenOptions = {}; let createTokenOptions = {};
const {scopes} = token; let token; let isNotExceeded;
if (scopes) try {
createTokenOptions = {scopes: [scopes[0]]}; token = ctx.req.accessToken;
// Create new accessToken
const user = await Self.findById(token.userId);
const accessToken = await user.accessTokens.create(createTokenOptions);
return {id: accessToken.id, ttl: accessToken.ttl}; const {courtesyTime} = await models.AccessTokenConfig.findOne({
fields: ['courtesyTime']
});
isNotExceeded = await Self.validateToken(ctx);
if (isNotExceeded)
return token;
// Schedule to remove current token
setTimeout(async() => {
let exists;
try {
exists = await models.AccessToken.findById(token.id);
exists && await Self.logout(token.id);
} catch (error) {
// eslint-disable-next-line no-console
console.error(error);
const body = {error: error.message, now: Date.now(), userId: token?.userId ?? null, exists};
await handleError(body);
throw new Error(error);
}
}, courtesyTime * 1000);
// Get scopes
const {scopes} = token;
if (scopes)
createTokenOptions = {scopes: [scopes[0]]};
// Create new accessToken
const user = await Self.findById(token.userId);
const accessToken = await user.accessTokens.create(createTokenOptions);
return {id: accessToken.id, ttl: accessToken.ttl};
} catch (error) {
const body = {error: error.message, now: Date.now(), userId: token?.userId ?? null, createTokenOptions, isNotExceeded};
await handleError(body);
throw new Error(error);
}
}; };
}; };
async function handleError(body, tag = 'renewToken') {
body = JSON.stringify(body);
await models.Application.rawSql('CALL util.debugAdd(?,?);', [tag, body]);
}

View File

@ -61,4 +61,21 @@ describe('Renew Token', () => {
expect(error).toBeUndefined(); expect(error).toBeUndefined();
expect(response.id).toEqual(ctx.req.accessToken.id); expect(response.id).toEqual(ctx.req.accessToken.id);
}); });
it('throw error', async() => {
let error;
try {
await models.VnUser.renewToken({req: {token: null}});
} catch (e) {
error = e;
}
expect(error).toBeDefined();
const query = 'SELECT * FROM util.debug';
const debugLog = await models.Application.rawSql(query, null);
expect(debugLog.length).toEqual(1);
});
}); });

View File

@ -64,6 +64,9 @@
"EmailUser": { "EmailUser": {
"dataSource": "vn" "dataSource": "vn"
}, },
"Expedition_PrintOut": {
"dataSource": "vn"
},
"Image": { "Image": {
"dataSource": "vn" "dataSource": "vn"
}, },

View File

@ -0,0 +1,19 @@
{
"name": "Expedition_PrintOut",
"base": "VnModel",
"options": {
"mysql": {
"table": "dipole.expedition_PrintOut"
}
},
"properties": {
"expeditionFk": {
"type": "number",
"id": true,
"description": "id expeditionFk"
},
"itemFk": {
"type": "number"
}
}
}

View File

@ -839,9 +839,9 @@ INSERT INTO `vn`.`config`(`id`, `mdbServer`, `fakeEmail`, `defaultersMaxAmount`,
INSERT INTO `vn`.`greugeType`(`id`, `name`, `code`) INSERT INTO `vn`.`greugeType`(`id`, `name`, `code`)
VALUES VALUES
(1, 'Diff', 'diff'), (1, 'Diff', 'diff'),
(2, 'Recover', 'recover'), (2, 'Recovery', 'recovery'),
(3, 'Mana', 'mana'), (3, 'Mana', 'mana'),
(4, 'Reclaim', 'reclaim'), (4, 'Claim', 'claim'),
(5, 'Heritage', 'heritage'), (5, 'Heritage', 'heritage'),
(6, 'Miscellaneous', 'miscellaneous'), (6, 'Miscellaneous', 'miscellaneous'),
(7, 'Freight Pickup', 'freightPickUp'); (7, 'Freight Pickup', 'freightPickUp');
@ -1885,9 +1885,9 @@ INSERT INTO `vn`.`claimEnd`(`id`, `saleFk`, `claimFk`, `workerFk`, `claimDestina
(1, 31, 4, 21, 2), (1, 31, 4, 21, 2),
(2, 32, 3, 21, 3); (2, 32, 3, 21, 3);
INSERT INTO `vn`.`claimConfig`(`id`, `maxResponsibility`) INSERT INTO `vn`.`claimConfig`(`id`, `maxResponsibility`, `monthsToRefund`, `minShipped`)
VALUES VALUES
(1, 50); (1, 5, 4, '2016-10-01');
INSERT INTO `vn`.`claimRatio`(`clientFk`, `yearSale`, `claimAmount`, `claimingRate`, `priceIncreasing`, `packingRate`) INSERT INTO `vn`.`claimRatio`(`clientFk`, `yearSale`, `claimAmount`, `claimingRate`, `priceIncreasing`, `packingRate`)
VALUES VALUES
@ -3882,3 +3882,11 @@ INSERT INTO `vn`.`calendarHolidays` (calendarHolidaysTypeFk, dated, calendarHoli
(1, '2001-05-17', 1, 5), (1, '2001-05-17', 1, 5),
(1, '2001-05-18', 1, 5); (1, '2001-05-18', 1, 5);
INSERT INTO dipole.printer (id, description)
VALUES(1, '');
INSERT INTO dipole.expedition_PrintOut (expeditionFk, ticketFk, addressFk, street, postalCode, city, shopName, isPrinted, created, printerFk, routeFk, parkingCode,
truckName, clientFk, phone, province, agency, m3, workerCode, itemFk, quantity, longName, shelvingFk, comments)
VALUES(1, 1, 0, ' ', ' ', ' ', ' ', 0, '2001-01-01 00:00:00', 1, 0, ' ', ' ', 0, NULL, '', NULL, 0.000, NULL, 10, NULL, NULL, 'NCC', NULL);

View File

@ -1,167 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`claim_ratio_routine`()
BEGIN
DECLARE vMonthToRefund INT DEFAULT 4;
/*
* PAK 2015-11-20
* Se trata de añadir a la tabla Greuges todos los
* cargos que luego vamos a utilizar para calcular el recobro
*/
-- Reclamaciones demasiado sensibles
INSERT INTO vn.greuge(shipped, clientFk, description,
amount, greugeTypeFk, ticketFk)
SELECT c.ticketCreated
, c.clientFk
, concat('Claim ', c.id,' : ', s.concept)
,round( -1 * ((c.responsibility -1)/4) * s.quantity *
s.price * (100 - s.discount) / 100, 2)
, 4
, s.ticketFk
FROM vn.sale s
JOIN vn.claimEnd ce ON ce.saleFk = s.id
JOIN vn.claim c ON c.id = ce.claimFk
WHERE ce.claimDestinationFk NOT IN (1,5)
AND NOT ce.isGreuge
AND c.claimStateFk = 3;
-- Reclamaciones que pasan a Maná
INSERT INTO vn.greuge(shipped, clientFk, description,
amount, greugeTypeFk, ticketFk)
SELECT c.ticketCreated
, c.clientFk
, concat('Claim_mana ',c.id,' : ', s.concept)
,round( ((c.responsibility -1)/4) * s.quantity * s.price * (100 - s.discount) / 100, 2)
,3
,s.ticketFk
FROM vn.sale s
JOIN vn.claimEnd ce ON ce.saleFk = s.id
JOIN vn.claim c ON c.id = ce.claimFk
WHERE ce.claimDestinationFk NOT IN (1,5)
AND NOT ce.isGreuge
AND c.claimStateFk = 3
AND c.isChargedToMana;
-- Marcamos para no repetir
UPDATE vn.claimEnd ce
JOIN vn.claim c ON c.id = ce.claimFk
SET ce.isGreuge = TRUE
WHERE ce.claimDestinationFk NOT IN (1,5)
AND NOT ce.isGreuge
AND c.claimStateFk = 3;
-- Recobros
DROP TEMPORARY TABLE IF EXISTS tmp.ticket_list;
CREATE TEMPORARY TABLE tmp.ticket_list
(PRIMARY KEY (Id_Ticket))
SELECT DISTINCT t.id Id_Ticket
FROM vn.saleComponent sc
JOIN vn.sale s ON sc.saleFk = s.id
JOIN vn.ticket t ON t.id = s.ticketFk
JOIN vn.ticketLastState ts ON ts.ticketFk = t.id
JOIN vn.ticketTracking tt ON tt.id = ts.ticketTrackingFk
JOIN vn.state st ON st.id = tt.stateFk
JOIN vn.alertLevel al ON al.code = 'DELIVERED'
WHERE sc.componentFk = 17
AND sc.isGreuge = 0
AND t.shipped >= '2016-10-01'
AND t.shipped < util.VN_CURDATE()
AND st.alertLevel >= al.id;
DELETE g.*
FROM vn.greuge g
JOIN tmp.ticket_list t ON g.ticketFk = t.Id_Ticket
WHERE g.greugeTypeFk = 2;
INSERT INTO vn.greuge(clientFk, description, amount,shipped,
greugeTypeFk, ticketFk)
SELECT t.clientFk
,concat('recobro ', s.ticketFk), - round(SUM(sc.value*s.quantity),2)
AS dif,
date(t.shipped)
, 2
,tt.Id_Ticket
FROM vn.sale s
JOIN vn.ticket t ON t.id = s.ticketFk
JOIN tmp.ticket_list tt ON tt.Id_Ticket = t.id
JOIN vn.saleComponent sc
ON sc.saleFk = s.id AND sc.componentFk = 17
GROUP BY t.id
HAVING ABS(dif) > 1;
UPDATE vn.saleComponent sc
JOIN vn.sale s ON s.id = sc.saleFk
JOIN tmp.ticket_list tt ON tt.Id_Ticket = s.ticketFk
SET sc.isGreuge = 1
WHERE sc.componentFk = 17;
/*
* Recalculamos la ratio de las reclamaciones, que luego
* se va a utilizar en el recobro
*/
REPLACE bi.claims_ratio(Id_Cliente, Consumo, Reclamaciones, Ratio, recobro)
SELECT id, 0,0,0,0
FROM vn.client;
REPLACE bi.claims_ratio(Id_Cliente, Consumo, Reclamaciones, Ratio, recobro)
SELECT fm.Id_Cliente, 12 * fm.Consumo, Reclamaciones,
round(Reclamaciones / (12*fm.Consumo),4), 0
FROM bi.facturacion_media_anual fm
LEFT JOIN(
SELECT c.clientFk, round(sum(-1 * ((c.responsibility -1)/4) *
s.quantity * s.price * (100 - s.discount) / 100))
AS Reclamaciones
FROM vn.sale s
JOIN vn.claimEnd ce ON ce.saleFk = s.id
JOIN vn.claim c ON c.id = ce.claimFk
WHERE ce.claimDestinationFk NOT IN (1,5)
AND c.claimStateFk = 3
AND c.ticketCreated >= TIMESTAMPADD(YEAR, -1, util.VN_CURDATE())
GROUP BY c.clientFk
) claims ON claims.clientFk = fm.Id_Cliente;
-- Calculamos el porcentaje del recobro para añadirlo al precio de venta
UPDATE bi.claims_ratio cr
JOIN (
SELECT clientFk Id_Cliente, IFNULL(SUM(amount), 0) AS Greuge
FROM vn.greuge
WHERE shipped <= util.VN_CURDATE()
GROUP BY clientFk
) g ON g.Id_Cliente = cr.Id_Cliente
SET recobro = GREATEST(0,round(IFNULL(Greuge, 0) /
(IFNULL(Consumo, 0) * vMonthToRefund / 12 ) ,3));
-- Protección neonatos
UPDATE bi.claims_ratio cr
JOIN vn.firstTicketShipped fts ON fts.clientFk = cr.Id_Cliente
SET recobro = 0, Ratio = 0
WHERE fts.shipped > TIMESTAMPADD(MONTH,-1,util.VN_CURDATE());
-- CLIENTE 7983, JULIAN SUAU
UPDATE bi.claims_ratio SET recobro = LEAST(0.05, recobro) WHERE Id_Cliente = 7983;
-- CLIENTE 4358
UPDATE bi.claims_ratio SET recobro = GREATEST(0.05, recobro) WHERE Id_Cliente = 4358;
-- CLIENTE 5523, VERDECORA
UPDATE bi.claims_ratio SET recobro = GREATEST(0.12, recobro) WHERE Id_Cliente = 5523;
-- CLIENTE 15979, SERVEIS VETERINARIS
UPDATE bi.claims_ratio SET recobro = GREATEST(0.05, recobro) WHERE Id_Cliente = 15979;
-- CLIENTE 5189 i 8942, son de CSR i son el mateix client
UPDATE bi.claims_ratio cr
JOIN (SELECT sum(Consumo * recobro)/sum(Consumo) as recobro
FROM bi.claims_ratio
WHERE Id_Cliente IN ( 5189,8942)
) sub
SET cr.recobro = sub.recobro
WHERE Id_Cliente IN ( 5189,8942);
END$$
DELIMITER ;

View File

@ -21,7 +21,8 @@ BEGIN
DECLARE vTransactionExportTaxFreeFk INT; DECLARE vTransactionExportTaxFreeFk INT;
DECLARE vSerialDua VARCHAR(1) DEFAULT 'D'; DECLARE vSerialDua VARCHAR(1) DEFAULT 'D';
DECLARE vInvoiceTypeInformativeCode VARCHAR(1); DECLARE vInvoiceTypeInformativeCode VARCHAR(1);
DECLARE vCountryCanariasCode, vCountryCeutaMelillaCode VARCHAR(2) ; DECLARE vCountryCanariasCode, vCountryCeutaMelillaCode VARCHAR(2);
DECLARE vCompanyCode INT;
SELECT SiglaNacion INTO vCountryCanariasCode SELECT SiglaNacion INTO vCountryCanariasCode
FROM Naciones FROM Naciones
@ -31,9 +32,6 @@ BEGIN
FROM Naciones FROM Naciones
WHERE Nacion ='CEUTA Y MELILLA'; WHERE Nacion ='CEUTA Y MELILLA';
SELECT pendingServiceTransactionTypeFk INTO vDuaTransactionFk
FROM config;
SELECT id INTO vTaxImportFk SELECT id INTO vTaxImportFk
FROM taxType FROM taxType
WHERE code = 'import21'; WHERE code = 'import21';
@ -46,10 +44,14 @@ BEGIN
FROM taxType FROM taxType
WHERE code = 'import4'; WHERE code = 'import4';
SELECT definitiveExportTransactionTypeFk INTO vTransactionExportFk SELECT shipmentTransactionTypeFk,
FROM config; definitiveExportTransactionTypeFk,
pendingServiceTransactionTypeFk,
SELECT shipmentTransactionTypeFk INTO vTransactionExportTaxFreeFk company_getCode(vCompanyFk)
INTO vTransactionExportTaxFreeFk,
vTransactionExportFk,
vDuaTransactionFk,
vCompanyCode
FROM config; FROM config;
SELECT codeSage INTO vInvoiceTypeInformativeCode SELECT codeSage INTO vInvoiceTypeInformativeCode
@ -64,8 +66,6 @@ BEGIN
WHERE enlazadoSage = FALSE WHERE enlazadoSage = FALSE
AND Asiento <> 1 ; AND Asiento <> 1 ;
CALL clientSupplier_add(vCompanyFk);
CALL pgc_add(vCompanyFk);
CALL invoiceOut_manager(vYear, vCompanyFk); CALL invoiceOut_manager(vYear, vCompanyFk);
CALL invoiceIn_manager(vYear, vCompanyFk); CALL invoiceIn_manager(vYear, vCompanyFk);
@ -158,7 +158,7 @@ BEGIN
) )
SELECT 'EN' TipoEntrada, SELECT 'EN' TipoEntrada,
YEAR(x.FECHA) Ejercicio, YEAR(x.FECHA) Ejercicio,
company_getCode(vCompanyFk) AS CodigoEmpresa, vCompanyCode CodigoEmpresa,
x.ASIEN Asiento, x.ASIEN Asiento,
IF(EURODEBE <> 0 OR (EURODEBE = 0 AND EUROHABER IS NULL), IF(EURODEBE <> 0 OR (EURODEBE = 0 AND EUROHABER IS NULL),
'D', 'H') CargoAbono, 'D', 'H') CargoAbono,
@ -291,20 +291,6 @@ BEGIN
WHERE m.CargoAbono = 'D' WHERE m.CargoAbono = 'D'
AND m.enlazadoSage = FALSE; AND m.enlazadoSage = FALSE;
-- Elimina cuentas de cliente/proveedor que no se utilizarán en la importación
DELETE cp
FROM clientesProveedores cp
LEFT JOIN movConta mc ON mc.codigoCuenta = cp.codigoCuenta
AND mc.enlazadoSage = FALSE
WHERE mc.codigoCuenta IS NULL;
-- Elimina cuentas contables que no se utilizarán en la importación
DELETE pc
FROM planCuentasPGC pc
LEFT JOIN movConta mc ON mc.codigoCuenta = pc.codigoCuenta
AND mc.enlazadoSage = FALSE
WHERE mc.codigoCuenta IS NULL;
-- DUAS -- DUAS
UPDATE movConta mci UPDATE movConta mci
JOIN vn.XDiario x ON x.ASIEN = mci.Asiento JOIN vn.XDiario x ON x.ASIEN = mci.Asiento
@ -411,5 +397,55 @@ BEGIN
AND importeDivisa > 0 AND importeDivisa > 0
AND ImporteAsiento < 0; AND ImporteAsiento < 0;
CREATE OR REPLACE TEMPORARY TABLE tmp.clientSupplier
(INDEX(idClientSupplier, `type`))
ENGINE = MEMORY
WITH client AS(
SELECT DISTINCT c.id
FROM sage.movConta mc
JOIN vn.client c ON c.accountingAccount = mc.CodigoCuenta
WHERE NOT enlazadoSage
),supplier AS(
SELECT DISTINCT s.id
FROM sage.movConta mc
JOIN vn.supplier s ON s.account = mc.CodigoCuenta
WHERE NOT enlazadoSage
),clientSupplierSync AS(
SELECT idClientSupplier, `type`
FROM sage.clientSupplier cs
WHERE isSync
)
SELECT idClientSupplier, `type`
FROM sage.clientSupplier cs
WHERE NOT isSync
UNION
SELECT id, 'C'
FROM client c
LEFT JOIN clientSupplierSync cs ON cs.idClientSupplier = c.id
AND cs.Type ='C'
WHERE cs.idClientSupplier IS NULL
UNION
SELECT id, 'P'
FROM supplier s
LEFT JOIN clientSupplierSync cs ON cs.idClientSupplier = s.id
AND cs.Type ='P'
WHERE cs.idClientSupplier IS NULL;
CALL clientSupplier_add(vCompanyFk);
INSERT IGNORE INTO sage.clientSupplier (companyFk, `type`, idClientSupplier, isSync)
SELECT vCompanyCode, `type`, idClientSupplier, FALSE
FROM tmp.clientSupplier;
DROP TEMPORARY TABLE tmp.clientSupplier;
CALL pgc_add(vCompanyFk);
-- Elimina cuentas contables que no se utilizarán en la importación
DELETE pc
FROM planCuentasPGC pc
LEFT JOIN movConta mc ON mc.codigoCuenta = pc.codigoCuenta
AND mc.enlazadoSage = FALSE
WHERE mc.codigoCuenta IS NULL;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -1,11 +1,16 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `sage`.`clientSupplier_add`(vCompanyFk INT) CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `sage`.`clientSupplier_add`(
vCompanyFk INT
)
BEGIN BEGIN
/** /**
* Prepara los datos de clientes y proveedores para exportarlos a Sage * Inserta en la tabla sage.clientesProveedores los datos de clientes y proveedores
* @vCompanyFk Empresa dela que se quiere trasladar datos * que se actualizaran o se daran de alta en Sage
* @vCompanyFk Id de empresa
* @table tmp.clientSupplier(idClientSupplier, `type`)
*/ */
DECLARE vCountryCeutaMelillaFk INT; DECLARE vCountryCeutaMelillaFk INT;
DECLARE vCompanyCode INT DEFAULT company_getCode(vCompanyFk);
DECLARE vCountryCanariasCode, vCountryCeutaMelillaCode VARCHAR(2); DECLARE vCountryCanariasCode, vCountryCeutaMelillaCode VARCHAR(2);
SELECT SiglaNacion INTO vCountryCanariasCode SELECT SiglaNacion INTO vCountryCanariasCode
@ -45,7 +50,7 @@ BEGIN
Email1, Email1,
iban) iban)
SELECT SELECT
company_getCode(vCompanyFk), vCompanyCode,
'C', 'C',
c.id, c.id,
c.socialName, c.socialName,
@ -53,7 +58,7 @@ BEGIN
IFNULL(c.street, ''), IFNULL(c.street, ''),
c.accountingAccount, c.accountingAccount,
@fi := IF(cu.code = LEFT(TRIM(c.fi), 2) AND c.isVies, MID(TRIM(c.fi), 3, LENGTH(TRIM(c.fi))-1), TRIM(c.fi)), @fi := IF(cu.code = LEFT(TRIM(c.fi), 2) AND c.isVies, MID(TRIM(c.fi), 3, LENGTH(TRIM(c.fi))-1), TRIM(c.fi)),
IF(c.isVies, CONCAT(IFNULL(cu.viesCode,cu.code), @fi ), TRIM(c.fi)), IF(c.isVies, CONCAT(IFNULL(cu.viesCode,cu.code), @fi ), TRIM(c.fi)),
IFNULL(c.postcode, ''), IFNULL(c.postcode, ''),
IFNULL(c.city, ''), IFNULL(c.city, ''),
IFNULL(pr.CodigoProvincia, ''), IFNULL(pr.CodigoProvincia, ''),
@ -75,15 +80,14 @@ BEGIN
IFNULL(SUBSTR(c.email, 1, LOCATE(',', CONCAT(c.email, ','))-1), ''), IFNULL(SUBSTR(c.email, 1, LOCATE(',', CONCAT(c.email, ','))-1), ''),
IFNULL(c.iban, '') IFNULL(c.iban, '')
FROM vn.`client` c FROM vn.`client` c
JOIN clientLastTwoMonths clm ON clm.clientFk = c.id JOIN tmp.clientSupplier cs ON cs.idClientSupplier = c.id
LEFT JOIN vn.country cu ON cu.id = c.countryFk LEFT JOIN vn.country cu ON cu.id = c.countryFk
LEFT JOIN Naciones n ON n.countryFk = cu.id LEFT JOIN Naciones n ON n.countryFk = cu.id
LEFT JOIN vn.province p ON p.id = c.provinceFk LEFT JOIN vn.province p ON p.id = c.provinceFk
LEFT JOIN Provincias pr ON pr.provinceFk = p.id LEFT JOIN Provincias pr ON pr.provinceFk = p.id
WHERE c.isRelevant WHERE cs.type = 'C'
AND clm.companyFk = vCompanyFk
UNION ALL UNION ALL
SELECT company_getCode(vCompanyFk), SELECT vCompanyCode,
'P', 'P',
s.id, s.id,
s.name, s.name,
@ -107,18 +111,16 @@ BEGIN
IFNULL(s.transactionTypeSageFk, 0), IFNULL(s.transactionTypeSageFk, 0),
IFNULL(s.withholdingSageFk, '0'), IFNULL(s.withholdingSageFk, '0'),
IFNULL(SUBSTR(sc.email, 1, (COALESCE(NULLIF(LOCATE(',', sc.email), 0), 99) - 1)), ''), IFNULL(SUBSTR(sc.email, 1, (COALESCE(NULLIF(LOCATE(',', sc.email), 0), 99) - 1)), ''),
IFNULL(iban, '') IFNULL(sa.iban, '')
FROM vn.supplier s FROM vn.supplier s
JOIN supplierLastThreeMonths pl ON pl.supplierFk = s.id JOIN tmp.clientSupplier cs ON cs.idClientSupplier = s.id
LEFT JOIN vn.country co ON co.id = s.countryFk LEFT JOIN vn.country co ON co.id = s.countryFk
LEFT JOIN Naciones n ON n.countryFk = co.id LEFT JOIN Naciones n ON n.countryFk = co.id
LEFT JOIN vn.province p ON p.id = s.provinceFk LEFT JOIN vn.province p ON p.id = s.provinceFk
LEFT JOIN Provincias pr ON pr.provinceFk = p.id LEFT JOIN Provincias pr ON pr.provinceFk = p.id
LEFT JOIN vn.supplierContact sc ON sc.supplierFk = s.id LEFT JOIN vn.supplierContact sc ON sc.supplierFk = s.id
LEFT JOIN vn.supplierAccount sa ON sa.supplierFk = s.id LEFT JOIN vn.supplierAccount sa ON sa.supplierFk = s.id
WHERE pl.companyFk = vCompanyFk AND WHERE cs.type = 'P'
s.isActive AND GROUP BY s.id;
s.nif <> ''
GROUP BY pl.supplierFk, pl.companyFk;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -0,0 +1,190 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`claimRatio_add`()
BEGIN
/*
* Añade a la tabla greuges todos los cargos necesario y
* que luego lo utilizamos para calcular el recobro.
*/
DECLARE vMonthToRefund INT
DEFAULT (SELECT monthsToRefund FROM claimConfig);
DECLARE vRecoveryGreugeType INT
DEFAULT (SELECT id FROM greugeType WHERE code = 'recovery');
DECLARE vManaGreugeType INT
DEFAULT (SELECT id FROM greugeType WHERE code = 'mana');
DECLARE vClaimGreugeType INT
DEFAULT (SELECT id FROM greugeType WHERE code = 'claim');
DECLARE vDebtComponentType INT
DEFAULT (SELECT id FROM component WHERE code = 'debtCollection');
IF vMonthToRefund IS NULL
OR vRecoveryGreugeType IS NULL
OR vManaGreugeType IS NULL
OR vClaimGreugeType IS NULL
OR vDebtComponentType IS NULL THEN
CALL util.throw('Required variables not found');
END IF;
-- Reclamaciones demasiado sensibles
INSERT INTO greuge(
shipped,
clientFk,
`description`,
amount,
greugeTypeFk,
ticketFk
)
SELECT c.ticketCreated,
c.clientFk,
CONCAT('Claim ', c.id,' : ', s.concept),
ROUND(-1 * ((c.responsibility - 1) / 4) * s.quantity *
s.price * (100 - s.discount) / 100, 2),
vClaimGreugeType,
s.ticketFk
FROM sale s
JOIN claimEnd ce ON ce.saleFk = s.id
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
WHERE cd.description NOT IN ('Bueno', 'Corregido')
AND NOT ce.isGreuge
AND cs.code = 'resolved';
-- Reclamaciones que pasan a Maná
INSERT INTO greuge(
shipped,
clientFk,
`description`,
amount,
greugeTypeFk,
ticketFk
)
SELECT c.ticketCreated,
c.clientFk,
CONCAT('Claim_mana ', c.id,' : ', s.concept),
ROUND(((c.responsibility - 1) / 4) * s.quantity *
s.price * (100 - s.discount) / 100, 2),
vManaGreugeType,
s.ticketFk
FROM sale s
JOIN claimEnd ce ON ce.saleFk = s.id
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
WHERE cd.description NOT IN ('Bueno', 'Corregido')
AND NOT ce.isGreuge
AND cs.code = 'resolved'
AND c.isChargedToMana;
-- Marcamos para no repetir
UPDATE claimEnd ce
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
SET ce.isGreuge = TRUE
WHERE cd.description NOT IN ('Bueno', 'Corregido')
AND NOT ce.isGreuge
AND cs.code = 'resolved';
-- Recobros
CREATE OR REPLACE TEMPORARY TABLE tTicketList
(PRIMARY KEY (ticketFk))
ENGINE = MEMORY
SELECT DISTINCT s.ticketFk
FROM saleComponent sc
JOIN sale s ON sc.saleFk = s.id
JOIN ticket t ON t.id = s.ticketFk
JOIN ticketLastState ts ON ts.ticketFk = t.id
JOIN ticketTracking tt ON tt.id = ts.ticketTrackingFk
JOIN state st ON st.id = tt.stateFk
JOIN alertLevel al ON al.id = st.alertLevel
WHERE sc.componentFk = vDebtComponentType
AND NOT sc.isGreuge
AND t.shipped >= (SELECT minShipped FROM claimConfig)
AND t.shipped < util.VN_CURDATE()
AND al.code = 'DELIVERED';
DELETE g.*
FROM greuge g
JOIN tTicketList t ON t.ticketFk = g.ticketFk
WHERE g.greugeTypeFk = vRecoveryGreugeType;
INSERT INTO greuge(
clientFk,
`description`,
amount,
shipped,
greugeTypeFk,
ticketFk
)
SELECT t.clientFk,
'Recobro',
- ROUND(SUM(sc.value * s.quantity), 2) dif,
DATE(t.shipped),
vRecoveryGreugeType,
tl.ticketFk
FROM sale s
JOIN ticket t ON t.id = s.ticketFk
JOIN tTicketList tl ON tl.ticketFk = t.id
JOIN saleComponent sc ON sc.saleFk = s.id
AND sc.componentFk = vDebtComponentType
GROUP BY t.id
HAVING ABS(dif) > 1;
UPDATE saleComponent sc
JOIN sale s ON s.id = sc.saleFk
JOIN tTicketList tl ON tl.ticketFk = s.ticketFk
SET sc.isGreuge = TRUE
WHERE sc.componentFk = vDebtComponentType;
REPLACE claimRatio(
clientFk,
yearSale,
claimAmount,
claimingRate,
priceIncreasing
)
SELECT c.id,
12 * cac.invoiced,
totalClaims,
ROUND(totalClaims / (12 * cac.invoiced), 4),
0
FROM client c
LEFT JOIN bs.clientAnnualConsumption cac ON cac.clientFk = c.id
LEFT JOIN (
SELECT c.clientFk,
ROUND(SUM(-1 * ((c.responsibility - 1) / 4) *
s.quantity * s.price * (100 - s.discount)
/ 100)) totalClaims
FROM sale s
JOIN claimEnd ce ON ce.saleFk = s.id
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
WHERE cd.description NOT IN ('Bueno', 'Corregido')
AND cs.code = 'resolved'
AND c.ticketCreated >= util.VN_CURDATE() - INTERVAL 1 YEAR
GROUP BY c.clientFk
) sub ON sub.clientFk = c.id;
-- Calculamos el porcentaje del recobro para añadirlo al precio de venta
UPDATE claimRatio cr
JOIN (
SELECT clientFk, IFNULL(SUM(amount), 0) greuge
FROM greuge
WHERE shipped <= util.VN_CURDATE()
GROUP BY clientFk
) sub ON sub.clientFk = cr.clientFk
SET cr.priceIncreasing = GREATEST(0, ROUND(IFNULL(sub.greuge, 0) /
(IFNULL(cr.yearSale, 0) * vMonthToRefund / 12 ), 3));
-- Protección neonatos
UPDATE claimRatio cr
JOIN firstTicketShipped fts ON fts.clientFk = cr.clientFk
SET cr.priceIncreasing = 0,
cr.claimingRate = 0
WHERE fts.shipped > util.VN_CURDATE() - INTERVAL 1 MONTH;
DROP TEMPORARY TABLE tTicketList;
END$$
DELIMITER ;

View File

@ -1,5 +1,7 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`duaInvoiceInBooking`(vDuaFk INT) CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`duaInvoiceInBooking`(
vDuaFk INT
)
BEGIN BEGIN
/** /**
* Genera el asiento de un DUA y marca las entradas como confirmadas * Genera el asiento de un DUA y marca las entradas como confirmadas
@ -29,9 +31,7 @@ BEGIN
SET ii.booked = IFNULL(ii.booked, d.booked), SET ii.booked = IFNULL(ii.booked, d.booked),
ii.operated = IFNULL(ii.operated, d.operated), ii.operated = IFNULL(ii.operated, d.operated),
ii.issued = IFNULL(ii.issued, d.issued), ii.issued = IFNULL(ii.issued, d.issued),
ii.bookEntried = IFNULL(ii.bookEntried, d.bookEntried), ii.bookEntried = IFNULL(ii.bookEntried, d.bookEntried)
e.isBooked = TRUE,
e.isConfirmed = TRUE
WHERE d.id = vDuaFk; WHERE d.id = vDuaFk;
SELECT ASIEN INTO vBookEntry FROM dua WHERE id = vDuaFk; SELECT ASIEN INTO vBookEntry FROM dua WHERE id = vDuaFk;
@ -39,7 +39,7 @@ BEGIN
IF vBookEntry IS NULL THEN IF vBookEntry IS NULL THEN
SELECT YEAR(IFNULL(ii.bookEntried, d.bookEntried)) INTO vFiscalYear SELECT YEAR(IFNULL(ii.bookEntried, d.bookEntried)) INTO vFiscalYear
FROM invoiceIn ii FROM invoiceIn ii
JOIN entry e ON e.invoiceInFk = ii.id JOIN `entry` e ON e.invoiceInFk = ii.id
JOIN duaEntry de ON de.entryFk = e.id JOIN duaEntry de ON de.entryFk = e.id
JOIN dua d ON d.id = de.duaFk JOIN dua d ON d.id = de.duaFk
WHERE d.id = vDuaFk WHERE d.id = vDuaFk
@ -49,7 +49,7 @@ BEGIN
OPEN vInvoicesIn; OPEN vInvoicesIn;
l: LOOP l: LOOP
SET vDone = FALSE; SET vDone = FALSE;
FETCH vInvoicesIn INTO vInvoiceFk; FETCH vInvoicesIn INTO vInvoiceFk;
@ -70,5 +70,28 @@ l: LOOP
JOIN duaInvoiceIn dii ON dii.invoiceInFk = ii.id JOIN duaInvoiceIn dii ON dii.invoiceInFk = ii.id
SET ii.isBooked = TRUE SET ii.isBooked = TRUE
WHERE dii.duaFk = vDuaFk; WHERE dii.duaFk = vDuaFk;
UPDATE `entry` e
JOIN (
WITH entries AS (
SELECT e.id, de.duaFk
FROM `entry` e
JOIN duaEntry de ON de.entryFk = e.id
WHERE de.duaFk = vDuaFk
AND (NOT e.isBooked OR NOT e.isConfirmed)
),
notBookedEntries AS (
SELECT e.id
FROM duaEntry
WHERE duaFk = vDuaFk
AND NOT customsValue
)
SELECT e.id
FROM entries e
LEFT JOIN notBookedEntries nbe ON nbe.entryFk = e.id
WHERE nbe.entryFk IS NULL
) sub ON sub.id = e.id
SET e.isBooked = TRUE,
e.isConfirmed = TRUE;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -21,7 +21,8 @@ proc:BEGIN
sub.downstairs, sub.downstairs,
sub.visible, sub.visible,
CAST(visible - upstairs - downstairs AS DECIMAL(10,0)) nicho, CAST(visible - upstairs - downstairs AS DECIMAL(10,0)) nicho,
sub.name itemColour sub.name itemColour,
CAST(sub2.pendiente AS DECIMAL(10,0)) pendingAmount
FROM (SELECT iss.itemFk, FROM (SELECT iss.itemFk,
CONCAT(i.longName, ' ', IFNULL(i.size, ''),' ', IFNULL(i.subName, '') ) longName, CONCAT(i.longName, ' ', IFNULL(i.size, ''),' ', IFNULL(i.subName, '') ) longName,
'' size, '' size,
@ -58,7 +59,8 @@ proc:BEGIN
0, 0,
v.visible, v.visible,
v.visible nicho, v.visible nicho,
ik.name itemColour ik.name itemColour,
CAST(sub5.pendiente AS DECIMAL(10,0)) pendingAmount
FROM cache.visible v FROM cache.visible v
JOIN item i ON i.id = v.item_id JOIN item i ON i.id = v.item_id
LEFT JOIN ink ik ON ik.id = i.inkFk LEFT JOIN ink ik ON ik.id = i.inkFk

View File

@ -22,7 +22,7 @@ BEGIN
landed, landed,
`in`, `in`,
`out`, `out`,
warehouse, sref,
buyingValue, buyingValue,
IF ( IF (
NOT (@vItemFk <=> sub.itemFk), NOT (@vItemFk <=> sub.itemFk),
@ -31,19 +31,20 @@ BEGIN
) balance, ) balance,
@vItemFk := sub.itemFk previousItemFk @vItemFk := sub.itemFk previousItemFk
FROM ( FROM (
SELECT supplierFk, SELECT sp.supplierFk,
itemFk, sp.itemFk,
longName, sp.longName,
supplier, sp.supplier,
CONCAT('E',entryFk) entryFk, CONCAT('E',sp.entryFk) entryFk,
landed, sp.landed,
`in`, sp.`in`,
`out`, sp.`out`,
warehouse, e.invoiceNumber sref,
buyingValue sp.buyingValue
FROM supplierPackaging FROM supplierPackaging sp
WHERE supplierFk = vSupplierFk JOIN entry e ON e.id = sp.entryFk
AND landed >= vFromDated WHERE sp.supplierFk = vSupplierFk
AND sp.landed >= vFromDated
UNION ALL UNION ALL
SELECT vSupplierFk, SELECT vSupplierFk,
itemFk, itemFk,
@ -68,7 +69,7 @@ BEGIN
DATE(t.shipped), DATE(t.shipped),
-LEAST(s.quantity,0) `in`, -LEAST(s.quantity,0) `in`,
GREATEST(s.quantity,0) `out`, GREATEST(s.quantity,0) `out`,
t.warehouseFk, t.cmrFk,
s.price * (100 - s.discount) / 100 s.price * (100 - s.discount) / 100
FROM sale s FROM sale s
JOIN item i ON i.id = s.itemFk JOIN item i ON i.id = s.itemFk
@ -110,7 +111,7 @@ BEGIN
DATE(t.shipped), DATE(t.shipped),
-LEAST(tp.quantity,0) `in`, -LEAST(tp.quantity,0) `in`,
GREATEST(tp.quantity,0) `out`, GREATEST(tp.quantity,0) `out`,
t.warehouseFk, t.cmrFk,
0 0
FROM ticketPackaging tp FROM ticketPackaging tp
JOIN packaging p ON p.id = tp.packagingFk JOIN packaging p ON p.id = tp.packagingFk
@ -155,7 +156,7 @@ BEGIN
landed, landed,
CAST(`in` AS DECIMAL(10,0)) `in`, CAST(`in` AS DECIMAL(10,0)) `in`,
CAST(`out` AS DECIMAL(10,0)) `out`, CAST(`out` AS DECIMAL(10,0)) `out`,
warehouse, sref,
buyingValue, buyingValue,
balance balance
FROM tSupplierPackaging FROM tSupplierPackaging

View File

@ -12,23 +12,21 @@ BEGIN
END IF; END IF;
IF !(OLD.started <=> NEW.started AND OLD.ended <=> NEW.ended) THEN IF !(OLD.started <=> NEW.started AND OLD.ended <=> NEW.ended) THEN
SELECT util.hasDateOverlapped(
SELECT COUNT(*) > 0 INTO isOverlapping started,
FROM business b ended,
WHERE (util.hasDateOverlapped( NEW.started,
NEW.started, IFNULL(NEW.ended, b.started)
IFNULL(NEW.ended, b.started), ) isOverlapped INTO isOverlapping
b.started, FROM vn.business b
IFNULL(b.ended, NEW.started)) WHERE workerFk = NEW.workerFK
OR (NEW.ended <=> NULL AND b.ended <=> NULL)) AND b.id <> NEW.id
AND b.id <> OLD.id ORDER BY isOverlapped DESC
AND workerFk = OLD.workerFk; LIMIT 1;
IF isOverlapping THEN IF isOverlapping THEN
CALL util.throw ('IS_OVERLAPPING'); CALL util.throw ('IS_OVERLAPPING');
END IF; END IF;
END IF; END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -3,12 +3,35 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`client_afterUpdate`
AFTER UPDATE ON `client` AFTER UPDATE ON `client`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
IF !(NEW.defaultAddressFk <=> OLD.defaultAddressFk) THEN IF NOT (NEW.defaultAddressFk <=> OLD.defaultAddressFk) THEN
UPDATE `address` SET isDefaultAddress = FALSE UPDATE `address` SET isDefaultAddress = FALSE
WHERE clientFk = NEW.id; WHERE clientFk = NEW.id;
UPDATE `address` SET isDefaultAddress = TRUE UPDATE `address` SET isDefaultAddress = TRUE
WHERE id = NEW.defaultAddressFk; WHERE id = NEW.defaultAddressFk;
END IF; END IF;
IF NEW.id <> OLD.id
OR NOT (NEW.provinceFk <=> OLD.provinceFk)
OR NOT (NEW.socialName <=> OLD.socialName)
OR NOT (NEW.street <=> OLD.street)
OR NOT (NEW.accountingAccount <=> OLD.accountingAccount)
OR NOT (NEW.isVies <=> OLD.isVies)
OR NOT (NEW.fi <=> OLD.fi)
OR NOT (NEW.postcode <=> OLD.postcode)
OR NOT (NEW.city <=> OLD.city)
OR NOT (NEW.countryFk <=> OLD.countryFk)
OR NOT (NEW.taxTypeSageFk <=> OLD.taxTypeSageFk)
OR NOT (NEW.transactionTypeSageFk <=> OLD.transactionTypeSageFk)
OR NOT (NEW.email <=> OLD.email)
OR NOT (NEW.iban <=> OLD.iban)
OR NOT (NEW.phone <=> OLD.phone)
OR NOT (NEW.mobile <=> OLD.mobile) THEN
UPDATE sage.clientSupplier
SET isSync = FALSE
WHERE idClientSupplier IN (NEW.id, OLD.id)
AND `type` = 'C';
END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -65,11 +65,11 @@ BEGIN
END IF; END IF;
END IF; END IF;
IF !(NEW.salesPersonFk <=> OLD.salesPersonFk) THEN IF NOT (NEW.salesPersonFk <=> OLD.salesPersonFk) THEN
SET NEW.lastSalesPersonFk = IFNULL(NEW.salesPersonFk, OLD.salesPersonFk); SET NEW.lastSalesPersonFk = IFNULL(NEW.salesPersonFk, OLD.salesPersonFk);
END IF; END IF;
IF !(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;
END$$ END$$

View File

@ -0,0 +1,26 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`supplier_afterUpdate`
BEFORE UPDATE ON `supplier`
FOR EACH ROW
BEGIN
IF NEW.id <> OLD.id
OR NOT (NEW.name <=> OLD.name)
OR NOT (NEW.street <=> OLD.street)
OR NOT (NEW.account <=> OLD.account)
OR NOT (NEW.nif <=> OLD.nif)
OR NOT (NEW.isVies <=> OLD.isVies)
OR NOT (NEW.provinceFk <=> OLD.provinceFk)
OR NOT (NEW.countryFk <=> OLD.countryFk)
OR NOT (NEW.postCode <=> OLD.postCode)
OR NOT (NEW.city <=> OLD.city)
OR NOT (NEW.taxTypeSageFk <=> OLD.taxTypeSageFk)
OR NOT (NEW.transactionTypeSageFk <=> OLD.transactionTypeSageFk)
OR NOT (NEW.withholdingSageFk <=> OLD.withholdingSageFk) THEN
UPDATE sage.clientSupplier
SET isSync = FALSE
WHERE idClientSupplier IN (NEW.id, OLD.id)
AND `type` = 'P';
END IF;
END$$
DELIMITER ;

View File

@ -0,0 +1,12 @@
UPDATE IGNORE bs.nightTask
SET `schema` = 'vn',
`procedure` = 'claimRatio_add'
WHERE `procedure` = 'claim_ratio_routine';
ALTER TABLE vn.claimConfig
ADD monthsToRefund int(11) DEFAULT NULL NULL,
ADD minShipped date DEFAULT NULL NULL;
UPDATE IGNORE vn.claimConfig
SET monthsToRefund = 4,
minShipped = '2016-10-01';

View File

@ -0,0 +1,9 @@
CREATE OR REPLACE TABLE sage.clientSupplier (
`companyFk` smallint(6) NOT NULL,
`type` ENUM('C','P') NOT NULL,
`idClientSupplier` INT NOT NULL,
`isSync` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`companyFk`,`idClientSupplier`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci
COMMENT='Clients and suppliers present in Sage and their synchronization status';

View File

@ -0,0 +1 @@
ALTER TABLE account.`user` DROP COLUMN password__;

View File

@ -0,0 +1,18 @@
-- Place your SQL code here
CREATE TABLE IF NOT EXISTS vn.travelKgPercentage (
value INT(3) PRIMARY KEY,
className VARCHAR(50)
);
INSERT IGNORE INTO vn.travelKgPercentage (value, className)
VALUES
(80, 'primary'),
(100, 'alert');
INSERT IGNORE INTO salix.ACL
SET model = 'TravelKgPercentage',
property = '*',
accessType = 'READ',
permission = 'ALLOW',
principalType = 'ROLE',
principalId = 'employee';