fat_free_crm 0.19.2 → 0.20.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/brakeman-analysis.yml +46 -0
- data/.github/workflows/rubocop-analysis.yml +40 -0
- data/.github/workflows/ruby.yml +52 -0
- data/.rubocop_todo.yml +49 -43
- data/.travis.yml +1 -20
- data/CHANGELOG.md +13 -0
- data/Gemfile +9 -5
- data/Gemfile.lock +163 -119
- data/README.md +4 -3
- data/SECURITY.md +11 -0
- data/app/assets/javascripts/application.js.erb +3 -0
- data/app/assets/stylesheets/application.css.erb +1 -0
- data/app/assets/stylesheets/base.scss +9 -2
- data/app/assets/stylesheets/bootstrap-custom.scss +206 -0
- data/app/assets/stylesheets/common.scss +87 -67
- data/app/assets/stylesheets/header.scss +0 -8
- data/app/controllers/admin/field_groups_controller.rb +1 -1
- data/app/controllers/admin/fields_controller.rb +1 -1
- data/app/controllers/admin/groups_controller.rb +1 -1
- data/app/controllers/admin/tags_controller.rb +2 -2
- data/app/controllers/admin/users_controller.rb +2 -1
- data/app/controllers/application_controller.rb +10 -0
- data/app/controllers/comments_controller.rb +1 -1
- data/app/controllers/entities/accounts_controller.rb +1 -1
- data/app/controllers/entities/campaigns_controller.rb +1 -1
- data/app/controllers/home_controller.rb +3 -1
- data/app/controllers/lists_controller.rb +1 -1
- data/app/controllers/tasks_controller.rb +3 -3
- data/app/controllers/users_controller.rb +3 -1
- data/app/helpers/accounts_helper.rb +12 -0
- data/app/helpers/application_helper.rb +3 -5
- data/app/helpers/tasks_helper.rb +2 -2
- data/app/models/entities/account.rb +1 -1
- data/app/models/entities/account_contact.rb +1 -1
- data/app/models/entities/account_opportunity.rb +1 -1
- data/app/models/entities/campaign.rb +1 -1
- data/app/models/entities/contact.rb +1 -1
- data/app/models/entities/lead.rb +1 -1
- data/app/models/entities/opportunity.rb +1 -1
- data/app/models/fields/custom_field_pair.rb +2 -2
- data/app/models/observers/opportunity_observer.rb +1 -1
- data/app/models/polymorphic/address.rb +1 -1
- data/app/models/polymorphic/comment.rb +1 -1
- data/app/models/polymorphic/email.rb +1 -1
- data/app/models/polymorphic/task.rb +1 -1
- data/app/models/setting.rb +4 -2
- data/app/models/users/preference.rb +2 -2
- data/app/models/users/user.rb +2 -2
- data/app/views/accounts/_edit.html.haml +2 -2
- data/app/views/accounts/_new.html.haml +2 -2
- data/app/views/accounts/_sidebar_index.html.haml +2 -2
- data/app/views/accounts/_sidebar_show.html.haml +19 -19
- data/app/views/accounts/create.js.haml +1 -2
- data/app/views/accounts/destroy.js.haml +1 -1
- data/app/views/accounts/show.html.haml +1 -0
- data/app/views/accounts/update.js.haml +2 -3
- data/app/views/admin/field_groups/create.js.haml +0 -1
- data/app/views/admin/field_groups/destroy.js.haml +0 -1
- data/app/views/admin/field_groups/update.js.haml +0 -1
- data/app/views/admin/fields/create.js.haml +0 -1
- data/app/views/admin/fields/destroy.js.haml +0 -1
- data/app/views/admin/fields/update.js.haml +0 -1
- data/app/views/admin/groups/create.js.haml +0 -1
- data/app/views/admin/groups/destroy.js.haml +0 -1
- data/app/views/admin/groups/update.js.haml +0 -1
- data/app/views/admin/tags/create.js.haml +0 -1
- data/app/views/admin/tags/destroy.js.haml +0 -1
- data/app/views/admin/tags/update.js.haml +0 -1
- data/app/views/admin/users/create.js.haml +0 -1
- data/app/views/admin/users/destroy.js.haml +0 -1
- data/app/views/admin/users/update.js.haml +0 -1
- data/app/views/campaigns/_edit.html.haml +1 -1
- data/app/views/campaigns/_new.html.haml +1 -1
- data/app/views/campaigns/_sidebar_index.html.haml +2 -2
- data/app/views/campaigns/_sidebar_show.html.haml +68 -67
- data/app/views/campaigns/create.js.haml +1 -2
- data/app/views/campaigns/destroy.js.haml +1 -1
- data/app/views/campaigns/show.html.haml +1 -0
- data/app/views/campaigns/update.js.haml +3 -4
- data/app/views/comments/_edit.html.haml +1 -1
- data/app/views/comments/_new.html.haml +1 -1
- data/app/views/comments/update.js.haml +0 -1
- data/app/views/contacts/_edit.html.haml +1 -1
- data/app/views/contacts/_new.html.haml +1 -1
- data/app/views/contacts/_sidebar_show.html.haml +18 -18
- data/app/views/contacts/create.js.haml +0 -1
- data/app/views/contacts/destroy.js.haml +1 -1
- data/app/views/contacts/show.html.haml +1 -0
- data/app/views/contacts/update.js.haml +2 -3
- data/app/views/entities/_title_bar.html.haml +1 -1
- data/app/views/entities/attach.js.haml +2 -2
- data/app/views/entities/discard.js.haml +2 -2
- data/app/views/home/_opportunity.html.haml +1 -1
- data/app/views/home/_task.html.haml +1 -1
- data/app/views/home/index.xls.builder +51 -0
- data/app/views/layouts/_sidebar.html.haml +2 -2
- data/app/views/layouts/_tabbed.html.haml +14 -11
- data/app/views/layouts/application.html.haml +2 -2
- data/app/views/leads/_edit.html.haml +2 -2
- data/app/views/leads/_new.html.haml +2 -2
- data/app/views/leads/_sidebar_index.html.haml +2 -2
- data/app/views/leads/_sidebar_show.html.haml +30 -30
- data/app/views/leads/create.js.haml +2 -3
- data/app/views/leads/destroy.js.haml +2 -2
- data/app/views/leads/promote.js.haml +3 -4
- data/app/views/leads/reject.js.haml +3 -3
- data/app/views/leads/show.html.haml +1 -1
- data/app/views/leads/update.js.haml +4 -5
- data/app/views/lists/create.js.haml +0 -1
- data/app/views/opportunities/_edit.html.haml +1 -1
- data/app/views/opportunities/_index_brief.html.haml +1 -1
- data/app/views/opportunities/_index_long.html.haml +1 -1
- data/app/views/opportunities/_new.html.haml +1 -1
- data/app/views/opportunities/_sidebar_index.html.haml +2 -2
- data/app/views/opportunities/_sidebar_show.html.haml +47 -46
- data/app/views/opportunities/create.js.haml +3 -4
- data/app/views/opportunities/destroy.js.haml +3 -3
- data/app/views/opportunities/show.html.haml +1 -0
- data/app/views/opportunities/update.js.haml +5 -6
- data/app/views/shared/_inline_styles.html.haml +0 -26
- data/app/views/tasks/_assigned.html.haml +1 -1
- data/app/views/tasks/_completed.html.haml +1 -1
- data/app/views/tasks/_edit.html.haml +1 -1
- data/app/views/tasks/_new.html.haml +1 -1
- data/app/views/tasks/_pending.html.haml +1 -1
- data/app/views/tasks/_related.html.haml +1 -1
- data/app/views/tasks/_selector.html.haml +7 -8
- data/app/views/tasks/_sidebar_index.html.haml +2 -2
- data/app/views/tasks/_title.html.haml +1 -1
- data/app/views/tasks/complete.js.haml +1 -1
- data/app/views/tasks/create.js.haml +1 -2
- data/app/views/tasks/destroy.js.haml +1 -1
- data/app/views/tasks/uncomplete.js.haml +1 -2
- data/app/views/tasks/update.js.haml +0 -1
- data/app/views/users/change_password.js.haml +0 -1
- data/app/views/users/update.js.haml +0 -1
- data/app/views/users/upload_avatar.js.haml +0 -1
- data/app/views/versions/_version_item.html.haml +1 -1
- data/bin/setup +6 -6
- data/config/application.rb +1 -1
- data/config/environment.rb +1 -1
- data/config/initializers/content_security_policy.rb +5 -0
- data/config/initializers/new_framework_defaults_6_0.rb +46 -0
- data/config/initializers/simple_form.rb +135 -55
- data/config/initializers/simple_form_bootstrap.rb +433 -0
- data/config/locales/fat_free_crm.cs.yml +86 -47
- data/config/locales/fat_free_crm.ru.yml +1 -0
- data/config/settings.default.yml +0 -41
- data/db/migrate/20200806004152_add_pattern_to_fields.rb +7 -0
- data/db/migrate/20200806004459_add_html5_to_fields.rb +10 -0
- data/db/schema.rb +11 -6
- data/fat_free_crm.gemspec +4 -4
- data/lib/fat_free_crm/core_ext.rb +1 -1
- data/lib/fat_free_crm/gem_ext.rb +0 -1
- data/lib/fat_free_crm/tabs.rb +2 -2
- data/lib/fat_free_crm/version.rb +2 -2
- data/lib/gravatar_image_tag.rb +1 -1
- data/lib/tasks/ffcrm/preference_update.rake +19 -0
- data/lib/tasks/ffcrm/setup.rake +1 -1
- data/lib/templates/erb/scaffold/_form.html.erb +4 -2
- data/spec/controllers/comments_controller_spec.rb +6 -6
- data/spec/controllers/home_controller_spec.rb +3 -3
- data/spec/controllers/users_controller_spec.rb +13 -1
- data/spec/factories/user_factories.rb +5 -2
- data/spec/features/acceptance_helper.rb +1 -1
- data/spec/features/accounts_spec.rb +2 -2
- data/spec/features/admin/groups_spec.rb +1 -1
- data/spec/features/admin/users_spec.rb +1 -1
- data/spec/features/campaigns_spec.rb +2 -2
- data/spec/features/contacts_spec.rb +2 -5
- data/spec/features/leads_spec.rb +11 -7
- data/spec/features/opportunities_spec.rb +4 -4
- data/spec/features/support/browser.rb +6 -2
- data/spec/features/support/selector_helpers.rb +10 -1
- data/spec/features/tasks_spec.rb +6 -6
- data/spec/helpers/accounts_helper_spec.rb +57 -0
- data/spec/models/entities/opportunity_spec.rb +2 -2
- data/spec/models/fields/custom_field_pair_spec.rb +2 -2
- data/spec/models/observers/entity_observer_spec.rb +3 -3
- data/spec/models/polymorphic/task_spec.rb +11 -11
- data/spec/models/polymorphic/version_spec.rb +2 -2
- data/spec/models/users/preference_spec.rb +1 -1
- data/spec/views/accounts/_edit.haml_spec.rb +1 -1
- data/spec/views/accounts/_new.haml_spec.rb +1 -1
- data/spec/views/accounts/create.js.haml_spec.rb +0 -1
- data/spec/views/accounts/update.js.haml_spec.rb +2 -5
- data/spec/views/admin/field_groups/create.js.haml_spec.rb +0 -1
- data/spec/views/admin/field_groups/update.js.haml_spec.rb +0 -1
- data/spec/views/admin/users/create.js.haml_spec.rb +0 -1
- data/spec/views/admin/users/destroy.js.haml_spec.rb +0 -6
- data/spec/views/admin/users/update.js.haml_spec.rb +1 -2
- data/spec/views/campaigns/_edit.haml_spec.rb +1 -1
- data/spec/views/campaigns/_new.haml_spec.rb +1 -1
- data/spec/views/campaigns/create.js.haml_spec.rb +0 -1
- data/spec/views/campaigns/destroy.js.haml_spec.rb +0 -1
- data/spec/views/campaigns/update.js.haml_spec.rb +2 -6
- data/spec/views/contacts/_edit.haml_spec.rb +1 -1
- data/spec/views/contacts/_new.haml_spec.rb +1 -1
- data/spec/views/contacts/create.js.haml_spec.rb +0 -1
- data/spec/views/contacts/update.js.haml_spec.rb +3 -7
- data/spec/views/home/index.haml_spec.rb +2 -2
- data/spec/views/leads/_edit.haml_spec.rb +1 -1
- data/spec/views/leads/_new.haml_spec.rb +1 -1
- data/spec/views/leads/create.js.haml_spec.rb +0 -3
- data/spec/views/leads/destroy.js.haml_spec.rb +0 -2
- data/spec/views/leads/promote.js.haml_spec.rb +3 -11
- data/spec/views/leads/reject.js.haml_spec.rb +0 -3
- data/spec/views/leads/update.js.haml_spec.rb +3 -11
- data/spec/views/opportunities/_edit.haml_spec.rb +1 -1
- data/spec/views/opportunities/_new.haml_spec.rb +1 -1
- data/spec/views/opportunities/create.js.haml_spec.rb +0 -2
- data/spec/views/opportunities/destroy.js.haml_spec.rb +0 -3
- data/spec/views/opportunities/update.js.haml_spec.rb +3 -11
- data/spec/views/tasks/_edit.haml_spec.rb +1 -1
- data/spec/views/tasks/complete.js.haml_spec.rb +0 -1
- data/spec/views/tasks/create.js.haml_spec.rb +0 -2
- data/spec/views/tasks/destroy.js.haml_spec.rb +0 -1
- data/spec/views/tasks/uncomplete.js.haml_spec.rb +0 -1
- data/spec/views/tasks/update.js.haml_spec.rb +1 -4
- data/spec/views/users/change_password.js.haml_spec.rb +1 -2
- data/spec/views/users/update.js.haml_spec.rb +1 -2
- data/spec/views/users/upload_avatar.js.haml_spec.rb +1 -2
- metadata +23 -14
- data/config/initializers/new_framework_defaults_5_2.rb +0 -40
- data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +0 -24
@@ -4,29 +4,40 @@
|
|
4
4
|
---
|
5
5
|
cs:
|
6
6
|
language: Český (CZ)
|
7
|
+
|
8
|
+
# Generic terms.
|
9
|
+
#----------------------------------------------------------------------------
|
10
|
+
id: Id
|
7
11
|
all: Vše
|
8
12
|
at: v
|
9
13
|
here: zde
|
10
14
|
no_button: Ne
|
11
|
-
not_implemented:
|
15
|
+
not_implemented: Nelze použít.
|
12
16
|
or: nebo
|
13
17
|
select_none: -- nic --
|
14
|
-
select_blank: --
|
18
|
+
select_blank: -- vyberte --
|
15
19
|
yes_button: Ano
|
20
|
+
|
21
|
+
|
22
|
+
# Settings.
|
23
|
+
#----------------------------------------------------------------------------
|
16
24
|
tab_dashboard: Hlavní panel
|
17
25
|
tab_tasks: Úkoly
|
18
26
|
tab_campaigns: Kampaně
|
19
|
-
tab_leads:
|
27
|
+
tab_leads: Potenciální klienti
|
20
28
|
tab_accounts: Klienti
|
21
29
|
tab_contacts: Kontakty
|
22
30
|
tab_opportunities: Příležitosti
|
31
|
+
tab_team: Tým
|
32
|
+
admin_tab_groups: Skupiny
|
23
33
|
admin_tab_users: Uživatelé
|
24
34
|
admin_tab_fields: Pole
|
35
|
+
admin_tab_tags: Štítky
|
25
36
|
admin_tab_settings: Nastavení
|
26
37
|
admin_tab_plugins: Pluginy
|
27
38
|
affiliate: Pobočka
|
28
39
|
competitor: Konkurent
|
29
|
-
customer:
|
40
|
+
customer: Klient
|
30
41
|
partner: Partner
|
31
42
|
reseller: Přeprodejce
|
32
43
|
vendor: Prodejce
|
@@ -42,10 +53,10 @@ cs:
|
|
42
53
|
cold_call: První zavolání
|
43
54
|
conference: Konference
|
44
55
|
online: Online Marketing
|
45
|
-
referral:
|
46
|
-
self:
|
47
|
-
web:
|
48
|
-
word_of_mouth:
|
56
|
+
referral: Na doporučení
|
57
|
+
self: Samovolně získaný
|
58
|
+
web: Webová stránka
|
59
|
+
word_of_mouth: Šuškanda
|
49
60
|
other: Ostatní
|
50
61
|
prospecting: Průzkum
|
51
62
|
analysis: Analýza
|
@@ -53,11 +64,11 @@ cs:
|
|
53
64
|
proposal: Nabídka
|
54
65
|
negotiation: Jednání
|
55
66
|
final_review: Závěrečné hodnocení
|
56
|
-
won:
|
57
|
-
lost:
|
67
|
+
won: Uzavřeno/Získáno
|
68
|
+
lost: Uzavřeno/Nezískáno
|
58
69
|
call: Volání
|
59
70
|
email: Email
|
60
|
-
follow_up:
|
71
|
+
follow_up: Připomenutí
|
61
72
|
lunch: Oběd
|
62
73
|
meeting: Schůzka
|
63
74
|
money: Peníze
|
@@ -71,16 +82,22 @@ cs:
|
|
71
82
|
due_later: Někdy později
|
72
83
|
due_specific_date: V konkrétní datum...
|
73
84
|
completed_today: Dnes
|
74
|
-
completed_yesterday:
|
85
|
+
completed_yesterday: Včera
|
75
86
|
completed_last_week: Minulý týden
|
76
87
|
completed_this_month: Tento měsíc
|
77
88
|
completed_last_month: Minulý měsíc
|
78
|
-
|
79
|
-
|
89
|
+
|
90
|
+
# Models/Activity.
|
91
|
+
#----------------------------------------------------------------------------
|
92
|
+
one_hour: Hodina
|
93
|
+
one_day: Den
|
80
94
|
two_days: Dva dny
|
81
|
-
one_week:
|
95
|
+
one_week: Týden
|
82
96
|
two_weeks: Dva týdny
|
83
|
-
one_month:
|
97
|
+
one_month: Měsíc
|
98
|
+
|
99
|
+
# Model Validations.
|
100
|
+
#----------------------------------------------------------------------------
|
84
101
|
activerecord:
|
85
102
|
errors:
|
86
103
|
models:
|
@@ -95,11 +112,11 @@ cs:
|
|
95
112
|
name:
|
96
113
|
missing_account_name: ^Zadejte jméno klienta.
|
97
114
|
access:
|
98
|
-
share_account: ^Určete uživatele pro sdílení klienta
|
115
|
+
share_account: ^Určete uživatele pro sdílení klienta.
|
99
116
|
campaign:
|
100
117
|
attributes:
|
101
118
|
name:
|
102
|
-
missing_campaign_name: ^Zadejte
|
119
|
+
missing_campaign_name: ^Zadejte název kampaně.
|
103
120
|
ends_on:
|
104
121
|
dates_not_in_sequence: ^Ujistěte se, že počáteční datum je před konečným.
|
105
122
|
access:
|
@@ -125,7 +142,7 @@ cs:
|
|
125
142
|
name:
|
126
143
|
missing_opportunity_name: ^Zadejte název příležitosti.
|
127
144
|
access:
|
128
|
-
share_opportunity: ^
|
145
|
+
share_opportunity: ^Zvolte uživatele pro sdílení příležitosti.
|
129
146
|
task:
|
130
147
|
attributes:
|
131
148
|
name:
|
@@ -136,11 +153,11 @@ cs:
|
|
136
153
|
attributes:
|
137
154
|
username:
|
138
155
|
missing_username: ^Zadejte jméno uživatele.
|
139
|
-
username_taken: ^
|
156
|
+
username_taken: ^Uživatel již existuje.
|
140
157
|
email:
|
141
158
|
missing_email: ^Zadejte email.
|
142
159
|
email_in_use: ^Uživatel s tímto emailem je již v systému zaveden.
|
143
|
-
msg_account_suspended:
|
160
|
+
msg_account_suspended: Uživatelský účet byl pozastaven.
|
144
161
|
password_reset_instruction: instrukce resetování hesla
|
145
162
|
msg_account_created: Váš účet byl vytvořen a čeká na schválení administrátorem.
|
146
163
|
msg_account_not_approved: Váš účet ještě nebyl schválen.
|
@@ -185,14 +202,14 @@ cs:
|
|
185
202
|
option_ends_on: koncové datum
|
186
203
|
option_first_name: Jméno
|
187
204
|
option_last_name: Příjmení
|
188
|
-
option_leads_count: aktuální z
|
205
|
+
option_leads_count: aktuální z potenciálních klientů
|
189
206
|
option_long: dlouhý
|
190
207
|
option_name: Název
|
191
208
|
option_probability: pravděpodobnost
|
192
209
|
option_rating: hodnocení
|
193
210
|
option_revenue: aktální výnos
|
194
211
|
option_starts_on: počáteční datum
|
195
|
-
option_target_leads: cíloví
|
212
|
+
option_target_leads: cíloví potenciální klienti
|
196
213
|
option_target_revenue: cílový výnos
|
197
214
|
option_updated_at: upraveno
|
198
215
|
all_events_past_participle: a všechny akce vytvořené
|
@@ -222,7 +239,7 @@ cs:
|
|
222
239
|
image_help: Obrázek který nahrajete bude automaticky převeden na velikost 75 x 75
|
223
240
|
pixelů. Podporované formáty jsou GIF, JPG, and PNG.
|
224
241
|
job_title: Popis
|
225
|
-
last_name:
|
242
|
+
last_name: Příjmení
|
226
243
|
login_now_link: Přihlašte se!
|
227
244
|
mobile: Mobil
|
228
245
|
my_profile: Můj profil
|
@@ -278,7 +295,7 @@ cs:
|
|
278
295
|
budget: Rozpočet
|
279
296
|
budget_label: Ropočet (CZK)
|
280
297
|
campaign: Kampaň
|
281
|
-
campaign_and_leads: Kampaň a
|
298
|
+
campaign_and_leads: Kampaň a potenciální klienti
|
282
299
|
campaign_small: kampaň
|
283
300
|
campaign_summary: Přehled kampaně
|
284
301
|
campaign_targets: Cíle kampaně
|
@@ -293,10 +310,10 @@ cs:
|
|
293
310
|
finished_on: hotovo na %{value}
|
294
311
|
finishes_in: hotovo za %{value}
|
295
312
|
no_start_date: nebyl určeno počáteční datum
|
296
|
-
number_of_leads:
|
313
|
+
number_of_leads: Potenciálních klientů
|
297
314
|
objectives: Cíle
|
298
|
-
objectives_help: Zadejte cílový počet budoucích
|
299
|
-
z
|
315
|
+
objectives_help: Zadejte cílový počet budoucích potenciálních klientů, poměr konverze
|
316
|
+
z potenciálních klientů do příležitostí, cílová tržba a rozpočet kampaně. Tato čísla
|
300
317
|
pomohou určit výkonost kampaně.
|
301
318
|
objectives_small: cíle kampaně
|
302
319
|
revenue: tržba
|
@@ -342,37 +359,37 @@ cs:
|
|
342
359
|
web_presence_small: webstránky
|
343
360
|
works_at: ! '%{job_title} v %{company}'
|
344
361
|
convert: Konvertovat
|
345
|
-
convert_lead: Konvertovat
|
362
|
+
convert_lead: Konvertovat potenciálního klienta
|
346
363
|
convert_lead_permissions_intro: Oprávnění kontaktu budou přenesena. Oprávnění můžete
|
347
364
|
změnit později.
|
348
|
-
convert_lead_text: Zkonvertováním
|
349
|
-
na existujícího nebo nového klienta. Status
|
350
|
-
create_lead: Přidat
|
365
|
+
convert_lead_text: Zkonvertováním potenciálního klienta %{value} vznikne kontkat pripojený
|
366
|
+
na existujícího nebo nového klienta. Status potenciálního klienta bude nastaven na konvertovaný.
|
367
|
+
create_lead: Přidat potenciálního klienta
|
351
368
|
create_opp_for_contact: Můžete automaticky vytvořit příležitost pro kontkat %{value}
|
352
369
|
tím že určíte jméno, aktuální stádium, očekávaný čas ukončení, prodejní pravděpodobnost,
|
353
370
|
objem nabídky, a nabídnutý rabat.
|
354
|
-
lead:
|
355
|
-
lead_info_small: kontakt
|
371
|
+
lead: potenciální klient
|
372
|
+
lead_info_small: kontakt potenciálního klienta
|
356
373
|
lead_permissions_intro_private: Standardně budou oprávnění zkopírována z kampaně
|
357
374
|
nebo jako soukromá. Oprávnění můžete změnit později.
|
358
375
|
lead_permissions_intro_public: Standardně budou oprávnění zkopírována z kampaně
|
359
376
|
nebo jako veřejná. Oprávnění můžete změnit později.
|
360
377
|
lead_permissions_intro_shared: Standardně budou oprávnění zkopírována z kampaně
|
361
378
|
nebo sdílená s určenými uživateli. Oprávnění můžete změnit později.
|
362
|
-
lead_small:
|
363
|
-
lead_status_small: stav
|
364
|
-
lead_summary: Souhrn
|
365
|
-
leads:
|
366
|
-
leads_options: Volby
|
367
|
-
leads_small:
|
379
|
+
lead_small: potenciální klient
|
380
|
+
lead_status_small: stav potenciálního klienta
|
381
|
+
lead_summary: Souhrn potenciálního klienta
|
382
|
+
leads: Potenciální klienti
|
383
|
+
leads_options: Volby potenciálních klientů
|
384
|
+
leads_small: Potenciální klienti
|
368
385
|
none: nic
|
369
386
|
rating: Hodnocení
|
370
387
|
reject: Odmítnutí
|
371
|
-
reject_lead_confirm: Jste si jistý že chcete nastavit
|
372
|
-
save_lead: Uložit
|
388
|
+
reject_lead_confirm: Jste si jistý že chcete nastavit potenciálního jako že odmítnul?
|
389
|
+
save_lead: Uložit potenciálního klienta
|
373
390
|
source: Zdroj
|
374
391
|
status: Stav
|
375
|
-
total_leads: Celkem
|
392
|
+
total_leads: Celkem potenciálních klientů
|
376
393
|
amount: Množství
|
377
394
|
close_date: Datum uzavření
|
378
395
|
closed_ago_on: uzavřeno před %{time_ago} v %{date}
|
@@ -460,7 +477,7 @@ cs:
|
|
460
477
|
subject_account: Klient
|
461
478
|
subject_campaign: Kampaň
|
462
479
|
subject_contact: Kontakt
|
463
|
-
subject_lead:
|
480
|
+
subject_lead: potenciální klient
|
464
481
|
subject_opportunity: Příležitost
|
465
482
|
subject_task: Úkol
|
466
483
|
add_note: Přidat poznámku
|
@@ -495,7 +512,7 @@ cs:
|
|
495
512
|
please_retry: zkuste prosím jiný dotaz.
|
496
513
|
recent_items: Aktuální položky
|
497
514
|
select_contact: Vyber kontakt
|
498
|
-
select_lead: Vyber
|
515
|
+
select_lead: Vyber potenciálního klienta
|
499
516
|
select_task: Vyber úkol
|
500
517
|
select_opportunity: Vyber příležitost
|
501
518
|
search_assets: Vyhledat %{value}
|
@@ -578,8 +595,8 @@ cs:
|
|
578
595
|
one: 1 příležitost
|
579
596
|
other: ! '%{count} příležitostí'
|
580
597
|
lead:
|
581
|
-
one: 1
|
582
|
-
other: ! '%{count}
|
598
|
+
one: 1 potenciální klient
|
599
|
+
other: ! '%{count} potenciálních klientů'
|
583
600
|
day:
|
584
601
|
one: 1 den
|
585
602
|
other: ! '%{count} dní'
|
@@ -608,3 +625,25 @@ cs:
|
|
608
625
|
custom_fields: Uživatelská pole
|
609
626
|
create_custom_field: Vytvořit uživatelské pole
|
610
627
|
create_new_custom_field_for: Vytvořit nové uživatelské pole pro %{klass_name}
|
628
|
+
no_saved_lists: Není uložený žádný seznam
|
629
|
+
personal_lists: Osobní seznam
|
630
|
+
global_lists: Sdílený seznam
|
631
|
+
basic_search: Vyhledávání
|
632
|
+
advanced_search: Pokročilé vyhledávání
|
633
|
+
opportunity_stages: Fáze příležitostí
|
634
|
+
no_opportunities_found: Nenalezeny žádné příležitosti
|
635
|
+
lead_statuses: Fáze potenciálních klientů
|
636
|
+
campaign_statuses: Fáze kampaní
|
637
|
+
my_accounts: Moji klienti
|
638
|
+
my_opportunities: Moje příležitosti
|
639
|
+
no_opportunity_records: Nenalezeny žádné příležitosti
|
640
|
+
my_tasks: Moje úkoly
|
641
|
+
versions: Aktualizace
|
642
|
+
unassigned: Nepřiřazeno
|
643
|
+
tags: Štítky
|
644
|
+
select_or_create_tags: Zvolte nebo vytvořte
|
645
|
+
comment: Komentáře
|
646
|
+
comment_intro: Přidejte komentář.
|
647
|
+
no_task_records: Nenalezeny žádné úlohy
|
648
|
+
no_account_records: Nenalezeny žádné záznamy
|
649
|
+
account_categories: Kategorie klientů
|
@@ -700,6 +700,7 @@ ru:
|
|
700
700
|
one: Найден %{count} результат.
|
701
701
|
other: Найдено %{count} результатов.
|
702
702
|
many: Найдено %{count} результатов.
|
703
|
+
few: Найдено %{count} результатов.
|
703
704
|
|
704
705
|
# Views -> Comments.
|
705
706
|
#----------------------------------------------------------------------------
|
data/config/settings.default.yml
CHANGED
@@ -285,14 +285,6 @@ account_category:
|
|
285
285
|
- :reseller
|
286
286
|
- :vendor
|
287
287
|
|
288
|
-
account_category_color:
|
289
|
-
:affiliate : lavender
|
290
|
-
:competitor : paleturquoise
|
291
|
-
:customer : pink
|
292
|
-
:partner : bisque
|
293
|
-
:reseller : thistle
|
294
|
-
:vendor : skyblue
|
295
|
-
|
296
288
|
# Campaign Status. To add custom status use string value, for example:
|
297
289
|
#
|
298
290
|
# campaign_status:
|
@@ -306,13 +298,6 @@ campaign_status:
|
|
306
298
|
- :on_hold
|
307
299
|
- :called_off
|
308
300
|
|
309
|
-
campaign_status_color:
|
310
|
-
:planned : Gold
|
311
|
-
:started : Turquoise
|
312
|
-
:completed : Lime
|
313
|
-
:on_hold : Orchid
|
314
|
-
:called_off : OrangeRed
|
315
|
-
|
316
301
|
# Lead Status and Source.
|
317
302
|
#------------------------------------------------------------------------------
|
318
303
|
lead_status:
|
@@ -321,12 +306,6 @@ lead_status:
|
|
321
306
|
- :converted
|
322
307
|
- :rejected
|
323
308
|
|
324
|
-
lead_status_color:
|
325
|
-
:new : Silver
|
326
|
-
:contacted : Turquoise
|
327
|
-
:converted : Lime
|
328
|
-
:rejected : OrangeRed
|
329
|
-
|
330
309
|
lead_source:
|
331
310
|
- :campaign
|
332
311
|
- :cold_call
|
@@ -351,16 +330,6 @@ opportunity_stage:
|
|
351
330
|
- :won
|
352
331
|
- :lost
|
353
332
|
|
354
|
-
opportunity_stage_color:
|
355
|
-
:prospecting : Silver
|
356
|
-
:analysis : PaleGoldenRod
|
357
|
-
:presentation : Salmon
|
358
|
-
:proposal : Gold
|
359
|
-
:negotiation : Orchid
|
360
|
-
:final_review : Turquoise
|
361
|
-
:won : Lime
|
362
|
-
:lost : OrangeRed
|
363
|
-
|
364
333
|
# Task Category, Due Date, and Completed Date.
|
365
334
|
#------------------------------------------------------------------------------
|
366
335
|
task_category:
|
@@ -373,16 +342,6 @@ task_category:
|
|
373
342
|
- :presentation
|
374
343
|
- :trip
|
375
344
|
|
376
|
-
task_category_color:
|
377
|
-
:call : Silver
|
378
|
-
:email : Turquoise
|
379
|
-
:follow_up : Gold
|
380
|
-
:lunch : Tomato
|
381
|
-
:meeting : Orchid
|
382
|
-
:money : Lime
|
383
|
-
:presentation : Salmon
|
384
|
-
:trip : Turquoise
|
385
|
-
|
386
345
|
task_bucket:
|
387
346
|
- :overdue
|
388
347
|
- :due_asap
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddHtml5ToFields < ActiveRecord::Migration[5.2]
|
4
|
+
def change
|
5
|
+
add_column :fields, :autofocus, :string
|
6
|
+
add_column :fields, :autocomplete, :string
|
7
|
+
add_column :fields, :list, :string
|
8
|
+
add_column :fields, :multiple, :string
|
9
|
+
end
|
10
|
+
end
|
data/db/schema.rb
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
# of editing this file, please use the migrations feature of Active Record to
|
3
3
|
# incrementally modify your database, and then regenerate this schema definition.
|
4
4
|
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# from scratch.
|
9
|
-
#
|
5
|
+
# This file is the source Rails uses to define your schema when running `rails
|
6
|
+
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
|
7
|
+
# be faster and is potentially less error prone than running all of your
|
8
|
+
# migrations from scratch. Old migrations may fail to apply correctly if those
|
9
|
+
# migrations use external dependencies or application code.
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 2020_08_06_004459) do
|
14
14
|
|
15
15
|
create_table "account_contacts", force: :cascade do |t|
|
16
16
|
t.integer "account_id"
|
@@ -223,6 +223,11 @@ ActiveRecord::Schema.define(version: 2018_01_07_082701) do
|
|
223
223
|
t.integer "pair_id"
|
224
224
|
t.text "settings"
|
225
225
|
t.integer "minlength", limit: 4, default: 0
|
226
|
+
t.string "pattern"
|
227
|
+
t.string "autofocus"
|
228
|
+
t.string "autocomplete"
|
229
|
+
t.string "list"
|
230
|
+
t.string "multiple"
|
226
231
|
t.index ["field_group_id"], name: "index_fields_on_field_group_id"
|
227
232
|
t.index ["name"], name: "index_fields_on_name"
|
228
233
|
end
|
data/fat_free_crm.gemspec
CHANGED
@@ -21,12 +21,12 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.required_ruby_version = '>= 2.4.0'
|
22
22
|
gem.license = 'MIT'
|
23
23
|
|
24
|
-
gem.add_dependency 'rails', '~>
|
24
|
+
gem.add_dependency 'rails', '~> 6.0.0'
|
25
25
|
gem.add_dependency 'rails-i18n'
|
26
26
|
gem.add_dependency 'rails-observers'
|
27
27
|
gem.add_dependency 'activemodel-serializers-xml'
|
28
28
|
gem.add_dependency 'sprockets-rails', '>= 3.0.0'
|
29
|
-
gem.add_dependency 'responders', '~>
|
29
|
+
gem.add_dependency 'responders', '~> 3.0'
|
30
30
|
gem.add_dependency 'jquery-rails'
|
31
31
|
gem.add_dependency 'jquery-migrate-rails'
|
32
32
|
gem.add_dependency 'jquery-ui-rails'
|
@@ -34,10 +34,10 @@ Gem::Specification.new do |gem|
|
|
34
34
|
gem.add_dependency 'simple_form'
|
35
35
|
gem.add_dependency 'will_paginate'
|
36
36
|
gem.add_dependency 'paperclip'
|
37
|
-
gem.add_dependency 'paper_trail', '~>
|
37
|
+
gem.add_dependency 'paper_trail', '~> 12.0.0'
|
38
38
|
gem.add_dependency 'devise', '~> 4.6'
|
39
39
|
gem.add_dependency 'devise-encryptable', '~> 0.2.0'
|
40
|
-
gem.add_dependency 'acts_as_commentable'
|
40
|
+
gem.add_dependency 'acts_as_commentable', '~> 6.0.0'
|
41
41
|
gem.add_dependency 'acts-as-taggable-on', '>= 3.4.3'
|
42
42
|
gem.add_dependency 'dynamic_form'
|
43
43
|
gem.add_dependency 'haml'
|
@@ -5,4 +5,4 @@
|
|
5
5
|
# Fat Free CRM is freely distributable under the terms of MIT license.
|
6
6
|
# See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
7
7
|
#------------------------------------------------------------------------------
|
8
|
-
Dir[File.dirname(__FILE__) + "/core_ext/*.rb"].each { |file| require(file) }
|
8
|
+
Dir[File.dirname(__FILE__) + "/core_ext/*.rb"].sort.each { |file| require(file) }
|
data/lib/fat_free_crm/gem_ext.rb
CHANGED
@@ -7,5 +7,4 @@
|
|
7
7
|
#------------------------------------------------------------------------------
|
8
8
|
require "fat_free_crm/gem_ext/active_support/buffered_logger"
|
9
9
|
require "fat_free_crm/gem_ext/action_controller/base"
|
10
|
-
require "fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper"
|
11
10
|
require "fat_free_crm/gem_ext/rake/task" if defined?(Rake)
|
data/lib/fat_free_crm/tabs.rb
CHANGED
@@ -14,11 +14,11 @@ module FatFreeCRM
|
|
14
14
|
#----------------------------------------------------------------------------
|
15
15
|
class << self
|
16
16
|
def main
|
17
|
-
@@main ||=
|
17
|
+
@@main ||= Setting[:tabs]&.dup
|
18
18
|
end
|
19
19
|
|
20
20
|
def admin
|
21
|
-
@@admin ||=
|
21
|
+
@@admin ||= Setting[:admin_tabs]&.dup
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
data/lib/fat_free_crm/version.rb
CHANGED
data/lib/gravatar_image_tag.rb
CHANGED
@@ -53,7 +53,7 @@ module GravatarImageTag
|
|
53
53
|
def self.url_params(gravatar_params)
|
54
54
|
return nil if gravatar_params.keys.empty?
|
55
55
|
|
56
|
-
"?#{gravatar_params.map { |key, value| "#{key}=#{
|
56
|
+
"?#{gravatar_params.map { |key, value| "#{key}=#{CGI.escape(value.is_a?(String) ? value : value.to_s)}" }.join('&')}"
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2008-2013 Michael Dvorkin and contributors.
|
4
|
+
#
|
5
|
+
# Fat Free CRM is freely distributable under the terms of MIT license.
|
6
|
+
# See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
namespace :ffcrm do
|
9
|
+
namespace :preference_update do
|
10
|
+
desc "Take all Marshal serialized database entries and convert them into JSON serialized"
|
11
|
+
task run: :environment do
|
12
|
+
preferences = Preference.all
|
13
|
+
preferences.each do |preference|
|
14
|
+
val = JSON.parse(Base64.decode64(preference.value), symbolize_name: true)
|
15
|
+
preference.value = Base64.encode64(val.to_json)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/tasks/ffcrm/setup.rake
CHANGED
@@ -84,7 +84,7 @@ namespace :ffcrm do
|
|
84
84
|
user = User.find_by_username(username) || User.new
|
85
85
|
user.skip_confirmation!
|
86
86
|
user.confirm
|
87
|
-
user.
|
87
|
+
user.update(username: username, password: password, email: email)
|
88
88
|
user.update_attribute(:confirmed_at, Time.now.utc) # Skip confirmation
|
89
89
|
user.update_attribute(:admin, true) # Mass assignments don't work for :admin because of the attr_protected
|
90
90
|
user.update_attribute(:suspended_at, nil) # Mass assignments don't work for :suspended_at because of the attr_protected
|
@@ -1,13 +1,15 @@
|
|
1
|
+
<%# frozen_string_literal: true %>
|
1
2
|
<%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
|
2
3
|
<%%= f.error_notification %>
|
4
|
+
<%%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
|
3
5
|
|
4
|
-
<div class="inputs">
|
6
|
+
<div class="form-inputs">
|
5
7
|
<%- attributes.each do |attribute| -%>
|
6
8
|
<%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
|
7
9
|
<%- end -%>
|
8
10
|
</div>
|
9
11
|
|
10
|
-
<div class="actions">
|
12
|
+
<div class="form-actions">
|
11
13
|
<%%= f.button :submit %>
|
12
14
|
</div>
|
13
15
|
<%% end %>
|
@@ -133,18 +133,18 @@ describe CommentsController do
|
|
133
133
|
# describe "with valid params" do
|
134
134
|
# it "should update the requested comment" do
|
135
135
|
# Comment.should_receive(:find).with("37").and_return(mock_comment)
|
136
|
-
# mock_comment.should_receive(:
|
136
|
+
# mock_comment.should_receive(:update).with({'these' => 'params'})
|
137
137
|
# put :update, :id => "37", :comment => {:these => 'params'}
|
138
138
|
# end
|
139
139
|
#
|
140
140
|
# it "should expose the requested comment as @comment" do
|
141
|
-
# Comment.stub(:find).and_return(mock_comment(:
|
141
|
+
# Comment.stub(:find).and_return(mock_comment(:update => true))
|
142
142
|
# put :update, :id => "1"
|
143
143
|
# assigns(:comment).should equal(mock_comment)
|
144
144
|
# end
|
145
145
|
#
|
146
146
|
# it "should redirect to the comment" do
|
147
|
-
# Comment.stub(:find).and_return(mock_comment(:
|
147
|
+
# Comment.stub(:find).and_return(mock_comment(:update => true))
|
148
148
|
# put :update, :id => "1"
|
149
149
|
# response.should redirect_to(comment_path(mock_comment))
|
150
150
|
# end
|
@@ -153,18 +153,18 @@ describe CommentsController do
|
|
153
153
|
# describe "with invalid params" do
|
154
154
|
# it "should update the requested comment" do
|
155
155
|
# Comment.should_receive(:find).with("37").and_return(mock_comment)
|
156
|
-
# mock_comment.should_receive(:
|
156
|
+
# mock_comment.should_receive(:update).with({'these' => 'params'})
|
157
157
|
# put :update, :id => "37", :comment => {:these => 'params'}
|
158
158
|
# end
|
159
159
|
#
|
160
160
|
# it "should expose the comment as @comment" do
|
161
|
-
# Comment.stub(:find).and_return(mock_comment(:
|
161
|
+
# Comment.stub(:find).and_return(mock_comment(:update => false))
|
162
162
|
# put :update, :id => "1"
|
163
163
|
# assigns(:comment).should equal(mock_comment)
|
164
164
|
# end
|
165
165
|
#
|
166
166
|
# it "should re-render the 'edit' template" do
|
167
|
-
# Comment.stub(:find).and_return(mock_comment(:
|
167
|
+
# Comment.stub(:find).and_return(mock_comment(:update => false))
|
168
168
|
# put :update, :id => "1"
|
169
169
|
# response.should render_template('edit')
|
170
170
|
# end
|
@@ -87,9 +87,9 @@ describe HomeController do
|
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should assign instance variables for user preferences" do
|
90
|
-
@asset = create(:preference, user: current_user, name: "activity_asset", value: Base64.encode64(
|
91
|
-
@user = create(:preference, user: current_user, name: "activity_user", value: Base64.encode64(
|
92
|
-
@duration = create(:preference, user: current_user, name: "activity_duration", value: Base64.encode64(
|
90
|
+
@asset = create(:preference, user: current_user, name: "activity_asset", value: Base64.encode64("tasks".to_json))
|
91
|
+
@user = create(:preference, user: current_user, name: "activity_user", value: Base64.encode64("Billy Bones".to_json))
|
92
|
+
@duration = create(:preference, user: current_user, name: "activity_duration", value: Base64.encode64("two days".to_json))
|
93
93
|
|
94
94
|
get :options, xhr: true
|
95
95
|
expect(assigns[:asset]).to eq("tasks")
|
@@ -130,6 +130,18 @@ describe UsersController do
|
|
130
130
|
expect(response).to render_template("users/update")
|
131
131
|
end
|
132
132
|
end
|
133
|
+
|
134
|
+
describe "with a email with whitespace" do
|
135
|
+
it "should update the user information and render [update] template" do
|
136
|
+
put :update, params: { id: @user.id, user: { first_name: "Billy", last_name: "Bones", alt_email: " john@email.com " } }, xhr: true
|
137
|
+
@user.reload
|
138
|
+
expect(@user.first_name).to eq("Billy")
|
139
|
+
expect(@user.last_name).to eq("Bones")
|
140
|
+
expect(assigns[:user]).to eq(@user)
|
141
|
+
expect(response).to render_template("users/update")
|
142
|
+
expect(@user.alt_email).to eq("john@email.com")
|
143
|
+
end
|
144
|
+
end
|
133
145
|
|
134
146
|
describe "with invalid params" do
|
135
147
|
it "should not update the user information and redraw [update] template" do
|
@@ -299,7 +311,7 @@ describe UsersController do
|
|
299
311
|
before(:each) do
|
300
312
|
login
|
301
313
|
@user = current_user
|
302
|
-
@user.
|
314
|
+
@user.update(first_name: "Apple", last_name: "Boy")
|
303
315
|
end
|
304
316
|
|
305
317
|
it "should assign @users_with_opportunities" do
|