Billing: fatture manuali, profilo obbligatorio e piani Stripe mensile/annuale.

Rimuove link al portale Stripe in area cliente, aggiunge flusso admin per PDF
fattura e email, blocca checkout senza dati di fatturazione, allinea prezzi
a €4,90/€39,90 e €9,90/€69,90, locale italiano e documentazione deploy.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-02 17:10:12 +02:00
parent 148402a97c
commit a5e781729c
78 changed files with 2457 additions and 424 deletions

9
backend/db/schema.rb generated
View File

@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.2].define(version: 2026_05_29_120000) do
ActiveRecord::Schema[7.2].define(version: 2026_05_31_140000) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
enable_extension "plpgsql"
@@ -58,13 +58,15 @@ ActiveRecord::Schema[7.2].define(version: 2026_05_29_120000) do
t.date "issued_on", null: false
t.integer "amount_cents", null: false
t.string "currency", default: "eur", null: false
t.string "status", default: "issued", null: false
t.string "source", default: "aruba", null: false
t.string "status", default: "draft", null: false
t.string "source", default: "manual", null: false
t.string "aruba_document_id"
t.text "notes"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "emailed_at"
t.index ["billing_payment_id"], name: "index_billing_invoices_on_billing_payment_id"
t.index ["billing_payment_id"], name: "index_billing_invoices_unique_payment", unique: true, where: "(billing_payment_id IS NOT NULL)"
t.index ["club_id", "issued_on"], name: "index_billing_invoices_on_club_id_and_issued_on"
t.index ["club_id", "number"], name: "index_billing_invoices_on_club_id_and_number", unique: true
t.index ["club_id"], name: "index_billing_invoices_on_club_id"
@@ -247,6 +249,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_05_29_120000) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.uuid "club_id", null: false
t.string "billing_interval"
t.index ["club_id"], name: "index_subscriptions_on_club_id", unique: true
t.index ["plan_id"], name: "index_subscriptions_on_plan_id"
t.index ["stripe_subscription_id"], name: "index_subscriptions_on_stripe_subscription_id", unique: true, where: "(stripe_subscription_id IS NOT NULL)"