class StocksBooksListsController < CommLogistics::Base::Controller::ListController
  def initialize
    @pdf_cls = StocksBooksPdf
    @pdf_sort_column = 'table_name'
  end
  
  #sessionをみたいのでoverride
  def print_sheet
    logger.debug('print_sheet @ stocks_books')
    arrange_params(params)
    params[:record_list] = get_record_list
    params[:session_user_id] = session[:user_id]
    print_sheet_base
  end
    
  def get_record_list
    @control_keys = 'stocks_books_lists'
    ss = StocksBooksSearch.new
    #ss.post_where_sentence = ' GROUP BY b.user_position_id '
    #ss.date_table = 'b'
    #ss.non_table_columns = ['quantity', 'average_sales_price', 'total_sales_price']
    ss.table_alias = {'shipping_details' => 'a',
                      'shippings' => 'a'}
    # sortテーブルの置き換えに使用
    join_mcls = []
    ars = ss.search(FLAG_ON, ShippingDetail, join_mcls, params)
    return ars
  end
  
  class StocksBooksSearch < Comm::Tool::SqlSearch
    def get_columns_and_tables(tab, join_lists, params, str_vals)
      str_cols = ' * '
      str_tab = " FROM (SELECT
                    \'shippings\' AS table_name,
                    sd.id AS detail_id,
                    sd.shipping_id AS id,
                    target_date,
                    warehouse_id,
                    customer_id,
                    supplier_id,
                    sales_area_id,
                    user_position_id,
                    product_category_id,
                    product_set_id,
                    product_id,
                    lot_number,
                    serial_number,
                    ubd,
                    quantity,
                    m.disp_name AS abstract
                  FROM shipping_details AS sd 
                  LEFT JOIN shippings AS s ON s.id=sd.shipping_id 
                  LEFT JOIN master_app_production.code_masters AS m 
                       ON m.code_type_id=#{Comm::Const::DispName::CODE_MASTER_TYPE_INFO['shipping_type_code']} 
                       AND m.code_number=s.shipping_type_code
                  WHERE target_date=\"#{params[:start_target_date]}\" 
                    AND s.invalid_flag_code=#{MCODE_FLAG_OFF}
                    AND s.shipping_state_code=#{MCODE_SHIPPING_STATE_COMP}
                  UNION (SELECT 
                          \'restorations\' AS table_name, 
                          sd.id AS detail_id,
                          sd.restoration_id AS id,
                          target_date,
                          warehouse_id,
                          customer_id,
                          supplier_id,
                          sales_area_id,
                          user_position_id,
                          product_category_id,
                          product_set_id,
                          product_id,
                          lot_number,
                          serial_number,
                          ubd,
                          quantity,
                          m.disp_name AS abstract
                        FROM restoration_details AS sd LEFT JOIN restorations AS s ON s.id=sd.restoration_id 
                        LEFT JOIN master_app_production.code_masters AS m 
                             ON m.code_type_id=#{Comm::Const::DispName::CODE_MASTER_TYPE_INFO['stock_type_code']} 
                             AND m.code_number=sd.stock_type_code
                        WHERE target_date=\"#{params[:start_target_date]}\"
                          AND s.invalid_flag_code=#{MCODE_FLAG_OFF}
                          AND s.state_code=#{MCODE_STATUS2_COMP}
                        )
                        UNION (SELECT 
                          \'samples\' AS table_name, 
                          sd.id AS detail_id,
                          sd.sample_id AS id,
                          target_date,
                          warehouse_id,
                          customer_id,
                          supplier_id,
                          sales_area_id,
                          user_position_id,
                          product_category_id,
                          product_set_id,
                          product_id,
                          lot_number,
                          serial_number,
                          ubd,
                          quantity,
                          m.disp_name AS abstract 
                        FROM sample_details AS sd LEFT JOIN samples AS s ON s.id=sd.sample_id 
                        LEFT JOIN master_app_production.code_masters AS m 
                             ON m.code_type_id=#{Comm::Const::DispName::CODE_MASTER_TYPE_INFO['stock_type_code']} 
                             AND m.code_number=sd.stock_type_code
                        WHERE target_date=\"#{params[:start_target_date]}\"
                          AND s.invalid_flag_code=#{MCODE_FLAG_OFF}
                          AND s.state_code=#{MCODE_STATUS2_COMP}
                        ) ) AS a "
      return str_cols, str_tab, str_vals
    end
    #から実装
    def set_target_date_to_where(tab, params, str_where)
    end
  end
  
  #医療機器出納記録
  class StocksBooksPdf < CommLogistics::Modules::Print::Controller::PdfList
    def initialize(params, mcls=nil)
      @pdf_basename = 'stocks_books'
      @total_columns = ['quantity']
      @total_title_column = 'product_dn'
      @print_line_num_per_sheet = 51
      @paging_column = 'table_name'
      user = Comm::Tool::DispName.get_id_disp_names('user_id', [], MFIND_A, [params[:session_user_id]]).first['disp_name']
      @document_wide_additional_info = {'output_user_name' => user}
      super
    end
    
    def get_j_table_name(table_name)
      case table_name
      when 'restorations'
        val = '返却'
      when 'samples'
        val = 'サンプル'
      when 'shippings'
        val = '出荷'
      else
        val = table_name
      end
      return val
    end
    
    #複数のmaster共通要素があるのでoverride
    def set_master_wide_info(rec)
      Rails.logger.debug('rec:'+rec.inspect)
      @master_wide_info = {'paging_disp' => get_j_table_name(rec['table_name']), 'paging_date' => rec['target_date']}
    end
    
    #要素を足すためにoverride
    def record_array_to_pdata(pdata, rec, page, cnt)
      rec.each do |k, v|
        if k == 'table_name'
          val = get_j_table_name(v)
          set_value_to_pdata(pdata, page, cnt, 'j_table_name', val)
        end
        set_value_to_pdata(pdata, page, cnt, k, v)
        if @total_columns.include?(k)
          @sub_totals ||= {}
          accumulate_vals(@sub_totals, k, v)
        end
      end
      return count_to_next_record_with_opts(pdata, page, cnt)
    end
  end
end