salix/db/routines/vn/procedures/duaInvoiceInBooking.sql

112 lines
2.8 KiB
MySQL
Raw Normal View History

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`duaInvoiceInBooking`(
vDuaFk INT
)
BEGIN
2024-02-15 09:04:15 +00:00
/**
2024-06-10 06:48:56 +00:00
* Genera el asiento de un DUA y marca las entradas como confirmadas
*
* @param vDuaFk Id del dua a recalcular
*/
2024-05-28 10:30:17 +00:00
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vInvoiceFk INT;
2024-05-28 10:30:17 +00:00
DECLARE vBookEntry INT;
DECLARE vFiscalYear INT;
2024-07-24 12:24:06 +00:00
DECLARE vIncorrectInvoiceInDueDay INT;
2024-02-15 09:04:15 +00:00
2024-05-28 10:30:17 +00:00
DECLARE vInvoicesIn CURSOR FOR
2024-02-15 09:04:15 +00:00
SELECT DISTINCT e.invoiceInFk
FROM entry e
JOIN duaEntry de ON de.entryFk = e.id
2024-02-15 09:04:15 +00:00
JOIN invoiceIn ii ON ii.id = e.invoiceInFk
WHERE de.duaFk = vDuaFk
AND de.customsValue
AND ii.isBooked = FALSE;
2024-05-28 10:30:17 +00:00
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
2024-07-24 12:24:06 +00:00
SELECT GROUP_CONCAT(ii.id) INTO vIncorrectInvoiceInDueDay
FROM invoiceInDueDay iidd
JOIN invoiceIn ii ON iidd.invoiceInFk = ii.id
JOIN `entry` e ON e.invoiceInFk = ii.id
JOIN duaEntry de ON de.entryFk = e.id
JOIN invoiceInConfig iic
WHERE de.duaFk = vDuaFk
2024-08-06 10:43:51 +00:00
AND iidd.dueDated < util.VN_CURDATE() + INTERVAL iic.dueDateMarginDays DAY;
2024-07-24 12:24:06 +00:00
IF vIncorrectInvoiceInDueDay THEN
CALL util.throw(CONCAT('Incorrect due date, invoice: ', vIncorrectInvoiceInDueDay));
END IF;
2024-06-12 12:26:26 +00:00
UPDATE 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
SET ii.booked = IFNULL(ii.booked, d.booked),
ii.operated = IFNULL(ii.operated, d.operated),
ii.issued = IFNULL(ii.issued, d.issued),
ii.bookEntried = IFNULL(ii.bookEntried, d.bookEntried)
WHERE d.id = vDuaFk;
2024-05-28 10:30:17 +00:00
SELECT ASIEN INTO vBookEntry FROM dua WHERE id = vDuaFk;
2024-06-25 11:14:44 +00:00
IF vBookEntry IS NULL THEN
2024-05-28 10:30:17 +00:00
SELECT YEAR(IFNULL(ii.bookEntried, d.bookEntried)) INTO vFiscalYear
FROM invoiceIn ii
JOIN `entry` e ON e.invoiceInFk = ii.id
2024-05-28 10:30:17 +00:00
JOIN duaEntry de ON de.entryFk = e.id
JOIN dua d ON d.id = de.duaFk
2024-05-28 12:50:58 +00:00
WHERE d.id = vDuaFk
LIMIT 1;
CALL ledger_nextTx(vFiscalYear, vBookEntry);
2024-06-25 11:14:44 +00:00
END IF;
2024-05-28 10:30:17 +00:00
OPEN vInvoicesIn;
2024-06-10 06:48:56 +00:00
l: LOOP
2024-05-28 10:30:17 +00:00
SET vDone = FALSE;
FETCH vInvoicesIn INTO vInvoiceFk;
2024-05-28 10:30:17 +00:00
IF vDone THEN
LEAVE l;
END IF;
2024-05-28 10:30:17 +00:00
CALL invoiceIn_booking(vInvoiceFk, vBookEntry);
END LOOP;
2024-02-15 09:04:15 +00:00
2024-05-28 10:30:17 +00:00
CLOSE vInvoicesIn;
2024-02-15 09:04:15 +00:00
UPDATE dua
2024-05-28 12:50:58 +00:00
SET ASIEN = vBookEntry
2024-02-15 09:04:15 +00:00
WHERE id = vDuaFk;
UPDATE invoiceIn ii
JOIN duaInvoiceIn dii ON dii.invoiceInFk = ii.id
SET ii.isBooked = TRUE
WHERE dii.duaFk = vDuaFk;
UPDATE `entry` e
JOIN (
WITH entries AS (
SELECT e.id, de.duaFk
2024-06-25 11:14:44 +00:00
FROM vn.`entry` e
JOIN vn.duaEntry de ON de.entryFk = e.id
WHERE de.duaFk = vDuaFk
AND (NOT e.isBooked OR NOT e.isConfirmed)
),
notBookedEntries AS (
2024-07-09 09:03:17 +00:00
SELECT entryFk
2024-06-25 11:14:44 +00:00
FROM vn.duaEntry
2024-06-12 12:26:26 +00:00
WHERE duaFk = vDuaFk
AND NOT customsValue
)
SELECT e.id
FROM entries e
2024-06-12 12:26:26 +00:00
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$$
DELIMITER ;