Improve patient search for legacy UHID values
This commit is contained in:
parent
e473be3ae7
commit
37631c27a0
|
|
@ -437,6 +437,28 @@ class Patient extends BaseController
|
||||||
return view('billing/Patient_Search_V', $data);
|
return view('billing/Patient_Search_V', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function buildPatientSearchCondition(string $rowData, ?string $abhaField = null, ?string $oldUhidField = null): string
|
||||||
|
{
|
||||||
|
$escapedValue = $this->db->escape($rowData);
|
||||||
|
$escapedLikeValue = $this->db->escape('%' . $rowData . '%');
|
||||||
|
$escapedSuffixLikeValue = $this->db->escape('%' . $rowData);
|
||||||
|
$clauses = [
|
||||||
|
'p.p_code like ' . $this->db->escape('%' . $rowData),
|
||||||
|
'p.mphone1 = ' . $escapedValue,
|
||||||
|
'p.udai = ' . $escapedValue,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($abhaField !== null && $abhaField !== '') {
|
||||||
|
$clauses[] = 'p.' . $abhaField . ' = ' . $escapedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($oldUhidField !== null && $oldUhidField !== '') {
|
||||||
|
$clauses[] = "TRIM(COALESCE(p.{$oldUhidField}, '')) != '' AND (p.{$oldUhidField} = " . $escapedValue . ' OR p.' . $oldUhidField . ' LIKE ' . $escapedLikeValue . ' OR p.' . $oldUhidField . ' LIKE ' . $escapedSuffixLikeValue . ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return ' and (' . implode(' or ', $clauses) . ')';
|
||||||
|
}
|
||||||
|
|
||||||
public function search_ajax()
|
public function search_ajax()
|
||||||
{
|
{
|
||||||
$request = $this->request->getGet();
|
$request = $this->request->getGet();
|
||||||
|
|
@ -449,12 +471,16 @@ class Patient extends BaseController
|
||||||
$sdata = $dtSearch !== '' ? $dtSearch : $initialSearch;
|
$sdata = $dtSearch !== '' ? $dtSearch : $initialSearch;
|
||||||
$sdata = preg_replace('/[^A-Za-z0-9 _.@\-]/', '', $sdata);
|
$sdata = preg_replace('/[^A-Za-z0-9 _.@\-]/', '', $sdata);
|
||||||
|
|
||||||
// Detect ABHA column name in patient_master
|
// Detect ABHA and legacy UHID columns in patient_master
|
||||||
$abhaField = null;
|
$abhaField = null;
|
||||||
|
$oldUhidField = null;
|
||||||
$pmFields = $this->db->getFieldNames('patient_master') ?? [];
|
$pmFields = $this->db->getFieldNames('patient_master') ?? [];
|
||||||
foreach (['abha_id', 'abha_no', 'abha', 'abha_address'] as $f) {
|
foreach (['abha_id', 'abha_no', 'abha', 'abha_address'] as $f) {
|
||||||
if (in_array($f, $pmFields, true)) { $abhaField = $f; break; }
|
if (in_array($f, $pmFields, true)) { $abhaField = $f; break; }
|
||||||
}
|
}
|
||||||
|
foreach (['old_uhid', 'legacy_uhid', 'old_patient_code'] as $f) {
|
||||||
|
if (in_array($f, $pmFields, true)) { $oldUhidField = $f; break; }
|
||||||
|
}
|
||||||
|
|
||||||
// Build WHERE clause based on search query
|
// Build WHERE clause based on search query
|
||||||
$searchString = ' 1=1 ';
|
$searchString = ' 1=1 ';
|
||||||
|
|
@ -467,22 +493,33 @@ class Patient extends BaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_numeric($rowData)) {
|
if (is_numeric($rowData)) {
|
||||||
$abhaClause = $abhaField ? " or p.{$abhaField} = " . $this->db->escape($rowData) : '';
|
$searchString .= $this->buildPatientSearchCondition($rowData, $abhaField, $oldUhidField);
|
||||||
$searchString .= " and (p.p_code like " . $this->db->escape('%' . $rowData) . "
|
|
||||||
or p.mphone1 = " . $this->db->escape($rowData) . "
|
|
||||||
or p.udai=" . $this->db->escape($rowData) . $abhaClause . ")";
|
|
||||||
} elseif (ctype_alpha($rowData)) {
|
} elseif (ctype_alpha($rowData)) {
|
||||||
|
$escapedValue = $this->db->escape($rowData);
|
||||||
|
$escapedLikeValue = $this->db->escape('%' . $rowData . '%');
|
||||||
|
$escapedSuffixLikeValue = $this->db->escape('%' . $rowData);
|
||||||
|
$legacyUhidClause = '';
|
||||||
|
if ($oldUhidField !== null && $oldUhidField !== '') {
|
||||||
|
$legacyUhidClause = " or (TRIM(COALESCE(p.{$oldUhidField}, '')) != '' AND (p.{$oldUhidField} = " . $escapedValue . ' OR p.' . $oldUhidField . ' LIKE ' . $escapedLikeValue . ' OR p.' . $oldUhidField . ' LIKE ' . $escapedSuffixLikeValue . '))';
|
||||||
|
}
|
||||||
$searchString .= " and (p.p_fname like " . $this->db->escape('%' . $rowData . '%') . "
|
$searchString .= " and (p.p_fname like " . $this->db->escape('%' . $rowData . '%') . "
|
||||||
or p.email1 = " . $this->db->escape($rowData) . "
|
or p.email1 = " . $this->db->escape($rowData) . "
|
||||||
or SUBSTRING_INDEX(p.p_fname,' ',1) sounds like " . $this->db->escape($rowData) . ")";
|
or SUBSTRING_INDEX(p.p_fname,' ',1) sounds like " . $this->db->escape($rowData) . $legacyUhidClause . ")";
|
||||||
} else {
|
} else {
|
||||||
// Handle dashed ABHA format: XX-XXXX-XXXX-XXXX
|
// Handle dashed ABHA format: XX-XXXX-XXXX-XXXX
|
||||||
$rawDigits = preg_replace('/\D/', '', $rowData);
|
$rawDigits = preg_replace('/\D/', '', $rowData);
|
||||||
$abhaElse = ($abhaField && strlen($rawDigits) === 14)
|
$abhaElse = ($abhaField && strlen($rawDigits) === 14)
|
||||||
? " or p.{$abhaField} = " . $this->db->escape($rawDigits) . " or p.{$abhaField} = " . $this->db->escape($rowData)
|
? " or p.{$abhaField} = " . $this->db->escape($rawDigits) . " or p.{$abhaField} = " . $this->db->escape($rowData)
|
||||||
: '';
|
: '';
|
||||||
|
$legacyUhidClause = '';
|
||||||
|
if ($oldUhidField !== null && $oldUhidField !== '') {
|
||||||
|
$escapedValue = $this->db->escape($rowData);
|
||||||
|
$escapedLikeValue = $this->db->escape('%' . $rowData . '%');
|
||||||
|
$escapedSuffixLikeValue = $this->db->escape('%' . $rowData);
|
||||||
|
$legacyUhidClause = " or (TRIM(COALESCE(p.{$oldUhidField}, '')) != '' AND (p.{$oldUhidField} = " . $escapedValue . ' OR p.' . $oldUhidField . ' LIKE ' . $escapedLikeValue . ' OR p.' . $oldUhidField . ' LIKE ' . $escapedSuffixLikeValue . '))';
|
||||||
|
}
|
||||||
$searchString .= " and (p.p_code like " . $this->db->escape($rowData) . "
|
$searchString .= " and (p.p_code like " . $this->db->escape($rowData) . "
|
||||||
or p.email1 = " . $this->db->escape($rowData) . $abhaElse . ")";
|
or p.email1 = " . $this->db->escape($rowData) . $abhaElse . $legacyUhidClause . ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
40
tests/unit/PatientSearchConditionTest.php
Normal file
40
tests/unit/PatientSearchConditionTest.php
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit;
|
||||||
|
|
||||||
|
use App\Controllers\Patient;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
final class PatientSearchConditionTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testNumericTermIncludesOldUhidCondition(): void
|
||||||
|
{
|
||||||
|
$controller = new class extends Patient {
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDbStub(object $db): void
|
||||||
|
{
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function exposeBuildPatientSearchCondition(string $rowData, ?string $abhaField = null, ?string $oldUhidField = null): string
|
||||||
|
{
|
||||||
|
return $this->buildPatientSearchCondition($rowData, $abhaField, $oldUhidField);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$controller->setDbStub(new class {
|
||||||
|
public function escape($value): string
|
||||||
|
{
|
||||||
|
return "'" . str_replace("'", "''", (string) $value) . "'";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$condition = $controller->exposeBuildPatientSearchCondition('12345', 'abha_id', 'old_uhid');
|
||||||
|
|
||||||
|
$this->assertStringContainsString('old_uhid', $condition);
|
||||||
|
$this->assertStringContainsString('TRIM(COALESCE(p.old_uhid', $condition);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user