From bf81d72d109fc4b49c50fe9949e8c3d1604bdb18 Mon Sep 17 00:00:00 2001 From: "Romero Herreros, Alberto" Date: Mon, 13 Dec 2021 09:41:49 +0100 Subject: [PATCH 1/5] InvoiceAdditionalData v 2.14.0 --- .../a3innuva.Importia.SDK.Extensions.csproj | 2 +- .../InputInvoiceAdditionalData.cs | 23 +++ .../OutputInvoiceAdditionalData.cs | 25 +++ .../Entities/Invoices/InputInvoice.cs | 1 + .../Entities/Invoices/OutputInvoice.cs | 1 + ...innuva.Importia.SDK.Implementations.csproj | 2 +- ...a3innuva.Importia.SDK.Serialization.csproj | 2 +- .../a3innuvaSerializationBinder.cs | 4 + .../Entities/Invoice/IInputInvoice.cs | 1 + .../Entities/Invoice/IOutputInvoice.cs | 1 + .../FundamentalAdditionalDataEnum.cs | 30 ++++ .../IInputInvoiceAdditionalData.cs | 43 +++++ .../IOutputInvoiceAdditionalData.cs | 51 ++++++ .../TypeOfDocumentAdditionalDataEnum.cs | 27 ++++ .../a3innuva.Importia.SDK.Interfaces.csproj | 2 +- .../SerializationTests.cs | 149 ++++++++++++++++++ .../a3innuvaSerializationBinderTests.cs | 6 +- 17 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/InputInvoiceAdditionalData.cs create mode 100644 Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/OutputInvoiceAdditionalData.cs create mode 100644 Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/FundamentalAdditionalDataEnum.cs create mode 100644 Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IInputInvoiceAdditionalData.cs create mode 100644 Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IOutputInvoiceAdditionalData.cs create mode 100644 Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs diff --git a/Implementations/a3innuva.Importia.SDK.Extensions/a3innuva.Importia.SDK.Extensions.csproj b/Implementations/a3innuva.Importia.SDK.Extensions/a3innuva.Importia.SDK.Extensions.csproj index 330f456..dbcadb3 100644 --- a/Implementations/a3innuva.Importia.SDK.Extensions/a3innuva.Importia.SDK.Extensions.csproj +++ b/Implementations/a3innuva.Importia.SDK.Extensions/a3innuva.Importia.SDK.Extensions.csproj @@ -4,7 +4,7 @@ netstandard2.0;netstandard2.1;net451;net461;net471;net48;net5.0;netcoreapp3.1;net6.0 a3innuva.TAA.Migration.SDK.Extensions a3innuva.TAA.Migration.SDK.Extensions - 2.13.0 + 2.14.0 true a3innuva.Importia.SDK a3innuva.Importia.SDK.Extensions diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/InputInvoiceAdditionalData.cs b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/InputInvoiceAdditionalData.cs new file mode 100644 index 0000000..79d45b2 --- /dev/null +++ b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/InputInvoiceAdditionalData.cs @@ -0,0 +1,23 @@ +namespace a3innuva.TAA.Migration.SDK.Implementations +{ + using a3innuva.TAA.Migration.SDK.Interfaces; + using System; + + public class InputInvoiceAdditionalData : IInputInvoiceAdditionalData + { + public string Description { get; set; } + public DateTime RegistryDate { get; set; } + public string DuaDocumentId { get; set; } + public bool InvoicesInSpecialRegime { get; set; } + public decimal TaxableIncomeAtCost { get; set; } + public string InitialNumberOfDocument { get; set; } + public string LastNumberOfDocument { get; set; } + public TypeOfDocumentAdditionalDataEnum TypeOfDocument { get; set; } + public FundamentalAdditionalDataEnum Fundamental { get; set; } + public Guid Id { get; set; } + public int Line { get; set; } + public string Source { get; set; } + + public string Identity() => string.Empty; + } +} diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/OutputInvoiceAdditionalData.cs b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/OutputInvoiceAdditionalData.cs new file mode 100644 index 0000000..7831c85 --- /dev/null +++ b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/InvoiceAdditionalData/OutputInvoiceAdditionalData.cs @@ -0,0 +1,25 @@ +namespace a3innuva.TAA.Migration.SDK.Implementations +{ + using a3innuva.TAA.Migration.SDK.Interfaces; + using System; + + public class OutputInvoiceAdditionalData : IOutputInvoiceAdditionalData + { + public string Description { get; set; } + public bool InvoiceByThird { get; set; } + public bool MultipleRecipients { get; set; } + public bool CouponsBonusesOrDiscounts { get; set; } + public bool InvoicesInSpecialRegime { get; set; } + public decimal TaxableIncomeAtCost { get; set; } + public string InitialNumberOfDocument { get; set; } + public string LastNumberOfDocument { get; set; } + public bool NotIncludedInCensus { get; set; } + public TypeOfDocumentAdditionalDataEnum TypeOfDocument { get; set; } + public FundamentalAdditionalDataEnum Fundamental { get; set; } + public Guid Id { get; set; } + public int Line { get; set; } + public string Source { get; set; } + + public string Identity() => string.Empty; + } +} diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/InputInvoice.cs b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/InputInvoice.cs index a7568b9..8ef3cd2 100644 --- a/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/InputInvoice.cs +++ b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/InputInvoice.cs @@ -29,5 +29,6 @@ public string Identity() public decimal? PendingAmount { get; set; } public decimal? SatisfiedAmount { get; set; } public IPayment[] Maturities { get; set; } + public IInputInvoiceAdditionalData AdditionalData { get; set; } } } diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/OutputInvoice.cs b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/OutputInvoice.cs index a7418bb..dc87d84 100644 --- a/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/OutputInvoice.cs +++ b/Implementations/a3innuva.Importia.SDK.Implementations/Entities/Invoices/OutputInvoice.cs @@ -29,5 +29,6 @@ public string Identity() public decimal? PendingAmount { get; set; } public decimal? SatisfiedAmount { get; set; } public ICharge[] Maturities { get; set; } + public IOutputInvoiceAdditionalData AdditionalData { get; set; } } } diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/a3innuva.Importia.SDK.Implementations.csproj b/Implementations/a3innuva.Importia.SDK.Implementations/a3innuva.Importia.SDK.Implementations.csproj index 37ad169..b05077b 100644 --- a/Implementations/a3innuva.Importia.SDK.Implementations/a3innuva.Importia.SDK.Implementations.csproj +++ b/Implementations/a3innuva.Importia.SDK.Implementations/a3innuva.Importia.SDK.Implementations.csproj @@ -4,7 +4,7 @@ netstandard2.0;netstandard2.1;net451;net461;net471;net48;net5.0;netcoreapp3.1;net6.0 a3innuva.TAA.Migration.SDK.Implementations a3innuva.TAA.Migration.SDK.Implementations - 2.13.0 + 2.14.0 true a3innuva.Importia.SDK a3innuva.Importia.SDK.Implementations diff --git a/Implementations/a3innuva.Importia.SDK.Serialization/a3innuva.Importia.SDK.Serialization.csproj b/Implementations/a3innuva.Importia.SDK.Serialization/a3innuva.Importia.SDK.Serialization.csproj index 5de8cda..5d153d4 100644 --- a/Implementations/a3innuva.Importia.SDK.Serialization/a3innuva.Importia.SDK.Serialization.csproj +++ b/Implementations/a3innuva.Importia.SDK.Serialization/a3innuva.Importia.SDK.Serialization.csproj @@ -4,7 +4,7 @@ netstandard2.0;netstandard2.1;net451;net461;net471;net48;net5.0;netcoreapp3.1;net6.0 a3innuva.TAA.Migration.SDK.Serialization a3innuva.TAA.Migration.SDK.Serialization - 2.13.0 + 2.14.0 true a3innuva.Importia.SDK a3innuva.Importia.SDK.Serialization diff --git a/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs b/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs index de56443..f0d48ed 100644 --- a/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs +++ b/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs @@ -20,6 +20,8 @@ public class a3innuvaSerializationBinder: ISerializationBinder typeof(a3innuva.TAA.Migration.SDK.Implementations.OutputInvoiceLine), typeof(a3innuva.TAA.Migration.SDK.Implementations.Payment), typeof(a3innuva.TAA.Migration.SDK.Implementations.Charge), + typeof(a3innuva.TAA.Migration.SDK.Implementations.InputInvoiceAdditionalData), + typeof(a3innuva.TAA.Migration.SDK.Implementations.OutputInvoiceAdditionalData), typeof(a3innuva.TAA.Migration.SDK.Interfaces.IMigrationEntity[]), typeof(a3innuva.TAA.Migration.SDK.Interfaces.IInputInvoiceLine[]), @@ -27,6 +29,8 @@ public class a3innuvaSerializationBinder: ISerializationBinder typeof(a3innuva.TAA.Migration.SDK.Interfaces.IOutputInvoiceLine[]), typeof(a3innuva.TAA.Migration.SDK.Interfaces.IPayment[]), typeof(a3innuva.TAA.Migration.SDK.Interfaces.ICharge[]), + typeof(a3innuva.TAA.Migration.SDK.Interfaces.IInputInvoiceAdditionalData[]), + typeof(a3innuva.TAA.Migration.SDK.Interfaces.IOutputInvoiceAdditionalData[]) }; public Type BindToType(string assemblyName, string typeName) diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IInputInvoice.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IInputInvoice.cs index 6997b3a..22a6ffd 100644 --- a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IInputInvoice.cs +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IInputInvoice.cs @@ -4,5 +4,6 @@ public interface IInputInvoice : IInvoice { IInputInvoiceLine[] Lines { get; set; } IPayment[] Maturities { get; set; } + IInputInvoiceAdditionalData AdditionalData { get; set; } } } diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IOutputInvoice.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IOutputInvoice.cs index 0b80269..0072080 100644 --- a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IOutputInvoice.cs +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/Invoice/IOutputInvoice.cs @@ -4,5 +4,6 @@ public interface IOutputInvoice : IInvoice { IOutputInvoiceLine[] Lines { get; set; } ICharge[] Maturities { get; set; } + IOutputInvoiceAdditionalData AdditionalData { get; set; } } } diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/FundamentalAdditionalDataEnum.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/FundamentalAdditionalDataEnum.cs new file mode 100644 index 0000000..e64ef9a --- /dev/null +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/FundamentalAdditionalDataEnum.cs @@ -0,0 +1,30 @@ +namespace a3innuva.TAA.Migration.SDK.Interfaces +{ + public enum FundamentalAdditionalDataEnum + { + None, + + IssuedNotCorrectiveGeneralRegime, + IssuedNotCorrectiveSpecialRegimeForTravelAgencies, + IssuedNotCorrectiveThirdPartyFeeCollections, + IssuedNotCorrectiveCertificatesOfWorkToThePublicAdministration, + IssuedNotCorrectiveSuccessiveTractOperations, + IssuedNotCorrectiveTravelAgencyServicesAsMediator, + IssuedCorrectiveGeneralRegime, + IssuedCorrectiveSpecialRegimeForTravelAgencies, + IssuedCorrectiveThirdPartyFeeCollections, + IssuedCorrectiveCertificatesOfWorkToThePublicAdministration, + IssuedCorrectiveSuccessiveTractOperations, + IssuedCorrectiveTravelAgencyServicesAsMediator, + + + + InputNotCorrectiveGeneralRegime, + InputNotCorrectiveSpecialRegimeForTravelAgencies, + InputNotCorrectivePurchaseTravelAgencyServicesAsMediator, + InputCorrectiveGeneralRegime, + InputCorrectiveSpecialRegimeForTravelAgencies, + InputCorrectivePurchaseTravelAgencyServicesAsMediator, + InputCorrectiveTravelAgenciesServices + } +} diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IInputInvoiceAdditionalData.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IInputInvoiceAdditionalData.cs new file mode 100644 index 0000000..ff8b0df --- /dev/null +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IInputInvoiceAdditionalData.cs @@ -0,0 +1,43 @@ +namespace a3innuva.TAA.Migration.SDK.Interfaces +{ + using System; + public interface IInputInvoiceAdditionalData : IMigrationEntity, IMigrationSourceInfo + { + /// + /// Description + /// + string Description { get; set;} + /// + /// Date of registry of AEAT + /// + DateTime RegistryDate { get; set; } + /// + /// Dua document id + /// + string DuaDocumentId { get; set; } + /// + /// Invoice in special regime + /// + bool InvoicesInSpecialRegime { get; set; } + /// + /// Taxable income at cost + /// + decimal TaxableIncomeAtCost { get; set; } + /// + /// Initial number of document + /// + string InitialNumberOfDocument { get; set; } + /// + /// Last number of document + /// + string LastNumberOfDocument { get; set; } + /// + /// Type of document additional data + /// + TypeOfDocumentAdditionalDataEnum TypeOfDocument { get; set; } + /// + /// Fundamental additional data + /// + FundamentalAdditionalDataEnum Fundamental { get; set; } + } +} diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IOutputInvoiceAdditionalData.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IOutputInvoiceAdditionalData.cs new file mode 100644 index 0000000..a5d7fd3 --- /dev/null +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/IOutputInvoiceAdditionalData.cs @@ -0,0 +1,51 @@ +namespace a3innuva.TAA.Migration.SDK.Interfaces +{ + using System; + public interface IOutputInvoiceAdditionalData : IMigrationEntity, IMigrationSourceInfo + { + /// + /// Description + /// + string Description { get; set;} + /// + /// Invoice by third + /// + bool InvoiceByThird { get; set; } + /// + /// Multiple recipients + /// + bool MultipleRecipients { get; set; } + /// + /// Coupons, bonuses or discounts + /// + bool CouponsBonusesOrDiscounts { get; set; } + /// + /// Invoice in special regime + /// + bool InvoicesInSpecialRegime { get; set; } + /// + /// Taxable income at cost + /// + decimal TaxableIncomeAtCost { get; set; } + /// + /// Initial number of document + /// + string InitialNumberOfDocument { get; set; } + /// + /// Last number of document + /// + string LastNumberOfDocument { get; set; } + /// + /// Not included in census + /// + bool NotIncludedInCensus { get; set; } + /// + /// Type of document additional data + /// + TypeOfDocumentAdditionalDataEnum TypeOfDocument { get; set; } + /// + /// Fundamental additional data + /// + FundamentalAdditionalDataEnum Fundamental { get; set; } + } +} diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs new file mode 100644 index 0000000..d76e424 --- /dev/null +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs @@ -0,0 +1,27 @@ +namespace a3innuva.TAA.Migration.SDK.Interfaces +{ + public enum TypeOfDocumentAdditionalDataEnum + { + None = 0, + + IssuedNotCorrectiveInvoice = 10, + IssuedNotCorrectiveSimplifiedInvoice = 11, + IssuedNotCorrectiveInvoiceWithoutObligation = 12, + IssuedCorrectiveErrorFundado = 20, + IssuedCorrectiveConcurso = 21, + IssuedCorrectiveDeudaIncobrable = 22, + IssuedCorrectiveResto = 23, + IssuedCorrectiveSimplificadas = 24, + + + + InputNotCorrectiveInvoice = 30, + InputNotCorrectiveSimplifiedInvoice = 0x1F, + InputNotCorrectiveJustificantesContables = 0x20, + InputCorrectiveErrorFundado = 40, + InputCorrectiveConcurso = 41, + InputCorrectiveDeudaIncobrable = 42, + InputCorrectiveResto = 43, + InputCorrectiveSimplificadas = 44 + } +} diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/a3innuva.Importia.SDK.Interfaces.csproj b/Interfaces/a3innuva.Importia.SDK.Interfaces/a3innuva.Importia.SDK.Interfaces.csproj index 57ac317..8bfafe2 100644 --- a/Interfaces/a3innuva.Importia.SDK.Interfaces/a3innuva.Importia.SDK.Interfaces.csproj +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/a3innuva.Importia.SDK.Interfaces.csproj @@ -4,7 +4,7 @@ netstandard2.0;netstandard2.1;net451;net461;net471;net48;net5.0;netcoreapp3.1;net6.0 a3innuva.TAA.Migration.SDK.Interfaces a3innuva.TAA.Migration.SDK.Interfaces - 2.13.0 + 2.14.0 true a3innuva.Importia.SDK a3innuva.Importia.SDK.Interfaces diff --git a/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/SerializationTests.cs b/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/SerializationTests.cs index 38e9d37..e61c26a 100644 --- a/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/SerializationTests.cs +++ b/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/SerializationTests.cs @@ -119,6 +119,113 @@ public void Serialize_with_TypeNameAssemblyFormatHandling_Simple_and_deserialize } + [Fact(DisplayName = "Serialize and deserialize an outputInvoiceAdditionalData migration set")] + public void Serialize_and_deserialize_an_outputInvoiceAdditionalData_migration_set() + { + var set = this.CreateInvoiceAdditionalDataMigrationSet(); + + var json = JsonConvert.SerializeObject(set, + JsonSerializationSettingsUtils.GetSettings(Formatting.Indented)); + + var result = + JsonConvert.DeserializeObject(json, JsonSerializationSettingsUtils.GetSettings(Formatting.Indented)); + + result.Info.VatNumber.Should().Be(set.Info.VatNumber); + + } + + [Fact(DisplayName = "Serialize outputInvoiceAdditionalData with default serialization binder and deserialize with a3innuvaSerializationBinder")] + public void Serialize_outputInvoiceAdditionalData_with_default_serialization_binder_and_deserialize_with_a3innuvaSerializationBinder() + { + var set = this.CreateInvoiceAdditionalDataMigrationSet(); + + var jsonSettingsSerialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.SerializationBinder = new DefaultSerializationBinder(); + + var jsonSettingsDeserialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.SerializationBinder = new a3innuvaSerializationBinder(); + + var json = JsonConvert.SerializeObject(set, jsonSettingsSerialize); + + var result = JsonConvert.DeserializeObject(json, jsonSettingsDeserialize); + + result.Info.VatNumber.Should().Be(set.Info.VatNumber); + + } + + [Fact(DisplayName = "Serialize outputInvoiceAdditionalData with a3innuvaSerializationBinder and deserialize with default serialization binder")] + public void Serialize_outputInvoiceAdditionalData_with_a3innuvaSerializationBinder_and_deserialize_with_default_serialization_binder() + { + var set = this.CreateInvoiceAdditionalDataMigrationSet(); + + var jsonSettingsSerialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.SerializationBinder = new a3innuvaSerializationBinder(); + + var jsonSettingsDeserialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.SerializationBinder = new a3innuvaSerializationBinder(); + + var json = JsonConvert.SerializeObject(set, jsonSettingsSerialize); + + var result = JsonConvert.DeserializeObject(json, jsonSettingsDeserialize); + + result.Info.VatNumber.Should().Be(set.Info.VatNumber); + + } + + [Fact(DisplayName = "Serialize outputInvoiceAdditionalData and deserialize a migration set with TypeNameAssemblyFormatHandling.Full ")] + public void Serialize_outputInvoiceAdditionalData_and_deserialize_a_migration_set_with_TypeNameAssemblyFormatHandling_Full() + { + var set = this.CreateInvoiceAdditionalDataMigrationSet(); + + var jsonSettingsSerialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Full; + + var json = JsonConvert.SerializeObject(set, jsonSettingsSerialize); + + var result = JsonConvert.DeserializeObject(json, jsonSettingsSerialize); + + result.Info.VatNumber.Should().Be(set.Info.VatNumber); + + } + + [Fact(DisplayName = "Serialize outputInvoiceAdditionalData with TypeNameAssemblyFormatHandling.Full and deserialize with TypeNameAssemblyFormatHandling.Simple")] + public void Serialize_outputInvoiceAdditionalData_with_TypeNameAssemblyFormatHandling_Full_and_deserialize_with_TypeNameAssemblyFormatHandling_Simple() + { + var set = this.CreateInvoiceAdditionalDataMigrationSet(); + + var jsonSettingsSerialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Full; + + var jsonSettingsDeserialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; + + var json = JsonConvert.SerializeObject(set, jsonSettingsSerialize); + + var result = JsonConvert.DeserializeObject(json, jsonSettingsDeserialize); + + result.Info.VatNumber.Should().Be(set.Info.VatNumber); + + } + + [Fact(DisplayName = "Serialize outputInvoiceAdditionalData with TypeNameAssemblyFormatHandling.Simple and deserialize with TypeNameAssemblyFormatHandling.Full")] + public void Serialize_outputInvoiceAdditionalData_with_TypeNameAssemblyFormatHandling_Simple_and_deserialize_with_TypeNameAssemblyFormatHandling_Full() + { + var set = this.CreateInvoiceAdditionalDataMigrationSet(); + + var jsonSettingsSerialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; + + var jsonSettingsDeserialize = JsonSerializationSettingsUtils.GetSettings(Formatting.Indented); + jsonSettingsSerialize.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Full; + + var json = JsonConvert.SerializeObject(set, jsonSettingsSerialize); + + var result = JsonConvert.DeserializeObject(json, jsonSettingsDeserialize); + + result.Info.VatNumber.Should().Be(set.Info.VatNumber); + + } + [Fact(DisplayName = "Check serialization options")] public void Check_serialization_options() { @@ -162,5 +269,47 @@ private IMigrationSet CreateMigrationSet() return set; } + + private IMigrationSet CreateInvoiceAdditionalDataMigrationSet() + { + IMigrationInfo info = new MigrationInfo() + { + FileName = "none", + Origin = MigrationOrigin.Eco, + Type = MigrationType.OutputInvoice, + VatNumber = "336548M", + Version = "2.0" + }; + + List entities = new List() + { + new OutputInvoice() + { + Id = Guid.NewGuid(), + AdditionalData = new OutputInvoiceAdditionalData(){ + CouponsBonusesOrDiscounts = true, + Description = "desc", + Fundamental = FundamentalAdditionalDataEnum.IssuedNotCorrectiveGeneralRegime, + Id = Guid.NewGuid(), + InitialNumberOfDocument = "10", + LastNumberOfDocument = "20", + InvoiceByThird = true, + InvoicesInSpecialRegime = true, + MultipleRecipients = true, + NotIncludedInCensus = true, + TaxableIncomeAtCost = 10, + TypeOfDocument = TypeOfDocumentAdditionalDataEnum.IssuedNotCorrectiveInvoiceWithoutObligation + } + } + }; + + IMigrationSet set = new MigrationSet() + { + Info = info, + Entities = entities.ToArray() + }; + + return set; + } } } diff --git a/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs b/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs index b692ecf..73ad7c1 100644 --- a/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs +++ b/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs @@ -17,7 +17,7 @@ public a3innuvaSerializationBinderTests() [Fact(DisplayName = "Check number bindings")] public void Check_number_bindings() { - this.binder.KnownTypes.Count.Should().Be(17); + this.binder.KnownTypes.Count.Should().Be(21); } [Fact(DisplayName = "Check bindings")] @@ -45,6 +45,10 @@ public void Check_bindings() x.FullName == typeof(a3innuva.TAA.Migration.SDK.Implementations.Payment).FullName); this.binder.KnownTypes.Should().ContainSingle(x => x.FullName == typeof(a3innuva.TAA.Migration.SDK.Implementations.Charge).FullName); + this.binder.KnownTypes.Should().ContainSingle(x => + x.FullName == typeof(a3innuva.TAA.Migration.SDK.Implementations.InputInvoiceAdditionalData).FullName); + this.binder.KnownTypes.Should().ContainSingle(x => + x.FullName == typeof(a3innuva.TAA.Migration.SDK.Implementations.InputInvoiceAdditionalData).FullName); this.binder.KnownTypes.Should().ContainSingle(x => x.FullName == typeof(a3innuva.TAA.Migration.SDK.Interfaces.IMigrationEntity[]).FullName); this.binder.KnownTypes.Should().ContainSingle(x => From dc78821632594bc9141ae8e447e2dc7ca7ae6f0f Mon Sep 17 00:00:00 2001 From: "Romero Herreros, Alberto" Date: Mon, 13 Dec 2021 21:32:18 +0100 Subject: [PATCH 2/5] =?UTF-8?q?fix=20serializaci=C3=B3n=20additionalData?= =?UTF-8?q?=20y=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../a3innuvaSerializationBinder.cs | 4 +--- .../a3innuvaSerializationBinderTests.cs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs b/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs index f0d48ed..38fb16f 100644 --- a/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs +++ b/Implementations/a3innuva.Importia.SDK.Serialization/a3innuvaSerializationBinder.cs @@ -28,9 +28,7 @@ public class a3innuvaSerializationBinder: ISerializationBinder typeof(a3innuva.TAA.Migration.SDK.Interfaces.IJournalLine[]), typeof(a3innuva.TAA.Migration.SDK.Interfaces.IOutputInvoiceLine[]), typeof(a3innuva.TAA.Migration.SDK.Interfaces.IPayment[]), - typeof(a3innuva.TAA.Migration.SDK.Interfaces.ICharge[]), - typeof(a3innuva.TAA.Migration.SDK.Interfaces.IInputInvoiceAdditionalData[]), - typeof(a3innuva.TAA.Migration.SDK.Interfaces.IOutputInvoiceAdditionalData[]) + typeof(a3innuva.TAA.Migration.SDK.Interfaces.ICharge[]) }; public Type BindToType(string assemblyName, string typeName) diff --git a/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs b/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs index 73ad7c1..d783689 100644 --- a/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs +++ b/Tests/a3innuva.TAA.Migration.SDK.Serialization.Tests/a3innuvaSerializationBinderTests.cs @@ -17,7 +17,7 @@ public a3innuvaSerializationBinderTests() [Fact(DisplayName = "Check number bindings")] public void Check_number_bindings() { - this.binder.KnownTypes.Count.Should().Be(21); + this.binder.KnownTypes.Count.Should().Be(19); } [Fact(DisplayName = "Check bindings")] From 138e0967ec6a3fa410d7e53a7d703ac547aa8a85 Mon Sep 17 00:00:00 2001 From: "Romero Herreros, Alberto" Date: Mon, 13 Dec 2021 22:01:17 +0100 Subject: [PATCH 3/5] fix hexadecimal en enumerado --- .../InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs index d76e424..30db379 100644 --- a/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs +++ b/Interfaces/a3innuva.Importia.SDK.Interfaces/Entities/InvoiceAdditionalData/TypeOfDocumentAdditionalDataEnum.cs @@ -16,8 +16,8 @@ public enum TypeOfDocumentAdditionalDataEnum InputNotCorrectiveInvoice = 30, - InputNotCorrectiveSimplifiedInvoice = 0x1F, - InputNotCorrectiveJustificantesContables = 0x20, + InputNotCorrectiveSimplifiedInvoice = 31, + InputNotCorrectiveJustificantesContables = 32, InputCorrectiveErrorFundado = 40, InputCorrectiveConcurso = 41, InputCorrectiveDeudaIncobrable = 42, From 282f06416b14513bd6636993d35e7bab0c90dfe0 Mon Sep 17 00:00:00 2001 From: "Romero Herreros, Alberto" Date: Mon, 13 Dec 2021 22:46:38 +0100 Subject: [PATCH 4/5] Validaciones additionalData y tests unitarios --- .../InputInvoiceAdditionalDataValidation.cs | 18 ++++ .../OutputInvoiceAdditionalDataValidation.cs | 16 +++ ...putInvoiceAdditionalDataValidationTests.cs | 101 ++++++++++++++++++ ...putInvoiceAdditionalDataValidationTests.cs | 89 +++++++++++++++ 4 files changed, 224 insertions(+) create mode 100644 Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/InputInvoiceAdditionalDataValidation.cs create mode 100644 Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/OutputInvoiceAdditionalDataValidation.cs create mode 100644 Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/InputInvoiceAdditionalDataValidationTests.cs create mode 100644 Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/OutputInvoiceAdditionalDataValidationTests.cs diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/InputInvoiceAdditionalDataValidation.cs b/Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/InputInvoiceAdditionalDataValidation.cs new file mode 100644 index 0000000..aee76ee --- /dev/null +++ b/Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/InputInvoiceAdditionalDataValidation.cs @@ -0,0 +1,18 @@ +namespace a3innuva.TAA.Migration.SDK.Implementations +{ + using a3innuva.TAA.Migration.SDK.Interfaces; + public class InputInvoiceAdditionalDataValidation : Validation + { + protected override void SetupValidations() + { + this.CreateRule(x => this.Validate(x.Id), "Id"); + + this.CreateRule(x => x.Description.Length <= 500, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Descripción'")); + + this.CreateRule(x => x.DuaDocumentId.Length <= 18, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Número de DUA'")); + + this.CreateRule(x => x.InitialNumberOfDocument.Length <= 60, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Número de documento inicial'")); + this.CreateRule(x => x.LastNumberOfDocument.Length <= 60, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Número de documento final'")); + } + } +} diff --git a/Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/OutputInvoiceAdditionalDataValidation.cs b/Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/OutputInvoiceAdditionalDataValidation.cs new file mode 100644 index 0000000..c59f367 --- /dev/null +++ b/Implementations/a3innuva.Importia.SDK.Implementations/Validations/InvoiceAdditionalData/OutputInvoiceAdditionalDataValidation.cs @@ -0,0 +1,16 @@ +namespace a3innuva.TAA.Migration.SDK.Implementations +{ + using a3innuva.TAA.Migration.SDK.Interfaces; + public class OutputInvoiceAdditionalDataValidation : Validation + { + protected override void SetupValidations() + { + this.CreateRule(x => this.Validate(x.Id), "Id"); + + this.CreateRule(x => x.Description.Length <= 500, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Descripción'")); + + this.CreateRule(x => x.InitialNumberOfDocument.Length <= 60, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Número de documento inicial'")); + this.CreateRule(x => x.LastNumberOfDocument.Length <= 60, this.ReplaceInMessage(ValidationMessages.InvalidLength, "'Número de documento final'")); + } + } +} diff --git a/Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/InputInvoiceAdditionalDataValidationTests.cs b/Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/InputInvoiceAdditionalDataValidationTests.cs new file mode 100644 index 0000000..45f5c0d --- /dev/null +++ b/Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/InputInvoiceAdditionalDataValidationTests.cs @@ -0,0 +1,101 @@ +namespace a3innuva.TAA.Migration.SDK.Implementations.Tests +{ + using a3innuva.TAA.Migration.SDK.Interfaces; + using FluentAssertions; + using System; + using System.Linq; + using Xunit; + + [Trait("Unit test", "InputInvoiceAdditionalDataValidation")] + public class InputInvoiceAdditionalDataValidationTests + { + private InputInvoiceAdditionalDataValidation validation; + + public InputInvoiceAdditionalDataValidationTests() + { + this.validation = new InputInvoiceAdditionalDataValidation(); + } + + ~InputInvoiceAdditionalDataValidationTests() + { + this.validation = null; + } + + [Fact(DisplayName = "Validate succeed")] + public void Validate_succeed() + { + IInputInvoiceAdditionalData entity = this.CreateEntity(); + + var errors = this.validation.Validate(entity).ToList(); + + errors.Count.Should().Be(0); + } + + [Fact(DisplayName = "Validate id failed")] + public void Validate_id_failed() + { + IInputInvoiceAdditionalData entity = this.CreateEntity(); + entity.Id = Guid.Empty; + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "Id"); + } + + [Fact(DisplayName = "Validate description length failed")] + public void Validate_description_length_failed() + { + IInputInvoiceAdditionalData entity = this.CreateEntity(); + entity.Description = "1".PadLeft(501); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Descripción' tiene longitud incorrecta"); + } + + [Fact(DisplayName = "Validate DUA length failed")] + public void Validate_DUA_length_failed() + { + IInputInvoiceAdditionalData entity = this.CreateEntity(); + entity.DuaDocumentId = "1".PadLeft(19); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Número de DUA' tiene longitud incorrecta"); + } + + [Fact(DisplayName = "Validate initial invoice number length failed")] + public void Validate_initial_invoice_number_length_failed() + { + IInputInvoiceAdditionalData entity = this.CreateEntity(); + entity.InitialNumberOfDocument = "1".PadLeft(61); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Número de documento inicial' tiene longitud incorrecta"); + } + + [Fact(DisplayName = "Validate last invoice number length failed")] + public void Validate_last_invoice_number_length_failed() + { + IInputInvoiceAdditionalData entity = this.CreateEntity(); + entity.LastNumberOfDocument = "1".PadLeft(61); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Número de documento final' tiene longitud incorrecta"); + } + + private IInputInvoiceAdditionalData CreateEntity() + { + return new InputInvoiceAdditionalData() + { + Id = Guid.NewGuid(), + Description = "desc", + DuaDocumentId = "Dua", + InitialNumberOfDocument = "1", + LastNumberOfDocument = "2" + }; + } + } +} diff --git a/Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/OutputInvoiceAdditionalDataValidationTests.cs b/Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/OutputInvoiceAdditionalDataValidationTests.cs new file mode 100644 index 0000000..d9a2e8f --- /dev/null +++ b/Tests/a3innuva.TAA.Migration.SDK.Implementations.Tests/Validations/OutputInvoiceAdditionalDataValidationTests.cs @@ -0,0 +1,89 @@ +namespace a3innuva.TAA.Migration.SDK.Implementations.Tests +{ + using a3innuva.TAA.Migration.SDK.Interfaces; + using FluentAssertions; + using System; + using System.Linq; + using Xunit; + + [Trait("Unit test", "OutputInvoiceAdditionalDataValidation")] + public class OutputInvoiceAdditionalDataValidationTests + { + private OutputInvoiceAdditionalDataValidation validation; + + public OutputInvoiceAdditionalDataValidationTests() + { + this.validation = new OutputInvoiceAdditionalDataValidation(); + } + + ~OutputInvoiceAdditionalDataValidationTests() + { + this.validation = null; + } + + [Fact(DisplayName = "Validate succeed")] + public void Validate_succeed() + { + IOutputInvoiceAdditionalData entity = this.CreateEntity(); + + var errors = this.validation.Validate(entity).ToList(); + + errors.Count.Should().Be(0); + } + + [Fact(DisplayName = "Validate id failed")] + public void Validate_id_failed() + { + IOutputInvoiceAdditionalData entity = this.CreateEntity(); + entity.Id = Guid.Empty; + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "Id"); + } + + [Fact(DisplayName = "Validate description length failed")] + public void Validate_description_length_failed() + { + IOutputInvoiceAdditionalData entity = this.CreateEntity(); + entity.Description = "1".PadLeft(501); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Descripción' tiene longitud incorrecta"); + } + + [Fact(DisplayName = "Validate initial invoice number length failed")] + public void Validate_initial_invoice_number_length_failed() + { + IOutputInvoiceAdditionalData entity = this.CreateEntity(); + entity.InitialNumberOfDocument = "1".PadLeft(61); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Número de documento inicial' tiene longitud incorrecta"); + } + + [Fact(DisplayName = "Validate last invoice number length failed")] + public void Validate_last_invoice_number_length_failed() + { + IOutputInvoiceAdditionalData entity = this.CreateEntity(); + entity.LastNumberOfDocument = "1".PadLeft(61); + + var errors = this.validation.Validate(entity); + + errors.Should().Contain(x => !x.IsValid && x.Code == "El campo 'Número de documento final' tiene longitud incorrecta"); + } + + private IOutputInvoiceAdditionalData CreateEntity() + { + return new OutputInvoiceAdditionalData() + { + Id = Guid.NewGuid(), + Description = "desc", + InitialNumberOfDocument = "1", + LastNumberOfDocument = "2" + }; + } + } +} From f02c39149bfd5779f60222493c28cd54fbfc404b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Carretero?= Date: Tue, 14 Dec 2021 08:02:01 +0100 Subject: [PATCH 5/5] Fix codeql build --- .github/workflows/codeql-analysis.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ace0f1b..debf8be 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -49,8 +49,14 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 6.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --configuration Release --no-restore --framework net6.0 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl