fat_free_crm 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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
+