Implemented importing of billings.
This commit is contained in:
@@ -0,0 +1,49 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace UCalc.Data
|
||||||
|
{
|
||||||
|
public static class BillingImporter
|
||||||
|
{
|
||||||
|
private static void RemoveDepartedTenants(Billing billing, StringBuilder details)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < billing.Tenants.Count;)
|
||||||
|
{
|
||||||
|
var tenant = billing.Tenants[i];
|
||||||
|
|
||||||
|
if (tenant.DepartureDate != null && tenant.DepartureDate.Value < billing.StartDate)
|
||||||
|
{
|
||||||
|
details.Append("- Mieter \"");
|
||||||
|
details.Append(tenant.Name);
|
||||||
|
details.Append("\" wurde entfernt, da er ausgezogen ist.\n");
|
||||||
|
|
||||||
|
billing.Tenants.RemoveAt(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tenant.EntryDate != null && tenant.EntryDate.Value <= billing.StartDate)
|
||||||
|
{
|
||||||
|
details.Append("- Das Einzugsdatum von Mieter \"");
|
||||||
|
details.Append(tenant.Name);
|
||||||
|
details.Append("\" wurde entfernt.\n");
|
||||||
|
|
||||||
|
tenant.EntryDate = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Billing Import(string path, DateTime startDate, DateTime endDate, StringBuilder details)
|
||||||
|
{
|
||||||
|
var billing = BillingLoader.Load(path);
|
||||||
|
|
||||||
|
billing.StartDate = startDate;
|
||||||
|
billing.EndDate = endDate;
|
||||||
|
|
||||||
|
RemoveDepartedTenants(billing, details);
|
||||||
|
|
||||||
|
return billing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +1,23 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using UCalc.Data;
|
using UCalc.Data;
|
||||||
|
|
||||||
namespace UCalc.Models
|
namespace UCalc.Models
|
||||||
{
|
{
|
||||||
public class BillingProperty : NestedProperty
|
public class BillingProperty : NestedProperty
|
||||||
{
|
{
|
||||||
|
public DateTime StartDate { get; }
|
||||||
|
public DateTime EndDate { get; }
|
||||||
public LandlordProperty Landlord { get; }
|
public LandlordProperty Landlord { get; }
|
||||||
public HouseProperty House { get; }
|
public HouseProperty House { get; }
|
||||||
public TenantsProperty Tenants { get; }
|
public TenantsProperty Tenants { get; }
|
||||||
public CostsProperty Costs { get; }
|
public CostsProperty Costs { get; }
|
||||||
|
|
||||||
public BillingProperty(Model model, Property parent, Billing data) : base(model, parent)
|
public BillingProperty(DateTime startDate, DateTime endDate, Model model, Property parent, Billing data) : base(
|
||||||
|
model, parent)
|
||||||
{
|
{
|
||||||
|
StartDate = startDate;
|
||||||
|
EndDate = endDate;
|
||||||
Landlord = Add(new LandlordProperty(model, this, data.Landlord));
|
Landlord = Add(new LandlordProperty(model, this, data.Landlord));
|
||||||
House = Add(new HouseProperty(model, this, data.House));
|
House = Add(new HouseProperty(model, this, data.House));
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,13 @@ namespace UCalc.Models
|
|||||||
return $"{Name}: Dieser Zeitraum überschneidet sich mit einem anderen.";
|
return $"{Name}: Dieser Zeitraum überschneidet sich mit einem anderen.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var billing = (BillingProperty) Parent.Parent.Parent.Parent.Parent;
|
||||||
|
if (!Value.Value.IsBetween(billing.StartDate, billing.EndDate) &&
|
||||||
|
!startDate.Value.IsBetween(billing.StartDate, billing.EndDate))
|
||||||
|
{
|
||||||
|
return $"{Name}: Dieser Zeitraum befindet sich außerhalb des Abrechnungszeitraums.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -159,18 +159,14 @@ namespace UCalc.Models
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly Validator _validator;
|
private readonly Validator _validator;
|
||||||
public DateTime StartDate { get; }
|
|
||||||
public DateTime EndDate { get; }
|
|
||||||
public BillingProperty Root { get; }
|
public BillingProperty Root { get; }
|
||||||
|
|
||||||
public Model(Billing billing)
|
public Model(Billing billing)
|
||||||
{
|
{
|
||||||
_validator = new Validator(this);
|
_validator = new Validator(this);
|
||||||
StartDate = billing.StartDate;
|
|
||||||
EndDate = billing.EndDate;
|
|
||||||
|
|
||||||
using var validator = BeginValidation(true);
|
using var validator = BeginValidation(true);
|
||||||
Root = new BillingProperty(this, null, billing);
|
Root = new BillingProperty(billing.StartDate, billing.EndDate, this, null, billing);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Validator BeginValidation(bool postPone = false)
|
public Validator BeginValidation(bool postPone = false)
|
||||||
@@ -183,8 +179,8 @@ namespace UCalc.Models
|
|||||||
{
|
{
|
||||||
var billing = new Billing
|
var billing = new Billing
|
||||||
{
|
{
|
||||||
StartDate = StartDate,
|
StartDate = Root.StartDate,
|
||||||
EndDate = EndDate,
|
EndDate = Root.EndDate,
|
||||||
Landlord =
|
Landlord =
|
||||||
{
|
{
|
||||||
Salutation = (Salutation) Root.Landlord.Salutation.Value,
|
Salutation = (Salutation) Root.Landlord.Salutation.Value,
|
||||||
@@ -255,8 +251,8 @@ namespace UCalc.Models
|
|||||||
new HashSet<Flat>(cost.AffectedFlats.Select(rentedFlat => flatPropertyToFlat[rentedFlat])),
|
new HashSet<Flat>(cost.AffectedFlats.Select(rentedFlat => flatPropertyToFlat[rentedFlat])),
|
||||||
Entries = cost.Entries.Select(entry => new CostEntry
|
Entries = cost.Entries.Select(entry => new CostEntry
|
||||||
{
|
{
|
||||||
StartDate = entry.StartDate.Value ?? StartDate,
|
StartDate = entry.StartDate.Value ?? Root.StartDate,
|
||||||
EndDate = entry.EndDate.Value ?? EndDate,
|
EndDate = entry.EndDate.Value ?? Root.EndDate,
|
||||||
Amount = entry.Amount.ConvertedValue ?? 0,
|
Amount = entry.Amount.ConvertedValue ?? 0,
|
||||||
Details = new CostEntryDetails
|
Details = new CostEntryDetails
|
||||||
{
|
{
|
||||||
|
|||||||
+22
-44
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System.Globalization;
|
||||||
using System.Globalization;
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
@@ -9,7 +10,6 @@ namespace UCalc
|
|||||||
{
|
{
|
||||||
public partial class NewWindow
|
public partial class NewWindow
|
||||||
{
|
{
|
||||||
public Billing SavedBilling { get; private set; }
|
|
||||||
public Billing Billing { get; private set; }
|
public Billing Billing { get; private set; }
|
||||||
|
|
||||||
public NewWindow()
|
public NewWindow()
|
||||||
@@ -28,7 +28,7 @@ namespace UCalc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnCreateClick(object sender, RoutedEventArgs e)
|
private void OnCreateClick(object sender, RoutedEventArgs args)
|
||||||
{
|
{
|
||||||
if (StartCalendar.SelectedDate == null)
|
if (StartCalendar.SelectedDate == null)
|
||||||
{
|
{
|
||||||
@@ -60,52 +60,30 @@ namespace UCalc
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotImplementedException();
|
var path = ((RecentlyOpenedItem) ReuseDataComboBox.SelectedItem).Path;
|
||||||
/*billing = new Billing();
|
try
|
||||||
string fileName = (string) ((ComboBoxItem) LoadCombobox.SelectedItem).Tag;
|
|
||||||
if (!billing.LoadFromFile(fileName))
|
|
||||||
{
|
{
|
||||||
MessageBox.Show("Die Datei \"" + fileName + "\" konnte nicht geladen werden!", "Fehler!",
|
var details = new StringBuilder();
|
||||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
Billing = BillingImporter.Import(path, StartCalendar.SelectedDate.Value,
|
||||||
billing = null;
|
EndCalendar.SelectedDate.Value, details);
|
||||||
|
|
||||||
|
if (details.Length > 0)
|
||||||
|
{
|
||||||
|
MessageBox.Show(
|
||||||
|
$"Die folgenden Änderungen wurden beim Übernehmen vorgenommen:\n{details}",
|
||||||
|
"Information", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
MessageBox.Show(
|
||||||
|
$"Beim Laden der Datei \"{path}\" ist ein Fehler aufgetreten!\n\nDetails: {e.Message}",
|
||||||
|
"Fehler!", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove departured renters and costs that were only paid once
|
|
||||||
string summary = "";
|
|
||||||
billing.StartDate = (DateTime) StartCalendar.SelectedDate;
|
|
||||||
billing.EndDate = (DateTime) EndCalendar.SelectedDate;
|
|
||||||
|
|
||||||
for (int i = 0; i < billing.Renters.Count;)
|
|
||||||
{
|
|
||||||
Renter renter = billing.Renters[i];
|
|
||||||
if (renter.DepartureDate != null && renter.DepartureDate < billing.StartDate)
|
|
||||||
{
|
|
||||||
summary += "- Mieter \"" + renter.Name + "\" wurde entfernt, da er ausgezogen ist.\n";
|
|
||||||
foreach (Cost cost in billing.Costs)
|
|
||||||
{
|
|
||||||
cost.AffectedRenters.Remove(renter);
|
|
||||||
}
|
|
||||||
|
|
||||||
billing.Renters.Remove(renter);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (renter.EntryDate != null && renter.EntryDate <= billing.StartDate)
|
|
||||||
{
|
|
||||||
summary += "- Das Einzugsdatum von Mieter \"" + renter.Name + "\" wurde entfernt.\n";
|
|
||||||
renter.EntryDate = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (summary != "")
|
|
||||||
MessageBox.Show("Die folgenden Änderungen wurden beim Übernehmen vorgenommen:\n" + summary,
|
|
||||||
"Information", MessageBoxButton.OK, MessageBoxImage.Information);*/
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SavedBilling = new Billing();
|
|
||||||
Billing = new Billing
|
Billing = new Billing
|
||||||
{
|
{
|
||||||
StartDate = StartCalendar.SelectedDate.Value,
|
StartDate = StartCalendar.SelectedDate.Value,
|
||||||
|
|||||||
Reference in New Issue
Block a user