diff --git a/src/backend/app/db.py b/src/backend/app/db.py index d6812e8..e58fc4c 100644 --- a/src/backend/app/db.py +++ b/src/backend/app/db.py @@ -130,7 +130,7 @@ def row_to_my_order(row: sqlite3.Row) -> dict: except json.JSONDecodeError: submission_choices = {} - return { + result = { "id": row["id"], "title": row["title"], "description": row["description"], @@ -145,3 +145,8 @@ def row_to_my_order(row: sqlite3.Row) -> dict: "paid": bool(row["paid"]) if row["paid"] is not None else False, }, } + + if "has_unpaid_submissions" in row.keys() and row["has_unpaid_submissions"] is not None: + result["has_unpaid_submissions"] = bool(row["has_unpaid_submissions"]) + + return result diff --git a/src/backend/app/main.py b/src/backend/app/main.py index 3f2ae06..20abcc0 100644 --- a/src/backend/app/main.py +++ b/src/backend/app/main.py @@ -674,7 +674,12 @@ def get_my_orders( uot.submission_token, s.choices_json, s.accepted, - s.paid + s.paid, + CASE + WHEN uot.admin_token IS NOT NULL THEN + (SELECT COUNT(*) FROM submissions s2 WHERE s2.group_order_id = go.id AND s2.accepted = 1 AND (s2.paid IS NULL OR s2.paid = 0)) + ELSE 0 + END AS has_unpaid_submissions FROM user_order_tokens uot JOIN group_orders go ON go.id = uot.group_order_id LEFT JOIN submissions s ON s.submission_token = uot.submission_token diff --git a/src/frontend/src/components/views/HomeOrdersTable.tsx b/src/frontend/src/components/views/HomeOrdersTable.tsx index 655bba7..bf643b9 100644 --- a/src/frontend/src/components/views/HomeOrdersTable.tsx +++ b/src/frontend/src/components/views/HomeOrdersTable.tsx @@ -104,6 +104,9 @@ export default function HomeOrdersTable({ {item.title || item.id} {item.is_owner ? Owner : null} + {item.is_owner && item.has_unpaid_submissions ? ( + Open payments + ) : null} {state === "paid" ? Paid : null} {state === "unpaid" ? ( Unpaid diff --git a/src/frontend/src/lib/types.ts b/src/frontend/src/lib/types.ts index 23b5a41..2f9ef3b 100644 --- a/src/frontend/src/lib/types.ts +++ b/src/frontend/src/lib/types.ts @@ -73,6 +73,7 @@ export type Order = OrderBase & { is_owner: boolean; is_participant: boolean; }; + has_unpaid_submissions?: boolean; }; export type OrderAdminView = OrderBase & {