1 6 package com.nightlabs.ipanema.accounting; 7 8 import java.util.Collections ; 9 import java.util.Comparator ; 10 import java.util.Iterator ; 11 import java.util.LinkedList ; 12 import java.util.List ; 13 14 import javax.jdo.JDOHelper; 15 import javax.jdo.PersistenceManager; 16 17 import com.nightlabs.ipanema.trade.LegalEntity; 18 import com.nightlabs.ipanema.transfer.Anchor; 19 20 34 public class PartnerAccountant extends Accountant { 36 37 40 public PartnerAccountant() { 41 super(); 42 } 43 44 48 public PartnerAccountant(String organisationID, String accountantID) { 49 super(organisationID, accountantID); 50 } 51 52 55 public void bookTransfer(LegalEntity mandator, MoneyTransfer transfer) { 56 if (transfer instanceof IntraLegalEntityMoneyTransfer) { 57 handleInterLegalEntityMoneyTransfer(mandator, (InterLegalEntityMoneyTransfer)transfer); 58 } 59 else if (transfer instanceof PayMoneyTransfer) { 60 handlePayMoneyTransfer(mandator, (PayMoneyTransfer)transfer); 61 } 62 } 63 64 71 protected void handleInterLegalEntityMoneyTransfer(LegalEntity mandator, InterLegalEntityMoneyTransfer transfer) { 72 boolean mandatorIsVendor = transfer.getInvoice().getVendor().getPrimaryKey().equals(mandator.getPrimaryKey()); 73 boolean mandatorIsCustomer = !mandatorIsVendor; 74 75 boolean mandatorIsTransferTo = transfer.getTo().getPrimaryKey().equals(mandator.getPrimaryKey()); 76 boolean mandatorIsTransferFrom = !mandatorIsTransferTo; 77 78 Anchor createTransferFrom = null; 79 Anchor createTransferTo = null; 80 Accounting accounting = Accounting.getAccounting(getPersistenceManager()); 81 if (mandatorIsCustomer) { 84 Account customerPartnerAccount = accounting.getPartnerAccount(Account.PARTNER_ACCOUNT_TYPE_CUSTOMER, mandator, transfer.getInvoice().getCurrency()); 85 if (mandatorIsTransferFrom) { 86 createTransferFrom = customerPartnerAccount; 87 createTransferTo = mandator; 88 } 89 else { 90 createTransferFrom = mandator; 91 createTransferTo = customerPartnerAccount; 92 } 93 } 94 else { 95 Account vendorPartnerAccount = accounting.getPartnerAccount(Account.PARTNER_ACCOUNT_TYPE_VENDOR, mandator, transfer.getInvoice().getCurrency()); 97 if (mandatorIsTransferFrom) { 98 createTransferFrom = vendorPartnerAccount; 99 createTransferTo = mandator; 100 } 101 else { 102 createTransferFrom = mandator; 103 createTransferTo = vendorPartnerAccount; 104 } 105 } 106 107 IntraLegalEntityMoneyTransfer moneyTransfer = new IntraLegalEntityMoneyTransfer( 108 accounting, 109 transfer, 110 createTransferFrom, 111 createTransferTo 112 ); 113 114 createTransferFrom.bookTransfer(moneyTransfer); 115 createTransferTo.bookTransfer(moneyTransfer); 116 } 117 118 119 120 private static class TransferInvoiceEntry { 121 private Invoice invoice; 122 private long invoiceBalance; 123 public TransferInvoiceEntry(Invoice invoice, long invoiceBalance) { 124 this.invoice = invoice; 125 this.invoiceBalance = invoiceBalance; 126 } 127 public Invoice getInvoice() { 128 return invoice; 129 } 130 public long getInvoiceBalance() { 131 return invoiceBalance; 132 } 133 } 134 135 156 protected void handlePayMoneyTransfer(LegalEntity mandator, PayMoneyTransfer transfer) { 157 List sortedInvoices = new LinkedList (); 159 for (int i = 0; i<transfer.getInvoices().length; i++) { 160 sortedInvoices.add(transfer.getInvoices()[i]); 161 } 162 Comparator comparator = new Comparator () { 163 public int compare(Object arg0, Object arg1) { 164 if ( (arg0 instanceof Invoice) && (arg1 instanceof Invoice) ) { 165 Invoice inv0 = (Invoice)arg0; 166 Invoice inv1 = (Invoice)arg1; 167 if (inv0.getOrganisationID().equals(inv1.getOrganisationID())) { 168 if (inv0.getInvoiceID() < inv1.getInvoiceID()) 169 return -1; 170 else if (inv0.getInvoiceID() > inv1.getInvoiceID()) 171 return 1; 172 else 173 return 0; 174 } 175 else 176 return inv0.getOrganisationID().compareTo(inv1.getOrganisationID()); 177 } 178 else 179 return 0; 180 } 181 }; 182 Collections.sort(sortedInvoices,comparator); 183 184 185 186 boolean mandatorTransferTo = (transfer.getTo() != null) && (transfer.getTo().getPrimaryKey().equals(mandator.getPrimaryKey())); 188 boolean mandatorTransferFrom = !mandatorTransferTo; 189 190 List invoicesPayMoney = new LinkedList (); 191 List invoicesRecieveMoney = new LinkedList (); 192 193 Accounting accounting = Accounting.getAccounting(getPersistenceManager()); 194 195 long overallBalance = 0; 196 197 for (Iterator iter = sortedInvoices.iterator(); iter.hasNext();) { 198 Invoice invoice = (Invoice) iter.next(); 199 long invoiceBalance = 0; 200 boolean mandatorInvoiceCustomer = invoice.getCustomer().getPrimaryKey().equals(mandator.getPrimaryKey()); 201 boolean mandatorInvoiceCreditor = !mandatorInvoiceCustomer; 202 long factor = 1; 203 if ( (mandatorTransferTo && mandatorInvoiceCreditor) || (mandatorTransferFrom && mandatorInvoiceCustomer) ) 204 factor = -1; 205 invoiceBalance = invoice.getAmountToPay() * factor; 206 overallBalance += invoiceBalance; 207 if (invoiceBalance >= 0) 208 invoicesRecieveMoney.add(new TransferInvoiceEntry(invoice,invoiceBalance)); 209 else 210 invoicesRecieveMoney.add(new TransferInvoiceEntry(invoice,invoiceBalance)); 211 } 212 213 if (mandatorTransferFrom) { 215 Account fromAccount = accounting.getPartnerAccount(Account.PARTNER_ACCOUNT_TYPE_VENDOR,mandator,transfer.getCurrency()); 218 IntraLegalEntityMoneyTransfer moneyTransfer = new IntraLegalEntityMoneyTransfer( 219 accounting, 220 transfer, 221 fromAccount, 222 mandator, 223 transfer, 224 transfer.getCurrency(), 225 transfer.getAmount() 226 ); 227 228 fromAccount.bookTransfer(moneyTransfer); 229 mandator.bookTransfer(moneyTransfer); 230 } 231 else { 232 Account toAccount = accounting.getPartnerAccount(Account.PARTNER_ACCOUNT_TYPE_CUSTOMER,mandator,transfer.getCurrency()); 235 IntraLegalEntityMoneyTransfer moneyTransfer = new IntraLegalEntityMoneyTransfer( 236 accounting, 237 transfer, 238 mandator, 239 toAccount, 240 transfer, 241 transfer.getCurrency(), 242 transfer.getAmount() 243 ); 244 245 mandator.bookTransfer(moneyTransfer); 246 toAccount.bookTransfer(moneyTransfer); 247 } 248 249 if (overallBalance >= 0) { 250 long moneyBalance = transfer.getAmount(); 252 for (Iterator iter = invoicesRecieveMoney.iterator(); iter.hasNext();) { 255 TransferInvoiceEntry entry = (TransferInvoiceEntry) iter.next(); 256 Invoice invoice = entry.getInvoice(); 257 invoice.setAmountPaid(invoice.getPrice().getAmount()); 258 invoice.setPaid(true); 259 moneyBalance -= entry.getInvoiceBalance(); 260 } 261 for (Iterator iter = invoicesPayMoney.iterator(); iter.hasNext();) { 265 TransferInvoiceEntry entry = (TransferInvoiceEntry) iter.next(); 266 Invoice invoice = entry.getInvoice(); 267 if (moneyBalance >= entry.getInvoiceBalance()) { 268 invoice.setAmountPaid(invoice.getPrice().getAmount()); 269 invoice.setPaid(true); 270 moneyBalance -= entry.getInvoiceBalance(); 271 } 272 else { 273 invoice.setAmountPaid(invoice.getAmountPaid() + moneyBalance); 274 moneyBalance = 0; 275 break; 276 } 277 } 278 279 } 280 else { 281 if (invoicesRecieveMoney.size() > 0) { 283 long moneyBalance = transfer.getAmount(); 286 for (Iterator iter = invoicesPayMoney.iterator(); iter.hasNext();) { 289 TransferInvoiceEntry entry = (TransferInvoiceEntry) iter.next(); 290 Invoice invoice = entry.getInvoice(); 291 invoice.setAmountPaid(invoice.getPrice().getAmount()); 292 invoice.setPaid(true); 293 moneyBalance -= entry.getInvoiceBalance(); 294 } 295 for (Iterator iter = invoicesRecieveMoney.iterator(); iter.hasNext();) { 300 TransferInvoiceEntry entry = (TransferInvoiceEntry) iter.next(); 301 Invoice invoice = entry.getInvoice(); 302 if (moneyBalance <= entry.getInvoiceBalance()) { 303 invoice.setAmountPaid(invoice.getPrice().getAmount()); 304 invoice.setPaid(true); 305 moneyBalance -= entry.getInvoiceBalance(); 306 } 307 else { 308 invoice.setAmountPaid(invoice.getAmountPaid() + moneyBalance); 309 moneyBalance = 0; 310 break; 311 } 312 } 313 } 314 else { 315 } 320 } 321 322 } 348 349 private PersistenceManager accountantPM = null; 350 351 protected PersistenceManager getPersistenceManager() { 352 if (accountantPM == null) { 353 accountantPM = JDOHelper.getPersistenceManager(this); 354 if (accountantPM == null) 355 throw new IllegalStateException ("This instance of PartnerAccountant is currently not persistent, can not get a PesistenceManager!!"); 356 } 357 return accountantPM; 358 } 359 360 } 361 | Popular Tags |