module CommLogistics::Modules::MngLedger
  include CommLogistics::Const::Code
  include CommLogistics::Const::Error
  
  def update_ledger(calc_type)
    #@ledger_date = Date.new(self.target_date.year, self.target_date.month, 1)
    #@ledger_date >>= @acnt_timing  #acnt_timingはクビなので、伝票締め日のform_cutoff_dateからledger_dateを割り出す。
    @ledger_date = Date.new(self.target_date.year, self.target_date.month, 1); #selfはSale/Purchaseなど
    #timing_codeはクビなので必要ない。
    
    # 売掛/買掛の加算（calc_typeが'CALC_SUB'の場合は減算）
    target_ledger = @ledger_cls.all_search(@acnt_target_id, @ledger_date).first
    unless target_ledger
      target_ledger = @ledger_cls.new
      params = {}
      unless target_ledger.init(make_ledger_params(params), @ledger_cls)
        raise LOEMJ0004 + EMD0001
      end
    end
    target_ledger.target_key = @target_key
    #target_ledger.cutoff_date_code = self.cutoff_date_code if self.cutoff_date_code
    #cutoff_date_codeはもうクビ。変わりにcutoff_type_codeとcutoff_dayを設定する。
    target_ledger.cutoff_type_code = self.cutoff_type_code if self.cutoff_type_code #selfはSale/Purchaseなど
    target_ledger.cutoff_day_code = self.cutoff_day_code if self.cutoff_day_code #selfはSale/Purchaseなど
    logger.debug("target:"+target_ledger.inspect)
    
    unless target_ledger.add_total(@ledger_details, calc_type, get_req_total_duty_calc_weight)
      raise LOEMJ0004 + LOEMD0004
    end
    
    # 明細登録（calc_typeが'CALC_SUB'の場合は削除）
    dparams = {}
    dparams =  make_ledger_detail_params(dparams)
    if calc_type == CALC_ADD
      unless target_ledger.child_details.build(dparams)
        raise LOEMJ0005 + EMD0011
      end
    else
      dparams.delete(:deal_type_code)
      dparams.each do |key, val|
        @ledger_detail_cls.destroy_all(["#{key.to_s} = ? ", val])
      end
    end
    
    unless target_ledger.save
      raise LOEMJ0004 + EMD0012
    end
    return true
  end

  def get_price_params_deal(details_params)
    result = init_ledger_price_params
#    details_params.each do |detail_params|
#      tmp_price = (detail_params["price"].to_i * detail_params["quantity"].to_i)
#      if tmp_price >= 0
#        result[:black_price] += tmp_price
#      else
#        result[:red_price] += tmp_price
#      end
#    end
    total = self.total_price.to_i
    if total >= 0
      result[:black_price] = total
    else
      result[:red_price] = total
    end
    result[:total_price] = self.total_price.to_i
    result[:total_duty]  = self.total_duty.to_i
    #価格調整
    if respond_to?(:is_adjust?) && is_adjust?
      result[:adjust_price] = self.total_price.to_i
    end
    return result
  end

  def get_price_params_payment(details_params)
    result = init_ledger_price_params
    details_params.each do |detail_params|
      ctype = detail_params["credit_type_code"]
      tmp_price = detail_params["amount"].to_i
      case ctype
      when MCODE_CREDIT_TYPE_CASH
        result[:cash] += tmp_price
      when MCODE_CREDIT_TYPE_BILL
        result[:bill] += tmp_price
      when MCODE_CREDIT_TYPE_OFFSET
        result[:offset] += tmp_price
      when MCODE_CREDIT_TYPE_FEE
        result[:fee] += tmp_price
      end
    end
    result[:total_credit]  = self.total_amount.to_i
    return result
  end

  def get_price_params_carry
    result = init_ledger_price_params
    result[:total_carry]  = self.total_carry.to_i
    result[:total_carry_duty]  = self.total_carry_duty.to_i
    return result
  end

private
  def make_ledger_params(params)
    params[:target_date]     = @ledger_date
    params[:target_id]       = @acnt_target_id
    params[:target_group_id] = @acnt_target_group_id
    if @ledger_cls.name == 'SupplierLedger'
      params[:currency_type_code] = self.currency_type_code
    end
    return params
  end

  def make_ledger_detail_params(detail_params)
    # ledger_type_code
    detail_params[:deal_type_code] = @acnt_type
    
    # xxxx_id
    case @acnt_type
    when MCODE_DEAL_TYPE_DEAL
      detail_params[:trade_id]    = id
    when MCODE_DEAL_TYPE_PAYMENT
      detail_params[:payment_id] = id
    when MCODE_DEAL_TYPE_CARRY
      detail_params[:carry_id]   = id
    end
    
    return detail_params
  end
  
  def init_ledger_price_params
    result = {
      :black_price  => 0,
      :red_price    => 0,
      :adjust_price => 0,
      :total_price  => 0,
      :total_duty   => 0,
      :cash         => 0,
      :bill         => 0,
      :offset       => 0,
      :fee          => 0,
      :total_credit => 0,
      :total_carry  => 0,
      :total_carry_duty => 0
    }
    return result
  end
end
