mirror of
https://gitlab.com/signalytic/client-external/streamline/streamline-emr.git
synced 2026-09-11 18:51:31 +00:00
The official image from streamline does not currently work for the arm64 platform. As a temporary measure, the source code and docker build scripts have been lifted from the official images and are used to build locally. Some additional modifications are made to reduce overall image size, these are documented in docker/README.md
332 lines
14 KiB
PHP
Executable File
332 lines
14 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Streamline\Http\Controllers;
|
|
|
|
use Carbon\Carbon;
|
|
use GuzzleHttp\Client;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Streamline\Models\Patient;
|
|
use Streamline\Models\PatientCategory;
|
|
use Streamline\Models\SentSmsMessage;
|
|
use Streamline\Models\StaffPositions;
|
|
use Streamline\Models\Village;
|
|
|
|
class SMSController extends Controller {
|
|
|
|
public $sms_api_uri = "http://41.191.79.246:8110";
|
|
|
|
public function send_sms(Request $request) {
|
|
$search_text = "Please use search above to start sending SMS";
|
|
|
|
$sms_group = ['' => '--select--', 1 => 'Patients', 2 => 'Users', 3 => 'Custom Phone Numbers'];
|
|
|
|
$patient_groups = ['' => '--select patient grouping--', 1 => 'All Patients', 2 => 'By Patient Groups'];
|
|
|
|
$user_groups = ['' => '--select user grouping--', 1 => 'All Users', 2 => 'By User Positions'];
|
|
|
|
$patient_categories = PatientCategory::pluck('name', 'id')->toArray();
|
|
$patient_categories = ['' => '- select patient category -'] + $patient_categories;
|
|
|
|
$user_positions = StaffPositions::pluck('name', 'id')->toArray();
|
|
$user_positions = ['' => '- select user position -'] + $user_positions;
|
|
|
|
/**
|
|
* Selected Options
|
|
* 1 - All patients
|
|
* 2 - Patient Categories
|
|
* 3 - All Users
|
|
* 4 - User Positions
|
|
* 5 - Custom
|
|
* 6 - Patient Appointments
|
|
* 7 - Investigation Results
|
|
*/
|
|
|
|
$selected_send_option = 0;
|
|
$valid_patients = [];
|
|
$total_patients_no = 0;
|
|
$counter = 0;
|
|
$category_position_id = 0;
|
|
$valid_users = [];
|
|
$total_users_no = 0;
|
|
|
|
if ($request->sms_option == 1){
|
|
if ($request->patient_groups == 1) {
|
|
$search_text = "Sending SMS to all patients";
|
|
$selected_send_option = 1;
|
|
|
|
$patients = DB::table('patients')
|
|
->select('id', 'phone')
|
|
->get();
|
|
|
|
foreach ($patients as $patient) {
|
|
if (strlen($patient->phone) == 10 && in_array(str_split($patient->phone, 3)[0], ["077", "070", "075", "078"])){
|
|
$valid_patients[$counter]['id'] = $patient->id;
|
|
$valid_patients[$counter]['phone'] = $patient->phone;
|
|
|
|
$counter++;
|
|
}
|
|
}
|
|
|
|
$total_patients_no = count($patients);
|
|
} elseif ($request->patient_groups == 2) {
|
|
if ($request->patient_groups_search) {
|
|
$search_text = "Sending SMS to patients in the " . get_name($request->patient_groups_search, 'id', 'name', 'patient_categories') . " patient category";
|
|
$selected_send_option = 2;
|
|
$category_position_id = $request->patient_groups_search;
|
|
|
|
$patients = DB::table('patients')
|
|
->where('category_id', $category_position_id)
|
|
->select('id', 'phone')
|
|
->get();
|
|
|
|
foreach ($patients as $patient) {
|
|
if (strlen($patient->phone) == 10 && in_array(str_split($patient->phone, 3)[0], ["077", "070", "075", "078"])){
|
|
$valid_patients[$counter]['id'] = $patient->id;
|
|
$valid_patients[$counter]['phone'] = $patient->phone;
|
|
|
|
$counter++;
|
|
}
|
|
}
|
|
|
|
$total_patients_no = count($patients);
|
|
} else {
|
|
flash("Please select a patient category to continue")->error();
|
|
}
|
|
} else {
|
|
flash("Please select a patient grouping to continue")->error();
|
|
}
|
|
} elseif ($request->sms_option == 2){
|
|
if ($request->user_groups == 1) {
|
|
$search_text = "Sending SMS to all staff";
|
|
$selected_send_option = 3;
|
|
|
|
$users = DB::table('users')
|
|
->select('id', 'phone')
|
|
->get();
|
|
|
|
foreach ($users as $user) {
|
|
if (strlen($user->phone) == 10 && in_array(str_split($user->phone, 3)[0], ["077", "070", "075", "078"])){
|
|
$valid_users[$counter]['id'] = $user->id;
|
|
$valid_users[$counter]['phone'] = $user->phone;
|
|
|
|
$counter++;
|
|
}
|
|
}
|
|
|
|
$total_users_no = count($users);
|
|
} elseif ($request->user_groups == 2) {
|
|
if ($request->user_position_search) {
|
|
$search_text = "Sending SMS to staff in the " . get_name($request->user_position_search, 'id', 'name', 'staff_positions') . " Positions";
|
|
$selected_send_option = 4;
|
|
$category_position_id = $request->user_position_search;
|
|
|
|
$users = DB::table('users')
|
|
->where('position_id', $category_position_id)
|
|
->select('id', 'phone')
|
|
->get();
|
|
|
|
foreach ($users as $user) {
|
|
if (strlen($user->phone) == 10 && in_array(str_split($user->phone, 3)[0], ["077", "070", "075", "078"])){
|
|
$valid_users[$counter]['id'] = $user->id;
|
|
$valid_users[$counter]['phone'] = $user->phone;
|
|
|
|
$counter++;
|
|
}
|
|
}
|
|
|
|
$total_users_no = count($users);
|
|
} else {
|
|
flash("Please select a user position to continue")->error();
|
|
}
|
|
} else {
|
|
flash("Please select a user grouping to continue")->error();
|
|
}
|
|
} else {
|
|
flash("Please select an SMS option to continue")->error();
|
|
}
|
|
|
|
return view('sms.send_sms', compact('sms_group', 'patient_groups', 'user_groups', 'patient_categories', 'user_positions',
|
|
'total_patients_no', 'valid_patients', 'search_text', 'selected_send_option', 'category_position_id', 'valid_users', 'total_users_no'));
|
|
}
|
|
|
|
public function process_sms(Request $request) {
|
|
$client = new Client(['base_uri' => $this->sms_api_uri]);
|
|
|
|
switch ($request->selected_send_option) {
|
|
case 1:
|
|
case 2:
|
|
default:
|
|
$valid_patients = json_decode($request->valid_patients);
|
|
$ids = [];
|
|
$numbers = [];
|
|
|
|
foreach ($valid_patients as $patient){
|
|
$ids[] = $patient->id;
|
|
$numbers[] = $patient->phone;
|
|
}
|
|
|
|
$response = $client->request('GET', '/sms/can_sms_be_sent/' . count($valid_patients));
|
|
|
|
if ($response->getBody()->getContents() == 1){
|
|
$this->save_sms_to_table($request->selected_send_option, $request->category_position_id, $ids, $request->sms_message, $request->comment, null,
|
|
$numbers, auth()->id());
|
|
|
|
flash("All SMS messages have been sent")->success();
|
|
return redirect('sms/send_sms');
|
|
} else {
|
|
flash("Insufficient balance on your account. Please contact the Stre@mline Team to recharge")->error();
|
|
return back()->withInput();
|
|
}
|
|
break;
|
|
case 3:
|
|
case 4:
|
|
$valid_users = json_decode($request->valid_users);
|
|
$ids = [];
|
|
$numbers = [];
|
|
|
|
foreach ($valid_users as $user){
|
|
$ids[] = $user->id;
|
|
$numbers[] = $user->phone;
|
|
}
|
|
|
|
$response = $client->request('GET', '/sms/can_sms_be_sent/' . count($valid_users));
|
|
|
|
if ($response->getBody()->getContents() == 1){
|
|
$this->save_sms_to_table($request->selected_send_option, $request->category_position_id, $ids, $request->sms_message, $request->comment, null,
|
|
$numbers, auth()->id());
|
|
|
|
flash("All SMS messages have been sent")->success();
|
|
return redirect('sms/send_sms');
|
|
} else {
|
|
flash("Insufficient balance on your account. Please contact the Stre@mline Team to recharge")->error();
|
|
return back()->withInput();
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
public function save_sms_to_table($sms_group, $category_position_id, $patient_user_id, $sms_message,
|
|
$comment, $custom_name, $phone_numbers, $created_by) {
|
|
$client = new Client(['base_uri' => $this->sms_api_uri]);
|
|
|
|
// loop through all the numbers and send message
|
|
foreach ($phone_numbers as $number){
|
|
|
|
$response = $client->request('POST', '/sms/receive_message_to_send', [
|
|
'form_params' => [
|
|
'message' => $sms_message,
|
|
'number' => "+256" . substr($number, 1)
|
|
]
|
|
]);
|
|
}
|
|
|
|
// save records to the database
|
|
$sent_sms = new SentSmsMessage();
|
|
|
|
$sent_sms->sms_group = $sms_group;
|
|
$sent_sms->category_position_id = $category_position_id;
|
|
$sent_sms->patient_user_id = implode(",", $patient_user_id);
|
|
$sent_sms->sms_message = $sms_message;
|
|
$sent_sms->comment = $comment;
|
|
$sent_sms->custom_name = $custom_name;
|
|
$sent_sms->phone_number = implode(",", $phone_numbers);
|
|
$sent_sms->total_sms_sent = count($phone_numbers);
|
|
$sent_sms->created_by = $created_by;
|
|
|
|
$sent_sms->save();
|
|
|
|
return true;
|
|
}
|
|
|
|
public function view_sms_reports(Request $request) {
|
|
if (isset($request->start_date)){
|
|
$start_date = $request->start_date;
|
|
$end_date = $request->end_date;
|
|
} else {
|
|
$start_date = Carbon::now()->startOfDay();
|
|
$end_date = Carbon::now()->endOfDay();
|
|
}
|
|
|
|
$search_text = "Searching SMS alerts sent from " . streamline_date($start_date) . " to " . streamline_date($end_date);
|
|
|
|
$sms_sent_to_all_patients = DB::table('sent_sms_messages')
|
|
->where('sms_group', 1)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$sms_sent_to_patient_categories = DB::table('sent_sms_messages')
|
|
->where('sms_group', 2)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$sms_sent_to_all_users = DB::table('sent_sms_messages')
|
|
->where('sms_group', 3)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$sms_sent_to_user_positions = DB::table('sent_sms_messages')
|
|
->where('sms_group', 4)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$sms_sent_to_custom = DB::table('sent_sms_messages')
|
|
->where('sms_group', 5)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$sms_sent_for_patient_appointments = DB::table('sent_sms_messages')
|
|
->where('sms_group', 6)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$sms_sent_for_investigation_results = DB::table('sent_sms_messages')
|
|
->where('sms_group', 7)
|
|
->whereBetween('created_at', [$start_date, $end_date])
|
|
->sum('total_sms_sent');
|
|
|
|
$total_sms_sent = $sms_sent_for_investigation_results + $sms_sent_for_patient_appointments + $sms_sent_to_custom +
|
|
$sms_sent_to_user_positions + $sms_sent_to_all_users + $sms_sent_to_patient_categories + $sms_sent_to_all_patients;
|
|
|
|
return view('sms.view_sms_reports', compact('sms_sent_to_all_patients', 'sms_sent_to_patient_categories', 'sms_sent_to_all_users',
|
|
'sms_sent_to_user_positions', 'sms_sent_to_custom', 'sms_sent_for_patient_appointments', 'sms_sent_for_investigation_results', 'search_text', 'total_sms_sent'));
|
|
}
|
|
|
|
public function send_investigation_alert($patient_id) {
|
|
$client = new Client(['base_uri' => $this->sms_api_uri]);
|
|
$patient = Patient::find($patient_id);
|
|
|
|
if (strlen($patient->phone) == 10 && in_array(str_split($patient->phone, 3)[0], ["077", "070", "075", "078"])){
|
|
$response = $client->request('GET', '/sms/can_sms_be_sent/1');
|
|
|
|
if ($response->getBody()->getContents() == 1){
|
|
$sms_message = "Your investigation results are ready - " . get_name(1, 'id', 'name', 'hospital_information');
|
|
$this->save_sms_to_table(7, 0, [$patient->id], $sms_message, "", null,
|
|
[$patient->phone], auth()->id());
|
|
|
|
return "Alert has been sent to patient";
|
|
} else {
|
|
return "Insufficient balance on your account. Please contact the Stre@mline Team to recharge";
|
|
}
|
|
} else {
|
|
return "Failed to send alert because patient phone number is incorrect";
|
|
}
|
|
}
|
|
|
|
public function send_appointments_alert($patient_id, $sms_message) {
|
|
$client = new Client(['base_uri' => $this->sms_api_uri]);
|
|
$patient = Patient::find($patient_id);
|
|
$user_id = is_null(auth()->id()) ? 1 : auth()->id();
|
|
|
|
if (strlen($patient->phone) == 10 && in_array(str_split($patient->phone, 3)[0], ["077", "070", "075", "078"])){
|
|
$response = $client->request('GET', '/sms/can_sms_be_sent/1');
|
|
|
|
if ($response->getBody()->getContents() == 1){
|
|
$this->save_sms_to_table(6, 0, [$patient->id], $sms_message, "", null,
|
|
[$patient->phone], $user_id);
|
|
}
|
|
}
|
|
}
|
|
}
|