From 5e9864ab9bc2b72632e05db4b6a74ff6bd5e9737 Mon Sep 17 00:00:00 2001 From: Lyndon Jetten Date: Sat, 28 Oct 2023 13:34:32 +0200 Subject: [PATCH] =?UTF-8?q?Bug=20beim=20Pr=C3=BCfen=20auf=20ung=C3=BCltige?= =?UTF-8?q?=20Unterschriften=20behoben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Zeiterfassung/ServiceRecordView2.xaml | 2 +- Data/Access/SearchDAO.cs | 32 +++- Data/Entities/ServiceRecordHistory.cs | 29 ++++ Data/Mappings/ServiceRecordHistory.hbm.xml | 3 + ...story ConfirmationReceiptSignatureOids.txt | 1 + Service/Plugins/PluginLoader.cs | 2 +- .../OperationsServiceImp.cs | 143 +++++------------- 7 files changed, 103 insertions(+), 109 deletions(-) create mode 100644 Model/Changes_2023_10_27_ServiceRecordHistory ConfirmationReceiptSignatureOids.txt diff --git a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml index 6cce464ee..7da86d102 100644 --- a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml +++ b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml @@ -324,7 +324,7 @@ - + diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs index ffbb0dd5a..41c2e0a8c 100644 --- a/Data/Access/SearchDAO.cs +++ b/Data/Access/SearchDAO.cs @@ -5547,6 +5547,7 @@ namespace BeWo.Data.Access return result; } + // ToDo: Veraltet und wird nicht mehr benutzt! public List FindFormerlyLinkedServiceRecords(long confirmationReceiptSignatureOid, long customerOid, long supportConceptOid, long costBearer2SupportConceptOid, string timeSpanString) { if(timeSpanString?.Length != 21) @@ -5564,14 +5565,41 @@ namespace BeWo.Data.Access var timeSpanEnd = DateTime.Parse($"{year}-{m2}-{d2}"); // ToDo: Warum wird geprüft, ob der InsTs im Intervall liegt? + // ToDo: Die ausschließen, die mit einer aktiven ConfirmationReceiptSignature verlinkt sind! var criteria = CreateCriteria() //.Add(Restrictions.Between(nameof(ServiceRecord.InsTs), timeSpanStart, timeSpanEnd)) .Add(Restrictions.Eq(nameof(ServiceRecord.CustomerOid), customerOid)) - .Add(Restrictions.Eq(nameof(ServiceRecord.SupportConcept)+".Oid", supportConceptOid)) + .Add(Restrictions.Eq(nameof(ServiceRecord.SupportConcept) + ".Oid", supportConceptOid)) .Add(Restrictions.Eq(nameof(ServiceRecord.CostBearer2SupportConceptOid), costBearer2SupportConceptOid)) .Add(Restrictions.Between(nameof(ServiceRecord.Start), timeSpanStart, timeSpanEnd)) .Add(Restrictions.Between(nameof(ServiceRecord.End), timeSpanStart, timeSpanEnd)) - .Add(Expression.Sql(new SqlString($"this_.Oid NOT IN (SELECT ServiceRecordOid FROM confirmationreceiptsignature2servicerecord WHERE ConfirmationReceiptSignatureOid = {confirmationReceiptSignatureOid})"))); + //.Add(Expression.Sql(new SqlString($"this_.Oid NOT IN (SELECT ServiceRecordOid FROM confirmationreceiptsignature2servicerecord WHERE ConfirmationReceiptSignatureOid = {confirmationReceiptSignatureOid})"))); + .Add(Expression.Sql(new SqlString($"this_.Oid NOT IN (SELECT ServiceRecordOid FROM confirmationreceiptsignature2servicerecord WHERE ConfirmationReceiptSignatureOid IN (SELECT ConfirmationReceiptSignatureOid FROM confirmationreceiptsignature WHERE IsActive = 1))"))); + + return criteria.List().ToList(); + } + + public List LoadAllActiveConfirmationReceiptSignaturesByServiceRecordOids(IList serviceRecordOids) + { + var c = CreateCriteriaIsActive() + .CreateAlias(nameof(ConfirmationReceiptSignature.ServiceRecords), "sr", JoinType.InnerJoin) + .Add(Restrictions.In($"sr.{nameof(BeWoEntityBase.Oid)}", serviceRecordOids.ToArray())); + + // Der ResultTransformer erzeugt ein SELECT DISTINCT für den Roottypen (ConfirmationReceiptSignature) + c.SetResultTransformer(new DistinctRootEntityResultTransformer()); + + var result = c.List().ToList(); + + return result; + } + + public List FindFormerlyLinkedServiceRecordsBySignatureOid(long confirmationReceiptSignatureOid) + { + var sql = new SqlString($"this_.Oid NOT IN (SELECT ServiceRecordOid FROM confirmationreceiptsignature2servicerecord WHERE ConfirmationReceiptSignatureOid = {confirmationReceiptSignatureOid}) AND " + + $"this_.Oid IN (SELECT ServiceRecordOid FROM servicerecordhistory WHERE CustomerConfirmationReceiptSignatureOid = {confirmationReceiptSignatureOid} OR EmployeeConfirmationReceiptSignatureOid = {confirmationReceiptSignatureOid})"); + + var criteria = CreateCriteria() + .Add(Expression.Sql(sql)); return criteria.List().ToList(); } diff --git a/Data/Entities/ServiceRecordHistory.cs b/Data/Entities/ServiceRecordHistory.cs index 1ac23eff5..00313c9fa 100644 --- a/Data/Entities/ServiceRecordHistory.cs +++ b/Data/Entities/ServiceRecordHistory.cs @@ -146,6 +146,9 @@ namespace BeWo.Data.Entities private SignatureStateType _EmployeeConfirmationReceiptSignatureStateType; private SignatureStateType _ServiceRecordSignatureStateType; + private long? _CustomerConfirmationReceiptSignatureOid; + private long? _EmployeeConfirmationReceiptSignatureOid; + public virtual CostBearer2SupportConcept CostBearer2SupportConcept { @@ -695,5 +698,31 @@ namespace BeWo.Data.Entities } } } + + public virtual long? CustomerConfirmationReceiptSignatureOid + { + get => _CustomerConfirmationReceiptSignatureOid; + + set + { + if(AreDifferent(_CustomerConfirmationReceiptSignatureOid, value)) + { + _CustomerConfirmationReceiptSignatureOid = value; + } + } + } + + public virtual long? EmployeeConfirmationReceiptSignatureOid + { + get => _EmployeeConfirmationReceiptSignatureOid; + + set + { + if(AreDifferent(_EmployeeConfirmationReceiptSignatureOid, value)) + { + _EmployeeConfirmationReceiptSignatureOid = value; + } + } + } } } \ No newline at end of file diff --git a/Data/Mappings/ServiceRecordHistory.hbm.xml b/Data/Mappings/ServiceRecordHistory.hbm.xml index c12a552d8..4aa28362a 100644 --- a/Data/Mappings/ServiceRecordHistory.hbm.xml +++ b/Data/Mappings/ServiceRecordHistory.hbm.xml @@ -46,6 +46,9 @@ + + + diff --git a/Model/Changes_2023_10_27_ServiceRecordHistory ConfirmationReceiptSignatureOids.txt b/Model/Changes_2023_10_27_ServiceRecordHistory ConfirmationReceiptSignatureOids.txt new file mode 100644 index 000000000..ea9b461b4 --- /dev/null +++ b/Model/Changes_2023_10_27_ServiceRecordHistory ConfirmationReceiptSignatureOids.txt @@ -0,0 +1 @@ +ALTER TABLE servicerecordhistory ADD COLUMN `CustomerConfirmationReceiptSignatureOid` BIGINT(18) DEFAULT NULL, ADD COLUMN `EmployeeConfirmationReceiptSignatureOid` BIGINT(18) DEFAULT NULL; \ No newline at end of file diff --git a/Service/Plugins/PluginLoader.cs b/Service/Plugins/PluginLoader.cs index d275f5843..51981377e 100644 --- a/Service/Plugins/PluginLoader.cs +++ b/Service/Plugins/PluginLoader.cs @@ -327,7 +327,7 @@ namespace BeWo.Service.Plugins //t = "9094672461"; // Transkulturelles Betreuungsbüro (Toprak GmbH) //t = "9008813932"; // Aids Hilfe Giessen //t = "4052216789"; // Perspektiven e.V. - t = "7663765314"; // Christina Frommen (Frommen BeWo) + //t = "7663765314"; // Christina Frommen (Frommen BeWo) //t = "5462295916"; // BeWo Dellbrueck //t = "2120989920"; // Sozialbüro Schüßler und Wilckens GbR //t = "9815376800"; // Haus Dülken GmbH + Co. KG diff --git a/Service/ServiceImplementations/OperationsServiceImp.cs b/Service/ServiceImplementations/OperationsServiceImp.cs index aabca68f6..039e68d91 100644 --- a/Service/ServiceImplementations/OperationsServiceImp.cs +++ b/Service/ServiceImplementations/OperationsServiceImp.cs @@ -2223,7 +2223,6 @@ namespace BeWo.Service.ServiceImplementations { var serviceRecordHistoryEntries = new List(); - foreach(var serviceRecord2SignatureState in serviceRecords2SignatureStates) { var serviceRecord = serviceRecord2SignatureState.ServiceRecord; @@ -2272,13 +2271,20 @@ namespace BeWo.Service.ServiceImplementations IsCreatedInMobileClient = serviceRecord.IsCreatedInMobileClient, ServiceRecordSignatureStateType = singleSignatureState ?? previousRecordHistoryEntry?.ServiceRecordSignatureStateType ?? SignatureStateType.None, CustomerConfirmationReceiptSignatureStateType = customerMonthlySignatureState ?? previousRecordHistoryEntry?.CustomerConfirmationReceiptSignatureStateType ?? SignatureStateType.None, - EmployeeConfirmationReceiptSignatureStateType = employeeMonthlySignatureState ?? previousRecordHistoryEntry?.EmployeeConfirmationReceiptSignatureStateType ?? SignatureStateType.None + EmployeeConfirmationReceiptSignatureStateType = employeeMonthlySignatureState ?? previousRecordHistoryEntry?.EmployeeConfirmationReceiptSignatureStateType ?? SignatureStateType.None, + CustomerConfirmationReceiptSignatureOid = previousRecordHistoryEntry?.CustomerConfirmationReceiptSignatureOid, + EmployeeConfirmationReceiptSignatureOid = previousRecordHistoryEntry?.EmployeeConfirmationReceiptSignatureOid }); } DAOFactory.GenericDAO.Insert(serviceRecordHistoryEntries); } + // ToDo: 3 Unterschriften; 1 Gültig mit U1; 2 Ungültig mit U1; 3 Gültig mit U2; + // ToDo: + // ToDo: + // ToDo: + // ToDo: private static List GenerateSignatureStates(List serviceRecordsWithDeletedSingleSignatures, List serviceRecordsdWithRemovedConfirmationReceiptSignatures, List originals) { var serviceRecords2SignatureStates = new List(); @@ -3386,7 +3392,7 @@ namespace BeWo.Service.ServiceImplementations DAOFactory.GenericDAO.Update(sr); - MakeSignatureStatusTypeServiceRecordHistoryEntry(sr, SignatureStateType.Valid, null, null); + MakeSignatureStatusTypeServiceRecordHistoryEntry(sr, SignatureStateType.Valid, null, null, null, null); return updatedSignatureDC; } @@ -3798,7 +3804,7 @@ namespace BeWo.Service.ServiceImplementations var serviceRecord = DAOFactory.GenericDAO.LoadByID(serviceRecordOid); - MakeSignatureStatusTypeServiceRecordHistoryEntry(serviceRecord, SignatureStateType.Valid, null, null); + MakeSignatureStatusTypeServiceRecordHistoryEntry(serviceRecord, SignatureStateType.Valid, null, null, null, null); } return serviceRecordOid; @@ -6971,6 +6977,7 @@ namespace BeWo.Service.ServiceImplementations } } + // ToDo: Ist der SignatureStateType Valid und ist die CRSOid null, die CRSOid hinzufügen! private static void MakeHistoryEntriesForConfirmationReceiptSignatures(List confirmationReceiptSignatures, SignatureStateType signatureStateType) { foreach(var confirmationReceiptSignature in confirmationReceiptSignatures) @@ -6978,20 +6985,33 @@ namespace BeWo.Service.ServiceImplementations foreach(var serviceRecord in confirmationReceiptSignature.ServiceRecords) { SignatureStateType? customerMonthlySignatureStateType; - SignatureStateType? employeeMonthlySignatureStateTyp; + SignatureStateType? employeeMonthlySignatureStateType; + + long? customerConfirmationReceiptSignatureOid = null; + long? employeeConfirmationReceiptSignatureOid = null; if(confirmationReceiptSignature.SignatureType == SignatureType.Customer) { customerMonthlySignatureStateType = signatureStateType; - employeeMonthlySignatureStateTyp = null; + employeeMonthlySignatureStateType = null; + + if(signatureStateType == SignatureStateType.Valid) + { + customerConfirmationReceiptSignatureOid = confirmationReceiptSignature.Oid; + } } else { customerMonthlySignatureStateType = null; - employeeMonthlySignatureStateTyp = signatureStateType; + employeeMonthlySignatureStateType = signatureStateType; + + if(signatureStateType == SignatureStateType.Valid) + { + employeeConfirmationReceiptSignatureOid = confirmationReceiptSignature.Oid; + } } - MakeSignatureStatusTypeServiceRecordHistoryEntry(serviceRecord, null, customerMonthlySignatureStateType, employeeMonthlySignatureStateTyp); + MakeSignatureStatusTypeServiceRecordHistoryEntry(serviceRecord, null, customerMonthlySignatureStateType, employeeMonthlySignatureStateType, customerConfirmationReceiptSignatureOid, employeeConfirmationReceiptSignatureOid); } } } @@ -7840,7 +7860,7 @@ namespace BeWo.Service.ServiceImplementations } } - var confirmationReceiptSignatures = DAOFactory.SearchDAO.LoadAllConfirmationReceiptSignaturesByServiceRecordOids(serviceRecordOids); + var confirmationReceiptSignatures = DAOFactory.SearchDAO.LoadAllActiveConfirmationReceiptSignaturesByServiceRecordOids(serviceRecordOids); var confirmationReceiptSignatures2Delete = new List(); var confirmationReceiptSignatures2Update = new List(); @@ -7908,15 +7928,12 @@ namespace BeWo.Service.ServiceImplementations { var first = confirmationReceiptSignature.ServiceRecords.FirstOrDefault(); + // Eine Unterschrift, die in der confirmationReceiptSignatures2Delete ist, hat nur noch den einen ServiceRecord, der gerade in der Zeit bearbeitet wird! if(first != null) { - var customerOid = first.CustomerOid.Value; - var supportConceptOid = first.SupportConcept.Oid.Value; - var costbearer2SupportConceptOid = first.CostBearer2SupportConceptOid.Value; - var timeSpanString = confirmationReceiptSignature.TimeSpanString; - var signatureOid = confirmationReceiptSignature.Oid.Value; + var signatureOid = confirmationReceiptSignature.Oid.Value; - var formerlySignedServiceRecords = DAOFactory.SearchDAO.FindFormerlyLinkedServiceRecords(signatureOid, customerOid, supportConceptOid, costbearer2SupportConceptOid, timeSpanString); + var formerlySignedServiceRecords = DAOFactory.SearchDAO.FindFormerlyLinkedServiceRecordsBySignatureOid(signatureOid); var mostRecentHistoryEntries = DAOFactory.SearchDAO.FindMostRecentServiceRecordHistoryEntryByServiceRecords(formerlySignedServiceRecords.Select(s => s.Oid.Value).ToList()); @@ -8278,7 +8295,7 @@ namespace BeWo.Service.ServiceImplementations serviceRecord.SignatureOid = null; DAOFactory.GenericDAO.Update(serviceRecord); - MakeSignatureStatusTypeServiceRecordHistoryEntry(serviceRecord, SignatureStateType.ManuallyDeleted, null, null); + MakeSignatureStatusTypeServiceRecordHistoryEntry(serviceRecord, SignatureStateType.ManuallyDeleted, null, null, null, null); } catch(Exception e) { @@ -8303,94 +8320,8 @@ namespace BeWo.Service.ServiceImplementations throw Utils.CreateBeWoFaultException(e); } } - - /* - * private static void MakeServiceRecordHistoryEntry(IEnumerable lOriginals, IEnumerable serviceRecordOidList, StatementType statementType) - { - var hServiceRecords = new List(); - - if (statementType.Equals(StatementType.Insert) && serviceRecordOidList != null) - { - int iterator = 0; - foreach (ServiceRecordHistory history in lOriginals.Select(ServiceRecordOriginal => new ServiceRecordHistory - { - TimeStamp = DateTime.Now, - ChangeType = statementType, - CostBearer2SupportConcept = ServiceRecordOriginal.CostBearer2SupportConcept, - CostBearer2SupportConceptOid = ServiceRecordOriginal.CostBearer2SupportConceptOid, - Customer = ServiceRecordOriginal.Customer, - CustomerOid = ServiceRecordOriginal.CustomerOid, - Employee = ServiceRecordOriginal.Employee, - EmployeeOid = ServiceRecordOriginal.EmployeeOid, - End = ServiceRecordOriginal.End, - Group = ServiceRecordOriginal.Group, - GroupEmployeeCount = ServiceRecordOriginal.GroupEmployeeCount, - GroupOid = ServiceRecordOriginal.GroupOid, - GroupPersonCount = ServiceRecordOriginal.GroupPersonCount, - GroupRoundedDuration = ServiceRecordOriginal.GroupRoundedDuration, - IP = ServiceRecordOriginal.IP, - IsActive = ServiceRecordOriginal.IsActive, - Notice = ServiceRecordOriginal.Notice, - ServiceRecordOid = serviceRecordOidList.ElementAt(iterator), - RoundedDuration = ServiceRecordOriginal.RoundedDuration, - ServiceDescription = ServiceRecordOriginal.ServiceDescription, - ServiceRecordType = ServiceRecordOriginal.ServiceRecordType, - ServiceRecordInsTs = ServiceRecordOriginal.InsTs, - ServiceRecordVersion = ServiceRecordOriginal.Version.Value, - ServiceRecordInsUser = ServiceRecordOriginal.InsUser, - ServiceRecordUdpUser = ServiceRecordOriginal.UdpUser, - Start = ServiceRecordOriginal.Start, - SupportConcept = ServiceRecordOriginal.SupportConcept, - SystemEntryID = ServiceRecordOriginal.SystemEntryID, - DistanceInMeter = ServiceRecordOriginal.DistanceInMeter, - IsCreatedInMobileClient = ServiceRecordOriginal.IsCreatedInMobileClient - })) - { - iterator++; - hServiceRecords.Add(history); - } - } - else - { - hServiceRecords.AddRange(lOriginals.Select(ServiceRecordOriginal => new ServiceRecordHistory - { - TimeStamp = DateTime.Now, - ChangeType = statementType, - CostBearer2SupportConcept = ServiceRecordOriginal.CostBearer2SupportConcept, - CostBearer2SupportConceptOid = ServiceRecordOriginal.CostBearer2SupportConceptOid, - Customer = ServiceRecordOriginal.Customer, - CustomerOid = ServiceRecordOriginal.CustomerOid, - Employee = ServiceRecordOriginal.Employee, - EmployeeOid = ServiceRecordOriginal.EmployeeOid, - End = ServiceRecordOriginal.End, - Group = ServiceRecordOriginal.Group, - GroupEmployeeCount = ServiceRecordOriginal.GroupEmployeeCount, - GroupOid = ServiceRecordOriginal.GroupOid, - GroupPersonCount = ServiceRecordOriginal.GroupPersonCount, - GroupRoundedDuration = ServiceRecordOriginal.GroupRoundedDuration, - IP = ServiceRecordOriginal.IP, - IsActive = ServiceRecordOriginal.IsActive, - Notice = ServiceRecordOriginal.Notice, - ServiceRecordOid = ServiceRecordOriginal.Oid, - RoundedDuration = ServiceRecordOriginal.RoundedDuration, - ServiceDescription = ServiceRecordOriginal.ServiceDescription, - ServiceRecordType = ServiceRecordOriginal.ServiceRecordType, - ServiceRecordInsTs = ServiceRecordOriginal.InsTs, - ServiceRecordVersion = ServiceRecordOriginal.Version.Value, - ServiceRecordInsUser = ServiceRecordOriginal.InsUser, - ServiceRecordUdpUser = ServiceRecordOriginal.UdpUser, - Start = ServiceRecordOriginal.Start, - SupportConcept = ServiceRecordOriginal.SupportConcept, - SystemEntryID = ServiceRecordOriginal.SystemEntryID, - DistanceInMeter = ServiceRecordOriginal.DistanceInMeter, - IsCreatedInMobileClient = ServiceRecordOriginal.IsCreatedInMobileClient - })); - } - - DAOFactory.GenericDAO.Insert(hServiceRecords); - } - */ - private static void MakeSignatureStatusTypeServiceRecordHistoryEntry(ServiceRecord serviceRecord, SignatureStateType? singleSignatureStateType, SignatureStateType? customerMonthlySignatureStateType, SignatureStateType? employeeMonthlySignatureStateType) + + private static void MakeSignatureStatusTypeServiceRecordHistoryEntry(ServiceRecord serviceRecord, SignatureStateType? singleSignatureStateType, SignatureStateType? customerMonthlySignatureStateType, SignatureStateType? employeeMonthlySignatureStateType, long? customerConfirmationReceiptSignatureOid, long? employeeConfirmationReceiptsignatureOid) { // Alten ServiceRecordHistory laden var mostRecentHistoryEntry = DAOFactory.SearchDAO.FindMostRecentServiceRecordHistoryEntryByServiceRecordOid(serviceRecord.Oid.Value); @@ -8429,7 +8360,9 @@ namespace BeWo.Service.ServiceImplementations IsCreatedInMobileClient = serviceRecord.IsCreatedInMobileClient, CustomerConfirmationReceiptSignatureStateType = customerMonthlySignatureStateType ?? mostRecentHistoryEntry?.CustomerConfirmationReceiptSignatureStateType ?? SignatureStateType.None, EmployeeConfirmationReceiptSignatureStateType = employeeMonthlySignatureStateType ?? mostRecentHistoryEntry?.EmployeeConfirmationReceiptSignatureStateType ?? SignatureStateType.None, - ServiceRecordSignatureStateType = singleSignatureStateType ?? mostRecentHistoryEntry?.ServiceRecordSignatureStateType ?? SignatureStateType.None + ServiceRecordSignatureStateType = singleSignatureStateType ?? mostRecentHistoryEntry?.ServiceRecordSignatureStateType ?? SignatureStateType.None, + CustomerConfirmationReceiptSignatureOid = customerConfirmationReceiptSignatureOid ?? mostRecentHistoryEntry?.CustomerConfirmationReceiptSignatureOid, + EmployeeConfirmationReceiptSignatureOid = employeeConfirmationReceiptsignatureOid ?? mostRecentHistoryEntry?.EmployeeConfirmationReceiptSignatureOid }; DAOFactory.GenericDAO.Insert(seviceRecordHistoryEntry);