PageRenderTime 25ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 1ms

/library/cases_table.php

https://gitlab.com/STRIKER_Perm/emst
PHP | 552 lines | 392 code | 120 blank | 40 comment | 34 complexity | ff3be3a66498918d77d041ea681dd914 MD5 | raw file
  1. <?php
  2. #####################################################################
  3. #
  4. # Поликлинический автоматизированный комплекс
  5. # (c) 2005,2006 Vista
  6. #
  7. # Базовый класс и вспомогательные функции для вывода списка
  8. # историй болезни
  9. #
  10. #####################################################################
  11. define('gCaseWithBadDoc', '(emst_cases.doc_series="" OR emst_cases.doc_number="" OR emst_cases.polis_series="" OR emst_cases.polis_number="")');
  12. // define('gSurgeryWithBadIllDoc', '(emst_surgeries.ill_doc!="" AND (emst_surgeries.ill_beg_date="0000-00-00" OR emst_surgeries.ill_end_date="0000-00-00" OR (emst_surgeries.ill_beg_date>emst_surgeries.ill_end_date) OR DATEDIFF(emst_surgeries.ill_end_date, emst_surgeries.ill_beg_date)>30))');
  13. // define('gSurgeryWithBadIllDoc', '(emst_surgeries.ill_doc!="" AND (emst_surgeries.ill_beg_date=0 OR emst_surgeries.ill_end_date=0 OR (emst_surgeries.ill_beg_date>emst_surgeries.ill_end_date) OR DATEDIFF(emst_surgeries.ill_end_date, emst_surgeries.ill_beg_date)>30))');
  14. #### gSurgeryWithBadIllDoc
  15. // 1) Работающий
  16. define('gSurgeryWithBadIllDoc_1', '((NOT(employment_category_id IS NULL) AND rb_employment_categories.need_ill_doc))');
  17. // 2) Трудоспособность не оценена
  18. define('gSurgeryWithBadIllDoc_2', '(emst_surgeries.disability = 0)');
  19. // 3) Трудоспособность сохранена
  20. define('gSurgeryWithBadIllDoc_3', '(emst_surgeries.disability = 1)');
  21. // 4) Трудоспособность утрачена
  22. define('gSurgeryWithBadIllDoc_4', '(emst_surgeries.disability = 2)');
  23. // 5) Документ пуст (ни отказа, ни номера с датами)
  24. define('gSurgeryWithBadIllDoc_5', '(
  25. (NOT emst_surgeries.ill_refused) AND
  26. (emst_surgeries.ill_doc="") AND
  27. (emst_surgeries.ill_doc_new="") AND
  28. (NOT emst_surgeries.ill_sertificat) AND
  29. (emst_surgeries.ill_beg_date=0) AND
  30. (emst_surgeries.ill_end_date=0) AND
  31. (NOT emst_surgeries.ill_doc_closed)
  32. )');
  33. // 6) Документ заполнен правильно (отказ или всё остальное)
  34. define('gSurgeryWithBadIllDoc_6', '(
  35. ((emst_surgeries.ill_refused) AND
  36. (emst_surgeries.ill_doc="") AND
  37. (emst_surgeries.ill_doc_new="") AND
  38. (NOT emst_surgeries.ill_sertificat) AND
  39. (emst_surgeries.ill_beg_date=0) AND
  40. (emst_surgeries.ill_end_date=0) AND
  41. (NOT emst_surgeries.ill_doc_closed)
  42. ) OR
  43. ((NOT emst_surgeries.ill_refused) AND
  44. (
  45. (emst_surgeries.ill_doc="") != (emst_surgeries.ill_sertificat=0) AND
  46. emst_surgeries.ill_beg_date!=0 AND
  47. emst_surgeries.ill_end_date!=0 AND
  48. emst_surgeries.ill_beg_date<=emst_surgeries.ill_end_date AND
  49. DATEDIFF(emst_surgeries.ill_end_date, emst_surgeries.ill_beg_date)<=30
  50. )
  51. )
  52. )');
  53. // 7) Признак исхода: в случае указания нетрудоспособности может быть опущен б/л
  54. define('gSurgeryWithBadIllDoc_7', '(
  55. (NOT (emst_surgeries.clinical_outcome_id IS NULL)) AND
  56. rb_clinical_outcomes.can_skip_ill_doc_on_disability
  57. )');
  58. // 8) Признак исхода: c случае сохранения трудоспособности может быть указан б/л
  59. define('gSurgeryWithBadIllDoc_8', '(
  60. (NOT (emst_surgeries.clinical_outcome_id IS NULL)) AND
  61. rb_clinical_outcomes.can_use_ill_doc_in_ability
  62. )');
  63. // документ нетрудоспособности указан правильно, если:
  64. // для неработающего: ~1 & 2
  65. // для работающего: 1 & 3 & ( 5 | 6 & 8 )
  66. // или 1 & 4 & ( 6 | 5 & 7 )
  67. //
  68. // или можно переформулировать так:
  69. // (~1 & 2) |
  70. // (1 & 5 & ( 3 | 4 & 7 )) |
  71. // (1 & 6 & ( 4 | 3 & 8 ))
  72. define('gSurgeryWithBadIllDoc', '(NOT('.
  73. '(NOT ' . gSurgeryWithBadIllDoc_1 .' AND '. gSurgeryWithBadIllDoc_2.') OR '.
  74. '( '. gSurgeryWithBadIllDoc_1 .' AND '. gSurgeryWithBadIllDoc_5. ' AND ( '. gSurgeryWithBadIllDoc_3 . ' OR '. gSurgeryWithBadIllDoc_4 . ' AND '. gSurgeryWithBadIllDoc_7 .')) OR '.
  75. '( '. gSurgeryWithBadIllDoc_1 .' AND '. gSurgeryWithBadIllDoc_6. ' AND ( '. gSurgeryWithBadIllDoc_4 . ' OR '. gSurgeryWithBadIllDoc_3 . ' AND '. gSurgeryWithBadIllDoc_8 .'))'.
  76. '))');
  77. define('gLostOutcome',
  78. '( emst_surgeries.next_visit_date = emst_cases.next_visit_date AND
  79. emst_surgeries.clinical_outcome_id IS NULL AND
  80. ( DATEDIFF(CURDATE(), emst_surgeries.date) >= 30 OR
  81. emst_surgeries.next_visit_date = 0))');
  82. define('gSurgeryIsPrimary', '(DATE(emst_surgeries.date)=DATE(emst_cases.create_time))');
  83. function FormatBoolean($AValue)
  84. {
  85. if ( $AValue )
  86. return 'да';
  87. else
  88. return 'нет';
  89. }
  90. function FormatNameEx(&$AInfo)
  91. {
  92. if ( is_array($AInfo) )
  93. return FormatName(@$AInfo['last_name'], $AInfo['first_name'], @$AInfo['patr_name']);
  94. else
  95. return FormatName ($AInfo);
  96. }
  97. function FormatName($ALast, $AFirst='', $APatr='')
  98. {
  99. $vResult = trim($ALast.' '.$AFirst.' '.$APatr);
  100. preg_match_all('/\w*\W*/', $vResult, $vWords);
  101. $vResult = '';
  102. foreach($vWords[0] as $vWord) $vResult .= ucfirst(strtolower($vWord));
  103. return $vResult;
  104. }
  105. function FormatShortName($ALast, $AFirst, $APatr)
  106. {
  107. $vTmp = explode(' ', FormatName($ALast, $AFirst, $APatr));
  108. $vResult = '';
  109. foreach($vTmp as $vWord)
  110. {
  111. if ( $vResult==='' )
  112. $vResult = $vWord.' ';
  113. else
  114. $vResult .= $vWord{0}.'.';
  115. }
  116. return $vResult;
  117. }
  118. function FormatShortNameEx($AInfo)
  119. {
  120. if ( is_array($AInfo) )
  121. return FormatShortName(iconv('utf-8', 'cp1251',@$AInfo['last_name']), iconv('utf-8', 'cp1251',@$AInfo['first_name']), iconv('utf-8', 'cp1251',@$AInfo['patr_name']));
  122. else
  123. return FormatShortName($AInfo);
  124. }
  125. function FormatAddress($AStreet, $ANum, $ACorpus, $AApartment)
  126. {
  127. $vResult = $AStreet;
  128. if ( !empty($ANum) )
  129. $vResult .= ' д.'.$ANum;
  130. if ( !empty($ACorpus) )
  131. $vResult .= ' к.'.$ACorpus;
  132. if ( !empty($AApartment) )
  133. $vResult .= ' кв.'.$AApartment;
  134. return $vResult;
  135. }
  136. function FormatAddresses($ARegAddr, $APhysAddr)
  137. {
  138. if ( $ARegAddr == $APhysAddr )
  139. {
  140. return $APhysAddr;
  141. }
  142. else
  143. {
  144. return 'Рег.:' .$ARegAddr. "\n" . 'Факт:' .$APhysAddr;
  145. }
  146. }
  147. function FormatProfession($APlace, $AProfession )
  148. {
  149. if ( empty($APlace) )
  150. return $AProfession;
  151. elseif ( empty($AProfession) )
  152. return $APlace;
  153. else
  154. return $APlace.', '.$AProfession;
  155. }
  156. function FormatBornDateAndAge($AToday, $ABornDate)
  157. {
  158. return Date2Readable($ABornDate).' ('.CalcAge($ABornDate,$AToday).')';
  159. }
  160. function FormatBornDateAndAgeLong($AToday, $ABornDate)
  161. {
  162. $vResult = Date2ReadableLong($ABornDate);
  163. return $vResult . ', полных лет '.CalcAge($ABornDate, $AToday);
  164. }
  165. function FormatSex($AValue)
  166. {
  167. return $AValue?'М':'Ж';
  168. }
  169. function& GetWorkableAgesList()
  170. {
  171. static $vList;
  172. if ( empty($vList) )
  173. {
  174. $vDB = GetDB();
  175. $vList = array(
  176. $vDB->GetRBList('rb_workable_ages', 'is_male', 'min_age', false),
  177. $vDB->GetRBList('rb_workable_ages', 'is_male', 'max_age', false));
  178. }
  179. return $vList;
  180. }
  181. function IsWorkableAge($AToday, $ABornDate, $AIsMale)
  182. {
  183. $vAge = CalcAge($ABornDate, $AToday);
  184. $vWorkableAges = GetWorkableAgesList();
  185. return @($vWorkableAges[0][$AIsMale] <= $vAge && $vAge <= $vWorkableAges[1][$AIsMale]);
  186. }
  187. function FormatWorkableAge($AToday, $ABornDate, $AIsMale)
  188. {
  189. if ( IsWorkableAge($AToday, $ABornDate, $AIsMale) )
  190. return 'трудосп. возраст';
  191. else
  192. return 'нетрудосп. возраст';
  193. }
  194. function& GetDocTypesList()
  195. {
  196. static $vList;
  197. if ( empty($vList) )
  198. {
  199. $vDB = GetDB();
  200. $vList = $vDB->GetRBList('rb_doc_types', 'id', 'name', false);
  201. }
  202. return $vList;
  203. }
  204. function FormatDocument($ADocTypeID, $ASeries, $ANumber)
  205. {
  206. $vList = GetDocTypesList();
  207. $vResult = @$vList[$ADocTypeID];
  208. if ( !empty($ASeries) )
  209. $vResult .= ' серия ' .$ASeries;
  210. if ( !empty($ANumber) )
  211. $vResult .= ' № '.$ANumber;
  212. return trim($vResult);
  213. }
  214. function& GetSMOList()
  215. {
  216. static $vList;
  217. if ( empty($vList) )
  218. {
  219. $vDB = GetDB();
  220. $vList = $vDB->GetRBList('rb_insurance_companies', 'id', 'long_name', false);
  221. }
  222. return $vList;
  223. }
  224. function FormatPolis($ACompanyID, $ASeries, $ANumber)
  225. {
  226. $vList = GetSMOList();
  227. $vResult = @$vList[$ACompanyID];
  228. if ( empty($vResult) )
  229. $vResult = @$vList[0];
  230. if ( !empty($ASeries) )
  231. $vResult .= ' серия ' .$ASeries;
  232. if ( !empty($ANumber) )
  233. $vResult .= ' № '.$ANumber;
  234. return trim($vResult);
  235. }
  236. function FormatPolisEx($ACompanyID, $ASeries, $ANumber)
  237. {
  238. $vList = GetSMOList();
  239. $vResult = @$vList[$ACompanyID];
  240. if ( !empty($ASeries) )
  241. $vResult .= ' серия ' .$ASeries;
  242. if ( !empty($ANumber) )
  243. $vResult .= ' № '.$ANumber;
  244. return trim($vResult);
  245. }
  246. function& GetCategoriesList()
  247. {
  248. static $vList;
  249. if ( empty($vList) )
  250. {
  251. $vDB = GetDB();
  252. $vList = $vDB->GetRBList('rb_employment_categories', 'id', 'name', false);
  253. }
  254. return $vList;
  255. }
  256. function FormatCategory($AID)
  257. {
  258. // $vDB = GetDB();
  259. // $vRecord = $vDB->GetById('rb_employment_categories', $AID);
  260. // $vResult = trim(@$vRecord['name']);
  261. // return $vResult;
  262. $vList = GetCategoriesList();
  263. $vResult = trim(@$vList[$AID]);
  264. return $vResult;
  265. }
  266. function& GetTraumaTypesList()
  267. {
  268. static $vList;
  269. if ( empty($vList) )
  270. {
  271. $vDB = GetDB();
  272. $vList = $vDB->GetRBList('rb_trauma_types', 'id', 'name', false);
  273. }
  274. return $vList;
  275. }
  276. function FormatTraumaType($AID)
  277. {
  278. // $vDB = GetDB();
  279. // $vRecord = $vDB->GetById('rb_trauma_types', $AID);
  280. // $vResult = trim(@$vRecord['name']);
  281. $vList = GetTraumaTypesList();
  282. $vResult = trim(@$vList[$AID]);
  283. return $vResult;
  284. }
  285. function FormatDisability($ADisability)
  286. {
  287. switch ( $ADisability )
  288. {
  289. case 2 : return 'утрачена';
  290. case 1 : return 'сохранена';
  291. default : return '';
  292. }
  293. }
  294. function FormatAntitetanus($AID, $ASeries)
  295. {
  296. $vDB = GetDB();
  297. $vRecord = $vDB->GetById('rb_antitetanus', $AID);
  298. $vResult = trim(@$vRecord['name'].' '.$ASeries);
  299. return $vResult;
  300. }
  301. function FormatDynamic($AID)
  302. {
  303. $vDB = GetDB();
  304. $vRecord = $vDB->GetById('rb_dynamics', $AID);
  305. $vResult = trim(iconv('utf-8', 'cp1251',@$vRecord['name']));
  306. return $vResult;
  307. }
  308. function FormatManipulation($AID, $AText)
  309. {
  310. $vDB = GetDB();
  311. $vRecord = $vDB->GetById('rb_manipulations', $AID);
  312. $vResult = trim(iconv('utf-8', 'cp1251',@$vRecord['name']).' '.iconv('utf-8', 'cp1251',$AText));
  313. return $vResult;
  314. }
  315. function& GetClinicalOutcomesList()
  316. {
  317. static $vList;
  318. if ( empty($vList) )
  319. {
  320. $vDB = GetDB();
  321. $vList = $vDB->GetRBList('rb_clinical_outcomes', 'id', 'name', true);
  322. }
  323. return $vList;
  324. }
  325. function FormatClinicalOutcome($AID, $ANotes = '')
  326. {
  327. // $vDB = GetDB();
  328. // $vRecord = $vDB->GetById('rb_clinical_outcomes', $AID);
  329. // $vResult = trim(@$vRecord['name']);
  330. $vList = GetClinicalOutcomesList();
  331. $vResult = trim(@$vList[$AID] . ' '. $ANotes);
  332. return $vResult;
  333. }
  334. function& GetUsersFullNameList()
  335. {
  336. static $vList;
  337. if ( empty($vList) )
  338. {
  339. $vDB = GetDB();
  340. $vList = $vDB->GetRBList('users','id', 'full_name', false);
  341. }
  342. return $vList;
  343. }
  344. function FormatUserName($AID)
  345. {
  346. $vList = GetUsersFullNameList();
  347. $vResult = trim(@$vList[$AID]);
  348. return $vResult;
  349. }
  350. function& GetBranchInfo($AID=NULL)
  351. {
  352. static $vInfo;
  353. if ( empty($AID) )
  354. $AID = 1; // force default id
  355. if ( empty($vInfo) || $vInfo['id'] != $AID)
  356. {
  357. $vDB = GetDB();
  358. $vInfo = $vDB->GetById('branches', $AID);
  359. if ( !is_array($vInfo) )
  360. {
  361. $vInfo = array();
  362. $vInfo['id'] = $AID;
  363. }
  364. }
  365. return $vInfo;
  366. }
  367. /////////////////////////////////////////////////////////
  368. function tcfName($AID, &$ARow)
  369. {
  370. return htmlspecialchars($ARow['last_name'].' '.$ARow['first_name'].' '.$ARow['patr_name']);
  371. }
  372. function tcfBornDate($ADate, &$ARow)
  373. {
  374. $vBornDate = $ARow['born_date'];
  375. return htmlspecialchars(FormatBorndateAndAge($ADate, $vBornDate));
  376. }
  377. function tcfSex($ASex)
  378. {
  379. return htmlspecialchars(FormatSex($ASex));
  380. }
  381. function tcfAddress($AID, &$ARow)
  382. {
  383. $vRegAddr = FormatAddress(@$ARow['addr_reg_street'], @$ARow['addr_reg_num'], @$ARow['addr_reg_subnum'], @$ARow['addr_reg_apartment']);
  384. $vPhysAddr = FormatAddress(@$ARow['addr_phys_street'], @$ARow['addr_phys_num'], @$ARow['addr_phys_subnum'], @$ARow['addr_phys_apartment']);
  385. if ( $vRegAddr == $vPhysAddr )
  386. {
  387. return htmlspecialchars($vPhysAddr);
  388. }
  389. else
  390. {
  391. return htmlspecialchars('Рег.:' .$vRegAddr).
  392. '<br>'.
  393. htmlspecialchars('Факт:' .$vPhysAddr);
  394. }
  395. }
  396. function tcfUserName($AID)
  397. {
  398. return htmlspecialchars(FormatUserName($AID));
  399. }
  400. class TCasesTable extends TTable
  401. {
  402. function TCasesTable($ATable, $ACols, $AFilter, $AOrder)
  403. {
  404. $this->TTable($ATable, $ACols, $AFilter, $AOrder, 'id');
  405. $this->AddColumn('id', '№', array('align'=>'right'));
  406. $this->AddDateColumn('create_time', 'Дата и время обращения');
  407. $this->AddColumn('first_doctor_id', 'Врач', array('align'=>'left', 'fmt'=>'tcfUserName'));
  408. $this->AddColumn('id', 'Фамилия Имя Отчество', array('align'=>'left', 'fmt'=>'tcfName'));
  409. $this->AddColumn('create_time', 'Дата рождения, полных лет', array('align'=>'left', 'fmt'=>'tcfBornDate'));
  410. $this->AddColumn('is_male', 'Пол', array('align'=>'center', 'fmt'=>'tcfSex'));
  411. $this->AddTextColumn('diagnosis', 'Диагноз');
  412. $this->AddColumn('diagnosis_mkb', 'МКБ');
  413. }
  414. }
  415. class TCasesTableEx extends TTable
  416. {
  417. function TCasesTableEx($ATable, $ACols, $AFilter, $AOrder)
  418. {
  419. $this->TTable($ATable, $ACols, $AFilter, $AOrder, 'id');
  420. $this->AddColumn('id', '№', array('align'=>'right'));
  421. $this->AddDateColumn('create_time', 'Дата и время обращения');
  422. $this->AddColumn('first_doctor_id', 'Врач', array('align'=>'left', 'fmt'=>'tcfUserName'));
  423. $this->AddColumn('id', 'Фамилия Имя Отчество', array('align'=>'left', 'fmt'=>'tcfName'));
  424. $this->AddColumn('create_time', 'Дата рождения, полных лет', array('align'=>'left', 'fmt'=>'tcfBornDate'));
  425. $this->AddColumn('is_male', 'Пол', array('align'=>'center', 'fmt'=>'tcfSex'));
  426. $this->AddTextColumn('accident', 'Что произошло');
  427. $this->AddDateColumn('accident_datetime', 'Дата и время происшествия');
  428. $this->AddTextColumn('diagnosis', 'Диагноз');
  429. $this->AddColumn('diagnosis_mkb', 'МКБ');
  430. }
  431. }
  432. ?>