From 78565b1dc933692abba46a73f2298b7ea8e03c88 Mon Sep 17 00:00:00 2001 From: aca Date: Wed, 19 Jun 2019 09:14:43 +0000 Subject: [PATCH] [REM] web_settings_dashboard: Merge module into base_setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Purpose ======= Currently, when we click on “Settings” on the Home Dashboard, we arrive on a new Dashboard with several pieces of information like Installed Apps, invite new users, or translations. Some informations are reachable in several ways, which is not necessary. We would like to remove this page and replace it with the General Settings page directly. That makes more sense to the user who click on “Settings”. The present informations will be dispatched in the menu or in the general settings for a better usability. Specification ============= This commit move code from web_settings_dashboard in order to put the features in settings directly. To do so, we choose to move code to base_setup, and create widget on the settings form view to keep features. Concerned features are: invite users, dev tools, odoo edition number and IAP account link. TaskID: 2006910 closes odoo/odoo#34290 Signed-off-by: Yannick Tivisse (yti) --- addons/auth_signup/controllers/main.py | 12 +- addons/auth_signup/models/res_users.py | 4 +- addons/base_setup/__init__.py | 2 +- addons/base_setup/__manifest__.py | 9 + addons/base_setup/controllers/__init__.py | 2 + addons/base_setup/controllers/main.py | 56 +++ addons/base_setup/models/__init__.py | 2 +- .../base_setup/models/res_config_settings.py | 24 +- .../models/res_users.py | 2 +- .../base_setup/static/src/img/app_store.png | Bin 0 -> 14016 bytes .../base_setup/static/src/img/google_play.png | Bin 0 -> 16858 bytes .../static/src/js/res_config_dev_tool.js | 31 ++ .../static/src/js/res_config_edition.js | 21 + .../static/src/js/res_config_invite_users.js | 214 +++++++++ .../static/src/scss/settings.scss} | 26 +- .../static/src/xml/res_config_dev_tool.xml | 19 + .../static/src/xml/res_config_edition.xml | 24 + .../src/xml/res_config_invite_users.xml | 54 +++ addons/base_setup/views/assets.xml | 10 + .../views/res_config_settings_views.xml | 149 ++++-- addons/crm/static/src/js/tours/crm.js | 2 +- .../views/res_config_settings_views.xml | 2 +- addons/iap/__manifest__.py | 3 +- addons/iap/models/__init__.py | 2 + addons/iap/models/res_config_settings.py | 15 + addons/iap/static/src/js/dashboard.js | 42 -- addons/iap/static/src/xml/iap_templates.xml | 18 +- addons/iap/views/assets.xml | 1 - addons/iap/views/res_config_settings.xml | 39 ++ addons/web_settings_dashboard/__init__.py | 5 - addons/web_settings_dashboard/__manifest__.py | 25 - .../controllers/__init__.py | 4 - .../controllers/main.py | 83 ---- addons/web_settings_dashboard/i18n/ar.po | 350 -------------- addons/web_settings_dashboard/i18n/az.po | 341 -------------- addons/web_settings_dashboard/i18n/bs.po | 345 -------------- addons/web_settings_dashboard/i18n/ca.po | 350 -------------- addons/web_settings_dashboard/i18n/cs.po | 346 -------------- addons/web_settings_dashboard/i18n/da.po | 352 -------------- addons/web_settings_dashboard/i18n/de.po | 356 --------------- addons/web_settings_dashboard/i18n/el.po | 349 -------------- addons/web_settings_dashboard/i18n/es.po | 359 --------------- addons/web_settings_dashboard/i18n/es_CO.po | 215 --------- addons/web_settings_dashboard/i18n/es_DO.po | 207 --------- addons/web_settings_dashboard/i18n/es_EC.po | 212 --------- addons/web_settings_dashboard/i18n/et.po | 351 -------------- addons/web_settings_dashboard/i18n/fa.po | 350 -------------- addons/web_settings_dashboard/i18n/fi.po | 349 -------------- addons/web_settings_dashboard/i18n/fr.po | 357 --------------- addons/web_settings_dashboard/i18n/gu.po | 344 -------------- addons/web_settings_dashboard/i18n/he.po | 347 -------------- addons/web_settings_dashboard/i18n/hr.po | 294 ------------ addons/web_settings_dashboard/i18n/hu.po | 349 -------------- addons/web_settings_dashboard/i18n/id.po | 307 ------------- addons/web_settings_dashboard/i18n/is.po | 347 -------------- addons/web_settings_dashboard/i18n/it.po | 356 --------------- addons/web_settings_dashboard/i18n/ja.po | 349 -------------- addons/web_settings_dashboard/i18n/km.po | 344 -------------- addons/web_settings_dashboard/i18n/ko.po | 351 -------------- addons/web_settings_dashboard/i18n/lt.po | 304 ------------- addons/web_settings_dashboard/i18n/lv.po | 297 ------------ addons/web_settings_dashboard/i18n/mk.po | 213 --------- addons/web_settings_dashboard/i18n/mn.po | 348 -------------- addons/web_settings_dashboard/i18n/nb.po | 349 -------------- addons/web_settings_dashboard/i18n/nl.po | 353 -------------- addons/web_settings_dashboard/i18n/pl.po | 354 --------------- addons/web_settings_dashboard/i18n/pt.po | 351 -------------- addons/web_settings_dashboard/i18n/pt_BR.po | 348 -------------- addons/web_settings_dashboard/i18n/ro.po | 350 -------------- addons/web_settings_dashboard/i18n/ru.po | 350 -------------- addons/web_settings_dashboard/i18n/sk.po | 347 -------------- addons/web_settings_dashboard/i18n/sl.po | 297 ------------ addons/web_settings_dashboard/i18n/sr.po | 344 -------------- .../web_settings_dashboard/i18n/sr@latin.po | 301 ------------ addons/web_settings_dashboard/i18n/sv.po | 289 ------------ addons/web_settings_dashboard/i18n/th.po | 348 -------------- addons/web_settings_dashboard/i18n/tr.po | 355 --------------- addons/web_settings_dashboard/i18n/uk.po | 350 -------------- addons/web_settings_dashboard/i18n/vi.po | 351 -------------- .../i18n/web_settings_dashboard.pot | 340 -------------- addons/web_settings_dashboard/i18n/zh_CN.po | 355 --------------- addons/web_settings_dashboard/i18n/zh_TW.po | 346 -------------- .../web_settings_dashboard/models/__init__.py | 4 - .../static/src/js/dashboard.js | 429 ------------------ .../static/src/xml/dashboard.xml | 182 -------- .../static/tests/dashboard_tests.js | 310 ------------- .../views/dashboard_templates.xml | 14 - .../views/dashboard_views.xml | 8 - odoo/addons/base/views/base_menus.xml | 6 +- odoo/addons/base/views/ir_module_views.xml | 22 +- 90 files changed, 682 insertions(+), 17412 deletions(-) create mode 100644 addons/base_setup/controllers/__init__.py create mode 100644 addons/base_setup/controllers/main.py rename addons/{web_settings_dashboard => base_setup}/models/res_users.py (94%) create mode 100644 addons/base_setup/static/src/img/app_store.png create mode 100644 addons/base_setup/static/src/img/google_play.png create mode 100644 addons/base_setup/static/src/js/res_config_dev_tool.js create mode 100644 addons/base_setup/static/src/js/res_config_edition.js create mode 100644 addons/base_setup/static/src/js/res_config_invite_users.js rename addons/{web_settings_dashboard/static/src/scss/dashboard.scss => base_setup/static/src/scss/settings.scss} (65%) create mode 100644 addons/base_setup/static/src/xml/res_config_dev_tool.xml create mode 100644 addons/base_setup/static/src/xml/res_config_edition.xml create mode 100644 addons/base_setup/static/src/xml/res_config_invite_users.xml create mode 100644 addons/base_setup/views/assets.xml create mode 100644 addons/iap/models/res_config_settings.py delete mode 100644 addons/iap/static/src/js/dashboard.js create mode 100644 addons/iap/views/res_config_settings.xml delete mode 100644 addons/web_settings_dashboard/__init__.py delete mode 100644 addons/web_settings_dashboard/__manifest__.py delete mode 100644 addons/web_settings_dashboard/controllers/__init__.py delete mode 100644 addons/web_settings_dashboard/controllers/main.py delete mode 100644 addons/web_settings_dashboard/i18n/ar.po delete mode 100644 addons/web_settings_dashboard/i18n/az.po delete mode 100644 addons/web_settings_dashboard/i18n/bs.po delete mode 100644 addons/web_settings_dashboard/i18n/ca.po delete mode 100644 addons/web_settings_dashboard/i18n/cs.po delete mode 100644 addons/web_settings_dashboard/i18n/da.po delete mode 100644 addons/web_settings_dashboard/i18n/de.po delete mode 100644 addons/web_settings_dashboard/i18n/el.po delete mode 100644 addons/web_settings_dashboard/i18n/es.po delete mode 100644 addons/web_settings_dashboard/i18n/es_CO.po delete mode 100644 addons/web_settings_dashboard/i18n/es_DO.po delete mode 100644 addons/web_settings_dashboard/i18n/es_EC.po delete mode 100644 addons/web_settings_dashboard/i18n/et.po delete mode 100644 addons/web_settings_dashboard/i18n/fa.po delete mode 100644 addons/web_settings_dashboard/i18n/fi.po delete mode 100644 addons/web_settings_dashboard/i18n/fr.po delete mode 100644 addons/web_settings_dashboard/i18n/gu.po delete mode 100644 addons/web_settings_dashboard/i18n/he.po delete mode 100644 addons/web_settings_dashboard/i18n/hr.po delete mode 100644 addons/web_settings_dashboard/i18n/hu.po delete mode 100644 addons/web_settings_dashboard/i18n/id.po delete mode 100644 addons/web_settings_dashboard/i18n/is.po delete mode 100644 addons/web_settings_dashboard/i18n/it.po delete mode 100644 addons/web_settings_dashboard/i18n/ja.po delete mode 100644 addons/web_settings_dashboard/i18n/km.po delete mode 100644 addons/web_settings_dashboard/i18n/ko.po delete mode 100644 addons/web_settings_dashboard/i18n/lt.po delete mode 100644 addons/web_settings_dashboard/i18n/lv.po delete mode 100644 addons/web_settings_dashboard/i18n/mk.po delete mode 100644 addons/web_settings_dashboard/i18n/mn.po delete mode 100644 addons/web_settings_dashboard/i18n/nb.po delete mode 100644 addons/web_settings_dashboard/i18n/nl.po delete mode 100644 addons/web_settings_dashboard/i18n/pl.po delete mode 100644 addons/web_settings_dashboard/i18n/pt.po delete mode 100644 addons/web_settings_dashboard/i18n/pt_BR.po delete mode 100644 addons/web_settings_dashboard/i18n/ro.po delete mode 100644 addons/web_settings_dashboard/i18n/ru.po delete mode 100644 addons/web_settings_dashboard/i18n/sk.po delete mode 100644 addons/web_settings_dashboard/i18n/sl.po delete mode 100644 addons/web_settings_dashboard/i18n/sr.po delete mode 100644 addons/web_settings_dashboard/i18n/sr@latin.po delete mode 100644 addons/web_settings_dashboard/i18n/sv.po delete mode 100644 addons/web_settings_dashboard/i18n/th.po delete mode 100644 addons/web_settings_dashboard/i18n/tr.po delete mode 100644 addons/web_settings_dashboard/i18n/uk.po delete mode 100644 addons/web_settings_dashboard/i18n/vi.po delete mode 100644 addons/web_settings_dashboard/i18n/web_settings_dashboard.pot delete mode 100644 addons/web_settings_dashboard/i18n/zh_CN.po delete mode 100644 addons/web_settings_dashboard/i18n/zh_TW.po delete mode 100644 addons/web_settings_dashboard/models/__init__.py delete mode 100644 addons/web_settings_dashboard/static/src/js/dashboard.js delete mode 100644 addons/web_settings_dashboard/static/src/xml/dashboard.xml delete mode 100644 addons/web_settings_dashboard/static/tests/dashboard_tests.js delete mode 100644 addons/web_settings_dashboard/views/dashboard_templates.xml delete mode 100644 addons/web_settings_dashboard/views/dashboard_views.xml diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index dbf6c2fec53..da2db6041db 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -6,7 +6,7 @@ import werkzeug from odoo import http, _ from odoo.addons.auth_signup.models.res_users import SignupError from odoo.addons.web.controllers.main import ensure_db, Home -from odoo.addons.web_settings_dashboard.controllers.main import WebSettingsDashboard as Dashboard +from odoo.addons.base_setup.controllers.main import BaseSetup from odoo.exceptions import UserError from odoo.http import request @@ -136,9 +136,9 @@ class AuthSignupHome(Home): if not uid: raise SignupError(_('Authentication Failed.')) -class WebSettingsDashboard(Dashboard): - @http.route('/web_settings_dashboard/data', type='json', auth='user') - def web_settings_dashboard_data(self, **kw): - res = super(WebSettingsDashboard, self).web_settings_dashboard_data(**kw) - res['users_info'].update({'resend_invitation': True}) +class AuthBaseSetup(BaseSetup): + @http.route('/base_setup/data', type='json', auth='user') + def base_setup_data(self, **kwargs): + res = super().base_setup_data(**kwargs) + res.update({'resend_invitation': True}) return res diff --git a/addons/auth_signup/models/res_users.py b/addons/auth_signup/models/res_users.py index d2f40693f24..6564129253a 100644 --- a/addons/auth_signup/models/res_users.py +++ b/addons/auth_signup/models/res_users.py @@ -222,10 +222,10 @@ class ResUsers(models.Model): template.send_mail(user, notif_layout='mail.mail_notification_light', force_send=False) @api.model - def web_dashboard_create_users(self, emails): + def web_create_users(self, emails): inactive_users = self.search([('state', '=', 'new'), '|', ('login', 'in', emails), ('email', 'in', emails)]) new_emails = set(emails) - set(inactive_users.mapped('email')) - res = super(ResUsers, self).web_dashboard_create_users(list(new_emails)) + res = super(ResUsers, self).web_create_users(list(new_emails)) if inactive_users: inactive_users.with_context(create_user=True).action_reset_password() return res diff --git a/addons/base_setup/__init__.py b/addons/base_setup/__init__.py index dc5e6b693d1..373b1d07b83 100644 --- a/addons/base_setup/__init__.py +++ b/addons/base_setup/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import models +from . import models, controllers diff --git a/addons/base_setup/__manifest__.py b/addons/base_setup/__manifest__.py index df9fb1ec1a8..1afdc984581 100644 --- a/addons/base_setup/__manifest__.py +++ b/addons/base_setup/__manifest__.py @@ -16,8 +16,17 @@ Shows you a list of applications features to install from. 'data/base_setup_data.xml', 'views/res_config_settings_views.xml', 'views/res_partner_views.xml', + 'views/assets.xml', ], 'demo': [], 'installable': True, 'auto_install': False, + + 'qweb': [ + 'static/src/xml/res_config_dev_tool.xml', + 'static/src/xml/res_config_edition.xml', + 'static/src/xml/res_config_invite_users.xml', + ], + + } diff --git a/addons/base_setup/controllers/__init__.py b/addons/base_setup/controllers/__init__.py new file mode 100644 index 00000000000..757b12a1f17 --- /dev/null +++ b/addons/base_setup/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import main diff --git a/addons/base_setup/controllers/main.py b/addons/base_setup/controllers/main.py new file mode 100644 index 00000000000..317cb6bd754 --- /dev/null +++ b/addons/base_setup/controllers/main.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, http +from odoo.exceptions import AccessError +from odoo.http import request + + +class BaseSetup(http.Controller): + @http.route('/base_setup/data', type='json', auth='user') + def base_setup_data(self, **kw): + if not request.env.user.has_group('base.group_erp_manager'): + raise AccessError(_("Access Denied")) + + cr = request.cr + cr.execute(""" + SELECT count(*) + FROM res_users + WHERE active=true AND + share=false + """) + active_count = cr.dictfetchall()[0].get('count') + + cr.execute(""" + SELECT count(u.*) + FROM res_users u + WHERE active=true AND + share=false AND + NOT exists(SELECT 1 FROM res_users_log WHERE create_uid=u.id) + """) + pending_count = cr.dictfetchall()[0].get('count') + + cr.execute(""" + SELECT id, login + FROM res_users u + WHERE active=true AND + share=false AND + NOT exists(SELECT 1 FROM res_users_log WHERE create_uid=u.id) + ORDER BY id desc + LIMIT 10 + """) + pending_users = cr.fetchall() + + return { + 'active_users': active_count, + 'pending_count': pending_count, + 'pending_users': pending_users, + } + + @http.route('/base_setup/demo_active', type='json', auth='user') + def base_setup_is_demo(self, **kwargs): + # We assume that if there's at least one module with demo data active, then the db was + # initialized with demo=True or it has been force-activated by the `Load demo data` button + # in the settings dashboard. + demo_active = bool(request.env['ir.module.module'].search_count([('demo', '=', True)])) + return demo_active diff --git a/addons/base_setup/models/__init__.py b/addons/base_setup/models/__init__.py index ecb5f3ba7ea..ce534721577 100644 --- a/addons/base_setup/models/__init__.py +++ b/addons/base_setup/models/__init__.py @@ -3,4 +3,4 @@ from . import ir_http from . import res_config_settings - +from . import res_users diff --git a/addons/base_setup/models/res_config_settings.py b/addons/base_setup/models/res_config_settings.py index 9cd9289a929..a3f9cb1ec84 100644 --- a/addons/base_setup/models/res_config_settings.py +++ b/addons/base_setup/models/res_config_settings.py @@ -44,13 +44,15 @@ class ResConfigSettings(models.TransientModel): paperformat_id = fields.Many2one(related="company_id.paperformat_id", string='Paper format', readonly=False) external_report_layout_id = fields.Many2one(related="company_id.external_report_layout_id", readonly=False) show_effect = fields.Boolean(string="Show Effect", config_parameter='base_setup.show_effect') + company_count = fields.Integer('Number of Companies', readonly=True, compute="_compute_company_count") + language_count = fields.Integer('Number of Languages', compute="_compute_language_count") @api.model def get_values(self): res = super(ResConfigSettings, self).get_values() - res.update( - company_share_partner=not self.env.ref('base.res_partner_rule').active, - ) + res.update({ + 'company_share_partner': not self.env.ref('base.res_partner_rule').active, + }) return res def set_values(self): @@ -100,3 +102,19 @@ class ResConfigSettings(models.TransientModel): 'view_id': template.id, 'target': 'new', } + + # NOTE: These fields depend on the context, if we want them to be computed + # we have to make them depend on a field. This is because we are on a TransientModel. + @api.depends('company_id') + def _compute_company_count(self): + company_count = self.env['res.company'].sudo().search_count([]) + for record in self: + record.company_count = company_count + + @api.depends('company_id') + def _compute_language_count(self): + language_count = self.env['res.lang'].search_count([ + ('active', '=', True), + ]) + for record in self: + record.language_count = language_count diff --git a/addons/web_settings_dashboard/models/res_users.py b/addons/base_setup/models/res_users.py similarity index 94% rename from addons/web_settings_dashboard/models/res_users.py rename to addons/base_setup/models/res_users.py index 3c83072de6f..112c55c188a 100644 --- a/addons/web_settings_dashboard/models/res_users.py +++ b/addons/base_setup/models/res_users.py @@ -8,7 +8,7 @@ class ResUsers(models.Model): _inherit = 'res.users' @api.model - def web_dashboard_create_users(self, emails): + def web_create_users(self, emails): # Reactivate already existing users if needed deactivated_users = self.with_context(active_test=False).search([('active', '=', False), '|', ('login', 'in', emails), ('email', 'in', emails)]) diff --git a/addons/base_setup/static/src/img/app_store.png b/addons/base_setup/static/src/img/app_store.png new file mode 100644 index 0000000000000000000000000000000000000000..65320714c06525b12d4e92bb43ed04318edc6c83 GIT binary patch literal 14016 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 BY}^0< literal 0 HcmV?d00001 diff --git a/addons/base_setup/static/src/img/google_play.png b/addons/base_setup/static/src/img/google_play.png new file mode 100644 index 0000000000000000000000000000000000000000..229d939d728a85944129cfe373e6a51e7d25768d GIT binary patch literal 16858 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 aa4zmI4_m|R7I1hDBq=H div > hr { margin: 12px -18px 15px -18px; border-color: #CBCBCB; } > div { - @include o-web-settings-dashboard-card; + @include o-web-settings-card-card; padding: 25px 18px 18px 18px; - .o_web_settings_dashboard_header { + .o_web_settings_header { font-size: 22px; margin-bottom: 8px; } } - .btn.o_browse_apps, .btn.o_web_settings_dashboard_invitations { + .btn.o_browse_apps, .btn.o_web_settings_invitations { margin-top: 12px; } - .o_web_settings_dashboard_compact_subtitle { + .o_web_settings_compact_subtitle { line-height: 12px; display: block; } - .o_web_settings_dashboard_invitations { - .o_web_settings_dashboard_invitation_form { + .o_web_settings_invitations { + .o_web_settings_invitation_form { text-align: left; > textarea { resize: vertical; @@ -42,22 +42,22 @@ } } } - .o_web_settings_dashboard_planner { + .o_web_settings_planner { .progress { height: 10px; background-color: darken($bg-dashboard-col, 15%); cursor: pointer; margin-bottom: 30px; } - .o_web_settings_dashboard_planner_progress_text { + .o_web_settings_planner_progress_text { font-size: 18px; padding-right: 0px; padding-top: 3px; } - .o_web_settings_dashboard_planner_progress_bar { + .o_web_settings_planner_progress_bar { padding-left: 10px; } - .o_web_settings_dashboard_progress_title { + .o_web_settings_progress_title { font-weight: bold; cursor: pointer; color: $o-brand-primary; diff --git a/addons/base_setup/static/src/xml/res_config_dev_tool.xml b/addons/base_setup/static/src/xml/res_config_dev_tool.xml new file mode 100644 index 00000000000..ab108bd2518 --- /dev/null +++ b/addons/base_setup/static/src/xml/res_config_dev_tool.xml @@ -0,0 +1,19 @@ + + diff --git a/addons/base_setup/static/src/xml/res_config_edition.xml b/addons/base_setup/static/src/xml/res_config_edition.xml new file mode 100644 index 00000000000..31485c33ab9 --- /dev/null +++ b/addons/base_setup/static/src/xml/res_config_edition.xml @@ -0,0 +1,24 @@ + + + + diff --git a/addons/base_setup/static/src/xml/res_config_invite_users.xml b/addons/base_setup/static/src/xml/res_config_invite_users.xml new file mode 100644 index 00000000000..ba9bd5fbc7e --- /dev/null +++ b/addons/base_setup/static/src/xml/res_config_invite_users.xml @@ -0,0 +1,54 @@ + + +
+
+
+
+ +
+ + Active User + Active Users +
+
+
+ + + Manage Users + +
+
+
+
+ +

Pending Invitations:

+ + + + +
+ more +
+
+
+
+
+
+ Invite New Users: + + + +
+
+
+
+ + + + + + + + + +
diff --git a/addons/base_setup/views/assets.xml b/addons/base_setup/views/assets.xml new file mode 100644 index 00000000000..340e4a52445 --- /dev/null +++ b/addons/base_setup/views/assets.xml @@ -0,0 +1,10 @@ + + + + diff --git a/addons/base_setup/views/res_config_settings_views.xml b/addons/base_setup/views/res_config_settings_views.xml index 5acfd343678..2398075bf0e 100644 --- a/addons/base_setup/views/res_config_settings_views.xml +++ b/addons/base_setup/views/res_config_settings_views.xml @@ -3,11 +3,72 @@ res.config.settings.view.form.inherit.base.setup res.config.settings - +
+ +
+

Users

+ +
+ +
+

Companies

+
+
+
+ +
+ + + companies + +
+
+
+
+
+ +
+

Languages

+
+
+
+ +
+ + + Languages + +
+
+
+
+
+

Business Documents

@@ -48,6 +109,13 @@
+ +
+

Statistics

+
+
+
+

Contacts

@@ -72,55 +140,55 @@ Send texts to your contacts
+ + + +
+

Users

+
+
+
+ +
+
+
-
-

Users

-
-
-
- -
-
-