Home / Admin / CPT_KEYSMST_Weekly Summary Child to MST CASE
Duplicate Snippet

Embed Snippet on Your Site

CPT_KEYSMST_Weekly Summary Child to MST CASE

ismail daugherty PRO
<10
Code Preview
php
<?php
/**
 * Plugin Name: MST Weekly Summary CPT - Blueprint v4.2 Compliant
 * Description: Weekly summary CPT for MST cases - hierarchical child of mst_case, optimized for Gravity Suite integration
 * Version: 2.1.0 - Blueprint v4.2 Aligned (CREATES NEW POST EACH WEEK)
 * Requires: MST Case Management - Gravity Suite Integration
 * Author: MST Development Team
 * 
 * CRITICAL ARCHITECTURE NOTES:
 * - Post Type Key: weekly_case_summary (NOT mst_weekly_summary)
 * - Hierarchical: Yes (post_parent = mst_case post ID)
 * - Public: No (HIPAA), but publicly_queryable for GravityView
 * - Form 302 CREATES NEW POST each week via CPT Feed (NOT update!)
 * - No Contact Log CPT integration (uses Form 301 entries)
 * 
 * WEEKLY WORKFLOW:
 * 1. Mon-Thu: Therapist submits Form 301 contact logs (stored as GF entries)
 * 2. Friday 3PM: Gravity Flow aggregates Form 301 → Updates ACF staging fields on mst_case
 * 3. Friday PM: Therapist submits Form 302 → CPT Feed CREATES NEW weekly_case_summary post
 * 4. Result: Separate post for each week (Week 1 = Post A, Week 2 = Post B, etc.)
 */
if (!defined('ABSPATH')) {
    exit;
}
// Register MST Weekly Summary CPT
add_action('init', 'mst_register_weekly_summary_post_type', 6);
function mst_register_weekly_summary_post_type() {
    $labels = [
        'name'               => _x('Weekly Summaries', 'Post type general name', 'mst-weekly'),
        'singular_name'      => _x('Weekly Summary', 'Post type singular name', 'mst-weekly'),
        'menu_name'          => _x('Weekly Summaries', 'Admin Menu text', 'mst-weekly'),
        'name_admin_bar'     => _x('Weekly Summary', 'Add New on Toolbar', 'mst-weekly'),
        'add_new'            => __('Add New Summary', 'mst-weekly'),
        'add_new_item'       => __('Add New Weekly Summary', 'mst-weekly'),
        'new_item'           => __('New Summary', 'mst-weekly'),
        'edit_item'          => __('Edit Weekly Summary', 'mst-weekly'),
        'view_item'          => __('View Summary', 'mst-weekly'),
        'all_items'          => __('All Summaries', 'mst-weekly'),
        'search_items'       => __('Search Summaries', 'mst-weekly'),
        'parent_item_colon'  => __('Parent Case:', 'mst-weekly'),
        'not_found'          => __('No summaries found.', 'mst-weekly'),
        'not_found_in_trash' => __('No summaries found in Trash.', 'mst-weekly'),
        'archives'           => _x('Summary Archives', 'Archive label', 'mst-weekly'),
    ];
    
    $args = [
        'labels'             => $labels,
        'description'        => __('MST Weekly Case Summaries - hierarchical children of mst_case posts', 'mst-weekly'),
        
        // CRITICAL: HIPAA Compliance + GravityView Compatibility
        'public'             => false,            // NOT publicly visible (HIPAA)
        'publicly_queryable' => true,            // But GravityView can query
        'show_ui'            => true,            // Show in admin
        'show_in_menu'       => true,            // Admin menu
        'show_in_admin_bar'  => true,            // Quick add
        'show_in_nav_menus'  => false,           // No nav menus
        'exclude_from_search'=> true,            // Exclude from WP search
        
        // URL Structure
        'has_archive'        => false,            // No archive page
        'rewrite'            => [
            'slug'       => 'weekly-summary',
            'with_front' => false,
            'feeds'      => false,
            'pages'      => false,
        ],
        'query_var'          => 'weekly_summary',
        
        // Capabilities - standard for integration
        'capability_type'    => 'post',
        'map_meta_cap'       => true,
        
        // CRITICAL: Hierarchical = true for parent-child relationships
        'hierarchical'       => true,              // Can have post_parent
        'menu_position'      => 21,                // After MST Cases (20)
        'menu_icon'          => 'dashicons-calendar-alt',
        
        'supports'           => [
            'title',           // Format: "Week {Number} - {Youth Name} - {Date}"
            'author',          // Therapist who submitted
            'custom-fields',   // For meta + ACF fields
            'revisions',       // Track changes (supervision)
            'comments',        // For supervisor feedback
            'page-attributes', // CRITICAL: Enables post_parent dropdown
        ],
        
        // REST API for Uncanny Automator + Gravity Connect
        'show_in_rest'       => true,
        'rest_base'          => 'weekly-summaries',
        'rest_namespace'     => 'mst/v1',
        
        // Gravity Suite integration
        'can_export'         => true,
        'delete_with_user'   => false,
        '_builtin'           => false,
        '_edit_link'         => 'post.php?post=%d',
    ];
    
    register_post_type('weekly_case_summary', $args); // CORRECT KEY per blueprint
}
// Register meta fields for weekly summaries (Blueprint v4.2 complete specification)
add_action('init', 'mst_register_weekly_summary_meta_fields', 10);
function mst_register_weekly_summary_meta_fields() {
    
    // ============================================
    // PARENT CASE RELATIONSHIP - CRITICAL
    // ============================================
    
    // Note: post_parent is handled by WordPress core via 'page-attributes' support
    // But we also store it as meta for easier Gravity Forms/GPPA queries
    
    register_post_meta('weekly_case_summary', 'parent_case_id', [
        'type'              => 'integer',
        'description'       => 'Parent MST Case ID (same as post_parent, for query convenience)',
        'single'            => true,
        'show_in_rest'      => true,
        'sanitize_callback' => 'absint',
        'auth_callback'     => '__return_true',
    ]);
    
    // MSTI number for quick reference and filtering
    register_post_meta('weekly_case_summary', 'msti_number', [
        'type'              => 'string',
        'description'       => 'MSTI case number (inherited from parent)',
        'single'            => true,
        'show_in_rest'      => true,
        'sanitize_callback' => 'sanitize_text_field',
        'auth_callback'     => '__return_true',
    ]);
    
    // ============================================
    // TREATMENT WEEK TRACKING
    // ============================================
    
    register_post_meta('weekly_case_summary', 'treatment_week', [
        'type'              => 'integer',
        'description'       => 'Week number in treatment (1-52+)',
        'single'            => true,
        'show_in_rest'      => true,
        'sanitize_callback' => 'absint',
        'auth_callback'     => '__return_true',
    ]);
    
    register_post_meta('weekly_case_summary', 'week_start_date', [
        'type'              => 'string',
        'description'       => 'Week start date (Y-m-d format)',
        'single'            => true,
        'show_in_rest'      => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'week_end_date', [
        'type'              => 'string',
        'description'       => 'Week end date (Y-m-d format)',
        'single'            => true,
        'show_in_rest'      => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    // ============================================
    // FORM 302 SECTION I: OVERARCHING GOALS
    // ============================================
    
    register_post_meta('weekly_case_summary', 'overarching_goals_reference', [
        'type'          => 'string',
        'description'   => 'Reference to overarching goals (from Form 240 Field 132)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    // ============================================
    // SECTION II: MST CONCEPTUALIZATION OF FIT
    // ============================================
    
    register_post_meta('weekly_case_summary', 'fit_assessment_summary', [
        'type'          => 'string',
        'description'   => 'Current fit factors and drivers',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'clinical_hypothesis_update', [
        'type'          => 'string',
        'description'   => 'Updated clinical hypothesis',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'hypothesis_testing_results', [
        'type'          => 'string',
        'description'   => 'Results of hypothesis testing this week',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'prioritized_drivers', [
        'type'          => 'string',
        'description'   => 'Prioritized drivers being targeted',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    // ============================================
    // SECTION III: INTERMEDIARY GOALS
    // ============================================
    
    register_post_meta('weekly_case_summary', 'previous_goals_summary', [
        'type'          => 'string',
        'description'   => 'Previous week intermediary goals',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'previous_goals_status', [
        'type'          => 'string',
        'description'   => 'Previous goals status (Met/Partially/Not)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'goal_achievement_percentage', [
        'type'          => 'integer',
        'description'   => 'Overall goal achievement this week (0-100)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'absint',
    ]);
    
    // ============================================
    // SECTION IV: ADVANCES & BARRIERS
    // ============================================
    
    register_post_meta('weekly_case_summary', 'advances_in_treatment', [
        'type'          => 'string',
        'description'   => 'Progress and advances made this week',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'barriers_to_goals', [
        'type'          => 'string',
        'description'   => 'Barriers encountered this week',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'family_engagement_level', [
        'type'          => 'integer',
        'description'   => 'Overall family engagement level (1-5)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'absint',
    ]);
    
    register_post_meta('weekly_case_summary', 'youth_engagement_level', [
        'type'          => 'integer',
        'description'   => 'Youth engagement level (1-5)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'absint',
    ]);
    
    // ============================================
    // SECTION V: WEEKLY OUTCOMES (MST FIDELITY)
    // ============================================
    
    register_post_meta('weekly_case_summary', 'tam_score', [
        'type'          => 'number',
        'description'   => 'Therapist Adherence Measure score (1-5)',
        'single'        => true,
        'show_in_rest'  => true,
    ]);
    
    register_post_meta('weekly_case_summary', 'sam_score', [
        'type'          => 'number',
        'description'   => 'Supervisor Adherence Measure score (1-5)',
        'single'        => true,
        'show_in_rest'  => true,
    ]);
    
    register_post_meta('weekly_case_summary', 'mst_principles_applied', [
        'type'          => 'string',
        'description'   => 'MST principles applied this week (serialized)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'behavioral_outcomes', [
        'type'          => 'string',
        'description'   => 'Measurable behavioral outcomes',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'progress_toward_discharge', [
        'type'          => 'string',
        'description'   => 'Progress toward discharge criteria',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    // ============================================
    // SECTION VI: INTERVENTION PLAN (NEXT WEEK)
    // ============================================
    
    register_post_meta('weekly_case_summary', 'new_intermediary_goals', [
        'type'          => 'string',
        'description'   => 'New intermediary goals for next week',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'next_week_focus_areas', [
        'type'          => 'string',
        'description'   => 'Focus areas for next week (serialized)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'intervention_strategies', [
        'type'          => 'string',
        'description'   => 'Specific intervention strategies planned',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'homework_assigned', [
        'type'          => 'string',
        'description'   => 'Homework/tasks assigned to family',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    // ============================================
    // SECTION VII: SAFETY ASSESSMENT
    // ============================================
    
    register_post_meta('weekly_case_summary', 'safety_status_this_week', [
        'type'          => 'string',
        'description'   => 'Safety status for this week',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'safety_concerns_summary', [
        'type'          => 'string',
        'description'   => 'Summary of safety concerns',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'safety_plan_updates', [
        'type'          => 'string',
        'description'   => 'Updates to safety plan',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'crisis_events_this_week', [
        'type'          => 'string',
        'description'   => 'Any crisis events or escalations',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    // ============================================
    // SECTION VIII: CONTACT SUMMARY (FROM FORM 301)
    // ============================================
    
    register_post_meta('weekly_case_summary', 'contact_logs_summary', [
        'type'          => 'string',
        'description'   => 'Auto-aggregated summary from Form 301 entries (pre-populated from ACF staging field)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'total_contact_hours', [
        'type'          => 'number',
        'description'   => 'Total contact hours this week (from Form 301 aggregation)',
        'single'        => true,
        'show_in_rest'  => true,
    ]);
    
    register_post_meta('weekly_case_summary', 'contact_count', [
        'type'          => 'integer',
        'description'   => 'Number of contacts this week',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'absint',
    ]);
    
    register_post_meta('weekly_case_summary', 'face_to_face_hours', [
        'type'          => 'number',
        'description'   => 'Face-to-face contact hours',
        'single'        => true,
        'show_in_rest'  => true,
    ]);
    
    register_post_meta('weekly_case_summary', 'phone_contact_hours', [
        'type'          => 'number',
        'description'   => 'Phone contact hours',
        'single'        => true,
        'show_in_rest'  => true,
    ]);
    
    // ============================================
    // AI INTEGRATION (OPENAI via Gravity Connect)
    // ============================================
    
    register_post_meta('weekly_case_summary', 'ai_generated_summary', [
        'type'          => 'string',
        'description'   => 'AI-generated case summary (from OpenAI)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'ai_insights', [
        'type'          => 'string',
        'description'   => 'AI-generated insights and patterns',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'ai_recommendations', [
        'type'          => 'string',
        'description'   => 'AI-generated recommendations',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    // ============================================
    // WORKFLOW & SYSTEM FIELDS
    // ============================================
    
    register_post_meta('weekly_case_summary', 'summary_status', [
        'type'          => 'string',
        'description'   => 'Workflow status (Pending/Reviewed/Approved)',
        'single'        => true,
        'show_in_rest'  => true,
        'default'       => 'Pending Supervisor Review',
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'supervisor_reviewed_date', [
        'type'          => 'string',
        'description'   => 'Date supervisor reviewed (Y-m-d H:i:s)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'supervisor_comments', [
        'type'          => 'string',
        'description'   => 'Supervisor feedback and comments',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'expert_consultation_needed', [
        'type'          => 'string',
        'description'   => 'Expert consultation needed (Yes/No)',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'sanitize_text_field',
    ]);
    
    register_post_meta('weekly_case_summary', 'consultation_details', [
        'type'          => 'string',
        'description'   => 'Consultation request details',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'wp_kses_post',
    ]);
    
    register_post_meta('weekly_case_summary', 'gravity_form_entry_id', [
        'type'          => 'integer',
        'description'   => 'Form 302 entry ID that created this summary',
        'single'        => true,
        'show_in_rest'  => true,
        'sanitize_callback' => 'absint',
    ]);
}
// ============================================
// ADMIN COLUMNS
// ============================================
add_filter('manage_weekly_case_summary_posts_columns', 'mst_weekly_summary_admin_columns');
add_action('manage_weekly_case_summary_posts_custom_column', 'mst_weekly_summary_admin_column_content', 10, 2);
add_filter('manage_edit-weekly_case_summary_sortable_columns', 'mst_weekly_summary_sortable_columns');
function mst_weekly_summary_admin_columns($columns) {
    $new_columns = [];
    $new_columns['cb'] = $columns['cb'];
    $new_columns['msti_number'] = __('<strong>MSTI #</strong>', 'mst-weekly');
    $new_columns['treatment_week'] = __('<strong>Week</strong>', 'mst-weekly');
    $new_columns['title'] = __('Youth Name', 'mst-weekly');
    $new_columns['week_period'] = __('Week Period', 'mst-weekly');
    $new_columns['parent_case'] = __('Parent Case', 'mst-weekly');
    $new_columns['therapist'] = __('Therapist', 'mst-weekly');
    $new_columns['summary_status'] = __('Status', 'mst-weekly');
    $new_columns['contact_hours'] = __('Contact Hours', 'mst-weekly');
    $new_columns['tam_sam'] = __('TAM/SAM', 'mst-weekly');
    $new_columns['date'] = __('Submitted', 'mst-weekly');
    
    return $new_columns;
}
function mst_weekly_summary_admin_column_content($column, $post_id) {
    switch ($column) {
        case 'msti_number':
            $msti = get_post_meta($post_id, 'msti_number', true);
            $parent_id = wp_get_post_parent_id($post_id); // Use core function
            
            if ($parent_id) {
                echo '<a href="' . get_edit_post_link($parent_id) . '" style="font-weight: bold; color: #0073aa;">' . esc_html($msti) . '</a>';
            } else {
                echo '<strong style="color: #d63638;">' . esc_html($msti ?: 'No MSTI') . '</strong>';
            }
            break;
            
        case 'treatment_week':
            $week = get_post_meta($post_id, 'treatment_week', true);
            echo '<strong style="font-size: 1.2em; color: #2271b1;">Week ' . esc_html($week ?: '?') . '</strong>';
            break;
            
        case 'week_period':
            $start = get_post_meta($post_id, 'week_start_date', true);
            $end = get_post_meta($post_id, 'week_end_date', true);
            if ($start && $end) {
                echo date('M j', strtotime($start)) . ' - ' . date('M j, Y', strtotime($end));
            } else {
                echo '<em>Not set</em>';
            }
            break;
            
        case 'parent_case':
            $parent_id = wp_get_post_parent_id($post_id);
            if ($parent_id) {
                $parent_title = get_the_title($parent_id);
                echo '<a href="' . get_edit_post_link($parent_id) . '">' . esc_html($parent_title) . '</a>';
            } else {
                echo '<em style="color: #d63638;">No parent</em>';
            }
            break;
            
        case 'therapist':
            $author_id = get_post_field('post_author', $post_id);
            echo get_the_author_meta('display_name', $author_id);
            break;
            
        case 'summary_status':
            $status = get_post_meta($post_id, 'summary_status', true);
            $colors = [
                'Pending Supervisor Review' => '#d63638',
                'Reviewed' => '#dba617',
                'Approved' => '#00a32a',
            ];
            $color = $colors[$status] ?? '#50575e';
            echo '<span style="color: ' . $color . '; font-weight: 500;">' . esc_html($status ?: 'Unknown') . '</span>';
            break;
            
        case 'contact_hours':
            $hours = get_post_meta($post_id, 'total_contact_hours', true);
            $count = get_post_meta($post_id, 'contact_count', true);
            if ($hours) {
                echo '<strong>' . number_format($hours, 1) . ' hrs</strong><br><small>(' . intval($count) . ' contacts)</small>';
            } else {
                echo '<em>Not recorded</em>';
            }
            break;
            
        case 'tam_sam':
            $tam = get_post_meta($post_id, 'tam_score', true);
            $sam = get_post_meta($post_id, 'sam_score', true);
            if ($tam || $sam) {
                echo 'TAM: ' . ($tam ? number_format($tam, 1) : '?') . '<br>SAM: ' . ($sam ? number_format($sam, 1) : '?');
            } else {
                echo '<em>Not rated</em>';
            }
            break;
    }
}
function mst_weekly_summary_sortable_columns($columns) {
    $columns['msti_number'] = 'msti_number';
    $columns['treatment_week'] = 'treatment_week';
    $columns['week_period'] = 'week_start_date';
    $columns['therapist'] = 'post_author';
    $columns['summary_status'] = 'summary_status';
    $columns['contact_hours'] = 'total_contact_hours';
    return $columns;
}
// Sort by treatment week and meta fields
add_action('pre_get_posts', 'mst_weekly_summary_orderby');
function mst_weekly_summary_orderby($query) {
    if (!is_admin() || !$query->is_main_query()) {
        return;
    }
    
    if ($query->get('post_type') === 'weekly_case_summary') {
        // Default sort by treatment week descending (newest first)
        if (!$query->get('orderby')) {
            $query->set('meta_key', 'treatment_week');
            $query->set('orderby', 'meta_value_num');
            $query->set('order', 'DESC');
        }
        
        // Handle column sorting
        $orderby = $query->get('orderby');
        switch ($orderby) {
            case 'treatment_week':
                $query->set('meta_key', 'treatment_week');
                $query->set('orderby', 'meta_value_num');
                break;
            case 'msti_number':
                $query->set('meta_key', 'msti_number');
                $query->set('orderby', 'meta_value');
                break;
            case 'week_start_date':
                $query->set('meta_key', 'week_start_date');
                $query->set('orderby', 'meta_value');
                break;
            case 'summary_status':
                $query->set('meta_key', 'summary_status');
                $query->set('orderby', 'meta_value');
                break;
            case 'total_contact_hours':
                $query->set('meta_key', 'total_contact_hours');
                $query->set('orderby', 'meta_value_num');
                break;
        }
    }
}
// ============================================
// GRAVITY FORMS INTEGRATION
// ============================================
// Auto-populate case data in weekly summary forms
add_filter('gform_field_value_msti_case_selection', 'mst_populate_case_for_weekly_summary');
function mst_populate_case_for_weekly_summary($value) {
    if (isset($_GET['msti'])) {
        $msti = sanitize_text_field($_GET['msti']);
        $cases = get_posts([
            'post_type'      => 'mst_case',
            'meta_key'       => 'msti_number',
            'meta_value'     => $msti,
            'posts_per_page' => 1,
        ]);
        if (!empty($cases)) {
            return $cases[0]->ID;
        }
    }
    
    if (isset($_GET['case_id'])) {
        return absint($_GET['case_id']);
    }
    
    return $value;
}
// Auto-calculate treatment week
add_filter('gform_field_value_treatment_week', 'mst_calculate_treatment_week');
function mst_calculate_treatment_week($value) {
    if (isset($_GET['case_id'])) {
        $case_id = absint($_GET['case_id']);
        $start_date = get_post_meta($case_id, 'treatment_start_date', true);
        
        if ($start_date) {
            $start_timestamp = strtotime($start_date);
            $current_timestamp = current_time('timestamp');
            $weeks = floor(($current_timestamp - $start_timestamp) / (7 * 24 * 60 * 60)) + 1;
            return max(1, $weeks);
        }
    }
    
    return $value;
}
// ============================================
// CPT FEED HOOKS - PARENT RELATIONSHIP
// ============================================
// CRITICAL: Set post_parent when CPT Feed CREATES weekly summary
// This ensures each Form 302 submission creates a NEW post with proper parent relationship
add_filter('gform_cpt_post_args', 'mst_set_weekly_summary_parent', 10, 4);
function mst_set_weekly_summary_parent($post_args, $form, $entry, $feed) {
    // Only for weekly_case_summary posts
    if ($post_args['post_type'] !== 'weekly_case_summary') {
        return $post_args;
    }
    
    // Get parent case ID from form entry (Field 1 should be MSTI Case Selection)
    $parent_case_id = rgar($entry, '1'); // Adjust field ID as needed
    
    if ($parent_case_id) {
        $post_args['post_parent'] = absint($parent_case_id);
        
        // Optional: Log for debugging during implementation
        if (defined('WP_DEBUG') && WP_DEBUG) {
            error_log(sprintf(
                'MST Weekly Summary: Creating new post for case %d, week %s',
                $parent_case_id,
                rgar($entry, '9') // treatment_week field
            ));
        }
    }
    
    return $post_args;
}
// Store the Form 302 entry ID in the weekly summary post meta
add_action('gform_post_submission', 'mst_link_weekly_summary_to_entry', 10, 2);
function mst_link_weekly_summary_to_entry($entry, $form) {
    // Only for Form 302 (adjust form ID as needed)
    if ($form['id'] != 302) {
        return;
    }
    
    // Get the created post ID from CPT Feed
    if (isset($entry['post_id']) && $entry['post_id']) {
        $post_id = absint($entry['post_id']);
        $entry_id = absint($entry['id']);
        
        // Store the entry ID in the post meta
        update_post_meta($post_id, 'gravity_form_entry_id', $entry_id);
        
        // Optional: Store post ID back in entry meta for reverse lookup
        gform_update_meta($entry_id, 'weekly_summary_post_id', $post_id);
    }
}
// ============================================
// GRAVITY PERKS POPULATE ANYTHING
// ============================================
add_filter('gppa_object_type_query_args', 'mst_weekly_summary_gppa_filter', 10, 4);
function mst_weekly_summary_gppa_filter($query_args, $args, $filter_name, $filter) {
    if (empty($query_args['post_type']) || $query_args['post_type'] !== 'weekly_case_summary') {
        return $query_args;
    }
    
    // Filter by therapist
    $current_user_id = get_current_user_id();
    if ($current_user_id > 0) {
        $query_args['author'] = $current_user_id;
    }
    
    // Filter by parent case
    if (!empty($_GET['case_id'])) {
        $case_id = absint($_GET['case_id']);
        $query_args['post_parent'] = $case_id;
    }
    
    // Default ordering
    if (empty($query_args['orderby'])) {
        $query_args['meta_key'] = 'treatment_week';
        $query_args['orderby'] = 'meta_value_num';
        $query_args['order'] = 'DESC';
    }
    
    return $query_args;
}
// ============================================
// GRAVITYVIEW INTEGRATION
// ============================================
add_filter('gravityview_fe_search_criteria', 'mst_weekly_summary_search_filter', 10, 3);
function mst_weekly_summary_search_filter($search_criteria, $form_id, $args) {
    if (isset($_GET['msti'])) {
        $msti = sanitize_text_field($_GET['msti']);
        $search_criteria['field_filters'][] = [
            'key'      => 'msti_number',
            'value'    => $msti,
            'operator' => 'is',
        ];
    }
    
    if (isset($_GET['week_from']) && isset($_GET['week_to'])) {
        $week_from = absint($_GET['week_from']);
        $week_to = absint($_GET['week_to']);
        
        $search_criteria['field_filters'][] = [
            'key'      => 'treatment_week',
            'value'    => $week_from,
            'operator' => '>=',
        ];
        
        $search_criteria['field_filters'][] = [
            'key'      => 'treatment_week',
            'value'    => $week_to,
            'operator' => '<=',
        ];
    }
    
    return $search_criteria;
}
// ============================================
// UTILITY FUNCTIONS
// ============================================
// Get previous week's summary
function mst_get_previous_weekly_summary($case_id, $current_week) {
    $previous_week = $current_week - 1;
    
    if ($previous_week < 1) {
        return null;
    }
    
    $summaries = get_posts([
        'post_type'      => 'weekly_case_summary',
        'post_parent'    => $case_id, // Use post_parent
        'posts_per_page' => 1,
        'meta_key'       => 'treatment_week',
        'meta_value'     => $previous_week,
        'meta_compare'   => '=',
    ]);
    
    return !empty($summaries) ? $summaries[0] : null;
}
// Get all weekly summaries for a case
function mst_get_case_weekly_summaries($case_id) {
    return get_posts([
        'post_type'      => 'weekly_case_summary',
        'post_parent'    => $case_id,
        'posts_per_page' => -1,
        'meta_key'       => 'treatment_week',
        'orderby'        => 'meta_value_num',
        'order'          => 'ASC',
    ]);
}
// Get latest weekly summary for a case
function mst_get_latest_weekly_summary($case_id) {
    $summaries = get_posts([
        'post_type'      => 'weekly_case_summary',
        'post_parent'    => $case_id,
        'posts_per_page' => 1,
        'meta_key'       => 'treatment_week',
        'orderby'        => 'meta_value_num',
        'order'          => 'DESC',
    ]);
    
    return !empty($summaries) ? $summaries[0] : null;
}
// Count total weekly summaries for a case
function mst_count_weekly_summaries($case_id) {
    return count(mst_get_case_weekly_summaries($case_id));
}
// Check if a weekly summary exists for specific week
function mst_weekly_summary_exists($case_id, $week_number) {
    $summaries = get_posts([
        'post_type'      => 'weekly_case_summary',
        'post_parent'    => $case_id,
        'posts_per_page' => 1,
        'meta_query'     => [
            [
                'key'     => 'treatment_week',
                'value'   => $week_number,
                'compare' => '=',
            ],
        ],
    ]);
    
    return !empty($summaries);
}
// Activation hook
register_activation_hook(__FILE__, 'mst_weekly_summary_activation');
function mst_weekly_summary_activation() {
    mst_register_weekly_summary_post_type();
    flush_rewrite_rules();
}
// Deactivation hook
register_deactivation_hook(__FILE__, 'mst_weekly_summary_deactivation');
function mst_weekly_summary_deactivation() {
    flush_rewrite_rules();
}

Comments

Add a Comment