public List <PriceListRow> GetPriceList(DateTimeOffset startAt, CompetenceLevel competenceLevel, PriceListType listType)
 {
     return(_dbContext.PriceListRows.Where(r =>
                                           r.CompetenceLevel == competenceLevel &&
                                           r.PriceListType == listType &&
                                           r.StartDate.Date <= startAt.Date && r.EndDate.Date >= startAt.Date).ToList());
 }
        public PriceInformation GetPricesRequisition(DateTimeOffset startAt, DateTimeOffset endAt, DateTimeOffset originStartAt, DateTimeOffset originEndAt, CompetenceLevel competenceLevel, PriceListType listType, int rankingId, out bool useRequestPricerows, int?timeWasteNormalTime, int?timeWasteIWHTime, IEnumerable <PriceRowBase> requestPriceRows, decimal?outlay, Order replacingOrder, DateTimeOffset orderCreatedDate, List <MealBreak> mealbreaks = null)
        {
            var prices = GetPriceList(startAt, competenceLevel, listType);

            //get mealbeaks if any
            IDictionary <PriceListRowType, int> mealbreakTimes = GetMealBreakTimesAndTypes(mealbreaks);

            //compare compensation for origin times with requisition times (including mealbreaks), broker/interpreter should have the compensation that get most payed
            var pricesRequisition = MergePriceListRowsAndReduceForMealBreak(GetPriceRowsPerType(startAt, endAt, prices, mealbreaks), mealbreakTimes);
            var pricesOriginTimes = MergePriceListRowsAndReduceForMealBreak(GetPriceRowsPerType(originStartAt, originEndAt, prices, mealbreaks), mealbreakTimes);

            useRequestPricerows = UsePricesOriginTimes(pricesRequisition, pricesOriginTimes);

            //if we should use request, set start and end from request start and end
            var pricesToUse = useRequestPricerows ? pricesOriginTimes.ToList() : pricesRequisition.ToList();

            //if replacementorder - check and compare start- and endtime from replacing order
            if (replacingOrder != null)
            {
                var pricesReplacingOrder = MergePriceListRowsAndReduceForMealBreak(GetPriceRowsPerType(replacingOrder.StartAt, replacingOrder.EndAt, prices, mealbreaks), mealbreakTimes);

                bool useReplacingOrderTimes = UsePricesOriginTimes(useRequestPricerows ? pricesOriginTimes : pricesRequisition, pricesReplacingOrder);
                if (useReplacingOrderTimes)
                {
                    pricesToUse         = pricesReplacingOrder.ToList();
                    useRequestPricerows = useReplacingOrderTimes;
                }
            }
            //get lost time and extra charges
            pricesToUse.AddRange(GetLostTimePriceRows(startAt, timeWasteNormalTime, timeWasteIWHTime, prices));
            return(CompletePricesWithExtraCharges(startAt, endAt, competenceLevel, pricesToUse, rankingId, null, orderCreatedDate, outlay, requestPriceRows.Single(rpr => rpr.PriceRowType == PriceRowType.BrokerFee)));
        }
        public PriceInformation GetPrices(DateTimeOffset startAt, DateTimeOffset endAt, CompetenceLevel competenceLevel, PriceListType listType, int rankingId, DateTimeOffset orderCreatedDate, decimal?travelCost = null)
        {
            var prices = GetPriceList(startAt, competenceLevel, listType);

            return(CompletePricesWithExtraCharges(startAt, endAt, competenceLevel, MergePriceListRowsAndReduceForMealBreak(GetPriceRowsPerType(startAt, endAt, prices)).ToList(), rankingId, travelCost, orderCreatedDate));
        }
        private PriceRowBase GetPriceRowBrokerFee(DateTimeOffset startAt, DateTimeOffset endAt, CompetenceLevel competenceLevel, int rankingId, PriceRowBase brokerFeeToUse, DateTimeOffset orderCreatedDate)
        {
            if (brokerFeeToUse != null)
            {
                return(brokerFeeToUse);
            }
            else
            {
                //One broker fee per day
                int days = GetNoOfDays(startAt, endAt);
                //if there is no priceRowBrokerFee for the orderStart, try to get if for the orderCreatedDate (contract has ended, but order was created when contract/ranking was valid)
                var priceRow = _cacheService.BrokerFeePriceList.Where(br => br.RankingId == rankingId && br.CompetenceLevel == competenceLevel && br.StartDate.Date <= startAt.Date && br.EndDate.Date >= startAt.Date).Count() == 1 ?
                               _cacheService.BrokerFeePriceList.Single(br => br.RankingId == rankingId && br.CompetenceLevel == competenceLevel && br.StartDate.Date <= startAt.Date && br.EndDate.Date >= startAt.Date) :
                               _cacheService.BrokerFeePriceList.Single(br => br.RankingId == rankingId && br.CompetenceLevel == competenceLevel && br.StartDate.Date <= orderCreatedDate.Date && br.EndDate.Date >= orderCreatedDate.Date);

                return(new PriceRowBase
                {
                    StartAt = startAt.Date.ToDateTimeOffsetSweden(),
                    EndAt = endAt.Date.ToDateTimeOffsetSweden(),
                    PriceRowType = PriceRowType.BrokerFee,
                    Quantity = days,
                    Price = priceRow.PriceToUse,
                    PriceListRowId = priceRow.PriceListRowId
                });
            }
        }
        private PriceInformation CompletePricesWithExtraCharges(DateTimeOffset startAt, DateTimeOffset endAt, CompetenceLevel competenceLevel, List <PriceRowBase> priceListRowsPerPriceType, int rankingId, decimal?travelCost, DateTimeOffset orderCreatedDate, decimal?outlay = null, PriceRowBase requestBrokerFeeForRequisition = null)
        {
            List <PriceRowBase> allPriceRows = new List <PriceRowBase>
            {
                GetPriceRowSocialInsuranceCharge(startAt, endAt, priceListRowsPerPriceType),
                GetPriceRowAdministrativeCharge(startAt, endAt, priceListRowsPerPriceType),
                GetPriceRowBrokerFee(startAt, endAt, competenceLevel, rankingId, requestBrokerFeeForRequisition, orderCreatedDate)
            };

            allPriceRows.AddRange(priceListRowsPerPriceType);
            if (travelCost != null && travelCost > 0)
            {
                allPriceRows.Add(GetTravelCostRow(startAt.Date, startAt.Date.AddDays(1).ToDateTimeOffsetSweden(), travelCost, PriceRowType.TravelCost));
            }
            if (outlay != null && outlay > 0)
            {
                allPriceRows.Add(GetTravelCostRow(startAt.Date, startAt.Date.AddDays(1).ToDateTimeOffsetSweden(), outlay, PriceRowType.Outlay));
            }

            allPriceRows.Add(GetRoundedPriceRow(startAt, endAt, allPriceRows));

            var priceInformation = new PriceInformation
            {
                PriceRows = allPriceRows
            };

            return(priceInformation);
        }
 public Competence(string description, CompetenceLevel competenceLevel)
 {
     Description     = description;
     CompetenceLevel = competenceLevel;
 }