diff --git a/BeWo/BeWo.csproj b/BeWo/BeWo.csproj index 4f8390765..9d309aa0d 100644 --- a/BeWo/BeWo.csproj +++ b/BeWo/BeWo.csproj @@ -151,7 +151,11 @@ + + + + diff --git a/BeWo/ViewModel/AiPromptroutineStepVM.cs b/BeWo/ViewModel/AiPromptroutineStepVM.cs new file mode 100644 index 000000000..d2e3af7cf --- /dev/null +++ b/BeWo/ViewModel/AiPromptroutineStepVM.cs @@ -0,0 +1,54 @@ +using System; + +using BS.Shared; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.ViewModel +{ + public class AiPromptroutineStepVM : AbstractDCMapperVM + { + private int _Position; + private AiPromptbausteinPromptDC _PromptReference; + private long _ReferenceVersion; + + public AiPromptroutineStepVM(AiPromptroutineStepDC dc) : base(dc, dc.Oid) + { + + } + + public int Position + { + get => _Position; + set => SetProperty(ref _Position, value, nameof(Position), () => DataContract.Position); + } + + public AiPromptbausteinPromptDC PromptReference + { + get => _PromptReference; + set => SetProperty(ref _PromptReference, value, nameof(PromptReference), () => DataContract.PromptReference); + } + + public long ReferenceVersion + { + get => _ReferenceVersion; + set => SetProperty(ref _ReferenceVersion, value, nameof(ReferenceVersion), () => DataContract.ReferenceVersion); + } + + protected override void InitByDataContract(AiPromptroutineStepDC pDataContract) + { + _Position = pDataContract.Position; + _PromptReference = pDataContract.PromptReference; + _ReferenceVersion = pDataContract.ReferenceVersion; + } + + protected override AiPromptroutineStepDC MapToDataContract(AiPromptroutineStepDC pDataContract, bool doCommit) + { + pDataContract.Position = _Position; + pDataContract.PromptReference = _PromptReference; + pDataContract.ReferenceVersion = _ReferenceVersion; + + return pDataContract; + } + } +} diff --git a/BeWo/ViewModel/AiPromptroutineVM.cs b/BeWo/ViewModel/AiPromptroutineVM.cs new file mode 100644 index 000000000..65255a1ea --- /dev/null +++ b/BeWo/ViewModel/AiPromptroutineVM.cs @@ -0,0 +1,120 @@ +using System; +using BeWo.ViewModel.ListViewModel; +using BS.Shared; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Compact; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.ViewModel +{ + public class AiPromptroutineVM : AbstractDCMapperVM + { + private string _Title; + private string _Description; + private long? _ParentFolderOid; + private CompactEmployeeDC _Creator; + private bool _IsPublic; + private int _Position; + private bool _IsFavorite; + private AiActionType _ActionType; + private bool _CanEdit; + private AiPromptroutineStepListVM _Steps; + + public AiPromptroutineVM(AiPromptroutineDC dc) : base(dc, dc.Oid) + { + + } + + public string Title + { + get => _Title; + set => SetProperty(ref _Title, value, nameof(Title), () => DataContract.Title); + } + + public string Description + { + get => _Description; + set => SetProperty(ref _Description, value, nameof(Description), () => DataContract.Description); + } + + public long? ParentFolderOid + { + get => _ParentFolderOid; + set => SetProperty(ref _ParentFolderOid, value, nameof(ParentFolderOid), () => DataContract.ParentFolderOid); + } + + public CompactEmployeeDC Creator + { + get => _Creator; + set => SetProperty(ref _Creator, value, nameof(Creator), () => DataContract.Creator); + } + + public bool IsPublic + { + get => _IsPublic; + set => SetProperty(ref _IsPublic, value, nameof(IsPublic), () => DataContract.IsPublic); + } + + public int Position + { + get => _Position; + set => SetProperty(ref _Position, value, nameof(Position), () => DataContract.Position); + } + + public bool IsFavorite + { + get => _IsFavorite; + set => SetProperty(ref _IsFavorite, value, nameof(IsFavorite), () => DataContract.IsFavorite); + } + + public AiActionType ActionType + { + get => _ActionType; + set => SetProperty(ref _ActionType, value, nameof(ActionType), () => DataContract.ActionType); + } + + public bool CanEdit + { + get => _CanEdit; + set => SetProperty(ref _CanEdit, value, nameof(CanEdit), () => DataContract.CanEdit); + } + + public AiPromptroutineStepListVM Steps + { + get => _Steps; + set => SetProperty(ref _Steps, value, nameof(Steps)); + } + + protected override void InitByDataContract(AiPromptroutineDC pDataContract) + { + _Title = pDataContract.Title; + _Description = pDataContract.Description; + _ParentFolderOid = pDataContract.ParentFolderOid; + _Creator = pDataContract.Creator; + _IsPublic = pDataContract.IsPublic; + _Position = pDataContract.Position; + _IsFavorite = pDataContract.IsFavorite; + _ActionType = pDataContract.ActionType; + _CanEdit = pDataContract.CanEdit; + + _Steps = new AiPromptroutineStepListVM(pDataContract.Steps); + } + + protected override AiPromptroutineDC MapToDataContract(AiPromptroutineDC pDataContract, bool doCommit) + { + pDataContract.Title = _Title; + pDataContract.Description = _Description; + pDataContract.ParentFolderOid = _ParentFolderOid; + pDataContract.Creator = _Creator; + pDataContract.IsPublic = _IsPublic; + pDataContract.Position = _Position; + pDataContract.IsFavorite = _IsFavorite; + pDataContract.ActionType = _ActionType; + pDataContract.CanEdit = _CanEdit; + + pDataContract.Steps = _Steps.CopyToDCList(doCommit); + + return pDataContract; + } + } +} diff --git a/BeWo/ViewModel/ListViewModel/AiPromptroutineListVM.cs b/BeWo/ViewModel/ListViewModel/AiPromptroutineListVM.cs new file mode 100644 index 000000000..150a9d7c1 --- /dev/null +++ b/BeWo/ViewModel/ListViewModel/AiPromptroutineListVM.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.ViewModel.ListViewModel +{ + public class AiPromptroutineListVM : AbstractDCListMapperVM + { + public AiPromptroutineListVM(IEnumerable pDataContracts = null) : base(pDataContracts) + { + + } + } +} \ No newline at end of file diff --git a/BeWo/ViewModel/ListViewModel/AiPromptroutineStepListVM.cs b/BeWo/ViewModel/ListViewModel/AiPromptroutineStepListVM.cs new file mode 100644 index 000000000..20ef5697d --- /dev/null +++ b/BeWo/ViewModel/ListViewModel/AiPromptroutineStepListVM.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.ViewModel.ListViewModel +{ + public class AiPromptroutineStepListVM : AbstractDCListMapperVM + { + public AiPromptroutineStepListVM(IEnumerable pDataContracts = null) : base(pDataContracts) + { + + } + } +} \ No newline at end of file diff --git a/Data/Data.csproj b/Data/Data.csproj index a7ba305f8..ec854a741 100644 --- a/Data/Data.csproj +++ b/Data/Data.csproj @@ -234,6 +234,8 @@ + + diff --git a/Data/Entities/AiPromptroutine.cs b/Data/Entities/AiPromptroutine.cs new file mode 100644 index 000000000..422ebfd80 --- /dev/null +++ b/Data/Entities/AiPromptroutine.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts.Compact; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.Data.Entities +{ + public class AiPromptroutine : BeWoEntityBase + { + public AiPromptroutine() + { + _Tid = TableID.AiPromptroutine; + } + + public virtual string Title { get; set; } + + public virtual string Description { get; set; } + + public virtual long? ParentFolderOid { get; set; } + + public virtual long CreatorOid { get; set; } + + public virtual bool IsPublic { get; set; } + + public virtual int Position { get; set; } + + public virtual bool IsFavorite { get; set; } + + public virtual AiActionType ActionType { get; set; } + + public virtual bool CanEdit { get; set; } + + public virtual List Steps { get; set; } + } +} diff --git a/Data/Entities/AiPromptroutineStep.cs b/Data/Entities/AiPromptroutineStep.cs new file mode 100644 index 000000000..c33c50b40 --- /dev/null +++ b/Data/Entities/AiPromptroutineStep.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +using BS.Shared; +using BS.Shared.Core; + +namespace BeWo.Data.Entities +{ + public class AiPromptroutineStep : BeWoEntityBase + { + public AiPromptroutineStep() + { + _Tid = TableID.AiPromptroutineStep; + } + + public virtual int Position { get; set; } + + public virtual AiPromptbausteinPrompt PromptReference { get; set; } + + public virtual long ReferenceVersion { get; set; } + } +} diff --git a/Model/Changes_2026-04-17 AiPromptroutine.txt b/Model/Changes_2026-04-17 AiPromptroutine.txt new file mode 100644 index 000000000..aafa06225 --- /dev/null +++ b/Model/Changes_2026-04-17 AiPromptroutine.txt @@ -0,0 +1,42 @@ +INSERT INTO `.executedscripts` +VALUES ('Changes_2026-04-17 AiPromptroutine', CURDATE()); + +CREATE TABLE `aipromptroutinestep` ( +`Oid` bigint NOT NULL AUTO_INCREMENT, +`InsTs` datetime DEFAULT NULL, +`InsUser` varchar(256) DEFAULT NULL, +`Notice` varchar(1024) DEFAULT NULL, +`Tid` int DEFAULT NULL, +`UdpUser` varchar(256) DEFAULT NULL, +`Version` bigint DEFAULT NULL, +`IsActive` tinyint DEFAULT NULL, +`SystemEntryID` int DEFAULT NULL, +`Position` int, +`PromptReferenceOid` bigint DEFAULT NULL, +`PromptReferenceVersion` bigint, +PRIMARY KEY (`Oid`), +CONSTRAINT `FK_AIPROMPTROUTINESTEP_PROMPT` FOREIGN KEY (`PromptReferenceOid`) REFERENCES `aipromptbausteinprompt` (`Oid`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; + +CREATE TABLE `aipromptroutine` ( +`Oid` bigint NOT NULL AUTO_INCREMENT, +`InsTs` datetime DEFAULT NULL, +`InsUser` varchar(256) DEFAULT NULL, +`Notice` varchar(1024) DEFAULT NULL, +`Tid` int DEFAULT NULL, +`UdpUser` varchar(256) DEFAULT NULL, +`Version` bigint DEFAULT NULL, +`IsActive` tinyint DEFAULT NULL, +`SystemEntryID` int DEFAULT NULL, +`Title` varchar(255), +`Description` varchar(255), +`ParentFolderOid` bigint DEFAULT NULL, +`CreatorOid` bigint, +`IsPublic` tinyint, +`Position` int, +`IsFavorite` tinyint, +`ActionType` int, +PRIMARY KEY (`Oid`), +CONSTRAINT `FK_AIPROMPTROUTINE_EMPLOYEE` FOREIGN KEY (`CreatorOid`) REFERENCES `employee` (`Oid`), +CONSTRAINT `FK_AIPROMPTROUTINE_PARENT` FOREIGN KEY (`ParentFolderOid`) REFERENCES `aipromptbausteinfolder` (`Oid`) +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; \ No newline at end of file diff --git a/ReportImp/AwoIntegrationsGGmbH/Invoicing/DefaultInvoiceCreation.cs b/ReportImp/AwoIntegrationsGGmbH/Invoicing/DefaultInvoiceCreation.cs index 1a6d0a8d2..f4bb554d5 100644 --- a/ReportImp/AwoIntegrationsGGmbH/Invoicing/DefaultInvoiceCreation.cs +++ b/ReportImp/AwoIntegrationsGGmbH/Invoicing/DefaultInvoiceCreation.cs @@ -79,16 +79,37 @@ namespace AwoIntegrationsGGmbH.Invoicing public override ServiceInvoice CreateSingleInvoice(int invoiceCounter, CostBearer costBearer, DateTimeSpan invoicePeriod, CompactSupportConceptDC supportConcept, List serviceRecords) { - var i = base.CreateSingleInvoice(invoiceCounter, costBearer, invoicePeriod, supportConcept, serviceRecords); - if (i != null) + if (supportConcept.IsApproved || !supportConcept.IsDeleted && !supportConcept.IsArchived) // auch nicht bewilligte abgerechnet werden { - var claim = i.GetTotalClaim(); - if (!claim.HasValue || claim.Value == 0) + var invoice = new ServiceInvoice(); + var supportConceptList = new List { supportConcept }; + + SetSenderInformation(invoice); + SetInvoiceBaseData(invoiceCounter, invoice, costBearer, invoicePeriod, supportConceptList); + SetSingleInvoiceBaseData(invoiceCounter, invoice, costBearer, invoicePeriod, supportConcept); + SetRecipientInformation(invoice, costBearer); + SetServiceInvoicePeriods(invoice, invoice.InvoiceBase.CostBearer2SupportConcept, invoicePeriod, + serviceRecords); + + SetServiceInvoicePeriodAmounts(invoice); + + // Spitzabrechnung + if (invoicePeriod == null) { - return null; + SetAmountAdvancePayments(invoice); + SetAmountEquityContribution(invoice); } + if (invoice != null) + { + var claim = invoice.GetTotalClaim(); + if (!claim.HasValue || claim.Value == 0) + { + return null; + } + } + return invoice; } - return i; + return null; } public override void SetInvoiceBaseData(int invoiceCounter, ServiceInvoice invoice, CostBearer costBearer, DateTimeSpan invoicePeriod, @@ -116,11 +137,10 @@ namespace AwoIntegrationsGGmbH.Invoicing { SupportConceptApprovalPeriodDC approvalPeriodDC = MapperFactory.SupportConceptApprovalPeriodDC_SupportConceptApprovalPeriod.MapToNewDC(iPeriod); - - if (approvalPeriodDC.Span.EndDateTime < invoiceAccountingPeriodSpan.StartDateTime || approvalPeriodDC.Span.StartDateTime > invoiceAccountingPeriodSpan.EndDate) - { - continue; - } + //if (approvalPeriodDC.Span.EndDateTime < invoiceAccountingPeriodSpan.StartDateTime || approvalPeriodDC.Span.StartDateTime > invoiceAccountingPeriodSpan.EndDate) + //{ + // continue; + //} ServiceInvoicePeriod serviceInvoicePeriod = CreateServiceInvoicePeriod(approvalPeriodDC, invoiceAccountingPeriodSpan); serviceInvoicePeriod.SupportConceptApprovalPeriod = iPeriod; @@ -139,6 +159,69 @@ namespace AwoIntegrationsGGmbH.Invoicing } } + public override ServiceInvoicePeriod CreateServiceInvoicePeriod(SupportConceptApprovalPeriodDC approvalPeriodDC, DateTimeSpan invoiceAccountingPeriodSpan) + { + var sip = new ServiceInvoicePeriod + { + Start = invoiceAccountingPeriodSpan.StartDateTime, + End = invoiceAccountingPeriodSpan.EndDateTime, + }; + + return sip; + } + + public override void SetInvoiceItems(ServiceInvoice invoice, ServiceInvoicePeriod serviceInvoicePeriod, SupportConceptApprovalPeriodDC supportConceptApprovalPeriod, + CostBearer2SupportConcept cb2sc, DateTimeSpan invoicePeriod, List serviceRecords) + { + BS.Shared.Services.Calculations calc = PluginLoader.FindClass(_SpecificID) ?? BS.Shared.Services.Calculations.GetInstance(_SpecificID); + + if (ShouldCreateFixedAmounts(serviceInvoicePeriod, supportConceptApprovalPeriod, cb2sc)) + { + CreateFixedAmounts(serviceInvoicePeriod, supportConceptApprovalPeriod, cb2sc); + } + else + { + List serviceRecordsInPeriod = serviceRecords.Where( + i => + { + bool valid = i.Start.Value.InBetween(serviceInvoicePeriod.Start.Value, + serviceInvoicePeriod.End.Value, true); + + if (valid && serviceInvoicePeriod.SupportConceptApprovalPeriod != null && serviceInvoicePeriod.SupportConceptApprovalPeriod.ServiceCategory != null) + valid = serviceInvoicePeriod.SupportConceptApprovalPeriod.ServiceCategory.Oid == + i.ServiceDescription.Category.ServiceCategoryOid; + return valid; + }).ToList(); + + if (serviceRecordsInPeriod.Count > 0) + { + //var approvalPeriodDC = DAOFactory.GenericDAO + // .LoadByID(serviceInvoicePeriod.SupportConceptApprovalPeriodOid.Value) + // .MapToNewDC(); + + //Dictionary span2HoursTest = cb2sc.SupportConcept.Customer.GetAbsencesTimesNotBillableWholeWeeks(); + var absenceTimes = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(cb2sc.SupportConcept.Customer.AbsenceTimes); + Dictionary span2Hours = calc.GetAbsencesTimesNotBillable(absenceTimes); + + serviceInvoicePeriod.HoursNotBillableAbsence += + calc.GetHoursNotBillableDueToAbsenceTimes(supportConceptApprovalPeriod, + cb2sc.CostBearer.CostRatePeriods.MapToNewDCs(), + serviceRecordsInPeriod, + span2Hours, + true, true); + + //serviceInvoicePeriod.HoursNotBillableNotApproved += + // calc.GetHoursNotBillableDueToMoreThanApproved(supportConceptApprovalPeriod, + // cb2sc.CostBearer.CostRatePeriods.MapToNewDCs(), + // serviceRecordsInPeriod, + // true, true); + + var itemList = CreateInvoiceItems(serviceRecordsInPeriod, invoicePeriod, serviceInvoicePeriod.SupportConceptApprovalPeriod, calc); + serviceInvoicePeriod.InvoiceItemList.AddRange(itemList); + } + } + } + public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, BS.Shared.Services.Calculations calc) { diff --git a/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.Designer.cs b/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.Designer.cs index d8601fa25..5ca6852a9 100644 --- a/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.Designer.cs +++ b/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.Designer.cs @@ -31,8 +31,8 @@ namespace BeWo.Report.DefaultReports { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Quittierungsbeleg)); - DevExpress.XtraReports.UI.XRSummary xrSummary2 = new DevExpress.XtraReports.UI.XRSummary(); DevExpress.XtraReports.UI.XRSummary xrSummary1 = new DevExpress.XtraReports.UI.XRSummary(); + DevExpress.XtraReports.UI.XRSummary xrSummary2 = new DevExpress.XtraReports.UI.XRSummary(); DevExpress.XtraReports.UI.XRWatermark xrWatermark1 = new DevExpress.XtraReports.UI.XRWatermark(); this.Detail = new DevExpress.XtraReports.UI.DetailBand(); this.DetailReport = new DevExpress.XtraReports.UI.DetailReportBand(); @@ -54,7 +54,6 @@ namespace BeWo.Report.DefaultReports this.xrTableCell5 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell10 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell6 = new DevExpress.XtraReports.UI.XRTableCell(); - this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); this.formattingRuleStartDate = new DevExpress.XtraReports.UI.FormattingRule(); this.ReportHeader = new DevExpress.XtraReports.UI.ReportHeaderBand(); this.xrLabel34 = new DevExpress.XtraReports.UI.XRLabel(); @@ -81,13 +80,16 @@ namespace BeWo.Report.DefaultReports this.xrPictureBox3 = new DevExpress.XtraReports.UI.XRPictureBox(); this.bottomMarginBand1 = new DevExpress.XtraReports.UI.BottomMarginBand(); this.GroupFooter1 = new DevExpress.XtraReports.UI.GroupFooterBand(); + this.xrLabel3 = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel17 = new DevExpress.XtraReports.UI.XRLabel(); this.xrPictureBox1 = new DevExpress.XtraReports.UI.XRPictureBox(); this.lblUnterschriftMitarbeiter = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel1 = new DevExpress.XtraReports.UI.XRLabel(); this.fieldKontaktArt = new DevExpress.XtraReports.UI.CalculatedField(); this.MinutesAlsStunden = new DevExpress.XtraReports.UI.CalculatedField(); - this.xrLabel3 = new DevExpress.XtraReports.UI.XRLabel(); + this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell14 = new DevExpress.XtraReports.UI.XRTableCell(); + this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); ((System.ComponentModel.ISupportInitialize)(this.xrTable3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit(); @@ -146,6 +148,7 @@ namespace BeWo.Report.DefaultReports this.xrTableCell7, this.xrTableCell8, this.xrTableCell11, + this.xrTableCell14, this.xrTableCell9}); this.xrTableRow6.Name = "xrTableRow6"; this.xrTableRow6.Padding = new DevExpress.XtraPrinting.PaddingInfo(0, 0, 0, 0, 100F); @@ -234,7 +237,7 @@ namespace BeWo.Report.DefaultReports this.xrTableCell11.StylePriority.UseTextAlignment = false; this.xrTableCell11.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; this.xrTableCell11.TextFormatString = "{0:0.00}"; - this.xrTableCell11.Weight = 0.099981150966827373D; + this.xrTableCell11.Weight = 0.099981152943429047D; // // xrTableCell9 // @@ -250,7 +253,7 @@ namespace BeWo.Report.DefaultReports this.xrTableCell9.StylePriority.UsePadding = false; this.xrTableCell9.StylePriority.UseTextAlignment = false; this.xrTableCell9.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; - this.xrTableCell9.Weight = 0.60606054470377224D; + this.xrTableCell9.Weight = 0.44383758922642275D; // // GroupHeader1 // @@ -285,6 +288,7 @@ namespace BeWo.Report.DefaultReports this.xrTableCell4, this.xrTableCell5, this.xrTableCell10, + this.xrTableCell12, this.xrTableCell6}); this.xrTableRow1.Name = "xrTableRow1"; this.xrTableRow1.Padding = new DevExpress.XtraPrinting.PaddingInfo(0, 0, 0, 0, 100F); @@ -364,7 +368,7 @@ namespace BeWo.Report.DefaultReports this.xrTableCell10.StylePriority.UseTextAlignment = false; this.xrTableCell10.Text = "Arbeitszeit"; this.xrTableCell10.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; - this.xrTableCell10.Weight = 0.099981150966827359D; + this.xrTableCell10.Weight = 0.0999811426295713D; // // xrTableCell6 // @@ -379,11 +383,7 @@ namespace BeWo.Report.DefaultReports this.xrTableCell6.StylePriority.UseTextAlignment = false; this.xrTableCell6.Text = "Bemerkung"; this.xrTableCell6.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; - this.xrTableCell6.Weight = 0.60606054470377235D; - // - // bindingSource1 - // - this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.ServicesOverviewRO); + this.xrTableCell6.Weight = 0.44383759954028063D; // // formattingRuleStartDate // @@ -648,6 +648,24 @@ namespace BeWo.Report.DefaultReports this.GroupFooter1.KeepTogether = true; this.GroupFooter1.Name = "GroupFooter1"; // + // xrLabel3 + // + this.xrLabel3.BackColor = System.Drawing.Color.Transparent; + this.xrLabel3.Borders = DevExpress.XtraPrinting.BorderSide.Right; + this.xrLabel3.Font = new DevExpress.Drawing.DXFont("Arial", 10F); + this.xrLabel3.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F); + this.xrLabel3.Name = "xrLabel3"; + this.xrLabel3.Padding = new DevExpress.XtraPrinting.PaddingInfo(3, 2, 0, 0, 100F); + this.xrLabel3.SizeF = new System.Drawing.SizeF(224.725F, 20F); + this.xrLabel3.StylePriority.UseBackColor = false; + this.xrLabel3.StylePriority.UseBorders = false; + this.xrLabel3.StylePriority.UseFont = false; + this.xrLabel3.StylePriority.UsePadding = false; + this.xrLabel3.StylePriority.UseTextAlignment = false; + xrSummary1.FormatString = "{0:0.00}"; + this.xrLabel3.Summary = xrSummary1; + this.xrLabel3.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; + // // xrLabel17 // this.xrLabel17.BackColor = System.Drawing.Color.Transparent; @@ -722,23 +740,40 @@ namespace BeWo.Report.DefaultReports this.MinutesAlsStunden.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal; this.MinutesAlsStunden.Name = "MinutesAlsStunden"; // - // xrLabel3 + // xrTableCell12 // - this.xrLabel3.BackColor = System.Drawing.Color.Transparent; - this.xrLabel3.Borders = DevExpress.XtraPrinting.BorderSide.Right; - this.xrLabel3.Font = new DevExpress.Drawing.DXFont("Arial", 10F); - this.xrLabel3.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F); - this.xrLabel3.Name = "xrLabel3"; - this.xrLabel3.Padding = new DevExpress.XtraPrinting.PaddingInfo(3, 2, 0, 0, 100F); - this.xrLabel3.SizeF = new System.Drawing.SizeF(224.725F, 20F); - this.xrLabel3.StylePriority.UseBackColor = false; - this.xrLabel3.StylePriority.UseBorders = false; - this.xrLabel3.StylePriority.UseFont = false; - this.xrLabel3.StylePriority.UsePadding = false; - this.xrLabel3.StylePriority.UseTextAlignment = false; - xrSummary1.FormatString = "{0:0.00}"; - this.xrLabel3.Summary = xrSummary1; - this.xrLabel3.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; + this.xrTableCell12.Font = new DevExpress.Drawing.DXFont("Arial", 10F, DevExpress.Drawing.DXFontStyle.Regular, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { + new DevExpress.Drawing.DXFontAdditionalProperty("GdiCharSet", ((byte)(0)))}); + this.xrTableCell12.Multiline = true; + this.xrTableCell12.Name = "xrTableCell12"; + this.xrTableCell12.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 0, 0, 0, 100F); + this.xrTableCell12.StylePriority.UseBorders = false; + this.xrTableCell12.StylePriority.UseFont = false; + this.xrTableCell12.StylePriority.UsePadding = false; + this.xrTableCell12.StylePriority.UseTextAlignment = false; + this.xrTableCell12.Text = "Mitarbeiter/in"; + this.xrTableCell12.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; + this.xrTableCell12.Weight = 0.16222295350074778D; + // + // xrTableCell14 + // + this.xrTableCell14.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "Services.EmployeeLastName")}); + this.xrTableCell14.Font = new DevExpress.Drawing.DXFont("Arial", 10F, DevExpress.Drawing.DXFontStyle.Regular, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { + new DevExpress.Drawing.DXFontAdditionalProperty("GdiCharSet", ((byte)(0)))}); + this.xrTableCell14.Multiline = true; + this.xrTableCell14.Name = "xrTableCell14"; + this.xrTableCell14.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 0, 0, 0, 100F); + this.xrTableCell14.StylePriority.UseBorders = false; + this.xrTableCell14.StylePriority.UseFont = false; + this.xrTableCell14.StylePriority.UsePadding = false; + this.xrTableCell14.StylePriority.UseTextAlignment = false; + this.xrTableCell14.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; + this.xrTableCell14.Weight = 0.16222295350074778D; + // + // bindingSource1 + // + this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.ServicesOverviewRO); // // Quittierungsbeleg // @@ -829,5 +864,7 @@ namespace BeWo.Report.DefaultReports private DevExpress.XtraReports.UI.XRPictureBox xrPictureBox1; private DevExpress.XtraReports.UI.XRLabel lblUnterschriftMitarbeiter; private DevExpress.XtraReports.UI.XRLabel xrLabel3; + private DevExpress.XtraReports.UI.XRTableCell xrTableCell14; + private DevExpress.XtraReports.UI.XRTableCell xrTableCell12; } } diff --git a/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.resx b/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.resx index 57ff01648..2ec0ca122 100644 --- a/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.resx +++ b/ReportImp/AwoIntegrationsGGmbH/Quittierungsbeleg.resx @@ -118,6 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 \ No newline at end of file diff --git a/ReportImp/BeWoDarmstadt/BeWoDarmstadt.csproj b/ReportImp/BeWoDarmstadt/BeWoDarmstadt.csproj index 05d1c7d56..80babb7a9 100644 --- a/ReportImp/BeWoDarmstadt/BeWoDarmstadt.csproj +++ b/ReportImp/BeWoDarmstadt/BeWoDarmstadt.csproj @@ -82,6 +82,12 @@ + + Component + + + TeamuebersichtKA.cs + Component @@ -127,6 +133,10 @@ ServiceInvoiceReport.cs Designer + + TeamuebersichtKA.cs + Designer + Teamuebersicht.cs Designer diff --git a/ReportImp/BeWoDarmstadt/Teamuebersicht.cs b/ReportImp/BeWoDarmstadt/Teamuebersicht.cs index d8d83346e..b94deacc0 100644 --- a/ReportImp/BeWoDarmstadt/Teamuebersicht.cs +++ b/ReportImp/BeWoDarmstadt/Teamuebersicht.cs @@ -59,11 +59,9 @@ namespace BeWoDarmstadt { foreach (var sr in scRo.ServiceRecords) { - if (sr.GroupRoundedDuration != null && sr.GroupRoundedDuration != 0 && - sr.Start >= pRO.ReportStartDate.Value && sr.Start.Value.Date <= end) + if (sr.GroupRoundedDuration != null && sr.GroupRoundedDuration != 0 && sr.Start >= pRO.ReportStartDate.Value && sr.Start.Value.Date <= end) scRo.AmountPaid += sr.RoundedDuration / 60; - if (sr.ServiceDescription != null && sr.ServiceDescription.Name == "ZwR" && - sr.Start >= pRO.ReportStartDate.Value && sr.Start.Value.Date <= end) + if (sr.ServiceDescription != null && sr.ServiceDescription.Name == "ZwR" && sr.Start >= pRO.ReportStartDate.Value && sr.Start.Value.Date <= end) scRo.AmountTotal += sr.RoundedDuration / 60; if (sr.Start >= monthStart && sr.Start.Value.Date <= end) { diff --git a/ReportImp/BetreuwoWesel/CustomMitarbeiterstundenkontoBerechnung.cs b/ReportImp/BetreuwoWesel/CustomMitarbeiterstundenkontoBerechnung.cs index f596ff048..5da232b08 100644 --- a/ReportImp/BetreuwoWesel/CustomMitarbeiterstundenkontoBerechnung.cs +++ b/ReportImp/BetreuwoWesel/CustomMitarbeiterstundenkontoBerechnung.cs @@ -115,7 +115,7 @@ namespace BetreuWoWesel // Endet ein Vertrag mitten im Monat endet, wird in base.CreateEmployeeDetails() das SollProTag auf 0 gesetzt. Dadurch werden hier folgend die // Abwesenheiten nicht mehr dargestellt, weil "stundenDurchAbwesenheiten" 0 bleibt. var c = ed.Employee.GetValidContractForDate(start); - if (c != null && c.WeeklyTotalHours.HasValue && c.WeeklyDays.HasValue) + if (c != null && c.WeeklyTotalHours.HasValue && c.WeeklyDays.HasValue && c.WeeklyDays.Value > 0) { var sonderfallSoll = c.WeeklyTotalHours.Value / c.WeeklyDays.Value; if (sollProTag == 0 && sonderfallSoll > 0) diff --git a/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/CaritasVerbandDuerenJuelichEvBeWo.csproj b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/CaritasVerbandDuerenJuelichEvBeWo.csproj index 06416ad2f..a26e30147 100644 --- a/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/CaritasVerbandDuerenJuelichEvBeWo.csproj +++ b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/CaritasVerbandDuerenJuelichEvBeWo.csproj @@ -57,6 +57,8 @@ + + Component diff --git a/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/CustomDataExporter.cs b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/CustomDataExporter.cs new file mode 100644 index 000000000..5aaccf96d --- /dev/null +++ b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/CustomDataExporter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using BeWo.Service.Core; +using BeWo.Service.Plugins; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using Utils = BS.Shared.Core.Utils; + +namespace CaritasverbandDuerenJuelichEV.Export +{ + public class SkmDataExporter : DataExporter + { + public override string CreateExportString(string pFileID, string[] pHeaderCaption, string[][] pContent) + { + + if (pHeaderCaption != null && pHeaderCaption.Length > 0 && pHeaderCaption[0].Contains("Diamant")) + { + return DiamantExporter.CreateExportString(pHeaderCaption, pContent); + } + return base.CreateExportString(pFileID, pHeaderCaption, pContent); + + } + + public override QueryDC CreateQuery(QueryDC query) + { + var q = DiamantExporter.CreateQuery(query); + CreateBuchungsExportProtokollEintrag(q); + + return q; + } + } +} diff --git a/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs new file mode 100644 index 000000000..3fabd1dcb --- /dev/null +++ b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs @@ -0,0 +1,629 @@ +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.DefaultReports; +using BeWo.Report.ReportObjects; +using BeWo.Service.Plugins; +using BS.Shared.DataContracts; + +namespace CaritasverbandDuerenJuelichEV.Export +{ + public class DiamantExporter + { + + public static QueryDC CreateQuery(QueryDC query) + { + DateTime dt = DateTime.Now; + DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt); + + if (query.Title == "Diamant Export Stammdaten") + { + query.FileName = String.Format("005S{0:yyMM}.er2", dt); + query.QueryResult = GetDebitorenString(dt); + } + else + { + long? customerOid = null; + + if (query.Parameter.Count > 1) + { + if (query.Parameter[1].Value != null) + { + long oid = 0; + if (Int64.TryParse(query.Parameter[1].Value.ToString(), out oid)) + { + customerOid = oid; + } + } + } + + if (query.Title == "Diamant Korrektur") + { + query.FileName = String.Format("005F{0:yyMM}.er2", dt); + query.QueryResult = GetKorrekturString(dt, customerOid); + } + else + { + query.FileName = String.Format("005F{0:yyyyMM}.er2", dt); + var dtAbgrenzungen = ExecuteQuery(GetAbgrenzungsLvrLwlSql(), dt); + Dictionary oid2InvoiceNumbers; + query.QueryResult = GetAbrechnungenString(dt, customerOid, dtAbgrenzungen, out oid2InvoiceNumbers); + query.Attachments = CreateAttachmentFile(dt, dtAbgrenzungen, oid2InvoiceNumbers); + } + + } + + return query; + } + + public static string CreateExportString(string[] pHeaderCaption, string[][] pContent) + { + if (pHeaderCaption != null && pHeaderCaption.Length > 1 && pHeaderCaption[0].Contains("Diamant")) + { + DateTime dt = DateTime.Now; + DateTime.TryParse(pHeaderCaption[1], out dt); + return GetAbrechnungenString(dt, null); + } + return null; + } + + private static string GetKorrekturString(DateTime dt, long? customerOid) + { + var exports = DAOFactory.GenericDAO.GetAllActive(); + + foreach (var exp in exports) + { + if (exp.Name == "Diamant Export Buchungssätze") + { + if (exp.Parameter.Contains(String.Format("Monat={0:dd.MM.yyyy}", dt))) + { + return GetKorrekturString(exp, customerOid); + } + } + } + + return ""; + } + + private static string GetKorrekturString(BuchungsExport exp, long? customerOid) + { + StringBuilder sb = new StringBuilder(); + var lines = exp.Export.Split(new string[] {"F,0,005,,,AR,"}, StringSplitOptions.RemoveEmptyEntries); + + foreach (var line in lines) + { + if (!customerOid.HasValue) + { + sb.Append("F,0,005,,,AG,"); + sb.Append(line); + } + else + { + var cust = DAOFactory.GenericDAO.LoadByID(customerOid.Value); + + String name = String.Format("{0}, {1}", cust.Person.LastName, cust.Person.FirstName); + String contains = String.Format("\"{0}\"", name); + if (line.Contains(contains)) + { + sb.Append("F,0,005,,,AG,"); + sb.Append(line); + } + } + } + return sb.ToString(); + } + + public static String GetDebitorenString(DateTime date) + { + var dt = ExecuteQuery(GetDebitorenSql(date), date); + + StringBuilder sb = new StringBuilder(); + foreach (DataRow row in dt.Rows) + { + if (sb.Length > 0) + { + sb.AppendLine(); + } + for (int i = 0; i < row.ItemArray.Length; i++) + { + if (i > 0) + { + sb.Append(","); + } + var item = row[i]; + bool quote = i == 4 || i == 5 || i == 6 || i > 24; + + if (quote) + { + sb.Append('"'); + sb.Append(item); + sb.Append('"'); + } + else + { + sb.Append(item); + } + } + + } + //Debitorenstamm + //S,0, D,200001,,"Bezeichnung1","Bezeichnung2",,,1200,,,,,,,,,,,,,,,,,"Name1","Name2", "Name3","Straße","PLZ","Ort" + return sb.ToString(); + } + + public static String GetAbrechnungenString(DateTime date, long? customerOid, DataTable dtAbgrenzungen = null) + { + Dictionary _; + return GetAbrechnungenString(date, customerOid, dtAbgrenzungen, out _); + } + + public static String GetAbrechnungenString(DateTime date, long? customerOid, DataTable dtAbgrenzungen, out Dictionary oid2InvoiceNumbers) + { + StringBuilder sb = new StringBuilder(); + + // 1. Monatliche Abrechnungen + var s = GetMonatlicheAbrechnungString(date, customerOid); + if (!String.IsNullOrWhiteSpace(s)) + { + sb.Append(s); + } + + // 2. Spitzabrechnungen + s = GetSpitzabrechnungString(date, customerOid); + if (!String.IsNullOrWhiteSpace(s)) + { + if (sb.Length > 0) + sb.AppendLine(); + sb.Append(s); + } + + // 3. Abgrenzungsbuchungen LVR/LWL + // DataTable wird von außen übergeben (aus CreateQuery), um doppelte SQL-Ausführung zu vermeiden. + // Falls nicht übergeben (z.B. aus CreateExportString), wird die SQL hier ausgeführt. + var abgrenzungenTable = dtAbgrenzungen ?? ExecuteQuery(GetAbgrenzungsLvrLwlSql(), date); + s = GetAbgrenzungsString(abgrenzungenTable, out oid2InvoiceNumbers); + if (!String.IsNullOrWhiteSpace(s)) + { + if (sb.Length > 0) + sb.AppendLine(); + sb.Append(s); + } + + if (sb.Length > 0) + sb.AppendLine(); + + return sb.ToString(); + } + + public static String GetMonatlicheAbrechnungString(DateTime date, long? customerOid) + { + // Export enthält Rechnungsangaben Zeilen (Zeile F) und Kostenstellen/Rechnungspositionsangaben (Zeile K) in zwei Zeilen + // Kommen aus Export in einer Zeile und werden hier getrennt, aber nur falls die Rechnung mehrere Positionen hat + // Systemrechnungsnummern (ib.InvoiceNumber) werden direkt verwendet, kein Generator + var dt = ExecuteQuery(GetMonatlicheAbrechnungSql(), date); + return BuildDiamantLines(dt, null); + } + + public static String GetSpitzabrechnungString(DateTime date, long? customerOid) + { + // Systemrechnungsnummern (ib.InvoiceNumber) werden direkt verwendet, kein Generator + var dt = ExecuteQuery(GetSpitzabrechnungSql(), date); + return BuildDiamantLines(dt, null); + } + + public static String GetAbgrenzungsString(DataTable dt, out Dictionary oid2GeneratedNumber) + { + // Abgrenzungsbuchungen für LVR/LWL haben keine Systemrechnungsnummern → pro Buchung (Zeile) eine Rechnungsnummer über den Generator vergeben + + var generator = PluginLoader.FindClass(); + var invoiceNumberDC = generator.LoadInvoiceNumber(); + oid2GeneratedNumber = new Dictionary(); + int invoiceCount = 0; + + if (invoiceNumberDC != null && invoiceNumberDC.Use) + { + foreach (DataRow row in dt.Rows) + { + string oid = row[0].ToString(); + if (!oid2GeneratedNumber.ContainsKey(oid)) + { + invoiceCount++; + // id = leer, da kein bestehender Bezug zur InvoiceNumber + oid2GeneratedNumber[oid] = generator.GetNextInvoiceNumber(invoiceCount, String.Empty); + } + } + } + + string result = BuildDiamantLines(dt, oid2GeneratedNumber); + + // Rechnungsnummern-Zähler in der DB hochschreiben + if (invoiceCount > 0) + { + generator.IncreaseInvoiceNumber(invoiceCount, new List()); + } + + return result; + } + + + // Gemeinsame Schleife für alle Buchungsarten im Diamant-Format. + // Spalte 0: OID (zur Deduplizierung bei mehreren Positionen pro Rechnung). + // Spalten 1-33: F-Zeile (Rechnungskopf). Ab Spalte 34 (stopIdx): K-Zeile (Kostenstelle/Position). + // Wenn oid2GeneratedNumber != null und die OID enthält, wird Spalte 10 (Rechnungsnummer) durch die generierte Nummer ersetzt. Andernfalls wird der DB-Wert verwendet. + private static String BuildDiamantLines(DataTable dt, Dictionary oid2GeneratedNumber) + { + const int startIdx = 1; + const int stopIdx = 34; // ab da beginnen Angaben zu Kostenstelle → zweite Zeile + + StringBuilder sb = new StringBuilder(); + Dictionary oid2Row = new Dictionary(); + + foreach (DataRow row in dt.Rows) + { + string oid = row[0].ToString(); + + if (!oid2Row.ContainsKey(oid)) + { + // Erste Zeile für diese OID: F-Zeile + erste K-Zeile + oid2Row.Add(oid, row); + + if (sb.Length > 0) + sb.AppendLine(); + + for (int i = startIdx; i < row.ItemArray.Length; i++) + { + var item = row[i]; + + if (i == 10 && oid2GeneratedNumber != null && oid2GeneratedNumber.ContainsKey(oid)) + { + // Generierte Rechnungsnummer statt DB-Wert + sb.Append(oid2GeneratedNumber[oid]); + sb.Append(";"); + } + else if (i == 15 || i == 42) + { + sb.Append(String.Format("{0}", item.ToString().Replace(",", "."))); + sb.Append(";"); + } + else if (i == 16) + { + sb.Append('"'); + sb.Append(item); + sb.Append('"'); + } + else if (i == stopIdx) + { + sb.AppendLine(); + sb.Append(item); + sb.Append(";"); + } + else if (i == 12 || i == 44) + { + string konto = SetKonto(item); + sb.Append(String.Format("{0}", konto)); + sb.Append(";"); + } + else + { + sb.Append(item); + sb.Append(";"); + } + } + } + else + { + // Weitere Zeile für dieselbe OID: nur zusätzliche K-Zeile ausgeben + if (sb.Length > 0) + sb.AppendLine(); + + for (int i = startIdx; i < row.ItemArray.Length; i++) + { + var item = row[i]; + // F-Zeilen-Spalten überspringen, nur Kostenstellen ausgeben + if (i == stopIdx) + { + sb.Append(item); + sb.Append(";"); + } + else if (i == 42) + { + sb.Append(String.Format("{0}", item.ToString().Replace(",", "."))); + sb.Append(";"); + } + else if (i == 44) + { + string konto = SetKonto(item); + sb.Append(String.Format("{0}", konto)); + sb.Append(";"); + } + else if (i > stopIdx) + { + sb.Append(item); + sb.Append(";"); + } + } + } + } + + return sb.ToString(); + } + + private static string SetKonto(object item) + { + string konto = "84190"; // eigentlich alles außer Selbstzahler + if (item != null) + { + if (item.ToString().ToLower().Contains("selbstzahler")) + { + konto = "84191"; + } + } + return konto; + } + + private static String GetDebitorenSql(DateTime date) + { + String sql = @" +SELECT +distinct +'S', +'0', +'D', +c.DebitorNumber, +CONCAT(p.`LastName`, ' ', p.`FirstName`), +CONCAT(p.`LastName`, ' ', p.`FirstName`), +cb2sc.CustomerRefenrenceNumber, +null, +null, +null, +null, +null, +null, +null, +'D', +'30 Tage netto', +null, +null, +null, +null, +null, +null, +null, +null, +null, +p.`FirstName`, +p.`LastName`, +'', +'', +a.Street, +a.PostalCode, +a.Town +FROM `customer` c +INNER JOIN `person` p ON p.`Oid` = c.`PersonOid` +INNER JOIN supportconcept sc on sc.CustomerOID = c.Oid +INNER JOIN costbearer2supportconcept cb2sc on cb2sc.SupportConceptOID = sc.Oid +LEFT JOIN Address a on p.addressOid = a.oid +WHERE c.isactive=1 +order by p.`LastName`, p.FirstName +"; + return sql; + } + + private static String GetMonatlicheAbrechnungSql() + { + String sql = @" + +SELECT +CONCAT(cb2sc.Oid, ib.InvoiceNumber, Round(sip.Claim, 0)) AS OID, +'F', +'0', +'99', +null, +null, +'AR', +':Abrechnungsmonat', +':Periode', +null, +ib.InvoiceNumber, +c.DebitorNumber, +CONCAT(ii.ItemDescription, ' ', org.Name), +null, +null, +Round(sip.Claim, 2) AS 'Betrag', +CONCAT('Re. ', p.`LastName`, ', ', p.`FirstName`) as 'Verwendung', +null, null, null, 'EUR', +null, null, null, '14', null, null, null, null, null, null, null, null, null, +'K', 0, c.CostCenter, null, 'V', null, null, null, Round(ii.AmountTotal * -1, 2), null, CONCAT(ii.ItemDescription, ' ', org.Name), null, null, null, null, null, null + FROM + person p + INNER JOIN customer c on c.personoid = p.oid + INNER JOIN supportconcept sc on sc.customeroid = c.oid + INNER JOIN costbearer2supportconcept cb2sc on cb2sc.supportconceptoid = sc.oid + INNER JOIN costbearer cb on cb2sc.costbeareroid = cb.oid + INNER JOIN organisation org on org.costbeareroid = cb.oid + INNER JOIN invoicebase ib on ib.costbearer2supportconceptoid = cb2sc.oid + INNER JOIN serviceinvoice si on si.invoicebaseoid = ib.oid + INNER JOIN serviceinvoiceperiod sip on sip.serviceinvoiceoid = si.oid + INNER JOIN invoiceitem ii on ii.ServiceInvoicePeriodOid = sip.oid +WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 and ib.isactive = 1 and ib.type <> 1 +and ib.`AccountingPeriodEnd` >= ':Monat_Start' AND ib.`AccountingPeriodStart` < ':Monat_End' + +ORDER BY ib.invoicenumber +"; + return sql; + } + + private static String GetSpitzabrechnungSql() + { + String sql = @" +SELECT +CONCAT(cb2sc.Oid, ib.InvoiceNumber) AS OID, +'F', +'0', +'99', +null, +null, +'AR', +':Abrechnungsmonat', +':Periode', +null, +ib.InvoiceNumber, +c.DebitorNumber, +CONCAT('Spitzabrechnung ', org.Name), +null, +null, +Round(si.Claim, 2) AS 'Betrag', +CONCAT('Re. ', p.`LastName`, ', ', p.`FirstName`) as 'Verwendung', +null, null, null, 'EUR', +null, null, null, '14', null, null, null, null, null, null, null, null, null, +'K', 0, c.CostCenter, null, 'V', null, null, null, Round(si.Claim * -1, 2), null, CONCAT('Spitzabrechnung ', org.Name), null, null, null, null, null, null +FROM person p +INNER JOIN customer c on c.personoid = p.oid +INNER JOIN supportconcept sc on sc.customeroid = c.oid +INNER JOIN costbearer2supportconcept cb2sc on cb2sc.supportconceptoid = sc.oid +INNER JOIN costbearer cb on cb2sc.costbeareroid = cb.oid +INNER JOIN organisation org on org.costbeareroid = cb.oid +INNER JOIN invoicebase ib on ib.costbearer2supportconceptoid = cb2sc.oid +INNER JOIN settlementinvoice si on si.invoicebaseoid = ib.oid +WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 and ib.isactive = 1 +AND ib.`AccountingPeriodEnd` >= ':Monat_Start' AND ib.`AccountingPeriodStart` < ':Monat_End' +ORDER BY ib.invoicenumber +"; + return sql; + } + + private static String GetAbgrenzungsLvrLwlSql() + { + String sql = @" +SELECT +CAST(stunden.cb2sc_oid AS CHAR) AS OID, +'F', +'0', +'99', +null, +null, +'AR', +':Abrechnungsmonat', +':Periode', +null, +null AS InvoiceNumber, +stunden.DebitorNumber, +CONCAT('Abgrenzung ', stunden.OrgName), +null, +null, +ROUND(stunden.Stunden * stunden.Stundensatz, 2) AS Betrag, +CONCAT('Abgr. ', stunden.LastName, ', ', stunden.FirstName) as Verwendung, +null, null, null, 'EUR', +null, null, null, '14', null, null, null, null, null, null, null, null, null, +'K', 0, stunden.CostCenter, null, 'V', null, null, null, +ROUND(stunden.Stunden * stunden.Stundensatz * -1, 2), +null, +CONCAT('Abgrenzung ', stunden.OrgName), +null, null, null, null, null, null +FROM ( + SELECT + cb2sc.Oid AS cb2sc_oid, + c.DebitorNumber, + org.Name AS OrgName, + p.LastName, + p.FirstName, + SUM(sr.roundedduration / IF(sr.GroupEmployeeCount IS NULL, 1, sr.GroupEmployeeCount)) / 60 AS Stunden, + (SELECT crp.CostRateValue + FROM costrateperiod crp + WHERE crp.ObjectTid = 22 AND crp.CostRateType = 0 AND crp.ObjectOid = cb2sc.CostBearerOid + AND (crp.EndDate IS NULL OR crp.EndDate > ':Monat_Start') + ORDER BY IF(crp.EndDate IS NULL, MAKEDATE(9999,365), crp.EndDate) LIMIT 1) AS Stundensatz, + c.CostCenter + FROM supportconcept sc + INNER JOIN costbearer2supportconcept cb2sc ON sc.Oid = cb2sc.SupportConceptOid + INNER JOIN costbearer cb ON cb2sc.CostBearerOid = cb.Oid + INNER JOIN organisation org ON org.CostBearerOid = cb.Oid + INNER JOIN customer c ON sc.CustomerOid = c.Oid + INNER JOIN person p ON c.PersonOid = p.Oid + INNER JOIN servicerecord sr ON sr.CostBearer2SupportConceptOid = cb2sc.Oid + INNER JOIN servicedescription sd ON sr.ServiceDescriptionOid = sd.Oid + INNER JOIN servicecategory scat ON sd.ServiceCategoryOid = scat.Oid + WHERE c.IsActive = 1 AND sc.IsActive = 1 + AND (org.Name = 'LVR' OR org.Name = 'LWL') + AND sr.StartDate >= ':Monat_Start' AND sr.StartDate < ':Monat_End' + AND scat.Billable = 1 + GROUP BY cb2sc.Oid, c.DebitorNumber, org.Name, p.LastName, p.FirstName, c.CostCenter + HAVING SUM(sr.roundedduration) > 0 +) AS stunden +ORDER BY stunden.LastName, stunden.FirstName +"; + return sql; + } + + private static List CreateAttachmentFile(DateTime date, DataTable dtAbgrenzungen, Dictionary oid2GeneratedNumber) + { + try + { + // Spalten aus der bereits ausgeführten Abgrenzungs-DataTable verwenden: + // 0 = OID, 11 = DebitorNumber, 12 = 'Abgrenzung OrgName', 15 = Betrag, 16 = 'Abgr. Nachname, Vorname' + DataTable table = new DataTable(); + string[] spalten = { "Rechnungsnr.", "Empfänger", "Debitornr.", "Erlöskonto", "Kostenstelle", "Verwendung", "Betrag" }; + foreach (var spalte in spalten) + table.Columns.Add(spalte, typeof(string)); + + foreach (DataRow booking in dtAbgrenzungen.Rows) + { + string oid = booking[0].ToString(); + string invoiceNumber = String.Empty; + if (oid2GeneratedNumber != null && oid2GeneratedNumber.ContainsKey(oid)) + invoiceNumber = oid2GeneratedNumber[oid]; + + string erloeskonto = SetKonto(booking[12]); + + DataRow row = table.NewRow(); + row[0] = invoiceNumber; + row[1] = booking[12].ToString().Replace("Abgrenzung ", ""); + row[2] = booking[11]; + row[3] = erloeskonto; + row[4] = booking[36]; // c.CostCenter + row[5] = booking[16].ToString().Replace("Abgr. ", ""); + row[6] = String.Format("{0:0.00}", booking[15]); + table.Rows.Add(row); + } + + var queryReportObject = QueryRO.Create(new Query() { Title = "Export" }, table); + queryReportObject.Name = String.Format("Abgrenzungsbuchungen {0:MMMM yyyy}", date); + + var queryReport = new Bericht(); + queryReport.SetReportDataSource(queryReportObject); + queryReport.CreateDocument(); + + var pdf = new FileAttachmentDC(); + pdf.FileName = String.Format("Abgrenzungsbuchungen{0:MMyyyy}.pdf", date); + using (var ms = new MemoryStream()) + { + queryReport.ExportToPdf(ms); + pdf.BinaryData = ms.ToArray(); + } + + return new List { pdf }; + } + catch (Exception) + { + return null; + } + } + + public static DataTable ExecuteQuery(String sql, DateTime dt) + { + var newsql = sql; + newsql = newsql.Replace(":PeriodeSlash", String.Format("{0:MM/yyyy}", dt)); + newsql = newsql.Replace(":Periode", String.Format("{0:MMyyyy}", dt)); + newsql = newsql.Replace(":Abrechnungsmonat", String.Format("{0:ddMMyyyy}", dt)); + newsql = newsql.Replace(":Monat_Start", String.Format("{0:yyyy-MM}-01", dt)); + dt = dt.AddMonths(1); + newsql = newsql.Replace(":Monat_End", String.Format("{0:yyyy-MM}-01", dt)); + + return DAOFactory.AdoDAO.ExecuteQuery(newsql).Tables[0]; + } + } +} diff --git a/ReportImp/LyvieKupfer/Invoicing/CustomInvoiceCreation.cs b/ReportImp/LyvieKupfer/Invoicing/CustomInvoiceCreation.cs index e69d045d7..5eb963cef 100644 --- a/ReportImp/LyvieKupfer/Invoicing/CustomInvoiceCreation.cs +++ b/ReportImp/LyvieKupfer/Invoicing/CustomInvoiceCreation.cs @@ -20,8 +20,7 @@ namespace LyvieKupfer.Invoicing if (!ii.RateFactor.HasValue) { var rateFactor = iServiceRecord.CostBearer.CostRatePeriods.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, iServiceRecord.Start.Value); - if (rateFactor != null && rateFactor.CostRateValue.HasValue - && !(iServiceRecord.ServiceDescription.Name.ToLower().Contains("fehlkontakt") || (iServiceRecord.ServiceDescription.ProzentAbrechnung.HasValue && iServiceRecord.ServiceDescription.ProzentAbrechnung.Value < 100))) + if (rateFactor != null && rateFactor.CostRateValue.HasValue) { ii.RateFactor = rateFactor.CostRateValue; //ii.UnitCount = ii.UnitCount.Value * ((100 + ii.RateFactor.Value) / 100); diff --git a/ReportImp/Ruhrstern/Reporting/MitarbeiterstundenkontoJahr.designer.cs b/ReportImp/Ruhrstern/Reporting/MitarbeiterstundenkontoJahr.designer.cs index 3e67e8b6d..c41672b02 100644 --- a/ReportImp/Ruhrstern/Reporting/MitarbeiterstundenkontoJahr.designer.cs +++ b/ReportImp/Ruhrstern/Reporting/MitarbeiterstundenkontoJahr.designer.cs @@ -45,6 +45,7 @@ namespace Ruhrstern this.xrTableCell19 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell20 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell28 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell32 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell29 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell16 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell27 = new DevExpress.XtraReports.UI.XRTableCell(); @@ -61,6 +62,7 @@ namespace Ruhrstern this.xrTableCell4 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell2 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell9 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell31 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell18 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell8 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell10 = new DevExpress.XtraReports.UI.XRTableCell(); @@ -106,12 +108,10 @@ namespace Ruhrstern this.xrLabel2 = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel1 = new DevExpress.XtraReports.UI.XRLabel(); this.GroupFooter2 = new DevExpress.XtraReports.UI.GroupFooterBand(); + this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); this.fieldRelationGesamt = new DevExpress.XtraReports.UI.CalculatedField(); this.ausfallFaktor = new DevExpress.XtraReports.UI.CalculatedField(); - this.xrTableCell31 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell32 = new DevExpress.XtraReports.UI.XRTableCell(); this.calculatedField1 = new DevExpress.XtraReports.UI.CalculatedField(); - this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); ((System.ComponentModel.ISupportInitialize)(this.xrTableDetail)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTableHeader)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable1)).BeginInit(); @@ -200,6 +200,15 @@ namespace Ruhrstern this.xrTableCell28.Text = "xrTableCell28"; this.xrTableCell28.Weight = 0.056209364894545658D; // + // xrTableCell32 + // + this.xrTableCell32.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "EmployeeInfoList.EmployeeDetails.EmployeeDetail.StundenSollOhneUrlaubKrankheit")}); + this.xrTableCell32.Multiline = true; + this.xrTableCell32.Name = "xrTableCell32"; + this.xrTableCell32.TextFormatString = "{0:0.00}"; + this.xrTableCell32.Weight = 0.051437428053343032D; + // // xrTableCell29 // this.xrTableCell29.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { @@ -350,6 +359,13 @@ namespace Ruhrstern this.xrTableCell9.Text = "Stunden aus Feier-tagen"; this.xrTableCell9.Weight = 0.056209368959342643D; // + // xrTableCell31 + // + this.xrTableCell31.Multiline = true; + this.xrTableCell31.Name = "xrTableCell31"; + this.xrTableCell31.Text = "Tatsäch-liche SOLL Stunden"; + this.xrTableCell31.Weight = 0.051437439140044339D; + // // xrTableCell18 // this.xrTableCell18.Multiline = true; @@ -743,6 +759,10 @@ namespace Ruhrstern this.GroupFooter2.HeightF = 25F; this.GroupFooter2.Name = "GroupFooter2"; // + // bindingSource1 + // + this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.MitarbeiterstundenkontoMonateRO); + // // fieldRelationGesamt // this.fieldRelationGesamt.DataMember = "EmployeeInfoList.EmployeeDetails"; @@ -757,31 +777,11 @@ namespace Ruhrstern " *100\n"; this.ausfallFaktor.Name = "ausfallFaktor"; // - // xrTableCell31 - // - this.xrTableCell31.Multiline = true; - this.xrTableCell31.Name = "xrTableCell31"; - this.xrTableCell31.Text = "Tatsäch-liche SOLL Stunden"; - this.xrTableCell31.Weight = 0.051437439140044339D; - // - // xrTableCell32 - // - this.xrTableCell32.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "EmployeeInfoList.EmployeeDetails.EmployeeDetail.StundenSollOhneUrlaubKrankheit")}); - this.xrTableCell32.Multiline = true; - this.xrTableCell32.Name = "xrTableCell32"; - this.xrTableCell32.TextFormatString = "{0:0.00}"; - this.xrTableCell32.Weight = 0.051437428053343032D; - // // calculatedField1 // this.calculatedField1.DataMember = "EmployeeInfoList"; this.calculatedField1.Name = "calculatedField1"; // - // bindingSource1 - // - this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.MitarbeiterstundenkontoMonateRO); - // // MitarbeiterstundenkontoJahr // this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] { diff --git a/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.cs b/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.cs index 627a245e6..c38bbc00a 100644 --- a/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.cs +++ b/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.cs @@ -20,7 +20,25 @@ namespace Ruhrstern var msb = PluginLoader.FindClass(); msb.CreateReport(pRO); - bindingSource1.DataSource = pRO; - } + // Für den Ausfallfaktor brauche ich die um die Feiertage korrigierten Summen der Sollzeiten + decimal sollOhneGes = 0; + decimal sollMaxGes = 0; + foreach (var td in pRO.TeamDetailList) + { + decimal sollOhne = 0; + decimal sollMax = 0; + foreach (var ed in td.EmployeeDetailList) + { + sollOhne += ed.Custom3; + sollMax += ed.Custom4; + } + td.MittelbarIst = (1 - (sollOhne) / sollMax) * 100; + sollMaxGes += sollMax; + sollOhneGes += sollOhne; + } + pRO.MittelbarIst = (1 - (sollOhneGes) / sollMaxGes) * 100; + + this.bindingSource1.DataSource = pRO; + } } } diff --git a/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.designer.cs b/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.designer.cs index bba6babb3..73af4ccfd 100644 --- a/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.designer.cs +++ b/ReportImp/Ruhrstern/Reporting/Teamstundenkonto.designer.cs @@ -36,7 +36,9 @@ namespace Ruhrstern this.xrTableCell3 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell19 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell20 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell57 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell28 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell58 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell16 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell27 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell22 = new DevExpress.XtraReports.UI.XRTableCell(); @@ -45,6 +47,7 @@ namespace Ruhrstern this.xrTableCell25 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell24 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell26 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell59 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTable1 = new DevExpress.XtraReports.UI.XRTable(); this.xrTableRow1 = new DevExpress.XtraReports.UI.XRTableRow(); this.xrTableCell35 = new DevExpress.XtraReports.UI.XRTableCell(); @@ -52,6 +55,7 @@ namespace Ruhrstern this.xrTableCell38 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell39 = new DevExpress.XtraReports.UI.XRTableCell(); this.cellSollGesamt = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell60 = new DevExpress.XtraReports.UI.XRTableCell(); this.cellFLSSollGesamt = new DevExpress.XtraReports.UI.XRTableCell(); this.cellFLSIstGesamt = new DevExpress.XtraReports.UI.XRTableCell(); this.cellFLSPlusMinusGesamt = new DevExpress.XtraReports.UI.XRTableCell(); @@ -79,21 +83,6 @@ namespace Ruhrstern this.DetailReport2 = new DevExpress.XtraReports.UI.DetailReportBand(); this.Detail3 = new DevExpress.XtraReports.UI.DetailBand(); this.GroupHeader2 = new DevExpress.XtraReports.UI.GroupHeaderBand(); - this.GroupFooter2 = new DevExpress.XtraReports.UI.GroupFooterBand(); - this.xrTable3 = new DevExpress.XtraReports.UI.XRTable(); - this.xrTableRow3 = new DevExpress.XtraReports.UI.XRTableRow(); - this.xrTableCell1 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell7 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell8 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell9 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell10 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell11 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell13 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell14 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell15 = new DevExpress.XtraReports.UI.XRTableCell(); - this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); - this.ReportFooter1 = new DevExpress.XtraReports.UI.ReportFooterBand(); this.xrTable4 = new DevExpress.XtraReports.UI.XRTable(); this.xrTableRow4 = new DevExpress.XtraReports.UI.XRTableRow(); this.xrTableCell2 = new DevExpress.XtraReports.UI.XRTableCell(); @@ -111,15 +100,26 @@ namespace Ruhrstern this.xrTableCell54 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell55 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell56 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell57 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell58 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell59 = new DevExpress.XtraReports.UI.XRTableCell(); - this.xrTableCell60 = new DevExpress.XtraReports.UI.XRTableCell(); + this.GroupFooter2 = new DevExpress.XtraReports.UI.GroupFooterBand(); + this.xrTable3 = new DevExpress.XtraReports.UI.XRTable(); + this.xrTableRow3 = new DevExpress.XtraReports.UI.XRTableRow(); + this.xrTableCell1 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell7 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell8 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell9 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell10 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell11 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell13 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell14 = new DevExpress.XtraReports.UI.XRTableCell(); + this.xrTableCell15 = new DevExpress.XtraReports.UI.XRTableCell(); + this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); + this.ReportFooter1 = new DevExpress.XtraReports.UI.ReportFooterBand(); ((System.ComponentModel.ISupportInitialize)(this.xrTableDetail)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.xrTable4)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.xrTable4)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this)).BeginInit(); // // Detail @@ -197,6 +197,15 @@ namespace Ruhrstern this.xrTableCell20.Text = "xrTableCell20"; this.xrTableCell20.Weight = 0.063901139337592991D; // + // xrTableCell57 + // + this.xrTableCell57.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.EmployeeDetailList.Custom2")}); + this.xrTableCell57.Multiline = true; + this.xrTableCell57.Name = "xrTableCell57"; + this.xrTableCell57.TextFormatString = "{0:0.00}"; + this.xrTableCell57.Weight = 0.056000251185259795D; + // // xrTableCell28 // this.xrTableCell28.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { @@ -205,6 +214,15 @@ namespace Ruhrstern this.xrTableCell28.Text = "xrTableCell28"; this.xrTableCell28.Weight = 0.051245961993314645D; // + // xrTableCell58 + // + this.xrTableCell58.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.EmployeeDetailList.Custom1")}); + this.xrTableCell58.Multiline = true; + this.xrTableCell58.Name = "xrTableCell58"; + this.xrTableCell58.TextFormatString = "{0:0.00}"; + this.xrTableCell58.Weight = 0.054950903298298021D; + // // xrTableCell16 // this.xrTableCell16.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { @@ -269,6 +287,15 @@ namespace Ruhrstern this.xrTableCell26.Text = "xrTableCell26"; this.xrTableCell26.Weight = 0.062885088357332045D; // + // xrTableCell59 + // + this.xrTableCell59.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.EmployeeDetailList.Resturlaub")}); + this.xrTableCell59.Multiline = true; + this.xrTableCell59.Name = "xrTableCell59"; + this.xrTableCell59.TextFormatString = "{0:0.00}"; + this.xrTableCell59.Weight = 0.062885088357332045D; + // // xrTable1 // this.xrTable1.Font = new DevExpress.Drawing.DXFont("Arial", 8F, DevExpress.Drawing.DXFontStyle.Bold, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { @@ -339,6 +366,15 @@ namespace Ruhrstern this.cellSollGesamt.Text = "cellSollGesamt"; this.cellSollGesamt.Weight = 0.051245893198052866D; // + // xrTableCell60 + // + this.xrTableCell60.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "MittelbarIst")}); + this.xrTableCell60.Multiline = true; + this.xrTableCell60.Name = "xrTableCell60"; + this.xrTableCell60.TextFormatString = "{0:0.00}"; + this.xrTableCell60.Weight = 0.05495106840692629D; + // // cellFLSSollGesamt // this.cellFLSSollGesamt.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { @@ -571,130 +607,6 @@ namespace Ruhrstern this.GroupHeader2.HeightF = 69.99998F; this.GroupHeader2.Name = "GroupHeader2"; // - // GroupFooter2 - // - this.GroupFooter2.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { - this.xrTable3}); - this.GroupFooter2.HeightF = 52.08333F; - this.GroupFooter2.Name = "GroupFooter2"; - // - // xrTable3 - // - this.xrTable3.Font = new DevExpress.Drawing.DXFont("Arial", 8F, DevExpress.Drawing.DXFontStyle.Bold, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { - new DevExpress.Drawing.DXFontAdditionalProperty("GdiCharSet", ((byte)(0)))}); - this.xrTable3.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F); - this.xrTable3.Name = "xrTable3"; - this.xrTable3.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); - this.xrTable3.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] { - this.xrTableRow3}); - this.xrTable3.SizeF = new System.Drawing.SizeF(1005F, 25F); - this.xrTable3.StylePriority.UseBorders = false; - this.xrTable3.StylePriority.UseFont = false; - this.xrTable3.StylePriority.UsePadding = false; - this.xrTable3.StylePriority.UseTextAlignment = false; - this.xrTable3.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; - // - // xrTableRow3 - // - this.xrTableRow3.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] { - this.xrTableCell1, - this.xrTableCell7, - this.xrTableCell8, - this.xrTableCell9, - this.xrTableCell10, - this.xrTableCell11, - this.xrTableCell12, - this.xrTableCell13, - this.xrTableCell14, - this.xrTableCell15}); - this.xrTableRow3.Name = "xrTableRow3"; - this.xrTableRow3.Weight = 1D; - // - // xrTableCell1 - // - this.xrTableCell1.Name = "xrTableCell1"; - this.xrTableCell1.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 2, 0, 0, 100F); - this.xrTableCell1.StylePriority.UseFont = false; - this.xrTableCell1.StylePriority.UsePadding = false; - this.xrTableCell1.StylePriority.UseTextAlignment = false; - this.xrTableCell1.Text = "Gesamt [TeamDetailList.TeamName]"; - this.xrTableCell1.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; - this.xrTableCell1.Weight = 0.36763827407327837D; - // - // xrTableCell7 - // - this.xrTableCell7.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.SollGesamt", "{0:0.00}")}); - this.xrTableCell7.Name = "xrTableCell7"; - this.xrTableCell7.Text = "xrTableCell7"; - this.xrTableCell7.Weight = 0.054950903298297958D; - // - // xrTableCell8 - // - this.xrTableCell8.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.FlsSollGesamt", "{0:0.00}")}); - this.xrTableCell8.Name = "xrTableCell8"; - this.xrTableCell8.Text = "xrTableCell8"; - this.xrTableCell8.Weight = 0.052425979600498759D; - // - // xrTableCell9 - // - this.xrTableCell9.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.FlsIstGesamt", "{0:0.00}")}); - this.xrTableCell9.Name = "xrTableCell9"; - this.xrTableCell9.Text = "xrTableCell9"; - this.xrTableCell9.Weight = 0.050524285938204488D; - // - // xrTableCell10 - // - this.xrTableCell10.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.FlsDiffGesamt", "{0:0.00}")}); - this.xrTableCell10.Name = "xrTableCell10"; - this.xrTableCell10.Text = "xrTableCell10"; - this.xrTableCell10.Weight = 0.062885088357332058D; - // - // xrTableCell11 - // - this.xrTableCell11.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.StundenGesamt", "{0:0.00}")}); - this.xrTableCell11.Name = "xrTableCell11"; - this.xrTableCell11.Text = "xrTableCell11"; - this.xrTableCell11.Weight = 0.0628849782849132D; - // - // xrTableCell12 - // - this.xrTableCell12.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.RelationFlsZuMittelbar", "{0:0.00}")}); - this.xrTableCell12.Name = "xrTableCell12"; - this.xrTableCell12.Text = "xrTableCell12"; - this.xrTableCell12.Weight = 0.06288486821249438D; - // - // xrTableCell13 - // - this.xrTableCell13.Name = "xrTableCell13"; - this.xrTableCell13.Weight = 0.065787587969877145D; - // - // xrTableCell14 - // - this.xrTableCell14.Name = "xrTableCell14"; - this.xrTableCell14.Weight = 0.063119927862939587D; - // - // xrTableCell15 - // - this.xrTableCell15.Name = "xrTableCell15"; - this.xrTableCell15.Weight = 0.063119927862939573D; - // - // bindingSource1 - // - this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.MitarbeiterstundenkontoRO); - // - // ReportFooter1 - // - this.ReportFooter1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { - this.xrTable1}); - this.ReportFooter1.HeightF = 60F; - this.ReportFooter1.Name = "ReportFooter1"; - // // xrTable4 // this.xrTable4.Borders = ((DevExpress.XtraPrinting.BorderSide)((((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Top) @@ -839,38 +751,129 @@ namespace Ruhrstern this.xrTableCell56.Text = "Resturlaub"; this.xrTableCell56.Weight = 0.0631199213956443D; // - // xrTableCell57 + // GroupFooter2 // - this.xrTableCell57.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.EmployeeDetailList.Custom2")}); - this.xrTableCell57.Multiline = true; - this.xrTableCell57.Name = "xrTableCell57"; - this.xrTableCell57.TextFormatString = "{0:0.00}"; - this.xrTableCell57.Weight = 0.056000251185259795D; + this.GroupFooter2.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { + this.xrTable3}); + this.GroupFooter2.HeightF = 52.08333F; + this.GroupFooter2.Name = "GroupFooter2"; // - // xrTableCell58 + // xrTable3 // - this.xrTableCell58.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.EmployeeDetailList.Custom1")}); - this.xrTableCell58.Multiline = true; - this.xrTableCell58.Name = "xrTableCell58"; - this.xrTableCell58.TextFormatString = "{0:0.00}"; - this.xrTableCell58.Weight = 0.054950903298298021D; + this.xrTable3.Font = new DevExpress.Drawing.DXFont("Arial", 8F, DevExpress.Drawing.DXFontStyle.Bold, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { + new DevExpress.Drawing.DXFontAdditionalProperty("GdiCharSet", ((byte)(0)))}); + this.xrTable3.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F); + this.xrTable3.Name = "xrTable3"; + this.xrTable3.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); + this.xrTable3.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] { + this.xrTableRow3}); + this.xrTable3.SizeF = new System.Drawing.SizeF(1005F, 25F); + this.xrTable3.StylePriority.UseBorders = false; + this.xrTable3.StylePriority.UseFont = false; + this.xrTable3.StylePriority.UsePadding = false; + this.xrTable3.StylePriority.UseTextAlignment = false; + this.xrTable3.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; // - // xrTableCell59 + // xrTableRow3 // - this.xrTableCell59.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { - new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.EmployeeDetailList.Resturlaub")}); - this.xrTableCell59.Multiline = true; - this.xrTableCell59.Name = "xrTableCell59"; - this.xrTableCell59.TextFormatString = "{0:0.00}"; - this.xrTableCell59.Weight = 0.062885088357332045D; + this.xrTableRow3.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] { + this.xrTableCell1, + this.xrTableCell7, + this.xrTableCell8, + this.xrTableCell9, + this.xrTableCell10, + this.xrTableCell11, + this.xrTableCell12, + this.xrTableCell13, + this.xrTableCell14, + this.xrTableCell15}); + this.xrTableRow3.Name = "xrTableRow3"; + this.xrTableRow3.Weight = 1D; // - // xrTableCell60 + // xrTableCell1 // - this.xrTableCell60.Multiline = true; - this.xrTableCell60.Name = "xrTableCell60"; - this.xrTableCell60.Weight = 0.05495106840692629D; + this.xrTableCell1.Name = "xrTableCell1"; + this.xrTableCell1.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 2, 0, 0, 100F); + this.xrTableCell1.StylePriority.UseFont = false; + this.xrTableCell1.StylePriority.UsePadding = false; + this.xrTableCell1.StylePriority.UseTextAlignment = false; + this.xrTableCell1.Text = "Gesamt [TeamDetailList.TeamName]"; + this.xrTableCell1.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft; + this.xrTableCell1.Weight = 0.36763827407327837D; + // + // xrTableCell7 + // + this.xrTableCell7.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.MittelbarIst", "{0:0.00}")}); + this.xrTableCell7.Name = "xrTableCell7"; + this.xrTableCell7.Text = "xrTableCell7"; + this.xrTableCell7.Weight = 0.054950903298297958D; + // + // xrTableCell8 + // + this.xrTableCell8.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.FlsSollGesamt", "{0:0.00}")}); + this.xrTableCell8.Name = "xrTableCell8"; + this.xrTableCell8.Text = "xrTableCell8"; + this.xrTableCell8.Weight = 0.052425979600498759D; + // + // xrTableCell9 + // + this.xrTableCell9.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.FlsIstGesamt", "{0:0.00}")}); + this.xrTableCell9.Name = "xrTableCell9"; + this.xrTableCell9.Text = "xrTableCell9"; + this.xrTableCell9.Weight = 0.050524285938204488D; + // + // xrTableCell10 + // + this.xrTableCell10.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.FlsDiffGesamt", "{0:0.00}")}); + this.xrTableCell10.Name = "xrTableCell10"; + this.xrTableCell10.Text = "xrTableCell10"; + this.xrTableCell10.Weight = 0.062885088357332058D; + // + // xrTableCell11 + // + this.xrTableCell11.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.StundenGesamt", "{0:0.00}")}); + this.xrTableCell11.Name = "xrTableCell11"; + this.xrTableCell11.Text = "xrTableCell11"; + this.xrTableCell11.Weight = 0.0628849782849132D; + // + // xrTableCell12 + // + this.xrTableCell12.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "TeamDetailList.RelationFlsZuMittelbar", "{0:0.00}")}); + this.xrTableCell12.Name = "xrTableCell12"; + this.xrTableCell12.Text = "xrTableCell12"; + this.xrTableCell12.Weight = 0.06288486821249438D; + // + // xrTableCell13 + // + this.xrTableCell13.Name = "xrTableCell13"; + this.xrTableCell13.Weight = 0.065787587969877145D; + // + // xrTableCell14 + // + this.xrTableCell14.Name = "xrTableCell14"; + this.xrTableCell14.Weight = 0.063119927862939587D; + // + // xrTableCell15 + // + this.xrTableCell15.Name = "xrTableCell15"; + this.xrTableCell15.Weight = 0.063119927862939573D; + // + // bindingSource1 + // + this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.MitarbeiterstundenkontoRO); + // + // ReportFooter1 + // + this.ReportFooter1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { + this.xrTable1}); + this.ReportFooter1.HeightF = 60.625F; + this.ReportFooter1.Name = "ReportFooter1"; // // Teamstundenkonto // @@ -898,9 +901,9 @@ namespace Ruhrstern this.Version = "23.2"; ((System.ComponentModel.ISupportInitialize)(this.xrTableDetail)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.xrTable4)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable3)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.xrTable4)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); } diff --git a/ReportImp/SamanthaRiegerIntegrationspraxis/SamanthaRiegerIntegrationspraxis.csproj b/ReportImp/SamanthaRiegerIntegrationspraxis/SamanthaRiegerIntegrationspraxis.csproj index 34d9552ed..3f4507237 100644 --- a/ReportImp/SamanthaRiegerIntegrationspraxis/SamanthaRiegerIntegrationspraxis.csproj +++ b/ReportImp/SamanthaRiegerIntegrationspraxis/SamanthaRiegerIntegrationspraxis.csproj @@ -4,7 +4,7 @@ Debug AnyCPU - {C1FED668-ADB9-47E0-B589-1389618E1B6E} + {BD841D90-CD90-44B6-8B3C-5C7D05225842} Library Properties SamanthaRiegerIntegrationspraxis diff --git a/ReportImp/SehtMuenster/Export/AddisonExporter.cs b/ReportImp/SehtMuenster/Export/AddisonExporter.cs index d54d51507..0f40c15de 100644 --- a/ReportImp/SehtMuenster/Export/AddisonExporter.cs +++ b/ReportImp/SehtMuenster/Export/AddisonExporter.cs @@ -90,7 +90,7 @@ namespace SehtMuenster.Export sb.Append(String.Format("{0:0.00}", row[0])); // Betrag sb.Append(";"); - sb.Append("8520"); + sb.Append("48288"); sb.Append(";"); sb.Append(String.Format("{0}", minBelegnummer++)); // Belegnummer sb.Append(";"); @@ -103,9 +103,9 @@ namespace SehtMuenster.Export sb.Append(String.Format("{0}", row[2])); // Debitor sb.Append(";"); - sb.Append(String.Format("{0}", row[3])); // Text + sb.Append(String.Format("{0} {1:MM.yy}", row[3], lastDate)); // Text sb.Append(";"); - sb.Append(String.Format("{0}", row[4])); // Kostenstelle + sb.Append(String.Format("{0}", "118200")); // Kostenstelle derzeit fest - row[4] sb.Append(";"); diff --git a/ReportImp/SpitalstiftungKonstanz/Quittierungsbeleg.cs b/ReportImp/SpitalstiftungKonstanz/Quittierungsbeleg.cs index 6faa8b7ee..3571d8afa 100644 --- a/ReportImp/SpitalstiftungKonstanz/Quittierungsbeleg.cs +++ b/ReportImp/SpitalstiftungKonstanz/Quittierungsbeleg.cs @@ -30,7 +30,7 @@ namespace SpitalstiftungKonstanz //if (pRO == null) // return; - if (pRO.Services != null) + if (pRO.Services != null && pRO.Services.Count > 0) { List servicesBillable = new List(); diff --git a/Service/DCEntityMapper/AiPromptbausteinFolderDC_AiPromptbausteinFolder.cs b/Service/DCEntityMapper/AiPromptbausteinFolderDC_AiPromptbausteinFolder.cs index df97709ae..89b4c704d 100644 --- a/Service/DCEntityMapper/AiPromptbausteinFolderDC_AiPromptbausteinFolder.cs +++ b/Service/DCEntityMapper/AiPromptbausteinFolderDC_AiPromptbausteinFolder.cs @@ -33,7 +33,7 @@ namespace BeWo.Service.DCEntityMapper public override AiPromptbausteinFolder MergeWithEntity(AiPromptbausteinFolderDC pDataContract, AiPromptbausteinFolder pEntity) { - base.MergeWithDC(pEntity, pDataContract); + base.MergeWithEntity(pDataContract, pEntity); pEntity.Title = pDataContract.Title; pEntity.Description = pDataContract.Description; diff --git a/Service/DCEntityMapper/AiPromptbausteinPromptDC_AiPromptbausteinPrompt.cs b/Service/DCEntityMapper/AiPromptbausteinPromptDC_AiPromptbausteinPrompt.cs index 205469c5e..4f2c9f177 100644 --- a/Service/DCEntityMapper/AiPromptbausteinPromptDC_AiPromptbausteinPrompt.cs +++ b/Service/DCEntityMapper/AiPromptbausteinPromptDC_AiPromptbausteinPrompt.cs @@ -42,7 +42,7 @@ namespace BeWo.Service.DCEntityMapper public override AiPromptbausteinPrompt MergeWithEntity(AiPromptbausteinPromptDC pDataContract, AiPromptbausteinPrompt pEntity) { - base.MergeWithDC(pEntity, pDataContract); + base.MergeWithEntity(pDataContract, pEntity); pEntity.Title = pDataContract.Title; pEntity.Description = pDataContract.Description; diff --git a/Service/DCEntityMapper/AiPromptroutineDC_AiPromptroutine.cs b/Service/DCEntityMapper/AiPromptroutineDC_AiPromptroutine.cs new file mode 100644 index 000000000..ee4e97816 --- /dev/null +++ b/Service/DCEntityMapper/AiPromptroutineDC_AiPromptroutine.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.Linq; + +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.ServiceImplementations; +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.Service.DCEntityMapper +{ + public class AiPromptroutineDC_AiPromptroutine : BeWoDataContract_BeWoEntityBase + { + public override AiPromptroutineDC MergeWithDC(AiPromptroutine pEntity, AiPromptroutineDC pDataContract) + { + base.MergeWithDC(pEntity, pDataContract); + + pDataContract.Title = pEntity.Title; + pDataContract.Description = pEntity.Description; + pDataContract.ParentFolderOid = pEntity.ParentFolderOid; + pDataContract.IsPublic = pEntity.IsPublic; + pDataContract.Position = pEntity.Position; + pDataContract.IsFavorite = pEntity.IsFavorite; + pDataContract.ActionType = pEntity.ActionType; + pDataContract.CanEdit = pEntity.CanEdit; + + pDataContract.Steps = MapperFactory.AiPromptroutineStep.MapToNewDCs(pEntity.Steps); + + if (pEntity.CreatorOid is long oid) + pDataContract.Creator = new EmployeeServiceImp().GetActiveCompactEmployeeWithOid(oid); + + return pDataContract; + } + + public override AiPromptroutine MergeWithEntity(AiPromptroutineDC pDataContract, AiPromptroutine pEntity) + { + base.MergeWithEntity(pDataContract, pEntity); + + pEntity.Title = pDataContract.Title; + pEntity.Description = pDataContract.Description; + pEntity.ParentFolderOid = pDataContract.ParentFolderOid; + pEntity.CreatorOid = pDataContract.Creator.EmployeeOid; + pEntity.IsPublic = pDataContract.IsPublic; + pEntity.Position = pDataContract.Position; + pEntity.IsFavorite = pDataContract.IsFavorite; + pEntity.ActionType = pDataContract.ActionType; + pEntity.CanEdit = pDataContract.CanEdit; + + pEntity.Steps = DAOFactory.GenericDAO.LoadByIDs(pDataContract.Steps.Select(x => x.Oid.Value)); + + if (pDataContract.ParentFolderOid is long oid && oid >= 0) + pEntity.ParentFolderOid = pDataContract.ParentFolderOid; + + return pEntity; + } + } +} diff --git a/Service/DCEntityMapper/AiPromptroutineStepDC_AiPromptroutineStep.cs b/Service/DCEntityMapper/AiPromptroutineStepDC_AiPromptroutineStep.cs new file mode 100644 index 000000000..affa4a247 --- /dev/null +++ b/Service/DCEntityMapper/AiPromptroutineStepDC_AiPromptroutineStep.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using System.Linq; + +using BeWo.Data.Access; +using BeWo.Data.Entities; + +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Feature.AI; + +namespace BeWo.Service.DCEntityMapper +{ + public class AiPromptroutineStepDC_AiPromptroutineStep : BeWoDataContract_BeWoEntityBase + { + public override AiPromptroutineStepDC MergeWithDC(AiPromptroutineStep pEntity, AiPromptroutineStepDC pDataContract) + { + base.MergeWithDC(pEntity, pDataContract); + + pDataContract.Position = pEntity.Position; + pDataContract.PromptReference = MapperFactory.AiPromptbausteinPrompt.MapToNewDC(pEntity.PromptReference); + pDataContract.ReferenceVersion = pEntity.ReferenceVersion; + + return pDataContract; + } + + public override AiPromptroutineStep MergeWithEntity(AiPromptroutineStepDC pDataContract, AiPromptroutineStep pEntity) + { + base.MergeWithEntity(pDataContract, pEntity); + + pEntity.Position = pDataContract.Position; + pEntity.PromptReference = DAOFactory.GenericDAO.LoadByID(pDataContract.PromptReference.Oid.Value); + pEntity.ReferenceVersion = pDataContract.ReferenceVersion; + + return pEntity; + } + } +} diff --git a/Service/DCEntityMapper/AiUserSettingDC_AiUserSetting.cs b/Service/DCEntityMapper/AiUserSettingDC_AiUserSetting.cs index 3b84600a1..28f776230 100644 --- a/Service/DCEntityMapper/AiUserSettingDC_AiUserSetting.cs +++ b/Service/DCEntityMapper/AiUserSettingDC_AiUserSetting.cs @@ -24,7 +24,7 @@ namespace BeWo.Service.DCEntityMapper public override AiUserSetting MergeWithEntity(AiUserSettingDC pDataContract, AiUserSetting pEntity) { - base.MergeWithDC(pEntity, pDataContract); + base.MergeWithEntity(pDataContract, pEntity); pEntity.ApplicationUser = UserRightHelper.GetLoggedInUser(); pEntity.AutoStartRecording = pDataContract.AutoStartRecording; diff --git a/Service/DCEntityMapper/BeWoDataContract_BeWoEntityBase.cs b/Service/DCEntityMapper/BeWoDataContract_BeWoEntityBase.cs index dcb5bb5a0..4a2f26f3e 100644 --- a/Service/DCEntityMapper/BeWoDataContract_BeWoEntityBase.cs +++ b/Service/DCEntityMapper/BeWoDataContract_BeWoEntityBase.cs @@ -26,8 +26,8 @@ namespace BeWo.Service.DCEntityMapper { ConcurrencyCheck(pDataContract.Version, pEntity); - pEntity.Oid = pDataContract.Oid; - pEntity.Version = pDataContract.Version; + //pEntity.Oid = pDataContract.Oid; + //pEntity.Version = pDataContract.Version; pEntity.Notice = pDataContract.Notice; return pEntity; diff --git a/Service/DCEntityMapper/MapperFactory.cs b/Service/DCEntityMapper/MapperFactory.cs index d0a2537a2..99d65f3d8 100644 --- a/Service/DCEntityMapper/MapperFactory.cs +++ b/Service/DCEntityMapper/MapperFactory.cs @@ -814,6 +814,8 @@ namespace BeWo.Service.DCEntityMapper public static AiConfigDC_AiConfig AiConfig { get; } = new AiConfigDC_AiConfig(); public static AiPromptbausteinFolderDC_AiPromptbausteinFolder AiPromptbausteinFolder { get; } = new AiPromptbausteinFolderDC_AiPromptbausteinFolder(); public static AiPromptbausteinPromptDC_AiPromptbausteinPrompt AiPromptbausteinPrompt { get; } = new AiPromptbausteinPromptDC_AiPromptbausteinPrompt(); + public static AiPromptroutineDC_AiPromptroutine AiPromptroutine { get; } = new AiPromptroutineDC_AiPromptroutine(); + public static AiPromptroutineStepDC_AiPromptroutineStep AiPromptroutineStep { get; } = new AiPromptroutineStepDC_AiPromptroutineStep(); public static AiUserSettingDC_AiUserSetting AiUserSetting { get; } = new AiUserSettingDC_AiUserSetting(); public static AddressDC_Address Address { get; } = new AddressDC_Address(); public static GkvAbrechnungLightDC_GkvAbrechnungLight GkvAbrechnungLight { get; } = new GkvAbrechnungLightDC_GkvAbrechnungLight(); diff --git a/Service/DCEntityMapper/StoredFileDC_StoredFile.cs b/Service/DCEntityMapper/StoredFileDC_StoredFile.cs index 563244828..c9170d4b7 100644 --- a/Service/DCEntityMapper/StoredFileDC_StoredFile.cs +++ b/Service/DCEntityMapper/StoredFileDC_StoredFile.cs @@ -29,7 +29,7 @@ namespace BeWo.Service.DCEntityMapper public override StoredFile MergeWithEntity(StoredFileDC pDataContract, StoredFile pEntity) { - base.MergeWithDC(pEntity, pDataContract); + base.MergeWithEntity(pDataContract, pEntity); pEntity.FileName = pDataContract.FileName; pEntity.FilePath = pDataContract.FilePath; diff --git a/Service/Plugins/PluginLoader.cs b/Service/Plugins/PluginLoader.cs index 178281766..fdac80853 100644 --- a/Service/Plugins/PluginLoader.cs +++ b/Service/Plugins/PluginLoader.cs @@ -264,7 +264,8 @@ namespace BeWo.Service.Plugins //t = "7114701269"; // Die Brücke Hilfe und Halt //t = "6447060239"; // Empathie Fachassistenz //t = "6919016656"; // Leben und Wohnen Christian Wilke - //t = "8281327384"; // Caritasverband Düren-Jülich e.V. (Eingliederungshilfe) + //t = "8281327384"; // Caritasverband Düren-Jülich e.V. (Jugendhilfe - Hr Freuen) + //t = "4512933309"; // Caritasverband Düren-Jülich e.V. (BeWo - Eingliederungshilfe) //t = "6023735102"; // Kölner BeWo (Selbstbestimmt Leben) //t = "2998118179"; // BeWo Plus //t = "9254115251"; // Praunheimer Werkstätten 2.DB diff --git a/Service/Service.csproj b/Service/Service.csproj index 21f19690e..ce97d80bc 100644 --- a/Service/Service.csproj +++ b/Service/Service.csproj @@ -247,6 +247,8 @@ + + diff --git a/Shared/BeWoEntityEnums.cs b/Shared/BeWoEntityEnums.cs index 8e0a824ce..b71bc814b 100644 --- a/Shared/BeWoEntityEnums.cs +++ b/Shared/BeWoEntityEnums.cs @@ -199,7 +199,9 @@ namespace BS.Shared AiVoiceData = 186, AiPromptbausteinPrompt = 187, AiPromptbausteinFolder = 188, - AiUserSetting = 189 + AiUserSetting = 189, + AiPromptroutine = 190, + AiPromptroutineStep = 191, } public enum SystemEntryID diff --git a/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderStructureDC.cs b/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderStructureDC.cs deleted file mode 100644 index 290d1887e..000000000 --- a/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderStructureDC.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Management.Instrumentation; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; - -namespace BS.Shared.DataContracts.Feature.AI -{ - //[DataContract] - //public class AiPromptbausteinFolderStructureDC : IDataContract - //{ - // public AiPromptbausteinFolderDC MyProperty { get; set; } - //} -} diff --git a/Shared/DataContracts/Feature/AI/AiPromptroutineDC.cs b/Shared/DataContracts/Feature/AI/AiPromptroutineDC.cs new file mode 100644 index 000000000..5167a54f9 --- /dev/null +++ b/Shared/DataContracts/Feature/AI/AiPromptroutineDC.cs @@ -0,0 +1,28 @@ +using BS.Shared.DataContracts.Compact; +using BS.Shared.Interface.Feature.AICore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.DataContracts.Feature.AI +{ + public class AiPromptroutineDC : BeWoDataContract, IAiPromptroutine + { + [DataMember] public string Title { get; set; } + [DataMember] public string Description { get; set; } + [DataMember] public long? ParentFolderOid { get; set; } + [DataMember] public CompactEmployeeDC Creator { get; set; } + [DataMember] public bool IsPublic { get; set; } + [DataMember] public int Position { get; set; } + [DataMember] public bool IsFavorite { get; set; } + [DataMember] public AiActionType ActionType { get; set; } + + [DataMember] public bool CanEdit { get; set; } + [DataMember] public List Steps { get; set; } = new List { }; + + List IAiPromptroutine.Steps => this.Steps.Select(x => x as IAiPromptroutineStep).ToList(); + } +} diff --git a/Shared/DataContracts/Feature/AI/AiPromptroutineStepDC.cs b/Shared/DataContracts/Feature/AI/AiPromptroutineStepDC.cs new file mode 100644 index 000000000..e29bed16c --- /dev/null +++ b/Shared/DataContracts/Feature/AI/AiPromptroutineStepDC.cs @@ -0,0 +1,21 @@ +using BS.Shared.DataContracts.Compact; +using BS.Shared.Interface; +using BS.Shared.Interface.Feature.AICore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.DataContracts.Feature.AI +{ + public class AiPromptroutineStepDC : BeWoDataContract, IAiPromptroutineStep + { + [DataMember] public int Position { get; set; } + [DataMember] public AiPromptbausteinPromptDC PromptReference { get; set; } + [DataMember] public long ReferenceVersion { get; set; } + + public IAiPromptbausteinPrompt Reference => PromptReference; + } +} diff --git a/Shared/Extensions/AiPromptroutineExtensions.cs b/Shared/Extensions/AiPromptroutineExtensions.cs new file mode 100644 index 000000000..7364acb79 --- /dev/null +++ b/Shared/Extensions/AiPromptroutineExtensions.cs @@ -0,0 +1,31 @@ +using BS.Shared.Interface.Feature.AICore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.Extensions +{ + public static class AiPromptroutineExtensions + { + public static bool CanExecuteRoutine(this IAiPromptroutine routine) + { + if (routine?.Steps is null || !routine.Steps.Any()) + return false; + + foreach (var step in routine.Steps) + { + // Delete + if (step.Reference is null) + return false; + + // Update + if (step.Reference.Version != step.ReferenceVersion) + return false; + } + + return true; + } + } +} diff --git a/Shared/Interface/IAiPromptbaustein.cs b/Shared/Interface/Feature/AICore/IAiPromptbaustein.cs similarity index 100% rename from Shared/Interface/IAiPromptbaustein.cs rename to Shared/Interface/Feature/AICore/IAiPromptbaustein.cs diff --git a/Shared/Interface/IAiPromptbausteinPrompt.cs b/Shared/Interface/Feature/AICore/IAiPromptbausteinPrompt.cs similarity index 80% rename from Shared/Interface/IAiPromptbausteinPrompt.cs rename to Shared/Interface/Feature/AICore/IAiPromptbausteinPrompt.cs index 6de829fb6..849661bec 100644 --- a/Shared/Interface/IAiPromptbausteinPrompt.cs +++ b/Shared/Interface/Feature/AICore/IAiPromptbausteinPrompt.cs @@ -8,6 +8,7 @@ namespace BS.Shared.Interface { public interface IAiPromptbausteinPrompt { - string Prompt { get; set; } + long? Version { get; } + string Prompt { get; } } } diff --git a/Shared/Interface/Feature/AICore/IAiPromptroutine.cs b/Shared/Interface/Feature/AICore/IAiPromptroutine.cs new file mode 100644 index 000000000..512fc4121 --- /dev/null +++ b/Shared/Interface/Feature/AICore/IAiPromptroutine.cs @@ -0,0 +1,25 @@ +using BS.Shared.DataContracts.Compact; +using BS.Shared.DataContracts.Feature.AI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.Interface.Feature.AICore +{ + public interface IAiPromptroutine + { + string Title { get; } + string Description { get; } + long? ParentFolderOid { get; } + bool IsPublic { get; } + int Position { get; } + bool IsFavorite { get; } + AiActionType ActionType { get; } + + bool CanEdit { get; } + List Steps { get; } + } +} diff --git a/Shared/Interface/Feature/AICore/IAiPromptroutineStep.cs b/Shared/Interface/Feature/AICore/IAiPromptroutineStep.cs new file mode 100644 index 000000000..95176e815 --- /dev/null +++ b/Shared/Interface/Feature/AICore/IAiPromptroutineStep.cs @@ -0,0 +1,17 @@ +using BS.Shared.DataContracts.Feature.AI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.Interface.Feature.AICore +{ + public interface IAiPromptroutineStep + { + int Position { get; } + IAiPromptbausteinPrompt Reference { get; } + long ReferenceVersion { get; } + } +} diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index 86a70203f..5e7a18da4 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -194,11 +194,12 @@ + + - @@ -419,6 +420,7 @@ + @@ -433,8 +435,10 @@ - - + + + + diff --git a/Tools/BeWoLogCleaner/.cr/personal/FavoritesList/List.xml b/Tools/BeWoLogCleaner/.cr/personal/FavoritesList/List.xml new file mode 100644 index 000000000..a60e5ed6c --- /dev/null +++ b/Tools/BeWoLogCleaner/.cr/personal/FavoritesList/List.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Tools/BeWoLogCleaner/BeWoLogCleaner/App.config b/Tools/BeWoLogCleaner/BeWoLogCleaner/App.config index f2211e327..ece03edbb 100644 --- a/Tools/BeWoLogCleaner/BeWoLogCleaner/App.config +++ b/Tools/BeWoLogCleaner/BeWoLogCleaner/App.config @@ -17,6 +17,7 @@ + diff --git a/Tools/BeWoLogCleaner/BeWoLogCleaner/Program.cs b/Tools/BeWoLogCleaner/BeWoLogCleaner/Program.cs index 96952346f..b86ea8d36 100644 --- a/Tools/BeWoLogCleaner/BeWoLogCleaner/Program.cs +++ b/Tools/BeWoLogCleaner/BeWoLogCleaner/Program.cs @@ -24,8 +24,10 @@ namespace BeWoLogCleaner static void ReadConfig() { - var path = "clean_config.json"; - var json = File.ReadAllText(path); + var path = AppDomain.CurrentDomain.BaseDirectory; + var file = "clean_config.json"; + var path2 = Path.Combine(path, file); + var json = File.ReadAllText(path2); var json_obj = JsonSerializer.Deserialize(json); Config = json_obj; }