/* * 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 java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Provider; import org.openmrs.api.APIException; import org.openmrs.api.AdministrationService; import org.openmrs.api.ProviderService; import org.openmrs.api.context.Context; import org.openmrs.module.jasperreport.JasperReport; import org.openmrs.module.jasperreport.JasperReportService; import org.openmrs.module.openhmis.cashier.ModuleSettings; import org.openmrs.module.openhmis.cashier.api.ICashPointService; import org.openmrs.module.openhmis.cashier.api.ITimesheetService; import org.openmrs.module.openhmis.cashier.api.model.CashPoint; import org.openmrs.module.openhmis.cashier.api.model.Timesheet; import org.openmrs.module.openhmis.cashier.web.CashierWebConstants; import org.openmrs.module.openhmis.cashier.web.propertyeditor.EntityPropertyEditor; import org.openmrs.module.openhmis.cashier.web.propertyeditor.ProviderPropertyEditor; import org.openmrs.module.openhmis.commons.api.ProviderUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.Errors; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; 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.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.WebRequest; /** * Controller to manahe the Cashier page. */ @Controller @RequestMapping(value = CashierWebConstants.CASHIER_PAGE) public class CashierController { private static final Log LOG = LogFactory.getLog(CashierController.class); private ITimesheetService timesheetService; private ICashPointService cashPointService; private ProviderService providerService; private JasperReportService jasperService; private AdministrationService adminService; @Autowired public CashierController(ITimesheetService timesheetService, ICashPointService cashPointService, ProviderService providerService, AdministrationService adminService) { this.timesheetService = timesheetService; this.cashPointService = cashPointService; this.providerService = providerService; this.adminService = adminService; } @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(CashPoint.class, new EntityPropertyEditor<CashPoint>(ICashPointService.class)); binder.registerCustomEditor(Provider.class, new ProviderPropertyEditor()); SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } @RequestMapping(method = RequestMethod.GET) public void render(@RequestParam(value = "providerId", required = false) Integer providerId, @RequestParam(value = "returnUrl", required = false) String returnUrl, ModelMap modelMap) { Provider provider; if (providerId != null) { provider = providerService.getProvider(providerId); } else { provider = ProviderUtil.getCurrentProvider(providerService); } if (provider == null) { throw new APIException("ERROR: Could not locate the provider. Please make sure the user is listed as provider " + "(Admin -> Manage providers)"); } String returnTo = returnUrl; if (StringUtils.isEmpty(returnTo)) { HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); returnTo = req.getHeader("Referer"); if (!StringUtils.isEmpty(returnTo)) { try { URL url = new URL(returnTo); returnTo = url.getPath(); if (StringUtils.startsWith(returnTo, req.getContextPath())) { returnTo = returnTo.substring(req.getContextPath().length()); } } catch (MalformedURLException e) { LOG.warn("Could not parse referrer url '" + returnTo + "'"); returnTo = ""; } } } // Load the current timesheet information Timesheet timesheet = timesheetService.getCurrentTimesheet(provider); if (timesheet == null) { timesheet = new Timesheet(); timesheet.setCashier(provider); timesheet.setClockIn(new Date()); } // load shift report (this must be refactored for the next version) loadShiftReport(modelMap); addRenderAttributes(modelMap, timesheet, provider, returnTo); } @RequestMapping(method = RequestMethod.POST) public String post(Timesheet timesheet, Errors errors, WebRequest request, ModelMap modelMap) { String returnUrl = request.getParameter("returnUrl"); new TimesheetEntryValidator().validate(timesheet, errors); if (errors.hasErrors()) { loadShiftReport(modelMap); addRenderAttributes(modelMap, timesheet, timesheet.getCashier(), returnUrl); return null; } timesheetService.save(timesheet); if (StringUtils.isEmpty(returnUrl)) { returnUrl = "redirect:"; } else { returnUrl = "redirect:" + returnUrl; } return returnUrl; } @ModelAttribute("cashPoints") public List<CashPoint> getCashPoints() { return cashPointService.getAll(); } private void loadShiftReport(ModelMap modelMap) { if (jasperService == null) { jasperService = Context.getService(JasperReportService.class); } JasperReport shiftReport = null; String shiftReportId = adminService.getGlobalProperty(ModuleSettings.CASHIER_SHIFT_REPORT_ID_PROPERTY); if (StringUtils.isNotEmpty(shiftReportId)) { if (StringUtils.isNumeric(shiftReportId)) { shiftReport = jasperService.getJasperReport(Integer.parseInt(shiftReportId)); if (shiftReport != null) { modelMap.addAttribute("shiftReport", shiftReport); } } } } private void addRenderAttributes(ModelMap modelMap, Timesheet timesheet, Provider cashier, String returnUrl) { modelMap.addAttribute("returnUrl", returnUrl); modelMap.addAttribute("cashier", cashier); modelMap.addAttribute("timesheet", timesheet); } }