Files
BeWoPlaner/ReportImp/FeidPartnerReports/CustomReportCreator.cs

205 lines
8.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.DefaultReports;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Invoicing;
using BeWo.Service.Plugins;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using DevExpress.XtraReports.UI;
namespace FeidPartnerReports
{
public class CustomReportCreator : DefaultReportCreator
{
public override XtraReport CreateQueryReport(long queryOid, string queryReportId)
{
if (queryOid == 100 || queryOid == 101)
{
return CreateRechnungslaufUnbewilligte(queryOid, queryReportId);
}
if (queryOid == 200)
{
return CreatePersonalplanung(queryOid, queryReportId);
}
return base.CreateQueryReport(queryOid, queryReportId);
}
public override XtraReport CreateServiceInvoiceReport(string dcIds, long? invoiceBaseOid)
{
if (String.IsNullOrEmpty(dcIds) && invoiceBaseOid.HasValue)
{
var serviceInvoice = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoiceBaseOid.Value);
dcIds = String.Format("{0}", serviceInvoice.Oid);
}
if (!string.IsNullOrEmpty(dcIds))
{
var dcList = new List<ServiceInvoiceDC>();
var dcidStrs = dcIds.Split(';');
foreach (var oidStr in dcidStrs)
{
var oid = long.Parse(oidStr);
var invoice = DAOFactory.GenericDAO.LoadByID<ServiceInvoice>(oid);
var dc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(invoice);
dcList.Add(dc);
}
return CreateInvoiceReport(dcList);
}
return new XtraReport();
}
private XtraReport CreateInvoiceReport(List<ServiceInvoiceDC> invoices)
{
XtraReport allReports = null;
foreach (var iDC in invoices)
{
XtraReport invoiceReport = null;
IBeWoReport<ServiceInvoiceRO> singleReport = FindReportImp<ServiceInvoiceRO>(iDC.InvoiceBase.InvoiceId);
var ro = ServiceInvoiceRO.Create(iDC);
singleReport.SetReportDataSource(ro);
((XtraReport)singleReport).CreateDocument();
invoiceReport = singleReport as XtraReport;
if (iDC.InvoiceBase.InvoiceId == "Sammelrechnung")
{
var anhang = new Invoice();
anhang.SetReportDataSource(ro);
anhang.CreateDocument();
((XtraReport)singleReport).Pages.AddRange(((XtraReport)anhang).Pages);
invoiceReport = singleReport as XtraReport;
}
if (allReports == null)
allReports = invoiceReport;
else
((XtraReport)allReports).Pages.AddRange(invoiceReport.Pages);
}
return allReports as XtraReport;
}
private XtraReport CreateRechnungslaufUnbewilligte(long queryOid, string queryReportId)
{
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
if (query == null)
return new XtraReport();
// ggf. noch nach Kostenträger differenzieren
var path = Path.Combine(TempPath, queryReportId + ".xml");
var table = Utils.XMLDeserialize<DataTable>(path);
var qro = QueryRO.Create(query, table);
if (qro.Rows.Count > 0)
{
DateTime start = DateTime.Parse(qro.Rows[0].Field1.ToString());
DateTime end = start.AddMonths(1).AddDays(-1);
DateTimeSpan span = new DateTimeSpan();
span.StartDate = start.Date;
span.EndDate = end.Date; //.AddDays(1).AddTicks(-1);
List<ServiceInvoiceDC> firstInv = new List<ServiceInvoiceDC>();
if (queryOid == 100)
{
firstInv = GenerateInitialServiceInvoices(22, span);
}
if (queryOid == 101)
{
firstInv = GenerateInitialServiceInvoices(21, span);
}
var anhang = new SammelrechnungTab();
if (firstInv != null)
{
var count = 0;
foreach (var i in firstInv)
{
count += 1;
if (count > 1 && i.ServiceInvoicePeriods != null && i.ServiceInvoicePeriods.Count > 0)
{
foreach (var sip in i.ServiceInvoicePeriods)
{
firstInv[0].ServiceInvoicePeriods.Add(sip);
}
}
}
ServiceInvoiceRO ro = ServiceInvoiceRO.Create(firstInv[0]);
anhang.SetReportDataSource(ro);
anhang.CreateDocument();
return anhang;
}
}
return new XtraReport();
}
public List<ServiceInvoiceDC> GenerateInitialServiceInvoices(long costBearerOid, DateTimeSpan invoicePeriod)
{
var cs = PluginLoader.FindClass<CustomerService>();
IEnumerable<CompactSupportConceptDC> supportConcepts;
// GetAllActiveSupportConceptCostbearer returns a "Flat" SupportConcept List, one for each CostBearer2SupportConcept!
supportConcepts = cs.GetAllActiveSupportConceptCostbearer(false, true, 0)
.Where(i => i.CostBearerOids2CostBearerRelOids.ContainsKey(costBearerOid));
supportConcepts = supportConcepts.Where(sc => sc.StartDate < invoicePeriod.EndDateTime && sc.EndDate >= invoicePeriod.StartDate && !sc.IsApproved);
var supportConcepts2ServiceRecords = supportConcepts.ToDictionary(
i => i,
i => MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDCs(
DAOFactory.SearchDAO.FindServiceRecordsInSpan(i.CostBearerRelOids[0], invoicePeriod)));
var cb = DAOFactory.GenericDAO.LoadByID<CostBearer>(costBearerOid);
String tenant = PluginLoader.Tenant;
var factory = PluginLoader.FindClass<InvoiceFactory>(cb.ID);
if (factory == null)
{
factory = InvoiceFactory.GetInstance(cb.ID, tenant);
}
var creator = factory.CreateInvoiceCreator(cb.ID, tenant, supportConcepts2ServiceRecords);
var newInvoices = creator.GenerateServiceInvoices(costBearerOid, invoicePeriod, supportConcepts2ServiceRecords);
return newInvoices;
}
private XtraReport CreatePersonalplanung(long queryOid, string queryReportId)
{
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
if (query == null)
return new XtraReport();
var path = Path.Combine(TempPath, queryReportId + ".xml");
var table = Utils.XMLDeserialize<DataTable>(path);
var qro = QueryRO.Create(query, table);
DateTime reportMonth = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
if (qro.Rows.Count > 0 && qro.Rows[0].Field1 != null
&& DateTime.TryParse(qro.Rows[0].Field1.ToString(), out DateTime parsedMonth))
{
reportMonth = new DateTime(parsedMonth.Year, parsedMonth.Month, 1);
}
string costBearerFilter = null;
if (qro.Rows.Count > 0 && qro.Rows[0].Field2.ToString() != "0")
{
costBearerFilter = qro.Rows[0].Field2.ToString();
}
var ro = PersonalplanungRO.Create(reportMonth, costBearerFilter);
var report = new FeidPartnerReports.PersonalplanungReport();
report.SetReportDataSource(ro);
return report;
}
}
}