Files
BeWoPlaner/ReportImp/WohnhelferRemscheidReports/Mitarbeiterstundenkonto.cs
Christian cf90774667 bugfixing
2017-06-11 15:50:31 +02:00

264 lines
12 KiB
C#

using System;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Data.Entities;
using BeWo.Data.Access;
using System.Collections.Generic;
using BS.Shared.Core;
using BeWo.Service.ServiceImplementations;
namespace BeWo.WohnhelferRemscheidReports
{
public partial class Mitarbeiterstundenkonto : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<QueryRO>
{
public Mitarbeiterstundenkonto()
{
InitializeComponent();
}
public void SetReportDataSource(QueryRO pRO)
{
InitDataSource(pRO);
this.bindingSource1.DataSource = pRO;
}
private void InitDataSource(QueryRO ro)
{
IList<Employee> employees = DAOFactory.GenericDAO.GetAllActiveAndArchived<Employee>();
Dictionary<long, Employee> empDict = new Dictionary<long, Employee>();
foreach (var item in employees)
{
empDict.Add(item.Oid.Value, item);
}
decimal sollGesamt = 0;
decimal relationGesamt = 0;
decimal gesamtGesamt = 0;
decimal flsSollGesamt = 0;
decimal flsPlusMinusGesamt = 0;
decimal flsIstGesamt = 0;
foreach (BeWo.Report.ReportObjects.QueryRO.Row mitarbeiterRow in ro.Rows)
{
long oid = 0;
if (Int64.TryParse(mitarbeiterRow.Field1.ToString(), out oid))
{
if (empDict.ContainsKey(oid))
{
Employee emp = empDict[oid];
mitarbeiterRow.Field2 = String.Format("{0}, {1}", emp.Person.LastName, emp.Person.FirstName);
decimal summeStundenGesamt = 0;
decimal anzahlMonate = 0;
decimal sollProWoche = 0;
decimal sollProMonat = 0;
var vertrag = emp.GetValidContractForDate(DateTime.Now);
if (vertrag != null && vertrag.WeeklyTotalHours.HasValue)
{
sollProWoche = vertrag.WeeklyTotalHours.Value;
sollProMonat = ((365m / 7m) / 12m) * sollProWoche;
}
mitarbeiterRow.Field3 = String.Format("{0:0.00}", sollProWoche);
mitarbeiterRow.Field4 = String.Format("{0:0.00}", sollProMonat);
List<ServiceRecord> records = DAOFactory.SearchDAO.FindServiceRecords(emp.Oid, null);
records = AnalysisServiceImp.FilterActiveServiceRecords(records) as List<ServiceRecord>;
records.Sort((a, b) => a.Start.Value.CompareTo(b.Start.Value));
int aktuellerMonat = 0;
decimal kontoStand = 0;
decimal abrechenbarImMonat = 0;
decimal nichtabrechenbarImMonat = 0;
mitarbeiterRow.ChildRows1 = new List<QueryRO.Row>();
QueryRO.Row aktuelleMonatsRow = null;
Contract aktuellerVertag = null;
foreach (var item in records)
{
DateTime dt = item.Start.Value.Date;
dt = new DateTime(dt.Year, dt.Month, 1);
int monat = dt.Year*100 + dt.Month;
while (aktuellerMonat < monat)
{
//Monatswechsel
//letzter Monat mit Werten aktualisieren
if (aktuellerMonat < 100000)
aktuellerMonat = monat;
else
{
String monatStr = String.Format("{0}", aktuellerMonat);
int year = Int32.Parse(monatStr.Substring(0, 4));
int month = Int32.Parse(monatStr.Substring(4, 2));
dt = new DateTime(year, month, 1);
dt = dt.AddMonths(1);
aktuellerMonat = dt.Year * 100 + dt.Month; ;
}
if (aktuelleMonatsRow != null)
{
aktuelleMonatsRow.Field2 = String.Format("{0:0.00}", (abrechenbarImMonat + nichtabrechenbarImMonat) / 60);
aktuelleMonatsRow.Field3 = String.Format("{0:0.00}", kontoStand / 60);
aktuelleMonatsRow.Field4 = String.Format("{0:0.00}", abrechenbarImMonat / 60);
aktuelleMonatsRow.Field5 = String.Format("{0:0.00}", nichtabrechenbarImMonat / 60);
}
aktuellerVertag = emp.GetValidContractForDate(dt);
sollProWoche = 0;
if (aktuellerVertag != null)
{
if (aktuellerVertag.WeeklyTotalHours.HasValue)
{
sollProWoche = aktuellerVertag.WeeklyTotalHours.Value;
}
}
sollProMonat = ((365m / 7m) / 12m) * sollProWoche;
kontoStand += (sollProMonat * 60);
abrechenbarImMonat = 0;
nichtabrechenbarImMonat = 0;
aktuelleMonatsRow = CreateMonatsRow(dt);
aktuelleMonatsRow.Field2 = String.Format("{0:0.00}", kontoStand / 60);
dt = dt.AddMonths(1);
mitarbeiterRow.ChildRows1.Add(aktuelleMonatsRow);
anzahlMonate ++;
if (aktuellerMonat < monat)
{
aktuelleMonatsRow.Field2 = String.Format("{0:0.00}", (abrechenbarImMonat + nichtabrechenbarImMonat) / 60);
aktuelleMonatsRow.Field3 = String.Format("{0:0.00}", kontoStand / 60);
aktuelleMonatsRow.Field4 = String.Format("{0:0.00}", 0);
aktuelleMonatsRow.Field5 = String.Format("{0:0.00}", 0);
}
}
if (item.ServiceDescription != null &&
item.ServiceDescription.ServiceCategory != null &&
item.ServiceDescription.ServiceCategory.IsBillable)
abrechenbarImMonat += item.RoundedDuration;
else
nichtabrechenbarImMonat += item.RoundedDuration;
QueryRO.Row serviceRecordRow = new QueryRO.Row();
DateTime end = item.Start.Value.AddMinutes((double)item.RoundedDuration);
serviceRecordRow.Field1 = String.Format("{0:dd/MM/yyyy} ({1}-{2})", item.Start, item.Start.Value.ToShortTimeString(), end.ToShortTimeString());
serviceRecordRow.Field2 = String.Format("{0:0.00}", item.RoundedDuration);
serviceRecordRow.Field3 = String.Format("{0:0.00}", item.RoundedDuration / 60);
serviceRecordRow.Field4 = item.ServiceDescription.Name;
serviceRecordRow.Field5 = item.ServiceDescription.ServiceCategory.Abbreviation;
aktuelleMonatsRow.ChildRows2.Add(serviceRecordRow);
kontoStand -= item.RoundedDuration;
summeStundenGesamt += item.RoundedDuration;
}
if (aktuelleMonatsRow != null)
{
aktuelleMonatsRow.Field2 = String.Format("{0:0.00}", (abrechenbarImMonat + nichtabrechenbarImMonat) / 60);
aktuelleMonatsRow.Field3 = String.Format("{0:0.00}", kontoStand / 60);
aktuelleMonatsRow.Field4 = String.Format("{0:0.00}", abrechenbarImMonat / 60);
aktuelleMonatsRow.Field5 = String.Format("{0:0.00}", nichtabrechenbarImMonat / 60);
}
mitarbeiterRow.Field5 = String.Format("{0:0.00}", summeStundenGesamt / 60);
if (anzahlMonate != 0)
mitarbeiterRow.Field6 = String.Format("{0:0.00}", (summeStundenGesamt / anzahlMonate) / 60);
else
mitarbeiterRow.Field6 = "0";
}
}
}
}
private QueryRO.Row CreateMonatsRow(DateTime dt)
{
QueryRO.Row row = new QueryRO.Row();
row.Field1 = String.Format("{0:MMM yyyy}", dt);
row.ChildRows2 = new List<QueryRO.Row>();
return row;
}
private bool IstFeiertag(DateTime start)
{
List<DateTime> feiertage = GetFeiertage(start.Year);
foreach (var dateTime in feiertage)
{
if (start == dateTime)
return true;
}
return false;
}
private List<DateTime> GetFeiertage(int year)
{
List<DateTime> list = new List<DateTime>();
list.Add(new DateTime(year, 1, 1)); // "Neujahr"));
//list.Add(new DateTime(year, 1, 6)); // , "Heilige Drei Könige"));
list.Add(new DateTime(year, 5, 1)); // , "Tag der Arbeit"));
//list.Add(new DateTime(year, 8, 15)); // , "Mariä Himmelfahrt"));
list.Add(new DateTime(year, 10, 3)); // , "Tag der dt. Einheit"));
//list.Add(new DateTime(year, 10, 31)); // , "Reformationstag"));
list.Add(new DateTime(year, 11, 1)); // , "Allerheiligen "));
list.Add(new DateTime(year, 12, 24)); // , "Heilig Abend"));
list.Add(new DateTime(year, 12, 25)); // , "1. Weihnachtstag"));
list.Add(new DateTime(year, 12, 26)); // , "2. Weihnachtstag"));
if (year == 2017)
{
list.Add(new DateTime(year, 10, 31)); // , "Reformationstag"));
}
DateTime osterSonntag = GetOsterSonntag(year);
//list.Add(osterSonntag); // , "Ostersonntag"));
//list.Add(osterSonntag.AddDays(-3)); // , "Gründonnerstag"));
list.Add(osterSonntag.AddDays(-48)); // , "Rosenmonatg"));
list.Add(osterSonntag.AddDays(-2)); // , "Karfreitag"));
list.Add(osterSonntag.AddDays(1)); // , "Ostermontag"));
list.Add(osterSonntag.AddDays(39)); // , "Christi Himmelfahrt"));
//list.Add(osterSonntag.AddDays(49)); // , "Pfingstsonntag"));
list.Add(osterSonntag.AddDays(50)); // , "Pfingstmontag"));
list.Add(osterSonntag.AddDays(60)); // , "Fronleichnam"));
return list;
}
private DateTime GetOsterSonntag(int year)
{
int g, h, c, j, l, i;
g = year % 19;
c = year / 100;
h = ((c - (c / 4)) - (((8 * c) + 13) / 25) + (19 * g) + 15) % 30;
i = h - (h / 28) * (1 - (29 / (h + 1)) * ((21 - g) / 11));
j = (year + (year / 4) + i + 2 - c + (c / 4)) % 7;
l = i - j;
int month = (int)(3 + ((l + 40) / 44));
int day = (int)(l + 28 - 31 * (month / 4));
return new DateTime(year, month, day);
}
}
}