diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs deleted file mode 100644 index 84bfdde9d117..000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// The set of extension methods for the class. - /// - public static class ReceiptExtensions - { - /// - /// Converts a instance with an "en-US" - /// into a . - /// - /// The instance that this method was invoked on. - /// A new instance generated from the original receipt. - public static USReceipt AsUSReceipt(this RecognizedReceipt receipt) - { - return new USReceipt(receipt); - } - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptType.cs similarity index 89% rename from sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs rename to sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptType.cs index 232fd0680626..aca5900ecb80 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptType.cs @@ -4,9 +4,9 @@ namespace Azure.AI.FormRecognizer.Models { /// - /// The receipt type of recognized instances. + /// The receipt type of instances. /// - public enum USReceiptType + public enum ReceiptType { /// /// Used for receipts whose type couldn't be recognized. diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs index cce18bcd9edf..9a46c9eb17f2 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs @@ -13,23 +13,14 @@ public class RecognizedReceipt { internal RecognizedReceipt(DocumentResult_internal documentResult, IReadOnlyList pageResults, IReadOnlyList readResults) { - // Hard-coding locale for v2.0. - ReceiptLocale = "en-US"; RecognizedForm = new RecognizedForm(documentResult, pageResults, readResults); } internal RecognizedReceipt(RecognizedReceipt receipt) { - ReceiptLocale = receipt.ReceiptLocale; RecognizedForm = receipt.RecognizedForm; } - /// - /// A culture name representing the location in which the receipt has been issued. Currently only - /// "en-US" is supported. - /// - public string ReceiptLocale { get; internal set; } - /// /// Contains detailed form information about the recognized receipt, such as fields, form type and /// form content elements. diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs deleted file mode 100644 index a0d50e153406..000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// Represents a receipt recognized from the input document and provides members - /// for accessing common fields present in US sales receipts. - /// - public class USReceipt : RecognizedReceipt - { - internal USReceipt(RecognizedReceipt receipt) - : base(receipt) - { - float receiptTypeConfidence; - ReceiptType = ConvertUSReceiptType(out receiptTypeConfidence); - ReceiptTypeConfidence = receiptTypeConfidence; - - MerchantAddress = ConvertStringField("MerchantAddress", RecognizedForm.Fields); - MerchantName = ConvertStringField("MerchantName", RecognizedForm.Fields); - MerchantPhoneNumber = ConvertPhoneNumberField("MerchantPhoneNumber", RecognizedForm.Fields); - Subtotal = ConvertFloatField("Subtotal", RecognizedForm.Fields); - Tax = ConvertFloatField("Tax", RecognizedForm.Fields); - Tip = ConvertFloatField("Tip", RecognizedForm.Fields); - Total = ConvertFloatField("Total", RecognizedForm.Fields); - TransactionDate = ConvertDateField("TransactionDate", RecognizedForm.Fields); - TransactionTime = ConvertTimeField("TransactionTime", RecognizedForm.Fields); - - Items = ConvertReceiptItems(); - } - - /// - /// The type of receipt the service identified the submitted receipt to be. - /// - public USReceiptType ReceiptType { get; internal set; } - - /// - /// Measures the degree of certainty of the attribution. Value - /// is between [0.0, 1.0]. - /// - public float ReceiptTypeConfidence { get; internal set; } - - /// - /// A list of purchased items present in the recognized receipt. - /// - // TODO: Can we make this nullable in case a value isn't present or - // isn't read by the learner? - // https://github.com/Azure/azure-sdk-for-net/issues/10361 - public IReadOnlyList Items { get; internal set; } - - /// - /// The merchant's address. - /// - public FormField MerchantAddress { get; internal set; } - - /// - /// The merchant's name. - /// - public FormField MerchantName { get; internal set; } - - /// - /// The merchant's phone number. - /// - public FormField MerchantPhoneNumber { get; internal set; } - - /// - /// The subtotal price. - /// - public FormField Subtotal { get; internal set; } - - /// - /// The tax price. - /// - public FormField Tax { get; internal set; } - - /// - /// The tip price. - /// - public FormField Tip { get; internal set; } - - /// - /// The total price. - /// - public FormField Total { get; internal set; } - - /// - /// The transaction date. - /// - public FormField TransactionDate { get; internal set; } - - /// - /// The transaction time. - /// - public FormField TransactionTime { get; internal set; } - - private USReceiptType ConvertUSReceiptType(out float receiptTypeConfidence) - { - USReceiptType receiptType = USReceiptType.Unrecognized; - receiptTypeConfidence = Constants.DefaultConfidenceValue; - - FormField value; - if (RecognizedForm.Fields.TryGetValue("ReceiptType", out value)) - { - receiptTypeConfidence = value.Confidence; - - receiptType = value.Value.AsString() switch - { - "Itemized" => USReceiptType.Itemized, - "CreditCard" => USReceiptType.CreditCard, - "Gas" => USReceiptType.Gas, - "Parking" => USReceiptType.Parking, - "Other" => USReceiptType.Other, - _ => USReceiptType.Unrecognized, - }; - } - - return receiptType; - } - - private IReadOnlyList ConvertReceiptItems() - { - List items = new List(); - - FormField value; - if (RecognizedForm.Fields.TryGetValue("Items", out value)) - { - Debug.Assert(value.Value.Type == FieldValueType.List); - - IReadOnlyList itemList = value.Value.AsList(); - foreach (var item in itemList) - { - Debug.Assert(item.Value.Type == FieldValueType.Dictionary); - - IReadOnlyDictionary itemFields = item.Value.AsDictionary(); - - items.Add(new USReceiptItem( - ConvertStringField("Name", itemFields), - ConvertFloatField("Quantity", itemFields), - ConvertFloatField("Price", itemFields), - ConvertFloatField("TotalPrice", itemFields) - )); - } - } - - return items; - } - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs deleted file mode 100644 index 1e82a7bf3fa0..000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// Represents an item in a recognized US sales receipt. - /// - public class USReceiptItem - { - internal USReceiptItem(FormField name, FormField quantity, FormField price, FormField totalPrice) - { - Name = name; - Quantity = quantity; - Price = price; - TotalPrice = totalPrice; - } - - /// - /// The field for the name of this item. - /// - public FormField Name { get; } - - /// - /// The field for the quantity associated with this item. - /// - public FormField Quantity { get; } - - /// - /// The field for the price of a single unit of this item. - /// - public FormField Price { get; } - - /// - /// The field for the total price of this item, taking the quantity into account. - /// - public FormField TotalPrice { get; } - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs index 827a2646e55b..799de7b6b05a 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs @@ -265,91 +265,91 @@ public void StartRecognizeContentFromUriThrowsForNonExistingContent() Assert.ThrowsAsync(async () => await client.StartRecognizeContentFromUriAsync(invalidUri)); } - /// - /// Verifies that the is able to connect to the Form - /// Recognizer cognitive service and perform analysis of receipts. - /// - [Test] - [TestCase(true)] - [TestCase(false)] - public async Task StartRecognizeReceiptsPopulatesExtractedReceipt(bool useStream) - { - var client = CreateInstrumentedFormRecognizerClient(); - RecognizeReceiptsOperation operation; - - if (useStream) - { - using var stream = FormRecognizerTestEnvironment.CreateStream(TestFile.ReceiptJpg); - using (Recording.DisableRequestBodyRecording()) - { - operation = await client.StartRecognizeReceiptsAsync(stream); - } - } - else - { - var uri = FormRecognizerTestEnvironment.CreateUri(TestFile.ReceiptJpg); - operation = await client.StartRecognizeReceiptsFromUriAsync(uri, default); - } - - await operation.WaitForCompletionAsync(); - - Assert.IsTrue(operation.HasValue); - - var receipt = operation.Value.Single().AsUSReceipt(); - - // The expected values are based on the values returned by the service, and not the actual - // values present in the receipt. We are not testing the service here, but the SDK. - - Assert.AreEqual(USReceiptType.Itemized, receipt.ReceiptType); - Assert.That(receipt.ReceiptTypeConfidence, Is.EqualTo(0.66).Within(0.01)); - - Assert.AreEqual(1, receipt.RecognizedForm.PageRange.FirstPageNumber); - Assert.AreEqual(1, receipt.RecognizedForm.PageRange.LastPageNumber); - - Assert.AreEqual("Contoso Contoso", (string)receipt.MerchantName); - Assert.AreEqual("123 Main Street Redmond, WA 98052", (string)receipt.MerchantAddress); - Assert.AreEqual("123-456-7890", (string)receipt.MerchantPhoneNumber.ValueText); - - Assert.IsNotNull(receipt.TransactionDate); - Assert.IsNotNull(receipt.TransactionTime); - - var date = receipt.TransactionDate.Value; - var time = receipt.TransactionTime.Value; - - Assert.AreEqual(10, date.Day); - Assert.AreEqual(6, date.Month); - Assert.AreEqual(2019, date.Year); - - Assert.AreEqual(13, time.Hours); - Assert.AreEqual(59, time.Minutes); - Assert.AreEqual(0, time.Seconds); - - var expectedItems = new List<(int? Quantity, string Name, float? Price, float? TotalPrice)>() - { - (null, "8GB RAM (Black)", null, 999.00f), - (1, "SurfacePen", null, 99.99f) - }; - - // Include a bit of tolerance when comparing float types. - - Assert.AreEqual(expectedItems.Count, receipt.Items.Count); - - for (var itemIndex = 0; itemIndex < receipt.Items.Count; itemIndex++) - { - var receiptItem = receipt.Items[itemIndex]; - var expectedItem = expectedItems[itemIndex]; - - Assert.AreEqual(expectedItem.Quantity, receiptItem.Quantity == null? null : (float?)receiptItem.Quantity, $"{receiptItem.Quantity} mismatch in item with index {itemIndex}."); - Assert.AreEqual(expectedItem.Name, (string)receiptItem.Name, $"{receiptItem.Name} mismatch in item with index {itemIndex}."); - Assert.That(receiptItem.Price == null? null : (float?)receiptItem.Price, Is.EqualTo(expectedItem.Price).Within(0.0001), $"{receiptItem.Price} mismatch in item with index {itemIndex}."); - Assert.That(receiptItem.TotalPrice == null? null: (float?)receiptItem.TotalPrice, Is.EqualTo(expectedItem.TotalPrice).Within(0.0001), $"{receiptItem.TotalPrice} mismatch in item with index {itemIndex}."); - } - - Assert.That((float?)receipt.Subtotal, Is.EqualTo(1098.99).Within(0.0001)); - Assert.That((float?)receipt.Tax, Is.EqualTo(104.40).Within(0.0001)); - Assert.IsNull(receipt.Tip); - Assert.That((float?)receipt.Total, Is.EqualTo(1203.39).Within(0.0001)); - } + ///// + ///// Verifies that the is able to connect to the Form + ///// Recognizer cognitive service and perform analysis of receipts. + ///// + //[Test] + //[TestCase(true)] + //[TestCase(false)] + //public async Task StartRecognizeReceiptsPopulatesExtractedReceipt(bool useStream) + //{ + // var client = CreateInstrumentedFormRecognizerClient(); + // RecognizeReceiptsOperation operation; + + // if (useStream) + // { + // using var stream = FormRecognizerTestEnvironment.CreateStream(TestFile.ReceiptJpg); + // using (Recording.DisableRequestBodyRecording()) + // { + // operation = await client.StartRecognizeReceiptsAsync(stream); + // } + // } + // else + // { + // var uri = FormRecognizerTestEnvironment.CreateUri(TestFile.ReceiptJpg); + // operation = await client.StartRecognizeReceiptsFromUriAsync(uri, default); + // } + + // await operation.WaitForCompletionAsync(); + + // Assert.IsTrue(operation.HasValue); + + // var receipt = operation.Value.Single().AsUSReceipt(); + + // // The expected values are based on the values returned by the service, and not the actual + // // values present in the receipt. We are not testing the service here, but the SDK. + + // Assert.AreEqual(ReceiptType.Itemized, receipt.ReceiptType); + // Assert.That(receipt.ReceiptTypeConfidence, Is.EqualTo(0.66).Within(0.01)); + + // Assert.AreEqual(1, receipt.RecognizedForm.PageRange.FirstPageNumber); + // Assert.AreEqual(1, receipt.RecognizedForm.PageRange.LastPageNumber); + + // Assert.AreEqual("Contoso Contoso", (string)receipt.MerchantName); + // Assert.AreEqual("123 Main Street Redmond, WA 98052", (string)receipt.MerchantAddress); + // Assert.AreEqual("123-456-7890", (string)receipt.MerchantPhoneNumber.ValueText); + + // Assert.IsNotNull(receipt.TransactionDate); + // Assert.IsNotNull(receipt.TransactionTime); + + // var date = receipt.TransactionDate.Value; + // var time = receipt.TransactionTime.Value; + + // Assert.AreEqual(10, date.Day); + // Assert.AreEqual(6, date.Month); + // Assert.AreEqual(2019, date.Year); + + // Assert.AreEqual(13, time.Hours); + // Assert.AreEqual(59, time.Minutes); + // Assert.AreEqual(0, time.Seconds); + + // var expectedItems = new List<(int? Quantity, string Name, float? Price, float? TotalPrice)>() + // { + // (null, "8GB RAM (Black)", null, 999.00f), + // (1, "SurfacePen", null, 99.99f) + // }; + + // // Include a bit of tolerance when comparing float types. + + // Assert.AreEqual(expectedItems.Count, receipt.Items.Count); + + // for (var itemIndex = 0; itemIndex < receipt.Items.Count; itemIndex++) + // { + // var receiptItem = receipt.Items[itemIndex]; + // var expectedItem = expectedItems[itemIndex]; + + // Assert.AreEqual(expectedItem.Quantity, receiptItem.Quantity == null? null : (float?)receiptItem.Quantity, $"{receiptItem.Quantity} mismatch in item with index {itemIndex}."); + // Assert.AreEqual(expectedItem.Name, (string)receiptItem.Name, $"{receiptItem.Name} mismatch in item with index {itemIndex}."); + // Assert.That(receiptItem.Price == null? null : (float?)receiptItem.Price, Is.EqualTo(expectedItem.Price).Within(0.0001), $"{receiptItem.Price} mismatch in item with index {itemIndex}."); + // Assert.That(receiptItem.TotalPrice == null? null: (float?)receiptItem.TotalPrice, Is.EqualTo(expectedItem.TotalPrice).Within(0.0001), $"{receiptItem.TotalPrice} mismatch in item with index {itemIndex}."); + // } + + // Assert.That((float?)receipt.Subtotal, Is.EqualTo(1098.99).Within(0.0001)); + // Assert.That((float?)receipt.Tax, Is.EqualTo(104.40).Within(0.0001)); + // Assert.IsNull(receipt.Tip); + // Assert.That((float?)receipt.Total, Is.EqualTo(1203.39).Within(0.0001)); + //} [Test] [TestCase(true)] @@ -383,7 +383,6 @@ public async Task StartRecognizeReceiptsCanParseMultipageForm(bool useStream) var recognizedReceipt = recognizedReceipts[receiptIndex]; var expectedPageNumber = receiptIndex + 1; - Assert.AreEqual("en-US", recognizedReceipt.ReceiptLocale); Assert.NotNull(recognizedReceipt.RecognizedForm); ValidateRecognizedForm(recognizedReceipt.RecognizedForm, includeTextContent: true, @@ -421,7 +420,6 @@ public async Task StartRecognizeReceiptsCanParseMultipageFormWithBlankPage() var recognizedReceipt = recognizedReceipts[receiptIndex]; var expectedPageNumber = receiptIndex + 1; - Assert.AreEqual("en-US", recognizedReceipt.ReceiptLocale); Assert.NotNull(recognizedReceipt.RecognizedForm); ValidateRecognizedForm(recognizedReceipt.RecognizedForm, includeTextContent: true, diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs index 43c0df0a57f1..a74adddb4f7c 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs @@ -32,31 +32,75 @@ public async Task RecognizeReceiptsFromFile() RecognizedReceiptCollection receipts = await client.StartRecognizeReceipts(stream).WaitForCompletionAsync(); foreach (var receipt in receipts) { - USReceipt usReceipt = receipt.AsUSReceipt(); + FormField merchantNameField; + if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) + { + if (merchantNameField.Value.Type == FieldValueType.String) + { + string merchantName = merchantNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + } + } - string merchantName = usReceipt.MerchantName?.Value ?? default; - DateTime transactionDate = usReceipt.TransactionDate?.Value ?? default; - IReadOnlyList items = usReceipt.Items ?? default; - float subtotal = usReceipt.Subtotal?.Value ?? default; - float tax = usReceipt.Tax?.Value ?? default; - float tip = usReceipt.Tip?.Value ?? default; - float total = usReceipt.Total?.Value ?? default; + FormField transactionDateField; + if (receipt.RecognizedForm.Fields.TryGetValue("TransactionDate", out transactionDateField)) + { + if (transactionDateField.Value.Type == FieldValueType.Date) + { + DateTime transactionDate = transactionDateField.Value.AsDate(); - Console.WriteLine($"Recognized USReceipt fields:"); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {usReceipt.MerchantName.Confidence}"); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {usReceipt.TransactionDate.Confidence}"); + Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + } + } - for (int i = 0; i < items.Count; i++) + FormField itemsField; + if (receipt.RecognizedForm.Fields.TryGetValue("Items", out itemsField)) { - USReceiptItem item = usReceipt.Items[i]; - Console.WriteLine($" Item {i}: Name: '{item.Name.Value}', Quantity: '{item.Quantity?.Value}', Price: '{item.Price?.Value}'"); - Console.WriteLine($" TotalPrice: '{item.TotalPrice.Value}'"); + if (itemsField.Value.Type == FieldValueType.List) + { + foreach (FormField itemField in itemsField.Value.AsList()) + { + if (itemField.Value.Type == FieldValueType.Dictionary) + { + IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); + + FormField itemNameField; + if (itemFields.TryGetValue("MerchantName", out itemNameField)) + { + if (itemNameField.Value.Type == FieldValueType.String) + { + string itemName = itemNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + } + } + + FormField itemTotalPriceField; + if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + { + if (itemTotalPriceField.Value.Type == FieldValueType.Float) + { + float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); + + Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + } + } + } + } + } } - Console.WriteLine($" Subtotal: '{subtotal}', with confidence '{usReceipt.Subtotal.Confidence}'"); - Console.WriteLine($" Tax: '{tax}', with confidence '{usReceipt.Tax.Confidence}'"); - Console.WriteLine($" Tip: '{tip}', with confidence '{usReceipt.Tip?.Confidence ?? 0.0f}'"); - Console.WriteLine($" Total: '{total}', with confidence '{usReceipt.Total.Confidence}'"); + FormField totalField; + if (receipt.RecognizedForm.Fields.TryGetValue("Total", out totalField)) + { + if (totalField.Value.Type == FieldValueType.Float) + { + float total = totalField.Value.AsFloat(); + + Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + } + } } } #endregion diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs index f2255691ce6b..1fea443d1579 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs @@ -27,31 +27,75 @@ public async Task RecognizeReceiptsFromUri() RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync(); foreach (var receipt in receipts) { - USReceipt usReceipt = receipt.AsUSReceipt(); + FormField merchantNameField; + if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) + { + if (merchantNameField.Value.Type == FieldValueType.String) + { + string merchantName = merchantNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + } + } - string merchantName = usReceipt.MerchantName?.Value ?? default; - DateTime transactionDate = usReceipt.TransactionDate?.Value ?? default; - IReadOnlyList items = usReceipt.Items ?? default; - float subtotal = usReceipt.Subtotal?.Value ?? default; - float tax = usReceipt.Tax?.Value ?? default; - float tip = usReceipt.Tip?.Value ?? default; - float total = usReceipt.Total?.Value ?? default; + FormField transactionDateField; + if (receipt.RecognizedForm.Fields.TryGetValue("TransactionDate", out transactionDateField)) + { + if (transactionDateField.Value.Type == FieldValueType.Date) + { + DateTime transactionDate = transactionDateField.Value.AsDate(); - Console.WriteLine($"Recognized USReceipt fields:"); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {usReceipt.MerchantName.Confidence}"); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {usReceipt.TransactionDate.Confidence}"); + Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + } + } - for (int i = 0; i < items.Count; i++) + FormField totalField; + if (receipt.RecognizedForm.Fields.TryGetValue("Total", out totalField)) { - USReceiptItem item = usReceipt.Items[i]; - Console.WriteLine($" Item {i}: Name: '{item.Name.Value}', Quantity: '{item.Quantity?.Value}', Price: '{item.Price?.Value}'"); - Console.WriteLine($" TotalPrice: '{item.TotalPrice.Value}'"); + if (totalField.Value.Type == FieldValueType.Float) + { + float total = totalField.Value.AsFloat(); + + Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + } } - Console.WriteLine($" Subtotal: '{subtotal}', with confidence '{usReceipt.Subtotal.Confidence}'"); - Console.WriteLine($" Tax: '{tax}', with confidence '{usReceipt.Tax.Confidence}'"); - Console.WriteLine($" Tip: '{tip}', with confidence '{usReceipt.Tip?.Confidence ?? 0.0f}'"); - Console.WriteLine($" Total: '{total}', with confidence '{usReceipt.Total.Confidence}'"); + FormField itemsField; + if (receipt.RecognizedForm.Fields.TryGetValue("Items", out itemsField)) + { + if (itemsField.Value.Type == FieldValueType.List) + { + foreach (FormField itemField in itemsField.Value.AsList()) + { + if (itemField.Value.Type == FieldValueType.Dictionary) + { + IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); + + FormField itemNameField; + if (itemFields.TryGetValue("MerchantName", out itemNameField)) + { + if (itemNameField.Value.Type == FieldValueType.String) + { + string itemName = itemNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + } + } + + FormField itemTotalPriceField; + if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + { + if (itemTotalPriceField.Value.Type == FieldValueType.Float) + { + float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); + + Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + } + } + } + } + } + } } #endregion }