Exemple #1
0
 public function getAccountDetails()
 {
     $visitId = (int) $this->encounter_id;
     $ret = array('claimFiles' => array('details' => array(), 'totals' => array()), 'charges' => array('details' => array(), 'totals' => array()), 'miscCharges' => array('details' => array(), 'totals' => array()), 'payments' => array('details' => array(), 'totals' => array()), 'writeOffs' => array('details' => array(), 'totals' => array()));
     $totalBilled = 0;
     $totalPaid = 0;
     $totalWO = 0;
     $totalBalance = 0;
     foreach (ClaimFile::listClaims(array('visitId' => $visitId)) as $data) {
         $claimFile = $data['claimFile'];
         $totalBilled += (double) $claimFile->billed;
         $totalPaid += (double) $claimFile->paid;
         $totalWO += (double) $claimFile->writeOff;
         $totalBalance += (double) $claimFile->balance;
         $ret['claimFiles']['details'][] = $data;
     }
     $ret['claimFiles']['totals'] = array('billed' => $totalBilled, 'paid' => $totalPaid, 'writeOff' => $totalWO, 'balance' => $totalBalance);
     $totalBilled = 0;
     if ($this->closed) {
         $iterator = ClaimLine::mostRecentClaims($visitId);
         foreach ($iterator as $claimLine) {
             $totalBilled += (double) $claimLine->baseFee;
             $ret['charges']['details'][] = $claimLine;
         }
     } else {
         $fees = $this->calculateFees();
         $totalBilled += $fees['total'];
         $totalWO += $fees['discounted'];
         $discount = $fees['total'] - $fees['discounted'];
         if ($discount < 0) {
             $discount = 0;
         }
         $claimLine = new ClaimLine();
         $claimLine->baseFee = $fees['total'];
         $claimLine->adjustedFee = $fees['discounted'];
         $claimLine->visitId = $visitId;
         $claimLine->dateTime = $this->date_of_treatment;
         $claimLine->insuranceProgramId = $this->activePayerId;
         $claimLine->enteredBy = $this->getEnteredBy();
         $ret['charges']['details'][] = $claimLine;
         if ($discount > 0) {
             $writeOff = new WriteOff();
             $writeOff->amount = $discount;
             $writeOff->writeOffId = time();
             $writeOff->payerId = InsuranceProgram::lookupSystemId('Discounts');
             // ID of System->Discounts
             $writeOff->timestamp = $this->date_of_treatment;
             $writeOff->userId = $this->last_change_user_id > 0 ? $this->last_change_user_id : $this->created_by_user_id;
             $ret['writeOffs']['details'][] = $writeOff;
         }
     }
     $ret['charges']['totals'] = array('billed' => $totalBilled, 'paid' => 0, 'writeOff' => 0, 'balance' => 0);
     // misc charges
     $miscCharge = new MiscCharge();
     $totalBilled = 0;
     foreach ($miscCharge->getIteratorByVisitId($visitId) as $row) {
         $totalBilled += (double) $row->amount;
         $ret['miscCharges']['details'][] = $row;
     }
     $ret['miscCharges']['totals'] = array('billed' => $totalBilled, 'paid' => 0, 'writeOff' => 0, 'balance' => 0);
     $iterators = ClaimLine::getPaymentHistory(array('visitId' => $visitId, 'unposted' => true));
     $totalPaid = 0;
     $totalWO = 0;
     foreach ($iterators as $iterator) {
         foreach ($iterator as $item) {
             if ($item instanceof PostingJournal) {
                 $totalPaid += (double) $item->amount;
                 $ret['payments']['details'][] = $item;
             } else {
                 if ($item instanceof Payment) {
                     $totalPaid += (double) $item->unallocated;
                     $ret['payments']['details'][] = $item;
                 } else {
                     $totalWO += (double) $item->amount;
                     $ret['writeOffs']['details'][] = $item;
                 }
             }
         }
     }
     // payments
     $ret['payments']['totals'] = array('billed' => 0, 'paid' => $totalPaid, 'writeOff' => 0, 'balance' => 0);
     // writeoffs
     $ret['writeOffs']['totals'] = array('billed' => 0, 'paid' => 0, 'writeOff' => $totalWO, 'balance' => 0);
     return $ret;
 }
 protected function _generateXMLStatements(SimpleXMLElement $xml, $claimId)
 {
     $iterator = new ClaimLineIterator();
     $iterator->setFilters(array('claimId' => $claimId));
     $visitId = null;
     $totalPayments = 0;
     $totalCharges = 0;
     $claims = array();
     foreach ($iterator as $claimLine) {
         $claimLineId = (int) $claimLine->claimLineId;
         $visitId = (int) $claimLine->visitId;
         $payerId = (int) $claimLine->insuranceProgramId;
         $procedureCode = $claimLine->procedureCode;
         $charges = (double) $claimLine->baseFee;
         $totalCharges += $charges;
         if (!isset($visit)) {
             $visit = new Visit();
             $visit->visitId = $visitId;
             $visit->populate();
         }
         if (!isset($patientName)) {
             $patientId = (int) $visit->patientId;
             $patient = new Patient();
             $patient->personId = $patientId;
             $patient->populate();
             $patientName = $patient->person->firstName . ' ' . $patient->person->middleName . ' ' . $patient->person->lastName;
         }
         if (!isset($providerName)) {
             $providerId = (int) $visit->providerId;
             $provider = new Provider();
             $provider->personId = $providerId;
             $provider->populate();
             $providerName = $provider->person->firstName . ' ' . $provider->person->middleName . ' ' . $provider->person->lastName;
         }
         $claim = array();
         $claim['date'] = date('m/d/Y', strtotime($claimLine->dateTime));
         $claim['patient'] = $patientName;
         $claim['provider'] = $providerName;
         $claim['description'] = $claimLine->procedure;
         $claim['charges'] = number_format($charges, 2);
         $claim['credits'] = '';
         if (!isset($claims[$visitId])) {
             $claims[$visitId] = array();
         }
         $claims[$visitId][] = $claim;
     }
     if ($visitId === null) {
         return;
     }
     $miscCharge = new MiscCharge();
     $iterator = $miscCharge->getIteratorByVisitId($visitId);
     foreach ($iterator as $charge) {
         $amount = (double) $charge->amount;
         $totalCharges += $amount;
         $claim = array();
         $claim['date'] = date('m/d/Y', strtotime($charge->chargeDate));
         $claim['patient'] = $patientName;
         $claim['provider'] = $providerName;
         $description = $charge->chargeType;
         $title = $charge->title;
         if (strlen($title) > 0) {
             $description .= ': ' . $title;
         }
         $claim['description'] = $description;
         $claim['charges'] = number_format($amount, 2);
         $claim['credits'] = '';
         $id = (int) $charge->miscChargeId;
         if (!isset($claims[$id])) {
             $claims[$id] = array();
         }
         $claims[$id][] = $claim;
     }
     $iterator = new PostingJournalIterator();
     $iterator->setFilters(array('visitId' => $visitId));
     foreach ($iterator as $journal) {
         $amount = (double) $journal->amount;
         $totalPayments += $amount;
         $claim = array();
         $claim['date'] = date('m/d/Y', strtotime($journal->datePosted));
         $claim['patient'] = $patientName;
         $claim['provider'] = $providerName;
         $claim['description'] = $journal->note;
         $claim['charges'] = '';
         $claim['credits'] = number_format($amount, 2);
         $id = (int) $journal->postingJournalId;
         if (!isset($claims[$id])) {
             $claims[$id] = array();
         }
         $claims[$id][] = $claim;
     }
     $iterator = new WriteOffIterator();
     $iterator->setFilters(array('visitId' => $visitId));
     foreach ($iterator as $writeoff) {
         $amount = (double) $writeoff->amount;
         $totalPayments += $amount;
         $claim = array();
         $claim['date'] = date('m/d/Y', strtotime($writeoff->timestamp));
         $claim['patient'] = $patientName;
         $claim['provider'] = $providerName;
         $claim['description'] = $writeoff->title;
         $claim['charges'] = '';
         $claim['credits'] = number_format($amount, 2);
         $id = (int) $writeoff->writeOffId;
         if (!isset($claims[$id])) {
             $claims[$id] = array();
         }
         $claims[$id][] = $claim;
     }
     $practiceId = (int) $visit->practiceId;
     if (!$practiceId > 0) {
         $practiceId = (int) $provider->person->primaryPracticeId;
     }
     $practice = new Practice();
     $practice->practiceId = $practiceId;
     $practice->populate();
     $practiceName = $practice->name;
     $practicePrimaryLine1 = $practice->primaryAddress->line1;
     $practicePrimaryCityStateZip = $practice->primaryAddress->city . ', ' . $practice->primaryAddress->state . ' ' . $practice->primaryAddress->postalCode;
     $practiceMainPhone = $practice->mainPhone->number;
     $xmlPractice = $xml->addChild('practice');
     $this->_addChild($xmlPractice, 'name', $practiceName);
     $this->_addChild($xmlPractice, 'primaryLine1', $practicePrimaryLine1);
     $this->_addChild($xmlPractice, 'primaryCityStateZip', $practicePrimaryCityStateZip);
     $this->_addChild($xmlPractice, 'mainPhone', $practiceMainPhone);
     $insuredRelationship = InsuredRelationship::filterByPayerPersonIds($payerId, $patientId);
     $subscriberId = (int) $insuredRelationship->subscriberId;
     if ($subscriberId > 0) {
         $subscriber = $insuredRelationship->subscriber;
     } else {
         $subscriber = $insuredRelationship->person;
     }
     $xmlSubscriber = $xml->addChild('subscriber');
     $subscriberName = $subscriber->firstName . ' ' . $subscriber->middleName . ' ' . $subscriber->lastName;
     $this->_addChild($xmlSubscriber, 'name', $subscriberName);
     $address = $subscriber->address;
     $this->_addChild($xmlSubscriber, 'line1', $address->line1);
     $subscriberCityStateZip = $address->city . ', ' . $address->state . ' ' . $address->postalCode;
     $this->_addChild($xmlSubscriber, 'cityStateZip', $subscriberCityStateZip);
     $xmlBiller = $xml->addChild('biller');
     $this->_addChild($xmlBiller, 'name', $practiceName);
     $this->_addChild($xmlBiller, 'line1', $practicePrimaryLine1);
     $this->_addChild($xmlBiller, 'cityStateZip', $practicePrimaryCityStateZip);
     $xmlClaims = $xml->addChild('claims');
     $claim = array();
     $claim['date'] = ' ';
     $claim['patient'] = ' ';
     $claim['provider'] = ' ';
     $claim['description'] = ' ';
     $claim['charges'] = ' ';
     $claim['credits'] = ' ';
     ksort($claims);
     $claims = array_pad($claims, 12, array($claim));
     foreach ($claims as $key => $values) {
         foreach ($values as $claim) {
             $xmlClaimsDetails = $xmlClaims->addChild('details');
             $this->_addChild($xmlClaimsDetails, 'date', $claim['date']);
             $this->_addChild($xmlClaimsDetails, 'patientName', $claim['patient']);
             $this->_addChild($xmlClaimsDetails, 'providerName', $claim['provider']);
             $this->_addChild($xmlClaimsDetails, 'description', $claim['description']);
             $this->_addChild($xmlClaimsDetails, 'charges', $claim['charges']);
             $this->_addChild($xmlClaimsDetails, 'credits', $claim['credits']);
         }
     }
     $date = date('m/d/Y');
     $accountNumber = $patient->recordNumber;
     $totalOutstanding = $totalCharges - $totalPayments;
     $pendingInsurance = 0;
     $amount = $totalOutstanding - $pendingInsurance;
     $patientResponsibility = $amount;
     $current = $amount;
     $pastDue = 0;
     $amountDue = $amount;
     $xmlClaimsInfo = $xmlClaims->addChild('info');
     $this->_addChild($xmlClaimsInfo, 'statement', $date);
     $this->_addChild($xmlClaimsInfo, 'accountNo', $accountNumber);
     $this->_addChild($xmlClaimsInfo, 'amount', number_format($amountDue, 2));
     $xmlClaimsSummary = $xmlClaims->addChild('summary');
     $this->_addChild($xmlClaimsSummary, 'accountNumber', $accountNumber);
     $this->_addChild($xmlClaimsSummary, 'totalOutstanding', number_format($totalOutstanding, 2));
     $this->_addChild($xmlClaimsSummary, 'patientResponsibility', number_format($patientResponsibility, 2));
     $this->_addChild($xmlClaimsSummary, 'pendingInsurance', number_format($pendingInsurance, 2));
     $this->_addChild($xmlClaimsSummary, 'current', number_format($current, 2));
     $this->_addChild($xmlClaimsSummary, 'pastDue', number_format($pastDue, 2));
     $this->_addChild($xmlClaimsSummary, 'amountDue', number_format($amountDue, 2));
     file_put_contents('/tmp/claims.xml', $xml->asXML());
 }