Commit Graph

8477 Commits

Author SHA1 Message Date
Jeremy Daer bf47dfde91 Merge fizzy-saas repository into saas/
Consolidates fizzy-saas back into the main repo as a vendored gem.
Full commit history preserved with files under saas/ prefix.

* saas-import/main: (131 commits)
  Format
  Remove nested if
  Move presentation method to a regular view helper
  Format
  Rename to stripe_session to avoid confusions
  Extract method
  Make active_subscription a private method
  More concise
  Prefer if/else over early return
  Rename param to remove redundant bit
  This is needed for vat id collection
  Enable tax id collection
  Grab and show the next amount to pay from Stripe
  Add system to comp accounts
  Add record to track overridden limits
  Enable automatic taxes and calculate based on mandatory billing address
  Remove redundant condition
  Don't prevent creating drafts, or you won't get to see the upgrade banner
  Give this some padding
  Show different things to non-admins
  ...
2025-12-16 12:02:48 -08:00
Jeremy Daer bf6ddcb933 Add --tailscale flag to bin/dev for remote access (#2168)
Enables sharing dev sites over Tailscale serve. Uses port convention
4xxxx (prepending 4 to the dev port, echoing TLS 443) so multiple apps
can run simultaneously on different ports.

Usage: bin/dev --tailscale
2025-12-16 09:54:53 -08:00
Jeremy Daer 97ffe00672 My life for a trailing comma 2025-12-16 09:54:04 -08:00
Jeremy Daer a68bd2775d Fix Tailscale host match. Rails wraps the regexp in its own anchors and port-match. 2025-12-16 09:35:26 -08:00
Jorge Manrubia 212743fe3f Merge pull request #2165 from basecamp/revert-css
Revert "Mobile app / Scoped stylesheets" (#1698)
2025-12-16 17:35:19 +01:00
Jorge Manrubia 0278fe6ae4 Revert "Mobile app / Scoped stylesheets" (#1698)
This reverts commit 39c1906e67.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 17:20:18 +01:00
Mike Dalessio 2b388dd241 Merge pull request #2164 from basecamp/flavorjones/user-validate-name
Validate User name presence and handle blank names gracefully
2025-12-16 10:49:13 -05:00
Jorge Manrubia 761cc8b6d5 Merge pull request #2050 from basecamp/billing
Add billing system (monthly subscriptions)
2025-12-16 16:47:16 +01:00
Jorge Manrubia ee80b87c8c Add billing system with Stripe
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Jason Zimdars <jz@37signals.com>
2025-12-16 16:44:20 +01:00
Mike Dalessio b75d2ae6d8 Validate User name presence and handle blank names gracefully
Addresses an issue where User#familiar_name assumed `name` was always
present, potentially raising an exception during view rendering. Now
User validates name presence, and User#familiar_name handles blank
strings without error, in case any existing invalid records exist.
2025-12-16 10:44:10 -05:00
Jorge Manrubia 8382111ef2 Merge pull request #23 from basecamp/billing
Add monthly subscriptions
2025-12-16 16:27:41 +01:00
Kevin McConnell 76400765c1 Merge pull request #2159 from basecamp/upgrade-thruster
Update Thruster
2025-12-16 14:41:43 +00:00
Adrien Maston 39c1906e67 Merge pull request #1698 from basecamp/mobile-app/scoped-stylesheets
Mobile app / Scoped stylesheets
2025-12-16 15:34:37 +01:00
Adrien Maston 04332bc526 Merge branch 'main' into mobile-app/scoped-stylesheets
* main:
  Use decimals for ordered lists
  Update cached fragments
  Revert "Merge pull request #1865 from basecamp/public-avatar-caching"
  Show only public cards on public boards
  Swap order of avatar links
  Limit length of full name during signup
  Make layout bulletproof
  Serve own avatar from its own endpoint
2025-12-16 15:30:31 +01:00
Kevin McConnell 14f337739d Update Thruster 2025-12-16 13:28:49 +00:00
Jorge Manrubia 3c197debd2 Format 2025-12-16 12:00:46 +01:00
Jorge Manrubia 5b2fa6b74a Remove nested if 2025-12-16 12:00:23 +01:00
Jorge Manrubia 2671e52821 Move presentation method to a regular view helper 2025-12-16 12:00:23 +01:00
Jorge Manrubia bf045b9907 Format 2025-12-16 12:00:23 +01:00
Jorge Manrubia 8d11c62b7c Rename to stripe_session to avoid confusions 2025-12-16 12:00:23 +01:00
Jorge Manrubia 71369de38d Extract method 2025-12-16 12:00:23 +01:00
Jorge Manrubia b39a9ecab4 Make active_subscription a private method 2025-12-16 12:00:23 +01:00
Jorge Manrubia e47657759f More concise 2025-12-16 12:00:23 +01:00
Jorge Manrubia 20b5e57dd3 Prefer if/else over early return 2025-12-16 12:00:23 +01:00
Jorge Manrubia 973b4e4aed Rename param to remove redundant bit
Co-authored-by: Matt Almeida <matt7@hey.com>
2025-12-16 12:00:23 +01:00
Jorge Manrubia c0050415f5 This is needed for vat id collection 2025-12-16 12:00:23 +01:00
Jorge Manrubia f68aa0d947 Enable tax id collection 2025-12-16 12:00:23 +01:00
Jorge Manrubia 3395b8d6ed Grab and show the next amount to pay from Stripe 2025-12-16 12:00:23 +01:00
Jorge Manrubia 8dd31e3635 Add system to comp accounts 2025-12-16 12:00:23 +01:00
Jorge Manrubia 3ef5e4eeef Add record to track overridden limits
Before, we were relying on just changing the cards_count in account, but this
could create problems where the system to calculate the next card number fails due
to the unique constraint.
2025-12-16 12:00:23 +01:00
Jorge Manrubia 725e850802 Enable automatic taxes and calculate based on mandatory billing address
https://app.fizzy.do/5986089/cards/3465
2025-12-16 12:00:23 +01:00
Jorge Manrubia f4184e5a61 Remove redundant condition 2025-12-16 12:00:23 +01:00
Jorge Manrubia c8330a7be8 Don't prevent creating drafts, or you won't get to see the upgrade banner
Instead:

- Always let you create drafts when pressing "Add card"
- Prevent creations of published cards via API
- Prevent publication of cards in all cases when the limit is exceeded
2025-12-16 12:00:23 +01:00
Jason Zimdars 7a5e29699c Give this some padding 2025-12-16 12:00:23 +01:00
Jason Zimdars b19770c2a8 Show different things to non-admins 2025-12-16 12:00:23 +01:00
Jason Zimdars 6411268d7a More fancy apostrophes 2025-12-16 12:00:23 +01:00
Jason Zimdars b1a8b3c859 Layout 2025-12-16 12:00:23 +01:00
Jason Zimdars 5957ed6449 Typo 2025-12-16 12:00:23 +01:00
Jason Zimdars 9953508541 Fancy apostrophes 2025-12-16 12:00:23 +01:00
Jason Zimdars d556f051a6 Spelling 2025-12-16 12:00:23 +01:00
Jorge Manrubia e53455d2ca Paid plans never exceed limits! 2025-12-16 12:00:23 +01:00
Jorge Manrubia d5018cab23 Fix typo 2025-12-16 12:00:23 +01:00
Jorge Manrubia ca5095cafd Fix typo with unlimitted 2025-12-16 12:00:23 +01:00
Jorge Manrubia 623d80017f Add stripe envs 2025-12-16 12:00:23 +01:00
Jorge Manrubia c34e29454e Document how to work with Stripe locally 2025-12-16 12:00:23 +01:00
Jorge Manrubia fc0dc9423d Kill previous tunnel automatically 2025-12-16 12:00:23 +01:00
Jorge Manrubia 5baf9d879d Dont't fail if not set 2025-12-16 12:00:23 +01:00
Jorge Manrubia 90eb61bb5f Add script to set stripe env vars from 1password 2025-12-16 12:00:23 +01:00
Jorge Manrubia a25bd9adfd Let's use a single sandbox environment via 1password ENV vars 2025-12-16 12:00:23 +01:00
Jorge Manrubia 5be4dca80e Refresh the subscription instead of relying on event payloads
Events can land out of order. See https://github.com/basecamp/fizzy-saas/pull/23#discussion_r2609909558
2025-12-16 12:00:23 +01:00