From 261b9686a05525128935ffec6aeff9dcc9c60e99 Mon Sep 17 00:00:00 2001 From: Bernat Date: Wed, 4 Dec 2019 11:10:24 +0100 Subject: [PATCH] update procedures db --- .../10120-december/00-tpvTransaction.sql | 120 ++++++++++++++++++ .../10120-december/00-tpvTransaction_undo.sql | 87 +++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 db/changes/10120-december/00-tpvTransaction.sql create mode 100644 db/changes/10120-december/00-tpvTransaction_undo.sql diff --git a/db/changes/10120-december/00-tpvTransaction.sql b/db/changes/10120-december/00-tpvTransaction.sql new file mode 100644 index 0000000000..10ec8082cb --- /dev/null +++ b/db/changes/10120-december/00-tpvTransaction.sql @@ -0,0 +1,120 @@ + +DROP procedure IF EXISTS `hedera`.`tpvTransaction_confirm`; + +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`tpvTransaction_confirm`( + vAmount INT + ,vOrder INT + ,vMerchant INT + ,vCurrency INT + ,vResponse INT + ,vErrorCode VARCHAR(10) +) +BEGIN +/** + * Confirma una transacción previamente iniciada, reescribiendo + * sus datos por los confirmados por el banco (solo si estos difieren). + * Genera el recibo y su correspondiente entrada en caja. + * + * @param vAmount Cantidad confirmada + * @param vOrder Identificador de transacción + * @param vMerchant Identificador de comercio + * @param vCurrency Identificador de moneda + * @param vResponse Identificador de respuesta del banco + * @param vErrorCode Código de error del banco, si lo hubiera + */ + DECLARE vReceipt INT; + DECLARE vStatus VARCHAR(10); + DECLARE vCustomer INT; + DECLARE vBank INT; + DECLARE vCompany INT; + DECLARE vEmployee INT; + DECLARE vIsDuplicated BOOLEAN; + DECLARE vDate DATE; + DECLARE vConcept VARCHAR(25) DEFAULT 'Cobro Web'; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; + + SELECT COUNT(*) > 0 INTO vIsDuplicated + FROM tpvTransaction + WHERE id = vOrder AND response IS NOT NULL + FOR UPDATE; + + IF vIsDuplicated + THEN + CALL util.throw ('TRANSACTION_DUPLICATED'); + END IF; + + IF vResponse BETWEEN 0 AND 99 + THEN + SELECT + t.clientFk + ,m.bankFk + ,m.companyFk + ,c.employeeFk + ,DATE(t.created) + INTO + vCustomer + ,vBank + ,vCompany + ,vEmployee + ,vDate + FROM tpvMerchant m + JOIN tpvConfig c + LEFT JOIN tpvTransaction t ON t.id = vOrder + WHERE m.id = vMerchant; + + INSERT INTO vn.receipt + SET + amountPaid = vAmount / 100 + ,payed = vDate + ,workerFk = vEmployee + ,bankFk = vBank + ,clientFk = vCustomer + ,companyFk = vCompany + ,invoiceFk = vConcept + ,isConciliate = TRUE; + + SET vReceipt = LAST_INSERT_ID(); + SET vStatus = 'ok'; + + -- Código redundante + + DO vn.till_new + ( + vCustomer + ,vBank + ,vAmount / 100 + ,vConcept + ,vDate + ,'A' + ,TRUE + ,vCustomer + ,vCompany + ,vEmployee + ); + ELSE + SET vReceipt = NULL; + SET vStatus = 'ko'; + END IF; + + UPDATE tpvTransaction + SET + merchantFk = vMerchant + ,receiptFk = vReceipt + ,amount = vAmount + ,response = vResponse + ,errorCode = vErrorCode + ,status = vStatus + WHERE id = vOrder; + COMMIT; +END$$ + +DELIMITER ; + diff --git a/db/changes/10120-december/00-tpvTransaction_undo.sql b/db/changes/10120-december/00-tpvTransaction_undo.sql new file mode 100644 index 0000000000..1e81b1d5ea --- /dev/null +++ b/db/changes/10120-december/00-tpvTransaction_undo.sql @@ -0,0 +1,87 @@ +USE `hedera`; +DROP procedure IF EXISTS `tpvTransaction_undo`; + +DELIMITER $$ +USE `hedera`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `tpvTransaction_undo`(vSelf INT) +BEGIN + DECLARE vCustomer INT; + DECLARE vAmount DOUBLE; + DECLARE vReceipt INT; + DECLARE vDate DATE; + DECLARE vBank INT; + DECLARE vAccount VARCHAR(12); + DECLARE vSubaccount VARCHAR(12); + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; + + SELECT + t.clientFk + ,t.amount / 100 + ,t.receiptFk + ,DATE(t.created) + ,m.bankFk + INTO + vCustomer + ,vAmount + ,vReceipt + ,vDate + ,vBank + FROM tpvTransaction t + JOIN tpvMerchant m ON m.id = t.merchantFk + JOIN tpvConfig c + WHERE t.id = vSelf + FOR UPDATE; + + -- Elimina el recibo + + DELETE FROM vn.receipt + WHERE id = vReceipt LIMIT 1; + + -- Elimina la entrada de cajas + + DELETE FROM vn.till + WHERE bankFk = vBank + AND DATE(dated) = vDate + AND `in` = vAmount + LIMIT 1; + + -- Elimina los asientos contables + + SELECT accountingAccount INTO vSubaccount + FROM vn.`client` WHERE id = vCustomer; + + SELECT account INTO vAccount + FROM vn.bank WHERE id = vBank; + + DELETE FROM vn.XDiario + WHERE SUBCTA = vSubaccount + AND CONTRA = vAccount + AND DATE(FECHA) = vDate + AND EUROHABER = vAmount + LIMIT 1; + + DELETE FROM vn.XDiario + WHERE CONTRA = vSubaccount + AND SUBCTA = vAccount + AND DATE(FECHA) = vDate + AND EURODEBE = vAmount + LIMIT 1; + + -- Actualiza la transaccion + + UPDATE tpvTransaction + SET response = NULL, status = 'started' + WHERE id = vSelf; + + COMMIT; +END$$ + +DELIMITER ; +