public static SessionInfo Authenticate(UserLogin userLogin)
        {
            if (PrimaveraEngine.InitializeCompany() == false)
            {
                throw new DatabaseConnectionException();
            }

            var sqlQuery = new SqlBuilder()
                           .FromTable(tableUsers)
                           .Columns(loginColumns)
                           .Where(fieldUsername, Comparison.Equals, userLogin.Username);

            using (var userInfo = PrimaveraEngine.ConsultaSQLite(sqlQuery))
            {
                if (userInfo.Read() == false)
                {
                    return(null);
                }

                var userPasword = userInfo.GetString(userInfo.GetOrdinal(fieldPassword));

                if (userPasword.Equals(userLogin.Password) == false)
                {
                    return(null);
                }

                var representativesTable = PrimaveraEngine.Engine.Comercial.Vendedores;
                var representativeId     = userInfo.GetString(userInfo.GetOrdinal(fieldRepresentative));
                var representativeInfo   = representativesTable.Edita(representativeId);
                var userToken            = Authentication.CreateSession(userLogin.Username, representativeId);

                return(new SessionInfo
                {
                    Token = userToken,
                    Username = userLogin.Username,
                    Nome = representativeInfo.get_Nome(),
                    Email = representativeInfo.get_Email(),
                    Morada = representativeInfo.get_Morada(),
                    Comissao = representativeInfo.get_Comissao(),
                    Telefone = representativeInfo.get_Telefone(),
                    Telemovel = representativeInfo.get_Telemovel(),
                    Identificador = representativeInfo.get_Vendedor(),
                    Empresa = PrimaveraEngine.Engine.Licenca.get_Nome(),
                    CodigoPostal = representativeInfo.get_CodigoPostal(),
                    Fotografia = representativeInfo.get_LocalizacaoFoto(),
                    Localidade = representativeInfo.get_LocalidadeCodigoPostal(),
                });
            }
        }
        public static Representative Update(string sessionUsername, UserInfo userInfo)
        {
            if (PrimaveraEngine.InitializeCompany() == false)
            {
                throw new DatabaseConnectionException();
            }

            var sqlQuery = new SqlBuilder()
                           .FromTable(tableUsers)
                           .Column(fieldPassword)
                           .Where(fieldUsername, Comparison.Equals, sessionUsername);

            using (var queryResult = PrimaveraEngine.ConsultaSQLite(sqlQuery))
            {
                int    changedFields = 0;
                string queryPassword = "******";

                if (queryResult.Read())
                {
                    var currentPassword = queryResult.GetString(queryResult.GetOrdinal(fieldPassword));

                    if (userInfo.Password.Equals(currentPassword))
                    {
                        return(null);
                    }

                    if (userInfo.Password == null)
                    {
                        queryPassword += "password = :password";
                        changedFields++;
                    }

                    if (userInfo.Representante != null)
                    {
                        if (changedFields > 0)
                        {
                            queryPassword += " AND ";
                        }

                        queryPassword += "representative = :representative";
                        changedFields++;
                    }

                    if (changedFields < 1)
                    {
                        return(null);
                    }

                    queryPassword += "WHERE username = :username";

                    using (var sqlCommand = new SQLiteCommand(queryPassword, PrimaveraEngine.getAuthenticationService()))
                    {
                        sqlCommand.Parameters.Add(new SQLiteParameter(fieldUsername, sessionUsername));

                        if (userInfo.Password != null)
                        {
                            sqlCommand.Parameters.Add(new SQLiteParameter(fieldPassword, userInfo.Password));
                        }

                        if (userInfo.Representante != null)
                        {
                            sqlCommand.Parameters.Add(new SQLiteParameter(fieldRepresentative, userInfo.Representante));
                        }

                        sqlCommand.ExecuteNonQuery();
                    }
                }
                else
                {
                    return(null);
                }
            }

            return(UserIntegration.View(userInfo.Representante));
        }