Commit 307c66a
fix: show Billing & invoices button for past-due subscriptions (#15266)
## Summary
Restore **Billing & invoices** for subscription managers regardless of
subscription state. The reported regression is an existing past-due
subscription represented by `is_active=false`,
`billing_status=payment_failed`, and a plan slug; `payment_failed` alone
can also describe a non-subscription payment failure.
## Changes
- Gate **Billing & invoices** on subscription-management permission
rather than active-subscription access.
- Treat `payment_failed` or `paused` as a delinquent subscription only
when the server also provides a plan slug.
- Keep **Manage plan** and **Cancel plan** available for delinquent
subscriptions while **Change plan** remains hidden.
- Fall back to **Subscribe** and withhold **Cancel plan** when a failed
payment has no subscription plan.
- Updated subscription panel, workspace menu, and user popover unit
coverage (78 tests passing); added the `keeps billing management
available for a past-due subscription` Playwright regression test.
## Review Focus
The API returns `is_active=false` for the reported past-due
subscription, so the former `canAccessSubscriptionFeatures` gate removed
every recovery action. The fix keeps the server response authoritative:
invoice access is permission-based across billing states, while
subscription-specific recovery requires the server-provided delinquent
status and plan identity.
Related: [Slack
report](https://comfy-organization.slack.com/archives/C097YV5BT41/p1786744822687599?thread_ts=1786730571.344519&cid=C097YV5BT41),
FE-1530, FE-1452, FE-1435, BE-6784.
## Screenshots
### AS IS → TO BE (past-due subscription)

### All billing variants
`Billing & invoices` was verified visible in all ten owner variants:
active paid, payment failed, paused, ended, canceled-active, free,
never-subscribed, legacy paid, legacy free, and legacy never-subscribed.

### Regression check
| Variant | `origin/main` | PR | Result |
| --- | --- | --- | --- |
| Active paid | Visible | Visible | Unchanged |
| Past due (`payment_failed` + plan slug) | Hidden | Visible | Fixed;
Change plan remains hidden; Cancel plan available |
| Paused subscription (`paused` + plan slug) | Hidden | Visible | Fixed;
Change plan remains hidden; Cancel plan available |
| Failed payment without a plan | Hidden | Visible | Invoice access
restored; Subscribe shown; Cancel plan hidden |
| Ended | Visible | Visible | Unchanged; Subscribe remains available |
| Canceled, still active | Visible | Visible | Unchanged |
| Free | Visible | Visible | Unchanged; Subscribe remains available |
| Never subscribed | Visible | Visible | Unchanged; Subscribe remains
available |
| Legacy paid | Visible | Visible | Unchanged |
| Legacy free | Visible | Visible | Unchanged; Subscribe remains
available |
| Legacy never subscribed | Visible | Visible | Unchanged; Subscribe
remains available |
No new clipping, overlap, or CTA regressions were found. Every invoice
button remained within the Settings dialog bounds. The sparse delinquent
card and the ended-state Free/$100 presentation are also present on
`origin/main`; they are pre-existing and unchanged by this PR.
---------
Co-authored-by: Amp <amp@ampcode.com>1 parent 3860f64 commit 307c66a
7 files changed
Lines changed: 161 additions & 23 deletions
File tree
- browser_tests/tests/dialogs
- src/platform/workspace
- components
- composables
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
88 | 95 | | |
89 | 96 | | |
90 | 97 | | |
| |||
276 | 283 | | |
277 | 284 | | |
278 | 285 | | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
279 | 305 | | |
280 | 306 | | |
281 | 307 | | |
| |||
Lines changed: 44 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| 19 | + | |
18 | 20 | | |
19 | 21 | | |
20 | 22 | | |
| |||
53 | 55 | | |
54 | 56 | | |
55 | 57 | | |
| 58 | + | |
56 | 59 | | |
57 | 60 | | |
58 | 61 | | |
59 | 62 | | |
60 | 63 | | |
61 | | - | |
| 64 | + | |
| 65 | + | |
62 | 66 | | |
63 | 67 | | |
64 | 68 | | |
| |||
157 | 161 | | |
158 | 162 | | |
159 | 163 | | |
| 164 | + | |
160 | 165 | | |
161 | 166 | | |
162 | 167 | | |
| 168 | + | |
163 | 169 | | |
164 | 170 | | |
165 | 171 | | |
| |||
249 | 255 | | |
250 | 256 | | |
251 | 257 | | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
252 | 290 | | |
253 | 291 | | |
254 | 292 | | |
| |||
335 | 373 | | |
336 | 374 | | |
337 | 375 | | |
338 | | - | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
339 | 379 | | |
340 | 380 | | |
341 | | - | |
| 381 | + | |
| 382 | + | |
342 | 383 | | |
343 | 384 | | |
344 | 385 | | |
| |||
Lines changed: 12 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
146 | | - | |
| 146 | + | |
147 | 147 | | |
| 148 | + | |
148 | 149 | | |
149 | 150 | | |
150 | 151 | | |
| |||
153 | 154 | | |
154 | 155 | | |
155 | 156 | | |
156 | | - | |
| 157 | + | |
157 | 158 | | |
158 | 159 | | |
159 | 160 | | |
| |||
271 | 272 | | |
272 | 273 | | |
273 | 274 | | |
| 275 | + | |
274 | 276 | | |
275 | 277 | | |
276 | 278 | | |
| |||
304 | 306 | | |
305 | 307 | | |
306 | 308 | | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
307 | 315 | | |
308 | 316 | | |
309 | 317 | | |
310 | | - | |
| 318 | + | |
311 | 319 | | |
312 | 320 | | |
313 | 321 | | |
314 | 322 | | |
315 | 323 | | |
| 324 | + | |
316 | 325 | | |
317 | 326 | | |
318 | 327 | | |
| |||
Lines changed: 10 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
584 | 584 | | |
585 | 585 | | |
586 | 586 | | |
587 | | - | |
| 587 | + | |
588 | 588 | | |
589 | 589 | | |
590 | 590 | | |
| |||
598 | 598 | | |
599 | 599 | | |
600 | 600 | | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
601 | 607 | | |
602 | 608 | | |
603 | 609 | | |
| |||
866 | 872 | | |
867 | 873 | | |
868 | 874 | | |
869 | | - | |
| 875 | + | |
870 | 876 | | |
871 | 877 | | |
872 | 878 | | |
| |||
881 | 887 | | |
882 | 888 | | |
883 | 889 | | |
884 | | - | |
885 | | - | |
| 890 | + | |
| 891 | + | |
886 | 892 | | |
887 | 893 | | |
888 | 894 | | |
| |||
Lines changed: 6 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
177 | 177 | | |
178 | 178 | | |
179 | 179 | | |
180 | | - | |
181 | | - | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
| 180 | + | |
188 | 181 | | |
189 | 182 | | |
190 | 183 | | |
| |||
242 | 235 | | |
243 | 236 | | |
244 | 237 | | |
245 | | - | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
246 | 242 | | |
247 | 243 | | |
248 | 244 | | |
| |||
279 | 275 | | |
280 | 276 | | |
281 | 277 | | |
| 278 | + | |
282 | 279 | | |
283 | 280 | | |
284 | 281 | | |
| |||
452 | 449 | | |
453 | 450 | | |
454 | 451 | | |
455 | | - | |
456 | 452 | | |
457 | 453 | | |
458 | 454 | | |
| |||
Lines changed: 58 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| 15 | + | |
14 | 16 | | |
15 | 17 | | |
16 | 18 | | |
| |||
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
| 32 | + | |
30 | 33 | | |
31 | | - | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
32 | 38 | | |
33 | 39 | | |
34 | 40 | | |
| |||
66 | 72 | | |
67 | 73 | | |
68 | 74 | | |
| 75 | + | |
69 | 76 | | |
70 | 77 | | |
71 | 78 | | |
72 | 79 | | |
73 | 80 | | |
74 | 81 | | |
75 | 82 | | |
| 83 | + | |
76 | 84 | | |
77 | 85 | | |
78 | 86 | | |
| |||
113 | 121 | | |
114 | 122 | | |
115 | 123 | | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
116 | 173 | | |
117 | 174 | | |
118 | 175 | | |
| |||
Lines changed: 5 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
69 | 72 | | |
70 | 73 | | |
71 | 74 | | |
| |||
0 commit comments