<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -25,7 +25,7 @@ class Subscription &lt; ActiveRecord::Base
   validate_on_create      :valid_plan
   validates_presence_of   :next_renewal_at
   
-  attr_accessible :card
+  attr_accessible :card, :plan_name
     
   named_scope :for_account, lambda {|account| 
     { :conditions =&gt; { :account_id =&gt; account.id } } 
@@ -54,25 +54,26 @@ class Subscription &lt; ActiveRecord::Base
   end
   
   event :active do
-    transitions :from =&gt; [:pending, :trial, :error], :to =&gt; :active 
+    transitions :from =&gt; [:active, :pending, :trial, :error], :to =&gt; :active 
   end
 
   event :error do
-    transitions :from =&gt; [:pending, :active, :trial], :to =&gt; :error
+    transitions :from =&gt; [:error, :pending, :active, :trial], :to =&gt; :error
   end
   
-  def renew!(time = Time.now)
+  def renew!
     begin
       charge!(plan_money)
     rescue SubscriptionError =&gt; e
       logger.error &quot;****Subscription Error****&quot;
       logger.error e.response.message
-      self.last_charge_error = e.class.name + ': ' + e.response.message
+      self.last_charge_error = e.class.name + ' - ' + e.response.message
       self.error! # Saves last_charge_error too
       false
     else
-      record_transaction!(time, plan_money)
-      self.next_renewal_at = expires_at(time)
+      record_transaction!(next_renewal_at, plan_money)
+      self.last_charge_error = nil
+      self.next_renewal_at = expires_at(next_renewal_at)
       self.active! # Saves next_renewal_at too
       true
     end
@@ -119,8 +120,9 @@ class Subscription &lt; ActiveRecord::Base
     !!@card
   end
   
-  def expires_at(time = Time.now)
-    plan_name? &amp;&amp; (time + plan[:interval]).midnight
+  def expires_at(time = next_renewal_at)
+    time ||= Time.now.midnight
+    (time + 1.month).midnight
   end
   
   def to_xml(options = {})
@@ -182,7 +184,7 @@ class Subscription &lt; ActiveRecord::Base
       tran = transactions.build
       tran.money = money
       tran.meta = {}
-      tran.meta[:from] = (time - plan[:interval]).midnight
+      tran.meta[:from] = (time - 1.month).midnight
       tran.meta[:to]   = time
       tran.save
     end
@@ -196,7 +198,7 @@ class Subscription &lt; ActiveRecord::Base
     end
   
     def set_default_renewal
-      self.next_renewal_at = expires_at
+      self.next_renewal_at = expires_at(Time.now.midnight)
     end
   
     def valid_plan</diff>
      <filename>app/models/subscription.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,19 +6,15 @@
   
   plans:
     - name: basic
-      interval: &lt;%= 1.month %&gt;
       currency: USD
       price: 2400
     - name: plus
-      interval: &lt;%= 1.month %&gt;
       currency: USD
       price: 4900
     - name: premium
-      interval: &lt;%= 1.month %&gt;
       currency: USD
       price: 9900
     - name: max
-      interval: &lt;%= 1.month %&gt;
       currency: USD
       price: 14900
     </diff>
      <filename>config/subscription.example.yml</filename>
    </modified>
    <modified>
      <diff>@@ -2,33 +2,33 @@ namespace :subs do
   # This really does need to be run daily (e.g. at 12:01 am), since
   # it only finds subscriptions due on that particular day
   task :daily =&gt; [:environment] do
-    Lockfile('subs_lock', :retries =&gt; 0) do
+    Lockfile('subs_daily_lock', :retries =&gt; 0) do
       # Keep the same time so as
       # to avoid a race condition
       time = Time.now.midnight
       
-      Subscription.in_state(:trial).due(time + 2.days) {|sub|
+      Subscription.in_state(:trial).due(time + 2.days).each {|sub|
         SubscriptionMailer.deliver_trial_expiring(sub)
       }
       
-      Subscription.due(time) {|sub| 
-        if sub.renew!(time)
+      Subscription.due(time).each {|sub| 
+        if sub.renew!
           SubscriptionMailer.deliver_charge_success(sub)
         else
-          SubscriptionMailer.deliver_charge_failure(sub, sub.last_charge_error)
+          SubscriptionMailer.deliver_charge_failure(sub)
         end
       }
       
-      Subscription.in_state(:error).due(time - 3.days) {|sub| 
-        if sub.renew!(time)
+      Subscription.in_state(:error).due(time - 3.days).each {|sub| 
+        if sub.renew!
           SubscriptionMailer.deliver_charge_success(sub)
         else
-          SubscriptionMailer.deliver_second_charge_failure(sub, sub.last_charge_error)
+          SubscriptionMailer.deliver_second_charge_failure(sub)
         end
       }
       
-      Subscription.in_state(:error).due(time - 6.days) {|sub| 
-        if sub.renew!(time)
+      Subscription.in_state(:error).due(time - 6.days).each {|sub| 
+        if sub.renew!
           SubscriptionMailer.deliver_charge_success(sub)
         else
           ## You may want to disable the person's</diff>
      <filename>lib/tasks/subs.rake</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6b42c2186b52093f7dbeb484799d670d521e3b86</id>
    </parent>
  </parents>
  <author>
    <name>Alex MacCaw</name>
    <email>maccman@gmail.com</email>
  </author>
  <url>http://github.com/maccman/saasy/commit/40d3d35a8e1176db390e85357ba1b64f2c4619c8</url>
  <id>40d3d35a8e1176db390e85357ba1b64f2c4619c8</id>
  <committed-date>2009-03-09T10:18:01-07:00</committed-date>
  <authored-date>2009-03-09T10:18:01-07:00</authored-date>
  <message>Fixed some issues with subscription renewall time - hardcode it to a month since I will never need any different</message>
  <tree>dfedee1edf7b314ac7ba7fb3d590ff711c62b030</tree>
  <committer>
    <name>Alex MacCaw</name>
    <email>maccman@gmail.com</email>
  </committer>
</commit>
