/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.ld.batch.dataaccess.impl;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import org.kuali.kfs.module.ld.batch.dataaccess.LedgerPreparedStatementCachingDao;
import org.kuali.kfs.module.ld.businessobject.LaborObject;
import org.kuali.kfs.module.ld.businessobject.LedgerBalance;
import org.kuali.kfs.module.ld.businessobject.LedgerEntry;
import org.kuali.kfs.sys.batch.dataaccess.impl.AbstractPreparedStatementCachingDaoJdbc;
import org.kuali.rice.core.api.util.type.KualiDecimal;
public class LedgerPreparedStatementCachingDaoJdbc extends AbstractPreparedStatementCachingDaoJdbc implements LedgerPreparedStatementCachingDao {
static final Map<String, String> sql = new HashMap<String, String>();
static {
sql.put(RETRIEVE_PREFIX + LaborObject.class, "select finobj_frngslry_cd from LD_LABOR_OBJ_T where univ_fiscal_yr = ? and fin_coa_cd = ? and fin_object_cd = ?");
sql.put(RETRIEVE_PREFIX + Integer.class, "select max(trn_entr_seq_nbr) from LD_LDGR_ENTR_T where univ_fiscal_yr = ? and fin_coa_cd = ? and account_nbr = ? and sub_acct_nbr = ? and fin_object_cd = ? and fin_sub_obj_cd = ? and fin_balance_typ_cd = ? and fin_obj_typ_cd = ? and univ_fiscal_prd_cd = ? and fdoc_typ_cd = ? and fs_origin_cd = ? and fdoc_nbr = ?");
sql.put(RETRIEVE_PREFIX + LedgerBalance.class, "select ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, CONTR_GR_BB_AC_AMT, MO1_ACCT_LN_AMT, MO2_ACCT_LN_AMT, MO3_ACCT_LN_AMT, MO4_ACCT_LN_AMT, MO5_ACCT_LN_AMT, MO6_ACCT_LN_AMT, MO7_ACCT_LN_AMT, MO8_ACCT_LN_AMT, MO9_ACCT_LN_AMT, MO10_ACCT_LN_AMT, MO11_ACCT_LN_AMT, MO12_ACCT_LN_AMT, MO13_ACCT_LN_AMT from LD_LDGR_BAL_T where UNIV_FISCAL_YR = ? and FIN_COA_CD = ? and ACCOUNT_NBR = ? and SUB_ACCT_NBR = ? and FIN_OBJECT_CD = ? and FIN_SUB_OBJ_CD = ? and FIN_BALANCE_TYP_CD = ? and FIN_OBJ_TYP_CD = ? and POSITION_NBR = ? and EMPLID = ?");
sql.put(INSERT_PREFIX + LedgerBalance.class, "insert into LD_LDGR_BAL_T (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD, FIN_OBJ_TYP_CD, POSITION_NBR, EMPLID, OBJ_ID, VER_NBR, ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, CONTR_GR_BB_AC_AMT, MO1_ACCT_LN_AMT, MO2_ACCT_LN_AMT, MO3_ACCT_LN_AMT, MO4_ACCT_LN_AMT, MO5_ACCT_LN_AMT, MO6_ACCT_LN_AMT, MO7_ACCT_LN_AMT, MO8_ACCT_LN_AMT, MO9_ACCT_LN_AMT, MO10_ACCT_LN_AMT, MO11_ACCT_LN_AMT, MO12_ACCT_LN_AMT, MO13_ACCT_LN_AMT, TIMESTAMP) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
sql.put(UPDATE_PREFIX + LedgerBalance.class, "update LD_LDGR_BAL_T set ACLN_ANNL_BAL_AMT = ?, FIN_BEG_BAL_LN_AMT = ?, CONTR_GR_BB_AC_AMT = ?, MO1_ACCT_LN_AMT = ?, MO2_ACCT_LN_AMT = ?, MO3_ACCT_LN_AMT = ?, MO4_ACCT_LN_AMT = ?, MO5_ACCT_LN_AMT = ?, MO6_ACCT_LN_AMT = ?, MO7_ACCT_LN_AMT = ?, MO8_ACCT_LN_AMT = ?, MO9_ACCT_LN_AMT = ?, MO10_ACCT_LN_AMT = ?, MO11_ACCT_LN_AMT = ?, MO12_ACCT_LN_AMT = ?, MO13_ACCT_LN_AMT = ?, TIMESTAMP = ? where UNIV_FISCAL_YR = ? and FIN_COA_CD = ? and ACCOUNT_NBR = ? and SUB_ACCT_NBR = ? and FIN_OBJECT_CD = ? and FIN_SUB_OBJ_CD = ? and FIN_BALANCE_TYP_CD = ? and FIN_OBJ_TYP_CD = ? and POSITION_NBR = ? and EMPLID = ?");
sql.put(INSERT_PREFIX + LedgerEntry.class, "INSERT INTO LD_LDGR_ENTR_T (UNIV_FISCAL_YR, FIN_COA_CD,ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD, FIN_OBJ_TYP_CD, UNIV_FISCAL_PRD_CD, FDOC_TYP_CD, FS_ORIGIN_CD, FDOC_NBR, TRN_ENTR_SEQ_NBR, OBJ_ID, VER_NBR, POSITION_NBR, PROJECT_CD, TRN_LDGR_ENTR_DESC, TRN_LDGR_ENTR_AMT, TRN_DEBIT_CRDT_CD, TRANSACTION_DT, ORG_DOC_NBR, ORG_REFERENCE_ID, FDOC_REF_TYP_CD, FS_REF_ORIGIN_CD, FDOC_REF_NBR, FDOC_REVERSAL_DT, TRN_ENCUM_UPDT_CD, TRN_POST_DT, PAY_PERIOD_END_DT, TRN_TOTAL_HR, PYRL_DT_FSCL_YR, PYRL_DT_FSCLPRD_CD, EMPLID, EMPL_RCD, ERNCD, PAYGROUP, SAL_ADMIN_PLAN, GRADE, RUN_ID, LL_ORIG_FIN_COA_CD, LL_ORIG_ACCT_NBR, LL_ORIG_SUB_ACCT_NBR, LL_ORIG_FIN_OBJECT_CD, LL_ORIG_FIN_SUB_OBJ_CD, COMPANY, SETID, TIMESTAMP) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
}
@Override
protected Map<String, String> getSql() {
return sql;
}
@Override
public LaborObject getLaborObject(final Integer fiscalYear, final String chartCode, final String objectCode) {
return new RetrievingJdbcWrapper<LaborObject>() {
@Override
protected void populateStatement(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, fiscalYear);
preparedStatement.setString(2, chartCode);
preparedStatement.setString(3, objectCode);
}
@Override
protected LaborObject extractResult(ResultSet resultSet) throws SQLException {
LaborObject laborObject = new LaborObject();
laborObject.setUniversityFiscalYear(fiscalYear);
laborObject.setChartOfAccountsCode(chartCode);
laborObject.setFinancialObjectCode(objectCode);
laborObject.setFinancialObjectFringeOrSalaryCode(resultSet.getString(1));
return laborObject;
}
}.get(LaborObject.class);
}
@Override
public int getMaxLaborSequenceNumber(final LedgerEntry t) {
return new RetrievingJdbcWrapper<Integer>() {
@Override
protected void populateStatement(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, t.getUniversityFiscalYear());
preparedStatement.setString(2, t.getChartOfAccountsCode());
preparedStatement.setString(3, t.getAccountNumber());
preparedStatement.setString(4, t.getSubAccountNumber());
preparedStatement.setString(5, t.getFinancialObjectCode());
preparedStatement.setString(6, t.getFinancialSubObjectCode());
preparedStatement.setString(7, t.getFinancialBalanceTypeCode());
preparedStatement.setString(8, t.getFinancialObjectTypeCode());
preparedStatement.setString(9, t.getUniversityFiscalPeriodCode());
preparedStatement.setString(10, t.getFinancialDocumentTypeCode());
preparedStatement.setString(11, t.getFinancialSystemOriginationCode());
preparedStatement.setString(12, t.getDocumentNumber());
}
@Override
protected Integer extractResult(ResultSet resultSet) throws SQLException {
return resultSet.getInt(1);
}
}.get(Integer.class);
}
@Override
public LedgerBalance getLedgerBalance(final LedgerBalance lb) {
return new RetrievingJdbcWrapper<LedgerBalance>() {
@Override
protected void populateStatement(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, lb.getUniversityFiscalYear());
preparedStatement.setString(2, lb.getChartOfAccountsCode());
preparedStatement.setString(3, lb.getAccountNumber());
preparedStatement.setString(4, lb.getSubAccountNumber());
preparedStatement.setString(5, lb.getFinancialObjectCode());
preparedStatement.setString(6, lb.getFinancialSubObjectCode());
preparedStatement.setString(7, lb.getFinancialBalanceTypeCode());
preparedStatement.setString(8, lb.getFinancialObjectTypeCode());
preparedStatement.setString(9, lb.getPositionNumber());
preparedStatement.setString(10, lb.getEmplid());
}
@Override
protected LedgerBalance extractResult(ResultSet resultSet) throws SQLException {
LedgerBalance ledgerBalance = new LedgerBalance();
ledgerBalance.setUniversityFiscalYear(lb.getUniversityFiscalYear());
ledgerBalance.setChartOfAccountsCode(lb.getChartOfAccountsCode());
ledgerBalance.setAccountNumber(lb.getAccountNumber());
ledgerBalance.setSubAccountNumber(lb.getSubAccountNumber());
ledgerBalance.setFinancialObjectCode(lb.getFinancialObjectCode());
ledgerBalance.setFinancialSubObjectCode(lb.getFinancialSubObjectCode());
ledgerBalance.setFinancialBalanceTypeCode(lb.getFinancialBalanceTypeCode());
ledgerBalance.setFinancialObjectTypeCode(lb.getFinancialObjectTypeCode());
ledgerBalance.setPositionNumber(lb.getPositionNumber());
ledgerBalance.setEmplid(lb.getEmplid());
ledgerBalance.setAccountLineAnnualBalanceAmount(new KualiDecimal(resultSet.getBigDecimal(1)));
ledgerBalance.setBeginningBalanceLineAmount(new KualiDecimal(resultSet.getBigDecimal(2)));
ledgerBalance.setContractsGrantsBeginningBalanceAmount(new KualiDecimal(resultSet.getBigDecimal(3)));
ledgerBalance.setMonth1Amount(new KualiDecimal(resultSet.getBigDecimal(4)));
ledgerBalance.setMonth2Amount(new KualiDecimal(resultSet.getBigDecimal(5)));
ledgerBalance.setMonth3Amount(new KualiDecimal(resultSet.getBigDecimal(6)));
ledgerBalance.setMonth4Amount(new KualiDecimal(resultSet.getBigDecimal(7)));
ledgerBalance.setMonth5Amount(new KualiDecimal(resultSet.getBigDecimal(8)));
ledgerBalance.setMonth6Amount(new KualiDecimal(resultSet.getBigDecimal(9)));
ledgerBalance.setMonth7Amount(new KualiDecimal(resultSet.getBigDecimal(10)));
ledgerBalance.setMonth8Amount(new KualiDecimal(resultSet.getBigDecimal(11)));
ledgerBalance.setMonth9Amount(new KualiDecimal(resultSet.getBigDecimal(12)));
ledgerBalance.setMonth10Amount(new KualiDecimal(resultSet.getBigDecimal(13)));
ledgerBalance.setMonth11Amount(new KualiDecimal(resultSet.getBigDecimal(14)));
ledgerBalance.setMonth12Amount(new KualiDecimal(resultSet.getBigDecimal(15)));
ledgerBalance.setMonth13Amount(new KualiDecimal(resultSet.getBigDecimal(16)));
return ledgerBalance;
}
}.get(LedgerBalance.class);
}
@Override
public void insertLedgerBalance(final LedgerBalance ledgerBalance, final Timestamp currentTimestamp) {
new InsertingJdbcWrapper<LedgerBalance>() {
@Override
protected void populateStatement(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, ledgerBalance.getUniversityFiscalYear());
preparedStatement.setString(2, ledgerBalance.getChartOfAccountsCode());
preparedStatement.setString(3, ledgerBalance.getAccountNumber());
preparedStatement.setString(4, ledgerBalance.getSubAccountNumber());
preparedStatement.setString(5, ledgerBalance.getFinancialObjectCode());
preparedStatement.setString(6, ledgerBalance.getFinancialSubObjectCode());
preparedStatement.setString(7, ledgerBalance.getFinancialBalanceTypeCode());
preparedStatement.setString(8, ledgerBalance.getFinancialObjectTypeCode());
preparedStatement.setString(9, ledgerBalance.getPositionNumber());
preparedStatement.setString(10, ledgerBalance.getEmplid());
if (ledgerBalance.getObjectId() == null) {
preparedStatement.setString(11, java.util.UUID.randomUUID().toString());
}
else {
preparedStatement.setString(11, ledgerBalance.getObjectId());
}
if (ledgerBalance.getVersionNumber() == null) {
preparedStatement.setLong(12, 1);
}
else {
preparedStatement.setLong(12, ledgerBalance.getVersionNumber());
}
preparedStatement.setBigDecimal(13, ledgerBalance.getAccountLineAnnualBalanceAmount().bigDecimalValue());
preparedStatement.setBigDecimal(14, ledgerBalance.getBeginningBalanceLineAmount().bigDecimalValue());
preparedStatement.setBigDecimal(15, ledgerBalance.getContractsGrantsBeginningBalanceAmount().bigDecimalValue());
preparedStatement.setBigDecimal(16, ledgerBalance.getMonth1Amount().bigDecimalValue());
preparedStatement.setBigDecimal(17, ledgerBalance.getMonth2Amount().bigDecimalValue());
preparedStatement.setBigDecimal(18, ledgerBalance.getMonth3Amount().bigDecimalValue());
preparedStatement.setBigDecimal(19, ledgerBalance.getMonth4Amount().bigDecimalValue());
preparedStatement.setBigDecimal(20, ledgerBalance.getMonth5Amount().bigDecimalValue());
preparedStatement.setBigDecimal(21, ledgerBalance.getMonth6Amount().bigDecimalValue());
preparedStatement.setBigDecimal(22, ledgerBalance.getMonth7Amount().bigDecimalValue());
preparedStatement.setBigDecimal(23, ledgerBalance.getMonth8Amount().bigDecimalValue());
preparedStatement.setBigDecimal(24, ledgerBalance.getMonth9Amount().bigDecimalValue());
preparedStatement.setBigDecimal(25, ledgerBalance.getMonth10Amount().bigDecimalValue());
preparedStatement.setBigDecimal(26, ledgerBalance.getMonth11Amount().bigDecimalValue());
preparedStatement.setBigDecimal(27, ledgerBalance.getMonth12Amount().bigDecimalValue());
preparedStatement.setBigDecimal(28, ledgerBalance.getMonth13Amount().bigDecimalValue());
preparedStatement.setTimestamp(29, currentTimestamp);
}
}.execute(LedgerBalance.class);
}
@Override
public void updateLedgerBalance(final LedgerBalance ledgerBalance, final Timestamp currentTimestamp) {
new UpdatingJdbcWrapper<LedgerBalance>() {
@Override
protected void populateStatement(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setBigDecimal(1, ledgerBalance.getAccountLineAnnualBalanceAmount().bigDecimalValue());
preparedStatement.setBigDecimal(2, ledgerBalance.getBeginningBalanceLineAmount().bigDecimalValue());
preparedStatement.setBigDecimal(3, ledgerBalance.getContractsGrantsBeginningBalanceAmount().bigDecimalValue());
preparedStatement.setBigDecimal(4, ledgerBalance.getMonth1Amount().bigDecimalValue());
preparedStatement.setBigDecimal(5, ledgerBalance.getMonth2Amount().bigDecimalValue());
preparedStatement.setBigDecimal(6, ledgerBalance.getMonth3Amount().bigDecimalValue());
preparedStatement.setBigDecimal(7, ledgerBalance.getMonth4Amount().bigDecimalValue());
preparedStatement.setBigDecimal(8, ledgerBalance.getMonth5Amount().bigDecimalValue());
preparedStatement.setBigDecimal(9, ledgerBalance.getMonth6Amount().bigDecimalValue());
preparedStatement.setBigDecimal(10, ledgerBalance.getMonth7Amount().bigDecimalValue());
preparedStatement.setBigDecimal(11, ledgerBalance.getMonth8Amount().bigDecimalValue());
preparedStatement.setBigDecimal(12, ledgerBalance.getMonth9Amount().bigDecimalValue());
preparedStatement.setBigDecimal(13, ledgerBalance.getMonth10Amount().bigDecimalValue());
preparedStatement.setBigDecimal(14, ledgerBalance.getMonth11Amount().bigDecimalValue());
preparedStatement.setBigDecimal(15, ledgerBalance.getMonth12Amount().bigDecimalValue());
preparedStatement.setBigDecimal(16, ledgerBalance.getMonth13Amount().bigDecimalValue());
preparedStatement.setTimestamp(17, currentTimestamp);
preparedStatement.setInt(18, ledgerBalance.getUniversityFiscalYear());
preparedStatement.setString(19, ledgerBalance.getChartOfAccountsCode());
preparedStatement.setString(20, ledgerBalance.getAccountNumber());
preparedStatement.setString(21, ledgerBalance.getSubAccountNumber());
preparedStatement.setString(22, ledgerBalance.getFinancialObjectCode());
preparedStatement.setString(23, ledgerBalance.getFinancialSubObjectCode());
preparedStatement.setString(24, ledgerBalance.getFinancialBalanceTypeCode());
preparedStatement.setString(25, ledgerBalance.getFinancialObjectTypeCode());
preparedStatement.setString(26, ledgerBalance.getPositionNumber());
preparedStatement.setString(27, ledgerBalance.getEmplid());
}
}.execute(LedgerBalance.class);
}
@Override
public void insertLedgerEntry(final LedgerEntry ledgerEntry) {
new InsertingJdbcWrapper<LedgerEntry>() {
@Override
protected void populateStatement(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, ledgerEntry.getUniversityFiscalYear());
preparedStatement.setString(2, ledgerEntry.getChartOfAccountsCode());
preparedStatement.setString(3, ledgerEntry.getAccountNumber());
preparedStatement.setString(4, ledgerEntry.getSubAccountNumber());
preparedStatement.setString(5, ledgerEntry.getFinancialObjectCode());
preparedStatement.setString(6, ledgerEntry.getFinancialSubObjectCode());
preparedStatement.setString(7, ledgerEntry.getFinancialBalanceTypeCode());
preparedStatement.setString(8, ledgerEntry.getFinancialObjectTypeCode());
preparedStatement.setString(9, ledgerEntry.getUniversityFiscalPeriodCode());
preparedStatement.setString(10, ledgerEntry.getFinancialDocumentTypeCode());
preparedStatement.setString(11, ledgerEntry.getFinancialSystemOriginationCode());
preparedStatement.setString(12, ledgerEntry.getDocumentNumber());
preparedStatement.setInt(13, ledgerEntry.getTransactionLedgerEntrySequenceNumber());
if (ledgerEntry.getObjectId() == null) {
preparedStatement.setString(14, java.util.UUID.randomUUID().toString());
}
else {
preparedStatement.setString(14, ledgerEntry.getObjectId());
}
if (ledgerEntry.getVersionNumber() == null) {
preparedStatement.setLong(15, 1);
}
else {
preparedStatement.setLong(15, ledgerEntry.getVersionNumber());
}
preparedStatement.setString(16, ledgerEntry.getPositionNumber());
preparedStatement.setString(17, ledgerEntry.getProjectCode());
preparedStatement.setString(18, ledgerEntry.getTransactionLedgerEntryDescription());
preparedStatement.setBigDecimal(19, ledgerEntry.getTransactionLedgerEntryAmount().bigDecimalValue());
preparedStatement.setString(20, ledgerEntry.getTransactionDebitCreditCode());
preparedStatement.setDate(21, ledgerEntry.getTransactionDate());
preparedStatement.setString(22, ledgerEntry.getOrganizationDocumentNumber());
preparedStatement.setString(23, ledgerEntry.getOrganizationReferenceId());
preparedStatement.setString(24, ledgerEntry.getReferenceFinancialDocumentTypeCode());
preparedStatement.setString(25, ledgerEntry.getReferenceFinancialSystemOriginationCode());
preparedStatement.setString(26, ledgerEntry.getReferenceFinancialDocumentNumber());
preparedStatement.setDate(27, ledgerEntry.getFinancialDocumentReversalDate());
preparedStatement.setString(28, ledgerEntry.getTransactionEncumbranceUpdateCode());
preparedStatement.setDate(29, ledgerEntry.getTransactionPostingDate());
preparedStatement.setDate(30, ledgerEntry.getPayPeriodEndDate());
preparedStatement.setBigDecimal(31, ledgerEntry.getTransactionTotalHours());
if (ledgerEntry.getPayrollEndDateFiscalYear() == null) {
preparedStatement.setNull(32, java.sql.Types.INTEGER);
}
else {
preparedStatement.setInt(32, ledgerEntry.getPayrollEndDateFiscalYear());
}
preparedStatement.setString(33, ledgerEntry.getPayrollEndDateFiscalPeriodCode());
preparedStatement.setString(34, ledgerEntry.getEmplid());
if (ledgerEntry.getEmployeeRecord() == null) {
preparedStatement.setNull(35, java.sql.Types.INTEGER);
}
else {
preparedStatement.setInt(35, ledgerEntry.getEmployeeRecord());
}
preparedStatement.setString(36, ledgerEntry.getEarnCode());
preparedStatement.setString(37, ledgerEntry.getPayGroup());
preparedStatement.setString(38, ledgerEntry.getSalaryAdministrationPlan());
preparedStatement.setString(39, ledgerEntry.getGrade());
preparedStatement.setString(40, ledgerEntry.getRunIdentifier());
preparedStatement.setString(41, ledgerEntry.getLaborLedgerOriginalChartOfAccountsCode());
preparedStatement.setString(42, ledgerEntry.getLaborLedgerOriginalAccountNumber());
preparedStatement.setString(43, ledgerEntry.getLaborLedgerOriginalSubAccountNumber());
preparedStatement.setString(44, ledgerEntry.getLaborLedgerOriginalFinancialObjectCode());
preparedStatement.setString(45, ledgerEntry.getLaborLedgerOriginalFinancialSubObjectCode());
preparedStatement.setString(46, ledgerEntry.getHrmsCompany());
preparedStatement.setString(47, ledgerEntry.getSetid());
preparedStatement.setTimestamp(48, ledgerEntry.getTransactionDateTimeStamp());
}
}.execute(LedgerEntry.class);
}
}