DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `sage`.`accountingMovements_add`( vYear INT, vCompanyFk INT ) BEGIN /** * Traslada la info de contabilidad generada en base a vn.XDiario a la tabla sage.movConta * para poder ejecutar posteriormente el proceso de importación de datos de SQL Server * Solo traladará los asientos marcados con el campo vn.XDiario.enlazadoSage = FALSE * @vYear Año contable del que se quiere trasladar la información * @vCompanyFk Empresa de la que se quiere trasladar datos */ DECLARE vDatedFrom DATETIME; DECLARE vDatedTo DATETIME; DECLARE vDuaTransactionFk INT; DECLARE vTaxImportFk INT; DECLARE vTaxImportReducedFk INT; DECLARE vTaxImportSuperReducedFk INT; DECLARE vTransactionExportFk INT; DECLARE vTransactionExportTaxFreeFk INT; DECLARE vSerialDua VARCHAR(1) DEFAULT 'D'; DECLARE vInvoiceTypeInformativeCode VARCHAR(1); DECLARE vCountryCanariasCode, vCountryCeutaMelillaCode VARCHAR(2) ; SELECT SiglaNacion INTO vCountryCanariasCode FROM Naciones WHERE Nacion ='ISLAS CANARIAS'; SELECT SiglaNacion INTO vCountryCeutaMelillaCode FROM Naciones WHERE Nacion ='CEUTA Y MELILLA'; SELECT pendingServiceTransactionTypeFk INTO vDuaTransactionFk FROM config; SELECT id INTO vTaxImportFk FROM taxType WHERE code = 'import21'; SELECT id INTO vTaxImportReducedFk FROM taxType WHERE code = 'import10'; SELECT id INTO vTaxImportSuperReducedFk FROM taxType WHERE code = 'import4'; SELECT definitiveExportTransactionTypeFk INTO vTransactionExportFk FROM config; SELECT shipmentTransactionTypeFk INTO vTransactionExportTaxFreeFk FROM config; SELECT codeSage INTO vInvoiceTypeInformativeCode FROM invoiceType WHERE code ='informative'; SELECT MAKEDATE(vYear, 1), MAKEDATE(vYear + 1, 1) - INTERVAL 1 DAY INTO vDatedFrom, vDatedTo; TRUNCATE movContaIVA; DELETE FROM movConta WHERE enlazadoSage = FALSE AND Asiento <> 1 ; CALL clientSupplier_add(vCompanyFk); CALL pgc_add(vCompanyFk); CALL invoiceOut_manager(vYear, vCompanyFk); CALL invoiceIn_manager(vYear, vCompanyFk); INSERT INTO movConta(TipoEntrada, Ejercicio, CodigoEmpresa, Asiento, CargoAbono, CodigoCuenta, Contrapartida, FechaAsiento, Comentario, ImporteAsiento, NumeroPeriodo, FechaGrabacion, CodigoDivisa, ImporteCambio, ImporteDivisa, FactorCambio, IdProcesoIME, TipoCarteraIME, TipoAnaliticaIME, StatusTraspasadoIME, TipoImportacionIME, Metalico347, BaseIva1, PorBaseCorrectora1, PorIva1, CuotaIva1, PorRecargoEquivalencia1, RecargoEquivalencia1, CodigoTransaccion1, BaseIva2, PorBaseCorrectora2, PorIva2, CuotaIva2, PorRecargoEquivalencia2, RecargoEquivalencia2, CodigoTransaccion2, BaseIva3, PorBaseCorrectora3, PorIva3, CuotaIva3, PorRecargoEquivalencia3, RecargoEquivalencia3, CodigoTransaccion3, BaseIva4, PorBaseCorrectora4, PorIva4, CuotaIva4, PorRecargoEquivalencia4, RecargoEquivalencia4, CodigoTransaccion4, Año, Serie, Factura, SuFacturaNo, FechaFactura, ImporteFactura, TipoFactura, CodigoCuentaFactura, CifDni, Nombre, CodigoRetencion, BaseRetencion, PorRetencion, ImporteRetencion, SiglaNacion, EjercicioFactura, FechaOperacion, Exclusion347, MantenerAsiento, ClaveOperacionFactura_, TipoRectificativa, FechaFacturaOriginal, BaseImponibleOriginal, CuotaIvaOriginal, ClaseAbonoRectificativas, RecargoEquivalenciaOriginal, LibreA1, CodigoIva1, CodigoIva2, CodigoIva3, CodigoIva4, IvaDeducible1, IvaDeducible2, IvaDeducible3, IvaDeducible4, Intracomunitaria ) SELECT 'EN' TipoEntrada, YEAR(x.FECHA) Ejercicio, company_getCode(vCompanyFk) AS CodigoEmpresa, x.ASIEN Asiento, IF(EURODEBE <> 0 OR (EURODEBE = 0 AND EUROHABER IS NULL), 'D', 'H') CargoAbono, x.SUBCTA CodigoCuenta, x.CONTRA Contrapartida, x.FECHA FechaAsiento, x.CONCEPTO Comentario, IF(x.EURODEBE, x.EURODEBE, x.EUROHABER) ImporteAsiento, MONTH(x.FECHA) NumeroPeriodo, IF(sub2.FECREGCON IS NULL, sub2.FECHA_EX, sub2.FECREGCON) FechaGrabacion, IF(x.CAMBIO, IFNULL(mci.CodigoDivisa, sub3.code), '') CodigoDivisa, x.CAMBIO ImporteCambio, IFNULL(x.DEBEME, x.HABERME) ImporteDivisa, IF(x.CAMBIO, TRUE, FALSE) FactorCambio, NULL IdProcesoIME, 0 TipoCarteraIME, 0 TipoAnaliticaIME, 0 StatusTraspasadoIME, 0 TipoImportacionIME, x.METAL Metalico347, mci.BaseIva1, mci.PorBaseCorrectora1, mci.PorIva1, mci.CuotaIva1, mci.PorRecargoEquivalencia1, mci.RecargoEquivalencia1, mci.CodigoTransaccion1, mci.BaseIva2, mci.PorBaseCorrectora2, mci.PorIva2, mci.CuotaIva2, mci.PorRecargoEquivalencia2, mci.RecargoEquivalencia2, mci.CodigoTransaccion2, mci.BaseIva3, mci.PorBaseCorrectora3, mci.PorIva3, mci.CuotaIva3, mci.PorRecargoEquivalencia3, mci.RecargoEquivalencia3, mci.CodigoTransaccion3, mci.BaseIva4, mci.PorBaseCorrectora4, mci.PorIva4, mci.CuotaIva4, mci.PorRecargoEquivalencia4, mci.RecargoEquivalencia4, mci.CodigoTransaccion4, mci.Año, mci.Serie, mci.Factura, mci.SuFacturaNo, mci.FechaFactura, mci.ImporteFactura, mci.TipoFactura, mci.CodigoCuentaFactura, mci.CifDni, mci.Nombre, mci.CodigoRetencion, mci.BaseRetencion, mci.PorRetencion, mci.ImporteRetencion, mci.SiglaNacion, mci.EjercicioFactura, mci.FechaOperacion, mci.Exclusion347, TRUE, mci.ClaveOperacionFactura, mci.TipoRectificativa, mci.FechaFacturaOriginal, mci.BaseImponibleOriginal, mci.CuotaIvaOriginal, mci.ClaseAbonoRectificativas, mci.RecargoEquivalenciaOriginal, mci.LibreA1, mci.CodigoIva1, mci.CodigoIva2, mci.CodigoIva3, mci.CodigoIva4, mci.IvaDeducible1, mci.IvaDeducible2, mci.IvaDeducible3, mci.IvaDeducible4, mci.Intracomunitaria FROM vn.XDiario x LEFT JOIN movContaIVA mci ON mci.id = x.id LEFT JOIN (SELECT * FROM (SELECT DISTINCT ASIEN, FECREGCON, FECHA_EX FROM vn.XDiario WHERE enlazadoSage = FALSE ORDER BY ASIEN, FECREGCON DESC, FECHA_EX DESC LIMIT 10000000000000000000 ) sub GROUP BY ASIEN )sub2 ON sub2.ASIEN = x.ASIEN LEFT JOIN ( SELECT DISTINCT(account),cu.code FROM vn.bank b JOIN vn.currency cu ON cu.id = b.currencyFk WHERE cu.code <> 'EUR' -- no se informa cuando la divisa en EUR )sub3 ON sub3.account = x.SUBCTA WHERE x.enlazadoSage = FALSE AND x.empresa_id = vCompanyFk AND x.FECHA BETWEEN vDatedFrom AND vDatedTo; -- Metálicos UPDATE movConta m JOIN (SELECT Asiento, c.socialName name, c.fi, n.SiglaNacion, m.CodigoCuenta, m.Contrapartida FROM movConta m LEFT JOIN vn.client c ON c.id = IF(m.CargoAbono = 'H', CAST(SUBSTRING(m.CodigoCuenta, 3, LENGTH(m.CodigoCuenta)) AS UNSIGNED), CAST(SUBSTRING(m.Contrapartida, 3, LENGTH(m.Contrapartida)) AS UNSIGNED)) LEFT JOIN Naciones n ON n.countryFk = c.countryFk WHERE m.Metalico347 = TRUE AND m.enlazadoSage = FALSE )sub ON m.Asiento = sub.Asiento SET m.Metalico347 = TRUE, m.TipoFactura = vInvoiceTypeInformativeCode, m.CifDni = sub.fi, m.Nombre = sub.name, m.SiglaNacion = sub.SiglaNacion WHERE m.enlazadoSage = FALSE; UPDATE movConta m SET m.Metalico347 = FALSE, m.TipoFactura = '' WHERE m.CargoAbono = 'D' AND m.enlazadoSage = FALSE; -- Elimina cuentas de cliente/proveedor que no se utilizarán en la importación DELETE cp FROM clientesProveedores cp LEFT JOIN movConta mc ON mc.codigoCuenta = cp.codigoCuenta AND mc.enlazadoSage = FALSE WHERE mc.codigoCuenta IS NULL; -- Elimina cuentas contables que no se utilizarán en la importación DELETE pc FROM planCuentasPGC pc LEFT JOIN movConta mc ON mc.codigoCuenta = pc.codigoCuenta AND mc.enlazadoSage = FALSE WHERE mc.codigoCuenta IS NULL; -- DUAS UPDATE movConta mci JOIN vn.XDiario x ON x.ASIEN = mci.Asiento JOIN TiposIva ti ON ti.PorcentajeIva = x.IVA JOIN taxType tt ON tt.id = ti.CodigoIva JOIN vn.pgcMaster pm ON pm.code = mci.CodigoCuenta COLLATE utf8mb3_unicode_ci SET mci.BaseIva1 = x.BASEEURO, mci.PorIva1 = x.IVA, mci.CuotaIva1 = CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2)), mci.CodigoTransaccion1 = vDuaTransactionFk, mci.CodigoIva1 = vTaxImportReducedFk, mci.IvaDeducible1 = TRUE, mci.FechaFacturaOriginal = x.FECHA_EX, mci.SuFacturaNo = x.FACTURAEX, mci.FechaOperacion = x.FECHA_OP, mci.ImporteFactura = mci.ImporteFactura + x.BASEEURO + CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2)) WHERE pm.description = 'HP Iva pendiente' AND mci.enlazadoSage = FALSE AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci AND tt.code = 'national10'; UPDATE movConta mci JOIN vn.XDiario x ON x.ASIEN = mci.Asiento JOIN TiposIva ti ON ti.PorcentajeIva = x.IVA JOIN taxType tt ON tt.id = ti.CodigoIva JOIN vn.pgcMaster pm ON pm.code = mci.CodigoCuenta COLLATE utf8mb3_unicode_ci SET mci.BaseIva2 = x.BASEEURO , mci.PorIva2 = x.IVA, mci.CuotaIva2 = CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10,2)), mci.CodigoTransaccion2 = vDuaTransactionFk , mci.CodigoIva2 = vTaxImportFk, mci.IvaDeducible2 = TRUE, mci.ImporteFactura = mci.ImporteFactura + x.BASEEURO + CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2)) WHERE pm.description = 'HP Iva pendiente' AND mci.enlazadoSage = FALSE AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci AND tt.code = 'national21'; UPDATE movConta mci JOIN vn.XDiario x ON x.ASIEN = mci.Asiento JOIN TiposIva ti ON ti.PorcentajeIva = x.IVA JOIN taxType tt ON tt.id = ti.CodigoIva JOIN vn.pgcMaster pm ON pm.code = mci.CodigoCuenta COLLATE utf8mb3_unicode_ci SET mci.BaseIva3 = x.BASEEURO , mci.PorIva3 = x.IVA, mci.CuotaIva3 = CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10,2)), mci.CodigoTransaccion3 = vDuaTransactionFk , mci.CodigoIva3 = vTaxImportSuperReducedFk, mci.IvaDeducible3 = TRUE, mci.ImporteFactura = mci.ImporteFactura + x.BASEEURO + CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2)) WHERE pm.description = 'HP Iva pendiente' AND mci.enlazadoSage = FALSE AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci AND tt.code = 'national4'; -- Rectificativas UPDATE movConta mci JOIN (SELECT x.ASIEN, x.FECHA_RT, x.SERIE_RT, x.FACTU_RT FROM movConta mci JOIN vn.XDiario x ON x.ASIEN = mci.Asiento WHERE mci.TipoRectificativa > 0 AND mci.enlazadoSage = FALSE AND x.FACTU_RT IS NOT NULL GROUP BY x.ASIEN ) sub ON sub.ASIEN = mci.Asiento SET mci.EjercicioFacturaOriginal = YEAR(sub.FECHA_RT), mci.SerieFacturaOriginal = sub.SERIE_RT, mci.NumeroFacturaOriginal = sub.FACTU_RT WHERE mci.TipoRectificativa > 0 AND mci.enlazadoSage = FALSE ; -- Exportaciones Andorras y Canarias cambia TT (la cuenta es compartida) UPDATE movConta mci SET CodigoTransaccion1 = vTransactionExportTaxFreeFk, CodigoTransaccion2 = IF(CodigoTransaccion2 = 0, 0, vTransactionExportTaxFreeFk), CodigoTransaccion3 = IF(CodigoTransaccion3 = 0, 0, vTransactionExportTaxFreeFk), CodigoTransaccion4 = IF(CodigoTransaccion4 = 0, 0, vTransactionExportTaxFreeFk) WHERE enlazadoSage = FALSE AND (CodigoTransaccion1 = vTransactionExportFk OR CodigoTransaccion2 = vTransactionExportFk OR CodigoTransaccion3 = vTransactionExportFk OR CodigoTransaccion4 = vTransactionExportFk) AND SiglaNacion IN (vCountryCanariasCode COLLATE utf8mb3_unicode_ci, vCountryCeutaMelillaCode COLLATE utf8mb3_unicode_ci); UPDATE movConta mc SET CodigoDivisa = 'USD', FactorCambio = TRUE, ImporteCambio = ABS( CAST( IF( ImporteDivisa <> 0 AND ImporteCambio = 0, ImporteAsiento / ImporteDivisa, ImporteCambio) AS DECIMAL( 10, 2))) WHERE enlazadoSage = FALSE AND (ImporteCambio <> 0 OR ImporteDivisa <> 0 OR FactorCambio); UPDATE movConta mc SET importeDivisa= -importeDivisa WHERE enlazadoSage = FALSE AND importeDivisa > 0 AND ImporteAsiento < 0; END$$ DELIMITER ;