/// <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); }
/// <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; }