Better handling of billing month info
authorChristos KK Loverdos <loverdos@gmail.com>
Thu, 19 Jul 2012 18:51:34 +0000 (21:51 +0300)
committerChristos KK Loverdos <loverdos@gmail.com>
Thu, 19 Jul 2012 18:51:34 +0000 (21:51 +0300)
src/main/scala/gr/grnet/aquarium/charging/ChargingService.scala
src/main/scala/gr/grnet/aquarium/charging/state/StdUserState.scala
src/main/scala/gr/grnet/aquarium/charging/state/UserStateModel.scala
src/main/scala/gr/grnet/aquarium/charging/state/WorkingUserState.scala
src/main/scala/gr/grnet/aquarium/store/memory/MemStoreProvider.scala
src/main/scala/gr/grnet/aquarium/store/mongodb/MongoDBStore.scala
src/main/scala/gr/grnet/aquarium/store/mongodb/MongoDBUserState.scala

index 7491669..febed87 100644 (file)
@@ -97,7 +97,12 @@ final class ChargingService extends AquariumAwareSkeleton with Lifecycle with Lo
 
       val newChargingReason = MonthlyBillChargingReason(chargingReason, billingMonthInfo)
       workingUserState.chargingReason = newChargingReason
-      val monthlyUserState0 = workingUserState.toUserState(Some(billingMonthInfo), None)
+      val monthlyUserState0 = workingUserState.toUserState(
+        true,
+        billingMonthInfo.year,
+        billingMonthInfo.month,
+        None
+      )
 
       // We always save the state when it is a full month billing
       val monthlyUserState1 = userStateRecorder.apply(monthlyUserState0)
index 990c446..c7258de 100644 (file)
@@ -37,11 +37,11 @@ package gr.grnet.aquarium.charging.state
 
 import scala.collection.mutable
 import gr.grnet.aquarium.policy.{ResourceType, UserAgreementModel}
-import gr.grnet.aquarium.computation.BillingMonthInfo
 import gr.grnet.aquarium.event.model.resource.ResourceEventModel
 import gr.grnet.aquarium.charging.wallet.WalletEntry
 import gr.grnet.aquarium.charging.reason.{InitialUserStateSetup, ChargingReason}
 import gr.grnet.aquarium.AquariumInternalError
+import gr.grnet.aquarium.computation.BillingMonthInfo
 
 /**
  *
@@ -54,7 +54,9 @@ final case class StdUserState(
     userID: String,
     occurredMillis: Long,
     totalCredits: Double,
-    theFullBillingMonth: Option[BillingMonthInfo],
+    isFullBillingMonth: Boolean,
+    billingYear: Int,
+    billingMonth: Int,
     chargingReason: ChargingReason,
     previousResourceEvents: List[ResourceEventModel],
     implicitlyIssuedStartEvents: List[ResourceEventModel],
@@ -164,13 +166,17 @@ final object StdUserState {
       chargingReason: ChargingReason = InitialUserStateSetup(None)
   ): StdUserState = {
 
+    val bmi = BillingMonthInfo.fromMillis(occurredMillis)
+
     StdUserState(
       "",
       None,
       userID,
       userCreationMillis,
       totalCredits,
-      None,
+      false,
+      bmi.year,
+      bmi.month,
       chargingReason,
       Nil,
       Nil,
index a5c40fc..baf355e 100644 (file)
@@ -60,7 +60,14 @@ trait UserStateModel extends JsonSupport {
 
   def totalCredits: Double
 
-  def theFullBillingMonth: Option[BillingMonthInfo]
+  /**
+   * True iff this user state represents a full billing month.
+   */
+  def isFullBillingMonth: Boolean
+
+  def billingYear: Int
+
+  def billingMonth: Int
 
   def chargingReason: ChargingReason
 
@@ -87,8 +94,9 @@ object UserStateModel {
   trait NamesT {
     final val userID = "userID"
     final val occurredMillis = "occurredMillis"
-    final val theFullBillingMonth_year = "theFullBillingMonth.year"
-    final val theFullBillingMonth_month = "theFullBillingMonth.month"
+    final val isFullBillingMonth = "isFullBillingMonth"
+    final val billingYear = "billingYear"
+    final val billingMonth = "billingMonth"
   }
 
   object Names extends NamesT
index 90d8083..9c8745f 100644 (file)
@@ -108,14 +108,21 @@ final class WorkingUserState(
     this.workingAgreementHistory.toAgreementHistory
   }
 
-  def toUserState(theFullBillingMonth: Option[BillingMonthInfo], idOpt: Option[String]) = {
+  def toUserState(
+      isFullBillingMonth: Boolean,
+      billingYear: Int,
+      billingMonth: Int,
+      idOpt: Option[String]
+   ) = {
     new StdUserState(
       idOpt.getOrElse(""),
       this.parentUserStateIDInStore,
       this.userID,
       this.occurredMillis,
       this.totalCredits,
-      theFullBillingMonth,
+      isFullBillingMonth,
+      billingYear,
+      billingMonth,
       this.chargingReason,
       immutablePreviousResourceEvents,
       immutableImplicitlyIssuedStartEvents,
index afecad9..5dac55e 100644 (file)
@@ -124,7 +124,9 @@ extends StoreProvider
         model.userID,
         model.occurredMillis,
         model.totalCredits,
-        model.theFullBillingMonth,
+        model.isFullBillingMonth,
+        model.billingYear,
+        model.billingMonth,
         model.chargingReason,
         model.previousResourceEvents,
         model.implicitlyIssuedStartEvents,
@@ -148,12 +150,11 @@ extends StoreProvider
   }
 
   def findLatestUserStateForFullMonthBilling(userID: String, bmi: BillingMonthInfo): Option[UserState] = {
-    val goodOnes = _userStates.filter(_.theFullBillingMonth.isDefined).filter { userState ⇒
-      userState.userID == userID && {
-        userState.theFullBillingMonth.isDefined && {
-          userState.theFullBillingMonth.get == bmi
-        }
-      }
+    val goodOnes = _userStates.filter { userState ⇒
+      userState.userID == userID &&
+      userState.isFullBillingMonth &&
+      userState.billingYear == bmi.year &&
+      userState.billingMonth == bmi.month
     }
     
     goodOnes.sortWith {
index 630457c..a25f409 100644 (file)
@@ -183,9 +183,9 @@ class MongoDBStore(
   def findLatestUserStateForFullMonthBilling(userID: String, bmi: BillingMonthInfo): Option[UserState] = {
     val query = new BasicDBObjectBuilder().
       add(UserStateModel.Names.userID, userID).
-//      add(UserStateModel.Names.isFullBillingMonthState, true). FIXME
-      add(UserStateModel.Names.theFullBillingMonth_year, bmi.year).
-      add(UserStateModel.Names.theFullBillingMonth_month, bmi.month).
+      add(UserStateModel.Names.isFullBillingMonth, true).
+      add(UserStateModel.Names.billingYear, bmi.year).
+      add(UserStateModel.Names.billingMonth, bmi.month).
       get()
 
     // Descending order, so that the latest comes first
index a1de9a6..41e30f7 100644 (file)
@@ -36,7 +36,6 @@
 package gr.grnet.aquarium.store.mongodb
 
 import gr.grnet.aquarium.charging.state.{AgreementHistory, WorkingUserState, UserStateModel}
-import gr.grnet.aquarium.computation.BillingMonthInfo
 import gr.grnet.aquarium.charging.reason.ChargingReason
 import gr.grnet.aquarium.event.model.resource.ResourceEventModel
 import gr.grnet.aquarium.charging.wallet.WalletEntry
@@ -54,7 +53,9 @@ case class MongoDBUserState(
     userID: String,
     occurredMillis: Long,
     totalCredits: Double,
-    theFullBillingMonth: Option[BillingMonthInfo],
+    isFullBillingMonth: Boolean,
+    billingYear: Int,
+    billingMonth: Int,
     chargingReason: ChargingReason,
     previousResourceEvents: List[ResourceEventModel],
     implicitlyIssuedStartEvents: List[ResourceEventModel],
@@ -84,7 +85,9 @@ object MongoDBUserState {
       model.userID,
       model.occurredMillis,
       model.totalCredits,
-      model.theFullBillingMonth,
+      model.isFullBillingMonth,
+      model.billingYear,
+      model.billingMonth,
       model.chargingReason,
       model.previousResourceEvents,
       model.implicitlyIssuedStartEvents,