immun updates (#4145)
[openemr.git] / interface / reports / ippf_cyp_report.php
blob234e6f0a7687a7c006ee6ea1de617e268fd75eaa
1 <?php
3 /**
4 * ippf_cyp_report.
6 * @package OpenEMR
7 * @link http://www.open-emr.org
8 * @author Rod Roark <rod@sunsetsystems.com>
9 * @author Brady Miller <brady.g.miller@gmail.com>
10 * @copyright Copyright (c) 2009-2010 Rod Roark <rod@sunsetsystems.com>
11 * @copyright Copyright (c) 2017-2019 Brady Miller <brady.g.miller@gmail.com>
12 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
15 require_once("../globals.php");
16 require_once("$srcdir/patient.inc");
18 use OpenEMR\Common\Acl\AclMain;
19 use OpenEMR\Common\Csrf\CsrfUtils;
20 use OpenEMR\Core\Header;
22 if (!empty($_POST)) {
23 if (!CsrfUtils::verifyCsrfToken($_POST["csrf_token_form"])) {
24 CsrfUtils::csrfNotVerified();
28 function formatcyp($amount)
30 if ($amount) {
31 return sprintf("%.2f", $amount);
34 return '';
37 function display_desc($desc)
39 if (preg_match('/^\S*?:(.+)$/', $desc, $matches)) {
40 $desc = $matches[1];
43 return $desc;
46 function thisLineItem($patient_id, $encounter_id, $description, $transdate, $qty, $cypfactor, $irnumber = '')
48 global $product, $productcyp, $producttotal, $productqty, $grandtotal, $grandqty;
50 $invnumber = empty($irnumber) ? "$patient_id.$encounter_id" : $irnumber;
51 $rowcyp = sprintf('%01.2f', $cypfactor);
52 $rowresult = sprintf('%01.2f', $rowcyp * $qty);
54 $rowproduct = $description;
55 if (! $rowproduct) {
56 $rowproduct = 'Unknown';
59 if ($product != $rowproduct) {
60 if ($product) {
61 // Print product total.
62 if ($_POST['form_csvexport']) {
63 if (! $_POST['form_details']) {
64 echo csvEscape(display_desc($product)) . ',';
65 echo csvEscape($productqty) . ',';
66 echo csvEscape(formatcyp($productcyp)) . ',';
67 echo csvEscape(formatcyp($producttotal)) . "\n";
69 } else {
72 <tr bgcolor="#ddddff">
73 <td class="detail" colspan="<?php echo $_POST['form_details'] ? 3 : 1; ?>">
74 <?php
75 if ($_POST['form_details']) {
76 echo xlt('Total for ');
78 echo text(display_desc($product)); ?>
79 </td>
80 <td class="dehead" align="right">
81 <?php echo text($productqty); ?>
82 </td>
83 <td class="dehead" align="right">
84 <?php echo text(formatcyp($productcyp)); ?>
85 </td>
86 <td class="dehead" align="right">
87 <?php echo text(formatcyp($producttotal)); ?>
88 </td>
89 </tr>
90 <?php
91 } // End not csv export
94 $producttotal = 0;
95 $productqty = 0;
96 $product = $rowproduct;
97 $productleft = $product;
98 $productcyp = $rowcyp;
101 if ($_POST['form_details']) {
102 if ($_POST['form_csvexport']) {
103 echo csvEscape(display_desc($product)) . ',';
104 echo csvEscape(oeFormatShortDate(display_desc($transdate))) . ',';
105 echo csvEscape(display_desc($invnumber)) . ',';
106 echo csvEscape(display_desc($qty)) . ',';
107 echo csvEscape(formatcyp($rowcyp)) . ',';
108 echo csvEscape(formatcyp($rowresult)) . "\n";
109 } else {
112 <tr>
113 <td class="detail">
114 <?php echo text(display_desc($productleft));
115 $productleft = "&nbsp;"; ?>
116 </td>
117 <td class="dehead">
118 <?php echo text(oeFormatShortDate($transdate)); ?>
119 </td>
120 <td class="detail">
121 <?php echo text($invnumber); ?>
122 </td>
123 <td class="dehead" align="right">
124 <?php echo text($qty); ?>
125 </td>
126 <td class="dehead" align="right">
127 <?php echo text(formatcyp($rowcyp)); ?>
128 </td>
129 <td class="dehead" align="right">
130 <?php echo text(formatcyp($rowresult)); ?>
131 </td>
132 </tr>
133 <?php
134 } // End not csv export
135 } // end details
136 $producttotal += $rowresult;
137 $grandtotal += $rowresult;
138 $productqty += $qty;
139 $grandqty += $qty;
140 } // end function
142 if (! AclMain::aclCheckCore('acct', 'rep')) {
143 die(xlt("Unauthorized access."));
146 $form_from_date = (isset($_POST['form_from_date'])) ? DateToYYYYMMDD($_POST['form_from_date']) : date('Y-m-d');
147 $form_to_date = (isset($_POST['form_to_date'])) ? DateToYYYYMMDD($_POST['form_to_date']) : date('Y-m-d');
148 $form_facility = $_POST['form_facility'];
150 if ($_POST['form_csvexport']) {
151 header("Pragma: public");
152 header("Expires: 0");
153 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
154 header("Content-Type: application/force-download");
155 header("Content-Disposition: attachment; filename=ippf_cyp_report.csv");
156 header("Content-Description: File Transfer");
157 // CSV headers:
158 if ($_POST['form_details']) {
159 echo csvEscape("Item") . ',';
160 echo csvEscape("Date") . ',';
161 echo csvEscape("Invoice") . ',';
162 echo csvEscape("Qty") . ',';
163 echo csvEscape("CYP") . ',';
164 echo csvEscape("Result") . "\n";
165 } else {
166 echo csvEscape("Item") . ',';
167 echo csvEscape("Qty") . ',';
168 echo csvEscape("CYP") . ',';
169 echo csvEscape("Result") . "\n";
171 } else { // not export
173 <html>
174 <head>
176 <title><?php echo xlt('CYP Report') ?></title>
178 <?php Header::setupHeader(['datetime-picker']); ?>
180 <script>
181 $(function () {
182 var win = top.printLogSetup ? top : opener.top;
183 win.printLogSetup(document.getElementById('printbutton'));
185 $('.datepicker').datetimepicker({
186 <?php $datetimepicker_timepicker = false; ?>
187 <?php $datetimepicker_showseconds = false; ?>
188 <?php $datetimepicker_formatInput = true; ?>
189 <?php require($GLOBALS['srcdir'] . '/js/xl/jquery-datetimepicker-2-5-4.js.php'); ?>
190 <?php // can add any additional javascript settings to datetimepicker here; need to prepend first setting with a comma ?>
193 </script>
195 </head>
197 <body leftmargin='0' topmargin='0' marginwidth='0' marginheight='0'>
198 <center>
200 <h2><?php echo xlt('CYP Report')?></h2>
202 <form method='post' action='ippf_cyp_report.php' onsubmit='return top.restoreSession()'>
203 <input type="hidden" name="csrf_token_form" value="<?php echo attr(CsrfUtils::collectCsrfToken()); ?>" />
205 <table border='0' cellpadding='3'>
207 <tr>
208 <td>
209 <?php
210 // Build a drop-down list of facilities.
212 $query = "SELECT id, name FROM facility ORDER BY name";
213 $fres = sqlStatement($query);
214 echo " <select name='form_facility'>\n";
215 echo " <option value=''>-- All Facilities --\n";
216 while ($frow = sqlFetchArray($fres)) {
217 $facid = $frow['id'];
218 echo " <option value='" . attr($facid) . "'";
219 if ($facid == $form_facility) {
220 echo " selected";
223 echo ">" . text($frow['name']) . "\n";
226 echo " </select>\n";
228 &nbsp;<?php echo xlt('From')?>:
229 <input type='text' class='datepicker' name='form_from_date' id="form_from_date" size='10' value='<?php echo attr(oeFormatShortDate($form_from_date)); ?>'>
230 &nbsp;<?php echo xlt('To{{Range}}')?>:
231 <input type='text' class='datepicker' name='form_to_date' id="form_to_date" size='10' value='<?php echo attr(oeFormatShortDate($form_to_date)); ?>'>
232 &nbsp;
233 <input type='checkbox' name='form_details' value='1'<?php echo ($_POST['form_details']) ? " checked" : ""; ?>><?php echo xlt('Details') ?>
234 &nbsp;
235 <input type='submit' name='form_refresh' value="<?php echo xla('Refresh') ?>">
236 &nbsp;
237 <input type='submit' name='form_csvexport' value="<?php echo xla('Export to CSV') ?>">
238 &nbsp;
239 <input type='button' value='<?php echo xla('Print'); ?>' id='printbutton' />
240 </td>
241 </tr>
243 <tr>
244 <td height="1">
245 </td>
246 </tr>
248 </table>
250 <table border='0' cellpadding='1' cellspacing='2' width='98%'>
252 <tr bgcolor="#dddddd">
253 <td class="dehead">
254 <?php echo xlt('Item') ?>
255 </td>
256 <?php if ($_POST['form_details']) { ?>
257 <td class="dehead">
258 <?php echo xlt('Date') ?>
259 </td>
260 <td class="dehead">
261 <?php echo xlt('Invoice') ?>
262 </td>
263 <?php } ?>
264 <td class="dehead" align="right">
265 <?php echo xlt('Qty') ?>
266 </td>
267 <td class="dehead" align="right">
268 <?php echo xlt('CYP') ?>
269 </td>
270 <td class="dehead" align="right">
271 <?php echo xlt('Result') ?>
272 </td>
273 </tr>
274 <?php
275 } // end not export
277 // If generating a report.
279 if ($_POST['form_refresh'] || $_POST['form_csvexport']) {
280 $from_date = $form_from_date;
281 $to_date = $form_to_date;
283 $product = "";
284 $productleft = "";
285 $productcyp = 0;
286 $producttotal = 0; // total of results for product
287 $grandtotal = 0; // grand total of results
288 $productqty = 0;
289 $grandqty = 0;
291 $sqlBindArray = array();
293 $query = "SELECT b.pid, b.encounter, b.code_type, b.code, b.units, " .
294 "b.code_text, c.cyp_factor, fe.date, fe.facility_id, fe.invoice_refno " .
295 "FROM billing AS b " .
296 "JOIN codes AS c ON c.code_type = '12' AND c.code = b.code AND c.modifier = b.modifier AND c.cyp_factor > 0 " .
297 "JOIN form_encounter AS fe ON fe.pid = b.pid AND fe.encounter = b.encounter " .
298 "WHERE b.code_type = 'MA' AND b.activity = 1 AND " .
299 "fe.date >= ? AND fe.date <= ?";
300 array_push($sqlBindArray, $from_date . ' 00:00:00', $to_date . ' 23:59:59');
302 // If a facility was specified.
303 if ($form_facility) {
304 $query .= " AND fe.facility_id = ?";
305 array_push($sqlBindArray, $form_facility);
308 $query .= " ORDER BY b.code, fe.date, fe.id";
310 $res = sqlStatement($query, $sqlBindArray);
311 while ($row = sqlFetchArray($res)) {
312 thisLineItem(
313 $row['pid'],
314 $row['encounter'],
315 $row['code'] . ' ' . $row['code_text'],
316 substr($row['date'], 0, 10),
317 $row['units'],
318 $row['cyp_factor'],
319 $row['invoice_refno']
323 $sqlBindArray = array();
325 $query = "SELECT s.sale_date, s.quantity, s.pid, s.encounter, " .
326 "d.name, d.cyp_factor, fe.date, fe.facility_id, fe.invoice_refno " .
327 "FROM drug_sales AS s " .
328 "JOIN drugs AS d ON d.drug_id = s.drug_id AND d.cyp_factor > 0 " .
329 "JOIN form_encounter AS fe ON " .
330 "fe.pid = s.pid AND fe.encounter = s.encounter AND " .
331 "fe.date >= ? AND fe.date <= ? " .
332 "WHERE s.fee != 0";
333 array_push($sqlBindArray, $from_date . ' 00:00:00', $to_date . ' 23:59:59');
335 // If a facility was specified.
336 if ($form_facility) {
337 $query .= " AND fe.facility_id = ?";
338 array_push($sqlBindArray, $form_facility);
341 $query .= " ORDER BY d.name, fe.date, fe.id";
343 $res = sqlStatement($query, $sqlBindArray);
344 while ($row = sqlFetchArray($res)) {
345 thisLineItem(
346 $row['pid'],
347 $row['encounter'],
348 $row['name'],
349 substr($row['date'], 0, 10),
350 $row['quantity'],
351 $row['cyp_factor'],
352 $row['invoice_refno']
356 if ($_POST['form_csvexport']) {
357 if (! $_POST['form_details']) {
358 echo csvEscape(display_desc($product)) . ',';
359 echo csvEscape($productqty) . ',';
360 echo csvEscape(formatcyp($productcyp)) . ',';
361 echo csvEscape(formatcyp($producttotal)) . "\n";
363 } else {
366 <tr bgcolor="#ddddff">
367 <td class="detail" colspan="<?php echo $_POST['form_details'] ? 3 : 1; ?>">
368 <?php
369 if ($_POST['form_details']) {
370 echo xlt('Total for ');
372 echo text(display_desc($product)); ?>
373 </td>
374 <td class="dehead" align="right">
375 <?php echo text($productqty); ?>
376 </td>
377 <td class="dehead" align="right">
378 <?php echo text(formatcyp($productcyp)); ?>
379 </td>
380 <td class="dehead" align="right">
381 <?php echo text(formatcyp($producttotal)); ?>
382 </td>
383 </tr>
385 <tr bgcolor="#ffdddd">
386 <td class="detail" colspan="<?php echo $_POST['form_details'] ? 3 : 1; ?>">
387 <?php echo xlt('Grand Total'); ?>
388 </td>
389 <td class="dehead" align="right">
390 <?php echo text($grandqty); ?>
391 </td>
392 <td class="dehead" align="right">
393 &nbsp;
394 </td>
395 <td class="dehead" align="right">
396 <?php echo text(formatcyp($grandtotal)); ?>
397 </td>
398 </tr>
400 <?php
401 } // End not csv export
402 } // end report generation
404 if (! $_POST['form_csvexport']) {
407 </table>
408 </form>
409 </center>
410 </body>
411 </html>
412 <?php
413 } // End not csv export