diff --git a/.vscode/launch.json b/.vscode/launch.json index 230b34b..dc72714 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,14 +5,17 @@ // Use IntelliSense to find out which attributes exist for C# debugging // Use hover for the description of the existing attributes // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md - "name": ".NET Core Launch (console)", + "name": "ISO Exporter(console)", "type": "coreclr", "request": "launch", "preLaunchTask": "build", // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/ShippedItemInstancePluginTests/bin/Debug/net8.0/ShippedItemInstancePluginTests.dll", - "args": [], - "cwd": "${workspaceFolder}/ShippedItemInstancePluginTests", + "program": "${workspaceFolder}/ISO_ADM_Exporter/bin/Debug/net8.0/ISO_ADM_Exporter.dll", + "args": [ + "${workspaceFolder}/SampleData/v4", + "${workspaceFolder}/ISO_ADM_Exporter/output" + ], + "cwd": "${workspaceFolder}/ISO_ADM_Exporter", // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console": "internalConsole", "stopAtEntry": false @@ -21,17 +24,14 @@ // Use IntelliSense to find out which attributes exist for C# debugging // Use hover for the description of the existing attributes // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md - "name": "ISO Exporter(console)", + "name": ".NET Core Launch (console)", "type": "coreclr", "request": "launch", "preLaunchTask": "build", // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/ISO_ADM_Exporter/bin/Debug/net8.0/ISO_ADM_Exporter.dll", - "args": [ - "${workspaceFolder}/SampleData/v4", - "${workspaceFolder}/ISO_ADM_Exporter/output" - ], - "cwd": "${workspaceFolder}/ISO_ADM_Exporter", + "program": "${workspaceFolder}/ShippedItemInstancePluginTests/bin/Debug/net8.0/ShippedItemInstancePluginTests.dll", + "args": [], + "cwd": "${workspaceFolder}/ShippedItemInstancePluginTests", // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console": "internalConsole", "stopAtEntry": false diff --git a/ISO_ADM_Exporter/Program.cs b/ISO_ADM_Exporter/Program.cs index 21f27bf..266cb58 100644 --- a/ISO_ADM_Exporter/Program.cs +++ b/ISO_ADM_Exporter/Program.cs @@ -21,17 +21,28 @@ static void Main(string[] args) AgGateway.ADAPT.ISOv4Plugin.Plugin isoPlugin = new AgGateway.ADAPT.ISOv4Plugin.Plugin(); AgGateway.ADAPT.ADMPlugin.Plugin admPlugin = new AgGateway.ADAPT.ADMPlugin.Plugin(); - for (int i = 0; i < models.Count; i++) + + ; + int countModel = models.Count; + Console.WriteLine("ADM Model count = " + countModel.ToString()); + if (countModel > 0) { - Properties p = new Properties(); - string folder = Path.Combine(outputPath, i.ToString()); - Directory.CreateDirectory(folder); + for (int i = 0; i < models.Count; i++) + { + Properties p = new Properties(); + string folder = Path.Combine(outputPath, i.ToString()); + Directory.CreateDirectory(folder); + + isoPlugin.Export(models[i], folder, p); + Console.WriteLine("Wrote ISO file to " + folder); + admPlugin.Export(models[i], folder, p); + Console.WriteLine("Wrote ADM file to " + folder); - isoPlugin.Export(models[i], folder, p); - Console.WriteLine("Wrote ISO file to " + folder); - admPlugin.Export(models[i], folder, p); - Console.WriteLine("Wrote ADM file to " + folder); - + } + } + else + { + Console.WriteLine("Model count is zero! How?"); } } diff --git a/ISO_ADM_Exporter/output/0/TASKDATA/LINKLIST.XML b/ISO_ADM_Exporter/output/0/TASKDATA/LINKLIST.XML index 711b1a5..76ffa85 100644 --- a/ISO_ADM_Exporter/output/0/TASKDATA/LINKLIST.XML +++ b/ISO_ADM_Exporter/output/0/TASKDATA/LINKLIST.XML @@ -6,7 +6,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -46,7 +46,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -106,7 +106,7 @@ - + @@ -124,7 +124,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -164,7 +164,7 @@ - + @@ -183,7 +183,7 @@ - + @@ -203,7 +203,7 @@ - + @@ -223,7 +223,7 @@ - + @@ -241,7 +241,7 @@ - + @@ -259,7 +259,7 @@ - + diff --git a/ISO_ADM_Exporter/output/0/TASKDATA/TASKDATA.XML b/ISO_ADM_Exporter/output/0/TASKDATA/TASKDATA.XML index 2511813..5c38215 100644 --- a/ISO_ADM_Exporter/output/0/TASKDATA/TASKDATA.XML +++ b/ISO_ADM_Exporter/output/0/TASKDATA/TASKDATA.XML @@ -1,6 +1,6 @@ - + diff --git a/ISO_ADM_Exporter/output/0/adm/Catalog.adm b/ISO_ADM_Exporter/output/0/adm/Catalog.adm index 4f39cea..8cbbe40 100644 Binary files a/ISO_ADM_Exporter/output/0/adm/Catalog.adm and b/ISO_ADM_Exporter/output/0/adm/Catalog.adm differ diff --git a/ISO_ADM_Exporter/output/1/TASKDATA/TASKDATA.XML b/ISO_ADM_Exporter/output/1/TASKDATA/TASKDATA.XML index 0b1f3dc..5b44ecf 100644 --- a/ISO_ADM_Exporter/output/1/TASKDATA/TASKDATA.XML +++ b/ISO_ADM_Exporter/output/1/TASKDATA/TASKDATA.XML @@ -1,6 +1,6 @@ - + diff --git a/README.md b/README.md index 6080b28..a637cc9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ # ShippedItemInstancePlugin -The V4 SII plugin is used in the scope of In-Field Product ID, provide the middleware to transform a 'ship notice' contain product shipped to the farmer and load the resulting product list into the MICS (tractor display) either via the ISO XML or ADM files. It provides the implementation of the GET /setup-files endpoint as discussed here: +The V4 SII plugin is used in the scope of In-Field Product ID, provide the middleware to transform a 'ship notice' contain product shipped to the farmer and load the resulting product list into the MICS (tractor display) either via the ISO XML or ADM files. +It provides the V4 implementation of the GET /setup-files endpoint as discussed here: https://github.com/AgGateway/In-FieldProductID + +## Stepping stone to ADAPT Standard The plug-in reads the AgGateway defined ShippedItemInstance V4 JSON and maps the properties to the following ADM classes, and related ContextItems: - Catalog.Products; including the product type and product composition @@ -9,7 +12,11 @@ The plug-in reads the AgGateway defined ShippedItemInstance V4 JSON and maps the - Catalog.Manufacturers - Catalog.Crops -Sample payloads are located in SampleData/v4 folders in this repo. They are ProductType = SEED use cases, including support for seed (item) treatment. The following other use cases are supported but currently now their substance ingredients (mix): +## Sample V4 ShippedItemInstance payloads +Sample payloads are located in SampleData/v4 folders in this repo. They are ProductType = SEED use cases, including support for seed (item) treatment. + +## Use Cases +The following other use cases are supported but currently now their substance ingredients (mix): - FERTILIZER_CHEMICAL - FERTILIZER_ORGANIC - PLANT (e.g., rice and other seedlings) @@ -23,8 +30,14 @@ Sample payloads are located in SampleData/v4 folders in this repo. They are Pro - GROWTH_REGULATOR - DEFOLIANT -Major changes in this release compared to original pilot release: +## Major changes in this release compared to original pilot release: +*V4.0.1 Patch Release* +1. This patch releases now references ```List``` and not `````` model types. +2. ILogger is introduces to allowing logs to appear in Azure Application Insights, searchable in Transaction Logs. +3. Most importantly, adds the public method TransformSIIToADM to allow in-memory model to model transformation instead of creating a temporary folder and dropping payloads to file. On Azure this is optimal. The method accepts ```List``` and returns a single ``````. + +*V4.0.0 Release* 1. the ShippedItemInstance JSON RESTFul API was approved to v4 in Standards and Guidelines, therefore the JSON path references have changed and the Mapper had to be updated; 2. the Model is auto-generated off the RESTful Web API yaml using Swagger CodeGen, which the yaml itself was generated from connectCenter (Score) using the connectCenter tool built by NIST; 3. the ADAPT Standard work has removed classes that were used in v1 of the plug-in a) PackagedProduct and b) PackageProductInstance. The data elements mapped to those classes in the mapper where moved to product context items; @@ -33,9 +46,8 @@ Major changes in this release compared to original pilot release: 6. The NuGet package version will bump to v4 to align with the version of the S&G approved model; 7. The Readme.io file has significant changes related to the intent of the plug-in. -Known Issues: - -- LookupProductType(string productType) was never historically implemented, likely to look up the data definition enumerations for ProductType. CropVarietyProduct() appears to be defaulting that. +## Known Issues: +- ```LookupProductType(string productType)``` was never historically implemented, likely to look up the data definition enumerations for ProductType. CropVarietyProduct() appears to be defaulting that. - VarietyName could not be explicitly mapped to its own class.attribute placeholder in the Application Data Model C# class library. Therefore CVT (crop variety) is equivalent to PDT product.description. See #17. - The ShippedItemInstance V4 JSON repeats ShipmentReference in each array instance, which was a conscience decision in WG01 whose members agreed to have JSON that was similar to a flat file / CSV. There is value for GET /shipped-item-instances queries that return data from multiple shipments, however, the intent of a QR printed on a shipping document that can be scanned is specific to one shipment. The change in connectCenter is very easy if there is a desire to make change. LINKLIST.XML will show repeating shipment information as a result. - PackageQuantity is hard-code, to a miss in enabling typeCode in shippedItemInstance.quantity. See #18. diff --git a/ShippedItemInstancePlugin/Mapper.cs b/ShippedItemInstancePlugin/Mapper.cs index c0be88a..b4bb2c1 100644 --- a/ShippedItemInstancePlugin/Mapper.cs +++ b/ShippedItemInstancePlugin/Mapper.cs @@ -22,6 +22,8 @@ using IO.Swagger.Models; using System.Text.Json.Nodes; using System.Text.Json; +using Microsoft.Extensions.Logging; + namespace AgGateway.ADAPT.ShippedItemInstancePlugin { @@ -34,6 +36,8 @@ public class Mapper public Mapper(Catalog catalog) { Catalog = catalog; + // var loggerFactory = new LoggerFactory(); + // ILogger _logger = loggerFactory.CreateLogger>(); } #endregion @@ -57,17 +61,19 @@ public Mapper(Catalog catalog) /// /// /// - public IList MapDocument(ShippedItemInstanceList shippedProducts) + public IList MapDocument(List shippedProducts, ILogger _logger) { Errors = new List(); - Console.WriteLine("within mapper.MapDocument"); + string countShippedProductLines = shippedProducts.Count.ToString(); + Console.WriteLine("within mapper.MapDocument, count of shipped item lines = " + countShippedProductLines); foreach (ShippedItemInstance shippedItemInstance in shippedProducts) { - Console.WriteLine("within mapper.MapDocument"); + string shipmentReferenceLineNumber = shippedItemInstance.ShipmentReference.LineNumberId; + _logger.LogInformation("Mapping shipmentReferenceLineNumber = " + shipmentReferenceLineNumber); - MapShippedItemInstance(shippedItemInstance); + MapShippedItemInstance(shippedItemInstance, _logger); // // the primary goal is to create // Catalog.Products @@ -79,49 +85,49 @@ public IList MapDocument(ShippedItemInstanceList shippedProducts) return Errors; } - private void MapShippedItemInstance(ShippedItemInstance shippedItemInstance) + private void MapShippedItemInstance(ShippedItemInstance shippedItemInstance, ILogger _logger) { // capture the displayName and all this item instance context items // - Console.WriteLine("MapShippedItemInstance -- calling GetProduct"); + _logger.LogInformation("MapShippedItemInstance -- calling GetProduct"); - Product product = GetProduct(shippedItemInstance); + Product product = GetProduct(shippedItemInstance, _logger); // - Console.WriteLine("MapShippedItemInstance -- calling SetCrop"); - SetCrop(shippedItemInstance, product); + _logger.LogInformation("MapShippedItemInstance -- calling SetCrop"); + SetCrop(shippedItemInstance, product, _logger); // - Console.WriteLine("MapShippedItemInstance -- calling SetManufacturerAndBrand"); - SetManufacturerAndBrand(shippedItemInstance, product); + _logger.LogInformation("MapShippedItemInstance -- calling SetManufacturerAndBrand"); + SetManufacturerAndBrand(shippedItemInstance, product, _logger); // - Console.WriteLine("MapShippedItemInstance -- calling Set Grower"); - SetGrower(shippedItemInstance); + _logger.LogInformation("MapShippedItemInstance -- calling Set Grower"); + SetGrower(shippedItemInstance, _logger); } - private Product GetProduct(ShippedItemInstance shippedItemInstance) + private Product GetProduct(ShippedItemInstance shippedItemInstance, ILogger _logger) { // Look for product with a description that matches the shipped item instance // Primarily need the displayName of the product // quick test Product product = Catalog.Products.FirstOrDefault(p => p.Description == shippedItemInstance.DisplayName); - Console.WriteLine("MapShippedItemInstance -- created product"); + _logger.LogInformation("MapShippedItemInstance -- created product"); if (shippedItemInstance.TypeCode.ToUpper() == "SEED") { product = new CropVarietyProduct(); Console.WriteLine("MapShippedItemInstance -- CropVarietyProduct"); product.Description = shippedItemInstance.DisplayName; - Console.WriteLine("MapShippedItemInstance displayName = " + shippedItemInstance.DisplayName); + _logger.LogInformation("MapShippedItemInstance displayName = " + shippedItemInstance.DisplayName); product.ContextItems.AddRange(CreateProductContextItems(shippedItemInstance)); - product.ContextItems.AddRange(CreateProductInstanceSpecificContextItems(shippedItemInstance)); + product.ContextItems.AddRange(CreateProductInstanceSpecificContextItems(shippedItemInstance, _logger)); } else { product = new GenericProduct(); - Console.WriteLine("MapShippedItemInstance -- GenericProduct"); + _logger.LogInformation("MapShippedItemInstance -- GenericProduct"); product.Description = shippedItemInstance.DisplayName; } @@ -185,7 +191,7 @@ private ProductTypeEnum LookupProductType(string productType) } - private List CreateProductInstanceSpecificContextItems(ShippedItemInstance shippedItemInstance) + private List CreateProductInstanceSpecificContextItems(ShippedItemInstance shippedItemInstance, ILogger _logger) { List items = new List(); @@ -383,7 +389,7 @@ private List CreateProductInstanceSpecificContextItems(ShippedItemI // { Console.WriteLine("Item Treatment Test passed entering CreateItemTreatmentContextItem"); - contextItem = CreateItemTreatmentContextItem(shippedItemInstance); + contextItem = CreateItemTreatmentContextItem(shippedItemInstance, _logger); // if (contextItem.NestedItems.Count > 0) { @@ -393,7 +399,7 @@ private List CreateProductInstanceSpecificContextItems(ShippedItemI return items; } - private ContextItem CreateItemTreatmentContextItem(ShippedItemInstance shippedItemInstance) + private ContextItem CreateItemTreatmentContextItem(ShippedItemInstance shippedItemInstance, ILogger _logger) { ItemItemTreatment seedTreatment = shippedItemInstance.Item.ItemTreatment; ContextItem seedTreatmentContextItem = CreateContextItem("SeedTreatment", null); @@ -447,7 +453,7 @@ private ContextItem CreateItemTreatmentContextItem(ShippedItemInstance shippedIt } catch (Exception e) { - Console.WriteLine(e.Message); + _logger.LogError(e.Message); } return seedTreatmentContextItem; @@ -601,7 +607,7 @@ private List CreateProductContextItems(ShippedItemInstance shippedI return contextItems; } - private void SetManufacturerAndBrand(ShippedItemInstance shippedItemInstance, Product product) + private void SetManufacturerAndBrand(ShippedItemInstance shippedItemInstance, Product product, ILogger _logger) { //Set Manufacturer & Brand as available @@ -627,7 +633,7 @@ private void SetManufacturerAndBrand(ShippedItemInstance shippedItemInstance, Pr { brandName = new Brand() { Description = shippedItemInstance.Item.BrandName, ManufacturerId = product.ManufacturerId ?? 0 }; - Console.WriteLine("Brand Name = " + brandName.Description); + _logger.LogInformation("Brand Name = " + brandName.Description); Catalog.Brands.Add(brandName); @@ -640,7 +646,7 @@ private void SetManufacturerAndBrand(ShippedItemInstance shippedItemInstance, Pr // gtin , add this to unique identifer on product? // var gtin = shippedItemInstance.Item.Gtinid; - Console.WriteLine("GTIN = " + gtin); + _logger.LogInformation("GTIN = " + gtin); // // Where is gtin used? // @@ -653,7 +659,7 @@ private void SetManufacturerAndBrand(ShippedItemInstance shippedItemInstance, Pr } } - private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) + private void SetCrop(ShippedItemInstance shippedItemInstance, Product product, ILogger _logger) { // Set Crop as available // for seed this will be available @@ -669,7 +675,7 @@ private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) // if (product is CropVarietyProduct) { - Console.WriteLine("product is CropVarietyProduct"); + _logger.LogInformation("product is CropVarietyProduct"); // this should not use First or Default but filter the array for specific typeCodes // Trait, CropType, AGIIS code for CropType value (content) // @@ -680,7 +686,7 @@ private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) if (cropInformation.Count() > 0) { // CropType - Console.WriteLine("cropInformation is not null, count = " + cropInformation.Count().ToString()); + _logger.LogInformation("cropInformation is not null, count = " + cropInformation.Count().ToString()); // should implement equivalent to this JSON PATH // $[0].item.classification.codes.code[?@.typeCode=='CropType'].content // @@ -689,17 +695,17 @@ private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) if (cropInformation.FirstOrDefault(c => c.TypeCode.ToLower() == "croptype")?.Content.ToString() != null) { string cropName = cropInformation.FirstOrDefault(c => c.TypeCode.ToLower() == "croptype").Content.ToString(); - Console.WriteLine("cropName = " + cropName); + _logger.LogInformation("cropName = " + cropName); if (cropName.ToString() != null) { string idAgency = cropInformation.FirstOrDefault(c => c.TypeCode.ToLower() == "croptype").ListAgencyId; - Console.WriteLine("idAgency = " + idAgency); + _logger.LogInformation("idAgency = " + idAgency); // // string cropID = cropInformation.FirstOrDefault(c => c.TypeCode == cropName && c.ListAgencyId == "AGIIS").Content; - Console.WriteLine("cropID = " + cropID); + _logger.LogInformation("cropID = " + cropID); // // Crop crop = Catalog.Crops.FirstOrDefault(c => c.Name == cropName); @@ -710,7 +716,7 @@ private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) var varietyName = shippedItemInstance?.Item?.VarietyName; - Console.WriteLine("varietyName = " + varietyName); + _logger.LogInformation("varietyName = " + varietyName); // how does this get mapped to CVT in ISO? // CVT seems to be coming from product.Description @@ -734,7 +740,7 @@ private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) } catch (Exception e) { - Console.WriteLine(e.Message); + _logger.LogError(e.Message); } // need to test to see if this is present first @@ -746,7 +752,7 @@ private void SetCrop(ShippedItemInstance shippedItemInstance, Product product) } - private void SetGrower(ShippedItemInstance shippedItemInstance) + private void SetGrower(ShippedItemInstance shippedItemInstance, ILogger _logger) { // Need to test the typeCode of the both the ShipToParty and ShipFromParty to see which is the grower // Shipments from the Retailer to the Grower is for Seed @@ -761,7 +767,7 @@ private void SetGrower(ShippedItemInstance shippedItemInstance) { grower = new Grower() { Name = Farmer.Name }; - Console.WriteLine("grower.Name = " + grower.Name); + _logger.LogInformation("grower.Name = " + grower.Name); // Previously GLN was used but most farmers lack a GLN, // so the Retailer's ERP accountId for the farmer is best diff --git a/ShippedItemInstancePlugin/Plugin.cs b/ShippedItemInstancePlugin/Plugin.cs index 57da44f..6b51939 100644 --- a/ShippedItemInstancePlugin/Plugin.cs +++ b/ShippedItemInstancePlugin/Plugin.cs @@ -14,6 +14,8 @@ using AgGateway.ADAPT.ApplicationDataModel.ADM; using IO.Swagger.Models; using Newtonsoft.Json; +using Microsoft.Extensions.Logging; + namespace AgGateway.ADAPT.ShippedItemInstancePlugin { @@ -24,8 +26,10 @@ public class Plugin : IPlugin public string Version => "4.0"; + public string Owner => "AgGateway"; + public IList Errors { get; set; } public void Export(ApplicationDataModel.ADM.ApplicationDataModel dataModel, string exportPath, Properties properties = null) @@ -38,6 +42,7 @@ public Properties GetProperties(string dataPath) throw new NotImplementedException(); } + public IList Import(string dataPath, Properties properties = null) { IList models = new List(); @@ -46,6 +51,9 @@ public Properties GetProperties(string dataPath) List fileNames = GetInputFiles(dataPath); + var loggerFactory = new LoggerFactory(); + ILogger _logger = loggerFactory.CreateLogger>(); + fileNames.Sort(); // required to ensure OS file system sorting differences are handled foreach (string fileName in fileNames) @@ -54,25 +62,21 @@ public Properties GetProperties(string dataPath) try { string jsonText = File.ReadAllText(fileName); - - Console.WriteLine("Read JSON fileName =" + fileName); + + _logger.LogInformation("Read JSON fileName =" + fileName); + Console.WriteLine("==============================================================================="); + Console.WriteLine("Read JSON fileName =" + fileName); // Console.WriteLine(jsonText); - ShippedItemInstanceList ShippedItems = JsonConvert.DeserializeObject(jsonText); - if (ShippedItems != null) + List ShippedItems = JsonConvert.DeserializeObject>(jsonText); + if (ShippedItems != null) { //Each document will import as individual ApplicationDataModel - Console.WriteLine("deserialized into ShippedItemInstanceList"); - - ApplicationDataModel.ADM.ApplicationDataModel adm = new ApplicationDataModel.ADM.ApplicationDataModel(); - adm.Catalog = new Catalog() { Description = fileName }; - - //Map the document data into the Catalog - - Mapper mapper = new Mapper(adm.Catalog); - errors.AddRange(mapper.MapDocument(ShippedItems)); + string CatalogDescription = fileName; + ApplicationDataModel.ADM.ApplicationDataModel adm = TransformSIIToADM(ShippedItems,CatalogDescription, _logger); models.Add(adm); + } else { @@ -83,14 +87,40 @@ public Properties GetProperties(string dataPath) { errors.Add(new Error(null, $"Exception Importing {fileName}", ex.Message, ex.StackTrace)); } + } - //Read the Errors property after import to inspect any diagnostic messages. Errors = errors; return models; } + public ApplicationDataModel.ADM.ApplicationDataModel TransformSIIToADM(List ShippedItems, string CatalogDescription, ILogger _logger) + { + + ApplicationDataModel.ADM.ApplicationDataModel adm = new ApplicationDataModel.ADM.ApplicationDataModel(); + + List errors = new List(); + + string countShippedItemLines = ShippedItems.Count.ToString(); + Console.WriteLine("Within TransformSIIToADM - Count Shipped Item Lines = " + countShippedItemLines); + + adm.Catalog = new Catalog() + { + Description = CatalogDescription + }; + + Mapper mapper = new Mapper(adm.Catalog); + + errors.AddRange(mapper.MapDocument(ShippedItems, _logger)); + + _logger.LogInformation("Completed Mapping of ShippedItems"); + + Errors = errors; + + return adm; + } + public void Initialize(string args = null) { } @@ -139,7 +169,7 @@ private List GetInputFiles(string dataPath) return new List(); } } - catch(Exception ex) + catch (Exception ex) { Errors.Add(new Error(null, "Plugin.GetInputFiles", "Unable to find data files", ex.StackTrace)); return new List(); diff --git a/ShippedItemInstancePlugin/ShippedItemInstancePlugin.csproj b/ShippedItemInstancePlugin/ShippedItemInstancePlugin.csproj index 26ee7a7..1927ef1 100644 --- a/ShippedItemInstancePlugin/ShippedItemInstancePlugin.csproj +++ b/ShippedItemInstancePlugin/ShippedItemInstancePlugin.csproj @@ -19,6 +19,7 @@ +