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()); }