예제 #1
0
        /// <summary>
        /// Devuelve un objeto XML con un filtro consulta de facturas emitidas.
        /// </summary>
        /// <returns>Objeto XML con un filtro consulta de facturas emitidas.</returns>
        internal ConsultaFactInformadasProveedor ToFilterExternSII()
        {
            PostingDate = RegisterDate = IssueDate;

            RegistroLRFacturasRecibidas siiInvoice = ToSII();

            ConsultaFactInformadasProveedor siiFilter = new ConsultaFactInformadasProveedor();

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

            siiFilter.FiltroConsulta.PeriodoImputacion.Ejercicio = (IssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy");
            siiFilter.FiltroConsulta.PeriodoImputacion.Periodo   = (IssueDate ?? new DateTime(1, 1, 1)).ToString("MM");

            if (SellerParty != null)
            {
                siiFilter.FiltroConsulta.Proveedor = siiInvoice.FacturaRecibida.Contraparte;
            }

            // Tratamiento del Desde/Hasta Fecha Presentación.
            if (SinceDate != null && UntilDate != null)
            {
                if (siiFilter.FiltroConsulta.FechaExpedicion == null)
                {
                    siiFilter.FiltroConsulta.FechaExpedicion = new RangoFechaPresentacion();
                }

                siiFilter.FiltroConsulta.FechaExpedicion.Desde = SIIParser.FromDate(SinceDate);
                siiFilter.FiltroConsulta.FechaExpedicion.Hasta = SIIParser.FromDate(UntilDate);
            }

            return(siiFilter);
        }
예제 #2
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);
        }
예제 #3
0
        /// <summary>
        /// Constructor de ARInvoice.
        /// </summary>
        /// <param name="registroLRFacturasEmitidas">Objeto serialización xml facturas emitidas.</param>
        public ARInvoiceAV(RegistroLRFacturasEmitidas registroLRFacturasEmitidas) :
            base(registroLRFacturasEmitidas)
        {
            RegistroLRFacturasEmitidas siiInvoice = registroLRFacturasEmitidas;

            // Gestión del tipo desglose
            NoSujeta noSujeta = siiInvoice?.FacturaExpedida?.TipoDesglose?.DesgloseFactura?.NoSujeta;

            if (noSujeta != null)
            {
                if (noSujeta.ImporteTAIReglasLocalizacion != null)
                {
                    IsTAIRules  = true;
                    GrossAmount = SIIParser.ToDecimal(noSujeta.ImporteTAIReglasLocalizacion);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Constructor clase Envelope.
        /// </summary>
        /// <param name="stream">Ruta al archivo xml que contiene el mensaje SOAP.</param>
        public Envelope(Stream stream)
        {
            Envelope envelope = null;

            XmlSerializer serializer = new XmlSerializer(this.GetType());

            using (StreamReader r = new StreamReader(stream))
                envelope = serializer.Deserialize(r) as Envelope;

            if (envelope == null)
            {
                throw new Exception("XML SOAP selerailization error");
            }

            Header = envelope.Header;
            Body   = envelope.Body;

            SIIParser.ClearNulls(Body);
        }
예제 #5
0
 private void GetLinesFR()
 {
     if (DesgloseIVA != null)
     {
         if (DesgloseIVA.DetalleIVA != null)
         {
             foreach (var iva in DesgloseIVA.DetalleIVA)
             {
                 Lines.Add(new QueryAeatInvoiceLine()
                 {
                     BaseImponible  = SIIParser.ToDecimal(iva.BaseImponible),
                     TipoImpositivo = SIIParser.ToDecimal(iva.TipoImpositivo),
                     TipoRE         = SIIParser.ToDecimal(iva.TipoRecargoEquivalencia),
                     Cuota          = SIIParser.ToDecimal(iva.CuotaSoportada),
                     CuotaRE        = SIIParser.ToDecimal(iva.CuotaRecargoEquivalencia),
                     TipoREAGYP     = SIIParser.ToDecimal(iva.PorcentCompensacionREAGYP),
                     CuotaREAGYP    = SIIParser.ToDecimal(iva.ImporteCompensacionREAGYP),
                     Tipo           = ""
                 });
             }
         }
     }
 }
예제 #6
0
        /// <summary>
        /// Devuelve una cadena con el envelope representado
        /// en xml en formato binario con codificaión UTF8.
        /// </summary>
        /// <returns>Envelope en xml en binario con codificaión UTF8.</returns>
        public byte[] ToArray(SIINamespaces ns = SIINamespaces.siiLR, SIINamespaces nsSum = SIINamespaces.sii)
        {
            byte[] result = null;

            SIIParser.ClearNulls(this); // Limpia nulos

            XmlSerializer           xmlSerializer = new XmlSerializer(GetType());
            XmlSerializerNamespaces namespaces    = new XmlSerializerNamespaces();

            namespaces.Add("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
            namespaces.Add(ns.ToString(), SIIParser.Namespaces[ns]);
            namespaces.Add(nsSum.ToString(), SIIParser.Namespaces[nsSum]);

            var ms = new MemoryStream();

            using (StreamWriter sw = new StreamWriter(ms, Encoding.GetEncoding("UTF-8")))
            {
                xmlSerializer.Serialize(sw, this, namespaces);
                result = ms.ToArray();
            }

            return(result);
        }
예제 #7
0
        /// <summary>
        /// Constructor clase Envelope.
        /// </summary>
        /// <param name="xmlPath">Ruta al archivo xml que contiene el mensaje SOAP.</param>
        public Envelope(string xmlPath)
        {
            Envelope envelope = null;

            XmlSerializer serializer = new XmlSerializer(this.GetType());

            if (File.Exists(xmlPath))
            {
                using (StreamReader r = new StreamReader(xmlPath))
                {
                    envelope = serializer.Deserialize(r) as Envelope;
                }
            }

            if (envelope == null)
            {
                throw new Exception("XML SOAP selerailization error");
            }

            Header = envelope.Header;
            Body   = envelope.Body;

            SIIParser.ClearNulls(Body);
        }
예제 #8
0
        public void GenerarXMLIntracomEnvel(string _NombreFichero)
        {
            IntracomEnvel funcion        = new IntracomEnvel();
            string        _NomFicheroWrk = _NombreFichero;

            try
            {
                Envelope _EnvelWrk = new Envelope();
                SuministroLRDetOperacionIntracomunitaria _SumLROperIntracom = new SuministroLRDetOperacionIntracomunitaria();
                RegistroLRDetOperacionIntracomunitaria   _RegLROperIntracom = new RegistroLRDetOperacionIntracomunitaria();

                Cabecera _Cabecera = new Cabecera();

                using (StreamReader _Lector = new StreamReader(_NomFicheroWrk))
                {
                    while (_Lector.Peek() > -1)
                    {
                        string _RegFichero = _Lector.ReadLine();
                        if (!String.IsNullOrEmpty(_RegFichero))
                        {
                            // Con creamos un Array con los distintos campos que contiene el registro separados por ";"
                            string[] _CamposReg = _RegFichero.Split(';');
                            string   _TipoReg   = _CamposReg[0];

                            switch (_TipoReg)
                            {
                            case "CABE":
                                _Cabecera = funcion.TratarRegCabecera(_CamposReg);
                                _SumLROperIntracom.Cabecera = _Cabecera;
                                break;

                            case "FACT":
                                _RegLROperIntracom = new RegistroLRDetOperacionIntracomunitaria();
                                _RegLROperIntracom = funcion.TratarOperIntracom(_CamposReg);
                                _SumLROperIntracom.RegistroLRDetOperacionIntracomunitaria.Add(_RegLROperIntracom);
                                break;

                            case "FINI":
                                // Incluimos todas las facturas tratadas en el Envelope.
                                _EnvelWrk.Body.SuministroLRDetOperacionIntracomunitaria = _SumLROperIntracom;

                                //Obtenemos la fecha actual sin la hora y procedemos a crear la ruta/nombre del fichero resultante
                                DateTime _FechaActual  = DateTime.Today;
                                string   nombrefichero = "SII_Intracom_" + _Cabecera.Titular.NIF + "_" + _FechaActual.ToString("yyyyMMdd") + ".XML";
                                string   XmlResult     = "C:/Temp/" + nombrefichero;

                                // Con la siguiente instruccion se genera el XML en la direccion anteriormente indicada.
                                XmlDocument tmpXML = SIIParser.GetXml(_EnvelWrk, XmlResult);

                                string _msg = "Fichero XML generado: " + XmlResult;
                                MessageBox.Show(_msg, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                break;

                            default:
                                string _msgAviso = "Tipo Registro incorrecto: " + _TipoReg;
                                MessageBox.Show(_msgAviso, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string _msgError = "Error: " + ex.Message;
                MessageBox.Show(_msgError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
예제 #9
0
        internal FiltroConsulta ToFilterSII()
        {
            FiltroConsulta siiFilter = new FiltroConsulta();

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

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

            TaxIdEs taxIdEs = null;

            bool IsNotNifES = false;

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

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

            siiFilter.ClavePaginacion = new ClavePaginacion();
            siiFilter.IDFactura       = new IDFactura();

            if (SellerParty != null)
            {
                if (IsFiltroClavePag == true)
                {
                    siiFilter.ClavePaginacion.IDEmisorFactura.NombreRazon = SellerParty.PartyName;
                }
                else
                {
                    siiFilter.IDFactura.IDEmisorFactura.NombreRazon = SellerParty.PartyName;
                }

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

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

                if (InvoiceNumber != null)
                {
                    if (IsFiltroClavePag == true)
                    {
                        siiFilter.ClavePaginacion.NumSerieFacturaEmisor = InvoiceNumber;
                    }
                    else
                    {
                        siiFilter.IDFactura.NumSerieFacturaEmisor = InvoiceNumber;
                    }
                }

                if (IssueDate != null)
                {
                    if (IsFiltroClavePag == true)
                    {
                        siiFilter.ClavePaginacion.FechaExpedicionFacturaEmisor =
                            SIIParser.FromDate(IssueDate);
                    }
                    else
                    {
                        siiFilter.IDFactura.FechaExpedicionFacturaEmisor =
                            SIIParser.FromDate(IssueDate);
                    }
                }
            }


            // Tratamiento del Desde/Hasta Fecha Presentación.
            if (SinceDate != null && UntilDate != null)
            {
                if (siiFilter.FechaPresentacion == null)
                {
                    siiFilter.FechaPresentacion = new RangoFechaPresentacion();
                }

                siiFilter.FechaPresentacion.Desde = SIIParser.FromDate(SinceDate);
                siiFilter.FechaPresentacion.Hasta = SIIParser.FromDate(UntilDate);
            }

            return(siiFilter);
        }
예제 #10
0
 /// <summary>
 /// Devuelve el lote de facturas como un archivo xml para soap según las
 /// especificaciones de la aeat.
 /// </summary>
 /// <param name="xmlPath">Ruta donde se guardará el archivo generado.</param>
 /// <returns>Xaml generado.</returns>
 public XmlDocument GetXml(string xmlPath)
 {
     return(SIIParser.GetXml(GetEnvelope(), xmlPath, SIINamespaces.con, SIINamespaces.sum));
 }
예제 #11
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);
        }
예제 #12
0
        /// <summary>
        /// Constructor de ARInvoice.
        /// </summary>
        /// <param name="registroLRFacturasRecibidas">Objeto serialización xml facturas emitidas.</param>
        public APInvoice(RegistroLRFacturasRecibidas registroLRFacturasRecibidas)
        {
            APInvoicePayments = new List <APInvoicePayment>();
            InvoicesRectified = new List <InvoiceRectified>();

            RegistroLRFacturasRecibidas siiInvoice = registroLRFacturasRecibidas;

            InvoiceNumber = siiInvoice.IDFactura.NumSerieFacturaEmisor;
            IssueDate     = Convert.ToDateTime(siiInvoice.IDFactura.FechaExpedicionFacturaEmisor);
            PostingDate   = Convert.ToDateTime(siiInvoice.FacturaRecibida.FechaRegContable);

            if (Settings.Current.IDVersionSii.CompareTo("1.1") >= 0 && siiInvoice.FacturaRecibida.ADeducirEnPeriodoPosterior == "S")
            {
                TaxDate = new DateTime(Convert.ToInt32(siiInvoice.FacturaRecibida.EjercicioDeduccion),
                                       Convert.ToInt32(siiInvoice.FacturaRecibida.PeriodoDeduccion), 1);
            }


            if (siiInvoice.FacturaRecibida.FechaOperacion != null)
            {
                OperationIssueDate = Convert.ToDateTime(siiInvoice.FacturaRecibida.FechaOperacion);
            }

            SellerParty = new Party()
            {
                TaxIdentificationNumber = siiInvoice.IDFactura.IDEmisorFactura.NIF,
                PartyName = siiInvoice.FacturaRecibida.Contraparte.NombreRazon
            };

            if (siiInvoice.FacturaRecibida.Contraparte.IDOtro != null)
            {
                // Si no es un nif español

                IDOtroType =
                    (IDOtroType)Convert.ToInt32(
                        siiInvoice.FacturaRecibida.Contraparte.IDOtro.IDType);

                CountryCode = siiInvoice.FacturaRecibida.Contraparte.IDOtro.CodigoPais;
                SellerParty.TaxIdentificationNumber = siiInvoice.FacturaRecibida.Contraparte.IDOtro.ID;
            }


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

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

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

            InvoiceType invoiceType;

            if (!Enum.TryParse <InvoiceType>(siiInvoice.FacturaRecibida.TipoFactura, out invoiceType))
            {
                throw new InvalidOperationException($"Unknown invoice type {siiInvoice.FacturaRecibida.TipoFactura}");
            }

            InvoiceType = invoiceType;


            ClaveRegimenEspecialOTrascendencia =
                (ClaveRegimenEspecialOTrascendencia)Convert.ToInt32(
                    siiInvoice.FacturaRecibida.ClaveRegimenEspecialOTrascendencia);

            // Gestion rectificativa

            if (siiInvoice.FacturaRecibida.TipoRectificativa != null)
            {
                if (!siiInvoice.FacturaRecibida.TipoFactura.StartsWith("R"))
                {
                    throw new ArgumentException("For TipoRectificativa not null TipoFactura must begin with 'R'.");
                }

                FacturaRecibida facturaRecibidaRectificativa = siiInvoice.FacturaRecibida;

                if (facturaRecibidaRectificativa.ImporteRectificacion != null)
                {
                    RectifiedBase   = SIIParser.ToDecimal(facturaRecibidaRectificativa.ImporteRectificacion.BaseRectificada);
                    RectifiedAmount = SIIParser.ToDecimal(facturaRecibidaRectificativa.ImporteRectificacion.CuotaRectificada);
                }

                RectifiedType rectifiedType;

                if (Enum.TryParse <RectifiedType>(facturaRecibidaRectificativa.TipoRectificativa, out rectifiedType))
                {
                    RectifiedType = rectifiedType;
                }

                if (facturaRecibidaRectificativa.FacturasRectificadas.Count == 0)
                {
                    throw new ArgumentException("FacturasRectificadas without elements.");
                }


                foreach (var regRect in facturaRecibidaRectificativa.FacturasRectificadas)
                {
                    InvoiceRectified invoiceRectified = new InvoiceRectified();

                    invoiceRectified.RectifiedInvoiceNumber = regRect.NumSerieFacturaEmisor;
                    invoiceRectified.RectifiedIssueDate     = Convert.ToDateTime(regRect.FechaExpedicionFacturaEmisor);

                    InvoicesRectified.Add(invoiceRectified);
                }
            }

            // Gestion desgloses

            decimal taxRate, taxBase, taxAmount, taxRateRE, taxAmountRE;

            if (siiInvoice.FacturaRecibida.DesgloseFactura != null)
            {
                DesgloseIVA desgloseIVA = null;
                if (siiInvoice.FacturaRecibida.DesgloseFactura.InversionSujetoPasivo != null &&
                    siiInvoice.FacturaRecibida.DesgloseFactura.InversionSujetoPasivo.DetalleIVA.Count > 0)
                {
                    desgloseIVA = siiInvoice.FacturaRecibida.DesgloseFactura.InversionSujetoPasivo;
                }
                else
                {
                    if (siiInvoice.FacturaRecibida.DesgloseFactura.DesgloseIVA == null)
                    {
                        throw new ArgumentException("For InversionSujetoPasivo DesgloseIVA must be present on DesgloseFactura.");
                    }

                    desgloseIVA = siiInvoice.FacturaRecibida.DesgloseFactura.DesgloseIVA;
                }

                foreach (var iva in desgloseIVA.DetalleIVA)
                {
                    taxRate     = SIIParser.ToDecimal(iva.TipoImpositivo);
                    taxBase     = SIIParser.ToDecimal(iva.BaseImponible);
                    taxAmount   = SIIParser.ToDecimal(iva.CuotaSoportada);
                    taxRateRE   = SIIParser.ToDecimal(iva.TipoRecargoEquivalencia);
                    taxAmountRE = SIIParser.ToDecimal(iva.CuotaRecargoEquivalencia);

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

                    TaxesOutputs.Add(taxRate, new decimal[] { taxBase, taxAmount, taxRateRE, taxAmountRE });
                }
            }
            else
            {
                throw new ArgumentException("DesgloseFactura no present in FacturaRecibida.");
            }

            // Gestión cuota deducible

            GrossAmount = SIIParser.ToDecimal(siiInvoice.FacturaRecibida.ImporteTotal);
            InvoiceText = siiInvoice.FacturaRecibida.DescripcionOperacion;
        }
예제 #13
0
        internal RegistroLRBajaRecibidas ToRegistroLRBajaRecibidasSII()
        {
            RegistroLRBajaRecibidas siiDelete = new RegistroLRBajaRecibidas();

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

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

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


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

            TaxIdEs taxIdEs    = null;
            bool    IsNotNifES = false;

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

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


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

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

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

                if (InvoiceNumber != null)
                {
                    siiDelete.IDFactura.NumSerieFacturaEmisor = InvoiceNumber;
                }

                if (IssueDate != null)
                {
                    siiDelete.IDFactura.FechaExpedicionFacturaEmisor =
                        SIIParser.FromDate(IssueDate);
                }
            }

            return(siiDelete);
        }
예제 #14
0
        public void GenerarXMLRecibidasEnvel(string _NombreFichero)
        {
            RecibidasEnvel funcion        = new RecibidasEnvel();
            string         _NomFicheroWrk = _NombreFichero;

            try
            {
                Envelope _EnvelWrk = new Envelope();
                SuministroLRFacturasRecibidas _SumLRFactReci = new SuministroLRFacturasRecibidas();
                RegistroLRFacturasRecibidas   _RegLRFactReci = new RegistroLRFacturasRecibidas();

                Cabecera _Cabecera = new Cabecera();

                bool _NuevaFact    = false;
                int  lineasFisc    = 0;
                bool _NuevoDetalle = true;

                using (StreamReader _Lector = new StreamReader(_NomFicheroWrk))
                {
                    while (_Lector.Peek() > -1)
                    {
                        string _RegFichero = _Lector.ReadLine();
                        if (!String.IsNullOrEmpty(_RegFichero))
                        {
                            // Con creamos un Array con los distintos campos que contiene el registro separados por ";"
                            string[] _CamposReg = _RegFichero.Split(';');
                            string   _TipoReg   = _CamposReg[0];

                            switch (_TipoReg)
                            {
                            case "CABE":
                                _Cabecera = funcion.TratarRegCabecera(_CamposReg);
                                _SumLRFactReci.Cabecera = _Cabecera;
                                break;

                            case "FACT":
                                if (_NuevaFact)     // Si se trata de una nueva factura, añadiremos la 'antigua' al fichero
                                {
                                    _SumLRFactReci.RegistroLRFacturasRecibidas.Add(_RegLRFactReci);
                                    _NuevaFact = false;
                                }
                                _RegLRFactReci = new RegistroLRFacturasRecibidas();
                                _RegLRFactReci = funcion.TratarFactRecibida(_CamposReg);
                                lineasFisc     = 0;
                                _NuevoDetalle  = true;
                                break;

                            case "RECT":
                                _RegLRFactReci = funcion.AgregarFactRectifica(_CamposReg, _RegLRFactReci);
                                break;

                            case "FISC":
                                _NuevaFact = true;
                                lineasFisc++;
                                if (lineasFisc > 1)
                                {
                                    _NuevoDetalle = false;
                                }
                                _RegLRFactReci = funcion.AgregarDesgloseIVA(_CamposReg, _RegLRFactReci, _NuevoDetalle);
                                break;

                            case "FINI":
                                // Tenemos que incluir la última factura que hemos tratado.
                                _SumLRFactReci.RegistroLRFacturasRecibidas.Add(_RegLRFactReci);

                                // Incluimos todas las facturas tratadas en el Envelope.
                                _EnvelWrk.Body.SuministroLRFacturasRecibidas = _SumLRFactReci;

                                //Obtenemos la fecha actual sin la hora y procedemos a crear la ruta/nombre del fichero resultante
                                DateTime _FechaActual  = DateTime.Today;
                                string   nombrefichero = "SII_Recibidas_" + _Cabecera.Titular.NIF + "_" + _FechaActual.ToString("yyyyMMdd") + ".XML";
                                string   XmlResult     = "C:/Temp/" + nombrefichero;

                                // Con la siguiente instruccion se genera el XML en la direccion anteriormente indicada.
                                XmlDocument tmpXML = SIIParser.GetXml(_EnvelWrk, XmlResult);

                                string _msg = "Fichero XML generado: " + XmlResult;
                                MessageBox.Show(_msg, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                break;

                            default:
                                string _msgAviso = "Tipo Registro incorrecto: " + _TipoReg;
                                MessageBox.Show(_msgAviso, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string _msgError = "Error: " + ex.Message;
                MessageBox.Show(_msgError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
예제 #15
0
 /// <summary>
 /// Devuelve el lote de facturas como un archivo xml para soap según las
 /// especificaciones de la aeat.
 /// </summary>
 /// <param name="xmlPath">Ruta donde se guardará el archivo generado.</param>
 /// <returns>Xaml generado.</returns>
 public XmlDocument GetXmlExtern(string xmlPath)
 {
     return(SIIParser.GetXml(GetEnvelopeExtern(), xmlPath, SIINamespaces.con));
 }
예제 #16
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);
        }
예제 #17
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);
        }
예제 #18
0
        private void GetLinesFE()
        {
            if (Desglose.NoSujeta != null)
            {
                Lines.Add(new QueryAeatInvoiceLine()
                {
                    NoSujArt7_14 = SIIParser.ToDecimal(Desglose.NoSujeta.ImportePorArticulos7_14_Otros),
                    NoSujTAI     = SIIParser.ToDecimal(Desglose.NoSujeta.ImporteTAIReglasLocalizacion),
                    Tipo         = "NS"
                });
            }

            if (Desglose.Sujeta != null)
            {
                if (Desglose.Sujeta.Exenta != null)
                {
                    if (Settings.Current.IDVersionSii.CompareTo("1.1") < 0)
                    {
                        Lines.Add(new QueryAeatInvoiceLine()
                        {
                            BaseImponible = SIIParser.ToDecimal(Desglose.Sujeta.Exenta.BaseImponible),
                            Tipo          = Desglose.Sujeta.Exenta.CausaExencion
                        });
                    }
                    else
                    {
                        foreach (var exenta in Desglose.Sujeta.Exenta.DetalleExenta)
                        {
                            Lines.Add(new QueryAeatInvoiceLine()
                            {
                                BaseImponible = SIIParser.ToDecimal(exenta.BaseImponible),
                                Tipo          = exenta.CausaExencion
                            });
                        }
                    }
                }

                if (Desglose.Sujeta.NoExenta != null)
                {
                    if (Desglose.Sujeta.NoExenta.DesgloseIVA != null)
                    {
                        if (Desglose.Sujeta.NoExenta.DesgloseIVA.DetalleIVA != null)
                        {
                            foreach (var iva in Desglose.Sujeta.NoExenta.DesgloseIVA.DetalleIVA)
                            {
                                Lines.Add(new QueryAeatInvoiceLine()
                                {
                                    BaseImponible  = SIIParser.ToDecimal(iva.BaseImponible),
                                    TipoImpositivo = SIIParser.ToDecimal(iva.TipoImpositivo),
                                    TipoRE         = SIIParser.ToDecimal(iva.TipoRecargoEquivalencia),
                                    Cuota          = SIIParser.ToDecimal(iva.CuotaRepercutida),
                                    CuotaRE        = SIIParser.ToDecimal(iva.CuotaRecargoEquivalencia),
                                    TipoREAGYP     = SIIParser.ToDecimal(iva.PorcentCompensacionREAGYP),
                                    CuotaREAGYP    = SIIParser.ToDecimal(iva.ImporteCompensacionREAGYP),
                                    Tipo           = Desglose.Sujeta.NoExenta.TipoNoExenta
                                });
                            }
                        }
                    }
                }
            }
        }
예제 #19
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);
        }
예제 #20
0
 /// <summary>
 /// Devuelve el lote de Operaciones de Seguros como un archivo xml para soap según las
 /// especificaciones de la aeat.
 /// </summary>
 /// <param name="xmlPath">Ruta donde se guardará el archivo generado.</param>
 /// <returns>Xaml generado.</returns>
 public XmlDocument GetXml(string xmlPath)
 {
     return(SIIParser.GetXml(GetEnvelope(), xmlPath));
 }
예제 #21
0
        /// <summary>
        /// Constructor de ITInvoice.
        /// </summary>
        /// <param name="registroLRDetOperacionIntracomunitariaVentasEnConsigna">Objeto serialización xml venta consigna.</param>
        public ITConsignment(RegistroLRDetOperacionIntracomunitariaVentasEnConsigna registroLRDetOperacionIntracomunitariaVentasEnConsigna)
        {
            RegistroLRDetOperacionIntracomunitariaVentasEnConsigna siiInvoice = registroLRDetOperacionIntracomunitariaVentasEnConsigna;

            InvoiceNumber    = siiInvoice.IdRegistroDeclarado.IdRegistro;
            OperationType    = siiInvoice.TipoOperacion;
            IssueDate        = Convert.ToDateTime(siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.FechaExpedicion);
            ReceptionDate    = Convert.ToDateTime(siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.FechaLlegada);
            Quantity         = Convert.ToInt32(siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.Cantidad);
            GrossAmount      = SIIParser.ToDecimal(siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.ValorBienes);
            WarehouseAddress = siiInvoice.Deposito.DireccionAlmacen;

            // Tratamiento del BuyerParty

            BuyerParty = new Party()
            {
                TaxIdentificationNumber = siiInvoice.Contraparte.NIF,
                PartyName = siiInvoice.Contraparte.NombreRazon
            };

            if (siiInvoice.Contraparte.IDOtro != null)
            {
                // Si no es un nif español

                IDOtroType =
                    (IDOtroType)Convert.ToInt32(
                        siiInvoice.Contraparte.IDOtro.IDType);

                CountryCode = siiInvoice.Contraparte.IDOtro.CodigoPais;
            }


            // Tratamiento del BuyerParty

            BuyerParty = new Party()
            {
                TaxIdentificationNumber = (siiInvoice.Contraparte.IDOtro == null) ? null : siiInvoice.Contraparte.IDOtro.ID,
                PartyName = siiInvoice.Contraparte.NombreRazon
            };

            if (siiInvoice.Contraparte.IDOtro != null)
            {
                // Si no es un nif español

                IDOtroType =
                    (IDOtroType)Convert.ToInt32(
                        siiInvoice.Contraparte.IDOtro.IDType);

                CountryCode = siiInvoice.Contraparte.IDOtro.CodigoPais;
            }

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

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


            ClaveDeclarante claveDeclarante;

            if (!Enum.TryParse <ClaveDeclarante>(siiInvoice.ClaveDeclarante, out claveDeclarante))
            {
                throw new InvalidOperationException($"Unknown clave declarado {siiInvoice.ClaveDeclarante}");
            }

            ClaveDeclarante = claveDeclarante;

            EstadoMiembroPartida = siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.EmPartida;
            EstadoMiembroLlegada = siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.EmLlegada;
            DescripcionBienes    = siiInvoice.OperacionIntracomunitaria.InfoExpedicionRecepcion.DescripBienes;
        }