/** * Copyright 2010 Society for Health Information Systems Programmes, India (HISP India) * * This file is part of Hospital-core module. * * Hospital-core module is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * Hospital-core module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Hospital-core module. If not, see <http://www.gnu.org/licenses/>. * **/ package org.openmrs.module.hospitalcore.impl; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Concept; import org.openmrs.ConceptAnswer; import org.openmrs.ConceptClass; import org.openmrs.ConceptSet; import org.openmrs.Encounter; import org.openmrs.EncounterType; import org.openmrs.Location; import org.openmrs.Order; import org.openmrs.OrderType; import org.openmrs.Patient; import org.openmrs.api.APIException; import org.openmrs.api.context.Context; import org.openmrs.api.impl.BaseOpenmrsService; import org.openmrs.module.hospitalcore.BillingConstants; import org.openmrs.module.hospitalcore.BillingService; import org.openmrs.module.hospitalcore.LabService; import org.openmrs.module.hospitalcore.RadiologyCoreService; import org.openmrs.module.hospitalcore.concept.TestTree; import org.openmrs.module.hospitalcore.db.BillingDAO; import org.openmrs.module.hospitalcore.model.Ambulance; import org.openmrs.module.hospitalcore.model.AmbulanceBill; import org.openmrs.module.hospitalcore.model.BillableService; import org.openmrs.module.hospitalcore.model.Company; import org.openmrs.module.hospitalcore.model.Driver; import org.openmrs.module.hospitalcore.model.IndoorPatientServiceBill; import org.openmrs.module.hospitalcore.model.IndoorPatientServiceBillItem; import org.openmrs.module.hospitalcore.model.Lab; import org.openmrs.module.hospitalcore.model.MiscellaneousService; import org.openmrs.module.hospitalcore.model.MiscellaneousServiceBill; import org.openmrs.module.hospitalcore.model.PatientServiceBill; import org.openmrs.module.hospitalcore.model.PatientServiceBillItem; import org.openmrs.module.hospitalcore.model.RadiologyDepartment; import org.openmrs.module.hospitalcore.model.Receipt; import org.openmrs.module.hospitalcore.model.Tender; import org.openmrs.module.hospitalcore.model.TenderBill; import org.openmrs.module.hospitalcore.util.ConceptAnswerComparator; import org.openmrs.module.hospitalcore.util.ConceptSetComparator; import org.openmrs.module.hospitalcore.util.GlobalPropertyUtil; import org.openmrs.module.hospitalcore.util.HospitalCoreConstants; public class BillingServiceImpl extends BaseOpenmrsService implements BillingService { private Log log = LogFactory.getLog(this.getClass()); public BillingServiceImpl() { } protected BillingDAO dao; public void setDao(BillingDAO dao) { this.dao = dao; } /** * @see org.openmrs.module.billing.BillingService#countListTender() */ public int countListTender() throws APIException { return dao.countListTender(); } /** * @see org.openmrs.module.billing.BillingService#listTender(int, int) */ public List<Tender> listTender(int min, int max) throws APIException { return dao.listTender(min, max); } /** * @see org.openmrs.module.billing.BillingService#saveTender(org.openmrs.module.billing.model.Tender) */ public Tender saveTender(Tender tender) throws APIException { return dao.saveTender(tender); } /** * @see org.openmrs.module.billing.BillingService#deleteTender(org.openmrs.module.billing.model.Tender) */ public void deleteTender(Tender tender) throws APIException { dao.deleteTender(tender); } /** * @see org.openmrs.module.billing.BillingService#getTenderById(java.lang.Integer) */ public Tender getTenderById(Integer id) throws APIException { return dao.getTenderById(id); } /** * @see org.openmrs.module.billing.BillingService#getTenderByNameAndNumber(java.lang.String, * int) */ public Tender getTenderByNameAndNumber(String name, int number) throws APIException { return dao.getTenderByNameAndNumber(name, number); } /** * @see org.openmrs.module.billing.BillingService#countListCompany() */ public int countListCompany() throws APIException { return dao.countListCompany(); } /** * @see org.openmrs.module.billing.BillingService#deleteCompany(org.openmrs.module.billing.model.Company) */ public void deleteCompany(Company company) throws APIException { dao.deleteCompany(company); } /** * @see org.openmrs.module.billing.BillingService#getCompanyById(java.lang.Integer) */ public Company getCompanyById(Integer id) throws APIException { return dao.getCompanyById(id); } /** * @see org.openmrs.module.billing.BillingService#listCompany(int, int) */ public List<Company> listCompany(int min, int max) throws APIException { return dao.listCompany(min, max); } /** * @see org.openmrs.module.billing.BillingService#saveCompany(org.openmrs.module.billing.model.Company) */ public Company saveCompany(Company company) throws APIException { return dao.saveCompany(company); } /** * @see org.openmrs.module.billing.BillingService#getCompanyByName(java.lang.String) */ public Company getCompanyByName(String name) throws APIException { return dao.getCompanyByName(name); } /** * @see org.openmrs.module.billing.BillingService#countListDriver() */ public int countListDriver() throws APIException { return dao.countListDriver(); } /** * @see org.openmrs.module.billing.BillingService#deleteDriver(org.openmrs.module.billing.model.Driver) */ public void deleteDriver(Driver driver) throws APIException { dao.deleteDriver(driver); } /** * @see org.openmrs.module.billing.BillingService#getDriverById(java.lang.Integer) */ public Driver getDriverById(Integer id) throws APIException { return dao.getDriverById(id); } /** * @see org.openmrs.module.billing.BillingService#getDriverByName(java.lang.String) */ public Driver getDriverByName(String name) throws APIException { return dao.getDriveryByName(name); } /** * @see org.openmrs.module.billing.BillingService#listDriver(int, int) */ public List<Driver> listDriver(int min, int max) throws APIException { return dao.listDriver(min, max); } /** * @see org.openmrs.module.billing.BillingService#saveDriver(org.openmrs.module.billing.model.Driver) */ public Driver saveDriver(Driver driver) throws APIException { return dao.saveDriver(driver); } /** * @see org.openmrs.module.billing.BillingService#searchCompany(java.lang.String) */ public List<Company> searchCompany(String searchText) throws APIException { return dao.searchCompany(searchText); } /** * @see org.openmrs.module.billing.BillingService#searchDriver(java.lang.String) */ public List<Driver> searchDriver(String searchText) throws APIException { return dao.searchDriver(searchText); } /** * @see org.openmrs.module.billing.BillingService#getAllCompany() */ public List<Company> getAllCompany() throws APIException { return dao.getAllCompany(); } /** * @see org.openmrs.module.billing.BillingService#getAllDriver() */ public List<Driver> getAllDriver() throws APIException { return dao.getAllDriver(); } /** * @see org.openmrs.module.billing.BillingService#countListTenderBillByCompany(org.openmrs.module.billing.model.Company) */ public int countListTenderBillByCompany(Company company) throws APIException { return dao.countListTenderBillByCompany(company); } /** * @see org.openmrs.module.billing.BillingService#getAllTenderBill() */ public List<TenderBill> getAllTenderBill() throws APIException { return dao.getAllTenderBill(); } /** * @see org.openmrs.module.billing.BillingService#getTenderBillById(java.lang.Integer) */ public TenderBill getTenderBillById(Integer tenderBillId) throws APIException { return dao.getTenderBillById(tenderBillId); } /** * @see org.openmrs.module.billing.BillingService#listTenderBillByCompany(int, int, * org.openmrs.module.billing.model.Company) */ public List<TenderBill> listTenderBillByCompany(int min, int max, Company company) throws APIException { return dao.listTenderBillByCompany(min, max, company); } /** * @see org.openmrs.module.billing.BillingService#saveTenderBill(org.openmrs.module.billing.model.TenderBill) */ public TenderBill saveTenderBill(TenderBill tenderBill) throws APIException { return dao.saveTenderBill(tenderBill); } /** * @see org.openmrs.module.billing.BillingService#getActiveTenders() */ public List<Tender> getActiveTenders() throws APIException { return dao.getActiveTenders(); } /** * @see org.openmrs.module.billing.BillingService#countListAmbulance() */ public int countListAmbulance() throws APIException { return dao.countListAmbulance(); } /** * @see org.openmrs.module.billing.BillingService#deleteAmbulance(org.openmrs.module.billing.model.Ambulance) */ public void deleteAmbulance(Ambulance ambulance) throws APIException { dao.deleteAmbulance(ambulance); } /** * @see org.openmrs.module.billing.BillingService#getAllAmbulance() */ public List<Ambulance> getAllAmbulance() throws APIException { return dao.getAllAmbulance(); } /** * @see org.openmrs.module.billing.BillingService#getAmbulanceById(java.lang.Integer) */ public Ambulance getAmbulanceById(Integer id) throws APIException { return dao.getAmbulanceById(id); } /** * @see org.openmrs.module.billing.BillingService#getAmbulanceByName(java.lang.String) */ public Ambulance getAmbulanceByName(String name) throws APIException { return dao.getAmbulanceByName(name); } /** * @see org.openmrs.module.billing.BillingService#listAmbulance(int, int) */ public List<Ambulance> listAmbulance(int min, int max) throws APIException { return dao.listAmbulance(min, max); } /** * @see org.openmrs.module.billing.BillingService#saveAmbulance(org.openmrs.module.billing.model.Ambulance) */ public Ambulance saveAmbulance(Ambulance ambulance) throws APIException { return dao.saveAmbulance(ambulance); } /** * @see org.openmrs.module.billing.BillingService#getAllAmbulanceBill() */ public List<AmbulanceBill> getAllAmbulanceBill() throws APIException { return dao.getAllAmbulanceBill(); } /** * @see org.openmrs.module.billing.BillingService#getAmbulanceBillById(java.lang.Integer) */ public AmbulanceBill getAmbulanceBillById(Integer ambulanceBillId) throws APIException { return dao.getAmbulanceBillById(ambulanceBillId); } /** * @see org.openmrs.module.billing.BillingService#saveAmbulanceBill(org.openmrs.module.billing.model.AmbulanceBill) */ public AmbulanceBill saveAmbulanceBill(AmbulanceBill ambulanceBill) throws APIException { return dao.saveAmbulanceBill(ambulanceBill); } /** * @see org.openmrs.module.billing.BillingService#countListAmbulanceBillByDriver(org.openmrs.module.billing.model.Driver) */ public int countListAmbulanceBillByDriver(Driver driver) throws APIException { return dao.countListAmbulanceBillByDriver(driver); } /** * @see org.openmrs.module.billing.BillingService#listAmbulanceBillByDriver(int, int, * org.openmrs.module.billing.model.Driver) */ public List<AmbulanceBill> listAmbulanceBillByDriver(int min, int max, Driver driver) throws APIException { return dao.listAmbulanceBillByDriver(min, max, driver); } /** * @see org.openmrs.module.billing.BillingService#getActiveAmbulances() */ public List<Ambulance> getActiveAmbulances() throws APIException { return dao.getActiveAmbulances(); } /** * @see org.openmrs.module.billing.BillingService#traversServices(org.openmrs.Concept, * java.util.Map, int) */ public String traversServices(Concept con, Map<Integer, BillableService> services) { if (con == null) return null; Collection<ConceptAnswer> answers = con.getAnswers(); ConceptClass conceptClass = con.getConceptClass(); if (answers != null && answers.size() > 0 && !conceptClass.getName().equalsIgnoreCase("Test") && !conceptClass.getName().equalsIgnoreCase("labset")) { String rs = ""; rs += "<ul>"; String child = null; for (ConceptAnswer ca : answers) { if (ca.getConcept() == con) { Concept tmpAnswerConcept = ca.getAnswerConcept(); ConceptClass tmpConceptClass = tmpAnswerConcept.getConceptClass(); Integer id = tmpAnswerConcept.getConceptId(); if (ca.getAnswerConcept().getAnswers() == null || ca.getAnswerConcept().getAnswers().size() == 0 || tmpConceptClass.getName().equalsIgnoreCase("Test") || tmpConceptClass.getName().equalsIgnoreCase("labset") || tmpConceptClass.getName().equalsIgnoreCase("Procedure")) { rs += "<li>"; rs += "<input name='cons' type='checkbox' value='" + id + "' >"; rs += "<label>" + tmpAnswerConcept.getName() + "</label>"; rs += "<input id='" + id + "_concept' name='" + id + "_concept' type='hidden' value='" + id + "'>"; rs += "<input id='" + id + "_name' name='" + id + "_name' type='hidden' value='" + tmpAnswerConcept.getName() + "'>"; rs += "<input id='" + id + "_shortname' name='" + id + "_shortname' type='hidden' value='" + tmpAnswerConcept.getName().getShortName() + "'>"; BillableService s = services.get(id); if (s != null) { rs += "<span style='vertical-align:middle;'>"; rs += "  <input onblur='updatePrice(this)' type='text' class='priceField' id='" + id + "_price' name='" + id + "_price' value=" + s.getPrice() + ">"; rs += "</span>"; } else { rs += "<input onblur='updatePrice(this)' type='text' class='priceField' id='" + id + "_price' name='" + id + "_price' value=''>"; } } else { rs += "<li>"; rs += "<input name='cons' type='checkbox' value='" + id + "' >"; rs += "<label>" + tmpAnswerConcept.getName() + "</label>"; rs += "<input id='" + id + "_concept' name='" + id + "_concept' type='hidden' value='" + id + "'>"; rs += "<input id='" + id + "_name' name='" + id + "_name' type='hidden' value='" + tmpAnswerConcept.getName() + "'>"; rs += "<input id='" + id + "_shortname' name='" + id + "_shortname' type='hidden' value='" + tmpAnswerConcept.getName().getShortName() + "'>"; } } child = traversServices(ca.getAnswerConcept(), services); if (child != null) rs += child; rs += "</li>"; } rs += "</ul>"; return rs; } else if (con.getConceptSets() != null && con.getConceptSets().size() > 0 && !conceptClass.getName().equalsIgnoreCase("Test") && !conceptClass.getName().equalsIgnoreCase("labset")) { String rs = ""; rs += "<ul>"; String child = null; for (ConceptSet ca : con.getConceptSets()) { if (ca.getConceptSet() == con) { Integer id = ca.getConcept().getConceptId(); ConceptClass tmpConceptClass = ca.getConcept().getConceptClass(); if (ca.getConcept().getConceptSets() == null || ca.getConceptSet().getConceptSets().size() == 0 || tmpConceptClass.getName().equalsIgnoreCase("Test") || tmpConceptClass.getName().equalsIgnoreCase("labset") || tmpConceptClass.getName().equalsIgnoreCase("Procedure")) { rs += "<li>"; rs += "<input name='cons' type='checkbox' value='" + id + "' >"; rs += "<label>" + ca.getConcept().getName() + "</label>"; rs += "<input id='" + id + "_concept' name='" + id + "_concept' type='hidden' value='" + id + "'>"; rs += "<input id='" + id + "_name' name='" + id + "_name' type='hidden' value='" + ca.getConcept().getName() + "'>"; rs += "<input id='" + id + "_shortname' name='" + id + "_shortname' type='hidden' value='" + ca.getConcept().getName().getShortName() + "'>"; BillableService s = services.get(id); if (s != null) { rs += "<input onblure='updatePrice(this)' type='text' class='priceField' id='" + id + "_price' name='" + id + "_price' value=" + s.getPrice() + ">"; } else { rs += "<input onblur='updatePrice(this)' class='priceField' type='text' id='" + id + "_price' name='" + id + "_price' value=''>"; } } else { rs += "<li>"; rs += "<input name='cons' type='checkbox' value='" + id + "' >"; rs += "<label>" + ca.getConcept().getName() + "</label>"; rs += "<input id='" + id + "_concept' name='" + id + "_concept' type='hidden' value='" + id + "'>"; rs += "<input id='" + id + "_name' name='" + id + "_name' type='hidden' value='" + ca.getConcept().getName() + "'>"; rs += "<input id='" + id + "_shortname' name='" + id + "_shortname' type='hidden' value='" + ca.getConcept().getName().getShortName() + "'>"; } } child = traversServices(ca.getConcept(), services); if (child != null) rs += child; rs += "</li>"; } rs += "</ul>"; return rs; } return null; } /** * @see org.openmrs.module.billing.BillingService#getAllServices() */ public List<BillableService> getAllServices() throws APIException { return dao.getAllServices(); } /** * @see org.openmrs.module.billing.BillingService#getServiceByConceptId(java.lang.Integer) */ public BillableService getServiceByConceptId(Integer conceptId) throws APIException { return dao.getServiceByConceptId(conceptId); } /** * @see org.openmrs.module.billing.BillingService#getServiceById(java.lang.Integer) */ public BillableService getServiceById(Integer id) throws APIException { return dao.getServiceById(id); } /** * @see org.openmrs.module.billing.BillingService#saveService(org.openmrs.module.billing.model.BillableService) */ public BillableService saveService(BillableService service) throws APIException { return dao.saveService(service); } /** * @see org.openmrs.module.billing.BillingService#saveServices(java.util.Collection) */ public void saveServices(Collection<BillableService> services) throws APIException { for (BillableService service : services) { dao.saveService(service); } } /** * @see org.openmrs.module.billing.BillingService#traversTab(org.openmrs.module.billing.model.BillableService, * int) */ public String traversTab(Concept concept, Map<Integer, BillableService> mapServices, int count) throws APIException { Integer rootConcept = Integer.valueOf(Context.getAdministrationService().getGlobalProperty( BillingConstants.GLOBAL_PROPRETY_SERVICE_CONCEPT)); Collection<ConceptAnswer> answers = concept.getAnswers(); Collection<ConceptSet> conceptSets = concept.getConceptSets(); ConceptClass conceptClass = concept.getConceptClass(); BillableService service = mapServices.get(concept.getConceptId()); if ((service == null || service.getDisable()) && concept.getConceptId().intValue() != rootConcept.intValue()) { return null; } String content = ""; String tabsLi = ""; String header = ""; if (answers != null && answers.size() > 0 && !conceptClass.getName().equalsIgnoreCase("Test") && !conceptClass.getName().equalsIgnoreCase("labset")) { // show children List<ConceptAnswer> children = new ArrayList(answers); Collections.sort(children, new ConceptAnswerComparator()); List<ConceptAnswer> noChild = new ArrayList<ConceptAnswer>(); BillableService s = null; for (ConceptAnswer ca : children) { if (ca.getConcept() == concept) { Concept tmpAnswerConcept = ca.getAnswerConcept(); s = mapServices.get(tmpAnswerConcept.getId()); if (s != null && !s.getDisable()) { ConceptClass tmpConceptClass = tmpAnswerConcept.getConceptClass(); if (tmpAnswerConcept.getAnswers() == null || tmpAnswerConcept.getAnswers().size() == 0 || tmpConceptClass.getName().equalsIgnoreCase("Test") || tmpConceptClass.getName().equalsIgnoreCase("labset") || tmpConceptClass.getName().equalsIgnoreCase("Procedure")) { noChild.add(ca); } else { String name = StringUtils.isBlank(tmpAnswerConcept.getName().getShortName()) ? tmpAnswerConcept .getName().getName() : tmpAnswerConcept.getName().getShortName(); tabsLi += "<li><a title='" + tmpAnswerConcept.getName().getName() + "' href='#fragment-" + tmpAnswerConcept.getConceptId() + "'><span>" + name + "</span></a></li>"; } } } } ConceptAnswer tmpConcept = null; if (noChild.size() > 0) { for (int i = 1; i < noChild.size() + 1; i++) { tmpConcept = noChild.get(i - 1); BillableService tmpService = mapServices.get(tmpConcept.getAnswerConcept().getConceptId()); if (tmpService != null && !tmpService.getDisable()) { String tmp = "addToBill(\"" + tmpService.getConceptId() + "\", \"" + tmpService.getName() + "\", " + tmpService.getPrice() + ", 1);"; String name = StringUtils.isBlank(tmpService.getShortName()) ? tmpService.getName() : tmpService .getShortName(); header += "<div title='" + tmpService.getName() + "' id='box_" + tmpService.getConceptId() + "' class='udiv boxNormal' onclick='" + tmp + "' >" + name + "</div>"; } } } if (!"".equals(tabsLi)) { header += "<div id='container-" + count + "' class='divContainer'>"; count = count + 1; header += "<ul>"; header += tabsLi; header += "</ul>"; String tmp = null; for (ConceptAnswer c : children) { Concept tmpC = c.getAnswerConcept(); if ((tmpC.getAnswers() != null && tmpC.getAnswers().size() > 0) || (tmpC.getConceptSets() != null && tmpC.getConceptSets().size() > 0)) { tmp = null; tmp = traversTab(tmpC, mapServices, count); if (tmp != null) { content += "<div id='fragment-" + tmpC.getConceptId() + "'>"; content += tmp; content += "</div>"; } } count++; } if (!"".equals(content)) header += content; header += " </div>"; } } else if (conceptSets != null && conceptSets.size() > 0 && !conceptClass.getName().equalsIgnoreCase("Test") && !conceptClass.getName().equalsIgnoreCase("labset")) { // show children List<ConceptSet> children = new ArrayList(conceptSets); Collections.sort(children, new ConceptSetComparator()); List<ConceptSet> noChild = new ArrayList<ConceptSet>(); BillableService s = null; for (ConceptSet ca : children) { if (ca.getConceptSet() == concept) { Concept tmpConceptSet = ca.getConcept(); s = mapServices.get(tmpConceptSet.getId()); if (s != null && !s.getDisable()) { ConceptClass tmpConceptClass = ca.getConcept().getConceptClass(); if (tmpConceptSet.getConceptSets() == null || tmpConceptSet.getConceptSets().size() == 0 || tmpConceptClass.getName().equalsIgnoreCase("Test") || tmpConceptClass.getName().equalsIgnoreCase("labset") || tmpConceptClass.getName().equalsIgnoreCase("Procedure")) { noChild.add(ca); } else { String name = StringUtils.isBlank(tmpConceptSet.getName().getShortName()) ? tmpConceptSet .getName().getName() : tmpConceptSet.getName().getShortName(); tabsLi += "<li><a title='" + tmpConceptSet.getName().getName() + "' href='#fragment-" + tmpConceptSet.getConceptId() + "'><span>" + name + "</span></a></li>"; } } } } ConceptSet tmpConcept = null; if (noChild.size() > 0) { for (int i = 1; i < noChild.size() + 1; i++) { tmpConcept = noChild.get(i - 1); BillableService tmpService = mapServices.get(tmpConcept.getConcept().getConceptId()); if (tmpService != null && !tmpService.getDisable()) { String tmp = "addToBill(\"" + tmpService.getConceptId() + "\", \"" + tmpService.getName() + "\", " + tmpService.getPrice() + ", 1);"; String name = StringUtils.isBlank(tmpService.getShortName()) ? tmpService.getName() : tmpService .getShortName(); header += "<div title='" + tmpService.getName() + "' id='box_" + tmpService.getConceptId() + "' class='udiv boxNormal' onclick='" + tmp + "' >" + name + "</div>"; } } } if (!"".equals(tabsLi)) { header += "<div id='container-" + count + "' class='divContainer'>"; count = count + 1; header += "<ul>"; header += tabsLi; header += "</ul>"; String tmp = null; for (ConceptSet c : conceptSets) { Concept tmpC = c.getConcept(); if ((tmpC.getAnswers() != null && tmpC.getAnswers().size() > 0) || (tmpC.getConceptSets() != null && tmpC.getConceptSets().size() > 0)) { tmp = null; tmp = traversTab(tmpC, mapServices, count); if (tmp != null) { content += "<div id='fragment-" + tmpC.getConceptId() + "'>"; content += tmp; content += "</div>"; } } count++; } if (!"".equals(content)) header += content; header += " </div>"; } } return header; } /** * @see org.openmrs.module.billing.BillingService#countListPatientServiceBillByPatient(org.openmrs.Patient) */ public int countListPatientServiceBillByPatient(Patient patient) throws APIException { return dao.countListPatientServiceBillByPatient(patient); } /** * @see org.openmrs.module.billing.BillingService#getAllPatientServiceBill() */ public List<PatientServiceBill> getAllPatientServiceBill() throws APIException { return dao.getAllPatientServiceBill(); } /** * @see org.openmrs.module.billing.BillingService#getPatientServiceBillById(java.lang.Integer) */ public PatientServiceBill getPatientServiceBillById(Integer patientServiceBillId) throws APIException { return dao.getPatientServiceBillById(patientServiceBillId); } /** * @see org.openmrs.module.billing.BillingService#listPatientServiceBillByPatient(int, int, * org.openmrs.Patient) */ public List<PatientServiceBill> listPatientServiceBillByPatient(int min, int max, Patient patient) throws APIException { return dao.listPatientServiceBillByPatient(min, max, patient); } /** * @see org.openmrs.module.billing.BillingService#savePatientServiceBill(org.openmrs.module.billing.model.PatientServiceBill) */ public PatientServiceBill savePatientServiceBill(PatientServiceBill patientServiceBill) throws APIException { return dao.savePatientServiceBill(patientServiceBill); } /** * @see org.openmrs.module.billing.BillingService#saveBillEncounterAndOrder(org.openmrs.module.billing.model.PatientServiceBill, * java.lang.Integer, java.lang.Integer, java.lang.Integer) */ // public void saveBillEncounterAndOrder(PatientServiceBill bill) // throws APIException { // // Integer gpOrderType = Integer.valueOf(Context // .getAdministrationService().getGlobalProperty( // "billing.orderTypeId")); // Integer gpEncounterType = Integer.valueOf(Context // .getAdministrationService().getGlobalProperty( // "billing.encounterTypeId")); // Integer gpLocation = Integer.valueOf(Context.getAdministrationService() // .getGlobalProperty("billing.locationId")); // String medicalExaminationIds = Context.getAdministrationService() // .getGlobalProperty("billing.medicalExaminationIds"); // // EncounterType encounterType = Context.getEncounterService() // .getEncounterType(gpEncounterType); // Location location = Context.getLocationService() // .getLocation(gpLocation); // String[] meIds = medicalExaminationIds.split(","); // LabService labService = Context.getService(LabService.class); // List<Lab> labs = labService.getAllLab(); // // Set<PatientServiceBillItem> items = new // // HashSet<PatientServiceBillItem>(); // Encounter enc = new Encounter(); // enc.setCreator(bill.getCreator()); // enc.setLocation(location); // enc.setDateCreated(new Date()); // enc.setEncounterDatetime(new Date()); // enc.setProvider(bill.getCreator()); // enc.setEncounterType(encounterType); // enc.setPatient(bill.getPatient()); // Lab lab = null; // for (PatientServiceBillItem item : bill.getBillItems()) { // // PatientServiceBillItem tmpItem = item; // Concept concept = Context.getConceptService().getConcept( // item.getService().getConceptId()); // // // If item is a medical examination set // if (concept.getConceptClass().equals( // ConceptClassUtil.getMedicalExamminationClass())) { // Collection<ConceptAnswer> answers = concept.getAnswers(); // Collection<ConceptSet> conceptSets = concept.getConceptSets(); // if (answers != null && answers.size() > 0) { // for (ConceptAnswer ans : answers) { // // lab = labService.getLabByConcept( // ans.getAnswerConcept(), labs); // if (lab == null) { // // throw new APIException( // // "Can not find lab for test: " // // + concept.getDisplayString()); // log.info("Can not find lab for test: " // + concept.getDisplayString()); // } else { // Order order = new Order(); // order.setConcept(ans.getConcept()); // order.setCreator(bill.getCreator()); // order.setDateCreated(new Date()); // order.setOrderer(bill.getCreator()); // order.setPatient(bill.getPatient()); // order.setStartDate(new Date()); // order.setAccessionNumber("0"); // order.setOrderType(lab.getLabOrderType()); // order.setEncounter(enc); // // tmpItem.setOrder(order); // item.setOrder(order); // enc.addOrder(order); // } // // } // } // if (conceptSets != null && conceptSets.size() > 0) { // for (ConceptSet con : conceptSets) { // lab = labService // .getLabByConcept(con.getConcept(), labs); // if (lab == null) { // // throw new APIException( // // "Can not find lab for test: " // // + concept.getDisplayString()); // log.info("Can not find lab for test: " // + concept.getDisplayString()); // } else { // Order order = new Order(); // order.setConcept(con.getConcept()); // order.setCreator(bill.getCreator()); // order.setDateCreated(new Date()); // order.setOrderer(bill.getCreator()); // order.setPatient(bill.getPatient()); // order.setStartDate(new Date()); // order.setAccessionNumber("0"); // order.setOrderType(lab.getLabOrderType()); // order.setEncounter(enc); // // tmpItem.setOrder(order); // item.setOrder(order); // enc.addOrder(order); // } // // } // } // // } else { // lab = labService.getLabByConcept(concept, labs); // if (lab == null) { // // throw new APIException("Can not find lab for test: " // // + concept.getDisplayString()); // log.info("Can not find lab for test: " // + concept.getDisplayString()); // } else { // Order order = new Order(); // order.setConcept(concept); // order.setCreator(bill.getCreator()); // order.setDateCreated(new Date()); // order.setOrderer(Context.getAuthenticatedUser()); // order.setPatient(bill.getPatient()); // order.setStartDate(new Date()); // order.setAccessionNumber("0"); // TODO what is this ??? // order.setOrderType(lab.getLabOrderType()); // order.setEncounter(enc); // // tmpItem.setOrder(order); // item.setOrder(order); // enc.addOrder(order); // } // // } // // // items.add(tmpItem); // }// end for loop // Context.getEncounterService().saveEncounter(enc); // // bill.setBillItems(items); // savePatientServiceBill(bill); // } public void saveBillEncounterAndOrder(PatientServiceBill bill) throws APIException { Set<Integer> labConceptIds = getLabConceptIds(); Set<Integer> radiologyConceptIds = getRadiologyConceptIds(); String labEncounterTypeText = GlobalPropertyUtil.getString(BillingConstants.GLOBAL_PROPRETY_LAB_ENCOUNTER_TYPE, "LABENCOUNTER"); EncounterType labEncounterType = Context.getEncounterService().getEncounterType(labEncounterTypeText); String radiologyEncounterTypeText = GlobalPropertyUtil.getString( BillingConstants.GLOBAL_PROPRETY_RADIOLOGY_ENCOUNTER_TYPE, "RADIOLOGYENCOUNTER"); EncounterType radiologyEncounterType = Context.getEncounterService().getEncounterType(radiologyEncounterTypeText); Integer labOrderTypeId = GlobalPropertyUtil.getInteger(BillingConstants.GLOBAL_PROPRETY_LAB_ORDER_TYPE, 2); OrderType labOrderType = Context.getOrderService().getOrderType(labOrderTypeId); Integer radiologyOrderTypeId = GlobalPropertyUtil.getInteger(BillingConstants.GLOBAL_PROPRETY_RADIOLOGY_ORDER_TYPE, 8); OrderType radiologyOrderType = Context.getOrderService().getOrderType(radiologyOrderTypeId); Encounter labEncounter = null; Encounter radiologyEncounter = null; // Get medical examination class Integer medicalExaminationClassId = GlobalPropertyUtil.getInteger( HospitalCoreConstants.PROPERTY_MEDICAL_EXAMINATION, 9); ConceptClass medicalExaminationClass = Context.getConceptService().getConceptClass(medicalExaminationClassId); for (PatientServiceBillItem item : bill.getBillItems()) { Concept concept = Context.getConceptService().getConcept(item.getService().getConceptId()); // If item is a medical examination set if (concept.getConceptClass().equals(medicalExaminationClass)) { Collection<ConceptSet> conceptSets = concept.getConceptSets(); if (conceptSets != null && conceptSets.size() > 0) { for (ConceptSet con : conceptSets) { if (labConceptIds.contains(con.getConcept().getConceptId())) { labEncounter = getEncounter(bill, labEncounter, labEncounterType); Order order = addOrder(labEncounter, con.getConcept(), bill, labOrderType); item.setOrder(order); } else if (radiologyConceptIds.contains(con.getConcept().getConceptId())) { radiologyEncounter = getEncounter(bill, radiologyEncounter, radiologyEncounterType); Order order = addOrder(radiologyEncounter, con.getConcept(), bill, radiologyOrderType); item.setOrder(order); } } } } else { if (labConceptIds.contains(concept.getConceptId())) { labEncounter = getEncounter(bill, labEncounter, labEncounterType); Order order = addOrder(labEncounter, concept, bill, labOrderType); item.setOrder(order); } else if (radiologyConceptIds.contains(concept.getConceptId())) { radiologyEncounter = getEncounter(bill, radiologyEncounter, radiologyEncounterType); Order order = addOrder(radiologyEncounter, concept, bill, radiologyOrderType); item.setOrder(order); } } } if (labEncounter != null) { Context.getEncounterService().saveEncounter(labEncounter); } if (radiologyEncounter != null) { Context.getEncounterService().saveEncounter(radiologyEncounter); } savePatientServiceBill(bill); } private Set<Integer> getLabConceptIds() { Set<Integer> conceptIdSet = new HashSet<Integer>(); LabService ls = (LabService) Context.getService(LabService.class); List<Lab> labs = ls.getAllLab(); for (Lab lab : labs) { conceptIdSet.addAll(getConceptIdSet(lab.getInvestigationsToDisplay())); } return conceptIdSet; } private Set<Integer> getRadiologyConceptIds() { Set<Integer> conceptIdSet = new HashSet<Integer>(); RadiologyCoreService rcs = (RadiologyCoreService) Context.getService(RadiologyCoreService.class); List<RadiologyDepartment> departments = rcs.getAllRadiologyDepartments(); for (RadiologyDepartment department : departments) { conceptIdSet.addAll(getConceptIdSet(department.getInvestigations())); } return conceptIdSet; } private Set<Integer> getConceptIdSet(Set<Concept> concepts) { Set<Integer> conceptIdSet = new HashSet<Integer>(); for (Concept concept : concepts) { TestTree tree = new TestTree(concept); conceptIdSet.addAll(tree.getConceptIDSet()); } return conceptIdSet; } private Encounter getEncounter(PatientServiceBill bill, Encounter encounter, EncounterType encounterType) { if (encounter == null) { Encounter enc = new Encounter(); enc.setCreator(bill.getCreator()); Location location = Context.getLocationService().getLocation(1); enc.setLocation(location); enc.setDateCreated(new Date()); enc.setEncounterDatetime(new Date()); enc.setProvider(bill.getCreator()); enc.setEncounterType(encounterType); enc.setPatient(bill.getPatient()); return enc; } else { return encounter; } } private Order addOrder(Encounter encounter, Concept concept, PatientServiceBill bill, OrderType orderType) { Order order = new Order(); order.setConcept(concept); order.setCreator(bill.getCreator()); order.setDateCreated(new Date()); order.setOrderer(Context.getAuthenticatedUser()); order.setPatient(bill.getPatient()); order.setStartDate(new Date()); order.setAccessionNumber("0"); order.setOrderType(orderType); order.setEncounter(encounter); encounter.addOrder(order); return order; } /** * @see org.openmrs.module.billing.BillingService#getAllActiveCompany() */ public List<Company> getAllActiveCompany() throws APIException { return dao.getAllActiveCompany(); } /** * @see org.openmrs.module.billing.BillingService#getAllActiveDriver() */ public List<Driver> getAllActiveDriver() throws APIException { return dao.getAllActiveDriver(); } public void disableService(Integer conceptId) throws APIException { dao.disableService(conceptId); } /** * TODO void Orders after void a bill **/ public void voidBill(PatientServiceBill bill) throws APIException { bill.setVoided(true); savePatientServiceBill(bill); Patient pat = bill.getPatient(); } public int countListMiscellaneousService() throws APIException { return dao.countListMiscellaneousService(); } public int countListMiscellaneousServiceBill() throws APIException { return dao.countListMiscellaneousServiceBill(); } public List<MiscellaneousService> getAllMiscellaneousService() throws APIException { return dao.getAllMiscellaneousService(); } public List<MiscellaneousServiceBill> getAllMiscellaneousServiceBill() throws APIException { return dao.getAllMiscellaneousServiceBill(); } public MiscellaneousServiceBill getMiscellaneousServiceBillById(Integer miscellaneousServiceBillId) throws APIException { return dao.getMiscellaneousServiceBillById(miscellaneousServiceBillId); } public MiscellaneousService getMiscellaneousServiceById(Integer miscellaneousServiceId) throws APIException { return dao.getMiscellaneousServiceById(miscellaneousServiceId); } public List<MiscellaneousService> listMiscellaneousService(int min, int max) throws APIException { return dao.listMiscellaneousService(min, max); } public List<MiscellaneousServiceBill> listMiscellaneousServiceBill(int min, int max) throws APIException { return dao.listMiscellaneousServiceBill(min, max); } public MiscellaneousService saveMiscellaneousService(MiscellaneousService MiscellaneousService) throws APIException { return dao.saveMiscellaneousService(MiscellaneousService); } public MiscellaneousServiceBill saveMiscellaneousServiceBill(MiscellaneousServiceBill MiscellaneousServiceBill) throws APIException { return dao.saveMiscellaneousServiceBill(MiscellaneousServiceBill); } public void deleteMiscellaneousService(MiscellaneousService miscellaneousService) throws APIException { dao.deleteMiscellaneousService(miscellaneousService); } public MiscellaneousService getMiscellaneousServiceByName(String name) throws APIException { return dao.getMiscellaneousServiceByName(name); } public int countListMiscellaneousServiceBill(MiscellaneousService service) throws APIException { return dao.countListMiscellaneousServiceBill(service); } public List<MiscellaneousServiceBill> listMiscellaneousServiceBill(int min, int max, MiscellaneousService service) throws APIException { return dao.listMiscellaneousServiceBill(min, max, service); } public Receipt createReceipt() throws APIException { Receipt receipt = new Receipt(); receipt.setPaidDate(new Date()); return dao.createReceipt(receipt); } public void updateReceipt() throws APIException { dao.updateReceipt(); } public void updateOldBills() { dao.updateOldBills(); } /** * @see org.openmrs.module.billing.BillingService#getPatientServiceBillByReceiptId(java.lang.Integer) */ public PatientServiceBill getPatientServiceBillByReceiptId(Integer patientServiceBillReceiptId) throws APIException { return dao.getPatientServiceBillByReceiptId(patientServiceBillReceiptId); } public IndoorPatientServiceBill saveIndoorPatientServiceBill(IndoorPatientServiceBill indoorPatientServiceBill) throws APIException { return dao.saveIndoorPatientServiceBill(indoorPatientServiceBill); } public void deleteIndoorPatientServiceBill(IndoorPatientServiceBill indoorPatientServiceBill) throws APIException { dao.deleteIndoorPatientServiceBill(indoorPatientServiceBill); } public IndoorPatientServiceBill getIndoorPatientServiceBillById(Integer indoorPatientServiceBillId) throws APIException { return dao.getIndoorPatientServiceBillById(indoorPatientServiceBillId); } public void saveBillEncounterAndOrderForIndoorPatient(IndoorPatientServiceBill bill) throws APIException { Set<Integer> labConceptIds = getLabConceptIds(); Set<Integer> radiologyConceptIds = getRadiologyConceptIds(); String labEncounterTypeText = GlobalPropertyUtil.getString(BillingConstants.GLOBAL_PROPRETY_LAB_ENCOUNTER_TYPE, "LABENCOUNTER"); EncounterType labEncounterType = Context.getEncounterService().getEncounterType(labEncounterTypeText); String radiologyEncounterTypeText = GlobalPropertyUtil.getString( BillingConstants.GLOBAL_PROPRETY_RADIOLOGY_ENCOUNTER_TYPE, "RADIOLOGYENCOUNTER"); EncounterType radiologyEncounterType = Context.getEncounterService().getEncounterType(radiologyEncounterTypeText); Integer labOrderTypeId = GlobalPropertyUtil.getInteger(BillingConstants.GLOBAL_PROPRETY_LAB_ORDER_TYPE, 2); OrderType labOrderType = Context.getOrderService().getOrderType(labOrderTypeId); Integer radiologyOrderTypeId = GlobalPropertyUtil.getInteger(BillingConstants.GLOBAL_PROPRETY_RADIOLOGY_ORDER_TYPE, 8); OrderType radiologyOrderType = Context.getOrderService().getOrderType(radiologyOrderTypeId); Encounter labEncounter = null; Encounter radiologyEncounter = null; // Get medical examination class Integer medicalExaminationClassId = GlobalPropertyUtil.getInteger( HospitalCoreConstants.PROPERTY_MEDICAL_EXAMINATION, 9); ConceptClass medicalExaminationClass = Context.getConceptService().getConceptClass(medicalExaminationClassId); for (IndoorPatientServiceBillItem item : bill.getBillItems()) { Concept concept = Context.getConceptService().getConcept(item.getService().getConceptId()); // If item is a medical examination set if (concept.getConceptClass().equals(medicalExaminationClass)) { Collection<ConceptSet> conceptSets = concept.getConceptSets(); if (conceptSets != null && conceptSets.size() > 0) { for (ConceptSet con : conceptSets) { if (labConceptIds.contains(con.getConcept().getConceptId())) { labEncounter = getEncounter(bill, labEncounter, labEncounterType); Order order = addOrder(labEncounter, con.getConcept(), bill, labOrderType); item.setOrder(order); } else if (radiologyConceptIds.contains(con.getConcept().getConceptId())) { radiologyEncounter = getEncounter(bill, radiologyEncounter, radiologyEncounterType); Order order = addOrder(radiologyEncounter, con.getConcept(), bill, radiologyOrderType); item.setOrder(order); } } } } else { if (labConceptIds.contains(concept.getConceptId())) { labEncounter = getEncounter(bill, labEncounter, labEncounterType); Order order = addOrder(labEncounter, concept, bill, labOrderType); item.setOrder(order); } else if (radiologyConceptIds.contains(concept.getConceptId())) { radiologyEncounter = getEncounter(bill, radiologyEncounter, radiologyEncounterType); Order order = addOrder(radiologyEncounter, concept, bill, radiologyOrderType); item.setOrder(order); } } } /* if (labEncounter != null) { Context.getEncounterService().saveEncounter(labEncounter); } if (radiologyEncounter != null) { Context.getEncounterService().saveEncounter(radiologyEncounter); } */ saveIndoorPatientServiceBill(bill); } private Encounter getEncounter(IndoorPatientServiceBill bill, Encounter encounter, EncounterType encounterType) { if (encounter == null) { Encounter enc = new Encounter(); enc.setCreator(bill.getCreator()); Location location = Context.getLocationService().getLocation(1); enc.setLocation(location); enc.setDateCreated(new Date()); enc.setEncounterDatetime(new Date()); enc.setProvider(bill.getCreator()); enc.setEncounterType(encounterType); enc.setPatient(bill.getPatient()); Context.getEncounterService().saveEncounter(enc); return enc; } else { return encounter; } } private Order addOrder(Encounter encounter, Concept concept, IndoorPatientServiceBill bill, OrderType orderType) { Order order = new Order(); order.setConcept(concept); order.setCreator(bill.getCreator()); order.setDateCreated(new Date()); order.setOrderer(Context.getAuthenticatedUser()); order.setPatient(bill.getPatient()); order.setStartDate(new Date()); order.setAccessionNumber("0"); order.setOrderType(orderType); order.setEncounter(encounter); encounter.addOrder(order); return order; } //New Requirement add Paid bill & Free bill Both public PatientServiceBillItem getPatientServiceBillItem(Integer billId,String name) throws APIException { return dao.getPatientServiceBillItem(billId,name); } }