Changeset 3730683
- Timestamp:
- 10/06/2026 11:38:26 AM (3 weeks ago)
- Location:
- gather-grove-booking/trunk
- Files:
-
- 5 edited
-
gather-grove-booking.php (modified) (2 diffs)
-
languages/gather-grove-booking.pot (modified) (5 diffs)
-
readme.txt (modified) (2 diffs)
-
src/Services/ClientService.php (modified) (4 diffs)
-
vendor/composer/installed.php (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
gather-grove-booking/trunk/gather-grove-booking.php
r3730543 r3730683 4 4 * Plugin URI: https://gathergrove.io/docs/booking 5 5 * Description: Class scheduling and booking for studios, wellness centers, and community programs. 6 * Version: 1.240. 06 * Version: 1.240.1 7 7 * Author: Rob Hewitt / Gather Grove 8 8 * Author URI: https://gathergrove.io … … 21 21 defined( 'ABSPATH' ) || exit; 22 22 23 define( 'GATHER_GROVE_VERSION', '1.240. 0' );23 define( 'GATHER_GROVE_VERSION', '1.240.1' ); 24 24 // Bump this whenever any CPT/taxonomy/rewrite registration changes — every 25 25 // install will flush its rule cache on next admin page load. Existing studios -
gather-grove-booking/trunk/languages/gather-grove-booking.pot
r3730543 r3730683 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Gather Grove Booking 1.240. 0\n"5 "Project-Id-Version: Gather Grove Booking 1.240.1\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/gather-grove-booking\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2026-10-06T1 0:36:37+00:00\n"12 "POT-Creation-Date: 2026-10-06T11:36:08+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.12.0\n" … … 4911 4911 #: src/Elementor/Widgets/BookingFormWidget.php:2264 4912 4912 #: src/Services/AddSeats.php:326 4913 #: src/Services/ClientService.php:23 344913 #: src/Services/ClientService.php:2374 4914 4914 msgid "Each guest needs a name." 4915 4915 msgstr "" … … 5063 5063 #: src/Admin/Pages/ClientsPage.php:279 5064 5064 #: src/Admin/Pages/ClientsPage.php:4341 5065 #: src/Services/ClientService.php:3 8655065 #: src/Services/ClientService.php:3905 5066 5066 msgid "Family & Household Accounts is not enabled on this site." 5067 5067 msgstr "" … … 26423 26423 msgstr "" 26424 26424 26425 #: src/Services/ClientService.php:22 1726425 #: src/Services/ClientService.php:2257 26426 26426 msgid "A household member needs a name and a valid payer." 26427 26427 msgstr "" 26428 26428 26429 #: src/Services/ClientService.php:22 2626430 #: src/Services/ClientService.php:24 4226431 #: src/Services/ClientService.php:34 3726429 #: src/Services/ClientService.php:2266 26430 #: src/Services/ClientService.php:2482 26431 #: src/Services/ClientService.php:3477 26432 26432 msgid "The household payer could not be found." 26433 26433 msgstr "" 26434 26434 26435 #: src/Services/ClientService.php:22 3426435 #: src/Services/ClientService.php:2274 26436 26436 msgid "A household member cannot manage their own members." 26437 26437 msgstr "" 26438 26438 26439 #: src/Services/ClientService.php:2 28826439 #: src/Services/ClientService.php:2328 26440 26440 msgid "The household member could not be created. Please try again." 26441 26441 msgstr "" 26442 26442 26443 #: src/Services/ClientService.php:2 38726443 #: src/Services/ClientService.php:2427 26444 26444 msgid "The guest could not be added. Please try again." 26445 26445 msgstr "" 26446 26446 26447 #: src/Services/ClientService.php:24 3326447 #: src/Services/ClientService.php:2473 26448 26448 msgid "A valid payer and the member’s email are required." 26449 26449 msgstr "" 26450 26450 26451 #: src/Services/ClientService.php:24 4926451 #: src/Services/ClientService.php:2489 26452 26452 msgid "A household member cannot manage other members." 26453 26453 msgstr "" 26454 26454 26455 #: src/Services/ClientService.php:24 5926455 #: src/Services/ClientService.php:2499 26456 26456 msgid "No account exists for that email yet. Send them an invitation instead — they can create an account and join your household from the link in the email." 26457 26457 msgstr "" 26458 26458 26459 #: src/Services/ClientService.php:2 46826459 #: src/Services/ClientService.php:2508 26460 26460 msgid "That account could not be linked. Please try again." 26461 26461 msgstr "" 26462 26462 26463 #: src/Services/ClientService.php:2 49626463 #: src/Services/ClientService.php:2536 26464 26464 msgid "You cannot add yourself as a household member." 26465 26465 msgstr "" 26466 26466 26467 #: src/Services/ClientService.php:25 1326468 #: src/Services/ClientService.php:3 48226467 #: src/Services/ClientService.php:2553 26468 #: src/Services/ClientService.php:3522 26469 26469 msgid "That person already belongs to another household." 26470 26470 msgstr "" 26471 26471 26472 #: src/Services/ClientService.php:25 2726472 #: src/Services/ClientService.php:2567 26473 26473 msgid "That person manages their own household and cannot be linked as a member." 26474 26474 msgstr "" 26475 26475 26476 #: src/Services/ClientService.php:2 56626476 #: src/Services/ClientService.php:2606 26477 26477 msgid "Linking the member failed. Please try again." 26478 26478 msgstr "" 26479 26479 26480 #: src/Services/ClientService.php:26 5526480 #: src/Services/ClientService.php:2695 26481 26481 msgid "this person" 26482 26482 msgstr "" 26483 26483 26484 26484 #. translators: 1: household member's name, 2: the studio with its determiner (e.g. "the studio") 26485 #: src/Services/ClientService.php:26 5926485 #: src/Services/ClientService.php:2699 26486 26486 #, php-format 26487 26487 msgid "Add %1$s's birthday so you can book and pay for them. Ask %2$s to add it: %1$s has their own login, so only %2$s can change their details." 26488 26488 msgstr "" 26489 26489 26490 #: src/Services/ClientService.php:27 2726491 #: src/Services/ClientService.php:2 79726492 #: src/Services/ClientService.php:28 1626493 #: src/Services/ClientService.php:29 3426494 #: src/Services/ClientService.php:3 07926495 #: src/Services/ClientService.php:31 4526496 #: src/Services/ClientService.php:32 5926490 #: src/Services/ClientService.php:2767 26491 #: src/Services/ClientService.php:2837 26492 #: src/Services/ClientService.php:2856 26493 #: src/Services/ClientService.php:2974 26494 #: src/Services/ClientService.php:3119 26495 #: src/Services/ClientService.php:3185 26496 #: src/Services/ClientService.php:3299 26497 26497 msgid "That person is not a member of this household." 26498 26498 msgstr "" 26499 26499 26500 #: src/Services/ClientService.php:27 5526500 #: src/Services/ClientService.php:2795 26501 26501 msgid "Removing the member failed. Please try again." 26502 26502 msgstr "" 26503 26503 26504 #: src/Services/ClientService.php:28 2426504 #: src/Services/ClientService.php:2864 26505 26505 msgid "Only a household member with their own login can manage others. Invite them to create an account first." 26506 26506 msgstr "" 26507 26507 26508 #: src/Services/ClientService.php:28 3926508 #: src/Services/ClientService.php:2879 26509 26509 msgid "This person is set up as someone the household books for. Turn that off first if they should manage others instead." 26510 26510 msgstr "" 26511 26511 26512 #: src/Services/ClientService.php:28 5426513 #: src/Services/ClientService.php: 299326514 #: src/Services/ClientService.php:3 09426512 #: src/Services/ClientService.php:2894 26513 #: src/Services/ClientService.php:3033 26514 #: src/Services/ClientService.php:3134 26515 26515 msgid "That change could not be saved. Please try again." 26516 26516 msgstr "" 26517 26517 26518 26518 #. translators: %s: the studio with its determiner (e.g. "the studio"), or its name alone when the studio is a name (e.g. "Alana") 26519 #: src/Services/ClientService.php:29 4526519 #: src/Services/ClientService.php:2985 26520 26520 #, php-format 26521 26521 msgid "Only this person or %s can change who books for them." 26522 26522 msgstr "" 26523 26523 26524 #: src/Services/ClientService.php: 296126524 #: src/Services/ClientService.php:3001 26525 26525 msgid "You need to be part of a household before someone can book for you." 26526 26526 msgstr "" 26527 26527 26528 #: src/Services/ClientService.php: 296926528 #: src/Services/ClientService.php:3009 26529 26529 msgid "This person has no login of their own, so the household already books for them." 26530 26530 msgstr "" 26531 26531 26532 #: src/Services/ClientService.php: 297826532 #: src/Services/ClientService.php:3018 26533 26533 msgid "This person manages others in the household. Remove that first if the household should book for them instead." 26534 26534 msgstr "" 26535 26535 26536 #: src/Services/ClientService.php:31 3726537 #: src/Services/ClientService.php:3 29126536 #: src/Services/ClientService.php:3177 26537 #: src/Services/ClientService.php:3331 26538 26538 msgid "A name is required." 26539 26539 msgstr "" 26540 26540 26541 #: src/Services/ClientService.php:31 5526541 #: src/Services/ClientService.php:3195 26542 26542 msgid "This member has their own account and manages their own name." 26543 26543 msgstr "" 26544 26544 26545 #: src/Services/ClientService.php:3 17226545 #: src/Services/ClientService.php:3212 26546 26546 msgid "Renaming the member failed. Please try again." 26547 26547 msgstr "" 26548 26548 26549 #: src/Services/ClientService.php:3 26926549 #: src/Services/ClientService.php:3309 26550 26550 msgid "This member has their own account and manages their own details." 26551 26551 msgstr "" 26552 26552 26553 #: src/Services/ClientService.php:33 0926553 #: src/Services/ClientService.php:3349 26554 26554 msgid "Please enter the date of birth as YYYY-MM-DD." 26555 26555 msgstr "" 26556 26556 26557 #: src/Services/ClientService.php:33 1826557 #: src/Services/ClientService.php:3358 26558 26558 msgid "That date is in the future — please check it." 26559 26559 msgstr "" 26560 26560 26561 #: src/Services/ClientService.php:33 3726561 #: src/Services/ClientService.php:3377 26562 26562 msgid "No details were supplied to change." 26563 26563 msgstr "" 26564 26564 26565 #: src/Services/ClientService.php:33 5526565 #: src/Services/ClientService.php:3395 26566 26566 msgid "Saving those details failed. Please try again." 26567 26567 msgstr "" 26568 26568 26569 #: src/Services/ClientService.php:34 2826569 #: src/Services/ClientService.php:3468 26570 26570 msgid "A valid payer and the adult’s email are required." 26571 26571 msgstr "" 26572 26572 26573 #: src/Services/ClientService.php:34 4526573 #: src/Services/ClientService.php:3485 26574 26574 msgid "A household member cannot invite other members." 26575 26575 msgstr "" 26576 26576 26577 #: src/Services/ClientService.php:34 5326578 #: src/Services/ClientService.php:3 46726577 #: src/Services/ClientService.php:3493 26578 #: src/Services/ClientService.php:3507 26579 26579 msgid "You cannot invite yourself to your own household." 26580 26580 msgstr "" 26581 26581 26582 #: src/Services/ClientService.php:3 47526582 #: src/Services/ClientService.php:3515 26583 26583 msgid "That person is already a member of your household." 26584 26584 msgstr "" 26585 26585 26586 #: src/Services/ClientService.php:3 49426586 #: src/Services/ClientService.php:3534 26587 26587 msgid "That person manages their own household and cannot be invited as a member." 26588 26588 msgstr "" 26589 26589 26590 #: src/Services/ClientService.php:35 3426590 #: src/Services/ClientService.php:3574 26591 26591 msgid "The invitation could not be created. Please try again." 26592 26592 msgstr "" 26593 26593 26594 #: src/Services/ClientService.php:37 1326595 #: src/Services/ClientService.php:37 4426594 #: src/Services/ClientService.php:3753 26595 #: src/Services/ClientService.php:3784 26596 26596 msgid "That invitation could not be found." 26597 26597 msgstr "" 26598 26598 26599 #: src/Services/ClientService.php:37 2026599 #: src/Services/ClientService.php:3760 26600 26600 msgid "That invitation can no longer be cancelled." 26601 26601 msgstr "" 26602 26602 26603 #: src/Services/ClientService.php:37 5126603 #: src/Services/ClientService.php:3791 26604 26604 msgid "That invitation is no longer active. Send a new one instead." 26605 26605 msgstr "" -
gather-grove-booking/trunk/readme.txt
r3730543 r3730683 5 5 Tested up to: 7.1 6 6 Requires PHP: 8.2 7 Stable tag: 1.240. 07 Stable tag: 1.240.1 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 147 147 == Changelog == 148 148 149 = 1.240.1 = 150 * Security: when a co-parent signed a child up for a membership, their card was saved on the paying parent's account, where the paying parent could use it. A co-parent now pays for a membership they start from their own account, with their own card, and gets its invoices, receipts and reminders. Studios using co-parents should run `wp gather-grove billing cards --list`, then `--tag --yes`. 151 * Fix: the person who pays for a household member's membership can now cancel it from their account page (they got "Membership not found"). 152 * New (developers): `wp gather-grove billing cards` lists memberships a co-parent started before 1.240.1 and tags the co-parent's card as theirs. 153 149 154 = 1.240.0 = 150 155 * New: Settings, Payments, "Bill children with their own login to the household payer", on by default. When a parent starts a membership for a child in their household, it is billed to the parent's account and the invoices come to the parent, whether or not the child has a login. A child who signs up themselves still pays for it. Memberships already running don't move. -
gather-grove-booking/trunk/src/Services/ClientService.php
r3730543 r3730683 1490 1490 * charge lands on an account whose owner is not there to agree to it. 1491 1491 * Buying for someone else in your household, the resolver decides. 1492 * 1493 * 🔑 **A co-parent pays for what they start (1.240.1, Booking rule 192).** 1494 * When the resolver names the household payer but the buyer is a 1495 * household MANAGER acting for a member they manage, the manager pays, 1496 * from their own Stripe customer. Before 1.240.1 the manager's card went 1497 * onto the household payer's customer, untagged, as that customer's 1498 * default — one person's card on another person's customer, which rule 1499 * 192 forbids, and a charge on the account of someone who was not there 1500 * to agree to it (spec §4.1). The membership still belongs to the 1501 * member (rule 41); only who pays changes. 1492 1502 */ 1493 1503 public static function checkout_membership_payer( int $buyer_client_id, int $subject_client_id ): int { … … 1496 1506 } 1497 1507 1498 return self::membership_payer_client_id( $subject_client_id ); 1508 $resolved = self::membership_payer_client_id( $subject_client_id ); 1509 1510 if ( $resolved > 0 1511 && $resolved !== $buyer_client_id 1512 && $resolved !== $subject_client_id 1513 && self::is_coparent_of( $buyer_client_id, $subject_client_id ) 1514 ) { 1515 return $buyer_client_id; 1516 } 1517 1518 return $resolved; 1519 } 1520 1521 /** 1522 * Is `$manager_client_id` a co-parent of `$member_client_id` — a 1523 * designated household manager (Co-Parent Flow, 1.121.0) of the member's 1524 * household who may act for them (`can_manage()`)? Never true of the 1525 * household payer or of the member themselves. 1526 */ 1527 public static function is_coparent_of( int $manager_client_id, int $member_client_id ): bool { 1528 if ( $manager_client_id <= 0 || $member_client_id <= 0 || $manager_client_id === $member_client_id ) { 1529 return false; 1530 } 1531 1532 return self::is_household_manager( $manager_client_id ) 1533 && self::can_manage( $manager_client_id, $member_client_id ); 1499 1534 } 1500 1535 1501 1536 /** 1502 1537 * May `$payer_client_id` be recorded as the payer of a membership held by 1503 * `$member_client_id`? Only the member themselves or their household 1504 * payer (spec §4.1) — the guard `purchase_membership()` applies to an 1505 * explicit payer, so no caller can bill a third person's customer. 1538 * `$member_client_id`? The member themselves, their household payer 1539 * (spec §4.1), or — from 1.240.1 — a co-parent who manages them and is 1540 * paying for it from their own account (`is_coparent_of()`). The guard 1541 * `purchase_membership()` applies to an explicit payer, so no caller can 1542 * bill a third person's customer. 1506 1543 */ 1507 1544 public static function may_pay_for_membership( int $payer_client_id, int $member_client_id ): bool { … … 1511 1548 1512 1549 return $payer_client_id === $member_client_id 1513 || $payer_client_id === self::household_payer_client_id( $member_client_id ); 1550 || $payer_client_id === self::household_payer_client_id( $member_client_id ) 1551 || self::is_coparent_of( $payer_client_id, $member_client_id ); 1514 1552 } 1515 1553 … … 1544 1582 * passes, and the member, who is not charged, does not. 1545 1583 * 1546 * A household manager is never the payer, so is never let through 1547 * (Co-Parent Flow, Rob 2026-08-16). 1584 * A household manager is not the payer of the household's memberships 1585 * (Co-Parent Flow, Rob 2026-08-16), so is not let through — except for a 1586 * membership they started and pay for from their own account (1.240.1, 1587 * rule 192), whose row records them as its payer. 1548 1588 */ 1549 1589 public static function pays_for_membership( int $actor_client_id, object $cp ): bool { -
gather-grove-booking/trunk/vendor/composer/installed.php
r3730543 r3730683 3 3 array ( 4 4 'name' => 'golden-turtle-sound/gather-grove', 5 'pretty_version' => 'v1.240. 0',6 'version' => '1.240. 0.0',7 'reference' => ' 70f10cabbfdece5f21604bb63bf5e60f113189d8',5 'pretty_version' => 'v1.240.1', 6 'version' => '1.240.1.0', 7 'reference' => 'a60014b09efeafaf47fd6dc9b8c595ccd0d20272', 8 8 'type' => 'wordpress-plugin', 9 'install_path' => '/private/var/folders/_z/v6yvnpmx5mz91tk62d72jhyc0000gn/T/tmp. wmxOCeBOzO/gather-grove-booking/vendor/composer/../../',9 'install_path' => '/private/var/folders/_z/v6yvnpmx5mz91tk62d72jhyc0000gn/T/tmp.H6aDmoqzf7/gather-grove-booking/vendor/composer/../../', 10 10 'aliases' => 11 11 array ( … … 17 17 'golden-turtle-sound/gather-grove' => 18 18 array ( 19 'pretty_version' => 'v1.240. 0',20 'version' => '1.240. 0.0',21 'reference' => ' 70f10cabbfdece5f21604bb63bf5e60f113189d8',19 'pretty_version' => 'v1.240.1', 20 'version' => '1.240.1.0', 21 'reference' => 'a60014b09efeafaf47fd6dc9b8c595ccd0d20272', 22 22 'type' => 'wordpress-plugin', 23 'install_path' => '/private/var/folders/_z/v6yvnpmx5mz91tk62d72jhyc0000gn/T/tmp. wmxOCeBOzO/gather-grove-booking/vendor/composer/../../',23 'install_path' => '/private/var/folders/_z/v6yvnpmx5mz91tk62d72jhyc0000gn/T/tmp.H6aDmoqzf7/gather-grove-booking/vendor/composer/../../', 24 24 'aliases' => 25 25 array ( … … 33 33 'reference' => 'fe99159b9ee0a74be3c12c0305e5338e0b9905c3', 34 34 'type' => 'library', 35 'install_path' => '/private/var/folders/_z/v6yvnpmx5mz91tk62d72jhyc0000gn/T/tmp. wmxOCeBOzO/gather-grove-booking/vendor/composer/../stripe/stripe-php',35 'install_path' => '/private/var/folders/_z/v6yvnpmx5mz91tk62d72jhyc0000gn/T/tmp.H6aDmoqzf7/gather-grove-booking/vendor/composer/../stripe/stripe-php', 36 36 'aliases' => 37 37 array (
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)