private void ExecuteCreateLoad()
        {
            ShowInputError = false;

            //TODO VALIDATE TICKET LOAD NUMBER EXISTS
            if (string.IsNullOrEmpty(GinTicketLoadNumber))
            {
                ShowInputError    = true;
                InputErrorMessage = "Please enter a gin ticket load number.";
            }

            if (!ShowInputError)
            {
                using (var dp = SimpleIoc.Default.GetInstance <IUnitOfWorkFactory>().CreateUnitOfWork())
                {
                    var hasLoad = dp.LoadScanRepository.FindMatching(x => x.GinTagLoadNumber == GinTicketLoadNumber).Any();

                    if (hasLoad)
                    {
                        this.ExecuteLookupLoad();
                        return;
                    }

                    var bridgeID     = dp.SettingsRepository.GetSettingWithDefault(BridgeSettingKeys.BRIDGE_ID, "");
                    var lastLoadScan = new LoadScanEntity();

                    lastLoadScan.SubmittedBy = "attendant";

                    //always use a new load number otherwise a previous load
                    //could get overwritten
                    lastLoadScan.BridgeLoadNumber = dp.LoadScanRepository.LastLoadNumber() + 1;
                    var scanData = new ModuleScanData();
                    scanData.Scans = new List <LoadModuleScan>();
                    lastLoadScan.SetSerializedModuleScanData(scanData);
                    lastLoadScan.BridgeID         = bridgeID;
                    lastLoadScan.TruckID          = "";
                    lastLoadScan.GinTagLoadNumber = GinTicketLoadNumber;
                    lastLoadScan.GrossWeight      = 0.00M;
                    lastLoadScan.NetWeight        = 0.00M;
                    lastLoadScan.SplitWeight1     = 0.00M;
                    lastLoadScan.SplitWeight2     = 0.00M;
                    lastLoadScan.Latitude         = dp.SettingsRepository.GetSettingDoubleValue(BridgeSettingKeys.LATITUDE);
                    lastLoadScan.Longitude        = dp.SettingsRepository.GetSettingDoubleValue(BridgeSettingKeys.LONGITUDE);

                    lastLoadScan.TrailerNumber = "";
                    lastLoadScan.Variety       = "";
                    lastLoadScan.YardRow       = "IN FIELD";
                    lastLoadScan.PickedBy      = "";

                    lastLoadScan.Client = "";
                    lastLoadScan.Farm   = "";
                    lastLoadScan.Field  = "";

                    var status = dp.SettingsRepository.GetSettingWithDefault(BridgeSettingKeys.TARGET_STATUS, "AT GIN");

                    if (status == "AT GIN")
                    {
                        lastLoadScan.TargetStatus = ModuleStatus.AT_GIN;
                    }
                    else
                    {
                        lastLoadScan.TargetStatus = ModuleStatus.ON_FEEDER;
                    }
                    lastLoadScan.SubmittedBy = "attendant";
                    //lastLoadScan.SetSerializedModuleScanData(scanData);
                    dp.LoadScanRepository.Save(lastLoadScan);
                    dp.SaveChanges();

                    var vm = new LoadViewModel(NavService);
                    NavService.ShowPage(PageType.LOAD_PAGE, false, (BasePageViewModel)vm);
                    vm.Initialize(GinTicketLoadNumber, false, true);
                }
            }
        }
        private void SaveForm(bool isAutoSave)
        {
            try
            {
                using (var dp = SimpleIoc.Default.GetInstance <IUnitOfWorkFactory>().CreateUnitOfWork())
                {
                    LoadScanEntity loadScan = null;
                    var            bridgeID = dp.SettingsRepository.GetSettingWithDefault(BridgeSettingKeys.BRIDGE_ID, "");

                    //try to look load up by gin tag number to update matching load
                    // if (!isAutoSave)
                    //     loadScan = dp.LoadScanRepository.FindSingle(l => l.GinTagLoadNumber == GinTicketLoadNumber);

                    if (loadScan == null)
                    {
                        loadScan = dp.LoadScanRepository.GetById(_loadScanId);
                        loadScan.GinTagLoadNumber = GinTicketLoadNumber;
                    }

                    loadScan.BridgeID = bridgeID;

                    if (TruckID == "-- Select One --")
                    {
                        _TruckID = "";
                    }

                    loadScan.TruckID = TruckID;

                    if (!isAutoSave)
                    {
                        loadScan.GinTagLoadNumber = GinTicketLoadNumber;
                    }

                    var grossWeight = 0.00M;
                    var split1      = 0.00M;
                    var split2      = 0.00M;

                    if (decimal.TryParse(GrossWeight, out grossWeight))
                    {
                        loadScan.GrossWeight = grossWeight;
                    }

                    if (decimal.TryParse(SplitWeight1, out split1))
                    {
                        loadScan.SplitWeight1 = split1;
                    }

                    if (decimal.TryParse(SplitWeight2, out split2))
                    {
                        loadScan.SplitWeight2 = split2;
                    }

                    loadScan.NetWeight = loadScan.GrossWeight - _tareWeight;
                    loadScan.Latitude  = dp.SettingsRepository.GetSettingDoubleValue(BridgeSettingKeys.LATITUDE);
                    loadScan.Longitude = dp.SettingsRepository.GetSettingDoubleValue(BridgeSettingKeys.LONGITUDE);

                    loadScan.PickedBy  = PickedBy;
                    loadScan.Processed = false;

                    var status = dp.SettingsRepository.GetSettingWithDefault(BridgeSettingKeys.TARGET_STATUS, "AT GIN");
                    if (status == "AT GIN")
                    {
                        loadScan.TargetStatus = ModuleStatus.AT_GIN;
                    }
                    else
                    {
                        loadScan.TargetStatus = ModuleStatus.ON_FEEDER;
                    }

                    loadScan.TrailerNumber = TrailerNumber;
                    loadScan.Variety       = Variety;
                    loadScan.YardRow       = YardLocation;
                    if (AttendantChecked)
                    {
                        loadScan.SubmittedBy = "attendant";
                    }
                    if (DriverChecked)
                    {
                        loadScan.SubmittedBy = "driver";
                    }
                    loadScan.Client = Client;
                    loadScan.Farm   = Farm;
                    loadScan.Field  = Field;

                    var moduleScanData = new ModuleScanData();
                    moduleScanData.Scans = new List <LoadModuleScan>();
                    moduleScanData.Scans.AddRange(Modules.ToList());
                    loadScan.SetSerializedModuleScanData(moduleScanData);

                    dp.LoadScanRepository.Save(loadScan);
                    dp.SaveChanges();

                    Messenger.Default.Send <LoadSavedMessage>(new LoadSavedMessage {
                        Scan = loadScan
                    });
                }
            }
            catch (Exception exc)
            {
                System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    if (!isAutoSave)
                    {
                        System.Windows.MessageBox.Show("An error occured saving load. " + exc.Message);
                    }
                }));
                Logging.Logger.Log(exc);
            }
        }
        private void CreateLoad(ref bool newLoad)
        {
            _loadCreated = true;
            timer.Stop();
            autoSaveTimer.Stop();
            using (var dp = SimpleIoc.Default.GetInstance <IUnitOfWorkFactory>().CreateUnitOfWork())
            {
                Logging.Logger.Log("INFO", "CREATING LOAD FROM WEIGH IN: LOAD " + GinTicketLoadNumber);

                //find module ownerships
                var bridgeID         = dp.SettingsRepository.GetSettingWithDefault(BridgeSettingKeys.BRIDGE_ID, "");
                var ownerships       = dp.ModuleOwnershipRepository.FindMatching(m => m.GinTagLoadNumber == GinTicketLoadNumber).ToList().OrderBy(t => t.LastCreatedOrUpdated);
                var lastOwnership    = ownerships.LastOrDefault();
                var lastLoadScan     = dp.LoadScanRepository.FindMatching(l => l.GinTagLoadNumber == GinTicketLoadNumber).OrderBy(t => t.Created).LastOrDefault();
                var lastLoadScanTime = (lastLoadScan != null) ? lastLoadScan.LastCreatedOrUpdated : DateTime.Now.AddYears(-1);

                ModuleScanData scanData = new ModuleScanData();
                scanData.Scans = new List <LoadModuleScan>();
                Logging.Logger.Log("INFO", "GET TAGS SEEN BETWEEN " + _readerWindowStartTime.ToLocalTime().ToString() + " AND " + DateTime.Now.ToString());
                var tags       = TagDataProvider.GetTagsFirstSeenInTimeRange(_readerWindowStartTime, DateTime.UtcNow);
                var tagSerials = tags.Select(t => t.SerialNumber).ToArray();
                var ginnedTags = dp.ModuleOwnershipRepository.FindMatching(m => tagSerials.Contains(m.Name) && (m.Status == "Ginned" || m.Status == "On feeder"));

                if (ginnedTags.Count() > 0)
                {
                    Logging.Logger.Log("WARNING", "ONE OR MORE TAGS READ WITH GINNED STATUS.  GINNED COUNT: " + ginnedTags.Count().ToString());
                }

                var trucks = dp.TruckRepository.GetAll();

                foreach (var t in tags)
                {
                    if (!ginnedTags.Any(g => g.Name == t.SerialNumber) && !trucks.Any(x => x.RFIDTagId == t.SerialNumber || x.RFIDTagId == t.Epc))
                    {
                        Logging.Logger.Log("INFO", "RECORDING MODULE SN " + t.SerialNumber + " FIRST SEEN AT LOCAL TIME" + t.Firstseen.ToLocalTime().ToString());
                        scanData.Scans.Add(new LoadModuleScan
                        {
                            EPC          = t.Epc,
                            SerialNumber = t.SerialNumber,
                            ScanTime     = t.Firstseen
                        });
                    }
                }

                var serialNumbers           = tags.Select(t => t.SerialNumber).ToArray();
                var moduleOwnershipsForTags = dp.ModuleOwnershipRepository.FindMatching(m => serialNumbers.Contains(m.Name)).ToList();

                if (moduleOwnershipsForTags.Count() > 0 && lastOwnership == null)
                {
                    lastOwnership = moduleOwnershipsForTags[0];
                    Logging.Logger.Log("INFO", "Found ownership from module.");
                }

                if (lastOwnership != null)
                {
                    Logging.Logger.Log("INFO", "Using ownership " + lastOwnership.Client + "/" + lastOwnership.Farm + "/" + lastOwnership.Field);
                }

                bool populateFromOwnership = (lastOwnership != null && lastLoadScan == null);

                //if ((lastOwnership != null && lastLoadScan == null)/* || (lastOwnership != null && lastOwnership.LastCreatedOrUpdated > lastLoadScan.LastCreatedOrUpdated)*/)
                //    populateFromOwnership = true;

                if (lastLoadScan == null)
                {
                    Logging.Logger.Log("INFO", "CREATING NEW LOAD SCAN");
                    newLoad                  = true;
                    lastLoadScan             = new LoadScanEntity();
                    lastLoadScan.SubmittedBy = "attendant";

                    //always use a new load number otherwise a previous load
                    //could get overwritten
                    lastLoadScan.BridgeLoadNumber = dp.LoadScanRepository.LastLoadNumber() + 1;

                    /*if (populateFromOwnership)
                     *  if (lastOwnership.BridgeLoadNumber > 0) lastLoadScan.BridgeLoadNumber = lastOwnership.BridgeLoadNumber;
                     *  else lastLoadScan.BridgeLoadNumber = dp.LoadScanRepository.LastLoadNumber() + 1;
                     * else
                     *  lastLoadScan.BridgeLoadNumber = dp.LoadScanRepository.LastLoadNumber() + 1;
                     */
                }

                lastLoadScan.BridgeID         = bridgeID;
                lastLoadScan.TruckID          = _activeTruck.Name;
                lastLoadScan.GinTagLoadNumber = GinTicketLoadNumber;
                lastLoadScan.GrossWeight      = GrossWeight;
                lastLoadScan.NetWeight        = GrossWeight - _activeTruck.TareWeight;
                lastLoadScan.SplitWeight1     = Weight1;
                lastLoadScan.SplitWeight2     = Weight2;
                lastLoadScan.Latitude         = dp.SettingsRepository.GetSettingDoubleValue(BridgeSettingKeys.LATITUDE);
                lastLoadScan.Longitude        = dp.SettingsRepository.GetSettingDoubleValue(BridgeSettingKeys.LONGITUDE);

                if (populateFromOwnership && lastOwnership != null)
                {
                    lastLoadScan.TrailerNumber = lastOwnership.TrailerNumber;
                    lastLoadScan.Variety       = lastOwnership.Variety;
                    lastLoadScan.YardRow       = lastOwnership.Location;
                    lastLoadScan.PickedBy      = lastOwnership.PickedBy;
                }

                if (populateFromOwnership && lastOwnership != null)
                {
                    lastLoadScan.Client = lastOwnership.Client;
                    lastLoadScan.Farm   = lastOwnership.Farm;
                    lastLoadScan.Field  = lastOwnership.Field;
                }

                var status = dp.SettingsRepository.GetSettingWithDefault(BridgeSettingKeys.TARGET_STATUS, "AT GIN");

                if (status == "AT GIN")
                {
                    lastLoadScan.TargetStatus = ModuleStatus.AT_GIN;
                }
                else
                {
                    lastLoadScan.TargetStatus = ModuleStatus.ON_FEEDER;
                }
                lastLoadScan.SubmittedBy = "attendant";
                lastLoadScan.SetSerializedModuleScanData(scanData);
                dp.LoadScanRepository.Save(lastLoadScan);
                dp.SaveChanges();

                Logging.Logger.WriteBuffer();
            }
        }