dashboard-ps.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. @extends ('layouts.template')
  2. @section('content')
  3. <style>
  4. #dashboard-mcp tr.thin th,
  5. #dashboard-mcp tr.thin td,
  6. #dashboard-mcp .dashboard-stats-table tr td,
  7. #dashboard-mcp .dashboard-stats-table tr th {
  8. padding: 0.25em;
  9. font-weight: normal;
  10. }
  11. #dashboard-dna table.appointments tr td {
  12. vertical-align: middle;
  13. }
  14. </style>
  15. <div id="dashboard-dna">
  16. <div class="p-3">
  17. <div class="">
  18. <div class="row mcp-theme-1" id="pro-dashboard-container">
  19. <div class="col-md-3 mcp-theme-1">
  20. <div class="mb-4">
  21. <div class="pro-dashboard-inline-calendar"></div>
  22. </div>
  23. <div class="card mb-4" stag-collapsible-card="dna-key-numbers">
  24. <div class="card-header pl-2">
  25. <strong>
  26. Key Numbers
  27. </strong>
  28. </div>
  29. <div class="card-body p-0">
  30. <table class="table table-sm mb-0">
  31. <tbody>
  32. <tr>
  33. <th class="px-2 text-center">{{$pro->patientsCountAsDna()}}<th>
  34. <th class="pl-2">
  35. <a class="font-weight-normal" href="{{route('dna.my-patients')}}" native target="_blank" open-in-stag-popup popup-style="tall" title="Patients ">Charts Pending My Review </a>
  36. </th>
  37. </tr>
  38. </tbody>
  39. </table>
  40. </div>
  41. </div>
  42. <div class="card mb-4" stag-collapsible-card="dna-practice-management" collapsed>
  43. <div class="card-header pl-2">
  44. <strong>
  45. Practice Management
  46. </strong>
  47. </div>
  48. <div class="card-body p-0">
  49. <table class="table table-sm mb-0">
  50. <tbody>
  51. <tr class="thin">
  52. <th colspan="2" class="font-weight-normal px-2 pl-2">Billing & Reimbursement</th>
  53. </tr>
  54. <tr class="thin">
  55. <th class="font-weight-normal px-2 pl-4">{{friendly_date_time($performer->pro->getNextPaymentDateAsDna(), false)}}</th>
  56. <th class="font-weight-normal pl-2">Next Payment Date</th>
  57. </tr>
  58. <tr class="thin">
  59. <th class="font-weight-normal px-2 pl-4">
  60. ${{friendly_money($performer->pro->balance)}}</th>
  61. <th class="font-weight-normal pl-2 w-100"><a
  62. href="/practice-management/financial-transactions">Current balance</a></th>
  63. </tr>
  64. <tr class="thin">
  65. <th class="font-weight-normal px-2 pl-4">
  66. ${{friendly_money($performer->pro->getProcessingAmountAsDna())}}</th>
  67. <th class="font-weight-normal pl-2"><a
  68. href="/practice-management/bills-under-processing">Processing</a></th>
  69. </tr>
  70. </tbody>
  71. </table>
  72. </div>
  73. </div>
  74. </div>
  75. <div class="col-md-9">
  76. <div class="row mcp-theme-1">
  77. <div class="col-md-6 mcp-theme-1">
  78. <!-- ENCOUNTERS PENDING MY REVIEW -->
  79. <div class="card mb-4">
  80. <div class="card-header pl-2">
  81. <strong>
  82. Charts Pending My Review
  83. </strong>
  84. </div>
  85. <div class="card-body p-0">
  86. @include('app.dna.dashboard.encounters_pending_my_review_dashboard')
  87. </div>
  88. </div>
  89. </div>
  90. <div class="col-md-6 mcp-theme-1">
  91. <div class="card mb-4">
  92. <div class="card-header pl-2">
  93. <strong>
  94. Messages
  95. </strong>
  96. </div>
  97. <div class="card-body p-0">
  98. @include('app.dna.dashboard.messages')
  99. </div>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. <div class="stag-popup stag-popup-md ticket-popup mcp-theme-1" stag-popup-key="ticket-popup"></div>
  109. <script>
  110. (function () {
  111. let datesWithEvents = [],
  112. selectedDate = '{{ date('Y-m-d') }}',
  113. calendarElem = null,
  114. currentMonth = null,
  115. currentYear = null,
  116. appointmentsLoaded = false;
  117. function formatDate(date) {
  118. let d = new Date(date),
  119. month = '' + (d.getMonth() + 1),
  120. day = '' + d.getDate(),
  121. year = d.getFullYear();
  122. if (month.length < 2)
  123. month = '0' + month;
  124. if (day.length < 2)
  125. day = '0' + day;
  126. return [year, month, day].join('-');
  127. }
  128. function onDateChange(_newDate) {
  129. // ajax load appts list as markup directly from server
  130. selectedDate = _newDate;
  131. $.get('/pro-dashboard-events-display/' + selectedDate + '/' + selectedDate, function (_data) {
  132. let apptscontainer = $('#dna-dashboard-appointments');
  133. apptscontainer.html(_data);
  134. initFastLoad(apptscontainer);
  135. initMoes();
  136. });
  137. }
  138. function loadEventDates(_refDate = false) {
  139. let today = new Date(_refDate ? _refDate : '{{date('Y-m-d')}}'),
  140. firstOfMonth = new Date(today.getFullYear(), today.getMonth(), 1),
  141. lastOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
  142. selectedDate = null;
  143. $('td.day.active').removeClass('active');
  144. $.get('/pro-dashboard-event-dates/' +
  145. formatDate(firstOfMonth) + '/' +
  146. formatDate(lastOfMonth), (_data) => {
  147. datesWithEvents = _data;
  148. calendarElem.datepicker('refresh');
  149. currentMonth = firstOfMonth.getMonth();
  150. currentYear = firstOfMonth.getFullYear();
  151. if (!_refDate && $('td.day[data-date="{{$milliseconds}}"]:visible').length) {
  152. $('td.day[data-date="{{$milliseconds}}"]:visible').first().click();
  153. }
  154. appointmentsLoaded = true;
  155. }, 'json');
  156. }
  157. function getFormattedCurrentDate() {
  158. let date = new Date();
  159. let day = date.getDate();
  160. day = day < 10 ? '0' + day : day;
  161. return date.getFullYear() + '-' + parseInt(date.getMonth() + 1) + '-' + day;
  162. }
  163. function init(_target = null) {
  164. if(_target && _target !== '.stag-content') return;
  165. calendarElem = $('.pro-dashboard-inline-calendar');
  166. calendarElem.datepicker({
  167. dateFormat: 'yy-mm-dd',
  168. onSelect: function (_date) {
  169. onDateChange(_date);
  170. },
  171. onChangeMonthYear: function (_year, _month) {
  172. let date = _year + '-' + (_month < 10 ? '0' : '') + _month + '-05';
  173. loadEventDates(date);
  174. },
  175. beforeShowDay: function (d) {
  176. if (datesWithEvents && datesWithEvents.indexOf(formatDate(d)) !== -1) {
  177. return [true, 'has-events'];
  178. }
  179. return [true, 'no-events'];
  180. },
  181. defaultDate: 0
  182. });
  183. let date = new Date();
  184. let day = date.getDate();
  185. day = day < 10 ? '0' + day : day;
  186. let mon = parseInt(date.getMonth() + 1);
  187. mon = mon < 10 ? '0' + mon : mon;
  188. let dateStr = date.getFullYear() + '-' + mon + '-' + day;
  189. loadEventDates(dateStr);
  190. onDateChange(getFormattedCurrentDate());
  191. selectedDate = getFormattedCurrentDate();
  192. $(document)
  193. .off('click', '.ack-client-pro-change')
  194. .on('click', '.ack-client-pro-change', function () {
  195. let trigger = $(this).text('…');
  196. $.post('/api/clientProChange/accept', {
  197. uid: $(this).attr('data-uid')
  198. }, _data => {
  199. if (!hasResponseError(_data)) {
  200. trigger.hide();
  201. let doneElem = $('<i class="text-success fa fa-check"></i>');
  202. doneElem.insertAfter(trigger);
  203. setTimeout(() => {
  204. let ackContainer = trigger.closest('.ack-container');
  205. trigger.closest('div').slideUp('fast', function () {
  206. $(this).remove();
  207. if (!ackContainer.find('>div').length) {
  208. ackContainer.remove();
  209. }
  210. });
  211. }, 500);
  212. }
  213. }, 'json');
  214. return false;
  215. });
  216. $(document)
  217. .off('click', '.ack-client-memo')
  218. .on('click', '.ack-client-memo', function () {
  219. let trigger = $(this).text('…');
  220. $.post('/api/clientMemo/stamp', {
  221. uid: $(this).attr('data-uid')
  222. }, _data => {
  223. if (!hasResponseError(_data)) {
  224. trigger.hide();
  225. let doneElem = $('<i class="text-success fa fa-check"></i>');
  226. doneElem.insertAfter(trigger);
  227. setTimeout(() => {
  228. let tbody = trigger.closest('tbody');
  229. trigger.closest('tr').remove();
  230. if (!tbody.find('>tr').length) {
  231. tbody.closest('.ack-container').remove();
  232. }
  233. }, 500);
  234. }
  235. }, 'json');
  236. return false;
  237. });
  238. $(document)
  239. .off('click', '.ack-pro-appt-update')
  240. .on('click', '.ack-pro-appt-update', function () {
  241. let trigger = $(this).text('…');
  242. $.post('/api/appointmentConfirmationDecision/acknowledgeAsAppointmentPro', {
  243. uid: $(this).attr('data-uid')
  244. }, _data => {
  245. if (!hasResponseError(_data)) {
  246. trigger.hide();
  247. let doneElem = $('<i class="text-success fa fa-check"></i>');
  248. doneElem.insertAfter(trigger);
  249. setTimeout(() => {
  250. let ackContainer = trigger.closest('tbody');
  251. trigger.closest('tr').slideUp('fast', function () {
  252. $(this).remove();
  253. if (!ackContainer.find('>tr').length) {
  254. ackContainer.remove();
  255. }
  256. });
  257. }, 500);
  258. }
  259. }, 'json');
  260. return false;
  261. });
  262. addMCHook('refreshDashboardAppointments', function() {
  263. onDateChange(selectedDate);
  264. });
  265. }
  266. addMCInitializer('pro-dashboard', init, '#pro-dashboard-container');
  267. })();
  268. </script>
  269. @endsection