Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## Вот такой вот пипец )
- def stats
- ### NEW VERSION STARTS HERE
- @from = Date.today
- @to = @from
- if request.post?
- begin
- @from = Date.new(params[:from][:year].to_i, params[:from][:month].to_i, params[:from][:day].to_i)
- @to = Date.new(params[:to][:year].to_i, params[:to][:month].to_i, params[:to][:day].to_i)
- rescue
- @from = Date.today
- @to = @from
- end
- @sh = Hash.new
- #select * uniques
- select_dates = Hash.new
- StatUnique.find(:all, :conditions=>["date BETWEEN ? AND ?", @from, @to], :select=>"DISTINCT date" ).each do |su|
- db_date = su.date.to_s(:db)
- select_dates[db_date] = true
- end
- StatReg.find(:all, :conditions=>["date BETWEEN ? AND ?", @from, @to], :select=>"DISTINCT date" ).each do |su|
- db_date = su.date.to_s(:db)
- select_dates[db_date] = true
- end
- StatPay.find(:all, :conditions=>["date BETWEEN ? AND ?", @from, @to], :select=>"DISTINCT date" ).each do |su|
- db_date = su.date.to_s(:db)
- select_dates[db_date] = true
- end
- StatRebill.find(:all, :conditions=>["date BETWEEN ? AND ?", @from, @to], :select=>"DISTINCT date" ).each do |su|
- db_date = su.date.to_s(:db)
- select_dates[db_date] = true
- end
- select_dates.each_key do |db_date|
- key = db_date.split('-').map{|x| x.to_i}
- key = Time.gm(*key).to_i
- @sh[key] = {
- :partners=>
- {:uniques=>0,
- :regs=>0,
- :pays=>0,
- :pays_sum=>0,
- :rebills_sum=>0,
- :ratio_reg=>"0:0",
- :ratio_pay=>"0:0",
- :to_service_pays=>0,
- :to_service_rebills=>0,
- :referal_sum => 0,
- :total=>0,
- :total_to_partners=>0,
- :total_to_service=>0},
- :service=>
- {:uniques=>0,
- :regs=>0,
- :pays=>0,
- :pays_sum=>0,
- :rebills_sum=>0,
- :ratio_reg=>"0:0",
- :ratio_pay=>"0:0",
- :to_service_pays=>0,
- :to_service_rebills=>0,
- :total=>0,
- :total_to_partners=>0,
- :total_to_service=>0},
- :sub_total_to_service=>0}
- @sh[key][:partners][:uniques]=StatUnique.sum(:unique_visits,:conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:service][:uniques]=(u=StatUnique.find(:first,:conditions=>["date = ? AND partner_id =-1", db_date])).nil? ? 0 : u.unique_visits
- @sh[key][:partners][:regs]=StatReg.sum(:regs,:conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:service][:regs]=(u=StatReg.find(:first,:conditions=>["date = ? AND partner_id =-1", db_date])).nil? ? 0 : u.regs
- @sh[key][:partners][:pays]=StatPay.sum(:pays_counter,:conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:service][:pays]=(u=StatPay.find(:first,:conditions=>["date = ? AND partner_id =-1", db_date])).nil? ? 0 : u.pays_counter
- @sh[key][:partners][:pays_sum]=StatPay.sum(:total, :conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:service][:pays_sum]=StatPay.sum(:total, :conditions=>["date = ? AND partner_id =-1", db_date])
- @sh[key][:partners][:rebills_sum]=StatRebill.sum(:total, :conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:service][:rebills_sum]=StatRebill.sum(:total, :conditions=>["date = ? AND partner_id =-1", db_date])
- @sh[key][:partners][:to_service_pays]=StatPay.sum(:to_service, :conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:partners][:to_service_rebills]=StatRebill.sum(:to_service, :conditions=>["date = ? AND partner_id !=-1", db_date])
- @sh[key][:partners][:referal_sum]=StatReferal.sum(:total, :conditions=>["date = ?", db_date])
- #calculate sub_totals
- #for service
- @sh[key][:service][:total] = @sh[key][:service][:pays_sum] + @sh[key][:service][:rebills_sum]
- @sh[key][:service][:total_to_partners] = 0
- @sh[key][:service][:total_to_service] = @sh[key][:service][:total]
- #for partners
- @sh[key][:partners][:total] = @sh[key][:partners][:pays_sum] + @sh[key][:partners][:rebills_sum] + @sh[key][:partners][:to_service_pays] + @sh[key][:partners][:to_service_rebills]
- @sh[key][:partners][:total_to_partners] = @sh[key][:partners][:pays_sum] + @sh[key][:partners][:rebills_sum] + @sh[key][:partners][:referal_sum]
- @sh[key][:partners][:total_to_service] = @sh[key][:partners][:total] - @sh[key][:partners][:total_to_partners]
- #general sub_total to service
- @sh[key][:sub_total_to_service] = @sh[key][:service][:total_to_service] + @sh[key][:partners][:total_to_service]
- #calculate ratios
- service_ratios = calculate_ratios(:regs=>@sh[key][:service][:regs], :pays=>@sh[key][:service][:pays], :uniques =>@sh[key][:service][:uniques])
- partners_ratios = calculate_ratios(:regs=>@sh[key][:partners][:regs], :pays=>@sh[key][:partners][:pays], :uniques =>@sh[key][:partners][:uniques])
- @sh[key][:service][:ratio_reg] = service_ratios[:ratio_reg]
- @sh[key][:service][:ratio_pay] = service_ratios[:ratio_pay]
- @sh[key][:partners][:ratio_reg] = partners_ratios[:ratio_reg]
- @sh[key][:partners][:ratio_pay] = partners_ratios[:ratio_pay]
- end
- @sh.sort
- #calculate totals
- @uniques_total = StatUnique.sum(:unique_visits, :conditions=>["date BETWEEN ? AND ?", @from, @to])
- @regs_total = StatReg.sum(:regs, :conditions=>["date BETWEEN ? AND ?", @from, @to])
- @pays_total = StatPay.sum(:pays_counter, :conditions=>["date BETWEEN ? AND ?", @from, @to])
- @pays_sum_total = StatPay.sum(:total, :conditions=>["date BETWEEN ? AND ?", @from, @to])
- @rebills_sum_total = StatRebill.sum(:total, :conditions=>["date BETWEEN ? AND ?", @from, @to])
- @total_total = @pays_sum_total + @rebills_sum_total
- @total_to_partners = StatPay.sum(:total, :conditions=>["date BETWEEN ? AND ? AND partner_id !=-1", @from, @to]) + StatRebill.sum(:total, :conditions=>["date BETWEEN ? AND ? AND partner_id != -1", @from, @to]) + StatReferal.sum(:total, :conditions=>["date BETWEEN ? AND ?", @from, @to])
- @total_to_service = @total_total - @total_to_partners
- # calculate total ratios
- total_ratios = calculate_ratios(:regs=>@regs_total, :pays=>@pays_total, :uniques=>@uniques_total)
- @ratio_reg_total = total_ratios[:ratio_reg]
- @ratio_pay_total = total_ratios[:ratio_pay]
- end
- end
- ## Расчет ратио
- def calculate_ratios(options)
- regs = options[:regs]
- uniques = options[:uniques]
- pays = options[:pays]
- if regs == 0 && uniques == 0
- ratio_reg = "0:0"
- elsif regs == 0 && uniques > 0
- ratio_reg = "0:0"
- elsif regs > 0 && uniques == 0
- ratio_reg = "1: #{(1.00/regs).round_to(2)}"
- elsif regs >= uniques
- ratio_reg = "1:#{(uniques.to_f/regs).round_to(2)}"
- elsif regs < uniques
- ratio_reg = "1:#{(uniques.to_f/regs).round_to(2)}"
- end
- if regs == 0 && pays == 0
- ratio_pay = "0:0"
- elsif regs== 0 && pays > 0
- ratio_pay = "1:#{(1.00/pays).round_to(2)}"
- elsif regs > 0 && pays == 0
- ratio_pay = "0:0"
- elsif regs >= pays
- ratio_pay = "1:#{(regs.to_f/pays).round_to(2)}"
- elsif regs < pays
- ratio_pay = "1:#{(regs.to_f/pays).round_to(2)}"
- end
- return {:ratio_reg=>ratio_reg, :ratio_pay=>ratio_pay}
- end
Add Comment
Please, Sign In to add comment