#
#= 表示名一覧取得 コントローラー共通
# Authors:: Sumiyo Yamamoto
# Copyright:: Copyright (C) OrbusNeich Medical K.K.  2010.
#--
# date        name                   note
# 2010.2.26   Sumiyo Yamamoto        新規作成
#-------------------------------------------------------------------------------
#++
module Comm
  module BaseController
    class DispName < ApplicationController
      require 'config/site_config.rb'
      include Comm::Const::VirtualId
      include Comm::Module::DateParams
      include Comm::Const::DispNameLists

      #== 一覧表示
      #-----------------------------------------------------------------#++
      def index
        # パラメータ取得
        @col_name = params[:col_name]
        @req_cols = params[:require_col] ? params[:require_col].values : []
        #disp_cols = params[:disp_require_col] ? params[:disp_require_col].values : []
        #@req_cols.concat(disp_cols)
        #コンボボックスのリストの並びを特定の列にする対応。これをしない場合はdisp_sortがソート順となる。
        if $SORT_COMBO_RECORD && !$SORT_COMBO_RECORD[@col_name].blank? && params[:sort_opt].blank? 
          params[:sort_opt]=$SORT_COMBO_RECORD[@col_name]
        end
        # データ取得
        get_disp_names
        
        # 追加disp_name
        #disp_cols.each do |col|
        #  Comm::Tool::DispName.add_disp_names(@disp_names, col, [])
        #end
        
        # 追加特有リスト
        if params[:add_self] == STR_TRUE
          add_list(LIST_SELF)
        end
#        if params[:add_price] == STR_TRUE
#          add_list(LIST_PRICE)
#        end
        if params[:add_all] == STR_TRUE
          add_list(LIST_ALL)
        end
        
        if params[:add_own_customer] == STR_TRUE
          add_list(LIST_OWN_CUSTOMER)
        end
        
        # JSONデータ返却
        respond_to do |format|
          format.ext_json {
            jsondata = @disp_names.to_ext_json('disp_names', nil)
            render :json => jsondata
          }
        end
      end

    protected
      #== データ取得
      #-----------------------------------------------------------------#++
      def get_disp_names
        
        @disp_names = []
        # own_warehouse_id検索
        #if @col_name == 'own_warehouse_id'
        #  @disp_names = Warehouse.dlist.passign('own_flag_code', [Comm::Const::MasterCode::MCODE_OWN_ON, Comm::Const::MasterCode::MCODE_OWN_RESERVE]).all.only_hashfy
        #  return
        #end
        
        # 通常検索
        if params[:mode].blank?
          normal_search
          return
        end
        #マスターでないもののリストを作る場合。
        if params[:mode] == 'char'
          char_list_search(params)
          return 
        end
        
        # 自社在庫検索
        if params[:mode] == 'own_warehouse'
          @disp_names = Warehouse.dlist([]).passign('own_flag_code', [Comm::Const::MasterCode::MCODE_OWN_ON, Comm::Const::MasterCode::MCODE_OWN_RESERVE]).all.only_hashfy
          return
        end
        
        # 病院検索
        if params[:mode] == 'warehouse'
          warehouse_search(params[:id])
          return
        end
        
        # 部署検索
        if params[:mode] == 'sales_section'
          sales_section_search
          return
        end
        
      end

      #== 通常検索
      #-----------------------------------------------------------------#++
      def normal_search
        if /(.+)_id$/ =~ @col_name
          @disp_names = Comm::Tool::DispName.get_id_disp_names(@col_name, @req_cols, (params[:noiv]==STR_TRUE ? MFIND_V : MFIND_A), [], params[:disp_key] || 'disp_name', params[:sort_opt])
        elsif /(.+)_code$/ =~ @col_name
          @disp_names = Comm::Tool::DispName.get_code_disp_names(@col_name, @req_cols, MFIND_V, [], params[:disp_key] || 'disp_name')
        end
        return
      end
      
      #--マスターでないもののリストを作る。
      def char_list_search(params)
        if !params[:table_name].blank? && !params[:col_name].blank?
          cls = params[:table_name].classify.constantize
          tmp_order = params[:sort_opt].blank? ? (cls.columns_hash["disp_sort"].blank? ? params[:col_name] : "disp_sort, #{params[:col_name]}") : params[:sort_opt] 
          @disp_names = cls.find(:all, :select => (["id", "#{params[:col_name]} AS disp_name"] + @req_cols).join(','), :order => "#{tmp_order} ASC", :conditions => "#{params[:col_name]} IS NOT NULL AND #{params[:col_name]}!=''", :group => params[:col_name]).only_hashfy
        end
      end
      
      #== 病院検索
      #-----------------------------------------------------------------#++
      def warehouse_search(uid = nil)
        # 全病院取得
        cols = ['id', 'disp_name', 'user_position_id'] + @req_cols
        @disp_names = Warehouse.select(cols).all.only_hashfy
        
        # 担当フラグ追加
        unless uid.blank?
          up_ids = (UserPosition.sassign('user_id', uid).all).extract('id')
          @disp_names.each do |dn|
            if up_ids.index(dn['user_position_id'])
              dn['charge'] = true
            else
              dn['charge'] = false
            end
          end
        end
        
        return
      end

      #== 部署検索
      #-----------------------------------------------------------------#++
      def sales_section_search
        date = get_date(params[:date])
        
        sections = Section.find_sales_group_by_date(date)
        
        @disp_names = sections.map {|section| {
          'id' => (section.id + VID_OFFSET_SECTION),
          'disp_name' => section.disp_name
        } }
        
        return
      end

      #== リスト追加
      #-----------------------------------------------------------------#++
      def add_list(target = nil)
        @disp_names.unshift({'id' => target, 'disp_name' => params[:add_disp_name] || LIST_INFO[target]})
      end
    end
  end
end
