using System.Collections.Generic;
public static void Main()
var partRoutings = BuildPartRoutings();
foreach (var pr in partRoutings)
public static List<PartRouting> BuildPartRoutings()
var partRoutings = new List<PartRouting>();
partRoutings.AddRange(BuildPartRoutingsBuildVNStockNA());
public static List<PartRouting> BuildPartRoutingsAllNA()
var partRoutings = new List<PartRouting>();
partRoutings.Add(new PartRouting(Facilities.NA, Facilities.NA, Facilities.NA, true, FulfilledBy.PullFromStock));
partRoutings.Add(new PartRouting(Facilities.NA, Facilities.NA, Facilities.NA, true, FulfilledBy.Build));
partRoutings.Add(new PartRouting(Facilities.NA, Facilities.NA, Facilities.NA, false, FulfilledBy.PullFromStock));
partRoutings.Add(new PartRouting(Facilities.NA, Facilities.NA, Facilities.NA, false, FulfilledBy.Build));
public static List<PartRouting> BuildPartRoutingsBuildVNStockNA()
var partRoutings = new List<PartRouting>();
partRoutings.Add(new PartRouting(Facilities.VN, Facilities.NA, Facilities.NA, true, FulfilledBy.PullFromStock));
partRoutings.Add(new PartRouting(Facilities.VN, Facilities.NA, Facilities.NA, true, FulfilledBy.Build));
partRoutings.Add(new PartRouting(Facilities.VN, Facilities.NA, Facilities.NA, false, FulfilledBy.PullFromStock));
partRoutings.Add(new PartRouting(Facilities.VN, Facilities.NA, Facilities.NA, false, FulfilledBy.Build));
public static class Facilities
public static string NA => "NA";
public static string VN => "VN";
public static string HZ => "HZ";
public class FacilitySelection
public FacilityType FacilityType { get; set; }
public string Name { get; set; }
public FacilitySelection(FacilityType type, string name)
this.FacilityType = type;
public override string ToString()
return $"{FacilityType}: {Name}";
public static class Extensions
public static string Dump(this IEnumerable<FacilitySelection> facilities, string delimiter = ",")
string result = string.Join($"{delimiter} ", facilities.Select(x => x.ToString()));
public bool IsStocked { get; set; }
public FulfilledBy FulfilledBy { get; set; }
public FacilitySelection MfgFacility { get; set; }
public FacilitySelection StockFacility { get; set; }
public FacilitySelection ShipFacility { get; set; }
public PartRouting(string mfgFacility, string stockFacility, string shipFacility, bool isStocked, FulfilledBy pullFromStock)
this.MfgFacility = new FacilitySelection(FacilityType.Mfg, mfgFacility);
this.StockFacility = new FacilitySelection(FacilityType.Stock, stockFacility);
this.ShipFacility = new FacilitySelection(FacilityType.Ship, shipFacility);
this.IsStocked = isStocked;
public List<FacilitySelection> GetTransitChain()
var facilities = new List<FacilitySelection>();
facilities.Add(FulfilledBy == FulfilledBy.Build ? MfgFacility : StockFacility);
if (IsStocked && FulfilledBy == FulfilledBy.Build && StockFacility.Name != MfgFacility.Name) { facilities.Add(StockFacility); }
if (ShipFacility.Name != facilities.LastOrDefault()?.Name) { facilities.Add(ShipFacility); }
public override string ToString()
var facilities = new List<FacilitySelection>();
if (MfgFacility != null) { facilities.Add(MfgFacility); }
if (StockFacility != null) { facilities.Add(StockFacility); }
if (ShipFacility != null) { facilities.Add(ShipFacility); }
string facilitiesString = facilities.Dump();
string transitChain = GetTransitChain().Dump("->");
string result = $"Stocked: {IsStocked}\n\t{facilitiesString}\n{transitChain}\n";