Files

150 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
namespace BeWo.ChristopherusHaus.Export
{
public class LohnExporter
{
public static QueryDC CreateQuery(QueryDC query)
{
DateTime dt = DateTime.Now;
DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt);
query.FileName = String.Format("ZeitzuschlägePEP{0:yyyy-MM}.txt", dt);
query.QueryResult = GetSchnittstellenString(dt);
return query;
}
public static String GetSchnittstellenString(DateTime monat)
{
StringBuilder sb = new StringBuilder();
var ro = MitarbeiterstundenkontoRO.Create(null, null, monat, monat.AddMonths(1), null);
var msb = new CHMitarbeiterstundenkontoBerechnung();
msb.CreateReport(ro);
var sro = new SchnittstellendruckRo();
sro.Monat = monat; //Monat in der Datei ist zwei Monate später als Auswertung (wegen Auszahlung!?)
sro.EmployeeDaten = new List<EmployeeDaten>();
foreach (var edt in ro.EmployeeDetailList)
{
EmployeeDaten edat = new EmployeeDaten();
edat.Daten = new List<SchnittstellenDaten>();
edat.Personalnr = edt.Employee.PersonnelNumber;
edat.Vorname = edt.FirstName;
edat.Nachname = edt.LastName;
var contract = edt.Employee.GetValidContractForDate(monat);
bool fachkraft = true;
if (contract != null && contract.ContractTypeValueListEntry != null && contract.ContractTypeValueListEntry.Type == ValueListEntryType.ContractType
&& contract.ContractTypeValueListEntry.Value.ToLower().Contains("gfb-assistenz"))
{
fachkraft = false;
}
decimal nachtarbeit = 0;
decimal sonntag = 0;
decimal feiertag = 0;
if (edt.Days != null && fachkraft)
{
foreach (var dd in edt.Days)
{
nachtarbeit += dd.SpecialHours;
sonntag += dd.HoursSunday;
feiertag += dd.HoursHoliday;
}
}
if (nachtarbeit > 0)
{
AddSchnittstellenDaten(edat, nachtarbeit, "1078", "Nacht");
}
if (feiertag > 0)
{
AddSchnittstellenDaten(edat, feiertag, "1079", "Feiertag");
}
if (sonntag > 0)
{
AddSchnittstellenDaten(edat, sonntag, "1080", "Sonntag");
}
//AddSchnittstellenDaten(edat, edt.Ueberstunden ?? 0, "3300", "Überstd");
//AddSchnittstellenDaten(edat, edt.TageUrlaub ?? 0, "181", "Urlaub");
if (edat.Daten.Count > 0)
{
sro.EmployeeDaten.Add(edat);
}
}
foreach (var ed in sro.EmployeeDaten)
{
foreach (var sd in ed.Daten)
{
sb.AppendLine(CreateString(ed, sd, monat));
}
}
return sb.ToString();
}
private static string CreateString(EmployeeDaten ed, SchnittstellenDaten sd, DateTime monat)
{
StringBuilder sb = new StringBuilder();
DateTime dt = new DateTime(monat.Year, monat.Month, 1);
dt = dt.AddMonths(2); //Monat in der Datei ist zwei Monate später als Auswertung (wegen Auszahlung!?)
sb.Append(String.Format("1;"));
sb.Append(String.Format("{0};", dt.Month));
sb.Append(String.Format("{0:yyyy};", dt));
sb.Append(String.Format("{0};", ed.Personalnr));
sb.Append(String.Format("{0};", sd.Konto));
sb.Append(";;;;");
sb.Append(String.Format("{0:0.00};;;;", sd.Wert));
return sb.ToString();
}
private static void AddSchnittstellenDaten(EmployeeDaten edat, decimal wert, string konto, string art)
{
if (wert != 0)
{
var sd = new SchnittstellenDaten()
{
Wert = wert,
Konto = konto,
Art = art
};
edat.Daten.Add(sd);
}
}
}
public class SchnittstellendruckRo
{
public DateTime Monat { get; set; }
public IList<EmployeeDaten> EmployeeDaten { get; set; }
}
public class EmployeeDaten
{
public String Personalnr { get; set; }
public String Vorname { get; set; }
public String Nachname { get; set; }
public IList<SchnittstellenDaten> Daten { get; set; }
}
public class SchnittstellenDaten
{
public decimal Wert { get; set; }
public String Konto { get; set; }
public String Art { get; set; }
}
}