
DROP procedure IF EXISTS `hedera`.`tpvTransaction_undo`;

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`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 ;

