| @@ -28,9 +28,9 @@ | ||
| 28 | 28 | $error->add( 'missing_field', sprintf( __( '%s is required', 'booktics' ), $field ) ); |
| 29 | 29 | } |
| 30 | 30 | } |
| 31 | 31 | |
| 32 | - if ( empty( $data['customer_id'] ) && empty( $data['customer_email'] ) ) { | |
| 32 | + if ( empty( $data['customer_id'] ) && empty( $data['customer']['email'] ) ) { | |
| 33 | 33 | $error->add( 'missing_field', __( 'Customer email is required', 'booktics' ) ); |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | 36 | if ( empty( $data['items'] ) || ! is_array( $data['items'] ) ) { |
| @@ -63,11 +63,17 @@ | ||
| 63 | 63 | if ( ! $service ) { |
| 64 | 64 | $error->add( 'invalid_service', __( 'Invalid service selected', 'booktics' ) ); |
| 65 | 65 | } |
| 66 | 66 | |
| 67 | - $team_member = ( new Team_Member_Model() )->find( $item['team_member_id'] ); | |
| 68 | - if ( ! $team_member ) { | |
| 69 | - $error->add( 'invalid_team_member', __( 'Invalid team member selected', 'booktics' ) ); | |
| 67 | + // An item may legitimately arrive without a team member when the | |
| 68 | + // service assigns one server-side. The item validation rules decide | |
| 69 | + // whether that is allowed; this check only verifies a member that was | |
| 70 | + // actually supplied. | |
| 71 | + if ( ! empty( $item['team_member_id'] ) ) { | |
| 72 | + $team_member = ( new Team_Member_Model() )->find( $item['team_member_id'] ); | |
| 73 | + if ( ! $team_member ) { | |
| 74 | + $error->add( 'invalid_team_member', __( 'Invalid team member selected', 'booktics' ) ); | |
| 75 | + } | |
| 70 | 76 | } |
| 71 | 77 | $error = apply_filters( 'booktics_extra_service_validate', $error, $item ); |
| 72 | 78 | |
| 73 | 79 | return $error->has_errors() ? $error : true; |
| @@ -86,8 +92,9 @@ | ||
| 86 | 92 | $args = array( |
| 87 | 93 | 'post_type' => 'booktics-appointment', |
| 88 | 94 | 'post_status' => 'any', |
| 89 | 95 | 'posts_per_page' => 1, |
| 96 | + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Meta query is necessary for filtering appointments by meta fields | |
| 90 | 97 | 'meta_query' => array( |
| 91 | 98 | 'relation' => 'AND', |
| 92 | 99 | array( |
| 93 | 100 | 'key' => 'date', |
| @@ -138,9 +145,9 @@ | ||
| 138 | 145 | if ( $query->have_posts() ) { |
| 139 | 146 | $error->add( |
| 140 | 147 | 'time_slot_unavailable', |
| 141 | 148 | sprintf( |
| 142 | - /* translators: 1: Start time, 2: End time, 3: Date */ | |
| 149 | + /* translators: 1: Start time, 2: End time, 3: Date */ | |
| 143 | 150 | __( 'Time slot %1$s - %2$s on %3$s is not available', 'booktics' ), |
| 144 | 151 | $item['start_time'], |
| 145 | 152 | $item['end_time'], |
| 146 | 153 | $item['date'] |