View Javadoc
1   /*
2    *  jDTAUS Banking API
3    *  Copyright (C) 2005 Christian Schulte
4    *  <cs@schulte.it>
5    *
6    *  This library is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public
8    *  License as published by the Free Software Foundation; either
9    *  version 2.1 of the License, or any later version.
10   *
11   *  This library is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this library; if not, write to the Free Software
18   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19   *
20   */
21  package org.jdtaus.banking.dtaus;
22  
23  import java.io.Serializable;
24  import java.math.BigInteger;
25  import java.util.Arrays;
26  import java.util.Currency;
27  import org.jdtaus.banking.AlphaNumericText27;
28  import org.jdtaus.banking.Bankleitzahl;
29  import org.jdtaus.banking.Kontonummer;
30  import org.jdtaus.banking.Referenznummer11;
31  import org.jdtaus.banking.Textschluessel;
32  
33  /**
34   * "C" record.
35   *
36   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
37   * @version $JDTAUS: Transaction.java 8799 2012-12-03 18:52:42Z schulte $
38   */
39  public class Transaction implements Cloneable, Serializable
40  {
41  
42      /** Constant for the name of property {@code type}. */
43      public static final String PROP_TYPE = "org.jdtaus.banking.dtaus.Transaction.PROP_TYPE";
44  
45      /** Constant for the name of property {@code amount}. */
46      public static final String PROP_AMOUNT = "org.jdtaus.banking.dtaus.Transaction.PROP_AMOUNT";
47  
48      /** Constant for the name of property {@code reference}. */
49      public static final String PROP_REFERENCE = "org.jdtaus.banking.dtaus.Transaction.PROP_REFERENCE";
50  
51      /** Constant for the name of property {@code descriptions}. */
52      public static final String PROP_DESCRIPTIONS = "org.jdtaus.banking.dtaus.Transaction.PROP_DESCRIPTIONS";
53  
54      /** Constant for the name of property {@code primaryBank}. */
55      public static final String PROP_PRIMARYBANK = "org.jdtaus.banking.dtaus.Transaction.PROP_PRIMARYBANK";
56  
57      /** Constant for the name of property {@code executiveAccount}. */
58      public static final String PROP_EXECUTIVEACCOUNT = "org.jdtaus.banking.dtaus.Transaction.PROP_EXECUTIVEACCOUNT";
59  
60      /** Constant for the name of property {@code executiveBank}. */
61      public static final String PROP_EXECUTIVEBANK = "org.jdtaus.banking.dtaus.Transaction.PROP_EXECUTIVEBANK";
62  
63      /** Constant for the name of property {@code executiveName}. */
64      public static final String PROP_EXECUTIVENAME = "org.jdtaus.banking.dtaus.Transaction.PROP_EXECUTIVENAME";
65  
66      /** Constant for the name of property {@code executiveExt}. */
67      public static final String PROP_EXECUTIVEEXT = "org.jdtaus.banking.dtaus.Transaction.PROP_EXECUTIVEEXT";
68  
69      /** Constant for the name of property {@code targetAccount}. */
70      public static final String PROP_TARGETACCOUNT = "org.jdtaus.banking.dtaus.Transaction.PROP_TARGETACCOUNT";
71  
72      /** Constant for the name of property {@code targetBank}. */
73      public static final String PROP_TARGETBANK = "org.jdtaus.banking.dtaus.Transaction.PROP_TARGETBANK";
74  
75      /** Constant for the name of property {@code targetName}. */
76      public static final String PROP_TARGETNAME = "org.jdtaus.banking.dtaus.Transaction.PROP_TARGETNAME";
77  
78      /** Constant for the name of property {@code targetExt}. */
79      public static final String PROP_TARGETEXT = "org.jdtaus.banking.dtaus.Transaction.PROP_TARGETEXT";
80  
81      /** Constant for the name of property {@code currency}. */
82      public static final String PROP_CURRENCY = "org.jdtaus.banking.dtaus.Transaction.PROP_CURRENCY";
83  
84      /** Serial version UID for backwards compatibility with 1.0.x classes. */
85      private static final long serialVersionUID = 1450133285078489771L;
86  
87      /**
88       * Payment type.
89       * @serial
90       */
91      private Textschluessel type;
92  
93      /**
94       * Amount of money to transfer.
95       * @serial
96       */
97      private BigInteger amount;
98  
99      /**
100      * The currency of the transaction.
101      * @serial
102      */
103     private Currency currency;
104 
105     /**
106      * Reference number of the transaction.
107      * @serial
108      */
109     private Referenznummer11 reference;
110 
111     /**
112      * Descriptions of the transaction.
113      * @serial
114      */
115     private AlphaNumericText27[] descriptions;
116 
117     /**
118      * Code of the primary participating bank.
119      * @serial
120      */
121     private Bankleitzahl primaryBank;
122 
123     /**
124      * Ordering bank account.
125      * @serial
126      */
127     private Kontonummer executiveAccount;
128 
129     /**
130      * Ordering bank.
131      * @serial
132      */
133     private Bankleitzahl executiveBank;
134 
135     /**
136      * Ordering customer.
137      * @serial
138      */
139     private AlphaNumericText27 executiveName;
140 
141     /**
142      * Extension to property {@code executiveName}.
143      * @serial
144      */
145     private AlphaNumericText27 executiveExt;
146 
147     /**
148      * Bank account of the debitor/creditor depending on the transaction's type.
149      * @serial
150      */
151     private Kontonummer targetAccount;
152 
153     /**
154      * Bank of the debitor/creditor depending on the transaction's type.
155      * @serial
156      */
157     private Bankleitzahl targetBank;
158 
159     /**
160      * Debitor/creditor name depending on the transaction's type.
161      * @serial
162      */
163     private AlphaNumericText27 targetName;
164 
165     /**
166      * Extension to property {@code targetName}.
167      * @serial
168      */
169     private AlphaNumericText27 targetExt;
170 
171     /** Cached hash code. */
172     private transient int hashCode = NO_HASHCODE;
173     private static final int NO_HASHCODE = Integer.MIN_VALUE;
174 
175     /** Creates a new {@code Transaction} instance. */
176     public Transaction()
177     {
178         super();
179     }
180 
181     /**
182      * Getter for property {@code type}.
183      *
184      * @return Payment type of the transaction.
185      */
186     public Textschluessel getType()
187     {
188         return this.type;
189     }
190 
191     /**
192      * Setter for property {@code type}.
193      *
194      * @param value Payment type of the transaction.
195      */
196     public void setType( final Textschluessel value )
197     {
198         this.type = value;
199         this.hashCode = NO_HASHCODE;
200     }
201 
202     /**
203      * Getter for property {@code amount}.
204      *
205      * @return Amount of money to transfer in the smallest unit of the currency (&euro; = Cent).
206      */
207     public BigInteger getAmount()
208     {
209         return this.amount;
210     }
211 
212     /**
213      * Setter for property {@code amount}.
214      *
215      * @param value The amount of money to transfer in the smallest unit of the currency (&euro; = Cent).
216      */
217     public void setAmount( final BigInteger value )
218     {
219         this.amount = value;
220         this.hashCode = NO_HASHCODE;
221     }
222 
223     /**
224      * Getter for property {@code currency}.
225      *
226      * @return Currency of the transaction.
227      */
228     public Currency getCurrency()
229     {
230         return this.currency;
231     }
232 
233     /**
234      * Setter for property {@code currency}.
235      *
236      * @param value Currency of the transaction.
237      */
238     public void setCurrency( final Currency value )
239     {
240         this.currency = value;
241         this.hashCode = NO_HASHCODE;
242     }
243 
244     /**
245      * Getter for property {@code reference}.
246      *
247      * @return Reference number of the transaction or {@code null}.
248      */
249     public Referenznummer11 getReference()
250     {
251         return this.reference;
252     }
253 
254     /**
255      * Setter for property {@code reference}.
256      *
257      * @param value Reference number of the transaction or {@code null}.
258      */
259     public void setReference( final Referenznummer11 value )
260     {
261         this.reference = value;
262         this.hashCode = NO_HASHCODE;
263     }
264 
265     /**
266      * Gets all descriptions of the transaction.
267      *
268      * @return All descriptions of the transaction or an empty array if the transaction does not hold any description.
269      */
270     public AlphaNumericText27[] getDescriptions()
271     {
272         if ( this.descriptions == null )
273         {
274             this.descriptions = new AlphaNumericText27[ 0 ];
275             this.hashCode = NO_HASHCODE;
276         }
277 
278         return (AlphaNumericText27[]) this.descriptions.clone();
279     }
280 
281     /**
282      * Sets all descriptions of the transaction.
283      *
284      * @param value All descriptions of the transaction or {@code null}.
285      */
286     public void setDescriptions( final AlphaNumericText27[] value )
287     {
288         this.descriptions = value != null ? (AlphaNumericText27[]) value.clone() : null;
289         this.hashCode = NO_HASHCODE;
290     }
291 
292     /**
293      * Getter for property {@code primaryBank}.
294      *
295      * @return Code of the primary participating bank or {@code null}.
296      */
297     public Bankleitzahl getPrimaryBank()
298     {
299         return this.primaryBank;
300     }
301 
302     /**
303      * Setter for property {@code primaryBank}.
304      *
305      * @param value Code of the primary participating bank or {@code null}.
306      */
307     public void setPrimaryBank( final Bankleitzahl value )
308     {
309         this.primaryBank = value;
310         this.hashCode = NO_HASHCODE;
311     }
312 
313     /**
314      * Getter for property {@code executiveAccount}.
315      *
316      * @return Bank account of the orderer requesting the transaction.
317      */
318     public Kontonummer getExecutiveAccount()
319     {
320         return this.executiveAccount;
321     }
322 
323     /**
324      * Setter for property {@code executiveAccount}.
325      *
326      * @param value Bank account of the orderer requesting the transaction.
327      */
328     public void setExecutiveAccount( final Kontonummer value )
329     {
330         this.executiveAccount = value;
331         this.hashCode = NO_HASHCODE;
332     }
333 
334     /**
335      * Getter for property {@code executiveBank}.
336      *
337      * @return Ordering bank requesting the transaction.
338      */
339     public Bankleitzahl getExecutiveBank()
340     {
341         return this.executiveBank;
342     }
343 
344     /**
345      * Setter for property {@code executiveBank}.
346      *
347      * @param value Ordering bank requesting the transaction.
348      */
349     public void setExecutiveBank( final Bankleitzahl value )
350     {
351         this.executiveBank = value;
352         this.hashCode = NO_HASHCODE;
353     }
354 
355     /**
356      * Getter for property {@code executiveName}.
357      *
358      * @return Ordering customer requesting the transaction.
359      */
360     public AlphaNumericText27 getExecutiveName()
361     {
362         return this.executiveName;
363     }
364 
365     /**
366      * Setter for property {@code executiveName}.
367      *
368      * @param value Ordering customer requesting the transaction.
369      */
370     public void setExecutiveName( final AlphaNumericText27 value )
371     {
372         this.executiveName = value;
373         this.hashCode = NO_HASHCODE;
374     }
375 
376     /**
377      * Getter for property {@code executiveExt}.
378      *
379      * @return Additional data extending the executive name or {@code null}.
380      */
381     public AlphaNumericText27 getExecutiveExt()
382     {
383         return this.executiveExt;
384     }
385 
386     /**
387      * Setter for property {@code executiveExt}.
388      *
389      * @param value Additional data extending the executive name or {@code null}.
390      */
391     public void setExecutiveExt( final AlphaNumericText27 value )
392     {
393         this.executiveExt = value;
394         this.hashCode = NO_HASHCODE;
395     }
396 
397     /**
398      * Getter for property {@code targetAccount}.
399      *
400      * @return Bank account of the debitor/creditor depending on the transaction's type.
401      */
402     public Kontonummer getTargetAccount()
403     {
404         return this.targetAccount;
405     }
406 
407     /**
408      * Setter for property {@code targetAccount}.
409      *
410      * @param value Bank account of the debitor/creditor depending on the transaction's type.
411      */
412     public void setTargetAccount( final Kontonummer value )
413     {
414         this.targetAccount = value;
415         this.hashCode = NO_HASHCODE;
416     }
417 
418     /**
419      * Getter for property {@code targetBank}.
420      *
421      * @return Bank of the debitor/creditor depending on the transaction's type.
422      */
423     public Bankleitzahl getTargetBank()
424     {
425         return this.targetBank;
426     }
427 
428     /**
429      * Setter for property {@code targetBank}.
430      *
431      * @param value Bank of the debitor/creditor depending on the transaction's type.
432      */
433     public void setTargetBank( final Bankleitzahl value )
434     {
435         this.targetBank = value;
436         this.hashCode = NO_HASHCODE;
437     }
438 
439     /**
440      * Getter for property {@code targetName}.
441      *
442      * @return Debitor/creditor depending on the transaction's type.
443      */
444     public AlphaNumericText27 getTargetName()
445     {
446         return this.targetName;
447     }
448 
449     /**
450      * Setter for property {@code targetName}.
451      *
452      * @param value Debitor/creditor depending on the transaction's type.
453      */
454     public void setTargetName( final AlphaNumericText27 value )
455     {
456         this.targetName = value;
457         this.hashCode = NO_HASHCODE;
458     }
459 
460     /**
461      * Getter for property {@code targetExt}.
462      *
463      * @return Additional data extending the target name or {@code null}.
464      */
465     public AlphaNumericText27 getTargetExt()
466     {
467         return this.targetExt;
468     }
469 
470     /**
471      * Setter for property {@code targetExt}.
472      *
473      * @param value Additional data extending the target name or {@code null}.
474      */
475     public void setTargetExt( final AlphaNumericText27 value )
476     {
477         this.targetExt = value;
478         this.hashCode = NO_HASHCODE;
479     }
480 
481     /**
482      * Indicates whether some other object is equal to this one by comparing the values of all properties.
483      *
484      * @param o The reference object with which to compare.
485      *
486      * @return {@code true} if this object is the same as {@code o}; {@code false} otherwise.
487      */
488     public boolean equals( final Object o )
489     {
490         boolean equal = this == o;
491 
492         if ( !equal && o instanceof Transaction )
493         {
494             final Transaction that = (Transaction) o;
495             equal = ( this.getAmount() == null
496                       ? that.getAmount() == null : this.getAmount().equals( that.getAmount() ) ) &&
497                     ( this.getCurrency() == null
498                       ? that.getCurrency() == null : this.getCurrency().equals( that.getCurrency() ) ) &&
499                     ( this.getExecutiveAccount() == null
500                       ? that.getExecutiveAccount() == null
501                       : this.getExecutiveAccount().equals( that.getExecutiveAccount() ) ) &&
502                     ( this.getExecutiveBank() == null
503                       ? that.getExecutiveBank() == null : this.getExecutiveBank().equals( that.getExecutiveBank() ) ) &&
504                     ( this.getExecutiveName() == null
505                       ? that.getExecutiveName() == null : this.getExecutiveName().equals( that.getExecutiveName() ) ) &&
506                     ( this.getExecutiveExt() == null
507                       ? that.getExecutiveExt() == null : this.getExecutiveExt().equals( that.getExecutiveExt() ) ) &&
508                     ( this.getPrimaryBank() == null
509                       ? that.getPrimaryBank() == null : this.getPrimaryBank().equals( that.getPrimaryBank() ) ) &&
510                     ( this.getReference() == null
511                       ? that.getReference() == null : this.getReference().equals( that.getReference() ) ) &&
512                     ( this.getTargetAccount() == null
513                       ? that.getTargetAccount() == null : this.getTargetAccount().equals( that.getTargetAccount() ) ) &&
514                     ( this.getTargetBank() == null
515                       ? that.getTargetBank() == null : this.getTargetBank().equals( that.getTargetBank() ) ) &&
516                     ( this.getTargetName() == null
517                       ? that.getTargetName() == null : this.getTargetName().equals( that.getTargetName() ) ) &&
518                     ( this.getTargetExt() == null
519                       ? that.getTargetExt() == null : this.getTargetExt().equals( that.getTargetExt() ) ) &&
520                     ( this.getType() == null
521                       ? that.getType() == null : this.getType().equals( that.getType() ) );
522 
523             if ( equal )
524             {
525                 if ( this.getDescriptions() == null || this.getDescriptions().length == 0 )
526                 {
527                     equal = that.getDescriptions() == null || that.getDescriptions().length == 0;
528                 }
529                 else
530                 {
531                     equal = that.getDescriptions() != null && that.getDescriptions().length != 0
532                             ? Arrays.equals( this.getDescriptions(), that.getDescriptions() ) : false;
533 
534                 }
535             }
536         }
537 
538         return equal;
539     }
540 
541     /**
542      * Returns a hash code value for this object.
543      *
544      * @return A hash code value for this object.
545      */
546     public int hashCode()
547     {
548         if ( this.hashCode == NO_HASHCODE )
549         {
550             int hc = 23;
551             hc = 37 * hc + ( this.amount == null ? 0 : this.amount.hashCode() );
552             hc = 37 * hc + ( this.currency == null ? 0 : this.currency.hashCode() );
553             hc = 37 * hc + ( this.executiveAccount == null ? 0 : this.executiveAccount.hashCode() );
554             hc = 37 * hc + ( this.executiveBank == null ? 0 : this.executiveBank.hashCode() );
555             hc = 37 * hc + ( this.executiveExt == null ? 0 : this.executiveExt.hashCode() );
556             hc = 37 * hc + ( this.executiveName == null ? 0 : this.executiveName.hashCode() );
557             hc = 37 * hc + ( this.primaryBank == null ? 0 : this.primaryBank.hashCode() );
558             hc = 37 * hc + ( this.reference == null ? 0 : this.reference.hashCode() );
559             hc = 37 * hc + ( this.targetAccount == null ? 0 : this.targetAccount.hashCode() );
560             hc = 37 * hc + ( this.targetBank == null ? 0 : this.targetBank.hashCode() );
561             hc = 37 * hc + ( this.targetExt == null ? 0 : this.targetExt.hashCode() );
562             hc = 37 * hc + ( this.targetName == null ? 0 : this.targetName.hashCode() );
563             hc = 37 * hc + ( this.type == null ? 0 : this.type.hashCode() );
564 
565             if ( this.descriptions == null || this.descriptions.length == 0 )
566             {
567                 hc = 37 * hc;
568             }
569             else
570             {
571                 for ( int i = this.descriptions.length - 1; i >= 0; i-- )
572                 {
573                     hc = 37 * hc + this.descriptions[i].hashCode();
574                 }
575             }
576 
577             this.hashCode = hc;
578         }
579 
580         return this.hashCode;
581     }
582 
583     /**
584      * Creates and returns a copy of this object.
585      *
586      * @return A clone of this instance.
587      */
588     public Object clone()
589     {
590         try
591         {
592             return super.clone();
593         }
594         catch ( final CloneNotSupportedException e )
595         {
596             throw new AssertionError( e );
597         }
598     }
599 
600     /**
601      * Returns a string representation of the object.
602      *
603      * @return A string representation of the object.
604      */
605     public String toString()
606     {
607         return super.toString() + this.internalString();
608     }
609 
610     /**
611      * Creates a string representing the properties of the instance.
612      *
613      * @return A string representing the properties of the instance.
614      */
615     private String internalString()
616     {
617         return new StringBuffer( 300 ).append( '{' ).
618             append( "amount=" ).append( this.amount ).
619             append( ", currency=" ).append( this.currency ).
620             append( ", descriptions=" ).append( toString( this.descriptions ) ).
621             append( ", executiveAccount=" ).append( this.executiveAccount ).
622             append( ", executiveBank=" ).append( this.executiveBank ).
623             append( ", executiveName=" ).append( (Object) this.executiveName ).
624             append( ", executiveExt=" ).append( (Object) this.executiveExt ).
625             append( ", primaryBank=" ).append( this.primaryBank ).
626             append( ", reference=" ).append( this.reference ).
627             append( ", targetAccount=" ).append( this.targetAccount ).
628             append( ", targetBank=" ).append( this.targetBank ).
629             append( ", targetName=" ).append( (Object) this.targetName ).
630             append( ", targetExt=" ).append( (Object) this.targetExt ).
631             append( ", type=" ).append( this.type ).
632             append( '}' ).toString();
633 
634     }
635 
636     private static String toString( final AlphaNumericText27[] texts )
637     {
638         String string = null;
639 
640         if ( texts != null )
641         {
642             final StringBuffer stringBuilder =
643                 new StringBuffer( texts.length * AlphaNumericText27.MAX_LENGTH + texts.length * 2 + 2 );
644 
645             stringBuilder.append( '[' );
646 
647             for ( int i = 0, max = texts.length - 1; i < max; i++ )
648             {
649                 texts[i].format( stringBuilder );
650 
651                 if ( i < max )
652                 {
653                     stringBuilder.append( ", " );
654                 }
655             }
656 
657             string = stringBuilder.append( ']' ).toString();
658         }
659 
660         return string;
661     }
662 
663 }