class InvoicePricesListsController < CommLogistics::Base::Controller::ListController
  include CommLogistics::Modules::FindPrice
  def get_record_list
    require 'config/site_config.rb'
    @control_keys = 'invoice_prices_lists'
    ss = ProductSearch.new
    ss.table_alias = {'product_sets' => 'a'}
    join_mcls = []
    ars = ss.search(FLAG_ON, ProductSet, join_mcls, {:show_all => true, 
                                                     :with_invalid => params[:with_invalid],
                                                     :product_category_id => params[:product_category_id],
                                                     :product_set_id => params[:product_set_id],
                                                     :product_id => params[:product_id],
                                                     :warehouse_id => params[:warehouse_id],
                                                     :supplier_id => params[:supplier_id],
                                                     :form_search => params[:form_search]})
    if params[:form_search]==STR_TRUE
      tmp_params = {:warehouse_id => params[:warehouse_id].to_i, :customer_id => (params[:customer_id].blank? ? nil : params[:customer_id].to_i), :supplier_id => params[:supplier_id].to_i, :currency_type_code => params[:currency_type_code]}
      target = InvoicePrice.find_target(tmp_params)
      sar = Supplier.find(tmp_params[:supplier_id])
    end
    invoice_price_num = $WHOLESALE_PRICE_NUM || 1
    ars.each do |ar|
      (0..invoice_price_num).each do |index|
        ar["invoice_rate_#{index}"] = (((ar["invoice_price_#{index}"].to_f || 0.0) / ar['public_price'].to_f) * 100 ).round(1) if ar['public_price'].to_f > 0
      end
      if params[:form_search]==STR_TRUE
        tmp_params[:product_category_id] = ar.product_category_id.to_i || 0
        tmp_params[:product_set_id] = ar.product_set_id.to_i || 0
        tmp_params[:product_id] = ar.product_id.to_i || 0
        #得意先別販売価格をサーチする
        price = find_match_price(tmp_params,  target)
        #見つからなかったら、販売価格区分
        if price == false
          if ar.invoice_price_code.to_i > 0
            #卸価格1 ~ 10
            tmp_price = ar['invoice_price_' + ar.invoice_price_code.to_s].to_f
            tmp_rate = ar['invoice_rate_' + ar.invoice_price_code.to_s]
          else
            #原価
            tmp_price = ar['invoice_price_0'].to_f
            tmp_rate = 100
          end
        #見つかったら、そのテーブルの値を取る。
        else
          if price.price_type_code.to_i == MCODE_PRICE_DEFINE_RATE
            unless ar['public_price'].blank?
              tmp_price = price.price.to_f * ar['public_price'].to_f
              tmp_rate = (price.price.to_f * 100).round(1)
            end
          #金額の場合
          else
            tmp_price = price.price.to_f
            tmp_rate = ar['public_price'].to_f > 0 ? ((price.price.to_f / ar['public_price'].to_f) * 100).round(1) : nil
          end
          ar['invoice_table_price'] = tmp_price
          ar['invoice_table_rate'] = tmp_rate
        end
        ar['invoice_search_price'] = CommLogistics::Tools::CalcDuty::round_price(tmp_price, {:unit_price_fraction_method_code=>sar.unit_price_fraction_method_code.to_i})
        ar['invoice_search_rate'] = tmp_rate
      end
    end
    ss = InvoicePricesSearch.new
    ss.table_alias = {'product_sets' => 'r'}
    ss.union_array = ars
    return ss.search(FLAG_ON, ProductSet, [], params)
  end
  
  class ProductSearch < Comm::Tool::SqlSearch
    #include CommLogistics::Const::Code
    def get_columns_and_tables(tab, join_lists, params, str_vals)
      require 'config/site_config.rb'
      
      invoice_price_code = "NULL"
      if params[:form_search] == STR_TRUE
        target_ar = ($WAREHOUSE_PRICE_DEFINITION && $WAREHOUSE_PRICE_DEFINITION['invoice_prices']) ? Warehouse.find(params[:warehouse_id]) : Supplier.find(params[:supplier_id])
        invoice_price_code = (target_ar.invoice_price_code || 0) if target_ar
      end
      
      product_category = "  "
      product_set = "  "
      product = "  "
      unless params[:product_category_id].blank?
        product_category = " AND (ps.product_category_id = #{params[:product_category_id]}) "
      end
      
      unless params[:product_set_id].blank?
        product_set = " AND (ps.id = #{params[:product_set_id]}) "
      end
      
      unless params[:product_id].blank?
        par = Product.find(params[:product_id])
        if par && !par.product_set_id.blank?
          psar = ProductSet.find(par.product_set_id)
          if psar.price_unique_code == MCODE_PRICE_UNIQUE_PRODUCT_SET 
            product = " AND (ps.id = #{psar.id}) "
          else
            product = " AND (p.id = #{params[:product_id]}) "
          end
        end
      end
      
      if params[:with_invalid] == STR_TRUE
        with_invalid = " WHERE 1=1 "
      else
        with_invalid = " WHERE ((p.id IS NOT NULL AND p.invalid_flag_code=#{MCODE_FLAG_OFF} AND ps.invalid_flag_code=#{MCODE_FLAG_OFF}) OR (p.id IS NULL AND ps.invalid_flag_code=#{MCODE_FLAG_OFF})) "
      end
      
      invoice_price_sql = ""
      invoice_price_num = $WHOLESALE_PRICE_NUM || 1
      (1..invoice_price_num).each do |index|
        invoice_price_sql = invoice_price_sql + 
                            "IF(ps.price_unique_code=#{MCODE_PRICE_UNIQUE_PRODUCT_SET}, ps.invoice_price_#{index}, p.invoice_price_#{index}) AS invoice_price_#{index}," + 
                            "NULL AS invoice_rate_#{index},"
      end
      
      str_cols = ' * '
      str_tab =" FROM ( SELECT p.id AS product_id,
                               ps.id AS product_set_id,
                               ps.product_category_id,
                               ps.price_unique_code,
                               NULL AS invoice_search_price,
                               NULL AS invoice_search_rate,
                               NULL AS invoice_table_price,
                               NULL AS invoice_table_rate,
                               IF(ps.price_unique_code=#{MCODE_PRICE_UNIQUE_PRODUCT_SET}, ps.cost_price, p.cost_price) AS invoice_price_0,
                               NULL AS invoice_rate_0,
                               IF(ps.price_unique_code=#{MCODE_PRICE_UNIQUE_PRODUCT_SET}, ps.public_price, p.public_price) AS public_price,
                               #{invoice_price_sql}
                               #{invoice_price_code.to_s} AS invoice_price_code,
                               IF(p.id IS NULL, ps.invalid_flag_code, IF(p.invalid_flag_code=#{MCODE_FLAG_OFF} AND ps.invalid_flag_code=#{MCODE_FLAG_OFF}, #{MCODE_FLAG_OFF}, #{MCODE_FLAG_ON})) AS invalid_flag_code
                        FROM master_app_production.product_sets AS ps 
                        LEFT JOIN master_app_production.products AS p ON p.product_set_id=ps.id AND ps.price_unique_code=#{MCODE_PRICE_UNIQUE_PRODUCT}
                          #{with_invalid} 
                          #{product_category}
                          #{product_set}
                          #{product}
                  ) AS a "
      return str_cols, str_tab, str_vals
    end
    #から実装
    def set_target_date_to_where(tab, params, str_where)
    end
  end
  
  class InvoicePricesSearch < Comm::Tool::SqlSearch
    def get_columns_and_tables(tab, join_lists, params, str_vals)
      str_cols = ' * '
      str_tab = " FROM (#{generate_union(@union_array.first.attributes.keys)}) AS r "
      return str_cols, str_tab, str_vals
    end
    #空実装
    def set_target_date_to_where(tab, params, str_where)
    end
  end
  
  def count_all
    result = 0
    ret = ProductSet.connection.execute('SELECT FOUND_ROWS()')
    ret.each {|x| result = x.first }
    return result
  end
end