001: /*
002: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package org.mandarax.examples.crm.domainmodel;
019:
020: /**
021: * Discount. A discount can be given in percent (relative
022: * discount) or in $ (absolute discount).
023: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
024: * @version 3.4 <7 March 05>
025: * @since 1.2
026: */
027: public class Discount extends BusinessObject {
028:
029: private double rate = 0;
030: private boolean relative = true;
031:
032: /**
033: * Constructor. The discount will be relative (a percentage).
034: */
035: public Discount() {
036: super ();
037: }
038:
039: /**
040: * Constructor. The discount will be relative (a percentage)
041: * @param d the discount
042: */
043: public Discount(double d) {
044: super ();
045:
046: rate = d;
047: }
048:
049: /**
050: * Constructor. The discount will be relative (a percentage)
051: * @param d the discount
052: * @param rel - if true, the discount will be relative (a percentage),
053: * if false, the discount will be absolute (an amount of US $)
054: */
055: public Discount(double d, boolean rel) {
056: super ();
057:
058: rate = d;
059: relative = rel;
060: }
061:
062: /**
063: * Apply the discount to an amount.
064: * @return the final amount (-discount)
065: * @param amount an amount
066: */
067: public double apply(double amount) {
068: if (relative) {
069: return (100 - rate) * amount / 100;
070: } else {
071: return Math.max(0, amount - rate);
072: }
073: }
074:
075: /**
076: * Get the rate.
077: * @return the discount rate (either an absolute amount or a percentage value)
078: */
079: public double getRate() {
080: return rate;
081: }
082:
083: /**
084: * Indicates whether the discount is relative.
085: * @return true if the discount is a percentage, false otherwise (= if it is an absolute amount)
086: */
087: public boolean isRelative() {
088: return relative;
089: }
090:
091: /**
092: * Set the rate.
093: * @param r a value
094: */
095: public void setRate(double r) {
096: rate = r;
097: }
098:
099: /**
100: * Set the relative property.
101: * @param flag true if this should be a percentage value, false otherwise
102: */
103: public void setRelative(boolean flag) {
104: relative = flag;
105: }
106:
107: /**
108: * Convert the object to a string.
109: */
110: public String toString() {
111: return String.valueOf(rate) + (relative ? "%" : "$");
112: }
113:
114: /**
115: * Compares objects.
116: * @return boolean
117: * @param obj java.lang.Object
118: */
119: public boolean equals(Object obj) {
120: return obj != null && (obj instanceof Discount)
121: && ((Discount) obj).relative == relative
122: && ((Discount) obj).rate == rate;
123: }
124:
125: /**
126: * Get the hash code of the object.
127: * @return int
128: */
129: public int hashCode() {
130: return (int) rate;
131: }
132: }
|