DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ledger_doCompensation`(
	vDated DATE, 
	vCompensationAccount VARCHAR(10), 
	vBankFk VARCHAR(10), 
	vConcept VARCHAR(255), 
	vAmount DECIMAL(10,2), 
	vCompanyFk INT, 
	vOriginalAccount VARCHAR(10)
)
BEGIN
/**
 * Compensa un pago o un recibo insertando en contabilidad
 *
 * @param vDated fecha en la cual se anota
 * @param vCompensationAccount cuenta contable contra la que se compensa
 * @param vBankFk banco de la compensacion
 * @param vConcept descripcion
 * @param vAmount cantidad que se compensa
 * @param vCompanyFk empresa
 * @param vOriginalAccount cuenta contable desde la cual se compensa 
 * 
 */ 
	DECLARE vNewBookEntry INT;
	DECLARE vIsClientCompensation INT;
	DECLARE vClientFk INT;
	DECLARE vSupplierFk INT;
	DECLARE vIsOriginalAClient BOOL;
	DECLARE vPayMethodCompensation INT;

	CALL ledger_nextTx(YEAR(vDated), vNewBookEntry);

	SELECT COUNT(id) INTO vIsOriginalAClient 
		FROM client 
		WHERE accountingAccount LIKE vOriginalAccount COLLATE utf8_general_ci;

	SELECT id, COUNT(id) INTO vClientFk, vIsClientCompensation 
		FROM client 
		WHERE accountingAccount LIKE vCompensationAccount COLLATE utf8_general_ci;

	SET @vAmount1:= 0.0;
	SET @vAmount2:= 0.0;

	INSERT INTO XDiario (ASIEN, FECHA, SUBCTA, CONTRA, CONCEPTO, EURODEBE, EUROHABER, empresa_id) 
		VALUES ( 	vNewBookEntry, 
					vDated, 
					vOriginalAccount, 
					vCompensationAccount, 
					vConcept, 
					@vAmount1:= IF(
						(vIsOriginalAClient AND vAmount > 0) OR 
						(NOT vIsOriginalAClient AND vAmount < 0), 
						0, 
						ABS(vAmount)
					),
					@vAmount2:= IF(@vAmount1,
						0,
						ABS(vAmount)
					),
					vCompanyFk
				),
				(	vNewBookEntry, 
					vDated, 
					vCompensationAccount, 
					vOriginalAccount, 
					vConcept, 
					@vAmount2,
					@vAmount1,
					vCompanyFk);

	IF vIsClientCompensation THEN
		IF vIsOriginalAClient THEN
			SET vAmount = -vAmount;
		END IF;
		
		INSERT INTO receipt
			SET invoiceFk = vConcept, 
				amountPaid = vAmount, 
				payed = vDated, 
				bankFk = vBankFk, 
				companyFk = vCompanyFk, 
				clientFk = vClientFk, 
				isConciliate = TRUE;
	ELSE
		IF NOT vIsOriginalAClient THEN
			SET vAmount = -vAmount;
		END IF;

		SELECT id INTO vSupplierFk 
			FROM supplier 
			WHERE `account` LIKE vCompensationAccount COLLATE utf8_general_ci;

		SELECT id INTO vPayMethodCompensation 
			FROM payMethod 
			WHERE `code` = 'compensation';

		INSERT INTO payment 
			SET received = vDated, 
				dueDated = vDated, 
				supplierFk = vSupplierFk,
				amount = vAmount,
				bankFk = vBankFk,
				payMethodFk = vPayMethodCompensation, 
				concept = vConcept,
				companyFk = vCompanyFk,
				isConciliated = TRUE;
	END IF;
END$$
DELIMITER ;