|
tests / pest (push) Failing after 8m5s
Details
tests / assets (push) Successful in 25s
Details
tests / release (push) Has been skipped
Details
Five places where the product told somebody a figure that nothing behind it produced. **The invoice page showed five invoices nobody was ever issued.** A mock that outlived its purpose: CP-2026-0003 to CP-2026-0007, a prefix belonging to no configured series, all "paid", a spend curve from 179 to 198 € and a next charge of 198 € on 01.08.2026 — behind ['auth','verified','customer.active'], so every signed-in customer saw it. Their real invoices existed in `invoices`, were rendered as PDFs and mailed to them, and appeared nowhere in the portal at all. The page now lists their own documents, newest first, with the numbers, dates and totals off the frozen snapshot, a Storno marked as one, and a download. The PDF route resolves the document against the signed-in customer in the query — a URL anybody can type is not made private by not printing it. No next charge and no chart: nothing here computes what Stripe will take next cycle, and a figure nobody has worked out is worse than a blank space. **The setup fee was quoted everywhere and charged nowhere.** On the price sheet, on the booking page, set by the operator in the console — and CompanyProfile::setupFeeCents() had no reader outside the two sentences that quoted it. It is charged now, as a second non-recurring line on the same checkout session, which Stripe puts on the initial invoice only. `orders.setup_fee_cents` records how much of the charge it was, so the whole total still goes back on a withdrawal while the register holds the PACKAGE's charge against the contract price and the invoice prints the fee as a line of its own. The booking page was also quoting the fee NET under the same sentence the website quotes GROSS — 99,00 against 118,80 — and now quotes what will be taken. **An upgrade click cancelled a booked downgrade and delivered nothing.** Nothing in this application marks a cart order paid, so the customer traded a downgrade they had genuinely booked for a cart line that would never be fulfilled. The booking now stands until the upgrade actually lands on the contract, where ApplyPlanChange clears it. The fulfilment seam is reachable for every type that can be paid — a module and a storage pack book through BookAddon, which was the missing path from a paid order to a SubscriptionAddon and left AddonPrices, SyncStripeAddonItems and clupilot:end-cancelled-addons with no caller behind a payment. A paid traffic pack logs an error rather than pretending: the metered allowance is a standing count of packs while a top-up is sold for one month, and which of the two is meant is not a guess to make here. That no path to `paid` exists yet is now stated in both places rather than in one. **The proof register called correct charges wrong.** expected_gross_cents used the CUSTOMER's rate, which is zero under reverse charge, against the domestic gross Stripe actually took — so matches_catalogue was false for every EU business sale charged exactly the advertised amount, and for every renewal on a contract with a module, which was held against `price_cents` alone. It compares against TaxTreatment::chargedCents() and against the whole term now. Where no money moved, charged and the flag are null instead of the expected figure agreeing with itself, and a plan change records the terms with the pro-rata figures in the snapshot rather than money that arrives again on Stripe's proration invoice. **The seller's own VAT id was on the invoice, unlabelled**, between the register number and the court. Labelled — and the footer's composition moved out of the TCPDF method, because inside one the only way to read what it says is to render a PDF and un-subset its fonts. One test enshrined a figure the code does not produce: a reverse-charge purchase recorded with no charged amount, asserting 17900/0/17900, where OpenSubscription always passes the charged figure and a real one records 21480/0/21480. Another asserted that an upgrade click cancels a booked downgrade. Full suite: 1676 passed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| 0001_01_01_000000_create_users_table.php | ||
| 0001_01_01_000001_create_cache_table.php | ||
| 0001_01_01_000002_create_jobs_table.php | ||
| 2026_07_24_224530_add_two_factor_columns_to_users_table.php | ||
| 2026_07_24_224531_create_passkeys_table.php | ||
| 2026_07_25_062321_add_is_admin_to_users_table.php | ||
| 2026_07_25_070001_create_hosts_table.php | ||
| 2026_07_25_070002_create_provisioning_runs_table.php | ||
| 2026_07_25_070003_create_provisioning_step_events_table.php | ||
| 2026_07_25_070004_create_run_resources_table.php | ||
| 2026_07_25_070005_add_unique_wg_ip_to_hosts_table.php | ||
| 2026_07_25_070006_add_unique_public_ip_to_hosts_table.php | ||
| 2026_07_25_080001_create_customers_table.php | ||
| 2026_07_25_080002_create_orders_table.php | ||
| 2026_07_25_080003_create_instances_table.php | ||
| 2026_07_25_080004_create_dns_records_table.php | ||
| 2026_07_25_080005_create_backups_table.php | ||
| 2026_07_25_080006_create_monitoring_targets_table.php | ||
| 2026_07_25_080007_create_onboarding_tasks_table.php | ||
| 2026_07_25_080008_add_node_to_hosts_table.php | ||
| 2026_07_25_080009_add_guest_ip_to_instances_table.php | ||
| 2026_07_25_080010_add_unique_email_to_customers_table.php | ||
| 2026_07_25_090001_create_datacenters_table.php | ||
| 2026_07_25_090002_add_type_to_orders_table.php | ||
| 2026_07_25_090003_add_user_id_to_customers_table.php | ||
| 2026_07_25_090004_make_customer_identity_unique.php | ||
| 2026_07_25_090005_add_profile_and_branding_to_customers.php | ||
| 2026_07_25_090006_add_cancellation_to_instances.php | ||
| 2026_07_25_090007_create_seats_table.php | ||
| 2026_07_25_090008_add_datacenter_fk_to_hosts.php | ||
| 2026_07_25_133845_create_permission_tables.php | ||
| 2026_07_25_133900_seed_roles_and_permissions.php | ||
| 2026_07_25_140001_create_maintenance_windows.php | ||
| 2026_07_25_140002_add_claimed_at_to_maintenance_notifications.php | ||
| 2026_07_25_200000_create_vpn_peers_table.php | ||
| 2026_07_25_200001_add_vpn_manage_capability.php | ||
| 2026_07_25_210000_add_ownership_to_vpn_peers.php | ||
| 2026_07_25_210001_split_vpn_capabilities.php | ||
| 2026_07_25_220000_create_app_settings_table.php | ||
| 2026_07_25_220001_add_site_manage_capability.php | ||
| 2026_07_25_230000_create_instance_traffic_table.php | ||
| 2026_07_25_230001_add_traffic_addons_to_instances.php | ||
| 2026_07_25_240000_add_dns_name_to_hosts_table.php | ||
| 2026_07_26_000000_add_instance_admin_capability.php | ||
| 2026_07_26_010000_add_vat_verification_to_customers.php | ||
| 2026_07_26_010001_bind_vat_verification_to_value.php | ||
| 2026_07_26_020000_create_subscriptions_table.php | ||
| 2026_07_26_020001_add_tier_to_subscriptions.php | ||
| 2026_07_26_030000_link_subscriptions_to_orders.php | ||
| 2026_07_26_040000_create_plan_catalogue_tables.php | ||
| 2026_07_26_040001_link_subscriptions_to_plan_versions.php | ||
| 2026_07_26_040002_add_plan_version_to_orders.php | ||
| 2026_07_26_050000_add_plans_manage_capability.php | ||
| 2026_07_26_060000_create_subscription_addons_table.php | ||
| 2026_07_26_060001_create_subscription_records_table.php | ||
| 2026_07_26_070000_link_subscriptions_to_stripe.php | ||
| 2026_07_26_070001_one_register_entry_per_billing_event.php | ||
| 2026_07_26_070002_track_last_applied_stripe_event.php | ||
| 2026_07_26_070003_create_stripe_pending_events_table.php | ||
| 2026_07_27_040000_record_when_monitoring_last_answered.php | ||
| 2026_07_27_060000_create_app_secrets_table.php | ||
| 2026_07_27_060100_add_secrets_capability.php | ||
| 2026_07_27_150000_create_instance_metrics_table.php | ||
| 2026_07_27_160000_add_checks_to_instance_metrics.php | ||
| 2026_07_27_180000_create_support_requests_table.php | ||
| 2026_07_28_090000_create_mailboxes_table.php | ||
| 2026_07_28_095000_add_authenticates_to_mailboxes_table.php | ||
| 2026_07_28_100000_seed_mailboxes_from_environment.php | ||
| 2026_07_28_110000_add_mail_manage_permission.php | ||
| 2026_07_29_090000_create_operators_table.php | ||
| 2026_07_29_100000_move_rbac_to_operator_guard.php | ||
| 2026_07_29_110000_add_facility_to_datacenters_table.php | ||
| 2026_07_29_120000_add_admin_password_to_instances_table.php | ||
| 2026_07_29_120000_create_sessions_and_device_tables.php | ||
| 2026_07_29_130000_create_invoice_tables.php | ||
| 2026_07_29_140000_add_export_state_to_invoices.php | ||
| 2026_07_29_150000_create_export_targets.php | ||
| 2026_07_29_170000_add_layout_and_retention_to_export_targets.php | ||
| 2026_07_29_180000_add_grant_provenance_to_subscriptions.php | ||
| 2026_07_29_180001_add_grant_provenance_to_subscription_addons.php | ||
| 2026_07_29_180002_add_grant_plans_capability.php | ||
| 2026_07_29_200000_create_status_history.php | ||
| 2026_07_29_210000_add_recommended_flag_to_plan_families.php | ||
| 2026_07_29_210001_add_marketing_copy_to_plan_families.php | ||
| 2026_07_29_220000_add_domain_verification_to_instances.php | ||
| 2026_07_29_230000_add_address_state_to_instances.php | ||
| 2026_07_29_230000_move_instances_to_their_own_zone.php | ||
| 2026_07_29_240000_add_pending_restart_to_instances.php | ||
| 2026_07_29_250000_add_instance_restart_capability.php | ||
| 2026_07_29_260000_add_applied_quota_to_instances.php | ||
| 2026_07_29_270000_link_invoices_to_the_period_they_bill.php | ||
| 2026_07_29_280000_track_the_stripe_price_a_contract_is_billed_at.php | ||
| 2026_07_29_290000_bill_modules_through_stripe.php | ||
| 2026_07_29_300000_record_whether_a_customer_is_a_consumer.php | ||
| 2026_07_29_300001_add_the_withdrawal_window_to_contracts.php | ||
| 2026_07_30_100000_record_every_mail_that_left_the_system.php | ||
| 2026_07_30_110000_charge_the_price_that_is_advertised.php | ||
| 2026_07_30_200000_read_the_support_mailbox_into_the_console.php | ||
| 2026_07_31_100000_write_the_answers_once_and_reuse_them.php | ||
| 2026_07_31_120000_seed_the_answers_that_are_always_needed.php | ||
| 2026_07_31_140000_record_a_cancellation_on_the_contract_too.php | ||
| 2026_07_31_160000_move_host_api_tokens_onto_the_secrets_key.php | ||
| 2026_07_31_180000_charge_the_setup_fee_that_is_advertised.php | ||