org.openmrs.module.openhmis.cashier.web.controller.BillAddEditController.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.openhmis.cashier.web.controller.BillAddEditController.java

Source

/*
 * The contents of this file are subject to the OpenMRS Public License
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and
 * limitations under the License.
 *
 * Copyright (C) OpenHMIS.  All Rights Reserved.
 */
package org.openmrs.module.openhmis.cashier.web.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.Patient;
import org.openmrs.PatientIdentifier;
import org.openmrs.api.APIException;
import org.openmrs.api.AdministrationService;
import org.openmrs.api.PatientService;
import org.openmrs.api.context.Context;
import org.openmrs.module.openhmis.cashier.ModuleSettings;
import org.openmrs.module.openhmis.cashier.api.IBillService;
import org.openmrs.module.openhmis.cashier.api.ICashierOptionsService;
import org.openmrs.module.openhmis.cashier.api.model.Bill;
import org.openmrs.module.openhmis.cashier.api.model.CashierOptions;
import org.openmrs.module.openhmis.cashier.api.model.Timesheet;
import org.openmrs.module.openhmis.cashier.api.util.PrivilegeConstants;
import org.openmrs.module.openhmis.cashier.api.util.TimesheetUtil;
import org.openmrs.module.openhmis.cashier.web.CashierWebConstants;
import org.openmrs.module.openhmis.commons.api.util.UrlUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.util.UriUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.util.Set;

/**
 * Controller to manage the Bill page.
 */
@Controller
@RequestMapping(value = CashierWebConstants.BILL_PAGE)
public class BillAddEditController {

    private static final Log LOG = LogFactory.getLog(BillAddEditController.class);

    private AdministrationService adminService;
    private ICashierOptionsService cashOptService;

    @Autowired
    public BillAddEditController(AdministrationService adminService, ICashierOptionsService cashOptService) {
        this.adminService = adminService;
        this.cashOptService = cashOptService;
    }

    @RequestMapping(method = RequestMethod.GET)
    public String bill(ModelMap model, @RequestParam(value = "billUuid", required = false) String billUuid,
            @RequestParam(value = "patientUuid", required = false) String patientUuid, HttpServletRequest request) {
        Timesheet timesheet = null;
        try {
            timesheet = TimesheetUtil.getCurrentTimesheet();
        } catch (Exception e) {
            LOG.error("Error retrieving provider for current user. ", e);
            timesheet = null;
            return "redirect:/login.htm";

        }

        if (timesheet == null && TimesheetUtil.isTimesheetRequired()) {
            return buildRedirectUrl(request);
        }

        model.addAttribute("timesheet", timesheet);
        model.addAttribute("user", Context.getAuthenticatedUser());
        model.addAttribute("url", buildUrlModelAttribute(request));

        boolean showAdjustmentReasonField = Boolean
                .parseBoolean(adminService.getGlobalProperty(ModuleSettings.ADJUSTMENT_REASEON_FIELD));
        model.addAttribute("showAdjustmentReasonField", showAdjustmentReasonField);

        boolean allowBillAdjustment = Boolean
                .parseBoolean(adminService.getGlobalProperty(ModuleSettings.ALLOW_BILL_ADJUSTMENT));
        model.addAttribute("allowBillAdjustment", allowBillAdjustment);

        boolean autofillPaymentAmount = Boolean
                .parseBoolean(adminService.getGlobalProperty(ModuleSettings.AUTOFILL_PAYMENT_AMOUNT));
        model.addAttribute("autofillPaymentAmount", autofillPaymentAmount);

        CashierOptions options = cashOptService.getOptions();
        String roundingItemUuid = options.getRoundingItemUuid();
        model.addAttribute("roundingItemUuid", roundingItemUuid);

        if (billUuid != null) {
            handleExistingBill(model, billUuid);
        } else {
            addPatientAttributes(model, patientUuid);
            model.addAttribute("showPrint", true);
            model.addAttribute("cashPoint", timesheet != null ? timesheet.getCashPoint() : null);
        }

        return CashierWebConstants.BILL_PAGE;
    }

    private void handleExistingBill(ModelMap model, String billUuid) {
        Bill bill = getBillFromService(billUuid);
        if (bill != null) {
            Patient patient = bill.getPatient();
            addBillAttributes(model, bill, patient);
        }
    }

    private void addPatientAttributes(ModelMap model, String patientUuid) {
        if (patientUuid != null) {
            Patient patient = getPatientFromService(patientUuid);

            String patientIdentifier = null;
            if (patient != null) {
                patientIdentifier = getPreferedPatientIdentifier(patient);
            }
            model.addAttribute("patient", patient);
            model.addAttribute("patientIdentifier", patientIdentifier);
        }
    }

    private String getPreferedPatientIdentifier(Patient patient) {
        String patientIdentifier = null;

        Set<PatientIdentifier> identifiers = patient.getIdentifiers();
        for (PatientIdentifier id : identifiers) {
            if (id.getPreferred()) {
                patientIdentifier = id.getIdentifier();
            }
        }

        return patientIdentifier;
    }

    private Patient getPatientFromService(String patientUuid) {
        PatientService service = Context.getPatientService();
        Patient patient;
        try {
            patient = service.getPatientByUuid(patientUuid);
        } catch (APIException e) {
            LOG.error("Error when trying to get Patient with ID <" + patientUuid + ">", e);
            throw new APIException("Error when trying to get Patient with ID <" + patientUuid + ">");
        }

        return patient;
    }

    private void addBillAttributes(ModelMap model, Bill bill, Patient patient) {
        model.addAttribute("bill", bill);
        model.addAttribute("billAdjusted", bill.getBillAdjusted());
        model.addAttribute("adjustedBy", bill.getAdjustedBy());
        model.addAttribute("patient", patient);
        model.addAttribute("cashPoint", bill.getCashPoint());
        model.addAttribute("adjustmentReason", bill.getAdjustmentReason());
        if (!bill.isReceiptPrinted()
                || (bill.isReceiptPrinted() && Context.hasPrivilege(PrivilegeConstants.REPRINT_RECEIPT))) {
            model.addAttribute("showPrint", true);
        }
    }

    private Bill getBillFromService(String billUuid) {
        IBillService service = Context.getService(IBillService.class);
        Bill bill;

        try {
            bill = service.getByUuid(billUuid);
        } catch (APIException e) {
            LOG.error("Error when trying to get bill with ID <" + billUuid + ">", e);
            throw new APIException("Error when trying to get bill with ID <" + billUuid + ">");
        }

        return bill;
    }

    private String buildUrlModelAttribute(HttpServletRequest request) {
        return UrlUtil.formUrl(CashierWebConstants.BILL_PAGE)
                + ((request.getQueryString() != null) ? "?" + request.getQueryString() : "");
    }

    private String buildRedirectUrl(HttpServletRequest request) {
        String redirectUrl = "redirect:" + UrlUtil.formUrl(CashierWebConstants.CASHIER_PAGE);
        String returnUrlParam = "?returnUrl=" + UrlUtil.formUrl(CashierWebConstants.BILL_PAGE);
        String requestQueryParam = "";

        if (request.getQueryString() != null) {
            requestQueryParam = encodeRequestQuery(request);
        }

        return redirectUrl + returnUrlParam + requestQueryParam;
    }

    private String encodeRequestQuery(HttpServletRequest request) {
        String requestQueryParam = "";
        try {
            requestQueryParam = UriUtils.encodeQuery("?" + request.getQueryString(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            LOG.error("UnsupportedEncodingException occured when trying to encode request query", e);
        }

        return requestQueryParam;
    }
}