class BscPlugin::Contract < Noosfero::Plugin::ActiveRecord validates_presence_of :bsc, :client_name has_many :sales, :class_name => 'BscPlugin::Sale' has_many :products, :through => :sales has_and_belongs_to_many :enterprises, :join_table => 'bsc_plugin_contracts_enterprises' belongs_to :bsc, :class_name => 'BscPlugin::Bsc' named_scope :status, lambda { |status_list| status_list.blank? ? {} : {:conditions => ['status in (?)', status_list]} } named_scope :sorted_by, lambda { |sorter, direction| {:order => "#{sorter} #{direction}"} } before_create do |contract| contract.created_at ||= Time.now.utc contract.updated_at ||= Time.now.utc end before_update do |contract| contract.updated_at ||= Time.now.utc end module Status OPENED = 0 NEGOTIATING = 1 EXECUTING = 2 CLOSED = 3 def self.types [OPENED, NEGOTIATING, EXECUTING, CLOSED] end def self.names [_('Opened'), _('Negotiating'), _('Executing'), _('Closed')] end end module ClientType STATE = 0 FEDERAL = 1 def self.types [STATE, FEDERAL] end def self.names [_('State'), _('Federal')] end end module BusinessType PROJECTA = 0 PROJECTB = 1 def self.types [PROJECTA, PROJECTB] end def self.names [_('ProjectA'), _('ProjectB')] end end def enterprises_to_token_input enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} } end def save_sales(sales) failed_sales = {} sales.each do |sale| sale.merge!({:contract_id => id}) begin BscPlugin::Sale.create!(sale) rescue Exception => exception name = Product.find(sale[:product_id]).name failed_sales[exception.clean_message] ? failed_sales[exception.clean_message] << name : failed_sales[exception.clean_message] = [name] end end failed_sales end def total_price sales.inject(0) {|result, sale| sale.price*sale.quantity + result} end end