diff --git a/src/Mindee/Parsing/Common/AmountField.cs b/src/Mindee/Parsing/Common/AmountField.cs index 720db80a..932e22ee 100644 --- a/src/Mindee/Parsing/Common/AmountField.cs +++ b/src/Mindee/Parsing/Common/AmountField.cs @@ -19,7 +19,7 @@ public class AmountField : BaseField /// public override string ToString() { - return Value?.ToString("0.00"); + return Value?.ToString(".00###"); } } } diff --git a/src/Mindee/Parsing/Common/Locale.cs b/src/Mindee/Parsing/Common/Locale.cs index 1e6683c1..f9bc8f6e 100644 --- a/src/Mindee/Parsing/Common/Locale.cs +++ b/src/Mindee/Parsing/Common/Locale.cs @@ -8,6 +8,8 @@ namespace Mindee.Parsing.Common /// public class Locale { + private string _language; + /// /// The confidence about the zone of the value extracted. /// A value from 0 to 1. @@ -28,7 +30,18 @@ public class Locale /// /// fr [JsonPropertyName("language")] - public string Language { get; set; } + public string Language + { + get + { + return _language; + } + set + { + _language = value; + Value = value; + } + } /// /// The country which has been detected. @@ -37,6 +50,13 @@ public class Locale [JsonPropertyName("country")] public string Country { get; set; } + /// + /// Concatenation of lang and country codes. + /// + /// en-GB + [JsonPropertyName("value")] + public string Value { get; set; } + /// /// /// @@ -45,6 +65,10 @@ public override string ToString() { StringBuilder result = new StringBuilder(); + if (!string.IsNullOrWhiteSpace(Value)) + { + result.Append($"{Value}; "); + } if (!string.IsNullOrWhiteSpace(Language)) { result.Append($"{Language}; "); diff --git a/src/Mindee/Parsing/Common/SummaryHelper.cs b/src/Mindee/Parsing/Common/SummaryHelper.cs new file mode 100644 index 00000000..80e5550c --- /dev/null +++ b/src/Mindee/Parsing/Common/SummaryHelper.cs @@ -0,0 +1,14 @@ +using System.Text.RegularExpressions; + +namespace Mindee.Parsing.Common +{ + internal static class SummaryHelper + { + public static string Clean(string summary) + { + Regex cleanSpace = new Regex(" \n", RegexOptions.Multiline); + + return cleanSpace.Replace(summary, "\n"); + } + } +} diff --git a/src/Mindee/Parsing/Common/Tax.cs b/src/Mindee/Parsing/Common/Tax.cs index 0872f49f..140eb501 100644 --- a/src/Mindee/Parsing/Common/Tax.cs +++ b/src/Mindee/Parsing/Common/Tax.cs @@ -49,7 +49,7 @@ public override string ToString() if (Rate != null) { - result.Append($" {Rate}%"); + result.Append($" {Rate?.ToString("0.00")}%"); } if (Code != null) diff --git a/src/Mindee/Parsing/Cropper/CropperV1Prediction.cs b/src/Mindee/Parsing/Cropper/CropperV1Prediction.cs index 86bafb37..b6093741 100644 --- a/src/Mindee/Parsing/Cropper/CropperV1Prediction.cs +++ b/src/Mindee/Parsing/Cropper/CropperV1Prediction.cs @@ -28,9 +28,7 @@ public override string ToString() result.Append($"Cropping: {string.Join("\n ", Cropping?.Select(c => c))}\n"); result.Append("------------------------\n"); - Regex cleanSpace = new Regex(" \n", RegexOptions.Multiline); - - return cleanSpace.Replace(result.ToString(), "\n"); + return SummaryHelper.Clean(result.ToString()); } } } diff --git a/src/Mindee/Parsing/Invoice/InvoiceLineItem.cs b/src/Mindee/Parsing/Invoice/InvoiceLineItem.cs index 86a32252..35a79e54 100644 --- a/src/Mindee/Parsing/Invoice/InvoiceLineItem.cs +++ b/src/Mindee/Parsing/Invoice/InvoiceLineItem.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Text; using System.Text.Json.Serialization; using Mindee.Parsing.Common; @@ -77,11 +76,11 @@ public sealed class InvoiceLineItem : FinancialPredictionBase public override string ToString() { string productCode = ProductCode?.ToString() ?? ""; - string quantity = Quantity?.ToString() ?? ""; - string unitPrice = UnitPrice?.ToString() ?? ""; - string totalAmount = TotalAmount?.ToString() ?? ""; - string tax = TotalAmount?.ToString() ?? ""; - tax += TaxRate != null ? $" ({TaxRate} %)" : ""; + string quantity = Quantity?.ToString(".00###") ?? ""; + string unitPrice = UnitPrice?.ToString(".00###") ?? ""; + string totalAmount = TotalAmount?.ToString(".00###") ?? ""; + string tax = TaxAmount?.ToString(".00###") ?? ""; + tax += TaxRate != null ? $" ({TaxRate?.ToString(".00")}%)" : ""; string description = Description ?? ""; if (description.Length > 32) { @@ -93,7 +92,7 @@ public override string ToString() quantity.PadRight(6), unitPrice.PadRight(7), totalAmount.PadRight(8), - tax.PadRight(14), + tax.PadRight(16), description ); } diff --git a/src/Mindee/Parsing/Invoice/InvoiceV3Prediction.cs b/src/Mindee/Parsing/Invoice/InvoiceV3Prediction.cs index 4e0cb6dc..74e90375 100644 --- a/src/Mindee/Parsing/Invoice/InvoiceV3Prediction.cs +++ b/src/Mindee/Parsing/Invoice/InvoiceV3Prediction.cs @@ -99,15 +99,15 @@ public override string ToString() result.Append($"Customer name: {Customer.Value}\n"); result.Append($"Customer company registration: {string.Join("; ", CustomerCompanyRegistrations.Select(c => c.Value))}\n"); result.Append($"Customer address: {string.Join("; ", CustomerAddress.Value)}\n"); - result.Append($"Payment details: {string.Join("\n ", PaymentDetails.Select(p => p))}\n"); - result.Append($"Company numbers: {string.Join("\n ", CompanyRegistrations.Select(c => c.Value))}\n"); + result.Append($"Payment details: {string.Join("; ", PaymentDetails.Select(p => p))}\n"); + result.Append($"Company numbers: {string.Join("; ", CompanyRegistrations.Select(c => c.Value))}\n"); result.Append($"Taxes: {string.Join("\n ", Taxes.Select(t => t))}\n"); result.Append($"Total taxes: {TotalTaxes}\n"); result.Append($"Locale: {Locale}\n"); result.Append("----------------------\n"); - return result.ToString(); + return SummaryHelper.Clean(result.ToString()); } } } diff --git a/src/Mindee/Parsing/Invoice/InvoiceV4Prediction.cs b/src/Mindee/Parsing/Invoice/InvoiceV4Prediction.cs index 7435bd09..28199ddc 100644 --- a/src/Mindee/Parsing/Invoice/InvoiceV4Prediction.cs +++ b/src/Mindee/Parsing/Invoice/InvoiceV4Prediction.cs @@ -98,30 +98,30 @@ public override string ToString() if (LineItems.Any()) { lineItems = - "\n Code | QTY | Price | Amount | Tax (Rate) | Description\n "; + "\n Code | QTY | Price | Amount | Tax (Rate) | Description\n "; lineItems += string.Join("\n ", LineItems.Select(item => item.ToString())); } - StringBuilder result = new StringBuilder("----- Invoice v4 -----\n"); - result.Append($"Invoice number: {InvoiceNumber.Value}\n"); + StringBuilder result = new StringBuilder("----- Invoice V4 -----\n"); result.Append($"Locale: {Locale}\n"); + result.Append($"Invoice number: {InvoiceNumber.Value}\n"); result.Append($"Invoice date: {Date.Value}\n"); result.Append($"Invoice due date: {DueDate.Value}\n"); result.Append($"Supplier name: {SupplierName.Value}\n"); result.Append($"Supplier address: {SupplierAddress.Value}\n"); - result.Append($"Supplier company registrations: {string.Join("\n ", SupplierCompanyRegistrations.Select(c => c.Value))}\n"); - result.Append($"Supplier payment details: {string.Join("\n ", SupplierPaymentDetails.Select(p => p))}\n"); + result.Append($"Supplier company registrations: {string.Join("; ", SupplierCompanyRegistrations.Select(c => c.Value))}\n"); + result.Append($"Supplier payment details: {string.Join("; ", SupplierPaymentDetails.Select(p => p))}\n"); result.Append($"Customer name: {CustomerName.Value}\n"); result.Append($"Customer company registrations: {string.Join("; ", CustomerCompanyRegistrations.Select(c => c.Value))}\n"); result.Append($"Customer address: {string.Join("; ", CustomerAddress.Value)}\n"); + result.Append($"Line Items: {lineItems}\n"); result.Append($"Taxes: {string.Join("\n ", Taxes.Select(t => t))}\n"); - result.Append($"Line items: {lineItems}\n"); result.Append($"Total taxes: {TotalTaxes}\n"); - result.Append($"Total amount including taxes: {TotalAmount.Value}\n"); result.Append($"Total amount excluding taxes: {TotalNet.Value}\n"); - result.Append("----------------------"); + result.Append($"Total amount including taxes: {TotalAmount.Value}\n"); + result.Append("----------------------\n"); - return result.ToString(); + return SummaryHelper.Clean(result.ToString()); } } } diff --git a/src/Mindee/Parsing/Receipt/ReceiptV4Prediction.cs b/src/Mindee/Parsing/Receipt/ReceiptV4Prediction.cs index 07423da6..925d2a3d 100644 --- a/src/Mindee/Parsing/Receipt/ReceiptV4Prediction.cs +++ b/src/Mindee/Parsing/Receipt/ReceiptV4Prediction.cs @@ -58,21 +58,21 @@ public sealed class ReceiptV4Prediction : FinancialPredictionBase /// public override string ToString() { - StringBuilder result = new StringBuilder("-----Receipt data-----\n"); - result.Append($"Total amount including taxes: {TotalAmount}\n"); - result.Append($"Total amount excluding taxes: {TotalNet}\n"); + StringBuilder result = new StringBuilder("----- Receipt V4 -----\n"); + result.Append($"Total amount: {TotalAmount}\n"); + result.Append($"Total net: {TotalNet}\n"); result.Append($"Tip: {Tip}\n"); result.Append($"Date: {Date.Value}\n"); result.Append($"Category: {Category.Value}\n"); result.Append($"Time: {Time.Value}\n"); - result.Append($"Merchant name: {Supplier.Value}\n"); + result.Append($"Supplier name: {Supplier.Value}\n"); result.Append($"Taxes: {string.Join("\n ", Taxes.Select(t => t))}\n"); result.Append($"Total taxes: {TotalTax}\n"); result.Append($"Locale: {Locale}\n"); - result.Append("----------------------"); + result.Append("----------------------\n"); - return result.ToString(); + return SummaryHelper.Clean(result.ToString()); } } } diff --git a/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV3Test.cs b/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV3Test.cs index cfc45866..9addeaf8 100644 --- a/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV3Test.cs +++ b/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV3Test.cs @@ -6,6 +6,38 @@ namespace Mindee.UnitTests.Parsing.Invoice [Trait("Category", "Invoice V3")] public class InvoiceV3Test { + [Fact] + public async Task Predict_CheckSummary() + { + var mindeeAPi = GetMindeeApiForInvoice(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/invoice/response_v3/doc_to_string.txt"); + + var indexFilename = expected.IndexOf("Filename"); + var indexEOL = expected.IndexOf("\n", indexFilename); + + Assert.Equal( + expected.Remove(indexFilename, indexEOL - indexFilename + 1), + prediction.Inference.Prediction.ToString()); + } + + [Fact] + public async Task Predict_CheckSummary_WithMultiplePages() + { + var mindeeAPi = GetMindeeApiForInvoice(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/invoice/response_v3/page0_to_string.txt"); + + var indexFilename = expected.IndexOf("Filename"); + var indexEOL = expected.IndexOf("\n", indexFilename); + + Assert.Equal( + expected.Remove(indexFilename, indexEOL - indexFilename + 1), + prediction.Inference.Pages.First().Prediction.ToString()); + } + [Fact] public async Task Predict_MustSuccessForCustomer() { diff --git a/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV4Test.cs b/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV4Test.cs index 7f2c44d4..b90262de 100644 --- a/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV4Test.cs +++ b/tests/Mindee.UnitTests/Parsing/Invoice/InvoiceV4Test.cs @@ -6,6 +6,38 @@ namespace Mindee.UnitTests.Parsing.Invoice [Trait("Category", "Invoice V4")] public class InvoiceV4Test { + [Fact] + public async Task Predict_CheckSummary() + { + var mindeeAPi = GetMindeeApiForInvoice(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/invoice/response_v4/doc_to_string.txt"); + + var indexFilename = expected.IndexOf("Filename"); + var indexEOL = expected.IndexOf("\n", indexFilename); + + Assert.Equal( + expected.Remove(indexFilename, indexEOL - indexFilename + 1), + prediction.Inference.Prediction.ToString()); + } + + [Fact] + public async Task Predict_CheckSummary_WithMultiplePages() + { + var mindeeAPi = GetMindeeApiForInvoice(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/invoice/response_v4/page0_to_string.txt"); + + var indexFilename = expected.IndexOf("Filename"); + var indexEOL = expected.IndexOf("\n", indexFilename); + + Assert.Equal( + expected.Remove(indexFilename, indexEOL - indexFilename + 1), + prediction.Inference.Pages.First().Prediction.ToString()); + } + [Fact] public async Task Predict_MustSuccessForInvoiceNumber() { diff --git a/tests/Mindee.UnitTests/Parsing/Receipt/ReceiptV4Test.cs b/tests/Mindee.UnitTests/Parsing/Receipt/ReceiptV4Test.cs index 3c6da182..4e252ece 100644 --- a/tests/Mindee.UnitTests/Parsing/Receipt/ReceiptV4Test.cs +++ b/tests/Mindee.UnitTests/Parsing/Receipt/ReceiptV4Test.cs @@ -6,15 +6,36 @@ namespace Mindee.UnitTests.Parsing.Receipt [Trait("Category", "Receipt V4")] public class ReceiptV4Test { - [Fact(Skip = "Waiting for the summary format update.")] - public async Task Predict_MustSuccess() + [Fact] + public async Task Predict_CheckSummary() { var mindeeAPi = GetMindeeApiForReceipt(); var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); var expected = File.ReadAllText("Resources/receipt/response_v4/doc_to_string.txt"); - Assert.Equal(expected, prediction.ToString()); + var indexFilename = expected.IndexOf("Filename"); + var indexEOL = expected.IndexOf("\n", indexFilename); + + Assert.Equal( + expected.Remove(indexFilename, indexEOL - indexFilename + 1), + prediction.Inference.Prediction.ToString()); + } + + [Fact] + public async Task Predict_CheckSummary_WithMultiplePages() + { + var mindeeAPi = GetMindeeApiForReceipt(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/receipt/response_v4/page0_to_string.txt"); + + var indexFilename = expected.IndexOf("Filename"); + var indexEOL = expected.IndexOf("\n", indexFilename); + + Assert.Equal( + expected.Remove(indexFilename, indexEOL - indexFilename + 1), + prediction.Inference.Pages.First().Prediction.ToString()); } [Fact] diff --git a/tests/resources b/tests/resources index 739128c6..7290bb01 160000 --- a/tests/resources +++ b/tests/resources @@ -1 +1 @@ -Subproject commit 739128c697362df42710dce47075cac8101caac5 +Subproject commit 7290bb01ace842b90e150ee68f533776d7527471