require_dependency "lib/comm_logistics/controllers/shippings_controller.rb"

class ShippingsController
  module ShippingsAddOnOMKK
    # 製品群ID->製品IDでソート
    def get_arranged_child_details_omkk(ar)
      details = ar.child_details
      arranged =  details.sort do |a,b|
  #        aset = ProductSet.find(a.product_set_id)
  #        bset = ProductSet.find(b.product_set_id)
        apro = Product.find(a.product_id)
        bpro = Product.find(b.product_id)
        begin
          (a.product_category_id <=> b.product_category_id).nonzero? ||
          (a.product_set_id <=> b.product_set_id).nonzero? ||
          (apro.spec1.to_i <=> bpro.spec1.to_i).nonzero? ||
          (apro.spec2.to_f <=> bpro.spec2.to_f).nonzero? ||
          (a.ubd <=> b.ubd).nonzero? ||
          (a.lot_number <=> b.lot_number)
        rescue => e
          Rails.logger.warn("\n>>>>>WARN pickingsheet:"+"\n"+e.message+"\n"+e.backtrace.join("\n"))
          (a.product_set_id <=> b.product_set_id).nonzero? ||
          (a.product_id <=> b.product_id)
        end
      end
      return arranged
    end
  end
  class ShippingPdfOut < PdfBase
    include ShippingsAddOnOMKK
    def get_arranged_child_details(ar)
      get_arranged_child_details_omkk(ar)
    end
    def get_print_rec_num_per_sheet
      return @print_rec_num_per_sheet
    end
  end
  class PickingPdfOut < PdfBase
    include ShippingsAddOnOMKK

    def initialize_with_omkk(params, mcls=nil)
      initialize_without_omkk(params,mcls)
      @print_rec_num_per_sheet = 15
    end
    alias_method_chain :initialize, :omkk
    
    def get_arranged_child_details(ar)
      get_arranged_child_details_omkk(ar)
    end
#    def make_sheet_add_for_detail(ar, detail_ar)
#      detail_hash = super
#      if detail_ar.quantity != 1 #通常数量が1となるものばっかなので、1以外の数量では印をつける
#        detail_hash['quantity'] = "* " + detail_ar.quantity.to_s
#      end
#      return detail_hash
#    end

    def make_sheet_add_for_main_with_omkk(ar)
      add_omkk = make_sheet_add_for_main_without_omkk(ar)
      spo = ShippingPdfOut.new(@params)
      if ar.arrival_date && ar.arrival_date.holiday?
        add_omkk['arrival_date_sign'] = '★'
      end
      
      #当該出荷が封筒挿入対象か調査（配送が営業店止め、品川倉庫引取のときは対象外とする）
      tmpShip = Shipping.find_by_sql(["SELECT COUNT(*) AS output_flag FROM shippings AS s LEFT JOIN master_app_production.deliveries AS d ON s.delivery_id = d.id
                                        WHERE s.id = #{ar.id}
                                          AND (d.id IS NULL OR (d.id IS NOT NULL AND d.trucking_id IS NULL AND d.always_show_flag_code = #{MCODE_FLAG_OFF}))"])
      #当該出荷が在庫移動ではなく、封筒挿入対象のとき
      if ar.shipment_customer_id > 0 && ar.shipping_type_code != MCODE_SHIPPING_TYPE_MOVE && tmpShip[0]['output_flag'].to_i == MCODE_FLAG_ON
        #対象の配送先において、当月の１回目の出荷指示書であるか調査
        result = Shipping.find_by_sql(["SELECT COUNT(*) AS number_of_slip FROM
                                              (SELECT id,delivery_id FROM shippings
                                                 WHERE ((target_date BETWEEN date_format(curdate(),'%%Y-%%m-01') AND INTERVAL -1 DAY + curdate()
                                                              AND shipping_state_code = #{MCODE_SHIPPING_STATE_COMP})
                                                          OR (target_date = curdate()
                                                              AND id < #{ar.id}
                                                              AND shipping_state_code != #{MCODE_SHIPPING_STATE_WAIT}
                                                              AND shipping_state_code != #{MCODE_SHIPPING_STATE_BO}))
                                                      AND shipment_customer_id = #{ar.shipment_customer_id}
                                                      AND shipping_type_code != #{MCODE_SHIPPING_TYPE_MOVE}
                                                      AND invalid_flag_code = #{MCODE_FLAG_OFF}
                                               ) AS t LEFT JOIN master_app_production.deliveries AS d ON t.delivery_id = d.id
                                                 WHERE (d.id IS NULL OR (d.id IS NOT NULL AND d.trucking_id IS NULL AND d.always_show_flag_code = #{MCODE_FLAG_OFF}))"])
        #当月１回目の出荷指示書のとき
        if result[0]['number_of_slip'].to_i == 0
          #前月の出荷伝票枚数を算出。前月に出荷がない場合は過去３ヶ月まで遡及して算出。
          3.times do |i|
            result2 = ShippingDetail.find_by_sql(["SELECT IFNULL(SUM(TRUNCATE(number_of_pages / #{spo.get_print_rec_num_per_sheet} + 0.99, 0)),0) AS total_number_of_pages FROM
                                                         (SELECT COUNT(*) AS number_of_pages, s.id from shipping_details AS sd LEFT JOIN shippings AS s ON sd.shipping_id = s.id 
                                                            WHERE target_date BETWEEN '#{(ar.target_date << i+1).beginning_of_month}' AND '#{(ar.target_date << i+1).end_of_month}'
                                                              AND shipment_customer_id = #{ar.shipment_customer_id}
                                                              AND s.invalid_flag_code=#{MCODE_FLAG_OFF}
                                                              AND s.shipping_state_code = #{MCODE_SHIPPING_STATE_COMP}
                                                              AND s.shipping_type_code != #{MCODE_SHIPPING_TYPE_MOVE}
                                                            GROUP BY s.id ) AS t"])
                                                             
            if result2[0]['total_number_of_pages'].to_i != 0
              #15枚で封筒１枚とする。
              add_omkk['envelope_number'] = ((result2[0]['total_number_of_pages'].to_i + 15 - 1) / 15).to_s + ' 枚'
              break
            end
          end
        end  
      end
      
      return add_omkk
    end
    alias_method_chain :make_sheet_add_for_main, :omkk
    
    def format_value(hash)
      hash = super
      hash.keys.each do |key|
        val = hash[key].to_s
        if key == 'quantity' && val != "1"
          hash[key] = "* " + val
        end
      end
      return hash
    end

    #同一配送先の複数の伝票を同時に指示書印刷すると不具合が起こるので
    #オーバーライドする。この処理はpicking_printed_searchの中ですることにします。
    def post_update(is_success=true)
    end

  end
end