public ImportJobResult Process(string filePath, int subscriberId, bool syncLocations, bool syncJobs)
        {
            reportErrors = new ReportErrors(filePath);
            var result = Process(filePath, subscriberId, syncLocations, syncJobs, true);

            Console.WriteLine("Sending Errors");
            ReportErrors.SendErrors();
            return(result);
        }
        private void GeocodeLocationAndSave(Location matchedLocation)
        {
            // geocode - limit 900 per hour / one every 4 seconds
            var geocodeResult     = new GeocodeResult();
            var cityGeocodeResult = new GeocodeResult();
            var successFlag       = false;

            try
            {
                geocodeResult = _geocodeService.Geocode("", matchedLocation.StreetAddress, matchedLocation.City,
                                                        matchedLocation.State, matchedLocation.Zip);
                successFlag = true;
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format("Unable to fetch GeocodeResult for {0} {1} {2} {3}", matchedLocation.StreetAddress, matchedLocation.City, matchedLocation.State, matchedLocation.Zip));
            }
            try
            {
                cityGeocodeResult = _geocodeService.Geocode("", "", matchedLocation.City, matchedLocation.State,
                                                            matchedLocation.Zip);
                successFlag &= true;
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format("Unable to fetch CityGeocodeResult for {0} {1} {2} {3}", matchedLocation.StreetAddress, matchedLocation.City, matchedLocation.State, matchedLocation.Zip));
            }

            if (successFlag)
            {
                geocodeResult.SaveTo(matchedLocation);

                if (geocodeResult.IsSameAs(cityGeocodeResult))
                {
                    // geocode failure likely
                    ReportErrors.AddError(string.Format("Geocode failure for location {0}", matchedLocation.LegacyId));
                    matchedLocation.IsFailedGeocode = true;
                }

                if (matchedLocation.Id == 0 && matchedLocation.LegacyId != "0")
                {
                    _locationService.Insert(matchedLocation);
                }
                else
                {
                    _locationService.Update(matchedLocation);
                }
            }
        }
        public ImportJobResult Process(string filePath, int subscriberId, bool syncLocations, bool syncJobs, bool saveToDatabase)
        {
            int locationErrorCount      = 0;
            int createdJobCount         = 0;
            var errorJobCount           = 0;
            int updatedJobCount         = 0;
            int existingJobCount        = 0;
            int recreatedRouteStopCount = 0;

            var result = ImportJobs(filePath, subscriberId);
            var locationsByCustomerNumber = result.GetCompanyLocations(subscriberId, true);

            Location matchingLocation = null;

            locationsByCustomerNumber.TryGetValue("1863", out matchingLocation);

            if (syncLocations)
            {
                var persistedLocations = SyncLocations(locationsByCustomerNumber.Values, subscriberId, out locationErrorCount);
                if (syncJobs)
                {
                    var extractedJobs = result.GetJobs(persistedLocations.ToDictionary(p => p.LegacyId), StopActions, subscriberId);
                    Console.WriteLine("Detected {0} jobs", extractedJobs.Count);
                    foreach (var job in extractedJobs)
                    {
                        var routeStops = job.RouteStops.Select(x =>
                                                               new PAI.Drayage.Optimization.Model.Orders.RouteStop
                        {
                            Id            = x.Id,
                            ExecutionTime =
                                x.StopDelay.HasValue ? new TimeSpan(x.StopDelay.Value) : (TimeSpan?)null,
                            Location = new PAI.Drayage.Optimization.Model.Location
                            {
                                Id          = x.Location.Id,
                                DisplayName = x.Location.DisplayName,
                                Latitude    = x.Location.Latitude.HasValue ? x.Location.Latitude.Value : 0,
                                Longitude   = x.Location.Longitude.HasValue ? x.Location.Longitude.Value : 0
                            },
                            PostTruckConfig = new TruckConfiguration(),
                            PreTruckConfig  = new TruckConfiguration(),
                            QueueTime       = null,
                            StopAction      =
                                PAI.Drayage.Optimization.Model.Orders.StopActions.Actions.First(
                                    y => y.ShortName == x.StopAction.ShortName),
                            WindowEnd   = new TimeSpan(x.WindowEnd),
                            WindowStart = new TimeSpan(x.WindowStart)
                        }).ToList();

                        var drayageJob = new PAI.Drayage.Optimization.Model.Orders.Job
                        {
                            Id                     = job.Id,
                            DisplayName            = job.OrderNumber,
                            EquipmentConfiguration = new EquipmentConfiguration(),
                            IsFlatbed              = job.IsFlatbed,
                            IsHazmat               = job.IsHazmat,
                            RouteStops             = routeStops
                        };

                        var validationResult = _validationService.ValidateJob(drayageJob, true, _distanceService);
                        job.IsValid = validationResult.Successful;
                        if (!validationResult.Successful)
                        {
                            if (job.RouteStops.Any(x => _validationService.InvalidTimes.Contains(new TimeSpan(x.WindowStart)) || _validationService.InvalidTimes.Contains(new TimeSpan(x.WindowEnd))))
                            {
                                job.RouteStops.First().StopAction = _stopActionService.GetById(Drayage.Optimization.Model.Orders.StopActions.DropOffLoadedWithChassis.Id);
                            }
                            ReportErrors.AddError(job.LegacyId + "\n" + validationResult.Errors.Aggregate((a, b) => a + "\n" + b));
                            errorJobCount++;
                        }
                        Job matchingJob = _jobService.SelectWithAll().FirstOrDefault(p => p.LegacyId == job.LegacyId);
                        if (matchingJob != null)
                        {
                            if (job.JobStatus == JobStatus.Completed)
                            {
                                Console.WriteLine("Order is already complete: {0}", job.LegacyId);
                                continue;
                            }

                            if (job.IsChangedFrom(matchingJob))
                            {
                                var updateResult = matchingJob.UpdateFrom(job);
                                if (updateResult.IsRouteStopsRecreated)
                                {
                                    recreatedRouteStopCount++;
                                }

                                if (updateResult.IsJobError)
                                {
                                    errorJobCount++;
                                }

                                if (saveToDatabase)
                                {
                                    _jobService.Update(matchingJob);
                                }

                                updatedJobCount++;
                            }
                            else
                            {
                                existingJobCount++;
                            }

                            continue;
                        }

                        Console.WriteLine("Adding new job");
                        createdJobCount++;

                        if (saveToDatabase)
                        {
                            _jobService.Insert(job);
                        }
                    }
                }
            }

            _syncLogEntryService.AddEntry(subscriberId, "Import Complete", "File: " + new FileInfo(filePath).Name,
                                          errorJobCount, updatedJobCount, createdJobCount, existingJobCount, recreatedRouteStopCount,
                                          locationErrorCount);

            return(result);
        }
        private ImportedLeg ExtractJob(string[] values)
        {
            const string ErrorTemplate = @"Error retrieving field {0} for record {1} with error of:\n{2}";

            _dictionary = values.GetString(_shipperNameIndex);
            var result = new ImportedLeg();

            try
            {
                result.ManifestNumber = values.GetString(_manifestNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ManifestNumber", "No Manifest Number Read", e.Message));
            }
            try
            {
                result.SealNumber = values.GetString(_sealNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "SealNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.BillOfLadingNumber = values.GetString(_billOfLadingNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "BillOfLadingNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.Trailer = values.GetString(_trailerIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "Trailer", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ManifestType = values.GetString(_manifestTypeIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ManifestType", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ServiceType = values.GetString(_serviceTypeIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ServiceType", result.ManifestNumber, e.Message));
            }
            try
            {
                result.RecordType = values.GetString(_recordTypeIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "RecordType", result.ManifestNumber, e.Message));
            }
            try
            {
                result.SequenceNumber = values.GetInt(_sequenceNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "SequenceNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ScheduledStop = values.GetBool(_scheduledStopIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ScheduledStop", result.ManifestNumber, e.Message));
            }
            try
            {
                result.IsHazmat = values.GetBool(_isHazmatIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "IsHazmat", result.ManifestNumber, e.Message));
            }

            // leg details
            try
            {
                result.NumberOfLegs = values.GetInt(_numberOfLegsIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "NumberOfLegs", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegNumber = values.GetString(_legNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegNumberCredited = values.GetString(_legNumberCreditedIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegNumberCredited", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegType = values.GetString(_legTypeIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegType", result.ManifestNumber, e.Message));
            }

            try
            {
                result.LegOriginCity = values.GetString(_legOriginCityIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegOriginCity", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegOriginState = values.GetString(_legOriginStateIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegOriginState", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegOriginZip = TryGetSubstring(values.GetString(_legOriginZipIndex), 0, 5);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegOriginZip", result.ManifestNumber, e.Message));
            }

            try
            {
                result.LegDestinationCity = values.GetString(_legDestinationCityIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegDestinationCity", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegDestinationState = values.GetString(_legDestinationStateIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegDestinationState", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LegDestinationZip = TryGetSubstring(values.GetString(_legDestinationZipIndex), 0, 5);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LegDestinationZip", result.ManifestNumber, e.Message));
            }

            try
            {
                // times
                result.LoadTime = values.GetInt(_scheduledLoadTimeIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LoadTime", result.ManifestNumber, e.Message));
            }
            try
            {
                result.LoadDateTime = values.GetCustomDateTime(_loadDateStringIndex, _loadTimeStringIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "LoadDateTime", result.ManifestNumber, e.Message));
            }
            try
            {
                result.DeliveryDateTime = values.GetCustomDateTime(_deliveryDateStringIndex, _deliveryTimeStringIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "DeliveryDateTime", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ScheduledDateTime = values.GetCustomDateTime(_scheduledDateStringIndex, _scheduledTimeStringIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ScheduledDateTime", result.ManifestNumber, e.Message));
            }

            try
            {
                // company
                result.CustomerNumber = values.GetString(_customerNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CustomerNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.CompanyName = values.GetString(_companyNameIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CompanyName", result.ManifestNumber, e.Message));
            }
            try
            {
                result.CompanyAddress1 = SanitizeAddress(values.GetString(_companyAddress1Index));
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CompanyAddress1", result.ManifestNumber, e.Message));
            }
            try
            {
                result.CompanyAddress2 = values.GetString(_companyAddress2Index);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CompanyAddress2", result.ManifestNumber, e.Message));
            }
            try
            {
                result.CompanyCity = values.GetString(_companyCityIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CompanyCity", result.ManifestNumber, e.Message));
            }
            try
            {
                result.CompanyState = values.GetString(_companyStateIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CompanyState", result.ManifestNumber, e.Message));
            }
            try
            {
                result.CompanyZip = TryGetSubstring(values.GetString(_companyZipIndex), 0, 5);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "CompanyZip", result.ManifestNumber, e.Message));
            }

            try
            {
                // consignee
                result.ConsigneeNumber = values.GetInt(_consigneeNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ConsigneeNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ConsigneeName = values.GetString(_consigneeNameIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ConsigneeName", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ShipperNumber = values.GetInt(_shipperNumberIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ShipperNumber", result.ManifestNumber, e.Message));
            }
            try
            {
                result.ShipperName = values.GetString(_shipperNameIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "ShipperName", result.ManifestNumber, e.Message));
            }

            try
            {
                // order origin
                result.OriginZone = values.GetString(_originZoneIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OriginZone", result.ManifestNumber, e.Message));
            }
            try
            {
                result.OrderOriginCity = values.GetString(_orderOriginCityIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OrderOriginCity", result.ManifestNumber, e.Message));
            }
            try
            {
                result.OrderOriginState = values.GetString(_orderOriginStateIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OrderOriginState", result.ManifestNumber, e.Message));
            }
            try
            {
                result.OrderOriginZip = TryGetSubstring(values.GetString(_orderOriginZipIndex), 0, 5);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OrderOriginZip", result.ManifestNumber, e.Message));
            }

            try
            {
                // order destination
                result.DestinationZone = values.GetString(_destinationZoneIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "DestinationZone", result.ManifestNumber, e.Message));
            }
            try
            {
                result.OrderDestinationCity = values.GetString(_orderDestinationCityIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OrderDestinationCity", result.ManifestNumber, e.Message));
            }
            try
            {
                result.OrderDestinationState = values.GetString(_orderDestinationStateIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OrderDestinationState", result.ManifestNumber, e.Message));
            }
            try
            {
                result.OrderDestinationZip = TryGetSubstring(values.GetString(_orderDestinationZipIndex), 0, 5);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "OrderDestinationZip", result.ManifestNumber, e.Message));
            }

            try
            {
                result.StopOffCity = values.GetString(_stopOffCityIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "StopOffCity", result.ManifestNumber, e.Message));
            }
            try
            {
                result.StopOffState = values.GetString(_stopOffStateIndex);
            }
            catch (Exception e)
            {
                ReportErrors.AddError(string.Format(ErrorTemplate, "StopOffState", result.ManifestNumber, e.Message));
            }
            return(result);
        }
        public void ImportDrivers(string filePath, int subscriberId, int defaultLocationId = 0)
        {
            var readResult = this.Read(filePath);

            // order
            var driverLegacyIdIndex    = 0;
            var driverNameIndex        = 1;
            var earliestStartTimeIndex = 3;
            var maxOnDutyTimeIndex     = 4;
            var maxDrivingTimeIndex    = 5;

            var existingDrivers = _driverService.Select().ToList();

            foreach (var row in readResult.Values)
            {
                try
                {
                    var names = row[driverNameIndex].Split(',');
                    if (names.Length == 1)
                    {
                        names = row[driverNameIndex].Split(' ');

                        if (names.Length < 2)
                        {
                            continue;
                        }
                        var first = names[0];
                        var last  = names[1];
                        names[0] = last;
                        names[1] = first;
                    }

                    if (names.Length < 2)
                    {
                        continue;
                    }

                    var d = new Driver()
                    {
                        SubscriberId        = subscriberId,
                        LegacyId            = row.GetString(driverLegacyIdIndex),
                        FirstName           = names[1].Trim(),
                        LastName            = names[0].Trim(),
                        IsPlaceholderDriver = false,
                        StartingLocationId  = defaultLocationId
                    };

                    var earliestTimeString = row.GetString(earliestStartTimeIndex);
                    var x  = earliestTimeString.Substring(0, earliestTimeString.IndexOf(':'));
                    var xx = 0;
                    Int32.TryParse(x, out xx);
                    if (earliestTimeString.EndsWith("PM"))
                    {
                        xx = xx + 12;
                    }

                    d.EarliestStartTime     = new TimeSpan(xx, 0, 0).Ticks;
                    d.AvailableDutyHours    = row.GetInt(maxOnDutyTimeIndex);
                    d.AvailableDrivingHours = row.GetInt(maxDrivingTimeIndex);

                    _driverService.Insert(d, true);
                }
                catch (Exception e)
                {
                    ReportErrors.AddError(string.Format("Count not parse a driver from the row  because of {0}", e.Message));
                    continue;
                }
            }
        }
        public ImportJobResult ImportJobs(string filePath, int subscriberId)
        {
            var readResult = this.Read(filePath);

            // order
            _manifestNumberIndex     = 0;  //readResult.GetColumnIndex("Manifest #");
            _manifestTypeIndex       = 2;  //readResult.GetColumnIndex("Manifest Type");
            _billOfLadingNumberIndex = 37; //readResult.GetColumnIndex("Bill of lading number");
            _sequenceNumberIndex     = 8;  //readResult.GetColumnIndex("Sequence #");
            _scheduledLoadTimeIndex  = 60; // readResult.GetColumnIndex("Scheduled Load Time");
            _scheduledStopIndex      = 10; //readResult.GetColumnIndex("Scheduled Stop");
            _trailerIndex            = 49; //readResult.GetColumnIndex("1st Trailer assigned");

            // date times
            _scheduledDateStringIndex = 17; //readResult.GetColumnIndex("Scheduled Date");
            _scheduledTimeStringIndex = 18; //readResult.GetColumnIndex("Scheduled Time");

            _isHazmatIndex           = 68;
            _loadDateStringIndex     = 59; //readResult.GetColumnIndex("Scheduled Load Date");
            _loadTimeStringIndex     = 60; //readResult.GetColumnIndex("Scheduled Load Time");
            _deliveryDateStringIndex = 66; // readResult.GetColumnIndex("Scheduled Delivery Date");
            _deliveryTimeStringIndex = 67; // readResult.GetColumnIndex("Scheduled Delivery Time");

            // leg
            _legDestinationCityIndex  = 62; //readResult.GetColumnIndex("Leg Destination City");
            _legDestinationStateIndex = 63; //readResult.GetColumnIndex("Leg Destination State");
            _legDestinationZipIndex   = 65; //readResult.GetColumnIndex("Leg Destination Zip");

            _legOriginCityIndex  = 53;      //readResult.GetColumnIndex("Leg Origin City");
            _legOriginStateIndex = 54;      //readResult.GetColumnIndex("Leg Origin State");
            _legOriginZipIndex   = 56;      //readResult.GetColumnIndex("Leg Origin Zip");

            _stopOffCityIndex  = 11;        //readResult.GetColumnIndex("Stopoff City");
            _stopOffStateIndex = 12;        //readResult.GetColumnIndex("Stopoff State");

            _legNumberIndex         = 1;    //readResult.GetColumnIndex("Leg #");
            _legTypeIndex           = 4;    //readResult.GetColumnIndex("Leg Type");
            _numberOfLegsIndex      = 5;    //readResult.GetColumnIndex("No. of Legs");
            _legNumberCreditedIndex = 6;    // readResult.GetColumnIndex("Leg # credited");

            // company
            _customerNumberIndex  = 19; //readResult.GetColumnIndex("Customer #");
            _companyNameIndex     = 20; //readResult.GetColumnIndex("Company Name");
            _companyAddress1Index = 21; //readResult.GetColumnIndex("Address Line 1");
            _companyAddress2Index = 22; //readResult.GetColumnIndex("Address Line 2");
            _companyCityIndex     = 11; //readResult.GetColumnIndex("Stopoff City");
            _companyStateIndex    = 12; //readResult.GetColumnIndex("Stopoff State");
            _companyZipIndex      = 23; //readResult.GetColumnIndex("Zip Code");

            // order origin and destination
            _orderOriginCityIndex  = 38;      //readResult.GetColumnIndex("Order origin city");
            _orderOriginStateIndex = 39;      //readResult.GetColumnIndex("Order origin state");
            _orderOriginZipIndex   = 40;      //readResult.GetColumnIndex("Order origin zip");

            _orderDestinationCityIndex  = 43; //readResult.GetColumnIndex("Order Destination city");
            _orderDestinationStateIndex = 44; //readResult.GetColumnIndex("Order Destination state");
            _orderDestinationZipIndex   = 45; //readResult.GetColumnIndex("Order Destination zip");

            _shipperNumberIndex   = 28;       //readResult.GetColumnIndex("Shipper #");
            _shipperNameIndex     = 35;       //readResult.GetColumnIndex("Shipper Name");
            _consigneeNumberIndex = 30;       //readResult.GetColumnIndex("Consignee #");
            _consigneeNameIndex   = 36;       //readResult.GetColumnIndex("Consignee Name");

            _serviceTypeIndex        = 50;    //readResult.GetColumnIndex("Service type");
            _legOriginCityIndex      = 53;    //readResult.GetColumnIndex("Leg origin city");
            _legOriginZipIndex       = 56;    //readResult.GetColumnIndex("Leg origin zip");
            _legDestinationCityIndex = 62;    //readResult.GetColumnIndex("Leg Destination city");

            _originZoneIndex      = 52;       //readResult.GetColumnIndex("Dispatch origin term/zone");
            _destinationZoneIndex = 61;       //readResult.GetColumnIndex("Dispatch dest. term/zone");

            var importedJobs = new List <ImportedLeg>();

            if (readResult.Values != null)
            {
                try
                {
                    foreach (var stringse in readResult.Values)
                    {
                        try
                        {
                            var importedJob = ExtractJob(stringse);
                            importedJobs.Add(importedJob);
                        }
                        catch (Exception e)
                        {
                            ReportErrors.AddError(filePath + "\n" + stringse + "\n" + e.Message);
                        }
                    }
                }
                catch (Exception ex)
                {
                    ReportErrors.AddError(filePath + "\n" + ex.Message + "\n" + ex.StackTrace);
                }
            }
            return(new ImportJobResult(importedJobs, _geocodeService, _jobGroupService));
        }