package is.idega.idegaweb.campus.block.phone.business; import is.idega.idegaweb.campus.data.ContractAccounts; import is.idega.idegaweb.campus.data.ContractAccountsHome; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Collection; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import javax.ejb.FinderException; import javax.transaction.TransactionManager; import com.idega.block.building.data.Building; import com.idega.block.building.data.BuildingHome; import com.idega.block.finance.business.FinanceHandler; import com.idega.block.finance.data.AccountEntry; import com.idega.block.finance.data.AccountEntryHome; import com.idega.block.finance.data.AccountKey; import com.idega.block.finance.data.AccountKeyHome; import com.idega.block.finance.data.AccountPhoneEntry; import com.idega.block.finance.data.AccountPhoneEntryBMPBean; import com.idega.block.finance.data.AccountPhoneEntryHome; import com.idega.block.finance.data.AssessmentRound; import com.idega.block.finance.data.AssessmentRoundHome; import com.idega.block.finance.data.Tariff; import com.idega.block.finance.data.TariffKey; import com.idega.block.finance.data.TariffKeyHome; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.idegaweb.IWApplicationContext; import com.idega.transaction.IdegaTransactionManager; import com.idega.util.IWTimestamp; import com.idega.util.database.ConnectionBroker; /** * Title: Description: Copyright: Copyright (c) 2001 Company: * * @author <a href="mailto:aron@idega.is">aron@idega.is * @version 1.0 */ public class PhoneFinanceHandler implements FinanceHandler { // public static float tax = 1.245f; public static float tax = 1.0f; public static float fastaGjald = -923.0f; public static int fastaGjaldsLykill = 25; //key 4415; int count = 0; public PhoneFinanceHandler() { } public String getAccountType() { return com.idega.block.finance.data.AccountBMPBean.typePhone; } public boolean rollbackAssessment(IWApplicationContext iwac, Integer assessmentRoundId) { StringBuffer sql = new StringBuffer("update ").append(com.idega.block.finance.data.AccountPhoneEntryBMPBean.getEntityTableName()); sql.append(" set ").append(com.idega.block.finance.data.AccountPhoneEntryBMPBean.getColumnNameAccountEntryId()).append( " = null "); sql.append(" , ").append(com.idega.block.finance.data.AccountPhoneEntryBMPBean.getRoundIdColumnName()).append( " = null "); sql.append(" , ").append(com.idega.block.finance.data.AccountPhoneEntryBMPBean.getColumnNameStatus()).append( " = '").append(com.idega.block.finance.data.AccountPhoneEntryBMPBean.statusRead).append("'"); sql.append(" where ").append(com.idega.block.finance.data.AccountPhoneEntryBMPBean.getRoundIdColumnName()).append( " = ").append(assessmentRoundId); System.err.println(sql.toString()); TransactionManager t = IdegaTransactionManager.getInstance(); Connection conn = null; Statement stmt = null; try { t.begin(); conn = ConnectionBroker.getConnection(); stmt = conn.createStatement(); stmt.executeUpdate(sql.toString()); stmt.executeUpdate(getSQLString(assessmentRoundId)); stmt.execute("delete from fin_phone_entry where total_price > 0 and fin_assessment_round_id = " + assessmentRoundId); stmt.execute("delete from fin_acc_entry where fin_assessment_round_id = " + assessmentRoundId); stmt.execute("delete from fin_assessment_round where fin_assessment_round_id = " + assessmentRoundId); t.commit(); return true; } catch (Exception e) { try { t.rollback(); } catch (javax.transaction.SystemException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { if (stmt != null) { try { stmt.close(); } catch (SQLException e1) { e1.printStackTrace(); } } if (conn != null) { ConnectionBroker.freeConnection(conn); } } return false; } public static List listOfContractAccounts() { try { return com.idega.data.EntityFinder.getInstance().findAll(ContractAccounts.class); } catch (Exception ex) { ex.printStackTrace(); return null; } } public Map getMapOfContractsAccountsByPhoneAccountId(Collection listOfContractAccounts) { if (listOfContractAccounts != null) { Iterator iter = listOfContractAccounts.iterator(); ContractAccounts conAcc; Hashtable H = new Hashtable(listOfContractAccounts.size()); while (iter.hasNext()) { conAcc = (ContractAccounts) iter.next(); H.put(new Integer(conAcc.getPhoneAccountId()), conAcc); } return H; } return null; } public boolean executeAssessment(IWApplicationContext iwac, Integer categoryId, Integer tariffGroupId, String roundName, Integer cashierId, Integer accountKeyId, IWTimestamp paydate, IWTimestamp start, IWTimestamp end, Integer excessRoundID) { try { Collection listOfAccounts = ((ContractAccountsHome) IDOLookup.getHome(ContractAccounts.class)).findByPeriodOverLap( start.getDate(), end.getDate()); if (listOfAccounts != null) { System.err.println("Accounts not null"); Map M = getMapOfContractsAccountsByPhoneAccountId(listOfAccounts); System.err.println("Got map of contracts by phone"); Map E = new HashMap(listOfAccounts.size()); System.err.println("Created Hashmap of accounts"); Collection entries = ((AccountPhoneEntryHome) IDOLookup.getHome(AccountPhoneEntry.class)).findUnbilledByAccountAndPeriod( null, start.getDate(), end.getDate()); System.err.println("Got entries"); AccountPhoneEntry ape; ContractAccounts accounts; System.out.println("entries = " + entries); if (entries != null) { System.err.println("Entries not null size = " + entries.size()); AssessmentRound AR = null; Integer roundId = new Integer(-1); Integer accountCount = new Integer(0); TransactionManager t = IdegaTransactionManager.getInstance(); try { t.begin(); AR = ((AssessmentRoundHome) IDOLookup.getHome(AssessmentRound.class)).create(); AR.setAsNew(roundName); AR.setCategoryId(categoryId.intValue()); AR.setTariffGroupId(tariffGroupId.intValue()); AR.setType(getAccountType()); AR.store(); roundId = ((Integer) AR.getPrimaryKey()); AccountKey AK = ((AccountKeyHome) IDOLookup.getHome(AccountKey.class)).findByPrimaryKey((accountKeyId)); TariffKey TK = ((TariffKeyHome) IDOLookup.getHome(TariffKey.class)).findByPrimaryKey(new Integer( AK.getTariffKeyId())); AccountKey fastaAK = ((AccountKeyHome) IDOLookup.getHome(AccountKey.class)).findByPrimaryKey((new Integer(fastaGjaldsLykill))); TariffKey fastaTK = ((TariffKeyHome) IDOLookup.getHome(TariffKey.class)).findByPrimaryKey(new Integer( fastaAK.getTariffKeyId())); Integer phAccId; Iterator iter = entries.iterator(); AccountEntry AE; while (iter.hasNext()) { ape = (AccountPhoneEntry) iter.next(); phAccId = new Integer(ape.getAccountId()); if (M.containsKey(phAccId)) { accounts = (ContractAccounts) M.get(phAccId); if (E.containsKey(phAccId)) { AE = (AccountEntry) E.get(phAccId); AE.setNetto(AE.getNetto() + ape.getPrice()); } else { Building building = ((BuildingHome) IDOLookup.getHome(Building.class)).findByPrimaryKey(new Integer(accounts.getBuildingId())); AE = insertEntry(new Integer(accounts.getFinanceAccountId()), roundId, paydate, ape.getPrice(), AK, TK, cashierId, building.getDivision(), null); E.put(phAccId, AE); //Fastagjald. AccountEntry entry = insertEntry(new Integer(accounts.getFinanceAccountId()), roundId, paydate, fastaGjald, fastaAK, fastaTK, cashierId, building.getDivision(), "Fastagjald"); entry.setTotal(entry.getNetto() * tax); entry.store(); } ape.setAccountEntryId(((Integer) AE.getPrimaryKey()).intValue()); ape.setLastUpdated(IWTimestamp.getTimestampRightNow()); ape.setStatus(com.idega.block.finance.data.AccountPhoneEntryBMPBean.statusBilled); ape.setRoundId(roundId); ape.store(); } else { System.err.println("Map doesn't contain this accountid " + phAccId); } } if (E.size() > 0) { Iterator ents = E.entrySet().iterator(); AccountEntry entry; AccountPhoneEntry phoneEntry; Map.Entry me; Integer AccountId; while (ents.hasNext()) { me = (Map.Entry) ents.next(); entry = (AccountEntry) me.getValue(); AccountId = (Integer) me.getKey(); entry.setTotal(entry.getNetto() * tax); phoneEntry = ((AccountPhoneEntryHome) IDOLookup.getHome(AccountPhoneEntry.class)).create(); phoneEntry.setAccountId(AccountId.intValue()); phoneEntry.setPrice(-1 * entry.getNetto()); phoneEntry.setRoundId(roundId); phoneEntry.setAccountEntryId(((Integer) entry.getPrimaryKey()).intValue()); phoneEntry.setStatus(AccountPhoneEntryBMPBean.statusBilled); phoneEntry.store(); entry.store(); } } t.commit(); return true; } catch (Exception e) { try { t.rollback(); } catch (javax.transaction.SystemException ex) { ex.printStackTrace(); } e.printStackTrace(); } } else System.err.println("Entries null "); } } catch (IDOLookupException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (FinderException e) { e.printStackTrace(); } return false; } public String getSQLString(Integer assessmentRound) { StringBuffer sql = new StringBuffer("update fin_phone_entry p "); sql.append(" set p.fin_acc_entry_id = null "); sql.append(" where p.fin_phone_entry_id in ( "); sql.append(" select pe.fin_phone_entry_id "); sql.append(" from fin_phone_entry pe, fin_acc_entry ae, fin_assessment_round ar "); sql.append(" where pe.fin_acc_entry_id = ae.fin_acc_entry_id "); sql.append(" and ae.fin_assessment_round_id = "); sql.append(assessmentRound); sql.append(" )"); return sql.toString(); } public Collection listOfAssessmentTariffPreviews(IWApplicationContext iwac, Integer tariffGroupId, IWTimestamp start, IWTimestamp end) { return null; } private static float insertEntry(Vector V, Tariff T, Integer accountId, Integer roundId, IWTimestamp itPaydate, Integer cashierId) throws Exception, java.rmi.RemoteException { AccountEntry AE = ((AccountEntryHome) IDOLookup.getHome(AccountEntry.class)).create(); AE.setAccountId(accountId); AE.setAccountKeyId(T.getAccountKeyId()); AE.setCashierId(cashierId); AE.setLastUpdated(IWTimestamp.getTimestampRightNow()); AE.setPrice(-T.getPrice()); AE.setRoundId(roundId); AE.setName(T.getName()); AE.setInfo(T.getInfo()); AE.setStatus(com.idega.block.finance.data.AccountEntryBMPBean.STATUS_CREATED); AE.setCashierId(1); AE.setPaymentDate(itPaydate.getTimestamp()); AE.store(); if (V != null) V.add(AE); return AE.getTotal(); } private static AccountEntry insertEntry(Integer accountId, Integer roundId, IWTimestamp itPaydate, float nettoamount, AccountKey key, TariffKey tkey, Integer cashierId, String division, String text) throws Exception { AccountEntry AE = ((AccountEntryHome) IDOLookup.getHome(AccountEntry.class)).create(); AE.setAccountId(accountId); AE.setAccountKeyId(((Integer) key.getPrimaryKey()).intValue()); AE.setCashierId(cashierId); AE.setLastUpdated(IWTimestamp.getTimestampRightNow()); AE.setNetto(nettoamount); AE.setRoundId(roundId); if (text != null) { AE.setName(text); } else { AE.setName(tkey.getName()); } AE.setInfo(tkey.getInfo()); AE.setStatus(com.idega.block.finance.data.AccountEntryBMPBean.STATUS_CREATED); AE.setPaymentDate(itPaydate.getTimestamp()); AE.setDivisionForAccounting(division); AE.store(); return AE; } public Map getAttributeMap() { Hashtable H = new Hashtable(2); H.put("a", "M?na?argjald"); H.put("b", "Stofngjald"); H.put("t", "Skattur (%)"); return H; } public List listOfAttributes() { Vector v = new Vector(); v.add("a"); v.add("b"); v.add("t"); return v; } /* * (non-Javadoc) * * @see com.idega.block.finance.business.FinanceHandler#getTariffsByUserAndGroup(java.lang.Integer, * java.lang.Integer) */ public Collection getTariffsForAccountInGroup(Integer userID, Integer tariffGroupID) { return null; } /* * (non-Javadoc) * * @see com.idega.block.finance.business.FinanceHandler#publishAssessment(com.idega.idegaweb.IWApplicationContext, * java.lang.Integer) */ public void publishAssessment(IWApplicationContext iwc, Integer roundId) { } }