com.virtusa.akura.reporting.controller.StaffProfileReportController.java Source code

Java tutorial

Introduction

Here is the source code for com.virtusa.akura.reporting.controller.StaffProfileReportController.java

Source

/*
 * < KURA, This application manages the daily activities of a Teacher and a Student of a School>
 *
 * Copyright (C) 2012 Virtusa Corporation.
 * This program 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.
 *
 * This program 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.
 */

package com.virtusa.akura.reporting.controller;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
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.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.virtusa.akura.api.dto.AppointmentClassification;
import com.virtusa.akura.api.dto.AppointmentNature;
import com.virtusa.akura.api.dto.City;
import com.virtusa.akura.api.dto.CivilStatus;
import com.virtusa.akura.api.dto.Country;
import com.virtusa.akura.api.dto.Race;
import com.virtusa.akura.api.dto.Religion;
import com.virtusa.akura.api.dto.Section;
import com.virtusa.akura.api.dto.Staff;
import com.virtusa.akura.api.dto.StaffCategory;
import com.virtusa.akura.api.dto.StaffEducation;
import com.virtusa.akura.api.dto.StaffExternalActivity;
import com.virtusa.akura.api.dto.StaffProfessional;
import com.virtusa.akura.api.dto.StaffProfileReportTemplate;
import com.virtusa.akura.api.dto.StaffServiceCategory;
import com.virtusa.akura.api.exception.AkuraAppException;
import com.virtusa.akura.api.exception.AkuraConstant;
import com.virtusa.akura.api.exception.ErrorMsgLoader;
import com.virtusa.akura.common.AkuraWebConstant;
import com.virtusa.akura.common.service.CommonService;
import com.virtusa.akura.common.service.StaffCommonService;
import com.virtusa.akura.reporting.validator.StaffProfileReportValidator;
import com.virtusa.akura.staff.service.StaffService;
import com.virtusa.akura.util.DateUtil;
import com.virtusa.akura.util.PropertyReader;
import com.virtusa.akura.util.SortUtil;
import com.virtusa.akura.util.StaticDataUtil;
import com.virtusa.akura.util.reporting.ReportUtil;

/**
 * The Staff Profile Controller.
 * 
 * @author Virtusa Corporation
 */
@Controller
public class StaffProfileReportController {

    /** error message for mandatory field required. */
    private static final String ERROR_MSG_MANDATORY_FIELD_REQUIRED = "REF.UI.MANDATORY.FIELD.REQUIRED";

    /** attribute for holding message. */
    public static final String MESSAGE = "message";

    /** The Constant SELECTED_ADDMISSION. */
    private static final String SELECTED_ADDMISSION = "selectedAddmission";

    /** The Constant SELECTED_STATUS. */
    private static final String SELECTED_STATUS = "selectedStatus";

    /** The Constant POPULATE_REGISTRATION_NO_BY_STAFF_CATEGORY_HTM. */
    private static final String POPULATE_REGISTRATION_NO_BY_STAFF_CATEGORY_HTM = "/populateRegistrationNosByStaffCategoryType.htm";

    /** The Constant STAFF_CATEGORY_ID. */
    private static final String STAFF_CATEGORY_ID = "catogaryID";

    /** The constant for String "staffCategoryList". */
    private static final String STAFF_CATEGORY_LIST = "staffCategoryList";

    /** The Constant STAFF_PROFILE_REPORT_HTM. */
    private static final String STAFF_PROFILE_REPORT_HTM = "/staffProfileReport.htm";

    /** The Constant SHOW_STAFF_PROFILE_REPORT_HTM. */
    private static final String SHOW_STAFF_PROFILE_REPORT_HTM = "/showStaffProfileReport.htm";

    /** The Constant DASH. */
    private static final String DASH = " - ";

    /** The Constant STAFF_REGISTRATON_NOT_EXISTS_MSG. */
    private static final String STAFF_REGISTRATON_NOT_EXISTS_MSG = "STAFF.PROFILE.REPORT.REGNO.NOT.EXISTS";

    /** The Constant STAFF_REG_NO. */
    private static final String STAFF_REG_NO = "staffRegNo";

    /** The Constant PHOTO_FIELD. */
    private static final String PHOTO_FIELD = "photo";

    /** The Constant SEMINAR_LIST_FIELD. */
    private static final String SEMINAR_LIST_FIELD = "seminarList";

    /** The Constant SEMINAR_FIELD. */
    private static final String SEMINAR_FIELD = "seminar";

    /** The Constant EXTERNAL_ACTIVITY_LIST_FIELD. */
    private static final String EXTERNAL_ACTIVITY_LIST_FIELD = "externalActivityList";

    /** The Constant EXTERNAL_ACTIVITY_FIELD. */
    private static final String EXTERNAL_ACTIVITY_FIELD = "externalActivity";

    /** The Constant CLUB_SOCIETY_LIST_FIELD. */
    private static final String CLUB_SOCIETY_LIST_FIELD = "clubSocietyList";

    /** The Constant CLUB_SOCIETY_FIELD. */
    private static final String CLUB_SOCIETY_FIELD = "clubSociety";

    /** The Constant SPORTS_LIST_FIELD. */
    private static final String SPORTS_LIST_FIELD = "sportsList";

    /** The Constant SPORTS_FIELD. */
    private static final String SPORTS_FIELD = "sports";

    /** The Constant EXTRA_CURRICULAR_FIELD. */
    private static final String EXTRA_CURRICULAR_FIELD = "extraCurricular";

    /** The Constant SALARY_FIELD. */
    private static final String SALARY_FIELD = "salary";

    /** The Constant NO_OF_DAYS_FIELD. */
    private static final String NO_OF_DAYS_FIELD = "noOfDays";

    /** The Constant LEAVE_FIELD. */
    private static final String LEAVE_FIELD = "leave";

    /** The Constant GRADE_FIELD. */
    private static final String GRADE_FIELD = "grade";

    /** The Constant CLASS_FIELD. */
    private static final String CLASS_FIELD = "class";

    /** The Constant SERVICE_FIELD. */
    private static final String SERVICE_FIELD = "service";

    /** The Constant PROFESSIONAL_LIST_FIELD. */
    private static final String PROFESSIONAL_LIST_FIELD = "professionalList";

    /** The Constant PROFESSIONAL_FIELD. */
    private static final String PROFESSIONAL_FIELD = "professional";

    /** The Constant EDUCATIONAL_LIST_FIELD. */
    private static final String EDUCATIONAL_LIST_FIELD = "educationalList";

    /** The Constant EDUCATIONAL_FIELD. */
    private static final String EDUCATIONAL_FIELD = "educational";

    /** The Constant STAFF_CATEGORY_FIELD. */
    private static final String STAFF_CATEGORY_FIELD = "staffCategory";

    /** The Constant MEDIUM_FIELD. */
    private static final String MEDIUM_FIELD = "medium";

    /** The Constant SUBJECTS_LIST_FIELD. */
    private static final String SUBJECTS_LIST_FIELD = "subjectsList";

    /** The Constant SUBJECTS_FIELD. */
    private static final String SUBJECTS_FIELD = "subjects";

    /** The Constant APPOINTMENT_CLASSIFICATION_FIELD. */
    private static final String APPOINTMENT_CLASSIFICATION_FIELD = "appointmentClassification";

    /** The Constant APPOINTMENT_NATURE_FIELD. */
    private static final String APPOINTMENT_NATURE_FIELD = "appointmentNature";

    /** The Constant HIRE_DATE_FIELD. */
    private static final String HIRE_DATE_FIELD = "hireDate";

    /** The Constant APPOINTMENT_DATE_FIELD. */
    private static final String APPOINTMENT_DATE_FIELD = "appointmentDate";

    /** The Constant APPOINTMENT_DATE_FIELD. */
    private static final String APPOINTMENT_DATE_FIELD_FLAG = "appointmentDateFlag";

    /** The Constant GENDER_FIELD. */
    private static final String GENDER_FIELD = "gender";

    /** The Constant DATE_OF_BIRTH_FIELD. */
    private static final String DATE_OF_BIRTH_FIELD = "dateOfBirth";

    /** The Constant DATE_OF_BIRTH_FIELD. */
    private static final String DATE_OF_BIRTH_FIELD_FLAG = "dobFlag";

    /** The Constant CIVIL_STATUS_FIELD. */
    private static final String CIVIL_STATUS_FIELD = "civilStatus";

    /** The Constant RELIGION_FIELD. */
    private static final String RELIGION_FIELD = "religion";

    /** The Constant RACE_FIELD. */
    private static final String RACE_FIELD = "race";

    /** The Constant EMAIL_FIELD. */
    private static final String EMAIL_FIELD = "email";

    /** The Constant MOBILE_FIELD. */
    private static final String MOBILE_FIELD = "mobile";

    /** The Constant HOME_FIELD. */
    private static final String HOME_FIELD = "home";

    /** The Constant CONTACT_DEAILS_FIELD. */
    private static final String CONTACT_DEAILS_FIELD = "contactDeails";

    /** The Constant ADDRESS_FIELD. */
    private static final String ADDRESS_FIELD = "address";

    /** The Constant SECTION_FIELD. */
    private static final String SECTION_FIELD = "section";

    /** The Constant NAME_INITIALS_FIELD. */
    private static final String NAME_INITIALS_FIELD = "nameInitials";

    /** The Constant FULL_NAME_FIELD. */
    private static final String FULL_NAME_FIELD = "fullName";

    /** The Constant NIC_NO_FIELD. */
    private static final String NIC_NO_FIELD = "nicNo";

    /** The Constant STAFF_PROFILE_REPORT_URL. */
    private static final String STAFF_PROFILE_REPORT_URL = "staffProfileReport";

    /** The Constant REPORTING_STAFF_PROFILE_REPORT_VIEW. */
    private static final String REPORTING_STAFF_PROFILE_REPORT_VIEW = "reporting/staffProfileReport";

    /** The Constant STAFF_PROFILE_REPORT_TEMPLATE. */
    private static final String STAFF_PROFILE_REPORT_TEMPLATE = "staffProfileReportTemplate";

    /** The Constant INVOLVEMENT_OF_EXTRACURRICULAR. */
    private static final String INVOLVEMENT_OF_EXTRACURRICULAR = "StaffProfileReport_InvolvementExternalActivity";

    /** The Constant SEMINARS_DONE. */
    private static final String SEMINARS_DONE = "StaffProfileReport_Seminar";

    /** The Constant EXTERNAL_ACTIVITY. */
    private static final String EXTERNAL_ACTIVITY = "StaffProfileReport_ExternalActivity";

    /** The Constant CLUBS_SOCIETY. */
    private static final String CLUBS_SOCIETY = "StaffProfileReport_ClubsSociety";

    /** The Constant SPORTS. */
    private static final String SPORTS = "StaffProfileReport_Sports";

    /** The Constant BASIC_SALARY. */
    private static final String BASIC_SALARY = "StaffProfileReport_BasicSalary";

    /** The Constant LEAVE_COUNT_FOR_PREVIOUS_YEAR. */
    private static final String LEAVE_COUNT_FOR_PREVIOUS_YEAR = "StaffProfileReport_LeaveCount";

    /** The Constant GRADE. */
    private static final String GRADE = "StaffProfileReport_Grade";

    /** The Constant CLASS. */
    private static final String CLASS = "StaffProfileReport_Class";

    /** The Constant SERVICE. */
    private static final String SERVICE = "StaffProfileReport_Service";

    /** The Constant PROFESSIONAL_QUALIFICATIONS. */
    private static final String PROFESSIONAL_QUALIFICATIONS = "StaffProfileReport_ProfessionalQualifications";

    /** The Constant EDUCATIONAL_QUALIFICATIONS. */
    private static final String EDUCATIONAL_QUALIFICATIONS = "StaffProfileReport_EducationalQualifications";

    /** The Constant DESIGNATION_BARED. */
    private static final String DESIGNATION_BARED = "StaffProfileReport_DesignationBared";

    /** The Constant MEDIUM_OF_APPOINTMENT. */
    private static final String MEDIUM_OF_APPOINTMENT = "StaffProfileReport_MediumOfAppointment";

    /** The Constant SUBJECTS. */
    private static final String SUBJECTS = "StaffProfileReport_Subjects";

    /** The Constant CLASSIFICATION_OF_APPOINTMENT. */
    private static final String CLASSIFICATION_OF_APPOINTMENT = "StaffProfileReport_ClassificationOfAppointment";

    /** The Constant NATURE_OF_APPOINTMENT. */
    private static final String NATURE_OF_APPOINTMENT = "StaffProfileReport_NatureOfAppointment";

    /** The Constant DATE_OF_HIRE. */
    private static final String DATE_OF_HIRE = "StaffProfileReport_Date_Of_Hire";

    /** The Constant DATE_OF_FIRST_APPOINTMENT. */
    private static final String DATE_OF_FIRST_APPOINTMENT = "StaffProfileReport_Date_Of_First_Appointment";

    /** The Constant GENDER. */
    private static final String GENDER = "StaffProfileReport_Gender";

    /** The Constant DATE_OF_BIRTH. */
    private static final String DATE_OF_BIRTH = "StaffProfileReport_Date_Of_Birth";

    /** The Constant CIVIL_STATUS. */
    private static final String CIVIL_STATUS = "StaffProfileReport_Civil_Status";

    /** The Constant RELIGION. */
    private static final String RELIGION = "StaffProfileReport_Religion";

    /** The Constant RACE. */
    private static final String RACE = "StaffProfileReport_Race";

    /** The Constant EMAIL. */
    private static final String EMAIL = "StaffProfileReport_Email";

    /** The Constant MOBILE. */
    private static final String MOBILE = "StaffProfileReport_Mobile";

    /** The Constant HOME. */
    private static final String HOME = "StaffProfileReport_Home";

    /** The Constant CONTACT_DETAILS. */
    private static final String CONTACT_DETAILS = "StaffProfileReport_Contact_Details";

    /** The Constant ADDRESS. */
    private static final String ADDRESS = "StaffProfileReport_Address";

    /** The Constant SECTION. */
    private static final String SECTION = "StaffProfileReport_Section";

    /** The Constant NAME_INITIALS. */
    private static final String NAME_INITIALS = "StaffProfileReport_Name_Initials";

    /** The Constant FULL_NAME. */
    private static final String FULL_NAME = "StaffProfileReport_Full_Name";

    /** The Constant SSN_NIC_NO. */
    private static final String SSN_NIC_NO = "StaffProfileReport_NIC_No";

    /** The Constant STAFF_PROFILE_REPORT. */
    private static final String STAFF_PROFILE_REPORT = "StaffProfileReport_Title";

    /** The Staff Service. */
    private StaffService staffService;

    /** The Staff Profile Report Validator. */
    private StaffProfileReportValidator staffProfileReportValidator;

    /** The Constant DATASOURCE. */
    private static final String DATASOURCE = "datasource";

    /** The Constant LOGO_PATH. */
    private static final String LOGO_PATH = "logoPath";

    /** The Constant TITLE. */
    private static final String TITLE = "title";

    /** attribute for holding style path. */
    private static final String STYLE_PATH = "style.path";

    /** attribute for holding app home. */
    private static final String APPSERVER_HOME = "appserver.home";

    /** attribute for holding system config. */
    private static final String SYSTEM_CONFIG = "systemConfig";

    /** attribute for holding style template. */
    private static final String STYLE_TEMPLATE = "styleTemplate";

    /** property file name. */
    private static final String SYSTEM_CONFIG_PROPERTIES = "systemConfig";

    /** key to define the image folder path. */
    private static final String IMAGE_FOLDER_PATH = "imageFolder.path";

    /** key to define the image file format. */
    private static final String FILE_EXT = ".jpg";

    /** The Constant REPORT_GENERATED_ON. */
    private static final String REPORT_GENERATED_ON = "reportGeneratedOn";

    /** variable for holding string "generatedDate". */
    private static final String GENERATED_DATE = "generatedDate";

    /** The Constant PAGE. */
    private static final String PAGE = "page";

    /** The Constant GPL. */
    private static final String GPL = "GPLComment";

    /** The Constant REPORT_PAGE. */
    private static final String REPORT_PAGE = "Report_page";

    /** The Constant REPORT_GENERATED_ON_TEXT. */
    private static final String REPORT_GENERATED_ON_TEXT = "Report_reportGeneratedOn";

    /** model attribute for report generated date. */
    private static final String REPORT_GENERATED_DATE_LOCALE = "REPORT.GENERATED.DATE.LOCALE";

    /** key to hold string of year end date. */
    private static final String END_DATE = "-12-31";

    /** key to hold string of year start date. */
    private static final String START_DATE = "-01-01";

    /** The Constant DEPARTURE_DATE_KEY. */
    private static final String DEPARTURE_DATE_KEY = "dateDeparture";

    /** The Constant DEPARTURE_DATE_VALUE. */
    private static final String DEPARTURE_DATE_VALUE = "departureDate";

    /** attribute for holding DATE_DEPARTURE_FIELD_KEY. */
    private static final String DATE_DEPARTURE_FIELD_KEY = "StaffPresentAndAbsentDays_Report_DateTodeparture";

    /** The Constant model attribute. */
    private static final String MODEL_ATT_SELECTED_STAFF_CATEGORY_ID = "selectedStaffCategoryId";

    /** The Constant SELECTED_CLASS. */
    private static final String SELECTED_CATEGORY = "selectedCategory";

    /** The String of Model attribute. */
    private static final String MODEL_ATT_SELECTED_ADDMISSION_NO = "selectedAddmissionNo";

    /** The String of Model attribute. */
    private static final String MODEL_ATT_SELECTED_STATUS = "selectedStatus";

    /** model attribute of LastList object. */
    private static final String MODEL_CONTENTS_LIST = "contentsList";

    /** The Constant PAGE. */
    private static final String FLAG = "Flag";

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWENTYFIVE = 25;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWENTYFOUR = 24;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWENTYTHREE = 23;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWENTYTWO = 22;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWENTYONE = 21;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWENTY = 20;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_NINETEEN = 19;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_EIGHTEEN = 18;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_SEVENTEEN = 17;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_SIXTEEN = 16;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_FIFTEEN = 15;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_FOURTEEN = 14;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_THIRTEEN = 13;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TWELVE = 12;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_ELEVEN = 11;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_TEN = 10;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_NINE = 9;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_EIGHT = 8;

    /** The Constant INDEX_SEVEN. */
    private static final int INDEX_SEVEN = 7;

    /** The Constant INDEX_SIX. */
    private static final int INDEX_SIX = 6;

    /** The Constant INDEX_FIVE. */
    private static final int INDEX_FIVE = 5;

    /** The Constant INDEX_FOUR. */
    private static final int INDEX_FOUR = 4;

    /** The Constant INDEX_THREE. */
    private static final int INDEX_THREE = 3;

    /** request attribute of `ToList` value. */
    private static final String REQUEST_TO_LIST = "ToList";

    /** Represents the array that selected to the 'FromList'. */
    private static final String REMOVED_FROM_ARRAY = "removedFromArray";

    /** Represents the array that selected to the 'ToList'. */
    private static final String SELECTED_ARRAY = "selectedArray";

    /** The Constant DATASOURCE_KEY. */
    private static final String MAINREPORT_DATASOURCE = "datasource";

    /** The Sting variable for report constant. */
    private static final String REQ_FLAG = "flag";

    /** The Sting variable for report constant. */
    private static final Float FLOAT_ZERO = -0.0F;

    /** key to hold date format. */
    private static final String DATE_FORMAT = "yyyy-MM-dd";

    /** Represents the array that selected toList. */
    private static final String SELECTED_TO_LIST = "selectedToList";

    /**
     * staffCommonService To invoke service methods.
     */
    private StaffCommonService staffCommonService;

    /**
     * CommonService To invoke service methods.
     */
    private CommonService commonService;

    /**
     * Set StaffCommonService.
     * 
     * @param staffCommonServiceRef of type StaffCommonService
     */
    public void setStaffCommonService(StaffCommonService staffCommonServiceRef) {

        this.staffCommonService = staffCommonServiceRef;
    }

    /**
     * Set Staff Service.
     * 
     * @param staffServiceRef staffService
     */
    public void setStaffService(StaffService staffServiceRef) {

        this.staffService = staffServiceRef;
    }

    /**
     * Set StaffProfileReportValidator.
     * 
     * @param staffProfileReportValidatorRef staffService
     */
    public void setStaffProfileReportValidator(StaffProfileReportValidator staffProfileReportValidatorRef) {

        this.staffProfileReportValidator = staffProfileReportValidatorRef;
    }

    /**
     * Set Common Service Service.
     * 
     * @param commonServic CommonService
     */
    public void setCommonService(CommonService commonServic) {

        this.commonService = commonServic;
    }

    /**
     * intiBinder method is to bind date class with the date format.
     * 
     * @param binder - data binder used to register the Date objects.
     */
    @InitBinder
    public void initBinder(final WebDataBinder binder) {

        binder.getBindingResult();
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

    }

    /**
     * Display Form View for of the controller and binding it to staffProfileReportTemplate.
     * 
     * @param modelMap of type ModelMap
     * @param staffCategory of the staff
     * @throws AkuraAppException AkuraAppException
     * @return java.lang.String
     */

    @RequestMapping(value = SHOW_STAFF_PROFILE_REPORT_HTM, method = RequestMethod.GET)
    public String showReportForm(ModelMap modelMap, StaffCategory staffCategory) throws AkuraAppException {

        modelMap.addAttribute(STAFF_PROFILE_REPORT_TEMPLATE, new StaffProfileReportTemplate());

        Map<Integer, String> contentsList = populateReportData(staffCategory);
        modelMap.addAttribute(MODEL_CONTENTS_LIST, contentsList);
        return REPORTING_STAFF_PROFILE_REPORT_VIEW;
    }

    /**
     * Perform the logic of the controller to Generate Exam Results Report.
     * 
     * @param response of type HttpServletResponse
     * @param staffProfileReportTemplate - model object
     * @param errors - BindingResult
     * @param request - HttpServletRequest
     * @return modelAndView
     * @param modelMap of type modelMap.
     * @throws AkuraAppException AkuraAppException
     * @throws ParseException ParseException
     */

    @RequestMapping(value = STAFF_PROFILE_REPORT_HTM)
    public ModelAndView onSubmit(HttpServletResponse response,
            @ModelAttribute(STAFF_PROFILE_REPORT_TEMPLATE) StaffProfileReportTemplate staffProfileReportTemplate,
            BindingResult errors, HttpServletRequest request, ModelMap modelMap)
            throws AkuraAppException, ParseException {

        String redirectURL = STAFF_PROFILE_REPORT_URL;
        Map<String, Object> map = new HashMap<String, Object>();
        String[] toListStr1 = new String[] { "2", String.valueOf(INDEX_THREE), String.valueOf(INDEX_FOUR),
                String.valueOf(INDEX_FIVE), String.valueOf(INDEX_SIX), String.valueOf(INDEX_SEVEN),
                String.valueOf(INDEX_EIGHT), String.valueOf(INDEX_NINE), String.valueOf(INDEX_TEN),
                String.valueOf(INDEX_ELEVEN), String.valueOf(INDEX_TWELVE), String.valueOf(INDEX_THIRTEEN),
                String.valueOf(INDEX_FOURTEEN), String.valueOf(INDEX_FIFTEEN), String.valueOf(INDEX_SIXTEEN),
                String.valueOf(INDEX_SEVENTEEN), String.valueOf(INDEX_EIGHTEEN), String.valueOf(INDEX_NINETEEN),
                String.valueOf(INDEX_TWENTY), String.valueOf(INDEX_TWENTYONE), String.valueOf(INDEX_TWENTYTWO),
                String.valueOf(INDEX_TWENTYTHREE), String.valueOf(INDEX_TWENTYFOUR),
                String.valueOf(INDEX_TWENTYFIVE) };

        String selectedAddmission = request.getParameter(SELECTED_ADDMISSION);
        String selectedStatus = request.getParameter(SELECTED_STATUS);
        String selectedCategory = request.getParameter(SELECTED_CATEGORY);
        String selectedList = null;
        String fromList = null;
        StaffCategory staffCategory = staffCommonService.getStaffCategory(Integer.parseInt(selectedCategory));

        String flag = request.getParameter(REQ_FLAG);
        boolean booleanFlag = Boolean.parseBoolean(flag);
        if (!booleanFlag) {
            toListStr1 = request.getParameterValues(REQUEST_TO_LIST);
            selectedList = (String) request.getParameter(SELECTED_ARRAY);
            fromList = (String) request.getParameter(REMOVED_FROM_ARRAY);
        }
        map.put(DEPARTURE_DATE_KEY, AkuraWebConstant.EMPTY_STRING);
        if (selectedCategory != null) {
            if (selectedCategory.equals(AkuraConstant.STRING_ZERO)) {
                String message = new ErrorMsgLoader().getErrorMessage(ERROR_MSG_MANDATORY_FIELD_REQUIRED);
                modelMap.addAttribute(MESSAGE, message);
                modelMap.addAttribute(MODEL_ATT_SELECTED_STATUS, selectedStatus);
                redirectURL = REPORTING_STAFF_PROFILE_REPORT_VIEW;
                return new ModelAndView(redirectURL, map);
            }
        }
        if (selectedStatus != null) {
            if (selectedStatus.equals(AkuraConstant.STRING_ZERO)) {

                String message = new ErrorMsgLoader().getErrorMessage(ERROR_MSG_MANDATORY_FIELD_REQUIRED);
                modelMap.addAttribute(MESSAGE, message);
                if (staffCategory != null) {
                    modelMap.addAttribute(MODEL_ATT_SELECTED_STAFF_CATEGORY_ID, staffCategory.getCatogaryID());
                } else {
                    modelMap.addAttribute(MODEL_ATT_SELECTED_STAFF_CATEGORY_ID, 0);
                }
                modelMap.addAttribute(MODEL_ATT_SELECTED_ADDMISSION_NO, selectedAddmission);
                modelMap.addAttribute(MODEL_ATT_SELECTED_STATUS, selectedStatus);
                modelMap.addAttribute(SELECTED_TO_LIST, selectedList);
                modelMap.addAttribute(REMOVED_FROM_ARRAY, fromList);
                if (toListStr1 == null) {
                    redirectURL = showReportForm(modelMap, staffCategory);
                } else {
                    redirectURL = REPORTING_STAFF_PROFILE_REPORT_VIEW;
                }
                return new ModelAndView(redirectURL, map);
            }
        }
        if (selectedAddmission != null) {
            staffProfileReportTemplate.setStaffRegNo(selectedAddmission);
        } else {
            if (staffCategory != null) {
                modelMap.addAttribute(MODEL_ATT_SELECTED_STAFF_CATEGORY_ID, staffCategory.getCatogaryID());
            }
            modelMap.addAttribute(MODEL_ATT_SELECTED_STATUS, selectedStatus);
            modelMap.addAttribute(SELECTED_TO_LIST, selectedList);
            modelMap.addAttribute(REMOVED_FROM_ARRAY, fromList);
            if (toListStr1 == null) {
                redirectURL = showReportForm(modelMap, staffCategory);
            } else {
                redirectURL = REPORTING_STAFF_PROFILE_REPORT_VIEW;
            }
            return new ModelAndView(redirectURL, map);
        }
        staffProfileReportValidator.validate(staffProfileReportTemplate, errors);
        if (errors.hasErrors()) {
            if (staffCategory != null) {
                modelMap.addAttribute(MODEL_ATT_SELECTED_STAFF_CATEGORY_ID, staffCategory.getCatogaryID());
            }
            modelMap.addAttribute(MODEL_ATT_SELECTED_ADDMISSION_NO, selectedAddmission);
            modelMap.addAttribute(MODEL_ATT_SELECTED_STATUS, selectedStatus);
            modelMap.addAttribute(SELECTED_TO_LIST, selectedList);
            modelMap.addAttribute(REMOVED_FROM_ARRAY, fromList);
            if (toListStr1 == null) {
                redirectURL = showReportForm(modelMap, staffCategory);
            } else {
                redirectURL = REPORTING_STAFF_PROFILE_REPORT_VIEW;
            }

            return new ModelAndView(redirectURL, map);

        } else {
            String staffRegNo = staffProfileReportTemplate.getStaffRegNo().trim();
            if (selectedAddmission.equals(AkuraConstant.STRING_ZERO)) {
                String message = new ErrorMsgLoader().getErrorMessage(ERROR_MSG_MANDATORY_FIELD_REQUIRED);
                modelMap.addAttribute(MESSAGE, message);

                if (staffCategory != null) {
                    modelMap.addAttribute(MODEL_ATT_SELECTED_STAFF_CATEGORY_ID, staffCategory.getCatogaryID());
                } else {
                    modelMap.addAttribute(MODEL_ATT_SELECTED_STAFF_CATEGORY_ID, 0);
                }

                modelMap.addAttribute(MODEL_ATT_SELECTED_STATUS, selectedStatus);
                modelMap.addAttribute(SELECTED_TO_LIST, selectedList);
                modelMap.addAttribute(REMOVED_FROM_ARRAY, fromList);
                if (toListStr1 == null) {
                    redirectURL = showReportForm(modelMap, staffCategory);
                } else {
                    redirectURL = REPORTING_STAFF_PROFILE_REPORT_VIEW;
                }
                return new ModelAndView(redirectURL, map);
            }
            if (staffService.isValidRegistrationNo(staffRegNo)) {

                int staffId = staffService.findStaffIdForRegistrationNo(staffRegNo);

                Staff staff = staffService.findStaff(staffId);

                String year = AkuraWebConstant.EMPTY_STRING;
                if (staff != null && staff.getDateOfDeparture() != null) {
                    year = DateUtil.getStringYear(staff.getDateOfDeparture());
                }

                if (year != AkuraWebConstant.EMPTY_STRING) {
                    Date departureDateObj = staff.getDateOfDeparture();
                    map.put(DEPARTURE_DATE_KEY,
                            PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_DEPARTURE_FIELD_KEY));
                    map.put(DEPARTURE_DATE_VALUE, DateUtil.getFormatDate(departureDateObj));

                } else {
                    map.put(DEPARTURE_DATE_VALUE, AkuraWebConstant.SPACE);
                }

                List<StaffProfileReportTemplate> staffProfileList = staffService
                        .getStaffProfileTemplateByStaffId(staffId);

                if (staffProfileList != null && !staffProfileList.isEmpty()) {
                    generateReport(map, staff, staffProfileList, toListStr1);
                }
            } else {
                errors.rejectValue(STAFF_REG_NO, STAFF_REGISTRATON_NOT_EXISTS_MSG);
                redirectURL = REPORTING_STAFF_PROFILE_REPORT_VIEW;
            }
        }
        return new ModelAndView(redirectURL, map);
    }

    /**
     * Perform the logic of the controller to Generate Staff Profile Report.
     * 
     * @param map Map object with staff profile report data
     * @param staff staff object
     * @param staffProfileList staff profile list
     * @param toListStr1 String array with selected data
     * @throws AkuraAppException - throws when fails.
     * @throws ParseException - throws when fails.
     */
    public void generateReport(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList, String[] toListStr1)
            throws AkuraAppException, ParseException {

        setDefaultStaffProfileReportProperties(map);
        // Set Staff Profile Report properties.
        if (toListStr1 == null) {
            populateStaffPersonalDetails(map, staffProfileList);
        } else {
            int[] toList = new int[toListStr1.length];
            for (int i = 0; i < toListStr1.length; i++) {
                toList[i] = Integer.parseInt(toListStr1[i]);
            }
            populateStaffPersonalDetails(map, staffProfileList);

            if (staff != null) {

                for (int i = 0; i < toList.length; i++) {

                    switch (toList[i]) {
                    case 2:
                        populateStaffSection(map, staff, staffProfileList);
                        break;
                    case INDEX_THREE:
                        populateStaffAddress(map, staff, staffProfileList);
                        break;
                    case INDEX_FOUR:
                        populateStaffContactDetails(map, staff, staffProfileList);
                        break;
                    case INDEX_FIVE:
                        populateStaffRace(map, staff, staffProfileList);
                        break;
                    case INDEX_SIX:
                        populateStaffReligion(map, staff, staffProfileList);
                        break;
                    case INDEX_SEVEN:
                        populateStaffCivilStatus(map, staff, staffProfileList);
                        break;
                    case INDEX_EIGHT:
                        populateStaffDateOfBirth(map, staff, staffProfileList);
                        break;
                    case INDEX_NINE:
                        populateStaffGender(map, staff, staffProfileList);
                        break;
                    case INDEX_TEN:
                        populateStaffDateOfAppointment(map, staff, staffProfileList);
                        break;
                    case INDEX_ELEVEN:
                        populateStaffDateOfHire(map, staff, staffProfileList);
                        break;
                    case INDEX_TWELVE:
                        populateStaffNatureOfAppointment(map, staff, staffProfileList);
                        break;
                    case INDEX_THIRTEEN:
                        populateStaffClassificationOfAppointment(map, staff, staffProfileList);
                        break;
                    case INDEX_FOURTEEN:
                        //if(staff.getStaffCategory().isAcademic()){
                        populateStaffSubjectTaughtAtPresent(map, staff, staffProfileList);
                        //}
                        break;
                    case INDEX_FIFTEEN:
                        //if(staff.getStaffCategory().isAcademic()){
                        populateStaffMediumOfAppointment(map, staff, staffProfileList);
                        //}
                        break;
                    case INDEX_SIXTEEN:
                        populateStaffDesignationBared(map, staff, staffProfileList);
                        break;
                    case INDEX_SEVENTEEN:
                        populateStaffEducationalQualifications(map, staff, staffProfileList);
                        break;
                    case INDEX_EIGHTEEN:
                        populateStaffProfessionalQualifications(map, staff, staffProfileList);
                        break;
                    case INDEX_NINETEEN:
                        populateStaffService(map, staff, staffProfileList);
                        break;
                    case INDEX_TWENTY:
                        populateStaffClass(map, staff, staffProfileList);
                        break;
                    case INDEX_TWENTYONE:
                        populateStaffGrade(map, staff, staffProfileList);
                        break;
                    case INDEX_TWENTYTWO:
                        populateStaffLeaveTotalCount(map, staff, staffProfileList);
                        break;
                    case INDEX_TWENTYTHREE:
                        populateStaffBasicSalary(map, staff, staffProfileList);
                        break;
                    case INDEX_TWENTYFOUR:
                        populateStaffExtraCurricularDetails(map, staff, staffProfileList);
                        break;
                    case INDEX_TWENTYFIVE:
                        populateStaffSeminarDetails(map, staff, staffProfileList);
                        break;
                    default:
                        break;
                    }
                }

            }
        }
    }

    /**
     * Get the staff Leave count for the previous year.
     * 
     * @param staffId - staffId
     * @return staffLeaveCount
     * @throws AkuraAppException AkuraAppException
     * @throws ParseException ParseException
     */
    private int populateStaffLeaveCount(int staffId) throws AkuraAppException, ParseException {

        int previousYear = DateUtil.currentYearOnly() - 1;
        String strYr = String.valueOf(previousYear);
        String strStartDate = strYr + START_DATE;
        String strEndDate = strYr + END_DATE;
        return staffService.getStaffLeaveCountByPreviousYear(DateUtil.convertStringToDate(strStartDate),
                DateUtil.convertStringToDate(strEndDate), staffId);
    }

    /**
     * Populate Staff Sport List by staff id.
     * 
     * @param staffId staffId
     * @return List of staff sport list.
     * @throws AkuraAppException AkuraAppException
     */
    private List<String> populateStaffSportList(int staffId) throws AkuraAppException {

        List<Object[]> staffSportList = staffService.getStaffSportByStaffId(staffId);
        List<String> sportList = new ArrayList<String>();
        int i = 0, j = 1, x = 2;
        for (Object[] tempSport : staffSportList) {
            sportList.add(tempSport[i] + DASH + tempSport[j] + DASH + tempSport[x]);
        }
        return sportList;
    }

    /**
     * Populate Staff External Activity List by staff id.
     * 
     * @param staffId - staffId
     * @return List of staff external activity.
     * @throws AkuraAppException AkuraAppException
     */
    private List<String> populateStaffExternalActivityList(int staffId) throws AkuraAppException {

        List<StaffExternalActivity> externalActivityList = staffService.getStaffExternalActivityList(staffId, null);
        List<String> exaternalList = new ArrayList<String>();
        for (StaffExternalActivity tempActivity : externalActivityList) {
            if (tempActivity == externalActivityList.get(0)) {
                exaternalList.add(tempActivity.getExternalActivity() + DASH + tempActivity.getAchievement());
            } else {
                exaternalList.add(AkuraConstant.BR_TAG + tempActivity.getExternalActivity() + DASH
                        + tempActivity.getAchievement());
            }
        }
        return exaternalList;
    }

    /**
     * Populate Staff Club Society List by the staff id.
     * 
     * @param staffId - staffId
     * @return List of Staff Club Society list
     * @throws AkuraAppException AkuraAppException
     */
    private List<String> populateStaffClubSocietyList(int staffId) throws AkuraAppException {

        List<Object[]> staffClubSocietyList = staffService.getStaffClubSocietyByStaffId(staffId);
        List<String> clubSocietyList = new ArrayList<String>();
        int i = 0, j = 1;
        for (Object[] tempObject : staffClubSocietyList) {
            clubSocietyList.add(tempObject[i] + DASH + tempObject[j]);
        }
        return clubSocietyList;
    }

    /**
     * Populate Staff Professional Qualification List for the given staff id.
     * 
     * @param staffId - staffId
     * @return List of Professional Qualification
     * @throws AkuraAppException AkuraAppException
     */
    private List<String> populateStaffProfessionalQualificationList(int staffId) throws AkuraAppException {

        List<StaffProfessional> staffProList = staffService.getStaffProfessionalListForStaff(staffId);
        List<String> professionalList = new ArrayList<String>();
        for (StaffProfessional tempStaffPro : staffProList) {
            professionalList.add(tempStaffPro.getProfessionalQualification().getDescription());
        }
        return professionalList;
    }

    /**
     * Populate Staff Education Qualification List for the given staff id.
     * 
     * @param staffId - staffId
     * @return List of Education Qualification
     * @throws AkuraAppException AkuraAppException
     */
    private List<String> populateStaffEducationalQualificationList(int staffId) throws AkuraAppException {

        List<StaffEducation> staffEduList = staffService.getStaffEducationListForStaff(staffId);
        List<String> educationalList = new ArrayList<String>();
        for (StaffEducation tempStaffEdu : staffEduList) {
            educationalList.add(tempStaffEdu.getEducationalQualification().getDescription());
        }
        return educationalList;
    }

    /**
     * Populate registration no by staff category.
     * 
     * @param request the request
     * @return the list
     * @throws AkuraAppException - throws when fails.
     */
    @RequestMapping(value = POPULATE_REGISTRATION_NO_BY_STAFF_CATEGORY_HTM)
    @ResponseBody
    public String populateRegistrationNoByCategory(HttpServletRequest request) throws AkuraAppException {

        int staffCategoryId = Integer.parseInt(request.getParameter(STAFF_CATEGORY_ID));
        int statusID = Integer.parseInt(request.getParameter("statusID"));
        // get staff list by staff category id ,from selected staff type
        StaffCategory staffCategory = staffCommonService.getStaffCategory(staffCategoryId);

        List<Staff> staffLists = null;
        if (statusID == 1) {
            staffLists = staffService.getStaffListByCategory(staffCategoryId);
        }
        if (statusID == 2) {
            staffLists = staffService.getDepatureStaffListByCategory(staffCategoryId);
        }
        if (statusID == 0) {
            staffLists = staffService.getAllStaffListByCategory(staffCategoryId);
        }

        SortUtil.sortStaffNoList(staffLists);

        List<String> staffList = new ArrayList<String>();

        if (!staffLists.isEmpty()) {

            for (Staff s : staffLists) {
                staffList.add(s.getRegistrationNo() + AkuraConstant.DASH_SIGN + s.getNameWithIntials());
            }
        }

        StringBuilder addmissionBuilder = new StringBuilder();

        Collections.sort(staffList);

        if (!staffList.isEmpty()) {

            for (String admission : staffList) {
                addmissionBuilder.append(admission);
                addmissionBuilder.append(AkuraWebConstant.STRING_COMMA);
            }
        }

        addmissionBuilder.append(AkuraConstant.PLUS_SIGN);
        Map<Integer, String> contentsList = populateReportData(staffCategory);
        String tableData = "";
        for (Map.Entry<Integer, String> entry : contentsList.entrySet()) {
            tableData = entry.getKey() + AkuraConstant.EQUAL_SIGN + entry.getValue();
            addmissionBuilder.append(tableData);
            addmissionBuilder.append(AkuraWebConstant.STRING_COMMA);
        }

        return addmissionBuilder.toString();
    }

    /**
     * Load the list of Staff categories to load on report.
     * 
     * @return a list of available staff categories.
     * @throws AkuraAppException - throws when fails.
     */
    @ModelAttribute(STAFF_CATEGORY_LIST)
    public List<StaffCategory> populateListOfStaffCategories() throws AkuraAppException {

        return SortUtil.sortStaffCategoryList(staffCommonService.getAllStaffCategories());

    }

    /**
     * Populate staff personal details.
     * 
     * @param map Map object with staff profile report data
     * @throws AkuraAppException - throws when fails.
     */
    private void setDefaultStaffProfileReportProperties(Map<String, Object> map) throws AkuraAppException {

        JRBeanCollectionDataSource jrBeanDataSource = new JRBeanCollectionDataSource(null);

        map.put(TITLE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, STAFF_PROFILE_REPORT));
        map.put(LOGO_PATH, ReportUtil.getReportLogo());
        map.put(STYLE_TEMPLATE, PropertyReader.getPropertyValue(SYSTEM_CONFIG, APPSERVER_HOME)
                + PropertyReader.getPropertyValue(SYSTEM_CONFIG, STYLE_PATH));
        map.put(REPORT_GENERATED_ON,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, REPORT_GENERATED_ON_TEXT));
        map.put(GENERATED_DATE, DateUtil.getReportGeneratedDate(
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, REPORT_GENERATED_DATE_LOCALE)));

        map.put(PAGE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, REPORT_PAGE));
        map.put(GPL, AkuraWebConstant.REPORT_GPL);

        map.put(DATASOURCE, jrBeanDataSource);
        map.put(NIC_NO_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SSN_NIC_NO));
        map.put(FULL_NAME_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, FULL_NAME));
        map.put(NAME_INITIALS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, NAME_INITIALS));
        map.put(SECTION_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SECTION));
        map.put(ADDRESS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, ADDRESS));
        map.put(CONTACT_DEAILS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CONTACT_DETAILS));
        map.put(HOME_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, HOME));
        map.put(MOBILE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, MOBILE));
        map.put(EMAIL_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EMAIL));
        map.put(RACE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, RACE));
        map.put(RELIGION_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, RELIGION));
        map.put(CIVIL_STATUS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CIVIL_STATUS));
        map.put(DATE_OF_BIRTH_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_BIRTH));
        map.put(GENDER_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, GENDER));
        map.put(APPOINTMENT_DATE_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_FIRST_APPOINTMENT));
        map.put(HIRE_DATE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_HIRE));
        map.put(APPOINTMENT_NATURE_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, NATURE_OF_APPOINTMENT));
        map.put(APPOINTMENT_CLASSIFICATION_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLASSIFICATION_OF_APPOINTMENT));
        map.put(SUBJECTS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SUBJECTS));
        map.put(SUBJECTS_LIST_FIELD, null);
        map.put(MEDIUM_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, MEDIUM_OF_APPOINTMENT));
        map.put(STAFF_CATEGORY_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DESIGNATION_BARED));
        map.put(EDUCATIONAL_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EDUCATIONAL_QUALIFICATIONS));
        map.put(EDUCATIONAL_LIST_FIELD, null);
        map.put(PROFESSIONAL_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, PROFESSIONAL_QUALIFICATIONS));
        map.put(PROFESSIONAL_LIST_FIELD, null);
        map.put(SERVICE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SERVICE));
        map.put(CLASS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLASS));
        map.put(GRADE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, GRADE));
        map.put(NO_OF_DAYS_FIELD, null);
        map.put(LEAVE_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, LEAVE_COUNT_FOR_PREVIOUS_YEAR));
        map.put(SALARY_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, BASIC_SALARY));
        map.put(EXTRA_CURRICULAR_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, INVOLVEMENT_OF_EXTRACURRICULAR));
        map.put(SPORTS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SPORTS));
        map.put(SPORTS_LIST_FIELD, null);
        map.put(CLUB_SOCIETY_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLUBS_SOCIETY));
        map.put(CLUB_SOCIETY_LIST_FIELD, null);
        map.put(DATE_OF_BIRTH_FIELD_FLAG, AkuraWebConstant.EMPTY_STRING);
        map.put(EXTERNAL_ACTIVITY_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EXTERNAL_ACTIVITY));
        map.put(EXTERNAL_ACTIVITY_LIST_FIELD, null);
        map.put(SEMINAR_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SEMINARS_DONE));
        map.put(SEMINAR_LIST_FIELD, null);
        map.put(PHOTO_FIELD, null);

    }

    /**
     * Populate student personal details.
     * 
     * @param map Map object with staff profile report data
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffPersonalDetails(Map<String, Object> map,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        for (int i = 0; i < staffProfileList.size(); i++) {
            staffProfileList.get(0).setSection(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setMobileNo(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setEmail(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setResidenceNo(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setAddress(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setRace(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setReligion(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setCivilStatus(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setDateOfBirth(null);
            staffProfileList.get(0).setGender(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setFirstAppointmetDate(null);
            staffProfileList.get(0).setDateOfHire(null);
            staffProfileList.get(0).setAppointmentNature(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setAppointmentClassification(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setStudyMedium(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setStaffCategory(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setEducationalQualification(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setProfessionalQualification(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setStaffServiceCategory(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setStaffClass(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setStaffGrade(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setBasicSalary(FLOAT_ZERO);
            staffProfileList.get(0).setCity(AkuraWebConstant.EMPTY_STRING);
            staffProfileList.get(0).setCountry(AkuraWebConstant.EMPTY_STRING);
        }
        JRDataSource datasource = new JRBeanCollectionDataSource(staffProfileList);
        map.put(MAINREPORT_DATASOURCE, datasource);

        map.put(TITLE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, STAFF_PROFILE_REPORT));
        map.put(LOGO_PATH, ReportUtil.getReportLogo());
        map.put(STYLE_TEMPLATE, PropertyReader.getPropertyValue(SYSTEM_CONFIG, APPSERVER_HOME)
                + PropertyReader.getPropertyValue(SYSTEM_CONFIG, STYLE_PATH));
        map.put(REPORT_GENERATED_ON,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, REPORT_GENERATED_ON_TEXT));
        map.put(GENERATED_DATE, DateUtil.getReportGeneratedDate(
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, REPORT_GENERATED_DATE_LOCALE)));

        map.put(PAGE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, REPORT_PAGE));
        map.put(GPL, AkuraWebConstant.REPORT_GPL);
        map.put(NIC_NO_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SSN_NIC_NO));
        map.put(FULL_NAME_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, FULL_NAME));
        map.put(NAME_INITIALS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, NAME_INITIALS));
        map.put(CONTACT_DEAILS_FIELD, null);
        map.put(NO_OF_DAYS_FIELD, "");
        if (staffProfileList.get(0).getPhoto() != null && staffProfileList.get(0).getPhoto().length > 0) {
            byte[] image = staffProfileList.get(0).getPhoto();
            String imageLoadPath = PropertyReader.getPropertyValue(SYSTEM_CONFIG_PROPERTIES, APPSERVER_HOME)
                    + PropertyReader.getPropertyValue(SYSTEM_CONFIG_PROPERTIES, IMAGE_FOLDER_PATH);
            imageLoadPath = imageLoadPath + staffProfileList.get(0).getStaffRegNo() + FILE_EXT;
            StaticDataUtil.previewProfile(imageLoadPath, image);
            map.put(PHOTO_FIELD, imageLoadPath);
        }
    }

    /**
     * Populate staff gender details.
     * 
     * @param map Map object with staff profile report data
     * @param staff Staff Object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffGender(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null) {
            staffProfileList.get(0).setGender(String.valueOf(staff.getGender()));
            map.put(GENDER_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, GENDER));
        }
    }

    /**
     * Populate staff Section Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffSection(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getSection() != null) {
            Section section = staffCommonService.findSection(staff.getSection());
            staffProfileList.get(0).setSection(section.getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setSection(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(SECTION_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SECTION));
    }

    /**
     * Populate staff Religion Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffReligion(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getReligionId() != null) {
            Religion religion = commonService.findReligionById(staff.getReligionId());
            if (religion.getDescription() != null) {
                staffProfileList.get(0).setReligion(religion.getDescription());
            }
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setReligion(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(RELIGION_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, RELIGION));
    }

    /**
     * Populate staff Civil Status Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffCivilStatus(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getCivilStatus() != null) {
            CivilStatus civilStatus = staffCommonService.findCivilStatus(staff.getCivilStatus());
            staffProfileList.get(0).setCivilStatus(civilStatus.getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setCivilStatus(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(CIVIL_STATUS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CIVIL_STATUS));
    }

    /**
     * Populate staff Date Of Birth Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     * @throws ParseException parse Exception when fails.
     */
    private void populateStaffDateOfBirth(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException, ParseException {

        if (staffProfileList != null && staff.getDateOfBirth() != null) {
            staffProfileList.get(0).setDateOfBirth(staff.getDateOfBirth());
        } else {
            if (staffProfileList != null) {
                map.put(DATE_OF_BIRTH_FIELD_FLAG, FLAG);
            }

        }
        map.put(DATE_OF_BIRTH_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_BIRTH));
    }

    /**
     * Populate staff Address Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffAddress(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staff.getAddress() != null) {
            staffProfileList.get(0).setAddress(staff.getAddress());
        } else {
            staffProfileList.get(0).setAddress(AkuraConstant.EMPTY_STRING_SPACE);
        }

        if (staff.getCityId() != null) {
            City city = commonService.findCity(staff.getCityId());
            staffProfileList.get(0).setCity(city.getDescription());
        } else {
            staffProfileList.get(0).setCity(AkuraConstant.EMPTY_STRING_SPACE);
        }

        if (staff.getCountryId() != null) {
            Country country = commonService.findCountry(staff.getCountryId());
            staffProfileList.get(0).setCountry(country.getCountryName());
        } else {
            staffProfileList.get(0).setCountry(AkuraConstant.EMPTY_STRING_SPACE);
        }

        map.put(ADDRESS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, ADDRESS));
    }

    /**
     * Populate staff Contact Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffContactDetails(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getAddress() != null || staff.getMobileNo() != null
                || staff.getEmail() != null) {

            staffProfileList.get(0).setResidenceNo(staff.getResidenceNo());
            staffProfileList.get(0).setMobileNo(staff.getMobileNo());
            staffProfileList.get(0).setEmail(staff.getEmail());
            map.put(CONTACT_DEAILS_FIELD,
                    PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CONTACT_DETAILS));
            map.put(HOME_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, HOME));
            map.put(MOBILE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, MOBILE));
            map.put(EMAIL_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EMAIL));
        }
    }

    /**
     * Populate staff Race Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffRace(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getRace() != null) {
            Race race = commonService.findRace(staff.getRace());
            staffProfileList.get(0).setRace(race.getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setRace(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(RACE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, RACE));
    }

    /**
     * Populate staff Date Of Appointment Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffDateOfAppointment(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staff.getFirstAppointmetDate() != null) {
            staffProfileList.get(0).setFirstAppointmetDate(staff.getFirstAppointmetDate());
        } else {
            map.put(APPOINTMENT_DATE_FIELD_FLAG, FLAG);
        }
        map.put(APPOINTMENT_DATE_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_FIRST_APPOINTMENT));
    }

    /**
     * Populate staff Date Of Hire Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffDateOfHire(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getDateOfHire() != null) {
            staffProfileList.get(0).setDateOfHire(staff.getDateOfHire());
            map.put(HIRE_DATE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_HIRE));
        }
    }

    /**
     * Populate staff Nature Of Appointment Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffNatureOfAppointment(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getAppointmentNature() != null) {

            AppointmentNature appointmentNature = staffCommonService
                    .getAppointmentNatureById(staff.getAppointmentNature());
            staffProfileList.get(0).setAppointmentNature(appointmentNature.getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setAppointmentNature(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(APPOINTMENT_NATURE_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, NATURE_OF_APPOINTMENT));
    }

    /**
     * Populate staff Classification Of Appointment Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffClassificationOfAppointment(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getAppointmentClassification() != null) {
            AppointmentClassification appointmentClassification = staffCommonService
                    .findAppointmentClassification(staff.getAppointmentClassification());
            staffProfileList.get(0).setAppointmentClassification(appointmentClassification.getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setAppointmentClassification(AkuraConstant.EMPTY_STRING_SPACE);
            }
        }
        map.put(APPOINTMENT_CLASSIFICATION_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLASSIFICATION_OF_APPOINTMENT));
    }

    /**
     * Populate staff Subject Taught At Present Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffSubjectTaughtAtPresent(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null) {
            // Populate Subject taught at present for a staff
            List<String> subjectTeacherList = staffService.getCurrentSubjectsByStaffId(staff.getStaffId(),
                    DateUtil.getStringYear(new Date()));
            //if(staff.getStaffCategory().isAcademic()){
            map.put(SUBJECTS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SUBJECTS));
            map.put(SUBJECTS_LIST_FIELD, subjectTeacherList);
            //}
        }
    }

    /**
     * Populate staff Medium Of Appointment Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffMediumOfAppointment(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {
        //if(staff.getStaffCategory().isAcademic()){
        if (staffProfileList != null && staff.getStudyMedium() != null) {
            staffProfileList.get(0).setStudyMedium(staff.getStudyMedium().getStudyMediumName());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setStudyMedium(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        /*}else{
        staffProfileList.get(0).setStudyMedium(AkuraConstant.EMPTY_STRING);
        }*/
        map.put(MEDIUM_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, MEDIUM_OF_APPOINTMENT));
    }

    /**
     * Populate staff Designation Bared Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffDesignationBared(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getStaffCategory() != null) {
            staffProfileList.get(0).setStaffCategory(staff.getStaffCategory().getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setStaffCategory(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(STAFF_CATEGORY_FIELD,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DESIGNATION_BARED));
    }

    /**
     * Populate staff Educational Qualifications Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffEducationalQualifications(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null) {
            // Populate Educational Qualification List
            List<String> educationalList = populateStaffEducationalQualificationList(staff.getStaffId());
            map.put(EDUCATIONAL_FIELD,
                    PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EDUCATIONAL_QUALIFICATIONS));
            map.put(EDUCATIONAL_LIST_FIELD, educationalList);
        }
    }

    /**
     * Populate staff Professional Qualification Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffProfessionalQualifications(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null) {
            // Populate Professional Qualification List
            List<String> professionalList = populateStaffProfessionalQualificationList(staff.getStaffId());
            map.put(PROFESSIONAL_FIELD,
                    PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, PROFESSIONAL_QUALIFICATIONS));
            map.put(PROFESSIONAL_LIST_FIELD, professionalList);
        }
    }

    /**
     * Populate staff Service Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffService(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getStaffServiceCategory() != null) {
            StaffServiceCategory staffServiceCategory = staffCommonService
                    .findStaffServiceCategoryById(staff.getStaffServiceCategory());
            staffProfileList.get(0).setStaffServiceCategory(staffServiceCategory.getDescription());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setStaffServiceCategory(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(SERVICE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SERVICE));
    }

    /**
     * Populate staff Class Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffClass(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null && staff.getStaffClass() != null) {
            staffProfileList.get(0).setStaffClass(staff.getStaffClass());
        } else {
            if (staffProfileList != null) {
                staffProfileList.get(0).setStaffClass(AkuraConstant.EMPTY_STRING_SPACE);
            }

        }
        map.put(CLASS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLASS));
    }

    /**
     * Populate staff Grade Field Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffGrade(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staff.getStaffGrade() != null) {
            staffProfileList.get(0).setStaffGrade(staff.getStaffGrade());
        } else {
            staffProfileList.get(0).setStaffGrade(AkuraConstant.EMPTY_STRING_SPACE);

        }
        map.put(GRADE_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, GRADE));
    }

    /**
     * Populate staff Leave Count Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     * @throws ParseException - throws when fails.
     */
    private void populateStaffLeaveTotalCount(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException, ParseException {

        if (staffProfileList != null) {
            // Get Staff Leave Count List
            String noOfDays = String.valueOf(populateStaffLeaveCount(staff.getStaffId()));
            map.put(NO_OF_DAYS_FIELD, noOfDays);
        } else {
            map.put(NO_OF_DAYS_FIELD, 0);
        }
    }

    /**
     * Populate staff Basic Salary Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffBasicSalary(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staff.getBasicSalary() > 0) {
            staffProfileList.get(0).setBasicSalary(staff.getBasicSalary());
        } else {
            staffProfileList.get(0).setBasicSalary(0.0F);

        }
        map.put(SALARY_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, BASIC_SALARY));

    }

    /**
     * Populate staff Extra curricular Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    private void populateStaffExtraCurricularDetails(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null) {
            // Populate Staff Sport List
            List<String> sportList = populateStaffSportList(staff.getStaffId());
            // Populate Club Society List
            List<String> clubSocietyList = populateStaffClubSocietyList(staff.getStaffId());
            // Populate Staff External Activity List
            List<String> exaternalList = populateStaffExternalActivityList(staff.getStaffId());
            map.put(EXTRA_CURRICULAR_FIELD,
                    PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, INVOLVEMENT_OF_EXTRACURRICULAR));
            map.put(SPORTS_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SPORTS));
            map.put(SPORTS_LIST_FIELD, sportList);
            map.put(CLUB_SOCIETY_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLUBS_SOCIETY));
            map.put(CLUB_SOCIETY_LIST_FIELD, clubSocietyList);
            map.put(EXTERNAL_ACTIVITY_FIELD,
                    PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EXTERNAL_ACTIVITY));
            map.put(EXTERNAL_ACTIVITY_LIST_FIELD, exaternalList);
        }
    }

    /**
     * Populate staff Seminar Details.
     * 
     * @param map Map object with staff profile report data
     * @param staff object
     * @param staffProfileList the staff personal details list
     * @throws AkuraAppException - throws when fails.
     */
    @SuppressWarnings("unchecked")
    private void populateStaffSeminarDetails(Map<String, Object> map, Staff staff,
            List<StaffProfileReportTemplate> staffProfileList) throws AkuraAppException {

        if (staffProfileList != null) {
            // Populate Staff Seminar List
            List<String> staffSeminarList = (List<String>) staffService.getStaffSeminarList(staff.getStaffId(),
                    null);
            map.put(SEMINAR_FIELD, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SEMINARS_DONE));
            map.put(SEMINAR_LIST_FIELD, staffSeminarList);
        }
    }

    /**
     * Populate staff report data.
     * 
     * @param staffCategory  category of the staff
     * @throws AkuraAppException - throws when fails.
     * @return map of report property
     */
    private Map<Integer, String> populateReportData(StaffCategory staffCategory) throws AkuraAppException {
        Map<Integer, String> contentsList = new TreeMap<Integer, String>();

        contentsList.put(2, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SECTION));
        contentsList.put(INDEX_THREE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, ADDRESS));
        contentsList.put(INDEX_FOUR, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CONTACT_DETAILS));
        contentsList.put(INDEX_FIVE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, RACE));
        contentsList.put(INDEX_SIX, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, RELIGION));
        contentsList.put(INDEX_SEVEN, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CIVIL_STATUS));
        contentsList.put(INDEX_EIGHT, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_BIRTH));
        contentsList.put(INDEX_NINE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, GENDER));
        contentsList.put(INDEX_TEN,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_FIRST_APPOINTMENT));
        contentsList.put(INDEX_ELEVEN, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DATE_OF_HIRE));
        contentsList.put(INDEX_TWELVE,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, NATURE_OF_APPOINTMENT));
        contentsList.put(INDEX_THIRTEEN,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLASSIFICATION_OF_APPOINTMENT));
        if (staffCategory != null && staffCategory.isAcademic()) {
            contentsList.put(INDEX_FOURTEEN, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SUBJECTS));
            contentsList.put(INDEX_FIFTEEN,
                    PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, MEDIUM_OF_APPOINTMENT));
        }
        contentsList.put(INDEX_SIXTEEN,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, DESIGNATION_BARED));
        contentsList.put(INDEX_SEVENTEEN,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, EDUCATIONAL_QUALIFICATIONS));
        contentsList.put(INDEX_EIGHTEEN,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, PROFESSIONAL_QUALIFICATIONS));
        contentsList.put(INDEX_NINETEEN, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SERVICE));
        contentsList.put(INDEX_TWENTY, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, CLASS));
        contentsList.put(INDEX_TWENTYONE, PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, GRADE));
        contentsList.put(INDEX_TWENTYTWO,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, LEAVE_COUNT_FOR_PREVIOUS_YEAR));
        contentsList.put(INDEX_TWENTYTHREE,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, BASIC_SALARY));
        contentsList.put(INDEX_TWENTYFOUR,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, INVOLVEMENT_OF_EXTRACURRICULAR));
        contentsList.put(INDEX_TWENTYFIVE,
                PropertyReader.getPropertyValue(ReportUtil.REPORT_TEMPLATE, SEMINARS_DONE));
        return contentsList;
    }
}