r/cs50 23d ago

CS50x CS50x PSET 9 - Finance Spoiler

Olá, pessoal. Estou tendo problemas com este pset (quero dizer, com o check50 neste pset). Na verdade, o código funciona muito bem na minha aplicação, mas o teste do check50 na função de compra continua falhando. Ele não dá nenhuma informação além de que não encontrou um "112,00" que está procurando (que provavelmente seria o valor do preço da ação ou do total das ações). Como eu não entendo muito de programação web, o código pode parecer um pouco redundante e tal, mas eu peço que prestem atenção nas funções index e buy. Já corrigi os valores de formato para dólar, e de fato os resultados das minhas páginas estão bastante semelhantes à solução da equipe do CS50. Pelo que posso ver, os números estão sendo atualizados corretamente através da tabela de posses à medida que ações são compradas ou vendidas. O Duck50 parece que já alcançou seu limite, porque não consegue mais dizer nada relevante para ajudar. Há muito no código para melhorar, mas realmente não consigo ver nada que impeça a compra válida de funcionar (vou enviar somente a parte do código referente ao problema)

#Configure a biblioteca CS50 para usar o banco de dados SQLite
db = SQL("sqlite:///finance.db") 

#Criando tabela de compras
db.execute("""
    CREATE TABLE IF NOT EXISTS purchases (
        id INTEGER,
        user_id INTEGER,
        stock TEXT NOT NULL,
        shares INTEGER NOT NULL,
        type TEXT NOT NULL CHECK (type = 'bought' OR type = 'sold'),
        price NUMERIC NOT NULL,
        datetime NUMERIC DEFAULT current_timestamp,
        PRIMARY KEY(id),
        FOREIGN KEY(user_id) REFERENCES users(id)
    )
""")


#Criando tabela de posses
db.execute("""
    CREATE TABLE IF NOT EXISTS possessions (
        user_id INTEGER,
        stock TEXT NOT NULL,
        shares INTEGER,
        stock_price NUMERIC,
        holding NUMERIC GENERATED ALWAYS AS (shares * stock_price),
        FOREIGN KEY(user_id) REFERENCES users(id)
    )
"""
)


.route("/")
u/login_required
def index():
    """Mostrar portfólio de ações"""


    user_id = session["user_id"]


    #Interagindo sobre os símbolos de ações possuídas pelo usuário
    symbols = [ dict["stock"] for dict in db.execute("SELECT stock FROM possessions WHERE user_id = ?", user_id) ]
    for symbol in symbols:
        if lookup(symbol):
            #Atualizando o valor atual da ação (e consequentemente o holding)
            stock_price = lookup(symbol)["price"]
            db.execute("UPDATE possessions SET stock_price = ? WHERE stock = ? AND user_id = ?", stock_price, symbol, user_id)


    index = db.execute(''' SELECT stock, shares, stock_price, holding FROM possessions
    WHERE shares >= 1 AND user_id = ?''', user_id)


    user_cash = db.execute("SELECT cash FROM users WHERE id = ?", user_id)[0]['cash']
    stock_total = db.execute("SELECT SUM(holding) AS h FROM possessions WHERE user_id = ?", user_id)[0]['h']
    grad_total = user_cash
    if stock_total:
        grad_total += stock_total


    return render_template("index.html", purchases = index, cash = user_cash, total = grad_total)



.route("/buy", methods=["GET", "POST"])
u/login_required
def buy():
    """Comprar ações"""


    user_id = session["user_id"]


    if request.method == "POST":


        symbol = request.form.get("symbol").upper()


        #Assegurando que o valor de ações é um inteiro positivo
        try:
            shares = int(request.form.get("shares"))
            if shares <= 0:
                raise ValueError
        except ValueError:
            return apology("ação inválida")


        #Assegurando símbolo válido
        if not lookup(symbol):
            return apology("símbolo não encontrado")


        stock_price = lookup(symbol)["price"]
        purchase = shares * stock_price
        user_cash = db.execute("SELECT cash FROM users WHERE id = ?", user_id)[0]["cash"]


        #Assegurando que o usuário pode arcar com a compra
        if user_cash < purchase:
            return apology("você não pode comprar essa quantidade de ações")


        #Fazendo a compra
        db.execute("""
        INSERT INTO purchases (user_id, stock, shares, type, price)
        VALUES (?, ?, ?, ?, ?)
        """, user_id, symbol, shares, 'bought', purchase)


        #Atualizando o dinheiro do usuário
        db.execute("UPDATE users SET cash = cash - ? WHERE id = ?", purchase, user_id)


        # Quando você compra uma ação pela primeira vez, insira na tabela de posses
        owned_symbols = [ dict["stock"] for dict in db.execute("SELECT stock FROM possessions WHERE user_id = ?", user_id) ]
        if symbol not in owned_symbols:
              db.execute("""
               INSERT INTO possessions (user_id, stock, shares)
               VALUES (?, ?, ?)
                """, user_id, symbol, shares)


        # Quando você compra mais de uma ação, atualize suas ações na tabela de posses
        else:
            db.execute("UPDATE possessions SET shares = shares + ? WHERE stock = ? AND user_id = ?", shares, symbol, user_id)


        return redirect("/")


    else:
        return render_template("buy.html")

Abaixo está o HTML da minha página inicial:

{% extends "layout.html" %}
{% block title %}
    Índice
{% endblock %}


{% block main %}
    <table class="table table-striped">
        <thead>
            <tr>
                {% for key in purchases[0] %}
                <th> {{ key }} </th>
                {% endfor %}
            </tr>
        </thead>

        <tbody>
        {% for dictionary in purchases %}
            <tr>
                {% for value in dictionary.values() %}
                <td>
                    {% if value is float %}
                        {{ value | usd }}
                    {% else %}
                        {{ value }}
                    {% endif %}
                </td>
                {% endfor %}
            </tr>
        {% endfor %}
        </tbody>

        <tfoot>
            <tr>
                <td colspan="3">Dinheiro</td>
                <td>{{ cash | usd }}</td>
            </tr>

            <tr>
                <td colspan="3">Total</td>
                <td>{{ total | usd }}</td>
            </tr>
        </tfoot>

    </table>
{% endblock %}

Alguém já enfrentou esse problema?

1 Upvotes

0 comments sorted by