private void SaveAgentShipmentType(FrayteAgent frayteAgentUserShipmentType)
        {
            UserShipmentType newUserShipmentType;

            if (frayteAgentUserShipmentType != null)
            {
                if (frayteAgentUserShipmentType.UserShipmentTypeId == 0)
                {
                    newUserShipmentType           = new UserShipmentType();
                    newUserShipmentType.UserId    = frayteAgentUserShipmentType.UserId;
                    newUserShipmentType.IsAir     = frayteAgentUserShipmentType.IsAir;
                    newUserShipmentType.IsSea     = frayteAgentUserShipmentType.IsSea;
                    newUserShipmentType.IsExpryes = frayteAgentUserShipmentType.IsExpryes;
                    dbContext.UserShipmentTypes.Add(newUserShipmentType);
                }
                else
                {
                    newUserShipmentType           = dbContext.UserShipmentTypes.Find(frayteAgentUserShipmentType.UserShipmentTypeId);
                    newUserShipmentType.UserId    = frayteAgentUserShipmentType.UserId;
                    newUserShipmentType.IsAir     = frayteAgentUserShipmentType.IsAir;
                    newUserShipmentType.IsSea     = frayteAgentUserShipmentType.IsSea;
                    newUserShipmentType.IsExpryes = frayteAgentUserShipmentType.IsExpryes;
                }
                if (newUserShipmentType != null)
                {
                    dbContext.SaveChanges();
                }
            }
        }
        public FrayteAgent GetDestinatingAgent(int shipmentId)
        {
            FrayteAgent destinatingAgent = new FrayteAgent();
            int?        agentId          = new AgentRepository().GetDestinatingId(shipmentId);

            if (agentId > 0)
            {
                destinatingAgent = new AgentRepository().GetAgentDetail(agentId);
            }

            return(destinatingAgent);
        }
        public IHttpActionResult SaveAgent(FrayteAgent agentDetail)
        {
            FrayteResult result = new AgentRepository().SaveAgent(agentDetail);

            if (result != null && result.Status)
            {
                return(Ok());
            }
            else
            {
                return(NotFound());
            }
        }
        private void GetAssociateUsersDetail(int agentId, FrayteAgent agentDetail)
        {
            List <FrayteAgentAssociatedUser> userAssociated = new List <FrayteAgentAssociatedUser>();
            var users = dbContext.AgentAssociatedUsers.Where(p => p.AgentId == agentId);

            foreach (var user in users)
            {
                FrayteAgentAssociatedUser newUser = new FrayteAgentAssociatedUser();
                newUser.AgentAssociatedUserId = user.AgentAssociatedUserId;
                newUser.AgentId          = user.AgentId;
                newUser.Name             = user.Name;
                newUser.UserType         = user.UserType;
                newUser.Email            = user.Email;
                newUser.TelephoneNo      = user.TelephoneNo;
                newUser.WorkingStartTime = UtilityRepository.GetTimeZoneTime(user.WorkingStartTime, agentDetail.Timezone.TimezoneId);
                newUser.WorkingEndTime   = UtilityRepository.GetTimeZoneTime(user.WorkingEndTime, agentDetail.Timezone.TimezoneId);
                newUser.WorkingWeekDays  = user.WorkingWeekDays;

                userAssociated.Add(newUser);
            }
            agentDetail.AssociatedUsers = userAssociated;
        }
        public FrayteShipmentOriginatingAgentDetails GetOriginatingAgent(int shipmentId)
        {
            FrayteShipment shipment = new FrayteShipment();
            FrayteShipmentOriginatingAgentDetails newAgent = new FrayteShipmentOriginatingAgentDetails();
            FrayteAgent originatingAgent = new FrayteAgent();
            int?        agentId          = new AgentRepository().GetOriginatingId(shipmentId);

            if (agentId > 0)
            {
                originatingAgent = new AgentRepository().GetAgentDetail(agentId);
            }
            if (originatingAgent != null)
            {
                newAgent.DeliveryAddress = new FrayteAddress();
                newAgent.DeliveryAddress = originatingAgent.UserAddress;
            }

            shipment = new ShipmentRepository().GetShipmentDetail(shipmentId);
            if (shipment != null)
            {
                newAgent.ShipmentId = shipment.ShipmentId;
            }
            return(newAgent);
        }
        private void SaveAgentAdditional(FrayteAgent frayteAgentUser)
        {
            UserAdditional customerDetail = dbContext.UserAdditionals.Where(p => p.UserId == frayteAgentUser.UserId).FirstOrDefault();

            if (customerDetail != null)
            {
                customerDetail.UserId    = frayteAgentUser.UserId;
                customerDetail.AccountNo = "000000000";

                if (frayteAgentUser.AccountUser != null)
                {
                    customerDetail.AccountUserId = frayteAgentUser.AccountUser.UserId;
                }

                if (frayteAgentUser.DocumentUser != null)
                {
                    customerDetail.DocumentUserId = frayteAgentUser.DocumentUser.UserId;
                }

                if (frayteAgentUser.ManagerUser != null)
                {
                    customerDetail.ManagerUserId = frayteAgentUser.ManagerUser.UserId;
                }

                if (frayteAgentUser.OperationUser != null)
                {
                    customerDetail.OperationUserId = frayteAgentUser.OperationUser.UserId;
                }
            }
            else
            {
                if (frayteAgentUser.AccountUser != null ||
                    frayteAgentUser.DocumentUser != null ||
                    frayteAgentUser.ManagerUser != null ||
                    frayteAgentUser.OperationUser != null)
                {
                    customerDetail           = new UserAdditional();
                    customerDetail.UserId    = frayteAgentUser.UserId;
                    customerDetail.AccountNo = "000000000";

                    if (frayteAgentUser.AccountUser != null)
                    {
                        customerDetail.AccountUserId = frayteAgentUser.AccountUser.UserId;
                    }

                    if (frayteAgentUser.DocumentUser != null)
                    {
                        customerDetail.DocumentUserId = frayteAgentUser.DocumentUser.UserId;
                    }

                    if (frayteAgentUser.ManagerUser != null)
                    {
                        customerDetail.ManagerUserId = frayteAgentUser.ManagerUser.UserId;
                    }

                    if (frayteAgentUser.OperationUser != null)
                    {
                        customerDetail.OperationUserId = frayteAgentUser.OperationUser.UserId;
                    }

                    dbContext.UserAdditionals.Add(customerDetail);
                }
            }

            if (customerDetail != null)
            {
                dbContext.SaveChanges();
            }
        }
        public List <FrayteAgent> GetAllAgents(DataTable exceldata)
        {
            List <FrayteAgent> agents = new List <FrayteAgent>();

            FrayteAgent agent;

            foreach (DataRow shipmentdetail in exceldata.Rows)
            {
                agent = new FrayteAgent();

                agent.UserId      = 0;
                agent.RoleId      = (int)FrayteUserRole.Agent;
                agent.CompanyName = shipmentdetail["CompanyName"].ToString();
                agent.ContactName = shipmentdetail["ContactName"].ToString();
                agent.ShortName   = shipmentdetail["ShortName"].ToString();
                agent.Email       = shipmentdetail["Email"].ToString();

                agent.TelephoneNo = shipmentdetail["TelephoneNo"].ToString();
                agent.MobileNo    = shipmentdetail["MobileNo"].ToString();

                agent.FaxNumber        = shipmentdetail["FaxNumber"].ToString();
                agent.WorkingStartTime = Convert.ToDateTime(shipmentdetail["WorkingStartTime"].ToString());
                agent.WorkingEndTime   = Convert.ToDateTime(shipmentdetail["WorkingEndTime"].ToString());
                agent.WorkingWeekDay   = new WorkingWeekDay();
                string workingDay           = shipmentdetail["WorkingWeekDay"].ToString();
                var    workingWeekDayResult = dbContext.WorkingWeekDays.Where(p => p.Description == workingDay).FirstOrDefault();
                if (workingWeekDayResult != null)
                {
                    agent.WorkingWeekDay = workingWeekDayResult;
                }
                else
                {
                    agent.WorkingWeekDay.Description = shipmentdetail["WorkingWeekDay"].ToString();
                }

                agent.Timezone = new TimeZoneModal();
                string weekTimezone   = shipmentdetail["Timezone"].ToString();
                var    timeZoneResult = dbContext.Timezones.Where(p => p.Name == weekTimezone).FirstOrDefault();
                if (timeZoneResult != null)
                {
                    agent.Timezone.TimezoneId  = timeZoneResult.TimezoneId;
                    agent.Timezone.Name        = timeZoneResult.Name;
                    agent.Timezone.Offset      = timeZoneResult.Offset;
                    agent.Timezone.OffsetShort = timeZoneResult.OffsetShort;
                }
                else
                {
                    agent.Timezone.Name = shipmentdetail["Timezone"].ToString();
                }

                agent.VATGST    = shipmentdetail["VATGST"].ToString();
                agent.CreatedOn = DateTime.UtcNow;

                FrayteAddress agentAddress = new FrayteAddress();

                agentAddress.Address  = shipmentdetail["Address"].ToString();
                agentAddress.Address2 = shipmentdetail["Address2"].ToString();
                agentAddress.Address3 = shipmentdetail["Address3"].ToString();
                agentAddress.Suburb   = shipmentdetail["Suburb"].ToString();
                agentAddress.City     = shipmentdetail["City"].ToString();
                agentAddress.State    = shipmentdetail["State"].ToString();
                agentAddress.Zip      = shipmentdetail["Zip"].ToString();
                agentAddress.Country  = new FrayteCountryCode();
                string countryName = shipmentdetail["Country"].ToString();
                var    country     = dbContext.Countries.Where(p => p.CountryName == countryName).FirstOrDefault();
                if (country != null)
                {
                    agentAddress.Country.CountryId = country.CountryId;
                    agentAddress.Country.Code      = country.CountryCode;
                    agentAddress.Country.Name      = country.CountryName;
                }
                else
                {
                    agentAddress.Country.Code = shipmentdetail["Country"].ToString();
                }

                agent.UserAddress = agentAddress;

                agents.Add(agent);
            }

            return(agents);
        }
        public FrayteResult SaveAgent(FrayteAgent frayteUser)
        {
            FrayteResult result = new FrayteResult();

            FrayteUserRepository userRepository = new FrayteUserRepository();

            //Step 1: Save Agent Detail
            userRepository.SaveUserDetail(frayteUser);

            //Step 2: Save Agent's additional detail
            SaveAgentAdditional(frayteUser);

            // Step 3: Save UserShipmentType
            SaveAgentShipmentType(frayteUser);

            //Step 4: Save Agent role
            userRepository.SaveUserRole(frayteUser.UserId, (int)FrayteUserRole.Agent);

            //Step 5: Save Agent Address information
            frayteUser.UserAddress.AddressTypeId = (int)FrayteAddressType.MainAddress;
            frayteUser.UserAddress.UserId        = frayteUser.UserId;
            userRepository.SaveUserAddress(frayteUser.UserAddress);

            //Step 6: Save Agent other address information
            if (frayteUser.OtherAddresses != null && frayteUser.OtherAddresses.Count > 0)
            {
                foreach (FrayteAddress address in frayteUser.OtherAddresses)
                {
                    address.AddressTypeId = (int)FrayteAddressType.OtherAddress;
                    address.UserId        = frayteUser.UserId;
                    userRepository.SaveUserAddress(address);
                }
            }

            //Step 7: Save Agent's Associated Users information
            if (frayteUser.AssociatedUsers != null && frayteUser.AssociatedUsers.Count > 0)
            {
                foreach (FrayteAgentAssociatedUser agentUser in frayteUser.AssociatedUsers)
                {
                    AgentAssociatedUser saveUser = new AgentAssociatedUser();

                    if (agentUser.AgentAssociatedUserId > 0)
                    {
                        // Update AgentAssociated user Info
                        var associatedUser = dbContext.AgentAssociatedUsers.Where(p => p.AgentAssociatedUserId == agentUser.AgentAssociatedUserId).FirstOrDefault();
                        if (associatedUser != null)
                        {
                            associatedUser.Name        = agentUser.Name;
                            associatedUser.UserType    = agentUser.UserType;
                            associatedUser.Email       = agentUser.Email;
                            associatedUser.TelephoneNo = agentUser.TelephoneNo;

                            associatedUser.WorkingStartTime = UtilityRepository.GetTimeZoneUTCTime(agentUser.WorkingStartTime, frayteUser.Timezone.TimezoneId).Value;
                            associatedUser.WorkingEndTime   = UtilityRepository.GetTimeZoneUTCTime(agentUser.WorkingEndTime, frayteUser.Timezone.TimezoneId).Value;
                            associatedUser.WorkingWeekDays  = agentUser.WorkingWeekDays;
                            dbContext.SaveChanges();
                        }
                        else
                        {
                            saveUser.AgentId          = frayteUser.UserId;
                            saveUser.Name             = agentUser.Name;
                            saveUser.UserType         = agentUser.UserType;
                            saveUser.Email            = agentUser.Email;
                            saveUser.TelephoneNo      = agentUser.TelephoneNo;
                            saveUser.WorkingStartTime = UtilityRepository.GetTimeZoneUTCTime(agentUser.WorkingStartTime, frayteUser.Timezone.TimezoneId).Value;
                            saveUser.WorkingEndTime   = UtilityRepository.GetTimeZoneUTCTime(agentUser.WorkingEndTime, frayteUser.Timezone.TimezoneId).Value;
                            saveUser.WorkingWeekDays  = agentUser.WorkingWeekDays;
                            dbContext.AgentAssociatedUsers.Add(saveUser);
                            dbContext.SaveChanges();
                        }
                    }
                    else
                    {
                        // Insert Agent Associated User Info
                        saveUser.AgentId          = frayteUser.UserId;
                        saveUser.Name             = agentUser.Name;
                        saveUser.UserType         = agentUser.UserType;
                        saveUser.Email            = agentUser.Email;
                        saveUser.TelephoneNo      = agentUser.TelephoneNo;
                        saveUser.WorkingStartTime = UtilityRepository.GetTimeZoneUTCTime(agentUser.WorkingStartTime, frayteUser.Timezone.TimezoneId).Value;
                        saveUser.WorkingEndTime   = UtilityRepository.GetTimeZoneUTCTime(agentUser.WorkingEndTime, frayteUser.Timezone.TimezoneId).Value;
                        saveUser.WorkingWeekDays  = agentUser.WorkingWeekDays;
                        dbContext.AgentAssociatedUsers.Add(saveUser);
                        dbContext.SaveChanges();
                    }
                }
            }

            result.Status = true;

            return(result);
        }
        public FrayteAgent GetAgentDetail(int?agentId)
        {
            FrayteAgent    agentDetail = new FrayteAgent();
            WorkingWeekDay workingDays = new WorkingWeekDay();
            //Step 1: Get Agent's basic information
            var agent = dbContext.Users.Where(p => p.UserId == agentId).FirstOrDefault();

            if (agent != null)
            {
                agentDetail        = UtilityRepository.AgentMapping(agent);
                agentDetail.RoleId = (int)FrayteUserRole.Agent;
                // get Working Week Time
                if (agentDetail.WorkingWeekDay.WorkingWeekDayId > 0)
                {
                    workingDays = dbContext.WorkingWeekDays.Find(agentDetail.WorkingWeekDay.WorkingWeekDayId);
                }


                if (workingDays != null)
                {
                    agentDetail.WorkingWeekDay = workingDays;
                }
                //Step 1.1: Get Agent's time zone
                var timeZone = dbContext.Timezones.Where(p => p.TimezoneId == agent.TimezoneId).FirstOrDefault();
                if (timeZone != null)
                {
                    agentDetail.Timezone             = new TimeZoneModal();
                    agentDetail.Timezone.TimezoneId  = timeZone.TimezoneId;
                    agentDetail.Timezone.Name        = timeZone.Name;
                    agentDetail.Timezone.Offset      = timeZone.Offset;
                    agentDetail.Timezone.OffsetShort = timeZone.OffsetShort;
                }

                //Step 2: Get Agent's other information
                var agentOtherDetails = dbContext.UserAdditionals.Where(p => p.UserId == agentId).FirstOrDefault();
                if (agentOtherDetails != null)
                {
                    //Get associated Frayte User's detail
                    GetAssociateUsersDetail(agent.UserId, agentDetail);
                }

                // Step 3: Get AgentShipmentType
                if (agentDetail != null && agentDetail.UserId > 0)
                {
                    var agentShipmentType = dbContext.UserShipmentTypes.Where(p => p.UserId == agent.UserId).FirstOrDefault();
                    if (agentShipmentType != null)
                    {
                        agentDetail.UserShipmentTypeId = agentShipmentType.UserShipmentTypeId;
                        agentDetail.IsAir     = agentShipmentType.IsAir;
                        agentDetail.IsSea     = agentShipmentType.IsSea;
                        agentDetail.IsExpryes = agentShipmentType.IsExpryes;
                    }
                }

                //Step 4: Get Agents's Address information
                var agentAddress = dbContext.UserAddresses.Where(p => p.UserId == agentId &&
                                                                 (p.AddressTypeId == (int)FrayteAddressType.MainAddress ||
                                                                  p.AddressTypeId == (int)FrayteAddressType.OtherAddress)).ToList();
                if (agentAddress != null)
                {
                    agentDetail.OtherAddresses = new List <FrayteAddress>();

                    foreach (UserAddress address in agentAddress)
                    {
                        if (address.AddressTypeId == (int)FrayteAddressType.MainAddress)
                        {
                            //Step 3.1: Set Agent main address
                            agentDetail.UserAddress = new FrayteAddress();
                            agentDetail.UserAddress = UtilityRepository.UserAddressMapping(address);

                            //Step : Get country information
                            var country = dbContext.Countries.Where(p => p.CountryId == address.CountryId).FirstOrDefault();
                            if (country != null)
                            {
                                agentDetail.UserAddress.Country           = new FrayteCountryCode();
                                agentDetail.UserAddress.Country.CountryId = country.CountryId;
                                agentDetail.UserAddress.Country.Code      = country.CountryCode;
                                agentDetail.UserAddress.Country.Name      = country.CountryName;
                            }
                        }
                        else
                        {
                            //Step 4.2: Set Agent's other addresses
                            FrayteAddress otherAddress = UtilityRepository.UserAddressMapping(address);

                            //Step : Get country information
                            var country = dbContext.Countries.Where(p => p.CountryId == otherAddress.Country.CountryId).FirstOrDefault();
                            if (country != null)
                            {
                                otherAddress.Country           = new FrayteCountryCode();
                                otherAddress.Country.CountryId = country.CountryId;
                                otherAddress.Country.Code      = country.CountryCode;
                                otherAddress.Country.Name      = country.CountryName;
                            }

                            agentDetail.OtherAddresses.Add(otherAddress);
                        }
                    }
                }
            }
            return(agentDetail);
        }