1

請求システムを構築しているときに、次の問題が発生しました。

scheduler.rake で:

@users.each do |user|
begin
  puts "CALCULATING COSTS =========="
  costs = user.total_billable_price_per_month(Time.now)
  lead_count = user.total_billable_leads_count(Time.now)
  click_count = user.total_billable_clicks_count(Time.now)

  puts "CREATING NEW INVOICES ======="
  @invoice = user.invoices.new

  # if user.free_credits
  #         invoice.total_price_in_cents = 0
  #       else
  #         invoice.total_price_in_cents = costs.cents
  #       end



  @invoice.total_leads = lead_count
  @invoice.total_clicks = click_count
  @invoice.total_price_in_cents = costs.cents

  # Als de vorige factuur onder de 10 euro was, dan geld bij huidige factuur optellen
  if user.invoices.last && user.invoices.last.total_price_in_cents < 1000
    puts "Bedrag onder 10 euro"
    puts "Last invoice = #{user.invoices.last.total_price_in_cents}"
    @invoice.total_price_in_cents += user.invoices.last.total_price_in_cents
  end

  puts "SAVING INVOICE FOR #{user.name} with ID = #{user.id}"
  # Factuur saven
  @invoice.save

  #Als de factuur hoger of gelijk is als 10euro, dan factuur aanmaken
  if @invoice.total_price_in_cents >= 1000
    #Moneybird factuur versturen
    puts "COSTS ARE HIGHER THAN 10 EURO, CREATING MONEYBIRD INVOICE"

    moneybird_invoice = MoneybirdInvoice.new
    sleep(15)
    moneybird_invoice.contact_id = MoneybirdContact.find_by_customer_id(user.id).id
    sleep(15)
    moneybird_invoice.details_attributes = [
         { :description => "Aantal leads", :amount => lead_count, :price => user.lead_price.cents.to_f/100},
         { :description => "Aantal clicks", :amount => click_count, :price => user.click_price.cents.to_f/100}
    ]

    puts "TRYING TO SAVE MONEYBIRD INVOICE"
    if moneybird_invoice.save && moneybird_invoice.put(:send_invoice)
      puts "SUCCESFULLY SAVED INVOICE"
      #GET UPDATED PAY URL
      @sent_mb_invoice =  MoneybirdInvoice.get(moneybird_invoice.id)
      sleep(15)
      @invoice.update_attributes(:moneybird_invoice_id => @sent_mb_invoice['invoice_id'], :moneybird_pay_url => @sent_mb_invoice['pay_url'])
    else
      puts "MONEYBIRD INVOICE FAILED"
      puts moneybird_invoice.errors.inspect
    end
  else
    # GEEN MONEYBIRD FACTUUR AANMAKEN
  end

rescue
  puts "ER IS IETS FOUT GEGAAN MET FACTUREREN USER ID = #{user.id} & NAME = #{user.name}"
  puts @invoice.errors.inspect
end
end

このコードは、合計金額が 1000 を超える場合を除き、rake タスクが実行されるたびに常にインクリメントする必要があります。

if user.invoices.last && user.invoices.last.total_price_in_cents < 1000
  puts "Bedrag onder 10 euro"
  puts "Last invoice = #{user.invoices.last.total_price_in_cents}"
  @invoice.total_price_in_cents += user.invoices.last.total_price_in_cents
end

上記のコードは常に「最後の請求書 = 100」を置きます => これは、rake タスクが実行されるたびに増加するはずです

すべての新しい請求書には、まだ同じ total_price_in_cents があります (増加する必要があると予想している場合)。

何が起こっている ?

4

1 に答える 1

1

編集:コードの更新後に追加:

更新されたコードでは、user.invoices.new を呼び出した後に user.invoices.last を呼び出していたように見えます。これが、常に同じ値を返す理由です。

user.invoices.new を呼び出す前に、変数 @last_invoice = user.invoices.last を作成します。

元の答え:

元のコードの投稿では、save呼び出し@invoiceがループの外で発生したようです-一度だけ保存していると思います。

task :create_invoices => :environment do  

  # Begin the loop for each use
  User.all.each do |user|
    @invoice = user.invoices.build
    #If last bill < 1000
    if user.invoices.last && user.invoices.last.total_price_in_cents < 1000

      puts "Last invoice = #{user.invoices.last.total_price_in_cents}"
      @invoice.total_price_in_cents += user.invoices.last.total_price_in_cents
      @invoice.save

    end # end 'if' statement
  end # end loop for all users
end # end task definition

したがって、ユーザーテーブルをループしますが、更新を保存することはありません-ループを終了した後の最後の時間を除いて

于 2012-05-21T14:58:09.973 に答える