/* * eGov suite of products aim to improve the internal efficiency,transparency, * accountability and the service delivery of the government organizations. * * Copyright (C) <2015> eGovernments Foundation * * The updated version of eGov suite of products as by eGovernments Foundation * is available at http://www.egovernments.org * * 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 * 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ or * http://www.gnu.org/licenses/gpl.html . * * In addition to the terms of the GPL license to be adhered to in using this * program, the following additional terms are to be complied with: * * 1) All versions of this program, verbatim or modified must carry this * Legal Notice. * * 2) Any misrepresentation of the origin of the material is prohibited. It * is required that all modified versions of this material be marked in * reasonable ways as different from the original version. * * 3) This license does not grant any rights to any user of the program * with regards to rights under trademark law for use of the trade names * or trademarks of eGovernments Foundation. * * In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org. */ package org.egov.billsaccounting.services; import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.SQLException; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.egov.commons.Accountdetailtype; import org.egov.commons.Bankaccount; import org.egov.commons.Bankreconciliation; import org.egov.commons.CChartOfAccounts; import org.egov.commons.CFiscalPeriod; import org.egov.commons.CFunction; import org.egov.commons.CGeneralLedger; import org.egov.commons.CGeneralLedgerDetail; import org.egov.commons.CVoucherHeader; import org.egov.commons.Functionary; import org.egov.commons.Fund; import org.egov.commons.Fundsource; import org.egov.commons.Scheme; import org.egov.commons.SubScheme; import org.egov.commons.Vouchermis; import org.egov.commons.dao.AccountdetailtypeHibernateDAO; import org.egov.commons.dao.BankHibernateDAO; import org.egov.commons.dao.BankaccountHibernateDAO; import org.egov.commons.dao.ChartOfAccountsHibernateDAO; import org.egov.commons.dao.EgwStatusHibernateDAO; import org.egov.commons.dao.FinancialYearDAO; import org.egov.commons.dao.FiscalPeriodHibernateDAO; import org.egov.commons.dao.FunctionDAO; import org.egov.commons.dao.FunctionaryHibernateDAO; import org.egov.commons.dao.FundHibernateDAO; import org.egov.commons.dao.FundSourceHibernateDAO; import org.egov.commons.dao.SchemeHibernateDAO; import org.egov.commons.dao.SubSchemeHibernateDAO; import org.egov.commons.dao.VoucherHeaderDAO; import org.egov.commons.exception.NoSuchObjectException; import org.egov.commons.exception.TooManyValuesException; import org.egov.dao.bills.EgBillRegisterHibernateDAO; import org.egov.dao.budget.BudgetDetailsHibernateDAO; import org.egov.dao.budget.BudgetUsageHibernateDAO; import org.egov.egf.autonumber.VouchernumberGenerator; import org.egov.eis.service.EisCommonService; import org.egov.infra.admin.master.entity.AppConfig; import org.egov.infra.admin.master.entity.AppConfigValues; import org.egov.infra.admin.master.entity.Boundary; import org.egov.infra.admin.master.entity.Department; import org.egov.infra.admin.master.entity.HierarchyType; import org.egov.infra.admin.master.service.AppConfigService; import org.egov.infra.admin.master.service.AppConfigValueService; import org.egov.infra.admin.master.service.BoundaryService; import org.egov.infra.admin.master.service.DepartmentService; import org.egov.infra.admin.master.service.HierarchyTypeService; import org.egov.infra.admin.master.service.UserService; import org.egov.infra.config.core.ApplicationThreadLocals; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.persistence.utils.ApplicationSequenceNumberGenerator; import org.egov.infra.utils.autonumber.AutonumberServiceBeanResolver; import org.egov.infra.validation.exception.ValidationError; import org.egov.infra.validation.exception.ValidationException; import org.egov.infstr.services.PersistenceService; import org.egov.infstr.utils.EGovConfig; import org.egov.model.bills.EgBillPayeedetails; import org.egov.model.bills.EgBilldetails; import org.egov.model.bills.EgBillregister; import org.egov.model.bills.EgBillregistermis; import org.egov.model.contra.ContraJournalVoucher; import org.egov.model.voucher.PreApprovedVoucher; import org.egov.pims.commons.Designation; import org.egov.pims.commons.Position; import org.egov.pims.dao.PersonalInformationDAO; import org.egov.services.bills.BillsService; import org.egov.services.voucher.GeneralLedgerDetailService; import org.egov.services.voucher.GeneralLedgerService; import org.egov.services.voucher.VoucherService; import org.egov.utils.FinancialConstants; import org.egov.utils.VoucherHelper; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.exilant.GLEngine.ChartOfAccounts; import com.exilant.GLEngine.Transaxtion; import com.exilant.GLEngine.TransaxtionParameter; import com.exilant.eGov.src.transactions.CommonMethodsImpl; import com.exilant.eGov.src.transactions.VoucherTypeForULB; import com.exilant.exility.common.TaskFailedException; /** * This Class will create voucher from bill <br> * * @author Manikanta created on 15-sep-2008 * */ @Service //@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class CreateVoucher { private static final String DD_MMM_YYYY = "dd-MMM-yyyy"; private static final String DD_MM_YYYY = "dd/MM/yyyy"; private static final String REVERSAL_VOUCHER_DATE = "Reversal voucher date"; private static final String VOUCHER_HEADER_ID = "Original voucher header id"; final private static Logger LOGGER = Logger.getLogger(CreateVoucher.class); // Expenditure Types private final static String CONBILL = "Works"; private final static String SUPBILL = "Purchase"; private final static String SALBILL = "Salary"; private final static String PENSBILL = "Pension"; private final static String GRATBILL = "Gratuity"; // messages private final static String FUNDMISSINGMSG = "Fund is not used in Bill ,cannot create Voucher"; private static final String FAILED = "Transaction failed"; private static final String EXCEPTION_WHILE_SAVING_DATA = "Exception while saving data"; private final String ISREQUIRED = ".required"; private final String SELECT = " Please Select "; @Autowired private AppConfigService appConfigService; @Autowired private VoucherTypeForULB voucherTypeForULB; @Autowired private AppConfigValueService appConfigValuesService; @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Autowired private AutonumberServiceBeanResolver beanResolver; // add here for other bills // bill related common variables for back end updation SimpleDateFormat sdf = new SimpleDateFormat(DD_MM_YYYY); SimpleDateFormat formatter = new SimpleDateFormat(DD_MMM_YYYY); NumberFormat nf = new DecimalFormat("##############.00"); @Autowired private BillsService billsService; @Autowired private FundHibernateDAO fundDAO; @Autowired private BudgetUsageHibernateDAO budgetUsageHibernateDAO; @Autowired private ChartOfAccounts chartOfAccounts; @Autowired private FunctionaryHibernateDAO functionaryDAO; @Autowired private FinancialYearDAO financialYearDAO; @Autowired private EgwStatusHibernateDAO egwStatusDAO; @Autowired private SchemeHibernateDAO schemeDAO; @Autowired private SubSchemeHibernateDAO subSchemeDAO; @Autowired private FundSourceHibernateDAO fundSourceDAO; @Autowired private FunctionDAO functionDAO; @Autowired private ChartOfAccountsHibernateDAO chartOfAccountsDAO; @Autowired private VoucherHeaderDAO voucherHeaderDAO; @Autowired private BankaccountHibernateDAO bankAccountDAO; @Autowired private BankHibernateDAO bankDAO; @Autowired private VoucherHelper voucherHelper; @Autowired private EgBillRegisterHibernateDAO egBillRegisterHibernateDAO; @Autowired @Qualifier("voucherService") private VoucherService voucherService; @Autowired private BoundaryService boundaryService; @Autowired private ApplicationSequenceNumberGenerator applicationSequenceNumberGenerator; private static final String ERR = "Exception in CreateVoucher"; private static final String DEPTMISSINGMSG = "Department is missing in the Bill cannot proceed creating vouvher"; private static final String IS_MISSING = "is missing"; private static final String NAME = "Reversal voucher name"; private static final String IS_EMPTY = "is empty"; private static final String TYPE = "Reversal voucher type"; private static final String REVERSAL_VOUCHER_NUMBER = "Reversal voucher number"; @Autowired private DepartmentService deptM; @Autowired private BoundaryService boundary; @Autowired private UserService userMngr; @Autowired private EisCommonService eisCommonService; @Autowired private HierarchyTypeService hierarchyTypeService; @Autowired private BudgetDetailsHibernateDAO budgetDetailsDAO; @Autowired private CommonMethodsImpl cmImpl; PersistenceService<Bankreconciliation, Integer> bankReconSer; PersistenceService<EgBillregistermis, Integer> billMisSer; PersistenceService<EgBilldetails, Integer> billDetailSer; PersistenceService<Fund, Integer> fundService; @Autowired @Qualifier("generalLedgerService") private GeneralLedgerService generalLedgerService; @Autowired @Qualifier("generalLedgerDetailService") private GeneralLedgerDetailService generalLedgerDetailService; @Autowired private PersonalInformationDAO personalInformationDAO; @Autowired private AccountdetailtypeHibernateDAO accountdetailtypeHibernateDAO; @Autowired private FiscalPeriodHibernateDAO fiscalPeriodHibernateDAO; public CreateVoucher() { if (LOGGER.isDebugEnabled()) LOGGER.debug("Initializing CreateVoucher Service"); } /** * creates voucher From billId * * @param billId * @param voucherDate * TODO * @return voucherheaderId long * @throws ApplicationRuntimeException * @throws SQLException * @throws Exception */ public long createVoucherFromBill(final int billId, String voucherStatus, final String voucherNumber, final Date voucherDate) throws ApplicationRuntimeException, SQLException, TaskFailedException { CVoucherHeader vh = null; try { if (voucherStatus == null) { final List vStatusList = appConfigValuesService .getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG, "PREAPPROVEDVOUCHERSTATUS"); if (!vStatusList.isEmpty() && vStatusList.size() == 1) { final AppConfigValues appVal = (AppConfigValues) vStatusList .get(0); voucherStatus = appVal.getValue(); } else throw new ApplicationRuntimeException( "PREAPPROVEDVOUCHERSTATUS" + "is not defined in AppConfig values cannot proceed creating voucher"); } if (LOGGER.isDebugEnabled()) LOGGER.debug(" ---------------Generating Voucher for Bill-------"); EgBillregister egBillregister = null; egBillregister = billsService.getBillRegisterById(Integer .valueOf(billId)); /* * identify the bill type and delegate get the fund and fundsource * check for mandatory fields for implementation if missing throw * exception department is mandatory for implementation type fund is * mandatory for all implementations */ final EgBillregistermis billMis = egBillregister .getEgBillregistermis(); // checking voucher already exists or not for this bill try { CVoucherHeader result; if (billMis.getVoucherHeader() != null) { result = (CVoucherHeader) voucherService .find("select vh from CVoucherHeader vh where vh.id = ? and vh.status!=?", billMis.getVoucherHeader().getId(), FinancialConstants.CANCELLEDVOUCHERSTATUS); if (result != null) throw new ApplicationRuntimeException("Voucher " + result.getVoucherNumber() + " already exists for this bill "); } } catch (final Exception e) { throw new ApplicationRuntimeException(e.getMessage()); } final Fund fund = billMis.getFund(); if (fund == null) { LOGGER.error(FUNDMISSINGMSG); throw new ApplicationRuntimeException(FUNDMISSINGMSG); } else fund.getId(); final String deptMandatory = EGovConfig.getProperty( "egf_config.xml", "deptRequired", "", "general"); if (deptMandatory.equalsIgnoreCase("Y")) if (billMis.getEgDepartment() == null) throw new ApplicationRuntimeException(DEPTMISSINGMSG); final Fundsource fundSrc = billMis.getFundsource(); if (fundSrc != null) Integer.valueOf(fundSrc.getId().toString()); if (billMis.getScheme() != null) billMis.getScheme().getId(); if (billMis.getSubScheme() != null) billMis.getSubScheme().getId(); final String expType = egBillregister.getExpendituretype(); String voucherType = null; String voucherSubType = null; String name=""; if (expType.equalsIgnoreCase(CONBILL)) { name = "Contractor Journal"; voucherSubType = FinancialConstants.JOURNALVOUCHER_NAME_CONTRACTORJOURNAL; } else if (expType.equalsIgnoreCase(SUPBILL)) { name = "Supplier Journal"; if (null != billMis.getEgBillSubType() && billMis.getEgBillSubType().getName() .equalsIgnoreCase("Fixed Asset")) voucherSubType = FinancialConstants.JOURNALVOUCHER_NAME_FIXEDASSETJOURNAL; else voucherSubType = FinancialConstants.JOURNALVOUCHER_NAME_PURCHASEJOURNAL; } else if (expType.equalsIgnoreCase(SALBILL)) { name = "Salary Journal"; voucherSubType = FinancialConstants.JOURNALVOUCHER_NAME_SALARYJOURNAL; } // Pension,Gratuity are saved as Expense Bill else if (expType .equalsIgnoreCase(FinancialConstants.STANDARD_EXPENDITURETYPE_CONTINGENT)) { name = FinancialConstants.JOURNALVOUCHER_NAME_EXPENSEJOURNAL; voucherSubType = FinancialConstants.JOURNALVOUCHER_NAME_EXPENSEJOURNAL; } else if (expType.equalsIgnoreCase(PENSBILL)) { name = "Pension Journal"; voucherSubType = FinancialConstants.JOURNALVOUCHER_NAME_PENSIONJOURNAL; } else if (expType.equalsIgnoreCase(GRATBILL)) { name = "Gratuity Journal"; voucherSubType = FinancialConstants.CBILL_VOUCHERNO_TYPE; } else { name = "JVGeneral"; voucherSubType = FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL; } voucherType = FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL; final HashMap<String, Object> headerDetails = new HashMap<String, Object>(); HashMap<String, Object> detailMap = null; HashMap<String, Object> subledgertDetailMap = null; Set<EgBillPayeedetails> subLedgerlist; final List<HashMap<String, Object>> accountdetails = new ArrayList<HashMap<String, Object>>(); final List<HashMap<String, Object>> subledgerDetails = new ArrayList<HashMap<String, Object>>(); final Set<EgBilldetails> billDetailslist = egBillregister .getEgBilldetailes(); detailMap = new HashMap<String, Object>(); new HashMap<String, Object>(); headerDetails.put(VoucherConstant.VOUCHERNAME, name); headerDetails.put(VoucherConstant.VOUCHERTYPE, voucherType); headerDetails.put("vouchersubtype", voucherSubType); new SimpleDateFormat(DD_MMM_YYYY); headerDetails.put(VoucherConstant.VOUCHERNUMBER, voucherNumber == null ? "" : voucherNumber); Date dt = new Date(); Date vdt; String purposeValueVN = ""; final String purposeValue = ""; /** * Starting to check for voucher date First check if the value needs * to be read from the UI. If YES, check if the value is passed from * the UI, and then set data if present and throw error else. If NO, * check if the value needs to be read from the bill If YES, set the * voucher date same as that of bill date. If NO, set the value as * system date **/ try { final List<AppConfigValues> configValues = appConfigValuesService .getConfigValuesByModuleAndKey( FinancialConstants.MODULE_NAME_APPCONFIG, "VOUCHERDATE_FROM_UI"); for (final AppConfigValues appConfigVal : configValues) purposeValueVN = appConfigVal.getValue(); } catch (final Exception e) { throw new ApplicationRuntimeException( "Appconfig value for VOUCHERDATE_FROM_UI is not defined in the system"); } if (purposeValueVN.equals("Y")) { if (voucherDate == null) throw new ValidationException( Arrays.asList(new ValidationError( "Voucherdate Should be entered by user", "voucherfrombill.voucherdate.mandatory"))); else { dt = voucherDate; vdt = dt; } } else { try { final List<AppConfigValues> configValues = appConfigValuesService .getConfigValuesByModuleAndKey( FinancialConstants.MODULE_NAME_APPCONFIG, "USE BILLDATE IN CREATE VOUCHER FROM BILL"); for (final AppConfigValues appConfigVal : configValues) purposeValueVN = appConfigVal.getValue(); } catch (final Exception e) { throw new ApplicationRuntimeException( "Appconfig value for USE BILLDATE IN CREATE VOUCHER FROM BILL is not defined in the system"); } if (purposeValue.equals("Y")) { vdt = egBillregister.getBilldate(); dt = egBillregister.getBilldate(); } else vdt = dt; } headerDetails.put(VoucherConstant.VOUCHERDATE, vdt); if (egBillregister.getId() != null) headerDetails.put("billid", egBillregister.getId()); if (billMis.getSourcePath() != null) headerDetails.put(VoucherConstant.SOURCEPATH, billMis.getSourcePath()); if (billMis.getEgDepartment() != null) headerDetails.put(VoucherConstant.DEPARTMENTCODE, billMis .getEgDepartment().getCode()); if (billMis.getFund() != null) headerDetails.put(VoucherConstant.FUNDCODE, billMis.getFund() .getCode()); if (billMis.getScheme() != null) headerDetails.put(VoucherConstant.SCHEMECODE, billMis .getScheme().getCode()); if (billMis.getSubScheme() != null) headerDetails.put(VoucherConstant.SUBSCHEMECODE, billMis .getSubScheme().getCode()); if (billMis.getFundsource() != null) headerDetails.put(VoucherConstant.FUNDSOURCECODE, billMis .getFundsource().getCode()); if (billMis.getFieldid() != null) if (billMis.getFieldid().getId() != null) headerDetails.put(VoucherConstant.DIVISIONID, billMis .getFieldid().getId().toString()); if (billMis.getFunctionaryid() != null) headerDetails.put(VoucherConstant.FUNCTIONARYCODE, billMis .getFunctionaryid().getCode()); // TODO- read the fnction from billdetails. We can remove this if (billMis.getFunction() != null) headerDetails.put(VoucherConstant.FUNCTIONCODE, billMis .getFunction().getCode()); for (final EgBilldetails egBilldetails : billDetailslist) { // persistenceService.setSessionFactory(new SessionFactory()); detailMap = new HashMap<String, Object>(); if (null != egBilldetails.getFunctionid()) { /* * CFunction function = (CFunction) * persistenceService.getSession().load(CFunction.class, * (egBilldetails.getFunctionid()).longValue()); * detailMap.put(VoucherConstant.FUNCTIONCODE, * function.getCode()); */ } detailMap.put(VoucherConstant.DEBITAMOUNT, egBilldetails .getDebitamount() == null ? BigDecimal.ZERO : egBilldetails.getDebitamount()); detailMap.put(VoucherConstant.CREDITAMOUNT, egBilldetails .getCreditamount() == null ? BigDecimal.ZERO : egBilldetails.getCreditamount()); final String glcode = persistenceService .getSession() .createQuery( "select glcode from CChartOfAccounts where id = " + egBilldetails.getGlcodeid() .longValue()).list().get(0) .toString(); detailMap.put(VoucherConstant.GLCODE, glcode); accountdetails.add(detailMap); subLedgerlist = egBilldetails.getEgBillPaydetailes(); for (final EgBillPayeedetails egBillPayeedetails : subLedgerlist) { subledgertDetailMap = new HashMap<String, Object>(); subledgertDetailMap .put(VoucherConstant.DEBITAMOUNT, egBillPayeedetails.getDebitAmount() == null ? BigDecimal.ZERO : egBillPayeedetails .getDebitAmount()); subledgertDetailMap .put(VoucherConstant.CREDITAMOUNT, egBillPayeedetails.getCreditAmount() == null ? BigDecimal.ZERO : egBillPayeedetails .getCreditAmount()); subledgertDetailMap.put(VoucherConstant.DETAILTYPEID, egBillPayeedetails.getAccountDetailTypeId()); subledgertDetailMap.put(VoucherConstant.DETAILKEYID, egBillPayeedetails.getAccountDetailKeyId()); subledgertDetailMap.put(VoucherConstant.GLCODE, glcode); subledgerDetails.add(subledgertDetailMap); } } vh = createPreApprovedVoucher(headerDetails, accountdetails, subledgerDetails); egBillregister.getEgBillregistermis().setVoucherHeader(vh); } catch (final ValidationException e) { LOGGER.error(e.getErrors()); final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("exp", e.getErrors().get(0) .getMessage())); throw new ValidationException(errors); } catch (final Exception e) { LOGGER.error("Error in create voucher from bill" + e.getMessage()); throw new ApplicationRuntimeException(e.getMessage()); } return vh.getId().longValue(); } /** * creates voucher From billId * * @param billId * @return voucherheaderId long * @throws ApplicationRuntimeException * @throws SQLException * @throws Exception */ public long createVoucherFromBillForPJV(final int billId, final String voucherStatus, final List<PreApprovedVoucher> voucherdetailList, final List<PreApprovedVoucher> subLedgerList) throws ApplicationRuntimeException, SQLException, TaskFailedException { final CVoucherHeader vh = null; try { if (LOGGER.isDebugEnabled()) LOGGER.debug(" ---------------Generating Voucher-------"); EgBillregister egBillregister = null; egBillregister = billsService.getBillRegisterById(Integer .valueOf(billId)); /* * identify the bill type and delegate get the fund and fundsource * check for mandatory fields for implementation if missing throw * exception department is mandatory for implementation type fund is * mandatory for all implementations */ String name=""; final EgBillregistermis billMis = egBillregister .getEgBillregistermis(); final Fund fund = billMis.getFund(); if (fund == null) { LOGGER.error(FUNDMISSINGMSG); throw new ApplicationRuntimeException(FUNDMISSINGMSG); } else fund.getId(); final String deptMandatory = EGovConfig.getProperty( "egf_config.xml", "deptRequired", "", "general"); if (deptMandatory.equalsIgnoreCase("Y")) if (billMis.getEgDepartment() == null) throw new ApplicationRuntimeException(DEPTMISSINGMSG); final Fundsource fundSrc = billMis.getFundsource(); if (fundSrc != null) Integer.valueOf(fundSrc.getId().toString()); if (billMis.getScheme() != null) billMis.getScheme().getId(); if (billMis.getSubScheme() != null) billMis.getSubScheme().getId(); final String expType = egBillregister.getExpendituretype(); if (expType.equalsIgnoreCase(CONBILL)) { name = "Contractor Journal"; } else if (expType.equalsIgnoreCase(SUPBILL)) { name = "Supplier Journal"; if (null != billMis.getEgBillSubType() && billMis.getEgBillSubType().getName() .equalsIgnoreCase("Fixed Asset")) { } else { } } else if (expType.equalsIgnoreCase(SALBILL)) { name = "Salary Journal"; } // Pension,Gratuity are saved as contingency Bill else if (expType .equalsIgnoreCase(FinancialConstants.STANDARD_EXPENDITURETYPE_CONTINGENT)) { name = FinancialConstants.JOURNALVOUCHER_NAME_EXPENSEJOURNAL; } else if (expType.equalsIgnoreCase(PENSBILL)) { name = "Pension Journal"; } else if (expType.equalsIgnoreCase(GRATBILL)) { name = "Gratuity Journal"; } else { name = "JVGeneral"; } // vh=createVoucherheaderAndPostGLForPJV(fundId,egBillregister,fundSrcId,schemeId,subSchemeId,name,cgnCode,voucherType,voucherdetailList,subLedgerList); } catch (final Exception e) { LOGGER.error("Error in createVoucherFromBillForPJV " + e.getMessage()); throw new ApplicationRuntimeException(e.getMessage()); } return vh.getId().longValue(); } /** * @description - This method is used to create the vouchers for the * preapproved vouchers. * @param vouhcerheaderid * - the vouhcerheaderid of the preapproved voucher. * @param status * - status of the vouchers. * @return void - This method does not return anything as its only create * the vouchers for the preapproved vouchers.s */ public void createVoucherFromPreApprovedVoucher(final long vouhcerheaderid, final String status) throws ApplicationRuntimeException { try { final CVoucherHeader vh = (CVoucherHeader) voucherHeaderDAO .findById(vouhcerheaderid, false); vh.setStatus(Integer.valueOf(status)); voucherHeaderDAO.update(vh); } catch (final Exception e) { LOGGER.error(e.getMessage()); throw new ApplicationRuntimeException(e.getMessage()); } } /** * This API is to create a voucher from the list of HashMap values that are * passed. This will take care of various types of vouchers like -receipt, * payments and journal vouchers * * @param headerdetails * <p> * HashMap<String, Object> headerdetails will have the data * required for the voucher header and mis : * <p> * vouchername -This will be the name of the voucher, will need * to set the values from enumeration (mandatory) * <p> * vouchertype -This will be the type of the voucher, will need * to set the values from enumeration (mandatory) * <p> * description -This will be the description of the voucher * (optional) * <p> * vouchernumber - This will be the vouchernumber if not set will * be populated (optional) * <p> * voucherdate - This is the date on which the voucher needs to * be created (mandatory) * <p> * fundid - This will be the id from the fund master (mandatory) * <p> * moduleid - This will be the id from module master,(not present * now). Any external system sending data needs to set the value * for this . If value not set will take as null (optional) * <p> * divisionid - This is the fieldid from the boundary master * (optional) * <p> * departmentid - This is the departmentid from the department * master (optional) * <p> * fundsourceid - This is the fundsourceid from the fund source * master (optional) * <p> * schemeid - This is the schemeid from the scheme master * (optional) * <p> * subschemeid - This is the subschemeid from the subscheme * master (optional) * <p> * status - This is the status of voucher . If not set will be * taken care (optional) * <p> * originalvoucher - This is the reference voucherid in care of * reversal voucher (optional) * <p> * refvoucher - This the reference voucherheaderid in case of * dependency vouchers (optional) * <p> * budgetCheckReq -Boolean- This is a flag set in vouchermis and * decided whether budget check should be done or not . 'true' is * yes 'false' is no . Default is 'true' (optional). * <p> * @param accountcodedetails * <p> * HashMap<String, Object> accountcodedetails will have data * required for the ledger details * <p> * glcodeid - This the ledger codeid from the chartofaccounts * master. (mandatory) * <p> * debitamount - This is the debit amount for that voucher * (optional) * <P> * creditamount - This is the credit amount for that voucher * (optional) * <p> * functionid - This is the functionid from the function master * (optional) * <p> * narration -This is the narration if any for that account code * (optional) * <p> * * <p> * @param subledgerdetails * <p> * HashMap<String, Object> subledgerdetails will have the * subledger details only for all the control codes in the * voucher. * <p> * glcodeid -This the ledger codeid from the chartofaccounts * master. (mandatory) * <p> * detailtypeid - This is the detailtypeid from the detailtype * object (mandatory) * <p> * detailkeyid - This is the detailkey from the detailkey object * (mandatory) <detailamount> - This is the amount for that * detailkey (mandatory) <tdsid> - This is the id from the * recovery master.If the glcode used is mapped in the recovery * master then this data is mandatory. * @return voucherheader object in case of success and null in case of fail. * @throws ApplicationRuntimeException */ @Transactional public CVoucherHeader createPreApprovedVoucher( final HashMap<String, Object> headerdetails, final List<HashMap<String, Object>> accountcodedetails, final List<HashMap<String, Object>> subledgerdetails) throws ApplicationRuntimeException, ValidationException { final AppConfig appConfig = appConfigService .getAppConfigByKeyName("PREAPPROVEDVOUCHERSTATUS"); if (null != appConfig && null != appConfig.getConfValues()) for (final AppConfigValues appConfigVal : appConfig .getConfValues()) headerdetails.put(VoucherConstant.STATUS, Integer.valueOf(appConfigVal.getValue())); else throw new ApplicationRuntimeException( "Appconfig value for PREAPPROVEDVOUCHERSTATUS is not defined in the system"); CVoucherHeader vh; try { vh = createVoucher(headerdetails, accountcodedetails, subledgerdetails); /*if (vh.getModuleId() != null) startWorkflow(vh);*/ //if u need workflow enable above lines and fix workflow } catch (final ValidationException ve) { LOGGER.error(ERR, ve); final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("exp", ve.getErrors().get(0) .getMessage())); throw new ValidationException(errors); } catch (final Exception e) { LOGGER.error(ERR, e); throw new ApplicationRuntimeException(e.getMessage()); } return vh; } /** * action name ////// check all junits, EisCommonsManger is added in create * voucher constructor voucher service need to pass * * @param voucherheader * @throws ValidationException */ public void startWorkflow(final CVoucherHeader voucherheader) throws ValidationException { try { final ApplicationContext applicationContext = new ClassPathXmlApplicationContext( new String[] { "classpath:org/serviceconfig-Bean.xml", "classpath:org/egov/infstr/beanfactory/globalApplicationContext.xml", "classpath:org/egov/infstr/beanfactory/applicationContext-egf.xml", "classpath:org/egov/infstr/beanfactory/applicationContext-pims.xml" }); if (voucherheader.getType().equals( FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL) || voucherheader.getType().equals( FinancialConstants.STANDARD_VOUCHER_TYPE_RECEIPT)) { LOGGER.error("Calling StartWorkflow...in create voucher.....for ......ContraJournalVoucher......" + voucherheader.getType() + " ----" + voucherheader.getName()); final String billtype = egBillRegisterHibernateDAO .getBillTypeforVoucher(voucherheader); if (billtype == null) { applicationContext.getBean("voucherWorkflowService"); voucherheader.start().withOwner(getPosition()); // voucherWorkflowService.transition("aa_approve", // voucherheader, "Created"); // action name need to pass // Position position = // eisCommonService.getPositionByUserId(ApplicationThreadLocals.getUserId()); final VoucherService vs = (VoucherService) applicationContext .getBean("voucherService"); final PersistenceService persistenceService = (PersistenceService) applicationContext .getBean("persistenceService"); final Position nextPosition = getNextPosition( voucherheader, vs, persistenceService, null); voucherheader.transition(true) .withStateValue("WORKFLOW INITIATED") .withOwner(nextPosition) .withComments("WORKFLOW STARTED"); } } /* * this logic is moved to top since both have same workflow else * if(voucherheader * .getType().equals(FinancialConstants.STANDARD_VOUCHER_TYPE_RECEIPT * )) { // ReceiptVoucher rv=new ReceiptVoucher(); * PersistenceService<ReceiptVoucher, Long> persistenceService = new * PersistenceService<ReceiptVoucher, Long>(); * //persistenceService.setType(ReceiptVoucher.class); * rv.setId(voucherheader.getId()); * rv.setVoucherHeader(voucherheader); * persistenceService.create(rv); * SimpleWorkflowService<ReceiptVoucher> receiptWorkflowService = * (SimpleWorkflowService) * applicationContext.getBean("receiptWorkflowService"); * receiptWorkflowService.start(rv, getPosition()); * receiptWorkflowService.transition("co_approve", rv, "Created"); * // action name need to pass } */ } catch (final Exception e) { final List<ValidationError> errors = new ArrayList<ValidationError>(); LOGGER.error(ERR, e); errors.add(new ValidationError( "Exp in startWorkflow for JV/Receipt voucher=", e .getMessage())); throw new ValidationException(errors); } } private Position getNextPosition(final CVoucherHeader voucherheader, final VoucherService vs, final PersistenceService persistenceService, final Position position) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Getting next Position for WorkFlow"); final Position nextPosition = null; Department department = vs.getTempDepartmentForWfItem(voucherheader, position); if (department == null) { LOGGER.warn("Not able to get tempoaray Assignment defaulting to primary asssigment"); department = vs.getDepartmentForWfItem(voucherheader); if (department == null) { final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("Unable to get Temp Department", "Unable to get Temp Department")); throw new ValidationException(errors); } } String functionaryName = ""; String designationName = ""; designationName = "SECTION MANAGER"; Boundary boundaryForUser = null; if (department.getCode().equalsIgnoreCase("A")) { final HierarchyType hierarchyTypeByName = hierarchyTypeService .getHierarchyTypeByName("ADMINISTRATION"); final List topBoundaries = boundaryService .getTopLevelBoundaryByHierarchyType(hierarchyTypeByName); if (topBoundaries != null && topBoundaries.size() > 0) boundaryForUser = (Boundary) topBoundaries.get(0); functionaryName = "Compilation"; } else { boundaryForUser = vs.getBoundaryForUser(voucherheader); functionaryName = "ZONE"; } final Designation next_desig = (Designation) persistenceService .find("from Designation where upper(name)=upper(?)", designationName); final Functionary functionary = (Functionary) persistenceService.find( "from Functionary where upper(name)=upper(?)", functionaryName); try { personalInformationDAO.getEmployeeByFunctionary(department.getId(), next_desig.getId(), boundaryForUser.getId(), functionary.getId()); } catch (final TooManyValuesException e) { LOGGER.error(e.getMessage(), e); final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("Too Many Employee Exists", "Too Many Employee Exists")); throw new ValidationException(errors); } catch (final NoSuchObjectException e) { LOGGER.error(e.getMessage(), e); final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("No Employee Exists", "No Employee Exists")); throw new ValidationException(errors); } // TODO: Get employee instead of personalinformation and fix the issue // nextPosition=vs.getPositionForEmployee(employeeByFunctionary) ; if (nextPosition != null) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Returning next Position for WorkFlow" + nextPosition.getName()); } else LOGGER.error("Could not get next Position for WorkFlow"); return nextPosition; } /** * */ @Deprecated public void startWorkflow(final ContraJournalVoucher cjv) throws ValidationException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Starting Contra Journal Voucher Workflow....startWorkflow(ContraJournalVoucher cjv)..."); try { if (cjv.getVoucherHeaderId().getState() == null) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Calling StartWorkflow...in create voucher.....for ......ContraJournalVoucher....................................................................................."); if (LOGGER.isDebugEnabled()) LOGGER.debug("fetching voucherWorkflowService from application context......."); final ApplicationContext applicationContext = new ClassPathXmlApplicationContext( new String[] { "classpath:org/serviceconfig-Bean.xml", "classpath:org/egov/infstr/beanfactory/globalApplicationContext.xml", "classpath:org/egov/infstr/beanfactory/applicationContext-egf.xml", "classpath:org/egov/infstr/beanfactory/applicationContext-pims.xml" }); applicationContext.getBean("voucherWorkflowService"); if (LOGGER.isDebugEnabled()) LOGGER.debug("completed voucherWorkflowService from application context......."); cjv.getVoucherHeaderId().start().withOwner(getPosition()); // voucherWorkflowService.transition("am_approve", // cjv.getVoucherHeaderId(), "Created"); // action name need to // pass final Position position = eisCommonService .getPositionByUserId(ApplicationThreadLocals.getUserId()); cjv.transition(true).withStateValue("WORKFLOW INITIATED") .withOwner(position).withComments("WORKFLOW STARTED"); final VoucherService vs = (VoucherService) applicationContext .getBean("voucherService"); final PersistenceService persistenceService = (PersistenceService) applicationContext .getBean("persistenceService"); final Position nextPosition = getNextPosition( cjv.getVoucherHeaderId(), vs, persistenceService, null); cjv.transition(true).withStateValue("WORKFLOW INITIATED") .withOwner(nextPosition) .withComments("WORKFLOW STARTED"); } } catch (final Exception e) { final List<ValidationError> errors = new ArrayList<ValidationError>(); LOGGER.error(ERR, e); errors.add(new ValidationError("Exp in startWorkflow for Contra=", e.getMessage())); throw new ValidationException(errors); } if (LOGGER.isDebugEnabled()) LOGGER.debug("Completed Contra Journal Voucher Workflow......."); } /** * only for contra workflow * * @param voucherHeader * @throws ValidationException * Uses VoucherWorkflow since contra and brv workflows are same */ public void startWorkflowForCashUpdate(final CVoucherHeader voucherHeader) throws ValidationException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Starting Journal Voucher Workflow. for contra......"); try { if (LOGGER.isDebugEnabled()) LOGGER.debug("Calling StartWorkflow...For Cash"); final ApplicationContext applicationContext = new ClassPathXmlApplicationContext( new String[] { "classpath:org/serviceconfig-Bean.xml", "classpath:org/egov/infstr/beanfactory/globalApplicationContext.xml", "classpath:org/egov/infstr/beanfactory/applicationContext-egf.xml", "classpath:org/egov/infstr/beanfactory/applicationContext-pims.xml" }); applicationContext.getBean("voucherWorkflowService"); if (LOGGER.isDebugEnabled()) LOGGER.debug("completed voucherWorkflowService from application context......."); voucherHeader.start().withOwner(getPosition()); final VoucherService vs = (VoucherService) applicationContext .getBean("voucherService"); final PersistenceService persistenceService = (PersistenceService) applicationContext .getBean("persistenceService"); final Position nextPosition = getNextPosition(voucherHeader, vs, persistenceService, null); voucherHeader.transition(true).withStateValue("Forwarded") .withOwner(nextPosition).withComments("Forwarded"); } catch (final Exception e) { final List<ValidationError> errors = new ArrayList<ValidationError>(); LOGGER.error(ERR, e); errors.add(new ValidationError("Exp in startWorkflow for Contra=", e.getMessage())); throw new ValidationException(errors); } if (LOGGER.isDebugEnabled()) LOGGER.debug("Completed Contra Journal Voucher Workflow......."); } public Position getPosition() throws ApplicationRuntimeException { Position pos; if (LOGGER.isDebugEnabled()) LOGGER.debug("getPosition====" + ApplicationThreadLocals.getUserId()); pos = eisCommonService .getPositionByUserId(ApplicationThreadLocals.getUserId()); if (LOGGER.isDebugEnabled()) LOGGER.debug("position===" + pos.getId()); return null;// pos; } /** * This API is to create a voucher from the list of HashMap values that are * passed. This will take care of various types of vouchers like -receipt, * payments and journal vouchers * * @param headerdetails * <p> * HashMap<String, Object> headerdetails will have the data * required for the voucher header and mis : * <p> * vouchername -This will be the name of the voucher, will need * to set the values from enumeration (mandatory) * <p> * vouchertype -This will be the type of the voucher, will need * to set the values from enumeration (mandatory) * <p> * description -This will be the description of the voucher * (optional) * <p> * vouchernumber - This will be the vouchernumber if not set will * be populated (optional) * <p> * voucherdate - This is the date on which the voucher needs to * be created (mandatory) * <p> * fundid - This will be the id from the fund master (mandatory) * <p> * functionid - This is the functionid from the function master * (optional) * <p> * moduleid - This will be the id from module master,(not present * now). Any external system sending data needs to set the value * for this . If value not set will take as null (optional) * <p> * divisionid - This is the fieldid from the boundary master * (optional) * <p> * departmentid - This is the departmentid from the department * master (optional) * <p> * fundsourceid - This is the fundsourceid from the fund source * master (optional) * <p> * schemeid - This is the schemeid from the scheme master * (optional) * <p> * subschemeid - This is the subschemeid from the subscheme * master (optional) * <p> * status - This is the status of voucher . If not set will be * taken care (optional) * <p> * originalvoucher - This is the reference voucherid in care of * reversal voucher (optional) * <p> * refvoucher - This the reference voucherheaderid in case of * dependency vouchers (optional) * <p> * vouchersubtype - This is the sub voucher type in case of * Journals where there are various kinds (optional) * <p> * budgetCheckReq -Boolean- This is a flag set in vouchermis and * decided whether budget check should be done or not . 'true' is * yes 'false' is no . Default is 'true' (optional). * <p> * billid-this is the bill number for which voucher is getting * created . (optional) * <p> * @param accountcodedetails * <p> * HashMap<String, Object> accountcodedetails will have data * required for the ledger details * <p> * glcodeid - This the ledger codeid from the chartofaccounts * master. (mandatory) * <p> * debitamount - This is the debit amount for that voucher * (optional) * <P> * creditamount - This is the credit amount for that voucher * (optional) * <p> * functionid - This is the functionid from the function master * (optional) * <p> * narration -This is the narration if any for that account code * (optional) * <p> * * <p> * @param subledgerdetails * <p> * HashMap<String, Object> subledgerdetails will have the * subledger details only for all the control codes in the * voucher. * <p> * glcodeid -This the ledger codeid from the chartofaccounts * master. (mandatory) * <p> * detailtypeid - This is the detailtypeid from the detailtype * object (mandatory) * <p> * detailkeyid - This is the detailkey from the detailkey object * (mandatory) <detailamount> - This is the amount for that * detailkey (mandatory) <tdsid> - This is the id from the * recovery master.If the glcode used is mapped in the recovery * master then this data is mandatory. * @return voucherheader object in case of success and null in case of fail. * @throws ApplicationRuntimeException */ @Transactional public CVoucherHeader createVoucher( final HashMap<String, Object> headerdetails, final List<HashMap<String, Object>> accountcodedetails, final List<HashMap<String, Object>> subledgerdetails) throws ApplicationRuntimeException { CVoucherHeader vh; Vouchermis mis; if (LOGGER.isDebugEnabled()) LOGGER.debug("start | createVoucher API"); try { validateMandateFields(headerdetails); validateLength(headerdetails); validateVoucherMIS(headerdetails); validateTransaction(accountcodedetails, subledgerdetails); validateFunction(headerdetails, accountcodedetails); vh = createVoucherHeader(headerdetails); mis = createVouchermis(headerdetails); mis.setVoucherheaderid(vh); vh.setVouchermis(mis); // insertIntoVoucherHeader(vh); if (LOGGER.isDebugEnabled()) LOGGER.debug("start | insertIntoVoucherHeader"); final String vdt = formatter.format(vh.getVoucherDate()); String fiscalPeriod = null; try { fiscalPeriod = getFiscalPeriod(vdt); } catch (final TaskFailedException e) { throw new ApplicationRuntimeException( "error while getting fiscal period"); } if (null == fiscalPeriod) throw new ApplicationRuntimeException( "Voucher Date not within an open period or Financial year not open for posting, fiscalPeriod := " + fiscalPeriod); vh.setFiscalPeriodId(Integer.valueOf(fiscalPeriod)); vh.setCgvn(getCGVNNumber(vh)); try { if (!isUniqueVN(vh.getVoucherNumber(), vdt)) throw new ValidationException( Arrays.asList(new ValidationError( "Duplicate Voucher Number", "Duplicate Voucher Number"))); } catch (final Exception e) { LOGGER.error(ERR, e); throw new ApplicationRuntimeException(e.getMessage()); } voucherService.applyAuditing(vh); if (LOGGER.isInfoEnabled()) LOGGER.info("++++++++++++++++++" + vh.toString()); voucherService.persist(vh); if (null != vh.getVouchermis().getSourcePath() && null == vh.getModuleId() && vh.getVouchermis().getSourcePath().length() == vh .getVouchermis().getSourcePath().indexOf("=") + 1) { final StringBuffer sourcePath = new StringBuffer(); if (LOGGER.isDebugEnabled()) LOGGER.debug("Source Path received : " + vh.getVouchermis().getSourcePath()); if (LOGGER.isDebugEnabled()) LOGGER.debug("Voucher Header Id : " + vh.getId()); sourcePath.append(vh.getVouchermis().getSourcePath()).append( vh.getId().toString()); vh.getVouchermis().setSourcePath(sourcePath.toString()); voucherService.applyAuditing(vh); voucherService.update(vh); } if (LOGGER.isDebugEnabled()) LOGGER.debug("End | insertIntoVoucherHeader"); // insertIntoRecordStatus(vh); final List<Transaxtion> transactions = createTransaction( headerdetails, accountcodedetails, subledgerdetails, vh); //persistenceService.getSession().flush(); // engine = ChartOfAccounts.getInstance(); // setChartOfAccounts(); Transaxtion txnList[] = new Transaxtion[transactions.size()]; txnList = transactions.toArray(txnList); final SimpleDateFormat formatter = new SimpleDateFormat(DD_MMM_YYYY); if (!chartOfAccounts.postTransaxtions(txnList, formatter.format(vh.getVoucherDate()))) throw new ApplicationRuntimeException("Voucher creation Failed"); } catch (final ValidationException ve) { final List<ValidationError> errors = new ArrayList<ValidationError>(); errors.add(new ValidationError("exp", ve.getErrors().get(0) .getMessage())); throw new ValidationException(errors); } catch (final Exception e) { LOGGER.error(ERR, e); throw new ApplicationRuntimeException(e.getMessage()); } if (LOGGER.isDebugEnabled()) LOGGER.debug("End | createVoucher API"); return vh; } /** * * @param headerdetails * @param accountcodedetails * Validates based on Single Function for a transaction * */ private void validateFunction(final HashMap<String, Object> headerdetails, final List<HashMap<String, Object>> accountcodedetails) { final List<AppConfigValues> appConfigValues = appConfigValuesService.getConfigValuesByModuleAndKey(FinancialConstants.MODULE_NAME_APPCONFIG, "ifRestrictedToOneFunctionCenter"); if (appConfigValues == null) { if (LOGGER.isDebugEnabled()) LOGGER.debug("app config ifRestrictedToOneFunctionCenter is not defined"); throw new ValidationException("Error", "Use Single Function For a transaction is not defined"); } else if (appConfigValues.get(0).getValue().equalsIgnoreCase("No")) { // Keep last two lines when making single function mandatory. // Now this will support both. // If function is added in header it will consider it for all // details else // it will use from detail. boolean foundInHeader = false; final Map functionMap = new HashMap<String, String>();// to find // duplicates. // finally // we should // have one // and only // entry // in // this String functionCodeInHeader = ""; // 1. check if function is passed in header if (null != headerdetails.get(VoucherConstant.FUNCTIONCODE)) { functionCodeInHeader = (String) headerdetails .get(VoucherConstant.FUNCTIONCODE); functionMap.put(functionCodeInHeader, functionCodeInHeader); foundInHeader = true; } if (foundInHeader) for (final HashMap<String, Object> accDetailMap : accountcodedetails) accDetailMap.put(VoucherConstant.FUNCTIONCODE, headerdetails.get(VoucherConstant.FUNCTIONCODE)); if (LOGGER.isDebugEnabled()) LOGGER.debug("Not a single Function Transaction No need of Further check on function"); return; } else if (appConfigValues.get(0).getValue().equalsIgnoreCase("Yes")) { boolean foundInHeader = false; boolean atLeastOneMissing = false; final Map functionMap = new HashMap<String, String>();// to find // duplicates. // finally // we should // have one // and only // entry // in // this String functionCodeInHeader = ""; String functionCodeInDetail = ""; // 1. check if function is passed in header if (null != headerdetails.get(VoucherConstant.FUNCTIONCODE)) { functionCodeInHeader = (String) headerdetails .get(VoucherConstant.FUNCTIONCODE); functionMap.put(functionCodeInHeader, functionCodeInHeader); foundInHeader = true; } // 2. Check if function is passed in Details for (final HashMap<String, Object> accDetailMap : accountcodedetails) if (null != accDetailMap.get(VoucherConstant.FUNCTIONCODE) && "" != accDetailMap.get(VoucherConstant.FUNCTIONCODE)) { functionCodeInDetail = accDetailMap.get( VoucherConstant.FUNCTIONCODE).toString(); functionMap.put(functionCodeInDetail, functionCodeInDetail); } else // Mark if Function is missing in detail level atLeastOneMissing = true; // If no function is passed or more than one passed throw error if (functionMap.size() > 1) { LOGGER.error("multiple functions found in Header and details Cannot Continue Transaction...."); throw new ValidationException( Arrays.asList(new ValidationError( "multiple functions found in Header and details", "multiple.functions.found.in.Header.and.details"))); } // commented by Shamili - functionMap.isEmpty() needs to be // validated when function is mandatory // Uncommenting since one function center is mandatory if (functionMap.isEmpty()) { LOGGER.error("Function not found in Header or details Cannot Continue Transaction...."); throw new ValidationException( Arrays.asList(new ValidationError( "function not found in Header or details", "function.not.found.in.Header.or.details"))); } // since we passed the above check, there is one function.If it is // not in header then it must be from detail if (!foundInHeader) headerdetails.put(VoucherConstant.FUNCTIONCODE, functionCodeInDetail); // Now fetch it from the header which we have populated if (atLeastOneMissing) for (final HashMap<String, Object> accDetailMap : accountcodedetails) if (null == accDetailMap.get(VoucherConstant.FUNCTIONCODE) || "" == accDetailMap .get(VoucherConstant.FUNCTIONCODE)) accDetailMap .put(VoucherConstant.FUNCTIONCODE, headerdetails .get(VoucherConstant.FUNCTIONCODE)); } } /** * @param headerdetails */ private void validateLength(final HashMap<String, Object> headerdetails) { if (headerdetails.get(VoucherConstant.DESCRIPTION) != null && headerdetails.get(VoucherConstant.DESCRIPTION).toString() .length() > 250) throw new ValidationException(Arrays.asList(new ValidationError( "voucher.description.exceeds.max.length", "Narration exceeds maximum length"))); final String vNumGenMode = voucherTypeForULB .readVoucherTypes(headerdetails .get(VoucherConstant.VOUCHERTYPE).toString()); if (vNumGenMode != "Auto" && headerdetails.get(VoucherConstant.VOUCHERNUMBER) != null) { final int typeLength = Integer .valueOf(FinancialConstants.VOUCHERNO_TYPE_LENGTH); final int voucherNumberColumnLength = 30;// length in the db final int fundIdentfierLength = 1; if (headerdetails.get(VoucherConstant.VOUCHERNUMBER).toString() .length() > voucherNumberColumnLength - (typeLength + fundIdentfierLength)) { final String voucheNumberErrMsg = " VoucherNumber length should be lessthan " + (voucherNumberColumnLength - (typeLength + fundIdentfierLength)); throw new ValidationException( Arrays.asList(new ValidationError( "voucher.number.exceeds.max.length", voucheNumberErrMsg))); } } } // used for reversal protected void insertIntoVoucherHeader(final CVoucherHeader vh) throws ApplicationRuntimeException { if (LOGGER.isDebugEnabled()) LOGGER.debug("start | insertIntoVoucherHeader"); final String vdt = formatter.format(vh.getVoucherDate()); String fiscalPeriod = null; try { CFiscalPeriod fis = fiscalPeriodHibernateDAO .getFiscalPeriodByDate(vh.getVoucherDate()); if (fis != null) fiscalPeriod = fis.getId().toString(); } catch (final Exception e) { throw new ApplicationRuntimeException( "error while getting fiscal period"); } if (null == fiscalPeriod) throw new ApplicationRuntimeException( "Voucher Date not within an open period or Financial year not open for posting, fiscalPeriod := " + fiscalPeriod); vh.setFiscalPeriodId(Integer.valueOf(fiscalPeriod)); vh.setCgvn(getCGVNNumber(vh)); try { if (!isUniqueVN(vh.getVoucherNumber(), vdt)) throw new ValidationException( Arrays.asList(new ValidationError( "Duplicate Voucher Number", "Duplicate Voucher Number"))); } catch (final Exception e) { LOGGER.error(ERR, e); throw new ApplicationRuntimeException(e.getMessage()); } vh.setCreatedBy(userMngr.getUserById(Long.valueOf(ApplicationThreadLocals .getUserId()))); if (LOGGER.isInfoEnabled()) LOGGER.info("++++++++++++++++++" + vh.toString()); voucherService.persist(vh); if (null != vh.getVouchermis().getSourcePath() && null == vh.getModuleId() && vh.getVouchermis().getSourcePath().length() == vh .getVouchermis().getSourcePath().indexOf("=") + 1) { final StringBuffer sourcePath = new StringBuffer(); if (LOGGER.isDebugEnabled()) LOGGER.debug("Source Path received : " + vh.getVouchermis().getSourcePath()); if (LOGGER.isDebugEnabled()) LOGGER.debug("Voucher Header Id : " + vh.getId()); sourcePath.append(vh.getVouchermis().getSourcePath()).append( vh.getId().toString()); vh.getVouchermis().setSourcePath(sourcePath.toString()); voucherService.update(vh); } if (LOGGER.isDebugEnabled()) LOGGER.debug("End | insertIntoVoucherHeader"); } protected String getCgnType(String vType) { vType = vType.toUpperCase().replaceAll(" ", ""); String cgnType = null; String typetoCheck = vType; if (vType.equalsIgnoreCase("JOURNAL VOUCHER")) typetoCheck = "JOURNALVOUCHER"; switch (voucherTypeEnum.valueOf(typetoCheck.toUpperCase())) { case JOURNALVOUCHER: cgnType = "JVG"; break; case CONTRA: cgnType = "CSL"; break; case RECEIPT: cgnType = "MSR"; break; case PAYMENT: cgnType = "DBP"; break; } return cgnType; } /** * This method will validate all the master data that are passed. This will * also check if the data send are correct with respect to the inter master * dependency. * * @param headerdetails * @throws ApplicationRuntimeException */ public void validateVoucherMIS(final HashMap<String, Object> headerdetails) throws ApplicationRuntimeException { if (LOGGER.isDebugEnabled()) LOGGER.debug("START | validateVoucherMIS"); // Validate Department. Department dept = null; if (headerdetails.containsKey(VoucherConstant.DEPARTMENTCODE) && null != headerdetails.get(VoucherConstant.DEPARTMENTCODE)) { dept = deptM.getDepartmentByCode(headerdetails.get( VoucherConstant.DEPARTMENTCODE).toString()); if (dept == null) throw new ApplicationRuntimeException("not a valid Department"); } if (null != headerdetails.get(VoucherConstant.FUNCTIONARYCODE)) { final Functionary functionary = functionaryDAO .getFunctionaryByCode(BigDecimal.valueOf(Long .valueOf(headerdetails.get( VoucherConstant.FUNCTIONARYCODE).toString()))); if (null == functionary) throw new ApplicationRuntimeException("not a valid functionary"); } // validate fund. String fundCode = null; Fund fund = null; if (headerdetails.containsKey(VoucherConstant.FUNDCODE) && null != headerdetails.get(VoucherConstant.FUNDCODE)) { fundCode = headerdetails.get(VoucherConstant.FUNDCODE).toString(); fund = fundDAO.fundByCode(fundCode); if (null == fund) throw new ApplicationRuntimeException("not a valid fund"); } else throw new ApplicationRuntimeException("fund value is missing"); // validate Scheme Scheme scheme = null; if (headerdetails.containsKey(VoucherConstant.SCHEMECODE) && null != headerdetails.get(VoucherConstant.SCHEMECODE)) { final String schemecode = headerdetails.get( VoucherConstant.SCHEMECODE).toString(); scheme = schemeDAO.getSchemeByCode(schemecode); if (null == scheme) throw new ApplicationRuntimeException("not a valid scheme"); if (!fund.getId().equals(scheme.getFund().getId())) throw new ApplicationRuntimeException( "This scheme does not belong to this fund"); } // validate subscheme SubScheme subScheme = null; if (headerdetails.containsKey(VoucherConstant.SUBSCHEMECODE) && null != headerdetails.get(VoucherConstant.SUBSCHEMECODE)) { final String subSchemeCode = headerdetails.get( VoucherConstant.SUBSCHEMECODE).toString(); subScheme = subSchemeDAO.getSubSchemeByCode(subSchemeCode); if (null == subScheme) throw new ApplicationRuntimeException("not a valid subscheme"); if (!subScheme.getScheme().getId().equals(scheme.getId())) throw new ApplicationRuntimeException( "This subscheme does not belong to this scheme"); } // validate fundsource if (headerdetails.containsKey(VoucherConstant.FUNDSOURCECODE) && null != headerdetails.get(VoucherConstant.FUNDSOURCECODE)) { final Fundsource fundsource = fundSourceDAO .getFundSourceByCode(headerdetails.get( VoucherConstant.FUNDSOURCECODE).toString()); if (null == fundsource) throw new ApplicationRuntimeException("not a valid fund source"); } if (headerdetails.containsKey(VoucherConstant.DIVISIONID) && null != headerdetails.get(VoucherConstant.DIVISIONID)) if (null == boundary.getBoundaryById(Long.parseLong(headerdetails .get(VoucherConstant.DIVISIONID).toString()))) throw new ApplicationRuntimeException("not a valid divisionid"); if (LOGGER.isDebugEnabled()) LOGGER.debug("END | validateVoucherMIS"); } public void validateMandateFields( final HashMap<String, Object> headerdetails) { List<String> headerMandateFields = getHeaderMandateFields(); if (LOGGER.isDebugEnabled()) LOGGER.debug("Inside Validate Method"); checkMandatoryField("vouchernumber", headerdetails.get(VoucherConstant.VOUCHERNUMBER), headerdetails,headerMandateFields); checkMandatoryField("voucherdate", headerdetails.get(VoucherConstant.VOUCHERDATE), headerdetails,headerMandateFields); checkMandatoryField("fund", headerdetails.get(VoucherConstant.FUNDCODE), headerdetails,headerMandateFields); checkMandatoryField("department", headerdetails.get(VoucherConstant.DEPARTMENTCODE), headerdetails,headerMandateFields); checkMandatoryField("scheme", headerdetails.get(VoucherConstant.SCHEMECODE), headerdetails,headerMandateFields); checkMandatoryField("subscheme", headerdetails.get(VoucherConstant.SUBSCHEMECODE), headerdetails,headerMandateFields); checkMandatoryField("functionary", headerdetails.get(VoucherConstant.FUNCTIONARYCODE), headerdetails,headerMandateFields); // checkMandatoryField("function",headerdetails.get(VoucherConstant.FUNCTIONCODE),headerdetails); checkMandatoryField("fundsource", headerdetails.get(VoucherConstant.FUNDSOURCECODE), headerdetails,headerMandateFields); checkMandatoryField("field", headerdetails.get(VoucherConstant.DIVISIONID), headerdetails,headerMandateFields); } private void validateVoucherType(String voucherType) { voucherType = voucherType.toUpperCase().replaceAll(" ", ""); boolean typeFound = false; final voucherTypeEnum[] allvoucherTypeEnum = voucherTypeEnum.values(); for (final voucherTypeEnum voucherTypeEnum : allvoucherTypeEnum) if (voucherTypeEnum.toString().equalsIgnoreCase(voucherType)) { typeFound = true; break; } if (!typeFound) throw new ApplicationRuntimeException("Voucher type is not valid"); } @Transactional @SuppressWarnings("deprecation") public CVoucherHeader createVoucherHeader( final HashMap<String, Object> headerdetails) throws ApplicationRuntimeException, Exception { if (LOGGER.isDebugEnabled()) LOGGER.debug("START | createVoucherHeader"); // Connection con = null; Query query = null; final CVoucherHeader cVoucherHeader = new CVoucherHeader(); try { // String voucherSubType=""; cVoucherHeader.setName(headerdetails.get( VoucherConstant.VOUCHERNAME).toString()); String voucherType = headerdetails.get(VoucherConstant.VOUCHERTYPE) .toString(); cVoucherHeader.setType(headerdetails.get( VoucherConstant.VOUCHERTYPE).toString()); String vNumGenMode = null; // -- Voucher Type checking. --START if (FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL .equalsIgnoreCase(voucherType)) vNumGenMode = voucherTypeForULB.readVoucherTypes("Journal"); else vNumGenMode = voucherTypeForULB.readVoucherTypes(voucherType); // --END -- voucherType = voucherType.toUpperCase().replaceAll(" ", ""); String voucherSubType = null; if (headerdetails.get(VoucherConstant.VOUCHERSUBTYPE) != null) { voucherSubType = (String) headerdetails .get(VoucherConstant.VOUCHERSUBTYPE); voucherSubType = voucherSubType.toUpperCase().replaceAll(" ", ""); } // why it is type,subtype where api expects subtype,type ? // if() final String voucherNumberPrefix = getVoucherNumberPrefix( voucherType, voucherSubType); String voucherNumber = null; if (headerdetails.get(VoucherConstant.DESCRIPTION) != null) cVoucherHeader.setDescription(headerdetails.get( VoucherConstant.DESCRIPTION).toString()); final Date voucherDate = (Date) headerdetails .get(VoucherConstant.VOUCHERDATE); cVoucherHeader.setVoucherDate(voucherDate); Fund fundByCode = fundDAO.fundByCode(headerdetails.get( VoucherConstant.FUNDCODE).toString()); if (LOGGER.isDebugEnabled()) LOGGER.debug("Voucher Type is :" + voucherType); if (LOGGER.isDebugEnabled()) LOGGER.debug("vNumGenMode is :" + vNumGenMode); if (headerdetails.get(VoucherConstant.VOUCHERNUMBER) != null) voucherNumber = headerdetails .get(VoucherConstant.VOUCHERNUMBER).toString(); if (null != headerdetails.get(VoucherConstant.MODULEID)) vNumGenMode = "Auto"; cVoucherHeader.setFundId(fundByCode); if (vNumGenMode.equals("Auto")) { cVoucherHeader.setVoucherNumberPrefix(voucherNumberPrefix); VouchernumberGenerator v = beanResolver.getAutoNumberServiceFor(VouchernumberGenerator.class); final String strVoucherNumber = v.getNextNumber(cVoucherHeader); cVoucherHeader.setVoucherNumber(strVoucherNumber); } /* * if("Auto".equalsIgnoreCase(vNumGenMode) || null != * headerdetails.get(VoucherConstant.MODULEID)){ * if(LOGGER.isDebugEnabled()) * LOGGER.debug("Generating auto voucher number"); SimpleDateFormat * df = new SimpleDateFormat(DD_MM_YYYY); String vDate = * df.format(voucherDate); * cVoucherHeader.setVoucherNumber(cmImpl.getTxnNumber * (fundId.toString(),voucherNumberPrefix,vDate,con)); }else { * voucherNumber = * headerdetails.get(VoucherConstant.VOUCHERNUMBER).toString(); * query=persistenceService.getSession().createQuery( * "select f.identifier from Fund f where id=:fundId"); * query.setInteger("fundId", fundId); String fundIdentifier = * query.uniqueResult().toString(); * cVoucherHeader.setVoucherNumber(new * StringBuffer().append(fundIdentifier * ).append(voucherNumberPrefix). append(voucherNumber).toString()); * } */ if (headerdetails.containsKey(VoucherConstant.MODULEID) && null != headerdetails.get(VoucherConstant.MODULEID)) { cVoucherHeader.setModuleId(Integer.valueOf(headerdetails.get( VoucherConstant.MODULEID).toString())); cVoucherHeader.setIsConfirmed(Integer.valueOf(1)); } else { // Fix Me /* * PersistenceService<AppConfig, Integer> appConfigSer; * appConfigSer = new PersistenceService<AppConfig, Integer>(); * appConfigSer.setSessionFactory(new SessionFactory()); * appConfigSer.setType(AppConfig.class); AppConfig appConfig= * (AppConfig) * appConfigSer.find("from AppConfig where key_name =?", * "JournalVoucher_ConfirmonCreate"); if(null != appConfig && * null!= appConfig.getValues() ){ for (AppConfigValues * appConfigVal : appConfig.getValues()) { * cVoucherHeader. * setIsConfirmed(Integer.valueOf(appConfigVal.getValue())); } } */ } if (headerdetails.containsKey(VoucherConstant.STATUS) && null != headerdetails.get(VoucherConstant.STATUS)) cVoucherHeader.setStatus(Integer.valueOf(headerdetails.get( VoucherConstant.STATUS).toString())); else { final List list = appConfigValuesService .getConfigValuesByModuleAndKey("EGF", "DEFAULTVOUCHERCREATIONSTATUS"); cVoucherHeader.setStatus(Integer .parseInt(((AppConfigValues) list.get(0)).getValue())); } if (null != headerdetails.get(VoucherConstant.ORIGIONALVOUCHER)) { final Long origionalVId = Long.parseLong(headerdetails.get( VoucherConstant.ORIGIONALVOUCHER).toString()); query = persistenceService.getSession().createQuery( "from CVoucherHeader where id=:id"); query.setLong("id", origionalVId); if (query.list().size() == 0) throw new ApplicationRuntimeException( "Not a valid origional voucherheader id"); else cVoucherHeader.setOriginalvcId(origionalVId); } cVoucherHeader.setRefvhId((Long) headerdetails .get(VoucherConstant.REFVOUCHER)); cVoucherHeader.setEffectiveDate(new Date()); if (LOGGER.isDebugEnabled()) LOGGER.debug("Printing Voucher Details------------------------------------------------------------------------------"); if (LOGGER.isDebugEnabled()) LOGGER.debug(cVoucherHeader.toString()); if (LOGGER.isDebugEnabled()) LOGGER.debug("Printing Voucher Details------------------------------------------------------------------------------"); } catch (final ValidationException e) { LOGGER.error(e.getMessage()); throw e; } catch (final Exception e) { LOGGER.error(e); throw new Exception(e.getMessage()); } if (LOGGER.isDebugEnabled()) LOGGER.debug("END | createVoucherHeader"); return cVoucherHeader; } enum voucherTypeEnum { JOURNALVOUCHER, CONTRA, RECEIPT, PAYMENT; } enum voucherSubTypeEnum { JOURNALVOUCHER, CONTRA, RECEIPT, PAYMENT, PURCHASEJOURNAL, PENSIONJOURNAL, PURCHASE, WORKS, CONTRACTORJOURNAL, FIXEDASSETJOURNAL, FIXEDASSET, PENSION, WORKSJOURNAL, CONTINGENTJOURNAL, SALARY, SALARYJOURNAL, EXPENSE, EXPENSEJOURNAL, JVGENERAL; } // we cannot provide enum for all names so we need to find a way // or code it for all standard type like CJV,SJV,PJV,EJV private String getVoucherNumberPrefix(final String type, String subtype) { // if sub type is null use type if (subtype == null) subtype = type; subtype = subtype.toUpperCase().trim(); String voucherNumberPrefix = null; String typetoCheck = subtype; if (subtype.equalsIgnoreCase("JOURNAL VOUCHER")) typetoCheck = "JOURNALVOUCHER"; switch (voucherSubTypeEnum.valueOf(typetoCheck)) { case JVGENERAL: voucherNumberPrefix = FinancialConstants.JOURNAL_VOUCHERNO_TYPE; break; case JOURNALVOUCHER: voucherNumberPrefix = FinancialConstants.JOURNAL_VOUCHERNO_TYPE; break; case CONTRA: voucherNumberPrefix = FinancialConstants.CONTRA_VOUCHERNO_TYPE; break; case RECEIPT: voucherNumberPrefix = FinancialConstants.RECEIPT_VOUCHERNO_TYPE; break; case PAYMENT: voucherNumberPrefix = FinancialConstants.PAYMENT_VOUCHERNO_TYPE; break; case PURCHASEJOURNAL: voucherNumberPrefix = FinancialConstants.PURCHBILL_VOUCHERNO_TYPE; break; case WORKS: voucherNumberPrefix = FinancialConstants.WORKSBILL_VOUCHERNO_TYPE; case CONTRACTORJOURNAL: voucherNumberPrefix = FinancialConstants.WORKSBILL_VOUCHERNO_TYPE; case WORKSJOURNAL: voucherNumberPrefix = FinancialConstants.WORKSBILL_VOUCHERNO_TYPE; break; case FIXEDASSETJOURNAL: voucherNumberPrefix = FinancialConstants.FIXEDASSET_VOUCHERNO_TYPE; break; case CONTINGENTJOURNAL: voucherNumberPrefix = FinancialConstants.CBILL_VOUCHERNO_TYPE; break; case PURCHASE: voucherNumberPrefix = FinancialConstants.PURCHBILL_VOUCHERNO_TYPE; break; case EXPENSEJOURNAL: voucherNumberPrefix = FinancialConstants.CBILL_VOUCHERNO_TYPE; break; case EXPENSE: voucherNumberPrefix = FinancialConstants.CBILL_VOUCHERNO_TYPE; break; case SALARYJOURNAL: voucherNumberPrefix = FinancialConstants.SALBILL_VOUCHERNO_TYPE; case SALARY: voucherNumberPrefix = FinancialConstants.SALBILL_VOUCHERNO_TYPE; break; case FIXEDASSET: voucherNumberPrefix = FinancialConstants.FIXEDASSET_VOUCHERNO_TYPE; break; case PENSIONJOURNAL: voucherNumberPrefix = FinancialConstants.PENBILL_VOUCHERNO_TYPE; case PENSION: voucherNumberPrefix = FinancialConstants.PENBILL_VOUCHERNO_TYPE; break; default: {// if subtype is invalid then use type if (voucherNumberPrefix == null) voucherNumberPrefix = checkwithvouchertype(type); } } return voucherNumberPrefix; } /** * */ private String checkwithvouchertype(final String type) { String typetoCheck = type; if (type.equalsIgnoreCase("JOURNAL VOUCHER")) typetoCheck = "JOURNALVOUCHER"; String voucherNumberPrefix = null; switch (voucherTypeEnum.valueOf(typetoCheck)) { case JOURNALVOUCHER: voucherNumberPrefix = FinancialConstants.JOURNAL_VOUCHERNO_TYPE; break; case CONTRA: voucherNumberPrefix = FinancialConstants.CONTRA_VOUCHERNO_TYPE; break; case RECEIPT: voucherNumberPrefix = FinancialConstants.RECEIPT_VOUCHERNO_TYPE; break; case PAYMENT: voucherNumberPrefix = FinancialConstants.PAYMENT_VOUCHERNO_TYPE; break; } return voucherNumberPrefix; } @Transactional public Vouchermis createVouchermis( final HashMap<String, Object> headerdetails) throws ApplicationRuntimeException { if (LOGGER.isDebugEnabled()) LOGGER.debug("START | createVouchermis"); final Vouchermis vouchermis = new Vouchermis(); if (headerdetails.containsKey(VoucherConstant.DEPARTMENTCODE) && null != headerdetails.get(VoucherConstant.DEPARTMENTCODE)) { final String departmentCode = headerdetails.get( VoucherConstant.DEPARTMENTCODE).toString(); vouchermis.setDepartmentid(deptM .getDepartmentByCode(departmentCode)); } if (headerdetails.containsKey(VoucherConstant.SCHEMECODE) && null != headerdetails.get(VoucherConstant.SCHEMECODE)) { final String schemecode = headerdetails.get( VoucherConstant.SCHEMECODE).toString(); vouchermis.setSchemeid(schemeDAO.getSchemeByCode(schemecode)); } if (headerdetails.containsKey(VoucherConstant.SUBSCHEMECODE) && null != headerdetails.get(VoucherConstant.SUBSCHEMECODE)) { final String subschemecode = headerdetails.get( VoucherConstant.SUBSCHEMECODE).toString(); vouchermis.setSubschemeid(subSchemeDAO .getSubSchemeByCode(subschemecode)); } if (headerdetails.containsKey(VoucherConstant.FUNDSOURCECODE) && null != headerdetails.get(VoucherConstant.FUNDSOURCECODE)) { final String fundsourcecode = headerdetails.get( VoucherConstant.FUNDSOURCECODE).toString(); vouchermis.setFundsource(fundSourceDAO .getFundSourceByCode(fundsourcecode)); } if (null != headerdetails.get(VoucherConstant.FUNCTIONARYCODE)) vouchermis .setFunctionary(functionaryDAO .getFunctionaryByCode(BigDecimal.valueOf(Long .valueOf(headerdetails.get( VoucherConstant.FUNCTIONARYCODE) .toString())))); if (headerdetails.containsKey(VoucherConstant.FUNCTIONCODE) && null != headerdetails.get(VoucherConstant.FUNCTIONCODE)) { final String functionCode = headerdetails.get( VoucherConstant.FUNCTIONCODE).toString(); vouchermis.setFunction(functionDAO.getFunctionByCode(functionCode)); } if (null != headerdetails.get(VoucherConstant.SOURCEPATH)) vouchermis.setSourcePath(headerdetails.get( VoucherConstant.SOURCEPATH).toString()); if (headerdetails.containsKey(VoucherConstant.DIVISIONID) && null != headerdetails.get(VoucherConstant.DIVISIONID)) vouchermis.setDivisionid(boundary.getBoundaryById(Long .parseLong(headerdetails.get(VoucherConstant.DIVISIONID) .toString()))); if (headerdetails.containsKey(VoucherConstant.BUDGETCHECKREQ) && null != headerdetails.get(VoucherConstant.BUDGETCHECKREQ)) vouchermis.setBudgetCheckReq((Boolean) headerdetails .get(VoucherConstant.BUDGETCHECKREQ)); else vouchermis.setBudgetCheckReq(true); if (LOGGER.isDebugEnabled()) LOGGER.debug("END | createVouchermis"); return vouchermis; } public void validateTransaction( final List<HashMap<String, Object>> accountcodedetails, final List<HashMap<String, Object>> subledgerdetails) throws ApplicationRuntimeException, Exception { if (LOGGER.isDebugEnabled()) LOGGER.debug("START | validateTransaction"); // List<Transaxtion> transaxtionList = new ArrayList<Transaxtion>(); BigDecimal totaldebitAmount = BigDecimal.valueOf(0); BigDecimal totalcreditAmount = BigDecimal.valueOf(0); final Map<String, BigDecimal> accDetAmtMap = new HashMap<String, BigDecimal>(); for (final HashMap<String, Object> accDetailMap : accountcodedetails) { String glcode = null; final BigDecimal debitAmount = new BigDecimal(accDetailMap.get( VoucherConstant.DEBITAMOUNT).toString()); final BigDecimal creditAmount = new BigDecimal(accDetailMap.get( VoucherConstant.CREDITAMOUNT).toString()); totaldebitAmount = totaldebitAmount.add(debitAmount); totalcreditAmount = totalcreditAmount.add(creditAmount); if (accDetailMap.containsKey(VoucherConstant.GLCODE) && null != accDetailMap.get(VoucherConstant.GLCODE)) { glcode = accDetailMap.get(VoucherConstant.GLCODE).toString(); if (null == chartOfAccountsDAO .getCChartOfAccountsByGlCode(glcode)) throw new ApplicationRuntimeException( "Not a valid account code" + glcode); } else throw new ApplicationRuntimeException( "glcode is missing or null"); if (debitAmount.compareTo(BigDecimal.ZERO) != 0 && creditAmount.compareTo(BigDecimal.ZERO) != 0) throw new ApplicationRuntimeException( "Both debit amount and credit amount cannot be greater than zero"); if (debitAmount.compareTo(BigDecimal.ZERO) == 0 && creditAmount.compareTo(BigDecimal.ZERO) == 0) throw new ApplicationRuntimeException( "debit and credit both amount is Zero"); if (null != accDetailMap.get(VoucherConstant.FUNCTIONCODE) && "" != accDetailMap.get(VoucherConstant.FUNCTIONCODE)) { final String functionCode = accDetailMap.get( VoucherConstant.FUNCTIONCODE).toString(); if (null == functionDAO.getFunctionByCode(functionCode)) throw new ApplicationRuntimeException( "not a valid function code"); } if (debitAmount.compareTo(BigDecimal.ZERO) != 0) { if (null != accDetAmtMap.get(VoucherConstant.DEBIT + glcode)) { final BigDecimal accountCodeTotDbAmt = accDetAmtMap.get( VoucherConstant.DEBIT + glcode).add(debitAmount); accDetAmtMap.put(VoucherConstant.DEBIT + glcode, accountCodeTotDbAmt); } else accDetAmtMap.put(VoucherConstant.DEBIT + glcode, debitAmount); } else if (creditAmount.compareTo(BigDecimal.ZERO) != 0) if (null != accDetAmtMap.get(VoucherConstant.CREDIT + glcode)) { final BigDecimal accountCodeTotCrAmt = accDetAmtMap.get( VoucherConstant.CREDIT + glcode).add(creditAmount); accDetAmtMap.put(VoucherConstant.CREDIT + glcode, accountCodeTotCrAmt); } else accDetAmtMap.put(VoucherConstant.CREDIT + glcode, creditAmount); } if (LOGGER.isDebugEnabled()) LOGGER.debug("Total Debit amount :" + totaldebitAmount); if (LOGGER.isDebugEnabled()) LOGGER.debug("Total Credit amount :" + totalcreditAmount); totaldebitAmount = totaldebitAmount.setScale(2, BigDecimal.ROUND_HALF_UP); totalcreditAmount = totalcreditAmount.setScale(2, BigDecimal.ROUND_HALF_UP); if (LOGGER.isDebugEnabled()) LOGGER.debug("Total Debit amount after round off :" + totaldebitAmount); if (LOGGER.isDebugEnabled()) LOGGER.debug("Total Credit amount after round off :" + totalcreditAmount); if (totaldebitAmount.compareTo(totalcreditAmount) != 0) throw new ApplicationRuntimeException( "total debit and total credit amount is not matching"); final Map<String, BigDecimal> subledAmtmap = new HashMap<String, BigDecimal>(); for (final HashMap<String, Object> subdetailDetailMap : subledgerdetails) { String glcode = null; String detailtypeid = null; String detailKeyId = null; if (null != subdetailDetailMap.get(VoucherConstant.GLCODE)) { glcode = subdetailDetailMap.get(VoucherConstant.GLCODE) .toString(); if (null == chartOfAccountsDAO .getCChartOfAccountsByGlCode(glcode)) throw new ApplicationRuntimeException("not a valid glcode"); } else throw new ApplicationRuntimeException("glcode is missing"); final Query querytds = persistenceService.getSession().createQuery( "select t.id from Recovery t where " + "t.chartofaccounts.glcode=:glcode"); querytds.setString("glcode", glcode); querytds.setCacheable(true); if (null != querytds.list() && querytds.list().size() > 0 && null == subdetailDetailMap.get(VoucherConstant.TDSID) && null != subdetailDetailMap .get(VoucherConstant.CREDITAMOUNT) && new BigDecimal(subdetailDetailMap.get( VoucherConstant.CREDITAMOUNT).toString()) .compareTo(BigDecimal.ZERO) != 0) { /* * Commenting out throw ApplicationRuntimeException since we are * using the same API for create Journal Voucher. There we are * not setting the TDS id.. */ // throw new // ApplicationRuntimeException("Recovery detail is missing for glcode :"+glcode); } // validate the glcode is a subledger code or not. final Query query = persistenceService.getSession().createQuery( "from CChartOfAccountDetail cd,CChartOfAccounts c where " + "cd.glCodeId = c.id and c.glcode=:glcode"); query.setString(VoucherConstant.GLCODE, glcode); query.setCacheable(true); if (null == query.list() || query.list().size() == 0) throw new ApplicationRuntimeException( "This code is not a control code" + glcode); // validate subledger Detailtypeid if (null != subdetailDetailMap.get(VoucherConstant.DETAILTYPEID)) { detailtypeid = subdetailDetailMap.get( VoucherConstant.DETAILTYPEID).toString(); final Session session = persistenceService.getSession(); final Query qry = session .createQuery("from CChartOfAccountDetail cd,CChartOfAccounts c where " + "cd.glCodeId = c.id and c.glcode=:glcode and cd.detailTypeId.id=:detailTypeId"); qry.setString(VoucherConstant.GLCODE, glcode); qry.setInteger("detailTypeId", Integer.valueOf(detailtypeid)); qry.setCacheable(true); if (null == qry.list() || qry.list().size() == 0) throw new ApplicationRuntimeException( "The subledger type mapped to this account code is not correct " + glcode); } else throw new ApplicationRuntimeException( "Subledger type value is missing for account code " + glcode); if (null != subdetailDetailMap.get(VoucherConstant.DETAILKEYID)) { detailKeyId = subdetailDetailMap.get( VoucherConstant.DETAILKEYID).toString(); final Session session = persistenceService.getSession(); final Query qry = session .createQuery("from Accountdetailkey adk where adk.accountdetailtype.id=:detailtypeid and adk.detailkey=:detailkey"); qry.setInteger(VoucherConstant.DETAILTYPEID, Integer.valueOf(detailtypeid)); qry.setInteger("detailkey", Integer.valueOf(detailKeyId)); qry.setCacheable(true); if (null == qry.list() || qry.list().size() == 0) throw new ApplicationRuntimeException( "Subledger data is not valid for account code " + glcode); } else throw new ApplicationRuntimeException("detailkeyid is missing"); if (null != subdetailDetailMap.get(VoucherConstant.DEBITAMOUNT) && new BigDecimal(subdetailDetailMap.get( VoucherConstant.DEBITAMOUNT).toString()) .compareTo(BigDecimal.ZERO) != 0) { final BigDecimal dbtAmount = new BigDecimal(subdetailDetailMap .get(VoucherConstant.DEBITAMOUNT).toString()); if (null != subledAmtmap.get(VoucherConstant.DEBIT + glcode)) subledAmtmap.put(VoucherConstant.DEBIT + glcode, subledAmtmap.get(VoucherConstant.DEBIT + glcode) .add(dbtAmount)); else subledAmtmap.put(VoucherConstant.DEBIT + glcode, dbtAmount); } else if (null != subdetailDetailMap .get(VoucherConstant.CREDITAMOUNT) && new BigDecimal(subdetailDetailMap.get( VoucherConstant.CREDITAMOUNT).toString()) .compareTo(BigDecimal.ZERO) != 0) { final BigDecimal creditAmt = new BigDecimal(subdetailDetailMap .get(VoucherConstant.CREDITAMOUNT).toString()); if (null != subledAmtmap.get(VoucherConstant.CREDIT + glcode)) subledAmtmap.put(VoucherConstant.CREDIT + glcode, subledAmtmap.get(VoucherConstant.CREDIT + glcode) .add(creditAmt)); else subledAmtmap .put(VoucherConstant.CREDIT + glcode, creditAmt); } else throw new ApplicationRuntimeException( "Incorrect Sub ledger amount supplied for glcode : " + glcode); } for (final HashMap<String, Object> accDetailMap : accountcodedetails) { final String glcode = accDetailMap.get(VoucherConstant.GLCODE) .toString(); if (null != subledAmtmap.get(VoucherConstant.DEBIT + glcode)) // changed since equals does considers decimal values eg 20.0 is // not equal to 2 if (subledAmtmap.get(VoucherConstant.DEBIT + glcode).compareTo( accDetAmtMap.get(VoucherConstant.DEBIT + glcode)) != 0) throw new ApplicationRuntimeException( "Total of subleger debit amount is not matching with the account code amount " + glcode); if (null != subledAmtmap.get(VoucherConstant.CREDIT + glcode)) // changed since equals does considers decimal values eg 20.0 is // not equal to 2 if (subledAmtmap.get(VoucherConstant.CREDIT + glcode) .compareTo( accDetAmtMap.get(VoucherConstant.CREDIT + glcode)) != 0) throw new ApplicationRuntimeException( "Total of subleger credit amount is not matching with the account code amount " + glcode); } if (LOGGER.isDebugEnabled()) LOGGER.debug("END | validateTransaction"); } public List<Transaxtion> createTransaction( final HashMap<String, Object> headerdetails, final List<HashMap<String, Object>> accountcodedetails, final List<HashMap<String, Object>> subledgerdetails, final CVoucherHeader vh) throws ApplicationRuntimeException { if (LOGGER.isDebugEnabled()) LOGGER.debug("Start | createTransaction "); final List<Transaxtion> transaxtionList = new ArrayList<Transaxtion>(); try { Integer voucherLineId = 1; for (final HashMap<String, Object> accDetailMap : accountcodedetails) { final String glcode = accDetailMap.get(VoucherConstant.GLCODE) .toString(); final String debitAmount = accDetailMap.get( VoucherConstant.DEBITAMOUNT).toString(); final String creditAmount = accDetailMap.get( VoucherConstant.CREDITAMOUNT).toString(); String functionId = null; String functioncode = null; if (null != accDetailMap.get(VoucherConstant.NARRATION)) accDetailMap.get(VoucherConstant.NARRATION).toString(); if (null != accDetailMap.get(VoucherConstant.FUNCTIONCODE) && "" != accDetailMap.get(VoucherConstant.FUNCTIONCODE)) { functioncode = accDetailMap.get( VoucherConstant.FUNCTIONCODE).toString(); functionId = functionDAO .getFunctionByCode( accDetailMap.get( VoucherConstant.FUNCTIONCODE) .toString()).getId().toString(); if (LOGGER.isDebugEnabled()) LOGGER.debug("functionId>>>>>>>> " + functionId); } final CChartOfAccounts chartOfAcc = chartOfAccountsDAO .getCChartOfAccountsByGlCode(glcode); /* * VoucherDetail voucherDetail = new VoucherDetail(); * voucherDetail.setLineId(lineId++); * voucherDetail.setVoucherHeaderId(vh); * voucherDetail.setGlCode(chartOfAcc.getGlcode()); * voucherDetail.setAccountName(chartOfAcc.getName()); * voucherDetail.setDebitAmount(new BigDecimal(debitAmount)); * voucherDetail.setCreditAmount(new BigDecimal(creditAmount)); * voucherDetail.setNarration(narration); // insert into voucher * detail. insertIntoVoucherDetail(voucherDetail); * vh.addVoucherDetail(voucherDetail); */ final Transaxtion transaction = new Transaxtion(); transaction.setGlCode(chartOfAcc.getGlcode()); transaction.setGlName(chartOfAcc.getName()); transaction.setVoucherLineId(String.valueOf(voucherLineId++)); transaction.setVoucherHeaderId(vh.getId().toString()); transaction.setCrAmount(creditAmount); transaction.setDrAmount(debitAmount); transaction.setFunctionId(functionId); if (headerdetails != null && headerdetails.get("billid") != null) transaction.setBillId((Long) headerdetails.get("billid")); final ArrayList reqParams = new ArrayList(); for (final HashMap<String, Object> sublegDetailMap : subledgerdetails) { final String detailGlCode = sublegDetailMap.get( VoucherConstant.GLCODE).toString(); final String detailtypeid = sublegDetailMap.get( VoucherConstant.DETAILTYPEID).toString(); if (sublegDetailMap .containsKey(VoucherConstant.FUNCTIONCODE) && null != sublegDetailMap .get(VoucherConstant.FUNCTIONCODE) && "" != sublegDetailMap .get(VoucherConstant.FUNCTIONCODE)) { final String detailFunctionCode = sublegDetailMap.get( VoucherConstant.FUNCTIONCODE).toString(); if (glcode.equals(detailGlCode) && functioncode != null && functioncode.equals(detailFunctionCode)) { final TransaxtionParameter reqData = new TransaxtionParameter(); final Accountdetailtype adt = (Accountdetailtype) accountdetailtypeHibernateDAO .findById(Integer.valueOf(detailtypeid), false); reqData.setDetailName(adt.getAttributename()); reqData.setGlcodeId(chartOfAcc.getId().toString()); if (null != sublegDetailMap .get(VoucherConstant.DEBITAMOUNT) && new BigDecimal(sublegDetailMap.get( VoucherConstant.DEBITAMOUNT) .toString()) .compareTo(BigDecimal.ZERO) != 0) reqData.setDetailAmt(sublegDetailMap.get( VoucherConstant.DEBITAMOUNT).toString()); else reqData.setDetailAmt(sublegDetailMap.get( VoucherConstant.CREDITAMOUNT) .toString()); reqData.setDetailKey(sublegDetailMap.get( VoucherConstant.DETAILKEYID).toString()); reqData.setDetailTypeId(detailtypeid); reqData.setTdsId(sublegDetailMap.get("tdsId") != null ? sublegDetailMap .get("tdsId").toString() : null); reqParams.add(reqData); } } else if (glcode.equals(detailGlCode)) { final TransaxtionParameter reqData = new TransaxtionParameter(); final Accountdetailtype adt = (Accountdetailtype) accountdetailtypeHibernateDAO .findById(Integer.valueOf(detailtypeid), false); reqData.setDetailName(adt.getAttributename()); reqData.setGlcodeId(chartOfAcc.getId().toString()); if (null != sublegDetailMap .get(VoucherConstant.DEBITAMOUNT) && new BigDecimal(sublegDetailMap.get( VoucherConstant.DEBITAMOUNT).toString()) .compareTo(BigDecimal.ZERO) != 0) reqData.setDetailAmt(sublegDetailMap.get( VoucherConstant.DEBITAMOUNT).toString()); else reqData.setDetailAmt(sublegDetailMap.get( VoucherConstant.CREDITAMOUNT).toString()); reqData.setDetailKey(sublegDetailMap.get( VoucherConstant.DETAILKEYID).toString()); reqData.setDetailTypeId(detailtypeid); reqData.setTdsId(sublegDetailMap.get("tdsId") != null ? sublegDetailMap .get("tdsId").toString() : null); reqParams.add(reqData); } } if (reqParams != null && reqParams.size() > 0) transaction.setTransaxtionParam(reqParams); transaxtionList.add(transaction); } } catch (final Exception e) { LOGGER.error("Exception occured while posting data into voucher detail and transaction"); throw new ApplicationRuntimeException( "Exception occured while posting data into voucher detail and transaction" + e.getMessage()); } if (LOGGER.isDebugEnabled()) LOGGER.debug("END | createTransaction "); return transaxtionList; } public Functionary getFunctionaryByCode(final BigDecimal code) { // functionarySer.setType(Functionary.class); final Functionary functionary = (Functionary) persistenceService.find( "from Functionary where code=?", code); return functionary; } public void validateVoucherHeader(final CVoucherHeader voucherHeader) { if (null == voucherHeader) throw new ApplicationRuntimeException( "voucherHeader object passed is null"); if (null == voucherHeader.getType() || !voucherHeader.getType().equalsIgnoreCase( voucherTypeEnum.RECEIPT.toString())) throw new ApplicationRuntimeException("Voucher type is not Receipt"); } public void validateReceiptDetails( final HashMap<String, Object> receiptdetails) { String modeofcollection = null; if (null == receiptdetails) throw new ApplicationRuntimeException("receiptdetails is null"); if (null == receiptdetails.get(VoucherConstant.MODEOFCOLLECTION)) throw new ApplicationRuntimeException("modeofcollection is null"); else { modeofcollection = chkModeOfCollection(receiptdetails.get( VoucherConstant.MODEOFCOLLECTION).toString()); if (null == modeofcollection) throw new ApplicationRuntimeException( "Not a valid modeofcollection"); } if (VoucherConstant.BANK.equalsIgnoreCase(modeofcollection)) validateBankDetails(receiptdetails); if (null == receiptdetails.get(VoucherConstant.NETAMOUNT)) throw new ApplicationRuntimeException("Net amount is null"); } public void validateBankDetails(final HashMap<String, Object> receiptdetails) { String bankCode = null; String bankBranchCode = null; String bankAccNumber = null; if (null == receiptdetails.get(VoucherConstant.BANKCODE)) throw new ApplicationRuntimeException("Bank Code is null"); if (null == receiptdetails.get(VoucherConstant.BANKBRANCHCODE)) throw new ApplicationRuntimeException("Bank branch code is null"); if (null == receiptdetails.get(VoucherConstant.BANKACCOUNTNUMBER)) throw new ApplicationRuntimeException("Bank Account number is null"); bankCode = receiptdetails.get(VoucherConstant.BANKCODE).toString(); bankBranchCode = receiptdetails.get(VoucherConstant.BANKBRANCHCODE) .toString(); bankAccNumber = receiptdetails.get(VoucherConstant.BANKACCOUNTNUMBER) .toString(); final Bankaccount bankAccount = bankAccountDAO .getBankAccountByAccBranchBank(bankAccNumber, bankBranchCode, bankCode); if (null == bankAccount) throw new ApplicationRuntimeException( "not a valid bank account number"); else receiptdetails.put(VoucherConstant.BANKACCID, bankAccount.getId()); } /** * * @param instrumentdetails */ public void validateInstrumentdetails( final List<HashMap<String, Object>> instrumentdetailsList, final HashMap<String, Object> receiptdetails) { String bankCode = null; BigDecimal chequeAmounts = BigDecimal.valueOf(0); for (final HashMap<String, Object> instrumentdetails : instrumentdetailsList) { if (null == instrumentdetails.get(VoucherConstant.INSTRUMENTNO)) throw new ApplicationRuntimeException("Cheque number is null"); if (null == instrumentdetails.get(VoucherConstant.INSTRUMENTDATE)) throw new ApplicationRuntimeException("Cheque date is null"); if (null == instrumentdetails.get(VoucherConstant.INSTRUMENTAMOUNT)) throw new ApplicationRuntimeException("Cheque amount is null"); else chequeAmounts = chequeAmounts.add(new BigDecimal( instrumentdetails.get(VoucherConstant.INSTRUMENTAMOUNT) .toString())); if (null != instrumentdetails.get(VoucherConstant.BANKCODE)) { bankCode = instrumentdetails.get(VoucherConstant.BANKCODE) .toString(); if (null == bankDAO.getBankByCode(bankCode)) throw new ApplicationRuntimeException( "not a valid bank code"); } } if (!chequeAmounts .equals(receiptdetails.get(VoucherConstant.NETAMOUNT))) throw new ApplicationRuntimeException( "total cheque amount is not matching with net amount"); } /* * protected void postInReceiptHeader(final HashMap<String, Object> * receiptdetails,Object CVoucherHeader,Chequedetail chequeDetail){ * rcptHeaderService = new PersistenceService<ReceiptHeader, Integer>(); // * rcptHeaderService.setSessionFactory(new SessionFactory()); * rcptHeaderService.setType(ReceiptHeader.class); String modeOfCollection = * receiptdetails.get(VoucherConstant.MODEOFCOLLECTION).toString(); * BigDecimal netAmount = new * BigDecimal(receiptdetails.get(VoucherConstant.NETAMOUNT).toString()); * CVoucherHeader voucherHeader = (CVoucherHeader) CVoucherHeader; * ReceiptHeader receiptHeader = new ReceiptHeader(); //Setting data into * receipt header * receiptHeader.setModeOfCollection(chkModeOfCollection(modeOfCollection)); * receiptHeader.setCashAmount(netAmount); * receiptHeader.setVoucherHeaderId(voucherHeader); * receiptHeader.setType(voucherHeader.getType()); if(null != * receiptdetails.get(VoucherConstant.MANNUALRECEIPTNUMBER)){ * receiptHeader.setManualReceiptNo * (receiptdetails.get(VoucherConstant.MANNUALRECEIPTNUMBER).toString()); } * if(null != receiptdetails.get(VoucherConstant.NARRATION)){ * receiptHeader.setManualReceiptNo * (receiptdetails.get(VoucherConstant.NARRATION).toString()); } if(null != * receiptdetails.get(VoucherConstant.REVENUESOURCE)){ * receiptHeader.setRevenueSource * ((receiptdetails.get(VoucherConstant.REVENUESOURCE).toString())); } * if(null != receiptdetails.get(VoucherConstant.WARDID)){ * receiptHeader.setRevenueSource * ((receiptdetails.get(VoucherConstant.WARDID).toString())); } * receiptHeader.setIsReversed(0); if(null != chequeDetail){ * receiptHeader.setChequeId(chequeDetail); }if(null != * receiptdetails.get(VoucherConstant.RECEIPTNUMBER)){ * receiptHeader.setReceiptNo( * receiptdetails.get(VoucherConstant.RECEIPTNUMBER).toString()); } if(null * != receiptdetails.get(VoucherConstant.MANUUALRECEIPTNO)){ * receiptHeader.setManualReceiptNo * (receiptdetails.get(VoucherConstant.MANUUALRECEIPTNO).toString()); } * if(null != receiptdetails.get(VoucherConstant.NARRATION)){ * receiptHeader.setNarration * (receiptdetails.get(VoucherConstant.NARRATION).toString()); } * rcptHeaderService.persist(receiptHeader); } */ enum modeOfCollectionEnum { Cheque, Cash, Bank; } private String chkModeOfCollection(final String mode) { String collectionMode = null; try { switch (Integer.valueOf(mode)) { case 1: collectionMode = modeOfCollectionEnum.Cheque.toString(); break; case 2: collectionMode = modeOfCollectionEnum.Cash.toString(); break; case 3: collectionMode = modeOfCollectionEnum.Bank.toString(); break; } } catch (final Exception e) { LOGGER.error(ERR, e); throw new ApplicationRuntimeException( "Not a valid modeofcollection"); } return collectionMode; } public void updatePJV(final CVoucherHeader vh, final List<PreApprovedVoucher> detailList, final List<PreApprovedVoucher> subledgerlist) throws ApplicationRuntimeException { try { // delete the existing voucherdetail, gl entries. deleteVoucherdetailAndGL(vh); HashMap<String, Object> detailMap = null; HashMap<String, Object> subledgerMap = null; final List<HashMap<String, Object>> accountdetails = new ArrayList<HashMap<String, Object>>(); final List<HashMap<String, Object>> subledgerdetails = new ArrayList<HashMap<String, Object>>(); CChartOfAccounts coa = null; CFunction function = null; // iterate it for (final PreApprovedVoucher detail : detailList) { detailMap = new HashMap<String, Object>(); detailMap.put(VoucherConstant.GLCODE, detail.getGlcodeDetail()); detailMap.put(VoucherConstant.DEBITAMOUNT, detail.getDebitAmountDetail()); detailMap.put(VoucherConstant.CREDITAMOUNT, detail.getCreditAmountDetail()); if (detail.getFunctionIdDetail() != null) { function = functionDAO.getFunctionById(detail .getFunctionIdDetail()); detailMap.put(VoucherConstant.FUNCTIONCODE, function.getCode()); } accountdetails.add(detailMap); } if (subledgerlist != null) for (final PreApprovedVoucher subledger : subledgerlist) { subledgerMap = new HashMap<String, Object>(); coa = (CChartOfAccounts) chartOfAccountsDAO.findById( subledger.getGlcode().getId(), false); subledgerMap.put(VoucherConstant.GLCODE, coa.getGlcode()); subledgerMap.put(VoucherConstant.DETAILTYPEID, subledger .getDetailType().getId()); subledgerMap.put(VoucherConstant.DETAILKEYID, subledger.getDetailKeyId()); if (subledger.getDebitAmountDetail() == null || subledger.getDebitAmountDetail().compareTo( BigDecimal.ZERO) == 0) subledgerMap.put(VoucherConstant.CREDITAMOUNT, subledger.getCreditAmount()); else subledgerMap.put(VoucherConstant.DEBITAMOUNT, subledger.getDebitAmount()); subledgerdetails.add(subledgerMap); } final List<Transaxtion> transactions = createTransaction(null, accountdetails, subledgerdetails, vh); persistenceService.getSession().flush(); Transaxtion txnList[] = new Transaxtion[transactions.size()]; txnList = transactions.toArray(txnList); final SimpleDateFormat formatter = new SimpleDateFormat(DD_MMM_YYYY); if (!chartOfAccounts.postTransaxtions(txnList, formatter.format(vh.getVoucherDate()))) throw new ApplicationRuntimeException("Voucher creation Failed"); } catch (final Exception e) { LOGGER.error("Inside exception updatePJV" + e.getMessage()); throw new ApplicationRuntimeException(e.getMessage()); } } public void deleteVoucherdetailAndGL(final CVoucherHeader vh) throws SQLException, ApplicationRuntimeException { try { Query pstmt1 = null; Query pstmt2 = null; Query pstmt3 = null; Query pstmt4 = null; final String glQry = "select id from generalledger where voucherheaderid= ?"; final String glidQry = "select id from generalledgerdetail where generalledgerid= ?"; final String delQry = "delete from EG_REMITTANCE_GLDTL where gldtlid= ?"; final String delQrr = "delete from generalledgerdetail where generalledgerid=?"; final String delgl = " delete from generalledger where voucherheaderid=?"; final String delvh = " delete from voucherdetail where voucherheaderid=?"; pstmt1 = persistenceService.getSession().createSQLQuery(glQry); pstmt1.setFloat(0, vh.getId()); final List<Object[]> rs = pstmt1.list(); List<Object[]> rs1 = null; boolean delete = false; while (rs != null && rs.size() > 0) { pstmt2 = persistenceService.getSession() .createSQLQuery(glidQry); pstmt2.setLong(0, Long.parseLong(rs.get(1).toString())); rs1 = pstmt2.list(); while (rs1 != null && rs1.size() > 0) { delete = true; pstmt3 = persistenceService.getSession().createSQLQuery( delQry); pstmt3.setLong(0, Long.parseLong(rs1.get(1).toString())); pstmt3.executeUpdate(); } if (delete) { pstmt4 = persistenceService.getSession().createSQLQuery( delQrr); pstmt4.setLong(0, Long.parseLong(rs1.get(1).toString())); pstmt4.executeUpdate(); } } pstmt1 = persistenceService.getSession().createSQLQuery(delgl); pstmt1.setLong(0, vh.getId()); pstmt1.executeUpdate(); pstmt1 = persistenceService.getSession().createSQLQuery(delvh); pstmt1.setLong(0, vh.getId()); pstmt1.executeUpdate(); } catch (final Exception e) { LOGGER.error("Inside exception deleteVoucherdetailAndGL" + e.getMessage()); throw new ApplicationRuntimeException(e.getMessage()); } } /** * HashMap<String, Object> voucher details to reverse a voucher * <p> * Original voucher header id -long- is the voucher header id of the voucher * to be reversed later callled originalvoucher * <p> * Reversal voucher name -String - name of the reversal voucher (mandatory) * <p> * Reversal voucher type -String - type of the reversal voucher (mandatory) * <p> * Reversal voucher date - Date('dd/MM/yyyy') date of the reversal vocuher * <p> * Reversal voucher number - String - voucher number of reversal voucher * Newly created voucher is called reversal voucher * * @param paramList * @return */ @Transactional public CVoucherHeader reverseVoucher( final List<HashMap<String, Object>> paramList) throws ApplicationRuntimeException, ParseException { // -- Reversal Voucher date check ---- CVoucherHeader reversalVoucherObj = new CVoucherHeader(); CVoucherHeader originalVocher=null; for (final HashMap<String, Object> paramMap : paramList) { if (paramMap.get(VOUCHER_HEADER_ID) == null) throw new IllegalArgumentException(VOUCHER_HEADER_ID + IS_MISSING); else { try { originalVocher = voucherService.find("from CVoucherHeader where id=?",(Long) paramMap.get(VOUCHER_HEADER_ID)); } catch (final Exception e) { throw new ApplicationRuntimeException("cannot find " + VOUCHER_HEADER_ID + "in the system"); } reversalVoucherObj.setOriginalvcId(originalVocher.getId()); } if (paramMap.get(REVERSAL_VOUCHER_DATE) == null) { final SimpleDateFormat sdf = new SimpleDateFormat(DD_MM_YYYY); final Date reversalVoucherDate = sdf.parse(sdf .format(originalVocher.getVoucherDate())); reversalVoucherObj.setVoucherDate(reversalVoucherDate); } else { if (LOGGER.isDebugEnabled()) LOGGER.debug("Voucher end REVERSAL_VOUCHER_DAT :" + paramMap.get(REVERSAL_VOUCHER_DATE)); final Date reversalVoucherDate = sdf.parse(sdf .format(paramMap .get(REVERSAL_VOUCHER_DATE))); reversalVoucherObj.setVoucherDate( reversalVoucherDate); } } originalVocher = (CVoucherHeader) persistenceService.find( "from CVoucherHeader where id=?", reversalVoucherObj.getOriginalvcId()); if (LOGGER.isDebugEnabled()) LOGGER.debug("original voucher is " + reversalVoucherObj.getOriginalvcId()); if (LOGGER.isDebugEnabled()) LOGGER.debug("reversalVoucherObj getVoucherDate is " + reversalVoucherObj.getVoucherDate()); if (LOGGER.isDebugEnabled()) LOGGER.debug("originalVocher getVoucherDate is " + originalVocher.getVoucherDate()); if (reversalVoucherObj.getVoucherDate().before( originalVocher.getVoucherDate())) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Reversal Voucher Date should be greater than the Origianal Voucher Date"); throw new ValidationException( Arrays.asList(new ValidationError( "reversal.voucher.date.validate", "Reversal Voucher Date should be greater than the Original Voucher Date"))); } reversalVoucherObj.setName(originalVocher.getName()); reversalVoucherObj.setType(originalVocher.getType()); reversalVoucherObj.setVoucherSubType(originalVocher .getVoucherSubType()); reversalVoucherObj.setVoucherNumber(""); reversalVoucherObj.setDescription(originalVocher.getDescription()); reversalVoucherObj.setVouchermis(originalVocher.getVouchermis()); reversalVoucherObj.setFundId(originalVocher.getFundId()); final HashMap<String, Object> headerDetails = createHeaderAndMisDetails(reversalVoucherObj); List<CGeneralLedger> orginalLedgerEntries = generalLedgerService .findAllBy("from CGeneralLedger where voucherHeaderId=?", originalVocher); HashMap<String, Object> detailMap = null; HashMap<String, Object> subledgerMap = null; final List<HashMap<String, Object>> accountdetails = new ArrayList<HashMap<String, Object>>(); final List<HashMap<String, Object>> subledgerdetails = new ArrayList<HashMap<String, Object>>(); CFunction function = null; for (final CGeneralLedger ledger : orginalLedgerEntries) { detailMap = new HashMap<String, Object>(); detailMap.put(VoucherConstant.GLCODE, ledger.getGlcode()); //debit becomes credit ,credit becomes debit detailMap.put(VoucherConstant.DEBITAMOUNT,ledger.getCreditAmount()); detailMap.put(VoucherConstant.CREDITAMOUNT,ledger.getDebitAmount()); if (ledger.getFunctionId() != null) { function = functionDAO.getFunctionById(ledger .getFunctionId().longValue()); detailMap.put(VoucherConstant.FUNCTIONCODE,function.getCode()); } List<CGeneralLedgerDetail> ledgerDetailSet = generalLedgerDetailService .findAllBy( "from CGeneralLedgerDetail where generalLedgerId.id=?", ledger.getId()); for (final CGeneralLedgerDetail ledgerDetail : ledgerDetailSet) { subledgerMap = new HashMap<String, Object>(); subledgerMap.put(VoucherConstant.GLCODE, ledger.getGlcode()); subledgerMap.put(VoucherConstant.DETAILTYPEID, ledgerDetail.getDetailTypeId().getId()); subledgerMap.put(VoucherConstant.DETAILKEYID,ledgerDetail.getDetailKeyId()); //even for subledger debit becomes credit ,credit becomes debit if (BigDecimal.valueOf(ledger.getDebitAmount()).compareTo(BigDecimal.ZERO)!=0) subledgerMap.put(VoucherConstant.CREDITAMOUNT,ledgerDetail.getAmount()); else subledgerMap.put(VoucherConstant.DEBITAMOUNT,ledgerDetail.getAmount().setScale(2,BigDecimal.ROUND_HALF_EVEN)); subledgerdetails.add(subledgerMap); } accountdetails.add(detailMap); } try{ reversalVoucherObj = createVoucher(headerDetails, accountdetails, subledgerdetails); } catch (final HibernateException e) { LOGGER.error(e.getMessage(), e); throw new ValidationException(Arrays.asList(new ValidationError( EXCEPTION_WHILE_SAVING_DATA, FAILED))); } catch (final ApplicationRuntimeException e) { LOGGER.error(e.getMessage(), e); throw new ValidationException(Arrays.asList(new ValidationError(e .getMessage(), e.getMessage()))); } catch (final ValidationException e) { LOGGER.error(e.getMessage(), e); throw e; } catch (final Exception e) { LOGGER.error(e.getMessage(), e); throw new ValidationException(Arrays.asList(new ValidationError(e .getMessage(), e.getMessage()))); } originalVocher.setStatus(1); originalVocher.setEffectiveDate(new Date()); voucherService.applyAuditing(originalVocher); voucherService.update(originalVocher); reversalVoucherObj.setOriginalvcId(originalVocher.getId()); reversalVoucherObj.setStatus(2); voucherService.applyAuditing(reversalVoucherObj); voucherService.persist(reversalVoucherObj); return reversalVoucherObj; } private CVoucherHeader validateAndAssignReversalVoucherParams( final List<HashMap<String, Object>> paramList) throws ParseException { final CVoucherHeader reversalVoucher = new CVoucherHeader(); for (final HashMap<String, Object> paramMap : paramList) { CVoucherHeader originalVoucher = null; if (paramMap.get(VOUCHER_HEADER_ID) == null) throw new IllegalArgumentException(VOUCHER_HEADER_ID + IS_MISSING); else { try { originalVoucher = (CVoucherHeader) voucherHeaderDAO .findById((Long) paramMap.get(VOUCHER_HEADER_ID), false); } catch (final Exception e) { throw new ApplicationRuntimeException("cannot find " + VOUCHER_HEADER_ID + "in the system"); } reversalVoucher.setOriginalvcId(originalVoucher.getId()); } if (paramMap.get(NAME) == null || ((String) paramMap.get(NAME)).isEmpty()) throw new IllegalArgumentException(NAME + IS_MISSING + "or" + IS_EMPTY); else reversalVoucher.setName((String) paramMap.get(NAME)); if (paramMap.get(TYPE) == null || ((String) paramMap.get(TYPE)).isEmpty()) throw new IllegalArgumentException(TYPE + IS_MISSING + "or" + IS_EMPTY); else { validateVoucherType((String) paramMap.get(TYPE)); reversalVoucher .setType(FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL); } if (paramMap.get(REVERSAL_VOUCHER_DATE) == null) { final SimpleDateFormat sdf = new SimpleDateFormat(DD_MM_YYYY); final Date reversalVoucherDate = sdf.parse(sdf .format(originalVoucher.getVoucherDate())); reversalVoucher.setVoucherDate(reversalVoucherDate); } else { if (LOGGER.isDebugEnabled()) LOGGER.debug("vo end REVERSAL_VOUCHER_DAT :" + paramMap.get(REVERSAL_VOUCHER_DATE)); reversalVoucher.setVoucherDate((Date) paramMap .get(REVERSAL_VOUCHER_DATE)); } // it may be null and taken care in calling api reversalVoucher.setVoucherNumber((String) paramMap .get(REVERSAL_VOUCHER_NUMBER)); } return reversalVoucher; } protected void validateMandotyFields( final HashMap<String, Object> headerdetails) { } protected void checkMandatoryField(final String fieldName, final Object value, final HashMap<String, Object> headerdetails,List<String> mandatoryFields) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Filed name :=" + fieldName + " Value = :" + value); String vNumGenMode = null; if (fieldName.equals("vouchernumber")) { if (headerdetails.get(VoucherConstant.VOUCHERTYPE) == null) throw new ValidationException( Arrays.asList(new ValidationError( VoucherConstant.VOUCHERTYPE + ISREQUIRED, VoucherConstant.VOUCHERTYPE + ISREQUIRED))); else { validateVoucherType(headerdetails.get( VoucherConstant.VOUCHERTYPE).toString()); if (FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL .equalsIgnoreCase(headerdetails.get( VoucherConstant.VOUCHERTYPE).toString())) vNumGenMode = voucherTypeForULB.readVoucherTypes("Journal"); else vNumGenMode = voucherTypeForULB .readVoucherTypes(headerdetails.get( VoucherConstant.VOUCHERTYPE).toString()); if (!"Auto".equalsIgnoreCase(vNumGenMode) && (value == null || ((String) value).isEmpty()) && headerdetails.get(VoucherConstant.MODULEID) == null) throw new ValidationException( Arrays.asList(new ValidationError(SELECT + fieldName, SELECT + fieldName))); } } else if (mandatoryFields.contains(fieldName) && (value == null || StringUtils.isEmpty(value.toString()))) throw new ValidationException(Arrays.asList(new ValidationError( SELECT + fieldName, SELECT + fieldName))); } @SuppressWarnings("unchecked") protected List<String> getHeaderMandateFields() { List<String> mandatoryFields=new ArrayList<String>(); final List<AppConfigValues> appConfigList = appConfigValuesService.getConfigValuesByModuleAndKey( FinancialConstants.MODULE_NAME_APPCONFIG, "DEFAULTTXNMISATTRRIBUTES"); for (final AppConfigValues appConfigVal : appConfigList) { final String value = appConfigVal.getValue(); final String header = value.substring(0, value.indexOf("|")); final String mandate = value.substring(value.indexOf("|") + 1); if (mandate.equalsIgnoreCase("M")) mandatoryFields.add(header); } return mandatoryFields; } private HashMap<String, Object> createHeaderAndMisDetails( CVoucherHeader voucherHeader) throws ValidationException { final HashMap<String, Object> headerdetails = new HashMap<String, Object>(); // All reversal will be GJV headerdetails.put(VoucherConstant.VOUCHERNAME, FinancialConstants.JOURNALVOUCHER_NAME_GENERAL); headerdetails.put(VoucherConstant.VOUCHERTYPE, FinancialConstants.STANDARD_VOUCHER_TYPE_JOURNAL); headerdetails.put((String) VoucherConstant.VOUCHERSUBTYPE, voucherHeader.getVoucherSubType()); headerdetails.put(VoucherConstant.VOUCHERNUMBER, voucherHeader.getVoucherNumber()); headerdetails.put(VoucherConstant.VOUCHERDATE, voucherHeader.getVoucherDate()); headerdetails.put(VoucherConstant.DESCRIPTION, voucherHeader.getDescription()); if (voucherHeader.getVouchermis().getDepartmentid() != null) headerdetails.put(VoucherConstant.DEPARTMENTCODE, voucherHeader .getVouchermis().getDepartmentid().getCode()); if (voucherHeader.getFundId() != null) headerdetails.put(VoucherConstant.FUNDCODE, voucherHeader .getFundId().getCode()); if (voucherHeader.getVouchermis().getSchemeid() != null) headerdetails.put(VoucherConstant.SCHEMECODE, voucherHeader .getVouchermis().getSchemeid().getCode()); if (voucherHeader.getVouchermis().getSubschemeid() != null) headerdetails.put(VoucherConstant.SUBSCHEMECODE, voucherHeader .getVouchermis().getSubschemeid().getCode()); if (voucherHeader.getVouchermis().getFundsource() != null) headerdetails.put(VoucherConstant.FUNDSOURCECODE, voucherHeader .getVouchermis().getFundsource().getCode()); if (voucherHeader.getVouchermis().getDivisionid() != null) headerdetails.put(VoucherConstant.DIVISIONID, voucherHeader .getVouchermis().getDivisionid().getId()); if (voucherHeader.getVouchermis().getFunctionary() != null) headerdetails.put(VoucherConstant.FUNCTIONARYCODE, voucherHeader .getVouchermis().getFunctionary().getCode()); if (voucherHeader.getVouchermis().getFunction() != null) headerdetails.put(VoucherConstant.FUNCTIONCODE, voucherHeader .getVouchermis().getFunction().getCode()); return headerdetails; } public String getCGVNNumber(CVoucherHeader vh) { String cgvnNumber = ""; String sequenceName = ""; final CFiscalPeriod fiscalPeriod = fiscalPeriodHibernateDAO.getFiscalPeriodByDate(vh.getVoucherDate()); if (fiscalPeriod == null) throw new ApplicationRuntimeException("Fiscal period is not defined for the voucher date"); sequenceName = "sq_" + vh.getFundId().getIdentifier() + "_" + getCgnType(vh.getType()).toLowerCase() + "_cgvn_" + fiscalPeriod.getName(); Serializable nextSequence = applicationSequenceNumberGenerator.getNextSequence(sequenceName); cgvnNumber = String.format("%s/%s/%s%010d", vh.getFundId().getIdentifier(), getCgnType(vh.getType()), "CGVN", nextSequence); return cgvnNumber; } public AppConfigService getAppConfigService() { return appConfigService; } public void setAppConfigService(final AppConfigService appConfigService) { this.appConfigService = appConfigService; } public PersistenceService getPersistenceService() { return persistenceService; } public void setPersistenceService( final PersistenceService persistenceService) { this.persistenceService = persistenceService; } public FinancialYearDAO getFinancialYearDAO() { return financialYearDAO; } public void setFinancialYearDAO(final FinancialYearDAO financialYearDAO) { this.financialYearDAO = financialYearDAO; } public AppConfigValueService getAppConfigValuesService() { return appConfigValuesService; } public void setAppConfigValuesService( final AppConfigValueService appConfigValuesService) { this.appConfigValuesService = appConfigValuesService; } public boolean isUniqueVN(String vcNum, final String vcDate) throws Exception, TaskFailedException { boolean isUnique = false; String fyStartDate = "", fyEndDate = ""; vcNum = vcNum.toUpperCase(); Query pst = null; List<Object[]> rs = null; try { final String query1 = "SELECT to_char(startingDate, 'DD-Mon-YYYY') AS \"startingDate\", to_char(endingDate, 'DD-Mon-YYYY') AS \"endingDate\" FROM financialYear WHERE startingDate <= '" + vcDate + "' AND endingDate >= '" + vcDate + "'"; pst = persistenceService.getSession().createSQLQuery(query1); rs = pst.list(); if (rs != null && rs.size() > 0) for (final Object[] element : rs) { fyStartDate = element[0].toString(); fyEndDate = element[1].toString(); } final String query2 = "SELECT id FROM voucherHeader WHERE voucherNumber = '" + vcNum + "' AND voucherDate>='" + fyStartDate + "' AND voucherDate<='" + fyEndDate + "' and status!=4"; pst = persistenceService.getSession().createSQLQuery(query2); rs = pst.list(); if (rs != null && rs.size() > 0) { if (LOGGER.isDebugEnabled()) LOGGER.debug("Duplicate Voucher Number"); } else isUnique = true; } catch (final Exception ex) { LOGGER.error("error in finding unique VoucherNumber"); throw new ApplicationRuntimeException("error in finding unique VoucherNumber"); } finally { } return isUnique; } public String getFiscalPeriod(final String vDate) throws TaskFailedException { BigInteger fiscalPeriod = null; final String sql = "select id from fiscalperiod where '" + vDate + "' between startingdate and endingdate"; try { final Query pst = persistenceService.getSession().createSQLQuery(sql); final List<BigInteger> rset = pst.list(); fiscalPeriod = rset != null ? rset.get(0) : BigInteger.ZERO; } catch (final Exception e) { LOGGER.error("Exception..." + e.getMessage()); throw new TaskFailedException(e.getMessage()); } return fiscalPeriod.toString(); } }