private async Task CheckServiceUseOverlap(UseServiceEvent serviceEvent, Contract contract, Contract secondContract = null) { var overlapCase = OverlapCase(serviceEvent.StartDate, serviceEvent.EndDate, contract.StartDate, contract.EndDate); /*0: No overlap 1122 e1S2 > 0 or 2211 s1E2 < 0 * 1: Start overlat 1212 * 2: Middle overlap 2112 * 3: End overlap 2121 * 4: Complete overlap 1221 * */ switch (overlapCase) { case 0: break; case 1: serviceEvent.EndDate = (contract.StartDate); await AddServiceUse( serviceEvent.Customer, contract, contract.StartDate, serviceEvent.EndDate); break; case 2: serviceEvent.Contract = contract; break; case 3: serviceEvent.StartDate = (contract.EndDate); await AddServiceUse(serviceEvent.Customer, contract, serviceEvent.StartDate, contract.EndDate ); break; case 4: serviceEvent.EndDate = contract.StartDate; await AddServiceUse(serviceEvent.Customer, contract, contract.StartDate, contract.EndDate ); if (secondContract != null) { await AddServiceUse(serviceEvent.Customer, secondContract, secondContract.StartDate, secondContract.EndDate ); } break; } }
private async Task <UseServiceEvent> AddServiceUse(Customer customer, Contract contract, DateTime startDate, DateTime endDate) { var serviceUse = new UseServiceEvent { Id = Guid.NewGuid(), Customer = customer, Contract = contract, StartDate = startDate, EndDate = endDate }; await _context.UseServiceEvents.AddAsync(serviceUse); return(serviceUse); }
private long CalcDays(UseServiceEvent use, CustomerCostsPeriodModel timeframe, Service service) { var endStartDiff = DaysDiff(use.EndDate, timeframe.StartDate); var startEndDiff = DaysDiff(use.StartDate, timeframe.EndDate); // No overlap if (endStartDiff > 0 || startEndDiff < 0) { return(0); } var startDiff = DaysDiff(timeframe.StartDate, use.StartDate); var endDiff = DaysDiff(use.EndDate, timeframe.EndDate); var useDiff = DaysDiff(use.StartDate, use.EndDate); var sDate = DateTime.MinValue; var eDate = DateTime.MinValue; if (startDiff >= 0 && endDiff >= 0) { sDate = use.StartDate; eDate = use.EndDate; } else if (startDiff < 0 && endDiff < 0) { sDate = timeframe.StartDate; eDate = timeframe.EndDate; } else if (startDiff < 0) { sDate = timeframe.StartDate; eDate = use.EndDate; } else { sDate = use.StartDate; eDate = timeframe.EndDate; } if (service.LastBillableDay > service.FirstBillableDay) { var daysStart = 0; if (sDate.DayOfWeek != service.FirstBillableDay) { daysStart = service.LastBillableDay - sDate.DayOfWeek + 1; } var daysEnd = 0; if (eDate.DayOfWeek != service.LastBillableDay) { daysEnd = eDate.DayOfWeek - service.FirstBillableDay; } var totalDays = DaysDiff(sDate, eDate); var weeks = totalDays / 7 * (service.LastBillableDay - service.FirstBillableDay + 1); return(weeks + daysStart + daysEnd); } else { return(DaysDiff(sDate, eDate)); } }