91 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Windows.Media;
 | |
| 
 | |
| namespace Elwig.Helpers.Billing {
 | |
|     public class GraphEntry {
 | |
| 
 | |
|         public const int MinX = 50;
 | |
|         public const int MinXGeb = 73;
 | |
|         public const int MaxX = 120;
 | |
| 
 | |
|         public int Id { get; set; }
 | |
|         public BillingData.CurveMode Mode { get; set; }
 | |
|         public bool Abgewertet { get; set; }
 | |
| 
 | |
|         public Graph DataGraph { get; set; }
 | |
|         public Graph? GebundenGraph { get; set; }
 | |
|         public double? GebundenFlatBonus {
 | |
|             get {
 | |
|                 try {
 | |
|                     var val = GebundenGraph?.DataX.Zip(GebundenGraph.DataY)
 | |
|                         .Select(e => Math.Round(e.Second - DataGraph.GetPriceAtOe(e.First), Precision))
 | |
|                         .Distinct()
 | |
|                         .Single();
 | |
|                     return (val == 0) ? null : val;
 | |
|                 } catch {
 | |
|                     return null;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 if (value is not double v) return;
 | |
|                 var values = Enumerable.Range(MinXGeb, MaxX - MinXGeb + 1)
 | |
|                     .Select(i => Math.Round(DataGraph.GetPriceAtOe(i) + v, Precision))
 | |
|                     .ToArray();
 | |
|                 GebundenGraph = new Graph(values, Precision, MinXGeb, MaxX);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public List<Varibute> Vaributes { get; set; }
 | |
|         public string VaributeStringSimple => (Abgewertet ? "Abgew.: " : "") + (Vaributes.Count != 0 ? (Vaributes.Count >= 25 ? "Restliche Sorten" : string.Join(", ", Vaributes.Select(c => c.Listing))) : "-");
 | |
|         public string VaributeString => Vaributes.Count != 0 ? string.Join("\n", Vaributes.Select(c => c.FullName)) : "-";
 | |
|         public string VaributeStringChange => (Abgewertet ? "A." : "") + string.Join(",", Vaributes.Select(c => c.Listing));
 | |
|         public Brush? Color => Vaributes.Select(v => v.Variety?.Color).Distinct().SingleOrDefault();
 | |
|         private readonly int Precision;
 | |
| 
 | |
|         public GraphEntry(int id, int precision, BillingData.CurveMode mode) {
 | |
|             Id = id;
 | |
|             Precision = precision;
 | |
|             Mode = mode;
 | |
|             DataGraph = new Graph(precision, MinX, MaxX); ;
 | |
|             Vaributes = [];
 | |
|         }
 | |
| 
 | |
|         public GraphEntry(int id, int precision, BillingData.CurveMode mode, Dictionary<double, decimal> data, Dictionary<double, decimal>? gebunden) :
 | |
|             this(id, precision, mode) {
 | |
|             DataGraph = new Graph(data, precision, MinX, MaxX);
 | |
|             if (gebunden != null) GebundenGraph = new Graph(gebunden, precision, MinXGeb, MaxX);
 | |
|         }
 | |
| 
 | |
|         public GraphEntry(int id, int precision, BillingData.Curve curve, List<Varibute> vaributes) :
 | |
|             this(id, precision, curve.Mode) {
 | |
|             DataGraph = new Graph(curve.Normal, precision, MinX, MaxX);
 | |
|             if (curve.Gebunden != null)
 | |
|                 GebundenGraph = new Graph(curve.Gebunden, precision, MinXGeb, MaxX);
 | |
|             Vaributes = vaributes;
 | |
|         }
 | |
| 
 | |
|         private GraphEntry(int id, int precision, BillingData.CurveMode mode, Graph dataGraph, Graph? gebundenGraph, List<Varibute> vaributes) {
 | |
|             Id = id;
 | |
|             Precision = precision;
 | |
|             Mode = mode;
 | |
|             DataGraph = dataGraph;
 | |
|             GebundenGraph = gebundenGraph;
 | |
|             Vaributes = vaributes;
 | |
|         }
 | |
| 
 | |
|         public void AddGebundenGraph() {
 | |
|             GebundenGraph ??= new Graph(Precision, MinXGeb, MaxX);
 | |
|         }
 | |
| 
 | |
|         public void RemoveGebundenGraph() {
 | |
|             GebundenGraph = null;
 | |
|         }
 | |
| 
 | |
|         public GraphEntry Copy(int id) {
 | |
|             return new GraphEntry(id, Precision, Mode, (Graph)DataGraph.Clone(), (Graph?)GebundenGraph?.Clone(), []);
 | |
|         }
 | |
|     }
 | |
| }
 |