private void MapShippedItemInstance(Model.ShippedItemInstance shippedItemInstance) { //----------------------- //PackagedProductInstance //----------------------- //The PackagedProductInstance represents a single product shipment and maps 1:1 to the ShippedItemInstance PackagedProductInstance packagedProductInstance = new PackagedProductInstance(); //Description and quantity are set on the related class properties packagedProductInstance.Description = string.Format("Shipment {0}", shippedItemInstance.Identifier?.Content); if (double.TryParse(shippedItemInstance.Quantity?.Content, out double quantity)) { packagedProductInstance.ProductQuantity = CreateRepresentationValue(quantity, shippedItemInstance.Quantity.UnitCode); } else { Errors.Add(new Error(string.Empty, "ShippedItemInstanceMapper.MapShippedItemInstance", $"Quantity {shippedItemInstance.Quantity?.Content} is invalid.", string.Empty)); } //The remaining data is somewhat specific to the ShippedItemInstance and is persisted as ContextItems //The ContextItem data generally is intended to be passed out of the ApplicationDataModel and passed back in unaltered, //in order that the data may return, e.g., on a logged planting operation and reconcile that planting operation //back to this ShippedItemInstance. packagedProductInstance.ContextItems.AddRange(CreatePackagedProductInstanceContextItems(shippedItemInstance)); //----------------------- //PackagedProduct //----------------------- //Packaged product is defined a product within a specific packaging. //Multiple ShippedItemInstances may map to the same PackagedProduct PackagedProduct packagedProduct = GetPackagedProduct(shippedItemInstance); if (packagedProduct != null) { packagedProductInstance.PackagedProductId = packagedProduct.Id.ReferenceId; } else { Errors.Add(new Error(null, "Mapper.MapShippedItemInstance", $"Couldn't create PackagedProduct for PackageProductInstance {packagedProductInstance.Id.ReferenceId}", null)); } //Add the PackagedProductInstance to the Catalog. The PackagedProduct is added in the subroutine above. Catalog.PackagedProductInstances.Add(packagedProductInstance); //Set other contextual information from the ShippedItemInstance into relevant ADAPT classes SetManufacturerAndBrand(shippedItemInstance); SetCrop(shippedItemInstance); SetGrower(shippedItemInstance); }
/// <summary> /// Import any PackagedProduct & PackagedProductInstance classes as may be defined in the LinkList/ContextItems /// Any export process (above) will have named the context items with with integer prefixes so that we can identify /// the source object hierarchy. /// E.g., 1.1.Code|Value is the first PackagedProduct and the first PackagedProduct belonging to it. /// The 1.1, etc. convention is internal to this plugin. As LinkList.xml items classified in ManufacturerGLN LGP's, the /// data carries a proprietary definition that, in this case, is internal to the Import/Export methods in this class and serves /// no purpose other than ensuring exported data is reimported in its same form. If in future there is a need to expose /// other product data in this way, we need simply alter these to methods to allow for the same. /// </summary> /// <param name="isoProduct"></param> /// <param name="product"></param> private void ImportPackagedProductClasses(ISOProduct isoProduct, Product product) { List <ContextItem> ppContextItems = ImportContextItems(isoProduct.ProductId, "ADAPT_Context_Items:PackagedProduct"); List <ContextItem> ppiContextItems = ImportContextItems(isoProduct.ProductId, "ADAPT_Context_Items:PackagedProductInstance"); int packagedProductIndex = 1; ContextItem relevantPPContextItem = ppContextItems.FirstOrDefault(ci => ci.Code == packagedProductIndex.ToString()); while (relevantPPContextItem != null) { //PackagedProduct PackagedProduct packagedProduct = new PackagedProduct(); packagedProduct.ProductId = product.Id.ReferenceId; packagedProduct.ContextItems = relevantPPContextItem.NestedItems; packagedProduct.Description = packagedProduct.ContextItems.FirstOrDefault()?.Value; DataModel.Catalog.PackagedProducts.Add(packagedProduct); //PackagedProductInstance ContextItem containingContextItem = ppiContextItems.FirstOrDefault(ci => ci.Code == packagedProductIndex.ToString()); if (containingContextItem != null) { int packagedProductInstanceIndex = 1; ContextItem relevantPPIContextItem = containingContextItem.NestedItems.FirstOrDefault(ci => ci.Code == packagedProductInstanceIndex.ToString()); while (relevantPPIContextItem != null) { PackagedProductInstance packagedProductInstance = new PackagedProductInstance(); packagedProductInstance.PackagedProductId = packagedProduct.Id.ReferenceId; packagedProductInstance.ContextItems = relevantPPIContextItem.NestedItems; packagedProductInstance.Description = packagedProductInstance.ContextItems.FirstOrDefault()?.Value; DataModel.Catalog.PackagedProductInstances.Add(packagedProductInstance); //Increment the counter and see if there is a PackagedProductInstance 1.2, etc. int index = ++packagedProductInstanceIndex; relevantPPIContextItem = containingContextItem.NestedItems.FirstOrDefault(ci => ci.Code == index.ToString()); } } //Increment the counter and see if there is a PackagedProduct 2, etc. relevantPPContextItem = ppContextItems.FirstOrDefault(ci => ci.Code == (++packagedProductIndex).ToString()); } }