Rapport-Laravel/app/Http/Controllers/CoachingtoolDashboard.php

2094 lines
92 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\LambdaRequest;
use DB;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\InvoicesExport;
use Carbon\Carbon;
class CoachingtoolDashboard extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->_service = 'form';
$this->_module = 'formentity';
$this->_viewname = 'coachingtooldashboard';
$this->_title = ' : Submitted Data';
$this->_base_url = '/coachingtooldashboard';
}
public function sbmAndMeActionPlanReport()
{
$permissions = json_decode(Auth::user()->permissions);
// Generalised variables for partition, form_id, action plan label, and field names
$partition = 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$form_id = '1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$actionPlanLabel = 'action_plan_label';
// Generalised field names for action plan, timeline, and adherence
$actionPlanField = 'action_plan';
$timelineField = 'timeline_agreed_for_selected_action_plans_completion';
$adherenceField = 'adherance_to_action_plan';
// Generalised variable names for pipeline
$actionPlanArrayField = 'action_plan_array';
$actionKeyField = 'actionKey';
$actionLabelField = 'actionLabel';
$timelineKeyField = 'timelineKey';
$adherenceKeyRawField = 'adherenceKeyRaw';
$adherenceKeyField = 'adherenceKey';
$matchConditions = [
'form_id' => $form_id,
'partition' => $partition,
'status' => 'active',
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$reqdataSBM = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
[
'$match' => $matchConditions,
],
[
'$addFields' => [
$actionPlanArrayField => [
'$let' => [
'vars' => ['ap' => '$formdata.' . $actionPlanField],
'in' => [
'$cond' => [
['$eq' => [['$type' => '$$ap'], 'array']],
'$$ap',
[
'$cond' => [['$eq' => [['$type' => '$$ap'], 'string']], ['$split' => ['$$ap', ',']], []],
],
],
],
],
],
],
],
[
'$unwind' => [
'path' => '$' . $actionPlanArrayField,
'preserveNullAndEmptyArrays' => false,
],
],
// Generalized: No mapping, just use the value as key and label
[
'$addFields' => [
$actionKeyField => '$' . $actionPlanArrayField,
$actionLabelField => '$' . $actionPlanArrayField,
],
],
[
'$addFields' => [
$timelineKeyField => ['$toLower' => ['$ifNull' => ['$formdata.' . $timelineField, '']]],
$adherenceKeyRawField => ['$toLower' => ['$ifNull' => ['$formdata.' . $adherenceField, '']]],
],
],
[
'$addFields' => [
$adherenceKeyField => [
'$cond' => [['$eq' => ['$' . $adherenceKeyRawField, 'staus_quo']], 'status_quo', '$' . $adherenceKeyRawField],
],
],
],
[
'$group' => [
'_id' => '$' . $actionKeyField,
'anyLabel' => ['$first' => '$' . $actionLabelField],
'total' => ['$sum' => 1],
'less_than_1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, 'less_than_1_month']], 1, 0]]],
'1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '1_month']], 1, 0]]],
'3_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '3_month']], 1, 0]]],
'6_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '6_month']], 1, 0]]],
'on_track' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'on_track']], 1, 0]]],
'needs_correction' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'needs_correction']], 1, 0]]],
'status_quo' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'status_quo']], 1, 0]]],
],
],
[
'$project' => array_merge([
'_id' => 0,
$actionPlanLabel => '$anyLabel',
'total' => 1,
'less_than_1_month' => 1,
'1_month' => 1,
'3_months' => 1,
'6_months' => 1,
'on_track' => 1,
'needs_correction' => 1,
'status_quo' => 1,
]),
],
[
'$sort' => ['total' => -1],
],
],
];
$sbmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $reqdataSBM);
$submissions = [];
$actionPlanItems = [
'100% adherence in Tour plan' => ['100_adherence_in_tour_plan'],
'95% MCL Coverage, Visit frequency >90%, 5% Non visited doctors' => ['95_mcl_coverage_visit_frequency_90_5_non_visited_doctors'],
'1 Camp & 4 Clinics' => ['1_camp_and_4_clinics', '1_camp_4_clinics'],
'Tab Detailing in doctor calls' => ['tab_detailing_in_doctor_calls'],
'New Conversions' => ['new_conversions'],
'MCL productivity' => ['mcl_productivity'],
'Others mention if any' => ['others_mention_if_any'],
];
// Build a reverse lookup: slug => action plan label
$slugToLabel = [];
foreach ($actionPlanItems as $label => $slugs) {
foreach ($slugs as $slug) {
$slugToLabel[$slug] = $label;
}
}
foreach ($sbmResponse->data->submissions as $submission) {
$slug = \Illuminate\Support\Str::slug($submission->{$actionPlanLabel}, '_');
// Find the matching action plan label for this slug
$matchedLabel = null;
foreach ($actionPlanItems as $label => $slugs) {
if (in_array($slug, $slugs)) {
$matchedLabel = $label;
break;
}
}
if ($matchedLabel === null) {
// If not matched, skip this submission
continue;
}
// Set the action plan label to the matched label (the key)
$submission->{$actionPlanLabel} = $matchedLabel;
if (isset($submissions[$matchedLabel])) {
// Merge all parameters (sum numeric values, keep latest for non-numeric)
foreach ($submission as $key => $value) {
if ($key === $actionPlanLabel) {
// Already set as matched label, skip
continue;
}
if (isset($submissions[$matchedLabel]->$key)) {
// If both are numeric, sum them
if (is_numeric($submissions[$matchedLabel]->$key) && is_numeric($value)) {
$submissions[$matchedLabel]->$key += $value;
} else {
// For non-numeric, keep the latest value (from $submission)
$submissions[$matchedLabel]->$key = $value;
}
} else {
// If key does not exist, just set it
$submissions[$matchedLabel]->$key = $value;
}
}
} else {
$submissions[$matchedLabel] = clone $submission;
}
}
//echo "<pre>"; print_r($submissions); exit;
return $this->view('dashboard')->with([
'title' => 'SBM/ME',
'response' => $submissions,
'actionPlanItems' => array_keys($actionPlanItems),
'base_url' => $this->_base_url,
'buttons' => $this->get_list_buttons(),
]);
}
public function rmActionPlanReport()
{
// Generalised variables for partition, form_id, action plan label, and field names
$partition = 'rapport-pulmocare-1742297848-159745be-ac42-413b-9aee-31466671011e';
$form_id = '1742297848-159745be-ac42-413b-9aee-31466671011e';
$actionPlanLabel = 'action_plan_label';
// Generalised field names for action plan, timeline, and adherence
$actionPlanField = 'action_plan';
$timelineField = 'timeline_agreed_for_selected_action_plans_completion';
$adherenceField = 'adherance_to_action_plan';
// Generalised variable names for pipeline
$actionPlanArrayField = 'action_plan_array';
$actionKeyField = 'actionKey';
$actionLabelField = 'actionLabel';
$timelineKeyField = 'timelineKey';
$adherenceKeyRawField = 'adherenceKeyRaw';
$adherenceKeyField = 'adherenceKey';
$matchConditions = [
'form_id' => $form_id,
'partition' => $partition,
'status' => 'active',
];
$permissions = json_decode(Auth::user()->permissions);
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$reqdataRM = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
[
'$match' => $matchConditions
],
[
'$addFields' => [
$actionPlanArrayField => [
'$let' => [
'vars' => ['ap' => '$formdata.' . $actionPlanField],
'in' => [
'$cond' => [
['$eq' => [['$type' => '$$ap'], 'array']],
'$$ap',
[
'$cond' => [['$eq' => [['$type' => '$$ap'], 'string']], ['$split' => ['$$ap', ',']], []],
],
],
],
],
],
],
],
[
'$unwind' => [
'path' => '$' . $actionPlanArrayField,
'preserveNullAndEmptyArrays' => false,
],
],
// Generalized: No mapping, just use the value as key and label
[
'$addFields' => [
$actionKeyField => '$' . $actionPlanArrayField,
$actionLabelField => '$' . $actionPlanArrayField,
],
],
[
'$addFields' => [
$timelineKeyField => ['$toLower' => ['$ifNull' => ['$formdata.' . $timelineField, '']]],
$adherenceKeyRawField => ['$toLower' => ['$ifNull' => ['$formdata.' . $adherenceField, '']]],
],
],
[
'$addFields' => [
$adherenceKeyField => [
'$cond' => [['$eq' => ['$' . $adherenceKeyRawField, 'staus_quo']], 'status_quo', '$' . $adherenceKeyRawField],
],
],
],
[
'$group' => [
'_id' => '$' . $actionKeyField,
'anyLabel' => ['$first' => '$' . $actionLabelField],
'total' => ['$sum' => 1],
'less_than_1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, 'less_than_1_month']], 1, 0]]],
'1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '1_month']], 1, 0]]],
'3_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '3_month']], 1, 0]]],
'6_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '6_month']], 1, 0]]],
'on_track' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'on_track']], 1, 0]]],
'needs_correction' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'needs_correction']], 1, 0]]],
'status_quo' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'status_quo']], 1, 0]]],
],
],
[
'$project' => array_merge([
'_id' => 0,
$actionPlanLabel => '$anyLabel',
'total' => 1,
'less_than_1_month' => 1,
'1_month' => 1,
'3_months' => 1,
'6_months' => 1,
'on_track' => 1,
'needs_correction' => 1,
'status_quo' => 1,
]),
],
[
'$sort' => ['total' => -1],
],
],
];
$sbmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $reqdataRM);
$submissions = [];
$actionPlanItems = [
'Tour Plan adherence of Team' => ['tour_plan_adherence_of_team'],
'100% Spread of performance' => ['100_spread_of_performance'],
'100% RM Region Target achievement' => ['100_rm_region_target_achievement'],
'SOP at Mandate Brand performance' => ['sop_at_mandate_brand_performance'],
'RM Mandate Target Achievement' => ['rm_mandate_target_achievement'],
'SOP at NI Brand performance' => ['sop_at_ni_brand_performance'],
'RM NI Target Achievement' => ['rm_ni_target_achievement'],
'Stretch working with SBMs' => ['stretch_working_with_sbms'],
'Critical Geography time allocation' => ['critical_geography_time_allocation'],
'Critical geography Revival' => ['critical_geography_revival'],
'Covering all Sponsored doctors' => ['covering_all_sponsored_doctors'],
'Ensuring equal spread at all doctors' => ['ensuring_equal_spread_at_all_doctors'],
'Ensuring 1:5 times ROI from Sponsored doctors' => ['ensuring_1_5_times_roi_from_sponsored_doctors'],
'Others' => ['others'],
];
// Build a reverse lookup: slug => action plan label
$slugToLabel = [];
foreach ($actionPlanItems as $label => $slugs) {
foreach ($slugs as $slug) {
$slugToLabel[$slug] = $label;
}
}
foreach ($sbmResponse->data->submissions as $submission) {
$slug = \Illuminate\Support\Str::slug($submission->{$actionPlanLabel}, '_');
// Find the matching action plan label for this slug
$matchedLabel = null;
foreach ($actionPlanItems as $label => $slugs) {
if (in_array($slug, $slugs)) {
$matchedLabel = $label;
break;
}
}
if ($matchedLabel === null) {
// If not matched, skip this submission
continue;
}
// Set the action plan label to the matched label (the key)
$submission->{$actionPlanLabel} = $matchedLabel;
if (isset($submissions[$matchedLabel])) {
// Merge all parameters (sum numeric values, keep latest for non-numeric)
foreach ($submission as $key => $value) {
if ($key === $actionPlanLabel) {
// Already set as matched label, skip
continue;
}
if (isset($submissions[$matchedLabel]->$key)) {
// If both are numeric, sum them
if (is_numeric($submissions[$matchedLabel]->$key) && is_numeric($value)) {
$submissions[$matchedLabel]->$key += $value;
} else {
// For non-numeric, keep the latest value (from $submission)
$submissions[$matchedLabel]->$key = $value;
}
} else {
// If key does not exist, just set it
$submissions[$matchedLabel]->$key = $value;
}
}
} else {
$submissions[$matchedLabel] = clone $submission;
}
}
return $this->view('dashboard')->with([
'title' => 'RM',
'response' => $submissions,
'actionPlanItems' => array_keys($actionPlanItems),
'base_url' => $this->_base_url,
'buttons' => $this->get_list_buttons(),
]);
}
public function sbmAndMeGoalAndProficiencyTrackingReport()
{
$partition = 'rapport-pulmocare-1742297848-159745be-ac42-413b-9aee-31466671011e';
$form_id = '1742297848-159745be-ac42-413b-9aee-31466671011e';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active',
'is_deleted' => ['$ne' => true],
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$sbmCondition = [
'partition' => 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58',
'form_id' => '1742292203-0153c37f-1433-446a-a059-de3597eaca58',
'pipeline' => [
// 1) Slice
[
'$match' => $matchConditions,
],
// 2) Build record_month from record_date → formdata.record_date (string/date) → createdAt
[
'$addFields' => [
'_m_from_record_date' => [
'$cond' => [['$eq' => [['$type' => '$record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$record_date']], 0, 7]], null],
],
'_m_from_formdata_str' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'string']], ['$substr' => ['$formdata.record_date', 0, 7]], null],
],
'_m_from_formdata_date' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$formdata.record_date']], 0, 7]], null],
],
'_m_from_createdAt' => [
'$cond' => [['$eq' => [['$type' => '$createdAt'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$createdAt']], 0, 7]], null],
],
],
],
[
'$addFields' => [
'record_month' => [
'$ifNull' => [
'$_m_from_record_date',
[
'$ifNull' => [
'$_m_from_formdata_str',
[
'$ifNull' => ['$_m_from_formdata_date', '$_m_from_createdAt'],
],
],
],
],
],
],
],
// 3) Fan out goals
[
'$project' => [
'record_month' => 1,
'user_id' => 1,
'goals' => [
[
'goal_name' => 'Tour Plan Adherence',
'goal_value' => '$formdata.proficiency-goal_1_tour_plan_adherance',
],
[
'goal_name' => 'Basic Working',
'goal_value' => '$formdata.proficiency-goal_2_basic_working',
],
[
'goal_name' => 'Activations',
'goal_value' => '$formdata.proficiency-goal_3_activations',
],
[
'goal_name' => 'In-clinic Effectiveness',
'goal_value' => '$formdata.proficiency-goal_4_in_clinic_effectiveness',
],
[
'goal_name' => 'Spread of Performance',
'goal_value' => '$formdata.proficiency-goal_5_spread_of_performance',
],
],
],
],
['$unwind' => '$goals'],
[
'$match' => [
'record_month' => ['$ne' => null],
'goals.goal_value' => ['$ne' => null],
],
],
// 4) NORMALIZE labels → Proficient / Competent / Intermediate / Beginner
// Works for values like "A - Proficient", "B - Competent", "C ...", "D ..." etc.
[
'$addFields' => [
'goals.goal_value_norm' => [
'$switch' => [
'branches' => [['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'A']], 'then' => 'Proficient'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'B']], 'then' => 'Competent'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'C']], 'then' => 'Intermediate'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'D']], 'then' => 'Beginner']],
// if already a clean label or unexpected, keep original
'default' => '$goals.goal_value',
],
],
],
],
// 5) Count unique users per month+goal+normalized_label
[
'$group' => [
'_id' => [
'month' => '$record_month',
'goal_name' => '$goals.goal_name',
'goal_value' => '$goals.goal_value_norm',
],
'users' => ['$addToSet' => '$user_id'],
],
],
[
'$project' => [
'_id' => 0,
'month' => '$_id.month',
'goal_name' => '$_id.goal_name',
'goal_value' => '$_id.goal_value',
'user_count' => ['$size' => '$users'],
],
],
// 6) Nest by goal within month
[
'$group' => [
'_id' => ['month' => '$month', 'goal_name' => '$goal_name'],
'values' => [
'$push' => [
'goal_value' => '$goal_value',
'user_count' => '$user_count',
],
],
],
],
[
'$group' => [
'_id' => '$_id.month',
'goals' => [
'$push' => [
'k' => '$_id.goal_name',
'v' => '$values',
],
],
],
],
[
'$project' => [
'_id' => 0,
'k' => '$_id',
'v' => [
'$arrayToObject' => [
'$filter' => [
'input' => '$goals',
'as' => 'item',
'cond' => [
'$and' => [['$ne' => ['$$item.k', null]], ['$ne' => ['$$item.v', null]]],
],
],
],
],
],
],
// 7) Collapse to { "YYYY-MM": { Goal 1: [...], Goal 2: [...] }, ... }
[
'$group' => [
'_id' => null,
'entries' => [
'$push' => ['k' => '$k', 'v' => '$v'],
],
],
],
[
'$replaceRoot' => [
'newRoot' => ['$arrayToObject' => '$entries'],
],
],
],
];
$sbmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $sbmCondition);
// Fixed goal order (use your display names)
$goalsList = ['Tour Plan Adherence', 'Basic Working', 'Activations', 'In-clinic Effectiveness', 'Spread of Performance'];
//echo "<pre>"; print_r($sbmResponse); exit;
return $this->view('goalandproficiency')->with([
'title' => 'SBM/ME',
'response' => $sbmResponse,
'goalsList' => $goalsList,
'base_url' => $this->_base_url,
'buttons' => $this->get_list_buttons(),
]);
}
public function rmGoalAndProficiencyTracking()
{
$partition = 'rapport-pulmocare-1742297848-159745be-ac42-413b-9aee-31466671011e';
$form_id = '1742297848-159745be-ac42-413b-9aee-31466671011e';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active',
'is_deleted' => ['$ne' => true],
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$rmCondition = [
'partition' => 'rapport-pulmocare-1742297848-159745be-ac42-413b-9aee-31466671011e',
'form_id' => '1742297848-159745be-ac42-413b-9aee-31466671011e',
'pipeline' => [
// 1) Slice
[
'$match' => $matchConditions,
],
// 2) Build record_month from record_date → formdata.record_date (string/date) → createdAt
[
'$addFields' => [
'_m_from_record_date' => [
'$cond' => [['$eq' => [['$type' => '$record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$record_date']], 0, 7]], null],
],
'_m_from_formdata_str' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'string']], ['$substr' => ['$formdata.record_date', 0, 7]], null],
],
'_m_from_formdata_date' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$formdata.record_date']], 0, 7]], null],
],
'_m_from_createdAt' => [
'$cond' => [['$eq' => [['$type' => '$createdAt'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$createdAt']], 0, 7]], null],
],
],
],
[
'$addFields' => [
'record_month' => [
'$ifNull' => [
'$_m_from_record_date',
[
'$ifNull' => [
'$_m_from_formdata_str',
[
'$ifNull' => ['$_m_from_formdata_date', '$_m_from_createdAt'],
],
],
],
],
],
],
],
// 3) Fan out goals
[
'$project' => [
'record_month' => 1,
'user_id' => 1,
'goals' => [
[
'goal_name' => 'Tour Plan Adherence Self & Team',
'goal_value' => '$formdata.proficiency-goal_1_tour_plan_adherence_self_and_team',
],
[
'goal_name' => 'Spread of Performance',
'goal_value' => '$formdata.proficiency-goal_2_spread_of_performance',
],
[
'goal_name' => 'Joint Field Work',
'goal_value' => '$formdata.proficiency-goal_3_joint_field_work',
],
[
'goal_name' => 'KOL Engagement & ROI',
'goal_value' => '$formdata.proficiency-goal_4_kol_engagement_and_roi',
],
// [
// 'goal_name' => 'Spread of Performance',
// 'goal_value' => '$formdata.proficiency-goal_5_spread_of_performance',
// ],
],
],
],
['$unwind' => '$goals'],
[
'$match' => [
'record_month' => ['$ne' => null],
'goals.goal_value' => ['$ne' => null],
],
],
// 4) NORMALIZE labels → Proficient / Competent / Intermediate / Beginner
// Works for values like "A - Proficient", "B - Competent", "C ...", "D ..." etc.
[
'$addFields' => [
'goals.goal_value_norm' => [
'$switch' => [
'branches' => [['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'A']], 'then' => 'Proficient'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'B']], 'then' => 'Competent'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'C']], 'then' => 'Intermediate'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'D']], 'then' => 'Beginner']],
// if already a clean label or unexpected, keep original
'default' => '$goals.goal_value',
],
],
],
],
// 5) Count unique users per month+goal+normalized_label
[
'$group' => [
'_id' => [
'month' => '$record_month',
'goal_name' => '$goals.goal_name',
'goal_value' => '$goals.goal_value_norm',
],
'users' => ['$addToSet' => '$user_id'],
],
],
[
'$project' => [
'_id' => 0,
'month' => '$_id.month',
'goal_name' => '$_id.goal_name',
'goal_value' => '$_id.goal_value',
'user_count' => ['$size' => '$users'],
],
],
// 6) Nest by goal within month
[
'$group' => [
'_id' => ['month' => '$month', 'goal_name' => '$goal_name'],
'values' => [
'$push' => [
'goal_value' => '$goal_value',
'user_count' => '$user_count',
],
],
],
],
[
'$group' => [
'_id' => '$_id.month',
'goals' => [
'$push' => [
'k' => '$_id.goal_name',
'v' => '$values',
],
],
],
],
[
'$project' => [
'_id' => 0,
'k' => '$_id',
'v' => [
'$arrayToObject' => [
'$filter' => [
'input' => '$goals',
'as' => 'item',
'cond' => [
'$and' => [['$ne' => ['$$item.k', null]], ['$ne' => ['$$item.v', null]]],
],
],
],
],
],
],
// 7) Collapse to { "YYYY-MM": { Goal 1: [...], Goal 2: [...] }, ... }
[
'$group' => [
'_id' => null,
'entries' => [
'$push' => ['k' => '$k', 'v' => '$v'],
],
],
],
[
'$replaceRoot' => [
'newRoot' => ['$arrayToObject' => '$entries'],
],
],
],
];
$rmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $rmCondition);
//echo "<pre>"; print_r($sbmResponse); exit;
$goalsList = ['Tour Plan Adherence Self & Team', 'Spread of Performance', 'Joint Field Work', 'KOL Engagement & ROI'];
// $rmCondition = [
// 'partition' => 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58',
// 'form_id' => '1742292203-0153c37f-1433-446a-a059-de3597eaca58',
// 'pipeline' => [
// [
// '$match' => [
// 'is_deleted' => false,
// 'formdata.record_date' => ['$exists' => true],
// 'partition' => 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58',
// 'form_id' => '1742292203-0153c37f-1433-446a-a059-de3597eaca58',
// ],
// ],
// [
// '$addFields' => [
// 'record_month' => [
// '$cond' => [
// ['$eq' => [['$type' => '$formdata.record_date'], 'string']],
// [
// '$dateToString' => [
// 'format' => '%Y-%m',
// 'date' => [
// '$dateFromString' => ['dateString' => '$formdata.record_date'],
// ],
// ],
// ],
// [
// '$cond' => [
// ['$eq' => [['$type' => '$formdata.record_date'], 'date']],
// [
// '$dateToString' => [
// 'format' => '%Y-%m',
// 'date' => '$formdata.record_date',
// ],
// ],
// null,
// ],
// ],
// ],
// ],
// ],
// ],
// [
// '$project' => [
// 'record_month' => 1,
// 'user_id' => 1,
// 'goals' => [
// [
// 'goal_name' => 'Tour Plan Adherence',
// 'goal_value' => '$formdata.proficiency-goal_1_tour_plan_adherance',
// ],
// [
// 'goal_name' => 'Basic Working',
// 'goal_value' => '$formdata.proficiency-goal_2_basic_working',
// ],
// [
// 'goal_name' => 'Activations',
// 'goal_value' => '$formdata.proficiency-goal_3_activations',
// ],
// [
// 'goal_name' => 'In-clinic Effectiveness',
// 'goal_value' => '$formdata.proficiency-goal_4_in_clinic_effectiveness',
// ],
// [
// 'goal_name' => 'Spread of Performance',
// 'goal_value' => '$formdata.proficiency-goal_5_spread_of_performance',
// ],
// ],
// ],
// ],
// ['$unwind' => '$goals'],
// ['$match' => ['goals.goal_value' => ['$ne' => null]]],
// [
// '$group' => [
// '_id' => [
// 'month' => '$record_month',
// 'goal_name' => '$goals.goal_name',
// 'goal_value' => '$goals.goal_value',
// ],
// 'users' => ['$addToSet' => '$user_id'],
// ],
// ],
// [
// '$project' => [
// 'month' => '$_id.month',
// 'goal_name' => '$_id.goal_name',
// 'goal_value' => '$_id.goal_value',
// 'user_count' => ['$size' => '$users'],
// '_id' => 0,
// ],
// ],
// [
// '$group' => [
// '_id' => [
// 'month' => '$month',
// 'goal_name' => '$goal_name',
// ],
// 'values' => [
// '$push' => [
// 'goal_value' => '$goal_value',
// 'user_count' => '$user_count',
// ],
// ],
// ],
// ],
// [
// '$group' => [
// '_id' => '$_id.month',
// 'goals' => [
// '$push' => [
// 'k' => '$_id.goal_name',
// 'v' => '$values',
// ],
// ],
// ],
// ],
// [
// '$project' => [
// '_id' => 0,
// 'k' => '$_id',
// 'v' => [
// '$cond' => [
// [
// '$gt' => [
// [
// '$size' => [
// '$filter' => [
// 'input' => '$goals',
// 'as' => 'item',
// 'cond' => [
// '$and' => [['$ne' => ['$$item.k', null]], ['$ne' => ['$$item.v', null]]],
// ],
// ],
// ],
// ],
// 0,
// ],
// ],
// [
// '$arrayToObject' => [
// '$filter' => [
// 'input' => '$goals',
// 'as' => 'item',
// 'cond' => [
// '$and' => [['$ne' => ['$$item.k', null]], ['$ne' => ['$$item.v', null]]],
// ],
// ],
// ],
// ],
// new \stdClass(),
// ],
// ],
// ],
// ],
// [
// '$group' => [
// '_id' => null,
// 'entries' => [
// '$push' => [
// 'k' => '$k',
// 'v' => '$v',
// ],
// ],
// ],
// ],
// [
// '$replaceRoot' => [
// 'newRoot' => [
// '$arrayToObject' => '$entries',
// ],
// ],
// ],
// ],
// ];
// $rmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $rmCondition);
//echo "<pre>"; print_r($rmResponse); exit;
return $this->view('goalandproficiency')->with([
'title' => 'RM',
'response' => $rmResponse,
'goalsList' => $goalsList,
'base_url' => $this->_base_url,
'buttons' => $this->get_list_buttons(),
]);
}
protected function get_list_buttons()
{
return [['title' => 'Add New', 'link' => $this->_base_url . '/addnew'], ['title' => 'Export', 'link' => '/export']];
}
public function exportsbmaction(Request $request)
{
//ralised variables for partition, form_id, action plan label, and field names
$partition = 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$form_id = '1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active'
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
// Gene
$actionPlanLabel = 'action_plan_label';
// Generalised field names for action plan, timeline, and adherence
$actionPlanField = 'action_plan';
$timelineField = 'timeline_agreed_for_selected_action_plans_completion';
$adherenceField = 'adherance_to_action_plan';
// Generalised variable names for pipeline
$actionPlanArrayField = 'action_plan_array';
$actionKeyField = 'actionKey';
$actionLabelField = 'actionLabel';
$timelineKeyField = 'timelineKey';
$adherenceKeyRawField = 'adherenceKeyRaw';
$adherenceKeyField = 'adherenceKey';
$reqdataSBM = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
[
'$match' => $matchConditions,
],
[
'$addFields' => [
$actionPlanArrayField => [
'$let' => [
'vars' => ['ap' => '$formdata.' . $actionPlanField],
'in' => [
'$cond' => [
['$eq' => [['$type' => '$$ap'], 'array']],
'$$ap',
[
'$cond' => [['$eq' => [['$type' => '$$ap'], 'string']], ['$split' => ['$$ap', ',']], []],
],
],
],
],
],
],
],
[
'$unwind' => [
'path' => '$' . $actionPlanArrayField,
'preserveNullAndEmptyArrays' => false,
],
],
// Generalized: No mapping, just use the value as key and label
[
'$addFields' => [
$actionKeyField => '$' . $actionPlanArrayField,
$actionLabelField => '$' . $actionPlanArrayField,
],
],
[
'$addFields' => [
$timelineKeyField => ['$toLower' => ['$ifNull' => ['$formdata.' . $timelineField, '']]],
$adherenceKeyRawField => ['$toLower' => ['$ifNull' => ['$formdata.' . $adherenceField, '']]],
],
],
[
'$addFields' => [
$adherenceKeyField => [
'$cond' => [['$eq' => ['$' . $adherenceKeyRawField, 'staus_quo']], 'status_quo', '$' . $adherenceKeyRawField],
],
],
],
[
'$group' => [
'_id' => '$' . $actionKeyField,
'anyLabel' => ['$first' => '$' . $actionLabelField],
'total' => ['$sum' => 1],
'less_than_1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, 'less_than_1_month']], 1, 0]]],
'1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '1_month']], 1, 0]]],
'3_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '3_month']], 1, 0]]],
'6_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '6_month']], 1, 0]]],
'on_track' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'on_track']], 1, 0]]],
'needs_correction' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'needs_correction']], 1, 0]]],
'status_quo' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'status_quo']], 1, 0]]],
],
],
[
'$project' => array_merge([
'_id' => 0,
$actionPlanLabel => '$anyLabel',
'total' => 1,
'less_than_1_month' => 1,
'1_month' => 1,
'3_months' => 1,
'6_months' => 1,
'on_track' => 1,
'needs_correction' => 1,
'status_quo' => 1,
]),
],
[
'$sort' => ['total' => -1],
],
],
];
$sbmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $reqdataSBM);
$submissions = [];
$actionPlanItems = [
'100% adherence in Tour plan' => ['100_adherence_in_tour_plan'],
'95% MCL Coverage, Visit frequency >90%, 5% Non visited doctors' => ['95_mcl_coverage_visit_frequency_90_5_non_visited_doctors'],
'1 Camp & 4 Clinics' => ['1_camp_and_4_clinics', '1_camp_4_clinics'],
'Tab Detailing in doctor calls' => ['tab_detailing_in_doctor_calls'],
'New Conversions' => ['new_conversions'],
'MCL productivity' => ['mcl_productivity'],
'Others mention if any' => ['others_mention_if_any'],
];
// Build a reverse lookup: slug => action plan label
$slugToLabel = [];
foreach ($actionPlanItems as $label => $slugs) {
foreach ($slugs as $slug) {
$slugToLabel[$slug] = $label;
}
}
foreach ($sbmResponse->data->submissions as $submission) {
$slug = \Illuminate\Support\Str::slug($submission->{$actionPlanLabel}, '_');
// Find the matching action plan label for this slug
$matchedLabel = null;
foreach ($actionPlanItems as $label => $slugs) {
if (in_array($slug, $slugs)) {
$matchedLabel = $label;
break;
}
}
if ($matchedLabel === null) {
// If not matched, skip this submission
continue;
}
// Set the action plan label to the matched label (the key)
$submission->{$actionPlanLabel} = $matchedLabel;
if (isset($submissions[$matchedLabel])) {
// Merge all parameters (sum numeric values, keep latest for non-numeric)
foreach ($submission as $key => $value) {
if ($key === $actionPlanLabel) {
// Already set as matched label, skip
continue;
}
if (isset($submissions[$matchedLabel]->$key)) {
// If both are numeric, sum them
if (is_numeric($submissions[$matchedLabel]->$key) && is_numeric($value)) {
$submissions[$matchedLabel]->$key += $value;
} else {
// For non-numeric, keep the latest value (from $submission)
$submissions[$matchedLabel]->$key = $value;
}
} else {
// If key does not exist, just set it
$submissions[$matchedLabel]->$key = $value;
}
}
} else {
$submissions[$matchedLabel] = clone $submission;
}
}
$headers = [];
foreach ($submissions as $obj) {
$headers = array_unique(array_merge($headers, array_keys((array) $obj)));
}
$headers = array_values(array_unique(array_merge(['action_plan_label'], array_diff($headers, ['action_plan_label']))));
$formattedHeaders = array_map(function ($header) {
if ($header === 'action_plan_label') {
return 'SBM /ME Action Plan';
}
return ucwords(str_replace('_', ' ', $header));
}, $headers);
$exportData = [];
$exportData[] = $formattedHeaders;
foreach ($submissions as $obj) {
$row = [];
foreach ($headers as $field) {
$value = isset($obj->$field) ? $obj->$field : 0;
$row[] = $value === 0 || $value === '0' ? '0' : $value;
}
$exportData[] = $row;
}
$timestamp = date('d-m-y'); // e.g., 20250814_112530
$filename = "sbmme_actionplan_report_{$timestamp}.xlsx";
return Excel::download(new InvoicesExport($exportData), $filename);
}
public function exportrmaction(Request $request)
{
// Generalised variables for partition, form_id, action plan label, and field names
$partition = 'rapport-pulmocare-1742297848-159745be-ac42-413b-9aee-31466671011e';
$form_id = '1742297848-159745be-ac42-413b-9aee-31466671011e';
$actionPlanLabel = 'action_plan_label';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active'
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
// Generalised field names for action plan, timeline, and adherence
$actionPlanField = 'action_plan';
$timelineField = 'timeline_agreed_for_selected_action_plans_completion';
$adherenceField = 'adherance_to_action_plan';
// Generalised variable names for pipeline
$actionPlanArrayField = 'action_plan_array';
$actionKeyField = 'actionKey';
$actionLabelField = 'actionLabel';
$timelineKeyField = 'timelineKey';
$adherenceKeyRawField = 'adherenceKeyRaw';
$adherenceKeyField = 'adherenceKey';
$reqdataRM = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
[
'$match' => $matchConditions,
],
[
'$addFields' => [
$actionPlanArrayField => [
'$let' => [
'vars' => ['ap' => '$formdata.' . $actionPlanField],
'in' => [
'$cond' => [
['$eq' => [['$type' => '$$ap'], 'array']],
'$$ap',
[
'$cond' => [['$eq' => [['$type' => '$$ap'], 'string']], ['$split' => ['$$ap', ',']], []],
],
],
],
],
],
],
],
[
'$unwind' => [
'path' => '$' . $actionPlanArrayField,
'preserveNullAndEmptyArrays' => false,
],
],
// Generalized: No mapping, just use the value as key and label
[
'$addFields' => [
$actionKeyField => '$' . $actionPlanArrayField,
$actionLabelField => '$' . $actionPlanArrayField,
],
],
[
'$addFields' => [
$timelineKeyField => ['$toLower' => ['$ifNull' => ['$formdata.' . $timelineField, '']]],
$adherenceKeyRawField => ['$toLower' => ['$ifNull' => ['$formdata.' . $adherenceField, '']]],
],
],
[
'$addFields' => [
$adherenceKeyField => [
'$cond' => [['$eq' => ['$' . $adherenceKeyRawField, 'staus_quo']], 'status_quo', '$' . $adherenceKeyRawField],
],
],
],
[
'$group' => [
'_id' => '$' . $actionKeyField,
'anyLabel' => ['$first' => '$' . $actionLabelField],
'total' => ['$sum' => 1],
'less_than_1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, 'less_than_1_month']], 1, 0]]],
'1_month' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '1_month']], 1, 0]]],
'3_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '3_month']], 1, 0]]],
'6_months' => ['$sum' => ['$cond' => [['$eq' => ['$' . $timelineKeyField, '6_month']], 1, 0]]],
'on_track' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'on_track']], 1, 0]]],
'needs_correction' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'needs_correction']], 1, 0]]],
'status_quo' => ['$sum' => ['$cond' => [['$eq' => ['$' . $adherenceKeyField, 'status_quo']], 1, 0]]],
],
],
[
'$project' => array_merge([
'_id' => 0,
$actionPlanLabel => '$anyLabel',
'total' => 1,
'less_than_1_month' => 1,
'1_month' => 1,
'3_months' => 1,
'6_months' => 1,
'on_track' => 1,
'needs_correction' => 1,
'status_quo' => 1,
]),
],
[
'$sort' => ['total' => -1],
],
],
];
$sbmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $reqdataRM);
$submissions = [];
$actionPlanItems = [
'Tour Plan adherence of Team' => ['tour_plan_adherence_of_team'],
'100% Spread of performance' => ['100_spread_of_performance'],
'100% RM Region Target achievement' => ['100_rm_region_target_achievement'],
'SOP at Mandate Brand performance' => ['sop_at_mandate_brand_performance'],
'RM Mandate Target Achievement' => ['rm_mandate_target_achievement'],
'SOP at NI Brand performance' => ['sop_at_ni_brand_performance'],
'RM NI Target Achievement' => ['rm_ni_target_achievement'],
'Stretch working with SBMs' => ['stretch_working_with_sbms'],
'Critical Geography time allocation' => ['critical_geography_time_allocation'],
'Critical geography Revival' => ['critical_geography_revival'],
'Covering all Sponsored doctors' => ['covering_all_sponsored_doctors'],
'Ensuring equal spread at all doctors' => ['ensuring_equal_spread_at_all_doctors'],
'Ensuring 1:5 times ROI from Sponsored doctors' => ['ensuring_1_5_times_roi_from_sponsored_doctors'],
'Others' => ['others'],
];
// Build a reverse lookup: slug => action plan label
$slugToLabel = [];
foreach ($actionPlanItems as $label => $slugs) {
foreach ($slugs as $slug) {
$slugToLabel[$slug] = $label;
}
}
foreach ($sbmResponse->data->submissions as $submission) {
$slug = \Illuminate\Support\Str::slug($submission->{$actionPlanLabel}, '_');
// Find the matching action plan label for this slug
$matchedLabel = null;
foreach ($actionPlanItems as $label => $slugs) {
if (in_array($slug, $slugs)) {
$matchedLabel = $label;
break;
}
}
if ($matchedLabel === null) {
// If not matched, skip this submission
continue;
}
// Set the action plan label to the matched label (the key)
$submission->{$actionPlanLabel} = $matchedLabel;
if (isset($submissions[$matchedLabel])) {
// Merge all parameters (sum numeric values, keep latest for non-numeric)
foreach ($submission as $key => $value) {
if ($key === $actionPlanLabel) {
// Already set as matched label, skip
continue;
}
if (isset($submissions[$matchedLabel]->$key)) {
// If both are numeric, sum them
if (is_numeric($submissions[$matchedLabel]->$key) && is_numeric($value)) {
$submissions[$matchedLabel]->$key += $value;
} else {
// For non-numeric, keep the latest value (from $submission)
$submissions[$matchedLabel]->$key = $value;
}
} else {
// If key does not exist, just set it
$submissions[$matchedLabel]->$key = $value;
}
}
} else {
$submissions[$matchedLabel] = clone $submission;
}
}
$headers = [];
$firstObj = reset($submissions);
$headers = array_keys((array) $firstObj);
$headers = array_diff($headers, ['action_plan_label']);
$headers = array_merge(['action_plan_label'], $headers);
$formattedHeaders = array_map(function ($header) {
if ($header === 'action_plan_label') {
return 'RM Action Plan';
}
return ucwords(str_replace('_', ' ', $header));
}, $headers);
$exportData = [];
$exportData[] = $formattedHeaders;
foreach ($submissions as $label => $obj) {
$row = [];
foreach ($headers as $field) {
if ($field === 'action_plan_label') {
$row[] = $label;
} else {
$value = isset($obj->$field) ? $obj->$field : 0;
$row[] = $value === 0 || $value === '0' ? '0' : $value;
}
}
$exportData[] = $row;
}
$timestamp = date('d-m-y');
$filename = "rm_actionplan_report_{$timestamp}.xlsx";
return Excel::download(new InvoicesExport($exportData), $filename);
}
public function exportsbmgoals(Request $request)
{
$partition = 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$form_id = '1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active',
'is_deleted' => ['$ne' => true]
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$sbmCondition = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
// 1) Slice
[
'$match' => $matchConditions,
],
// 2) Build record_month from record_date → formdata.record_date (string/date) → createdAt
[
'$addFields' => [
'_m_from_record_date' => [
'$cond' => [['$eq' => [['$type' => '$record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$record_date']], 0, 7]], null],
],
'_m_from_formdata_str' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'string']], ['$substr' => ['$formdata.record_date', 0, 7]], null],
],
'_m_from_formdata_date' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$formdata.record_date']], 0, 7]], null],
],
'_m_from_createdAt' => [
'$cond' => [['$eq' => [['$type' => '$createdAt'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$createdAt']], 0, 7]], null],
],
],
],
[
'$addFields' => [
'record_month' => [
'$ifNull' => [
'$_m_from_record_date',
[
'$ifNull' => [
'$_m_from_formdata_str',
[
'$ifNull' => ['$_m_from_formdata_date', '$_m_from_createdAt'],
],
],
],
],
],
],
],
// 3) Fan out goals
[
'$project' => [
'record_month' => 1,
'user_id' => 1,
'goals' => [
[
'goal_name' => 'Tour Plan Adherence',
'goal_value' => '$formdata.proficiency-goal_1_tour_plan_adherance',
],
[
'goal_name' => 'Basic Working',
'goal_value' => '$formdata.proficiency-goal_2_basic_working',
],
[
'goal_name' => 'Activations',
'goal_value' => '$formdata.proficiency-goal_3_activations',
],
[
'goal_name' => 'In-clinic Effectiveness',
'goal_value' => '$formdata.proficiency-goal_4_in_clinic_effectiveness',
],
[
'goal_name' => 'Spread of Performance',
'goal_value' => '$formdata.proficiency-goal_5_spread_of_performance',
],
],
],
],
['$unwind' => '$goals'],
[
'$match' => [
'record_month' => ['$ne' => null],
'goals.goal_value' => ['$ne' => null],
],
],
// 4) NORMALIZE labels → Proficient / Competent / Intermediate / Beginner
// Works for values like "A - Proficient", "B - Competent", "C ...", "D ..." etc.
[
'$addFields' => [
'goals.goal_value_norm' => [
'$switch' => [
'branches' => [['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'A']], 'then' => 'Proficient'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'B']], 'then' => 'Competent'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'C']], 'then' => 'Intermediate'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'D']], 'then' => 'Beginner']],
// if already a clean label or unexpected, keep original
'default' => '$goals.goal_value',
],
],
],
],
// 5) Count unique users per month+goal+normalized_label
[
'$group' => [
'_id' => [
'month' => '$record_month',
'goal_name' => '$goals.goal_name',
'goal_value' => '$goals.goal_value_norm',
],
'users' => ['$addToSet' => '$user_id'],
],
],
[
'$project' => [
'_id' => 0,
'month' => '$_id.month',
'goal_name' => '$_id.goal_name',
'goal_value' => '$_id.goal_value',
'user_count' => ['$size' => '$users'],
],
],
// 6) Nest by goal within month
[
'$group' => [
'_id' => ['month' => '$month', 'goal_name' => '$goal_name'],
'values' => [
'$push' => [
'goal_value' => '$goal_value',
'user_count' => '$user_count',
],
],
],
],
[
'$group' => [
'_id' => '$_id.month',
'goals' => [
'$push' => [
'k' => '$_id.goal_name',
'v' => '$values',
],
],
],
],
[
'$project' => [
'_id' => 0,
'k' => '$_id',
'v' => [
'$arrayToObject' => [
'$filter' => [
'input' => '$goals',
'as' => 'item',
'cond' => [
'$and' => [['$ne' => ['$$item.k', null]], ['$ne' => ['$$item.v', null]]],
],
],
],
],
],
],
// 7) Collapse to { "YYYY-MM": { Goal 1: [...], Goal 2: [...] }, ... }
[
'$group' => [
'_id' => null,
'entries' => [
'$push' => ['k' => '$k', 'v' => '$v'],
],
],
],
[
'$replaceRoot' => [
'newRoot' => ['$arrayToObject' => '$entries'],
],
],
],
];
$sbmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $sbmCondition);
$submissions = $sbmResponse->data->submissions;
$goalsList = ['Tour Plan Adherence', 'Basic Working', 'Activations', 'In-clinic Effectiveness', 'Spread of Performance'];
$goalValues = ['Proficient', 'Competent', 'Intermediate', 'Beginner'];
$allMonths = [];
foreach ($submissions as $submissionObj) {
foreach ($submissionObj as $month => $goalsObj) {
$allMonths[] = $month;
}
}
$allMonths = array_unique($allMonths);
usort($allMonths, function ($a, $b) {
return strtotime($a) <=> strtotime($b);
});
$headerRow1 = ['SBM/ME Goals'];
$headerRow2 = [''];
foreach ($allMonths as $month) {
$formattedMonth = Carbon::createFromFormat('Y-m', $month)->format('M-Y');
$headerRow1 = array_merge($headerRow1, array_fill(0, count($goalValues), $formattedMonth));
$headerRow2 = array_merge($headerRow2, $goalValues);
}
$data = [];
$data[] = $headerRow1;
$data[] = $headerRow2;
foreach ($goalsList as $goal) {
$row = [$goal];
foreach ($allMonths as $month) {
$counts = array_fill_keys($goalValues, 0);
foreach ($submissions as $submissionObj) {
if (isset($submissionObj->{$month}) && isset($submissionObj->{$month}->{$goal})) {
foreach ($submissionObj->{$month}->{$goal} as $item) {
$counts[$item->goal_value] = $item->user_count;
}
break;
}
}
foreach ($goalValues as $gv) {
$value = isset($counts[$gv]) ? $counts[$gv] : 0;
$row[] = $value === 0 || $value === '0' ? '0' : $value;
}
}
$data[] = $row;
}
$timestamp = date('d-m-y');
$filename = "sbm_goalproficiency_report_{$timestamp}.xlsx";
return Excel::download(new \App\Exports\InvoicesExport($data), $filename);
}
public function exportrmgoals(Request $request)
{
$partition = 'rapport-pulmocare-1742297848-159745be-ac42-413b-9aee-31466671011e';
$form_id = '1742297848-159745be-ac42-413b-9aee-31466671011e';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active',
'is_deleted' => ['$ne' => true]
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$rmCondition = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
// 1) Slice
[
'$match' => $matchConditions,
],
// 2) Build record_month from record_date → formdata.record_date (string/date) → createdAt
[
'$addFields' => [
'_m_from_record_date' => [
'$cond' => [['$eq' => [['$type' => '$record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$record_date']], 0, 7]], null],
],
'_m_from_formdata_str' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'string']], ['$substr' => ['$formdata.record_date', 0, 7]], null],
],
'_m_from_formdata_date' => [
'$cond' => [['$eq' => [['$type' => '$formdata.record_date'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$formdata.record_date']], 0, 7]], null],
],
'_m_from_createdAt' => [
'$cond' => [['$eq' => [['$type' => '$createdAt'], 'date']], ['$substr' => [['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$createdAt']], 0, 7]], null],
],
],
],
[
'$addFields' => [
'record_month' => [
'$ifNull' => [
'$_m_from_record_date',
[
'$ifNull' => [
'$_m_from_formdata_str',
[
'$ifNull' => ['$_m_from_formdata_date', '$_m_from_createdAt'],
],
],
],
],
],
],
],
// 3) Fan out goals
[
'$project' => [
'record_month' => 1,
'user_id' => 1,
'goals' => [
[
'goal_name' => 'Tour Plan Adherence Self & Team',
'goal_value' => '$formdata.proficiency-goal_1_tour_plan_adherence_self_and_team',
],
[
'goal_name' => 'Spread of Performance',
'goal_value' => '$formdata.proficiency-goal_2_spread_of_performance',
],
[
'goal_name' => 'Joint Field Work',
'goal_value' => '$formdata.proficiency-goal_3_joint_field_work',
],
[
'goal_name' => 'KOL Engagement & ROI',
'goal_value' => '$formdata.proficiency-goal_4_kol_engagement_and_roi',
],
// [
// 'goal_name' => 'Spread of Performance',
// 'goal_value' => '$formdata.proficiency-goal_5_spread_of_performance',
// ],
],
],
],
['$unwind' => '$goals'],
[
'$match' => [
'record_month' => ['$ne' => null],
'goals.goal_value' => ['$ne' => null],
],
],
// 4) NORMALIZE labels → Proficient / Competent / Intermediate / Beginner
// Works for values like "A - Proficient", "B - Competent", "C ...", "D ..." etc.
[
'$addFields' => [
'goals.goal_value_norm' => [
'$switch' => [
'branches' => [['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'A']], 'then' => 'Proficient'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'B']], 'then' => 'Competent'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'C']], 'then' => 'Intermediate'], ['case' => ['$eq' => [['$substr' => ['$goals.goal_value', 0, 1]], 'D']], 'then' => 'Beginner']],
// if already a clean label or unexpected, keep original
'default' => '$goals.goal_value',
],
],
],
],
// 5) Count unique users per month+goal+normalized_label
[
'$group' => [
'_id' => [
'month' => '$record_month',
'goal_name' => '$goals.goal_name',
'goal_value' => '$goals.goal_value_norm',
],
'users' => ['$addToSet' => '$user_id'],
],
],
[
'$project' => [
'_id' => 0,
'month' => '$_id.month',
'goal_name' => '$_id.goal_name',
'goal_value' => '$_id.goal_value',
'user_count' => ['$size' => '$users'],
],
],
// 6) Nest by goal within month
[
'$group' => [
'_id' => ['month' => '$month', 'goal_name' => '$goal_name'],
'values' => [
'$push' => [
'goal_value' => '$goal_value',
'user_count' => '$user_count',
],
],
],
],
[
'$group' => [
'_id' => '$_id.month',
'goals' => [
'$push' => [
'k' => '$_id.goal_name',
'v' => '$values',
],
],
],
],
[
'$project' => [
'_id' => 0,
'k' => '$_id',
'v' => [
'$arrayToObject' => [
'$filter' => [
'input' => '$goals',
'as' => 'item',
'cond' => [
'$and' => [['$ne' => ['$$item.k', null]], ['$ne' => ['$$item.v', null]]],
],
],
],
],
],
],
// 7) Collapse to { "YYYY-MM": { Goal 1: [...], Goal 2: [...] }, ... }
[
'$group' => [
'_id' => null,
'entries' => [
'$push' => ['k' => '$k', 'v' => '$v'],
],
],
],
[
'$replaceRoot' => [
'newRoot' => ['$arrayToObject' => '$entries'],
],
],
],
];
$rmResponse = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $rmCondition);
$goalsList = ['Tour Plan Adherence Self & Team', 'Spread of Performance', 'Joint Field Work', 'KOL Engagement & ROI'];
$goalValues = ['Proficient', 'Competent', 'Intermediate', 'Beginner'];
// echo '<pre>';
// print_r($rmResponse);
// exit();
// echo '<pre>';
// print_r($goalsList);
// exit();
$submissions = $rmResponse->data->submissions;
$allMonths = [];
foreach ($submissions as $submissionObj) {
foreach ($submissionObj as $month => $goalsObj) {
$allMonths[] = $month;
}
}
$allMonths = array_unique($allMonths);
usort($allMonths, function ($a, $b) {
return strtotime($a) <=> strtotime($b);
});
$headerRow1 = ['RM Goals'];
$headerRow2 = [''];
foreach ($allMonths as $month) {
$formattedMonth = Carbon::createFromFormat('Y-m', $month)->format('M-Y');
$headerRow1 = array_merge($headerRow1, array_fill(0, count($goalValues), $formattedMonth));
$headerRow2 = array_merge($headerRow2, $goalValues);
}
$data = [];
$data[] = $headerRow1;
$data[] = $headerRow2;
foreach ($goalsList as $goal) {
$row = [$goal];
foreach ($allMonths as $month) {
$counts = array_fill_keys($goalValues, 0);
foreach ($submissions as $submissionObj) {
if (isset($submissionObj->{$month}) && isset($submissionObj->{$month}->{$goal})) {
foreach ($submissionObj->{$month}->{$goal} as $item) {
$counts[$item->goal_value] = $item->user_count;
}
break;
}
}
foreach ($goalValues as $gv) {
$value = isset($counts[$gv]) ? $counts[$gv] : 0;
$row[] = $value === 0 || $value === '0' ? '0' : $value;
}
}
$data[] = $row;
}
$timestamp = date('d-m-y');
$filename = "rm_goalproficiency_report_{$timestamp}.xlsx";
return Excel::download(new \App\Exports\InvoicesExport($data), $filename);
}
public function coacheereport()
{
$partition = 'rapport-pulmocare-1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$form_id = '1742292203-0153c37f-1433-446a-a059-de3597eaca58';
$permissions = json_decode(Auth::user()->permissions);
$matchConditions = [
'partition' => $partition,
'form_id' => $form_id,
'status' => 'active',
];
$allhierarchy = [];
if(!in_array('all_data_access', $permissions)){
$hierarchyResponse = LambdaRequest::signedrequest('get', 'ums', 'hierarchy/hierarchy_below_me', []);
foreach($hierarchyResponse->data->hierarchies as $hier){
$allhierarchy[] = $hier->id;
}
$matchConditions['hierarchy_id'] = ['$in' => $allhierarchy];
}
$reqdataCoache = [
'partition' => $partition,
'form_id' => $form_id,
'pipeline' => [
[
'$match' => $matchConditions,
],
[
'$project' => [
'_id' => 0,
'user_id' => '$user_id',
'status' => '$status',
'select_month' => '$formdata.select_month',
'adherance_to_action_plan' => '$formdata.adherance_to_action_plan',
'user_name' => '$user_info.name',
'record_date' => '$formdata.record_date',
'select_role' => '$formdata.select_role',
'createdAt' => '$createdAt',
],
],
[
'$match' => [
'adherance_to_action_plan' => ['$exists' => true, '$ne' => null],
],
],
// sort by user + month + createdAt descending (latest first)
[
'$sort' => [
'user_id' => 1,
'select_month' => 1,
'createdAt' => -1,
],
],
// group by user + month + adherence, keep latest record
[
'$group' => [
'_id' => [
'user_id' => '$user_id',
'select_month' => '$select_month',
'adherance_to_action_plan' => '$adherance_to_action_plan',
],
'user_id' => ['$first' => '$user_id'],
'status' => ['$first' => '$status'],
'select_month' => ['$first' => '$select_month'],
'adherance_to_action_plan' => ['$first' => '$adherance_to_action_plan'],
'user_name' => ['$first' => '$user_name'],
'record_date' => ['$first' => '$record_date'],
'select_role' => ['$first' => '$select_role'],
'createdAt' => ['$first' => '$createdAt'],
],
],
// optional: sort final results
[
'$sort' => [
'user_id' => 1,
'select_month' => 1,
],
],
],
];
$response = LambdaRequest::signedrequest('post', $this->_service, $this->_module . '/submission_aggregation', $reqdataCoache);
echo '<pre>';
print_r($response);
exit();
$groupedData = [];
foreach ($response->data->submissions as $submission) {
$userId = $submission->user_id;
if (!isset($groupedData[$userId])) {
$groupedData[$userId] = [
'user_name' => $submission->user_name,
'select_role' => $submission->select_role,
'months' => [],
];
}
$monthMapping = [
'June 25' => "Jun'25",
'July 25' => "Jul'25",
'August 25' => "Aug'25",
'September 25' => "Sep'25",
];
$headerMonth = $monthMapping[$submission->select_month] ?? $submission->select_month;
$groupedData[$userId]['months'][$headerMonth] = $submission->adherance_to_action_plan;
}
return $this->view('cochee')->with([
'title' => 'Cochee',
'response' => $groupedData,
'base_url' => $this->_base_url,
'buttons' => $this->get_list_buttons(),
]);
}
}