Example #1
0
        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;
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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));
            }
        }