DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `sage`.`invoiceIn_manager`(vYear INT, vCompanyFk INT)
BEGIN
/**
 * Traslada la info de contabilidad relacionada con las facturas recibidas 
 * 
 * @vYear Año contable del que se quiere trasladar la información
 * @vCompany Empresa de la que se quiere trasladar datos 
 */
	DECLARE vDone BOOL DEFAULT FALSE;
	DECLARE vInvoiceFk INT;
	DECLARE vXDiarioFk INT;
	DECLARE vDatedFrom DATETIME;
	DECLARE vDatedTo DATETIME;
	DECLARE vSerialDua VARCHAR(1) DEFAULT 'D';
	DECLARE vAccountVNL VARCHAR(10);
	DECLARE vAccountTaxOutstanding VARCHAR(10);
	DECLARE vInvoiceTypeSended VARCHAR(1);
	DECLARE vCursor CURSOR FOR
		SELECT IFNULL(x.CLAVE, x.FACTURA) invoiceInFk, 
				x.id XDiarioFk
			FROM vn.XDiario x 
				JOIN(SELECT DISTINCT(x.ASIEN)
						FROM vn.XDiario x
							LEFT JOIN vn.invoiceIn ii ON x.CLAVE = ii.id
							LEFT JOIN vn.invoiceInTax it ON it.invoiceInFk = ii.id
						WHERE(it.taxTypeSageFk IS NOT NULL OR x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci) 
							AND	x.enlazadoSage = FALSE 
							AND x.FECHA BETWEEN vDatedFrom AND vDatedTo
							AND x.empresa_id = vCompanyFk 
					) sub ON sub.ASIEN = x.ASIEN
			WHERE x.CLAVE IS NOT NULL;

	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
	
	SELECT CAST(CONCAT(vYear, '-01-01') AS DATETIME), util.dayEnd(CAST(CONCAT(vYear, '-12-31') AS DATE))
		INTO vDatedFrom, vDatedTo;

	SELECT accountingAccount INTO vAccountVNL
		FROM vn.`client`
		WHERE name='VNL';

	SELECT code INTO vAccountTaxOutstanding
		FROM vn.pgcMaster
		WHERE description = 'HP Iva pendiente';

	SELECT codeSage INTO vInvoiceTypeSended
		FROM invoiceType WHERE `code` ='sended';
			
	DROP TEMPORARY TABLE IF EXISTS tmp.invoiceDua;
	CREATE TEMPORARY TABLE tmp.invoiceDua
		SELECT x.id 
			FROM vn.XDiario x
				JOIN vn.company c ON c.id = x.empresa_id
				JOIN (SELECT ASIEN
						FROM vn.XDiario x 
						WHERE x.enlazadoSage = FALSE 
							AND x.SUBCTA = vAccountTaxOutstanding COLLATE utf8mb3_unicode_ci
							AND	x.FECHA BETWEEN vDatedFrom AND vDatedTo
					)sub ON sub.ASIEN = x.ASIEN
			WHERE NOT x.CONTRA <=> vAccountVNL;

	DROP TEMPORARY TABLE IF EXISTS tmp.invoiceIn;
	CREATE TEMPORARY TABLE tmp.invoiceIn
		SELECT i.id,
				i.supplierRef,
				i.serial COLLATE utf8mb3_unicode_ci serial,
				i.supplierFk,
				i.issued,
				IF(expenseFkDeductible, FALSE, i.isVatDeductible) isVatDeductible,
				IF(c.code = 'EUR', '',c.`code`) currencyFk
			FROM vn.invoiceIn i
				JOIN vn.currency c ON c.id = i.currencyFk
			WHERE i.bookEntried  BETWEEN vDatedFrom AND vDatedTo
		UNION ALL 
		SELECT d.id,
				d.code,
				vSerialDua COLLATE utf8mb3_unicode_ci,
				d.companyFk ,
				d.issued,
				FALSE,
				'' -- EUROS
			FROM vn.dua d 
			WHERE d.issued IS NOT NULL 
				AND code IS NOT NULL;

	OPEN vCursor;

	l: LOOP
		FETCH vCursor INTO vInvoiceFk, vXDiarioFk;

		IF vDone THEN 
			LEAVE l;
		END IF;
		CALL invoiceIn_add(vInvoiceFk, vXDiarioFk);
	END LOOP;

	CLOSE vCursor;

	DROP TEMPORARY TABLE tmp.invoiceDua;
	DROP TEMPORARY TABLE tmp.invoiceIn;

	-- ASIENTOS CON IVA SOPORTADO 472. y 477. hay que informar 2 líneas la info de facturas una como tipo de factura emitida y otra como recibida
	DROP TEMPORARY TABLE IF EXISTS tmp.movContaIVA;
	CREATE TEMPORARY TABLE tmp.movContaIVA
		SELECT sub3.id,
			mci.CodigoDivisa,
			mci.BaseIva1,
			mci.PorBaseCorrectora1,
			mci.PorIva1,
			mci.CuotaIva1,
			mci.PorRecargoEquivalencia1,
			mci.RecargoEquivalencia1,
			mci.CodigoTransaccion1,
			mci.CodigoIva1,
			mci.BaseIva2,
			mci.PorBaseCorrectora2,
			mci.PorIva2,
			mci.CuotaIva2,
			mci.PorRecargoEquivalencia2,
			mci.RecargoEquivalencia2,
			mci.CodigoTransaccion2,
			mci.CodigoIva2,
			mci.BaseIva3,
			mci.PorBaseCorrectora3,
			mci.PorIva3,
			mci.CuotaIva3,
			mci.PorRecargoEquivalencia3,
			mci.RecargoEquivalencia3,
			mci.CodigoTransaccion3,
			mci.CodigoIva3,
			mci.BaseIva4,
			mci.PorBaseCorrectora4,
			mci.PorIva4,
			mci.CuotaIva4,
			mci.PorRecargoEquivalencia4,
			mci.RecargoEquivalencia4,
			mci.CodigoTransaccion4,
			mci.CodigoIva4,
			mci.Año,
			mci.Serie,
			mci.Factura,
			mci.SuFacturaNo,
			mci.FechaFactura,
			mci.ImporteFactura,
			vInvoiceTypeSended,
			mci.CodigoCuentaFactura,
			mci.CifDni,
			mci.Nombre,
			mci.CodigoRetencion,
			mci.BaseRetencion,
			mci.PorRetencion,
			mci.ImporteRetencion,
			mci.SiglaNacion,
			mci.EjercicioFactura,
			x.FECHA,
			mci.Exclusion347,
			mci.MantenerAsiento,
			mci.Metalico347,
			mci.ClaveOperacionFactura,
			mci.TipoRectificativa,
			mci.FechaFacturaOriginal,
			mci.CuotaIvaOriginal,
			mci.BaseImponibleOriginal,
			mci.ClaseAbonoRectificativas,
			mci.RecargoEquivalenciaOriginal,
			mci.LibreA1,
			mci.IvaDeducible1,
			mci.IvaDeducible2,
			mci.IvaDeducible3,
			mci.IvaDeducible4,
			mci.FechaGrabacion,
			mci.Intracomunitaria,
			mci.moveData
		FROM movContaIVA mci
			JOIN vn.XDiario x ON x.id = mci.id
			JOIN (SELECT x.ASIEN, x.id
					FROM vn.XDiario x
						JOIN(SELECT DISTINCT(x.ASIEN) ASIEN
								FROM vn.XDiario x 
									JOIN (SELECT DISTINCT(ASIEN)
											FROM vn.XDiario x
											WHERE SUBCTA LIKE '472%' 
												AND	x.enlazadoSage = FALSE
												AND x.empresa_id = vCompanyFk
												AND	x.FECHA BETWEEN vDatedFrom AND vDatedTo
										) sub ON sub.ASIEN = x.ASIEN
								WHERE x.SUBCTA LIKE '477%'
							)sub2 ON sub2.ASIEN = x.ASIEN
					WHERE x.CONTRA IS NOT NULL 
						AND x.SUBCTA LIKE '477%'
					GROUP BY x.ASIEN
				 )sub3 ON sub3.ASIEN = x.ASIEN;
	 
	 INSERT INTO movContaIVA
			(`id`,
			`CodigoDivisa`,
			`BaseIva1`,
			`PorBaseCorrectora1`,
			`PorIva1`,
			`CuotaIva1`,
			`PorRecargoEquivalencia1`,
			`RecargoEquivalencia1`,
			`CodigoTransaccion1`,
			`CodigoIva1`,
			`BaseIva2`,
			`PorBaseCorrectora2`,
			`PorIva2`,
			`CuotaIva2`,
			`PorRecargoEquivalencia2`,
			`RecargoEquivalencia2`,
			`CodigoTransaccion2`,
			`CodigoIva2`,
			`BaseIva3`,
			`PorBaseCorrectora3`,
			`PorIva3`,
			`CuotaIva3`,
			`PorRecargoEquivalencia3`,
			`RecargoEquivalencia3`,
			`CodigoTransaccion3`,
			`CodigoIva3`,
			`BaseIva4`,
			`PorBaseCorrectora4`,
			`PorIva4`,
			`CuotaIva4`,
			`PorRecargoEquivalencia4`,
			`RecargoEquivalencia4`,
			`CodigoTransaccion4`,
			`CodigoIva4`,
			`Año`,
			`Serie`,
			`Factura`,
			`SuFacturaNo`,
			`FechaFactura`,
			`ImporteFactura`,
			`TipoFactura`,
			`CodigoCuentaFactura`,
			`CifDni`,
			`Nombre`,
			`CodigoRetencion`,
			`BaseRetencion`,
			`PorRetencion`,
			`ImporteRetencion`,
			`SiglaNacion`,
			`EjercicioFactura`,
			`FechaOperacion`,
			`Exclusion347`,
			`MantenerAsiento`,
			`Metalico347`,
			`ClaveOperacionFactura`,
			`TipoRectificativa`,
			`FechaFacturaOriginal`,
			`CuotaIvaOriginal`,
			`BaseImponibleOriginal`,
			`ClaseAbonoRectificativas`,
			`RecargoEquivalenciaOriginal`,
			`LibreA1`,
			`IvaDeducible1`,
			`IvaDeducible2`,
			`IvaDeducible3`,
			`IvaDeducible4`,
			`FechaGrabacion`,
			`Intracomunitaria`,
			`moveData`)
		SELECT * 
			FROM tmp.movContaIVA;
			
	DROP TEMPORARY TABLE tmp.movContaIVA;

END$$
DELIMITER ;