84b331f86b8245a835aabb4ccbaa727ac094b6e4
[aquarium] / src / main / scala / gr / grnet / aquarium / charging / wallet / WalletEntry.scala
1 /*
2  * Copyright 2011-2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35
36 package gr.grnet.aquarium.charging
37 package wallet
38
39 import gr.grnet.aquarium.util.date.MutableDateCalc
40 import gr.grnet.aquarium.logic.accounting.dsl.{Timeslot}
41 import gr.grnet.aquarium.converter.{JsonTextFormat, StdConverters}
42 import gr.grnet.aquarium.policy.ResourceType
43 import gr.grnet.aquarium.event.model.resource.ResourceEventModel
44 import gr.grnet.aquarium.util.json.JsonSupport
45
46 /**
47  * The following equation must hold: `newTotalCredits = oldTotalCredits - sumOfCreditsToSubtract`.
48  *
49  * @param userID The user ID this wallet entry is related to.
50  * @param sumOfCreditsToSubtract The credit amount generated for this wallet entry.
51  * @param oldTotalCredits
52  * @param newTotalCredits
53  * @param whenComputedMillis When the computation took place
54  * @param billingYear
55  * @param billingMonth
56  * @param resourceEvents
57  * @param chargeslots The details of the credit computation
58  * @param resourceType
59  *
60  * @author Christos KK Loverdos <loverdos@gmail.com>
61  */
62 case class WalletEntry(
63     userID: String,
64     sumOfCreditsToSubtract: Double,
65     oldTotalCredits: Double,
66     newTotalCredits: Double,
67     whenComputedMillis: Long,
68     referenceTimeslot: Timeslot,
69     billingYear: Int,
70     billingMonth: Int,
71     chargeslots: List[Chargeslot],
72     resourceEvents: List[ResourceEventModel], // current is the last one
73     resourceType: ResourceType,
74     isSynthetic: Boolean
75 ) extends JsonSupport {
76
77   def currentResourceEvent = resourceEvents match {
78     case previous :: current :: Nil ⇒
79       current
80
81     case list ⇒
82       list.head
83   }
84
85   def resource = currentResourceEvent.safeResource
86
87   def instanceID = currentResourceEvent.safeInstanceID
88
89   def chargslotCount = chargeslots.length
90
91   def isOutOfSync = currentResourceEvent.isOutOfSyncForBillingMonth(billingYear, billingMonth)
92
93   def toDebugString = "%s%s(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)".format(
94     if(isSynthetic) "*" else "",
95     gr.grnet.aquarium.util.shortClassNameOf(this),
96     userID,
97     referenceTimeslot,
98     sumOfCreditsToSubtract,
99     oldTotalCredits,
100     newTotalCredits,
101     new MutableDateCalc(whenComputedMillis).toYYYYMMDDHHMMSSSSS,
102     billingYear,
103     billingMonth,
104     resourceEvents,
105     chargeslots,
106     resourceType
107   )
108 }
109
110 object WalletEntry {
111   def fromJson(json: String): WalletEntry = {
112     StdConverters.AllConverters.convertEx[WalletEntry](JsonTextFormat(json))
113   }
114
115   object JsonNames {
116     final val id = "id"
117     final val sumOfCreditsToSubtract = "sumOfCreditsToSubtract"
118     final val oldTotalCredits = "oldTotalCredits"
119     final val newTotalCredits = "newTotalCredits"
120     final val whenComputedMillis = "whenComputedMillis"
121     final val yearOfBillingMonth = "yearOfBillingMonth"
122     final val billingMonth = "billingMonth"
123     final val currentResourceEvent = "currentResourceEvent"
124     final val previousResourceEvent = "previousResourceEvent"
125     final val chargeslots = "chargeslots"
126     final val resourceDef = "resourceDef"
127   }
128
129 }