DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`xdiario_new`(
	vBookNumber INT,
	vDated DATE,
	vSubaccount VARCHAR(12),
	vAccount VARCHAR(12),
	vConcept VARCHAR(25),
	vDebit DOUBLE,
	vCredit DOUBLE,
	vEuro DOUBLE,
	vSerie CHAR(1),
	vInvoice VARCHAR(8),
	vVat DOUBLE,
	vRe DOUBLE,
	vAux TINYINT,
	vCompanyFk INT,
	OUT vNewBookNumber INT
)
/**
 * Este procedimiento se encarga de la inserción de registros en la tabla XDiario.
 * Si el número de asiento (vBookNumber) no está definido, se genera uno nuevo utilizando
 * vn.ledger_next.
 *
 * @param vBookNumber Número de asiento. Si es NULL, se generará uno nuevo.
 * @param vDated Fecha utilizada para generar un nuevo número de libro si vBookNumber es NULL.
 * @param vSubaccount Subcuenta para la transacción.
 * @param vAccount Cuenta para la transacción.
 * @param vConcept Concepto de la transacción.
 * @param vDebit Monto del débito para la transacción.
 * @param vCredit Monto del crédito para la transacción.
 * @param vEuro Monto en euros para la transacción.
 * @param vSerie Serie para la transacción.
 * @param vInvoice Número de factura para la transacción.
 * @param vVat Monto del IVA para la transacción.
 * @param vRe Monto del RE para la transacción.
 * @param vAux Variable auxiliar para la transacción.
 * @param vCompanyFk Clave foránea de la compañía para la transacción.
 * @return No retorna un valor, pero realiza una inserción en la tabla XDiario.
 */
BEGIN
	IF vBookNumber IS NULL THEN
		CALL ledger_next(YEAR(vDated), FALSE, vBookNumber);
	END IF;

	INSERT INTO XDiario
		SET ASIEN = vBookNumber,
			FECHA = vDated,
			SUBCTA = vSubaccount,
			CONTRA = vAccount,
			CONCEPTO = vConcept,
			EURODEBE = vDebit,
			EUROHABER = vCredit,
			BASEEURO = vEuro,
			SERIE = vSerie,
			FACTURA = vInvoice,
			IVA = vVat,
			RECEQUIV = vRe,
			AUXILIAR = IF(vAux = FALSE, NULL, '*'),
			MONEDAUSO = 2,
			empresa_id = vCompanyFk;

	SET vNewBookNumber = vBookNumber;
END$$
DELIMITER ;