001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.endow.businessobject; 017 018 import java.math.BigDecimal; 019 import java.sql.Date; 020 import java.util.LinkedHashMap; 021 import java.util.List; 022 023 import org.apache.commons.lang.StringUtils; 024 import org.apache.ojb.broker.PersistenceBroker; 025 import org.apache.ojb.broker.PersistenceBrokerException; 026 import org.kuali.kfs.module.endow.EndowConstants; 027 import org.kuali.kfs.module.endow.EndowPropertyConstants; 028 import org.kuali.kfs.module.endow.document.service.KEMService; 029 import org.kuali.kfs.module.endow.document.service.TicklerService; 030 import org.kuali.kfs.sys.KFSConstants; 031 import org.kuali.kfs.sys.context.SpringContext; 032 import org.kuali.rice.kns.bo.Inactivateable; 033 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase; 034 import org.kuali.rice.kns.util.TypedArrayList; 035 036 /** 037 * Business Object for Security table. 038 */ 039 public class Security extends PersistableBusinessObjectBase implements Inactivateable { 040 041 private String id; 042 private String description; 043 private String tickerSymbol; 044 private String securityClassCode; 045 private String securitySubclassCode; 046 private Date maturityDate; 047 private BigDecimal unitValue; 048 private BigDecimal unitsHeld; 049 private Date valuationDate; 050 private String unitValueSource; 051 private BigDecimal previousUnitValue; 052 private Date previousUnitValueDate; 053 private BigDecimal carryValue; 054 private Date lastTransactionDate; 055 private String incomePayFrequency; 056 private Date incomeNextPayDate; 057 private BigDecimal incomeRate; 058 private Date incomeChangeDate; 059 private Date issueDate; 060 private Date dividendRecordDate; 061 private Date exDividendDate; 062 private Date dividendPayDate; 063 private BigDecimal dividendAmount; 064 private BigDecimal commitmentAmount; 065 private BigDecimal nextFiscalYearDistributionAmount; 066 private BigDecimal securityValueByMarket; 067 private boolean active; 068 069 // this field is not saved in the db, 070 // it is used so that the user can enter the first 8 chars of the security ID while the ninth 071 // digit is computed using the mod10 method 072 private String userEnteredSecurityIDprefix; 073 074 // this field is not saved in the database but computed based on Sum of the HLDG _MVAL for all records for the Security in 075 // END_CURR_TAX_LOT_BAL_T 076 private BigDecimal marketValue; 077 078 private ClassCode classCode; 079 private FrequencyCode frequencyCode; 080 private SubclassCode subclassCode; 081 082 List<Tickler> ticklers; 083 084 /** 085 * Constructs a Security.java. 086 */ 087 public Security() { 088 super(); 089 unitValue = BigDecimal.ONE; 090 unitsHeld = BigDecimal.ZERO; 091 carryValue = BigDecimal.ZERO; 092 ticklers = new TypedArrayList(Tickler.class); 093 } 094 095 /** 096 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper() 097 */ 098 @Override 099 protected LinkedHashMap toStringMapper() { 100 LinkedHashMap m = new LinkedHashMap(); 101 m.put(EndowPropertyConstants.SECURITY_ID, this.id); 102 return m; 103 } 104 105 /** 106 * @see org.kuali.rice.kns.bo.Inactivateable#isActive() 107 */ 108 public boolean isActive() { 109 return active; 110 } 111 112 /** 113 * @see org.kuali.rice.kns.bo.Inactivateable#setActive(boolean) 114 */ 115 public void setActive(boolean active) { 116 this.active = active; 117 } 118 119 /** 120 * This method gets carryValue 121 * 122 * @return carryValue 123 */ 124 public BigDecimal getCarryValue() { 125 return carryValue; 126 } 127 128 /** 129 * This method sets carryValue. 130 * 131 * @param carryValue 132 */ 133 public void setCarryValue(BigDecimal carryValue) { 134 this.carryValue = carryValue; 135 } 136 137 138 /** 139 * This method gets the commitmentAmount. 140 * 141 * @return commitmentAmount 142 */ 143 public BigDecimal getCommitmentAmount() { 144 return commitmentAmount; 145 } 146 147 /** 148 * This method sets the commitmentAmount. 149 * 150 * @param commitmentAmount 151 */ 152 public void setCommitmentAmount(BigDecimal commitmentAmount) { 153 this.commitmentAmount = commitmentAmount; 154 } 155 156 /** 157 * This method gets the description. 158 * 159 * @return description 160 */ 161 public String getDescription() { 162 return description; 163 } 164 165 /** 166 * This method sets the description. 167 * 168 * @param description 169 */ 170 public void setDescription(String description) { 171 this.description = description; 172 } 173 174 /** 175 * This method gets the dividendAmount. 176 * 177 * @return dividendAmount 178 */ 179 public BigDecimal getDividendAmount() { 180 return dividendAmount; 181 } 182 183 /** 184 * This method sets the dividendAmount. 185 * 186 * @param dividendAmount 187 */ 188 public void setDividendAmount(BigDecimal dividendAmount) { 189 this.dividendAmount = dividendAmount; 190 } 191 192 /** 193 * This method gets the dividendPayDate 194 * 195 * @return dividendPayDate 196 */ 197 public Date getDividendPayDate() { 198 return dividendPayDate; 199 } 200 201 /** 202 * This method sets the dividendPayDate. 203 * 204 * @param dividendPayDate 205 */ 206 public void setDividendPayDate(Date dividendPayDate) { 207 this.dividendPayDate = dividendPayDate; 208 } 209 210 /** 211 * This method gets the dividendRecordDate. 212 * 213 * @return dividendRecordDate 214 */ 215 public Date getDividendRecordDate() { 216 return dividendRecordDate; 217 } 218 219 /** 220 * This method sets the dividendRecordDate. 221 * 222 * @param dividendRecordDate 223 */ 224 public void setDividendRecordDate(Date dividendRecordDate) { 225 this.dividendRecordDate = dividendRecordDate; 226 } 227 228 /** 229 * This method gets the exDividendDate. 230 * 231 * @return exDividendDate 232 */ 233 public Date getExDividendDate() { 234 return exDividendDate; 235 } 236 237 /** 238 * This method sets the exDividendDate. 239 * 240 * @param exDividendDate 241 */ 242 public void setExDividendDate(Date exDividendDate) { 243 this.exDividendDate = exDividendDate; 244 } 245 246 /** 247 * This method gets the id. 248 * 249 * @return id 250 */ 251 public String getId() { 252 return id; 253 } 254 255 /** 256 * This method sets the id. 257 * 258 * @param id 259 */ 260 public void setId(String id) { 261 this.id = id; 262 } 263 264 /** 265 * This method gets the incomeChangeDate. 266 * 267 * @return incomeChangeDate 268 */ 269 public Date getIncomeChangeDate() { 270 return incomeChangeDate; 271 } 272 273 /** 274 * This method sets the incomeChangeDate. 275 * 276 * @param incomeChangeDate 277 */ 278 public void setIncomeChangeDate(Date incomeChangeDate) { 279 this.incomeChangeDate = incomeChangeDate; 280 } 281 282 /** 283 * This method gets the incomeNextPayDate 284 * 285 * @return incomeNextPayDate 286 */ 287 public Date getIncomeNextPayDate() { 288 return incomeNextPayDate; 289 } 290 291 /** 292 * This method sets the incomeNextPayDate 293 * 294 * @param incomeNextPayDate 295 */ 296 public void setIncomeNextPayDate(Date incomeNextPayDate) { 297 this.incomeNextPayDate = incomeNextPayDate; 298 } 299 300 /** 301 * This method gets the incomePayFrequency. 302 * 303 * @return incomePayFrequency 304 */ 305 public String getIncomePayFrequency() { 306 return incomePayFrequency; 307 } 308 309 /** 310 * This method sets the incomePayFrequency 311 * 312 * @param incomePayFrequency 313 */ 314 public void setIncomePayFrequency(String incomePayFrequency) { 315 this.incomePayFrequency = incomePayFrequency; 316 } 317 318 /** 319 * This method gets the incomeRate 320 * 321 * @return incomeRate 322 */ 323 public BigDecimal getIncomeRate() { 324 return incomeRate; 325 } 326 327 /** 328 * This method sets the incomeRate 329 * 330 * @param incomeRate 331 */ 332 public void setIncomeRate(BigDecimal incomeRate) { 333 this.incomeRate = incomeRate; 334 } 335 336 /** 337 * This method gets the incomeRate. 338 * 339 * @return incomeRate 340 */ 341 public Date getIssueDate() { 342 return issueDate; 343 } 344 345 /** 346 * This method sets the incomeRate. 347 * 348 * @param issueDate 349 */ 350 public void setIssueDate(Date issueDate) { 351 this.issueDate = issueDate; 352 } 353 354 /** 355 * This method gets the lastTransactionDate. 356 * 357 * @return lastTransactionDate 358 */ 359 public Date getLastTransactionDate() { 360 return lastTransactionDate; 361 } 362 363 /** 364 * This method sets the lastTransactionDate. 365 * 366 * @param lastTransactionDate 367 */ 368 public void setLastTransactionDate(Date lastTransactionDate) { 369 this.lastTransactionDate = lastTransactionDate; 370 } 371 372 /** 373 * This method gets the maturityDate 374 * 375 * @return maturityDate 376 */ 377 public Date getMaturityDate() { 378 return maturityDate; 379 } 380 381 /** 382 * This method sets the maturityDate 383 * 384 * @param maturityDate 385 */ 386 public void setMaturityDate(Date maturityDate) { 387 this.maturityDate = maturityDate; 388 } 389 390 /** 391 * This method gets the securitySubclassCode 392 * 393 * @return securitySubclassCode 394 */ 395 public String getSecuritySubclassCode() { 396 return securitySubclassCode; 397 } 398 399 /** 400 * This method sets the securitySubclassCode 401 * 402 * @param subclassCode 403 */ 404 public void setSecuritySubclassCode(String subclassCode) { 405 this.securitySubclassCode = subclassCode; 406 } 407 408 /** 409 * This method gets the tickerSymbol. 410 * 411 * @return the tickerSymbol 412 */ 413 public String getTickerSymbol() { 414 return tickerSymbol; 415 } 416 417 /** 418 * This method sets the tickerSymbol. 419 * 420 * @param tickerSymbol 421 */ 422 public void setTickerSymbol(String tickerSymbol) { 423 this.tickerSymbol = tickerSymbol; 424 } 425 426 /** 427 * This method gets the unitsHeld. 428 * 429 * @return unitsHeld 430 */ 431 public BigDecimal getUnitsHeld() { 432 return unitsHeld; 433 } 434 435 /** 436 * This method sets the unitsHeld. 437 * 438 * @param unitsHeld 439 */ 440 public void setUnitsHeld(BigDecimal unitsHeld) { 441 this.unitsHeld = unitsHeld; 442 } 443 444 /** 445 * This method gets the unitValue. 446 * 447 * @return unitValue 448 */ 449 public BigDecimal getUnitValue() { 450 return unitValue; 451 } 452 453 /** 454 * This method sets the unitValue. 455 * 456 * @param unitValue 457 */ 458 public void setUnitValue(BigDecimal unitValue) { 459 460 if (unitValue != null) { 461 this.unitValue = unitValue.setScale(EndowConstants.Scale.SECURITY_UNIT_VALUE, BigDecimal.ROUND_HALF_UP); 462 } 463 else { 464 this.unitValue = unitValue; 465 } 466 } 467 468 /** 469 * This method gets the valuationDate. 470 * 471 * @return valuationDate 472 */ 473 public Date getValuationDate() { 474 return valuationDate; 475 } 476 477 /** 478 * This method sets the valuationDate. 479 * 480 * @param valuationDate 481 */ 482 public void setValuationDate(Date valuationDate) { 483 this.valuationDate = valuationDate; 484 } 485 486 /** 487 * This method gets the previousUnitValue. 488 * 489 * @return previousUnitValue 490 */ 491 public BigDecimal getPreviousUnitValue() { 492 return previousUnitValue; 493 } 494 495 /** 496 * This method sets the previousUnitValue. 497 * 498 * @param previousUnitValue 499 */ 500 public void setPreviousUnitValue(BigDecimal previousUnitValue) { 501 this.previousUnitValue = previousUnitValue; 502 } 503 504 /** 505 * This method gets the previousUnitValueDate. 506 * 507 * @return previousUnitValueDate 508 */ 509 public Date getPreviousUnitValueDate() { 510 return previousUnitValueDate; 511 } 512 513 /** 514 * This method sets previousUnitValueDate. 515 * 516 * @param previousUnitValueDate 517 */ 518 public void setPreviousUnitValueDate(Date previousUnitValueDate) { 519 this.previousUnitValueDate = previousUnitValueDate; 520 } 521 522 /** 523 * This method gets the unitValueSource. 524 * 525 * @return unitValueSource 526 */ 527 public String getUnitValueSource() { 528 return unitValueSource; 529 } 530 531 /** 532 * This method sets the unitValueSource. 533 * 534 * @param unitValueSource 535 */ 536 public void setUnitValueSource(String unitValueSource) { 537 this.unitValueSource = unitValueSource; 538 } 539 540 /** 541 * This method gets the classCode. 542 * 543 * @return classCode 544 */ 545 public ClassCode getClassCode() { 546 return classCode; 547 } 548 549 /** 550 * This method sets the classCode. 551 * 552 * @param classCode 553 */ 554 public void setClassCode(ClassCode classCode) { 555 this.classCode = classCode; 556 } 557 558 /** 559 * This method gets the securityClassCode 560 * 561 * @return securityClassCode 562 */ 563 public String getSecurityClassCode() { 564 return securityClassCode; 565 } 566 567 /** 568 * This method sets the securityClassCode. 569 * 570 * @param securityClassCode 571 */ 572 public void setSecurityClassCode(String securityClassCode) { 573 this.securityClassCode = securityClassCode; 574 } 575 576 /** 577 * This method returns the frequencyCode. 578 * 579 * @return frequencyCode 580 */ 581 public FrequencyCode getFrequencyCode() { 582 return frequencyCode; 583 } 584 585 /** 586 * This method sets the frequencyCode. 587 * 588 * @param frequencyCode 589 */ 590 public void setFrequencyCode(FrequencyCode frequencyCode) { 591 this.frequencyCode = frequencyCode; 592 } 593 594 /** 595 * This method gets the subclassCode. 596 * 597 * @return subclassCode 598 */ 599 public SubclassCode getSubclassCode() { 600 return subclassCode; 601 } 602 603 /** 604 * This method sets the subclassCode. 605 * 606 * @param subclassCode 607 */ 608 public void setSubclassCode(SubclassCode subclassCode) { 609 this.subclassCode = subclassCode; 610 } 611 612 /** 613 * This method gets the user entered security ID prefix (first 8 characters). 614 * 615 * @return 616 */ 617 public String getUserEnteredSecurityIDprefix() { 618 return userEnteredSecurityIDprefix; 619 } 620 621 /** 622 * This method sets the user entered security ID prefix. 623 * 624 * @param userEnteredSecurityIDprefix 625 */ 626 public void setUserEnteredSecurityIDprefix(String userEnteredSecurityIDprefix) { 627 this.userEnteredSecurityIDprefix = userEnteredSecurityIDprefix; 628 } 629 630 /** 631 * This method gets the market value of the security. 632 * 633 * @return marketValue 634 */ 635 public BigDecimal getMarketValue() { 636 return marketValue; 637 } 638 639 /** 640 * This method sete the marketValue for the security. 641 * 642 * @param marketValue 643 */ 644 public void setMarketValue(BigDecimal marketValue) { 645 646 if (marketValue != null) { 647 this.marketValue = marketValue.setScale(EndowConstants.Scale.SECURITY_MARKET_VALUE, BigDecimal.ROUND_HALF_UP); 648 } 649 else { 650 this.marketValue = marketValue; 651 } 652 } 653 654 /** 655 * @see org.kuali.rice.kns.bo.PersistableBusinessObjectBase#afterLookup(org.apache.ojb.broker.PersistenceBroker) 656 */ 657 @Override 658 public void afterLookup(PersistenceBroker persistenceBroker) throws PersistenceBrokerException { 659 660 super.afterLookup(persistenceBroker); 661 662 KEMService kemService = SpringContext.getBean(KEMService.class); 663 664 // after a lookup is performed for Securities the market values is computed for display and the UserEnteredSecurityIDprefix 665 // is retrieved and set so that we don't get a required field error 666 String securityID = this.getId(); 667 BigDecimal marketValue = kemService.getMarketValue(this.id); 668 669 this.setMarketValue(marketValue); 670 // set user entered security ID prefix based on the security ID so that we don't get a required field error. 671 this.setUserEnteredSecurityIDprefix(securityID.substring(0, securityID.length() - 1)); 672 673 } 674 675 /** 676 * Gets the nextFiscalYearDistributionAmount. 677 * 678 * @return nextFiscalYearDistributionAmount 679 */ 680 public BigDecimal getNextFiscalYearDistributionAmount() { 681 return nextFiscalYearDistributionAmount; 682 } 683 684 /** 685 * Sets the nextFiscalYearDistributionAmount. 686 * 687 * @param nextFiscalYearDistributionAmount 688 */ 689 public void setNextFiscalYearDistributionAmount(BigDecimal nextFiscalYearDistributionAmount) { 690 this.nextFiscalYearDistributionAmount = nextFiscalYearDistributionAmount; 691 } 692 693 /** 694 * Gets the CurrentHolders link text 695 * 696 * @return the text to be displayed for the current holders link. 697 */ 698 public String getCurrentHolders() { 699 return EndowConstants.LOOKUP_LINK; 700 } 701 702 /** 703 * Gets the HoldersInHistory link text 704 * 705 * @return the text to be displayed for the holders in history link. 706 */ 707 public String getHoldersInHistory() { 708 return EndowConstants.LOOKUP_LINK; 709 } 710 711 public String getSecurityIdDescription() { 712 String securityID = getId() != null ? getId() : ""; 713 String description = getDescription() != null ? getDescription() : ""; 714 String securityIdLabel = securityID + " - " + description; 715 return securityIdLabel; 716 } 717 718 /** 719 * Gets the codeAndDescription text 720 * 721 * @return the code and description in the form: xx-xxxxxxxxxx 722 */ 723 public String getCodeAndDescription() { 724 if (StringUtils.isEmpty(this.getId())) { 725 return KFSConstants.EMPTY_STRING; 726 } 727 return this.getId() + "-" + this.getDescription(); 728 } 729 730 /** 731 * Gets the active ticklers for this Security. 732 * 733 * @return ticklers 734 */ 735 public List<Tickler> getTicklers() { 736 return SpringContext.getBean(TicklerService.class).getSecurityActiveTicklers(this.id); 737 } 738 739 /** 740 * Sets the ticklers. 741 * 742 * @param ticklers 743 */ 744 public void setTicklers(List<Tickler> ticklers) { 745 this.ticklers = ticklers; 746 } 747 748 /** 749 * Gets the securityValueByMarket. 750 * 751 * @return securityValueByMarket 752 */ 753 public BigDecimal getSecurityValueByMarket() { 754 return securityValueByMarket; 755 } 756 757 /** 758 * Sets the securityValueByMarket. 759 * 760 * @param securityValueByMarket 761 */ 762 public void setSecurityValueByMarket(BigDecimal securityValueByMarket) { 763 this.securityValueByMarket = securityValueByMarket; 764 } 765 766 }