// Función para tratar el registro de factura que se acaba de leer. private RegistroLRDetOperacionIntracomunitaria TratarOperIntracom(string[] _CamposReg) { RegistroLRDetOperacionIntracomunitaria _RegLRFactIntraWrk = new RegistroLRDetOperacionIntracomunitaria(); // Informamos el periodo impositivo. PeriodoImpositivo _PeriodoWrk = new PeriodoImpositivo { Ejercicio = _CamposReg[1], Periodo = _CamposReg[2] }; _RegLRFactIntraWrk.PeriodoImpositivo = _PeriodoWrk; // // Informamos el IDFactura. // Por las pruebas que hemos podido realizar, en el SoapUI, dependiendo de si se trata de una factura intracomunitaria emitida o recibida // el emisor de la misma será o el titular o el proveedor/acreedor que nos haya remitido la factura. En nuestro caso, al tratarse de facturas // recibidas, el emisor de la misma será el proveedor/acreedor. Procedemos a modificar el código para que se genere correctamente el lote. // IDFactura _IDFactWrk = new IDFactura(); _IDFactWrk.IDEmisorFactura.NombreRazon = _CamposReg[3].Trim(); if (string.IsNullOrWhiteSpace(_CamposReg[5])) { _IDFactWrk.IDEmisorFactura.NIF = _CamposReg[4]; } else { IDOtro _EmisorExt = new IDOtro { ID = _CamposReg[4], CodigoPais = _CamposReg[5], IDType = _CamposReg[6] }; _IDFactWrk.IDEmisorFactura.IDOtro = _EmisorExt; } _IDFactWrk.NumSerieFacturaEmisor = _CamposReg[7].Trim(); _IDFactWrk.FechaExpedicionFacturaEmisor = _CamposReg[8]; _RegLRFactIntraWrk.IDFactura = _IDFactWrk; // // Informamos la contraparte, que, según la documentación y las pruebas realizadas, en nuestro caso tendremos que informar // los datos del titular del libro.. // Contraparte _ContraparteWrk = new Contraparte { NombreRazon = _CamposReg[9].Trim(), NIF = _CamposReg[10] }; _RegLRFactIntraWrk.Contraparte = _ContraparteWrk; // Informamos los datos correspondientes a la operación intracomunitaria. OperacionIntracomunitaria _OperIntraWrk = new OperacionIntracomunitaria { TipoOperacion = _CamposReg[11], ClaveDeclarado = _CamposReg[12], EstadoMiembro = _CamposReg[13], DescripcionBienes = _CamposReg[14], DireccionOperador = _CamposReg[15] }; _RegLRFactIntraWrk.OperacionIntracomunitaria = _OperIntraWrk; return(_RegLRFactIntraWrk); }
/// <summary> /// Obtiene un objeto RegistroLRDetOperacionIntracomunitaria, este objeto se utiliza /// para la serialización xml. /// </summary> /// <returns>Nueva instancia del objeto para serialización /// xml RegistroLRDetOperacionIntracomunitaria.</returns> internal RegistroLRDetOperacionIntracomunitaria ToSII() { RegistroLRDetOperacionIntracomunitaria siiInvoice = new RegistroLRDetOperacionIntracomunitaria(); if (IssueDate == null) { throw new ArgumentNullException("IssueDate is null."); } if (!string.IsNullOrEmpty(ExternalReference) && !(Settings.Current.IDVersionSii.CompareTo("1.1") < 0)) { siiInvoice.OperacionIntracomunitaria.RefExterna = ExternalReference; } if (Settings.Current.IDVersionSii.CompareTo("1.1") < 0) { siiInvoice.PeriodoImpositivo.Ejercicio = (IssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy"); siiInvoice.PeriodoImpositivo.Periodo = (IssueDate ?? new DateTime(1, 1, 1)).ToString("MM"); } else { siiInvoice.PeriodoLiquidacion.Ejercicio = (IssueDate ?? new DateTime(1, 1, 1)).ToString("yyyy"); siiInvoice.PeriodoLiquidacion.Periodo = (IssueDate ?? new DateTime(1, 1, 1)).ToString("MM"); } TaxIdEs taxIdEs = null; bool IsNotNifES = false; if (SellerParty == null) { throw new ArgumentNullException("SellerParty is null."); } 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; } if (BuyerParty != null) { siiInvoice.IDFactura.IDEmisorFactura.NombreRazon = BuyerParty.PartyName; if (IsNotNifES) { if (CountryCode == null) { throw new ArgumentNullException( "For foreign tax identificator number Country Code can't be null"); } // Si no es un nif español siiInvoice.IDFactura.IDEmisorFactura.IDOtro = new IDOtro(); siiInvoice.IDFactura.IDEmisorFactura.IDOtro.IDType = ((int)IDOtroType).ToString().PadLeft(2, '0'); siiInvoice.IDFactura.IDEmisorFactura.IDOtro.CodigoPais = CountryCode; siiInvoice.IDFactura.IDEmisorFactura.IDOtro.ID = BuyerParty.TaxIdentificationNumber; } else { siiInvoice.IDFactura.IDEmisorFactura.NIF = BuyerParty.TaxIdentificationNumber; } } siiInvoice.IDFactura.NumSerieFacturaEmisor = InvoiceNumber; siiInvoice.IDFactura.FechaExpedicionFacturaEmisor = (IssueDate ?? new DateTime(1, 1, 1)).ToString("dd-MM-yyyy"); // Se procede a tratar el Seller, el cual puede ser extranjero. taxIdEs = null; IsNotNifES = false; try { taxIdEs = new TaxIdEs(SellerParty.TaxIdentificationNumber); } catch { IsNotNifES = true; } if (taxIdEs != null) { IsNotNifES = !taxIdEs.IsDCOK; } if (SellerParty != null) { siiInvoice.Contraparte.NombreRazon = SellerParty.PartyName; if (IsNotNifES) { if (CountryCode == null) { throw new ArgumentNullException( "For foreign tax identificator number Country Code can't be null"); } // Si no es un nif español siiInvoice.Contraparte.IDOtro = new IDOtro(); siiInvoice.Contraparte.IDOtro.IDType = ((int)IDOtroType).ToString().PadLeft(2, '0'); siiInvoice.Contraparte.IDOtro.CodigoPais = CountryCode; siiInvoice.Contraparte.IDOtro.ID = SellerParty.TaxIdentificationNumber; } else { siiInvoice.Contraparte.NIF = SellerParty.TaxIdentificationNumber; } } // // Tratamos el resto de información de la factura intracomunitaria. // siiInvoice.OperacionIntracomunitaria.TipoOperacion = OperationType.ToString(); siiInvoice.OperacionIntracomunitaria.ClaveDeclarado = ClaveDeclarado.ToString(); siiInvoice.OperacionIntracomunitaria.EstadoMiembro = EstadoMiembro; siiInvoice.OperacionIntracomunitaria.DescripcionBienes = DescripcionBienes; siiInvoice.OperacionIntracomunitaria.DireccionOperador = DireccionOperador; return(siiInvoice); }
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); } }
/// <summary> /// Constructor de ITInvoice. /// </summary> /// <param name="registroLRDetOperacionIntracomunitaria">Objeto serialización xml operaciones intracomunitarias.</param> public ITInvoice(RegistroLRDetOperacionIntracomunitaria registroLRDetOperacionIntracomunitaria) { RegistroLRDetOperacionIntracomunitaria siiInvoice = registroLRDetOperacionIntracomunitaria; InvoiceNumber = siiInvoice.IDFactura.NumSerieFacturaEmisor; IssueDate = Convert.ToDateTime(siiInvoice.IDFactura.FechaExpedicionFacturaEmisor); // // Tratamiento del BuyerParty // BuyerParty = new Party() { TaxIdentificationNumber = siiInvoice.IDFactura.IDEmisorFactura.NIF, PartyName = siiInvoice.IDFactura.IDEmisorFactura.NombreRazon }; if (siiInvoice.IDFactura.IDEmisorFactura.IDOtro != null) { // Si no es un nif español IDOtroType = (IDOtroType)Convert.ToInt32( siiInvoice.IDFactura.IDEmisorFactura.IDOtro.IDType); CountryCode = siiInvoice.IDFactura.IDEmisorFactura.IDOtro.CodigoPais; } // // Tratamiento del SellerParty // SellerParty = 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 (SellerParty == null) { throw new ArgumentNullException("SellerParty is null."); } if (IssueDate == null) { throw new ArgumentNullException("IssueDate is null."); } OperationType operationType; if (!Enum.TryParse <OperationType>(siiInvoice.OperacionIntracomunitaria.TipoOperacion, out operationType)) { throw new InvalidOperationException($"Unknown operation type {siiInvoice.OperacionIntracomunitaria.TipoOperacion}"); } OperationType = operationType; ClaveDeclarado claveDeclarado; if (!Enum.TryParse <ClaveDeclarado>(siiInvoice.OperacionIntracomunitaria.ClaveDeclarado, out claveDeclarado)) { throw new InvalidOperationException($"Unknown clave declarado {siiInvoice.OperacionIntracomunitaria.ClaveDeclarado}"); } ClaveDeclarado = claveDeclarado; EstadoMiembro = siiInvoice.OperacionIntracomunitaria.EstadoMiembro; DescripcionBienes = siiInvoice.OperacionIntracomunitaria.DescripcionBienes; DireccionOperador = siiInvoice.OperacionIntracomunitaria.DireccionOperador; }