middleware('auth'); $this->_service = 'metric'; $this->_module = 'metric_view'; $this->_viewname = 'metricview'; $this->_title = 'Metric View'; $this->_base_url = '/metricview'; } public function duplicate(Request $request) { $this->_request = $request; $id = $request->input('id'); if (!$id) { return redirect($this->_base_url.'s')->withError('Invalid metric view'); } $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/get_one', ['id' => $id]); if (isset($response->statusCode) && $response->statusCode == 401) { return redirect('/unauthorised'); } $values = $response->data->item ?? null; if (!$values) { return redirect($this->_base_url.'s')->withError('Metric view not found'); } $values = $this->_beforeform('edit', $values); $values->id = ''; if (isset($values->name)) { $values->name = $values->name.' (Copy)'; } $request->merge(['type' => $values->type ?? '']); $fields = $this->get_form_fields('edit', $values); return $this->view('form')->with([ 'title' => $this->_title, 'mode' => 'edit', 'fields' => $fields, 'base_url' => $this->_base_url, 'item' => $values, 'form_action' => $this->_base_url.'/addnew', ]); } public function form($type, $id = null) { $values = []; if ($type === 'edit') { $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/get_one', ['id' => $id]); $values = $response->data->item; } $values = $this->_beforeform($type, $values); $fields = $this->get_form_fields($type, $values); return $this->view('form')->with([ 'title' => $this->_title, 'mode' => $type, 'fields' => $fields, 'base_url' => $this->_base_url, 'item' => $values, ]); } public function list(Request $request) { $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module.'/get_all'); $roleMap = $this->getRoleNameMap(); foreach($response->data->items as &$item) { $item->validity_start = date("m/d/Y", strtotime($item->validity_start)); $item->validity_end = date("m/d/Y", strtotime($item->validity_end)); if (!isset($item->sort_order) || $item->sort_order === null || $item->sort_order === '') { $item->sort_order = isset($item->widget_sort_order) ? $item->widget_sort_order : 0; } $item->roles = $this->formatAssignedRoles($item->designations ?? ($item->roles ?? ''), $roleMap); } unset($item); $fields = $this->get_list_fields(); return $this->view('list')->with([ 'title' => $this->_title, 'fields' => $fields, 'base_url' => $this->_base_url, 'items' => $response->data->items, 'buttons' => $this->get_list_buttons() ]); } protected function get_list_fields(){ return [ 'actions' => ['title' => 'Actions', 'buttons' => [ 'edit', 'duplicate' => ['icon' => 'content-copy text-info', 'querystring' => 'id={ID}'], 'delete' ] ], 'name' => ['title' => 'Name', 'type' => 'text'], 'type' => ['title' => 'Type', 'type' => 'text'], 'roles' => ['title' => 'Roles', 'type' => 'text'], 'sort_order' => ['title' => 'Sort Order', 'type' => 'number'], 'validity_start' => ['title' => 'Validity start', 'type' => 'text'], 'validity_end' => ['title' => 'Validity end', 'type' => 'text'], 'agg_type' => ['title' => 'Aggregation type', 'type' => 'text'], 'status' => ['title' => 'Status', 'type' => 'select'], ]; } protected function get_list_buttons() { return [ ['title' => 'Add A vs B', 'link' => $this->_base_url.'/addnew?type=verses' ], ['title' => 'Add Grouped', 'link' => $this->_base_url.'/addnew?type=grouped' ], ['title' => 'Add Simple', 'link' => $this->_base_url.'/addnew?type=simple' ] ]; } protected function get_form_fields($type, $values){ $metrics = $this->getlambda('get', 'metric', 'metric', 'get_all'); $metrics_dd = []; foreach($metrics->data->items as $metric){ $metrics_dd[$metric->id] = $metric->name; } // $domain = LambdaRequest::signedrequest('get', 'ums', 'domain/get_one'); // //echo '
'; print_r($domain); exit;
// $designations_dd = [];
// foreach($domain->data->item->designations as $designation){
// $designations_dd[$designation] = $designation;
// }
//echo ''; print_r($values); exit;
$roles = $this->getlambda('get', 'ums', 'roles', 'dropdown');
$roles_dd = [];
foreach($roles->data->items as $role){
$roles_dd[$role->id] = $role->name;
}
$coattr = $this->getlambda('get', 'contact', 'contactattribute', 'get_all');
$coattr_dd = [];
foreach($coattr->data->items as $coatt){
$coattr_dd[$coatt->code] = $coatt->attribute;
}
$userattr_dd = $this->getUserAttributeOptions();
//echo ''; print_r($coattr_dd); exit;
$viewType = $type === 'edit'
? ($this->_request->input('type') ?: ($values->type ?? ''))
: ($this->_request->input('type') ?: 'simple');
$fields = [
'id' => ['title' => '', 'type' => 'hidden'],
'name' => ['title' => 'Name', 'type' => 'text', 'required' => true],
'type' => ['title' => 'Type', 'type' => 'select', 'required' => true, 'values' => ['simple' => 'Simple', 'grouped' => 'Grouped', 'verses' => 'A vs B'] ],
'validity_start' => ['title' => 'Validity start', 'type' => 'date', 'required' => true],
'validity_end' => ['title' => 'Validity end', 'type' => 'date', 'required' => true],
'designations' => ['title' => 'Publish to Roles', 'type' => 'multiselect', 'values' => $roles_dd, 'required' => true]
];
if($viewType === 'simple') {
$fields['metric'] = ['title' => 'Choose Metric', 'type' => 'select', 'required' => true, 'values' => $metrics_dd ];
$fields['display_unit'] = ['title' => 'Display Unit', 'type' => 'text', 'required' => true];
if($type == 'edit') {
$values->metric = $values->metrics[0]->metric;
$values->display_unit = $values->metrics[0]->display;
unset($values->metrics);
}
} else if($viewType === 'verses') {
$fields['metric[0]'] = ['title' => 'Choose Metric 1', 'type' => 'select', 'required' => true, 'values' => $metrics_dd ];
$fields['display_unit[0]'] = ['title' => 'Metric 1 Display Unit', 'type' => 'text', 'required' => true];
$fields['metric[1]'] = ['title' => 'Choose Metric 2', 'type' => 'select', 'required' => true, 'values' => array_merge($metrics_dd, ['fixed' => 'Fixed Value']) ];
$fields['display_unit[1]'] = ['title' => 'Metric 2 Display Unit', 'type' => 'text', 'required' => true];
$fields['fixed_metric'] = ['title' => 'Fixed Metric value if selected', 'type' => 'text', 'required' => true];
$fields['max_value_color'] = ['title' => 'Max Value Color', 'type' => 'color', 'required' => false];
$fields['color_ranges'] = ['title' => 'Color Ranges (%)', 'type' => 'color_ranges', 'fullwidth' => true];
$fields['list_chart_type'] = [
'title' => 'List Chart Type',
'type' => 'select',
'required' => true,
'values' => [
'donut' => 'Donut',
'progressbar' => 'Progress Bar',
'horizontal_barchart' => 'Horizontal Bar Chart',
'vertical_barchart' => 'Vertical Bar Chart',
],
];
if($type == 'edit') {
$values->{'metric[0]'} = $values->metrics[0]->metric;
$values->{'display_unit[0]'} = $values->metrics[0]->display;
$values->{'metric[1]'} = $values->metrics[1]->metric;
$values->{'display_unit[1]'} = $values->metrics[1]->display;
unset($values->metrics);
}
} else {
$fields['metrics'] = ['title' => 'Choose Metric', 'type' => 'mapping', 'required' => true, 'metrics' => $metrics_dd, 'types' => ['unit' => 'Units', 'count' => 'Count'] , 'fullwidth' => true ];
}
$fields = array_merge($fields,
[
'operation' => ['title' => 'Operation', 'type' => 'select', 'required' => true, 'values' => ['sum' => 'Sum', 'avg' => 'Avg', 'value_count' => 'Count'] ],
'agg_type' => ['title' => 'Aggregation Type', 'type' => 'select', 'required' => true, 'values' => ['individual' => 'Individual', 'team' => 'Team'] ],
'graphical_views' => ['title' => 'Graphical views', 'type' => 'multiselect', 'values' => ['progress' => 'Progress', 'percentile' => 'Percentile', 'pie' => 'Pie chart', 'bar' => 'Bar chart', 'line' => 'Line chart'] ],
'value_views' => ['title' => 'Value views', 'type' => 'multiselect', 'values' => ['value' => 'Value'] ],
'details_views' => ['title' => 'Details views', 'type' => 'multiselect', 'values' => ['tabular' => 'Tabular', 'contacts' => 'Doctor View', 'incremental' => 'Incremental View'] ],
'trend_views' => ['title' => 'Trend views', 'type' => 'multiselect', 'values' => ['bar' => 'Bar chart', 'line' => 'Line chart', 'tabular' => 'Tabular'] ],
'leaderboard_views' => ['title' => 'My Team views', 'type' => 'multiselect', 'values' => ['leaderboard' => 'My Team View'] ],
'scoreboard_views' => ['title' => 'Leaderboard views', 'type' => 'multiselect', 'values' => ['leaderboard' => 'Leaderboard View'] ],
'contacts_views' => ['title' => 'Doctor views', 'type' => 'multiselect', 'values' => ['contacts' => 'Doctor View'] ],
'doctor_view_name' => ['title' => 'Enter Doctor View Name', 'type' => 'text', 'required' => false ],
'intervals' => ['title' => 'Intervals', 'type' => 'multiselect', 'required' => true, 'values' => ['yearlycy' => 'Calender Year', 'yearlyfy' => 'Financial Year', 'monthly' => 'Monthly', 'weekly' => 'Weekly', 'daily' => 'Daily'] ],
'default_interval' => ['title' => 'Default Interval', 'type' => 'select', 'required' => true, 'values' => ['month-0' => 'This Month','month-1' => 'Last Month','month-3' => 'Last 3 Months','month-6' => 'Last 6 Months','month-12' => 'Last 12 Months','day-0' => 'Today','day-1' => 'Yesterday','day-7' => 'Last 7 Days','day-30' => 'Last 30 Days','week-0' => 'This week','week-1' => 'Last week','week-2' => '-2 week','week-3' => '-3 week','week-4' => '-4 week','yearfy-0' => 'This Financial Year','yearfy-1' => 'Last Financial Year','yearcy-0' => 'This Calender Year','yearcy-1' => 'Last Calender Year'] ],
'default_tab' => ['title' => 'Default Tab', 'type' => 'select', 'required' => false, 'values' => ['value' => 'Value', 'trend' => 'Trend', 'details' => 'Detail', 'leaderboard' => 'My Team', 'scoreboard' => 'Leaderboard', 'contacts' => 'Doctor List', 'incremental' => 'Incremental'] ],
'widget_sort_order' => ['title' => 'Sort Order', 'type' => 'number', 'required' => true],
'doctor_type' => ['title' => 'Doctor Type', 'type' => 'text', 'required' => false],
'combined_metrics' => ['title' => 'Combined Metrics (if any)', 'type' => 'combined_metrics', 'fullwidth' => true ],
'report_roles' => ['title' => 'Data Report from Roles', 'type' => 'multiselect', 'values' => $roles_dd, 'required' => true],
'team_leaderboard_widget_roles' => ['title' => 'Team Leaderboard Widget Roles', 'type' => 'multiselect', 'values' => $roles_dd, 'required' => false],
'status' => ['title' => 'Status', 'type' => 'select', 'required' => true, 'values' => ['active' => 'Active', 'disabled' => 'Disabled'] ],
'show_positions' => ['title' => 'Show Positions', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No'] ],
'stateheadwise_leaderboard' => ['title' => 'Stateheadwise Leaderboard', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No'], 'default' => 'no'],
'show_positions_type' => ['title' => 'Show Positions Type', 'type' => 'select', 'required' => true, 'values' => ['all' => 'All', 'loggedin' => 'Logged In'] ],
'contact_attributes' => ['title' => 'Include Doctor Attributes', 'type' => 'multiselect', 'values' => $coattr_dd],
'show_user_attributes' => ['title' => 'Show User Attributes', 'type' => 'yesno', 'required' => true, 'default' => 'no'],
'user_attributes' => ['title' => 'Include User Attributes', 'type' => 'multiselect', 'values' => $userattr_dd, 'default' => []],
]);
return $fields;
}
protected function _beforesave($type, $request) {
$data = $request->except('_token');
// echo ''; print_r($data); exit;
$data['type'] = $request->input('type', $data['type'] ?? 'simple');
$mainSortOrder = isset($data['widget_sort_order']) && !is_array($data['widget_sort_order'])
? (int) $data['widget_sort_order']
: 0;
$data['metrics'] = [];
if($data['type'] === 'simple') {
$data['metrics'][] = ['metric' => $data['metric'], 'display' => $data['display_unit'] ];
} else if($data['type'] === 'verses') {
$data['metrics'][] = ['metric' => $data['metric'][0], 'display' => $data['display_unit'][0] ];
$data['metrics'][] = ['metric' => $data['metric'][1], 'display' => $data['display_unit'][1] ];
} else {
foreach($data['metric'] as $k => $metric) {
$data['metrics'][] = [
'metric' => $metric,
'display' => $data['display_unit'][$k],
'sort_order' => isset($data['sort_order'][$k]) ? $data['sort_order'][$k] : 0,
'list_view' => isset($data['list_view'][$k]) ? $data['list_view'][$k] : 'yes',
'weight' => isset($data['weight'][$k]) ? $data['weight'][$k] : 1,
];
}
}
$combined_metrics = [];
if(isset($data['combined_metrics']) && sizeof($data['combined_metrics']) > 0) {
foreach($data['combined_metrics']['type'] as $i => $v) {
$combined_metrics[] = ['type' => $v, 'title' => $data['combined_metrics']['title'][$i], 'fields' => isset($data['combined_metrics']['fields'][$i]) ? $data['combined_metrics']['fields'][$i] : '', 'list_view' => isset($data['combined_metrics']['list_view'][$i]) ? $data['combined_metrics']['list_view'][$i] : 'yes' ];
}
}
$data['combined_metrics'] = json_encode($combined_metrics);
$data['widget_sort_order'] = $mainSortOrder;
$data['sort_order'] = $mainSortOrder;
if (($data['type'] ?? '') === 'verses') {
$data['max_value_color'] = trim((string) ($data['max_value_color'] ?? ''));
$ranges = [];
$rawRanges = $data['color_ranges'] ?? null;
if (is_array($rawRanges) && isset($rawRanges['min']) && is_array($rawRanges['min'])) {
foreach ($rawRanges['min'] as $i => $min) {
$max = $rawRanges['max'][$i] ?? '';
$color = trim((string) ($rawRanges['color'][$i] ?? ''));
if ($min === '' && $max === '' && $color === '') {
continue;
}
$ranges[] = [
'min' => is_numeric($min) ? (0 + $min) : 0,
'max' => is_numeric($max) ? (0 + $max) : 0,
'color' => $color !== '' ? $color : '#000000',
];
}
}
$data['color_ranges'] = $ranges;
if (!isset($data['list_chart_type']) || $data['list_chart_type'] === '') {
$data['list_chart_type'] = 'progressbar';
}
} else {
unset($data['max_value_color'], $data['color_ranges'], $data['list_chart_type']);
}
unset($data['metric']);
unset($data['display_unit']);
unset($data['weight']);
foreach (['contacts_views', 'graphical_views', 'trend_views', 'leaderboard_views', 'scoreboard_views', 'value_views', 'details_views', 'contact_attributes', 'user_attributes', 'team_leaderboard_widget_roles'] as $field) {
if (!isset($data[$field]) || !is_array($data[$field])) {
$data[$field] = [];
}
}
$data['default_tab'] = trim((string) ($data['default_tab'] ?? ''));
$data['show_user_attributes'] = ($data['show_user_attributes'] ?? 'no') === 'yes' ? 'yes' : 'no';
$data['stateheadwise_leaderboard'] = ($data['stateheadwise_leaderboard'] ?? 'no') === 'yes' ? 'yes' : 'no';
$data['user_attributes'] = $this->normalizeAttributeCodes($data['user_attributes']);
if (array_key_exists('id', $data) && ($data['id'] === null || $data['id'] === '')) {
unset($data['id']);
}
return $data;
}
protected function _beforeform($type, $values) {
if ($type === 'new') {
$values = (object) [
'type' => $this->_request->input('type', 'simple'),
'sort_order' => 0,
'widget_sort_order' => 0,
'show_user_attributes' => 'no',
'stateheadwise_leaderboard' => 'no',
'user_attributes' => [],
'team_leaderboard_widget_roles' => [],
'value_views' => ['value'],
'default_tab' => '',
];
if (($values->type ?? '') === 'verses') {
$values->list_chart_type = 'progressbar';
}
return $values;
}
if ($this->_request->input('type')) {
$values->type = $this->_request->input('type');
}
if ($type == 'edit') {
$values->designations = explode('#', $values->designations);
if(isset($values->report_roles)) {
$values->report_roles = explode('#', $values->report_roles);
} else {
$values->report_roles = [];
}
$widgetRoles = $values->team_leaderboard_widget_roles ?? [];
if (is_string($widgetRoles)) {
$values->team_leaderboard_widget_roles = $widgetRoles === '' ? [] : explode('#', $widgetRoles);
} elseif (is_array($widgetRoles)) {
$values->team_leaderboard_widget_roles = array_values($widgetRoles);
} else {
$values->team_leaderboard_widget_roles = [];
}
if(!isset($values->combined_metrics)) {
$values->combined_metrics = '[]';
}
if (!isset($values->sort_order) || $values->sort_order === null || $values->sort_order === '') {
$values->sort_order = isset($values->widget_sort_order) ? (int) $values->widget_sort_order : 0;
}
if (!isset($values->widget_sort_order) || $values->widget_sort_order === null || $values->widget_sort_order === '') {
$values->widget_sort_order = (int) $values->sort_order;
}
if (!isset($values->max_value_color)) {
$values->max_value_color = '';
}
if (!isset($values->color_ranges) || !is_array($values->color_ranges)) {
$values->color_ranges = [];
} else {
$normalizedRanges = [];
foreach ($values->color_ranges as $range) {
$rangeObj = is_object($range) ? $range : (object) $range;
$normalizedRanges[] = (object) [
'min' => $rangeObj->min ?? 0,
'max' => $rangeObj->max ?? 0,
'color' => $rangeObj->color ?? '#000000',
];
}
$values->color_ranges = $normalizedRanges;
}
$metrics = $values->metrics;
usort($metrics, fn($a, $b) => ((isset($a->sort_order) && isset($b->sort_order)) && $a->sort_order > $b->sort_order) );
$values->metrics = $metrics;
//echo ''; print_r($metrics); exit;
if (isset($values->show_positions)) {
$values->show_positions = strtolower((string) $values->show_positions);
}
if (!isset($values->show_positions_type) || $values->show_positions_type === '') {
$values->show_positions_type = 'all';
}
$values->show_user_attributes = (($values->show_user_attributes ?? 'no') === 'yes') ? 'yes' : 'no';
$values->stateheadwise_leaderboard = (($values->stateheadwise_leaderboard ?? 'no') === 'yes') ? 'yes' : 'no';
$values->user_attributes = $this->normalizeAttributeCodes($values->user_attributes ?? []);
if (!isset($values->value_views)) {
$values->value_views = ['value'];
}
if (!isset($values->scoreboard_views)) {
$values->scoreboard_views = $values->leaderboard_views ?? [];
}
if (!isset($values->default_tab)) {
$values->default_tab = '';
}
if (($values->type ?? '') === 'verses' && (!isset($values->list_chart_type) || $values->list_chart_type === '')) {
$values->list_chart_type = 'progressbar';
}
$values->validity_start = date("m/d/Y", strtotime($values->validity_start) + 19800 );
$values->validity_end = date('m/d/Y', strtotime($values->validity_end) + 19800);
}
return $values;
}
protected function getUserAttributeOptions(): array
{
$options = [];
$userAttrs = $this->getlambda('get', 'ums', 'userattribute', 'get_all');
foreach (($userAttrs->data->items ?? []) as $attr) {
if (($attr->status ?? 'active') === 'disabled') {
continue;
}
$code = $attr->code ?? '';
if ($code === '') {
continue;
}
$options[$code] = $attr->attribute ?? $code;
}
return $options;
}
protected function normalizeAttributeCodes($raw): array
{
if (is_string($raw) && $raw !== '') {
$decoded = json_decode($raw, true);
$raw = is_array($decoded) ? $decoded : explode('#', $raw);
}
if (!is_array($raw)) {
return [];
}
$codes = [];
foreach ($raw as $code) {
if (is_object($code)) {
$code = $code->code ?? '';
}
$code = trim((string) $code);
if ($code !== '') {
$codes[] = $code;
}
}
return array_values(array_unique($codes));
}
}