class StockSearchListsController < CommLogistics::Base::Controller::ListController
  def initialize
    @pdf_cls = StockSearchPdf
  end
  #print_sheetアクション
  def print_sheet
    params[:show_all]=true
    #params[:form_search].delete('lot_number')
    #params[:form_search].delete('serial_number')
    start_date = params[:start_target_date]
    end_date = params[:end_target_date]
    
    #phase 1 => 繰り越し数量をもとめる。
    params[:end_target_date]=(Date.parse(start_date) - 1).to_s
    pre_quantity = get_record_list
    params[:pre_quantity] = pre_quantity.blank? ? 0 : pre_quantity[0].existing_quantity
    
    #phase 2 => 指定期間の取引履歴をもとめる。
    params[:start_target_date] = start_date
    params[:end_target_date] = end_date
    params[:record_list] = get_record_list.ext_hashfy
    print_sheet_base
  end
  def get_record_list
    @control_keys = 'stock_search_lists'
    ss = StockSearch.new
    # sortテーブルの置き換えに使用
    join_mcls = [{:tab => 'warehouses',
                  :cols => Warehouse.column_names}]
    ars = ss.search(FLAG_ON, Stock, join_mcls, params)
    return ars
  end
  
  class StockSearch < Comm::Tool::SqlSearch
    include CommLogistics::Const::Code
    def get_columns_and_tables(tab, join_lists, params, str_vals)
      # パラメータの設定
      str_cols = ' * '
      if params[:action]=='print_sheet'#元帳印刷ボタンのとき
        if params[:pre_quantity].is_a? Fixnum #phase2
          str_inner_cols = ' * '
          base_columns = ""
          group_by = ""
          pre_main = " FROM ("
          post_main = " ) AS main ORDER BY target_date, updated_at, trans_id, seq_number "
          shipping_type = " 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 "
          restoration_type = " LEFT JOIN master_app_production.code_masters AS m ON m.code_type_id=#{Comm::Const::DispName::CODE_MASTER_TYPE_INFO['restoration_type_code']} AND m.code_number=s.restoration_type_code "
          sale_type = " LEFT JOIN master_app_production.code_masters AS m ON m.code_type_id=#{Comm::Const::DispName::CODE_MASTER_TYPE_INFO['sale_type_code']} AND m.code_number=s.sale_type_code "
          stock_type = " 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 "
          purchase_type = " LEFT JOIN master_app_production.code_masters AS m ON m.code_type_id=#{Comm::Const::DispName::CODE_MASTER_TYPE_INFO['purchase_type_code']} AND m.code_number=s.purchase_type_code "
          abstract = ", m.disp_name AS abstract, s.updated_at "
          disposal_abstract = ", '' AS abstract, s.updated_at "
          @table_alias = {}
        else
          str_inner_cols = ' a.warehouse_id,a.customer_id,a.supplier_id,a.product_id, IFNULL(a.existing_quantity,0) + IFNULL(c.out_quantity,0) - IFNULL(c.in_quantity,0) AS existing_quantity '
          base_columns = 'warehouse_id, customer_id, supplier_id, product_category_id, product_set_id, product_id, lot_number, serial_number, ubd, SUM(existing_quantity) AS existing_quantity'
          group_by = 'warehouse_id, customer_id, supplier_id, product_id'
          left_join_b = ' a.warehouse_id=b.warehouse_id AND ((a.customer_id is NULL AND b.customer_id is NULL) OR a.customer_id=b.customer_id) AND a.supplier_id=b.supplier_id AND a.product_id=b.product_id '
          left_join_c = ' a.warehouse_id=c.warehouse_id AND ((a.customer_id is NULL AND c.customer_id is NULL) OR a.customer_id=c.customer_id) AND a.supplier_id=c.supplier_id AND a.product_id=c.product_id '
          @table_alias = {'stocks' => 't','warehouses' => 't'}
        end
      else ##検索ボタンが押されたとき
        str_inner_cols = ' a.warehouse_id,a.customer_id,a.supplier_id,w.sales_area_id,w.user_position_id,a.product_category_id,a.product_set_id,a.product_id,a.lot_number,a.serial_number,a.ubd, IFNULL(a.existing_quantity,0) + IFNULL(c.out_quantity,0) - IFNULL(c.in_quantity,0) AS existing_quantity, b.in_quantity AS in_quantity, b.out_quantity AS out_quantity ' 
        base_columns = 'warehouse_id, customer_id, supplier_id, product_category_id, product_set_id, product_id, lot_number, serial_number, ubd, existing_quantity'
        group_by = 'warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd'
        left_join_b = ' a.warehouse_id=b.warehouse_id AND ((a.customer_id is NULL AND b.customer_id is NULL) OR a.customer_id=b.customer_id) AND a.supplier_id=b.supplier_id AND a.product_id=b.product_id AND a.lot_number=b.lot_number AND a.serial_number=b.serial_number AND a.ubd=b.ubd '
        left_join_c = ' a.warehouse_id=c.warehouse_id AND ((a.customer_id is NULL AND c.customer_id is NULL) OR a.customer_id=c.customer_id) AND a.supplier_id=c.supplier_id AND a.product_id=c.product_id AND a.lot_number=c.lot_number AND a.serial_number=c.serial_number AND a.ubd=c.ubd '
        pre_main = " LEFT JOIN ( SELECT warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd, SUM(IFNULL(in_quantity,0)) AS in_quantity, SUM(IFNULL(out_quantity,0)) AS out_quantity FROM ( "
        post_main = ") AS main GROUP BY " + group_by + " ) AS b ON " + left_join_b
        shipping_type = ""
        restoration_type = ""
        sale_type = ""
        stock_type = ""
        purchase_type = ""
        abstract = ""
        disposal_abstract = ""
        @table_alias = {'stocks' => 't', 'warehouses' => 't'}
      end
      
      diff_columns = 'warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd'
      #formからの条件を生成
      base_conditions = " WHERE target_date BETWEEN \"#{params[:start_target_date]}\" AND \"#{params[:end_target_date]}\" AND s.invalid_flag_code=#{MCODE_FLAG_OFF} "
      diff_conditions = " WHERE target_date > \"#{params[:end_target_date]}\" AND s.invalid_flag_code=#{MCODE_FLAG_OFF} "
      state_conditions = " AND s.state_code=#{MCODE_STATUS2_COMP} "
      #customer_idを除いた条件
      disposal_conditions = sanitize_sql_for_conditions(params[:form_search].reject{|key,val| key == 'customer_id'}, 'AND')
      disposal_conditions = ' AND ' + disposal_conditions unless disposal_conditions.blank?
      #supplier_idを除いた条件
      purchase_conditions = sanitize_sql_for_conditions(params[:form_search].reject{|key,val| key == 'supplier_id'}, 'AND')
      purchase_conditions = ' AND ' + purchase_conditions unless purchase_conditions.blank?
      if params[:form_search].include?("supplier_id") && params[:form_search]['supplier_id'].include?("data") && params[:form_search]['supplier_id']['data'].include?("value")
        purchase_conditions += " AND ((purchase_type_code=#{MCODE_PURCHASE_TYPE_STORING} AND supplier_id=#{params[:form_search]['supplier_id']['data']['value']}) OR (purchase_type_code!=#{MCODE_PURCHASE_TYPE_STORING} AND #{params[:form_search]['supplier_id']['data']['value']}=#{OWN_SUPPLIER_ID})) "
      end
      #supplier_idを含んだ条件
      search_conditions = sanitize_sql_for_conditions(params[:form_search], 'AND')
      search_conditions = ' AND ' + search_conditions unless search_conditions.blank?
      #search_conditions = purchase_conditions + supplier_conditions
      own_conditions =  search_conditions.gsub('warehouse_id','own_warehouse_id') unless search_conditions.blank?
      
      main_sql = (pre_main.blank? || post_main.blank?) ? "" : pre_main + "
                          SELECT
                            \'shippings\' AS table_name, sd.id AS detail_id, s.id AS trans_id, sd.seq_number, s.target_date, #{diff_columns} #{abstract}, #{base_columns.blank? ? "own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,NULL,quantity) as in_quantity,
                            IF(quantity<0,-1*quantity,NULL) as out_quantity
                            FROM shipping_details AS sd LEFT JOIN shippings AS s ON s.id=sd.shipping_id 
                            #{shipping_type}
                            #{base_conditions} AND s.shipping_state_code=#{MCODE_SHIPPING_STATE_COMP} #{search_conditions}
                          UNION (SELECT 
                            \'restorations\' AS table_name, sd.id AS detail_id, s.id AS trans_id, sd.seq_number, s.target_date, #{diff_columns} #{abstract},#{base_columns.blank? ? "own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,-1*quantity,NULL) as in_quantity,
                            IF(quantity<0,NULL,quantity) as out_quantity
                            FROM restoration_details AS sd LEFT JOIN restorations AS s ON s.id=sd.restoration_id 
                            #{restoration_type}
                            #{base_conditions} #{state_conditions} #{search_conditions} )
                          /*ユーザーの感覚でカウントする。ライブスルー含まない。 supplier_idがownでないときは実際は在庫は動かないが、カウントする*/
                          UNION (SELECT 
                            \'sales\' AS table_name, sd.id AS detail_id, s.id AS trans_id, sd.seq_number, s.target_date, #{diff_columns} #{abstract},#{base_columns.blank? ? "NULL AS own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,-1*quantity,NULL) as in_quantity,
                            IF(quantity<0,NULL,quantity) as out_quantity
                            FROM sale_details AS sd LEFT JOIN sales AS s ON s.id=sd.sale_id 
                            #{sale_type}
                            #{base_conditions} #{state_conditions} #{search_conditions} 
                            AND sale_type_code!=#{MCODE_SALE_TYPE_ADJUST} AND sale_trigger_code!=#{MCODE_SALE_TRIGGER_THROUGH} AND sd.stock_flag_code=#{MCODE_STOCK_FLAG_ON})
                          /*ユーザーの感覚でカウントする。ライブスルー含まない。 */
                          UNION (SELECT 
                            \'samples\' AS table_name, sd.id AS detail_id, s.id AS trans_id, sd.seq_number, s.target_date, #{diff_columns} #{abstract},#{base_columns.blank? ? "NULL AS own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,-1*quantity,NULL) as in_quantity,
                            IF(quantity<0,NULL,quantity) as out_quantity
                            FROM sample_details AS sd LEFT JOIN samples AS s ON s.id=sd.sample_id 
                            #{stock_type}
                            #{base_conditions} #{state_conditions} #{search_conditions} AND sample_trigger_code!=#{MCODE_SAMPLE_TRIGGER_THROUGH} ) 
                          /* ユーザーの感覚でカウントする。仕入は自社[発注]のとき,purchase_type_codeをみて在庫預りの場合は、supplier_idとし、それ以外はOWN_SUPPLIER_IDとする */
                          UNION (SELECT 
                            \'purchases-in\' AS table_name, sd.id AS detail_id, s.id AS trans_id, sd.seq_number, s.target_date, warehouse_id, customer_id, IF(purchase_type_code=#{MCODE_PURCHASE_TYPE_STORING},supplier_id,#{OWN_SUPPLIER_ID}) AS supplier_id, product_id, lot_number, serial_number, ubd #{abstract},#{base_columns.blank? ? "NULL AS own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,NULL,quantity) as in_quantity,
                            IF(quantity<0,-1*quantity,NULL) as out_quantity
                            FROM purchase_details AS sd LEFT JOIN purchases AS s ON s.id=sd.purchase_id 
                            #{purchase_type}
                            #{base_conditions} AND sd.inspect_status_code=#{MCODE_STATUS2_COMP} #{purchase_conditions} AND purchase_type_code!=#{MCODE_PURCHASE_TYPE_ADJUST} AND purchase_trigger_code IN (#{MCODE_PURCHASE_TRIGGER_ACCEPT_ORDER},#{MCODE_PURCHASE_TRIGGER_MANUFACTURE}) AND sd.stock_flag_code=#{MCODE_STOCK_FLAG_ON}) 
                            
                          /*ユーザーの感覚でカウントする。自社受注のときは入庫しない。自社発注の貸出買取の場合は在庫が他社オーナーから自社オーナーに移動するだけなので、なくなった分はoutする*/
                          UNION (SELECT 
                            \'purchases-out\' AS table_name, sd.id AS detail_id,s.id AS trans_id, sd.seq_number, s.target_date, #{diff_columns} #{abstract},#{base_columns.blank? ? "NULL AS own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,-1*quantity,NULL) as in_quantity,
                            IF(quantity<0,NULL,quantity) as out_quantity
                            FROM purchase_details AS sd LEFT JOIN purchases AS s ON s.id=sd.purchase_id 
                            #{purchase_type}
                            #{base_conditions} AND sd.inspect_status_code=#{MCODE_STATUS2_COMP} #{search_conditions} 
                            AND (s.purchase_trigger_code=#{MCODE_PURCHASE_TRIGGER_ACCEPT_ORDER} AND s.purchase_type_code=#{MCODE_PURCHASE_TYPE_LENDING} AND sd.stock_flag_code=#{MCODE_STOCK_FLAG_ON}) ) 
                          UNION (SELECT 
                            \'disposals\' AS table_name, sd.id AS detail_id,s.id AS trans_id, sd.seq_number, s.target_date, warehouse_id, NULL AS customer_id, supplier_id, product_id, lot_number, serial_number,ubd #{disposal_abstract}, #{base_columns.blank? ? "NULL AS own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,-1*quantity,NULL) as in_quantity,
                            IF(quantity<0,NULL,quantity) as out_quantity
                            FROM disposal_details AS sd LEFT JOIN disposals AS s ON s.id=sd.disposal_id 
                            #{base_conditions} #{state_conditions} #{disposal_conditions} ) 
                          UNION (SELECT 
                            \'adjustments\' AS table_name, sd.id AS detail_id,s.id AS trans_id, sd.seq_number, s.target_date, #{diff_columns} #{abstract},#{base_columns.blank? ? "NULL AS own_warehouse_id," : ""} #{base_columns.blank? ? "NULL AS shipment_customer_id," : ""}
                            IF(quantity<0,NULL,quantity) as in_quantity,
                            IF(quantity<0,-1*quantity,NULL) as out_quantity
                            FROM adjustment_details AS sd LEFT JOIN adjustments AS s ON s.id=sd.adjustment_id 
                            #{stock_type}
                            #{base_conditions} #{state_conditions} #{search_conditions} ) 
                          UNION (SELECT 
                            \'shippings-own\' AS table_name, sd.id AS detail_id,s.id AS trans_id, sd.seq_number, s.target_date, own_warehouse_id AS warehouse_id, NULL AS customer_id, supplier_id, product_id, lot_number, serial_number,ubd #{abstract},#{base_columns.blank? ? "warehouse_id AS own_warehouse_id," : ""} #{base_columns.blank? ? "customer_id AS shipment_customer_id," : ""}
                            IF(quantity<0,-1*quantity,NULL) as in_quantity,
                            IF(quantity<0,NULL,quantity) as out_quantity
                            FROM shipping_details AS sd LEFT JOIN shippings AS s ON s.id=sd.shipping_id 
                            #{shipping_type}
                            #{base_conditions} AND s.shipping_state_code=#{MCODE_SHIPPING_STATE_COMP} AND own_warehouse_id IS NOT NULL #{own_conditions} ) 
                          UNION (SELECT 
                            \'restorations-own\' AS table_name, sd.id AS detail_id,s.id AS trans_id, sd.seq_number, s.target_date, own_warehouse_id AS warehouse_id, NULL AS customer_id, supplier_id, product_id, lot_number, serial_number,ubd #{abstract},#{base_columns.blank? ? "warehouse_id AS own_warehouse_id," : ""} #{base_columns.blank? ? "customer_id AS shipment_customer_id," : ""}
                            IF(quantity<0,NULL,quantity) as in_quantity,
                            IF(quantity<0,-1*quantity,NULL) as out_quantity
                            FROM restoration_details AS sd LEFT JOIN restorations AS s ON s.id=sd.restoration_id 
                            #{restoration_type}
                            #{base_conditions} #{state_conditions} AND own_warehouse_id IS NOT NULL #{own_conditions} ) 
      " + post_main
      
      str_tab = ' FROM ( SELECT ' + str_inner_cols + ' ' + 
                    ( base_columns.blank? ? main_sql : " FROM (
                        SELECT #{base_columns} FROM stocks 
                          WHERE #{search_conditions.sub(' AND ', ' ')} 
                          GROUP BY #{group_by}
                      ) AS a 
                      LEFT JOIN master_app_production.warehouses AS w ON a.warehouse_id=w.id
                      #{main_sql}
                      LEFT JOIN ( 
                        SELECT warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd, SUM(IFNULL(in_quantity,0)) AS in_quantity, SUM(IFNULL(out_quantity,0)) AS out_quantity FROM
                          (SELECT
                            \'shippings\' AS table_name, sd.id AS detail_id, quantity AS in_quantity, 0 AS out_quantity, #{diff_columns}
                            FROM shipping_details AS sd LEFT JOIN shippings AS s ON s.id=sd.shipping_id 
                            #{diff_conditions} AND s.shipping_state_code=#{MCODE_SHIPPING_STATE_COMP} #{search_conditions} 
                          UNION (SELECT 
                            \'restorations\' AS table_name, sd.id AS detail_id, 0 AS in_quantity, quantity AS out_quantity, #{diff_columns}
                            FROM restoration_details AS sd LEFT JOIN restorations AS s ON s.id=sd.restoration_id 
                            #{diff_conditions} #{state_conditions} #{search_conditions} )
                            
                          /*ライブスルー含まない。 プログラムに忠実に在庫主が自社のもののみ落とす*/
                          UNION (SELECT 
                            \'sales\' AS table_name, sd.id AS detail_id, 0 AS in_quantity, quantity AS out_quantity,
                            warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd
                            FROM sale_details AS sd LEFT JOIN sales AS s ON s.id=sd.sale_id 
                            #{diff_conditions} #{state_conditions} #{search_conditions} 
                            AND sale_type_code!=#{MCODE_SALE_TYPE_ADJUST} AND sale_trigger_code!=#{MCODE_SALE_TRIGGER_THROUGH} AND sd.stock_flag_code=#{MCODE_STOCK_FLAG_ON})
                          /*ライブスルー含まない。 在庫主が自社として落とす*/
                          UNION (SELECT 
                            \'samples\' AS table_name, sd.id AS detail_id, 0 AS in_quantity, quantity AS out_quantity, 
                            warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd
                            FROM sample_details AS sd LEFT JOIN samples AS s ON s.id=sd.sample_id 
                            #{diff_conditions} #{state_conditions} #{search_conditions} AND sample_trigger_code!=#{MCODE_SAMPLE_TRIGGER_THROUGH} ) 
                          /*プログラムに忠実に自社発注のもののみ入庫する*/
                          UNION (SELECT 
                            \'purchases-in\' AS table_name, sd.id AS detail_id,
                            quantity AS in_quantity, 0 AS out_quantity, warehouse_id, customer_id, IF(purchase_type_code=#{MCODE_PURCHASE_TYPE_STORING},supplier_id,#{OWN_SUPPLIER_ID}) AS supplier_id, product_id, lot_number, serial_number, ubd
                            FROM purchase_details AS sd LEFT JOIN purchases AS s ON s.id=sd.purchase_id 
                            #{diff_conditions} AND sd.inspect_status_code=#{MCODE_STATUS2_COMP} #{purchase_conditions} AND purchase_type_code!=#{MCODE_PURCHASE_TYPE_ADJUST} AND purchase_trigger_code IN (#{MCODE_PURCHASE_TRIGGER_ACCEPT_ORDER},#{MCODE_PURCHASE_TRIGGER_MANUFACTURE}) AND sd.stock_flag_code=#{MCODE_STOCK_FLAG_ON}) 
                          /*プログラムに忠実に自社受注と自社発注&&貸し出し買取のもののみ落とす。*/
                          UNION (SELECT 
                            \'purchases-out\' AS table_name, sd.id AS detail_id,
                            0 AS in_quantity, quantity AS out_quantity, warehouse_id, customer_id, supplier_id, product_id, lot_number, serial_number, ubd
                            FROM purchase_details AS sd LEFT JOIN purchases AS s ON s.id=sd.purchase_id 
                            #{diff_conditions} AND sd.inspect_status_code=#{MCODE_STATUS2_COMP} #{search_conditions}
                            AND (s.purchase_trigger_code=#{MCODE_PURCHASE_TRIGGER_ACCEPT_ORDER} AND s.purchase_type_code=#{MCODE_PURCHASE_TYPE_LENDING} AND sd.stock_flag_code=#{MCODE_STOCK_FLAG_ON}) ) 
                            
                          UNION (SELECT 
                            \'disposals\' AS table_name, sd.id AS detail_id, 0 AS in_quantity, quantity AS out_quantity, warehouse_id, NULL AS customer_id, supplier_id, product_id, lot_number, serial_number, ubd
                            FROM disposal_details AS sd LEFT JOIN disposals AS s ON s.id=sd.disposal_id 
                            #{diff_conditions} #{state_conditions} #{disposal_conditions} ) 
                          UNION (SELECT 
                            \'adjustments\' AS table_name, sd.id AS detail_id, quantity AS in_quantity, 0 AS out_quantity, #{diff_columns}
                            FROM adjustment_details AS sd LEFT JOIN adjustments AS s ON s.id=sd.adjustment_id 
                            #{diff_conditions} #{state_conditions} #{search_conditions} ) 
                          UNION (SELECT 
                            \'shippings-own\' AS table_name, sd.id AS detail_id, 0 AS in_quantity, quantity AS out_quantity, own_warehouse_id AS warehouse_id, NULL AS customer_id, supplier_id, product_id, lot_number, serial_number,ubd
                            FROM shipping_details AS sd LEFT JOIN shippings AS s ON s.id=sd.shipping_id 
                            #{diff_conditions} AND s.shipping_state_code=#{MCODE_SHIPPING_STATE_COMP} AND own_warehouse_id IS NOT NULL #{own_conditions} )
                          UNION (SELECT 
                            \'restorations-own\' AS table_name, sd.id AS detail_id, quantity AS in_quantity, 0 AS out_quantity, own_warehouse_id AS warehouse_id, NULL AS customer_id, supplier_id, product_id, lot_number, serial_number,ubd
                            FROM restoration_details AS sd LEFT JOIN restorations AS s ON s.id=sd.restoration_id 
                            #{diff_conditions} #{state_conditions} AND own_warehouse_id IS NOT NULL #{own_conditions} )
                          ) AS diff GROUP BY #{group_by}
                      ) AS c ON #{left_join_c}
                    " ) + ' ) AS t'
      return str_cols, str_tab, str_vals
    end
    #から実装
    def set_target_date_to_where(tab, params, str_where)
    end
  end
  # 得意先元帳
  class StockSearchPdf < CommLogistics::Modules::Print::Controller::PdfLedger
    def initialize(params, mcls)
      @pdf_basename = 'stock_search_list'
      @total_columns = [ 'in_quantity', 'out_quantity']
      @total_title_column = 'target_date'
      @format_price = []
      @format_date = []
      #test
      #@print_line_num_per_sheet = 8
      super
    end
    
    PDF_FILTER_OPTS={:filter => ['target_date', 'trans_type_dn', 'abstract', 'trans_id', 'customer_dn', 'price', 'own_warehouse_dn', 'shipment_customer_dn',
                                 'lot_number', 'serial_number', 'ubd', 'in_quantity', 'out_quantity', 'quantity_remain']}
    PDF_IN_OPTS={:calc_column => 'in_quantity', :calc_type => :add}
    PDF_OUT_OPTS={:calc_column => 'out_quantity', :calc_type => :del}
    TABLE_TO_DISP={'sales'=>'売上', 'shippings'=>'出荷', 'restorations'=>'返却', 'purchases'=>'仕入', 'adjustments'=>'在庫調整', 'disposals'=>'廃棄', 'samples'=>'サンプル',
                   'shippings-own'=>'出荷', 'purchases-in'=>'仕入', 'purchases-out'=>'仕入', 'restorations-own'=>'返却'}
    
    def make_sheet_sequential
      pdata, page, cnt = {}, 0, 0
      data_array = []
      pre_quantity = @params[:pre_quantity]
      req_array = @params[:record_list]
      if req_array.length > 0
        page, cnt = init_master_data(pdata, page, cnt, req_array.first, pre_quantity)
        req_array.each do |rec|
          if  rec['in_quantity'] && rec['in_quantity'].to_i > 0
            opts = PDF_IN_OPTS
          elsif rec['out_quantity'] && rec['out_quantity'].to_i > 0
            opts = PDF_OUT_OPTS
          else
            opts = {}
          end
          table_name = rec['table_name']
          rec['trans_type_dn'] = TABLE_TO_DISP.include?(table_name) ? TABLE_TO_DISP[table_name]: table_name
          page, cnt = record_array_to_pdata_with_filter(pdata, rec, page, cnt, opts.merge(PDF_FILTER_OPTS))
        end
        #総計
        @sub_totals.each do |k, v|
          Rails.logger.debug('total at NOT paging - key:'+k.to_s+' val:'+v.to_s)
          set_value_to_pdata(pdata, page, cnt, k, v)
        end
        set_value_to_pdata(pdata, page, cnt, @remain_column_name, @calc_remain)
        set_value_to_pdata(pdata, page, cnt, @total_title_column, '商品計')
        page, cnt = count_to_next_record_with_opts(pdata, page, cnt, true)
        
        doc_info = get_document_wide_info
        pdata.each do |index, rec_hash|
          rec_hash.update(doc_info)
          data_array[index]=rec_hash
        end
      end
      return data_array
    end
    
    def init_master_data(pdata, page, cnt, rec, quantity)
      @master_wide_info = {'warehouse_id' => rec['warehouse_id'], 'warehouse_dn' => rec['warehouse_dn'], 
                           'customer_id' => rec['customer_id'], 'customer_dn' => rec['customer_dn'],
                           'supplier_id' => rec['supplier_id'], 'supplier_dn' => rec['supplier_dn'],
                           'product_name' => [rec['product_set_dn'], rec['product_dn']].join(' ')}
      @calc_remain = quantity.to_i
      @remain_column_name = 'quantity_remain'
      set_value_to_pdata(pdata, page, cnt, 'target_date', '繰越数量')
      set_value_to_pdata(pdata, page, cnt, @remain_column_name, @calc_remain)
      return count_to_next_record_with_opts(pdata, page, cnt)
    end
  end
end