diff --git a/.travis.yml b/.travis.yml index b764c664..4de66914 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: ruby rvm: -- 2.2.2 +- 2.5.3 branches: only: - master diff --git a/Gemfile b/Gemfile index 7765c10d..97ea577a 100644 --- a/Gemfile +++ b/Gemfile @@ -7,12 +7,14 @@ source "https://rubygems.org" # To use debugger # gem 'debugger' -gem 'transam_core', git: 'https://github.com/camsys/transam_core', branch: :quarter4 -gem 'transam_reporting', git: 'https://github.com/camsys/transam_reporting', branch: :quarter4 -gem 'transam_transit', git: 'https://github.com/camsys/transam_transit', branch: :quarter4 -gem 'mysql2', '~> 0.3.20' # lock gem for dummy app +gem 'transam_core', git: 'https://github.com/camsys/transam_core', branch: :quarter1 +gem 'transam_reporting', git: 'https://github.com/camsys/transam_reporting', branch: :quarter1 +gem 'transam_transit', git: 'https://github.com/camsys/transam_transit', branch: :quarter1 +gem 'mysql2', '~> 0.5.1' # lock gem for dummy app gem "capybara", '2.6.2' # lock gem for old capybara behavior on hidden element xpath +gem 'rails-controller-testing' # assigns has been extracted to this gem + # This gem allows us to share githooks. Githooks in the .hooks folder can be checked # in, and when "bundle install" is run this gem automatically creates symlinks into # your local .git/hooks. If you have pre-existing hooks in .git/hooks, it will move diff --git a/app/assets/javascripts/grant_amendments.js b/app/assets/javascripts/grant_amendments.js new file mode 100644 index 00000000..dee720fa --- /dev/null +++ b/app/assets/javascripts/grant_amendments.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/grant_amendments.css b/app/assets/stylesheets/grant_amendments.css new file mode 100644 index 00000000..afad32db --- /dev/null +++ b/app/assets/stylesheets/grant_amendments.css @@ -0,0 +1,4 @@ +/* + Place all the styles related to the matching controller here. + They will automatically be included in application.css. +*/ diff --git a/app/controllers/grant_amendments_controller.rb b/app/controllers/grant_amendments_controller.rb new file mode 100644 index 00000000..0ece1a84 --- /dev/null +++ b/app/controllers/grant_amendments_controller.rb @@ -0,0 +1,76 @@ +class GrantAmendmentsController < OrganizationAwareController + add_breadcrumb "Home", :root_path + add_breadcrumb "Grants", :grants_path + + before_action :set_grant + + before_action :set_grant_amendment, only: [:show, :edit, :update, :destroy] + + before_action :set_paper_trail_whodunnit + + # GET /grant_amendments + def index + @grant_amendments = @grant.grant_amendments + end + + # GET /grant_amendments/1 + def show + end + + # GET /grant_amendments/new + def new + add_breadcrumb @grant.to_s, grant_path(@grant) + add_breadcrumb "New Amendment" + + @grant_amendment = @grant.grant_amendments.build + end + + # GET /grant_amendments/1/edit + def edit + add_breadcrumb @grant.to_s, grant_path(@grant) + add_breadcrumb "Update Amendment" + end + + # POST /grant_amendments + def create + @grant_amendment = @grant.grant_amendments.build(grant_amendment_params) + @grant_amendment.creator = current_user + + if @grant_amendment.save + redirect_to @grant, notice: 'Grant amendment was successfully created.' + else + render :new + end + end + + # PATCH/PUT /grant_amendments/1 + def update + if @grant_amendment.update(grant_amendment_params) + + redirect_to @grant, notice: 'Grant amendment was successfully updated.' + else + render :edit + end + end + + # DELETE /grant_amendments/1 + def destroy + @grant_amendment.destroy + redirect_to @grant, notice: 'Grant amendment was successfully destroyed.' + end + + private + def set_grant + @grant = Grant.find_by(object_key: params[:grant_id]) + end + + # Use callbacks to share common setup or constraints between actions. + def set_grant_amendment + @grant_amendment = GrantAmendment.find_by(object_key: params[:id]) + end + + # Only allow a trusted parameter "white list" through. + def grant_amendment_params + params.require(:grant_amendment).permit(GrantAmendment.allowable_params) + end +end diff --git a/app/controllers/grant_apportionments_controller.rb b/app/controllers/grant_apportionments_controller.rb new file mode 100644 index 00000000..f4820e67 --- /dev/null +++ b/app/controllers/grant_apportionments_controller.rb @@ -0,0 +1,74 @@ +class GrantApportionmentsController < OrganizationAwareController + + before_action :set_grant + before_action :set_grant_apportionment, only: [:show, :edit, :update, :destroy] + + # GET /grant_apportionments + def index + @grant_apportionments = @grant.grant_apportionments + end + + # GET /grant_apportionments/1 + def show + end + + # GET /grant_apportionments/new + def new + @grant_apportionment = GrantApportionment.new + end + + # GET /grant_apportionments/1/edit + def edit + end + + # POST /grant_apportionments + def create + @grant_apportionment.creator = current_user + + @grant_apportionment = GrantApportionment.new(grant_apportionment_params) + + if @grant_apportionment.save + redirect_to @grant, notice: 'Grant apportionment was successfully created.' + else + render :new + end + end + + # PATCH/PUT /grant_apportionments/1 + def update + + @grant_apportionment.updater = current_user + + respond_to do |format| + if @grant_apportionment.update(grant_apportionment_params) + notify_user(:notice, "Grant apportionment was successfully updated.") + format.html { redirect_to @grant } + format.json { head :no_content } + else + format.html { render action: 'edit' } + format.json { render json: @grant.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /grant_apportionments/1 + def destroy + @grant_apportionment.destroy + redirect_to @grant, notice: 'Grant apportionment was successfully destroyed.' + end + + private + def set_grant + @grant = Grant.find_by(object_key: params[:grant_id]) + end + + # Use callbacks to share common setup or constraints between actions. + def set_grant_apportionment + @grant_apportionment = GrantApportionment.find_by(object_key: params[:id]) + end + + # Only allow a trusted parameter "white list" through. + def grant_apportionment_params + params.require(:grant_apportionment).permit(GrantApportionment.allowable_params) + end +end diff --git a/app/controllers/grants_controller.rb b/app/controllers/grants_controller.rb index a2a4ffe3..50b76a93 100644 --- a/app/controllers/grants_controller.rb +++ b/app/controllers/grants_controller.rb @@ -1,55 +1,57 @@ class GrantsController < OrganizationAwareController + authorize_resource + # Include the fiscal year mixin include FiscalYear add_breadcrumb "Home", :root_path add_breadcrumb "Grants", :grants_path - before_action :set_grant, :only => [:show, :edit, :update, :destroy, :summary_info] + before_action :set_grant, :only => [:show, :edit, :update, :destroy, :summary_info, :fire_workflow_event] + before_action :reformat_date_fields, only: [:create, :update] + + before_action :set_paper_trail_whodunnit INDEX_KEY_LIST_VAR = "grants_key_list_cache_var" def index - @fiscal_years = fiscal_year_range - # Start to set up the query - conditions = [] - values = [] + conditions = {} - conditions << 'organization_id IN (?)' - values << @organization_list + conditions[:owner_id] = @organization_list - @sourceable_id = params[:sourceable_id] - unless @sourceable_id.blank? - @sourceable_id = @sourceable_id.to_i - conditions << 'sourceable_id = ?' - values << @sourceable_id + if params[:global_sourceable] + @sourceable = GlobalID::Locator.locate params[:global_sourceable] + conditions[:sourceable] = @sourceable end @fiscal_year = params[:fiscal_year] unless @fiscal_year.blank? @fiscal_year = @fiscal_year.to_i - conditions << 'fy_year = ?' - values << @fiscal_year + conditions[:fy_year] = @fiscal_year + end + + @state = params[:state] + if @state == "default" || @state.blank? + conditions[:state] = ["in_development", "open"] + elsif @state != "all" + conditions[:state] = @state end # TODO fix for sourceable - @grants = Grant.where(conditions.join(' AND '), *values) + @grants = Grant.where(conditions) # cache the set of object keys in case we need them later cache_list(@grants, INDEX_KEY_LIST_VAR) - if @sourceable_id.blank? - add_breadcrumb "All" - else - add_breadcrumb Grant::SOURCEABLE_TYPE.constantize.find_by(id: @sourceable_id) - end - respond_to do |format| format.html # index.html.erb format.json { render :json => @grants } + format.xlsx do + response.headers['Content-Disposition'] = "attachment; filename=Grant Table Export.xlsx" + end end end @@ -67,16 +69,10 @@ def summary_info # GET /grants/1.json def show - add_breadcrumb @grant.sourceable, eval(@grant.sourceable_path) - add_breadcrumb @grant.to_s, grant_path(@grant) + add_breadcrumb "Grant Profile" @assets = @grant.assets.where('organization_id in (?)', @organization_list) - # get the @prev_record_path and @next_record_path view vars - get_next_and_prev_object_keys(@grant, INDEX_KEY_LIST_VAR) - @prev_record_path = @prev_record_key.nil? ? "#" : grant_path(@prev_record_key) - @next_record_path = @next_record_key.nil? ? "#" : grant_path(@next_record_key) - respond_to do |format| format.html # show.html.erb format.json { render :json => @grant } @@ -89,37 +85,29 @@ def new add_breadcrumb "New", new_grant_path - # get fiscal years up to planning year + 3 years - @fiscal_years = fiscal_year_range(4) - @grant = Grant.new(:sourceable_id => params[:sourceable_id]) end - # GET /grants/1/edit - def edit - - add_breadcrumb @grant.sourceable, eval(@grant.sourceable_path) - add_breadcrumb @grant.to_s, grant_path(@grant) - add_breadcrumb "Update" - - # get fiscal years up to planning year + 3 years - @fiscal_years = fiscal_year_range(4) - - end - # POST /grants # POST /grants.json def create - @grant = Grant.new(grant_params.except(:sourceable_id)) - @grant.sourceable = Grant::SOURCEABLE_TYPE.constantize.find_by(id: params[:grant][:sourceable_id]) - @grant.organization_id = @organization_list.first if @grant.organization_id.nil? + @grant = Grant.new(grant_params.except(:contributor_id)) + if params[:grant][:contributor_id] == 'multiple' + @grant.has_multiple_contributors = true + elsif params[:grant][:contributor_id].to_i > 0 + @grant.has_multiple_contributors = false + @grant.contributor_id = params[:grant][:contributor_id] + end + + @grant.creator = current_user + @grant.updater = current_user respond_to do |format| - if @grant.save! + if @grant.save notify_user(:notice, "The grant was successfully saved.") - format.html { redirect_to grant_url(@grant) } + format.html { redirect_to grant_path(@grant) } format.json { render action: 'show', status: :created, location: @grant } else format.html { render action: 'new' } @@ -132,13 +120,19 @@ def create # PATCH/PUT /grants/1.json def update - # get fiscal years up to planning year + 3 years - @fiscal_years = fiscal_year_range(4) + if params[:grant][:contributor_id] == 'multiple' + @grant.has_multiple_contributors = true + elsif params[:grant][:contributor_id].to_i > 0 + @grant.has_multiple_contributors = false + @grant.contributor_id = params[:grant][:contributor_id] + end + + @grant.updater = current_user respond_to do |format| - if @grant.update(grant_params) - notify_user(:notice, "The Gratn was successfully updated.") - format.html { redirect_to grant_url(@grant) } + if @grant.update(grant_params.except(:contributor_id)) + notify_user(:notice, "The grant was successfully updated.") + format.html { redirect_to grant_path(@grant) } format.json { head :no_content } else format.html { render action: 'edit' } @@ -152,17 +146,40 @@ def update def destroy name = @grant.to_s @grant.destroy - notify_user(:notice, "Grant # {name} was successfully removed.") + notify_user(:notice, "The grant was successfully removed.") + respond_to do |format| format.html { redirect_to grants_url } format.json { head :no_content } end end + def fire_workflow_event + + event_name = params[:event] + + if Grant.event_names.include? event_name + if @grant.fire_state_event(event_name) + event = WorkflowEvent.new + event.creator = current_user + event.accountable = @grant + event.event_type = event_name + event.save + else + notify_user(:alert, "Could not #{event_name.humanize} grant #{@grant}") + end + else + notify_user(:alert, "#{event_name} is not a valid event for a grant") + end + + redirect_back(fallback_location: root_path) + + end + private # Use callbacks to share common setup or constraints between actions. def set_grant - @grant = Grant.find_by(object_key: params[:id], organization_id: @organization_list) + @grant = Grant.find_by(object_key: params[:id], owner_id: @organization_list) if @grant.nil? if Grant.find_by(object_key: params[:id]).nil? @@ -175,22 +192,19 @@ def set_grant end end - def fiscal_year_range(num_forecasting_years=nil) - # get range of fiscal years of all grants. Default to current fiscal - # years if there are no grants available - min_fy = Grant.where(:organization => @organization).minimum(:fy_year) - - if min_fy.nil? - get_fiscal_years - else - date_str = "#{SystemConfig.instance.start_of_fiscal_year}-#{min_fy}" - start_of_min_fy = Date.strptime(date_str, "%m-%d-%Y") - get_fiscal_years(start_of_min_fy,num_forecasting_years) - end - end - def grant_params params.require(:grant).permit(Grant.allowable_params) end + def reformat_date_fields + params[:grant][:award_date] = reformat_date(params[:grant][:award_date]) unless params[:grant][:award_date].blank? + end + + def reformat_date(date_str) + # See if it's already in iso8601 format first + return date_str if date_str.match(/\A\d{4}-\d{2}-\d{2}\z/) + + Date.strptime(date_str, '%m/%d/%Y').strftime('%Y-%m-%d') + end + end diff --git a/app/helpers/grant_amendments_helper.rb b/app/helpers/grant_amendments_helper.rb new file mode 100644 index 00000000..faba3379 --- /dev/null +++ b/app/helpers/grant_amendments_helper.rb @@ -0,0 +1,2 @@ +module GrantAmendmentsHelper +end diff --git a/app/helpers/grant_apportionments_helper.rb b/app/helpers/grant_apportionments_helper.rb new file mode 100644 index 00000000..8779e0f5 --- /dev/null +++ b/app/helpers/grant_apportionments_helper.rb @@ -0,0 +1,2 @@ +module GrantApportionmentsHelper +end diff --git a/app/jobs/asset_depreciation_expense_update_job.rb b/app/jobs/asset_depreciation_expense_update_job.rb index 32950d68..633fc37b 100644 --- a/app/jobs/asset_depreciation_expense_update_job.rb +++ b/app/jobs/asset_depreciation_expense_update_job.rb @@ -10,7 +10,7 @@ class AssetDepreciationExpenseUpdateJob < ActivityJob def run asset_klass = Rails.application.config.asset_base_class_name.constantize - asset_klass.where.not(current_depreciation_date: Policy.first.current_depreciation_date).each do |a| + asset_klass.not_in_transfer.where.not(current_depreciation_date: Policy.first.current_depreciation_date).each do |a| asset = asset_klass.get_typed_asset(a) asset.update_asset_book_value asset.save(validate: false) @@ -26,5 +26,5 @@ def prepare super Rails.logger.debug "Executing AssetDepreciationExpenseUpdateJob at #{Time.now.to_s}" end - p + end \ No newline at end of file diff --git a/app/models/abilities/authorized_accounting_ability.rb b/app/models/abilities/authorized_accounting_ability.rb new file mode 100644 index 00000000..26f9414a --- /dev/null +++ b/app/models/abilities/authorized_accounting_ability.rb @@ -0,0 +1,17 @@ +module Abilities + class AuthorizedAccountingAbility + include CanCan::Ability + + def initialize(user, organization_ids=[]) + + if organization_ids.empty? + organization_ids = user.organization_ids + end + + + cannot :read, Grant + + + end + end +end \ No newline at end of file diff --git a/app/models/abilities/grant_manager.rb b/app/models/abilities/grant_manager.rb new file mode 100644 index 00000000..4ea32df4 --- /dev/null +++ b/app/models/abilities/grant_manager.rb @@ -0,0 +1,18 @@ +module Abilities + class GrantManager + include CanCan::Ability + + def initialize(user, organization_ids=[]) + + if organization_ids.empty? + organization_ids = user.organization_ids + end + + can :manage, Grant do |grant| + user.viewable_organization_ids.include? grant.owner_id + end + + end + + end +end \ No newline at end of file diff --git a/app/models/abilities/transit_manager_accounting_ability.rb b/app/models/abilities/transit_manager_accounting_ability.rb index d08b4a80..a780d928 100644 --- a/app/models/abilities/transit_manager_accounting_ability.rb +++ b/app/models/abilities/transit_manager_accounting_ability.rb @@ -8,8 +8,6 @@ def initialize(user, organization_ids=[]) organization_ids = user.organization_ids end - can :manage, Grant, :organization_id => organization_ids - can :manage, GeneralLedgerAccount do |gla| organization_ids.include? gla.chart_of_account.organization_id end diff --git a/app/models/depreciation_entry.rb b/app/models/depreciation_entry.rb index 5ab3304d..565b8894 100644 --- a/app/models/depreciation_entry.rb +++ b/app/models/depreciation_entry.rb @@ -15,6 +15,7 @@ class DepreciationEntry < ActiveRecord::Base #------------------------------------------------------------------------------ belongs_to :asset + belongs_to :transam_asset has_and_belongs_to_many :general_ledger_account_entries diff --git a/app/models/funding_source.rb b/app/models/funding_source.rb index ca2952f5..36f88d64 100644 --- a/app/models/funding_source.rb +++ b/app/models/funding_source.rb @@ -27,8 +27,8 @@ class FundingSource < ActiveRecord::Base belongs_to :funding_source_type # Each funding source was created and updated by a user - belongs_to :creator, :class_name => "User", :foreign_key => :created_by_id - belongs_to :updator, :class_name => "User", :foreign_key => :updated_by_id + belongs_to :creator, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :created_by_id + belongs_to :updator, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :updated_by_id # Each funding program has zero or more documents. Documents are deleted when the program is deleted has_many :documents, :as => :documentable, :dependent => :destroy diff --git a/app/models/general_ledger_account_entry.rb b/app/models/general_ledger_account_entry.rb index f1328150..e432e532 100644 --- a/app/models/general_ledger_account_entry.rb +++ b/app/models/general_ledger_account_entry.rb @@ -14,7 +14,7 @@ class GeneralLedgerAccountEntry < ActiveRecord::Base # Associations #------------------------------------------------------------------------------ belongs_to :general_ledger_account - belongs_to :asset + belongs_to :asset, class_name: Rails.application.config.asset_base_class_name #------------------------------------------------------------------------------ # Validations diff --git a/app/models/grant.rb b/app/models/grant.rb index b641343a..cfa962c7 100644 --- a/app/models/grant.rb +++ b/app/models/grant.rb @@ -8,7 +8,7 @@ #------------------------------------------------------------------------------ class Grant < ActiveRecord::Base - SOURCEABLE_TYPE = Rails.application.config.grant_source + has_paper_trail on: [:create, :update], only: [:state, :fy_year, :sourceable_type, :sourceable_id, :amount] # Include the object key mixin include TransamObjectKey @@ -16,23 +16,31 @@ class Grant < ActiveRecord::Base # Include the fiscal year mixin include FiscalYear + include TransamWorkflow + #------------------------------------------------------------------------------ # Callbacks #------------------------------------------------------------------------------ after_initialize :set_defaults + before_save :update_grant_apportionments + #------------------------------------------------------------------------------ # Associations #------------------------------------------------------------------------------ - # Every funding line item belongs to an organization - belongs_to :organization + belongs_to :owner, class_name: 'Organization' + belongs_to :contributor, class_name: 'Organization' # Has a single funding source belongs_to :sourceable, :polymorphic => true + has_many :grant_apportionments + + has_many :grant_amendments + # Has many grant purchases has_many :grant_purchases, :as => :sourceable, :dependent => :destroy - has_many :assets, :through => :grant_purchases + has_many :assets, through: :grant_purchases, source: Rails.application.config.asset_base_class_name.underscore # Has many grant purchases has_many :grant_budgets, :dependent => :destroy, :inverse_of => :grant @@ -42,37 +50,86 @@ class Grant < ActiveRecord::Base has_many :general_ledger_accounts, :through => :grant_budgets - # Has 0 or more documents. Using a polymorphic association. These will be removed if the Grant is removed - has_many :documents, :as => :documentable, :dependent => :destroy + belongs_to :creator, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :created_by_user_id + + belongs_to :updater, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :updated_by_user_id + + + #------------------------------------------------------------------------------ + # + # State Machine + # + # Used to track the state of a grant through the workflow process + # + #------------------------------------------------------------------------------ + state_machine :state, :initial => :in_development do + + #------------------------------- + # List of allowable states + #------------------------------- + + state :in_development - # Has 0 or more comments. Using a polymorphic association, These will be removed if the project is removed - has_many :comments, :as => :commentable, :dependent => :destroy + state :open + + state :closed + + #--------------------------------------------------------------------------- + # List of allowable events. Events transition a Grant from one state to another + #--------------------------------------------------------------------------- + + event :publish do + transition [:in_development] => :open + end + + event :close do + transition [:open] => :closed + end + + event :reopen do + transition [:closed] => :open + end + + # Callbacks + before_transition do |form, transition| + Rails.logger.debug "Transitioning #{form} from #{transition.from_name} to #{transition.to_name} using #{transition.event}" + end + end #------------------------------------------------------------------------------ # Validations #------------------------------------------------------------------------------ - validates :organization, :presence => true - validates :name, :presence => true, :uniqueness => true + validates :owner, :presence => true + validates :grant_num, :presence => true, :uniqueness => true validates :fy_year, :presence => true, :numericality => {:only_integer => true, :greater_than_or_equal_to => 1970} validates :sourceable, :presence => true validates :amount, :presence => true, :numericality => {:only_integer => true, :greater_than_or_equal_to => 0} + validates :award_date, :presence => true #------------------------------------------------------------------------------ # Scopes #------------------------------------------------------------------------------ scope :active, -> { where(:active => true) } + scope :open, -> { where(state: 'open') } # default scope # List of hash parameters allowed by the controller FORM_PARAMS = [ - :organization_id, + :owner_id, + :contributor_id, + :other_contributor, + :has_multiple_contributors, + :global_sourceable, :sourceable_type, :sourceable_id, - :name, + :grant_num, :fy_year, + :award_date, :amount, + :legislative_authorization, + :over_allocation_allowed, :active, :grant_budgets_attributes => [GrantBudget.allowable_params] ] @@ -81,7 +138,7 @@ class Grant < ActiveRecord::Base SEARCHABLE_FIELDS = [ :object_key, :sourceable, - :name + :grant_num ] #------------------------------------------------------------------------------ @@ -94,24 +151,65 @@ def self.allowable_params FORM_PARAMS end - def self.sourceable_type - SOURCEABLE_TYPE - end - - def self.sources(params=nil) - if params - SOURCEABLE_TYPE.constantize.where(params) + def self.formatted_version(version) + if version.event == 'create' + ver = [ + { + datetime: version.created_at, + event: "Apportionment Created", + event_type: 'Created', + comments: "Apportionment 'Primary' was created in the amount of #{ActiveSupport::NumberHelper.number_to_currency(version.changeset['amount'][1], precision: 0)}.", + user: version.actor + }, + { + datetime: version.created_at, + event: "Grant Created", + event_type: 'Created', + comments: "Grant is In Development.", + user: version.actor + } + ] else - SOURCEABLE_TYPE.constantize.active + if version.changeset.key? 'state' + event = self.new.state_paths(:from => version.changeset['state'][0], :to => version.changeset['state'][1]).first.first.event.to_s + + ver = { + datetime: version.created_at, + event: "Grant #{event.titleize}#{event == 'close' ? 'd' : 'ed'}", + event_type: 'Updated', + comments: "Grant is #{version.changeset['state'][1].titleize}", + user: version.actor + } + + case version.changeset['state'][1] + when 'open' + ver[:comments] += ', and funds can be assigned to assets.' + when 'closed' + ver[:comments] += '. No further edits or assignment of funds can be made.' + when 'reopened' + ver[:comments] += ', and funds can be assigned to assets.' + end + + else + ver = { + datetime: version.created_at, + event: "Apportionment Updated", + event_type: 'Updated', + comments: "Apportionment 'Primary' was Updated.", + user: version.actor + } + + version.changeset.each do |key, val| + if key.to_s == 'amount' + ver[:comments] += " The #{key} was updated from #{ActiveSupport::NumberHelper.number_to_currency(val[0], precision: 0)} to #{ActiveSupport::NumberHelper.number_to_currency(val[1], precision: 0)}." + else + ver[:comments] += " The #{key} was updated from #{val[0]} to #{val[1]}." + end + end + end end - end - def self.label - if SOURCEABLE_TYPE == 'FundingSource' - 'Funding Program' - else - SOURCEABLE_TYPE.constantize.model_name.human.titleize - end + ver end #------------------------------------------------------------------------------ @@ -120,10 +218,50 @@ def self.label # #------------------------------------------------------------------------------ + def grant_num + + grant_num_temp = nil + + grant_amendments.order(created_at: :desc).each do |amendment| + grant_num_temp = amendment.grant_num + break if grant_num_temp.present? + end + + grant_num_temp = read_attribute(:grant_num) unless grant_num_temp.present? + + return grant_num_temp + end + + def is_single_apportionment? + true # TODO: add multiple + end + + def open? + state == 'open' + end + + def updatable? + ['in_development', 'open'].include? state + end + def deleteable? + state == 'in_development' + end + + def funding_source + sourceable_type == 'FundingSource' ? sourceable : sourceable.funding_source + end + + def global_sourceable + self.sourceable.to_global_id if self.sourceable.present? + end + def global_sourceable=(sourceable) + self.sourceable=GlobalID::Locator.locate sourceable + end + # Calculate the anount of the grant that has been spent on assets to date. This calculates # only the federal percentage def spent - GrantPurchase.where(sourceable: self).to_a.sum{ |gp| gp.asset.purchase_cost * gp.pcnt_purchase_cost / 100.0 } + GrantPurchase.where(sourceable: self).to_a.sum{ |gp| gp.send(Rails.application.config.asset_base_class_name.underscore).purchase_cost * gp.pcnt_purchase_cost / 100.0 } end # Returns the balance of the fund. If the account is overdrawn @@ -150,17 +288,12 @@ def available # # end - # Override the mixin method and delegate to it - def fiscal_year(year = nil) - if year - super(year) - else - super(fy_year) - end + def closeout_date + workflow_events.where(event_type: 'close').last.try(:created_at).try(:to_date) end def to_s - name + grant_num end def searchable_fields @@ -171,6 +304,11 @@ def sourceable_path "#{sourceable_type.underscore}_path(:id => '#{sourceable.object_key}')" end + # formats paper_trail versions + def history + PaperTrail::Version.where(item: [self, self.grant_apportionments, self.grant_amendments]).order(created_at: :desc).map{|v| v.item_type.constantize.formatted_version(v) }.flatten + end + #------------------------------------------------------------------------------ # # Protected Methods @@ -181,9 +319,20 @@ def sourceable_path # Set resonable defaults for a new grant def set_defaults # Set the fiscal year to the current fiscal year + self.has_multiple_contributors = self.has_multiple_contributors.nil? ? false : self.has_multiple_contributors self.fy_year ||= current_fiscal_year_year self.amount ||= 0 self.active = self.active.nil? ? true : self.active end + def update_grant_apportionments + if is_single_apportionment? + if grant_apportionments.empty? + grant_apportionments.build + else + grant_apportionments.update_all(sourceable_type: self.sourceable_type, sourceable_id: self.sourceable_id, amount: self.amount) + end + end + end + end diff --git a/app/models/grant_amendment.rb b/app/models/grant_amendment.rb new file mode 100644 index 00000000..806c1948 --- /dev/null +++ b/app/models/grant_amendment.rb @@ -0,0 +1,48 @@ +class GrantAmendment < ApplicationRecord + + has_paper_trail + + include TransamObjectKey + + belongs_to :grant, touch: true + + belongs_to :creator, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :created_by_user_id + + # List of hash parameters allowed by the controller + FORM_PARAMS = [ + :amendment_num, + :grant_num, + :comments + ] + + #------------------------------------------------------------------------------ + # + # Class Methods + # + #------------------------------------------------------------------------------ + + def self.allowable_params + FORM_PARAMS + end + + + def self.formatted_version(version) + comments = "Amendment #{version.item.amendment_num} was #{version.event}d." + + if version.event != 'destroy' && version.changeset['comments'].present? + comments += " #{version.changeset['comments'][1]}" + end + + [{ + datetime: version.created_at, + event: "Amendment #{version.event.titleize}d", + event_type: "#{version.event.titleize}d", + comments: comments, + user: version.actor + }] + end + + def deleteable? + self.id == self.grant.grant_amendments.last.try(:id) + end +end diff --git a/app/models/grant_apportionment.rb b/app/models/grant_apportionment.rb new file mode 100644 index 00000000..10c7bf09 --- /dev/null +++ b/app/models/grant_apportionment.rb @@ -0,0 +1,126 @@ +class GrantApportionment < ApplicationRecord + + has_paper_trail on: [:update], only: [:name, :fy_year] + + # Include the object key mixin + include TransamObjectKey + #------------------------------------------------------------------------------ + # Callbacks + #------------------------------------------------------------------------------ + after_initialize :set_defaults + + #------------------------------------------------------------------------------ + # Associations + #------------------------------------------------------------------------------ + + belongs_to :grant + + # Has a single funding source + belongs_to :sourceable, :polymorphic => true + + belongs_to :creator, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :created_by_user_id + + belongs_to :updater, -> { unscope(where: :active) }, :class_name => "User", :foreign_key => :updated_by_user_id + + #------------------------------------------------------------------------------ + # Validations + #------------------------------------------------------------------------------ + validates :name, :presence => true + validates :fy_year, :presence => true, :numericality => {:only_integer => true, :greater_than_or_equal_to => 1970} + validates :sourceable, :presence => true + validates :amount, :presence => true, :numericality => {:only_integer => true, :greater_than_or_equal_to => 0} + + #------------------------------------------------------------------------------ + # Scopes + #------------------------------------------------------------------------------ + + # default scope + + # List of hash parameters allowed by the controller + FORM_PARAMS = [ + :sourceable_type, + :sourceable_id, + :name, + :fy_year, + :amount + ] + + SEARCHABLE_FIELDS =[] + + #------------------------------------------------------------------------------ + # + # Class Methods + # + #------------------------------------------------------------------------------ + + def self.allowable_params + FORM_PARAMS + end + + def self.formatted_version(version) + ver = { + datetime: version.created_at, + event: "Apportionment Updated", + event_type: 'Updated', + comments: "Apportionment '#{version.reify.paper_trail.next_version.name}' was Updated.", + user: version.actor + } + + version.changeset.each do |key, val| + ver[:comments] += " The #{key} was updated from #{val[0]} to #{val[1]}." + end + + ver + end + + #------------------------------------------------------------------------------ + # + # Instance Methods + # + #------------------------------------------------------------------------------ + + def funding_source + sourceable_type == 'FundingSource' ? sourceable : sourceable.funding_source + end + + def global_sourceable + self.sourceable.to_global_id if self.sourceable.present? + end + def global_sourceable=(sourceable) + self.sourceable=GlobalID::Locator.locate sourceable + end + + def to_s + name + end + + def searchable_fields + SEARCHABLE_FIELDS + end + + def sourceable_path + "#{sourceable_type.underscore}_path(:id => '#{sourceable.object_key}')" + end + + #------------------------------------------------------------------------------ + # + # Protected Methods + # + #------------------------------------------------------------------------------ + protected + + # Set resonable defaults for a new grant + def set_defaults + + # first apportionment + if self.grant.present? && self.grant.grant_apportionments.count == 0 + self.sourceable ||= self.grant.sourceable + self.name ||= 'Primary' + self.fy_year ||= self.grant.fy_year + self.amount ||= self.grant.amount + self.created_by_user_id ||= self.grant.created_by_user_id + self.updated_by_user_id ||= self.grant.updated_by_user_id + end + end + +end diff --git a/app/models/grant_purchase.rb b/app/models/grant_purchase.rb index 939622a8..39308919 100644 --- a/app/models/grant_purchase.rb +++ b/app/models/grant_purchase.rb @@ -8,8 +8,6 @@ #------------------------------------------------------------------------------ class GrantPurchase < ActiveRecord::Base - SOURCEABLE_TYPE = Rails.application.config.asset_purchase_source - # Include the fiscal year mixin include FiscalYear @@ -29,7 +27,7 @@ class GrantPurchase < ActiveRecord::Base #------------------------------------------------------------------------------ # Validations #------------------------------------------------------------------------------ - validates_presence_of :sourceable + #validates_presence_of :sourceable validates_presence_of Rails.application.config.asset_base_class_name.underscore.to_sym validates :pcnt_purchase_cost, :presence => true, :numericality => {:only_integer => true, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 100} @@ -43,9 +41,12 @@ class GrantPurchase < ActiveRecord::Base FORM_PARAMS = [ :id, :asset_id, + :global_sourceable, :sourceable_type, :sourceable_id, + :other_sourceable, :pcnt_purchase_cost, + :expense_tag, :_destroy ] @@ -59,45 +60,17 @@ def self.allowable_params FORM_PARAMS end - def self.sourceable_type - SOURCEABLE_TYPE - end - - def self.sources(params=nil) - if params - # check whether params are valid - params = params.stringify_keys - - # override special case if sourceable type is GrantBudget - clean_params = params.slice(*(params.keys & SOURCEABLE_TYPE.constantize.column_names)) - SOURCEABLE_TYPE.constantize.where(clean_params) - - else - SOURCEABLE_TYPE.constantize.active - end - end - - def self.label - if SOURCEABLE_TYPE == 'FundingSource' - 'Funding Program' - else - SOURCEABLE_TYPE.constantize.model_name.human.titleize - end - end - #------------------------------------------------------------------------------ # # Instance Methods # #------------------------------------------------------------------------------ - # Virtual attribute for setting a grant by its ID so we can patch around - # a limitation in the accepts_nested_attributes_for - def sourceable_id=(val) - self.sourceable = SOURCEABLE_TYPE.constantize.find(val) + def global_sourceable + self.sourceable.to_global_id if self.sourceable.present? end - def sourceable_id - sourceable.try(:id) + def global_sourceable=(sourceable) + self.sourceable=GlobalID::Locator.locate sourceable end def to_s diff --git a/app/reports/asset_funding_source_report.rb b/app/reports/asset_funding_source_report.rb index afee5f5b..66abeaad 100644 --- a/app/reports/asset_funding_source_report.rb +++ b/app/reports/asset_funding_source_report.rb @@ -1,19 +1,26 @@ class AssetFundingSourceReport < AbstractReport include FiscalYearHelper - - COMMON_LABELS = ['# Assets', 'Spent'] + + COMMON_LABELS = ['# Assets', 'Cost (Purchase)'] COMMON_FORMATS = [:integer, :currency] - DETAIL_LABELS = ['Asset Tag', 'Asset Type', 'Asset Subtype', 'Spent'] - DETAIL_FORMATS = [:string, :string, :string, :currency] + DETAIL_LABELS = ['Asset ID', 'Category', 'Class', 'Type', 'Subtype', 'Cost (Purchase)'] + DETAIL_FORMATS = [:string, :string, :string, :string, :string, :currency] def self.get_detail_data(organization_id_list, params) - query = Asset.unscoped.joins(:organization, :asset_type, :asset_subtype) - .joins('INNER JOIN grant_purchases ON grant_purchases.asset_id = assets.id') - .joins('INNER JOIN funding_sources ON grant_purchases.sourceable_id = funding_sources.id') - .where(assets: {organization_id: organization_id_list}) - - key = params[:key].split('-') + query = TransitAsset.unscoped.joins([{transam_asset: [:organization, :asset_subtype]}, :fta_asset_category, :fta_asset_class]) + .joins('LEFT JOIN fta_vehicle_types ON transit_assets.fta_type_id = fta_vehicle_types.id AND transit_assets.fta_type_type="FtaVehicleType"') + .joins('LEFT JOIN fta_equipment_types ON transit_assets.fta_type_id = fta_equipment_types.id AND transit_assets.fta_type_type="FtaEquipmentType"') + .joins('LEFT JOIN fta_support_vehicle_types ON transit_assets.fta_type_id = fta_support_vehicle_types.id AND transit_assets.fta_type_type="FtaSupportVehicleType"') + .joins('LEFT JOIN fta_facility_types ON transit_assets.fta_type_id = fta_facility_types.id AND transit_assets.fta_type_type="FtaFacilityType"') + .joins('LEFT JOIN fta_track_types ON transit_assets.fta_type_id = fta_track_types.id AND transit_assets.fta_type_type="FtaTrackType"') + .joins('LEFT JOIN fta_guideway_types ON transit_assets.fta_type_id = fta_guideway_types.id AND transit_assets.fta_type_type="FtaGuidewayType"') + .joins('LEFT JOIN fta_power_signal_types ON transit_assets.fta_type_id = fta_power_signal_types.id AND transit_assets.fta_type_type="FtaPowerSignalType"') + .joins('LEFT JOIN grant_purchases ON grant_purchases.transam_asset_id = transam_assets.id AND grant_purchases.sourceable_type="FundingSource"') + .joins('LEFT JOIN funding_sources ON grant_purchases.sourceable_id = funding_sources.id') + .where(transam_assets: {organization_id: organization_id_list}) + + key = params[:key].split('-').map{|x| x.to_s.tr('_', ' ')} params[:group_by] = 'Funding Program, Agency' if params[:group_by].nil? params[:group_by].split(',').each_with_index do |grp_clause, i| @@ -21,22 +28,28 @@ def self.get_detail_data(organization_id_list, params) clause = 'organizations.short_name = ?' elsif grp_clause.include? 'Funding Program' clause = 'funding_sources.name = ?' - elsif grp_clause.include? FiscalYearHelper.get_fy_label + elsif grp_clause.include? 'Year of Purchase' start_of_fy = DateTime.strptime("#{SystemConfig.instance.start_of_fiscal_year}-1900", "%m-%d-%Y").to_date - clause = "IF(DAYOFYEAR(assets.purchase_date) < DAYOFYEAR('#{start_of_fy}'), YEAR(assets.purchase_date)-1, YEAR(assets.purchase_date)) = ?" + clause = "IF(DAYOFYEAR(transam_assets.purchase_date) < DAYOFYEAR('#{start_of_fy}'), YEAR(transam_assets.purchase_date)-1, YEAR(transam_assets.purchase_date)) = ?" + end + + if key[i] == 'No Funding Program Data' + query = query.where('funding_sources.name IS NULL') + else + query = query.where(clause, key[i]) end - query = query.where(clause, key[i]) + end - data = query.pluck(:asset_tag, 'asset_types.name', 'asset_subtypes.name', 'grant_purchases.pcnt_purchase_cost * assets.purchase_cost / 100.0').to_a + data = query.pluck(:asset_tag, 'fta_asset_categories.name', 'fta_asset_classes.name', 'COALESCE(fta_vehicle_types.name, fta_equipment_types.name, fta_support_vehicle_types.name, fta_facility_types.name, fta_track_types.name, fta_guideway_types.name, fta_power_signal_types.name)', 'asset_subtypes.name', 'IF(grant_purchases.pcnt_purchase_cost IS NULL, transam_assets.purchase_cost, grant_purchases.pcnt_purchase_cost * transam_assets.purchase_cost / 100.0)').to_a {labels: DETAIL_LABELS, data: data, formats: DETAIL_FORMATS} end - + def initialize(attributes = {}) super(attributes) - end - + end + def get_actions @actions = [ { @@ -44,32 +57,32 @@ def get_actions where: :group_by, values: [ 'Agency, Funding Program', - "Agency, Funding Program, #{get_fy_label}", + "Agency, Funding Program, Year of Purchase", 'Funding Program, Agency', - "Funding Program, Agency, #{get_fy_label}", + "Funding Program, Agency, Year of Purchase", - "Funding Program, #{get_fy_label}", - "Funding Program, #{get_fy_label}, Agency", + "Funding Program, Year of Purchase", + "Funding Program, Year of Purchase, Agency", - "#{get_fy_label}, Funding Program", - "#{get_fy_label}, Funding Program, Agency", + "Year of Purchase, Funding Program", + "Year of Purchase, Funding Program, Agency", ], label: 'Group By' } ] end - + def get_data(organization_id_list, params) labels = [] formats = [] - + # Default scope orders by project_id - query = Asset.unscoped.joins(:organization) - .joins('INNER JOIN grant_purchases ON grant_purchases.asset_id = assets.id') - .joins('INNER JOIN funding_sources ON grant_purchases.sourceable_id = funding_sources.id') - .where(assets: {organization_id: organization_id_list}) + query = TransamAsset.unscoped.joins(:organization) + .joins('LEFT JOIN grant_purchases ON grant_purchases.transam_asset_id = transam_assets.id AND grant_purchases.sourceable_type="FundingSource"') + .joins('LEFT JOIN funding_sources ON grant_purchases.sourceable_id = funding_sources.id') + .where(organization_id: organization_id_list) params[:group_by] = 'Funding Program, Agency' if params[:group_by].nil? @@ -84,20 +97,25 @@ def get_data(organization_id_list, params) elsif grp_clause.include? 'Funding Program' labels << 'Funding Program' formats << :string - clause = 'funding_sources.name' - elsif grp_clause.include? get_fy_label - labels << get_fy_label + clause = 'IF(funding_sources.name IS NULL, "No Funding Program Data",funding_sources.name)' + elsif grp_clause.include? 'Year of Purchase' + labels << 'Year of Purchase' formats << :fiscal_year start_of_fy = DateTime.strptime("#{SystemConfig.instance.start_of_fiscal_year}-1900", "%m-%d-%Y").to_date - clause = "IF(DAYOFYEAR(assets.purchase_date) < DAYOFYEAR('#{start_of_fy}'), YEAR(assets.purchase_date)-1, YEAR(assets.purchase_date))" + clause = "IF(DAYOFYEAR(transam_assets.purchase_date) < DAYOFYEAR('#{start_of_fy}'), YEAR(transam_assets.purchase_date)-1, YEAR(transam_assets.purchase_date))" end @clauses << clause - query = query.group(clause).order(clause) + + if grp_clause.include? 'Funding Program' + query = query.group(clause).order('funding_sources.name IS NULL').order(clause) + else + query = query.group(clause).order(clause) + end end # Generate queries for each column asset_counts = query.count - costs = query.sum('grant_purchases.pcnt_purchase_cost * assets.purchase_cost / 100.0') + costs = query.sum('IF(grant_purchases.pcnt_purchase_cost IS NULL, transam_assets.purchase_cost, grant_purchases.pcnt_purchase_cost * transam_assets.purchase_cost / 100.0)') data = [] prev_header = row_data = nil @@ -122,13 +140,16 @@ def get_data(organization_id_list, params) end data << [prev_header, row_data] if prev_header + + + formats[0] = :hidden - return {labels: labels + COMMON_LABELS, data: data, formats: formats + COMMON_FORMATS, header_format: labels[0] == get_fy_label ? :fiscal_year : :string} + return {labels: labels + COMMON_LABELS, data: data, formats: formats + COMMON_FORMATS, header_format: labels[0] == 'Year of Purchase' ? :fiscal_year : :string} end def get_key(row) - row.slice(0, @clauses.count).join('-') + row.slice(0, @clauses.count).map{|r| r.to_s.tr(' ','_')}.join('-') end def get_detail_path(id, key, opts={}) diff --git a/app/views/assets/_accounting_asset_form.html.haml b/app/views/assets/_accounting_asset_form.html.haml index 2486efa3..47b751c4 100644 --- a/app/views/assets/_accounting_asset_form.html.haml +++ b/app/views/assets/_accounting_asset_form.html.haml @@ -12,12 +12,23 @@ :file => :vertical_file_input, :boolean => :vertical_boolean}) do |f| - %label#grant_purchases-error.error - = f.simple_fields_for :grant_purchases do |grant_purchase| - = render 'grant_purchase_fields', f: grant_purchase - .links.pull-right - = link_to_add_association f, :grant_purchases, :class => 'btn btn-xs btn-info' do - %i.fa.fa-plus + %fieldset + %legend Funding Programs + %label#funding_sources-error.error + = f.simple_fields_for :funding_source_grant_purchases do |funding_source| + = render 'funding_source_fields', f: funding_source + .links.pull-right + = link_to_add_association f, :funding_source_grant_purchases, partial: 'funding_source_fields', :class => 'btn btn-xs btn-info' do + %i.fa.fa-plus + + %fieldset + %legend Grants + %label#grants-error.error + = f.simple_fields_for :grant_grant_purchases do |grant| + = render 'grant_fields', f: grant + .links.pull-right + = link_to_add_association f, :grant_grant_purchases, partial: 'grant_fields', :class => 'btn btn-xs btn-info' do + %i.fa.fa-plus = f.button :submit, 'Save', :class => 'btn btn-primary' diff --git a/app/views/assets/_accounting_purchase.html.haml b/app/views/assets/_accounting_purchase.html.haml index 2b4135c1..6e380c76 100644 --- a/app/views/assets/_accounting_purchase.html.haml +++ b/app/views/assets/_accounting_purchase.html.haml @@ -1,10 +1,10 @@ :ruby - formatted_grant_purchases = [] - @asset.grant_purchases.each do |g| - if g.sourceable.present? - formatted_grant_purchases << "#{link_to(g.sourceable.to_s, eval(g.sourceable_path))} (#{format_as_percentage(g.pcnt_purchase_cost)})" - end - end + formatted_funding_sources = @asset.funding_sources.map{|g| "#{link_to(g.sourceable.to_s, eval(g.sourceable_path))} (#{format_as_percentage(g.pcnt_purchase_cost)})"} -- if @asset.grant_purchases.count > 0 - = format_field(GrantPurchase.label.pluralize, format_as_list(formatted_grant_purchases)) \ No newline at end of file + formatted_grants = @asset.grants.map{|g| "#{link_to(g.sourceable.to_s, eval(g.sourceable_path))} (#{format_as_percentage(g.pcnt_purchase_cost)})"} + +- if @asset.funding_sources.count > 0 + = format_field('Funding Programs', format_as_list(formatted_funding_sources)) + +- if @asset.grants.count > 0 + = format_field('Grants', format_as_list(formatted_grants)) \ No newline at end of file diff --git a/app/views/assets/_depreciation_table.html.haml b/app/views/assets/_depreciation_table.html.haml index 914f0661..4219077e 100644 --- a/app/views/assets/_depreciation_table.html.haml +++ b/app/views/assets/_depreciation_table.html.haml @@ -1 +1 @@ -.col-xs-4 = format_field("Purchase Date", format_as_date(@asset.purchase_date) ) = format_field("In Service Date", format_as_date(@asset.in_service_date) ) = format_field("Depreciation Start Date", format_as_date(@asset.depreciation_start_date) ) = format_field("Current Depreciation Date", format_as_date(@asset.current_depreciation_date) ) .col-xs-4 = format_field("Original Useful Life", "#{format_as_integer(@asset.original_depreciation_useful_life_months)} months" ) = format_field("Adjusted Useful Life", "#{format_as_integer(@asset.adjusted_depreciation_useful_life_months)} months" ) = format_field("Original Cost Basis", format_as_currency(@asset.original_cost_basis) ) = format_field("Adjusted Cost Basis", format_as_currency(@asset.adjusted_cost_basis) ) .col-xs-4 = format_field("Salvage Value", format_as_currency(@asset.salvage_value) ) = format_field("Policy Replacement Cost", format_as_currency(@asset.estimated_replacement_cost) ) #depreciation_table_actions.btn-group -#- if can? :update, @asset -# = link_to new_inventory_asset_event_path(@asset, :event_type => BookValueUpdateEvent.asset_event_type.id), :class => 'btn btn-default' do -# %i.fa.fa-fw{:class => BookValueUpdateEvent.asset_event_type.display_icon_name} -# = 'Adjust Book Value' -# -# - if can? :create, Expenditure -# = link_to new_inventory_expenditure_path(@asset), :class => 'btn btn-default' do -# %i.fa.fa-plus.fa-fw -# = " Add CapEx" .col-xs-12 %fieldset %table.table.table-hover#depreciation_table{:data => {:toggle => 'table', :pagination => 'true', :show_pagination_switch => 'true', :page_list => "[5, 10, 20, 50, 100, 200]", :page_size => current_user.num_table_rows, :search => 'false', :toolbar => "#depreciation_table_actions", :export_types => "['csv', 'txt', 'excel']", :show_export => 'true', :show_toggle => 'false', :state_save => 'true', :state_save_id_table => "asset_depreciation_id", :state_save_expire => "1y"}} %thead %tr %th.left Date %th.left Description - if ChartOfAccount.find_by(organization_id: @asset.organization_id) %th.left GL Account %th.right Amount %th.right Net Book Value %tbody - @asset.get_depreciation_table.each do |row| %tr %td.left= format_as_date(row[:on_date]) %td.left= row[:description] - if ChartOfAccount.find_by(organization_id: @asset.organization_id) %td.left= link_to row[:general_ledger_account].account_number, general_ledger_account_path(row[:general_ledger_account]) unless row[:general_ledger_account].blank? %td.right= format_as_currency(row[:amount].to_i) %td.right= format_as_currency(row[:book_value].to_i) :javascript $("#depreciation_table").on('all.bs.table', function(evt, name, args) { $('.fixed-table-container').css('min-height', '300px') transam.make_same_height('.header-part'); }); $(window).load(function() { transam.make_same_height('.header-part'); }); $(window).resize(function() { $("#depreciation_table").bootstrapTable('resetView'); }); \ No newline at end of file +.col-xs-4 = format_field("Purchase Date", format_as_date(@asset.purchase_date) ) = format_field("In Service Date", format_as_date(@asset.in_service_date) ) = format_field("Depreciation Start Date", format_as_date(@asset.depreciation_start_date) ) = format_field("Current Depreciation Date", format_as_date(@asset.current_depreciation_date) ) .col-xs-4 = format_field("Original Useful Life", "#{format_as_integer(@asset.original_depreciation_useful_life_months)} months" ) = format_field("Adjusted Useful Life", "#{format_as_integer(@asset.adjusted_depreciation_useful_life_months)} months" ) = format_field("Original Cost Basis", format_as_currency(@asset.original_cost_basis) ) = format_field("Adjusted Cost Basis", format_as_currency(@asset.adjusted_cost_basis) ) .col-xs-4 = format_field("Salvage Value", format_as_currency(@asset.salvage_value) ) = format_field("Policy Replacement Cost", format_as_currency(@asset.estimated_replacement_cost) ) #depreciation_table_actions.btn-group -#- if can? :update, @asset -# = link_to new_inventory_asset_event_path(@asset, :event_type => BookValueUpdateEvent.asset_event_type.id), :class => 'btn btn-default' do -# %i.fa.fa-fw{:class => BookValueUpdateEvent.asset_event_type.display_icon_name} -# = 'Adjust Book Value' -# -# - if can? :create, Expenditure -# = link_to new_inventory_expenditure_path(@asset), :class => 'btn btn-default' do -# %i.fa.fa-plus.fa-fw -# = " Add CapEx" .col-xs-12 %fieldset %table.table.table-hover#depreciation_table{:data => {:toggle => 'table', :pagination => 'true', :show_pagination_switch => 'true', :page_list => "[5, 10, 20, 50, 100, 200]", :page_size => current_user.num_table_rows, :search => 'false', :toolbar => "#depreciation_table_actions", :export_types => "['csv', 'txt', 'excel']", :show_export => 'true', :show_toggle => 'false', :cookie => 'true', :cookie_id_table => "asset_depreciation_id", :cookie_expire => "1y"}} %thead %tr %th.left Date %th.left Description - if ChartOfAccount.find_by(organization_id: @asset.organization_id) %th.left GL Account %th.right Amount %th.right Net Book Value %tbody - @asset.get_depreciation_table.each do |row| %tr %td.left= format_as_date(row[:on_date]) %td.left= row[:description] - if ChartOfAccount.find_by(organization_id: @asset.organization_id) %td.left= link_to row[:general_ledger_account].account_number, general_ledger_account_path(row[:general_ledger_account]) unless row[:general_ledger_account].blank? %td.right= format_as_currency(row[:amount].to_i) %td.right= format_as_currency(row[:book_value].to_i) :javascript $("#depreciation_table").on('all.bs.table', function(evt, name, args) { $('.fixed-table-container').css('min-height', '300px') transam.make_same_height('.header-part'); }); $(window).load(function() { transam.make_same_height('.header-part'); }); $(window).resize(function() { $("#depreciation_table").bootstrapTable('resetView'); }); \ No newline at end of file diff --git a/app/views/assets/_funding_source_fields.html.haml b/app/views/assets/_funding_source_fields.html.haml new file mode 100644 index 00000000..10168615 --- /dev/null +++ b/app/views/assets/_funding_source_fields.html.haml @@ -0,0 +1,19 @@ +.nested-fields{style: 'border:none;'} + .row + .col-md-5 + = f.input :global_sourceable, :collection => FundingSource.all.map{|f| [ f.to_s, f.to_global_id ]}, :required => true, :label => 'Funding Program' + .col-md-3.pcnt-column + = f.input :pcnt_purchase_cost, :label => 'Pcnt', :wrapper => :vertical_append do + = f.input_field :pcnt_purchase_cost, :class => 'form-control funding-pcnt', :min => 1, :max => 100 + %span.input-group-addon + %i.fa.fa-percent + .col-md-3.amount-column + .form-group + %label.control-label Amount + .grant-purchase-amount.display-value= format_as_currency(@asset.purchase_cost * (f.object.pcnt_purchase_cost || 0) / 100.0) + + .col-md-1 + = link_to_remove_association f, :class => 'btn btn-xs btn-warning remove_funding_source', :style => 'margin-top: 27px;' do + %i.fa.fa-trash-o + + diff --git a/app/views/assets/_grant_fields.html.haml b/app/views/assets/_grant_fields.html.haml new file mode 100644 index 00000000..b4affce4 --- /dev/null +++ b/app/views/assets/_grant_fields.html.haml @@ -0,0 +1,28 @@ +- disabled = f.object.sourceable && !f.object.sourceable.open? + +.nested-fields{style: 'border:none;'} + .row + .col-md-3 + = f.input :sourceable_type, as: :hidden, input_html: {value: 'Grant'} # hidden sourceable type field in case Other set + = f.input :global_sourceable, :collection => Grant.active.open.where(owner_id: @organization_list).or(Grant.where(id: f.object.sourceable_id)).map{|f| [ "#{f.grant_num} : #{format_as_fiscal_year(f.fy_year)} : #{f.owner.short_name} : Primary : #{format_as_currency(f.balance)}" , f.to_global_id ]}, :label => 'Grant Number', disabled: disabled, prompt: 'Other', input_html: {class: 'global-sourceable'} + .col-md-2 + = f.input :other_sourceable, label: 'Grant Number (Other)', disabled: disabled + + .col-md-2.pcnt-column + = f.input :pcnt_purchase_cost, :label => 'Pcnt', :wrapper => :vertical_append do + = f.input_field :pcnt_purchase_cost, :class => 'form-control funding-pcnt', :min => 1, :max => 100, disabled: disabled + %span.input-group-addon + %i.fa.fa-percent + .col-md-2.amount-column + .form-group + %label.control-label Amount + .grant-purchase-amount.display-value= format_as_currency(@asset.purchase_cost * (f.object.pcnt_purchase_cost || 0) / 100.0) + + .col-md-2 + = f.input :expense_tag, label: 'Expense ID', disabled: disabled + + .col-md-1 + = link_to_remove_association f, :class => 'btn btn-xs btn-warning remove_grant', :style => 'margin-top: 27px;' do + %i.fa.fa-trash-o + + diff --git a/app/views/assets/_grant_purchase_fields.html.haml b/app/views/assets/_grant_purchase_fields.html.haml deleted file mode 100644 index 4dbae828..00000000 --- a/app/views/assets/_grant_purchase_fields.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -.nested-fields{style: 'border:none;'} - .row - .col-md-6 - = f.input :sourceable_id, :collection => GrantPurchase.sources({organization_id: @asset.organization_id, active: true}), :required => true, :label => GrantPurchase.label - .col-md-5 - = f.input :pcnt_purchase_cost, :label => 'Pcnt', :wrapper => :vertical_append do - = f.input_field :pcnt_purchase_cost, :class => 'form-control funding-pcnt', :min => 1, :max => 100 - %span.input-group-addon - %i.fa.fa-percent - - .col-md-1 - = link_to_remove_association f, :class => 'btn btn-xs btn-warning remove_grant_purchase', :style => 'margin-top: 27px;' do - %i.fa.fa-trash-o - - diff --git a/app/views/expenditures/_index_table.html.haml b/app/views/expenditures/_index_table.html.haml index 95b3134f..b39643f0 100755 --- a/app/views/expenditures/_index_table.html.haml +++ b/app/views/expenditures/_index_table.html.haml @@ -12,9 +12,9 @@ :show_columns => 'true', :show_footer => "#{expenditures.count > 0}", :show_toggle => 'true', - :state_save => 'true', - :state_save_id_table => "expendituresid", - :state_save_expire => "1y"}} + :cookie => 'true', + :cookie_id_table => "expendituresid", + :cookie_expire => "1y"}} %thead %tr %th.left{:data => {:visible => 'false'}} Object Key diff --git a/app/views/funding_sources/_details.html.haml b/app/views/funding_sources/_details.html.haml index 4a2bbcae..4126eb55 100644 --- a/app/views/funding_sources/_details.html.haml +++ b/app/views/funding_sources/_details.html.haml @@ -3,17 +3,8 @@ %a{:href => "#desc", :data =>{:toggle => 'tab'}} = "Details" - - if Grant.sourceable_type == 'FundingSource' - %li - %a{:href => "#grant", :data =>{:toggle => 'tab'}} - %span.badge.pull-right= @funding_source.grants.count - = "Grants" - - - if GrantPurchase.sourceable_type.include? 'FundingSource' - %li - %a{:href => "#asst", :data =>{:toggle => 'tab'}} - %span.badge.pull-right= @funding_source.assets.count - = "Assets" + = nav_tab_count_tag("#grant", "Grants", @funding_source.grants.count) + = nav_tab_count_tag("#asst", "Assets", @funding_source.assets.count) = nav_tab_count_tag("#docs", "Documents", @funding_source.documents.count) = nav_tab_count_tag("#comments", "Comments", @funding_source.comments.count) @@ -23,18 +14,16 @@ .tab-content = render :partial => 'description', :locals => {:funding_source => @funding_source} - - if Grant.sourceable_type == 'FundingSource' - .tab-pane.fade#grant - .tab-content - = render :partial => 'grants/index_table', :locals => {:grants => @funding_source.grants, :sourceable => @funding_source} + .tab-pane.fade#grant + .tab-content + = render :partial => 'grants/index_table', :locals => {:grants => @funding_source.grants} - - if GrantPurchase.sourceable_type.include? 'FundingSource' - .tab-pane.fade#asst - .tab-content - - if @funding_source.assets.empty? - %p There are no assets associated with this grant. - - else - = render :partial => 'assets/asset_compact_datatable', :locals => {:assets => @funding_source.assets} + .tab-pane.fade#asst + .tab-content + - if @funding_source.assets.empty? + %p There are no assets associated with this grant. + - else + = render :partial => 'assets/asset_compact_datatable', :locals => {:assets => @funding_source.assets} .tab-pane.fade#docs .tab-content diff --git a/app/views/funding_sources/_index_actions.html.haml b/app/views/funding_sources/_index_actions.html.haml index d44335a2..e27aa7b3 100644 --- a/app/views/funding_sources/_index_actions.html.haml +++ b/app/views/funding_sources/_index_actions.html.haml @@ -1,10 +1,16 @@ +:css + .btn-toolbar button { + margin-top: 4px; + margin-left: 4px; + } + - if can? :create, FundingSource .btn-group = link_to new_funding_source_path, :class => 'btn btn-default' do %i.fa.fa-plus.fa-fw = "Add Funding Program"; -= form_tag funding_sources_path, :id => 'filter_form', :method => "get", :class => 'navbar-form navbar-right panel-action', style: 'padding-top: 1px' do += form_tag funding_sources_path, :id => 'filter_form', :method => "get", :class => 'navbar-form navbar-right panel-action' do .form-group = select_tag(:funding_source_type_id, options_for_select(FundingSourceType.funding_program.active.map{|f| [f.to_s,f.id]}, :selected => @funding_source_type_id), :class => "form-control", :style => "width: 150px;", :prompt => "Any Source...") .form-group @@ -13,5 +19,5 @@ = check_box_tag(:show_active_only, '1', @show_active_only == '1', {:class => "form-control"}) Show Active Programs Only - = button_tag :class => 'btn btn-default', :type => 'submit' do + = button_tag :class => 'btn btn-default pull-right', :type => 'submit' do %i.fa.fa-filter diff --git a/app/views/funding_sources/_index_table.html.haml b/app/views/funding_sources/_index_table.html.haml index f2ab8022..6bb80fe1 100755 --- a/app/views/funding_sources/_index_table.html.haml +++ b/app/views/funding_sources/_index_table.html.haml @@ -17,9 +17,9 @@ :export_types => "['csv', 'txt', 'excel']", :show_export => 'true', :show_columns => 'true', - :state_save => 'true', - :state_save_id_table => "funding_sources_id", - :state_save_expire => "1y"}} + :cookie => 'true', + :cookie_id_table => "funding_sources_id", + :cookie_expire => "1y"}} %thead %tr diff --git a/app/views/general_ledger_accounts/_gla_entries.html.haml b/app/views/general_ledger_accounts/_gla_entries.html.haml index 1a2d934f..fc334799 100644 --- a/app/views/general_ledger_accounts/_gla_entries.html.haml +++ b/app/views/general_ledger_accounts/_gla_entries.html.haml @@ -10,9 +10,9 @@ :export_types => "['csv', 'txt', 'excel']", :show_export => 'true', :show_toggle => 'false', - :state_save => 'true', - :state_save_id_table => "gla_entries_id", - :state_save_expire => "1y"}} + :cookie => 'true', + :cookie_id_table => "gla_entries_id", + :cookie_expire => "1y"}} %thead %tr %th.left Date diff --git a/app/views/general_ledger_accounts/_index_table.html.haml b/app/views/general_ledger_accounts/_index_table.html.haml index 1793e790..82ce6870 100644 --- a/app/views/general_ledger_accounts/_index_table.html.haml +++ b/app/views/general_ledger_accounts/_index_table.html.haml @@ -18,9 +18,9 @@ :show_toggle => 'true', :resizable => 'true', :search => 'false', - :state_save => 'true', - :state_save_id_table => "general_ledger_accounts_id", - :state_save_expire => "1y"}} + :cookie => 'true', + :cookie_id_table => "general_ledger_accounts_id", + :cookie_expire => "1y"}} %thead %tr %th.left{:data => {:sortable => 'true', :order => 'desc'}} Account Number diff --git a/app/views/general_ledger_mappings/_index_table.html.haml b/app/views/general_ledger_mappings/_index_table.html.haml index 4726f76e..660d4ea7 100755 --- a/app/views/general_ledger_mappings/_index_table.html.haml +++ b/app/views/general_ledger_mappings/_index_table.html.haml @@ -19,9 +19,9 @@ :export_types => "['csv', 'txt', 'excel']", :show_export => 'true', :show_columns => 'true', - :state_save => 'true', - :state_save_id_table => "funding_templates_id", - :state_save_expire => "1y"}, :style => 'width:100%;'} + :cookie => 'true', + :cookie_id_table => "funding_templates_id", + :cookie_expire => "1y"}, :style => 'width:100%;'} %thead %tr diff --git a/app/views/grant_amendments/_form.html.haml b/app/views/grant_amendments/_form.html.haml new file mode 100755 index 00000000..feb19b2e --- /dev/null +++ b/app/views/grant_amendments/_form.html.haml @@ -0,0 +1,61 @@ += simple_form_for([@grant, @grant_amendment], + :html => {:class => 'form-vertical grant_amendment_form' }, + :wrapper => :vertical_form, + :wrapper_mappings => {:check_boxes => :vertical_radio_and_checkboxes, :radio_buttons => :vertical_radio_and_checkboxes, :file => :vertical_file_input, :boolean => :vertical_boolean}) do |f| + + .row + .col-md-3 + = f.input :amendment_num, label: 'Amendment Number', required: true + + .form-group.required.radio-buttons-inline + %label.required.control-label + %abbr{title: 'required'} * + = " Update Grant Number" + %span.radio + %label + = radio_button_tag :update_grant_num, 'yes', @grant_amendment.grant_num.present? + Yes + %span.radio + %label + = radio_button_tag :update_grant_num, 'no', @grant_amendment.grant_num.blank? + No + + .row + .col-md-3 + = f.input :grant_num, label: 'Grant Number', disabled: @grant_amendment.grant_num.blank?, input_html: {data: {grant_num: @grant.grant_num}} + + = f.input :comments + + = f.button :submit, save_text, :class => "btn btn-primary" + = link_to "Cancel", :back, :class => "btn btn-default", :role => 'button' + +:javascript + $('.grant_amendment_form').validate({ + submitHandler: function(form) { + $('input').prop('disabled', false); // re-enable any disabled fields so they'll submit + form.submit(); + } + }); + + $("input[name='update_grant_num']").on("click", function() { + if ($(this).val() == 'yes') { + $('label[for="grant_amendment_grant_num"]').html('* Grant Number'); + $('#grant_amendment_grant_num').attr('disabled', false); + + $('#grant_amendment_grant_num').rules("add", { + required: true + }); + + $('#grant_amendment_grant_num').val($('#grant_amendment_grant_num').data('grant-num')); + } else { + $('label[for="grant_amendment_grant_num"]').html('Grant Number'); + $('#grant_amendment_grant_num').val(''); + $('#grant_amendment_grant_num').attr('disabled', true); + + $('#grant_amendment_grant_num').rules("add", { + required: false + }); + + } + + }) \ No newline at end of file diff --git a/app/views/grant_amendments/edit.html.haml b/app/views/grant_amendments/edit.html.haml new file mode 100755 index 00000000..13eb26b5 --- /dev/null +++ b/app/views/grant_amendments/edit.html.haml @@ -0,0 +1,8 @@ +.row + .col-md-6.col-md-offset-3 + %fieldset + %legend Update Amendment + + = render(:partial => 'shared/form_errors', :locals => {:obj => @grant_amendment}) unless @grant_amendment.errors.empty? + + = render 'form', save_text: 'Update Amendment' diff --git a/app/views/grant_amendments/new.html.haml b/app/views/grant_amendments/new.html.haml new file mode 100755 index 00000000..9e699bd4 --- /dev/null +++ b/app/views/grant_amendments/new.html.haml @@ -0,0 +1,7 @@ +.row + .col-md-6.col-md-offset-3 + %fieldset + %legend Add Amendment + = render(:partial => 'shared/form_errors', :locals => {:obj => @grant_amendment}) unless @grant_amendment.errors.empty? + + = render 'form', save_text: '+ Add Amendment' diff --git a/app/views/grants/_actions.html.haml b/app/views/grants/_actions.html.haml index ee38dd8f..fd3fd4e3 100644 --- a/app/views/grants/_actions.html.haml +++ b/app/views/grants/_actions.html.haml @@ -5,7 +5,15 @@ %span.caret %ul.dropdown-menu{:role => 'menu'} - if can? :update, @grant + - @grant.allowable_events.each do |evt| + - if can? evt.to_sym, @grant + %li + = link_to fire_workflow_event_grant_path(@grant, :event => evt) do + %i.fa.fa-fw{:class => get_workflow_event_icon(evt)} + = evt.titleize + - if (can? :destroy, @grant) && @grant.deleteable? + %li.divider %li - = link_to edit_grant_path(@grant) do - %i.fa.fa-edit.fa-fw - = " Update this grant" + = link_to grant_path(@grant), :method => :delete, :data => {:confirm => "Are you sure? The action cannot be undone."} do + %i.fa.fa-trash-o.fa-fw + = " Remove this grant" diff --git a/app/views/grants/_comments.html.haml b/app/views/grants/_comments.html.haml deleted file mode 100644 index 0b22c8bf..00000000 --- a/app/views/grants/_comments.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -.row - .col-md-12{:style => 'height:200px;overflow-y:auto;'} - - if @grant.comments.empty? - %p There are no comments for this grant. - - else - = render :partial => 'shared/comments', :locals => {:comments => @grant.comments} - -- if can? :update, @grant - .row - .col-md-12 - %fieldset - %legend Add Comment - = form_for [@grant, Comment.new], :role => 'form' do |f| - .form-group - = f.text_area :comment, :class => 'form-control', :placeholder => 'Enter a new comment...', :required => true, :minlength => 10, :maxlength => 254 - = f.submit :class => 'btn btn-primary' diff --git a/app/views/grants/_detail_scripts.html.haml b/app/views/grants/_detail_scripts.html.haml deleted file mode 100644 index 0e5d6681..00000000 --- a/app/views/grants/_detail_scripts.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -:javascript - - var user_tab_key = 'grant_tab_key'; - - $(document).ready(function() { - - transam.make_same_height('.header-part'); - - // Manage the tabs - $('a[data-toggle="tab"]').on('shown.bs.tab', function(e) { - // save the latest tab - var this_tab = $(this).attr('href'); - transam.set_ui_key_value(user_tab_key, this_tab); - }); - }); - $(function() { - var last_tab = transam.get_ui_key_value(user_tab_key); - if (last_tab) { - $('a[href="'+last_tab+'"]').tab('show'); - } else { - // Default to the first tab if no tab is stored - $('a[data-toggle="tab"]:first').tab('show'); - } - }); diff --git a/app/views/grants/_details.html.haml b/app/views/grants/_details.html.haml index cce56393..cfb47e50 100644 --- a/app/views/grants/_details.html.haml +++ b/app/views/grants/_details.html.haml @@ -1,51 +1,84 @@ -- assets = @grant.assets.where.not(asset_type: AssetType.find_by(class_name: 'Expenditure')) -- expenditures = @grant.assets.where(asset_type: AssetType.find_by(class_name: 'Expenditure')) - -%ul.nav.nav-tabs - %li - %a{:href => "#gla", :data =>{:toggle => 'tab'}} - %span.badge.pull-right= @grant.general_ledger_accounts.count - = "GL Accounts" - - - if GrantPurchase.sourceable_type.include? 'Grant' - %li - %a{:href => "#asst", :data =>{:toggle => 'tab'}} - %span.badge.pull-right= assets.count - = "Assets" - - %li - %a{:href => "#docs", :data =>{:toggle => 'tab'}} - %span.badge.pull-right= @grant.documents.count - = "Documents " - - %li - %a{:href => "#comm", :data =>{:toggle => 'tab'}} - %span.badge.pull-right= @grant.comments.count - = "Comments " - -.tab-content - .tab-pane.fade#gla - .tab-content - = render :partial => 'gla_table', :locals => {:glas => @grant.general_ledger_accounts} - - - if GrantPurchase.sourceable_type.include? 'Grant' - .tab-pane.fade#asst - .tab-content - - if assets.empty? - %p There are no assets associated with this grant. +.row.border-between + .col-sm-6 + .row + .col-sm-3 + - if @grant.grant_amendments.empty? + = editable_field_tag(@grant, :grant_num, '* Grant Number', required: true) - else - = render :partial => 'assets/asset_compact_datatable', :locals => {:assets => assets} + .form-group + %label.control-label.required + * Grant Number + .display-value= @grant.grant_num + .row + .col-sm-3.grant-source-type= editable_association_tag(@grant.sourceable, :funding_source_type, '* Source', FundingSourceType.where.not(name: 'Agency').collect{|f| [f.id, f.to_s]}) + + .row + .col-sm-3.grant-program= editable_association_tag(@grant, :global_sourceable, '* Program', FundingSource.where(funding_source_type: @grant.sourceable.funding_source_type).collect{|f| ["#{f.to_global_id}", "#{f.to_s}"]}, current_method: :global_sourceable) + .row + .col-sm-3= editable_association_tag(@grant, :owner, '* Owner', Organization.where.not(organization_type: OrganizationType.find_by(class_name: 'PlanningPartner')).collect{|f| [f.id, f.to_s]}) + .col-sm-9 + .row.other-fields-container + -# need to pass an array of integers for existing JS to work so just set other as -1 + .col-sm-4.other-type-container{data: {other_type_ids: [-1]}} + = editable_association_tag(@grant, :contributor, '* Contributor', [['multiple', 'Multiple'], ['-1', 'Other']] + Organization.where.not(organization_type: OrganizationType.find_by(class_name: 'PlanningPartner')).collect{|f| [f.id, f.to_s]}, current_value: @grant.has_multiple_contributors ? 'multiple' : (@grant.contributor.nil? ? '-1' : @grant.contributor_id)) + .col-sm-8.other-value-container + = editable_field_tag(@grant, :other_contributor, required: false) + + + .row + .col-sm-8= editable_field_tag(@grant, :legislative_authorization, required: false) + .row + .col-sm-3= editable_field_tag(@grant, :award_date, '* Date of Award', type: 'date') + .col-sm-5 + .form-group + %label.control-label + Date of Most Recent Amendment + .display-value= format_as_date(@grant.grant_amendments.last.try(:created_at).try(:to_date), blank: '-') + .col-sm-4 + .form-group + %label.control-label + Date of Closeout + .display-value= format_as_date(@grant.closeout_date, blank: '-') + + .col-sm-6 + .row + .col-sm-6 + .form-group + %label.control-label + * Method of Apportionment Structure + .display-value Single Apportionment + .col-sm-6 + = editable_association_tag(@grant, :fy_year, '* Grant Year', get_fiscal_years(Date.today-18.years,19).map{|x| [x[1], x[0]]}.reverse, current_method: :fy_year, suffix: '') + .row + .col-sm-3= editable_field_tag(@grant, :amount, '* Total Apportionment', required: true, type: 'currency') + .row + .col-sm-3 + .form-group + %label.control-label + Grant Development Method + .display-value Directly Generated + + +:javascript + var fed_programs = JSON.parse('#{FundingSource.where(funding_source_type: FundingSourceType.find_by(name: 'Federal')).map{|f| {value: f.to_global_id.to_s, text: f.to_s}}.to_json.html_safe}'); + var state_programs = JSON.parse('#{FundingSource.where(funding_source_type: FundingSourceType.find_by(name: 'State')).map{|f| {value: f.to_global_id.to_s, text: f.to_s}}.to_json.html_safe}'); + var local_programs = JSON.parse('#{FundingSource.where(funding_source_type: FundingSourceType.find_by(name: 'Local')).map{|f| {value: f.to_global_id.to_s, text: f.to_s}}.to_json.html_safe}'); + + $('body').on('change', '.grant-source-type select', function(e) { + var id = $(this).val(); + var program = $('#global_sourceable') + + if (parseInt(id) == parseInt('#{FundingSourceType.find_by(name: 'Federal').id}')){ + program.editable('option', 'source', fed_programs); + } else if (parseInt(id) == parseInt("#{FundingSourceType.find_by(name: 'State').id}")){ + program.editable('option', 'source', state_programs); + } else if (parseInt(id) == parseInt("#{FundingSourceType.find_by(name: 'Local').id}")){ + program.editable('option', 'source', local_programs); + } + program.editable('hide'); + program.editable('show'); + }); - .tab-pane.fade#comm - .tab-content - = render 'comments' - .tab-pane.fade#docs - .tab-content - = render 'documents' -= render 'detail_scripts' -- # Load module specific tab if they exist -- SystemConfig.transam_module_names.each do |mod| - = render :partial => "grants/#{mod}_detail_tabs_scripts" rescue nil diff --git a/app/views/grants/_documents.html.haml b/app/views/grants/_documents.html.haml deleted file mode 100644 index 7661759e..00000000 --- a/app/views/grants/_documents.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -.row - .col-md-12{:style => 'height:180px;overflow-y:auto;'} - - if @grant.documents.empty? - %p There are no documents for this grant. - - else - = render :partial => 'shared/documents', :locals => {:documents => @grant.documents} - -- if can? :update, @grant - .row - .col-md-12 - %fieldset - %legend Add Document - = simple_form_for([@grant, Document.new], - :html => {:multipart => true, :class => 'form-vertical' }, - :wrapper => :vertical_form, - :wrapper_mappings => {:check_boxes => :vertical_radio_and_checkboxes, :radio_buttons => :vertical_radio_and_checkboxes, :file => :vertical_file_input, :boolean => :vertical_boolean}) do |f| - = f.input :document, :required => true - = f.input :description, :as => :text, :placeholder => 'Enter a brief description of the document...', :required => true, :minlength => 10 - = f.submit "Add Document", :class => 'btn btn-primary', :id => "document_submit" diff --git a/app/views/grants/_form.html.haml b/app/views/grants/_form.html.haml index caf5e08c..98ad1afa 100644 --- a/app/views/grants/_form.html.haml +++ b/app/views/grants/_form.html.haml @@ -1,8 +1,15 @@ -:ruby - glas = Hash.new - ChartOfAccount.where(organization_id: @organization_list).each do |coa| - glas[coa.organization_id] = coa.general_ledger_accounts.ids - end +:css + #details { + border-bottom: none; + } + + #grant_amount { + text-align: right; + } + + .display-value { + margin-left: 5px; + } = simple_form_for(@grant, :html => {:class => 'form-vertical grant_form'}, @@ -12,129 +19,91 @@ :file => :vertical_file_input, :boolean => :vertical_boolean}) do |f| - - if @organization_list.count > 1 - = f.association :organization, :required => true, :collection => Organization.where(id: @organization_list), :label_method => 'coded_name' - = f.input :sourceable_id, :collection => Grant.sources, :required => true, :label => Grant.label, :disabled => !@grant.new_record? - = f.input :name, :disabled => !@grant.new_record? - = f.input :fy_year, :collection => @fiscal_years, :label => get_fiscal_year_label - - = f.input :amount, :wrapper=> :vertical_prepend, :label => "Amount" do - %span.input-group-addon - %i.fa.fa-usd - = f.input_field :amount, :class => "form-control" - - #grant_budgets.well.well-sm{style: "overflow-y:scroll; max-height:250px;"} - %label.control-label - %i.fa.fa-usd.fa-1-5x - General Ledger - .links.pull-right - = link_to_add_association f, :grant_budgets, :class => 'btn btn-xs btn-info', data: {association_insertion_method: 'after'}, :disabled => !@grant.new_record? do - %i.fa.fa-plus - %label#grant_budgets-error.error - = f.simple_fields_for :grant_budgets do |grant_budget| - = render 'grant_budget_fields', f: grant_budget - - = f.button :submit, :class => "btn btn-primary", :id => 'grant_form_submit' - -:javascript - - var glas = JSON.parse('#{glas.to_json.html_safe}'); - - $(document).ready(function(){ - transam.make_same_height('.header-part'); - }); - - $('body').on('change', '#grant_budgets .grant_budget_amount', function() { - $('.grant_budget_amount').valid(); - }); - $('#grant_amount').on('change', function() { - if ($('#grant_budgets .grant_budget_amount').length > 0) { - $('#grant_budgets .grant_budget_amount').rules("add", { - budgetsSum: $('#grant_amount').val() - }); - $('.grant_budget_amount').valid(); - } - }); + %fieldset + %legend{id: 'details'} Details + + .row + .col-sm-3= f.input :grant_num, label: 'Grant Number' + .row + .col-sm-3 + .form-group + %label.control-label.string.required + * Source + = select_tag(:funding_source_type_id, options_from_collection_for_select(FundingSourceType.where.not(name: 'Agency'), "id", "name"), class: 'form-control', include_blank: true) + .row + .col-sm-3= f.input :global_sourceable, collection: FundingSource.all.map{|f| [ f.to_s, f.to_global_id, data: {funding_source_type_id: f.funding_source_type_id} ]}, label: 'Program', required: true + .row + .col-sm-3= f.association :owner, collection: Organization.where.not(organization_type: OrganizationType.find_by(class_name: 'PlanningPartner')).collect{|f| [f.to_s, f.id]} + .col-sm-3= f.association :contributor, collection: [['Multiple', 'multiple'], ['Other','other']] + Organization.where.not(organization_type: OrganizationType.find_by(class_name: 'PlanningPartner')).collect{|f| [f.to_s, f.id]}, required: true + #other-contributor-div.col-sm-4{style: 'display:none;'} + = f.input :other_contributor + + .row + .col-sm-9= f.input :legislative_authorization + .row + .col-sm-2 + = f.input :award_date, :wrapper => :vertical_append, :label => "Date of Award" do + = f.input_field :award_date, :as => :string, :class => 'form-control datepicker', :value => format_as_date(f.object.award_date) + %span.input-group-addon + %i.fa.fa-calendar + .row + .col-sm-4 + .form-group + %label.control-label Method of Apportionment Structure + .display-value Single Apportionment + .col-sm-2= f.input :fy_year, collection: get_fiscal_years(Date.today-18.years,19).reverse, label: 'Grant Year' + .row + .col-sm-4 + = f.input :amount, :wrapper => :vertical_prepend, label: 'Total Apportionment' do + %span.input-group-addon + %i.fa.fa-usd + = f.input_field :amount, :class => "form-control" + .row + .col-sm-3 + .form-group + %label.control-label Grant Development Method + .display-value Directly Generated + + // TODO: Add image to button + = f.button :submit, "+ Add Grant & Go To Grant Details", :class => "btn btn-primary", :id => 'grant_form_submit' + = link_to "Cancel", :back, :class => "btn btn-default", :role => 'button' - $.validator.addMethod("budgetsSum", function(value, element, params) { - var sum = 0; - $('.grant_budget_amount').each(function() { - int = parseInt($(this).val()) - if (int > 0) { - sum += int; - } - }); - return sum <= parseInt(params); - }, "Sum of entries is not less than or equal to {0}."); +:javascript - // jquery validations $('.grant_form').validate({ submitHandler: function(form) { + $('input').prop('disabled', false); // re-enable any disabled fields so they'll submit form.submit(); } }); - $('#grant_organization_id').change(function() { - update_glas(); - }); + $('#funding_source_type_id').on('change', function(e) { + var id = $(this).val(); - $('#grant_sourceable_id').change(function() { - update_fiscal_year_range(); + $("#grant_global_sourceable option:selected").prop("selected", false) + $('#grant_global_sourceable option').hide(); + $('#grant_global_sourceable option[data-funding-source-type-id="'+id+'"]').show(); }); - $('#grant_budgets').on('cocoon:after-insert', function(e, added_budget) { - if ($('#grant_organization_id').length > 0) { - update_glas(); - } - - added_budget.find('input.grant_budget_amount').rules("add", { - budgetsSum: $('#grant_amount').val() - }); - }) + $('#grant_contributor_id').on('change', function(e) { + var id = $(this).val(); - function update_glas() { - org_id = parseInt($('#grant_organization_id').val()); - var gla_ids = glas[org_id]; - - //console.log(gla_ids); - $('#grant_budgets select option').each(function() { - var val = $(this).val(); - if((val && gla_ids != undefined && gla_ids.indexOf(parseInt(val)) > -1) || (val == "")) { - $(this).show(); - } else { - $(this).prop('selected', false); - $(this).hide(); - } - }); + if ($('#grant_contributor_id option:selected').text() == 'Other') { + $('#other-contributor-div').show(); + } else { + $('#other-contributor-div').hide(); + $('#grant_other_contributor').val(''); + } + }); + $('#funding_source_type_id').change(); + $('#grant_contributor_id').change(); - } + $('#grant_award_date').datepicker("setDate", new Date()); - function update_fiscal_year_range() - { - var url = '#{find_fiscal_year_range_funding_sources_path}'; - if ( $('#funding_bucket_proxy_program_id').val() > 0) - { - $.ajax({ - url: url, - data: {program_id: $('#grant_sourceable_id').val()}, - success: function(result){ - $('#grant_fy_year').empty(); - - //Add a blank entry to the list. - $("#grant_fy_year").append( $("").attr("value", "").text('')); - for(i = 0;i").attr("value", result[i][1]).text(result[i][0]) - ); - } - }, - error: function (xhr, ajaxOptions, thrownError) { - alert("We are sorry but something went wrong. " + xhr.status + " " + thrownError); - } - }); - } - } + // TODO: Can't add commas to numeric field. Can we make this a text field instead? + // $('#grant_amount').keyup(function(event) { + // $(this).val($(this).val().replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",")); + // }); \ No newline at end of file diff --git a/app/views/grants/_grant_amendments.html.haml b/app/views/grants/_grant_amendments.html.haml new file mode 100644 index 00000000..3226561b --- /dev/null +++ b/app/views/grants/_grant_amendments.html.haml @@ -0,0 +1,62 @@ +:ruby + table_dom_id = SecureRandom.hex + +:css + .th-inner { + margin-left: 8px; + } + +- if (can? :update, @grant) && @grant.updatable? + = link_to new_grant_grant_amendment_path(@grant), :class => "btn btn-primary btn-md" do + %i.fa.fa-plus + Add Amendment + +.table-responsive + %table.table.table-hover{:id => table_dom_id, + :data => {:toggle => 'table', + :card_view => "false", + :pagination => 'true', + :sort_order => 'asc', + :sortable => 'true', + :side_pagination => 'server', + :show_pagination_switch => 'false', + :page_number => '1', + :page_list => "[5, 10, 20, 50, 100, 200]", + :page_size => current_user.num_table_rows, + :search => 'false', + :show_columns => 'true', + :toolbar => "#table_actions", + :row_style => 'row_style', + :click_to_select => 'true', + :show_export => 'true', + :id_field => 'object_key', + :export_types => "['csv', 'txt', 'excel']", + :cookie => 'true', + :cookie_id_table => "grant_amendments_id", + :cookie_expire => "1y", + :maintain_selected => 'true', + :single_select => 'false'}} + %thead + %tr + %th.left{:data => {:sortable => 'true'}} Amendment Number + %th.left{:data => {:sortable => 'true'}} Grant Number + %th.left{:data => {:sortable => 'true'}} Comments + %th.left{:data => {:sortable => 'true'}} Created By + %th.left{:data => {:sortable => 'true'}} Created Date & Time + %th.left{:data => {:sortable => 'false'}} Actions + + %tbody + - @grant.grant_amendments.each do |amendment| + %tr + %td.left= amendment.amendment_num + %td.left= amendment.grant_num + %td.left= amendment.comments + %td.left= amendment.creator + %td.left= format_as_date_time(amendment.created_at) + %td.left + - if (can? :update, @grant) && @grant.updatable? + = link_to edit_grant_grant_amendment_path(@grant, amendment), :class => "button btn-xs", :title => "Edit amendment" do + %i.fa.fa-edit.fa-1-5x.text-success + - if amendment.deleteable? + = link_to grant_grant_amendment_path(@grant, amendment), :method => :delete, :data => {:confirm => "Are you sure? The action cannot be undone."} do + %i.fa.fa-trash-o.fa-fw.text-danger \ No newline at end of file diff --git a/app/views/grants/_grant_apportionments.html.haml b/app/views/grants/_grant_apportionments.html.haml new file mode 100644 index 00000000..288b90e5 --- /dev/null +++ b/app/views/grants/_grant_apportionments.html.haml @@ -0,0 +1,22 @@ +- @grant.grant_apportionments.each do |apportionment| + .row + .col-sm-2 + = editable_field_tag([@grant,apportionment], :name, 'Apportionment Name') + .col-sm-2 + = editable_association_tag([@grant, apportionment], :fy_year, '* Apportionment Year', get_fiscal_years(Date.today-18.years,19).map{|x| [x[1], x[0]]}.reverse, current_method: :fy_year, suffix: '') + .col-sm-1 + .form-group + %label.control-label * Source + .display-value= apportionment.sourceable.funding_source_type + .col-sm-1 + .form-group + %label.control-label * Program + .display-value= apportionment.funding_source + .col-sm-2 + .form-group + %label.control-label * Apportionment Amount + .display-value= format_as_currency(apportionment.amount) + + + + diff --git a/app/views/grants/_grant_assets.html.haml b/app/views/grants/_grant_assets.html.haml new file mode 100644 index 00000000..6718ff27 --- /dev/null +++ b/app/views/grants/_grant_assets.html.haml @@ -0,0 +1,68 @@ +:ruby + table_dom_id = SecureRandom.hex + +:css + #assets-table td.left { + padding: 3px 3px 3px 16px; + } + +#assets-table + %table.table.table-hover{:id => table_dom_id, :data => {:toggle => 'table', + :card_view => "false", + :pagination => 'true', + :show_pagination_switch => 'false', + :show_columns => 'false', + :show_export => 'false', + :export_types => "['csv', 'txt', 'excel']", + :show_toggle => 'false', + :resizable => 'false', + :search => 'false', + :show_multi_sort => 'true' }} + -# TODO: implement search and filters + %thead + %tr + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Asset ID + %th.left{:data => {:sortable => 'true', :order => 'desc'}} External ID + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Organization + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Year + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Category + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Class + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Type + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Subtype + %th.right{:data => {:sortable => 'true', :order => 'desc'}} Cost (Purchase) + %th.right{:data => {:sortable => 'true', :order => 'desc'}} Amount + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Condition + %th.left{:data => {:sortable => 'true', :order => 'desc'}} Status + %th.left{:data => {:sortable => 'true', :order => 'desc'}} In Service Date + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Component / Sub-Component Type + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Sub-Component + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Facility Name + %th.right{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Current Book Value + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Date of Condition Assessment + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Replacement Status + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Replacement Policy Year + %th.left{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Replacement Actual Year + %th.right{:data => {:sortable => 'true', :order => 'desc', :visible => 'false'}} Scheduled Replacement Cost + + %tbody + - assets.each do |a| + - a = TransamAsset.get_typed_asset(a) + %tr + %td.left= link_to a.asset_tag, inventory_path(a) + %td.left= a.external_id + %td.left= a.organization.short_name + %td.left= a.manufacture_year + %td.left= a.fta_asset_category.name + %td.left= a.fta_asset_class.name + %td.left= a.fta_type_type.classify.constantize.find_by(id: a.fta_type_id).name + %td.left= a.asset_subtype + %td.right= format_as_currency(a.purchase_cost) + %td.right= format_as_currency(a.purchase_cost * 0.01 * GrantPurchase.find_by(transam_asset_id: a.transam_assetible_id, sourceable_type: "Grant", sourceable_id: grant_id).pcnt_purchase_cost) + %td.left= format_as_decimal(a.reported_condition_rating, 2) + %td.left= a.service_status_type.name unless a.service_status_type.nil? + %td.left= format_as_date(a.in_service_date) + -# TODO: Figure out component/sub-component fields + -#%td.left= a.respond_to? component_or_sub_component_type ? a.component_or_sub_component_type : nil + + + = render :partial => 'shared/table_scripts', :locals => {:table_id => table_dom_id, :path_pattern => inventory_path("xxx")} \ No newline at end of file diff --git a/app/views/grants/_history.html.haml b/app/views/grants/_history.html.haml new file mode 100644 index 00000000..c0e2248d --- /dev/null +++ b/app/views/grants/_history.html.haml @@ -0,0 +1,44 @@ +:ruby + table_dom_id = SecureRandom.hex + +.table-responsive + %table.table.table-hover{:id => table_dom_id, + :data => {:toggle => 'table', + :card_view => "false", + :pagination => 'true', + :sort_order => 'asc', + :sortable => 'true', + :side_pagination => 'server', + :show_pagination_switch => 'true', + :page_number => '1', + :page_list => "[5, 10, 20, 50, 100, 200]", + :page_size => current_user.num_table_rows, + :search => 'false', + :show_columns => 'true', + :toolbar => "#table_actions", + :row_style => 'row_style', + :click_to_select => 'true', + :show_export => 'true', + :id_field => 'object_key', + :export_types => "['csv', 'txt', 'excel']", + :cookie => 'true', + :cookie_id_table => "grant_history_id", + :cookie_expire => "1y", + :maintain_selected => 'true', + :single_select => 'false'}} + %thead + %tr + %th.center{:data => {:sortable => 'true'}} Event + %th.center{:data => {:sortable => 'true'}} Event Type + %th.center{:data => {:sortable => 'true'}} Comments + %th.center{:data => {:sortable => 'true'}} Event By + %th.center{:data => {:sortable => 'true'}} Date & Time + + %tbody + - @grant.history.each do |evt| + %tr + %td.left= evt[:event] + %td.left= evt[:event_type] + %td.left= evt[:comments] + %td.left= evt[:user] + %td.left= format_as_date_time(evt[:datetime]) \ No newline at end of file diff --git a/app/views/grants/_index_actions.html.haml b/app/views/grants/_index_actions.html.haml index 502ab833..319ab90d 100644 --- a/app/views/grants/_index_actions.html.haml +++ b/app/views/grants/_index_actions.html.haml @@ -1,8 +1,8 @@ -= form_tag grants_path, :id => 'filter_form', :method => "get", :class => 'navbar-form navbar-right panel-action' do - .form-group - = select_tag(:sourceable_id, options_for_select(Grant.sources.collect{|a| [a.name, a.id]}, :selected => @sourceable_id), :class => "form-control", :prompt => "Any Source...") - .form-group - = select_tag(:fiscal_year, options_for_select(@fiscal_years, :selected => @fiscal_year), :class => "form-control", :prompt => "Any #{get_fy_label}...") += form_tag grants_path, :id => 'filter_form', :method => "get", :class => 'navbar-form navbar-left' do + #filter-div + %label Status: + .form-group + = select_tag(:state, options_for_select([["In Development / Open", "default"], ["All", "all"]].concat(Grant.state_names.collect{|a| [a.titleize, a]}), :selected => @state), :class => "form-control") - = button_tag :class => 'btn btn-default', :type => 'submit' do - %i.fa.fa-filter + = button_tag :class => 'btn btn-default', :type => 'submit' do + %i.fa.fa-filter \ No newline at end of file diff --git a/app/views/grants/_index_table.html.haml b/app/views/grants/_index_table.html.haml index 6ab4dd5e..9085f7f5 100644 --- a/app/views/grants/_index_table.html.haml +++ b/app/views/grants/_index_table.html.haml @@ -1,89 +1,88 @@ :ruby table_dom_id = SecureRandom.hex show_actions ||= 0 - sourceable ||= nil -#grants_table_actions.btn-group - - if can? :create, Grant - = link_to new_grant_path(:sourceable_id => sourceable.try(:id)), :class => 'btn btn-default' do - %i.fa.fa-plus.fa-fw - = "Add Grant"; +:css + #subheader-label h2 { + border-bottom: 1px solid #e5e5e5; + } + + .btn-primary, .btn-group > .btn:first-child { + margin-left: 5px; + } + + .navbar-form { + position:relative; + } + +#subheader-label + %h2 Grants + %legend.asset-subheader + %span #{params[:state] == "all" ? "All" : "Filtered"} + +#grants_table_actions.row - if show_actions == 1 = render :partial => "grants/index_actions" + - if can? :create, Grant + .navbar-form.pull-right + = link_to new_grant_path, :class => 'btn btn-primary' do + %i.fa.fa-plus.fa-fw + = "Add Grant"; + .navbar-form.pull-right + %button.btn.btn-primary.btn-md.dropdown-toggle{:data => {:toggle => 'dropdown'}} + %i.fa.fa-file + = " Export" + %span.caret + %ul.dropdown-menu{:role => 'menu'} + %li + = link_to "XLSX", current_url(format: :xlsx), target: '_blank', title: 'Export all rows and columns to XLSX' + .table-responsive %table.table.table-hover{:id => table_dom_id, :data => {:toggle => 'table', :pagination => 'true', - :show_pagination_switch => 'true', - :page_list => "[5, 10, 20, 50, 100, 200]", + :show_pagination_switch => 'false', + :page_number => '1', + :page_list => "[10, 20, 50, 100, 200]", :page_size => current_user.num_table_rows, :search => 'false', - :toolbar => "#grants_table_actions", :export_types => "['csv', 'txt', 'excel']", - :show_export => 'true', - :show_columns => 'true', - :state_save => 'true', - :state_save_id_table => "grants_id", - :state_save_expire => "1y"}} + :show_export => 'false', + :show_columns => 'false', + :cookie => 'true', + :cookie_id_table => "grants_id", + :cookie_expire => "1y"}} %thead %tr %th.left{:data => {:visible => 'false'}} Object Key - - if @organization_list.count > 1 - %th.left{:data => {:visible => 'true', :sortable => 'true'}} Organization - %th.left{:data => {:sortable => 'true'}}= Grant.label - %th.left{:data => {:sortable => 'true'}} Name - %th.left{:data => {:sortable => 'true'}} #{get_fiscal_year_label} - %th.right{:data => {:sortable => 'true', :formatter => 'currency_formatter', :footer_formatter => 'sum_amount'}} Amount - -#%th.right{:data => {:sortable => 'true', :formatter => 'integer_formatter', :footer_formatter => 'sum_expenditures'}} CapEx - %th.right{:data => {:sortable => 'true', :formatter => 'currency_formatter', :footer_formatter => 'sum_total_spent'}} Spent - %th.right{:data => {:sortable => 'true', :formatter => 'currency_formatter', :footer_formatter => 'sum_total_balance'}} Balance + %th.left{:data => {:sortable => 'true'}} Grant Number + %th.left{:data => {:sortable => 'true'}} Source + %th.left{:data => {:sortable => 'true'}} Program + %th.left{:data => {:sortable => 'true'}} Grant Year + %th.left{:data => {:sortable => 'true'}} Owner + %th.left{:data => {:sortable => 'true'}} Contributor + %th.left{:data => {:sortable => 'true'}} Legislative Authorization + %th.left{:data => {:sortable => 'true'}} Date of Award + %th.left{:data => {:sortable => 'true'}} Date of Most Recent Amendment + %th.left{:data => {:sortable => 'true'}} Status + %th.left{:data => {:sortable => 'true'}} Last Update By + %th.left{:data => {:sortable => 'true'}} Last Update Date %tbody - grants.each do |grant| - %tr{:id => grant.object_key, :class => 'action-path'} + %tr{:id => grant.object_key} %td.left= grant.object_key - - if @organization_list.count > 1 - %td.left= grant.organization.short_name - %td.left= grant.sourceable - %td.left= grant.name - %td.center= format_as_fiscal_year(grant.fy_year) - %td.right= grant.amount.to_i - -#%td.right= grant.grant_purchases.count - %td.right= grant.spent.to_i - %td.right= grant.balance.to_i - -= render :partial => 'shared/table_scripts', :locals => {:table_id => table_dom_id, :path_pattern => grant_path("xxx")} - -:javascript - - function sum_amount(col_data) { - var sum = 0; - for (i = 0; i < col_data.length; i++) { - sum += parseInt(col_data[i][4]); - } - return "" + currency_formatter(sum) + ""; - }; - - function sum_expenditures(col_data) { - var sum = 0; - for (i = 0; i < col_data.length; i++) { - sum += parseInt(col_data[i][4]); - } - return "" + integer_formatter(sum) + ""; - }; - - function sum_total_spent(col_data) { - var sum = 0; - for (i = 0; i < col_data.length; i++) { - sum += parseInt(col_data[i][5]); - } - return "" + currency_formatter(sum) + ""; - }; + %td.left= link_to grant.grant_num, grant_path(grant) + %td.left= grant.sourceable.funding_source_type + %td.left= grant.funding_source + %td.left= grant.fy_year + %td.left= grant.owner + %td.left= grant.has_multiple_contributors ? 'Multiple' : (grant.contributor.nil? ? 'Other' : grant.contributor) + %td.left= grant.legislative_authorization + %td.left= format_as_date(grant.award_date) + %td.left= format_as_date(grant.grant_amendments.last.try(:created_at).try(:to_date)) + %td.left= grant.state.titleize + %td.left= grant.updater + %td.left= format_as_date_time(grant.updated_at) - function sum_total_balance(col_data) { - var sum = 0; - for (i = 0; i < col_data.length; i++) { - sum += parseInt(col_data[i][4]) - parseInt(col_data[i][5]); - } - return "" + currency_formatter(sum) + ""; - }; += render :partial => 'shared/table_scripts', :locals => {:table_id => table_dom_id, :path_pattern => grant_path("xxx")} \ No newline at end of file diff --git a/app/views/grants/_scripts.html.haml b/app/views/grants/_scripts.html.haml old mode 100755 new mode 100644 index 7cefd288..495a9faf --- a/app/views/grants/_scripts.html.haml +++ b/app/views/grants/_scripts.html.haml @@ -1,7 +1,27 @@ += render partial: 'shared/xeditable_scripts' + :javascript + var grant_tab_key = 'grant_tab_key'; + $(document).ready(function() { transam.make_same_height('.header-part'); + // Manage the tabs + $('a[data-toggle="tab"]').on('shown.bs.tab', function(e) { + // save the latest tab + var this_tab = $(this).attr('href'); + transam.set_ui_key_value(grant_tab_key, this_tab); + }); + }); + $(function() { + // Find the previously selected tab + var selected_tab = $('a[href="'+transam.get_ui_key_value(grant_tab_key)+'"]'); + // Default to the first tab if no tab is stored or stored tab isn't available to current user + if (selected_tab.length) { + selected_tab.tab('show'); + } else { + $('a[data-toggle="tab"]:first').tab('show'); + } }); diff --git a/app/views/grants/_summary.html.haml b/app/views/grants/_summary.html.haml deleted file mode 100644 index c5793f90..00000000 --- a/app/views/grants/_summary.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -= format_field("Fund", @grant.sourceable) -= format_field("Organization", @grant.organization) -= format_field(get_fiscal_year_label, format_as_fiscal_year(@grant.fy_year)) -= format_field("Budget", format_as_currency(@grant.amount)) -= format_field("Spent", format_as_currency(@grant.spent)) -= format_field("Balance", format_as_currency(@grant.balance)) diff --git a/app/views/grants/edit.html.haml b/app/views/grants/edit.html.haml deleted file mode 100644 index d06c1043..00000000 --- a/app/views/grants/edit.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.row - .col-md-6.col-md-offset-3 - %fieldset - %legend Update Grant - = render(:partial => 'shared/form_errors', :locals => {:obj => @grant}) unless @grant.errors.empty? - - = render 'form' - -= render 'scripts' diff --git a/app/views/grants/index.xlsx.axlsx b/app/views/grants/index.xlsx.axlsx new file mode 100644 index 00000000..cb4a775e --- /dev/null +++ b/app/views/grants/index.xlsx.axlsx @@ -0,0 +1,56 @@ +require 'rubyXL' + +wb = xlsx_package.workbook + +wb.styles do |style| + + # Define styles + table_header = style.add_style(bg_color: "BFBFBF", b: true, font_name: "Calibri (body)", :border => { :style => :thin, :color => "00000000" }) + column_header = style.add_style(b: true, font_name: "Calibri (body)") + table_data = style.add_style(font_name: "Calibri (body)") + + # Add worksheet + wb.add_worksheet(name: "Grants") do |sheet| + + # Define columns [column header, data value] + columns = { + grant_num: ["Grant #", "grant.grant_num"], + source: ["Source", "grant.sourceable.funding_source_type"], + program: ["Program", "grant.funding_source.to_s"], + grant_year: ["Grant Year", "grant.fy_year"], + owner: ["Owner", "grant.owner"], + contributor: ["Contributor", "grant.has_multiple_contributors ? 'Multiple' : (grant.contributor.nil? ? 'Other' : grant.contributor)"], + legislative_authorization: ["Legislative Authorization", "grant.legislative_authorization"], + award_date: ["Date of Award", "format_as_date(grant.award_date)"], + most_recent_amendment: ["Date of Most Recent Amendment", "format_as_date(grant.grant_amendments.last.try(:created_at).try(:to_date))"], + closeout_date: ["Date of Closeout", "format_as_date(grant.closeout_date)"], + reopen_date: ["Date of Reopen", "format_as_date(grant.workflow_events.where(event_type: 'reopen').last.try(:created_at).try(:to_date))"], + apportionment_structure_method: ["Method of Apportionment Structure", "'Single Apportionment'"], + total_apportionment: ["Total Apportionment", "grant.amount"], + allow_over_allocation: ["Allow Over-Allocation", "grant.over_allocation_allowed"], + development_method: ["Grant Development Method", "'Directly Generated'"], + status: ["Status", "grant.state.titleize"], + last_update_by: ["Last Update By", "grant.updater"], + last_update_date: ["Last Update Date", "format_as_date_time(grant.updated_at)"] + } + + # Merge table header cells and add padding + sheet.merge_cells "A1:#{RubyXL::Reference.ind2ref(0, columns.length - 1)}" + + table_header_cells = ["Grant Data"] + (columns.length - 1).times do + table_header_cells << "" + end + + # Add table header + sheet.add_row table_header_cells, style: table_header + + # Add column headers + sheet.add_row columns.map{|key, value| value[0]}, style: column_header + + # Add data + @grants.each do |grant| + sheet.add_row columns.map{|key, value| eval(value[1])}, style: table_data + end + end +end \ No newline at end of file diff --git a/app/views/grants/new.html.haml b/app/views/grants/new.html.haml index 968ca975..0d0a1da2 100644 --- a/app/views/grants/new.html.haml +++ b/app/views/grants/new.html.haml @@ -1,7 +1,7 @@ .row .col-md-6.col-md-offset-3 %fieldset - %legend New Grant + %legend Add Grant = render(:partial => 'shared/form_errors', :locals => {:obj => @grant}) unless @grant.errors.empty? = render 'form' diff --git a/app/views/grants/show.html.haml b/app/views/grants/show.html.haml index e735d459..a103289c 100755 --- a/app/views/grants/show.html.haml +++ b/app/views/grants/show.html.haml @@ -1,27 +1,69 @@ -.row - .col-md-3 - .panel.panel-default.header-part - .panel-heading - .row - .col-md-6 - %h3.panel-title - %i.fa.fa-usd - = @grant.to_s - .col-md-6 - = render 'actions' - .panel-body - = render 'summary' +#subheader + .row + .col-sm-12 + %h2 Grant Profile + %legend + .row + .col-sm-10 + #{@grant.to_s} : #{@grant.sourceable.funding_source_type} : #{@grant.funding_source} : #{@grant.state.titleize} + .col-sm-2 + = render 'actions' - .col-md-9 - .panel.panel-default.header-part +.row + .col-sm-12 + .panel.panel-default .panel-heading - .row - .col-md-12 - %h3.panel-title - %i.fa.fa-folder-open - Details - - .panel-body - = render 'details' + %h3.panel-title + Details + = render partial: 'shared/xeditable_edit_actions', locals: {obj: @grant, allowed_to_edit: ((can? :update, @grant) && @grant.updatable?)} + #collapse-profile.panel-collapse.collapse.in + .panel-body.panel-body-fixed + %ul.nav.nav-tabs + %li + %a{:href => "#details", :data =>{:toggle => 'tab'}} + Details + %li + %a{:href => "#apportionments", :data =>{:toggle => 'tab'}} + Apportionments + -#%li + -# %a{:href => "#apportion_details", :data =>{:toggle => 'tab'}} + -# Apportionment Details + %li + %a{:href => "#assets", :data =>{:toggle => 'tab'}} + Assets + %li + %a{:href => "#amendments", :data =>{:toggle => 'tab'}} + Amendments + %li + %a{:href => "#hist", :data =>{:toggle => 'tab'}} + History + -# IMPORTANT: add .editable-fields-container css so xeditable can enable for each tab + .tab-content.editable-fields-container + .tab-pane.fade#details + %legend Details + .tab-content + = render 'details' + .tab-pane.fade#apportionments + %legend Apportionments + .tab-content + = render 'grant_apportionments' + -#.tab-pane.fade#apportion_details + -# %legend Apportionment Details + -# .tab-content + .tab-pane.fade#assets + %legend Assets + .tab-content + - if @grant.assets.empty? + %p There are no assets associated with this grant. + - else + = render :partial => 'grant_assets', :locals => {:assets => @grant.assets, :grant_id => @grant.id} + .tab-pane.fade#amendments + %legend Amendments + .tab-content + = render 'grant_amendments' + .tab-pane.fade#hist + %legend History + .tab-content + = render 'history' = render 'scripts' diff --git a/app/views/searches/_general_ledger_account_search_results_table.html.haml b/app/views/searches/_general_ledger_account_search_results_table.html.haml index 93043821..24ec68a6 100644 --- a/app/views/searches/_general_ledger_account_search_results_table.html.haml +++ b/app/views/searches/_general_ledger_account_search_results_table.html.haml @@ -19,9 +19,9 @@ :show_export => 'true', :id_field => 'object_key', :export_types => "['csv', 'txt', 'excel']", - :state_save => 'true', - :state_save_id_table => "asset_search_id", - :state_save_expire => "1y", + :cookie => 'true', + :cookie_id_table => "asset_search_id", + :cookie_expire => "1y", :maintain_selected => 'true', :single_select => 'false'}} %thead diff --git a/app/views/shared/_financial_nav.html.haml b/app/views/shared/_financial_nav.html.haml index e0d6a383..c41286ab 100644 --- a/app/views/shared/_financial_nav.html.haml +++ b/app/views/shared/_financial_nav.html.haml @@ -78,3 +78,10 @@ - if lookup_context.template_exists?(view_component, 'shared', true) - count += 1 = render :partial => "shared/#{view_component}", :locals => {:count => count} + + - if (can? :read, Grant) && !(SystemConfig.transam_module_names.include? 'funding') + %li.divider + %li.text-left + = link_to grants_path do + %i.fa.fa-balance-scale.fa-fw + Grants diff --git a/app/views/shared/_main_nav.html.haml b/app/views/shared/_main_nav.html.haml index 48ca07ea..261e305b 100644 --- a/app/views/shared/_main_nav.html.haml +++ b/app/views/shared/_main_nav.html.haml @@ -22,5 +22,6 @@ - if lookup_context.template_exists?(view_component, 'shared', true) = render :partial => "shared/#{view_component}" + = render 'shared/maintenance_nav' = render 'shared/reports_nav' = render 'shared/notifications_nav' diff --git a/app/views/transit_assets/_accounting_funding_form.html.haml b/app/views/transit_assets/_accounting_funding_form.html.haml new file mode 100644 index 00000000..e6b86abc --- /dev/null +++ b/app/views/transit_assets/_accounting_funding_form.html.haml @@ -0,0 +1,60 @@ +- if can? :update, asset + #funding_sources_grant_purchases.well.well-sm{style: "overflow-y:scroll; max-height:250px; width:95%;"} + = simple_form_for(asset.transam_asset, + :as => :asset, + :url => inventory_path(asset.transam_asset), + :method => 'put', + :remote => true, + :html => {:class => 'form-vertical form-section funding_sources_grant_purchases_form'}, + :wrapper => :vertical_form, + :wrapper_mappings => {:check_boxes => :vertical_radio_and_checkboxes, + :radio_buttons => :vertical_radio_and_checkboxes, + :file => :vertical_file_input, + :boolean => :vertical_boolean}) do |f| + + %fieldset + %legend Funding Programs + %label#funding_sources-error.error + = f.simple_fields_for :funding_source_grant_purchases do |funding_source| + = render 'assets/funding_source_fields', f: funding_source + .links.pull-right + = link_to_add_association f, :funding_source_grant_purchases, partial: 'assets/funding_source_fields', :class => 'btn btn-xs btn-info' do + %i.fa.fa-plus + + = f.button :submit, 'Save', :class => 'btn btn-primary' + +:javascript + $( document ).ready(function() { + $('.funding_sources_grant_purchases_form').validate({ + submitHandler: function(form) { + $('.funding_sources_grant_purchases_form input').prop('disabled', false); // re-enable any disabled fields so they'll submit + form.trigger('submit.rails'); // submits form both as HTML or JS as defined in form data-remote + } + }); + if ($('.funding_sources_grant_purchases_form input.funding-pcnt').length > 0) { + $('.funding_sources_grant_purchases_form input.funding-pcnt').rules( "add", { + pcntSumsHundred_funding_sources: true + }); + } + + }); + + $('body').on('change', '.funding_sources_grant_purchases_form .funding-pcnt', function() { + $('.funding_sources_grant_purchases_form input.funding-pcnt').rules( "add", { + pcntSumsHundred_funding_sources: true + }); + $('.funding_sources_grant_purchases_form .funding-pcnt').valid(); + + var amount = parseInt($(this).val())*parseInt($('#purchase_cost').editable('getValue')['asset[purchase_cost]'])/100; + var currency_val = parseFloat(amount).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); + $(this).closest('.pcnt-column').next().find('.grant-purchase-amount.display-value').html('$ ' + currency_val); + }); + + $.validator.addMethod("pcntSumsHundred_funding_sources", function(value, element) { + var sum = 0; + $('.funding_sources_grant_purchases_form .funding-pcnt').each(function() { + sum += Number($(this).val()); + }); + return sum <= 100; + }, "Entries do not sum to 100%."); + diff --git a/app/views/transit_assets/_accounting_purchase_form.html.haml b/app/views/transit_assets/_accounting_purchase_form.html.haml new file mode 100644 index 00000000..cc7f945c --- /dev/null +++ b/app/views/transit_assets/_accounting_purchase_form.html.haml @@ -0,0 +1,66 @@ +- if can? :update, asset + #grants_grant_purchases.well.well-sm{style: "overflow-y:scroll; max-height:250px; width:95%;"} + = simple_form_for(asset.transam_asset, + :as => :asset, + :url => inventory_path(asset.transam_asset), + :method => 'put', + :remote => true, + :html => {:class => 'form-vertical form-section grants_grant_purchases_form'}, + :wrapper => :vertical_form, + :wrapper_mappings => {:check_boxes => :vertical_radio_and_checkboxes, + :radio_buttons => :vertical_radio_and_checkboxes, + :file => :vertical_file_input, + :boolean => :vertical_boolean}) do |f| + + %fieldset + %legend Grants + %label#grants-error.error + = f.simple_fields_for :grant_grant_purchases do |grant| + = render 'assets/grant_fields', f: grant + .links.pull-right + = link_to_add_association f, :grant_grant_purchases, partial: 'assets/grant_fields', :class => 'btn btn-xs btn-info' do + %i.fa.fa-plus + + = f.button :submit, 'Save', :class => 'btn btn-primary' + +:javascript + $( document ).ready(function() { + $('.grants_grant_purchases_form').validate({ + submitHandler: function(form) { + $('.grants_grant_purchases_form input').prop('disabled', false); // re-enable any disabled fields so they'll submit + form.trigger('submit.rails'); // submits form both as HTML or JS as defined in form data-remote + } + }); + if ($('.grants_grant_purchases_form input.funding-pcnt').length > 0) { + $('.grants_grant_purchases_form input.funding-pcnt').rules( "add", { + pcntSumsHundred_grants: true + }); + } + + }); + + $('body').on('change', '.global-sourceable', function() { + id = $(this).attr('id'); + + $('#' + id.substring(0, id.length-'global_sourceable'.length) + 'other_sourceable').prop('disabled', $(this).val() != ''); + }); + + $('body').on('change', '.grants_grant_purchases_form .funding-pcnt', function() { + $('.grants_grant_purchases_form input.funding-pcnt').rules( "add", { + pcntSumsHundred_grants: true + }); + $('.grants_grant_purchases_form .funding-pcnt').valid(); + + var amount = parseInt($(this).val())*parseInt($('#purchase_cost').editable('getValue')['asset[purchase_cost]'])/100; + var currency_val = parseFloat(amount).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); + $(this).closest('.pcnt-column').next().find('.grant-purchase-amount.display-value').html('$ ' + currency_val); + }); + + $.validator.addMethod("pcntSumsHundred_grants", function(value, element) { + var sum = 0; + $('.grants_grant_purchases_form .funding-pcnt').each(function() { + sum += Number($(this).val()); + }); + return sum <= 100; + }, "Entries do not sum to 100%."); + diff --git a/config/initializers/transam.rb b/config/initializers/transam.rb index 26e134b3..f83264eb 100755 --- a/config/initializers/transam.rb +++ b/config/initializers/transam.rb @@ -1,3 +1 @@ -Rails.application.config.asset_purchase_source = 'FundingSource' -Rails.application.config.grant_source = 'FundingSource' Rails.application.config.rails_admin_accounting_lookup_tables = ['DepreciationIntervalType', 'ExpenseType'] \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 74fb5868..ea0bfd72 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,11 +11,13 @@ end resources :grants do + resources :grant_apportionments + resources :grant_amendments + member do get 'summary_info' + get 'fire_workflow_event' end - resources :comments - resources :documents end diff --git a/coverage/.last_run.json b/coverage/.last_run.json index 491c95b9..61df31e2 100644 --- a/coverage/.last_run.json +++ b/coverage/.last_run.json @@ -1,5 +1,5 @@ { "result": { - "covered_percent": 47.0 + "covered_percent": 29.32 } } diff --git a/coverage/.resultset.json b/coverage/.resultset.json index 931cc0a5..9767758b 100644 --- a/coverage/.resultset.json +++ b/coverage/.resultset.json @@ -10,6 +10,7 @@ 1, 1, 1, + 1, null, 1, null, @@ -41,7 +42,7 @@ null, null ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_depreciable.rb": [ + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_valuable.rb": [ 1, null, null, @@ -76,28 +77,43 @@ null, null, null, - 1, - 1, + 0, + 0, null, null, null, null, null, - 1, null, - 1, + 0, + 0, + 0, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, null, + 0, null, + 0, null, + 0, null, + 0, null, - 1, null, - 1, null, - 1, - 1, - 1, + null, + null, + 0, + null, + 0, + 0, + 0, null, null, null, @@ -108,6 +124,12 @@ null, null, 1, + 1, + 0, + null, + null, + null, + null, null, null, null, @@ -118,11 +140,11 @@ null, null, 1, - 5, - 5, - 2, - 2, - 2, + 0, + 0, + 0, + 0, + 0, null, 0, null, @@ -145,40 +167,37 @@ null, null, 1, + 0, null, null, null, null, null, null, - 1, - null, null, null, - 1, - 1, - 1, null, 1, + 0, + 0, null, - null, - 1, + 0, null, null, 1, null, - 1, + 0, null, - 1, - 1, - 1, + 0, + 0, + 0, + 0, 0, null, null, null, null, null, - 0, null, 0, 0, @@ -186,84 +205,91 @@ 0, 0, 0, - null, 0, - null, 0, 0, - null, + 0, + 0, + 0, 0, 0, null, null, null, - 1, - null, + 0, null, null, null, 1, - 1, - 1, - 0, 0, null, 0, null, + 0, null, + 0, + 0, null, - 1, + 0, + 0, null, null, - 1, - 1, + 0, null, + 0, null, null, - 1, null, + 0, + 0, + 0, null, - 1, - 1, null, + 0, null, - 1, + 0, + 0, null, - 1, + 0, + 0, + 0, null, + 0, + 0, null, - 1, + 0, null, - 1, null, - 1, - 1, null, - 1, 0, null, null, - 1, null, 0, null, null, + 0, + null, null, - 1, null, 1, - 1, + 0, + 0, null, null, 1, + 0, + 0, + null, + null, null, - 1, 1, null, + null, + 1, 0, 0, 0, - null, 0, 0, null, @@ -271,42 +297,29 @@ null, null, null, - 0, - null, - null, null, - 0, null, null, - 0, null, null, null, - 0, - 1, 1, + null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_depreciable.rb": [ 1, null, null, null, null, - 1, - 52, - 52, - 52, - 52, - 52, - 52, null, - 52, null, null, null, null, - 1, null, null, - 15, null, null, null, @@ -315,42 +328,42 @@ null, null, null, - 1, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accountable.rb": [ - 1, null, null, null, null, null, null, + 1, null, + 1, null, null, null, - 1, null, 1, - null, 1, null, null, null, null, null, + 1, null, 1, null, null, - 1, + null, null, null, 1, null, + 1, null, + 1, + 1, + 1, null, null, null, @@ -360,9 +373,9 @@ null, null, null, + 1, null, null, - 1, null, null, null, @@ -370,25 +383,34 @@ null, null, null, + 1, + 0, + 0, + 0, + 0, + 0, null, + 0, null, null, 1, - 1, + 0, null, null, 1, + 0, + null, null, 1, + 0, + null, null, 1, - 133, - 133, + 0, + null, null, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accounting_policy.rb": [ + 1, 1, null, null, @@ -399,110 +421,171 @@ null, null, null, + 1, + 1, + 1, null, 1, null, + null, 1, null, null, + 0, null, + 0, null, - 1, + 0, + 0, + 0, + 0, + 0, null, null, null, null, null, null, - 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, null, null, - 1, + null, + 0, null, null, null, null, 1, - 1, + 0, + 0, + 0, + 0, + null, + 0, + null, null, null, 1, null, null, + 0, + 0, null, null, null, + 1, null, null, + 1, + 0, null, null, + 0, null, + 0, null, null, - 1, + 0, null, + 0, null, + 0, + 0, null, + 0, + 0, null, null, + 0, null, + 0, null, null, null, + 0, null, + 0, + 0, null, - 1, null, - 10, + 0, null, - 10, + 0, + 0, null, - 3, + 0, + 0, + 0, null, + 0, + 0, null, - 3, + 0, null, null, - 4, null, - 10, + 0, null, null, null, + 0, null, null, - 1, - 7, + 0, null, - 2, null, null, - 2, + 0, + 0, + 0, + 0, null, null, - 3, null, - 7, null, + 1, + 17, + 17, + 17, + 17, + 17, + 17, null, + 17, null, null, - 1, - 3, null, null, 1, null, - 1, - 64, - 35, - 35, + null, + 2, + null, + null, + null, null, null, null, + null, + null, + 1, + null, null ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accounting_vendor.rb": [ + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accountable.rb": [ 1, null, null, @@ -525,7 +608,10 @@ null, null, null, + 1, + null, null, + 1, null, null, 1, @@ -554,17 +640,21 @@ null, null, 1, + 2, null, - 1, null, 1, null, + 1, null, 1, + 80, + 80, + null, null, null ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_gl_accountable_asset.rb": [ + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accounting_policy.rb": [ 1, null, null, @@ -575,34 +665,33 @@ null, null, null, - 1, null, 1, null, + 1, null, null, null, null, + 1, null, + 1, null, null, null, null, - 1, null, null, 1, null, null, - 2, - null, - 1, - null, 1, null, null, null, null, + 1, + 1, null, null, null, @@ -617,8 +706,7 @@ 1, 1, null, - 0, - null, + 1, null, null, null, @@ -628,62 +716,77 @@ null, null, null, - 1, - 0, - 0, null, null, - 1, - 2, - 2, null, null, null, 1, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_gl_accountable_asset_event.rb": [ - 1, + 9, null, + 9, null, + 3, + 6, null, + 3, null, null, + 3, null, + 9, null, null, null, null, - 1, null, 1, + 6, null, - 0, - null, - null, + 2, + 4, null, + 2, null, null, - 0, + 2, null, - 0, + 6, null, null, null, null, + 1, + 3, null, null, + 1, null, + 1, + 90, + 24, + 24, null, null, null, + 1, + 208, + 30, + 0, + 0, + 0, null, + 0, null, null, null, null, + 1, null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accounting_vendor.rb": [ 1, null, null, @@ -698,38 +801,21 @@ 1, null, 1, - 0, - null, - 0, - 0, null, - 0, + 1, null, - 0, - 0, null, null, null, - 0, - 0, null, - 0, - 0, - 0, null, - 0, null, null, - 0, null, + 1, null, - 0, null, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accounting_assets_controller.rb": [ - 1, null, null, null, @@ -739,7 +825,6 @@ null, null, null, - 1, null, 1, null, @@ -752,67 +837,46 @@ null, null, null, + 1, null, + 0, null, + 0, null, null, + 1, null, - null, - null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_gl_accountable_asset.rb": [ 1, - 0, null, - 0, - 0, null, null, null, - 1, - 0, null, - 0, null, - 0, - 0, null, null, null, 1, - 0, - 0, null, - 0, - 0, + 1, + null, null, null, null, null, - 1, - 1, null, - 0, - 0, - 0, - 0, null, - 0, - 0, null, null, null, - 1, - 1, 1, null, null, 1, null, - 1, - 1, - 1, - 1, - 1, - 1, null, 1, null, @@ -820,65 +884,54 @@ null, 1, null, - 1, null, null, - 1, null, null, - 1, null, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/app/calculators/declining_balance_depreciation_calculator.rb": [ null, null, null, null, null, - 1, + null, null, null, 1, + 1, + 0, + null, null, null, - 5, null, null, - 5, null, - 0, null, - 0, - 0, - 0, - 0, null, - 0, - 0, null, null, null, + 1, 0, 0, null, null, + 1, + 0, 0, null, null, - 0, null, + 1, null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/calculators/depreciation_calculator.rb": [ - null, - null, + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_gl_accountable_asset_event.rb": [ + 1, null, null, null, - 1, null, null, null, @@ -886,13 +939,17 @@ null, null, null, + 1, null, + 1, null, + 0, null, null, null, null, null, + 0, null, null, null, @@ -907,35 +964,29 @@ null, null, 1, - 8, - null, - null, 1, - 2, - null, + 0, null, - 1, null, null, - 2, null, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/app/calculators/straight_line_depreciation_calculator.rb": [ null, null, null, null, null, - 1, null, null, 1, null, + 1, + 0, null, - 5, + 0, + 0, null, + 0, null, 0, 0, @@ -943,60 +994,85 @@ null, null, 0, + 0, null, 0, 0, - null, - null, 0, + null, 0, null, + null, 0, null, null, + 0, + null, null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/controllers/expenditures_controller.rb": [ + "/Users/lydiachang/Projects/transam_accounting/lib/transam_accounting/transam_accounting_assets_controller.rb": [ 1, null, null, - 1, null, - 1, + null, + null, + null, + null, + null, null, 1, + null, 1, null, null, - 1, null, null, - 1, null, null, - 1, null, null, - 0, - 0, null, null, + null, + null, + null, + null, + null, + null, + null, + 1, + 0, + null, 0, 0, null, null, + null, + 1, 0, + null, 0, null, 0, 0, + null, + null, + null, + 1, + 0, 0, + null, 0, 0, null, null, + null, + null, + 1, 0, + null, 0, 0, 0, @@ -1006,17 +1082,231 @@ 0, null, null, - 0, - 0, - 0, + null, + 1, 0, 0, null, null, 0, + null, 0, 0, - null, + 0, + 0, + 0, + null, + 0, + null, + 0, + null, + 0, + null, + 0, + null, + null, + 0, + null, + null, + 1, + null, + null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/helpers/grant_amendments_helper.rb": [ + 1, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/helpers/grant_apportionments_helper.rb": [ + 1, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/calculators/declining_balance_depreciation_calculator.rb": [ + null, + null, + null, + null, + null, + 1, + null, + null, + 1, + null, + null, + 0, + null, + null, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + null, + null, + null, + 0, + 0, + null, + null, + 0, + null, + null, + 0, + null, + null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/calculators/depreciation_calculator.rb": [ + null, + null, + null, + null, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + 0, + null, + null, + 1, + 1, + null, + null, + 1, + null, + null, + 1, + null, + null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/calculators/straight_line_depreciation_calculator.rb": [ + null, + null, + null, + null, + null, + 1, + null, + null, + 1, + null, + null, + 0, + null, + null, + 0, + 0, + null, + null, + null, + 0, + null, + 0, + 0, + null, + null, + 0, + 0, + null, + 0, + null, + null, + null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/controllers/expenditures_controller.rb": [ + 1, + null, + null, + 1, + null, + 1, + null, + 1, + 1, + null, + null, + 1, + null, + null, + 1, + null, + null, + 1, + null, + null, + 0, + 0, + null, + null, + 0, + 0, + null, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, 0, 0, 0, @@ -1200,7 +1490,7 @@ 1, 0, 0, - null, + 1, 1, null, null, @@ -1338,6 +1628,7 @@ null ], "/Users/lydiachang/Projects/transam_accounting/app/controllers/general_ledger_accounts_controller.rb": [ + 1, 1, null, 1, @@ -1362,7 +1653,7 @@ null, 1, null, - 0, + 1, 0, 0, 0, @@ -1374,11 +1665,11 @@ null, null, null, - 0, - 0, + 1, + 1, null, - 0, - 0, + 1, + 1, 0, 0, 0, @@ -1388,8 +1679,8 @@ null, null, null, - 0, - 0, + 1, + 1, 0, 0, 0, @@ -1399,16 +1690,16 @@ null, null, null, - 0, + 1, null, - 0, + 1, null, null, - 0, + 1, null, - 0, - 0, - 0, + 1, + 1, + 1, null, null, null, @@ -1430,18 +1721,18 @@ null, 1, null, - 0, - 0, - null, + 1, + 1, null, - 0, - 0, - 0, null, - 0, - 0, - 0, - 0, + 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, null, null, null, @@ -1462,9 +1753,9 @@ null, null, 1, - 0, - 0, - 0, + 1, + 1, + 1, null, null, null, @@ -1519,11 +1810,11 @@ null, 1, null, - 0, - 0, - 0, - 0, - 0, + 1, + 1, + 1, + 2, + 1, null, 0, 0, @@ -1532,9 +1823,9 @@ null, null, 1, - 0, - 0, - 0, + 1, + 1, + 1, null, 0, null, @@ -1544,7 +1835,7 @@ null, null, 1, - 1, + 2, null, null, 1, @@ -1554,7 +1845,7 @@ null, null, 4, - 4, + 0, 0, 0, null, @@ -1563,7 +1854,7 @@ null, null, null, - 0, + 4, null, null, null, @@ -1571,6 +1862,8 @@ null ], "/Users/lydiachang/Projects/transam_accounting/app/controllers/grants_controller.rb": [ + 1, + null, 1, null, null, @@ -1580,58 +1873,58 @@ 1, null, 1, + 1, null, 1, null, 1, null, - 4, + 1, null, null, - 4, - 4, + 5, null, - 4, - 4, + 5, null, - 4, - 4, - 1, - 1, - 1, + 5, + 2, + 2, null, null, - 4, - 4, - 1, - 1, - 1, + 5, + 5, + 2, + 2, null, null, + 5, + 5, + 5, + 0, + 0, null, - 4, null, null, - 4, + 5, null, - 4, - 3, null, - 1, + 5, null, + 5, + 5, + 5, + 5, + 0, null, - 4, - 4, - 4, null, null, null, null, 1, null, - 0, - 0, - 0, + 1, + 1, + 2, null, null, null, @@ -1641,15 +1934,9 @@ 1, null, 0, - 0, null, 0, null, - null, - 0, - 0, - 0, - null, 0, 0, 0, @@ -1662,22 +1949,34 @@ null, 1, null, - null, 1, null, - 1, null, null, null, null, 1, null, + 1, + 1, 0, + 1, 0, 0, null, null, + 1, + 1, + null, + 1, + 1, + 0, 0, + 0, + null, + 2, + 1, + null, null, null, null, @@ -1686,14 +1985,19 @@ 1, null, 1, + 0, 1, + 0, + 0, + null, + null, 1, null, 1, 1, - 0, - 0, - 0, + 1, + 2, + 1, null, 0, 0, @@ -1704,7 +2008,17 @@ null, null, 1, + 1, + 1, + 1, null, + 1, + 2, + 1, + null, + null, + null, + 1, null, 0, null, @@ -1713,21 +2027,15 @@ 0, 0, 0, - null, 0, 0, null, + 0, null, null, + 0, null, null, - null, - 1, - 0, - 0, - 0, - 0, - 0, 0, null, null, @@ -1735,35 +2043,32 @@ 1, null, 1, - 4, + 3, null, - 4, - 4, + 3, + 0, 0, null, - 4, - 4, + 0, + 0, null, null, null, null, null, 1, + 2, null, null, - 8, - null, - 8, - 3, + 1, + 2, null, - 5, - 5, - 5, null, + 1, null, + 0, null, - 1, - 1, + 0, null, null, null @@ -1782,28 +2087,28 @@ null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/models/depreciation_calculation_type.rb": [ + "/Users/lydiachang/Projects/transam_accounting/app/models/grant_apportionment.rb": [ 1, null, - null, 1, null, + null, 1, - 2, null, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/app/models/general_ledger_account_entry.rb": [ + null, 1, null, null, - 1, + null, + null, null, 1, null, null, + 1, null, + 1, null, 1, null, @@ -1812,13 +2117,24 @@ null, 1, 1, + 1, + 1, + null, + null, + null, null, null, null, null, null, 1, - 1, + null, + null, + null, + null, + null, + null, + null, 1, null, null, @@ -1827,16 +2143,25 @@ null, null, null, - 27, + 1, + 0, + null, + null, + 1, + 0, + null, null, - 2, null, null, null, null, null, + 0, + 0, null, null, + 0, + null, null, null, null, @@ -1851,10 +2176,20 @@ 1, 0, null, + 1, + 0, + null, null, + 1, + 0, null, null, + 1, + 0, + null, null, + 1, + 0, null, null, null, @@ -1866,12 +2201,21 @@ null, null, 1, - 8, - 8, + null, + null, + 11, + 10, + 10, + 10, + 10, + 10, + 10, + null, + null, null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/models/expenditure.rb": [ + "/Users/lydiachang/Projects/transam_accounting/app/models/grant.rb": [ null, null, null, @@ -1880,7 +2224,9 @@ null, null, null, + 1, null, + 1, null, null, 1, @@ -1888,34 +2234,61 @@ null, 1, null, + 1, + null, null, null, null, 1, null, + 1, + null, + null, + null, null, 1, + 1, + null, null, 1, null, + 1, null, + 1, null, null, + 1, + 1, null, null, 1, null, + null, 1, null, + 1, null, 1, null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, null, 1, null, null, + null, + null, + null, 1, null, + 1, null, 1, null, @@ -1923,21 +2296,51 @@ null, null, null, + 1, + 1, null, null, + 1, + 1, + null, null, 1, 1, + null, + null, + null, + 1, + 0, + null, + null, + null, + null, + null, + null, + 1, 1, 1, 1, + 1, + 1, + null, + null, null, null, + null, + 1, 1, null, null, null, null, + 1, + null, + null, + null, + null, + null, + null, null, null, null, @@ -1946,11 +2349,11 @@ null, null, null, - 1, null, null, null, null, + 1, null, null, null, @@ -1963,6 +2366,11 @@ null, null, 1, + 2, + null, + null, + 1, + 0, 0, null, null, @@ -1972,17 +2380,56 @@ null, null, null, - 1, + null, + null, + null, + null, + null, + null, + null, + null, + 0, + 0, + null, 0, null, null, - 1, + null, + null, + null, + null, + null, 0, null, + 0, null, - 1, 0, null, + 0, + null, + null, + null, + 0, + null, + null, + null, + null, + null, + null, + null, + 0, + 0, + 0, + null, + 0, + null, + null, + null, + null, + null, + 0, + null, + null, null, null, null, @@ -1990,47 +2437,179 @@ null, null, 1, - 1, + null, + 39, + null, + 39, 0, 0, null, + null, + 39, + null, + 39, + null, + null, + 1, + 11, + null, + null, + 1, 0, null, + null, + 1, 0, + null, + 1, 0, null, + null, + 1, 0, null, null, + 1, 0, + null, + 1, 0, null, + null, + null, + null, + 1, 0, + null, + null, + null, + null, + 1, 0, + null, + null, + null, + 1, 0, null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 1, 0, null, null, + 1, + 11, + null, + null, + 1, 0, null, null, + 1, 0, null, null, null, + 1, + 0, + null, + null, + null, + null, + null, null, null, 1, - 2, - 2, - 2, - 2, + null, + null, + 1, + null, + 21, + 21, + 21, + 21, + null, + null, + 1, + 11, + 11, + 10, + null, + 1, + null, + null, null, null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/models/grant_purchase.rb": [ + "/Users/lydiachang/Projects/transam_accounting/app/models/grant_budget.rb": [ + null, + null, + null, + null, + null, + null, + null, + 1, + null, + null, + null, + null, + 1, + 1, + null, + null, + null, + null, + null, + 1, + 1, + null, + null, + 1, + 1, + null, + null, + null, + null, + null, + null, + 1, + 1, + 1, + null, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + 1, + 2, null, null, null, @@ -2040,48 +2619,63 @@ null, null, 1, - null, 1, null, null, 1, + 4, null, null, null, null, - 1, - null, - null, null, null, null, 1, + null, 1, + 4, null, + 4, null, null, null, 1, - 1, - 1, + 6, null, null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/models/depreciation_calculation_type.rb": [ + 1, + null, null, + 1, null, + 1, + 2, null, null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/models/general_ledger_account_entry.rb": [ + 1, null, null, 1, null, + 1, null, null, null, null, + 1, null, null, null, null, + 1, + 1, null, null, null, @@ -2089,31 +2683,20 @@ null, 1, 1, - null, - null, 1, - 0, null, null, - 1, - 0, null, - 0, null, null, - 0, - 0, null, null, - 0, + 24, null, + 2, null, null, - 1, - 1, - 1, null, - 0, null, null, null, @@ -2128,20 +2711,12 @@ 1, 0, null, - 1, - 8, - null, null, 1, - 2, - null, + 0, null, - 1, - 4, null, null, - 1, - 1, null, null, null, @@ -2149,18 +2724,18 @@ null, null, null, - 1, null, null, 1, null, null, - null, - null, + 1, + 6, + 6, null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/models/grant.rb": [ + "/Users/lydiachang/Projects/transam_accounting/app/models/expenditure.rb": [ null, null, null, @@ -2169,9 +2744,7 @@ null, null, null, - 1, null, - 1, null, null, 1, @@ -2185,16 +2758,17 @@ 1, null, null, + 1, null, + 1, null, null, - 1, null, null, - 1, null, null, 1, + null, 1, null, null, @@ -2203,13 +2777,15 @@ null, 1, null, + null, 1, null, null, 1, null, null, - 1, + null, + null, null, null, null, @@ -2221,18 +2797,11 @@ 1, null, null, - null, - null, - null, 1, null, null, null, null, - 1, - null, - null, - null, null, null, null, @@ -2253,26 +2822,11 @@ null, null, null, - 1, - 1, - null, - null, - 1, - 0, - null, - null, - 1, - 2, - 0, null, - 2, null, null, null, 1, - 1, - 1, - null, 0, null, null, @@ -2282,20 +2836,14 @@ null, null, null, - null, - null, - null, 1, 0, null, null, - null, - null, 1, 0, null, null, - null, 1, 0, null, @@ -2305,33 +2853,49 @@ null, null, null, + 1, + 1, + 0, + 0, null, + 0, null, + 0, + 0, null, + 0, null, null, + 0, + 0, null, + 0, + 0, + 0, null, + 0, null, null, - 1, - 0, 0, null, + null, 0, null, null, null, - 1, - 6, null, null, 1, - 0, + 2, + 2, + 2, + 2, null, null, - 1, - 0, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/models/grant_purchase.rb": [ + null, null, null, null, @@ -2344,22 +2908,19 @@ null, 1, null, - 30, - 30, - 30, - null, null, - null - ], - "/Users/lydiachang/Projects/transam_accounting/app/models/grant_budget.rb": [ null, null, + 1, null, null, null, null, null, 1, + 1, + 1, + null, null, null, null, @@ -2371,11 +2932,9 @@ null, null, null, - 1, - 1, null, null, - 1, + null, 1, null, null, @@ -2383,12 +2942,8 @@ null, null, null, - 1, - 1, - 1, null, null, - 1, null, null, null, @@ -2396,22 +2951,27 @@ null, null, null, - 1, null, null, + 1, + 1, null, null, null, null, null, - 1, - 3, null, null, null, + 1, + 0, null, + 1, + 0, null, null, + 1, + 0, null, null, 1, @@ -2429,15 +2989,11 @@ null, 1, null, - 1, - 6, null, - 6, + 1, null, null, null, - 1, - 8, null, null, null @@ -2449,7 +3005,7 @@ 1, null, 1, - 4, + 3, null, null, null @@ -2532,7 +3088,7 @@ null, null, null, - 31, + 32, 1, null, 1, @@ -2554,7 +3110,7 @@ null, null, 1, - 2, + 3, null, null, null, @@ -2568,7 +3124,7 @@ null, null, 1, - 1, + 7, null, null, 1, @@ -2592,8 +3148,8 @@ null, null, 1, - 26, - 26, + 30, + 30, null, null, null @@ -2612,7 +3168,15 @@ null, null ], - "/Users/lydiachang/Projects/transam_accounting/app/models/depreciation_entry.rb": [ + "/Users/lydiachang/Projects/transam_accounting/app/models/grant_amendment.rb": [ + 1, + null, + 1, + null, + 1, + null, + 1, + null, 1, null, null, @@ -2621,15 +3185,50 @@ null, null, null, + null, + null, + null, + null, + null, + null, + null, 1, + 0, + null, + null, + null, 1, + 0, + null, + 0, + 0, + null, + null, + 0, null, null, null, null, null, + null, + null, + null, + 1, + 0, + null, + null + ], + "/Users/lydiachang/Projects/transam_accounting/app/models/depreciation_entry.rb": [ + 1, + null, + null, + null, 1, null, + null, + null, + null, + 1, 1, null, null, @@ -2638,14 +3237,20 @@ null, 1, 1, + null, 1, null, null, null, + null, + null, + null, + 1, 1, null, null, null, + 1, null, null, null, @@ -2655,9 +3260,12 @@ null, null, null, - 20, null, - 6, + null, + null, + 2, + null, + 1, 1, 1, 1, @@ -2695,10 +3303,13 @@ null, null, 1, - 1, 0, + 0, + null, null, null, + 1, + 0, null, null ], @@ -2889,16 +3500,16 @@ null, null, 1, - 172, + 118, null, null, null, null, 1, - 157, - 157, + 102, + 102, null, - 157, + 102, null, null, null, @@ -2998,11 +3609,11 @@ null, null, 1, - 3, + 1, null, null, 1, - 6, + 2, null, null, 1, @@ -3106,7 +3717,7 @@ null, null, 1, - 10, + 1, null, null, null, @@ -3118,20 +3729,20 @@ null, null, 1, - 67, + 48, null, null, 1, - 54, - 54, + 39, + 39, 0, null, null, - 54, + 39, null, null, 1, - 54, + 39, null, null ], @@ -3146,24 +3757,24 @@ 1, 1, 1, - null, - 1, - 2, - 2, - 4, - null, - null, - null, - null, - 1, - 1, - 1, - 1, - 1, - 1, - 1, + null, 1, + 0, + 0, + 0, + null, + null, + null, + null, 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, null, null, null, @@ -3335,25 +3946,62 @@ 0, null, 0, + 0, + 0, null, + null, + 0, + 0, + 0 + ], + "/Users/lydiachang/Projects/transam_accounting/app/models/abilities/super_manager_accounting_ability.rb": [ 0, 0, 0, null, + 0, + null, + 0, null, 0, 0, 0 ], - "/Users/lydiachang/Projects/transam_accounting/app/models/abilities/super_manager_accounting_ability.rb": [ + "/Users/lydiachang/Projects/transam_accounting/app/models/abilities/grant_manager.rb": [ + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0 + ], + "/Users/lydiachang/Projects/transam_accounting/app/models/abilities/authorized_accounting_ability.rb": [ + 0, 0, 0, + null, 0, null, 0, + 0, + 0, + null, null, 0, null, + null, 0, 0, 0 @@ -3452,6 +4100,43 @@ null, 0, 0, + null, + 0, + 0, + null, + 0, + 0, + null, + 0 + ], + "/Users/lydiachang/Projects/transam_accounting/app/jobs/asset_depreciation_expense_update_job.rb": [ + null, + null, + null, + null, + null, + null, + 0, + null, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, 0, null, 0 @@ -3513,11 +4198,10 @@ null, 0, 0, - null, - 0, 0, null, 0, + null, 0, 0, 0, @@ -3671,6 +4355,160 @@ null, 0 ], + "/Users/lydiachang/Projects/transam_accounting/app/controllers/grant_amendments_controller.rb": [ + 0, + 0, + 0, + null, + 0, + null, + 0, + null, + 0, + null, + null, + 0, + 0, + 0, + null, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0 + ], + "/Users/lydiachang/Projects/transam_accounting/app/controllers/grant_apportionments_controller.rb": [ + 0, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + null, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + null, + 0, + 0, + null, + null, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + null, + null, + 0, + 0, + 0, + 0 + ], "/Users/lydiachang/Projects/transam_accounting/app/controllers/general_ledger_mappings_controller.rb": [ 0, null, @@ -4216,6 +5054,8 @@ 0 ], "/Users/lydiachang/Projects/transam_accounting/app/reports/asset_funding_source_report.rb": [ + 0, + null, 0, null, 0, @@ -4228,6 +5068,12 @@ 0, 0, 0, + 0, + 0, + 0, + 0, + 0, + 0, null, 0, null, @@ -4285,7 +5131,6 @@ 0, 0, 0, - 0, null, null, 0, @@ -4338,6 +5183,9 @@ 0, 0, null, + null, + null, + null, 0, null, 0, @@ -4914,6 +5762,6 @@ 0 ] }, - "timestamp": 1524070558 + "timestamp": 1551990397 } } diff --git a/db/asset_query_seeds.rb b/db/asset_query_seeds.rb new file mode 100644 index 00000000..b4fb9f6b --- /dev/null +++ b/db/asset_query_seeds.rb @@ -0,0 +1,45 @@ +### Load asset query configurations +puts "======= Loading core asset query configurations =======" + +# transam_assets table +grant_purchase_table = QueryAssetClass.find_or_create_by(table_name: 'grant_purchases', transam_assets_join: "left join grant_purchases on grant_purchases.transam_asset_id = transam_assets.id and grant_purchases.sourceable_type = 'FundingSource'") + +# Query Category and fields +category_fields = { + 'Funding': [ + { + name: 'sourceable_id', + label: 'Program', + filter_type: 'multi_select', + association: { + table_name: 'funding_sources', + display_field_name: 'name' + } + }, + { + name: 'pcnt_purchase_cost', + label: '%', + filter_type: 'numeric' + } + ] +} + +category_fields.each do |category_name, fields| + qc = QueryCategory.find_or_create_by(name: category_name) + fields.each do |field| + if field[:association] + qac = QueryAssociationClass.find_or_create_by(field[:association]) + end + qf = QueryField.find_or_create_by( + name: field[:name], + label: field[:label], + query_category: qc, + query_association_class_id: qac.try(:id), + filter_type: field[:filter_type], + auto_show: field[:auto_show], + hidden: field[:hidden], + pairs_with: field[:pairs_with] + ) + qf.query_asset_classes << grant_purchase_table + end +end diff --git a/db/data_migrations/20190108152018_add_accounting_asset_query_seeds.rb b/db/data_migrations/20190108152018_add_accounting_asset_query_seeds.rb new file mode 100644 index 00000000..25a240fe --- /dev/null +++ b/db/data_migrations/20190108152018_add_accounting_asset_query_seeds.rb @@ -0,0 +1,5 @@ +class AddAccountingAssetQuerySeeds < ActiveRecord::DataMigration + def up + require TransamAccounting::Engine.root.join('db', 'asset_query_seeds.rb') + end +end \ No newline at end of file diff --git a/db/data_migrations/20190114133756_add_grant_manager_role_privilege.rb b/db/data_migrations/20190114133756_add_grant_manager_role_privilege.rb new file mode 100644 index 00000000..50993468 --- /dev/null +++ b/db/data_migrations/20190114133756_add_grant_manager_role_privilege.rb @@ -0,0 +1,5 @@ +class AddGrantManagerRolePrivilege < ActiveRecord::DataMigration + def up + Role.create!(name: 'grant_manager', weight: 11, show_in_user_mgmt: true, privilege: true) + end +end \ No newline at end of file diff --git a/db/data_migrations/20190116194442_update_accounting_asset_query_fields.rb b/db/data_migrations/20190116194442_update_accounting_asset_query_fields.rb new file mode 100644 index 00000000..ba1ab887 --- /dev/null +++ b/db/data_migrations/20190116194442_update_accounting_asset_query_fields.rb @@ -0,0 +1,8 @@ +class UpdateAccountingAssetQueryFields < ActiveRecord::DataMigration + def up + asso_table = QueryAssociationClass.find_by(table_name: 'funding_sources') + if asso_table + asso_table.update display_field_name: 'name' + end + end +end \ No newline at end of file diff --git a/db/data_migrations/20190123160933_delete_old_grants.rb b/db/data_migrations/20190123160933_delete_old_grants.rb new file mode 100644 index 00000000..fca14836 --- /dev/null +++ b/db/data_migrations/20190123160933_delete_old_grants.rb @@ -0,0 +1,5 @@ +class DeleteOldGrants < ActiveRecord::DataMigration + def up + Grant.destroy_all + end +end \ No newline at end of file diff --git a/db/data_migrations/20190215194245_add_accounting_engine_name_system_config_extensions.rb b/db/data_migrations/20190215194245_add_accounting_engine_name_system_config_extensions.rb new file mode 100644 index 00000000..34608543 --- /dev/null +++ b/db/data_migrations/20190215194245_add_accounting_engine_name_system_config_extensions.rb @@ -0,0 +1,17 @@ +class AddAccountingEngineNameSystemConfigExtensions < ActiveRecord::DataMigration + def up + system_config_extensions = [ + {class_name: 'RehabilitationUpdateEvent', extension_name: 'TransamGlAccountableAssetEvent', active: true}, + {class_name: 'AssetsController', extension_name: 'TransamAccountingAssetsController', active: true}, + #{class_name: 'Organization', extension_name: 'TransamAccountable', active: true}, comment out temporarily as all orgs dont have COA + {class_name: 'Policy', extension_name: 'TransamAccountingPolicy', active: true}, + {class_name: 'Vendor', extension_name: 'TransamAccountingVendor', active: true}, + {class_name: 'TransamAsset', extension_name: 'TransamValuable', active: true} + + ] + + system_config_extensions.each do |config| + SystemConfigExtension.find_by(config).update!(engine_name: 'accounting') + end + end +end \ No newline at end of file diff --git a/db/migrate/20190108194002_cleanup_grants.rb b/db/migrate/20190108194002_cleanup_grants.rb new file mode 100644 index 00000000..b2a514be --- /dev/null +++ b/db/migrate/20190108194002_cleanup_grants.rb @@ -0,0 +1,26 @@ +class CleanupGrants < ActiveRecord::Migration[5.2] + def change + add_column :grants, :state, :string, after: :sourceable_type + add_column :grants, :created_by_user_id, :integer, after: :state + add_column :grants, :updated_by_user_id, :integer, after: :created_by_user_id + rename_column :grants, :name, :grant_num + rename_column :grants, :organization_id, :owner_id + add_reference :grants, :contributor, after: :owner_id + add_column :grants, :other_contributor, :string, after: :contributor_id + add_column :grants, :has_multiple_contributors, :boolean, after: :contributor_id + add_column :grants, :legislative_authorization, :string, after: :amount + add_column :grants, :award_date, :date, after: :fy_year + add_column :grants, :over_allocation_allowed, :boolean, after: :sourceable_type + + create_table :grant_amendments do |t| + t.string :object_key, null: false, limit: 12 + t.references :grant + t.string :amendment_num + t.string :grant_num + t.text :comments + t.integer :created_by_user_id + + t.timestamps + end + end +end diff --git a/db/migrate/20190201190146_add_fields_grant_purchases.rb b/db/migrate/20190201190146_add_fields_grant_purchases.rb new file mode 100644 index 00000000..88319059 --- /dev/null +++ b/db/migrate/20190201190146_add_fields_grant_purchases.rb @@ -0,0 +1,6 @@ +class AddFieldsGrantPurchases < ActiveRecord::Migration[5.2] + def change + add_column :grant_purchases, :expense_tag, :string, after: :pcnt_purchase_cost + add_column :grant_purchases, :other_sourceable, :string, after: :sourceable_type + end +end diff --git a/db/migrate/20190205153405_create_grant_apportionments.rb b/db/migrate/20190205153405_create_grant_apportionments.rb new file mode 100644 index 00000000..637fd24f --- /dev/null +++ b/db/migrate/20190205153405_create_grant_apportionments.rb @@ -0,0 +1,16 @@ +class CreateGrantApportionments < ActiveRecord::Migration[5.2] + def change + create_table :grant_apportionments do |t| + t.string :object_key, null: false, limit: 12 + t.references :grant + t.references :sourceable, polymorphic: true + t.string :name + t.integer :fy_year + t.integer :amount + t.integer :created_by_user_id + t.integer :updated_by_user_id + + t.timestamps + end + end +end diff --git a/db/seeds.rb b/db/seeds.rb index 873cbc42..71135c64 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -70,16 +70,21 @@ {:active => 0, :name => 'GL/Accounting Report', :description => 'GL/Accounting Report', :display_icon_name => 'fa fa-book'} ] system_config_extensions = [ - {class_name: 'RehabilitationUpdateEvent', extension_name: 'TransamGlAccountableAssetEvent', active: true}, - {class_name: 'AssetsController', extension_name: 'TransamAccountingAssetsController', active: true}, - #{class_name: 'Organization', extension_name: 'TransamAccountable', active: true}, comment out temporarily as all orgs dont have COA - {class_name: 'Policy', extension_name: 'TransamAccountingPolicy', active: true}, - {class_name: 'Vendor', extension_name: 'TransamAccountingVendor', active: true} + {engine_name: 'accounting', class_name: 'RehabilitationUpdateEvent', extension_name: 'TransamGlAccountableAssetEvent', active: true}, + {engine_name: 'accounting', class_name: 'AssetsController', extension_name: 'TransamAccountingAssetsController', active: true}, + #{engine_name: 'accounting', class_name: 'Organization', extension_name: 'TransamAccountable', active: true}, comment out temporarily as all orgs dont have COA + {engine_name: 'accounting', class_name: 'Policy', extension_name: 'TransamAccountingPolicy', active: true}, + {engine_name: 'accounting', class_name: 'Vendor', extension_name: 'TransamAccountingVendor', active: true}, + {engine_name: 'accounting', class_name: 'TransamAsset', extension_name: 'TransamValuable', active: true} ] +roles = [ + {name: 'grant_manager', privilege: true, show_in_user_mgmt: true, weight: 11} +] + lookup_tables = %w{ funding_source_types general_ledger_account_types general_ledger_account_subtypes depreciation_calculation_types depreciation_interval_types} -merge_tables = %w{ asset_event_types activities report_types system_config_extensions} +merge_tables = %w{ asset_event_types activities report_types system_config_extensions roles} lookup_tables.each do |table_name| puts " Loading #{table_name}" @@ -199,3 +204,6 @@ x.report_type = ReportType.where(:name => row[:type]).first x.save! end + +# asset query seeds +require_relative File.join('asset_query_seeds') diff --git a/lib/transam_accounting/transam_accounting_assets_controller.rb b/lib/transam_accounting/transam_accounting_assets_controller.rb index 90d2e6ba..01cae49d 100644 --- a/lib/transam_accounting/transam_accounting_assets_controller.rb +++ b/lib/transam_accounting/transam_accounting_assets_controller.rb @@ -86,9 +86,9 @@ def update_depreciation if asset.save - Delayed::Job.enqueue AssetUpdateJob.new(asset.object_key), :priority => 0 + #Delayed::Job.enqueue AssetUpdateJob.new(asset.object_key), :priority => 0 - notify_user(:notice, "Asset #{asset.name} was successfully updated.") + notify_user(:notice, "Asset #{asset} was successfully updated.") end redirect_to inventory_path(asset) diff --git a/lib/transam_accounting/transam_valuable.rb b/lib/transam_accounting/transam_valuable.rb index 30b90470..31b7b6ee 100644 --- a/lib/transam_accounting/transam_valuable.rb +++ b/lib/transam_accounting/transam_valuable.rb @@ -39,11 +39,18 @@ module TransamValuable # Associations #---------------------------------------------------- - # each asset was purchased using one or more grants + # each asset was purchased using some sources has_many :grant_purchases, :foreign_key => :transam_asset_id, :dependent => :destroy, :inverse_of => :transam_asset + has_many :grant_grant_purchases, -> { where(sourceable_type: 'Grant') }, :foreign_key => :transam_asset_id, :dependent => :destroy, :inverse_of => :transam_asset, class_name: 'GrantPurchase' + has_many :funding_source_grant_purchases, -> { where(sourceable_type: 'FundingSource') }, :foreign_key => :transam_asset_id, :dependent => :destroy, :inverse_of => :transam_asset, class_name: 'GrantPurchase' + + has_many :grants, through: :grant_purchases, :source => :sourceable, :source_type => 'Grant' + has_many :funding_sources, through: :grant_purchases, :source => :sourceable, :source_type => 'FundingSource' # Allow the form to submit grant purchases accepts_nested_attributes_for :grant_purchases, :reject_if => :all_blank, :allow_destroy => true + accepts_nested_attributes_for :grant_grant_purchases, :reject_if => :all_blank, :allow_destroy => true + accepts_nested_attributes_for :funding_source_grant_purchases, :reject_if => :all_blank, :allow_destroy => true has_many :depreciation_entries, :foreign_key => :transam_asset_id @@ -74,7 +81,9 @@ module TransamValuable module ClassMethods def self.allowable_params [ - :grant_purchases_attributes => [GrantPurchase.allowable_params] + :grant_purchases_attributes => [GrantPurchase.allowable_params], + :grant_grant_purchases_attributes => [GrantPurchase.allowable_params], + :funding_source_grant_purchases_attributes => [GrantPurchase.allowable_params] ] end end diff --git a/lib/transam_accounting/version.rb b/lib/transam_accounting/version.rb index ff69ee2a..975f667b 100644 --- a/lib/transam_accounting/version.rb +++ b/lib/transam_accounting/version.rb @@ -1,3 +1,3 @@ module TransamAccounting - VERSION = "2.4.1" + VERSION = "2.5.0" end diff --git a/spec/calculators/declining_balance_depreciation_calculator_spec.rb b/spec/calculators/declining_balance_depreciation_calculator_spec.rb index 34f00b20..381321ae 100644 --- a/spec/calculators/declining_balance_depreciation_calculator_spec.rb +++ b/spec/calculators/declining_balance_depreciation_calculator_spec.rb @@ -3,6 +3,8 @@ RSpec.describe DecliningBalanceDepreciationCalculator, :type => :calculator do + before { skip('Needs depreciation entries. Not yet testable.') } + class TestOrg < Organization def get_policy return Policy.find_by_organization_id(self.id) diff --git a/spec/calculators/depreciation_calculator_spec.rb b/spec/calculators/depreciation_calculator_spec.rb index 71c95903..5cd2c169 100644 --- a/spec/calculators/depreciation_calculator_spec.rb +++ b/spec/calculators/depreciation_calculator_spec.rb @@ -27,6 +27,9 @@ class Vehicle < Asset; end describe '#total_depreciation' do it 'is 0 for a purchase price of 0' do + + skip('Needs depreciation entries. Not yet testable.') + @test_asset.purchase_cost = 0 @test_asset.save! @@ -41,6 +44,7 @@ class Vehicle < Asset; end describe '#book_value_start' do it 'is the purchase cost if first fiscal year' do + skip('Needs depreciation entries. Not yet testable.') expect(test_calculator.book_value_start(@test_asset,fiscal_year_end_date(@test_asset.depreciation_start_date))).to eq(@test_asset.purchase_cost) end end diff --git a/spec/calculators/straight_line_depreciation_calculator_spec.rb b/spec/calculators/straight_line_depreciation_calculator_spec.rb index 20c24e2e..53a267d2 100644 --- a/spec/calculators/straight_line_depreciation_calculator_spec.rb +++ b/spec/calculators/straight_line_depreciation_calculator_spec.rb @@ -15,6 +15,8 @@ class Vehicle < Asset; end @organization = create(:organization) @test_asset = create(:buslike_asset, :organization => @organization) @policy = create(:policy, :organization => @organization) + + skip('Needs depreciation entries. Not yet testable.') end let(:test_calculator) { StraightLineDepreciationCalculator.new } diff --git a/spec/controllers/assets_controller_spec.rb b/spec/controllers/assets_controller_spec.rb index e00c5b03..2409cd58 100644 --- a/spec/controllers/assets_controller_spec.rb +++ b/spec/controllers/assets_controller_spec.rb @@ -5,6 +5,8 @@ RSpec.describe AssetsController, :type => :controller do + before {skip('Needs transam_asset. Not yet testable.')} + let(:test_asset) { create(:buslike_asset) } class TestOrg < Organization @@ -18,6 +20,7 @@ def get_policy before(:each) do User.destroy_all test_user.organizations << test_user.organization + test_user.viewable_organizations << test_user.organization test_user.save! sign_in test_user end diff --git a/spec/controllers/general_ledger_accounts_controller_spec.rb b/spec/controllers/general_ledger_accounts_controller_spec.rb index 81e26060..979b3cf5 100644 --- a/spec/controllers/general_ledger_accounts_controller_spec.rb +++ b/spec/controllers/general_ledger_accounts_controller_spec.rb @@ -13,6 +13,7 @@ def get_policy before(:each) do User.destroy_all test_user.organizations << test_user.organization + test_user.viewable_organizations << test_user.organization test_user.save! sign_in test_user end diff --git a/spec/controllers/grants_controller_spec.rb b/spec/controllers/grants_controller_spec.rb index d7acee72..0b9d34e3 100644 --- a/spec/controllers/grants_controller_spec.rb +++ b/spec/controllers/grants_controller_spec.rb @@ -5,57 +5,35 @@ RSpec.describe GrantsController, :type => :controller do let(:test_user) { create(:admin) } - let(:test_grant) { create(:grant) } + let(:test_grant) { create(:grant, :owner => subject.current_user.organization) } before(:each) do User.destroy_all test_user.organizations << test_user.organization + test_user.viewable_organizations << test_user.organization test_user.save! sign_in test_user end - describe 'fiscal years' do - it 'no min fy' do - get :index - - expect(subject.send(:fiscal_year_range)).to eq(get_fiscal_years) - end - it 'no num forecasting years' do - subject.instance_variable_set(:@organization, test_user.organization) - test_grant.update!(:fy_year => 2010, :organization => subject.current_user.organization) - - expect(subject.send(:fiscal_year_range)).to eq(get_fiscal_years(Date.new(2010,7,1))) - end - it 'num forecast years' do - subject.instance_variable_set(:@organization, test_user.organization) - test_grant.update!(:fy_year => 2010, :organization => subject.current_user.organization) - - expect(subject.send(:fiscal_year_range, 5)).to eq(get_fiscal_years(Date.new(2010,7,1),5)) - end - end - describe 'GET index' do let(:test_asset) { create(:buslike_asset, :organization => subject.current_user.organization) } it 'all' do - test_grant.update!(:organization => subject.current_user.organization) get :index expect(assigns(:grants)).to include(test_grant) end - it 'sourceable' do + it 'global_sourceable' do test_funding_source = test_grant.sourceable - test_grant.update!(:organization => subject.current_user.organization) - get :index, params: {:sourceable_id => test_funding_source.id} + get :index, params: {:global_sourceable => test_funding_source.to_global_id} - expect(assigns(:sourceable_id)).to eq(test_funding_source.id) + expect(assigns(:sourceable)).to eq(test_funding_source) expect(assigns(:grants)).to include(test_grant) - get :index, params: {:sourceable_id => test_funding_source.id + 1} + get :index, params: {:global_sourceable => create(:funding_source).to_global_id} expect(assigns(:grants)).not_to include(test_grant) end it 'fiscal year' do test_fy = test_grant.fy_year - test_grant.update!(:organization => subject.current_user.organization) get :index, params: {:fiscal_year => test_fy} expect(assigns(:fiscal_year)).to eq(test_fy) @@ -88,11 +66,6 @@ expect(assigns(:grant).to_json).to eq(Grant.new.to_json) end - it 'GET edit' do - get :edit, params: {:id => test_grant.object_key} - - expect(assigns(:grant)).to eq(test_grant) - end it 'POST create' do post :create, params: {:grant => {:fy_year => Date.today.year+1, :amount => 55555}} diff --git a/spec/dummy/app/models/application_record.rb b/spec/dummy/app/models/application_record.rb new file mode 100644 index 00000000..71a1a03c --- /dev/null +++ b/spec/dummy/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end \ No newline at end of file diff --git a/spec/dummy/config/initializers/mime_types.rb b/spec/dummy/config/initializers/mime_types.rb index dc189968..8c2cdde7 100644 --- a/spec/dummy/config/initializers/mime_types.rb +++ b/spec/dummy/config/initializers/mime_types.rb @@ -2,3 +2,5 @@ # Add new mime types for use in respond_to blocks: # Mime::Type.register "text/richtext", :rtf +Mime::Type.register "application/xls", :xls +Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx diff --git a/spec/dummy/config/initializers/transam_accounting_extensions.rb b/spec/dummy/config/initializers/transam_accounting_extensions.rb index 58860983..c2492e63 100644 --- a/spec/dummy/config/initializers/transam_accounting_extensions.rb +++ b/spec/dummy/config/initializers/transam_accounting_extensions.rb @@ -1,5 +1,3 @@ -Rails.application.config.asset_purchase_source = 'FundingSource' - Rails.configuration.to_prepare do Asset.class_eval do diff --git a/spec/dummy/config/initializers/transam_core_extensions.rb b/spec/dummy/config/initializers/transam_core_extensions.rb index 40dfeb7d..f548fe67 100644 --- a/spec/dummy/config/initializers/transam_core_extensions.rb +++ b/spec/dummy/config/initializers/transam_core_extensions.rb @@ -4,3 +4,7 @@ # Defines services to use Rails.application.config.new_user_service = "NewUserService" Rails.application.config.policy_analyzer = "TransitPolicyAnalyzer" + +# Base class name is to determine base asset class. Seed class is used to determine seed that gets typed (or very specific) asset class. +Rails.application.config.asset_base_class_name = 'TransamAsset' +Rails.application.config.asset_seed_class_name = 'FtaAssetClass' \ No newline at end of file diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index b35665f1..9d787f1b 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -11,1724 +10,2499 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180330151633) do - - create_table "activities", force: :cascade do |t| - t.string "object_key", limit: 12 - t.integer "organization_type_id", limit: 4 - t.string "name", limit: 64 - t.text "description", limit: 65535 - t.boolean "show_in_dashboard" - t.boolean "system_activity" - t.date "start_date" - t.date "end_date" - t.integer "frequency_quantity", limit: 4, null: false - t.integer "frequency_type_id", limit: 4, null: false - t.string "execution_time", limit: 32, null: false - t.string "job_name", limit: 64 +ActiveRecord::Schema.define(version: 2019_02_27_192638) do + + create_table "activities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12 + t.integer "organization_type_id" + t.string "name", limit: 64 + t.text "description" + t.boolean "show_in_dashboard" + t.boolean "system_activity" + t.date "start_date" + t.date "end_date" + t.integer "frequency_quantity", null: false + t.integer "frequency_type_id", null: false + t.string "execution_time", limit: 32, null: false + t.string "job_name", limit: 64 t.datetime "last_run" - t.boolean "active" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" end - create_table "activity_logs", force: :cascade do |t| - t.integer "organization_id", limit: 4, null: false - t.string "item_type", limit: 64, null: false - t.integer "item_id", limit: 4 - t.integer "user_id", limit: 4, null: false - t.text "activity", limit: 4294967295, null: false + create_table "activity_logs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id", null: false + t.string "item_type", limit: 64, null: false + t.integer "item_id" + t.integer "user_id", null: false + t.text "activity", limit: 4294967295, null: false t.datetime "activity_time" + t.index ["organization_id", "activity_time"], name: "activity_logs_idx1" + t.index ["user_id", "activity_time"], name: "activity_logs_idx2" + end + + create_table "archived_fiscal_years", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id" + t.integer "fy_year" + t.index ["organization_id"], name: "index_archived_fiscal_years_on_organization_id" + end + + create_table "asset_event_asset_subsystems", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_event_id" + t.integer "asset_subsystem_id" + t.integer "parts_cost" + t.integer "labor_cost" + t.index ["asset_event_id"], name: "rehab_events_subsystems_idx1" + t.index ["asset_subsystem_id"], name: "rehab_events_subsystems_idx2" + end + + create_table "asset_event_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "job_name", limit: 64, null: false + t.string "display_icon_name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["class_name"], name: "asset_event_types_idx1" + end + + create_table "asset_events", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "asset_id" + t.string "transam_asset_type" + t.bigint "transam_asset_id" + t.bigint "base_transam_asset_id" + t.integer "asset_event_type_id", null: false + t.integer "upload_id" + t.date "event_date", null: false + t.datetime "event_datetime" + t.decimal "assessed_rating", precision: 9, scale: 2 + t.integer "condition_type_id" + t.integer "current_mileage" + t.integer "parent_id" + t.integer "replacement_year" + t.integer "rebuild_year" + t.integer "disposition_year" + t.integer "extended_useful_life_miles" + t.integer "extended_useful_life_months" + t.integer "replacement_reason_type_id" + t.date "disposition_date" + t.integer "disposition_type_id" + t.integer "service_status_type_id" + t.boolean "fta_emergency_contingency_fleet" + t.integer "maintenance_type_id" + t.integer "pcnt_5311_routes" + t.integer "avg_daily_use_hours" + t.integer "avg_daily_use_miles" + t.integer "avg_daily_passenger_trips" + t.integer "maintenance_provider_type_id" + t.integer "vehicle_storage_method_type_id" + t.decimal "avg_cost_per_mile", precision: 9, scale: 2 + t.decimal "avg_miles_per_gallon", precision: 9, scale: 2 + t.integer "annual_maintenance_cost" + t.integer "annual_insurance_cost" + t.boolean "actual_costs" + t.integer "annual_affected_ridership" + t.integer "annual_dollars_generated" + t.integer "sales_proceeds" + t.decimal "speed_restriction", precision: 10, scale: 5 + t.string "speed_restriction_unit" + t.integer "period_length" + t.string "period_length_unit" + t.string "from_line" + t.string "to_line" + t.decimal "from_segment", precision: 7, scale: 2 + t.decimal "to_segment", precision: 7, scale: 2 + t.string "segment_unit" + t.string "from_location_name" + t.string "to_location_name" + t.bigint "infrastructure_chain_type_id" + t.decimal "relative_location", precision: 10, scale: 5 + t.string "relative_location_unit" + t.string "relative_location_direction" + t.bigint "performance_restriction_type_id" + t.integer "num_infrastructure" + t.integer "book_value" + t.text "comments" + t.integer "organization_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "state", limit: 32 + t.string "document", limit: 128 + t.string "original_filename", limit: 128 + t.integer "created_by_id" + t.integer "total_cost" + t.integer "general_ledger_account_id" + t.index ["asset_event_type_id"], name: "asset_events_idx3" + t.index ["asset_id"], name: "asset_events_idx2" + t.index ["base_transam_asset_id"], name: "index_asset_events_on_base_transam_asset_id" + t.index ["created_by_id"], name: "asset_events_creator_idx" + t.index ["event_date"], name: "asset_events_idx4" + t.index ["infrastructure_chain_type_id"], name: "index_asset_events_on_infrastructure_chain_type_id" + t.index ["object_key"], name: "asset_events_idx1" + t.index ["performance_restriction_type_id"], name: "index_asset_events_on_performance_restriction_type_id" + t.index ["transam_asset_id"], name: "index_asset_events_on_transam_asset_id" + t.index ["upload_id"], name: "asset_events_idx5" + end + + create_table "asset_events_vehicle_usage_codes", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_event_id" + t.integer "vehicle_usage_code_id" + t.index ["asset_event_id", "vehicle_usage_code_id"], name: "asset_events_vehicle_usage_codes_idx1" end - add_index "activity_logs", ["organization_id", "activity_time"], name: "activity_logs_idx1", using: :btree - add_index "activity_logs", ["user_id", "activity_time"], name: "activity_logs_idx2", using: :btree - - create_table "archived_fiscal_years", id: false, force: :cascade do |t| - t.integer "organization_id", limit: 4 - t.integer "fy_year", limit: 4 - end - - add_index "archived_fiscal_years", ["organization_id"], name: "index_archived_fiscal_years_on_organization_id", using: :btree - - create_table "asset_event_asset_subsystems", force: :cascade do |t| - t.integer "asset_event_id", limit: 4 - t.integer "asset_subsystem_id", limit: 4 - t.integer "parts_cost", limit: 4 - t.integer "labor_cost", limit: 4 - end - - add_index "asset_event_asset_subsystems", ["asset_event_id"], name: "rehab_events_subsystems_idx1", using: :btree - add_index "asset_event_asset_subsystems", ["asset_subsystem_id"], name: "rehab_events_subsystems_idx2", using: :btree - - create_table "asset_event_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "job_name", limit: 64, null: false - t.string "display_icon_name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false - end - - add_index "asset_event_types", ["class_name"], name: "asset_event_types_idx1", using: :btree - - create_table "asset_events", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "asset_id", limit: 4, null: false - t.integer "asset_event_type_id", limit: 4, null: false - t.integer "upload_id", limit: 4 - t.date "event_date", null: false - t.decimal "assessed_rating", precision: 9, scale: 2 - t.integer "condition_type_id", limit: 4 - t.integer "current_mileage", limit: 4 - t.integer "parent_id", limit: 4 - t.integer "replacement_year", limit: 4 - t.integer "rebuild_year", limit: 4 - t.integer "disposition_year", limit: 4 - t.integer "extended_useful_life_miles", limit: 4 - t.integer "extended_useful_life_months", limit: 4 - t.integer "replacement_reason_type_id", limit: 4 - t.date "disposition_date" - t.integer "disposition_type_id", limit: 4 - t.integer "service_status_type_id", limit: 4 - t.integer "maintenance_type_id", limit: 4 - t.integer "pcnt_5311_routes", limit: 4 - t.integer "avg_daily_use_hours", limit: 4 - t.integer "avg_daily_use_miles", limit: 4 - t.integer "avg_daily_passenger_trips", limit: 4 - t.integer "maintenance_provider_type_id", limit: 4 - t.integer "vehicle_storage_method_type_id", limit: 4 - t.decimal "avg_cost_per_mile", precision: 9, scale: 2 - t.decimal "avg_miles_per_gallon", precision: 9, scale: 2 - t.integer "annual_maintenance_cost", limit: 4 - t.integer "annual_insurance_cost", limit: 4 - t.boolean "actual_costs" - t.integer "annual_affected_ridership", limit: 4 - t.integer "annual_dollars_generated", limit: 4 - t.integer "sales_proceeds", limit: 4 - t.integer "book_value", limit: 4 - t.text "comments", limit: 65535 - t.integer "organization_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "state", limit: 32 - t.string "document", limit: 128 - t.string "original_filename", limit: 128 - t.integer "created_by_id", limit: 4 - t.integer "total_cost", limit: 4 - t.integer "general_ledger_account_id", limit: 4 - end - - add_index "asset_events", ["asset_event_type_id"], name: "asset_events_idx3", using: :btree - add_index "asset_events", ["asset_id"], name: "asset_events_idx2", using: :btree - add_index "asset_events", ["created_by_id"], name: "asset_events_creator_idx", using: :btree - add_index "asset_events", ["event_date"], name: "asset_events_idx4", using: :btree - add_index "asset_events", ["object_key"], name: "asset_events_idx1", using: :btree - add_index "asset_events", ["upload_id"], name: "asset_events_idx5", using: :btree - - create_table "asset_events_vehicle_usage_codes", id: false, force: :cascade do |t| - t.integer "asset_event_id", limit: 4 - t.integer "vehicle_usage_code_id", limit: 4 - end - - add_index "asset_events_vehicle_usage_codes", ["asset_event_id", "vehicle_usage_code_id"], name: "asset_events_vehicle_usage_codes_idx1", using: :btree - create_table "asset_fleet_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "class_name" t.text "groups" t.text "custom_groups" + t.string "label_groups" t.boolean "active" end - create_table "asset_groups", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "code", limit: 8, null: false - t.string "description", limit: 254 - t.boolean "active" + create_table "asset_fleets", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key" + t.integer "organization_id" + t.integer "asset_fleet_type_id" + t.string "agency_fleet_id" + t.string "fleet_name" + t.integer "ntd_id" + t.integer "estimated_cost" + t.integer "year_estimated_cost" + t.text "notes" + t.integer "created_by_user_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["object_key"], name: "index_asset_fleets_on_object_key" + t.index ["organization_id"], name: "index_asset_fleets_on_organization_id" end - add_index "asset_groups", ["object_key"], name: "asset_groups_idx1", using: :btree - add_index "asset_groups", ["organization_id"], name: "asset_groups_idx2", using: :btree - - create_table "asset_groups_assets", id: false, force: :cascade do |t| - t.integer "asset_id", limit: 4, null: false - t.integer "asset_group_id", limit: 4, null: false + create_table "asset_groups", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.string "name", limit: 64, null: false + t.string "code", limit: 8, null: false + t.string "description", limit: 254 + t.boolean "active" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["object_key"], name: "asset_groups_idx1" + t.index ["organization_id"], name: "asset_groups_idx2" end - add_index "asset_groups_assets", ["asset_id", "asset_group_id"], name: "asset_groups_assets_idx1", using: :btree + create_table "asset_groups_assets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.bigint "transam_asset_id" + t.integer "asset_group_id", null: false + t.index ["asset_id", "asset_group_id"], name: "asset_groups_assets_idx1" + t.index ["transam_asset_id"], name: "index_asset_groups_assets_on_transam_asset_id" + end - create_table "asset_subsystems", force: :cascade do |t| - t.string "name", limit: 64 - t.string "code", limit: 2 - t.string "description", limit: 254 - t.integer "asset_type_id", limit: 4 + create_table "asset_subsystems", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64 + t.string "code", limit: 2 + t.string "description", limit: 254 + t.integer "asset_type_id" t.boolean "active" end - create_table "asset_subtypes", force: :cascade do |t| - t.integer "asset_type_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "image", limit: 254 - t.boolean "active", null: false + create_table "asset_subtypes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_type_id", null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "image", limit: 254 + t.boolean "active", null: false + t.index ["asset_type_id"], name: "asset_subtypes_idx1" end - add_index "asset_subtypes", ["asset_type_id"], name: "asset_subtypes_idx1", using: :btree - - create_table "asset_tags", force: :cascade do |t| - t.integer "asset_id", limit: 4 - t.integer "user_id", limit: 4 + create_table "asset_tags", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.integer "user_id" + t.index ["asset_id"], name: "asset_tags_idx1" + t.index ["user_id"], name: "asset_tags_idx2" end - add_index "asset_tags", ["asset_id"], name: "asset_tags_idx1", using: :btree - add_index "asset_tags", ["user_id"], name: "asset_tags_idx2", using: :btree - - create_table "asset_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "display_icon_name", limit: 64, null: false - t.string "map_icon_name", limit: 64, null: false - t.string "description", limit: 254, null: false + create_table "asset_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "display_icon_name", limit: 64, null: false + t.string "map_icon_name", limit: 64, null: false + t.string "description", limit: 254, null: false t.boolean "allow_parent" - t.boolean "active", null: false - end - - add_index "asset_types", ["class_name"], name: "asset_types_idx1", using: :btree - add_index "asset_types", ["name"], name: "asset_types_idx2", using: :btree - - create_table "asset_types_manufacturers", id: false, force: :cascade do |t| - t.integer "asset_type_id", limit: 4 - t.integer "manufacturer_id", limit: 4 - end - - add_index "asset_types_manufacturers", ["asset_type_id", "manufacturer_id"], name: "asset_types_manufacturers_idx1", using: :btree - - create_table "assets", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.integer "asset_type_id", limit: 4, null: false - t.integer "asset_subtype_id", limit: 4, null: false - t.string "asset_tag", limit: 32, null: false - t.string "external_id", limit: 32 - t.integer "parent_id", limit: 4 - t.integer "superseded_by_id", limit: 4 - t.integer "manufacturer_id", limit: 4 - t.string "other_manufacturer", limit: 255 - t.string "manufacturer_model", limit: 128 - t.integer "manufacture_year", limit: 4 - t.integer "pcnt_capital_responsibility", limit: 4 - t.integer "vendor_id", limit: 4 - t.integer "policy_replacement_year", limit: 4 - t.integer "policy_rehabilitation_year", limit: 4 - t.integer "estimated_replacement_year", limit: 4 - t.integer "estimated_replacement_cost", limit: 4 - t.integer "scheduled_replacement_year", limit: 4 - t.integer "scheduled_rehabilitation_year", limit: 4 - t.integer "scheduled_disposition_year", limit: 4 - t.integer "scheduled_replacement_cost", limit: 4 - t.text "early_replacement_reason", limit: 65535 - t.boolean "scheduled_replace_with_new" - t.integer "scheduled_rehabilitation_cost", limit: 4 - t.integer "replacement_reason_type_id", limit: 4 - t.boolean "in_backlog" - t.integer "reported_condition_type_id", limit: 4 - t.decimal "reported_condition_rating", precision: 10, scale: 1 - t.integer "reported_mileage", limit: 4 - t.date "reported_mileage_date" - t.date "reported_condition_date" - t.integer "estimated_condition_type_id", limit: 4 - t.decimal "estimated_condition_rating", precision: 9, scale: 2 - t.integer "service_status_type_id", limit: 4 - t.date "service_status_date" - t.date "last_maintenance_date" - t.boolean "depreciable" - t.date "depreciation_start_date" - t.integer "depreciation_useful_life", limit: 4 - t.integer "depreciation_purchase_cost", limit: 4 - t.date "current_depreciation_date" - t.integer "book_value", limit: 4 - t.integer "salvage_value", limit: 4 - t.date "disposition_date" - t.integer "disposition_type_id", limit: 4 - t.date "last_rehabilitation_date" - t.integer "maintenance_provider_type_id", limit: 4 - t.integer "vehicle_storage_method_type_id", limit: 4 - t.integer "vehicle_rebuild_type_id", limit: 4 - t.integer "location_reference_type_id", limit: 4 - t.string "location_reference", limit: 254 - t.text "location_comments", limit: 65535 - t.integer "fuel_type_id", limit: 4 - t.integer "vehicle_length", limit: 4 - t.integer "gross_vehicle_weight", limit: 4 - t.string "title_number", limit: 32 - t.integer "title_owner_organization_id", limit: 4 - t.string "serial_number", limit: 32 - t.boolean "purchased_new" - t.integer "purchase_cost", limit: 4 - t.date "purchase_date" - t.date "warranty_date" - t.date "in_service_date" - t.integer "expected_useful_life", limit: 4 - t.integer "expected_useful_miles", limit: 4 - t.integer "rebuild_year", limit: 4 - t.string "license_plate", limit: 32 - t.integer "seating_capacity", limit: 4 - t.integer "standing_capacity", limit: 4 - t.integer "wheelchair_capacity", limit: 4 - t.integer "fta_ownership_type_id", limit: 4 - t.string "other_fta_ownership_type", limit: 255 - t.integer "fta_vehicle_type_id", limit: 4 - t.integer "fta_support_vehicle_type_id", limit: 4 - t.integer "fta_funding_type_id", limit: 4 - t.integer "fta_bus_mode_type_id", limit: 4 - t.boolean "ada_accessible_lift" - t.boolean "ada_accessible_ramp" - t.boolean "fta_emergency_contingency_fleet" - t.boolean "dedicated" - t.string "description", limit: 128 - t.string "address1", limit: 128 - t.string "address2", limit: 128 - t.string "city", limit: 64 - t.string "state", limit: 2 - t.string "zip", limit: 10 - t.integer "facility_size", limit: 4 - t.boolean "section_of_larger_facility" - t.integer "pcnt_operational", limit: 4 - t.integer "num_floors", limit: 4 - t.integer "num_structures", limit: 4 - t.integer "num_elevators", limit: 4 - t.integer "num_escalators", limit: 4 - t.integer "num_parking_spaces_public", limit: 4 - t.integer "num_parking_spaces_private", limit: 4 - t.decimal "lot_size", precision: 9, scale: 2 - t.string "line_number", limit: 128 - t.integer "land_ownership_type_id", limit: 4 - t.integer "land_ownership_organization_id", limit: 4 - t.integer "building_ownership_type_id", limit: 4 - t.integer "building_ownership_organization_id", limit: 4 - t.integer "facility_capacity_type_id", limit: 4 - t.integer "fta_facility_type_id", limit: 4 - t.integer "fta_private_mode_type_id", limit: 4 - t.integer "leed_certification_type_id", limit: 4 - t.integer "quantity", limit: 4 - t.string "quantity_units", limit: 16 - t.integer "created_by_id", limit: 4 - t.integer "weight", limit: 4 - t.integer "updated_by_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "upload_id", limit: 4 - t.integer "location_id", limit: 4 - t.integer "dual_fuel_type_id", limit: 4 - t.string "other_fuel_type", limit: 255 - end - - add_index "assets", ["asset_subtype_id"], name: "assets_idx4", using: :btree - add_index "assets", ["asset_type_id"], name: "assets_idx3", using: :btree - add_index "assets", ["estimated_replacement_year"], name: "assets_idx8", using: :btree - add_index "assets", ["in_backlog"], name: "assets_idx7", using: :btree - add_index "assets", ["manufacture_year"], name: "assets_idx5", using: :btree - add_index "assets", ["object_key"], name: "assets_idx1", using: :btree - add_index "assets", ["organization_id", "asset_subtype_id", "in_backlog"], name: "assets_idx12", using: :btree - add_index "assets", ["organization_id", "asset_subtype_id", "policy_replacement_year"], name: "assets_idx10", using: :btree - add_index "assets", ["organization_id", "in_backlog"], name: "assets_idx11", using: :btree - add_index "assets", ["organization_id", "policy_replacement_year"], name: "assets_idx9", using: :btree - add_index "assets", ["organization_id"], name: "assets_idx2", using: :btree - add_index "assets", ["reported_condition_type_id"], name: "assets_idx6", using: :btree - add_index "assets", ["superseded_by_id"], name: "assets_idx13", using: :btree - - create_table "assets_districts", id: false, force: :cascade do |t| - t.integer "asset_id", limit: 4 - t.integer "district_id", limit: 4 - end - - add_index "assets_districts", ["asset_id", "district_id"], name: "assets_districts_idx1", using: :btree - - create_table "assets_expenditures", id: false, force: :cascade do |t| - t.integer "asset_id", limit: 4, null: false - t.integer "expenditure_id", limit: 4, null: false - end - - add_index "assets_expenditures", ["asset_id", "expenditure_id"], name: "assets_expenditures_idx1", using: :btree - - create_table "assets_facility_features", id: false, force: :cascade do |t| - t.integer "asset_id", limit: 4, null: false - t.integer "facility_feature_id", limit: 4, null: false - end - - add_index "assets_facility_features", ["asset_id", "facility_feature_id"], name: "assets_facility_features_idx1", using: :btree - - create_table "assets_fta_mode_types", force: :cascade do |t| - t.integer "asset_id", limit: 4 - t.integer "fta_mode_type_id", limit: 4 - t.boolean "is_primary" + t.boolean "active", null: false + t.index ["class_name"], name: "asset_types_idx1" + t.index ["name"], name: "asset_types_idx2" + end + + create_table "asset_types_manufacturers", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_type_id" + t.integer "manufacturer_id" + t.index ["asset_type_id", "manufacturer_id"], name: "asset_types_manufacturers_idx1" + end + + create_table "assets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.integer "asset_type_id", null: false + t.integer "asset_subtype_id", null: false + t.string "asset_tag", limit: 32, null: false + t.string "external_id", limit: 32 + t.integer "parent_id" + t.integer "superseded_by_id" + t.integer "manufacturer_id" + t.string "other_manufacturer" + t.string "manufacturer_model", limit: 128 + t.integer "manufacture_year" + t.integer "pcnt_capital_responsibility" + t.integer "vendor_id" + t.integer "policy_replacement_year" + t.integer "policy_rehabilitation_year" + t.integer "estimated_replacement_year" + t.integer "estimated_replacement_cost" + t.integer "scheduled_replacement_year" + t.integer "scheduled_rehabilitation_year" + t.integer "scheduled_disposition_year" + t.integer "scheduled_replacement_cost" + t.text "early_replacement_reason" + t.boolean "scheduled_replace_with_new" + t.integer "scheduled_rehabilitation_cost" + t.integer "replacement_reason_type_id" + t.boolean "in_backlog" + t.integer "reported_condition_type_id" + t.decimal "reported_condition_rating", precision: 10, scale: 1 + t.integer "reported_mileage" + t.date "reported_mileage_date" + t.date "reported_condition_date" + t.integer "estimated_condition_type_id" + t.decimal "estimated_condition_rating", precision: 9, scale: 2 + t.integer "service_status_type_id" + t.date "service_status_date" + t.date "last_maintenance_date" + t.boolean "depreciable" + t.date "depreciation_start_date" + t.integer "depreciation_useful_life" + t.integer "depreciation_purchase_cost" + t.date "current_depreciation_date" + t.integer "book_value" + t.integer "salvage_value" + t.date "disposition_date" + t.integer "disposition_type_id" + t.date "last_rehabilitation_date" + t.integer "maintenance_provider_type_id" + t.integer "vehicle_storage_method_type_id" + t.integer "vehicle_rebuild_type_id" + t.integer "location_reference_type_id" + t.string "location_reference", limit: 254 + t.text "location_comments" + t.integer "fuel_type_id" + t.integer "vehicle_length" + t.integer "gross_vehicle_weight" + t.string "title_number", limit: 32 + t.integer "title_owner_organization_id" + t.string "serial_number", limit: 32 + t.boolean "purchased_new" + t.integer "purchase_cost" + t.date "purchase_date" + t.date "warranty_date" + t.date "in_service_date" + t.integer "expected_useful_life" + t.integer "expected_useful_miles" + t.integer "rebuild_year" + t.string "license_plate", limit: 32 + t.integer "seating_capacity" + t.integer "standing_capacity" + t.integer "wheelchair_capacity" + t.integer "fta_ownership_type_id" + t.string "other_fta_ownership_type" + t.integer "fta_vehicle_type_id" + t.integer "fta_support_vehicle_type_id" + t.integer "fta_funding_type_id" + t.integer "fta_bus_mode_type_id" + t.boolean "ada_accessible_lift" + t.boolean "ada_accessible_ramp" + t.boolean "fta_emergency_contingency_fleet" + t.boolean "dedicated" + t.string "description", limit: 128 + t.string "address1", limit: 128 + t.string "address2", limit: 128 + t.string "city", limit: 64 + t.string "state", limit: 2 + t.string "zip", limit: 10 + t.integer "facility_size" + t.boolean "section_of_larger_facility" + t.integer "pcnt_operational" + t.integer "num_floors" + t.integer "num_structures" + t.integer "num_elevators" + t.integer "num_escalators" + t.integer "num_parking_spaces_public" + t.integer "num_parking_spaces_private" + t.decimal "lot_size", precision: 9, scale: 2 + t.string "line_number", limit: 128 + t.integer "land_ownership_type_id" + t.integer "land_ownership_organization_id" + t.integer "building_ownership_type_id" + t.integer "building_ownership_organization_id" + t.integer "facility_capacity_type_id" + t.integer "fta_facility_type_id" + t.integer "fta_private_mode_type_id" + t.integer "leed_certification_type_id" + t.integer "quantity" + t.string "quantity_units", limit: 16 + t.integer "created_by_id" + t.integer "weight" + t.integer "updated_by_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "upload_id" + t.integer "location_id" + t.integer "dual_fuel_type_id" + t.string "other_fuel_type" + t.index ["asset_subtype_id"], name: "assets_idx4" + t.index ["asset_type_id"], name: "assets_idx3" + t.index ["estimated_replacement_year"], name: "assets_idx8" + t.index ["in_backlog"], name: "assets_idx7" + t.index ["manufacture_year"], name: "assets_idx5" + t.index ["object_key"], name: "assets_idx1" + t.index ["organization_id", "asset_subtype_id", "in_backlog"], name: "assets_idx12" + t.index ["organization_id", "asset_subtype_id", "policy_replacement_year"], name: "assets_idx10" + t.index ["organization_id", "in_backlog"], name: "assets_idx11" + t.index ["organization_id", "policy_replacement_year"], name: "assets_idx9" + t.index ["organization_id"], name: "assets_idx2" + t.index ["reported_condition_type_id"], name: "assets_idx6" + t.index ["superseded_by_id"], name: "assets_idx13" + end + + create_table "assets_asset_fleets", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.bigint "transam_asset_id" + t.integer "asset_fleet_id" + t.boolean "active" + t.index ["asset_fleet_id"], name: "index_assets_asset_fleets_on_asset_fleet_id" + t.index ["asset_id"], name: "index_assets_asset_fleets_on_asset_id" + t.index ["transam_asset_id"], name: "index_assets_asset_fleets_on_transam_asset_id" end - add_index "assets_fta_mode_types", ["asset_id", "fta_mode_type_id"], name: "assets_fta_mode_types_idx1", using: :btree - - create_table "assets_fta_service_types", force: :cascade do |t| - t.integer "asset_id", limit: 4 - t.integer "fta_service_type_id", limit: 4 - t.boolean "is_primary" + create_table "assets_districts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.bigint "transam_asset_id" + t.integer "district_id" + t.index ["asset_id", "district_id"], name: "assets_districts_idx1" + t.index ["transam_asset_id"], name: "index_assets_districts_on_transam_asset_id" end - add_index "assets_fta_service_types", ["asset_id", "fta_service_type_id"], name: "assets_fta_service_types_idx1", using: :btree - - create_table "assets_vehicle_features", id: false, force: :cascade do |t| - t.integer "asset_id", limit: 4 - t.integer "vehicle_feature_id", limit: 4 + create_table "assets_expenditures", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id", null: false + t.bigint "transam_asset_id" + t.integer "expenditure_id", null: false + t.index ["asset_id", "expenditure_id"], name: "assets_expenditures_idx1" + t.index ["transam_asset_id"], name: "index_assets_expenditures_on_transam_asset_id" end - add_index "assets_vehicle_features", ["asset_id", "vehicle_feature_id"], name: "assets_vehicle_features_idx1", using: :btree + create_table "assets_facility_features", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.bigint "transam_asset_id" + t.integer "facility_feature_id", null: false + t.index ["asset_id", "facility_feature_id"], name: "assets_facility_features_idx1" + t.index ["transam_asset_id", "facility_feature_id"], name: "transam_assets_facility_features_idx1" + t.index ["transam_asset_id"], name: "index_assets_facility_features_on_transam_asset_id" + end - create_table "assets_vehicle_usage_codes", id: false, force: :cascade do |t| - t.integer "asset_id", limit: 4, null: false - t.integer "vehicle_usage_code_id", limit: 4, null: false + create_table "assets_fta_mode_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.string "transam_asset_type" + t.bigint "transam_asset_id" + t.integer "fta_mode_type_id" + t.boolean "is_primary" + t.index ["asset_id", "fta_mode_type_id"], name: "assets_fta_mode_types_idx1" + t.index ["transam_asset_id"], name: "index_assets_fta_mode_types_on_transam_asset_id" end - add_index "assets_vehicle_usage_codes", ["asset_id", "vehicle_usage_code_id"], name: "assets_vehicle_usage_codes_idx1", using: :btree + create_table "assets_fta_service_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.string "transam_asset_type" + t.bigint "transam_asset_id" + t.integer "fta_service_type_id" + t.boolean "is_primary" + t.index ["asset_id", "fta_service_type_id"], name: "assets_fta_service_types_idx1" + t.index ["transam_asset_id"], name: "index_assets_fta_service_types_on_transam_asset_id" + end - create_table "chart_of_accounts", force: :cascade do |t| - t.string "object_key", limit: 12 - t.integer "organization_id", limit: 4 - t.boolean "active" - t.datetime "created_at" - t.datetime "updated_at" + create_table "assets_vehicle_features", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.bigint "transam_asset_id" + t.integer "vehicle_feature_id" + t.index ["asset_id", "vehicle_feature_id"], name: "assets_vehicle_features_idx1" + t.index ["transam_asset_id"], name: "index_assets_vehicle_features_on_transam_asset_id" end - add_index "chart_of_accounts", ["organization_id"], name: "chart_of_accounts_idx1", using: :btree + create_table "assets_vehicle_usage_codes", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id", null: false + t.integer "vehicle_usage_code_id", null: false + t.index ["asset_id", "vehicle_usage_code_id"], name: "assets_vehicle_usage_codes_idx1" + end - create_table "comments", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "commentable_id", limit: 4, null: false - t.string "commentable_type", limit: 64, null: false - t.string "comment", limit: 254, null: false - t.integer "created_by_id", limit: 4, null: false + create_table "chart_of_accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12 + t.integer "organization_id" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" + t.index ["organization_id"], name: "chart_of_accounts_idx1" end - add_index "comments", ["commentable_id", "commentable_type"], name: "comments_idx1", using: :btree - - create_table "condition_estimation_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false - end - - add_index "condition_estimation_types", ["class_name"], name: "condition_estimation_types_idx1", using: :btree - - create_table "condition_rollup_calculation_types", force: :cascade do |t| - t.string "name", limit: 255 - t.string "class_name", limit: 255 - t.string "description", limit: 255 + create_table "chasses", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" t.boolean "active" end - create_table "condition_type_percents", force: :cascade do |t| - t.integer "asset_event_id", limit: 4 - t.integer "condition_type_id", limit: 4 - t.integer "pcnt", limit: 4 + create_table "comments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "commentable_id", null: false + t.string "commentable_type", limit: 64, null: false + t.string "comment", limit: 254, null: false + t.integer "created_by_id", null: false t.datetime "created_at" t.datetime "updated_at" + t.index ["commentable_id", "commentable_type"], name: "comments_idx1" end - add_index "condition_type_percents", ["asset_event_id"], name: "index_condition_type_percents_on_asset_event_id", using: :btree - add_index "condition_type_percents", ["condition_type_id"], name: "index_condition_type_percents_on_condition_type_id", using: :btree - - create_table "condition_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.decimal "rating", precision: 9, scale: 2, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "component_element_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.bigint "component_type_id" + t.boolean "active" + t.index ["component_type_id"], name: "index_component_element_types_on_component_type_id" end - create_table "cost_calculation_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "component_materials", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.bigint "component_type_id" + t.bigint "component_element_type_id" + t.boolean "active" + t.index ["component_element_type_id"], name: "index_component_materials_on_component_element_type_id" + t.index ["component_type_id"], name: "index_component_materials_on_component_type_id" end - add_index "cost_calculation_types", ["class_name"], name: "cost_calculation_types_idx1", using: :btree - - create_table "customers", force: :cascade do |t| - t.integer "license_type_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.boolean "active", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "component_subtypes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "parent_type" + t.bigint "parent_id" + t.string "name" + t.boolean "active" + t.index ["parent_type", "parent_id"], name: "index_component_subtypes_on_parent_type_and_parent_id" end - create_table "delayed_job_priorities", force: :cascade do |t| - t.string "class_name", limit: 255, null: false - t.integer "priority", limit: 4, null: false - t.datetime "created_at" - t.datetime "updated_at" + create_table "component_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "fta_asset_category_id" + t.bigint "fta_asset_class_id" + t.string "name" + t.string "class_name" + t.boolean "active" + t.index ["fta_asset_category_id"], name: "index_component_types_on_fta_asset_category_id" + t.index ["fta_asset_class_id"], name: "index_component_types_on_fta_asset_class_id" end - create_table "delayed_jobs", force: :cascade do |t| - t.integer "priority", limit: 4 - t.integer "attempts", limit: 4 - t.text "handler", limit: 65535 - t.text "last_error", limit: 65535 - t.datetime "run_at" - t.datetime "locked_at" - t.datetime "failed_at" - t.string "locked_by", limit: 255 - t.string "queue", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "condition_estimation_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["class_name"], name: "condition_estimation_types_idx1" end - add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree - - create_table "depreciation_calculation_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "condition_rollup_calculation_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "class_name" + t.string "description" + t.boolean "active" end - create_table "depreciation_entries", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "asset_id", limit: 4 - t.date "event_date" - t.string "description", limit: 255 - t.integer "book_value", limit: 4 + create_table "condition_type_percents", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_event_id" + t.integer "condition_type_id" + t.integer "pcnt" t.datetime "created_at" t.datetime "updated_at" + t.index ["asset_event_id"], name: "index_condition_type_percents_on_asset_event_id" + t.index ["condition_type_id"], name: "index_condition_type_percents_on_condition_type_id" end - add_index "depreciation_entries", ["asset_id"], name: "index_depreciation_entries_on_asset_id", using: :btree - - create_table "depreciation_entries_general_ledger_account_entries", force: :cascade do |t| - t.integer "depreciation_entry_id", limit: 4 - t.integer "general_ledger_account_entry_id", limit: 4 + create_table "condition_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.decimal "rating", precision: 9, scale: 2, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - add_index "depreciation_entries_general_ledger_account_entries", ["depreciation_entry_id"], name: "depr_entry_idx", using: :btree - add_index "depreciation_entries_general_ledger_account_entries", ["general_ledger_account_entry_id"], name: "gl_entry_idx", using: :btree - - create_table "depreciation_interval_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.integer "months", limit: 4, null: false - t.boolean "active", null: false - end - - create_table "disposition_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 2, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "contract_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - create_table "district_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "cost_calculation_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["class_name"], name: "cost_calculation_types_idx1" end - create_table "districts", force: :cascade do |t| - t.integer "district_type_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "code", limit: 6, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "customers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "license_type_id", null: false + t.string "name", limit: 64, null: false + t.boolean "active", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - add_index "districts", ["district_type_id"], name: "districts_idx1", using: :btree - add_index "districts", ["name"], name: "districts_idx2", using: :btree - - create_table "documents", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "documentable_id", limit: 4, null: false - t.string "documentable_type", limit: 64, null: false - t.string "document", limit: 128, null: false - t.string "description", limit: 254, null: false - t.string "original_filename", limit: 128, null: false - t.string "content_type", limit: 128, null: false - t.integer "file_size", limit: 4, null: false - t.integer "created_by_id", limit: 4 + create_table "delayed_job_priorities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "class_name", null: false + t.integer "priority", null: false t.datetime "created_at" t.datetime "updated_at" end - add_index "documents", ["documentable_id", "documentable_type"], name: "documents_idx2", using: :btree - add_index "documents", ["object_key"], name: "documents_idx1", using: :btree - - create_table "dual_fuel_types", force: :cascade do |t| - t.integer "primary_fuel_type_id", limit: 4 - t.integer "secondary_fuel_type_id", limit: 4 - t.boolean "active" - end - - add_index "dual_fuel_types", ["primary_fuel_type_id"], name: "index_dual_fuel_types_on_primary_fuel_type_id", using: :btree - add_index "dual_fuel_types", ["secondary_fuel_type_id"], name: "index_dual_fuel_types_on_secondary_fuel_type_id", using: :btree - - create_table "expenditures", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "general_ledger_account_id", limit: 4 - t.integer "grant_id", limit: 4 - t.integer "expense_type_id", limit: 4, null: false - t.string "external_id", limit: 32 - t.date "expense_date", null: false - t.string "description", limit: 254 - t.integer "amount", limit: 4, null: false - t.integer "extended_useful_life_months", limit: 4 - t.string "vendor", limit: 255 - t.integer "pcnt_from_grant", limit: 4 + create_table "delayed_jobs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "priority" + t.integer "attempts" + t.text "handler" + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.string "queue" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["priority", "run_at"], name: "delayed_jobs_priority" + end + + create_table "depreciation_calculation_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "depreciation_entries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.bigint "asset_id" + t.bigint "transam_asset_id" + t.date "event_date" + t.string "description" + t.integer "book_value" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["asset_id"], name: "index_depreciation_entries_on_asset_id" + t.index ["transam_asset_id"], name: "index_depreciation_entries_on_transam_asset_id" + end + + create_table "depreciation_entries_general_ledger_account_entries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "depreciation_entry_id" + t.integer "general_ledger_account_entry_id" + t.index ["depreciation_entry_id"], name: "depr_entry_idx" + t.index ["general_ledger_account_entry_id"], name: "gl_entry_idx" + end + + create_table "depreciation_interval_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.integer "months", null: false + t.boolean "active", null: false + end + + create_table "disposition_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 2, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "district_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "districts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "district_type_id", null: false + t.string "name", limit: 64, null: false + t.string "code" + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["district_type_id"], name: "districts_idx1" + t.index ["name"], name: "districts_idx2" + end + + create_table "documents", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "documentable_id", null: false + t.string "documentable_type", limit: 64, null: false + t.string "document", limit: 128, null: false + t.string "description", limit: 254, null: false + t.string "original_filename", limit: 128, null: false + t.string "content_type", limit: 128, null: false + t.integer "file_size", null: false + t.integer "created_by_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["documentable_id", "documentable_type"], name: "documents_idx2" + t.index ["object_key"], name: "documents_idx1" end - add_index "expenditures", ["expense_type_id"], name: "expenditures_idx4", using: :btree - add_index "expenditures", ["general_ledger_account_id"], name: "expenditures_idx3", using: :btree - add_index "expenditures", ["object_key"], name: "expenditures_idx1", using: :btree - - create_table "expense_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "dual_fuel_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "primary_fuel_type_id" + t.integer "secondary_fuel_type_id" + t.boolean "active" + t.index ["primary_fuel_type_id"], name: "index_dual_fuel_types_on_primary_fuel_type_id" + t.index ["secondary_fuel_type_id"], name: "index_dual_fuel_types_on_secondary_fuel_type_id" end - add_index "expense_types", ["name"], name: "expense_types_idx2", using: :btree - - create_table "facility_capacity_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "esl_categories", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "class_name" + t.boolean "active" end - create_table "facility_features", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 4, null: false - t.string "description", limit: 254, null: false + create_table "expenditures", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "general_ledger_account_id" + t.integer "grant_id" + t.integer "expense_type_id", null: false + t.string "external_id", limit: 32 + t.date "expense_date", null: false + t.string "description", limit: 254 + t.integer "amount", null: false + t.integer "extended_useful_life_months" + t.string "vendor" + t.integer "pcnt_from_grant" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["expense_type_id"], name: "expenditures_idx4" + t.index ["general_ledger_account_id"], name: "expenditures_idx3" + t.index ["object_key"], name: "expenditures_idx1" + end + + create_table "expense_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["name"], name: "expense_types_idx2" + end + + create_table "facilities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "facility_name" + t.string "ntd_id" + t.string "address1" + t.string "address2" + t.string "city" + t.string "state" + t.string "zip" + t.string "county" + t.string "country" + t.bigint "esl_category_id" + t.bigint "facility_capacity_type_id" + t.integer "facility_size" + t.string "facility_size_unit" + t.boolean "section_of_larger_facility" + t.integer "num_structures" + t.integer "num_floors" + t.integer "num_elevators" + t.integer "num_escalators" + t.integer "num_parking_spaces_public" + t.integer "num_parking_spaces_private" + t.integer "lot_size" + t.string "lot_size_unit" + t.bigint "leed_certification_type_id" + t.boolean "ada_accessible" + t.bigint "fta_private_mode_type_id" + t.bigint "land_ownership_organization_id" + t.string "other_land_ownership_organization" + t.bigint "facility_ownership_organization_id" + t.string "other_facility_ownership_organization" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["esl_category_id"], name: "index_facilities_on_esl_category_id" + t.index ["facility_capacity_type_id"], name: "index_facilities_on_facility_capacity_type_id" + t.index ["facility_ownership_organization_id"], name: "index_facilities_on_facility_ownership_organization_id" + t.index ["fta_private_mode_type_id"], name: "index_facilities_on_fta_private_mode_type_id" + t.index ["land_ownership_organization_id"], name: "index_facilities_on_land_ownership_organization_id" + t.index ["leed_certification_type_id"], name: "index_facilities_on_leed_certification_type_id" + end + + create_table "facility_capacity_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "facility_features", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 4, null: false + t.string "description", limit: 254, null: false t.boolean "active" end - create_table "file_content_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "builder_name", limit: 255 - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "file_content_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "builder_name" + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["class_name"], name: "file_content_types_idx2" + t.index ["name"], name: "file_content_types_idx1" end - add_index "file_content_types", ["class_name"], name: "file_content_types_idx2", using: :btree - add_index "file_content_types", ["name"], name: "file_content_types_idx1", using: :btree - - create_table "file_status_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "file_status_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["name"], name: "file_status_types_idx1" end - add_index "file_status_types", ["name"], name: "file_status_types_idx1", using: :btree - - create_table "forms", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "roles", limit: 128, null: false - t.string "controller", limit: 64, null: false - t.boolean "active", null: false + create_table "forms", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "roles", limit: 128, null: false + t.string "controller", limit: 64, null: false + t.integer "sort_order" + t.boolean "active", null: false t.datetime "created_at" t.datetime "updated_at" + t.index ["object_key"], name: "forms_idx1" end - add_index "forms", ["object_key"], name: "forms_idx1", using: :btree + create_table "frequency_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 32, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end - create_table "frequency_types", force: :cascade do |t| - t.string "name", limit: 32, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "fta_agency_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 256, null: false + t.boolean "active", null: false end - create_table "fta_agency_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 256, null: false - t.boolean "active", null: false + create_table "fta_asset_categories", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "display_icon_name" + t.boolean "active" end - create_table "fta_asset_categories", force: :cascade do |t| - t.string "name", limit: 255 + create_table "fta_asset_classes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "fta_asset_category_id" + t.string "name" + t.string "class_name" + t.string "display_icon_name" t.boolean "active" + t.index ["fta_asset_category_id"], name: "index_fta_asset_classes_on_fta_asset_category_id" end - create_table "fta_bus_mode_types", force: :cascade do |t| - t.string "code", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "fta_bus_mode_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "code", limit: 4, null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "fta_facility_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "class_name", limit: 255 - t.boolean "active", null: false + create_table "fta_equipment_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "fta_asset_class_id" + t.string "name" + t.boolean "active" + t.index ["fta_asset_class_id"], name: "index_fta_equipment_types_on_fta_asset_class_id" end - create_table "fta_funding_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 6, null: false - t.string "description", limit: 256, null: false - t.boolean "active", null: false + create_table "fta_facility_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "fta_asset_class_id" + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "class_name" + t.boolean "active", null: false end - create_table "fta_mode_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 2, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "fta_funding_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 6, null: false + t.string "description", limit: 256, null: false + t.boolean "active", null: false end - create_table "fta_mode_types_organizations", id: false, force: :cascade do |t| - t.integer "organization_id", limit: 4, null: false - t.integer "fta_mode_type_id", limit: 4, null: false + create_table "fta_guideway_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - add_index "fta_mode_types_organizations", ["organization_id", "fta_mode_type_id"], name: "fta_mode_types_organizations_idx1", using: :btree + create_table "fta_mode_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 2, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end - create_table "fta_ownership_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 4, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "fta_mode_types_organizations", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id", null: false + t.integer "fta_mode_type_id", null: false + t.index ["organization_id", "fta_mode_type_id"], name: "fta_mode_types_organizations_idx1" end - create_table "fta_private_mode_types", force: :cascade do |t| - t.string "name", limit: 255, null: false - t.string "description", limit: 255, null: false - t.boolean "active", null: false + create_table "fta_ownership_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 4, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "fta_service_area_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "fta_power_signal_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - create_table "fta_service_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 2, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "fta_private_mode_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", null: false + t.string "description", null: false + t.boolean "active", null: false end - create_table "fta_support_vehicle_types", force: :cascade do |t| - t.string "name", limit: 255, null: false - t.string "description", limit: 255, null: false - t.integer "default_useful_life_benchmark", limit: 4 - t.string "useful_life_benchmark_unit", limit: 255 - t.boolean "active", null: false + create_table "fta_service_area_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "fta_vehicle_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 2, null: false - t.string "description", limit: 254, null: false - t.integer "default_useful_life_benchmark", limit: 4 - t.string "useful_life_benchmark_unit", limit: 255 - t.boolean "active", null: false + create_table "fta_service_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 2, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "fuel_types", force: :cascade do |t| - t.string "name", limit: 255, null: false - t.string "code", limit: 255, null: false - t.string "description", limit: 255, null: false - t.boolean "active", null: false + create_table "fta_support_vehicle_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "fta_asset_class_id" + t.string "name", null: false + t.string "description", null: false + t.integer "default_useful_life_benchmark" + t.string "useful_life_benchmark_unit" + t.boolean "active", null: false end - create_table "funding_bucket_types", force: :cascade do |t| - t.string "name", limit: 255, null: false - t.string "description", limit: 255, null: false - t.boolean "active", null: false + create_table "fta_track_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - create_table "funding_buckets", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "funding_template_id", limit: 4, null: false - t.integer "fiscal_year", limit: 4, null: false - t.string "name", limit: 255, null: false - t.decimal "budget_amount", precision: 15, scale: 2, null: false - t.decimal "budget_committed", precision: 15, scale: 2, null: false - t.integer "owner_id", limit: 4 - t.string "description", limit: 255 - t.boolean "active", null: false - t.integer "created_by_id", limit: 4, null: false + create_table "fta_vehicle_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "fta_asset_class_id" + t.string "name", limit: 64, null: false + t.string "code", limit: 2, null: false + t.string "description", limit: 254, null: false + t.integer "default_useful_life_benchmark" + t.string "useful_life_benchmark_unit" + t.boolean "active", null: false + end + + create_table "fuel_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", null: false + t.string "code", null: false + t.string "description", null: false + t.boolean "active", null: false + end + + create_table "funding_bucket_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", null: false + t.string "description", null: false + t.boolean "active", null: false + end + + create_table "funding_buckets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "funding_template_id", null: false + t.integer "fiscal_year", null: false + t.string "name", null: false + t.decimal "budget_amount", precision: 15, scale: 2, null: false + t.decimal "budget_committed", precision: 15, scale: 2, null: false + t.integer "owner_id" + t.string "description" + t.boolean "active", null: false + t.integer "created_by_id", null: false t.datetime "created_on" - t.integer "updated_by_id", limit: 4, null: false + t.integer "updated_by_id", null: false t.datetime "updated_on" end - create_table "funding_source_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false - end - - create_table "funding_sources", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 256, null: false - t.text "details", limit: 65535 - t.integer "funding_source_type_id", limit: 4, null: false - t.string "external_id", limit: 32 - t.boolean "formula_fund" - t.boolean "discretionary_fund" - t.float "match_required", limit: 24 - t.integer "fy_start", limit: 4 - t.integer "fy_end", limit: 4 - t.integer "created_by_id", limit: 4 - t.integer "updated_by_id", limit: 4 - t.boolean "active" + create_table "funding_source_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "funding_sources", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 256, null: false + t.text "details" + t.integer "funding_source_type_id", null: false + t.string "external_id", limit: 32 + t.boolean "formula_fund" + t.boolean "discretionary_fund" + t.float "match_required" + t.integer "fy_start" + t.integer "fy_end" + t.integer "created_by_id" + t.integer "updated_by_id" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" - t.float "inflation_rate", limit: 24 - t.integer "life_in_years", limit: 4 - end - - add_index "funding_sources", ["object_key"], name: "funding_sources_idx1", using: :btree - - create_table "funding_template_types", force: :cascade do |t| - t.integer "funding_source_id", limit: 4 - t.string "name", limit: 64, null: false - t.string "description", limit: 256, null: false - t.boolean "active", null: false - end - - add_index "funding_template_types", ["funding_source_id"], name: "index_funding_template_types_on_funding_source_id", using: :btree - - create_table "funding_templates", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "funding_source_id", limit: 4 - t.string "name", limit: 64, null: false - t.text "description", limit: 65535 - t.integer "contributor_id", limit: 4, null: false - t.integer "owner_id", limit: 4, null: false - t.boolean "recurring" - t.boolean "transfer_only" - t.boolean "create_multiple_agencies", null: false - t.boolean "create_multiple_buckets_for_agency_year", null: false - t.float "match_required", limit: 24 - t.text "query_string", limit: 65535 - t.boolean "active", null: false + t.float "inflation_rate" + t.integer "life_in_years" + t.index ["object_key"], name: "funding_sources_idx1" + end + + create_table "funding_template_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "funding_source_id" + t.string "name", limit: 64, null: false + t.string "description", limit: 256, null: false + t.boolean "active", null: false + t.index ["funding_source_id"], name: "index_funding_template_types_on_funding_source_id" + end + + create_table "funding_templates", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "funding_source_id" + t.string "name", limit: 64, null: false + t.text "description" + t.integer "contributor_id", null: false + t.integer "owner_id", null: false + t.boolean "recurring" + t.boolean "transfer_only" + t.boolean "create_multiple_agencies", null: false + t.boolean "create_multiple_buckets_for_agency_year", null: false + t.float "match_required" + t.text "query_string" + t.boolean "active", null: false t.datetime "created_at" t.datetime "updated_at" - t.string "external_id", limit: 32 + t.string "external_id", limit: 32 + t.index ["contributor_id"], name: "index_funding_templates_on_contributor_id" + t.index ["funding_source_id"], name: "index_funding_templates_on_funding_source_id" + t.index ["owner_id"], name: "index_funding_templates_on_owner_id" end - add_index "funding_templates", ["contributor_id"], name: "index_funding_templates_on_contributor_id", using: :btree - add_index "funding_templates", ["funding_source_id"], name: "index_funding_templates_on_funding_source_id", using: :btree - add_index "funding_templates", ["owner_id"], name: "index_funding_templates_on_owner_id", using: :btree - - create_table "funding_templates_funding_template_types", id: false, force: :cascade do |t| - t.integer "funding_template_id", limit: 4 - t.integer "funding_template_type_id", limit: 4 + create_table "funding_templates_funding_template_types", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "funding_template_id" + t.integer "funding_template_type_id" + t.index ["funding_template_id"], name: "funding_templates_funding_template_types_idx1" + t.index ["funding_template_type_id"], name: "funding_templates_funding_template_types_idx2" end - add_index "funding_templates_funding_template_types", ["funding_template_id"], name: "funding_templates_funding_template_types_idx1", using: :btree - add_index "funding_templates_funding_template_types", ["funding_template_type_id"], name: "funding_templates_funding_template_types_idx2", using: :btree - - create_table "funding_templates_organizations", id: false, force: :cascade do |t| - t.integer "funding_template_id", limit: 4 - t.integer "organization_id", limit: 4 + create_table "funding_templates_organizations", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "funding_template_id" + t.integer "organization_id" + t.index ["funding_template_id"], name: "index_funding_templates_organizations_on_funding_template_id" + t.index ["organization_id"], name: "index_funding_templates_organizations_on_organization_id" end - add_index "funding_templates_organizations", ["funding_template_id"], name: "index_funding_templates_organizations_on_funding_template_id", using: :btree - add_index "funding_templates_organizations", ["organization_id"], name: "index_funding_templates_organizations_on_organization_id", using: :btree - - create_table "general_ledger_account_entries", force: :cascade do |t| - t.string "object_key", limit: 12 - t.integer "general_ledger_account_id", limit: 4 - t.date "event_date" - t.string "description", limit: 255 - t.decimal "amount", precision: 10 + create_table "general_ledger_account_entries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12 + t.integer "general_ledger_account_id" + t.date "event_date" + t.string "description" + t.decimal "amount", precision: 10 t.datetime "created_at" t.datetime "updated_at" - t.integer "asset_id", limit: 4 + t.integer "asset_id" + t.bigint "transam_asset_id" + t.index ["asset_id"], name: "index_general_ledger_account_entries_on_asset_id" + t.index ["general_ledger_account_id"], name: "general_ledger_account_entry_general_ledger_account_idx" + t.index ["transam_asset_id"], name: "index_general_ledger_account_entries_on_transam_asset_id" end - add_index "general_ledger_account_entries", ["asset_id"], name: "index_general_ledger_account_entries_on_asset_id", using: :btree - add_index "general_ledger_account_entries", ["general_ledger_account_id"], name: "general_ledger_account_entry_general_ledger_account_idx", using: :btree - - create_table "general_ledger_account_subtypes", force: :cascade do |t| - t.integer "general_ledger_account_type_id", limit: 4 - t.string "name", limit: 255 - t.string "description", limit: 255 - t.boolean "active" + create_table "general_ledger_account_subtypes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "general_ledger_account_type_id" + t.string "name" + t.string "description" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" end - create_table "general_ledger_account_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "general_ledger_account_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "general_ledger_accounts", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "chart_of_account_id", limit: 4, null: false - t.integer "general_ledger_account_type_id", limit: 4, null: false - t.integer "general_ledger_account_subtype_id", limit: 4 - t.string "account_number", limit: 255, null: false - t.string "name", limit: 255, null: false - t.boolean "active", null: false + create_table "general_ledger_accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "chart_of_account_id", null: false + t.integer "general_ledger_account_type_id", null: false + t.integer "general_ledger_account_subtype_id" + t.string "account_number", null: false + t.string "name", null: false + t.boolean "active", null: false t.datetime "created_at" t.datetime "updated_at" - t.integer "grant_id", limit: 4 + t.integer "grant_id" + t.index ["active"], name: "general_ledger_accounts_idx3" + t.index ["chart_of_account_id"], name: "general_ledger_accounts_idx2" + t.index ["object_key"], name: "general_ledger_accounts_idx1" + end + + create_table "general_ledger_mappings", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.bigint "chart_of_account_id" + t.bigint "asset_subtype_id" + t.bigint "asset_account_id" + t.bigint "depr_expense_account_id" + t.bigint "accumulated_depr_account_id" + t.bigint "gain_loss_account_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["accumulated_depr_account_id"], name: "index_general_ledger_mappings_on_accumulated_depr_account_id" + t.index ["asset_account_id"], name: "index_general_ledger_mappings_on_asset_account_id" + t.index ["asset_subtype_id"], name: "index_general_ledger_mappings_on_asset_subtype_id" + t.index ["chart_of_account_id"], name: "index_general_ledger_mappings_on_chart_of_account_id" + t.index ["depr_expense_account_id"], name: "index_general_ledger_mappings_on_depr_expense_account_id" + t.index ["gain_loss_account_id"], name: "index_general_ledger_mappings_on_gain_loss_account_id" + end + + create_table "governing_body_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "grant_amendments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.bigint "grant_id" + t.string "amendment_num" + t.string "grant_num" + t.text "comments" + t.integer "created_by_user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["grant_id"], name: "index_grant_amendments_on_grant_id" + end + + create_table "grant_apportionments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.bigint "grant_id" + t.string "sourceable_type" + t.bigint "sourceable_id" + t.string "name" + t.integer "fy_year" + t.integer "amount" + t.integer "created_by_user_id" + t.integer "updated_by_user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["grant_id"], name: "index_grant_apportionments_on_grant_id" + t.index ["sourceable_type", "sourceable_id"], name: "index_grant_apportionments_on_sourceable_type_and_sourceable_id" + end + + create_table "grant_budgets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "general_ledger_account_id", null: false + t.integer "grant_id", null: false + t.integer "amount", null: false + t.boolean "active" + t.index ["general_ledger_account_id", "grant_id"], name: "grant_budgets_idx1" end - add_index "general_ledger_accounts", ["active"], name: "general_ledger_accounts_idx3", using: :btree - add_index "general_ledger_accounts", ["chart_of_account_id"], name: "general_ledger_accounts_idx2", using: :btree - add_index "general_ledger_accounts", ["object_key"], name: "general_ledger_accounts_idx1", using: :btree - - create_table "general_ledger_mappings", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "chart_of_account_id", limit: 4 - t.integer "asset_subtype_id", limit: 4 - t.integer "asset_account_id", limit: 4 - t.integer "depr_expense_account_id", limit: 4 - t.integer "accumulated_depr_account_id", limit: 4 - t.integer "gain_loss_account_id", limit: 4 + create_table "grant_purchases", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "asset_id" + t.bigint "transam_asset_id" + t.integer "pcnt_purchase_cost", null: false + t.string "expense_tag" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "sourceable_id" + t.string "sourceable_type" + t.string "other_sourceable" + t.index ["asset_id"], name: "grant_purchases_idx1" + t.index ["transam_asset_id"], name: "index_grant_purchases_on_transam_asset_id" + end + + create_table "grants", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "owner_id", null: false + t.bigint "contributor_id" + t.boolean "has_multiple_contributors" + t.string "other_contributor" + t.integer "fy_year", null: false + t.date "award_date" + t.integer "amount", null: false + t.string "legislative_authorization" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "sourceable_id" + t.string "sourceable_type" + t.boolean "over_allocation_allowed" + t.string "state" + t.integer "created_by_user_id" + t.integer "updated_by_user_id" + t.boolean "active" + t.string "grant_num" + t.index ["contributor_id"], name: "index_grants_on_contributor_id" + t.index ["fy_year"], name: "grants_idx3" + t.index ["object_key"], name: "grants_idx1" + t.index ["owner_id"], name: "grants_idx2" + end + + create_table "images", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.bigint "base_imagable_id" + t.string "base_imagable_type" + t.integer "imagable_id", null: false + t.string "imagable_type", limit: 64, null: false + t.string "image", limit: 128, null: false + t.string "classification" + t.string "name" + t.string "description", limit: 254, null: false + t.boolean "exportable" + t.string "original_filename", limit: 128, null: false + t.string "content_type", limit: 128, null: false + t.integer "file_size", null: false + t.integer "created_by_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["base_imagable_type", "base_imagable_id"], name: "index_images_on_base_imagable_type_and_base_imagable_id" + t.index ["imagable_id", "imagable_type"], name: "images_idx2" + t.index ["object_key"], name: "images_idx1" end - add_index "general_ledger_mappings", ["accumulated_depr_account_id"], name: "index_general_ledger_mappings_on_accumulated_depr_account_id", using: :btree - add_index "general_ledger_mappings", ["asset_account_id"], name: "index_general_ledger_mappings_on_asset_account_id", using: :btree - add_index "general_ledger_mappings", ["asset_subtype_id"], name: "index_general_ledger_mappings_on_asset_subtype_id", using: :btree - add_index "general_ledger_mappings", ["chart_of_account_id"], name: "index_general_ledger_mappings_on_chart_of_account_id", using: :btree - add_index "general_ledger_mappings", ["depr_expense_account_id"], name: "index_general_ledger_mappings_on_depr_expense_account_id", using: :btree - add_index "general_ledger_mappings", ["gain_loss_account_id"], name: "index_general_ledger_mappings_on_gain_loss_account_id", using: :btree - - create_table "governing_body_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "infrastructure_bridge_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - create_table "grant_budgets", force: :cascade do |t| - t.integer "general_ledger_account_id", limit: 4, null: false - t.integer "grant_id", limit: 4, null: false - t.integer "amount", limit: 4, null: false + create_table "infrastructure_cap_materials", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" t.boolean "active" end - add_index "grant_budgets", ["general_ledger_account_id", "grant_id"], name: "grant_budgets_idx1", using: :btree - - create_table "grant_purchases", force: :cascade do |t| - t.integer "asset_id", limit: 4, null: false - t.integer "pcnt_purchase_cost", limit: 4, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "sourceable_id", limit: 4 - t.string "sourceable_type", limit: 255 + create_table "infrastructure_chain_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - add_index "grant_purchases", ["asset_id"], name: "grant_purchases_idx1", using: :btree + create_table "infrastructure_control_system_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" + end - create_table "grants", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.integer "fy_year", limit: 4, null: false - t.integer "amount", limit: 4, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "sourceable_id", limit: 4 - t.string "sourceable_type", limit: 255 - t.boolean "active" - t.string "name", limit: 255 - end - - add_index "grants", ["fy_year"], name: "grants_idx3", using: :btree - add_index "grants", ["object_key"], name: "grants_idx1", using: :btree - add_index "grants", ["organization_id"], name: "grants_idx2", using: :btree - - create_table "images", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "imagable_id", limit: 4, null: false - t.string "imagable_type", limit: 64, null: false - t.string "image", limit: 128, null: false - t.string "description", limit: 254, null: false - t.string "original_filename", limit: 128, null: false - t.string "content_type", limit: 128, null: false - t.integer "file_size", limit: 4, null: false - t.integer "created_by_id", limit: 4 - t.datetime "created_at" - t.datetime "updated_at" + create_table "infrastructure_crossings", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - add_index "images", ["imagable_id", "imagable_type"], name: "images_idx2", using: :btree - add_index "images", ["object_key"], name: "images_idx1", using: :btree + create_table "infrastructure_divisions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.bigint "organization_id" + t.boolean "active" + t.index ["organization_id"], name: "index_infrastructure_divisions_on_organization_id" + end - create_table "issue_status_types", force: :cascade do |t| - t.string "name", limit: 32, null: false - t.string "description", limit: 254, null: false + create_table "infrastructure_foundations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" t.boolean "active" end - create_table "issue_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "infrastructure_gauge_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - create_table "issues", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "issue_type_id", limit: 4, null: false - t.integer "web_browser_type_id", limit: 4, null: false - t.integer "created_by_id", limit: 4, null: false - t.text "comments", limit: 65535, null: false - t.integer "issue_status_type_id", limit: 4 - t.text "resolution_comments", limit: 65535 - t.datetime "created_at" - t.datetime "updated_at" + create_table "infrastructure_operation_method_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - add_index "issues", ["issue_type_id"], name: "issues_idx2", using: :btree - add_index "issues", ["object_key"], name: "issues_idx1", using: :btree + create_table "infrastructure_rail_joinings", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" + end - create_table "keyword_search_indices", force: :cascade do |t| - t.string "object_class", limit: 64, null: false - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.string "context", limit: 64, null: false - t.string "summary", limit: 64, null: false - t.text "search_text", limit: 65535, null: false - t.datetime "created_at" - t.datetime "updated_at" + create_table "infrastructure_reference_rails", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - add_index "keyword_search_indices", ["object_class"], name: "keyword_search_indices_idx1", using: :btree + create_table "infrastructure_segment_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "fta_asset_class_id" + t.bigint "asset_subtype_id" + t.string "name" + t.boolean "active" + t.index ["asset_subtype_id"], name: "index_infrastructure_segment_types_on_asset_subtype_id" + t.index ["fta_asset_class_id"], name: "index_infrastructure_segment_types_on_fta_asset_class_id" + end - create_table "leed_certification_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.text "description", limit: 255, null: false - t.boolean "active", null: false + create_table "infrastructure_segment_unit_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" end - create_table "license_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "asset_manager", null: false - t.boolean "web_services", null: false - t.boolean "active", null: false + create_table "infrastructure_subdivisions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.bigint "organization_id" + t.boolean "active" + t.index ["organization_id"], name: "index_infrastructure_subdivisions_on_organization_id" end - create_table "location_reference_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "format", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "infrastructure_tracks", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.bigint "organization_id" + t.boolean "active" + t.index ["organization_id"], name: "index_infrastructure_tracks_on_organization_id" + end + + create_table "infrastructures", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "from_line" + t.string "to_line" + t.bigint "infrastructure_segment_unit_type_id" + t.decimal "from_segment", precision: 7, scale: 2 + t.decimal "to_segment", precision: 7, scale: 2 + t.string "segment_unit" + t.string "from_location_name" + t.string "to_location_name" + t.bigint "infrastructure_chain_type_id" + t.decimal "relative_location", precision: 10, scale: 5 + t.string "relative_location_unit" + t.string "relative_location_direction" + t.string "location_name" + t.bigint "infrastructure_segment_type_id" + t.bigint "infrastructure_division_id" + t.bigint "infrastructure_subdivision_id" + t.bigint "infrastructure_track_id" + t.integer "num_tracks" + t.string "direction" + t.bigint "infrastructure_operation_method_type_id" + t.bigint "infrastructure_control_system_type_id" + t.bigint "infrastructure_bridge_type_id" + t.integer "num_spans" + t.integer "num_decks" + t.bigint "infrastructure_crossing_id" + t.bigint "infrastructure_gauge_type_id" + t.decimal "gauge", precision: 10, scale: 5 + t.string "gauge_unit" + t.bigint "infrastructure_reference_rail_id" + t.decimal "track_gradient_pcnt", precision: 10, scale: 5 + t.decimal "track_gradient_degree", precision: 10, scale: 5 + t.decimal "track_gradient", precision: 10, scale: 5 + t.string "track_gradient_unit" + t.decimal "horizontal_alignment", precision: 10, scale: 5 + t.string "horizontal_alignment_unit" + t.decimal "vertical_alignment", precision: 10, scale: 5 + t.string "vertical_alignment_unit" + t.decimal "length", precision: 10, scale: 5 + t.string "length_unit" + t.decimal "height", precision: 10, scale: 5 + t.string "height_unit" + t.decimal "width", precision: 10, scale: 5 + t.string "width_unit" + t.decimal "crosslevel", precision: 10, scale: 5 + t.string "crosslevel_unit" + t.decimal "warp_parameter", precision: 10, scale: 5 + t.string "warp_parameter_unit" + t.decimal "track_curvature", precision: 10, scale: 5 + t.string "track_curvature_unit" + t.decimal "track_curvature_degree", precision: 10, scale: 5 + t.decimal "cant", precision: 10, scale: 5 + t.string "cant_unit" + t.decimal "cant_gradient", precision: 10, scale: 5 + t.string "cant_gradient_unit" + t.decimal "max_permissible_speed", precision: 10, scale: 5 + t.string "max_permissible_speed_unit" + t.string "nearest_city" + t.string "nearest_state" + t.bigint "land_ownership_organization_id" + t.string "other_land_ownership_organization" + t.bigint "shared_capital_responsibility_organization_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["infrastructure_bridge_type_id"], name: "index_infrastructures_on_infrastructure_bridge_type_id" + t.index ["infrastructure_chain_type_id"], name: "index_infrastructures_on_infrastructure_chain_type_id" + t.index ["infrastructure_control_system_type_id"], name: "index_infrastructures_on_infrastructure_control_system_type_id" + t.index ["infrastructure_crossing_id"], name: "index_infrastructures_on_infrastructure_crossing_id" + t.index ["infrastructure_division_id"], name: "index_infrastructures_on_infrastructure_division_id" + t.index ["infrastructure_gauge_type_id"], name: "index_infrastructures_on_infrastructure_gauge_type_id" + t.index ["infrastructure_operation_method_type_id"], name: "index_infrastructures_on_infrastructure_operation_method_type_id" + t.index ["infrastructure_reference_rail_id"], name: "index_infrastructures_on_infrastructure_reference_rail_id" + t.index ["infrastructure_segment_type_id"], name: "index_infrastructures_on_infrastructure_segment_type_id" + t.index ["infrastructure_segment_unit_type_id"], name: "index_infrastructures_on_infrastructure_segment_unit_type_id" + t.index ["infrastructure_subdivision_id"], name: "index_infrastructures_on_infrastructure_subdivision_id" + t.index ["infrastructure_track_id"], name: "index_infrastructures_on_infrastructure_track_id" + t.index ["land_ownership_organization_id"], name: "index_infrastructures_on_land_ownership_organization_id" + t.index ["shared_capital_responsibility_organization_id"], name: "shared_cap_responsibility_org_infrastructure_idx" + end + + create_table "issue_status_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 32, null: false + t.string "description", limit: 254, null: false + t.boolean "active" end - create_table "maintenance_provider_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 2, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "issue_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "maintenance_types", force: :cascade do |t| - t.string "name", limit: 32, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "issues", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "issue_type_id", null: false + t.integer "web_browser_type_id", null: false + t.integer "created_by_id", null: false + t.text "comments", null: false + t.integer "issue_status_type_id" + t.text "resolution_comments" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["issue_type_id"], name: "issues_idx2" + t.index ["object_key"], name: "issues_idx1" end - create_table "manufacturers", force: :cascade do |t| - t.string "filter", limit: 32, null: false - t.string "name", limit: 128, null: false - t.string "code", limit: 3, null: false - t.boolean "active", null: false + create_table "keyword_search_indices", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_class", limit: 64, null: false + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.string "context", limit: 64, null: false + t.string "summary", limit: 64, null: false + t.text "search_text", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.index ["object_class"], name: "keyword_search_indices_idx1" end - add_index "manufacturers", ["filter"], name: "manufacturers_idx1", using: :btree + create_table "leed_certification_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.text "description", limit: 255, null: false + t.boolean "active", null: false + end - create_table "message_tags", force: :cascade do |t| - t.integer "message_id", limit: 4 - t.integer "user_id", limit: 4 + create_table "license_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "asset_manager", null: false + t.boolean "web_services", null: false + t.boolean "active", null: false end - add_index "message_tags", ["message_id"], name: "message_tags_idx1", using: :btree - add_index "message_tags", ["user_id"], name: "message_tags_idx2", using: :btree + create_table "location_reference_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "format", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end - create_table "messages", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.integer "user_id", limit: 4, null: false - t.integer "to_user_id", limit: 4 - t.integer "priority_type_id", limit: 4, null: false - t.integer "thread_message_id", limit: 4 - t.string "subject", limit: 64, null: false - t.text "body", limit: 65535 - t.boolean "active" - t.datetime "opened_at" - t.datetime "created_at", null: false + create_table "maintenance_provider_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 2, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - add_index "messages", ["object_key"], name: "messages_idx1", using: :btree - add_index "messages", ["organization_id"], name: "messages_idx2", using: :btree - add_index "messages", ["thread_message_id"], name: "messages_idx5", using: :btree - add_index "messages", ["to_user_id"], name: "messages_idx4", using: :btree - add_index "messages", ["user_id"], name: "messages_idx3", using: :btree + create_table "maintenance_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 32, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end - create_table "notice_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "display_icon", limit: 64, null: false - t.string "display_class", limit: 64, null: false + create_table "manufacturer_models", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "description" + t.bigint "organization_id" + t.boolean "active" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["organization_id"], name: "index_manufacturer_models_on_organization_id" + end + + create_table "manufacturers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "filter", limit: 32, null: false + t.string "name", limit: 128, null: false + t.string "code", limit: 3, null: false + t.boolean "active", null: false + t.index ["filter"], name: "manufacturers_idx1" + end + + create_table "message_tags", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "message_id" + t.integer "user_id" + t.index ["message_id"], name: "message_tags_idx1" + t.index ["user_id"], name: "message_tags_idx2" + end + + create_table "messages", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.integer "user_id", null: false + t.integer "to_user_id" + t.integer "priority_type_id", null: false + t.integer "thread_message_id" + t.string "subject", limit: 64, null: false + t.text "body" + t.boolean "active" + t.datetime "opened_at" + t.datetime "created_at", null: false + t.index ["object_key"], name: "messages_idx1" + t.index ["organization_id"], name: "messages_idx2" + t.index ["thread_message_id"], name: "messages_idx5" + t.index ["to_user_id"], name: "messages_idx4" + t.index ["user_id"], name: "messages_idx3" + end + + create_table "notice_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "display_icon", limit: 64, null: false + t.string "display_class", limit: 64, null: false t.boolean "active" end - create_table "notices", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.string "subject", limit: 64, null: false - t.string "summary", limit: 128, null: false - t.text "details", limit: 65535 - t.integer "notice_type_id", limit: 4 - t.integer "organization_id", limit: 4 + create_table "notices", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.string "subject", limit: 64, null: false + t.string "summary", limit: 128, null: false + t.text "details" + t.integer "notice_type_id" + t.integer "organization_id" t.datetime "display_datetime" t.datetime "end_datetime" - t.boolean "active" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" end - create_table "notifications", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.string "text", limit: 255, null: false - t.string "link", limit: 255, null: false - t.integer "notifiable_id", limit: 4 - t.string "notifiable_type", limit: 255 - t.boolean "active" + create_table "notifications", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.string "text", null: false + t.string "link", null: false + t.integer "notifiable_id" + t.string "notifiable_type" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" - end - - add_index "notifications", ["notifiable_id", "notifiable_type"], name: "index_notifications_on_notifiable_id_and_notifiable_type", using: :btree - - create_table "organization_role_mappings", force: :cascade do |t| - t.integer "organization_id", limit: 4, null: false - t.integer "role_id", limit: 4, null: false + t.index ["notifiable_id", "notifiable_type"], name: "index_notifications_on_notifiable_id_and_notifiable_type" + end + + create_table "ntd_facilities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "ntd_report_id", null: false + t.string "facility_id" + t.string "name", limit: 64, null: false + t.boolean "part_of_larger_facility" + t.string "address", limit: 128, null: false + t.string "city", limit: 64, null: false + t.string "state", limit: 2, null: false + t.string "zip", limit: 10, null: false + t.float "latitude" + t.float "longitude" + t.string "primary_mode", limit: 32, null: false + t.string "secondary_mode" + t.string "private_mode" + t.string "facility_type", limit: 32, null: false + t.integer "year_built", null: false + t.integer "size", null: false + t.string "size_type", limit: 32, null: false + t.integer "pcnt_capital_responsibility", null: false + t.integer "estimated_cost", null: false + t.integer "estimated_cost_year", null: false + t.string "notes", limit: 254 + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["ntd_report_id"], name: "ntd_admin_and_maintenance_facilities_idx1" + end + + create_table "ntd_infrastructures", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "ntd_report_id" + t.string "fta_mode" + t.string "fta_service_type" + t.string "fta_type" + t.integer "size" + t.integer "linear_miles" + t.integer "track_miles" + t.integer "expected_service_life" + t.integer "pcnt_capital_responsibility" + t.string "shared_capital_responsibility_organization" + t.string "description" + t.string "notes" + t.string "allocation_unit" + t.string "pre_nineteen_thirty" + t.string "nineteen_thirty" + t.string "nineteen_forty" + t.string "nineteen_fifty" + t.string "nineteen_sixty" + t.string "nineteen_seventy" + t.string "nineteen_eighty" + t.string "nineteen_ninety" + t.string "two_thousand" + t.string "two_thousand_ten" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["ntd_report_id"], name: "index_ntd_infrastructures_on_ntd_report_id" + end + + create_table "ntd_organization_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.boolean "active" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "ntd_performance_measures", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "ntd_report_id" + t.bigint "fta_asset_category_id" + t.string "asset_level" + t.string "pcnt_goal" + t.string "pcnt_performance" + t.integer "future_pcnt_goal" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["fta_asset_category_id"], name: "index_ntd_performance_measures_on_fta_asset_category_id" + t.index ["ntd_report_id"], name: "index_ntd_performance_measures_on_ntd_report_id" + end + + create_table "ntd_reports", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.bigint "ntd_form_id" + t.text "processing_log" + t.string "state" + t.integer "created_by_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["ntd_form_id"], name: "index_ntd_reports_on_ntd_form_id" + end + + create_table "ntd_revenue_vehicle_fleets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "ntd_report_id" + t.string "vehicle_object_key" + t.string "rvi_id", limit: 32 + t.string "fta_mode" + t.string "fta_service_type" + t.string "agency_fleet_id" + t.string "dedicated" + t.string "direct_capital_responsibility" + t.integer "size" + t.integer "num_active" + t.integer "num_ada_accessible" + t.integer "num_emergency_contingency" + t.string "vehicle_type" + t.string "manufacture_code" + t.string "rebuilt_year" + t.string "model_number" + t.string "other_manufacturer" + t.string "fuel_type", limit: 32 + t.string "dual_fuel_type" + t.integer "vehicle_length" + t.integer "seating_capacity" + t.integer "standing_capacity" + t.integer "total_active_miles_in_period" + t.integer "avg_lifetime_active_miles" + t.string "ownership_type" + t.string "funding_type" + t.string "notes", limit: 254 + t.string "status" t.datetime "created_at" t.datetime "updated_at" - end - - create_table "organization_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "display_icon_name", limit: 64, null: false - t.string "map_icon_name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "roles", limit: 255 - t.boolean "active", null: false - end - - add_index "organization_types", ["class_name"], name: "organization_types_idx1", using: :btree - - create_table "organizations", force: :cascade do |t| - t.integer "organization_type_id", limit: 4, null: false - t.integer "customer_id", limit: 4, null: false - t.string "external_id", limit: 32 - t.string "name", limit: 128, null: false - t.string "short_name", limit: 16, null: false - t.boolean "license_holder", null: false - t.string "address1", limit: 128, null: false - t.string "address2", limit: 128 - t.string "county", limit: 64 - t.string "city", limit: 64, null: false - t.string "state", limit: 2, null: false - t.string "zip", limit: 10, null: false - t.string "phone", limit: 12, null: false - t.string "phone_ext", limit: 6 - t.string "fax", limit: 10 - t.string "url", limit: 128, null: false - t.integer "grantor_id", limit: 4 - t.integer "fta_agency_type_id", limit: 4 - t.boolean "indian_tribe" - t.string "subrecipient_number", limit: 9 - t.string "ntd_id_number", limit: 255 - t.integer "fta_service_area_type_id", limit: 4 - t.string "governing_body", limit: 128 - t.integer "governing_body_type_id", limit: 4 - t.boolean "active", null: false - t.decimal "latitude", precision: 11, scale: 6 - t.decimal "longitude", precision: 11, scale: 6 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "organizations", ["customer_id"], name: "organizations_idx2", using: :btree - add_index "organizations", ["grantor_id"], name: "organizations_idx3", using: :btree - add_index "organizations", ["organization_type_id"], name: "organizations_idx1", using: :btree - add_index "organizations", ["short_name"], name: "organizations_idx4", using: :btree - add_index "organizations", ["short_name"], name: "short_name", using: :btree - - create_table "organizations_districts", id: false, force: :cascade do |t| - t.integer "organization_id", limit: 4 - t.integer "district_id", limit: 4 - end - - add_index "organizations_districts", ["organization_id", "district_id"], name: "organizations_districts_idx2", using: :btree - - create_table "organizations_saved_searches", force: :cascade do |t| - t.integer "organization_id", limit: 4 - t.integer "saved_search_id", limit: 4 - end - - add_index "organizations_saved_searches", ["organization_id"], name: "index_organizations_saved_searches_on_organization_id", using: :btree - add_index "organizations_saved_searches", ["saved_search_id"], name: "index_organizations_saved_searches_on_saved_search_id", using: :btree - - create_table "organizations_service_provider_types", id: false, force: :cascade do |t| - t.integer "organization_id", limit: 4, null: false - t.integer "service_provider_type_id", limit: 4, null: false - end - - add_index "organizations_service_provider_types", ["organization_id"], name: "organization_spt_idx1", using: :btree - add_index "organizations_service_provider_types", ["service_provider_type_id"], name: "organization_spt_idx2", using: :btree - - create_table "planning_partners_organizations", force: :cascade do |t| - t.integer "planning_partner_id", limit: 4 - t.integer "organization_id", limit: 4 - end - - create_table "policies", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.integer "parent_id", limit: 4 - t.integer "year", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.integer "depreciation_calculation_type_id", limit: 4, null: false - t.integer "service_life_calculation_type_id", limit: 4, null: false - t.integer "cost_calculation_type_id", limit: 4, null: false - t.integer "condition_estimation_type_id", limit: 4, null: false - t.integer "depreciation_interval_type_id", limit: 4, null: false - t.decimal "condition_threshold", precision: 9, scale: 2, null: false - t.decimal "interest_rate", precision: 9, scale: 2, null: false - t.boolean "current", null: false - t.boolean "active", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "policies", ["object_key"], name: "policies_idx1", using: :btree - add_index "policies", ["organization_id"], name: "policies_idx2", using: :btree - - create_table "policy_asset_subtype_rules", force: :cascade do |t| - t.integer "policy_id", limit: 4, null: false - t.integer "asset_subtype_id", limit: 4, null: false - t.integer "fuel_type_id", limit: 4 - t.integer "min_service_life_months", limit: 4, null: false - t.integer "min_service_life_miles", limit: 4 - t.integer "replacement_cost", limit: 4, null: false - t.integer "cost_fy_year", limit: 4, null: false - t.boolean "replace_with_new", null: false - t.boolean "replace_with_leased", null: false - t.integer "replace_asset_subtype_id", limit: 4 - t.integer "replace_fuel_type_id", limit: 4 - t.integer "lease_length_months", limit: 4 - t.integer "rehabilitation_service_month", limit: 4 - t.integer "rehabilitation_labor_cost", limit: 4 - t.integer "rehabilitation_parts_cost", limit: 4 - t.integer "extended_service_life_months", limit: 4 - t.integer "extended_service_life_miles", limit: 4 - t.integer "min_used_purchase_service_life_months", limit: 4, null: false - t.string "purchase_replacement_code", limit: 8, null: false - t.string "lease_replacement_code", limit: 8 - t.string "purchase_expansion_code", limit: 8 - t.string "lease_expansion_code", limit: 8 - t.string "rehabilitation_code", limit: 8, null: false - t.string "engineering_design_code", limit: 8 - t.string "construction_code", limit: 8 - t.integer "fta_useful_life_benchmark", limit: 4 - t.integer "fta_vehicle_type_id", limit: 4 - t.integer "fta_facility_type_id", limit: 4 - t.boolean "default_rule" + t.integer "useful_life_remaining", null: false + t.string "useful_life_benchmark" + t.integer "manufacture_year", null: false + t.string "additional_fta_mode" + t.string "additional_fta_service_type" + t.string "other_ownership_type" + t.string "other_fuel_type" + t.index ["ntd_report_id"], name: "ntd_revenue_vehicle_fleets_idx1" + end + + create_table "ntd_service_vehicle_fleets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "ntd_report_id" + t.string "vehicle_object_key" + t.string "sv_id" + t.string "fleet_name" + t.string "agency_fleet_id" + t.string "name", limit: 64 + t.integer "size" + t.string "vehicle_type" + t.string "primary_fta_mode_type" + t.string "secondary_fta_mode_types" + t.integer "manufacture_year" + t.integer "pcnt_capital_responsibility" + t.integer "estimated_cost" + t.integer "estimated_cost_year" + t.string "useful_life_benchmark" + t.string "useful_life_remaining" + t.string "notes", limit: 254 t.datetime "created_at" t.datetime "updated_at" + t.index ["ntd_report_id"], name: "ntd_service_vehicle_fleets_idx1" end - add_index "policy_asset_subtype_rules", ["asset_subtype_id"], name: "policy_asset_subtype_rules_idx2", using: :btree - add_index "policy_asset_subtype_rules", ["policy_id"], name: "policy_asset_subtype_rules_idx1", using: :btree - - create_table "policy_asset_type_rules", force: :cascade do |t| - t.integer "policy_id", limit: 4, null: false - t.integer "asset_type_id", limit: 4, null: false - t.integer "service_life_calculation_type_id", limit: 4, null: false - t.integer "replacement_cost_calculation_type_id", limit: 4, null: false - t.integer "condition_rollup_calculation_type_id", limit: 4 - t.decimal "annual_inflation_rate", precision: 9, scale: 2, null: false - t.integer "pcnt_residual_value", limit: 4, null: false - t.integer "condition_rollup_weight", limit: 4 + create_table "organization_role_mappings", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id", null: false + t.integer "role_id", null: false t.datetime "created_at" t.datetime "updated_at" end - add_index "policy_asset_type_rules", ["asset_type_id"], name: "policy_asset_type_rules_idx2", using: :btree - add_index "policy_asset_type_rules", ["policy_id"], name: "policy_asset_type_rules_idx1", using: :btree + create_table "organization_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "display_icon_name", limit: 64, null: false + t.string "map_icon_name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "roles" + t.boolean "active", null: false + t.index ["class_name"], name: "organization_types_idx1" + end + + create_table "organizations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_type_id", null: false + t.integer "customer_id", null: false + t.string "external_id", limit: 32 + t.string "name", limit: 128, null: false + t.string "short_name", limit: 16, null: false + t.boolean "license_holder", null: false + t.string "address1", limit: 128, null: false + t.string "address2", limit: 128 + t.string "county", limit: 64 + t.string "city", limit: 64, null: false + t.string "state", limit: 2, null: false + t.string "zip", limit: 10, null: false + t.string "phone", limit: 12, null: false + t.string "phone_ext", limit: 6 + t.string "fax", limit: 12 + t.string "url", limit: 128, null: false + t.integer "grantor_id" + t.integer "fta_agency_type_id" + t.integer "ntd_organization_type_id" + t.boolean "indian_tribe" + t.string "subrecipient_number", limit: 9 + t.string "ntd_id_number" + t.integer "fta_service_area_type_id" + t.integer "service_area_population" + t.integer "service_area_size" + t.string "service_area_size_unit" + t.string "governing_body", limit: 128 + t.integer "governing_body_type_id" + t.boolean "active", null: false + t.decimal "latitude", precision: 11, scale: 6 + t.decimal "longitude", precision: 11, scale: 6 + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["customer_id"], name: "organizations_idx2" + t.index ["grantor_id"], name: "organizations_idx3" + t.index ["organization_type_id"], name: "organizations_idx1" + t.index ["short_name"], name: "organizations_idx4" + t.index ["short_name"], name: "short_name" + end + + create_table "organizations_districts", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id" + t.integer "district_id" + t.index ["organization_id", "district_id"], name: "organizations_districts_idx2" + end + + create_table "organizations_saved_queries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "saved_query_id", null: false + t.bigint "organization_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["organization_id"], name: "index_organizations_saved_queries_on_organization_id" + t.index ["saved_query_id"], name: "index_organizations_saved_queries_on_saved_query_id" + end + + create_table "organizations_saved_searches", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id" + t.integer "saved_search_id" + t.index ["organization_id"], name: "index_organizations_saved_searches_on_organization_id" + t.index ["saved_search_id"], name: "index_organizations_saved_searches_on_saved_search_id" + end + + create_table "organizations_service_provider_types", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "organization_id", null: false + t.integer "service_provider_type_id", null: false + t.index ["organization_id"], name: "organization_spt_idx1" + t.index ["service_provider_type_id"], name: "organization_spt_idx2" + end + + create_table "performance_restriction_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "description" + t.boolean "active" + end - create_table "priority_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "is_default", null: false - t.boolean "active", null: false + create_table "planning_partners_organizations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "planning_partner_id" + t.integer "organization_id" + end + + create_table "policies", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.integer "parent_id" + t.integer "year", null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.integer "depreciation_calculation_type_id", null: false + t.integer "service_life_calculation_type_id", null: false + t.integer "cost_calculation_type_id", null: false + t.integer "condition_estimation_type_id", null: false + t.integer "depreciation_interval_type_id", null: false + t.decimal "condition_threshold", precision: 9, scale: 2, null: false + t.decimal "interest_rate", precision: 9, scale: 2, null: false + t.boolean "current", null: false + t.boolean "active", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["object_key"], name: "policies_idx1" + t.index ["organization_id"], name: "policies_idx2" + end + + create_table "policy_asset_subtype_rules", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "policy_id", null: false + t.integer "asset_subtype_id", null: false + t.integer "fuel_type_id" + t.integer "min_service_life_months", null: false + t.integer "min_service_life_miles" + t.integer "replacement_cost", null: false + t.integer "cost_fy_year", null: false + t.boolean "replace_with_new", null: false + t.boolean "replace_with_leased", null: false + t.integer "replace_asset_subtype_id" + t.integer "replace_fuel_type_id" + t.integer "lease_length_months" + t.integer "rehabilitation_service_month" + t.integer "rehabilitation_labor_cost" + t.integer "rehabilitation_parts_cost" + t.integer "extended_service_life_months" + t.integer "extended_service_life_miles" + t.integer "min_used_purchase_service_life_months", null: false + t.string "purchase_replacement_code", limit: 8, null: false + t.string "lease_replacement_code", limit: 8 + t.string "purchase_expansion_code", limit: 8 + t.string "lease_expansion_code", limit: 8 + t.string "rehabilitation_code", limit: 8, null: false + t.string "engineering_design_code", limit: 8 + t.string "construction_code", limit: 8 + t.integer "fta_useful_life_benchmark" + t.integer "fta_vehicle_type_id" + t.integer "fta_facility_type_id" + t.boolean "default_rule" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["asset_subtype_id"], name: "policy_asset_subtype_rules_idx2" + t.index ["policy_id"], name: "policy_asset_subtype_rules_idx1" + end + + create_table "policy_asset_type_rules", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "policy_id", null: false + t.integer "asset_type_id", null: false + t.integer "service_life_calculation_type_id", null: false + t.integer "replacement_cost_calculation_type_id", null: false + t.integer "condition_rollup_calculation_type_id" + t.decimal "annual_inflation_rate", precision: 9, scale: 2, null: false + t.integer "pcnt_residual_value", null: false + t.integer "condition_rollup_weight" + t.datetime "created_at" + t.datetime "updated_at" + t.index ["asset_type_id"], name: "policy_asset_type_rules_idx2" + t.index ["policy_id"], name: "policy_asset_type_rules_idx1" + end + + create_table "priority_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "is_default", null: false + t.boolean "active", null: false + end + + create_table "query_asset_classes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "table_name" + t.text "transam_assets_join" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "query_association_classes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "table_name" + t.string "display_field_name" + t.string "id_field_name", default: "id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "query_categories", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "query_field_asset_classes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "query_field_id" + t.bigint "query_asset_class_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["query_asset_class_id"], name: "index_query_field_asset_classes_on_query_asset_class_id" + t.index ["query_field_id"], name: "index_query_field_asset_classes_on_query_field_id" + end + + create_table "query_fields", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "label" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "query_category_id" + t.string "filter_type" + t.bigint "query_association_class_id" + t.boolean "hidden" + t.string "pairs_with" + t.boolean "auto_show" + t.string "display_field" + t.string "column_filter" + t.string "column_filter_value" + t.index ["query_association_class_id"], name: "index_query_fields_on_query_association_class_id" + t.index ["query_category_id"], name: "index_query_fields_on_query_category_id" + end + + create_table "query_filters", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "query_field_id" + t.text "value" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "saved_query_id" + t.string "op" + t.index ["query_field_id"], name: "index_query_filters_on_query_field_id" + t.index ["saved_query_id"], name: "index_query_filters_on_saved_query_id" + end + + create_table "query_params", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "description" + t.text "query_string" + t.string "class_name" + t.boolean "active" end - create_table "query_params", force: :cascade do |t| - t.string "name", limit: 255 - t.string "description", limit: 255 - t.text "query_string", limit: 65535 - t.string "class_name", limit: 255 + create_table "ramp_manufacturers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" t.boolean "active" end - create_table "replacement_reason_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false + create_table "replacement_reason_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false t.boolean "active" end - create_table "report_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "display_icon_name", limit: 64, null: false - t.boolean "active", null: false - end - - create_table "reports", force: :cascade do |t| - t.integer "report_type_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.string "class_name", limit: 255, null: false - t.string "view_name", limit: 32, null: false - t.string "roles", limit: 128 - t.text "custom_sql", limit: 65535 - t.boolean "show_in_nav" - t.boolean "show_in_dashboard" - t.string "chart_type", limit: 32 - t.text "chart_options", limit: 65535 - t.boolean "active", null: false - t.boolean "printable" - t.boolean "exportable" - t.boolean "data_exportable" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "reports", ["report_type_id"], name: "reports_idx1", using: :btree - - create_table "roles", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.integer "weight", limit: 4 - t.integer "resource_id", limit: 4 - t.string "resource_type", limit: 255 - t.integer "role_parent_id", limit: 4 - t.boolean "show_in_user_mgmt" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "privilege", default: false, null: false - t.string "label", limit: 255 - end - - add_index "roles", ["name"], name: "roles_idx1", using: :btree - add_index "roles", ["resource_id"], name: "roles_idx2", using: :btree - - create_table "rule_sets", force: :cascade do |t| - t.string "object_key", limit: 255 - t.string "name", limit: 255 - t.string "class_name", limit: 255 + create_table "report_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "display_icon_name", limit: 64, null: false + t.boolean "active", null: false + end + + create_table "reports", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "report_type_id", null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.string "class_name", null: false + t.string "view_name", limit: 32, null: false + t.string "roles", limit: 128 + t.text "custom_sql" + t.boolean "show_in_nav" + t.boolean "show_in_dashboard" + t.string "chart_type", limit: 32 + t.text "chart_options" + t.boolean "active", null: false + t.boolean "printable" + t.boolean "exportable" + t.boolean "data_exportable" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["report_type_id"], name: "reports_idx1" + end + + create_table "revenue_vehicles", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "esl_category_id" + t.integer "standing_capacity" + t.bigint "fta_funding_type_id" + t.bigint "fta_ownership_type_id" + t.string "other_fta_ownership_type" + t.boolean "dedicated" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["esl_category_id"], name: "index_revenue_vehicles_on_esl_category_id" + t.index ["fta_funding_type_id"], name: "index_revenue_vehicles_on_fta_funding_type_id" + t.index ["fta_ownership_type_id"], name: "index_revenue_vehicles_on_fta_ownership_type_id" + end + + create_table "roles", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.integer "weight" + t.integer "resource_id" + t.string "resource_type" + t.integer "role_parent_id" + t.boolean "show_in_user_mgmt" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "privilege", default: false, null: false + t.string "label" + t.index ["name"], name: "roles_idx1" + t.index ["resource_id"], name: "roles_idx2" + end + + create_table "rule_sets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key" + t.string "name" + t.string "class_name" t.boolean "rule_set_aware" t.boolean "active" end - create_table "saved_searches", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "user_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.integer "search_type_id", limit: 4 - t.text "json", limit: 65535 - t.text "query_string", limit: 65535 - t.integer "ordinal", limit: 4 + create_table "saved_queries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key" + t.string "name" + t.string "description" + t.integer "created_by_user_id" + t.integer "updated_by_user_id" + t.integer "shared_from_org_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.text "ordered_output_field_ids" + end + + create_table "saved_query_fields", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "saved_query_id" + t.bigint "query_field_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["query_field_id"], name: "index_saved_query_fields_on_query_field_id" + t.index ["saved_query_id"], name: "index_saved_query_fields_on_saved_query_id" + end + + create_table "saved_searches", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "user_id", null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.integer "search_type_id" + t.text "json" + t.text "query_string" + t.integer "ordinal" t.datetime "created_at" t.datetime "updated_at" end - create_table "search_types", force: :cascade do |t| - t.string "name", limit: 255 - t.string "class_name", limit: 255 + create_table "search_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name" + t.string "class_name" t.boolean "active" end - create_table "service_life_calculation_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "class_name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false - end - - add_index "service_life_calculation_types", ["class_name"], name: "service_life_calculation_types_idx1", using: :btree - - create_table "service_provider_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 5, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false - end - - create_table "service_status_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 1, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false - end - - create_table "system_configs", force: :cascade do |t| - t.integer "customer_id", limit: 4 - t.string "start_of_fiscal_year", limit: 5 - t.string "map_tile_provider", limit: 64 - t.integer "srid", limit: 4 - t.float "min_lat", limit: 24 - t.float "min_lon", limit: 24 - t.float "max_lat", limit: 24 - t.float "max_lon", limit: 24 - t.integer "search_radius", limit: 4 - t.string "search_units", limit: 8 - t.string "geocoder_components", limit: 128 - t.string "geocoder_region", limit: 64 - t.integer "num_forecasting_years", limit: 4 - t.integer "num_reporting_years", limit: 4 - t.string "asset_base_class_name", limit: 64 - t.integer "max_rows_returned", limit: 4 - t.string "data_file_path", limit: 64 + create_table "serial_numbers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "identifiable_type" + t.bigint "identifiable_id" + t.string "identification" + t.index ["identifiable_type", "identifiable_id"], name: "index_serial_numbers_on_identifiable_type_and_identifiable_id" + end + + create_table "service_life_calculation_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "class_name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + t.index ["class_name"], name: "service_life_calculation_types_idx1" + end + + create_table "service_provider_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 5, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "service_status_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 1, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false + end + + create_table "service_vehicles", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "service_vehiclible_type" + t.bigint "service_vehiclible_id" + t.bigint "chassis_id" + t.string "other_chassis" + t.bigint "fuel_type_id" + t.bigint "dual_fuel_type_id" + t.boolean "fta_emergency_contingency_fleet" + t.string "other_fuel_type" + t.string "license_plate" + t.integer "vehicle_length" + t.string "vehicle_length_unit" + t.integer "gross_vehicle_weight" + t.string "gross_vehicle_weight_unit" + t.integer "seating_capacity" + t.integer "wheelchair_capacity" + t.bigint "ramp_manufacturer_id" + t.string "other_ramp_manufacturer" + t.boolean "ada_accessible" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["chassis_id"], name: "index_service_vehicles_on_chassis_id" + t.index ["dual_fuel_type_id"], name: "index_service_vehicles_on_dual_fuel_type_id" + t.index ["fuel_type_id"], name: "index_service_vehicles_on_fuel_type_id" + t.index ["ramp_manufacturer_id"], name: "index_service_vehicles_on_ramp_manufacturer_id" + t.index ["service_vehiclible_type", "service_vehiclible_id"], name: "service_vehiclible_idx" + end + + create_table "system_config_extensions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "class_name" + t.string "extension_name" + t.string "engine_name" + t.boolean "active" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "system_configs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "customer_id" + t.string "start_of_fiscal_year", limit: 5 + t.string "default_fiscal_year_formatter" + t.string "default_weather_code" + t.string "map_tile_provider", limit: 64 + t.integer "srid" + t.float "min_lat" + t.float "min_lon" + t.float "max_lat" + t.float "max_lon" + t.integer "search_radius" + t.string "search_units", limit: 8 + t.string "geocoder_components", limit: 128 + t.string "geocoder_region", limit: 64 + t.integer "num_forecasting_years" + t.integer "num_reporting_years" + t.integer "max_rows_returned" + t.string "special_locked_fields" + t.string "measurement_system" + t.string "data_file_path", limit: 64 t.datetime "created_at" t.datetime "updated_at" end - create_table "tam_groups", force: :cascade do |t| - t.string "object_key", limit: 255 - t.integer "organization_id", limit: 4 - t.integer "tam_policy_id", limit: 4 - t.string "name", limit: 255 - t.integer "leader_id", limit: 4 - t.integer "parent_id", limit: 4 - t.string "state", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "tam_groups", ["organization_id"], name: "index_tam_groups_on_organization_id", using: :btree - add_index "tam_groups", ["tam_policy_id"], name: "index_tam_groups_on_tam_policy_id", using: :btree - - create_table "tam_groups_fta_asset_categories", id: false, force: :cascade do |t| - t.integer "tam_group_id", limit: 4 - t.integer "fta_asset_category_id", limit: 4 - end - - create_table "tam_groups_organizations", id: false, force: :cascade do |t| - t.integer "tam_group_id", limit: 4 - t.integer "organization_id", limit: 4 - end - - create_table "tam_performance_metrics", force: :cascade do |t| - t.string "object_key", limit: 255 - t.integer "tam_group_id", limit: 4 - t.integer "fta_asset_category_id", limit: 4 - t.string "asset_level_type", limit: 255 - t.integer "asset_level_id", limit: 4 - t.integer "parent_id", limit: 4 - t.integer "useful_life_benchmark", limit: 4 - t.string "useful_life_benchmark_unit", limit: 255 - t.boolean "useful_life_benchmark_locked" - t.integer "pcnt_goal", limit: 4 - t.boolean "pcnt_goal_locked" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "tam_performance_metrics", ["tam_group_id"], name: "index_tam_performance_metrics_on_tam_group_id", using: :btree - - create_table "tam_policies", force: :cascade do |t| - t.string "object_key", limit: 255 - t.integer "fy_year", limit: 4 - t.boolean "copied" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - create_table "tasks", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "taskable_id", limit: 4 - t.string "taskable_type", limit: 255 - t.integer "user_id", limit: 4, null: false - t.integer "priority_type_id", limit: 4, null: false - t.integer "organization_id", limit: 4, null: false - t.integer "assigned_to_user_id", limit: 4 - t.string "subject", limit: 64, null: false - t.text "body", limit: 65535, null: false - t.boolean "send_reminder" - t.string "state", limit: 32 - t.datetime "complete_by", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "tasks", ["assigned_to_user_id"], name: "tasks_idx5", using: :btree - add_index "tasks", ["complete_by"], name: "tasks_idx6", using: :btree - add_index "tasks", ["object_key"], name: "tasks_idx1", using: :btree - add_index "tasks", ["organization_id"], name: "tasks_idx4", using: :btree - add_index "tasks", ["state"], name: "tasks_idx3", using: :btree - add_index "tasks", ["user_id"], name: "tasks_idx2", using: :btree - - create_table "team_ali_codes", force: :cascade do |t| - t.string "name", limit: 64 - t.integer "parent_id", limit: 4 - t.integer "lft", limit: 4 - t.integer "rgt", limit: 4 - t.string "code", limit: 8 + create_table "tam_groups", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key" + t.integer "organization_id" + t.integer "tam_policy_id" + t.string "name" + t.integer "leader_id" + t.integer "parent_id" + t.string "state" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["organization_id"], name: "index_tam_groups_on_organization_id" + t.index ["tam_policy_id"], name: "index_tam_groups_on_tam_policy_id" + end + + create_table "tam_groups_fta_asset_categories", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "tam_group_id" + t.integer "fta_asset_category_id" + end + + create_table "tam_groups_organizations", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "tam_group_id" + t.integer "organization_id" + end + + create_table "tam_performance_metrics", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key" + t.integer "tam_group_id" + t.integer "fta_asset_category_id" + t.string "asset_level_type" + t.integer "asset_level_id" + t.integer "parent_id" + t.integer "useful_life_benchmark" + t.string "useful_life_benchmark_unit" + t.boolean "useful_life_benchmark_locked" + t.integer "pcnt_goal" + t.boolean "pcnt_goal_locked" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["tam_group_id"], name: "index_tam_performance_metrics_on_tam_group_id" + end + + create_table "tam_policies", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key" + t.integer "fy_year" + t.boolean "copied" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "tasks", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "taskable_id" + t.string "taskable_type" + t.integer "user_id", null: false + t.integer "priority_type_id", null: false + t.integer "organization_id", null: false + t.integer "assigned_to_user_id" + t.string "subject", limit: 64, null: false + t.text "body", null: false + t.boolean "send_reminder" + t.string "state", limit: 32 + t.datetime "complete_by", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["assigned_to_user_id"], name: "tasks_idx5" + t.index ["complete_by"], name: "tasks_idx6" + t.index ["object_key"], name: "tasks_idx1" + t.index ["organization_id"], name: "tasks_idx4" + t.index ["state"], name: "tasks_idx3" + t.index ["user_id"], name: "tasks_idx2" + end + + create_table "team_ali_codes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64 + t.integer "parent_id" + t.integer "lft" + t.integer "rgt" + t.string "code", limit: 8 t.boolean "active" - end - - add_index "team_ali_codes", ["code"], name: "team_scope_ali_codes_idx3", using: :btree - add_index "team_ali_codes", ["name"], name: "team_scope_ali_codes_idx1", using: :btree - add_index "team_ali_codes", ["rgt"], name: "team_scope_ali_codes_idx2", using: :btree - - create_table "uploads", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4 - t.integer "user_id", limit: 4, null: false - t.integer "file_content_type_id", limit: 4, null: false - t.integer "file_status_type_id", limit: 4, null: false - t.string "file", limit: 128, null: false - t.string "original_filename", limit: 254, null: false - t.integer "num_rows_processed", limit: 4 - t.integer "num_rows_added", limit: 4 - t.integer "num_rows_replaced", limit: 4 - t.integer "num_rows_skipped", limit: 4 - t.integer "num_rows_failed", limit: 4 - t.text "processing_log", limit: 4294967295 - t.boolean "force_update" + t.index ["code"], name: "team_scope_ali_codes_idx3" + t.index ["name"], name: "team_scope_ali_codes_idx1" + t.index ["rgt"], name: "team_scope_ali_codes_idx2" + end + + create_table "transam_assets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "transam_assetible_type" + t.bigint "transam_assetible_id" + t.string "object_key", limit: 12, null: false + t.bigint "organization_id", null: false + t.bigint "asset_subtype_id" + t.bigint "upload_id" + t.string "asset_tag", null: false + t.date "disposition_date" + t.string "external_id" + t.text "description" + t.bigint "manufacturer_id" + t.string "other_manufacturer" + t.bigint "manufacturer_model_id" + t.string "other_manufacturer_model" + t.integer "manufacture_year" + t.integer "quantity" + t.string "quantity_unit" + t.integer "purchase_cost" + t.date "purchase_date" + t.boolean "purchased_new" + t.date "in_service_date" + t.bigint "vendor_id" + t.string "other_vendor" + t.integer "parent_id" + t.integer "location_id" + t.integer "policy_replacement_year" + t.integer "scheduled_replacement_year" + t.integer "scheduled_replacement_cost" + t.text "early_replacement_reason" + t.boolean "in_backlog" + t.boolean "depreciable" + t.date "depreciation_start_date" + t.date "current_depreciation_date" + t.integer "depreciation_useful_life" + t.integer "depreciation_purchase_cost" + t.integer "book_value" + t.integer "salvage_value" + t.integer "scheduled_rehabilitation_year" + t.integer "scheduled_disposition_year" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["asset_subtype_id"], name: "index_transam_assets_on_asset_subtype_id" + t.index ["manufacturer_id"], name: "index_transam_assets_on_manufacturer_id" + t.index ["manufacturer_model_id"], name: "index_transam_assets_on_manufacturer_model_id" + t.index ["organization_id"], name: "index_transam_assets_on_organization_id" + t.index ["transam_assetible_type", "transam_assetible_id"], name: "transam_assetible_idx" + t.index ["upload_id"], name: "index_transam_assets_on_upload_id" + t.index ["vendor_id"], name: "index_transam_assets_on_vendor_id" + end + + create_table "transit_assets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "transit_assetible_type" + t.bigint "transit_assetible_id" + t.bigint "asset_id" + t.bigint "fta_asset_category_id", null: false + t.bigint "fta_asset_class_id", null: false + t.string "fta_type_type", null: false + t.integer "fta_type_id", null: false + t.integer "pcnt_capital_responsibility" + t.string "contract_num" + t.bigint "contract_type_id" + t.boolean "has_warranty" + t.date "warranty_date" + t.bigint "operator_id" + t.string "other_operator" + t.string "title_number" + t.bigint "title_ownership_organization_id" + t.string "other_title_ownership_organization" + t.bigint "lienholder_id" + t.string "other_lienholder" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["asset_id"], name: "index_transit_assets_on_asset_id" + t.index ["contract_type_id"], name: "index_transit_assets_on_contract_type_id" + t.index ["fta_asset_category_id"], name: "index_transit_assets_on_fta_asset_category_id" + t.index ["fta_asset_class_id"], name: "index_transit_assets_on_fta_asset_class_id" + t.index ["fta_type_type", "fta_type_id"], name: "index_transit_assets_on_fta_type_type_and_fta_type_id" + t.index ["lienholder_id"], name: "index_transit_assets_on_lienholder_id" + t.index ["operator_id"], name: "index_transit_assets_on_operator_id" + t.index ["title_ownership_organization_id"], name: "index_transit_assets_on_title_ownership_organization_id" + t.index ["transit_assetible_type", "transit_assetible_id"], name: "transit_assetible_idx" + end + + create_table "transit_components", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.bigint "component_type_id" + t.bigint "component_element_type_id" + t.bigint "component_subtype_id" + t.bigint "component_material_id" + t.bigint "infrastructure_rail_joining_id" + t.integer "infrastructure_measurement" + t.string "infrastructure_measurement_unit" + t.integer "infrastructure_weight" + t.string "infrastructure_weight_unit" + t.integer "infrastructure_diameter" + t.string "infrastructure_diameter_unit" + t.bigint "infrastructure_cap_material_id" + t.bigint "infrastructure_foundation_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["component_element_type_id"], name: "index_transit_components_on_component_element_type_id" + t.index ["component_material_id"], name: "index_transit_components_on_component_material_id" + t.index ["component_subtype_id"], name: "index_transit_components_on_component_subtype_id" + t.index ["component_type_id"], name: "index_transit_components_on_component_type_id" + t.index ["infrastructure_cap_material_id"], name: "index_transit_components_on_infrastructure_cap_material_id" + t.index ["infrastructure_foundation_id"], name: "index_transit_components_on_infrastructure_foundation_id" + t.index ["infrastructure_rail_joining_id"], name: "index_transit_components_on_infrastructure_rail_joining_id" + end + + create_table "uploads", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id" + t.integer "user_id", null: false + t.integer "file_content_type_id", null: false + t.integer "file_status_type_id", null: false + t.string "file", limit: 128, null: false + t.string "original_filename", limit: 254, null: false + t.integer "num_rows_processed" + t.integer "num_rows_added" + t.integer "num_rows_replaced" + t.integer "num_rows_skipped" + t.integer "num_rows_failed" + t.text "processing_log", limit: 4294967295 + t.boolean "force_update" t.datetime "processing_started_at" t.datetime "processing_completed_at" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "uploads", ["file_content_type_id"], name: "uploads_idx4", using: :btree - add_index "uploads", ["file_status_type_id"], name: "uploads_idx5", using: :btree - add_index "uploads", ["object_key"], name: "uploads_idx1", using: :btree - add_index "uploads", ["organization_id"], name: "uploads_idx2", using: :btree - add_index "uploads", ["user_id"], name: "uploads_idx3", using: :btree - - create_table "user_notifications", force: :cascade do |t| - t.integer "user_id", limit: 4, null: false - t.integer "notification_id", limit: 4, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["file_content_type_id"], name: "uploads_idx4" + t.index ["file_status_type_id"], name: "uploads_idx5" + t.index ["object_key"], name: "uploads_idx1" + t.index ["organization_id"], name: "uploads_idx2" + t.index ["user_id"], name: "uploads_idx3" + end + + create_table "user_notifications", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "user_id", null: false + t.integer "notification_id", null: false t.datetime "opened_at" t.datetime "created_at" t.datetime "updated_at" + t.index ["notification_id"], name: "index_user_notifications_on_notification_id" + t.index ["user_id"], name: "index_user_notifications_on_user_id" end - add_index "user_notifications", ["notification_id"], name: "index_user_notifications_on_notification_id", using: :btree - add_index "user_notifications", ["user_id"], name: "index_user_notifications_on_user_id", using: :btree - - create_table "user_organization_filters", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "user_organization_filters", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false t.datetime "created_at" t.datetime "updated_at" - t.integer "sort_order", limit: 4 - t.integer "created_by_user_id", limit: 4 - t.text "query_string", limit: 65535 - t.integer "resource_id", limit: 4 - t.string "resource_type", limit: 255 - end - - add_index "user_organization_filters", ["created_by_user_id"], name: "index_user_organization_filters_on_created_by_user_id", using: :btree - add_index "user_organization_filters", ["object_key"], name: "user_organization_filters_idx1", using: :btree - - create_table "user_organization_filters_organizations", id: false, force: :cascade do |t| - t.integer "user_organization_filter_id", limit: 4, null: false - t.integer "organization_id", limit: 4, null: false - end - - add_index "user_organization_filters_organizations", ["user_organization_filter_id", "organization_id"], name: "user_organization_filters_idx1", using: :btree - - create_table "users", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.string "external_id", limit: 32 - t.string "first_name", limit: 64, null: false - t.string "last_name", limit: 64, null: false - t.string "title", limit: 64 - t.string "phone", limit: 12, null: false - t.string "phone_ext", limit: 6 - t.string "timezone", limit: 32, null: false - t.string "email", limit: 128, null: false - t.string "address1", limit: 64 - t.string "address2", limit: 64 - t.string "city", limit: 32 - t.string "state", limit: 2 - t.string "zip", limit: 10 - t.integer "num_table_rows", limit: 4 - t.integer "user_organization_filter_id", limit: 4 - t.string "encrypted_password", limit: 64, null: false - t.string "reset_password_token", limit: 64 + t.integer "sort_order" + t.integer "created_by_user_id" + t.text "query_string" + t.integer "resource_id" + t.string "resource_type" + t.index ["created_by_user_id"], name: "index_user_organization_filters_on_created_by_user_id" + t.index ["object_key"], name: "user_organization_filters_idx1" + end + + create_table "user_organization_filters_organizations", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "user_organization_filter_id", null: false + t.integer "organization_id", null: false + t.index ["user_organization_filter_id", "organization_id"], name: "user_organization_filters_idx1" + end + + create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.string "external_id", limit: 32 + t.string "first_name", limit: 64, null: false + t.string "last_name", limit: 64, null: false + t.string "title", limit: 64 + t.string "phone", limit: 12, null: false + t.string "phone_ext", limit: 6 + t.string "timezone", limit: 32, null: false + t.string "email", limit: 128, null: false + t.string "address1", limit: 64 + t.string "address2", limit: 64 + t.string "city", limit: 32 + t.string "state", limit: 2 + t.string "zip", limit: 10 + t.integer "num_table_rows" + t.integer "user_organization_filter_id" + t.string "encrypted_password", limit: 64, null: false + t.string "reset_password_token", limit: 64 t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", limit: 4 + t.integer "sign_in_count" t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip", limit: 16 - t.string "last_sign_in_ip", limit: 16 - t.integer "failed_attempts", limit: 4, null: false - t.string "unlock_token", limit: 128 + t.string "current_sign_in_ip", limit: 16 + t.string "last_sign_in_ip", limit: 16 + t.integer "failed_attempts", null: false + t.string "unlock_token", limit: 128 t.datetime "locked_at" - t.boolean "notify_via_email", null: false - t.integer "weather_code_id", limit: 4 - t.boolean "active", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - add_index "users", ["email"], name: "users_idx3", using: :btree - add_index "users", ["object_key"], name: "users_idx1", using: :btree - add_index "users", ["organization_id"], name: "users_idx2", using: :btree - - create_table "users_organizations", id: false, force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "organization_id", limit: 4 - end - - add_index "users_organizations", ["user_id", "organization_id"], name: "users_organizations_idx2", using: :btree - - create_table "users_roles", id: false, force: :cascade do |t| - t.integer "user_id", limit: 4, null: false - t.integer "role_id", limit: 4, null: false - t.integer "granted_by_user_id", limit: 4 - t.date "granted_on_date" - t.integer "revoked_by_user_id", limit: 4 - t.date "revoked_on_date" - t.boolean "active" + t.boolean "notify_via_email", null: false + t.integer "weather_code_id" + t.boolean "active", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "authentication_token", limit: 30 + t.index ["authentication_token"], name: "index_users_on_authentication_token", unique: true + t.index ["email"], name: "users_idx3" + t.index ["object_key"], name: "users_idx1" + t.index ["organization_id"], name: "users_idx2" + end + + create_table "users_organizations", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "user_id" + t.integer "organization_id" + t.index ["user_id", "organization_id"], name: "users_organizations_idx2" + end + + create_table "users_roles", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "user_id", null: false + t.integer "role_id", null: false + t.integer "granted_by_user_id" + t.date "granted_on_date" + t.integer "revoked_by_user_id" + t.date "revoked_on_date" + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" + t.index ["active"], name: "users_roles_idx3" + t.index ["user_id", "role_id"], name: "users_roles_idx2" end - add_index "users_roles", ["active"], name: "users_roles_idx3", using: :btree - add_index "users_roles", ["user_id", "role_id"], name: "users_roles_idx2", using: :btree - - create_table "users_user_organization_filters", force: :cascade do |t| - t.integer "user_id", limit: 4, null: false - t.integer "user_organization_filter_id", limit: 4, null: false + create_table "users_user_organization_filters", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "user_id", null: false + t.integer "user_organization_filter_id", null: false + t.index ["user_id"], name: "users_user_organization_filters_idx1" + t.index ["user_organization_filter_id"], name: "users_user_organization_filters_idx2" end - add_index "users_user_organization_filters", ["user_id"], name: "users_user_organization_filters_idx1", using: :btree - add_index "users_user_organization_filters", ["user_organization_filter_id"], name: "users_user_organization_filters_idx2", using: :btree - - create_table "users_viewable_organizations", force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "organization_id", limit: 4 + create_table "users_viewable_organizations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.integer "user_id" + t.integer "organization_id" end - create_table "vehicle_features", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 3, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "vehicle_features", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 3, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "vehicle_rebuild_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.text "description", limit: 255, null: false - t.boolean "active", null: false + create_table "vehicle_rebuild_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.text "description", limit: 255, null: false + t.boolean "active", null: false end - create_table "vehicle_storage_method_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 1, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "vehicle_storage_method_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 1, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "vehicle_usage_codes", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "code", limit: 1, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "vehicle_usage_codes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "code", limit: 1, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "vendors", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "organization_id", limit: 4, null: false - t.string "name", limit: 64, null: false - t.string "address1", limit: 64 - t.string "address2", limit: 64 - t.string "city", limit: 64 - t.string "state", limit: 2 - t.string "zip", limit: 10 - t.string "phone", limit: 12 - t.string "phone_ext", limit: 6 - t.string "fax", limit: 12 - t.string "url", limit: 128 - t.decimal "latitude", precision: 11, scale: 6 - t.decimal "longitude", precision: 11, scale: 6 - t.boolean "active" + create_table "vendors", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "organization_id", null: false + t.string "name", limit: 64, null: false + t.string "address1", limit: 64 + t.string "address2", limit: 64 + t.string "city", limit: 64 + t.string "state", limit: 2 + t.string "zip", limit: 10 + t.string "phone", limit: 12 + t.string "phone_ext", limit: 6 + t.string "fax", limit: 12 + t.string "url", limit: 128 + t.decimal "latitude", precision: 11, scale: 6 + t.decimal "longitude", precision: 11, scale: 6 + t.boolean "active" t.datetime "created_at" t.datetime "updated_at" + t.index ["name"], name: "vendors_idx2" + t.index ["object_key"], name: "vendors_idx1" + t.index ["organization_id"], name: "vendors_idx3" end - add_index "vendors", ["name"], name: "vendors_idx2", using: :btree - add_index "vendors", ["object_key"], name: "vendors_idx1", using: :btree - add_index "vendors", ["organization_id"], name: "vendors_idx3", using: :btree - - create_table "versions", force: :cascade do |t| - t.string "item_type", limit: 255, null: false - t.integer "item_id", limit: 4, null: false - t.string "event", limit: 255, null: false - t.string "whodunnit", limit: 255 - t.text "object", limit: 65535 + create_table "versions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "item_type", null: false + t.integer "item_id", null: false + t.string "event", null: false + t.string "whodunnit" + t.text "object" t.datetime "created_at" - t.text "object_changes", limit: 65535 + t.text "object_changes" end - create_table "weather_codes", force: :cascade do |t| - t.string "state", limit: 2 - t.string "code", limit: 8 - t.string "city", limit: 64 + create_table "weather_codes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "state", limit: 2 + t.string "code", limit: 8 + t.string "city", limit: 64 t.boolean "active" + t.index ["state", "city"], name: "weather_codes_idx" end - add_index "weather_codes", ["state", "city"], name: "weather_codes_idx", using: :btree - - create_table "web_browser_types", force: :cascade do |t| - t.string "name", limit: 64, null: false - t.string "description", limit: 254, null: false - t.boolean "active", null: false + create_table "web_browser_types", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "name", limit: 64, null: false + t.string "description", limit: 254, null: false + t.boolean "active", null: false end - create_table "workflow_events", force: :cascade do |t| - t.string "object_key", limit: 12, null: false - t.integer "accountable_id", limit: 4, null: false - t.string "accountable_type", limit: 64, null: false - t.string "event_type", limit: 64, null: false - t.integer "created_by_id", limit: 4 + create_table "workflow_events", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + t.string "object_key", limit: 12, null: false + t.integer "accountable_id", null: false + t.string "accountable_type", limit: 64, null: false + t.string "event_type", limit: 64, null: false + t.integer "created_by_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["accountable_id", "accountable_type"], name: "workflow_events_idx2" + t.index ["object_key"], name: "workflow_events_idx1" end - add_index "workflow_events", ["accountable_id", "accountable_type"], name: "workflow_events_idx2", using: :btree - add_index "workflow_events", ["object_key"], name: "workflow_events_idx1", using: :btree - + add_foreign_key "query_field_asset_classes", "query_asset_classes" + add_foreign_key "query_field_asset_classes", "query_fields" + add_foreign_key "query_filters", "query_fields" + add_foreign_key "saved_query_fields", "query_fields" + add_foreign_key "saved_query_fields", "saved_queries" end diff --git a/spec/dummy/db/seeds.rb b/spec/dummy/db/seeds.rb index c9d0f521..75d78824 100644 --- a/spec/dummy/db/seeds.rb +++ b/spec/dummy/db/seeds.rb @@ -17,7 +17,6 @@ :geocoder_region => 'us', :num_forecasting_years => 12, :num_reporting_years => 20, - :asset_base_class_name => 'Asset', :max_rows_returned => 500, :data_file_path => '/data/' ) diff --git a/spec/factories/assets.rb b/spec/factories/assets.rb index d0d32c02..96279957 100644 --- a/spec/factories/assets.rb +++ b/spec/factories/assets.rb @@ -11,19 +11,19 @@ asset_tag purchase_date { 1.year.ago } in_service_date { 1.year.ago } - depreciation_start_date Date.new(2014,1,1) - manufacture_year "2000" - fta_funding_type_id 1 - created_by_id 1 + depreciation_start_date { Date.new(2014,1,1) } + manufacture_year { "2000" } + fta_funding_type_id { 1 } + created_by_id { 1 } end factory :buslike_asset, :class => :asset do # An untyped asset which looks like a bus basic_asset_attributes - asset_type_id 1 - asset_subtype_id 1 - purchase_cost 2000.0 - expected_useful_life 120 - reported_condition_rating 2.0 + asset_type_id { 1 } + asset_subtype_id { 1 } + purchase_cost { 2000.0 } + expected_useful_life { 120 } + reported_condition_rating { 2.0 } #replacement_value 100 estimated_replacement_cost { 100 } end diff --git a/spec/factories/chart_of_accounts.rb b/spec/factories/chart_of_accounts.rb index 3c5e545c..0330c4c3 100644 --- a/spec/factories/chart_of_accounts.rb +++ b/spec/factories/chart_of_accounts.rb @@ -2,7 +2,7 @@ factory :chart_of_account do association :organization - active true + active { true } end end diff --git a/spec/factories/funding_sources.rb b/spec/factories/funding_sources.rb index 8b5d5082..896b08e7 100644 --- a/spec/factories/funding_sources.rb +++ b/spec/factories/funding_sources.rb @@ -2,9 +2,9 @@ factory :funding_source do sequence(:name) {|n| "Test Funding Source #{n}"} - description 'Test Funding Source Description' - funding_source_type_id 1 - match_required 80.0 + description { 'Test Funding Source Description' } + funding_source_type_id { 1 } + match_required { 80.0 } end end diff --git a/spec/factories/general_ledger_accounts.rb b/spec/factories/general_ledger_accounts.rb index 7d07a639..b0ca51fc 100644 --- a/spec/factories/general_ledger_accounts.rb +++ b/spec/factories/general_ledger_accounts.rb @@ -2,11 +2,11 @@ factory :general_ledger_account do association :chart_of_account - general_ledger_account_type_id 1 - general_ledger_account_subtype_id 1 - account_number 'GLA-XX-123456' - name 'Test GLA' - active true + general_ledger_account_type_id { 1 } + general_ledger_account_subtype_id { 1 } + account_number { 'GLA-XX-123456' } + name { 'Test GLA' } + active { true } end end diff --git a/spec/factories/grant_budgets.rb b/spec/factories/grant_budgets.rb index c1f558f4..d7ccfa33 100644 --- a/spec/factories/grant_budgets.rb +++ b/spec/factories/grant_budgets.rb @@ -3,7 +3,7 @@ factory :grant_budget do association :general_ledger_account association :grant - amount 10000 + amount { 10000 } end end diff --git a/spec/factories/grant_purchases.rb b/spec/factories/grant_purchases.rb index 0c874217..4e2458ac 100644 --- a/spec/factories/grant_purchases.rb +++ b/spec/factories/grant_purchases.rb @@ -3,7 +3,7 @@ factory :grant_purchase do association :sourceable, :factory => :funding_source association :asset, :factory => :buslike_asset - pcnt_purchase_cost 100 + pcnt_purchase_cost { 100 } end end diff --git a/spec/factories/grants.rb b/spec/factories/grants.rb index f242dfa3..fcc5e888 100644 --- a/spec/factories/grants.rb +++ b/spec/factories/grants.rb @@ -1,11 +1,12 @@ FactoryGirl.define do factory :grant do - association :organization + association :owner, factory: :organization association :sourceable, factory: :funding_source - sequence(:name) {|n| "Grant#{n}"} - fy_year Date.today.year - amount 50000 + sequence(:grant_num) {|n| "Grant#{n}"} + fy_year { Date.today.year } + amount { 50000 } + award_date { Date.today } end end diff --git a/spec/factories/organization_types.rb b/spec/factories/organization_types.rb index 779d498a..fff57270 100644 --- a/spec/factories/organization_types.rb +++ b/spec/factories/organization_types.rb @@ -1,12 +1,12 @@ FactoryGirl.define do factory :organization_type do - name 'TestOrg' - class_name 'TestOrg' - display_icon_name 'fa fa-bus' - map_icon_name 'greenIcon' - description 'Organizations who own, operate, or manage transit assets.' - active 1 + name { 'TestOrg' } + class_name { 'TestOrg' } + display_icon_name { 'fa fa-bus' } + map_icon_name { 'greenIcon' } + description { 'Organizations who own, operate, or manage transit assets.' } + active { 1 } end end diff --git a/spec/factories/organizations.rb b/spec/factories/organizations.rb index f7ddb5ad..4d78846f 100644 --- a/spec/factories/organizations.rb +++ b/spec/factories/organizations.rb @@ -1,18 +1,18 @@ FactoryGirl.define do factory :organization do - customer_id 1 - address1 '100 Main St' - city 'Harrisburg' - state 'PA' - zip '17120' - url 'http://www.example.com' - phone '9999999999' - grantor_id 1 - organization_type_id 1 + customer_id { 1 } + address1 { '100 Main St' } + city { 'Harrisburg' } + state { 'PA' } + zip { '17120' } + url { 'http://www.example.com' } + phone { '9999999999' } + grantor_id { 1 } + organization_type_id { 1 } sequence(:name) { |n| "Org #{n}" } - short_name {name} - license_holder true + short_name { name } + license_holder { true } end end diff --git a/spec/factories/policies.rb b/spec/factories/policies.rb index caacc645..57a51e83 100644 --- a/spec/factories/policies.rb +++ b/spec/factories/policies.rb @@ -2,17 +2,17 @@ factory :policy do association :organization, :factory => :organization - interest_rate "0.05" - depreciation_calculation_type_id 1 - depreciation_interval_type_id 1 - service_life_calculation_type_id 1 - cost_calculation_type_id 1 - condition_estimation_type_id 1 - condition_threshold 2.5 - name 'TestPolicy' - description 'Test Policy' - year Date.today.year - current true - active true + interest_rate { "0.05" } + depreciation_calculation_type_id { 1 } + depreciation_interval_type_id { 1 } + service_life_calculation_type_id { 1 } + cost_calculation_type_id { 1 } + condition_estimation_type_id { 1 } + condition_threshold { 2.5 } + name { 'TestPolicy' } + description { 'Test Policy' } + year { Date.today.year } + current { true } + active { true } end end diff --git a/spec/factories/policy_asset_subtype_rules.rb b/spec/factories/policy_asset_subtype_rules.rb index 2f6aec5f..b1ce7114 100644 --- a/spec/factories/policy_asset_subtype_rules.rb +++ b/spec/factories/policy_asset_subtype_rules.rb @@ -1,13 +1,13 @@ FactoryGirl.define do factory :policy_asset_subtype_rule do - min_service_life_months 144 - min_service_life_miles 500000 - replacement_cost 395500 - cost_fy_year 6 - replace_with_new true - replace_with_leased false - rehabilitation_code 'XXXXXXXX' - purchase_replacement_code 'XXXXXXXX' + min_service_life_months { 144 } + min_service_life_miles { 500000 } + replacement_cost { 395500 } + cost_fy_year { 6 } + replace_with_new { true } + replace_with_leased { false } + rehabilitation_code { 'XXXXXXXX' } + purchase_replacement_code { 'XXXXXXXX' } end end diff --git a/spec/factories/policy_asset_type_rules.rb b/spec/factories/policy_asset_type_rules.rb index 031d2334..dcccab31 100644 --- a/spec/factories/policy_asset_type_rules.rb +++ b/spec/factories/policy_asset_type_rules.rb @@ -1,9 +1,9 @@ FactoryGirl.define do factory :policy_asset_type_rule do - service_life_calculation_type_id 1 - replacement_cost_calculation_type_id 1 - annual_inflation_rate 1.05 - pcnt_residual_value 0.05 + service_life_calculation_type_id { 1 } + replacement_cost_calculation_type_id { 1 } + annual_inflation_rate { 1.05 } + pcnt_residual_value { 0.05 } end end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index f7e1e030..b55e4880 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -3,15 +3,15 @@ FactoryGirl.define do factory :user do - phone 999999999 - password 'Welcome1' + phone { 999999999 } + password { 'Welcome1' } association :organization, :factory => :organization - active true + active { true } factory :guest do - first_name "bob" - last_name "guest" - email 'bob@example.com' + first_name { "bob" } + last_name { "guest" } + email { 'bob@example.com' } after(:create) do |u| u.add_role :guest @@ -19,8 +19,8 @@ end factory :normal_user do - first_name "joe" - last_name "normal" + first_name { "joe" } + last_name { "normal" } sequence(:email) {|n| "joe#{n}@example.com"} after(:create) do |u| @@ -29,8 +29,8 @@ end factory :manager do - first_name "kate" - last_name "manager" + first_name { "kate" } + last_name { "manager" } sequence(:email) {|n| "kate#{n}@example.com"} after(:create) do |u| @@ -39,8 +39,8 @@ end factory :admin do - first_name "jill" - last_name "admin" + first_name { "jill" } + last_name { "admin" } sequence(:email) {|n| "jill#{n}@example.com"} after(:create) do |u| diff --git a/spec/factories/vendors.rb b/spec/factories/vendors.rb index 4d34f32f..06c067f4 100644 --- a/spec/factories/vendors.rb +++ b/spec/factories/vendors.rb @@ -1,6 +1,6 @@ FactoryGirl.define do factory :vendor do - name 'Test Vendor' + name { 'Test Vendor' } association :organization end end diff --git a/spec/models/asset_depreciable_proxy_spec.rb b/spec/models/asset_depreciable_proxy_spec.rb index a5ade6ca..da7b8c7d 100644 --- a/spec/models/asset_depreciable_proxy_spec.rb +++ b/spec/models/asset_depreciable_proxy_spec.rb @@ -6,6 +6,8 @@ let(:test_asset) { create(:buslike_asset, :expected_useful_miles => 100000) } it '.set_defaults' do + skip('Needs transam_asset. Not yet testable.') + test_proxy.set_defaults(test_asset) expect(test_proxy.object_key).to eq(test_asset.object_key) diff --git a/spec/models/asset_spec.rb b/spec/models/asset_spec.rb index 83845ef7..f4996e9f 100644 --- a/spec/models/asset_spec.rb +++ b/spec/models/asset_spec.rb @@ -6,6 +6,8 @@ RSpec.describe Asset, :type => :model do + + class TestOrg < Organization def get_policy return Policy.where("`organization_id` = ?",self.id).order('created_at').last @@ -14,18 +16,11 @@ def get_policy let(:test_asset) { create(:buslike_asset) } let(:test_gla) { create(:general_ledger_account) } - let(:test_expenditure) { create(:expenditure) } # ---------------------------------------------------------------- # Rspec for TransaamGlAccountableAsset # GLA associations with assets # ---------------------------------------------------------------- - it 'HABTM expenditures' do - test_expenditure.assets << test_asset - test_expenditure.save! - - expect(test_asset.expenditures).to include(test_expenditure) - end # ---------------------------------------------------------------- # Rspec for TransaamDepreciable @@ -53,6 +48,8 @@ def get_policy expect(test_asset.depreciation_months).to eq(123) end it '.get_depreciation_table' do + skip('Needs depreciation entries. Not yet testable.') + test_asset.update!(:asset_type => AssetType.find_by(:class_name => 'Vehicle')) create(:policy, :organization => test_asset.organization) @@ -64,6 +61,8 @@ def get_policy expect(test_table[1][:accumulated_depreciation]).to eq(test_table[0][:accumulated_depreciation]+test_table[1][:depreciated_expense]) end it '.update_book_value' do + skip('Needs depreciation entries. Not yet testable.') + test_asset.update!(:asset_type => AssetType.find_by(:class_name => 'Vehicle')) test_policy = create(:policy, :organization => test_asset.organization) diff --git a/spec/models/grant_budget_spec.rb b/spec/models/grant_budget_spec.rb index e4a2bffd..9256f377 100644 --- a/spec/models/grant_budget_spec.rb +++ b/spec/models/grant_budget_spec.rb @@ -2,11 +2,11 @@ RSpec.describe GrantBudget, :type => :model do - before(:each) do - let(:test_grant) {create(:grant)} - let(:test_gla) {create(:general_ledger_account)} - let(:test_grant_budget) {create(:grant_budget, grant: test_grant, general_ledger_account: test_gla)} - end + let(:test_grant) { + create(:grant) + } + let(:test_gla) {create(:general_ledger_account)} + let(:test_grant_budget) {create(:grant_budget, grant: test_grant, general_ledger_account: test_gla)} describe 'associations/validations' do it 'must have a GLA' do @@ -15,8 +15,8 @@ expect(test_grant_budget.valid?).to be false end it 'must have a grant' do - expect(test_grant_budget).to belong_to(:sourceable) - test_grant_budget.sourceable = nil + expect(test_grant_budget).to belong_to(:grant) + test_grant_budget.grant = nil expect(test_grant_budget.valid?).to be false end end diff --git a/spec/models/grant_purchase_spec.rb b/spec/models/grant_purchase_spec.rb index 7d8fffb8..04bb900f 100644 --- a/spec/models/grant_purchase_spec.rb +++ b/spec/models/grant_purchase_spec.rb @@ -2,7 +2,10 @@ RSpec.describe GrantPurchase, :type => :model do - let(:test_purchase) { create(:grant_purchase) } + let(:test_purchase) { + skip('Needs transam_asset. Not yet testable.') + create(:grant_purchase) + } describe 'associations' do it 'has a source' do @@ -29,14 +32,7 @@ end it '#allowable_params' do - expect(GrantPurchase.allowable_params).to eq([ - :id, - :asset_id, - :sourceable_type, - :sourceable_id, - :pcnt_purchase_cost, - :_destroy - ]) + expect(GrantPurchase.allowable_params).to eq([:id, :asset_id, :global_sourceable, :sourceable_type, :sourceable_id, :other_sourceable, :pcnt_purchase_cost, :expense_tag, :_destroy]) end it '.to_s' do diff --git a/spec/models/organization_spec.rb b/spec/models/organization_spec.rb index ccea8aaa..cd9ef2b8 100644 --- a/spec/models/organization_spec.rb +++ b/spec/models/organization_spec.rb @@ -4,9 +4,6 @@ # TransamAccountable extends associations of an organization RSpec.describe Organization, :type => :model do - it 'has many grants' do - expect(Organization.new).to have_many(:grants) - end it 'has a chart of account and thus many GLAs' do expect(Organization.new).to have_one(:chart_of_account) diff --git a/spec/models/policy_spec.rb b/spec/models/policy_spec.rb index 2dffdb5f..804919d0 100644 --- a/spec/models/policy_spec.rb +++ b/spec/models/policy_spec.rb @@ -16,7 +16,7 @@ end it 'form params' do - expect(TransamAccountingPolicy::FORM_PARAMS).to eq([ + expect(TransamAccountingPolicy::ClassMethods.allowable_params).to eq([ :depreciation_calculation_type_id, :depreciation_interval_type_id ]) diff --git a/spec/views/assets/_accounting_purchase.html.haml_spec.rb b/spec/views/assets/_accounting_purchase.html.haml_spec.rb index dd9c9567..917c9f8a 100644 --- a/spec/views/assets/_accounting_purchase.html.haml_spec.rb +++ b/spec/views/assets/_accounting_purchase.html.haml_spec.rb @@ -1,6 +1,8 @@ require 'rails_helper' describe "assets/_accounting_purchase.html.haml", :type => :view do + before { skip('Needs transam_asset. Not yet testable.') } + it 'grant purchases' do test_asset = create(:buslike_asset) test_source = create(:funding_source) diff --git a/spec/views/general_ledger_accounts/_index_actions.html.haml_spec.rb b/spec/views/general_ledger_accounts/_index_actions.html.haml_spec.rb index 15e7f457..708d99ca 100644 --- a/spec/views/general_ledger_accounts/_index_actions.html.haml_spec.rb +++ b/spec/views/general_ledger_accounts/_index_actions.html.haml_spec.rb @@ -7,7 +7,6 @@ assign(:chart_of_accounts, create(:chart_of_account)) render - expect(rendered).to have_link('Add General Ledger Account') - expect(rendered).to have_field('type') + expect(rendered).to have_link('GL Mappings') end end diff --git a/spec/views/grants/_comments.html.haml_spec.rb b/spec/views/grants/_comments.html.haml_spec.rb deleted file mode 100644 index 5d324813..00000000 --- a/spec/views/grants/_comments.html.haml_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'rails_helper' - -describe "grants/_comments.html.haml", :type => :view do - it 'no comments' do - allow(controller).to receive(:current_ability).and_return(Ability.new(create(:admin))) - assign(:grant, create(:grant)) - render - - expect(rendered).to have_content('There are no comments for this grant.') - expect(rendered).to have_field('comment_comment') - end -end diff --git a/spec/views/grants/_documents.html.haml_spec.rb b/spec/views/grants/_documents.html.haml_spec.rb deleted file mode 100644 index 46e7b099..00000000 --- a/spec/views/grants/_documents.html.haml_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'rails_helper' - -describe "grants/_documents.html.haml", :type => :view do - it 'no documents' do - allow(controller).to receive(:current_ability).and_return(Ability.new(create(:admin))) - assign(:grant, create(:grant)) - render - - expect(rendered).to have_content('There are no documents for this grant.') - expect(rendered).to have_field('document_document') - expect(rendered).to have_field('document_description') - end -end diff --git a/spec/views/grants/_index_actions.html.haml_spec.rb b/spec/views/grants/_index_actions.html.haml_spec.rb deleted file mode 100644 index c28ba4eb..00000000 --- a/spec/views/grants/_index_actions.html.haml_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'rails_helper' - -describe "grants/_index_actions.html.haml", :type => :view do - it 'actions' do - allow(controller).to receive(:current_ability).and_return(Ability.new(create(:admin))) - assign(:fiscal_years, [Date.today.year, Date.today.year+1]) - render - - expect(rendered).to have_field('sourceable_id') - expect(rendered).to have_field('fiscal_year') - end -end diff --git a/spec/views/grants/_summary.html.haml_spec.rb b/spec/views/grants/_summary.html.haml_spec.rb deleted file mode 100644 index a438e15f..00000000 --- a/spec/views/grants/_summary.html.haml_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'rails_helper' - -describe "grants/_summary.html.haml", :type => :view do - it 'info' do - allow(controller).to receive(:params).and_return({controller: 'grants'}) - test_grant = create(:grant, :fy_year => 2015) - assign(:grant, test_grant) - render - - expect(rendered).to have_content(test_grant.sourceable.to_s) - expect(rendered).to have_content('FY 15-16') - expect(rendered).to have_content('$50,000') - end -end diff --git a/test/controllers/grant_amendments_controller_test.rb b/test/controllers/grant_amendments_controller_test.rb new file mode 100644 index 00000000..7938269f --- /dev/null +++ b/test/controllers/grant_amendments_controller_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class GrantAmendmentsControllerTest < ActionDispatch::IntegrationTest + setup do + @grant_amendment = grant_amendments(:one) + end + + test "should get index" do + get grant_amendments_url + assert_response :success + end + + test "should get new" do + get new_grant_amendment_url + assert_response :success + end + + test "should create grant_amendment" do + assert_difference('GrantAmendment.count') do + post grant_amendments_url, params: { grant_amendment: { grant_id: @grant_amendment.grant_id } } + end + + assert_redirected_to grant_amendment_url(GrantAmendment.last) + end + + test "should show grant_amendment" do + get grant_amendment_url(@grant_amendment) + assert_response :success + end + + test "should get edit" do + get edit_grant_amendment_url(@grant_amendment) + assert_response :success + end + + test "should update grant_amendment" do + patch grant_amendment_url(@grant_amendment), params: { grant_amendment: { grant_id: @grant_amendment.grant_id } } + assert_redirected_to grant_amendment_url(@grant_amendment) + end + + test "should destroy grant_amendment" do + assert_difference('GrantAmendment.count', -1) do + delete grant_amendment_url(@grant_amendment) + end + + assert_redirected_to grant_amendments_url + end +end diff --git a/test/controllers/grant_apportionments_controller_test.rb b/test/controllers/grant_apportionments_controller_test.rb new file mode 100644 index 00000000..8dc6d4e1 --- /dev/null +++ b/test/controllers/grant_apportionments_controller_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class GrantApportionmentsControllerTest < ActionDispatch::IntegrationTest + setup do + @grant_apportionment = grant_apportionments(:one) + end + + test "should get index" do + get grant_apportionments_url + assert_response :success + end + + test "should get new" do + get new_grant_apportionment_url + assert_response :success + end + + test "should create grant_apportionment" do + assert_difference('GrantApportionment.count') do + post grant_apportionments_url, params: { grant_apportionment: { } } + end + + assert_redirected_to grant_apportionment_url(GrantApportionment.last) + end + + test "should show grant_apportionment" do + get grant_apportionment_url(@grant_apportionment) + assert_response :success + end + + test "should get edit" do + get edit_grant_apportionment_url(@grant_apportionment) + assert_response :success + end + + test "should update grant_apportionment" do + patch grant_apportionment_url(@grant_apportionment), params: { grant_apportionment: { } } + assert_redirected_to grant_apportionment_url(@grant_apportionment) + end + + test "should destroy grant_apportionment" do + assert_difference('GrantApportionment.count', -1) do + delete grant_apportionment_url(@grant_apportionment) + end + + assert_redirected_to grant_apportionments_url + end +end diff --git a/test/fixtures/grant_amendments.yml b/test/fixtures/grant_amendments.yml new file mode 100644 index 00000000..8a5a39ee --- /dev/null +++ b/test/fixtures/grant_amendments.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + grant: one + +two: + grant: two diff --git a/test/fixtures/grant_apportionments.yml b/test/fixtures/grant_apportionments.yml new file mode 100644 index 00000000..80aed36e --- /dev/null +++ b/test/fixtures/grant_apportionments.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/grant_amendment_test.rb b/test/models/grant_amendment_test.rb new file mode 100644 index 00000000..53599b5a --- /dev/null +++ b/test/models/grant_amendment_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class GrantAmendmentTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/grant_apportionment_test.rb b/test/models/grant_apportionment_test.rb new file mode 100644 index 00000000..0828c2c5 --- /dev/null +++ b/test/models/grant_apportionment_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class GrantApportionmentTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/system/grant_amendments_test.rb b/test/system/grant_amendments_test.rb new file mode 100644 index 00000000..91c2db6b --- /dev/null +++ b/test/system/grant_amendments_test.rb @@ -0,0 +1,43 @@ +require "application_system_test_case" + +class GrantAmendmentsTest < ApplicationSystemTestCase + setup do + @grant_amendment = grant_amendments(:one) + end + + test "visiting the index" do + visit grant_amendments_url + assert_selector "h1", text: "Grant Amendments" + end + + test "creating a Grant amendment" do + visit grant_amendments_url + click_on "New Grant Amendment" + + fill_in "Grant", with: @grant_amendment.grant_id + click_on "Create Grant amendment" + + assert_text "Grant amendment was successfully created" + click_on "Back" + end + + test "updating a Grant amendment" do + visit grant_amendments_url + click_on "Edit", match: :first + + fill_in "Grant", with: @grant_amendment.grant_id + click_on "Update Grant amendment" + + assert_text "Grant amendment was successfully updated" + click_on "Back" + end + + test "destroying a Grant amendment" do + visit grant_amendments_url + page.accept_confirm do + click_on "Destroy", match: :first + end + + assert_text "Grant amendment was successfully destroyed" + end +end diff --git a/test/system/grant_apportionments_test.rb b/test/system/grant_apportionments_test.rb new file mode 100644 index 00000000..d6138729 --- /dev/null +++ b/test/system/grant_apportionments_test.rb @@ -0,0 +1,41 @@ +require "application_system_test_case" + +class GrantApportionmentsTest < ApplicationSystemTestCase + setup do + @grant_apportionment = grant_apportionments(:one) + end + + test "visiting the index" do + visit grant_apportionments_url + assert_selector "h1", text: "Grant Apportionments" + end + + test "creating a Grant apportionment" do + visit grant_apportionments_url + click_on "New Grant Apportionment" + + click_on "Create Grant apportionment" + + assert_text "Grant apportionment was successfully created" + click_on "Back" + end + + test "updating a Grant apportionment" do + visit grant_apportionments_url + click_on "Edit", match: :first + + click_on "Update Grant apportionment" + + assert_text "Grant apportionment was successfully updated" + click_on "Back" + end + + test "destroying a Grant apportionment" do + visit grant_apportionments_url + page.accept_confirm do + click_on "Destroy", match: :first + end + + assert_text "Grant apportionment was successfully destroyed" + end +end