public int CreateNewBusinessTrip(BusinessTripDTO businessTrip, string userName)
        {
            User user = repo.Users.UsersQueryable.FirstOrDefault(u => u.UserName == userName);

            BusinessTrip trip = repo.BusinessTrips.Create(new BusinessTrip() {
                Title = businessTrip.Title,
                Date = businessTrip.Date.ParseAppString(),
                BusinessReason = businessTrip.BusinessReason,
                BusinessPurpose = businessTrip.BusinessPurpose,
                Notes = businessTrip.Notes,
                User = user
            });

            if (businessTrip.Subsistence != null)
            {
                CreateBusinessTripSubsistence(trip, businessTrip);
            }

            List<Expense> expenses = new List<Expense>();
            if (businessTrip.Expenses != null)
            {
                foreach (ExpenseDTO expDto in businessTrip.Expenses)
                {
                    Expense expense = new Expense();
                    expense.Trip = trip;
                    expense.Type = repo.Dictionaries.GetExpenseType(expDto.ExpenseTypeId);
                    expense.Date = expDto.Date.ParseAppString();
                    expense.City = expDto.City;
                    expense.Amount = expDto.Amount;
                    expense.AmountPLN = expDto.AmountPLN;
                    expense.Country = repo.Dictionaries.GetCountry(expDto.CountryId);
                    expense.CurrencyCode = expDto.CurrencyCode;
                    expense.ExchangeRate = expDto.ExchangeRate;
                    CurrencyRate systemRate = currenciesTasks.GetCurrencyRateForDay(expense.CurrencyCode, expense.Date.Date);
                    if (Math.Abs(systemRate.ExchangeRate - expense.ExchangeRate) > 0.0001)
                        expense.ExchangeRateModifiedByUser = true;
                    else
                        expense.ExchangeRateModifiedByUser = false;

                    expense.VATRate = expDto.VATRate;
                    expense.Notes = expDto.Notes;
                    expense.DoNotReturn = expDto.DoNotReturn;
                    expense.DocumentType = repo.Dictionaries.GetExpenseDocumentType(expDto.ExpenseDocumentTypeId);
                    expenses.Add(expense);
                }

                repo.Expenses.CreateSet(expenses);
            }

            if (businessTrip.MileageAllowances != null)
            {
                List<MileageAllowance> mileageAllowances = new List<MileageAllowance>();
                foreach (MileageAllowanceDTO maDto in businessTrip.MileageAllowances)
                {
                    MileageAllowance ma = new MileageAllowance();
                    ma.Trip = trip;
                    ma.Date = maDto.Date.ParseAppString();
                    ma.Distance = maDto.Distance;
                    ma.Amount = maDto.Amount;
                    ma.Notes = maDto.Notes;
                    ma.Type = repo.Dictionaries.GetVehicleType(maDto.VehicleTypeId);

                    mileageAllowances.Add(ma);
                }

                repo.MileageAllowances.CreateSet(mileageAllowances);
            }

            this.repo.SaveChanges();
            return trip.Id;
        }
        public void UpdateBusinessTripMileageAllowances(BusinessTrip trip, BusinessTripDTO businessTripDto)
        {
            if (businessTripDto != null)
            {
                foreach (MileageAllowance allowance in trip.MileageAllowances
                    .Where(m => businessTripDto.MileageAllowances
                        .Any(mdto => mdto.id == m.Id)))
                {//Update mileage allowances that exist both in database and in dto
                    MileageAllowanceDTO mdto = businessTripDto.MileageAllowances.First(m => m.id == allowance.Id);
                    allowance.Type = repo.Dictionaries.GetVehicleType(mdto.VehicleTypeId);
                    allowance.Date = mdto.Date.ParseAppString();
                    allowance.Amount = mdto.Amount;
                    allowance.Distance = mdto.Distance;
                    allowance.Notes = mdto.Notes;
                }

                //Remove those that exist in db but don't exist in dto
                repo.MileageAllowances.RemoveSet(trip.MileageAllowances
                    .Where(m => !businessTripDto.MileageAllowances
                        .Any(mdto => mdto.id == m.Id)));

                foreach (MileageAllowanceDTO milDto in businessTripDto.MileageAllowances.Where(mdto => !trip.MileageAllowances.Any(ma => ma.Id == mdto.id)))
                {//Add those that exist in dto but don't exist in db
                    MileageAllowance allowance = new MileageAllowance();
                    allowance.Trip = trip;
                    allowance.Date = milDto.Date.ParseAppString();
                    allowance.Amount = milDto.Amount;
                    allowance.Distance = milDto.Distance;
                    allowance.Type = repo.Dictionaries.GetVehicleType(milDto.VehicleTypeId);
                    allowance.Notes = milDto.Notes;
                    trip.MileageAllowances.Add(allowance);
                }
            }
        }