feat: add granular template permissions for role-based template access

- add new permissions:
  template.opd_print, template.pathology_print, template.diagnosis_print,
  template.document_print, template.ipd_document
- Template controller now accepts new permission keys (with backward-compatible fallbacks)
- IPD Document Master now has independent permission key (template.ipd_document)
- Template index tile visibility updated to use new granular keys
- OPD print template builder now honors template.opd_print permission
- preserve existing behavior via legacy permission fallbacks to avoid role breakage
This commit is contained in:
DevSoftTech Server 2026-03-31 06:35:36 +05:30
parent 3294e39b02
commit 874d5ffba6
4 changed files with 41 additions and 11 deletions

View File

@ -124,6 +124,11 @@ class AuthGroups extends ShieldAuthGroups
'template.mri' => 'Can access MRI templates', 'template.mri' => 'Can access MRI templates',
'template.echo' => 'Can access ECHO templates', 'template.echo' => 'Can access ECHO templates',
'template.discharge' => 'Can access IPD discharge templates', 'template.discharge' => 'Can access IPD discharge templates',
'template.opd_print' => 'Can access OPD print templates',
'template.pathology_print' => 'Can access pathology print templates',
'template.diagnosis_print' => 'Can access diagnosis print templates',
'template.document_print' => 'Can access document print templates',
'template.ipd_document' => 'Can access IPD document master templates',
]; ];
/** /**

View File

@ -41,7 +41,7 @@ class Opd extends BaseController
return false; return false;
} }
if (method_exists($user, 'can') && $user->can('billing.opd.edit')) { if (method_exists($user, 'can') && ($user->can('template.opd_print') || $user->can('billing.opd.edit'))) {
return true; return true;
} }

View File

@ -16,6 +16,11 @@ class Template extends BaseController
'template.mri', 'template.mri',
'template.echo', 'template.echo',
'template.discharge', 'template.discharge',
'template.opd_print',
'template.pathology_print',
'template.diagnosis_print',
'template.document_print',
'template.ipd_document',
]; ];
public function __construct() public function __construct()
@ -715,7 +720,11 @@ HTML;
public function diagnosis_print_settings(int $modality = 3) public function diagnosis_print_settings(int $modality = 3)
{ {
if ($resp = $this->requireAnyPermission(['template.pathology', 'template.ultrasound', 'template.xray', 'template.ct', 'template.mri', 'template.echo'])) { if ($resp = $this->requireAnyPermission([
'template.diagnosis_print',
'template.pathology_print',
'template.pathology', 'template.ultrasound', 'template.xray', 'template.ct', 'template.mri', 'template.echo',
])) {
return $resp; return $resp;
} }
@ -978,7 +987,10 @@ HTML;
public function document_print_settings() public function document_print_settings()
{ {
if ($resp = $this->requireAnyPermission(['doctor_work.template_workspace.access', 'doctor_work.access', 'template.pathology'])) { if ($resp = $this->requireAnyPermission([
'template.document_print',
'doctor_work.template_workspace.access', 'doctor_work.access', 'template.pathology',
])) {
return $resp; return $resp;
} }
@ -1608,7 +1620,7 @@ HTML,
public function ipd_document_templates() public function ipd_document_templates()
{ {
if ($resp = $this->requireAnyPermission(['template.discharge'])) { if ($resp = $this->requireAnyPermission(['template.ipd_document', 'template.discharge'])) {
return $resp; return $resp;
} }
@ -1674,7 +1686,7 @@ HTML,
public function ipd_document_template_delete(int $id) public function ipd_document_template_delete(int $id)
{ {
if ($resp = $this->requireAnyPermission(['template.discharge'])) { if ($resp = $this->requireAnyPermission(['template.ipd_document', 'template.discharge'])) {
return $resp; return $resp;
} }

View File

@ -7,17 +7,27 @@ $canCt = $user && method_exists($user, 'can') ? $user->can('template.ct') : fals
$canMri = $user && method_exists($user, 'can') ? $user->can('template.mri') : false; $canMri = $user && method_exists($user, 'can') ? $user->can('template.mri') : false;
$canEcho = $user && method_exists($user, 'can') ? $user->can('template.echo') : false; $canEcho = $user && method_exists($user, 'can') ? $user->can('template.echo') : false;
$canDischarge = $user && method_exists($user, 'can') ? $user->can('template.discharge') : false; $canDischarge = $user && method_exists($user, 'can') ? $user->can('template.discharge') : false;
$canOpdPrintTemplate = $user && method_exists($user, 'can') ? $user->can('billing.opd.edit') : false; $canOpdPrintTemplate = $user && method_exists($user, 'can')
$canDiagnosisPrintTemplate = $canPathology || $canUltrasound || $canXray || $canCt || $canMri || $canEcho; ? ($user->can('template.opd_print') || $user->can('billing.opd.edit'))
$canDoctorDocumentPrintTemplate = $user && method_exists($user, 'can')
? ($user->can('doctor_work.template_workspace.access') || $user->can('doctor_work.access') || $user->can('template.pathology'))
: false; : false;
$canPathologyPrintTemplate = $user && method_exists($user, 'can')
? ($user->can('template.pathology_print') || $user->can('template.pathology'))
: false;
$canDiagnosisPrintTemplate = $user && method_exists($user, 'can')
? ($user->can('template.diagnosis_print') || $canPathology || $canUltrasound || $canXray || $canCt || $canMri || $canEcho)
: ($canPathology || $canUltrasound || $canXray || $canCt || $canMri || $canEcho);
$canDoctorDocumentPrintTemplate = $user && method_exists($user, 'can')
? ($user->can('template.document_print') || $user->can('doctor_work.template_workspace.access') || $user->can('doctor_work.access') || $user->can('template.pathology'))
: false;
$canIpdDocumentMaster = $user && method_exists($user, 'can')
? ($user->can('template.ipd_document') || $user->can('template.discharge'))
: $canDischarge;
if (! $canOpdPrintTemplate && $user && method_exists($user, 'inGroup')) { if (! $canOpdPrintTemplate && $user && method_exists($user, 'inGroup')) {
$canOpdPrintTemplate = $user->inGroup('OPDEdit', 'admin', 'superadmin', 'developer'); $canOpdPrintTemplate = $user->inGroup('OPDEdit', 'admin', 'superadmin', 'developer');
} }
$hasTemplateAccess = $canPathology || $canUltrasound || $canXray || $canCt || $canMri || $canEcho || $canDischarge || $canDoctorDocumentPrintTemplate; $hasTemplateAccess = $canPathology || $canUltrasound || $canXray || $canCt || $canMri || $canEcho || $canDischarge || $canOpdPrintTemplate || $canPathologyPrintTemplate || $canDiagnosisPrintTemplate || $canDoctorDocumentPrintTemplate || $canIpdDocumentMaster;
?> ?>
<section class="content"> <section class="content">
<div class="pagetitle"> <div class="pagetitle">
@ -206,6 +216,9 @@ $hasTemplateAccess = $canPathology || $canUltrasound || $canXray || $canCt || $c
<span>IPD Discharge Template</span> <span>IPD Discharge Template</span>
</a> </a>
</div> </div>
<?php } ?>
<?php if ($canIpdDocumentMaster) { ?>
<div class="col-6 col-md-2 col-lg-2"> <div class="col-6 col-md-2 col-lg-2">
<a class="admin-tile" href="javascript:load_form_div('<?= base_url('setting/template/ipd_document_templates') ?>','maindiv','IPD Document Master');"> <a class="admin-tile" href="javascript:load_form_div('<?= base_url('setting/template/ipd_document_templates') ?>','maindiv','IPD Document Master');">
<span class="tile-icon"><i class="bi bi-file-earmark-richtext"></i></span> <span class="tile-icon"><i class="bi bi-file-earmark-richtext"></i></span>
@ -215,7 +228,7 @@ $hasTemplateAccess = $canPathology || $canUltrasound || $canXray || $canCt || $c
<?php } ?> <?php } ?>
<?php if ($canDiagnosisPrintTemplate) { ?> <?php if ($canDiagnosisPrintTemplate) { ?>
<?php if ($canPathology) { ?> <?php if ($canPathologyPrintTemplate) { ?>
<div class="col-6 col-md-2 col-lg-2"> <div class="col-6 col-md-2 col-lg-2">
<a class="admin-tile" href="javascript:load_form_div('<?= base_url('setting/template/diagnosis_print_settings/5') ?>','maindiv','Pathology Print Template');"> <a class="admin-tile" href="javascript:load_form_div('<?= base_url('setting/template/diagnosis_print_settings/5') ?>','maindiv','Pathology Print Template');">
<span class="tile-icon"><i class="bi bi-printer"></i></span> <span class="tile-icon"><i class="bi bi-printer"></i></span>