fat_free_crm 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fat_free_crm might be problematic. Click here for more details.

Files changed (212) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +2 -2
  3. data/Gemfile +15 -2
  4. data/Gemfile.lock +34 -14
  5. data/README.md +37 -124
  6. data/app/assets/javascripts/application.js.erb +1 -1
  7. data/app/assets/javascripts/crm.js +22 -1
  8. data/app/assets/javascripts/crm_fields.js +2 -3
  9. data/app/assets/javascripts/jquery-noconflict.js +17 -0
  10. data/app/assets/stylesheets/application.css.erb +1 -0
  11. data/app/assets/stylesheets/common.scss +26 -0
  12. data/app/assets/stylesheets/ffcrm_chosen.scss +1 -1
  13. data/app/controllers/admin/application_controller.rb +1 -1
  14. data/app/controllers/application_controller.rb +0 -8
  15. data/app/controllers/{accounts_controller.rb → entities/accounts_controller.rb} +1 -13
  16. data/app/controllers/{campaigns_controller.rb → entities/campaigns_controller.rb} +1 -13
  17. data/app/controllers/{contacts_controller.rb → entities/contacts_controller.rb} +1 -7
  18. data/app/controllers/{leads_controller.rb → entities/leads_controller.rb} +1 -1
  19. data/app/controllers/{opportunities_controller.rb → entities/opportunities_controller.rb} +1 -7
  20. data/app/controllers/{tasks_controller.rb → entities/tasks_controller.rb} +1 -1
  21. data/app/controllers/{base_controller.rb → entities_controller.rb} +32 -1
  22. data/app/controllers/home_controller.rb +9 -9
  23. data/app/controllers/lists_controller.rb +17 -0
  24. data/app/helpers/admin/tags_helper.rb +1 -1
  25. data/app/helpers/application_helper.rb +14 -14
  26. data/app/helpers/crm_tags_helper.rb +1 -1
  27. data/app/helpers/home_helper.rb +13 -15
  28. data/app/helpers/lists_helper.rb +17 -0
  29. data/app/inputs/date_time_input.rb +17 -0
  30. data/app/inputs/text_input.rb +17 -1
  31. data/app/models/{base → entities}/account.rb +0 -1
  32. data/app/models/{base → entities}/account_contact.rb +0 -0
  33. data/app/models/{base → entities}/account_opportunity.rb +0 -0
  34. data/app/models/{base → entities}/campaign.rb +0 -1
  35. data/app/models/{base → entities}/contact.rb +0 -1
  36. data/app/models/{base → entities}/contact_opportunity.rb +0 -0
  37. data/app/models/{base → entities}/lead.rb +0 -1
  38. data/app/models/{base → entities}/opportunity.rb +0 -1
  39. data/app/models/{base → entities}/task.rb +5 -6
  40. data/app/models/list.rb +17 -0
  41. data/app/models/observers/lead_observer.rb +39 -0
  42. data/app/models/observers/opportunity_observer.rb +54 -0
  43. data/app/models/observers/task_observer.rb +41 -0
  44. data/app/models/polymorphic/address.rb +1 -3
  45. data/app/models/polymorphic/avatar.rb +0 -5
  46. data/app/models/polymorphic/comment.rb +2 -11
  47. data/app/models/polymorphic/email.rb +2 -9
  48. data/app/models/polymorphic/tag.rb +17 -0
  49. data/app/models/polymorphic/tagging.rb +17 -0
  50. data/app/models/users/ability.rb +13 -0
  51. data/app/models/users/user.rb +1 -4
  52. data/app/views/accounts/_account.html.haml +10 -6
  53. data/app/views/accounts/index.html.haml +1 -1
  54. data/app/views/accounts/show.html.haml +6 -24
  55. data/app/views/admin/fields/_field.html.haml +6 -6
  56. data/app/views/admin/tags/_tag.html.haml +2 -2
  57. data/app/views/admin/tags/index.html.haml +1 -1
  58. data/app/views/admin/users/_user.html.haml +3 -3
  59. data/app/views/admin/users/index.html.haml +1 -1
  60. data/app/views/campaigns/_campaign.html.haml +9 -5
  61. data/app/views/campaigns/index.html.haml +1 -1
  62. data/app/views/campaigns/show.html.haml +4 -24
  63. data/app/views/comments/_comment.html.haml +17 -14
  64. data/app/views/comments/_edit.html.haml +1 -1
  65. data/app/views/comments/_new.html.haml +3 -3
  66. data/app/views/contacts/_contact.html.haml +33 -15
  67. data/app/views/contacts/_contacts.html.haml +6 -0
  68. data/app/views/contacts/_sidebar_show.html.haml +1 -1
  69. data/app/views/contacts/index.html.haml +1 -1
  70. data/app/views/contacts/show.html.haml +3 -19
  71. data/app/views/emails/_email.html.haml +24 -21
  72. data/app/views/{base → entities}/_advanced_search.html.haml +0 -0
  73. data/app/views/{base → entities}/_condition_fields.html.haml +0 -0
  74. data/app/views/{base → entities}/_grouping_fields.html.haml +0 -0
  75. data/app/views/{base → entities}/_sort_fields.html.haml +0 -0
  76. data/app/views/{base → entities}/advanced_search.js.rjs +0 -0
  77. data/app/views/entities/contacts.js.rjs +3 -0
  78. data/app/views/entities/leads.js.rjs +3 -0
  79. data/app/views/entities/opportunities.js.rjs +3 -0
  80. data/app/views/entities/versions.js.rjs +3 -0
  81. data/app/views/home/_activity.html.haml +19 -18
  82. data/app/views/home/_events_menu.html.haml +8 -0
  83. data/app/views/home/_options.html.haml +2 -3
  84. data/app/views/home/index.html.haml +1 -1
  85. data/app/views/leads/_lead.html.haml +42 -23
  86. data/app/views/leads/_leads.html.haml +6 -0
  87. data/app/views/leads/_sidebar_show.html.haml +1 -1
  88. data/app/views/leads/index.html.haml +1 -1
  89. data/app/views/leads/show.html.haml +3 -13
  90. data/app/views/opportunities/_opportunities.html.haml +6 -0
  91. data/app/views/opportunities/_opportunity.html.haml +23 -11
  92. data/app/views/opportunities/index.html.haml +1 -1
  93. data/app/views/opportunities/show.html.haml +4 -18
  94. data/app/views/shared/_comment.html.haml +3 -3
  95. data/app/views/shared/_edit_comment.html.haml +1 -1
  96. data/app/views/shared/_recent.html.haml +4 -4
  97. data/app/views/shared/_recently.html.haml +3 -3
  98. data/app/views/shared/_timeline.html.haml +2 -3
  99. data/app/views/tasks/_assigned.html.haml +4 -4
  100. data/app/views/tasks/_completed.html.haml +2 -2
  101. data/app/views/tasks/_pending.html.haml +2 -2
  102. data/app/views/tasks/_related.html.haml +4 -5
  103. data/app/views/tasks/_tasks.html.haml +3 -0
  104. data/app/views/tasks/_title.html.haml +1 -1
  105. data/app/views/tasks/index.html.haml +1 -1
  106. data/app/views/users/_avatar.html.haml +2 -2
  107. data/app/views/versions/_version.html.haml +9 -12
  108. data/app/views/versions/_versions.html.haml +11 -0
  109. data/config/application.rb +3 -2
  110. data/config/environments/development.rb +2 -2
  111. data/config/environments/production.rb +0 -4
  112. data/config/environments/staging.rb +1 -1
  113. data/config/initializers/action_mailer.rb +9 -0
  114. data/config/initializers/paper_trail.rb +80 -0
  115. data/config/initializers/relative_url_root.rb +23 -0
  116. data/config/locales/cz_fat_free_crm.yml +1 -1
  117. data/config/locales/en-US_fat_free_crm.yml +22 -17
  118. data/config/locales/fr_fat_free_crm.yml +349 -134
  119. data/config/routes.rb +144 -140
  120. data/config/settings.default.yml +14 -2
  121. data/db/demo/addresses.yml +2 -2
  122. data/db/demo/emails.yml +2 -2
  123. data/db/migrate/20120216042541_is_paranoid_to_paper_trail.rb +1 -2
  124. data/db/migrate/20120309070209_add_versions_related.rb +6 -0
  125. data/db/migrate/20120316045804_activities_to_versions.rb +35 -0
  126. data/db/schema.rb +79 -53
  127. data/fat_free_crm.gemspec +8 -4
  128. data/lib/development_tasks/gem.rake +18 -1
  129. data/lib/development_tasks/license.rake +2 -4
  130. data/lib/development_tasks/rdoc.rake +17 -0
  131. data/lib/development_tasks/rspec.rake +17 -0
  132. data/lib/fat_free_crm.rb +20 -14
  133. data/lib/fat_free_crm/core_ext/array.rb +0 -27
  134. data/lib/fat_free_crm/dropbox.rb +11 -1
  135. data/lib/fat_free_crm/engine.rb +21 -3
  136. data/lib/fat_free_crm/gem_dependencies.rb +26 -0
  137. data/lib/fat_free_crm/gem_ext.rb +18 -1
  138. data/lib/fat_free_crm/gem_ext/active_record/schema_dumper.rb +18 -1
  139. data/lib/fat_free_crm/gem_ext/authlogic/session/cookies.rb +17 -0
  140. data/lib/fat_free_crm/gem_ext/rails/engine.rb +17 -0
  141. data/lib/fat_free_crm/gem_ext/rails/text_helper.rb +17 -0
  142. data/lib/fat_free_crm/gem_ext/rake/task.rb +17 -0
  143. data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +18 -1
  144. data/lib/fat_free_crm/plugin_dependencies.rb +23 -5
  145. data/lib/fat_free_crm/renderers.rb +17 -0
  146. data/lib/fat_free_crm/syck_yaml.rb +17 -0
  147. data/lib/fat_free_crm/version.rb +1 -1
  148. data/lib/{country_select → plugins/country_select}/MIT-LICENSE +0 -0
  149. data/lib/{country_select → plugins/country_select}/README +0 -0
  150. data/lib/{country_select → plugins/country_select}/init.rb +0 -0
  151. data/lib/{country_select → plugins/country_select}/install.rb +0 -0
  152. data/lib/{country_select → plugins/country_select}/lib/country_select.rb +0 -0
  153. data/lib/{country_select → plugins/country_select}/uninstall.rb +0 -0
  154. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/Gemfile +0 -0
  155. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/README.textile +0 -0
  156. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/ROADMAP.textile +0 -0
  157. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/Rakefile +0 -0
  158. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/VERSION +0 -0
  159. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/gravatar_image_tag.gemspec +0 -0
  160. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/init.rb +0 -0
  161. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/lib/gravatar_image_tag.rb +0 -0
  162. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/spec/gravatar_image_tag_spec.rb +0 -0
  163. data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/spec/test_helper.rb +0 -0
  164. data/lib/tasks/demo.rake +32 -29
  165. data/lib/tasks/dropbox.rake +1 -1
  166. data/lib/tasks/fat_free_crm.rake +3 -2
  167. data/lib/tasks/plugins.rake +1 -0
  168. data/spec/controllers/accounts_controller_spec.rb +7 -5
  169. data/spec/controllers/campaigns_controller_spec.rb +11 -9
  170. data/spec/controllers/contacts_controller_spec.rb +7 -5
  171. data/spec/controllers/home_controller_spec.rb +2 -2
  172. data/spec/controllers/leads_controller_spec.rb +7 -5
  173. data/spec/controllers/opportunities_controller_spec.rb +7 -5
  174. data/spec/factories/shared_factories.rb +8 -11
  175. data/spec/lib/dropbox_spec.rb +1 -0
  176. data/spec/models/polymorphic/version_spec.rb +247 -0
  177. data/spec/models/users/user_spec.rb +0 -9
  178. data/spec/spec_helper.rb +4 -0
  179. data/spec/views/home/index.haml_spec.rb +1 -1
  180. data/spec/views/home/index.rjs_spec.rb +4 -4
  181. data/spec/views/tasks/new.rjs_spec.rb +2 -2
  182. data/vendor/assets/javascripts/calendar_date_select/format_french.js +24 -0
  183. metadata +167 -126
  184. data/app/models/observers/activity_observer.rb +0 -84
  185. data/app/models/polymorphic/activity.rb +0 -106
  186. data/app/views/accounts/contacts.js.rjs +0 -3
  187. data/app/views/accounts/opportunities.js.rjs +0 -3
  188. data/app/views/campaigns/leads.js.rjs +0 -3
  189. data/app/views/campaigns/opportunities.js.rjs +0 -3
  190. data/app/views/contacts/opportunities.js.rjs +0 -3
  191. data/app/views/home/_actions_menu.html.haml +0 -8
  192. data/lib/dynamic_form/MIT-LICENSE +0 -20
  193. data/lib/dynamic_form/README +0 -13
  194. data/lib/dynamic_form/Rakefile +0 -10
  195. data/lib/dynamic_form/dynamic_form.gemspec +0 -12
  196. data/lib/dynamic_form/init.rb +0 -2
  197. data/lib/dynamic_form/lib/action_view/helpers/dynamic_form.rb +0 -301
  198. data/lib/dynamic_form/lib/action_view/locale/en-US.yml +0 -8
  199. data/lib/dynamic_form/lib/dynamic_form.rb +0 -6
  200. data/lib/dynamic_form/test/dynamic_form_i18n_test.rb +0 -42
  201. data/lib/dynamic_form/test/dynamic_form_test.rb +0 -370
  202. data/lib/dynamic_form/test/test_helper.rb +0 -10
  203. data/lib/responds_to_parent/MIT-LICENSE +0 -20
  204. data/lib/responds_to_parent/README +0 -47
  205. data/lib/responds_to_parent/Rakefile +0 -22
  206. data/lib/responds_to_parent/init.rb +0 -2
  207. data/lib/responds_to_parent/install.rb +0 -2
  208. data/lib/responds_to_parent/lib/responds_to_parent.rb +0 -70
  209. data/lib/responds_to_parent/test/responds_to_parent_test.rb +0 -11
  210. data/lib/responds_to_parent/test/test_helper.rb +0 -7
  211. data/lib/responds_to_parent/uninstall.rb +0 -2
  212. data/spec/models/polymorphic/activity_spec.rb +0 -303
@@ -0,0 +1,3 @@
1
+ = section(object, :tasks)
2
+ .log#tasks
3
+ = render "shared/tasks"
@@ -2,7 +2,7 @@
2
2
  = link_to_inline(:create_task, url_for(:action => :new, :view => @view), :text => t(:create_task))
3
3
  .title#title
4
4
  = (@view == "assigned" ? t(:assigned_tasks) : t(:tasks))
5
- = image_tag("loading.gif", :size => "16x16", :id => "loading", :style => "display: none;")
5
+ = image_tag("loading.gif", :size => :thumb, :id => "loading", :style => "display: none;")
6
6
 
7
7
  .remote#options{ hidden }
8
8
  .remote#create_task{ hidden }
@@ -4,7 +4,7 @@
4
4
  - buckets = Setting.unroll(:task_completed)
5
5
  .title
6
6
  = t(:completed_tasks)
7
- = image_tag("loading.gif", :size => "16x16", :id => "loading", :style => "display: none;")
7
+ = image_tag("loading.gif", :size => :thumb, :id => "loading", :style => "display: none;")
8
8
  - else
9
9
  - buckets = Setting.unroll(:task_bucket)
10
10
  = render "title"
@@ -1,5 +1,5 @@
1
1
  .remote
2
- = form_for(@user, :url => upload_avatar_user_path(@user, :format => "js"), :html => { :multipart => true, :target => "uploading", :onsubmit => "$('user_submit').disabled = true" }) do |f|
2
+ = form_for(@user, :url => upload_avatar_user_path(@user, :format => "js"), :html => { :multipart => true, :target => "uploading", :onsubmit => "$('user_avatar_submit').disabled = true" }) do |f|
3
3
  = link_to_close avatar_user_path(@user)
4
4
  = error_messages_for :avatar, :object => @user.avatar, :object_name => t('avatar')
5
5
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  .buttonbar
14
14
  %small.cool{:style => "float:right"}== #{t :gravatar_help} #{link_to(t(:here), "http://en.gravatar.com", :"data-popup" => true)}.
15
- = f.submit t(:upload_picture), :onclick => "this.disabled = true"
15
+ = f.submit t(:upload_picture), :id => "user_avatar_submit"
16
16
  #{t :or}
17
17
  = link_to(t(:use_gravatar), upload_avatar_user_path(@user) + '?gravatar=1', :method => :put, :remote => true)
18
18
  #{t :or}
@@ -1,14 +1,11 @@
1
- %li[version]{ highlightable(dom_id(version, :tools)) }
1
+ %li.highlight[version]
2
2
  .body
3
- .tools{ invisible, :id => dom_id(version, :tools) }
4
- =# link_to_edit(version) + " | "
5
- =# link_to_delete(version)
6
-
3
+ - item_name = t(version.item.class.name)
7
4
  - if user = User.find_by_id(version.whodunnit)
8
5
  - user_name = user.name
9
6
  - else
10
7
  - user_name = t('version.anonymous')
11
- = t('version.' + version.event, :by => user_name, :when => time_ago_in_words(version.created_at))
8
+ = t('version.' + version.event, :item => item_name, :by => user_name, :when => time_ago_in_words(version.created_at))
12
9
  %tt
13
10
  - version.changeset.each do |attr_name, change|
14
11
  - if attr_name =~ /^cf_/
@@ -22,9 +19,9 @@
22
19
  - second = change.second
23
20
  - if [first, second].any?(&:present?)
24
21
  %br
25
- - if first.blank? and second.present?
26
- = t('version.set', :attr => label, :to => second)
27
- - elsif first.present? and second.present?
28
- = t('version.change', :attr => label, :from => first, :to => second)
29
- - elsif first.present? and second.blank?
30
- = t('version.unset', :attr => label, :from => first)
22
+ - if first.blank? and second.present?
23
+ = t('version.set', :attr => label, :to => second)
24
+ - elsif first.present? and second.present?
25
+ = t('version.change', :attr => label, :from => first, :to => second)
26
+ - elsif first.present? and second.blank?
27
+ = t('version.unset', :attr => label, :from => first)
@@ -0,0 +1,11 @@
1
+ - if Setting.paper_trail_ui_enabled
2
+ %br
3
+
4
+ .subtitle
5
+ = t(:versions)
6
+
7
+ .list#versions
8
+ - versions = Version.history(object).paginate(:page => 1, :per_page => 10)
9
+ = render :partial => "versions/version", :collection => versions
10
+
11
+ = will_paginate versions, :id => 'versions_pagination', :params => {:action => :versions}
@@ -20,10 +20,11 @@ module FatFreeCRM
20
20
  # -- all .rb files in that directory are automatically loaded.
21
21
 
22
22
  # Models are organized in sub-directories
23
- config.autoload_paths += Dir[Rails.root.join("app/models/**")]
23
+ config.autoload_paths += Dir[Rails.root.join("app/models/**")] +
24
+ Dir[Rails.root.join("app/controllers/entities")]
24
25
 
25
26
  # Activate observers that should always be running.
26
- config.active_record.observers = :activity_observer unless ARGV.join.include?('assets:precompile')
27
+ config.active_record.observers = :lead_observer, :opportunity_observer, :task_observer unless ARGV.join.include?('assets:precompile')
27
28
 
28
29
  # Load development rake tasks (RSpec, Gem packaging, etc.)
29
30
  rake_tasks do
@@ -24,7 +24,7 @@ if defined?(FatFreeCRM::Application)
24
24
  config.action_dispatch.best_standards_support = :builtin
25
25
 
26
26
  # Raise exception on mass assignment protection for Active Record models
27
- config.active_record.mass_assignment_sanitizer = :strict
27
+ #config.active_record.mass_assignment_sanitizer = :strict
28
28
 
29
29
  # Log the query plan for queries taking more than this (works
30
30
  # with SQLite, MySQL, and PostgreSQL)
@@ -36,4 +36,4 @@ if defined?(FatFreeCRM::Application)
36
36
  # Expands the lines which load the assets
37
37
  config.assets.debug = true
38
38
  end
39
- end
39
+ end
@@ -50,10 +50,6 @@ if defined?(FatFreeCRM::Application)
50
50
  'calendar_date_select/default.css',
51
51
  /calendar_date_select\/[^\/]*\.js/]
52
52
 
53
- # Disable delivery errors, bad email addresses will be ignored
54
- # config.action_mailer.raise_delivery_errors = false
55
- config.action_mailer.delivery_method = :smtp
56
-
57
53
  # Enable threaded mode
58
54
  # config.threadsafe!
59
55
 
@@ -1,5 +1,5 @@
1
1
  if defined?(FatFreeCRM::Application)
2
- require Rails.root.join('config', 'environments', 'production')
2
+ require FatFreeCRM.root.join('config', 'environments', 'production')
3
3
  FatFreeCRM::Application.configure do
4
4
  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
5
5
  # the I18n.default_locale when a translation can not be found)
@@ -1,3 +1,12 @@
1
+ # Configure ActionMailer
2
+
3
+ # Set SMTP settings if present.
4
+ if smtp_settings = Setting.smtp
5
+ Rails.application.config.action_mailer.delivery_method = :smtp
6
+ Rails.application.config.action_mailer.smtp_settings = smtp_settings
7
+ end
8
+
9
+ # Set default host for outgoing emails
1
10
  if Setting.host.present?
2
11
  (Rails.application.config.action_mailer.default_url_options ||= {})[:host] = Setting.host
3
12
  end
@@ -1 +1,81 @@
1
1
  require 'paper_trail'
2
+
3
+ Version.class_eval do
4
+
5
+ ASSETS = %w(all tasks campaigns leads accounts contacts opportunities comments emails)
6
+ EVENTS = %w(all_events create view update destroy)
7
+ DURATION = %w(one_hour one_day two_days one_week two_weeks one_month)
8
+ ENTITIES = %w(Account Campaign Contact Lead Opportunity)
9
+
10
+ attr_accessible :related
11
+ belongs_to :related, :polymorphic => true
12
+ belongs_to :user, :foreign_key => :whodunnit
13
+
14
+ scope :default_order, order('created_at DESC')
15
+ scope :include_events, lambda { |*events| where(:event => events) }
16
+ scope :exclude_events, lambda { |*events| where('event NOT IN (?)', events) }
17
+ scope :for, lambda { |user| where(:whodunnit => user.id.to_s) }
18
+
19
+ class << self
20
+
21
+ def recent_for_user(user, limit = 10)
22
+ # Hybrid SQL/Ruby to build a unique list of the most recent entities that the
23
+ # user has interacted with
24
+ versions = []
25
+ offset = 0
26
+ while versions.size < limit
27
+ query = includes(:item).
28
+ where(:whodunnit => user.id.to_s).
29
+ where(:item_type => ENTITIES).
30
+ limit(limit * 2).
31
+ offset(offset).
32
+ default_order
33
+
34
+ break if query.size == 0
35
+ versions += query.select {|v| v.item.present? }
36
+ versions.uniq! {|v| [v.item_id, v.item_type]}
37
+ offset += limit * 2
38
+ end
39
+ versions[0...10]
40
+ end
41
+
42
+ def latest(options = {})
43
+ includes(:item, :related, :user).
44
+ where(({:item_type => options[:asset]} if options[:asset])).
45
+ where(({:event => options[:event]} if options[:event])).
46
+ where(({:whodunnit => options[:user].to_s} if options[:user])).
47
+ where('versions.created_at >= ?', Time.zone.now - (options[:duration] || 2.days)).
48
+ default_order
49
+ end
50
+
51
+ def related_to(object)
52
+ where('(item_id = :id AND item_type = :type) OR (related_id = :id AND related_type = :type)',
53
+ :id => object.id, :type => object.class.name)
54
+ end
55
+
56
+ def history(object)
57
+ related_to(object).exclude_events(:view).default_order
58
+ end
59
+
60
+ def visible_to(user)
61
+ scoped.delete_if do |version|
62
+ if item = version.item || version.reify
63
+ if item.respond_to?(:access) # NOTE: Tasks don't have :access as of yet.
64
+ # Delete from scope if it shouldn't be visible
65
+ next item.user_id != user.id &&
66
+ item.assigned_to != user.id &&
67
+ (item.access == "Private" ||
68
+ (item.access == "Shared" &&
69
+ !item.permissions.map(&:user_id).include?(user.id)))
70
+ end
71
+ # Don't delete any objects that don't have :access method (e.g. tasks)
72
+ next false
73
+ end
74
+ # Delete from scope if no object can be found or reified (e.g. from 'show' events)
75
+ true
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,23 @@
1
+ # Fat Free CRM
2
+ # Copyright (C) 2008-2011 by Michael Dvorkin
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU Affero General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU Affero General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Affero General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #------------------------------------------------------------------------------
17
+
18
+ #
19
+ # Set relative url root for assets
20
+
21
+ if Setting.base_url.present?
22
+ ActionController::Base.relative_url_root = Setting.base_url
23
+ end
@@ -218,7 +218,7 @@ cz:
218
218
  option_target_leads: cíloví možní kl.
219
219
  option_target_revenue: cílový výnos
220
220
  option_updated_at: upraveno
221
- all_actions_past_participle: a všechny akce vytvořené
221
+ all_events_past_participle: a všechny akce vytvořené
222
222
  created_past_participle: vytvořené
223
223
  updated_past_participle: upravené
224
224
  viewed_past_participle: zobrazené
@@ -475,34 +475,34 @@ en-US:
475
475
 
476
476
  # Views -> Home.
477
477
  #----------------------------------------------------------------------------
478
- action_commented: commented on
479
478
  action_completed: completed
480
- action_created: created
481
- action_deleted: deleted
482
- action_email: exchanged emails with
479
+ action_create: created
480
+ action_destroy: deleted
483
481
  action_reassigned: reassigned
484
482
  action_rejected: rejected
485
483
  action_rescheduled: rescheduled
486
- action_updated: updated
487
- action_viewed: viewed
484
+ action_update: updated
485
+ action_view: viewed
488
486
  action_won: won
489
487
  activities: Activities
490
488
  no_activity_records: No activity records found.
491
489
  recent_activity: Recent Activity
492
490
  recent_activity_options: Recent Activity Options
493
491
  subject_account: account
492
+ subject_address: address on
494
493
  subject_campaign: campaign
494
+ subject_comment: comment on
495
495
  subject_contact: contact
496
+ subject_email: email on
496
497
  subject_lead: lead
497
498
  subject_opportunity: opportunity
498
499
  subject_task: task
499
- created_past_participle: Record Creations
500
- commented_past_participle: Comments
501
- viewed_past_participle: Views
502
- updated_past_participle: Updates
503
- deleted_past_participle: Deletions
504
- email_past_participle: Emails
505
- all_actions_past_participle: Activities
500
+ subject_user: user
501
+ create_past_participle: Record Creations
502
+ view_past_participle: Views
503
+ update_past_participle: Updates
504
+ destroy_past_participle: Deletions
505
+ all_events_past_participle: Activities
506
506
 
507
507
  # Views -> Common.
508
508
  #----------------------------------------------------------------------------
@@ -603,10 +603,15 @@ en-US:
603
603
 
604
604
  # Views -> Comments.
605
605
  #----------------------------------------------------------------------------
606
+ comment: Comment
606
607
  edit_comment: Editing comment
607
608
  show: Show
608
609
  update: Update
609
610
 
611
+ # Views -> Emails.
612
+ #----------------------------------------------------------------------------
613
+ email: Email
614
+
610
615
  # Views -> Passwords.
611
616
  #----------------------------------------------------------------------------
612
617
  confirm_password_intro: Please type your new password and then confirm it.
@@ -646,9 +651,9 @@ en-US:
646
651
  #----------------------------------------------------------------------------
647
652
  versions: History
648
653
  version:
649
- create: Created by %{by} %{when} ago.
650
- update: Modified by %{by} %{when} ago.
651
- destroy: Destroyed by %{by} %{when} ago.
654
+ create: %{item} created by %{by} %{when} ago.
655
+ update: %{item} modified by %{by} %{when} ago.
656
+ destroy: %{item} destroyed by %{by} %{when} ago.
652
657
  set: %{attr} set to %{to}
653
658
  unset: %{attr} unset
654
659
  change: %{attr} changed from %{from} to %{to}
@@ -776,7 +781,7 @@ en-US:
776
781
  tag_with_taggings_confirm_delete: "If this tag is deleted, it will be removed from %{value} records."
777
782
  msg_cant_delete_tag: "Couldn't delete '%{value}' since it has associated Field Groups."
778
783
 
779
-
784
+
780
785
  # Views -> Admin -> Plugins
781
786
  #----------------------------------------------------------------------------
782
787
  views:
@@ -1,6 +1,8 @@
1
1
  # French I18n file for Fat Free CRM
2
2
  # Translation by Cédric Brancourt aka Electron-libre
3
3
  # cedric.brancourt@gmail.com
4
+ # Updated by David Keita aka ManInGA
5
+ # maninga@gmail.com
4
6
 
5
7
  fr:
6
8
  language: Français
@@ -14,13 +16,14 @@ fr:
14
16
  not_implemented: Pas encore implémenté.
15
17
  or: ou
16
18
  select_none: '-- Aucun --'
17
- select_blank: '-- Selectionnez --'
19
+ select_blank: '-- Sélectionnez --'
18
20
  yes_button: 'Oui'
19
21
 
22
+
20
23
  # Settings.
21
24
  #----------------------------------------------------------------------------
22
- tab_dashboard: Résumé
23
- tab_tasks: Tâches
25
+ tab_dashboard: Tableau de bord
26
+ tab_tasks: Tâches
24
27
  tab_campaigns: Campagnes
25
28
  tab_leads: Pistes
26
29
  tab_accounts: Comptes
@@ -28,23 +31,32 @@ fr:
28
31
  tab_opportunities: Opportunités
29
32
 
30
33
  admin_tab_users: Utilisateurs
34
+ admin_tab_fields: Champs Personnalisés
35
+ admin_tab_tags: Tags
31
36
  admin_tab_settings: Paramètres
32
37
  admin_tab_plugins: Plugins
33
38
 
39
+ affiliate: Affilié
40
+ competitor: Concurrent
41
+ customer: Client
42
+ partner: Partenaire adm
43
+ reseller: Revendeur
44
+ vendor: Vendeur
45
+
34
46
  planned: Planifié
35
47
  started: Démarré
36
48
  on_hold: En attente
37
49
  completed: Complétée
38
50
  called_off: Abandonné
39
51
 
40
- new: Nouveau
41
- contacted: Contacté
42
- converted: Converti
43
- rejected: Rejeté
52
+ new: Nouvelle
53
+ contacted: Contactée
54
+ converted: Convertie
55
+ rejected: Rejetée
44
56
 
45
57
  cold_call: Appel entrant
46
58
  conference: Conférence
47
- online: Online Marketing
59
+ online: Marketing web
48
60
  referral: Référant
49
61
  self: Interne
50
62
  web: Website
@@ -57,15 +69,16 @@ fr:
57
69
  proposal: Proposition
58
70
  negotiation: Négociation
59
71
  final_review: Examen final
60
- won: Clôturé/Gagné
61
- lost: Clôture/Perdu
72
+ won: Clôturée/Gagnée
73
+ lost: Clôturée/Perdue
62
74
 
63
75
  call: Appel
64
76
  email: E-mail
65
- follow_up: Relance
66
- lunch: Dîné
77
+ follow_up: Suivi
78
+ lunch: Dîner
67
79
  meeting: Réunion
68
- money: Argent
80
+ money: Finance
81
+ presentation: Présentation
69
82
  trip: Voyage
70
83
 
71
84
  overdue: Délai expiré
@@ -75,7 +88,7 @@ fr:
75
88
  due_this_week: Cette semaine
76
89
  due_next_week: La semaine prochaine
77
90
  due_later: Plus tard
78
- due_specific_date: A date précise...
91
+ due_specific_date: A la date précise...
79
92
 
80
93
  completed_today: "Ajourd'hui"
81
94
  completed_yesterday: Hier
@@ -154,30 +167,21 @@ fr:
154
167
  missing_email: "^Précisez une adresse e-mail"
155
168
  email_in_use: "^Un utilisateur existe déjà avec cette adresse."
156
169
 
157
- # dynamic_form plugin translations.
158
- #----------------------------------------------------------------------------
159
- errors:
160
- template:
161
- header:
162
- one: "Impossible d'enregistrer ce %{model} : 1 erreur"
163
- other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
164
- body: "Veuillez vérifier les champs suivants : "
165
-
166
170
  msg_account_suspended: Ce compte utilisateur a été suspendu.
167
- password_reset_instruction: instruction de reinitialisation du mot de passe
171
+ password_reset_instruction: instructions de réinitialisation du mot de passe
168
172
 
169
173
  # Controllers.
170
174
  #----------------------------------------------------------------------------
171
- msg_account_created: "Votre compte a été créé, il est en attente d'approbation par l'administrateur"
175
+ msg_account_created: "Votre compte a été créé, il est en attente d'approbation par l'administrateur"
172
176
  msg_account_not_approved: "Votre compte n'à pas encore été approuvé"
173
177
  msg_asset_deleted: "%{value} à été supprimé"
174
178
  msg_asset_not_available: "Ce %{value} n'est plus disponible."
175
- msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO
179
+ msg_asset_not_authorized: "Vous n'êtes pas autorisé à accéder à ce/cette %{value}."
176
180
  msg_assets_not_available: "Les %{value} ne sont pas disponibles."
177
181
  msg_asset_rejected: "%{value} à été rejetée."
178
- msg_bad_image_file: "^Nous n'avons pu télécharger ou redimensionner votre image."
182
+ msg_bad_image_file: "^Nous n'avons pas pu télécharger ou redimensionner votre image."
179
183
  msg_cant_create_related: "Impossible de crée le %{asset} puisque le %{related} n'est plus disponnible."
180
- msg_cant_delete_user: "^Impossible de supprimer car %{value} a des objets présents."
184
+ msg_cant_delete_user: "^Impossible de supprimer l'utilisateur car %{value} a des objets liés encore présents."
181
185
  msg_cant_do: "Impossible de %{action} le %{asset} puisqu'il n'est plus disponible."
182
186
  msg_email_not_found: "Aucun utilisateur ne correspond a cette adresse"
183
187
  msg_enter_new_password: Saisissez votre nouveau mot de passe.
@@ -191,14 +195,14 @@ fr:
191
195
  msg_password_not_changed: "Votre mot de passe n'a pas été modifié"
192
196
  msg_password_updated: Modification de mot de passe réussie.
193
197
  msg_pwd_instructions_sent: "Les instruction de modification de mot de passe vous on été envoyées. Vérifiez vos e-mails"
194
- msg_require_admin: Vous devez être administrateur pour accéder a cette page
198
+ msg_require_admin: Vous devez être administrateur pour accéder a cette page
195
199
  msg_successful_signup: Enregistrement réussi. Bienvenu dans Fat Free CRM
196
- msg_welcome: Bienvenu dans Fat Free CRM
200
+ msg_welcome: Bienvenue dans Fat Free CRM
197
201
 
198
202
  # Options.
199
203
  #----------------------------------------------------------------------------
200
204
  "option_amount*probability": Montant pondéré
201
- activity_options: Voir les actions %{models} effectuées par %{user} dans les derniers %{period}.
205
+ activity_options: Voir les %{action_type} %{models} effectuées par %{user} dans les derniers %{period}.
202
206
  all_users: tous les utilisateurs
203
207
  option_after: après
204
208
  option_all: tous
@@ -222,21 +226,21 @@ fr:
222
226
  option_target_leads: pistes cibles
223
227
  option_target_revenue: revenus cibles
224
228
  option_updated_at: date de modification
225
- show_per_page: Voir %{number} %{models} par page au format %{fmt}.
226
- sort_by: Trier %{models} par %{field}.
227
- sort_by_displaying: Trier %{models} par %{field} afficher le prénom %{position} le nom.
229
+ show_per_page: Voir %{number} %{models} par page au format %{fmt}.
230
+ sort_by: Trier les %{models} par %{field}.
231
+ sort_by_displaying: Trier les %{models} par %{field} et afficher le prénom %{position} le nom.
228
232
 
229
233
  # Views -> Profile.
230
234
  #----------------------------------------------------------------------------
231
235
  aim: AOL IM
232
- already_signed_up: Déjà enregistré?
236
+ already_signed_up: Déjà inscrit?
233
237
  alt_email: e-mail secondaire
234
- avatar: Image
238
+ avatar: Image(avatar)
235
239
  change_password: Modifier le mot de passe
236
240
  company: Société
237
241
  contact_info: Informations de contact
238
242
  current_password: Mot de passe actuel
239
- edit_profile: Modifier le profile
243
+ edit_profile: Modifier le profil
240
244
  # email: E-mail # <-- Already defined as the task type if Settings.
241
245
  first_name: Prénom
242
246
  google: Google IM
@@ -247,16 +251,16 @@ fr:
247
251
  last_name: Nom
248
252
  login_now_link: Connectez vous maintenant!
249
253
  mobile: Mobile
250
- my_profile: Mon profile
254
+ my_profile: Mon profil
251
255
  new_password: Nouveau mot de passe
252
256
  password: Mot de passe
253
257
  password_confirmation: Confirmez le nouveau mot de passe
254
258
  phone: Téléphone
255
- profile: Profile
259
+ profile: Profil
256
260
  profile_language: Langue
257
- save_profile: Enregistrer le profile
258
- sign_up: Enregistrement
259
- sign_up_button: Enregistrement
261
+ save_profile: Enregistrer le profil
262
+ sign_up: Créer un compte
263
+ sign_up_button: S'inscrire
260
264
  skype: Skype
261
265
  upload_picture: Envoyez une image
262
266
  use_gravatar: Utilisez Gravatar
@@ -267,15 +271,17 @@ fr:
267
271
  # Views -> Authenticate.
268
272
  #----------------------------------------------------------------------------
269
273
  forgot_password: Mot de passe oublié
270
- login: Connection
271
- no_account: Vous ne possédez pas de compte?
274
+ login: Se connecter
275
+ no_account: "Vous n'avez pas de compte?"
272
276
  remember_me: Se souvenir de moi
273
- sign_up_now: "S'enregistrer maintenant!"
277
+ sign_up_now: "Créez le maintenant!"
274
278
 
275
279
  # Views -> Accounts.
276
280
  #----------------------------------------------------------------------------
277
281
  account: Compte
282
+ select_an_account: Sélectionner un compte
278
283
  account_small: compte
284
+ account_summary: Résumé du compte
279
285
  accounts: Comptes
280
286
  accounts_options: Options des comptes
281
287
  accounts_small: comptes
@@ -286,38 +292,41 @@ fr:
286
292
  date_updated: Date de modification
287
293
  fax: Fax
288
294
  intro: Vous pouvez ajouter les informations de %{value} plus tard.
295
+ keep_private: Garder privé, ne pas partager avec les autres
296
+ mail_to: Envoyer à %{value}
297
+ make_public: Partager avec tous
289
298
  mobile_small: mobile
290
299
  open_in_window: Ouvrir %{value} dans une nouvelle fenêtre
291
300
  phone_small: téléphone
292
301
  phone_toll_free: Tel. gratuit
293
- keep_private: Garder privé, ne pas partager avec les autres
294
- make_public: Partager avec tous
302
+ pipeline: Prévisions
295
303
  same_as_billing: identique à facturation
296
304
  save_account: Enregistrer le compte
297
305
  share_with: Partager avec les personnes suivantes
298
306
  shipping_address: Adresse de livraison
299
- website: Site Web
307
+ total_accounts: Total des comptes
308
+ website: Site web
300
309
 
301
310
  # Views -> Campaigns.
302
311
  #----------------------------------------------------------------------------
303
- actual: Actuel
312
+ actual: Etat actuel
304
313
  actual_performance: Performance Actuelle
305
314
  budget: Budget
306
- budget_label: Budget ($)
315
+ budget_label: Budget ()
307
316
  campaign: Campagne
308
317
  campaign_and_leads: campagne et ses pistes
309
318
  campaign_small: campagne
310
319
  campaign_summary: Résumé de la campagne
311
- campaign_targets: Cibles de la campagne
320
+ campaign_targets: Prévisions de la campagne
312
321
  campaigns: Campagnes
313
- campaigns_options: Options de campagnes
322
+ campaigns_options: Options des campagnes
314
323
  campaigns_small: campagnes
315
324
  conversion: Conversion
316
325
  conversion_label: Conversion (%)
317
- conversion_number: "%{value} conversion"
326
+ conversion_number: "%{value} de conversion"
318
327
  create_campaign: Créer une Campagne
319
328
  end_date: Date de fin
320
- finished_on: terminé le %{value}
329
+ finished_on: terminée le %{value}
321
330
  finishes_in: se termine dans %{value}
322
331
  no_start_date: pas de date de début spécifiée
323
332
  number_of_leads: Nombre de pistes
@@ -332,27 +341,27 @@ fr:
332
341
  started_ago: démarré il y a %{value}
333
342
  starts_in: démarré dans %{value}
334
343
  starts_today: "démarre aujourd'hui!"
335
- target: Cible
344
+ target: Prévisionnel
336
345
  total_campaigns: Total des Campagnes
337
346
  was_supposed_to_finish: présumée se terminer le %{value}
338
347
  was_supposed_to_start: était supposée démarrer il y a %{time_ago} le %{start_date}
339
-
348
+ #was_supposed_to_start_in: was supposed to start in %{starts_in} on %{start_date} # Not in use in the project
349
+
340
350
  # Views -> Contacts.
341
351
  #----------------------------------------------------------------------------
342
- address: Adresse
343
352
  alt_email_small: Autre
344
353
  blog: Site Web/Blog
345
354
  contact: Contact
346
355
  contact_small: contact
347
356
  contacts: Contacts
348
- contacts_options: Options des Contacts
357
+ contacts_options: Options des contacts
349
358
  contacts_small: contacts
350
359
  create_contact: Créer un Contact
351
360
  department: Département
352
361
  department_small: 'département %{value} '
353
362
  do_not_call: ne pas appeler
354
363
  extra_info: Informations supplémentaires
355
- extra_info_small: contact supplémentaire
364
+ extra_info_small: infos supplémentaires
356
365
  facebook: Facebook
357
366
  linked_in: LinkedIn
358
367
  myself: Moi-même
@@ -362,9 +371,10 @@ fr:
362
371
  referred_by: Référencé par
363
372
  referred_by_small: référence par
364
373
  save_contact: Enregistrer le contact
374
+ skype: Skype
365
375
  twitter: Twitter
366
- web_presence: Présence Web
367
- web_presence_small: présence web
376
+ web_presence: Présence Web
377
+ web_presence_small: présence web
368
378
  works_at: "%{job_title} chez %{company}"
369
379
 
370
380
  # Views -> Leads.
@@ -372,7 +382,7 @@ fr:
372
382
  convert: Convertir
373
383
  convert_lead: Convertir la piste
374
384
  convert_lead_permissions_intro: Les permissions du contact seront dupliquées depuis la piste. Vous pouvez modifier les permissions du contact ultérieurement.
375
- convert_lead_text: En convertissant la piste %{value} il/elle deviendras un contact associé a un compte existant ou nouvellement créé. Le statut de la piste sera automatiquement positionné à converti.
385
+ convert_lead_text: En convertissant la piste %{value} il/elle deviendra un contact associé à un compte existant ou nouvellement créé. Le statut de la piste sera automatiquement positionné à converti.
376
386
  create_lead: Créer une piste
377
387
  create_opp_for_contact: "Vous pouvez éventuellement créer une opportunité pour le contact %{value} en spécifiant le nom, l'étape courante, la date de clôture estimée, la probabilité de vente, le montant de l'affaire, la remise offerte."
378
388
  lead: Piste
@@ -399,7 +409,7 @@ fr:
399
409
  #----------------------------------------------------------------------------
400
410
  amount: Montant
401
411
  close_date: Date de clôture
402
- closed_ago_on: clôturé il y à%{time_ago} le %{date}
412
+ closed_ago_on: clôturé il y à %{time_ago} le %{date}
403
413
  closes_today: "doit être clôturé aujourd'hui!"
404
414
  closing_date: la date de clôture est %{value}
405
415
  create_opportunity: Créer une opportunité
@@ -407,19 +417,19 @@ fr:
407
417
  days_late: En retard de
408
418
  days_left: Jours restant
409
419
  discount: Remise
410
- discount_number: avec %{value} remise
420
+ discount_number: avec %{value} de remise
411
421
  expected_to_close: doit être clôturé dans %{time} le %{date}
412
422
  from: de
413
423
  no_closing_date: Aucune date de clôture fixée
414
424
  no_discount: sans remise
415
425
  opportunities: Opportunités
416
- opportunities_options: Options des Opportunités
417
- opportunities_small: Opportunités
426
+ opportunities_options: Options des opportunités
427
+ opportunities_small: opportunités
418
428
  opportunity: Opportunité
419
429
  opportunity_small: opportunité
420
- opportunity_summary: Opportunité At a Glance
430
+ opportunity_summary: "Coup d'oeil sur l'opportunité"
421
431
  opportunity_summary_text: "%{amount} avec %{discount} de remise et %{probability} de probabilité"
422
- past_due: en retard, devais être clôturé il y a %{value}.
432
+ past_due: en retard, devait être clôturé il y a %{value}
423
433
  probability: Probabilité
424
434
  probability_number: et %{value} de probabilité
425
435
  save_opportunity: "Enregistrer l'opportunité"
@@ -429,23 +439,27 @@ fr:
429
439
 
430
440
  # Views -> Tasks.
431
441
  #----------------------------------------------------------------------------
442
+ task: Tâche
443
+ task_small: tâche
444
+ tasks: Tâches
445
+ tasks_small: tâches
432
446
  assign_to: Assigner à
433
447
  assigned_tab: Assigné
434
448
  assigned_tasks: Tâches assignées
435
- category: Catégories
436
- completed_tab: Complété
437
- completed_tasks: Tâche complétée
449
+ category: Catégorie
450
+ completed_tab: Complétée
451
+ completed_tasks: Tâches complétées
438
452
  create_task: Créer une tâche
439
- create_task_small: crée une nouvelle tâche
453
+ create_task_small: créer une nouvelle tâche
440
454
  due: A faire
441
455
  feel_free: N'hésitez pas à
442
456
  move_to: aller à
443
- no_tasks: "Vous n'avez aucune tâche %{value} "
457
+ no_tasks: "Vous n'avez aucune tâche %{value}"
444
458
  no_tasks_pending: en attente
445
459
  no_tasks_assigned: assignée
446
460
  no_tasks_completed: complétée
447
461
  pending_tab: En attente
448
- pending_tasks: Taches en attente
462
+ pending_tasks: Tâches en attente
449
463
  related: 're:'
450
464
  save_task: Enregistrer la tâche
451
465
  task_assigned: La tâche à été assignée à %{value}
@@ -453,33 +467,32 @@ fr:
453
467
  task_completed: complétée
454
468
  task_completed_ago: complétée il y à %{value}
455
469
  task_completed_by: complétée il y à %{time_ago} par %{user}
456
- task_created: La tâche à été crée.
470
+ task_created: La tâche à été créée
457
471
  task_due_in: échéance dans %{value}
458
- task_due_later: a faire bientôt
459
- task_due_now: échoit maintenant
460
- task_due_today: "échoit aujourd'hui"
472
+ task_due_later: à faire bientôt
473
+ task_due_now: à faire maintenant
474
+ task_due_today: "à faire aujourd'hui"
461
475
  task_from: De %{value}
462
- task_overdue: en retard, échoyait le
463
- task_pending: La tâche à été mise en attente.
464
- task_small: tâches
465
- tasks: Taches
466
- total_tasks: Total %{value}
476
+ task_overdue: en retard, échéance prévue le
477
+ task_pending: La tâche à été mise en attente
478
+ total_tasks: Total des %{value}
467
479
  view_assigned_tasks: voir les tâches assignées
468
480
  view_pending_tasks: voir les tâches en attente
469
481
 
470
482
  # Views -> Home.
471
483
  #----------------------------------------------------------------------------
472
- action_commented: commenté le
473
- action_completed: Complété
474
- action_created: créé
475
- action_deleted: supprimé
476
- action_email: exchanged emails with # TODO
477
- action_reassigned: réassigné
478
- action_rejected: rejeté
479
- action_rescheduled: re-planifié
480
- action_updated: mis à jour
481
- action_viewed: vu
482
- action_won: gagné
484
+ action_commented: a commenté le/la
485
+ action_completed: a complété le/la
486
+ action_created: a créé le/la
487
+ action_deleted: a supprimé le/la
488
+ action_email: a échangé des mails avec
489
+ action_reassigned: a réassigné le/la
490
+ action_rejected: a rejeté le/la
491
+ action_rescheduled: a re-planifié le/la
492
+ action_updated: a mis à jour le/la
493
+ action_viewed: a vu le/la
494
+ action_won: a gagné une
495
+ activities: Activités
483
496
  no_activity_records: Aucune activité trouvée.
484
497
  recent_activity: Activité récente
485
498
  recent_activity_options: Options des activités récentes
@@ -488,59 +501,111 @@ fr:
488
501
  subject_contact: contact
489
502
  subject_lead: piste
490
503
  subject_opportunity: opportunité
491
- subject_task: tache
504
+ subject_task: tâche
505
+ created_past_participle: "Création d'enregistrements"
506
+ commented_past_participle: Commentaires
507
+ viewed_past_participle: Consultations
508
+ updated_past_participle: Modifications
509
+ deleted_past_participle: Supressions
510
+ email_past_participle: Emails
511
+ all_events_past_participle: Activités
492
512
 
493
513
  # Views -> Common.
494
514
  #----------------------------------------------------------------------------
495
515
  add_note: Ajouter une note
496
516
  save_note: Enregistrer la note
497
517
  add_note_help: Ajouter une nouvelle note...
518
+ edit_note: Modifier la note
498
519
  added_ago: ajoutée il y à %{value}
499
- added_by: ajoutée il y à %{time_ago} par %{user}
520
+ added_by: ajoutée il y à %{time_ago} par %{user}
500
521
  back: Retour
501
522
  cancel: Annuler
502
523
  close_form: Fermer le formulaire
503
524
  confirm_delete: "Êtes-vous certain de vouloir supprimer ceci : %{value}?"
504
- copy_permissions: Copier les permissions de %{value}
505
- could_not_find: "%{value} N'a pas été trouvé. N'hésitez pas à "
506
- could_not_find_matching: "Aucun(e) %{value} n'a été trouvé correspondant à"
525
+ copy_permissions: Copier les permissions de %{value}
526
+ could_not_find: "Aucun(e) %{value} n'a été trouvé(e). N'hésitez pas à "
527
+ could_not_find_matching: "Aucun(e) %{value} n'a été trouvé(e) correspondant à"
507
528
  create_new: créer un(e)
508
- select_existing: sélectionnez
529
+ create_a_new: créer un(e)
530
+ select_existing: sélectionnez un(e)
509
531
  delete: Supprimer
510
- discard: Discard # TODO
532
+ discard: Abandonner
511
533
  edit: Modifier
512
534
  items_total: '%{count} total.'
513
- less: Less... # TODO
535
+ less: Moins...
514
536
  me: moi
515
- more: More... # TODO
516
- n_a: N/A
537
+ more: Plus...
538
+ n_a: N/R
517
539
  name: Nom
518
- no_match: Acun(e) %{value} ne correspond
519
- no_recent_items: "Il n'y rien de récent à afficher"
540
+ no_match: Aucun(e) %{value} ne correspond
541
+ no_recent_items: "Il n'y rien de récent à afficher pour l'instant."
520
542
  options: Options
521
543
  permissions: Permissions
522
- please_retry: tentez une autre requête.
544
+ please_retry: essayez une autre requête.
523
545
  recent_items: Objets récents
546
+ select_contact: Choisir un contact
547
+ select_lead: Choisir une piste
548
+ select_task: Choisir une tâche
549
+ select_opportunity: Choisir une opportunité
524
550
  search_assets: Recherche de %{value}
525
- time_ago: "il y à %{value}"
551
+ time_ago: "il y a %{value}"
552
+ background_info: Informations
553
+ address: Adresse
554
+ street1: Rue 1 # NEW
555
+ street2: Rue 2 # NEW
556
+ city: Ville
557
+ zipcode: Code postal
558
+ state: Région
559
+ country: Pays
560
+ select_a_country: Choisir un pays
561
+ expand_all: Tout déplier
562
+ collapse_all: Tout replier
563
+ expanded: déplier
564
+ collapsed: replier
526
565
 
527
566
  # Views -> Layout.
528
567
  #----------------------------------------------------------------------------
529
568
  about: A propos
530
- about_dev_group: Groupe de discussion développeur
569
+ about_dev_group: Groupe de discussion pour les développeurs
531
570
  about_features: Fonctionnalités et bugs
532
- about_ffc: A propos Fat Free CRM
533
- about_ffc_resources: Ressources Fat Free CRM (Nouvelle fenêtre)
534
- about_ffc_version: Fat Free CRM version
571
+ about_ffc: A propos de Fat Free CRM
572
+ about_ffc_resources: Ressources pour Fat Free CRM (Nouvelle fenêtre)
573
+ about_ffc_version: version de Fat Free CRM
535
574
  about_home_page: "Page d'accueil"
536
575
  about_project_page: Page du projet
537
576
  about_thank_you: "Merci d'utiliser Fat Free CRM!"
538
- about_twitter: Twitter commit updates
539
- about_user_group: Discussion group for users
540
- admin: Admin
541
- logout: Déconnection
577
+ about_twitter: mises à jours sur Twitter
578
+ about_user_group: Groupe de discussion pour les utilisateurs
579
+ admin: Administration
580
+ logout: Se déconnecter
542
581
  quick_find: Recherche rapide
543
- welcome: Bienvenu
582
+ welcome: Bienvenue
583
+
584
+ # Views -> Advanced Search.
585
+ accounts_advanced_search: Recherche avancée des comptes
586
+ advanced_search: Recherche avancée
587
+ advanced_search_submit: Rechercher
588
+ advanced_search_add_group: Ajouter un groupe de filtres
589
+ advanced_search_group_first: Afficher les enregistrement quand %{combinator} du/des critère(s) suivant(s) correspond(ent)
590
+ advanced_search_group_rest: ...et quand %{combinator} du/des critère(s) suivant(s) correspond(ent)
591
+ advanced_search_add_condition: Ajouter un filtre
592
+ advanced_search_remove_condition: Supprimer un filtre
593
+
594
+ ransack:
595
+ predicates:
596
+ eq: est égal à
597
+ not_eq: est différent de
598
+ lt: est plus petit que
599
+ gt: est plus grand que
600
+ matches: ressemble à
601
+ does_not_match: ne ressemble pas à
602
+ cont: contient
603
+ not_cont: ne contient pas
604
+ blank: est vide
605
+ present: est présent
606
+ "null": est nul
607
+ not_null: est non nul
608
+
544
609
 
545
610
  # Views -> Comments.
546
611
  #----------------------------------------------------------------------------
@@ -557,16 +622,15 @@ fr:
557
622
 
558
623
  # Views -> Admin
559
624
  #----------------------------------------------------------------------------
560
- # TODO
561
- back_to_crm: Back to Fat Free CRM
562
- crm_admin_page: Fat Free CRM Administration
625
+ back_to_crm: Retour à Fat Free CRM
626
+ crm_admin_page: Administration de Fat Free CRM
563
627
 
564
628
  # Views -> Admin -> Users.
565
629
  #----------------------------------------------------------------------------
566
630
  approve: Approuver
567
631
  create_user: Créer un utilisateur
568
- last_seen: vu pour la dernière fois il y à %{value}
569
- personal_information: Informations personnelles
632
+ last_seen: vu pour la dernière fois il y a %{value}
633
+ personal_information: Informations complémentaires
570
634
  reactivate: Réactiver
571
635
  save_user: "Enregistrer l'utilisateur"
572
636
  suspend: Suspendre
@@ -576,29 +640,56 @@ fr:
576
640
  user_confirm_delete: Un utilisateur ne peut être supprimé que si aucun objet lui appartenant existent toujours.
577
641
  user_is_admin: "L'utilisateur est administrateur"
578
642
  user_never_logged_in: "ne s'est pas encore connecté"
579
- user_signed_up: Est enregistré
643
+ user_signed_up: est enregistré
580
644
  user_signed_up_on: "s'est enregistré le %{value}"
581
- user_since: utilisateur depuis %{value}
645
+ user_since: utilisateur depuis le %{value}
582
646
  user_suspended: Suspendu
583
647
  user_suspended_on: suspendu le %{value}
584
648
  users: Utilisateurs
585
649
  users_small: utilisateurs
586
650
 
651
+ # Views -> Versions
652
+ #----------------------------------------------------------------------------
653
+ versions: Historique
654
+ version:
655
+ create: Créé par %{by} il y a %{when}.
656
+ update: Modifié par %{by} il y a %{when}.
657
+ destroy: Détruit par %{by} il y a %{when}.
658
+ set: %{attr} renseigné %{to}
659
+ unset: %{attr} supprimé
660
+ change: %{attr} changé de %{from} à %{to}
661
+ anonymous: anonyme
662
+
663
+ # Export.
664
+ #----------------------------------------------------------------------------
665
+ to_xls: Exporter au format Excel
666
+ to_csv: Exporter au format CSV (enregistrements supprimés inclus)
667
+ to_rss: fil RSS
668
+ to_atom: fil Atom
669
+
587
670
  # Dropbox.
588
671
  #----------------------------------------------------------------------------
589
- dropbox_ack_subject: dropbox - Ajouté email - %{subject}
590
- dropbox_ack_intro: D'ajouter l'email que vous avez envoyé à la sélection
591
- dropbox_ack_to: Ajoutés aux
672
+ dropbox_ack_subject: dropbox - Email ajouté - %{subject}
673
+ dropbox_ack_intro: "a ajouté l'email que vous avez envoyé à la dropbox"
674
+ dropbox_ack_to: ajoutés aux
592
675
  subject: Sujet
593
676
  body: Corps
594
-
677
+
678
+ # Lists
679
+ #----------------------------------------------------------------------------
680
+ lists: Listes
681
+ list: Liste
682
+ no_saved_lists: Liste non sauvegardée
683
+ make_current_view_list: Faire de la vue courante une liste
684
+ list_name_info: Si vous utilisez le nom d'une liste existante vous écraserez cette liste avec vos paramètres courants
685
+
595
686
  # Pluralizations.
596
687
  #----------------------------------------------------------------------------
597
688
  pluralize:
598
689
  comment:
599
- one: '1 comment' # TODO
600
- other: '%{count} comments' # TODO
601
- contact:
690
+ one: '1 commentaire'
691
+ other: '%{count} commentaires'
692
+ contact:
602
693
  one: '1 contact'
603
694
  other: '%{count} contacts'
604
695
  opportunity:
@@ -620,14 +711,138 @@ fr:
620
711
  formats:
621
712
  mmddyyyy: "%d/%m/%Y"
622
713
  mmdd: "%e %b"
623
- mmddyy: "%e %b, %Y"
714
+ mmddyy: "%e %b %Y"
624
715
 
625
716
  time:
626
717
  formats:
627
- mmddhhss: "%e %b à %l:%M%p"
628
-
718
+ mmddhhss: "%b %e à %H:%M%"
719
+ mmddyyyy_hhmm: "%d/%m/%Y à %H:%M"
720
+
629
721
  calendar_date_select:
630
722
  ok: OK
631
723
  now: Maintenant
632
724
  today: "Aujourd'hui"
633
725
  clear: Vider
726
+
727
+ # If you need custom format look at
728
+ # http://code.google.com/p/calendardateselect/wiki/ChangingDateFormatCustom
729
+ calendar_date_select_format: french
730
+
731
+ # will_paginate translations copied for 'fr'
732
+ #----------------------------------------------------------------------------
733
+ will_paginate:
734
+ previous_label: "&#8592; Précédent"
735
+ next_label: "Suivant &#8594;"
736
+ page_gap: "&hellip;"
737
+
738
+ page_entries_info:
739
+ single_page:
740
+ zero: "Aucun(e) %{name} trouvé"
741
+ one: "Affichage de 1 %{name}"
742
+ other: "Affichage de %{count} %{plural}"
743
+
744
+ multi_page: "Affichage des %{plural} %{from} à %{to} de %{total} au total"
745
+
746
+
747
+ # Views -> Admin -> Custom Fields
748
+ #----------------------------------------------------------------------------
749
+ label: Etiquette
750
+ custom_fields: Champs personnalisés
751
+ custom_field_options: Options des champs personnalisés
752
+ create_field: Créer un champ
753
+ save_field: Enregistrer le champ
754
+ create_field_group: Créer une section (groupe de champs)
755
+ edit_field_group: Editer la section
756
+ save_field_group: enregistrer la section
757
+
758
+ field_group_empty: "Il n'y a aucun champ dans cette section"
759
+
760
+ select_or_create_tags: "Sélectionner un tag ou créez un nouveau tag en validant par la touche entrée."
761
+
762
+ restrict_by_tag: Restriction par tag
763
+ restrict_by_tag_info: Cette section ne sera visible que pour les %{assets} qui seront taggé(e)s"
764
+ field_group_tag_restriction: Cette section est visible pour les %{assets} qui sont taggé(e)s "%{tag}"
765
+ field_group_unrestricted: "Cette section est visible pour l'ensemble des %{assets}"
766
+ field_group_confirm_delete: Quand une section est supprimée, tous les champs personnalisés sont déplacés vers la section par défaut.
767
+ msg_cant_delete_field_group: Cette section ne peut pas être supprimée.
768
+
769
+ admin_fields_info: |
770
+ Les champs personnalisés sont affichés dans des sections.
771
+ Créez d'abord une nouvelle section, ou ajoutez les champs dans une section existante ci-dessous.<br />
772
+ Vous pouvez faire glisser les champs pour ordonner leur présentation ou les faire changer de section.
773
+
774
+ # Views -> Admin -> Tags
775
+ #----------------------------------------------------------------------------
776
+ tags: Tags
777
+ tag_small: tag
778
+ tagged: taggé(es)
779
+ create_tag: Créer un tag
780
+ save_tag: Enregistrer le tag
781
+ field_group_tags: Sections visibles pour ce tag
782
+ tag_with_taggings_confirm_delete: "En supprimant ce tag, il sera supprimé de %{value} enregistrements."
783
+ msg_cant_delete_tag: "Impossible de supprimer '%{value}' car il est associé à au moins une section."
784
+
785
+
786
+ # Views -> Admin -> Plugins
787
+ #----------------------------------------------------------------------------
788
+ views:
789
+ admin:
790
+ plugins:
791
+ author: Auteur
792
+ version: Version
793
+ description: Description
794
+
795
+ # Simple Form translations
796
+ #----------------------------------------------------------------------------
797
+ simple_form:
798
+ "yes": 'Oui'
799
+ "no": 'Non'
800
+ required:
801
+ text: 'required'
802
+ mark: '*'
803
+ # You can uncomment the line below if you need to overwrite the whole required html.
804
+ # When using html, text and mark won't be used.
805
+ # html: '<abbr title="required">*</abbr>'
806
+ error_notification:
807
+ default_message: "Votre demande ne peut aboutir, les erreurs suivantes se sont déclenchées:"
808
+ # Labels and hints examples
809
+ # labels:
810
+ # password: 'Password'
811
+ # user:
812
+ # new:
813
+ # email: 'E-mail para efetuar o sign in.'
814
+ # edit:
815
+ # email: 'E-mail.'
816
+ # hints:
817
+ # username: 'User name to sign in.'
818
+ # password: 'No special characters, please.'
819
+
820
+
821
+ # Form field types
822
+ #----------------------------------------------------------------------------
823
+ field_types:
824
+ string: Texte court
825
+ text: Texte long
826
+ select: Liste de sélection
827
+ multiselect: Liste de sélection (multiple)
828
+ radio: Boutons radios
829
+ boolean: Case à cocher
830
+ check_boxes: Liste de cases à cocher
831
+ date: Date
832
+ datetime: Date et heure
833
+ email: Adresse email
834
+ url: URL
835
+ tel: Numéro de téléphone
836
+ decimal: Nombre décimal
837
+ integer: Nombre entier
838
+ float: Nombre flottant
839
+
840
+ # dynamic_form plugin translations.
841
+ #----------------------------------------------------------------------------
842
+ errors:
843
+ template:
844
+ header:
845
+ one: "Impossible d'enregistrer ce %{model} : 1 erreur"
846
+ other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
847
+ body: "Veuillez vérifier les champs suivants : "
848
+