diff --git a/Service/Plugins/AccountingService.cs b/Service/Plugins/AccountingService.cs index 98b2fba21..63c802fb9 100644 --- a/Service/Plugins/AccountingService.cs +++ b/Service/Plugins/AccountingService.cs @@ -97,9 +97,10 @@ namespace BeWo.Service.Plugins protected virtual ServiceInvoiceDC ErstelleDifferenzRechnung(DifferenzRechnungCheck item) { ServiceInvoiceDC diffRechnung = null; - var alterBetrag = item.VorhandeneRechungen.Sum(i => i.ClaimSum ?? 0); + //var alterBetrag = item.VorhandeneRechungen.Sum(i => i.ClaimSum ?? 0); + var letzteRg = item.VorhandeneRechungen.OrderByDescending(r => r.ServiceInvoiceOid).FirstOrDefault(); - if (item.NeueRechnung.ClaimSum == alterBetrag) + if (item.NeueRechnung.ClaimSum == letzteRg.ClaimSum) { diffRechnung = item.NeueRechnung; diffRechnung.InvoiceBase.NeuErstellen = false; @@ -107,30 +108,21 @@ namespace BeWo.Service.Plugins } else { - diffRechnung = new ServiceInvoiceDC(); - diffRechnung.OriginalZurDifferenz = item.NeueRechnung; - diffRechnung.InvoiceBase = new InvoiceBaseDC(); - CopyInvoiceBaseDC(item.NeueRechnung.InvoiceBase, diffRechnung); + diffRechnung = new ServiceInvoiceDC(); + diffRechnung.OriginalZurDifferenz = item.NeueRechnung; + diffRechnung.InvoiceBase = new InvoiceBaseDC(); + CopyInvoiceBaseDC(item.NeueRechnung.InvoiceBase, diffRechnung); - var newItem = new InvoiceItemDC(); - newItem.ItemPeriodStart = item.NeueRechnung.InvoiceBase.AccountingPeriodStart; - newItem.ItemPeriodEnd = item.NeueRechnung.InvoiceBase.AccountingPeriodEnd; - newItem.UnitCount = 1; - newItem.AmountPerUnit = item.NeueRechnung.ClaimSum - alterBetrag; - newItem.AmountTotal = newItem.AmountPerUnit; - newItem.GrossAmountTotal = newItem.AmountTotal; - newItem.ItemDescription = String.Format("Rechnungsdifferenz zu Rechnung {0} in Höhe von {1:c}", item.VorhandeneRechungen[0].InvoiceBase.InvoiceNumber, alterBetrag); - diffRechnung.InvoiceBase.Hinweise = String.Format("Rechnungsdifferenz zu Rechnung {0} in Höhe von {1:c}", item.VorhandeneRechungen[0].InvoiceBase.InvoiceNumber, alterBetrag); + ServiceInvoice counterInvoice = new ServiceInvoice(); + var serviceInvoice = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(letzteRg.InvoiceBase.InvoiceBaseOid.Value); - var newSip = new ServiceInvoicePeriodDC(); - newSip.Claim = newItem.AmountTotal; - newSip.Start = item.NeueRechnung.InvoiceBase.AccountingPeriodStart; - newSip.End = item.NeueRechnung.InvoiceBase.AccountingPeriodEnd; - diffRechnung.ServiceInvoicePeriods = new List(); - diffRechnung.ServiceInvoicePeriods.Add(newSip); - newSip.InvoiceItems = new List(); - newSip.InvoiceItems.Add(newItem); - } + CopyServiceInvoice(serviceInvoice, counterInvoice); + SetzeStornoInfos(counterInvoice); + SetzeRechnungspositionenServiceInvoice(diffRechnung, counterInvoice, item); + + diffRechnung.InvoiceBase.NeuErstellen = true; + diffRechnung.InvoiceBase.Hinweise = String.Format("Rechnungsdifferenz zu Rechnung {0} in Höhe von {1:c}", letzteRg.InvoiceBase.InvoiceNumber, letzteRg.InvoiceBase.TotalAmount.Value); + } return diffRechnung; } @@ -153,30 +145,33 @@ namespace BeWo.Service.Plugins var siAlt = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(i2.Oid.Value); var siDCAlt = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(siAlt); - //InvoiceItems vergleichen? - //foreach (var sip in si.ServiceInvoicePeriods) - //{ - // foreach (var ii in sip.InvoiceItems) - // { - // typNeu = ii.ItemDescription; - // } - //} - - //foreach (var sip in siAlt.ServiceInvoicePeriodList) - //{ - // foreach (var ii in sip.InvoiceItemList) - // { - // typAlt = ii.ItemDescription; - // } - //} - - //if (typAlt == typNeu) - //{ - // exist = true; - //} - checkResult.VorhandeneRechungen.Add(siDCAlt); } + else // Sammelrechnung + { + if (i2.RecipientCostBearerOid == invoices[0].InvoiceBase.RecipientCostBearerOid) + { + var siAlt = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(i2.Oid.Value); + var siDCAlt = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(siAlt); + if (siAlt.ServiceInvoicePeriodList != null && siAlt.ServiceInvoicePeriodList.Count > 0) + { + foreach (var i in invoices) + { + if (i.ServiceInvoicePeriods != null && i.ServiceInvoicePeriods.Count > 0) + { + foreach (var sip in siDCAlt.ServiceInvoicePeriods) + { + if (sip.Customer != null && i.ServiceInvoicePeriods.Any(s => s.Customer.CustomerOid == sip.Customer.CustomerOid)) + { + checkResult.VorhandeneRechungen.Add(siDCAlt); + break; + } + } + } + } + } + } + } } } return result; @@ -230,7 +225,6 @@ namespace BeWo.Service.Plugins return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(list); } - public virtual void DeactivateInvoiceBases(List invoices) { ServiceLogic.SetActivationType(invoices.ToDictionary(i => i.InvoiceBaseOid.Value, i => i.InvoiceBaseVersion.Value), ActivationTypeId.Deleted); @@ -276,7 +270,6 @@ namespace BeWo.Service.Plugins public virtual ServiceInvoice ErstelleStornoRechnung(InvoiceBaseDC ibdc) { ServiceInvoice newInvoice = new ServiceInvoice(); - var serviceInvoice = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(ibdc.InvoiceBaseOid.Value); CopyServiceInvoice(serviceInvoice, newInvoice); @@ -364,7 +357,6 @@ namespace BeWo.Service.Plugins copyInvoice.AmountAdvancePayments = existingInvoice.AmountAdvancePayments; copyInvoice.AmountEquityContribution = existingInvoice.AmountEquityContribution; copyInvoice.ServiceUnitOid = existingInvoice.ServiceUnitOid; - CopyInvoiceBase(existingInvoice.InvoiceBase, copyInvoice.InvoiceBase); @@ -575,7 +567,52 @@ namespace BeWo.Service.Plugins copyItem.ServiceRecord = existingItem.ServiceRecord; } - public virtual Settlement2DC ErstelleDifferenzSpitzabrechnung(Settlement2DC neueRechnung, Settlement2DC letzteRechnung) + private void SetzeRechnungspositionenServiceInvoice(ServiceInvoiceDC diffRechnung, ServiceInvoice counterInvoice, DifferenzRechnungCheck item) + { + var siDCAlt = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(counterInvoice); + if (siDCAlt.ServiceInvoicePeriods != null && siDCAlt.ServiceInvoicePeriods.Count > 0) + { + diffRechnung.ServiceInvoicePeriods = siDCAlt.ServiceInvoicePeriods; + } + + if (item.NeueRechnung.ServiceInvoicePeriods != null && item.NeueRechnung.ServiceInvoicePeriods.Count > 0) + { + if (diffRechnung.ServiceInvoicePeriods == null) + { + diffRechnung.ServiceInvoicePeriods = item.NeueRechnung.ServiceInvoicePeriods; + } + else + { + foreach (var NewSip in item.NeueRechnung.ServiceInvoicePeriods) + { + if (NewSip.InvoiceItems != null && NewSip.InvoiceItems.Count > 0) + { + if (NewSip.Customer != null && diffRechnung.ServiceInvoicePeriods.Any(s => s.Customer.CustomerOid == NewSip.Customer.CustomerOid) && + NewSip.SupportConceptApprovalPeriod != null && NewSip.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.HasValue + && diffRechnung.ServiceInvoicePeriods.Any(s => s.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.HasValue + && s.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value == NewSip.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value)) + { + var ip = diffRechnung.ServiceInvoicePeriods.Where(s => s.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value == NewSip.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value).First(); + if (ip.InvoiceItems != null && ip.InvoiceItems.Count > 0) + { + ip.Claim += NewSip.Claim; + foreach (var ii in NewSip.InvoiceItems) + { + ip.InvoiceItems.Add(ii); + } + } + } + else + { + diffRechnung.ServiceInvoicePeriods.Add(NewSip); + } + } + } + } + } + } + + public virtual Settlement2DC ErstelleDifferenzSpitzabrechnung(Settlement2DC neueRechnung, Settlement2DC letzteRechnung) { var diff = neueRechnung.Claim - letzteRechnung.Claim; var ii = new InvoiceItemDC();