diff --git a/back/methods/mrw-config/createShipment.ejs b/back/methods/mrw-config/createShipment.ejs
index bf8a07dab4..7468218f28 100644
--- a/back/methods/mrw-config/createShipment.ejs
+++ b/back/methods/mrw-config/createShipment.ejs
@@ -26,16 +26,24 @@
<%= expeditionData.fi %>
<%= expeditionData.clientName %>
<%= expeditionData.phone %>
+ <%= expeditionData.deliveryObservation %>
<%= expeditionData.created %>
- <%= expeditionData.expeditionDataId %>
+ <%= expeditionData.reference %>
<%= expeditionData.serviceType %>
1
<%= expeditionData.weekDays %>
- <%= expeditionData.kg %>
+
+
+ <%= mrw.defaultHeight %>
+ <%= mrw.defaultLength %>
+ <%= mrw.defaultWidth %>
+ <%= mrw.defaultWeight %>
+
+
diff --git a/back/methods/mrw-config/createShipment.js b/back/methods/mrw-config/createShipment.js
index 081a833829..dd2ed883a3 100644
--- a/back/methods/mrw-config/createShipment.js
+++ b/back/methods/mrw-config/createShipment.js
@@ -45,7 +45,7 @@ module.exports = Self => {
`SELECT
CASE co.code
WHEN 'ES' THEN a.postalCode
- WHEN 'PT' THEN LEFT(a.postalCode, 4)
+ WHEN 'PT' THEN LEFT(a.postalCode, mc.portugalPostCodeTrim)
WHEN 'AD' THEN REPLACE(a.postalCode, 'AD', '00')
END postalCode,
a.city,
@@ -56,9 +56,10 @@ module.exports = Self => {
c.phone,
DATE_FORMAT(t.shipped, '%d/%m/%Y') created,
t.shipped,
- e.id expeditionId,
- LPAD(IF(mw.params IS NULL, ms.serviceType, mw.serviceType), 4 ,'0') serviceType,
- IF(mw.weekdays, 'S', 'N') weekDays
+ CONCAT( e.ticketFk, LPAD(e.counter, mc.counterWidth, '0')) reference,
+ LPAD(IF(mw.params IS NULL, ms.serviceType, mw.serviceType), mc.serviceTypeWidth,'0') serviceType,
+ IF(mw.weekdays, 'S', 'N') weekDays,
+ oa.description deliveryObservation
FROM expedition e
JOIN ticket t ON e.ticketFk = t.id
JOIN agencyMode am ON am.id = t.agencyModeFk
@@ -66,8 +67,12 @@ module.exports = Self => {
LEFT JOIN mrwServiceWeekday mw ON mw.weekdays = DATE_FORMAT(t.shipped, '%a')
JOIN client c ON t.clientFk = c.id
JOIN address a ON t.addressFk = a.id
+ LEFT JOIN addressObservation oa ON oa.addressFk = a.id
+ LEFT JOIN observationType ot ON ot.id = oa.observationTypeFk
+ AND ot.code = 'delivery'
JOIN province p ON a.provinceFk = p.id
JOIN country co ON co.id = p.countryFk
+ JOIN mrwConfig mc
WHERE e.id = ?
LIMIT 1`;
diff --git a/back/models/mrw-config.json b/back/models/mrw-config.json
index 50cf7e8fc5..b0e9754bda 100644
--- a/back/models/mrw-config.json
+++ b/back/models/mrw-config.json
@@ -27,6 +27,18 @@
},
"subscriberCode": {
"type": "string"
+ },
+ "defaultHeight": {
+ "type": "number"
+ },
+ "defaultLength": {
+ "type": "number"
+ },
+ "defaultWidth": {
+ "type": "number"
+ },
+ "defaultWeight": {
+ "type": "number"
}
}
}
diff --git a/db/routines/bi/procedures/claim_ratio_routine.sql b/db/routines/bi/procedures/claim_ratio_routine.sql
index ae87e15a20..40b8794832 100644
--- a/db/routines/bi/procedures/claim_ratio_routine.sql
+++ b/db/routines/bi/procedures/claim_ratio_routine.sql
@@ -48,7 +48,7 @@ BEGIN
-- Marcamos para no repetir
UPDATE vn.claimEnd ce
JOIN vn.claim c ON c.id = ce.claimFk
- SET c.isChargedToMana = TRUE
+ SET ce.isGreuge = TRUE
WHERE ce.claimDestinationFk NOT IN (1,5)
AND NOT ce.isGreuge
AND c.claimStateFk = 3;
diff --git a/db/routines/floranet/procedures/catalogue_get.sql b/db/routines/floranet/procedures/catalogue_get.sql
index 523026a410..7ce32cfac8 100644
--- a/db/routines/floranet/procedures/catalogue_get.sql
+++ b/db/routines/floranet/procedures/catalogue_get.sql
@@ -44,8 +44,8 @@ proc:BEGIN
addressFk
)
SELECT CONCAT(i.name, ' by ',a.nickname),
- i.minPrice + apc.deliveryCost,
- i.id,
+ r.price + apc.deliveryCost,
+ r.itemFk,
vLanded,
vPostalCode,
it.name,
@@ -53,13 +53,15 @@ proc:BEGIN
i.description,
apc.addressFk
FROM vn.item i
+ JOIN (SELECT itemFk, SUM(quantity * cost) price
+ FROM recipe
+ GROUP BY itemFk) r ON r.itemFk = i.id
JOIN vn.itemType it ON it.id = i.typeFk
JOIN addressPostCode apc
ON apc.dayOfWeek = dayOfWeek(vLanded)
AND NOW() < vLanded - INTERVAL apc.hoursInAdvance HOUR
AND apc.postCode = vPostalCode
- JOIN vn.address a ON a.id = apc.addressFk
- WHERE it.code IN ('FNR','FNP');
+ JOIN vn.address a ON a.id = apc.addressFk;
SELECT *
FROM catalogue
diff --git a/db/routines/floranet/procedures/order_confirm.sql b/db/routines/floranet/procedures/order_confirm.sql
index 903d348a22..3b9413da97 100644
--- a/db/routines/floranet/procedures/order_confirm.sql
+++ b/db/routines/floranet/procedures/order_confirm.sql
@@ -18,10 +18,29 @@ proc:BEGIN
DECLARE vBodyEmail TEXT;
DECLARE vZoneFk INT;
+ DECLARE exit handler FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+
+ GET DIAGNOSTICS CONDITION 2 @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
+
+ SELECT CONCAT('ERROR ', IFNULL(@errno,0), ': ', ifnull(@text,'texto')) AS `SQLEXCEPTION`;
+
+ CALL vn.mail_insert(
+ 'floranet@verdnatura.es,pako@verdnatura.es',
+ 'noreply@verdnatura.es',
+ 'Floranet.order_confirm failure',
+ CONCAT('CatalogueFk: ', vCatalogueFk, '\n','ERROR ', IFNULL(@errno, 0), ': ', ifnull(@text, 'texto'))
+ );
+ END;
+
IF (SELECT isPaid FROM `order` WHERE catalogueFk = vCatalogueFk) THEN
- CALL util.throw('Esta orden ya está confirmada');
+ SELECT CONCAT('CatalogueFk: ', vCatalogueFk, ' Esta orden ya está confirmada') AS `ERROR`;
+ LEAVE proc;
END IF;
+ START TRANSACTION;
+
UPDATE `order`
SET isPaid = TRUE,
payed = NOW()
@@ -89,7 +108,24 @@ proc:BEGIN
ON apc.addressFk = c.addressFk
AND apc.dayOfWeek = dayOfWeek(c.dated)
WHERE c.id = vCatalogueFk;
-
+
+ INSERT INTO vn.sale(
+ ticketFk,
+ itemFk,
+ concept,
+ price,
+ quantity)
+ SELECT
+ vNewTicketFk,
+ r.elementFk,
+ i.longName,
+ r.cost,
+ r.quantity
+ FROM catalogue c
+ JOIN recipe r ON r.itemFk = c.itemFk
+ JOIN vn.item i ON i.id = r.elementFk
+ WHERE c.id = vCatalogueFk;
+
SELECT cl.email,
cf.email,
CONCAT('Nuevo pedido FLORANET para entrega el ',c.dated),
@@ -114,7 +150,7 @@ proc:BEGIN
JOIN `order` o ON o.catalogueFk = c.id
JOIN config cf
WHERE c.id = vCatalogueFk;
-
+
CALL vn.mail_insert(
vCustomerEmail,
vFloranetEmail,
@@ -124,5 +160,8 @@ proc:BEGIN
SELECT isPaid, vNewTicketFk
FROM `order`
WHERE catalogueFk = vCatalogueFk;
+
+ COMMIT;
+
END$$
DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/functions/client_getFromPhone.sql b/db/routines/vn/functions/client_getFromPhone.sql
index c6ded691b0..5e4daa5324 100644
--- a/db/routines/vn/functions/client_getFromPhone.sql
+++ b/db/routines/vn/functions/client_getFromPhone.sql
@@ -11,10 +11,7 @@ BEGIN
*/
DECLARE vClient INT DEFAULT NULL;
- -- SET vPhone = vPhone COLLATE 'utf8_unicode_ci';
-
- DROP TEMPORARY TABLE IF EXISTS tClient;
- CREATE TEMPORARY TABLE tClient
+ CREATE OR REPLACE TEMPORARY TABLE tClient
ENGINE = MEMORY
SELECT id clientFk
FROM `client`
@@ -27,13 +24,14 @@ BEGIN
OR mobile = vPhone
UNION
SELECT clientFk
- FROM vn.clientContact
+ FROM clientContact
WHERE phone = vPhone;
SELECT t.clientFk INTO vClient
FROM tClient t
JOIN `client` c ON c.id = t.clientFk
WHERE c.isActive
+ AND c.salesPersonFk
LIMIT 1;
DROP TEMPORARY TABLE tClient;
diff --git a/db/routines/vn/procedures/collection_assign.sql b/db/routines/vn/procedures/collection_assign.sql
index c1a4087ff2..fc9f9a7115 100644
--- a/db/routines/vn/procedures/collection_assign.sql
+++ b/db/routines/vn/procedures/collection_assign.sql
@@ -13,28 +13,12 @@ BEGIN
* @param vCollectionFk Id de colección
*/
DECLARE vHasTooMuchCollections BOOL;
- DECLARE vItemPackingTypeFk VARCHAR(1);
- DECLARE vWarehouseFk INT;
- DECLARE vLockName VARCHAR(215);
- DECLARE vLockTime INT DEFAULT 30;
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- IF vLockName IS NOT NULL THEN
- DO RELEASE_LOCK(vLockName);
- CALL util.debugAdd('releaseLock', vLockName); -- Tmp
- END IF;
-
- RESIGNAL;
- END;
-- Si hay colecciones sin terminar, sale del proceso
CALL collection_get(vUserFk);
- SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0,
- collection_assign_lockname
- INTO vHasTooMuchCollections,
- vLockName
+ SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0
+ INTO vHasTooMuchCollections
FROM productionConfig pc
LEFT JOIN tCollection ON TRUE;
@@ -44,21 +28,6 @@ BEGIN
CALL util.throw('Hay colecciones pendientes');
END IF;
- SELECT warehouseFk, itemPackingTypeFk
- INTO vWarehouseFk, vItemPackingTypeFk
- FROM operator
- WHERE workerFk = vUserFk;
-
- SET vLockName = CONCAT_WS('/',
- vLockName,
- vWarehouseFk,
- vItemPackingTypeFk
- );
-
- IF NOT GET_LOCK(vLockName, vLockTime) THEN
- CALL util.throw(CONCAT('Cannot get lock: ', vLockName));
- END IF;
-
-- Se eliminan las colecciones sin asignar que estan obsoletas
INSERT INTO ticketTracking(stateFk, ticketFk)
SELECT s.id, tc.ticketFk
@@ -66,7 +35,7 @@ BEGIN
JOIN ticketCollection tc ON tc.collectionFk = c.id
JOIN `state` s ON s.code = 'PRINTED_AUTO'
JOIN productionConfig pc
- WHERE c.workerFk IS NULL
+ WHERE c.workerFk IS NULL
AND TIMEDIFF(util.VN_NOW(), c.created) > pc.maxNotAssignedCollectionLifeTime;
DELETE c.*
@@ -80,8 +49,7 @@ BEGIN
VALUES(vUserFk);
-- Comprueba si hay colecciones disponibles que se ajustan a su configuracion
- SELECT MIN(c.id)
- INTO vCollectionFk
+ SELECT MIN(c.id) INTO vCollectionFk
FROM `collection` c
JOIN operator o
ON (o.itemPackingTypeFk = c.itemPackingTypeFk OR c.itemPackingTypeFk IS NULL)
@@ -107,7 +75,5 @@ BEGIN
UPDATE `collection`
SET workerFk = vUserFk
WHERE id = vCollectionFk;
-
- DO RELEASE_LOCK(vLockName);
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/duaInvoiceInBooking.sql b/db/routines/vn/procedures/duaInvoiceInBooking.sql
index 981f3026de..035b4eab1f 100644
--- a/db/routines/vn/procedures/duaInvoiceInBooking.sql
+++ b/db/routines/vn/procedures/duaInvoiceInBooking.sql
@@ -6,12 +6,12 @@ BEGIN
*
* @param vDuaFk Id del dua a recalcular
*/
- DECLARE done BOOL DEFAULT FALSE;
+ DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vInvoiceFk INT;
- DECLARE vASIEN BIGINT DEFAULT 0;
- DECLARE vCounter INT DEFAULT 0;
+ DECLARE vBookEntry INT;
+ DECLARE vFiscalYear INT;
- DECLARE rs CURSOR FOR
+ DECLARE vInvoicesIn CURSOR FOR
SELECT DISTINCT e.invoiceInFk
FROM entry e
JOIN duaEntry de ON de.entryFk = e.id
@@ -20,9 +20,7 @@ BEGIN
AND de.customsValue
AND ii.isBooked = FALSE;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-
- OPEN rs;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
UPDATE invoiceIn ii
JOIN entry e ON e.invoiceInFk = ii.id
@@ -36,38 +34,36 @@ BEGIN
e.isConfirmed = TRUE
WHERE d.id = vDuaFk;
- SELECT IFNULL(ASIEN,0) INTO vASIEN
- FROM dua
- WHERE id = vDuaFk;
+ SELECT ASIEN INTO vBookEntry FROM dua WHERE id = vDuaFk;
- FETCH rs INTO vInvoiceFk;
+ IF vBookEntry IS NULL THEN
+ SELECT YEAR(IFNULL(ii.bookEntried, d.bookEntried)) INTO vFiscalYear
+ FROM invoiceIn ii
+ JOIN entry e ON e.invoiceInFk = ii.id
+ JOIN duaEntry de ON de.entryFk = e.id
+ JOIN dua d ON d.id = de.duaFk
+ WHERE d.id = vDuaFk
+ LIMIT 1;
+ CALL ledger_next(vFiscalYear, FALSE, vBookEntry);
+ END IF;
- WHILE NOT done DO
+ OPEN vInvoicesIn;
- CALL invoiceIn_booking(vInvoiceFk);
-
- IF vCounter > 0 OR vASIEN > 0 THEN
-
- UPDATE XDiario x
- JOIN ledgerConfig lc ON lc.lastBookEntry = x.ASIEN
- SET x.ASIEN = vASIEN;
-
- ELSE
-
- SELECT lastBookEntry INTO vASIEN FROM ledgerConfig;
+l: LOOP
+ SET vDone = FALSE;
+ FETCH vInvoicesIn INTO vInvoiceFk;
+ IF vDone THEN
+ LEAVE l;
END IF;
- SET vCounter = vCounter + 1;
+ CALL invoiceIn_booking(vInvoiceFk, vBookEntry);
+ END LOOP;
- FETCH rs INTO vInvoiceFk;
-
- END WHILE;
-
- CLOSE rs;
+ CLOSE vInvoicesIn;
UPDATE dua
- SET ASIEN = vASIEN
+ SET ASIEN = vBookEntry
WHERE id = vDuaFk;
UPDATE invoiceIn ii
diff --git a/db/routines/vn/procedures/duaTaxBooking.sql b/db/routines/vn/procedures/duaTaxBooking.sql
index 5d4a98933d..8d8effe902 100644
--- a/db/routines/vn/procedures/duaTaxBooking.sql
+++ b/db/routines/vn/procedures/duaTaxBooking.sql
@@ -12,7 +12,7 @@ BEGIN
WHERE id = vDuaFk;
IF vBookNumber IS NULL OR NOT vBookNumber THEN
- CALL ledger_next(YEAR(vBookDated), vBookNumber);
+ CALL ledger_next(YEAR(vBookDated), FALSE, vBookNumber);
END IF;
-- Apunte de la aduana
diff --git a/db/routines/vn/procedures/invoiceIn_booking.sql b/db/routines/vn/procedures/invoiceIn_booking.sql
index 4b015750fc..cd311ba9d4 100644
--- a/db/routines/vn/procedures/invoiceIn_booking.sql
+++ b/db/routines/vn/procedures/invoiceIn_booking.sql
@@ -1,7 +1,17 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceIn_booking`(vSelf INT)
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceIn_booking`(
+ vSelf INT,
+ vBookNumber INT
+)
BEGIN
- DECLARE vBookNumber INT;
+/**
+ * Genera la contabilidad para una factura y la marca como contabilizada
+ * Cuadra el asiento generado en si encuentra problemas derivados
+ * de los calculos con decimales
+ *
+ * @param vSelf Id invoiceIn
+ * @param vBookEntry Id de asiento, si es NULL se genera uno nuevo
+ */
DECLARE vFiscalYear INT;
CREATE OR REPLACE TEMPORARY TABLE tInvoiceIn
@@ -58,7 +68,10 @@ BEGIN
WHERE ii.id = vSelf;
SELECT YEAR(bookEntried) INTO vFiscalYear FROM tInvoiceIn LIMIT 1;
- CALL ledger_next(vFiscalYear, vBookNumber);
+
+ IF vBookNumber IS NULL THEN
+ CALL ledger_next(vFiscalYear, FALSE, vBookNumber);
+ END IF;
-- Apunte del proveedor
INSERT INTO XDiario(
@@ -187,7 +200,7 @@ BEGIN
LEFT JOIN (
SELECT e.id
FROM tInvoiceIn tii
- JOIN expense e ON e.id = tii.expenseFk
+ JOIN expense e ON e.id = tii.expenseFk
WHERE e.isWithheld
LIMIT 1
) eWithheld ON TRUE
diff --git a/db/routines/vn/procedures/invoiceOutBooking.sql b/db/routines/vn/procedures/invoiceOutBooking.sql
index 9130355761..b50b89eaf0 100644
--- a/db/routines/vn/procedures/invoiceOutBooking.sql
+++ b/db/routines/vn/procedures/invoiceOutBooking.sql
@@ -61,7 +61,7 @@ BEGIN
WHERE io.id = vInvoice;
SELECT YEAR(FECHA) INTO vFiscalYear FROM rs LIMIT 1;
- CALL ledger_next(vFiscalYear, vBookNumber);
+ CALL ledger_next(vFiscalYear, FALSE, vBookNumber);
-- Linea del cliente
INSERT INTO XDiario(
ASIEN,
diff --git a/db/routines/vn/procedures/ledger_doCompensation.sql b/db/routines/vn/procedures/ledger_doCompensation.sql
index 80475ac08c..a9e4e42511 100644
--- a/db/routines/vn/procedures/ledger_doCompensation.sql
+++ b/db/routines/vn/procedures/ledger_doCompensation.sql
@@ -28,7 +28,7 @@ BEGIN
DECLARE vIsOriginalAClient BOOL;
DECLARE vPayMethodCompensation INT;
- CALL ledger_next(YEAR(vDated), vNewBookEntry);
+ CALL ledger_next(YEAR(vDated), FALSE, vNewBookEntry);
SELECT COUNT(id) INTO vIsOriginalAClient
FROM client
diff --git a/db/routines/vn/procedures/ledger_next.sql b/db/routines/vn/procedures/ledger_next.sql
index dccce3a769..2d565ff996 100644
--- a/db/routines/vn/procedures/ledger_next.sql
+++ b/db/routines/vn/procedures/ledger_next.sql
@@ -1,6 +1,7 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ledger_next`(
IN vFiscalYear INT,
+ IN vIsManageTransaction BOOLEAN,
OUT vLastBookEntry INT
)
BEGIN
@@ -22,13 +23,15 @@ BEGIN
CALL util.throw('Fiscal year is required');
END IF;
- SELECT @@in_transaction INTO vHasStartTransaction;
+ IF NOT vIsManageTransaction THEN
+ SELECT @@in_transaction INTO vHasStartTransaction;
- IF NOT vHasStartTransaction THEN
- START TRANSACTION;
- ELSE
- SAVEPOINT sp;
- END IF;
+ IF NOT vHasStartTransaction THEN
+ START TRANSACTION;
+ ELSE
+ SAVEPOINT sp;
+ END IF;
+ END IF;
SELECT bookEntry + 1 INTO vLastBookEntry
FROM ledgerCompany
@@ -46,10 +49,12 @@ BEGIN
SET bookEntry = vLastBookEntry
WHERE fiscalYear = vFiscalYear;
- IF vHasStartTransaction THEN
- RELEASE SAVEPOINT sp;
- ELSE
- COMMIT;
- END IF;
+ IF NOT vIsManageTransaction THEN
+ IF vHasStartTransaction THEN
+ RELEASE SAVEPOINT sp;
+ ELSE
+ COMMIT;
+ END IF;
+ END IF;
END$$
DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/procedures/xdiario_new.sql b/db/routines/vn/procedures/xdiario_new.sql
index 8204f46524..83e1afa164 100644
--- a/db/routines/vn/procedures/xdiario_new.sql
+++ b/db/routines/vn/procedures/xdiario_new.sql
@@ -39,7 +39,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`xdiario_new`(
*/
BEGIN
IF vBookNumber IS NULL THEN
- CALL ledger_next(YEAR(vDated), vBookNumber);
+ CALL ledger_next(YEAR(vDated), FALSE, vBookNumber);
END IF;
INSERT INTO XDiario
diff --git a/db/routines/vn/triggers/payment_beforeInsert.sql b/db/routines/vn/triggers/payment_beforeInsert.sql
index 0a4cd1f124..337a54172f 100644
--- a/db/routines/vn/triggers/payment_beforeInsert.sql
+++ b/db/routines/vn/triggers/payment_beforeInsert.sql
@@ -9,13 +9,12 @@ BEGIN
DECLARE vIsCash BOOLEAN;
DECLARE vIsSupplierActive BOOLEAN;
- -- PAK 10/02/15 No se asientan los pagos directamente, salvo en el caso de las cajas de CASH
SELECT (at2.code = 'cash') INTO vIsCash
FROM accounting a
JOIN accountingType at2 ON at2.id = a.accountingTypeFk
WHERE a.id = NEW.bankFk;
- IF vIsCash THEN
+ IF vIsCash THEN
SELECT account INTO vBankAccount
FROM accounting
WHERE id = NEW.bankFk;
@@ -24,7 +23,7 @@ BEGIN
FROM supplier
WHERE id = NEW.supplierFk;
- CALL ledger_next(YEAR(NEW.received), NEW.companyFk, vNewBookEntry);
+ CALL ledger_next(YEAR(NEW.received), TRUE, vNewBookEntry);
INSERT INTO XDiario (
ASIEN,
diff --git a/db/versions/11065-yellowChrysanthemum/00-modifyInvoiceInPrivileges.sql b/db/versions/11065-yellowChrysanthemum/00-modifyInvoiceInPrivileges.sql
new file mode 100644
index 0000000000..b65ca1c170
--- /dev/null
+++ b/db/versions/11065-yellowChrysanthemum/00-modifyInvoiceInPrivileges.sql
@@ -0,0 +1,24 @@
+REVOKE UPDATE ON vn. invoiceIn FROM administrative, hrBoss, buyer, logistic;
+GRANT UPDATE (id,
+ serialNumber,
+ serial,
+ supplierFk,
+ issued,
+ supplierRef,
+ currencyFk,
+ created,
+ companyFk,
+ docFk,
+ booked,
+ operated,
+ siiTypeInvoiceInFk,
+ cplusRectificationTypeFk,
+ cplusSubjectOpFk,
+ cplusTaxBreakFk,
+ siiTrascendencyInvoiceInFk,
+ bookEntried,
+ isVatDeductible,
+ withholdingSageFk,
+ expenseFkDeductible,
+ editorFk
+) ON vn.invoiceIn TO administrative, hrBoss, buyer, logistic;
\ No newline at end of file
diff --git a/db/versions/11065-yellowChrysanthemum/01-modifyInvoiceInAcls.sql b/db/versions/11065-yellowChrysanthemum/01-modifyInvoiceInAcls.sql
new file mode 100644
index 0000000000..5475b70acc
--- /dev/null
+++ b/db/versions/11065-yellowChrysanthemum/01-modifyInvoiceInAcls.sql
@@ -0,0 +1,23 @@
+UPDATE salix.ACL
+ SET accessType = 'READ'
+ WHERE principalId IN ('administrative','buyer')
+ AND model = 'invoiceIn'
+ AND property = '*';
+
+INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+VALUES
+ ('InvoiceIn', 'updateInvoiceIn', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'clone', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'corrective', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'exchangeRateUpdate', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'invoiceInEmail', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'toBook', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'toUnbook', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'deleteById', 'WRITE', 'ALLOW', 'ROLE', 'administrative'),
+ ('InvoiceIn', 'updateInvoiceIn', 'WRITE', 'ALLOW', 'ROLE', 'buyer'),
+ ('InvoiceIn', 'clone', 'WRITE', 'ALLOW', 'ROLE', 'buyer'),
+ ('InvoiceIn', 'corrective', 'WRITE', 'ALLOW', 'ROLE', 'buyer'),
+ ('InvoiceIn', 'exchangeRateUpdate', 'WRITE', 'ALLOW', 'ROLE', 'buyer'),
+ ('InvoiceIn', 'invoiceInEmail', 'WRITE', 'ALLOW', 'ROLE', 'buyer'),
+ ('InvoiceIn', 'toBook', 'WRITE', 'ALLOW', 'ROLE', 'buyer'),
+ ('InvoiceIn', 'deleteById', 'WRITE', 'ALLOW', 'ROLE', 'buyer');
diff --git a/db/versions/11074-brownRuscus/00-firstScript.sql b/db/versions/11074-brownRuscus/00-firstScript.sql
new file mode 100644
index 0000000000..f78ba98aee
--- /dev/null
+++ b/db/versions/11074-brownRuscus/00-firstScript.sql
@@ -0,0 +1,20 @@
+-- Place your SQL code here
+
+
+-- floranet.recipe definition
+
+CREATE OR REPLACE TABLE floranet.`recipe`
+ (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `itemFk` int(11) NOT NULL COMMENT 'Bouquet or plant name',
+ `elementFk` int(11) NOT NULL COMMENT 'Item detail for bouquet''s composition',
+ `quantity` int(10) unsigned NOT NULL DEFAULT 1,
+ `cost` decimal(10,2) NOT NULL DEFAULT 1.00,
+ PRIMARY KEY (`id`),
+ KEY `recipe_FK` (`itemFk`),
+ KEY `recipe_FK_1` (`elementFk`),
+ CONSTRAINT `recipe_FK` FOREIGN KEY (`itemFk`) REFERENCES `vn`.`item` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `recipe_item_FK` FOREIGN KEY (`elementFk`) REFERENCES `vn`.`item` (`id`) ON UPDATE CASCADE
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Links handmade products with their elements';
+
+DROP TABLE IF EXISTS floranet.`element`;
\ No newline at end of file
diff --git a/db/versions/11075-salmonLilium/00-firstScript.sql b/db/versions/11075-salmonLilium/00-firstScript.sql
new file mode 100644
index 0000000000..6e487e5031
--- /dev/null
+++ b/db/versions/11075-salmonLilium/00-firstScript.sql
@@ -0,0 +1,5 @@
+-- Place your SQL code here
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS defaultHeight INT UNSIGNED NULL COMMENT 'default height in centimeters';
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS defaultLength INT UNSIGNED NULL COMMENT 'default length in centimeters';
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS defaultWidth INT UNSIGNED NULL COMMENT 'default width in centimeters';
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS defaultWeight INT UNSIGNED NULL COMMENT 'default weight in centimeters';
diff --git a/db/versions/11078-goldenFern/00-firstScript.sql b/db/versions/11078-goldenFern/00-firstScript.sql
new file mode 100644
index 0000000000..63888a1bbe
--- /dev/null
+++ b/db/versions/11078-goldenFern/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.productionConfig ADD scannablePreviusCodeType enum('qr','barcode')
+ CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT 'barcode' NOT NULL;
\ No newline at end of file
diff --git a/db/versions/11079-goldenFern/00-firstScript.sql b/db/versions/11079-goldenFern/00-firstScript.sql
new file mode 100644
index 0000000000..14d9ddb5f1
--- /dev/null
+++ b/db/versions/11079-goldenFern/00-firstScript.sql
@@ -0,0 +1,3 @@
+-- Place your SQL code here
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS expeditionDeadLine TIME NULL
+COMMENT 'This field stores the latest time by which expeditions can be generated to be sent today';
\ No newline at end of file
diff --git a/db/versions/11080-maroonAnthurium/00-firstScript.sql b/db/versions/11080-maroonAnthurium/00-firstScript.sql
new file mode 100644
index 0000000000..651cd4c7c8
--- /dev/null
+++ b/db/versions/11080-maroonAnthurium/00-firstScript.sql
@@ -0,0 +1,9 @@
+-- Place your SQL code here
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS counterWidth INT UNSIGNED NULL
+ COMMENT 'If it does not reach the required value, it will be padded with zeros on the left to meet the specified length.';
+
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS serviceTypeWidth INT UNSIGNED NULL
+ COMMENT 'If it does not reach the required value, it will be padded with zeros on the left to meet the specified length.';
+
+ALTER TABLE vn.mrwConfig ADD IF NOT EXISTS portugalPostCodeTrim INT UNSIGNED NULL
+ COMMENT 'It will trim the last characters of the postal code';
diff --git a/front/salix/components/upload-photo/index.js b/front/salix/components/upload-photo/index.js
index c9774d0370..7779c81e14 100644
--- a/front/salix/components/upload-photo/index.js
+++ b/front/salix/components/upload-photo/index.js
@@ -164,6 +164,7 @@ export default class UploadPhoto extends Component {
const options = {
type: 'blob',
+ size: 'original'
};
return this.editor.result(options)
.then(blob => this.newPhoto.blob = blob)
diff --git a/loopback/util/log.js b/loopback/util/log.js
index 76e87781d9..d2b78ce706 100644
--- a/loopback/util/log.js
+++ b/loopback/util/log.js
@@ -85,8 +85,12 @@ exports.translateValues = async(instance, changes, options = {}) => {
exports.getChanges = (original, changes) => {
const oldChanges = {};
const newChanges = {};
+ const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
for (let property in changes) {
+ if (dateRegex.test(original[property]))
+ original[property] = new Date(Date.parse(original[property]));
+
const firstChar = property.substring(0, 1);
const isPrivate = firstChar == '$';
if (isPrivate) return;
diff --git a/modules/claim/back/methods/claim/updateClaim.js b/modules/claim/back/methods/claim/updateClaim.js
index a206d7f3e2..c99e0e2f14 100644
--- a/modules/claim/back/methods/claim/updateClaim.js
+++ b/modules/claim/back/methods/claim/updateClaim.js
@@ -88,15 +88,17 @@ module.exports = Self => {
const updatedClaim = await claim.updateAttributes(args, myOptions);
// When pickup has been changed
- if (salesPerson && changedPickup && updatedClaim.pickup)
- await notifyPickUp(ctx, salesPerson.id, claim);
+ if (salesPerson) {
+ if (changedPickup && updatedClaim.pickup)
+ await notifyPickUp(ctx, salesPerson.id, claim);
- // When claimState has been changed
- if (args.claimStateFk) {
- const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
- await notifyStateChange(ctx, salesPerson.id, claim, newState.description);
- if (newState.code == 'canceled')
- await notifyStateChange(ctx, claim.workerFk, claim, newState.description);
+ // When claimState has been changed
+ if (args.claimStateFk) {
+ const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
+ await notifyStateChange(ctx, salesPerson.id, claim, newState.description);
+ if (newState.code == 'canceled')
+ await notifyStateChange(ctx, claim.workerFk, claim, newState.description);
+ }
}
if (tx) await tx.commit();
diff --git a/modules/client/back/models/XDiario.json b/modules/client/back/models/XDiario.json
index be543393de..5c277783a9 100644
--- a/modules/client/back/models/XDiario.json
+++ b/modules/client/back/models/XDiario.json
@@ -76,7 +76,16 @@
},
"enlazadoSage": {
"type": "boolean"
- }
+ },
+ "enlazado": {
+ "type": "boolean"
+ },
+ "key": {
+ "type": "number",
+ "mysql": {
+ "columnName": "CLAVE"
+ }
+ }
},
"relations": {
"company": {
diff --git a/modules/entry/back/model-config.json b/modules/entry/back/model-config.json
index 7b6e236857..dc7fd86be2 100644
--- a/modules/entry/back/model-config.json
+++ b/modules/entry/back/model-config.json
@@ -22,5 +22,8 @@
},
"EntryObservation": {
"dataSource": "vn"
+ },
+ "EntryType": {
+ "dataSource": "vn"
}
-}
+}
\ No newline at end of file
diff --git a/modules/entry/back/models/entry-type.json b/modules/entry/back/models/entry-type.json
new file mode 100644
index 0000000000..989aa3a8aa
--- /dev/null
+++ b/modules/entry/back/models/entry-type.json
@@ -0,0 +1,25 @@
+{
+ "name": "EntryType",
+ "base": "VnModel",
+ "mixins": {
+ "Loggable": true
+ },
+ "options": {
+ "mysql": {
+ "table": "entryType"
+ }
+ },
+ "properties": {
+ "code": {
+ "type": "string",
+ "id": true,
+ "description": "Identifier"
+ },
+ "description": {
+ "type": "string"
+ },
+ "isInformal": {
+ "type": "boolean"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json
index ab451219eb..833edf14d8 100644
--- a/modules/entry/back/models/entry.json
+++ b/modules/entry/back/models/entry.json
@@ -35,9 +35,9 @@
},
"isVirtual": {
"type": "boolean",
- "mysql": {
- "columnName": "isRaid"
- }
+ "mysql": {
+ "columnName": "isRaid"
+ }
},
"isRaid": {
"type": "boolean"
@@ -53,9 +53,9 @@
},
"observation": {
"type": "string",
- "mysql": {
- "columnName": "evaNotes"
- }
+ "mysql": {
+ "columnName": "evaNotes"
+ }
},
"loadPriority": {
"type": "number"
@@ -101,6 +101,11 @@
"type": "belongsTo",
"model": "Account",
"foreignKey": "observationEditorFk"
+ },
+ "entryType": {
+ "type": "belongsTo",
+ "model": "EntryType",
+ "foreignKey": "typeFk"
}
}
-}
+}
\ No newline at end of file
diff --git a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js
index 3ad06b242b..989b1d4a24 100644
--- a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js
+++ b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js
@@ -54,6 +54,20 @@ module.exports = Self => {
value: rate
});
}
+ const monday = 1;
+ if (xmlDateWithoutTime.getDay() === monday) {
+ const saturday = new Date(xmlDateWithoutTime);
+ saturday.setDate(xmlDateWithoutTime.getDate() - 2);
+ const sunday = new Date(xmlDateWithoutTime);
+ sunday.setDate(xmlDateWithoutTime.getDate() - 1);
+
+ for (const date of [saturday, sunday]) {
+ await models.ReferenceRate.upsertWithWhere(
+ {currencyFk: currency.id, dated: date},
+ {currencyFk: currency.id, dated: date, value: rate}
+ );
+ }
+ }
}
}
}
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/toUnbook.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/toUnbook.spec.js
new file mode 100644
index 0000000000..b7d98e3078
--- /dev/null
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/toUnbook.spec.js
@@ -0,0 +1,32 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('invoiceIn toUnbook()', () => {
+ it('should check that invoiceIn is unbooked', async() => {
+ const userId = 1;
+ const ctx = {
+ req: {
+
+ accessToken: {userId: userId},
+ headers: {origin: 'http://localhost:5000'},
+ }
+ };
+ const invoiceInId = 1;
+ const tx = await models.InvoiceIn.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ await models.InvoiceIn.toBook(ctx, invoiceInId, options);
+ const bookEntry = await models.InvoiceIn.toUnbook(ctx, invoiceInId, options);
+ const invoiceIn = await models.InvoiceIn.findById(invoiceInId, null, options);
+
+ expect(bookEntry.accountingEntries).toEqual(4);
+ expect(bookEntry.isLinked).toBeFalsy();
+ expect(invoiceIn.isBooked).toEqual(false);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
diff --git a/modules/invoiceIn/back/methods/invoice-in/toBook.js b/modules/invoiceIn/back/methods/invoice-in/toBook.js
index 778742911f..c3be5f8fcf 100644
--- a/modules/invoiceIn/back/methods/invoice-in/toBook.js
+++ b/modules/invoiceIn/back/methods/invoice-in/toBook.js
@@ -32,7 +32,7 @@ module.exports = Self => {
}
try {
- await Self.rawSql(`CALL vn.invoiceIn_booking(?)`, [id], myOptions);
+ await Self.rawSql(`CALL vn.invoiceIn_booking(?, NULL)`, [id], myOptions);
if (tx) await tx.commit();
} catch (e) {
if (tx) await tx.rollback();
diff --git a/modules/invoiceIn/back/methods/invoice-in/toUnbook.js b/modules/invoiceIn/back/methods/invoice-in/toUnbook.js
new file mode 100644
index 0000000000..a697e9ddca
--- /dev/null
+++ b/modules/invoiceIn/back/methods/invoice-in/toUnbook.js
@@ -0,0 +1,80 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('toUnbook', {
+ description: 'To unbook the invoiceIn',
+ accessType: 'WRITE',
+ accepts: {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The invoiceIn id',
+ http: {source: 'path'}
+ },
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: '/:id/toUnbook',
+ verb: 'POST'
+ }
+ });
+
+ Self.toUnbook = async(ctx, invoiceInId, options) => {
+ let tx;
+ const models = Self.app.models;
+ const myOptions = {userId: ctx.req.accessToken.userId};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ try {
+ let isLinked;
+ let accountingEntries;
+
+ let bookEntry = await models.Xdiario.findOne({
+ fields: ['ASIEN'],
+ where: {
+ and: [
+ {key: invoiceInId},
+ {enlazado: false},
+ {enlazadoSage: false}
+ ]
+ }
+ }, myOptions);
+
+ let asien = bookEntry?.ASIEN;
+ if (asien) {
+ accountingEntries = await models.Xdiario.count({ASIEN: asien}, myOptions);
+
+ await models.Xdiario.destroyAll({ASIEN: asien}, myOptions);
+ await Self.updateAll({id: invoiceInId}, {isBooked: false}, myOptions);
+ } else {
+ const linkedBookEntry = await models.Xdiario.findOne({
+ fields: ['ASIEN'],
+ where: {
+ key: invoiceInId,
+ and: [{or: [{enlazado: true, enlazadoSage: true}]}]
+ }
+ }, myOptions);
+
+ asien = linkedBookEntry?.ASIEN;
+ isLinked = true;
+ }
+ if (tx) await tx.commit();
+
+ return {
+ isLinked,
+ bookEntry: asien,
+ accountingEntries
+ };
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+ };
+};
diff --git a/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js b/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js
new file mode 100644
index 0000000000..92a1ba8ee6
--- /dev/null
+++ b/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js
@@ -0,0 +1,104 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('updateInvoiceIn', {
+ description: 'To update the invoiceIn attributes',
+ accessType: 'WRITE',
+ accepts: [{
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The invoiceIn id',
+ http: {source: 'path'}
+ }, {
+ arg: 'supplierFk',
+ type: 'number',
+ required: true
+ }, {
+ arg: 'supplierRef',
+ type: 'any',
+ }, {
+ arg: 'issued',
+ type: 'any',
+ }, {
+ arg: 'operated',
+ type: 'any',
+ }, {
+ arg: 'deductibleExpenseFk',
+ type: 'any',
+ }, {
+ arg: 'dmsFk',
+ type: 'any',
+ }, {
+ arg: 'bookEntried',
+ type: 'any',
+ }, {
+ arg: 'booked',
+ type: 'any',
+ }, {
+ arg: 'currencyFk',
+ type: 'number',
+ required: true
+ }, {
+ arg: 'companyFk',
+ type: 'any',
+ }, {
+ arg: 'withholdingSageFk',
+ type: 'any',
+ },
+ ],
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: '/:id/updateInvoiceIn',
+ verb: 'PATCH'
+ }
+ });
+
+ Self.updateInvoiceIn = async(ctx,
+ id,
+ supplierFk,
+ supplierRef,
+ issued,
+ operated,
+ deductibleExpenseFk,
+ dmsFk,
+ bookEntried,
+ booked,
+ currencyFk,
+ companyFk,
+ withholdingSageFk,
+ options
+ ) => {
+ let tx;
+ const myOptions = {userId: ctx.req.accessToken.userId};
+
+ if (typeof options == 'object') Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ try {
+ const invoiceIn = await Self.findById(id, null, myOptions);
+ invoiceIn.updateAttributes({supplierFk,
+ supplierRef,
+ issued,
+ operated,
+ deductibleExpenseFk,
+ dmsFk,
+ bookEntried,
+ booked,
+ currencyFk,
+ companyFk,
+ withholdingSageFk
+ }, myOptions);
+ if (tx) await tx.commit();
+ return invoiceIn;
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+ };
+};
diff --git a/modules/invoiceIn/back/models/invoice-in.js b/modules/invoiceIn/back/models/invoice-in.js
index 31cdc1abe4..1e69c0ef8d 100644
--- a/modules/invoiceIn/back/models/invoice-in.js
+++ b/modules/invoiceIn/back/models/invoice-in.js
@@ -11,6 +11,8 @@ module.exports = Self => {
require('../methods/invoice-in/getSerial')(Self);
require('../methods/invoice-in/corrective')(Self);
require('../methods/invoice-in/exchangeRateUpdate')(Self);
+ require('../methods/invoice-in/toUnbook')(Self);
+ require('../methods/invoice-in/updateInvoiceIn')(Self);
Self.rewriteDbError(function(err) {
if (err.code === 'ER_ROW_IS_REFERENCED_2' && err.sqlMessage.includes('vehicleInvoiceIn'))
diff --git a/modules/invoiceIn/front/basic-data/index.html b/modules/invoiceIn/front/basic-data/index.html
index a22abbb330..fbb9b05a20 100644
--- a/modules/invoiceIn/front/basic-data/index.html
+++ b/modules/invoiceIn/front/basic-data/index.html
@@ -1,4 +1,4 @@
-
+
{
JOIN vn.item i ON i.id = b.itemFk
WHERE e.id = ? AND e.supplierFk = ?
GROUP BY i.id
- ) SELECT i.id, i.name, et.quantity, SUM(b.quantity) quantityTotal, et.printedStickers
+ ) SELECT i.id, i.name, et.quantity, SUM(b.quantity) quantityTotal, et.printedStickers, ic.url
FROM vn.buy b
JOIN vn.item i ON i.id = b.itemFk
JOIN vn.entry e ON e.id = b.entryFk
@@ -41,6 +41,7 @@ module.exports = Self => {
JOIN vn.buyConfig bc ON bc.monthsAgo
JOIN vn.travel t ON t.id = e.travelFk
LEFT JOIN entryTmp et ON et.id = i.id
+ JOIN hedera.imageConfig ic
WHERE e.supplierFk = ?
AND i.family IN ('EMB', 'CONT')
AND b.created > (util.VN_CURDATE() - INTERVAL bc.monthsAgo MONTH)
diff --git a/modules/worker/front/basic-data/index.html b/modules/worker/front/basic-data/index.html
index aa3f6ca79b..bece1b6fde 100644
--- a/modules/worker/front/basic-data/index.html
+++ b/modules/worker/front/basic-data/index.html
@@ -54,8 +54,8 @@