private decimal ? GetCpt(CostPerThroughput cpt, Job job)
decimal workload = job.Workload ?? 0M;
return cpt.TotalCosts / workload;
private decimal ? GetMaterialPacking(List<Product> labels, IEnumerable<OrderDetail> orderLines)
foreach (var orderLine in orderLines)
var label = labels.FirstOrDefault(l => l.Id == orderLine.ProductId);
var colors = _productColorRepository.FindBy(c => c.ProductId == label.Id);
if (colors.Any(c => Variables.SbbColorKeys.Contains(c.ColorKey)))
materialPacking = materialPacking * ((orderLine.OrderedQuantity ?? 0M) / 50M) * CostPerPack;
private decimal ? GetMaterialConsumables() => Consumables;
private decimal ? GetMaterialFilms(Job job)
decimal setups = job.SetupsQty ?? 0;
decimal materialFilms = setups * CostPerFilm;
private decimal ? GetMaterialFrames(Job job, IEnumerable<JobLayer> jobLayers)
var frames = jobLayers.Where(l => l.Setup);
decimal materialFrames = 0;
foreach (var frame in frames)
if (frame.Type.Equals("Adhesive", StringComparison.OrdinalIgnoreCase))
materialFrames = job.MachineId == 12 ? materialFrames + FrameRoltAdhesive : materialFrames + FrameAtmaAdhesive;
else if (frame.Type.Equals("White", StringComparison.OrdinalIgnoreCase))
materialFrames = job.MachineId == 12 ? materialFrames + FrameRoltWhite : materialFrames + FrameAtmaWhite;
materialFrames = job.MachineId == 12 ? materialFrames + FrameRoltInk : materialFrames + FrameAtmaInk;
private decimal ? GetMaterialAdhesive(IEnumerable<Product> labels, IEnumerable<OrderDetail> orderLines, Job job)
join l in labels on ol.ProductId equals l.Id
ol.JobRepititions, l.Width, l.Height
decimal area = a.Sum(l => (l.Width ?? 0M) * (l.Height ?? 0M) * (l.JobRepititions ?? 1M));
decimal materialAdhesive = (area / 100) * SubstanceGramsPerSquareCentimeterAdhesive * (job.SheetsQty ?? 1M);
if (materialAdhesive < SubstanceMinimumAdhesive)
materialAdhesive = SubstanceMinimumAdhesive;
materialAdhesive = materialAdhesive * AdhesiveCostPerGram;
private decimal ? GetMaterialInksClearSbb(IEnumerable<OrderDetail> orderLines, List<Product> labels, Job job)
var jobColors = new Dictionary<decimal, decimal>();
foreach (var ol in orderLines)
var label = labels.FirstOrDefault(l => l.Id == ol.ProductId);
decimal area = (label.Height ?? 0) * (label.Width ?? 0) / 100 * (ol.JobRepititions ?? 1) * (job.SheetsQty ?? 1);
var labelColors = _productColorRepository.FindBy(c => c.ProductId == label.Id);
foreach (var color in labelColors)
decimal key = color.ColorKey ?? 0M;
decimal value = area * SubstanceGramsPerSquareCentimeter * SubstanceCostPerGram;
if (jobColors.ContainsKey(key))
jobColors.Add(key, value);
adhesive += area * SubstanceGramsPerSquareCentimeter * SubstanceCostPerGram;
foreach (var jobColor in jobColors)
var orderLineMaterial = jobColor.Value <= SubstanceMinimumInk ? SubstanceMinimumInk : jobColor.Value;
if (Variables.SbbColorKeys.Contains(jobColor.Key))
orderLineMaterial = orderLineMaterial * PassesOfSbb * 4;
result += orderLineMaterial;
private decimal ? GetMaterialFilm(Job job)
decimal materialFilm = job.SheetsQty ?? 0;
if (job.Release.Equals("HD-224", StringComparison.OrdinalIgnoreCase))
materialFilm = materialFilm * SubstrateCostMetersMatte;
materialFilm = materialFilm * SubstrateCostSheetsMatte;
materialFilm = materialFilm * SubstrateCostMetersGlossy;
materialFilm = materialFilm * SubstrateCostSheetsGlossy;
private decimal ? GetLaborPacking(List<OrderDetail> orderLines)
foreach (var ol in orderLines)
var label = _productRepository.FindBy(o => o.Id == ol.ProductId).SingleOrDefault();
if (label != null && label.CustomerId == 23529)
decimal labels = orderLines.Sum(ol => ol.OrderedQuantity) ?? 0;
decimal laborPacking = (labels / PackingDonePerHour) * LaborCost;
private decimal ? GetLaborCutting(Job job, List<OrderDetail> orderLines)
decimal sheets = job.SheetsQty ?? 0;
foreach (var ol in orderLines)
var label = _productRepository.FindBy(o => o.Id == ol.ProductId).FirstOrDefault();
if (label != null && label.CustomerId == 23529)
return (sheets / (2000 / 7.5M)) * LaborCost;
decimal labelsPerSheet = orderLines.Sum(ol => ol.JobRepititions) ?? 0;
decimal laborCutting = Math.Round(sheets / 50, MidpointRounding.AwayFromZero) * labelsPerSheet / GroupsCutPerHour;
laborCutting = laborCutting * LaborCost;
private decimal ? GetLaborInspection(Job job, List<Product> labels)
decimal sheets = job.SheetsQty ?? 0;
decimal laborInspection = sheets / InspectionSheetsPerHour;
var productIds = labels.Select(e => e.Id).ToList();
var colors = _productColorRepository.FindBy(e => productIds.Contains(e.ProductId)).ToList().Select(e => e.ColorKey).ToList();
if (colors.Any(c => Variables.SbbColorKeys.Contains(c)))
laborInspection = laborInspection * SbbModifier;
laborInspection = laborInspection * LaborCost;
private decimal ? GetLaborColorCheck(Job job, IEnumerable<JobColor> jobColors)
decimal numberOfColors = job.Hd ? 5 : jobColors.DistinctBy(c => c.ColorId).Count();
decimal laborColorCheck = (numberOfColors / ColorsCheckedPerHour) * LaborCost;
private decimal ? GetLaborIndigo(Job job)
decimal clicks = job.HdCopies ?? 0;
decimal laborIndigo = ((clicks / ClicksPerHour) + IndigoSetups) * LaborCost;
private decimal ? GetLaborSheeting(Job job)
decimal meters = job.SheetsQty ?? 0;
decimal laborSheeting = (meters / SheeterMeterPerHour) * LaborCost;
private decimal ? GetLaborPrintingPrint(Job job)
int sheetsPlanned = job.SheetsQty ?? 0;
job.Workload = (sheetsPlanned * job.LayersQty) + (job.SetupsQty * 100);
if (job.ColorType == null || job.Workload == null)
decimal workload = (decimal)job.Workload;
decimal throughputsPerHour = GetThroughputsPerHour(job);
decimal heads = job.ColorType.Equals("de2", StringComparison.OrdinalIgnoreCase) ? De2Heads : AqHeads;
decimal laborPrintingPrint = ((workload / throughputsPerHour) * heads) * LaborCost;
return laborPrintingPrint;
private decimal GetThroughputsPerHour(Job job)
if (job.MachineId == 6 || job.MachineId == 7)
return ThroughputsPerHourCylinder;
return ThroughputsPerHourRolt;
return ThroughputsPerHourAtma;
private decimal ? GetLaborPrintingSetup(Job job)
decimal laborPrintingSetup;
decimal setupsQty = job.SetupsQty ?? 0;
decimal roltPasses = Math.Round(setupsQty / 2, MidpointRounding.AwayFromZero);
if (job.Type.Equals("combi", StringComparison.OrdinalIgnoreCase))
if (job.MachineId == 6 || job.MachineId == 7)
laborPrintingSetup = PrintingSetupCombiCylinder * setupsQty;
else if (job.MachineId == 12)
laborPrintingSetup = PrintingSetupCombiRolt + (roltPasses / PrintingRewindMetersPerHour);
laborPrintingSetup = PrintingSetupCombiRolt * setupsQty;
laborPrintingSetup = PrintingSetupCombiAtma * setupsQty;
if (job.MachineId == 6 || job.MachineId == 7)
laborPrintingSetup = PrintingSetupStepCylinder * setupsQty;
else if (job.MachineId == 12)
laborPrintingSetup = PrintingSetupStepRolt + (roltPasses / PrintingRewindMetersPerHour);
laborPrintingSetup = PrintingSetupStepRolt * setupsQty;
laborPrintingSetup = PrintingSetupStepAtma * setupsQty;
laborPrintingSetup = laborPrintingSetup * LaborCost;
return laborPrintingSetup;
private decimal ? GetLaborInkRoom(List<JobColor> jobColors, IEnumerable<Product> labels)
foreach (var label in labels)
var labelColors = _productColorRepository.FindBy(c => c.ProductId == l.Id);
foreach (var color in labelColors)
if (Variables.SbbColorKeys.Contains(color.ColorKey))
var ids = jobColors.Select(e => e.ColorId).ToList();
var colors = _productColorRepository.FindBy(e => ids.Contains(e.Id)).ToList().Select(e => e.ColorKey).ToList();
bucketsOfInkGiven = colors.Distinct().Count();
decimal laborInkRoom = (bucketsOfInkGiven / BucketsPerHour) * LaborCost;
private decimal ? GetLaborStencilRoom(Job job)
int numberOfFrames = job.SetupsQty ?? 0;
decimal laborStencilRoom = (numberOfFrames * LaborCostPerScreen) * LaborCost;
private decimal ? GetLaborPlanning(Job job)
if (job.Type.Equals("combi", StringComparison.OrdinalIgnoreCase))
return LaborCombi * LaborCost;
return LaborStep * LaborCost;
private decimal ? GetTotalCosts(CostPerThroughput cpt)
decimal labor = (cpt.LaborColorCheck ?? 0) + (cpt.LaborCutting ?? 0) + (cpt.LaborIndigo ?? 0) + (cpt.LaborInkRoom ?? 0) + (cpt.LaborInspection ?? 0) + (cpt.LaborPacking ?? 0) + (cpt.LaborPlanning ?? 0) + (cpt.LaborPrintingPrint ?? 0) + (cpt.LaborPrintingSetup ?? 0) + (cpt.LaborSheeting ?? 0) + (cpt.LaborStencilRoom ?? 0);
decimal material = (cpt.MaterialAdhesive ?? 0) + (cpt.MaterialConsumables ?? 0) + (cpt.MaterialFilm ?? 0) + (cpt.MaterialFilms ?? 0) + (cpt.MaterialFrames ?? 0) + (cpt.MaterialInksClearSbb ?? 0) + (cpt.MaterialPacking ?? 0);