Commit df887fc89812b073b83e3a66331998cd47ab609e

Authored by Joenio Costa
2 parents 9dae005f 7e7227c0

Merge commit 'refs/merge-requests/71' of git://gitorious.org/noosfero/noosfero

Showing 36 changed files with 1353 additions and 124 deletions   Show diff stats
app/helpers/dates_helper.rb
... ... @@ -42,11 +42,11 @@ module DatesHelper
42 42 end
43 43 end
44 44  
45   - def show_period(date1, date2 = nil)
  45 + def show_period(date1, date2 = nil, use_numbers = false)
46 46 if (date1 == date2) || (date2.nil?)
47   - show_date(date1)
  47 + show_date(date1, use_numbers)
48 48 else
49   - _('from %{date1} to %{date2}') % {:date1 => show_date(date1), :date2 => show_date(date2)}
  49 + _('from %{date1} to %{date2}') % {:date1 => show_date(date1, use_numbers), :date2 => show_date(date2, use_numbers)}
50 50 end
51 51 end
52 52  
... ...
plugins/bsc/controllers/bsc_plugin_environment_controller.rb
  1 +include BscPlugin::BscHelper
  2 +
1 3 class BscPluginEnvironmentController < AdminController
2 4  
3 5 def new
... ...
plugins/bsc/controllers/bsc_plugin_myprofile_controller.rb
  1 +include BscPlugin::BscHelper
  2 +
1 3 class BscPluginMyprofileController < MyProfileController
2 4  
3 5 def manage_associated_enterprises
... ... @@ -85,4 +87,129 @@ class BscPluginMyprofileController &lt; MyProfileController
85 87 end
86 88 end
87 89  
  90 + def manage_contracts
  91 + self.class.no_design_blocks
  92 + @sorting = params[:sorting] || 'created_at asc'
  93 + sorted_by = @sorting.split(' ').first
  94 + sort_direction = @sorting.split(' ').last
  95 + @status = params[:status] || BscPlugin::Contract::Status.types.map { |s| s.to_s }
  96 + @contracts = profile.contracts.
  97 + status(@status).
  98 + sorted_by(sorted_by, sort_direction).
  99 + paginate(:per_page => contracts_per_page, :page => params[:page])
  100 + end
  101 +
  102 + def new_contract
  103 + if !request.post?
  104 + @contract = BscPlugin::Contract.new
  105 + else
  106 + @contract = BscPlugin::Contract.new(params[:contract])
  107 + @contract.bsc = profile
  108 + sales = params[:sales] ? params[:sales].map {|key, value| value} : []
  109 + sales.reject! {|sale| sale[:product_id].blank?}
  110 +
  111 + if @contract.save!
  112 + enterprises_ids = params[:enterprises] || ''
  113 + enterprises_ids.split(',').each { |id| @contract.enterprises << Enterprise.find(id) }
  114 + @failed_sales = @contract.save_sales(sales)
  115 +
  116 + if @failed_sales.blank?
  117 + session[:notice] = _('Contract created.')
  118 + redirect_to :action => 'manage_contracts'
  119 + else
  120 + session[:notice] = _('Contract created but some products could not be added.')
  121 + redirect_to :action => 'edit_contract', :contract_id => @contract.id
  122 + end
  123 + end
  124 + end
  125 + end
  126 +
  127 + def view_contract
  128 + begin
  129 + @contract = BscPlugin::Contract.find(params[:contract_id])
  130 + rescue
  131 + session[:notice] = _('Contract doesn\'t exists! Maybe it was already removed.')
  132 + redirect_to :action => 'manage_contracts'
  133 + end
  134 + end
  135 +
  136 + def edit_contract
  137 + begin
  138 + @contract = BscPlugin::Contract.find(params[:contract_id])
  139 + rescue
  140 + session[:notice] = _('Could not edit such contract.')
  141 + redirect_to :action => 'manage_contracts'
  142 + end
  143 + if request.post? && @contract.update_attributes(params[:contract])
  144 +
  145 + # updating associated enterprises
  146 + enterprises_ids = params[:enterprises] || ''
  147 + enterprises = [Enterprise.find(enterprises_ids.split(','))].flatten
  148 + to_remove = @contract.enterprises - enterprises
  149 + to_add = enterprises - @contract.enterprises
  150 + to_remove.each { |enterprise| @contract.enterprises.delete(enterprise)}
  151 + to_add.each { |enterprise| @contract.enterprises << enterprise }
  152 +
  153 + # updating sales
  154 + sales = params[:sales] ? params[:sales].map {|key, value| value} : []
  155 + sales.reject! {|sale| sale[:product_id].blank?}
  156 + products = [Product.find(sales.map { |sale| sale[:product_id] })].flatten
  157 + to_remove = @contract.products - products
  158 + to_keep = sales.select { |sale| @contract.products.include?(Product.find(sale[:product_id])) }
  159 +
  160 + to_keep.each do |sale_attrs|
  161 + sale = @contract.sales.find_by_product_id(sale_attrs[:product_id])
  162 + sale.update_attributes!(sale_attrs)
  163 + sales.delete(sale_attrs)
  164 + end
  165 +
  166 + to_remove.each { |product| @contract.sales.find_by_product_id(product.id).destroy }
  167 + @failed_sales = @contract.save_sales(sales)
  168 +
  169 + if @failed_sales.blank?
  170 + session[:notice] = _('Contract edited.')
  171 + redirect_to :action => 'manage_contracts'
  172 + else
  173 + session[:notice] = _('Contract edited but some products could not be added.')
  174 + redirect_to :action => 'edit_contract', :contract_id => @contract.id
  175 + end
  176 + end
  177 + end
  178 +
  179 + def destroy_contract
  180 + begin
  181 + contract = BscPlugin::Contract.find(params[:contract_id])
  182 + contract.destroy
  183 + session[:notice] = _('Contract removed.')
  184 + rescue
  185 + session[:notice] = _('Contract could not be removed. Sorry! ^^')
  186 + end
  187 + redirect_to :action => 'manage_contracts'
  188 + end
  189 +
  190 + def search_contract_enterprises
  191 + render :text => profile.enterprises.find(:all, :conditions => ["(LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?)", "%#{params[:enterprises]}%", "%#{params[:enterprises]}%"]).
  192 + map {|enterprise| {:id => enterprise.id, :name => enterprise.short_name(60)} }.
  193 + to_json
  194 + end
  195 +
  196 + def search_sale_product
  197 + query = params[:sales].map {|key, value| value}[0][:product_id]
  198 + enterprises = (params[:enterprises] || []).split(',')
  199 + enterprises = enterprises.blank? ? -1 : enterprises
  200 + added_products = (params[:added_products] || []).split(',')
  201 + added_products = added_products.blank? ? -1 : added_products
  202 + render :text => Product.find(:all, :conditions => ["LOWER(name) LIKE ? AND enterprise_id IN (?) AND id NOT IN (?)", "%#{query}%", enterprises, added_products]).
  203 + map {|product| { :id => product.id,
  204 + :name => short_text(product_display_name(product), 60),
  205 + :sale_id => params[:sale_id],
  206 + :product_price => product.price || 0 }}.
  207 + to_json
  208 + end
  209 +
  210 + private
  211 +
  212 + def contracts_per_page
  213 + 15
  214 + end
88 215 end
... ...
plugins/bsc/db/migrate/20111018201143_create_bsc_plugin_sale.rb 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +class CreateBscPluginSale < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :bsc_plugin_sales do |t|
  4 + t.references :product, :null => false
  5 + t.references :contract, :null => false
  6 + t.integer :quantity, :null => false
  7 + t.decimal :price
  8 + t.timestamps
  9 + end
  10 + end
  11 +
  12 + def self.down
  13 + drop_table :bsc_plugin_sales
  14 + end
  15 +end
... ...
plugins/bsc/db/migrate/20111018201220_create_bsc_plugin_contracts_enterprises.rb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +class CreateBscPluginContractsEnterprises < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :bsc_plugin_contracts_enterprises, :id => false do |t|
  4 + t.references :contract
  5 + t.references :enterprise
  6 + end
  7 + end
  8 +
  9 + def self.down
  10 + drop_table :bsc_plugin_contracts_enterprises
  11 + end
  12 +end
... ...
plugins/bsc/db/migrate/20111018201239_create_bsc_plugin_contract.rb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class CreateBscPluginContract < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :bsc_plugin_contracts do |t|
  4 + t.string :client_name
  5 + t.integer :client_type
  6 + t.integer :business_type
  7 + t.string :state
  8 + t.string :city
  9 + t.integer :status, :default => 0
  10 + t.integer :number_of_producers, :default => 0
  11 + t.datetime :supply_start
  12 + t.datetime :supply_end
  13 + t.text :annotations
  14 + t.references :bsc
  15 + t.timestamps
  16 + end
  17 + end
  18 +
  19 + def self.down
  20 + drop_table :bsc_plugin_contracts
  21 + end
  22 +end
... ...
plugins/bsc/lib/bsc_plugin.rb
... ... @@ -22,6 +22,7 @@ class BscPlugin &lt; Noosfero::Plugin
22 22 buttons = []
23 23 buttons << {:title => _("Manage associated enterprises"), :icon => 'bsc-enterprises', :url => {:controller => 'bsc_plugin_myprofile', :action => 'manage_associated_enterprises'}} if bsc?(context.profile)
24 24 buttons << {:title => _('Transfer ownership'), :icon => 'transfer-enterprise-ownership', :url => {:controller => 'bsc_plugin_myprofile', :action => 'transfer_ownership'}} if context.profile.enterprise?
  25 + buttons << {:title => _("Manage contracts"), :icon => '', :url => {:controller => 'bsc_plugin_myprofile', :action => 'manage_contracts'}} if bsc?(context.profile)
25 26 buttons
26 27 end
27 28  
... ...
plugins/bsc/lib/bsc_plugin/bsc.rb
... ... @@ -3,6 +3,7 @@ class BscPlugin::Bsc &lt; Enterprise
3 3 has_many :enterprises
4 4 has_many :enterprise_requests, :class_name => 'BscPlugin::AssociateEnterprise'
5 5 has_many :products, :finder_sql => 'select * from products where enterprise_id in (#{enterprises.map(&:id).join(",")})'
  6 + has_many :contracts, :class_name => 'BscPlugin::Contract'
6 7  
7 8 validates_presence_of :nickname
8 9 validates_presence_of :company_name
... ... @@ -19,8 +20,8 @@ class BscPlugin::Bsc &lt; Enterprise
19 20 enterprise_requests.pending.map(&:enterprise).include?(enterprise)
20 21 end
21 22  
22   - def enterprises_to_json
23   - enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} }.to_json
  23 + def enterprises_to_token_input
  24 + enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} }
24 25 end
25 26  
26 27 def control_panel_settings_button
... ...
plugins/bsc/lib/bsc_plugin/bsc_helper.rb 0 → 100644
... ... @@ -0,0 +1,75 @@
  1 +module BscPlugin::BscHelper
  2 + include ActionView::Helpers::FormTagHelper
  3 +
  4 + def token_input_field_tag(name, element_id, search_action, options = {}, text_field_options = {}, html_options = {})
  5 + options[:min_chars] ||= 3
  6 + options[:hint_text] ||= _("Type in a search term")
  7 + options[:no_results_text] ||= _("No results")
  8 + options[:searching_text] ||= _("Searching...")
  9 + options[:search_delay] ||= 1000
  10 + options[:prevent_duplicates] ||= true
  11 + options[:backspace_delete_item] ||= false
  12 + options[:focus] ||= false
  13 + options[:avoid_enter] ||= true
  14 + options[:on_result] ||= 'null'
  15 + options[:on_add] ||= 'null'
  16 + options[:on_delete] ||= 'null'
  17 + options[:on_ready] ||= 'null'
  18 +
  19 + result = text_field_tag(name, nil, text_field_options.merge(html_options.merge({:id => element_id})))
  20 + result +=
  21 + "
  22 + <script type='text/javascript'>
  23 + jQuery('##{element_id}')
  24 + .tokenInput('#{url_for(search_action)}', {
  25 + minChars: #{options[:min_chars].to_json},
  26 + prePopulate: #{options[:pre_populate].to_json},
  27 + hintText: #{options[:hint_text].to_json},
  28 + noResultsText: #{options[:no_results_text].to_json},
  29 + searchingText: #{options[:searching_text].to_json},
  30 + searchDelay: #{options[:serach_delay].to_json},
  31 + preventDuplicates: #{options[:prevent_duplicates].to_json},
  32 + backspaceDeleteItem: #{options[:backspace_delete_item].to_json},
  33 + queryParam: #{name.to_json},
  34 + tokenLimit: #{options[:token_limit].to_json},
  35 + onResult: #{options[:on_result]},
  36 + onAdd: #{options[:on_add]},
  37 + onDelete: #{options[:on_delete]},
  38 + onReady: #{options[:on_ready]},
  39 + })
  40 + "
  41 + result += options[:focus] ? ".focus();" : ";"
  42 + if options[:avoid_enter]
  43 + result += "jQuery('#token-input-#{element_id}')
  44 + .live('keydown', function(event){
  45 + if(event.keyCode == '13') return false;
  46 + });"
  47 + end
  48 + result += "</script>"
  49 + result
  50 + end
  51 +
  52 + def product_display_name(product)
  53 + "#{product.name} (#{product.enterprise.name})"
  54 + end
  55 +
  56 + def display_text_field(name, value, options={:display_nil => false, :nil_symbol => '---'})
  57 + value = value.to_s
  58 + if !value.blank? || options[:display_nil]
  59 + value = value.blank? ? options[:nil_symbol] : value
  60 + content_tag('tr', content_tag('td', name+': ', :class => 'bsc-field-label') + content_tag('td', value, :class => 'bsc-field-value'))
  61 + end
  62 + end
  63 +
  64 + def display_list_field(list, options={:nil_symbol => '---'})
  65 + list.map do |item|
  66 + item = item.blank? ? options[:nil_symbol] : item
  67 + content_tag('tr', content_tag('td', item, :class => 'bsc-field-value'))
  68 + end.join
  69 + end
  70 +
  71 + def short_text(name, chars = 40)
  72 + truncate name, chars, '...'
  73 + end
  74 +
  75 +end
... ...
plugins/bsc/lib/bsc_plugin/contract.rb 0 → 100644
... ... @@ -0,0 +1,84 @@
  1 +class BscPlugin::Contract < Noosfero::Plugin::ActiveRecord
  2 + validates_presence_of :bsc, :client_name
  3 +
  4 + has_many :sales, :class_name => 'BscPlugin::Sale'
  5 + has_many :products, :through => :sales
  6 + has_and_belongs_to_many :enterprises, :join_table => 'bsc_plugin_contracts_enterprises'
  7 +
  8 + belongs_to :bsc, :class_name => 'BscPlugin::Bsc'
  9 +
  10 + named_scope :status, lambda { |status_list| status_list.blank? ? {} : {:conditions => ['status in (?)', status_list]} }
  11 + named_scope :sorted_by, lambda { |sorter, direction| {:order => "#{sorter} #{direction}"} }
  12 +
  13 + before_create do |contract|
  14 + contract.created_at ||= Time.now.utc
  15 + contract.updated_at ||= Time.now.utc
  16 + end
  17 +
  18 + before_update do |contract|
  19 + contract.updated_at ||= Time.now.utc
  20 + end
  21 +
  22 + module Status
  23 + OPENED = 0
  24 + NEGOTIATING = 1
  25 + EXECUTING = 2
  26 + CLOSED = 3
  27 +
  28 + def self.types
  29 + [OPENED, NEGOTIATING, EXECUTING, CLOSED]
  30 + end
  31 +
  32 + def self.names
  33 + [_('Opened'), _('Negotiating'), _('Executing'), _('Closed')]
  34 + end
  35 + end
  36 +
  37 + module ClientType
  38 + STATE = 0
  39 + FEDERAL = 1
  40 +
  41 + def self.types
  42 + [STATE, FEDERAL]
  43 + end
  44 +
  45 + def self.names
  46 + [_('State'), _('Federal')]
  47 + end
  48 + end
  49 +
  50 + module BusinessType
  51 + PROJECTA = 0
  52 + PROJECTB = 1
  53 +
  54 + def self.types
  55 + [PROJECTA, PROJECTB]
  56 + end
  57 +
  58 + def self.names
  59 + [_('ProjectA'), _('ProjectB')]
  60 + end
  61 + end
  62 +
  63 + def enterprises_to_token_input
  64 + enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} }
  65 + end
  66 +
  67 + def save_sales(sales)
  68 + failed_sales = {}
  69 + sales.each do |sale|
  70 + sale.merge!({:contract_id => id})
  71 + begin
  72 + BscPlugin::Sale.create!(sale)
  73 + rescue Exception => exception
  74 + name = Product.find(sale[:product_id]).name
  75 + failed_sales[exception.clean_message] ? failed_sales[exception.clean_message] << name : failed_sales[exception.clean_message] = [name]
  76 + end
  77 + end
  78 + failed_sales
  79 + end
  80 +
  81 + def total_price
  82 + sales.inject(0) {|result, sale| sale.price*sale.quantity + result}
  83 + end
  84 +end
... ...
plugins/bsc/lib/bsc_plugin/sale.rb 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +class BscPlugin::Sale < Noosfero::Plugin::ActiveRecord
  2 + validates_presence_of :product, :contract
  3 + validates_uniqueness_of :product_id, :scope => :contract_id
  4 + validates_numericality_of :quantity, :only_integer => true, :greater_than_or_equal_to => 0
  5 + validates_numericality_of :price, :allow_nil => true
  6 +
  7 + belongs_to :product
  8 + belongs_to :contract, :class_name => 'BscPlugin::Contract'
  9 +
  10 + before_create do |sale|
  11 + sale.price ||= sale.product.price || 0
  12 + sale.created_at ||= Time.now.utc
  13 + sale.updated_at ||= Time.now.utc
  14 + end
  15 +
  16 + before_update do |contract|
  17 + contract.updated_at ||= Time.now.utc
  18 + end
  19 +end
... ...
plugins/bsc/lib/ext/enterprise.rb
... ... @@ -2,6 +2,8 @@ require_dependency &#39;enterprise&#39;
2 2  
3 3 class Enterprise
4 4 belongs_to :bsc, :class_name => 'BscPlugin::Bsc'
  5 + has_and_belongs_to_many :contracts, :class_name => 'BscPlugin::Contract', :join_table => 'bsc_plugin_contracts_enterprises'
  6 +
5 7 FIELDS << 'bsc_id'
6 8 FIELDS << 'enabled'
7 9 FIELDS << 'validated'
... ...
plugins/bsc/lib/ext/product.rb
1 1 require_dependency 'product'
2 2  
3 3 class Product
  4 +
  5 + has_many :sales, :class_name => 'BscPlugin::Sale'
  6 + has_many :contracts, :through => :sales, :class_name => 'BscPlugin::Contract'
  7 +
4 8 def bsc
5 9 enterprise.bsc if enterprise
6 10 end
... ...
plugins/bsc/public/contracts.js 0 → 100644
... ... @@ -0,0 +1,86 @@
  1 +var BSCContracts = {};
  2 +
  3 +(function($){
  4 + BSCContracts.onDelete = function(item){
  5 + $('.token-input-dropdown').hide();
  6 + $('#bsc-plugin-row-'+item.sale_id.toString()).remove();
  7 + BSCContracts.updateTotal();
  8 + };
  9 +
  10 + BSCContracts.onAdd = function(item){
  11 + var quantity = $('#bsc-plugin-sale-'+item.sale_id.toString()+'-quantity');
  12 + var price = $('#bsc-plugin-sale-'+item.sale_id.toString()+'-price');
  13 + quantity.addClass('required');
  14 + price.addClass('required');
  15 + quantity.val(1);
  16 + price.val(item.product_price);
  17 + BSCContracts.updateTotal();
  18 + };
  19 +
  20 + BSCContracts.newID = function(){
  21 + if ( !this.idNum ) this.idNum = 0;
  22 + return this.idNum++;
  23 + };
  24 +
  25 + BSCContracts.newProductLine = function(item){
  26 + var id = this.newID();
  27 + var tr = $('<tr class="bsc-plugin-sales-product" id="bsc-plugin-row-'+id+'"></tr>');
  28 + var tds = $('<td></td><td></td><td>'+this.currencyUnit+'</td>').appendTo(tr);
  29 + var input = $('<input name="sales['+id+'][product_id]" class="search-product-field"/>').appendTo(tds[0]);
  30 + var searchUrl = this.searchUrl
  31 + .replace('ENTERPRISES', $('#involved-enterprises').val())
  32 + .replace('SALE_ID', id)
  33 + .replace('ADDED_PRODUCTS', $.map($('.search-product-field'), function(item){return item.value}).join(','));
  34 + var prePopulation = [];
  35 + var quantity = '';
  36 + var price = '';
  37 + var required = '';
  38 + if(item) {
  39 + item.sale_id = id;
  40 + prePopulation = [item];
  41 + quantity = item.quantity;
  42 + price = item.product_price;
  43 + required = 'required';
  44 + }
  45 + var opts = $.extend( { prePopulate: prePopulation, queryParam: input[0].name }, this.tokenInputOptions );
  46 +
  47 + input.keydown(function(event){ if(event.keyCode == '13') return false })
  48 + .tokenInput(searchUrl, opts);
  49 + $('#bsc-plugin-contract-total-row').before(tr);
  50 + $('<input id="bsc-plugin-sale-'+id+'-quantity" class="bsc-plugin-sales-quantity '+required+' digits" name="sales['+id+'][quantity]" align="center" size="8" value="'+quantity+'"/>').appendTo(tds[1]);
  51 + $('<input id="bsc-plugin-sale-'+id+'-price" class="bsc-plugin-sales-price '+required+' number" name="sales['+id+'][price]" value="'+price+'"/>').appendTo(tds[2]);
  52 + };
  53 +
  54 + BSCContracts.prePopulate = function(items){
  55 + $(items).each(function(index, item){BSCContracts.newProductLine(item)});
  56 + }
  57 +
  58 + BSCContracts.updateTotal = function(){
  59 + var total = 0;
  60 + var quantity = 0;
  61 + var price = 0;
  62 + $('.bsc-plugin-sales-product').each(function(index){
  63 + quantity = $('#' + $(this).attr('id') + " .bsc-plugin-sales-quantity").val();
  64 + price = $('#'+$(this).attr('id') + " .bsc-plugin-sales-price").val();
  65 + total += quantity*price;
  66 + });
  67 + $('#bsc-plugin-sales-total-value').text(BSCContracts.currencyUnit+' '+total);
  68 + }
  69 +
  70 + $(".bsc-plugin-sales-price, .bsc-plugin-sales-quantity").live('change', function(e){
  71 + BSCContracts.updateTotal();
  72 + });
  73 +
  74 + $("#bsc-plugin-add-new-product").click(function(){
  75 + var last = $('.search-product-field:last');
  76 + if(!last.val() && last.size() != 0){
  77 + last.focus();
  78 + return false;
  79 + }
  80 + var next_id = parseInt(last.attr('data-sale-id'))+1;
  81 + var enterprises = $('#involved-enterprises').val().replace(/,/g,'-');
  82 + BSCContracts.newProductLine();
  83 + return false;
  84 + });
  85 +
  86 +})(jQuery);
... ...
plugins/bsc/public/datepicker.js 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +var dates = jQuery( "#from, #to" ).datepicker({
  2 + defaultDate: "+1w",
  3 + changeMonth: true,
  4 + dateFormat: 'yy-mm-dd',
  5 + onSelect: function( selectedDate ) {
  6 + var option = this.id == "from" ? "minDate" : "maxDate",
  7 + instance = jQuery( this ).data( "datepicker" ),
  8 + date = jQuery.datepicker.parseDate(
  9 + instance.settings.dateFormat ||
  10 + jQuery.datepicker._defaults.dateFormat,
  11 + selectedDate, instance.settings );
  12 + dates.not( this ).datepicker( "option", option, date );
  13 + }
  14 +});
... ...
plugins/bsc/public/jquery.ui.spinner 0 → 160000
... ... @@ -0,0 +1 @@
  1 +Subproject commit bd879003043b4a93b78cbd4a582b6e0650900bcb
... ...
plugins/bsc/public/spinner.js 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +jQuery('#bsc-plugin-contract-spinner').spinner({
  2 + min: 0,
  3 + increment: 'fast',
  4 + mouseWheel: true,
  5 +});
... ...
plugins/bsc/public/style.css
  1 +@import url(jquery.ui.spinner/ui.spinner.css);
  2 +
1 3 .controller-profile_editor a.control-panel-bsc-enterprises {background-image: url(images/manage-bsc-enterprises.png)}
2 4 .controller-profile_editor .msie6 a.control-panel-bsc-enterprises {background-image: url(images/manage-bsc-enterprises.gif)}
3 5  
4 6 .controller-profile_editor a.control-panel-transfer-enterprise-ownership {background-image: url(images/transfer-ownership.png)}
5 7  
  8 +.ui-spinner-up{
  9 + height: 6.5px !important;
  10 +}
  11 +
  12 +.ui-spinner-down{
  13 + height: 8.5px !important;
  14 +}
  15 +
  16 +.ui-icon-triangle-1-n {
  17 + margin-top: -4px !important;
  18 +}
  19 +
  20 +.ui-icon-triangle-1-s {
  21 + margin-left: -1px !important;
  22 + margin-top: -3.5px !important;
  23 +}
  24 +
6 25 .icon-menu-bsc {
7 26 background-image: url(images/manage-bsc-enterprises-icon.png);
8 27 }
... ... @@ -10,3 +29,154 @@
10 29 #content .token-input-list {
11 30 margin-bottom: 30px;
12 31 }
  32 +
  33 +#bsc-plugin-sorter {
  34 + text-align: right;
  35 + margin: 3px 0px;
  36 +}
  37 +
  38 +#bsc-plugin-sales-table th,
  39 +#bsc-plugin-sales-table td {
  40 + border: 1px solid #000;
  41 + border-collapse: collapse;
  42 + padding: 0px
  43 +}
  44 +
  45 +#content #bsc-plugin-sales-table td .token-input-list{
  46 + margin-bottom: 0px;
  47 +}
  48 +
  49 +#bsc-plugin-sales-table {
  50 + border: 1px solid #000;
  51 + border-collapse: collapse;
  52 +}
  53 +
  54 +#bsc-plugin-sales-table th {
  55 + background-color: #cdcdcd;
  56 + padding: 0px 10px;
  57 +}
  58 +
  59 +.alternate-colors tr:nth-child(odd),
  60 +.alternate-colors tr:nth-child(odd):hover td {
  61 + background-color: #f4f4f4;
  62 +}
  63 +
  64 +.alternate-colors tr:nth-child(even),
  65 +.alternate-colors tr:nth-child(even):hover td {
  66 + background-color: #fff;
  67 +}
  68 +
  69 +#bsc-plugin-sales-table input.error{
  70 + background-color: #F8DBDD;
  71 + border: 1px solid #f5697c;
  72 + margin-left: 2px;
  73 +}
  74 +
  75 +.bsc-plugin-sales-price {
  76 + width: 75%;
  77 +}
  78 +
  79 +.bsc-plugin-sales-products-column {
  80 + width: 70%;
  81 +}
  82 +
  83 +.bsc-plugin-sales-quantity-column {
  84 + width: 10%;
  85 + text-align: center;
  86 +}
  87 +
  88 +.bsc-plugin-sales-price-column {
  89 + width: 18%;
  90 +}
  91 +
  92 +#bsc-plugin-sales-add-new-row {
  93 + padding: 0px 10px;
  94 +}
  95 +
  96 +#bsc-plugin-manage-contracts-table a {
  97 + color: #555753;
  98 +}
  99 +
  100 +#bsc-plugin-manage-contracts-table {
  101 + border:none;
  102 +}
  103 +#bsc-plugin-manage-contracts-table td {
  104 + padding: 5px 10px;
  105 +}
  106 +
  107 +#bsc-plugin-manage-contracts-table td.links {
  108 + text-align: right;
  109 +}
  110 +
  111 +#bsc-plugin-contracts-filter {
  112 + float: left;
  113 + width: 20%;
  114 + height: 100%;
  115 +}
  116 +
  117 +
  118 +#bsc-plugin-contracts-results {
  119 + float: left;
  120 + width: 80%;
  121 +}
  122 +
  123 +#bsc-plugin-contract-total-string,
  124 +#bsc-plugin-contract-total {
  125 + text-align: right;
  126 +}
  127 +
  128 +.bsc-fields-table {
  129 + border: collapse;
  130 + width: 49%;
  131 +}
  132 +
  133 +.bsc-fields-table th{
  134 + font-size: 14px;
  135 + padding: 0px;
  136 +}
  137 +
  138 +.bsc-fields-table td {
  139 + border: none;
  140 + padding: 0px;
  141 +}
  142 +
  143 +.bsc-fields-table tr:hover td {
  144 + background-color: transparent;
  145 +}
  146 +
  147 +.bsc-field-label {
  148 + font-weight: bold;
  149 +}
  150 +
  151 +.bsc-full-table {
  152 + margin: 3px 0px;
  153 +}
  154 +
  155 +.bsc-plugin-view-contract {
  156 + margin-top: 10px;
  157 +}
  158 +
  159 +.bsc-plugin-view-contract td {
  160 + padding: 2px 10px !important;
  161 +}
  162 +
  163 +.bsc-plugin-total {
  164 + font-weight: bold;
  165 +}
  166 +
  167 +.bsc-plugin-annotation {
  168 + background-color: #eeeeec;
  169 + margin: 10px 0px;
  170 + padding: 5px 10px;
  171 + border-radius: 5px;
  172 +}
  173 +
  174 +.bsc-plugin-annotation-title {
  175 + font-weight: bold;
  176 + font-size: 15px;
  177 + margin-bottom: 5px;
  178 +}
  179 +
  180 +.bsc-plugin-annotation-content {
  181 + font-style: italic;
  182 +}
... ...
plugins/bsc/public/validation.js 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 +jQuery("#bsc-plugin-sales-form").validate({
  2 + errorPlacement: function(error, element){element.attr('title', error.text())}
  3 +});
  4 +
... ...
plugins/bsc/test/features/contract.feature 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +Feature: Bsc contract
  2 +As a Bsc admin
  3 +I would like to register a contract
  4 +In order to make negotiations
  5 +
  6 + Background:
  7 + Given "Bsc" plugin is enabled
  8 + And the folllowing "bsc" from "bsc_plugin"
  9 + | business_name | identifier | company_name | cnpj |
  10 + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 |
  11 + And I am logged in as admin
  12 +
  13 + Scenario: be able see the manage contracts button only if the profile is a Bsc
  14 + Given the following community
  15 + | name | identifier |
  16 + | Sample Community | sample-community |
  17 + When I am on Sample Community's control panel
  18 + Then I should not see "Manage contracts"
  19 + But I am on Bsc Test's control panel
  20 + Then I should see "Manage contracts"
  21 +
... ...
plugins/bsc/test/functional/bsc_plugin_myprofile_controller_test.rb
... ... @@ -40,7 +40,7 @@ class BscPluginMyprofileControllerTest &lt; Test::Unit::TestCase
40 40 e6 = Enterprise.create!(:name => 'Bla', :identifier => 'sample-enterprise-6')
41 41  
42 42 get :search_enterprise, :profile => bsc.identifier, :q => 'sampl'
43   -
  43 +
44 44 assert_match /#{e1.name}/, @response.body
45 45 assert_match /#{e2.name}/, @response.body
46 46 assert_no_match /#{e3.name}/, @response.body
... ... @@ -108,5 +108,204 @@ class BscPluginMyprofileControllerTest &lt; Test::Unit::TestCase
108 108 assert_equal enterprise.bsc, bsc
109 109 end
110 110  
  111 + should 'fecth contracts filtered by status' do
  112 + contract0 = BscPlugin::Contract.create!(:bsc => bsc, :status => 0, :client_name => 'Marvin')
  113 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :status => 1, :client_name => 'Marvin')
  114 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :status => 2, :client_name => 'Marvin')
  115 + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :status => 3, :client_name => 'Marvin')
  116 +
  117 + get :manage_contracts, :profile => bsc.identifier, :status => ['1', '3']
  118 +
  119 + assert_not_includes assigns(:contracts), contract0
  120 + assert_includes assigns(:contracts), contract1
  121 + assert_not_includes assigns(:contracts), contract2
  122 + assert_includes assigns(:contracts), contract3
  123 + end
  124 +
  125 + should 'manage contracts should have all status marked by default' do
  126 + get :manage_contracts, :profile => bsc.identifier
  127 + assert_equal assigns(:status), BscPlugin::Contract::Status.types.map { |s| s.to_s }
  128 + end
  129 +
  130 + should 'fetch contracts sorted accordingly' do
  131 + contract0 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 1.day.ago, :client_name => 'Eva')
  132 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 2.day.ago, :client_name => 'Adam')
  133 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 3.day.ago, :client_name => 'Marvin')
  134 +
  135 + by_date = [contract2, contract1, contract0]
  136 + by_name = [contract1, contract0, contract2]
  137 +
  138 + get :manage_contracts, :profile => bsc.identifier, :sorting => 'created_at asc'
  139 + assert_equal by_date, assigns(:contracts)
  140 +
  141 + get :manage_contracts, :profile => bsc.identifier, :sorting => 'created_at desc'
  142 + assert_equal by_date.reverse, assigns(:contracts)
  143 +
  144 + get :manage_contracts, :profile => bsc.identifier, :sorting => 'client_name asc'
  145 + assert_equal by_name, assigns(:contracts)
  146 +
  147 + get :manage_contracts, :profile => bsc.identifier, :sorting => 'client_name desc'
  148 + assert_equal by_name.reverse, assigns(:contracts)
  149 + end
  150 +
  151 + should 'limit the contracts to defined per page' do
  152 + BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  153 + BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  154 +
  155 + @controller.stubs(:contracts_per_page).returns(1)
  156 +
  157 + get :manage_contracts, :profile => bsc.identifier
  158 +
  159 + assert_equal 1, assigns(:contracts).count
  160 + end
  161 +
  162 + should 'destroy contract' do
  163 + contract = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  164 +
  165 + assert_difference BscPlugin::Contract, :count, -1 do
  166 + get :destroy_contract, :profile => bsc.identifier, :contract_id => contract.id
  167 + end
  168 +
  169 + assert_raise ActiveRecord::RecordNotFound do
  170 + BscPlugin::Contract.find(contract.id)
  171 + end
  172 + end
  173 +
  174 + should 'not crash if trying to destroy a contract that does not exists' do
  175 + assert_nothing_raised do
  176 + get :destroy_contract, :profile => bsc.identifier, :contract_id => -1
  177 + end
  178 + assert_redirected_to :action => 'manage_contracts'
  179 + end
  180 +
  181 + should 'not crash if trying to edit a contract that does not exists' do
  182 + assert_nothing_raised do
  183 + get :edit_contract, :profile => bsc.identifier, :contract_id => -1
  184 + end
  185 + assert_redirected_to :action => 'manage_contracts'
  186 + end
  187 +
  188 + should 'create contract associating the enterprises' do
  189 + enterprise1 = fast_create(Enterprise)
  190 + enterprise2 = fast_create(Enterprise)
  191 +
  192 + post :new_contract, :profile => bsc.identifier, :enterprises => "#{enterprise1.id},#{enterprise2.id}", :contract => {:bsc => bsc, :client_name => 'Marvin'}
  193 +
  194 + bsc.reload
  195 + contract = bsc.contracts.last
  196 +
  197 + assert_includes contract.enterprises, enterprise1
  198 + assert_includes contract.enterprises, enterprise2
  199 + end
  200 +
  201 + should 'edit contract adding or removing enterprises accordingly' do
  202 + enterprise1 = fast_create(Enterprise)
  203 + enterprise2 = fast_create(Enterprise)
  204 + enterprise3 = fast_create(Enterprise)
  205 + contract = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  206 + contract.enterprises << enterprise1
  207 + contract.enterprises << enterprise2
  208 +
  209 + post :edit_contract, :profile => bsc.identifier, :contract_id => contract.id, :enterprises => "#{enterprise2.id},#{enterprise3.id}", :contract => {:bsc => bsc}
  210 + contract.reload
  211 +
  212 + assert_not_includes contract.enterprises, enterprise1
  213 + assert_includes contract.enterprises, enterprise2
  214 + assert_includes contract.enterprises, enterprise3
  215 + end
  216 +
  217 + should 'not crash if there is no enterprises on create' do
  218 + assert_nothing_raised do
  219 + post :new_contract, :profile => bsc.identifier, :contract => {:bsc => bsc, :client_name => 'Marvin'}
  220 + end
  221 + end
  222 +
  223 + should 'create contract with associated sales' do
  224 + product1 = fast_create(Product, :price => 2.50)
  225 + product2 = fast_create(Product)
  226 + sale1 = {:product_id => product1.id, :quantity => 2}
  227 + sale2 = {:product_id => product2.id, :quantity => 5, :price => 3.50}
  228 + sales = {1 => sale1, 2 => sale2}
  229 +
  230 + post :new_contract, :profile => bsc.identifier, :sales => sales, :contract => {:bsc => bsc, :client_name => 'Marvin'}
  231 +
  232 + bsc.reload
  233 + contract = bsc.contracts.last
  234 +
  235 + assert_includes contract.products, product1
  236 + assert_includes contract.products, product2
  237 +
  238 + assert_equal sale1[:quantity], contract.sales.find_by_product_id(sale1[:product_id]).quantity
  239 + assert_equal sale2[:quantity], contract.sales.find_by_product_id(sale2[:product_id]).quantity
  240 + assert_equal sale2[:price], contract.sales.find_by_product_id(sale2[:product_id]).price
  241 + end
  242 +
  243 + should 'edit contract adding or removing sales accordingly' do
  244 + product1 = fast_create(Product)
  245 + product2 = fast_create(Product)
  246 + product3 = fast_create(Product)
  247 + contract = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  248 + BscPlugin::Sale.create!(:product => product1, :contract => contract, :quantity => 1)
  249 + BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => 1)
  250 + sales = {1 => {:product_id => product2.id, :quantity => 1}, 2 => {:product_id => product3.id, :quantity => 1}}
  251 +
  252 + post :edit_contract, :profile => bsc.identifier, :contract_id => contract.id, :sales => sales , :contract => {:bsc => bsc}
  253 + contract.reload
  254 +
  255 + assert_not_includes contract.products, product1
  256 + assert_includes contract.products, product2
  257 + assert_includes contract.products, product3
  258 + end
  259 +
  260 + should 'edit sales informations' do
  261 + product1 = fast_create(Product)
  262 + product2 = fast_create(Product)
  263 + contract = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  264 + sale1 = BscPlugin::Sale.create!(:product => product1, :contract => contract, :quantity => 1, :price => 1.0)
  265 + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => 2, :price => 2.0)
  266 + sale2.save!
  267 + sales = {1 => {:product_id => product1.id, :quantity => 3, :price => 5.0}, 2 => {:product_id => product2.id, :quantity => 4, :price => 10.0}}
  268 +
  269 + post :edit_contract, :profile => bsc.identifier, :contract_id => contract.id, :sales => sales , :contract => {:bsc => bsc}
  270 +
  271 + sale1.reload
  272 + sale2.reload
  273 +
  274 + assert_equal 3, sale1.quantity
  275 + assert_equal 5.0, sale1.price
  276 + assert_equal 4, sale2.quantity
  277 + assert_equal 10.0, sale2.price
  278 + end
  279 +
  280 + should 'redirect to edit contract if some sale could not be created' do
  281 + product = fast_create(Product)
  282 + # sale without quantity
  283 + sales = {1 => {:product_id => product.id, :price => 1.50}}
  284 +
  285 + post :new_contract, :profile => bsc.identifier, :sales => sales, :contract => {:bsc => bsc, :client_name => 'Marvin'}
  286 +
  287 + bsc.reload
  288 + contract = bsc.contracts.last
  289 +
  290 + assert_redirected_to :action => 'edit_contract', :contract_id => contract.id
  291 + end
  292 +
  293 + should 'search for products from the invoved enterprises' do
  294 + # product1 fits
  295 + # product2 doesn't fits because its in added_products
  296 + # product3 doesn't fits because its enterprise is in enterprises
  297 + enterprise1 = fast_create(Enterprise)
  298 + enterprise2 = fast_create(Enterprise)
  299 + enterprise3 = fast_create(Enterprise)
  300 + product1 = fast_create(Product, :enterprise_id => enterprise1.id, :name => 'Black Bycicle')
  301 + product2 = fast_create(Product, :enterprise_id => enterprise2.id, :name => 'Black Guitar')
  302 + product3 = fast_create(Product, :enterprise_id => enterprise3.id, :name => 'Black Notebook')
  303 +
  304 + get :search_sale_product, :profile => bsc.identifier, :enterprises => [enterprise1.id,enterprise2.id].join(','), :added_products => [product2.id].join(','),:sales => {1 => {:product_id => 'black'}}
  305 +
  306 + assert_match /#{product1.name}/, @response.body
  307 + assert_no_match /#{product2.name}/, @response.body
  308 + assert_no_match /#{product3.name}/, @response.body
  309 + end
111 310 end
112 311  
... ...
plugins/bsc/test/unit/bsc_plugin/bsc_test.rb
... ... @@ -5,6 +5,12 @@ require File.dirname(__FILE__) + &#39;/../../../lib/ext/enterprise&#39;
5 5 class BscPlugin::BscTest < Test::Unit::TestCase
6 6 VALID_CNPJ = '94.132.024/0001-48'
7 7  
  8 + def setup
  9 + @bsc = BscPlugin::Bsc.create!(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ)
  10 + end
  11 +
  12 + attr_accessor :bsc
  13 +
8 14 should 'validate presence of cnpj' do
9 15 bsc = BscPlugin::Bsc.new()
10 16 bsc.valid?
... ... @@ -13,7 +19,7 @@ class BscPlugin::BscTest &lt; Test::Unit::TestCase
13 19 end
14 20  
15 21 should 'validate uniqueness of cnpj' do
16   - bsc1 = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ})
  22 + bsc1 = bsc
17 23 bsc2 = BscPlugin::Bsc.new(:cnpj => VALID_CNPJ)
18 24 bsc2.valid?
19 25 assert bsc2.errors.invalid?(:cnpj)
... ... @@ -22,7 +28,6 @@ class BscPlugin::BscTest &lt; Test::Unit::TestCase
22 28 should 'have many enterprises' do
23 29 e1 = Enterprise.new(:name => 'Enterprise1', :identifier => 'enterprise1')
24 30 e2 = Enterprise.new(:name => 'Enterprise2', :identifier => 'enterprise2')
25   - bsc = BscPlugin::Bsc.new(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc Ltda.', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ)
26 31 bsc.enterprises << e1
27 32 bsc.enterprises << e2
28 33 bsc.save!
... ... @@ -34,7 +39,6 @@ class BscPlugin::BscTest &lt; Test::Unit::TestCase
34 39 should 'verify already requested enterprises' do
35 40 e1 = fast_create(Enterprise)
36 41 e2 = fast_create(Enterprise)
37   - bsc = BscPlugin::Bsc.new()
38 42 task = BscPlugin::AssociateEnterprise.new(:target => e1, :bsc => bsc)
39 43 bsc.enterprise_requests.stubs(:pending).returns([task])
40 44  
... ... @@ -46,7 +50,6 @@ class BscPlugin::BscTest &lt; Test::Unit::TestCase
46 50 e1 = fast_create(Enterprise)
47 51 e2 = fast_create(Enterprise)
48 52 category = fast_create(ProductCategory)
49   - bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ})
50 53  
51 54 p1 = fast_create(Product, :product_category_id => category.id)
52 55 p2 = fast_create(Product, :product_category_id => category.id)
... ... @@ -67,8 +70,15 @@ class BscPlugin::BscTest &lt; Test::Unit::TestCase
67 70 end
68 71  
69 72 should 'not be able to create product' do
70   - bsc = BscPlugin::Bsc.new
71 73 assert !bsc.create_product?
72 74 end
73 75  
  76 + should 'have many contracts' do
  77 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  78 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  79 +
  80 + assert_includes bsc.contracts, contract1
  81 + assert_includes bsc.contracts, contract2
  82 + end
  83 +
74 84 end
... ...
plugins/bsc/test/unit/bsc_plugin/contract_test.rb 0 → 100644
... ... @@ -0,0 +1,109 @@
  1 +require File.dirname(__FILE__) + '/../../../../../test/test_helper'
  2 +#require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file'
  3 +#require File.dirname(__FILE__) + '/../../../lib/ext/enterprise'
  4 +
  5 +class BscPlugin::ContractTest < Test::Unit::TestCase
  6 + def setup
  7 + @contract = BscPlugin::Contract.new(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  8 + end
  9 +
  10 + attr_accessor :contract
  11 +
  12 + should 'validates presence of bsc' do
  13 + contract.bsc = nil
  14 + contract.valid?
  15 + assert contract.errors.invalid?(:bsc)
  16 +
  17 + contract.bsc = BscPlugin::Bsc.new
  18 + contract.valid?
  19 + assert !contract.errors.invalid?(:bsc)
  20 + end
  21 +
  22 + should 'associate contract with products through sales' do
  23 + contract.save!
  24 + product1 = fast_create(Product)
  25 + product2 = fast_create(Product)
  26 + sale1 = BscPlugin::Sale.create!(:product => product1, :contract => contract, :quantity => 3)
  27 + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => 5)
  28 +
  29 + assert_includes contract.products, product1
  30 + assert_includes contract.products, product2
  31 + end
  32 +
  33 + should 'have many enterprises' do
  34 + contract.save!
  35 + enterprise1 = fast_create(Enterprise)
  36 + contract.enterprises << enterprise1
  37 + enterprise2 = fast_create(Enterprise)
  38 + contract.enterprises << enterprise2
  39 +
  40 + assert_includes contract.enterprises, enterprise1
  41 + assert_includes contract.enterprises, enterprise2
  42 + end
  43 +
  44 + should 'filter contracts by status' do
  45 + bsc = BscPlugin::Bsc.new
  46 + opened = BscPlugin::Contract::Status::OPENED
  47 + negotiating = BscPlugin::Contract::Status::NEGOTIATING
  48 + executing = BscPlugin::Contract::Status::EXECUTING
  49 + closed = BscPlugin::Contract::Status::CLOSED
  50 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :status => opened, :client_name => 'Marvin')
  51 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :status => negotiating, :client_name => 'Marvin')
  52 + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :status => executing, :client_name => 'Marvin')
  53 + contract4 = BscPlugin::Contract.create!(:bsc => bsc, :status => closed, :client_name => 'Marvin')
  54 +
  55 + opened_and_executing = BscPlugin::Contract.status([opened, executing])
  56 + negotiating_and_closed = BscPlugin::Contract.status([negotiating, closed])
  57 + all = BscPlugin::Contract.status([])
  58 +
  59 + assert_includes opened_and_executing, contract1
  60 + assert_not_includes opened_and_executing, contract2
  61 + assert_includes opened_and_executing, contract3
  62 + assert_not_includes opened_and_executing, contract4
  63 +
  64 + assert_not_includes negotiating_and_closed, contract1
  65 + assert_includes negotiating_and_closed, contract2
  66 + assert_not_includes negotiating_and_closed, contract3
  67 + assert_includes negotiating_and_closed, contract4
  68 +
  69 + assert_includes all, contract1
  70 + assert_includes all, contract2
  71 + assert_includes all, contract3
  72 + assert_includes all, contract4
  73 + end
  74 +
  75 + should 'sort contracts by date' do
  76 + bsc = BscPlugin::Bsc.new
  77 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 2.day.ago, :client_name => 'Marvin')
  78 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 1.day.ago, :client_name => 'Marvin')
  79 + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 3.day.ago, :client_name => 'Marvin')
  80 +
  81 + assert_equal [contract3, contract1, contract2], BscPlugin::Contract.sorted_by('created_at', 'asc')
  82 + end
  83 +
  84 + should 'sort contracts by client name' do
  85 + bsc = BscPlugin::Bsc.new
  86 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvim')
  87 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Adam')
  88 + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Eva')
  89 +
  90 + assert_equal [contract2, contract3, contract1], BscPlugin::Contract.sorted_by('client_name', 'asc')
  91 + end
  92 +
  93 + should 'return contract total price' do
  94 + contract.save!
  95 + price1 = 1
  96 + quantity1 = 3
  97 + price2 = 2
  98 + quantity2 = 5
  99 + total = price1*quantity1 + price2*quantity2
  100 + product1 = fast_create(Product, :price => price1)
  101 + product2 = fast_create(Product, :price => price2)
  102 + sale1 = BscPlugin::Sale.create!(:product => product1, :contract => contract, :quantity => quantity1)
  103 + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => quantity2)
  104 +
  105 + contract.reload
  106 +
  107 + assert_equal total, contract.total_price
  108 + end
  109 +end
... ...
plugins/bsc/test/unit/bsc_plugin/enterprise_test.rb
... ... @@ -1,26 +0,0 @@
1   -require File.dirname(__FILE__) + '/../../../../../test/test_helper'
2   -require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file'
3   -require File.dirname(__FILE__) + '/../../../../../app/models/enterprise'
4   -require File.dirname(__FILE__) + '/../../../lib/ext/enterprise'
5   -
6   -class ProductTest < Test::Unit::TestCase
7   - VALID_CNPJ = '94.132.024/0001-48'
8   -
9   - should 'belongs to a bsc' do
10   - bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ})
11   - enterprise = fast_create(Enterprise, :bsc_id => bsc.id)
12   -
13   - assert_equal bsc, enterprise.bsc
14   - end
15   -
16   - should 'return correct enterprises on validated and not validated namedscopes' do
17   - validated_enterprise = fast_create(Enterprise, :validated => true)
18   - not_validated_enterprise = fast_create(Enterprise, :validated => false)
19   -
20   - assert_includes Enterprise.validated, validated_enterprise
21   - assert_not_includes Enterprise.validated, not_validated_enterprise
22   - assert_not_includes Enterprise.not_validated, validated_enterprise
23   - assert_includes Enterprise.not_validated, not_validated_enterprise
24   - end
25   -end
26   -
plugins/bsc/test/unit/bsc_plugin/product_test.rb
... ... @@ -1,14 +0,0 @@
1   -require File.dirname(__FILE__) + '/../../../../../test/test_helper'
2   -require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file'
3   -
4   -class ProductTest < Test::Unit::TestCase
5   - VALID_CNPJ = '94.132.024/0001-48'
6   -
7   - should 'return have bsc' do
8   - bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ})
9   - enterprise = fast_create(Enterprise, :bsc_id => bsc.id)
10   - product = fast_create(Product, :enterprise_id => enterprise.id)
11   -
12   - assert_equal bsc, product.bsc
13   - end
14   -end
plugins/bsc/test/unit/bsc_plugin/sale_test.rb 0 → 100644
... ... @@ -0,0 +1,86 @@
  1 +require File.dirname(__FILE__) + '/../../../../../test/test_helper'
  2 +
  3 +class BscPlugin::SaleTest < Test::Unit::TestCase
  4 + def setup
  5 + @sale = BscPlugin::Sale.new
  6 + end
  7 +
  8 + attr_accessor :sale
  9 +
  10 + should 'validate presence of product and contract' do
  11 + sale.valid?
  12 +
  13 + assert sale.errors.invalid?(:product)
  14 + assert sale.errors.invalid?(:contract)
  15 +
  16 + product = Product.new
  17 + contract = BscPlugin::Contract.new
  18 + sale.product = product
  19 + sale.contract = contract
  20 +
  21 + assert !sale.errors.invalid?(product)
  22 + assert !sale.errors.invalid?(contract)
  23 + end
  24 +
  25 + should 'validate uniqueness of product and contract composed' do
  26 + product = fast_create(Product)
  27 + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  28 + sale1 = BscPlugin::Sale.create!(:product => product, :contract => contract, :quantity => 1)
  29 + sale2 = BscPlugin::Sale.new(:product => product, :contract => contract, :quantity => 1)
  30 + sale2.valid?
  31 +
  32 + assert sale2.errors.invalid?(:product_id)
  33 + end
  34 +
  35 + should 'validate quantity as a positive integer' do
  36 + sale.quantity = -1
  37 + sale.valid?
  38 + assert sale.errors.invalid?(:quantity)
  39 +
  40 + sale.quantity = 1.5
  41 + sale.valid?
  42 + assert sale.errors.invalid?(:quantity)
  43 +
  44 + sale.quantity = 3
  45 + sale.valid?
  46 + assert !sale.errors.invalid?(:quantity)
  47 + end
  48 +
  49 + should 'set default price as product price if no price indicated' do
  50 + product = fast_create(Product, :price => 3.50)
  51 + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  52 + sale.product = product
  53 + sale.contract = contract
  54 + sale.quantity = 1
  55 + sale.save!
  56 +
  57 + assert_equal product.price, sale.price
  58 + end
  59 +
  60 + should 'not overwrite with the product price if price informed' do
  61 + product = fast_create(Product, :price => 3.50)
  62 + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  63 + sale.product = product
  64 + sale.contract = contract
  65 + sale.quantity = 1
  66 + sale.price = 2.50
  67 + sale.save!
  68 +
  69 + assert_equal 2.50, sale.price
  70 + end
  71 +
  72 + should 'have default value for price' do
  73 + product1 = fast_create(Product, :price => 1)
  74 + product2 = fast_create(Product, :price => 1)
  75 + product3 = fast_create(Product)
  76 + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  77 + sale1 = BscPlugin::Sale.create!(:price => 2, :product => product1, :contract => contract, :quantity => 1)
  78 + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => 1)
  79 + sale3 = BscPlugin::Sale.create!(:product => product3, :contract => contract, :quantity => 1)
  80 +
  81 + assert_equal 2, sale1.price
  82 + assert_equal 1, sale2.price
  83 + assert_equal 0, sale3.price
  84 + end
  85 +end
  86 +
... ...
plugins/bsc/test/unit/ext/enterprise_test.rb 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +require File.dirname(__FILE__) + '/../../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file'
  3 +require File.dirname(__FILE__) + '/../../../../../app/models/enterprise'
  4 +require File.dirname(__FILE__) + '/../../../lib/ext/enterprise'
  5 +
  6 +class EnterpriseTest < Test::Unit::TestCase
  7 + VALID_CNPJ = '94.132.024/0001-48'
  8 +
  9 + def setup
  10 + @bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ})
  11 + end
  12 +
  13 + attr_accessor :bsc
  14 +
  15 + should 'belongs to a bsc' do
  16 + enterprise = fast_create(Enterprise, :bsc_id => bsc.id)
  17 + assert_equal bsc, enterprise.bsc
  18 + end
  19 +
  20 + should 'return correct enterprises on validated and not validated namedscopes' do
  21 + validated_enterprise = fast_create(Enterprise, :validated => true)
  22 + not_validated_enterprise = fast_create(Enterprise, :validated => false)
  23 +
  24 + assert_includes Enterprise.validated, validated_enterprise
  25 + assert_not_includes Enterprise.validated, not_validated_enterprise
  26 + assert_not_includes Enterprise.not_validated, validated_enterprise
  27 + assert_includes Enterprise.not_validated, not_validated_enterprise
  28 + end
  29 +
  30 + should 'be involved with many contracts' do
  31 + enterprise = fast_create(Enterprise)
  32 + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  33 + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin')
  34 + enterprise.contracts << contract1
  35 + enterprise.contracts << contract2
  36 +
  37 + assert_includes enterprise.contracts, contract1
  38 + assert_includes enterprise.contracts, contract2
  39 + end
  40 +end
  41 +
... ...
plugins/bsc/test/unit/ext/product_test.rb 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +require File.dirname(__FILE__) + '/../../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file'
  3 +
  4 +class ProductTest < Test::Unit::TestCase
  5 + VALID_CNPJ = '94.132.024/0001-48'
  6 +
  7 + should 'return have bsc' do
  8 + bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ})
  9 + enterprise = fast_create(Enterprise, :bsc_id => bsc.id)
  10 + product = fast_create(Product, :enterprise_id => enterprise.id)
  11 +
  12 + assert_equal bsc, product.bsc
  13 + end
  14 +
  15 + should 'have contracts through sales' do
  16 + product = fast_create(Product)
  17 + contract1 = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  18 + contract2 = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin')
  19 + sale1 = BscPlugin::Sale.create!(:product => product, :contract => contract1, :quantity => 3)
  20 + sale2 = BscPlugin::Sale.create!(:product => product, :contract => contract2, :quantity => 5)
  21 +
  22 + assert_includes product.contracts, contract1
  23 + assert_includes product.contracts, contract2
  24 + end
  25 +end
... ...
plugins/bsc/views/bsc_plugin_environment/validate_enterprises.html.erb
1 1 <h1><%= _('Validate enterprises') %></h1>
2 2  
3 3 <% form_tag :action => 'save_validations' do %>
4   - <%= text_field_tag(:q, nil, :id => 'search-enterprises') %>
  4 + <%= token_input_field_tag(:q, 'search-enterprises', {:action => 'search_enterprise'},
  5 + { :hint_text => _('Type in a search term for enterprise'),
  6 + :focus => true }) %>
5 7  
6 8 <% button_bar do %>
7 9 <%= submit_button('save', _('Save'))%>
8 10 <%= button('cancel', _('Cancel'), {:controller => 'admin_panel'})%>
9 11 <% end %>
10 12 <% end %>
11   -
12   -<%= javascript_include_tag '/plugins/bsc/jquery_tokeninput/src/jquery.tokeninput.js' %>
13   -<% stylesheet('/plugins/bsc/jquery_tokeninput/styles/token-input.css') %>
14   -<% search_url = url_for(:action => 'search_enterprise') %>
15   -<script type="text/javascript">
16   - jQuery("#search-enterprises")
17   - .tokenInput("<%= search_url %>", {
18   - hintText: <%= _('Type in a search term for enterprise').to_json %>,
19   - noResultsText: <%= _('No results').to_json %>,
20   - searchingText: <%= _('Searching...').to_json %>,
21   - searchDelay: 500,
22   - backspaceDeleteItem: false
23   - })
24   - .focus();
25   -
26   - jQuery("#token-input-search-enterprises")
27   - .live("keydown", function(event){
28   - if(event.keyCode == "13") return false;
29   - });
30   -</script>
31   -
... ...
plugins/bsc/views/bsc_plugin_myprofile/_contract_form.html.erb 0 → 100644
... ... @@ -0,0 +1,83 @@
  1 +<%= error_messages_for :contract %>
  2 +
  3 +<% labelled_form_for :contract, @contract, :html => {:id => 'bsc-plugin-sales-form'} do |f| %>
  4 + <%= hidden_field_tag :contract_id, @contract.id %>
  5 + <%= required f.text_field(:client_name) %>
  6 + <%= labelled_form_field(_('Client type'), f.select(:client_type, BscPlugin::Contract::ClientType.types.map{|type| [BscPlugin::Contract::ClientType.names[type], type]}))%>
  7 + <%= labelled_form_field(_('Business type'), f.select(:business_type, BscPlugin::Contract::BusinessType.types.map{|type| [BscPlugin::Contract::BusinessType.names[type], type]}))%>
  8 + <%= f.text_field(:state) %>
  9 + <%= f.text_field(:city) %>
  10 + <%= labelled_form_field(_('Status'), f.select(:status, BscPlugin::Contract::Status.types.
  11 + map { |s| [BscPlugin::Contract::Status.names[s], s] })) %>
  12 + <%= f.text_field(:number_of_producers, :size => 8, :id => 'bsc-plugin-contract-spinner') %>
  13 + <%= _('Empreendimentos')+':' %>
  14 +
  15 + <% search_action = {:action => 'search_contract_enterprises', :profile => profile.identifier} %>
  16 + <%= token_input_field_tag(:enterprises, 'involved-enterprises', search_action,
  17 + { :pre_populate => @contract.enterprises_to_token_input,
  18 + :hint_text => _('Type in serach term for enterprise') }) %>
  19 +
  20 + <table id="bsc-plugin-sales-table" class="alternate-colors">
  21 + <tr>
  22 + <th class="bsc-plugin-sales-products-column"><%= _('Products') %></th>
  23 + <th class="bsc-plugin-sales-quantity-column" ><%= _('Quantity') %></th>
  24 + <th class="bsc-plugin-sales-price-column" ><%= _('Unit price') %></th>
  25 + </tr>
  26 + <tr id='bsc-plugin-contract-total-row'>
  27 + <td id="bsc-plugin-contract-total-string" colspan="2" ><strong><%= _('Total')%></strong></td>
  28 + <td id="bsc-plugin-contract-total"><strong id='bsc-plugin-sales-total-value'><%= float_to_currency(@contract.total_price)%></strong></td>
  29 + </tr>
  30 + <tr>
  31 + <td colspan="3" class="bsc-plugin-sales-add-new-row"><%= link_to(_('Add new product'), {}, :id => 'bsc-plugin-add-new-product', 'data-bsc' => profile.identifier) %></td>
  32 + </tr>
  33 + </table>
  34 +
  35 + <%= labelled_form_field( _('Supply period'),
  36 + text_field_tag('contract[supply_start]', (@contract.supply_start ? @contract.supply_start.strftime("%Y-%m-%d") : nil), :id => 'from', :size => 9) +
  37 + _(' to ') +
  38 + text_field_tag('contract[supply_end]', (@contract.supply_end ? @contract.supply_end.strftime("%Y-%m-%d") : nil), :id => 'to', :size => 9) )
  39 + %>
  40 +
  41 + <%= f.text_area(:annotations, :rows => 5, :cols => 68) %>
  42 + <% button_bar do%>
  43 + <%= submit_button(:save, _('Save'), :cancel => {:action => 'manage_contracts'})%>
  44 + <% end %>
  45 +<% end %>
  46 +
  47 +<% scripts = %w{/plugins/bsc/jquery.ui.spinner/ui.spinner.js
  48 + /plugins/bsc/contracts /plugins/bsc/datepicker
  49 + /plugins/bsc/spinner} %>
  50 +<% scripts.each do |script|%>
  51 + <%= javascript_include_tag script %>
  52 +<% end %>
  53 +
  54 +<script>
  55 + BSCContracts.tokenInputOptions = {
  56 + minChars: 3,
  57 + hintText: <%= _('Type in a search term for product').to_json %>,
  58 + noResultsText: <%= _("No results").to_json %>,
  59 + searchingText: <%= _("Searching...").to_json %>,
  60 + searchDelay: 1000,
  61 + preventDuplicates: true,
  62 + backspaceDeleteItem: false,
  63 + tokenLimit: 1,
  64 + onDelete: BSCContracts.onDelete,
  65 + onAdd: BSCContracts.onAdd
  66 + };
  67 + BSCContracts.searchUrl = <%= url_for(
  68 + :action => 'search_sale_product',
  69 + :profile => profile.identifier,
  70 + :enterprises => 'ENTERPRISES',
  71 + :sale_id => 'SALE_ID',
  72 + :added_products => 'ADDED_PRODUCTS',
  73 + :escape => true).to_json %>.replace(/amp;/g,"");
  74 + BSCContracts.currencyUnit = <%= profile.environment.currency_unit.to_json %>;
  75 + BSCContracts.prePopulate( <%= @contract.sales.map{|sale| {
  76 + :id => sale.product_id,
  77 + :name => short_text(product_display_name(sale.product), 60),
  78 + :product_price => sale.price || sale.product.price || 0,
  79 + :quantity => sale.quantity}}.to_json
  80 + %>);
  81 +</script>
  82 +
  83 +<%= javascript_include_tag '/plugins/bsc/validation' %>
... ...
plugins/bsc/views/bsc_plugin_myprofile/edit_contract.html.erb 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +<h1><%= _("New contract") %></h1>
  2 +<%= render :partial => 'contract_form', :locals => {:url => {:action => 'update_contract'}}%>
  3 +
... ...
plugins/bsc/views/bsc_plugin_myprofile/manage_associated_enterprises.html.erb
... ... @@ -10,7 +10,11 @@
10 10 <% end %>
11 11  
12 12 <% form_tag :action => 'save_associations' do %>
13   - <%= text_field_tag(:q, nil, :id => 'search-enterprises') %>
  13 + <% search_action = {:action => 'search_enterprise', :profile => profile.identifier} %>
  14 + <%= token_input_field_tag(:q, 'search-enterprises', search_action,
  15 + { :pre_populate => profile.enterprises_to_token_input,
  16 + :hint_text => _('Type in a search term for enterprise'),
  17 + :focus => true }) %>
14 18  
15 19 <%= button('add', _('Add new enterprise'), {:action => 'create_enterprise'}) %>
16 20  
... ... @@ -20,24 +24,3 @@
20 24 <% end %>
21 25  
22 26 <% end %>
23   -<%= javascript_include_tag '/plugins/bsc/jquery_tokeninput/src/jquery.tokeninput.js' %>
24   -<% stylesheet('/plugins/bsc/jquery_tokeninput/styles/token-input.css') %>
25   -<% search_url = url_for(:action => 'search_enterprise', :profile => profile.identifier) %>
26   -<script type="text/javascript">
27   - jQuery("#search-enterprises")
28   - .tokenInput("<%= search_url %>", {
29   - minChars: 3,
30   - prePopulate: <%= profile.enterprises_to_json %>,
31   - hintText: <%= _('Type in a search term for enterprise').to_json %>,
32   - noResultsText: <%= _('No results').to_json %>,
33   - searchingText: <%= _('Searching...').to_json %>,
34   - searchDelay: 500,
35   - backspaceDeleteItem: false
36   - })
37   - .focus();
38   -
39   - jQuery("#token-input-search-enterprises")
40   - .live("keydown", function(event){
41   - if(event.keyCode == "13") return false;
42   - });
43   -</script>
... ...
plugins/bsc/views/bsc_plugin_myprofile/manage_contracts.html.erb 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +<h1><%= _('Manage contracts') %></h1>
  2 +
  3 +<% form_tag({}, {:id => "bsc-plugin-contracts-form"}) do %>
  4 + <div id="bsc-plugin-contracts-filter">
  5 + <h2><%= _('Status') %></h2>
  6 + <% BscPlugin::Contract::Status.types.each do |status| %>
  7 + <%= check_box_tag('status[]', status, @status.include?(status.to_s), :id => 'status-checkbox-'+status.to_s) %>
  8 + <%= content_tag('label', BscPlugin::Contract::Status.names[status], :for => 'status-checkbox-'+status.to_s) %>
  9 + <br style="clear:both" />
  10 + <% end %>
  11 + <br style="clear:both" />
  12 + <%= submit_button(:save, _('Filter')) %>
  13 + </div>
  14 +
  15 + <div id='bsc-plugin-contracts-results'>
  16 + <div id="bsc-plugin-sorter">
  17 + <%= labelled_select(_('Sort by')+' ', :sorting, :first, :last, @sorting,
  18 + [['created_at asc', _('Date(newest first)')], ['created_at desc', _('Date(oldest first)')],
  19 + ['client_name asc', _('Client name(A-Z)')], ['client_name desc', _('Client name(Z-A)')]],
  20 + :onchange => "jQuery('#bsc-plugin-contracts-form').submit()") %>
  21 + </div>
  22 +
  23 + <% if @contracts.blank? %>
  24 + <%= content_tag('em', _('There are no contracts at all.'))%>
  25 + <% else %>
  26 + <table id="bsc-plugin-manage-contracts-table" class="alternate-colors">
  27 + <% @contracts.each do |contract| %>
  28 + <tr>
  29 + <td>
  30 + <%= link_to(content_tag('b', contract.client_name ), :action => 'view_contract', :contract_id => contract.id) %> <br />
  31 + <%= content_tag('i', show_date(contract.created_at)) %>
  32 + </td>
  33 + <td class="links">
  34 + <%= link_to(_('Edit'), :action => 'edit_contract', :contract_id => contract.id)%>
  35 + <%= link_to(_('Remove'), {:action => 'destroy_contract', :contract_id => contract.id}, :confirm => _('Are you sure?'))%>
  36 + </td>
  37 + </tr>
  38 + <% end %>
  39 + </table>
  40 + <%= pagination_links @contracts %>
  41 + <% end %>
  42 +
  43 + <% button_bar do %>
  44 + <%= button(:back, _('Go back'), :controller => 'profile_editor') %>
  45 + <%= button(:new, _('Create new contract'), :action => 'new_contract')%>
  46 + <% end %>
  47 + </div>
  48 +<% end %>
  49 +<br style="clear:both" />
... ...
plugins/bsc/views/bsc_plugin_myprofile/new_contract.html.erb 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +<h1><%= _("New contract") %></h1>
  2 +<%= render :partial => 'contract_form.html.erb', :locals => {:url => {:action => 'create_contract'}}%>
... ...
plugins/bsc/views/bsc_plugin_myprofile/transfer_ownership.html.erb
... ... @@ -13,10 +13,16 @@
13 13 </ul>
14 14 <% end %>
15 15  
  16 +
16 17 <% form_tag do %>
17 18 <% @roles.each do |role|%>
18 19 <%= content_tag('b', _('Administrator:')) %>
19   - <%= text_field_tag('q_'+role.key, nil, :id => 'search_'+role.key) %>
  20 + <% search_action = {:controller => 'profile_members', :action => 'search_user', :role => role.id, :profile => profile.identifier} %>
  21 + <%= token_input_field_tag('q_'+role.key, 'search_'+role.key, search_action,
  22 + { :hint_text => _('Type in a search term for the new administrator'),
  23 + :focus => true,
  24 + :token_limit => 1}) %>
  25 +
20 26 <% end %>
21 27  
22 28 <% button_bar do %>
... ... @@ -24,31 +30,3 @@
24 30 <%= button('cancel', _('Cancel'), {:controller => 'profile_editor'})%>
25 31 <% end %>
26 32 <% end %>
27   -
28   -<%= javascript_include_tag '/plugins/bsc/jquery_tokeninput/src/jquery.tokeninput.js' %>
29   -<% stylesheet('/plugins/bsc/jquery_tokeninput/styles/token-input.css') %>
30   -
31   -<% @roles.each do |role| %>
32   - <% search_url = url_for(:controller => 'profile_members', :action => 'search_user', :role => role.id, :profile => profile.identifier) %>
33   - <script type="text/javascript">
34   - jQuery(<%= ('#search_' + role.key).to_json %>)
35   - .tokenInput("<%= search_url %>", {
36   - hintText: <%= _('Type in a search term for the new administrator').to_json %>,
37   - noResultsText: <%= _('No results').to_json %>,
38   - searchingText: <%= _('Searching...').to_json %>,
39   - searchDelay: 500,
40   - backspaceDeleteItem: false,
41   - preventDuplicates: true,
42   - tokenLimit: 1,
43   - queryParam: <%= ('q_'+role.key).to_json %>
44   - })
45   - .focus();
46   -
47   - jQuery("#token-input-search-enterprises")
48   - .live("keydown", function(event){
49   - if(event.keyCode == "13") return false;
50   - });
51   - </script>
52   -<% end %>
53   -
54   -
... ...
plugins/bsc/views/bsc_plugin_myprofile/view_contract.html.erb 0 → 100644
... ... @@ -0,0 +1,55 @@
  1 +<h1><%= @contract.client_name %></h1>
  2 +
  3 +<table class='bsc-fields-table' style="float: left;">
  4 + <tr>
  5 + <th colspan='2'><%= _('Basic information') %></th>
  6 + </tr>
  7 + <%= display_text_field(_('Client type'), BscPlugin::Contract::ClientType.names[@contract.client_type]) %>
  8 + <%= display_text_field(_('Business type'), BscPlugin::Contract::BusinessType.names[@contract.business_type]) %>
  9 + <%= display_text_field(_('State'), @contract.state) %>
  10 + <%= display_text_field(_('City'), @contract.city) %>
  11 + <%= display_text_field(_('Status'), BscPlugin::Contract::Status.names[@contract.status]) %>
  12 + <%= display_text_field(_('Number of producers'), @contract.number_of_producers) %>
  13 + <%= display_text_field(_('Supply period'), show_period(@contract.supply_start, @contract.supply_end, true)) %>
  14 +</table>
  15 +
  16 +<table class='bsc-fields-table' style="float: right;">
  17 + <tr>
  18 + <th colspan='2'><%= _('Enterprises') %></th>
  19 + </tr>
  20 + <%= display_list_field(@contract.enterprises.map {|enterprise| link_to(enterprise.short_name(60), enterprise.url)}) %>
  21 +</table>
  22 +
  23 +<% if !@contract.sales.blank?%>
  24 + <table id='bsc-plugin-sales-table' class="bsc-plugin-view-contract alternate-colors">
  25 + <tr>
  26 + <th><%= _('Product') %></th>
  27 + <th align="center"><%= _('Quantity') %></th>
  28 + <th><%= _('Unit price') %></th>
  29 + </tr>
  30 + <% @contract.sales.each do |sale| %>
  31 + <tr>
  32 + <td><%= short_text(product_display_name(Product.find(sale.product_id)), 110) %></td>
  33 + <td align="center"><%= sale.quantity %></td>
  34 + <td align="right"><%= float_to_currency(sale.price) %></td>
  35 + </tr>
  36 + <% end %>
  37 + <tr>
  38 + <td id="bsc-plugin-contract-total-string" class="bsc-plugin-total" colspan='2'><%= _('Total')%></td>
  39 + <td id="bsc-plugin-contract-total" class="bsc-plugin-total"><%= float_to_currency(@contract.total_price) %></td>
  40 + </tr>
  41 + </table>
  42 +<% end %>
  43 +
  44 +<br style="clear: both" />
  45 +
  46 +<% if !@contract.annotations.blank? %>
  47 + <div class="bsc-plugin-annotation">
  48 + <div class="bsc-plugin-annotation-title"><%= _("Annotations") %></div>
  49 + <div class="bsc-plugin-annotation-content"><%= @contract.annotations %></div>
  50 + </div>
  51 +<% end %>
  52 +
  53 +<% button_bar do %>
  54 + <%= button(:back, _('Go back'), :action => 'manage_contracts') %>
  55 +<% end %>
... ...