Esempio n. 1
0
        /// <summary>
        /// Devuelve el cuerpo de una operación sujeta.
        /// </summary>
        /// <param name = "skipErrors" > Indica si hay que omitir las excepciones.</param>
        /// <returns>Operación sujeta correspondiente a la factura.</returns>
        internal DesgloseIVA GetDesgloseIVA(bool skipErrors = false)
        {
            DesgloseIVA desgloseIVA = new DesgloseIVA();

            if (TaxesOutputs.Count > 0)
            {
                foreach (KeyValuePair <decimal, decimal[]> taxOut in TaxesOutputs)
                {
                    DetalleIVA detalleIVA = new DetalleIVA()
                    {
                        TipoImpositivo = (taxOut.Value[2] == 0 && taxOut.Value[3] == 0) ? SIIParser.FromDecimal(taxOut.Key) : "0",
                        BaseImponible  = SIIParser.FromDecimal(taxOut.Value[0]),
                        CuotaSoportada = SIIParser.FromDecimal(taxOut.Value[1]),
                    };

                    if (Settings.Current.IDVersionSii.CompareTo("1.1") >= 0 && IsAsset)
                    {
                        detalleIVA.BienInversion = "S";
                    }

                    if (taxOut.Value[2] != 0)
                    {
                        detalleIVA.TipoRecargoEquivalencia  = SIIParser.FromDecimal(taxOut.Key);
                        detalleIVA.CuotaRecargoEquivalencia = SIIParser.FromDecimal(taxOut.Value[2]);
                    }

                    if (taxOut.Value[3] != 0)
                    {
                        if (taxOut.Value[2] != 0 && !skipErrors)
                        {
                            throw new Exception("Only one value can be non zero: taxAmountCompensacionREAGYP != 0 and taxAmountRecargoEquivalencia != 0.");
                        }

                        if (ClaveRegimenEspecialOTrascendencia != ClaveRegimenEspecialOTrascendencia.ExportacionREAGYP && !skipErrors)
                        {
                            throw new Exception("ClaveRegimenEspecialOTrascendencia must be ClaveRegimenEspecialOTrascendencia.ExportacionREAGYP.");
                        }

                        detalleIVA.TipoImpositivo            = detalleIVA.CuotaSoportada = null;
                        detalleIVA.PorcentCompensacionREAGYP = SIIParser.FromDecimal(taxOut.Key);
                        detalleIVA.ImporteCompensacionREAGYP = SIIParser.FromDecimal(taxOut.Value[3]);
                    }


                    desgloseIVA.DetalleIVA.Add(detalleIVA);
                }
            }
            else
            {
                desgloseIVA.DetalleIVA.Add(new DetalleIVA()
                {
                    BaseImponible = SIIParser.FromDecimal(GrossAmount)
                });
            }

            return(desgloseIVA);
        }
Esempio n. 2
0
        /// <summary>
        /// Devuelve el registro de cobros relacionados con la factura
        /// en un objeto XML.
        /// </summary>
        /// <returns>Objeto XML de registro de cobros relacionados con la factura.</returns>
        internal RegistroLRPagos ToPaymentsSII()
        {
            RegistroLRPagos registroLRPagos = new RegistroLRPagos();

            registroLRPagos.IDFactura.NumSerieFacturaEmisor        = InvoiceNumber;
            registroLRPagos.IDFactura.FechaExpedicionFacturaEmisor = SIIParser.FromDate(IssueDate);

            TaxIdEs taxIdEs    = null;
            bool    IsNotNifES = false;

            try
            {
                taxIdEs = new TaxIdEs(SellerParty.TaxIdentificationNumber);
            }
            catch
            {
                IsNotNifES = true;
            }

            if (taxIdEs != null)
            {
                IsNotNifES = !taxIdEs.IsDCOK;
            }


            if (SellerParty != null)
            {
                registroLRPagos.IDFactura.IDEmisorFactura.NombreRazon = SellerParty.PartyName;

                if (IsNotNifES)
                {
                    if (CountryCode == null)
                    {
                        throw new ArgumentNullException(
                                  "For foreign tax identificator number Country Code can't be null");
                    }

                    registroLRPagos.IDFactura.IDEmisorFactura.IDOtro            = new IDOtro();
                    registroLRPagos.IDFactura.IDEmisorFactura.IDOtro.IDType     = ((int)IDOtroType).ToString().PadLeft(2, '0');
                    registroLRPagos.IDFactura.IDEmisorFactura.IDOtro.CodigoPais = CountryCode;
                    registroLRPagos.IDFactura.IDEmisorFactura.IDOtro.ID         = SellerParty.TaxIdentificationNumber;
                }
                else
                {
                    registroLRPagos.IDFactura.IDEmisorFactura.NIF = SellerParty.TaxIdentificationNumber;
                }
            }

            foreach (var payment in APInvoicePayments)
            {
                if (payment.PaymentDate == null)
                {
                    throw new ArgumentNullException("PaymentDate is null.");
                }

                Cobro cobro = new Cobro()
                {
                    Fecha          = (payment.PaymentDate ?? new DateTime(1, 1, 1)).ToString("dd-MM-yyyy"),
                    Medio          = ((int)payment.PaymentTerm).ToString().PadLeft(2, '0'),
                    Importe        = SIIParser.FromDecimal(payment.PaymentAmount),
                    Cuenta_O_Medio = payment.AccountOrTermsText
                };

                registroLRPagos.Pagos.Add(cobro);
            }

            return(registroLRPagos);
        }
Esempio n. 3
0
        /// <summary>
        /// Obtiene un objeto RegistroLROpTranscendTribu, este objeto se utiliza
        /// para la serialización xml.
        /// </summary>
        /// <returns>Nueva instancia del objeto para serialización
        /// xml RegistroLROpTranscendTribu.</returns>
        internal RegistroLROpTrascendTribu ToSII()
        {
            RegistroLROpTrascendTribu siiTributo = new RegistroLROpTrascendTribu();

            if (IssueDate == null)
            {
                throw new ArgumentNullException("IssueDate is null.");
            }

            if (Settings.Current.IDVersionSii.CompareTo("1.1") < 0)
            {
                siiTributo.PeriodoImpositivo.Ejercicio = (IssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy");
                siiTributo.PeriodoImpositivo.Periodo   = "0A"; // anual
            }
            else
            {
                siiTributo.PeriodoLiquidacion.Ejercicio = (IssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy");
                siiTributo.PeriodoLiquidacion.Periodo   = "0A"; // anual
            }

            if (SellerParty == null)
            {
                throw new ArgumentNullException("SellerParty is null.");
            }

            TaxIdEs taxIdEs    = null;
            bool    IsNotNifES = false;

            try
            {
                taxIdEs = new TaxIdEs(SellerParty.TaxIdentificationNumber);
            }
            catch
            {
                IsNotNifES = true;
            }

            if (taxIdEs != null)
            {
                IsNotNifES = !taxIdEs.IsDCOK;
            }

            if (SellerParty != null)
            {
                siiTributo.Contraparte.NombreRazon = SellerParty.PartyName;

                if (IsNotNifES)
                {
                    if (CountryCode == null)
                    {
                        throw new ArgumentNullException(
                                  "For foreign tax identificator number Country Code can't be null");
                    }

                    siiTributo.Contraparte.IDOtro            = new IDOtro();
                    siiTributo.Contraparte.IDOtro.IDType     = ((int)IDOtroType).ToString().PadLeft(2, '0');
                    siiTributo.Contraparte.IDOtro.CodigoPais = CountryCode;
                    siiTributo.Contraparte.IDOtro.ID         = SellerParty.TaxIdentificationNumber;
                }
                else
                {
                    siiTributo.Contraparte.NIF = SellerParty.TaxIdentificationNumber;
                }
            }


            siiTributo.ClaveOperacion = ClaveOperacion;
            siiTributo.ImporteTotal   = SIIParser.FromDecimal(GrossAmount);

            return(siiTributo);
        }
Esempio n. 4
0
        /// <summary>
        /// Obtiene un objeto RegistroLRFacturasRecibidas, este objeto se utiliza
        /// para la serialización xml.
        /// </summary>
        /// <param name="updateInnerSII">Si es true, actualiza el objeto SII subyacente
        /// con el valor calculado.</param>
        /// <param name="skipErrors">Indica si hay que omitir las excepciones.</param>
        /// <returns>Nueva instancia del objeto para serialización
        /// xml RegistroLRFacturasEmitidas.</returns>
        public RegistroLRFacturasRecibidas ToSII(bool updateInnerSII = false, bool skipErrors = false)
        {
            if (InnerSII != null)
            {
                return(InnerSII);
            }

            RegistroLRFacturasRecibidas siiInvoice = new RegistroLRFacturasRecibidas();

            if (IssueDate == null && !skipErrors)
            {
                throw new ArgumentNullException("IssueDate is null.");
            }

            if (PostingDate == null && !skipErrors)
            {
                throw new ArgumentNullException("PostingDate is null.");
            }

            if (RegisterDate == null && !skipErrors)
            {
                throw new ArgumentNullException("RegisterDate is null.");
            }

            if (!string.IsNullOrEmpty(ExternalReference) &&
                !(Settings.Current.IDVersionSii.CompareTo("1.1") < 0))
            {
                siiInvoice.FacturaRecibida.RefExterna = ExternalReference;
            }

            if (Settings.Current.IDVersionSii.CompareTo("1.1") < 0)
            {
                siiInvoice.PeriodoImpositivo.Ejercicio = (PostingDate ?? new DateTime(1, 1, 1)).ToString("yyyy");
                siiInvoice.PeriodoImpositivo.Periodo   = (PostingDate ?? new DateTime(1, 1, 1)).ToString("MM");
            }
            else
            {
                siiInvoice.PeriodoLiquidacion.Ejercicio = (PostingDate ?? new DateTime(1, 1, 1)).ToString("yyyy");
                siiInvoice.PeriodoLiquidacion.Periodo   = (PostingDate ?? new DateTime(1, 1, 1)).ToString("MM");
            }

            if (SellerParty == null && !skipErrors)
            {
                throw new ArgumentNullException("SellerParty is null.");
            }

            if (GrossAmount != 0)
            {
                siiInvoice.FacturaRecibida.ImporteTotal = SIIParser.FromDecimal(GrossAmount);
            }


            if (!(Settings.Current.IDVersionSii.CompareTo("1.1") < 0))
            {
                if (GrossAmount > UpperLimit)
                {
                    siiInvoice.FacturaRecibida.Macrodato = "S";
                }
            }

            siiInvoice.IDFactura.NumSerieFacturaEmisor        = InvoiceNumber;
            siiInvoice.IDFactura.FechaExpedicionFacturaEmisor = SIIParser.FromDate(IssueDate);

            /* B) Facturas Recibidas
             *
             * En un plazo de cuatro días naturales desde la fecha en que se produzca el registro
             * contable de la factura y, en todo caso, antes del día 16 del mes siguiente al periodo
             * de liquidación en que se hayan incluido las operaciones correspondientes
             * (período en que se deduce el IVA soportado).
             * Se entiende que el registro contable de la factura se produce en la fecha de entrada
             * en el sistema contable con independencia de la fecha reflejada en el asiento contable. */

            siiInvoice.FacturaRecibida.FechaRegContable = SIIParser.FromDate(RegisterDate);

            if (OperationIssueDate != null)
            {
                siiInvoice.FacturaRecibida.FechaOperacion = SIIParser.FromDate(OperationIssueDate);
            }


            if (Settings.Current.IDVersionSii.CompareTo("1.1") >= 0 && TaxDate != null)
            {
                siiInvoice.FacturaRecibida.ADeducirEnPeriodoPosterior = "S";
                siiInvoice.FacturaRecibida.EjercicioDeduccion         = TaxDate?.ToString("yyyy");
                siiInvoice.FacturaRecibida.PeriodoDeduccion           = TaxDate?.ToString("MM");;
            }

            siiInvoice.FacturaRecibida.TipoFactura = InvoiceType.ToString();
            siiInvoice.FacturaRecibida.ClaveRegimenEspecialOTrascendencia =
                ((int)ClaveRegimenEspecialOTrascendencia).ToString().PadLeft(2, '0');

            siiInvoice.FacturaRecibida.DescripcionOperacion = InvoiceText;

            if (InvoiceType == InvoiceType.F5)
            {
                /* SII_Descripcion_ServicioWeb_v0.7.pdf (pag. 203)
                 * 8.1.2.2.Ejemplo mensaje XML de alta de importación
                 * En los datos identificativos correspondientes al proveedor se consignaran los del importador y titular del libro registro
                 * Deberán consignarse, como número de factura y fecha de expedición, el número de referencia que figura en el propio DUA y la fecha de su
                 * admisión por la Administración Aduanera respectivamente*/

                SellerParty = BuyerParty;
            }

            siiInvoice.FacturaRecibida.Contraparte = GetContraparte(siiInvoice, skipErrors);

            // Tratamiento de las facturas rectificativas.

            if (InvoicesRectified.Count != 0)
            {
                siiInvoice.FacturaRecibida.TipoRectificativa = RectifiedType.ToString();


                if (RectifiedBase != 0)
                {
                    // Si consta el datos de importe rectificacion (tipo rectif 's'), lo ponemos
                    ImporteRectificacion importeRectifica = new ImporteRectificacion();

                    importeRectifica.BaseRectificada                = SIIParser.FromDecimal(RectifiedBase);
                    importeRectifica.CuotaRectificada               = SIIParser.FromDecimal(RectifiedAmount);
                    importeRectifica.CuotaRecargoRectificado        = SIIParser.FromDecimal(RectifiedEquivCharge);
                    siiInvoice.FacturaRecibida.ImporteRectificacion = importeRectifica;
                }

                siiInvoice.FacturaRecibida.FacturasRectificadas = new List <IDFactura>();

                foreach (var regRect in InvoicesRectified)
                {
                    IDFactura FactRectificada = new IDFactura();

                    FactRectificada.NumSerieFacturaEmisor        = regRect.RectifiedInvoiceNumber;
                    FactRectificada.FechaExpedicionFacturaEmisor = SIIParser.FromDate(regRect.RectifiedIssueDate);
                    // En este caso pongo a null IDEmisorFactura para que no serialice una etiqueta vacía.
                    FactRectificada.IDEmisorFactura = null;

                    siiInvoice.FacturaRecibida.FacturasRectificadas.Add(FactRectificada);
                }
            }
            else
            {
                if (InvoiceType.ToString().StartsWith("R") && !skipErrors)
                {
                    throw new Exception("RectifiedInvoiceNumber for InvoiceType of kind 'R' must be not null.");
                }
            }


            // Desgloses

            DesgloseIVA desgloseIVA = GetDesgloseIVA();


            if (IsInversionSujetoPasivo)
            {
                siiInvoice.FacturaRecibida.DesgloseFactura.InversionSujetoPasivo = desgloseIVA;
            }
            else
            {
                siiInvoice.FacturaRecibida.DesgloseFactura.DesgloseIVA = desgloseIVA;
            }


            decimal cuotaDeducible = 0;

            foreach (KeyValuePair <decimal, decimal[]> kvp in TaxesOutputs)
            {
                cuotaDeducible += kvp.Value[1];
            }

            siiInvoice.FacturaRecibida.CuotaDeducible = SIIParser.FromDecimal(cuotaDeducible);

            if (updateInnerSII)
            {
                InnerSII = siiInvoice;
            }

            return(siiInvoice);
        }
Esempio n. 5
0
        /// <summary>
        /// Obtiene un objeto RegistroLRDetOperacionIntracomunitaria, este objeto se utiliza
        /// para la serialización xml.
        /// </summary>
        /// <param name="updateInnerSII">Si es true, actualiza el objeto SII subyacente
        /// con el valor calculado.</param>
        /// <returns>Nueva instancia del objeto para serialización
        /// xml RegistroLRDetOperacionIntracomunitaria.</returns>
        internal RegistroLRDetOperacionIntracomunitariaVentasEnConsigna ToSII(bool updateInnerSII = false)
        {
            if (InnerSII != null)
            {
                return(InnerSII);
            }


            RegistroLRDetOperacionIntracomunitariaVentasEnConsigna siiInvoice = new RegistroLRDetOperacionIntracomunitariaVentasEnConsigna();

            if (IssueDate == null)
            {
                throw new ArgumentNullException("IssueDate is null.");
            }

            if (!string.IsNullOrEmpty(ExternalReference) &&
                !(Settings.Current.IDVersionSii.CompareTo("1.1") < 0))
            {
                siiInvoice.OperacionIntracomunitaria.RefExterna = ExternalReference;
            }

            siiInvoice.IdRegistroDeclarado = new IdRegistroDeclarado()
            {
                Ejercicio = (IssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy"),
                Periodo   = (IssueDate ?? new DateTime(1, 1, 1)).ToString("MM")
            };

            siiInvoice.TipoOperacion = OperationType;

            TaxIdEs taxIdEs    = null;
            bool    IsNotNifES = false;

            if (BuyerParty == null)
            {
                throw new ArgumentNullException("BuyerParty is null.");
            }

            // Se puede tratar de un Buyer extranjero, de manera que tendremos que poner el tratamiento correspondiente
            try
            {
                taxIdEs = new TaxIdEs(BuyerParty.TaxIdentificationNumber);
            }
            catch
            {
                IsNotNifES = true;
            }

            if (taxIdEs != null)
            {
                IsNotNifES = !taxIdEs.IsDCOK;
            }

            Contraparte contraparte = null;

            if (BuyerParty != null)
            {
                contraparte = new Contraparte()
                {
                    NombreRazon = BuyerParty.PartyName
                };

                if (IsNotNifES)
                {
                    if (CountryCode == null && IDOtroType != IDOtroType.NifIva)
                    {
                        throw new ArgumentNullException(
                                  "For foreign tax identificator number Country Code can't be null");
                    }

                    // Si no es un nif español
                    contraparte.IDOtro            = new IDOtro();
                    contraparte.IDOtro.IDType     = ((int)IDOtroType).ToString().PadLeft(2, '0');
                    contraparte.IDOtro.CodigoPais = CountryCode;
                    contraparte.IDOtro.ID         = BuyerParty.TaxIdentificationNumber;
                }
                else
                {
                    siiInvoice.Contraparte.NIF = BuyerParty.TaxIdentificationNumber;
                }
            }

            siiInvoice.IdRegistroDeclarado.IdRegistro = InvoiceNumber;



            // Tratamos el resto de información de la factura intracomunitaria.
            siiInvoice.ClaveDeclarante = ClaveDeclarante.ToString();

            if (OperationType == "01")
            {
                siiInvoice.Contraparte = contraparte;

                siiInvoice.OperacionIntracomunitaria = new OperacionIntracomunitariaVentasEnConsigna()
                {
                    InfoExpedicionRecepcion = new InfoExpedicionRecepcion()
                    {
                        FechaExpedicion = (IssueDate ?? new DateTime(1, 1, 1)).ToString("dd-MM-yyyy"),
                        FechaLlegada    = (ReceptionDate ?? new DateTime(1, 1, 1)).ToString("dd-MM-yyyy"),
                        EmPartida       = EstadoMiembroPartida,
                        EmLlegada       = EstadoMiembroLlegada,
                        DescripBienes   = DescripcionBienes,
                        Cantidad        = $"{Quantity}",
                        ValorBienes     = SIIParser.FromDecimal(GrossAmount)
                    }
                };

                siiInvoice.Deposito = new Deposito()
                {
                    DireccionAlmacen = WarehouseAddress
                };
            }
            else if (OperationType == "03")
            {
                siiInvoice.OperacionIntracomunitaria = new OperacionIntracomunitariaVentasEnConsigna()
                {
                    DestinoFinalExpedRecep = new DestinoFinalExpedRecep()
                    {
                        FechaOpDeclarada   = (IssueDate ?? new DateTime(1, 1, 1)).ToString("dd-MM-yyyy"),
                        DescripBienes      = DescripcionBienes,
                        Cantidad           = $"{Quantity}",
                        BaseImponibleValor = SIIParser.FromDecimal(GrossAmount),
                        PrecioUnitario     = SIIParser.FromDecimal(GrossAmount / Quantity),
                        DestinatarioFinal  = contraparte
                    }
                };
            }

            // Para las ventas de bienes envíados anteriormente en consigna hay que indicar la
            // información del envío original. Esta información se incluye en InvoicesRectified

            if (InvoicesRectified != null && InvoicesRectified.Count > 0)
            {
                siiInvoice.OperacionIntracomunitaria.IdRegistroExpInicial = new IdRegistroExpInicial()
                {
                    Ejercicio    = (InvoicesRectified[0].RectifiedIssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy"),
                    Periodo      = (InvoicesRectified[0].RectifiedIssueDate ?? new DateTime(1, 1, 1)).ToString("MM"),
                    IdExpInicial = InvoicesRectified[0].RectifiedInvoiceNumber
                };
            }


            if (updateInnerSII)
            {
                InnerSII = siiInvoice;
            }

            return(siiInvoice);
        }