diff --git a/crm_salesperson_planner/README.rst b/crm_salesperson_planner/README.rst new file mode 100644 index 00000000000..b7ddc5385e8 --- /dev/null +++ b/crm_salesperson_planner/README.rst @@ -0,0 +1,122 @@ +======================= +Crm Salesperson Planner +======================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:ecb19fb91da66e924c1c305af2c747e5d4eb4610309318733cb67f73d68666ed + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcrm-lightgray.png?logo=github + :target: https://github.com/OCA/crm/tree/17.0/crm_salesperson_planner + :alt: OCA/crm +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/crm-17-0/crm-17-0-crm_salesperson_planner + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/crm&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This application allows you to track and schedule salespeople visits to +your customers, allowing you to determine which opportunities are going +to be dealt on each visit. Visits create an all day event in calendar, +and they can be easily rescheduled. Visits can be automatically created +from a template, in which it is possible to select the frequency of +visits, as well as the start and end dates. The last visit can also be +calculated by selecting the total number of repetitions. This module +creates a cron that generates visits from templates, but an option to +create them manually is available from the template form view when the +template is validated. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +- Go to new menu **CRM > Configuration > Salesperson Planner > Close + Reasons** and create a close reason for 'Cancel' and 'Incident' + types. + +Usage +===== + +Go to new menu **CRM > Salesperson Planner > My Visits or All Visits** +and create a new visit. or Go to **CRM > Salesperson Planner > Visit +Templates** and create a new recurring template for create periodical +visits. In this case, it is necessary to select a start date. The date +of the last repetition can be calculated by selection the total number +of repetitions or an end date. There are two options available to +reschedule visits that is already validated: \* Change the date from the +visit. \* Change the date straight from the event automatically created +in the calendar. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Sygel Technology + +Contributors +------------ + +- `Sygel `__: + + - Valentin Vinagre + - Manuel Regidor + +- `Pesol `__: + + - Gerardo Marin Parra + +- `Tecnativa `__: + + - Víctor Martínez + +- `APSL-Nagarro `__: + + - Bernat Obrador + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/crm `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/crm_salesperson_planner/__init__.py b/crm_salesperson_planner/__init__.py new file mode 100644 index 00000000000..120d03e7590 --- /dev/null +++ b/crm_salesperson_planner/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from . import models +from . import wizards diff --git a/crm_salesperson_planner/__manifest__.py b/crm_salesperson_planner/__manifest__.py new file mode 100644 index 00000000000..fa9bd94e537 --- /dev/null +++ b/crm_salesperson_planner/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +{ + "name": "Crm Salesperson Planner", + "version": "17.0.1.0.0", + "development_status": "Beta", + "category": "Customer Relationship Management", + "author": "Sygel Technology," "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/crm", + "license": "AGPL-3", + "depends": ["crm", "calendar"], + "data": [ + "data/crm_salesperson_planner_sequence.xml", + "wizards/crm_salesperson_planner_visit_close_wiz_view.xml", + "wizards/crm_salesperson_planner_visit_template_create.xml", + "views/crm_salesperson_planner_visit_views.xml", + "views/crm_salesperson_planner_visit_close_reason_views.xml", + "views/crm_salesperson_planner_visit_template_views.xml", + "views/crm_salesperson_planner_menu.xml", + "views/res_partner.xml", + "views/crm_lead.xml", + "data/ir_cron_data.xml", + "security/crm_salesperson_planner_security.xml", + "security/ir.model.access.csv", + ], + "installable": True, +} diff --git a/crm_salesperson_planner/data/crm_salesperson_planner_sequence.xml b/crm_salesperson_planner/data/crm_salesperson_planner_sequence.xml new file mode 100644 index 00000000000..4c21eda4c04 --- /dev/null +++ b/crm_salesperson_planner/data/crm_salesperson_planner_sequence.xml @@ -0,0 +1,17 @@ + + + + + Salesperson Planner visit Code + salesperson.planner.visit + + SPPV/ + + + Salesperson Planner visit Template Code + salesperson.planner.visit.template + + SPPVT/ + + diff --git a/crm_salesperson_planner/data/ir_cron_data.xml b/crm_salesperson_planner/data/ir_cron_data.xml new file mode 100644 index 00000000000..c9bd2385f89 --- /dev/null +++ b/crm_salesperson_planner/data/ir_cron_data.xml @@ -0,0 +1,15 @@ + + + + + CRM: Create salesperson visits + 1 + days + -1 + + + model._cron_create_visits(days=7) + code + + diff --git a/crm_salesperson_planner/i18n/crm_salesperson_planner.pot b/crm_salesperson_planner/i18n/crm_salesperson_planner.pot new file mode 100644 index 00000000000..683c7442efa --- /dev/null +++ b/crm_salesperson_planner/i18n/crm_salesperson_planner.pot @@ -0,0 +1,1061 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_salesperson_planner +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_ids +msgid "Activities" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_state +msgid "Activity State" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Add a description..." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__allday +msgid "All Day" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_visits +msgid "All Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__allow_reschedule +msgid "Allow Reschedule" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_attachment_count +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__auto_validate +msgid "Auto Validate" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__byday +msgid "Byday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.actions.server,name:crm_salesperson_planner.ir_cron_create_visits_ir_actions_server +#: model:ir.cron,cron_name:crm_salesperson_planner.ir_cron_create_visits +msgid "CRM: Create salesperson visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_calendar_event +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__calendar_event_id +msgid "Calendar Event" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_close_reason__close_type__cancel +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Cancel" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__cancel +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Close Info" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +msgid "Close Reason" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_image +msgid "Close Reason Image" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_notes +msgid "Close Reason Notes" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_action +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_action +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_config_salesperson_planner_close_reason +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_tree_view +msgid "Close Reasons" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__company_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__company_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Company" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Confirm" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_res_partner +msgid "Contact" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +msgid "Create" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_action +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +msgid "Create Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.crm_salesperson_planner_visit_template_action +msgid "Create and plan commercial visit templates" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__create_uid +msgid "Created by" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__create_date +msgid "Created on" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_template +msgid "Crm Salesperson Planner Visit Template" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_ids +msgid "Customer" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__date +msgid "Date" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__day +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__month_by__date +msgid "Date of month" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__date_to +msgid "Date to" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Day of Month" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__month_by__day +msgid "Day of month" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__daily +msgid "Days" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__description +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__description +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Description" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__display_name +msgid "Display Name" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__done +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Done" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__draft +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__draft +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Draft" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__duration +msgid "Duration" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop_date +msgid "End Date" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__end_date +msgid "End date" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/calendar_event.py:0 +#, python-format +msgid "" +"Event %(event_name)s is related to salesperson visit %(partner_name)s. " +"Cancel it to delete this event.\n" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__1 +msgid "First" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_follower_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_partner_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__forever +msgid "Forever" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__4 +msgid "Fourth" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__fri +msgid "Fri" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__fri +msgid "Friday" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Future Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_close_wiz +msgid "Get Close Reason" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Group By" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__has_message +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__has_message +msgid "Has Message" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__id +msgid "ID" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__image +msgid "Image" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__in-progress +msgid "In Progress" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__incident +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_close_reason__close_type__incident +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Incident" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Internal Notes" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_is_follower +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__-1 +msgid "Last" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create____last_update +msgid "Last Modified on" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__write_date +msgid "Last Updated on" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__last_visit_date +msgid "Last Visit Date" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Late Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_lead +msgid "Lead/Opportunity" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule_type +msgid "Let the event automatically repeat at that interval" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_main_attachment_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Manually Create Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_ids +msgid "Messages" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_mobile +msgid "Mobile" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__mon +msgid "Mon" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__mon +msgid "Monday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__monthly +msgid "Months" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_my_visits +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "My Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_date +msgid "New Date" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__notes +msgid "Notes" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__alarm_ids +msgid "Notifications sent to all attendees to remind of the meeting." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction_counter +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__visit_ids_count +msgid "Number of Sales Person Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_res_partner__salesperson_planner_visit_count +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_res_users__salesperson_planner_visit_count +msgid "Number of Salesperson Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error_counter +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction_counter +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error_counter +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__count +msgid "Number of repetitions" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit_template.py:0 +#: code:addons/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit.py:0 +#, python-format +msgid "Only one customer is allowed" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__opportunity_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Opportunities" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__month_by +msgid "Option" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Partner" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_id +msgid "Partner-related data of the user" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_phone +msgid "Phone" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__reason_id +msgid "Reason" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.all_crm_salesperson_planner_visit_action +msgid "Record and track all sales commercial visits." +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.my_crm_salesperson_planner_visit_action +msgid "Record and track my sales commercial visits." +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_action +msgid "Record reason for close commercial visits." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule_type +msgid "Recurrence" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__end_type +msgid "Recurrence Termination" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule +msgid "Recurrent Rule" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__alarm_ids +msgid "Reminders" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__count +msgid "Repeat" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__interval +msgid "Repeat Every" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__final_date +msgid "Repeat Until" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__interval +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__count +msgid "Repeat x times" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__require_image +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__require_image +msgid "Require Image" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__reschedule +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__reschedule +msgid "Reschedule" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.partner_view_crm_salesperson_planner +msgid "Sales Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_close_reason +msgid "SalesPerson Planner Visit Close Reason" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__user_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__user_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Salesperson" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_config_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_salesperson_planner +msgid "Salesperson Planner" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit +msgid "Salesperson Planner Visit" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_calendar_event__salesperson_planner_visit_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_lead_crm_salesperson_planner +msgid "Salesperson Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sat +msgid "Sat" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__sat +msgid "Saturday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_id +msgid "Scheduled by" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Search Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__2 +msgid "Second" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Send to Draft" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__sequence +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_sequence +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sequence +msgid "Sequence" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start +msgid "Start" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start_date +msgid "Start Date" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start +msgid "Start date of an event, without time for full days events" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "State" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__state +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__state +msgid "Status" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop +msgid "Stop" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop +msgid "Stop date of an event, without time for full days events" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +msgid "Submit" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sun +msgid "Sun" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__sun +msgid "Sunday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__categ_ids +msgid "Tags" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "The" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz.py:0 +#, python-format +msgid "The close reason type haven't a function." +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.py:0 +#, python-format +msgid "The date can't be earlier than today" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in cancelled, incident or visited state" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in confirmed state" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in draft or validated state" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in draft state" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.constraint,message:crm_salesperson_planner.constraint_crm_salesperson_planner_visit_crm_salesperson_planner_visit_name +msgid "The visit number must be unique!" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.constraint,message:crm_salesperson_planner.constraint_crm_salesperson_planner_visit_template_crm_salesperson_planner_visit_template_name +msgid "The visit template number must be unique!" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__3 +msgid "Third" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__thu +msgid "Thu" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__thu +msgid "Thursday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__event_tz +msgid "Timezone" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Today Visits" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__tue +msgid "Tue" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__tue +msgid "Tuesday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__close_type +msgid "Type" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__until +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Until" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__sequence +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_sequence +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sequence +msgid "Used to order Visits in the different views" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Validate" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__confirm +msgid "Validated" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Visit" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__name +msgid "Visit Number" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__visit_template_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__visit_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Visit Template" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__name +msgid "Visit Template Number" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_template_action +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_visit_template +msgid "Visit Templates" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Visit by Date" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__done +msgid "Visited" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.all_crm_salesperson_planner_visit_action +#: model:ir.actions.act_window,name:crm_salesperson_planner.my_crm_salesperson_planner_visit_action +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_lead__crm_salesperson_planner_visit_ids +msgid "Visits" +msgstr "" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "Visits must be in cancelled state" +msgstr "" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Visits that are assigned to me" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__website_message_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__website_message_ids +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__wed +msgid "Wed" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__wed +msgid "Wednesday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__weekday +msgid "Weekday" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__weekly +msgid "Weeks" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__yearly +msgid "Years" +msgstr "" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_template_create +msgid "crm salesperson planner visit template create" +msgstr "" diff --git a/crm_salesperson_planner/i18n/es.po b/crm_salesperson_planner/i18n/es.po new file mode 100644 index 00000000000..e61b2a9e64d --- /dev/null +++ b/crm_salesperson_planner/i18n/es.po @@ -0,0 +1,1230 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_salesperson_planner +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-01-12 14:00+0000\n" +"PO-Revision-Date: 2024-03-25 20:37+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction +msgid "Action Needed" +msgstr "Acción requerida" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_ids +msgid "Activities" +msgstr "Actividades" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoración de Actividad de Excepción" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_state +msgid "Activity State" +msgstr "Estado de la Actividad" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_icon +msgid "Activity Type Icon" +msgstr "Tipo de Icono de Actividad" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Add a description..." +msgstr "Agregar descripción…" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__allday +msgid "All Day" +msgstr "Todo el día" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_visits +msgid "All Visits" +msgstr "Todas las visitas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__allow_reschedule +msgid "Allow Reschedule" +msgstr "Permitir reprogramación" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_attachment_count +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_attachment_count +msgid "Attachment Count" +msgstr "Número de Adjuntos" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__auto_validate +msgid "Auto Validate" +msgstr "Auto validar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__byday +msgid "Byday" +msgstr "Por dia" + +#. module: crm_salesperson_planner +#: model:ir.actions.server,name:crm_salesperson_planner.ir_cron_create_visits_ir_actions_server +#: model:ir.cron,cron_name:crm_salesperson_planner.ir_cron_create_visits +msgid "CRM: Create salesperson visits" +msgstr "CRM: Crear visitas comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_calendar_event +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__calendar_event_id +msgid "Calendar Event" +msgstr "Evento de calendario" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_close_reason__close_type__cancel +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__cancel +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__cancel +msgid "Cancelled" +msgstr "Cancelado" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Close Info" +msgstr "Información de cierre" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +msgid "Close Reason" +msgstr "Motivo de cierre" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_image +msgid "Close Reason Image" +msgstr "Imagen de motivo de cierre" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_notes +msgid "Close Reason Notes" +msgstr "Notas de motivo de cierre" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_action +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_action +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_config_salesperson_planner_close_reason +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_tree_view +msgid "Close Reasons" +msgstr "Motivos de cierre" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__company_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__company_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Company" +msgstr "Compañía" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Confirm" +msgstr "Confirmar" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +msgid "Create" +msgstr "Crear" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_action +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +msgid "Create Visits" +msgstr "Crear visitas" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.crm_salesperson_planner_visit_template_action +msgid "Create and plan commercial visit templates" +msgstr "Crear y planificar plantillas de visitas comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_template +msgid "Crm Salesperson Planner Visit Template" +msgstr "Plantilla de visita del planificador de ventas Crm" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_ids +msgid "Customer" +msgstr "Cliente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__date +msgid "Date" +msgstr "Fecha" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__day +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__month_by__date +msgid "Date of month" +msgstr "Fecha del mes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__date_to +msgid "Date to" +msgstr "Fecha hasta" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Day of Month" +msgstr "Día del mes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__month_by__day +msgid "Day of month" +msgstr "Día del mes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__daily +msgid "Days" +msgstr "Días" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__description +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__description +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Description" +msgstr "Descripción" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__done +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Done" +msgstr "Hecho" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__draft +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__draft +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Draft" +msgstr "Borrador" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__duration +msgid "Duration" +msgstr "Duración" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop_date +msgid "End Date" +msgstr "Fecha de finalización" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__end_date +msgid "End date" +msgstr "Fecha final" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/calendar_event.py:0 +#, python-format +msgid "" +"Event %(event_name)s is related to salesperson visit %(partner_name)s. " +"Cancel it to delete this event.\n" +msgstr "" +"El evento %(event_name)s está relacionado con la visita del vendedor " +"%(partner_name)s. Cancélelo para eliminar este evento\n" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__1 +msgid "First" +msgstr "Primer" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_follower_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_partner_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Socios)" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icono de fuente impresionante, por ejemplo fa-tasks" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__forever +msgid "Forever" +msgstr "Para Siempre" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__4 +msgid "Fourth" +msgstr "Cuarto" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__fri +msgid "Fri" +msgstr "Viernes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__fri +msgid "Friday" +msgstr "Viernes" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Future Visits" +msgstr "Visitas futuras" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_close_wiz +msgid "Get Close Reason" +msgstr "Motivo de cierre" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Group By" +msgstr "Agrupar por" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__has_message +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__has_message +msgid "Has Message" +msgstr "Tiene Mensaje" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__id +msgid "ID" +msgstr "ID" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_icon +msgid "Icon" +msgstr "Icono" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icono para indicar una actividad de excepción." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Si está marcado, hay nuevos mensajes que requieren su atención." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Si se encuentra marcado, algunos mensajes tienen error de envío." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__image +msgid "Image" +msgstr "Imagen" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__in-progress +msgid "In Progress" +msgstr "En progreso" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__incident +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_close_reason__close_type__incident +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Incident" +msgstr "Incidencia" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Internal Notes" +msgstr "Notas internas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_is_follower +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_is_follower +msgid "Is Follower" +msgstr "És seguidor" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__-1 +msgid "Last" +msgstr "Último" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__write_uid +msgid "Last Updated by" +msgstr "Última modificación el" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__write_date +msgid "Last Updated on" +msgstr "Última modificación el" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__last_visit_date +msgid "Last Visit Date" +msgstr "Fecha última visita" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Late Visits" +msgstr "Visitas tardías" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Iniciativa/Oportunidad" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule_type +msgid "Let the event automatically repeat at that interval" +msgstr "Permite que el evento se repita automáticamente en ese intervalo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_main_attachment_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "Adjunto principal" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Manually Create Visits" +msgstr "Creación manual de visitas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error +msgid "Message Delivery error" +msgstr "Mensaje de error de entrega" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_ids +msgid "Messages" +msgstr "Mensajes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_mobile +msgid "Mobile" +msgstr "Móvil" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__mon +msgid "Mon" +msgstr "Lunes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__mon +msgid "Monday" +msgstr "Lunes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__monthly +msgid "Months" +msgstr "Meses" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Fecha Límite de Mi Actividad" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_my_visits +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "My Visits" +msgstr "Mis visitas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_date +msgid "New Date" +msgstr "Nueva fecha" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "Próximo Evento del Calendario de Actividades" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Siguiente plazo de actividad" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_summary +msgid "Next Activity Summary" +msgstr "Resumen de la siguiente actividad" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo de la siguiente actividad" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__notes +msgid "Notes" +msgstr "Notas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__alarm_ids +msgid "Notifications sent to all attendees to remind of the meeting." +msgstr "" +"Envío de notificaciones a todos los asistentes para recordarles la reunión." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction_counter +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de acciones" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__visit_ids_count +msgid "Number of Sales Person Visits" +msgstr "Número de visitas comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_res_partner__salesperson_planner_visit_count +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_res_users__salesperson_planner_visit_count +msgid "Number of Salesperson Visits" +msgstr "Número de visitas comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error_counter +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error_counter +msgid "Number of errors" +msgstr "Número de errores" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction_counter +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Número de mensajes que requieren una acción" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error_counter +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensajes con error de envío" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__count +msgid "Number of repetitions" +msgstr "Número de repeticiones" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit_template.py:0 +#: code:addons/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit.py:0 +#, python-format +msgid "Only one customer is allowed" +msgstr "Solo se permite un cliente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__opportunity_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Opportunities" +msgstr "Oportunidades" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__month_by +msgid "Option" +msgstr "Opción" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Partner" +msgstr "Cliente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_id +msgid "Partner-related data of the user" +msgstr "Datos del usuario relativos a la empresa" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_phone +msgid "Phone" +msgstr "Teléfono" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__reason_id +msgid "Reason" +msgstr "Razón" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.all_crm_salesperson_planner_visit_action +msgid "Record and track all sales commercial visits." +msgstr "Registre y rastree todas las visitas comerciales." + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.my_crm_salesperson_planner_visit_action +msgid "Record and track my sales commercial visits." +msgstr "Registrar y rastrear mis visitas comerciales." + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_action +msgid "Record reason for close commercial visits." +msgstr "Registrar el motivo de cierre de las visitas comerciales." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule_type +msgid "Recurrence" +msgstr "Recurrencia" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__end_type +msgid "Recurrence Termination" +msgstr "Finalizar recurrencia" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule +msgid "Recurrent Rule" +msgstr "Regla recurrente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__alarm_ids +msgid "Reminders" +msgstr "Recordatorios" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__count +msgid "Repeat" +msgstr "Repetir" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__interval +msgid "Repeat Every" +msgstr "Repite cada" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__final_date +msgid "Repeat Until" +msgstr "Repetir hasta" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__interval +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "Repetir cada (días/semana/mes/año)" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__count +msgid "Repeat x times" +msgstr "Repetir x veces" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__require_image +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__require_image +msgid "Require Image" +msgstr "Requiere una imagen" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__reschedule +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__reschedule +msgid "Reschedule" +msgstr "Reprogramar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_user_id +msgid "Responsible User" +msgstr "Usuario responsable" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.partner_view_crm_salesperson_planner +msgid "Sales Visits" +msgstr "Visitas de comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_close_reason +msgid "SalesPerson Planner Visit Close Reason" +msgstr "Crm Salesperson Planner Visit Template" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__user_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__user_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Salesperson" +msgstr "Comercial" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_config_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_salesperson_planner +msgid "Salesperson Planner" +msgstr "Planificador comercial" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit +msgid "Salesperson Planner Visit" +msgstr "Planificador de visitas comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_calendar_event__salesperson_planner_visit_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_lead_crm_salesperson_planner +msgid "Salesperson Visits" +msgstr "Visitas comerciales" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sat +msgid "Sat" +msgstr "Sabado" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__sat +msgid "Saturday" +msgstr "Sábado" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_id +msgid "Scheduled by" +msgstr "Programado por" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Search Visits" +msgstr "Búsqueda de visitas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__2 +msgid "Second" +msgstr "Segundo" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Send to Draft" +msgstr "Enviar a Borrador" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__sequence +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_sequence +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start +msgid "Start" +msgstr "Iniciar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start_date +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start +msgid "Start date of an event, without time for full days events" +msgstr "Fecha de inicio del evento, sin horas para eventos de día completo" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "State" +msgstr "Estado" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__state +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__state +msgid "Status" +msgstr "Estado" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Estado basado en las actividades \n" +"Retraso: Fecha de vencimiento ya es pasado \n" +"Hoy: Fecha actividad es hoy \n" +"Planificado: Actividades futuras." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop +msgid "Stop" +msgstr "Parar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop +msgid "Stop date of an event, without time for full days events" +msgstr "Fecha fin del evento, sin horas para eventos de día completo" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +msgid "Submit" +msgstr "Enviar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sun +msgid "Sun" +msgstr "Domingo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__sun +msgid "Sunday" +msgstr "Domingo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__categ_ids +msgid "Tags" +msgstr "Etiquetas" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "The" +msgstr "The" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz.py:0 +#, python-format +msgid "The close reason type haven't a function." +msgstr "El tipo de motivo de cierre no tiene una función." + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.py:0 +#, python-format +msgid "The date can't be earlier than today" +msgstr "La fecha no puede ser anterior a hoy" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in cancelled, incident or visited state" +msgstr "La visita debe estar en estado cancelado, incidente o visitado" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in confirmed state" +msgstr "La visita debe estar en estado confirmado" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in draft or validated state" +msgstr "La visita debe estar en estado borrador o validado" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in draft state" +msgstr "La visita debe estar en estado de borrador" + +#. module: crm_salesperson_planner +#: model:ir.model.constraint,message:crm_salesperson_planner.constraint_crm_salesperson_planner_visit_crm_salesperson_planner_visit_name +msgid "The visit number must be unique!" +msgstr "¡El número de visita debe ser único!" + +#. module: crm_salesperson_planner +#: model:ir.model.constraint,message:crm_salesperson_planner.constraint_crm_salesperson_planner_visit_template_crm_salesperson_planner_visit_template_name +msgid "The visit template number must be unique!" +msgstr "¡El número de plantilla de visita debe ser único!" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__3 +msgid "Third" +msgstr "Tercer" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__thu +msgid "Thu" +msgstr "Jueves" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__thu +msgid "Thursday" +msgstr "Jueves" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__event_tz +msgid "Timezone" +msgstr "Zona horaria" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Today Visits" +msgstr "Visitas de hoy" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__tue +msgid "Tue" +msgstr "Martes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__tue +msgid "Tuesday" +msgstr "Martes" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__close_type +msgid "Type" +msgstr "Tipo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de la actividad de excepción registrada." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__until +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Until" +msgstr "Hasta" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__sequence +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_sequence +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sequence +msgid "Used to order Visits in the different views" +msgstr "Utilizado para ordenar Visitas en las diferentes vistas" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Validate" +msgstr "Validar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__confirm +msgid "Validated" +msgstr "Validado" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Visit" +msgstr "Visita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__name +msgid "Visit Number" +msgstr "Número de visita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__visit_template_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__visit_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Visit Template" +msgstr "Plantilla de visita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__name +msgid "Visit Template Number" +msgstr "Número de plantilla de visita" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_template_action +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_visit_template +msgid "Visit Templates" +msgstr "Plantillas de visitas" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Visit by Date" +msgstr "Visita por fecha" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__done +msgid "Visited" +msgstr "Visitado" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.all_crm_salesperson_planner_visit_action +#: model:ir.actions.act_window,name:crm_salesperson_planner.my_crm_salesperson_planner_visit_action +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_lead__crm_salesperson_planner_visit_ids +msgid "Visits" +msgstr "Visitas" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "Visits must be in cancelled state" +msgstr "Las visitas deben estar en estado cancelado" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Visits that are assigned to me" +msgstr "Visitas asignadas a mi" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__website_message_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__website_message_ids +msgid "Website Messages" +msgstr "Mensajes del sitio web" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__website_message_ids +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__website_message_ids +msgid "Website communication history" +msgstr "Historial de comunicación del sitio web" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__wed +msgid "Wed" +msgstr "Miercoles" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__wed +msgid "Wednesday" +msgstr "Miércoles" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__weekday +msgid "Weekday" +msgstr "Día de la semana" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__weekly +msgid "Weeks" +msgstr "Semanas" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__yearly +msgid "Years" +msgstr "Años" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_template_create +msgid "crm salesperson planner visit template create" +msgstr "Crear plantilla de visita al planificador de vendedores de CRM" + +#~ msgid "Active" +#~ msgstr "Activo" + +#~ msgid "Attendee Status" +#~ msgstr "Estado de asistente" + +#~ msgid "" +#~ "Check if the organizer is alone in the event, i.e. if the organizer is " +#~ "the only one that hasn't declined\n" +#~ " the event (only if the organizer is not the only attendee)" +#~ msgstr "" +#~ "Comprueba si el organizador está solo en el evento, es decir, si el " +#~ "organizador es el único que no ha declinado\n" +#~ " el evento (sólo si el organizador no es el único asistente)" + +#~ msgid "" +#~ "Choose what to do with other events in the recurrence. Updating All " +#~ "Events is not allowed when dates or time is modified" +#~ msgstr "" +#~ "Elija qué hacer con otros eventos en la recurrencia. No se permite " +#~ "actualizar todos los eventos cuando se modifican las fechas o la hora" + +#~ msgid "Display Description" +#~ msgstr "Visualización de Descripción" + +#~ msgid "Document ID" +#~ msgstr "ID del documento" + +#~ msgid "Document Model" +#~ msgstr "Modelo del documento" + +#~ msgid "Document Model Name" +#~ msgstr "Nombre del modelo del documento" + +#~ msgid "Event Time" +#~ msgstr "Hora del evento" + +#~ msgid "Follow Recurrence" +#~ msgstr "Seguir Recurrencia" + +#~ msgid "" +#~ "If the active field is set to false, it will allow you to hide the event " +#~ "alarm information without removing it." +#~ msgstr "" +#~ "Si el campo activo es falso, le permitirá ocultar la notificación de " +#~ "aviso del evento sin eliminarlo." + +#~ msgid "" +#~ "If the time is shown as 'busy', this event will be visible to other " +#~ "people with either the full information or simply 'busy' written " +#~ "depending on its privacy. Use this option to let other people " +#~ "know that you are unavailable during that period of time. \n" +#~ " If the event is shown as 'free', other users know that you are " +#~ "available during that period of time." +#~ msgstr "" +#~ "Si la hora se muestra como 'ocupado', este evento será visible para otras " +#~ "personas con la información completa o " +#~ "simplemente 'ocupado' escrito dependiendo de su privacidad. Utiliza esta " +#~ "opción para que los demás usuarios sepan que no " +#~ "estás disponible durante ese periodo de tiempo. \n" +#~ " Si el evento se muestra como \"libre\", los demás usuarios " +#~ "sabrán que estás disponible durante ese periodo " +#~ "de tiempo." + +#~ msgid "Is the Event Highlighted" +#~ msgstr "Es el Evento Resaltado" + +#~ msgid "Is the Organizer Alone" +#~ msgstr "El Organizador está Solo" + +#~ msgid "Location" +#~ msgstr "Ubicación" + +#~ msgid "Location of Event" +#~ msgstr "Ubicación del evento" + +#~ msgid "Meeting URL" +#~ msgstr "URL de la Reunión" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Número de mensajes que requieren una acción" + +#~ msgid "Number of unread messages" +#~ msgstr "Número de mensajes no leidos" + +#~ msgid "Opportunity" +#~ msgstr "Oportunidad" + +#~ msgid "Participant" +#~ msgstr "Participante" + +#~ msgid "People to whom this event will be visible." +#~ msgstr "Personas a las que será visible este evento." + +#~ msgid "Phonecall" +#~ msgstr "Llamada telefónica" + +#~ msgid "Privacy" +#~ msgstr "Privacitat" + +#~ msgid "Recurrence Rule" +#~ msgstr "Regla de Recurrencia" + +#~ msgid "Recurrence Update" +#~ msgstr "Actualización de Recurrencia" + +#~ msgid "Recurrent" +#~ msgstr "Recurrente" + +#~ msgid "SMS Delivery error" +#~ msgstr "SMS de error en la entrega" + +#~ msgid "Show as" +#~ msgstr "Mostrar como" + +#~ msgid "Unread Messages" +#~ msgstr "Número de mensajes no leídos" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Nº de mensajes sin leer" + +#~ msgid "Attendee" +#~ msgstr "Asistente" + +#~ msgid "By day" +#~ msgstr "Por día" + +#~ msgid "End Datetime" +#~ msgstr "Fecha y hora de finalización" + +#, python-format +#~ msgid "" +#~ "Event %s is related to salesperson visit %s. Cancel it to delete this " +#~ "event.\n" +#~ msgstr "" +#~ "El evento %s está relacionado con la visita comercial %s. Cancelela para " +#~ "eliminar este evento.\n" + +#~ msgid "Followers (Channels)" +#~ msgstr "Seguidores (Canales)" + +#~ msgid "Recurrent ID" +#~ msgstr "ID recurrencia" + +#~ msgid "Recurrent ID date" +#~ msgstr "Fecha ID recurrencia" + +#~ msgid "Recurrent Meeting" +#~ msgstr "Reunión periódica" + +#~ msgid "Responsible" +#~ msgstr "Responsable" + +#~ msgid "Show Time as" +#~ msgstr "Mostrar hora como" + +#~ msgid "Start DateTime" +#~ msgstr "Fecha y hora de inicio" diff --git a/crm_salesperson_planner/i18n/it.po b/crm_salesperson_planner/i18n/it.po new file mode 100644 index 00000000000..6253b2ec5a1 --- /dev/null +++ b/crm_salesperson_planner/i18n/it.po @@ -0,0 +1,1188 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_salesperson_planner +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-04-03 15:36+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Add a description..." +msgstr "Aggiungere una descrizione..." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__allday +msgid "All Day" +msgstr "Tutto il giorno" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_visits +msgid "All Visits" +msgstr "Tutte le visite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__allow_reschedule +msgid "Allow Reschedule" +msgstr "Consenti riprogrammazione" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_attachment_count +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_attachment_count +msgid "Attachment Count" +msgstr "Conteggio allegati" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__auto_validate +msgid "Auto Validate" +msgstr "Auto validazione" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__byday +msgid "Byday" +msgstr "Di giorno" + +#. module: crm_salesperson_planner +#: model:ir.actions.server,name:crm_salesperson_planner.ir_cron_create_visits_ir_actions_server +#: model:ir.cron,cron_name:crm_salesperson_planner.ir_cron_create_visits +msgid "CRM: Create salesperson visits" +msgstr "CRM: crea visita addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_calendar_event +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__calendar_event_id +msgid "Calendar Event" +msgstr "Evento calendario" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_close_reason__close_type__cancel +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Cancel" +msgstr "Annulla" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__cancel +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__cancel +msgid "Cancelled" +msgstr "Annullata" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Close Info" +msgstr "Chiudi informazione" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +msgid "Close Reason" +msgstr "Motivo chiusura" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_image +msgid "Close Reason Image" +msgstr "Immagine motivo chiusura" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__close_reason_notes +msgid "Close Reason Notes" +msgstr "Note motivo chiusura" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_action +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_action +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_config_salesperson_planner_close_reason +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_tree_view +msgid "Close Reasons" +msgstr "Motivi chiusura" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__company_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__company_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Company" +msgstr "Azienda" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Confirm" +msgstr "Conferma" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +msgid "Create" +msgstr "Crea" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_action +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_create_view_form +msgid "Create Visits" +msgstr "Crea visita" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.crm_salesperson_planner_visit_template_action +msgid "Create and plan commercial visit templates" +msgstr "Crea e pianifica modelli visita commerciale" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__create_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__create_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_template +msgid "Crm Salesperson Planner Visit Template" +msgstr "Modello CRM visita agenda addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_ids +msgid "Customer" +msgstr "Cliente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__date +msgid "Date" +msgstr "Data" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__day +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__month_by__date +msgid "Date of month" +msgstr "Giorno del mese" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__date_to +msgid "Date to" +msgstr "Alla data" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Day of Month" +msgstr "Giorno del mese" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__month_by__day +msgid "Day of month" +msgstr "Giorno del mese" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__daily +msgid "Days" +msgstr "Giorni" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__description +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__description +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Description" +msgstr "Descrizione" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__display_name +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__done +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Done" +msgstr "Eseguita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__draft +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__draft +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Draft" +msgstr "Bozza" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__duration +msgid "Duration" +msgstr "Durata" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop_date +msgid "End Date" +msgstr "Data fine" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__end_date +msgid "End date" +msgstr "Data fine" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/calendar_event.py:0 +#, python-format +msgid "" +"Event %(event_name)s is related to salesperson visit %(partner_name)s. " +"Cancel it to delete this event.\n" +msgstr "" +"L'evento %(event_name)s è collegato alla visita dell'addetto vendite " +"%(partner_name)s. Annullarla per cancellare questo evento.\n" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__1 +msgid "First" +msgstr "Primo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_follower_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_partner_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__forever +msgid "Forever" +msgstr "Per sempre" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__4 +msgid "Fourth" +msgstr "Quarto" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__fri +msgid "Fri" +msgstr "Ven" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__fri +msgid "Friday" +msgstr "Venerdì" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Future Visits" +msgstr "Visite future" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_close_wiz +msgid "Get Close Reason" +msgstr "Seleziona motivo chiusura" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Group By" +msgstr "Raggruppa per" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__has_message +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__id +msgid "ID" +msgstr "ID" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__image +msgid "Image" +msgstr "Immagine" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__state__in-progress +msgid "In Progress" +msgstr "In corso" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__incident +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_close_reason__close_type__incident +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Incident" +msgstr "Contrattempo" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Internal Notes" +msgstr "Note interne" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_is_follower +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__-1 +msgid "Last" +msgstr "Ultimo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template____last_update +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__write_uid +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__write_date +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template_create__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__last_visit_date +msgid "Last Visit Date" +msgstr "Data ultima visita" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Late Visits" +msgstr "Ultime visite" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Contatto/Opportunità" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule_type +msgid "Let the event automatically repeat at that interval" +msgstr "Consente la ripetizione automatica dell'evento con quell'intervallo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_main_attachment_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_main_attachment_id +msgid "Main Attachment" +msgstr "Allegato principale" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Manually Create Visits" +msgstr "Crea visite manualmente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_mobile +msgid "Mobile" +msgstr "Cellulare" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__mon +msgid "Mon" +msgstr "Lun" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__mon +msgid "Monday" +msgstr "Lunedì" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__monthly +msgid "Months" +msgstr "Mesi" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_my_visits +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "My Visits" +msgstr "Le mie visite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_date +msgid "New Date" +msgstr "Nuova data" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "Evento calendario attività successiva" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__notes +msgid "Notes" +msgstr "Note" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__alarm_ids +msgid "Notifications sent to all attendees to remind of the meeting." +msgstr "Inviata notifica a tutti i partecipanti per ricordare l'appuntamento." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction_counter +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__visit_ids_count +msgid "Number of Sales Person Visits" +msgstr "Numero visite addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_res_partner__salesperson_planner_visit_count +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_res_users__salesperson_planner_visit_count +msgid "Number of Salesperson Visits" +msgstr "Numero visite addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error_counter +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_needaction_counter +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__message_has_error_counter +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__end_type__count +msgid "Number of repetitions" +msgstr "Numero di ripetizioni" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit_template.py:0 +#: code:addons/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit.py:0 +#, python-format +msgid "Only one customer is allowed" +msgstr "È consentito un solo cliente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__opportunity_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Opportunities" +msgstr "Opportunità" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__month_by +msgid "Option" +msgstr "Opzione" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Partner" +msgstr "Partner" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_id +msgid "Partner-related data of the user" +msgstr "Dati dell'utente relativi al partner" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__partner_phone +msgid "Phone" +msgstr "Telefono" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__reason_id +msgid "Reason" +msgstr "Motivo" + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.all_crm_salesperson_planner_visit_action +msgid "Record and track all sales commercial visits." +msgstr "Registra e traccia tutte le visite commerciali vendite." + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.my_crm_salesperson_planner_visit_action +msgid "Record and track my sales commercial visits." +msgstr "Registra e traccia le mie visite commerciali vendite." + +#. module: crm_salesperson_planner +#: model_terms:ir.actions.act_window,help:crm_salesperson_planner.crm_salesperson_planner_visit_close_reason_action +msgid "Record reason for close commercial visits." +msgstr "Registrazione motivi di chiusura delle visite commerciali." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule_type +msgid "Recurrence" +msgstr "Ricorrenza" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__end_type +msgid "Recurrence Termination" +msgstr "Termine ricorrenza" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__rrule +msgid "Recurrent Rule" +msgstr "Regola ricorrente" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__alarm_ids +msgid "Reminders" +msgstr "Promemoria" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__count +msgid "Repeat" +msgstr "Ripeti" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__interval +msgid "Repeat Every" +msgstr "Ripeti ogni" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__final_date +msgid "Repeat Until" +msgstr "Ripeti fino al" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__interval +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "Ripeti ogni (giorni/settimane/mesi/anni)" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__count +msgid "Repeat x times" +msgstr "Ripeti n volte" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__require_image +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__require_image +msgid "Require Image" +msgstr "Richiede immagine" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__reschedule +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__reschedule +msgid "Reschedule" +msgstr "Riprogrammare" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.partner_view_crm_salesperson_planner +msgid "Sales Visits" +msgstr "Visite vendite" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_close_reason +msgid "SalesPerson Planner Visit Close Reason" +msgstr "Motivo chiusura visita agenda addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__user_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__user_id +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Salesperson" +msgstr "Addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_config_salesperson_planner +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_salesperson_planner +msgid "Salesperson Planner" +msgstr "Agenda addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit +msgid "Salesperson Planner Visit" +msgstr "Visita agenda addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_calendar_event__salesperson_planner_visit_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_lead_crm_salesperson_planner +msgid "Salesperson Visits" +msgstr "Visite addetto vendite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sat +msgid "Sat" +msgstr "Sab" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__sat +msgid "Saturday" +msgstr "Sabato" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__partner_id +msgid "Scheduled by" +msgstr "Pianificato da" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Search Visits" +msgstr "Cerca visite" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__2 +msgid "Second" +msgstr "Secondo" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Send to Draft" +msgstr "Imposta a bozza" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__sequence +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_sequence +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start +msgid "Start" +msgstr "Inizio" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start_date +msgid "Start Date" +msgstr "Data inizio" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__start +msgid "Start date of an event, without time for full days events" +msgstr "" +"Data di inizio di un evento, senza orario per gli eventi a giornata intera" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "State" +msgstr "Stato" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__state +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__state +msgid "Status" +msgstr "Stato" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop +msgid "Stop" +msgstr "Fine" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__stop +msgid "Stop date of an event, without time for full days events" +msgstr "" +"Data di fine di un evento, senza orario per gli eventi a giornata intera" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_close_wiz_view_form +msgid "Submit" +msgstr "Invia" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sun +msgid "Sun" +msgstr "Dom" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__sun +msgid "Sunday" +msgstr "Domenica" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__categ_ids +msgid "Tags" +msgstr "Etichette" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "The" +msgstr "La" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz.py:0 +#, python-format +msgid "The close reason type haven't a function." +msgstr "Il tipo motivo di chiusura non ha una funzione." + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.py:0 +#, python-format +msgid "The date can't be earlier than today" +msgstr "La data non può essere antecedente ad oggi" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in cancelled, incident or visited state" +msgstr "La visita deve essere in stato annullata, contrattempo o visitata" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in confirmed state" +msgstr "La visita deve essere in stato confermato" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in draft or validated state" +msgstr "La visita deve essere in stato bozza o validata" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "The visit must be in draft state" +msgstr "La visita deve essere in stato bozza" + +#. module: crm_salesperson_planner +#: model:ir.model.constraint,message:crm_salesperson_planner.constraint_crm_salesperson_planner_visit_crm_salesperson_planner_visit_name +msgid "The visit number must be unique!" +msgstr "Il numero visita deve essere univoco!" + +#. module: crm_salesperson_planner +#: model:ir.model.constraint,message:crm_salesperson_planner.constraint_crm_salesperson_planner_visit_template_crm_salesperson_planner_visit_template_name +msgid "The visit template number must be unique!" +msgstr "Il numero modello visita deve essere univoco!" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__byday__3 +msgid "Third" +msgstr "Terzo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__thu +msgid "Thu" +msgstr "Gio" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__thu +msgid "Thursday" +msgstr "Giovedì" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__event_tz +msgid "Timezone" +msgstr "Fuso orario" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Today Visits" +msgstr "Visite di oggi" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__tue +msgid "Tue" +msgstr "Mar" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__tue +msgid "Tuesday" +msgstr "Martedì" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_reason__close_type +msgid "Type" +msgstr "Tipo" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__until +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Until" +msgstr "Fino a" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__sequence +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_close_wiz__new_sequence +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__sequence +msgid "Used to order Visits in the different views" +msgstr "Utilizzato per ordinare le visite nelle viste" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Validate" +msgstr "Conferma" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__confirm +msgid "Validated" +msgstr "Confermata" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_form_view +msgid "Visit" +msgstr "Visita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__name +msgid "Visit Number" +msgstr "Numero visita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__visit_template_id +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__visit_ids +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_template_form_view +msgid "Visit Template" +msgstr "Modello visita" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__name +msgid "Visit Template Number" +msgstr "Numero modello visita" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.crm_salesperson_planner_visit_template_action +#: model:ir.ui.menu,name:crm_salesperson_planner.menu_crm_salesperson_planner_visit_template +msgid "Visit Templates" +msgstr "Modelli visita" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Visit by Date" +msgstr "Visita per data" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit__state__done +msgid "Visited" +msgstr "Visitata" + +#. module: crm_salesperson_planner +#: model:ir.actions.act_window,name:crm_salesperson_planner.all_crm_salesperson_planner_visit_action +#: model:ir.actions.act_window,name:crm_salesperson_planner.my_crm_salesperson_planner_visit_action +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_lead__crm_salesperson_planner_visit_ids +msgid "Visits" +msgstr "Visite" + +#. module: crm_salesperson_planner +#. odoo-python +#: code:addons/crm_salesperson_planner/models/crm_salesperson_planner_visit.py:0 +#, python-format +msgid "Visits must be in cancelled state" +msgstr "Le visite devono essere in stato annullata" + +#. module: crm_salesperson_planner +#: model_terms:ir.ui.view,arch_db:crm_salesperson_planner.crm_salesperson_planner_visit_filter +msgid "Visits that are assigned to me" +msgstr "Visite assegnate a me" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit__website_message_ids +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit__website_message_ids +#: model:ir.model.fields,help:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__wed +msgid "Wed" +msgstr "Mer" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__weekday__wed +msgid "Wednesday" +msgstr "Mercoledì" + +#. module: crm_salesperson_planner +#: model:ir.model.fields,field_description:crm_salesperson_planner.field_crm_salesperson_planner_visit_template__weekday +msgid "Weekday" +msgstr "Giorno della settimana" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__weekly +msgid "Weeks" +msgstr "Settimane" + +#. module: crm_salesperson_planner +#: model:ir.model.fields.selection,name:crm_salesperson_planner.selection__crm_salesperson_planner_visit_template__rrule_type__yearly +msgid "Years" +msgstr "Anni" + +#. module: crm_salesperson_planner +#: model:ir.model,name:crm_salesperson_planner.model_crm_salesperson_planner_visit_template_create +msgid "crm salesperson planner visit template create" +msgstr "Crea modello visita agenda addetto vendite CRM" + +#~ msgid "Active" +#~ msgstr "Attiva" + +#~ msgid "Attendee Status" +#~ msgstr "Stato partecipante" + +#~ msgid "By day" +#~ msgstr "Di giorno" + +#~ msgid "" +#~ "Check if the organizer is alone in the event, i.e. if the organizer is " +#~ "the only one that hasn't declined\n" +#~ " the event (only if the organizer is not the only attendee)" +#~ msgstr "" +#~ "Controlla se l'organizzatore è l'unico nell'evento, cioè se " +#~ "l'organizzatore è l'unico che non ha rifiutato\n" +#~ " l'evento (solo se l'organizzatore non è l'unico partecipante)" + +#~ msgid "" +#~ "Choose what to do with other events in the recurrence. Updating All " +#~ "Events is not allowed when dates or time is modified" +#~ msgstr "" +#~ "Scegliere cosa fare con gli altri eventi nella ricorrenza. Non è " +#~ "consentito aggiornare tutti gli eventi quando date e orari sono modificati" + +#~ msgid "Discuss Channel" +#~ msgstr "Canale discussione" + +#~ msgid "Display Description" +#~ msgstr "Visualizza descrizione" + +#~ msgid "Document ID" +#~ msgstr "ID documento" + +#~ msgid "Document Model" +#~ msgstr "Modello documento" + +#~ msgid "Document Model Name" +#~ msgstr "Nome modello documento" + +#~ msgid "Event Time" +#~ msgstr "Ora evento" + +#~ msgid "Follow Recurrence" +#~ msgstr "Segui ricorrenza" + +#~ msgid "" +#~ "If the active field is set to false, it will allow you to hide the event " +#~ "alarm information without removing it." +#~ msgstr "" +#~ "Se il campo attivo è impostato a falso, consente di nascondere l'allerta " +#~ "evento senza rimuoverla." + +#~ msgid "" +#~ "If the time is shown as 'busy', this event will be visible to other " +#~ "people with either the full information or simply 'busy' written " +#~ "depending on its privacy. Use this option to let other people " +#~ "know that you are unavailable during that period of time. \n" +#~ " If the event is shown as 'free', other users know that you are " +#~ "available during that period of time." +#~ msgstr "" +#~ "Se l'ora è visualizzata come \"occupata\", questo evento sarà visibile ad " +#~ "altre persone con tutte le informazioni o semplicemente con la " +#~ "scritta 'occupato' in funzione della sua riservatezza. Utilizzare questa " +#~ "opzione per consentire alle altre persone di sapere che non si è " +#~ "disponibili in questo orario. \n" +#~ " Se l'evento è visualizzato come 'libero', gli altri utenti " +#~ "sapranno che si è liberi in questo orario." + +#~ msgid "Invalid Email Partner" +#~ msgstr "E-mail partner non valida" + +#~ msgid "Invitation Token" +#~ msgstr "Token di invito" + +#~ msgid "Is the Event Highlighted" +#~ msgstr "L'evento è evidenziato" + +#~ msgid "Is the Organizer Alone" +#~ msgstr "L'organizzatore è solo" + +#~ msgid "Location" +#~ msgstr "Località" + +#~ msgid "Meeting URL" +#~ msgstr "URL riunione" + +#~ msgid "Opportunity" +#~ msgstr "Opportunità" + +#~ msgid "Participant" +#~ msgstr "Partecipante" + +#~ msgid "People to whom this event will be visible." +#~ msgstr "Persone alle quali sarà visibile questo evento." + +#~ msgid "Phonecall" +#~ msgstr "Chiamata telefonica" + +#~ msgid "Privacy" +#~ msgstr "Privacy" + +#~ msgid "Recurrence Rule" +#~ msgstr "Regole ricorrenza" + +#~ msgid "Recurrence Update" +#~ msgstr "Aggiornamento ricorrenza" + +#~ msgid "Recurrent" +#~ msgstr "Ricorrente" + +#~ msgid "Show as" +#~ msgstr "Visualizza come" + +#~ msgid "Videocall Source" +#~ msgstr "Origine video chiamata" diff --git a/crm_salesperson_planner/models/__init__.py b/crm_salesperson_planner/models/__init__.py new file mode 100644 index 00000000000..1a34f478297 --- /dev/null +++ b/crm_salesperson_planner/models/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from . import crm_salesperson_planner_visit +from . import crm_salesperson_planner_visit_template +from . import crm_salesperson_planner_visit_close_reason +from . import res_partner +from . import crm_lead +from . import calendar_event diff --git a/crm_salesperson_planner/models/calendar_event.py b/crm_salesperson_planner/models/calendar_event.py new file mode 100644 index 00000000000..102d7bc1f88 --- /dev/null +++ b/crm_salesperson_planner/models/calendar_event.py @@ -0,0 +1,59 @@ +# Copyright 2021 Sygel - Manuel Regidor +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + + +class CalendarEvent(models.Model): + _inherit = "calendar.event" + + salesperson_planner_visit_ids = fields.One2many( + string="Salesperson Visits", + comodel_name="crm.salesperson.planner.visit", + inverse_name="calendar_event_id", + ) + + def write(self, values): + if values.get("start") or values.get("user_id"): + salesperson_visit_events = self.filtered( + lambda a: a.res_model == "crm.salesperson.planner.visit" + ) + if salesperson_visit_events: + new_vals = {} + if values.get("start"): + new_vals["date"] = values.get("start") + if values.get("user_id"): + new_vals["user_id"] = values.get("user_id") + user_id = self.env["res.users"].browse(values.get("user_id")) + if user_id: + partner_ids = self.partner_ids.filtered( + lambda a: a != self.user_id.partner_id + ).ids + partner_ids.append(user_id.partner_id.id) + values["partner_ids"] = [(6, 0, partner_ids)] + salesperson_visit_events.mapped( + "salesperson_planner_visit_ids" + ).with_context(bypass_update_event=True).write(new_vals) + return super().write(values) + + def unlink(self): + if not self.env.context.get("bypass_cancel_visit"): + salesperson_visit_events = self.filtered( + lambda a: a.res_model == "crm.salesperson.planner.visit" + and a.salesperson_planner_visit_ids + ) + if salesperson_visit_events: + error_msg = "" + for event in salesperson_visit_events: + error_msg += _( + "Event %(event_name)s is related to salesperson visit " + "%(partner_name)s. Cancel it to delete this event.\n" + ) % { + "event_name": event.name, + "partner_name": fields.first( + event.salesperson_planner_visit_ids + ).name, + } + raise ValidationError(error_msg) + return super().unlink() diff --git a/crm_salesperson_planner/models/crm_lead.py b/crm_salesperson_planner/models/crm_lead.py new file mode 100644 index 00000000000..2737e575bb5 --- /dev/null +++ b/crm_salesperson_planner/models/crm_lead.py @@ -0,0 +1,16 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class CrmLead(models.Model): + _inherit = "crm.lead" + + crm_salesperson_planner_visit_ids = fields.Many2many( + comodel_name="crm.salesperson.planner.visit", + relation="crm_salesperson_planner_visit_crm_lead_rel", + string="Visits", + copy=False, + domain="[('partner_id', 'child_of', partner_id)]", + ) diff --git a/crm_salesperson_planner/models/crm_salesperson_planner_visit.py b/crm_salesperson_planner/models/crm_salesperson_planner_visit.py new file mode 100644 index 00000000000..d6737a30a86 --- /dev/null +++ b/crm_salesperson_planner/models/crm_salesperson_planner_visit.py @@ -0,0 +1,196 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# Copyright 2021 Sygel - Manuel Regidor +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class CrmSalespersonPlannerVisit(models.Model): + _name = "crm.salesperson.planner.visit" + _description = "Salesperson Planner Visit" + _order = "date desc,sequence" + _inherit = ["mail.thread", "mail.activity.mixin"] + + name = fields.Char( + string="Visit Number", + required=True, + default="/", + copy=False, + ) + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Customer", + required=True, + ) + partner_phone = fields.Char(string="Phone", related="partner_id.phone") + partner_mobile = fields.Char(string="Mobile", related="partner_id.mobile") + date = fields.Date( + default=fields.Date.context_today, + required=True, + ) + sequence = fields.Integer( + help="Used to order Visits in the different views", + default=20, + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + user_id = fields.Many2one( + comodel_name="res.users", + string="Salesperson", + index=True, + tracking=True, + default=lambda self: self.env.user, + domain=lambda self: [ + ("groups_id", "in", self.env.ref("sales_team.group_sale_salesman").id) + ], + ) + opportunity_ids = fields.Many2many( + comodel_name="crm.lead", + relation="crm_salesperson_planner_visit_crm_lead_rel", + string="Opportunities", + copy=False, + domain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]", + ) + description = fields.Html() + state = fields.Selection( + string="Status", + required=True, + copy=False, + tracking=True, + selection=[ + ("draft", "Draft"), + ("confirm", "Validated"), + ("done", "Visited"), + ("cancel", "Cancelled"), + ("incident", "Incident"), + ], + default="draft", + ) + close_reason_id = fields.Many2one( + comodel_name="crm.salesperson.planner.visit.close.reason", string="Close Reason" + ) + close_reason_image = fields.Image(max_width=1024, max_height=1024, attachment=True) + close_reason_notes = fields.Text() + visit_template_id = fields.Many2one( + comodel_name="crm.salesperson.planner.visit.template", string="Visit Template" + ) + calendar_event_id = fields.Many2one( + comodel_name="calendar.event", string="Calendar Event" + ) + + _sql_constraints = [ + ( + "crm_salesperson_planner_visit_name", + "UNIQUE (name)", + "The visit number must be unique!", + ), + ] + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get("name", "/") == "/": + vals["name"] = self.env["ir.sequence"].next_by_code( + "salesperson.planner.visit" + ) + return super().create(vals_list) + + def action_draft(self): + if self.state not in ["cancel", "incident", "done"]: + raise ValidationError( + _("The visit must be in cancelled, incident or visited state") + ) + if self.calendar_event_id: + self.calendar_event_id.with_context(bypass_cancel_visit=True).unlink() + self.write({"state": "draft"}) + + def action_confirm(self): + if self.filtered(lambda a: not a.state == "draft"): + raise ValidationError(_("The visit must be in draft state")) + events = self.create_calendar_event() + if events: + self.browse(events.mapped("res_id")).write({"state": "confirm"}) + + def action_done(self): + if not self.state == "confirm": + raise ValidationError(_("The visit must be in confirmed state")) + self.write({"state": "done"}) + + def action_cancel(self, reason_id, image=None, notes=None): + if self.state not in ["draft", "confirm"]: + raise ValidationError(_("The visit must be in draft or validated state")) + if self.calendar_event_id: + self.calendar_event_id.with_context(bypass_cancel_visit=True).unlink() + self.write( + { + "state": "cancel", + "close_reason_id": reason_id.id, + "close_reason_image": image, + "close_reason_notes": notes, + } + ) + + def _prepare_calendar_event_vals(self): + return { + "name": self.name, + "partner_ids": [(6, 0, [self.partner_id.id, self.user_id.partner_id.id])], + "user_id": self.user_id.id, + "start_date": self.date, + "stop_date": self.date, + "start": self.date, + "stop": self.date, + "allday": True, + "res_model": self._name, + "res_model_id": self.env.ref( + "crm_salesperson_planner.model_crm_salesperson_planner_visit" + ).id, + "res_id": self.id, + } + + def create_calendar_event(self): + events = self.env["calendar.event"] + for item in self: + event = self.env["calendar.event"].create( + item._prepare_calendar_event_vals() + ) + if event: + event.activity_ids.unlink() + item.calendar_event_id = event + events += event + return events + + def action_incident(self, reason_id, image=None, notes=None): + if self.state not in ["draft", "confirm"]: + raise ValidationError(_("The visit must be in draft or validated state")) + self.write( + { + "state": "incident", + "close_reason_id": reason_id.id, + "close_reason_image": image, + "close_reason_notes": notes, + } + ) + + def unlink(self): + if any(sel.state not in ["draft", "cancel"] for sel in self): + raise ValidationError(_("Visits must be in cancelled state")) + return super().unlink() + + def write(self, values): + ret_val = super().write(values) + if (values.get("date") or values.get("user_id")) and not self.env.context.get( + "bypass_update_event" + ): + new_vals = {} + for item in self.filtered(lambda a: a.calendar_event_id): + if values.get("date"): + new_vals["start"] = values.get("date") + new_vals["stop"] = values.get("date") + if values.get("user_id"): + new_vals["user_id"] = values.get("user_id") + item.calendar_event_id.write(new_vals) + return ret_val diff --git a/crm_salesperson_planner/models/crm_salesperson_planner_visit_close_reason.py b/crm_salesperson_planner/models/crm_salesperson_planner_visit_close_reason.py new file mode 100644 index 00000000000..12adbbcb1e4 --- /dev/null +++ b/crm_salesperson_planner/models/crm_salesperson_planner_visit_close_reason.py @@ -0,0 +1,19 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class CrmSalespersonPlannerVisitCloseReason(models.Model): + _name = "crm.salesperson.planner.visit.close.reason" + _description = "SalesPerson Planner Visit Close Reason" + + name = fields.Char(string="Description", required=True, translate=True) + close_type = fields.Selection( + selection=[("cancel", "Cancel"), ("incident", "Incident")], + string="Type", + required=True, + default="cancel", + ) + require_image = fields.Boolean(default=False) + reschedule = fields.Boolean(default=False) diff --git a/crm_salesperson_planner/models/crm_salesperson_planner_visit_template.py b/crm_salesperson_planner/models/crm_salesperson_planner_visit_template.py new file mode 100644 index 00000000000..5d01c14c2e6 --- /dev/null +++ b/crm_salesperson_planner/models/crm_salesperson_planner_visit_template.py @@ -0,0 +1,354 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# Copyright 2021 Sygel - Manuel Regidor +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from datetime import timedelta + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + +from odoo.addons.base.models.res_partner import _tz_get +from odoo.addons.calendar.models.calendar_recurrence import ( + BYDAY_SELECTION, + END_TYPE_SELECTION, + MONTH_BY_SELECTION, + RRULE_TYPE_SELECTION, + WEEKDAY_SELECTION, +) + + +class CrmSalespersonPlannerVisitTemplate(models.Model): + _name = "crm.salesperson.planner.visit.template" + _description = "Crm Salesperson Planner Visit Template" + _inherit = ["mail.thread"] + + # We cannot inherit from calendar.event for several reasons: + # 1- There are many compute recursion fields that would not allow to change them. + # 2- Recurrence is only created correctly if the model is calendar.event + # 3- We want to generate visits ("events") manually when we want and only the ones + # we want. + name = fields.Char( + string="Visit Template Number", + default="/", + copy=False, + ) + description = fields.Html() + user_id = fields.Many2one( + comodel_name="res.users", + string="Salesperson", + tracking=True, + default=lambda self: self.env.user, + domain=lambda self: [ + ("groups_id", "in", self.env.ref("sales_team.group_sale_salesman").id) + ], + ) + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Scheduled by", + related="user_id.partner_id", + ) + partner_ids = fields.Many2many( + comodel_name="res.partner", + string="Customer", + default=False, + required=True, + ) + sequence = fields.Integer( + help="Used to order Visits in the different views", + default=20, + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + categ_ids = fields.Many2many(comodel_name="calendar.event.type", string="Tags") + alarm_ids = fields.Many2many( + comodel_name="calendar.alarm", + string="Reminders", + ondelete="restrict", + help="Notifications sent to all attendees to remind of the meeting.", + ) + state = fields.Selection( + string="Status", + required=True, + copy=False, + tracking=True, + selection=[ + ("draft", "Draft"), + ("in-progress", "In Progress"), + ("done", "Done"), + ("cancel", "Cancelled"), + ], + default="draft", + ) + visit_ids = fields.One2many( + comodel_name="crm.salesperson.planner.visit", + inverse_name="visit_template_id", + string="Visit Template", + ) + visit_ids_count = fields.Integer( + string="Number of Sales Person Visits", compute="_compute_visit_ids_count" + ) + auto_validate = fields.Boolean(default=True) + last_visit_date = fields.Date(compute="_compute_last_visit_date", store=True) + final_date = fields.Date(string="Repeat Until") + start = fields.Datetime( + required=True, + tracking=True, + default=fields.Date.today, + help="Start date of an event, without time for full days events", + ) + stop = fields.Datetime( + required=True, + tracking=True, + default=lambda self: fields.Datetime.today() + timedelta(hours=1), + compute="_compute_stop", + store=True, + help="Stop date of an event, without time for full days events", + ) + allday = fields.Boolean(string="All Day", default=True) + start_date = fields.Date( + store=True, + tracking=True, + compute="_compute_dates", + inverse="_inverse_dates", + ) + stop_date = fields.Date( + string="End Date", + store=True, + tracking=True, + compute="_compute_dates", + inverse="_inverse_dates", + ) + duration = fields.Float(compute="_compute_duration", store=True, readonly=False) + rrule = fields.Char(string="Recurrent Rule") + rrule_type = fields.Selection( + RRULE_TYPE_SELECTION, + string="Recurrence", + help="Let the event automatically repeat at that interval", + default="daily", + required=True, + ) + event_tz = fields.Selection(_tz_get, string="Timezone") + end_type = fields.Selection(END_TYPE_SELECTION, string="Recurrence Termination") + interval = fields.Integer( + string="Repeat Every", help="Repeat every (Days/Week/Month/Year)" + ) + count = fields.Integer(string="Repeat", help="Repeat x times") + mon = fields.Boolean() + tue = fields.Boolean() + wed = fields.Boolean() + thu = fields.Boolean() + fri = fields.Boolean() + sat = fields.Boolean() + sun = fields.Boolean() + month_by = fields.Selection(MONTH_BY_SELECTION, string="Option") + day = fields.Integer(string="Date of month") + weekday = fields.Selection(WEEKDAY_SELECTION) + byday = fields.Selection(BYDAY_SELECTION) + until = fields.Date() + + _sql_constraints = [ + ( + "crm_salesperson_planner_visit_template_name", + "UNIQUE (name)", + "The visit template number must be unique!", + ), + ] + + def _compute_visit_ids_count(self): + visit_data = self.env["crm.salesperson.planner.visit"].read_group( + [("visit_template_id", "in", self.ids)], + ["visit_template_id"], + ["visit_template_id"], + ) + mapped_data = { + m["visit_template_id"][0]: m["visit_template_id_count"] for m in visit_data + } + for sel in self: + sel.visit_ids_count = mapped_data.get(sel.id, 0) + + @api.depends("visit_ids.date") + def _compute_last_visit_date(self): + for sel in self.filtered(lambda x: x.visit_ids): + sel.last_visit_date = sel.visit_ids.sorted(lambda x: x.date)[-1].date + + @api.depends("start", "duration") + def _compute_stop(self): + """Same method as in calendar.event.""" + for item in self: + item.stop = item.start and item.start + timedelta( + minutes=round((item.duration or 1.0) * 60) + ) + if item.allday: + item.stop -= timedelta(seconds=1) + + @api.depends("allday", "start", "stop") + def _compute_dates(self): + """Same method as in calendar.event.""" + for item in self: + if item.allday and item.start and item.stop: + item.start_date = item.start.date() + item.stop_date = item.stop.date() + else: + item.start_date = False + item.stop_date = False + + @api.depends("stop", "start") + def _compute_duration(self): + """Same method as in calendar.event.""" + for item in self: + item.duration = self._get_duration(item.start, item.stop) + + def _get_duration(self, start, stop): + """Same method as in calendar.event.""" + if not start or not stop: + return 0 + duration = (stop - start).total_seconds() / 3600 + return round(duration, 2) + + def _inverse_dates(self): + """Same method as in calendar.event.""" + for item in self: + if item.allday: + enddate = fields.Datetime.from_string(item.stop_date) + enddate = enddate.replace(hour=18) + startdate = fields.Datetime.from_string(item.start_date) + startdate = startdate.replace(hour=8) + item.write( + { + "start": startdate.replace(tzinfo=None), + "stop": enddate.replace(tzinfo=None), + } + ) + + @api.constrains("partner_ids") + def _constrains_partner_ids(self): + for item in self: + if len(item.partner_ids) > 1: + raise ValidationError(_("Only one customer is allowed")) + + @api.onchange("end_type") + def _onchange_end_type(self): + """Avoid inconsistent data if you switch from one thing to another.""" + if self.end_type == "count": + self.until = False + elif self.end_type == "end_date": + self.count = 0 + elif self.end_type == "forever": + self.count = 0 + self.until = False + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get("name", "/") == "/": + vals["name"] = self.env["ir.sequence"].next_by_code( + "salesperson.planner.visit.template" + ) + return super().create(vals_list) + + def action_view_salesperson_planner_visit(self): + action = self.env["ir.actions.act_window"]._for_xml_id( + "crm_salesperson_planner.all_crm_salesperson_planner_visit_action" + ) + action["domain"] = [("id", "=", self.visit_ids.ids)] + action["context"] = { + "default_partner_id": self.partner_id.id, + "default_visit_template_id": self.id, + "default_description": self.description, + } + return action + + def action_validate(self): + self.write({"state": "in-progress"}) + + def action_cancel(self): + self.write({"state": "cancel"}) + + def action_draft(self): + self.write({"state": "draft"}) + + def _prepare_crm_salesperson_planner_visit_vals(self, dates): + return [ + { + "partner_id": ( + fields.first(self.partner_ids).id if self.partner_ids else False + ), + "date": date, + "sequence": self.sequence, + "user_id": self.user_id.id, + "description": self.description, + "company_id": self.company_id.id, + "visit_template_id": self.id, + } + for date in dates + ] + + # Get the date range from calendar.recurrence, that way the values obtained will + # be correct (except for incompatible cases). + def _get_start_range_dates(self): + """Method to get all dates (sorted) in the range.""" + duration = self.stop - self.start + ranges = ( + self.env["calendar.recurrence"] + .new( + { + "rrule_type": self.rrule_type, + "interval": self.interval, + "month_by": self.month_by, + "weekday": self.weekday, + "byday": self.byday, + "count": self.count, + "end_type": self.end_type, + "until": self.until, + "mon": self.mon, + "tue": self.tue, + "wed": self.wed, + "thu": self.thu, + "fri": self.fri, + "sat": self.sat, + "sun": self.sun, + } + ) + ._range_calculation(self, duration) + ) + start_dates = [] + for start, _stop in ranges: + start_dates.append(start.date()) + return sorted(start_dates) + + def _get_max_date(self): + """The maximum date will be the last of the range.""" + return self._get_start_range_dates()[-1] + + def _get_recurrence_dates(self, items): + """For the n items, get only those that are not already generated.""" + start_dates = self._get_start_range_dates() + dates = [] + visit_dates = self.visit_ids.mapped("date") + for _date in start_dates[:items]: + if _date not in visit_dates: + dates.append(_date) + return dates + + def _create_visits(self, days=7): + return self._prepare_crm_salesperson_planner_visit_vals( + self._get_recurrence_dates(days) + ) + + def create_visits(self, days=7): + for item in self: + visits = self.env["crm.salesperson.planner.visit"].create( + item._create_visits(days) + ) + if visits and item.auto_validate: + visits.action_confirm() + if item.last_visit_date >= item._get_max_date(): + item.state = "done" + + def _cron_create_visits(self, days=7): + templates = self.search([("state", "=", "in-progress")]) + templates.create_visits(days) diff --git a/crm_salesperson_planner/models/res_partner.py b/crm_salesperson_planner/models/res_partner.py new file mode 100644 index 00000000000..c09f897f673 --- /dev/null +++ b/crm_salesperson_planner/models/res_partner.py @@ -0,0 +1,33 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + salesperson_planner_visit_count = fields.Integer( + string="Number of Salesperson Visits", + compute="_compute_salesperson_planner_visit_count", + ) + + def _compute_salesperson_planner_visit_count(self): + partners = self | self.mapped("child_ids") + partner_data = self.env["crm.salesperson.planner.visit"].read_group( + [("partner_id", "in", partners.ids)], ["partner_id"], ["partner_id"] + ) + mapped_data = {m["partner_id"][0]: m["partner_id_count"] for m in partner_data} + for partner in self: + visit_count = mapped_data.get(partner.id, 0) + for child in partner.child_ids: + visit_count += mapped_data.get(child.id, 0) + partner.salesperson_planner_visit_count = visit_count + + def action_view_salesperson_planner_visit(self): + action = self.env["ir.actions.act_window"]._for_xml_id( + "crm_salesperson_planner.all_crm_salesperson_planner_visit_action" + ) + operator = "child_of" if self.is_company else "=" + action["domain"] = [("partner_id", operator, self.id)] + return action diff --git a/crm_salesperson_planner/pyproject.toml b/crm_salesperson_planner/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/crm_salesperson_planner/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/crm_salesperson_planner/readme/CONFIGURE.md b/crm_salesperson_planner/readme/CONFIGURE.md new file mode 100644 index 00000000000..53762127285 --- /dev/null +++ b/crm_salesperson_planner/readme/CONFIGURE.md @@ -0,0 +1,4 @@ +To configure this module, you need to: + +- Go to new menu **CRM \> Configuration \> Salesperson Planner \> Close + Reasons** and create a close reason for 'Cancel' and 'Incident' types. diff --git a/crm_salesperson_planner/readme/CONTRIBUTORS.md b/crm_salesperson_planner/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..92fef5d95e7 --- /dev/null +++ b/crm_salesperson_planner/readme/CONTRIBUTORS.md @@ -0,0 +1,9 @@ +- [Sygel](https://www.sygel.es): + - Valentin Vinagre + - Manuel Regidor +- [Pesol](https://www.pesol.es): + - Gerardo Marin Parra \<\> +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez +- [APSL-Nagarro](): + - Bernat Obrador \<\> \ No newline at end of file diff --git a/crm_salesperson_planner/readme/DESCRIPTION.md b/crm_salesperson_planner/readme/DESCRIPTION.md new file mode 100644 index 00000000000..46c87119e85 --- /dev/null +++ b/crm_salesperson_planner/readme/DESCRIPTION.md @@ -0,0 +1,10 @@ +This application allows you to track and schedule salespeople visits to +your customers, allowing you to determine which opportunities are going +to be dealt on each visit. Visits create an all day event in calendar, +and they can be easily rescheduled. Visits can be automatically created +from a template, in which it is possible to select the frequency of +visits, as well as the start and end dates. The last visit can also be +calculated by selecting the total number of repetitions. This module +creates a cron that generates visits from templates, but an option to +create them manually is available from the template form view when the +template is validated. diff --git a/crm_salesperson_planner/readme/USAGE.md b/crm_salesperson_planner/readme/USAGE.md new file mode 100644 index 00000000000..19238180b3c --- /dev/null +++ b/crm_salesperson_planner/readme/USAGE.md @@ -0,0 +1,9 @@ +Go to new menu **CRM \> Salesperson Planner \> My Visits or All Visits** +and create a new visit. or Go to **CRM \> Salesperson Planner \> Visit +Templates** and create a new recurring template for create periodical +visits. In this case, it is necessary to select a start date. The date +of the last repetition can be calculated by selection the total number +of repetitions or an end date. There are two options available to +reschedule visits that is already validated: \* Change the date from the +visit. \* Change the date straight from the event automatically created +in the calendar. diff --git a/crm_salesperson_planner/security/crm_salesperson_planner_security.xml b/crm_salesperson_planner/security/crm_salesperson_planner_security.xml new file mode 100644 index 00000000000..6881e80bb30 --- /dev/null +++ b/crm_salesperson_planner/security/crm_salesperson_planner_security.xml @@ -0,0 +1,55 @@ + + + + + CRM Salesperson planner visit multi-company + + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + CRM Salesperson planner visit template multi-company + + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + Personal Salesperson Planner Visit + + ['|',('user_id','=',user.id),('user_id','=',False)] + + + + All Salesperson Planner Visit + + [(1,'=',1)] + + + + Personal Salesperson Planner Visit Template + + ['|',('user_id','=',user.id),('user_id','=',False)] + + + + All Salesperson Planner Visit Template + + [(1,'=',1)] + + + diff --git a/crm_salesperson_planner/security/ir.model.access.csv b/crm_salesperson_planner/security/ir.model.access.csv new file mode 100644 index 00000000000..ec153a4e19c --- /dev/null +++ b/crm_salesperson_planner/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_crm_salesperson_planner_visit_user,crm.salesperson.planner.visit.user,model_crm_salesperson_planner_visit,sales_team.group_sale_salesman,1,1,1,1 +access_crm_salesperson_planner_visit_close_reason_user,crm.salesperson.planner.visit.close.reason.user,model_crm_salesperson_planner_visit_close_reason,sales_team.group_sale_salesman,1,0,0,0 +access_crm_salesperson_planner_visit_close_reason_manager,crm.salesperson.planner.visit.close.reason.manager,model_crm_salesperson_planner_visit_close_reason,sales_team.group_sale_manager,1,1,1,1 +access_crm_salesperson_planner_visit_template_user,crm.salesperson.planner.visit.template.user,model_crm_salesperson_planner_visit_template,sales_team.group_sale_salesman,1,1,1,1 +crm_salesperson_planner.access_crm_salesperson_planner_visit_close_wiz,access_crm_salesperson_planner_visit_close_wiz,crm_salesperson_planner.model_crm_salesperson_planner_visit_close_wiz,sales_team.group_sale_salesman,1,1,1,1 +crm_salesperson_planner.access_crm_salesperson_planner_visit_template_create,access_crm_salesperson_planner_visit_template_create,crm_salesperson_planner.model_crm_salesperson_planner_visit_template_create,sales_team.group_sale_salesman,1,1,1,1 diff --git a/crm_salesperson_planner/static/description/icon.png b/crm_salesperson_planner/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/crm_salesperson_planner/static/description/icon.png differ diff --git a/crm_salesperson_planner/static/description/index.html b/crm_salesperson_planner/static/description/index.html new file mode 100644 index 00000000000..32a1d894b7d --- /dev/null +++ b/crm_salesperson_planner/static/description/index.html @@ -0,0 +1,471 @@ + + + + + +Crm Salesperson Planner + + + +
+

Crm Salesperson Planner

+ + +

Beta License: AGPL-3 OCA/crm Translate me on Weblate Try me on Runboat

+

This application allows you to track and schedule salespeople visits to +your customers, allowing you to determine which opportunities are going +to be dealt on each visit. Visits create an all day event in calendar, +and they can be easily rescheduled. Visits can be automatically created +from a template, in which it is possible to select the frequency of +visits, as well as the start and end dates. The last visit can also be +calculated by selecting the total number of repetitions. This module +creates a cron that generates visits from templates, but an option to +create them manually is available from the template form view when the +template is validated.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

+
    +
  • Go to new menu CRM > Configuration > Salesperson Planner > Close +Reasons and create a close reason for ‘Cancel’ and ‘Incident’ +types.
  • +
+
+
+

Usage

+

Go to new menu CRM > Salesperson Planner > My Visits or All Visits +and create a new visit. or Go to CRM > Salesperson Planner > Visit +Templates and create a new recurring template for create periodical +visits. In this case, it is necessary to select a start date. The date +of the last repetition can be calculated by selection the total number +of repetitions or an end date. There are two options available to +reschedule visits that is already validated: * Change the date from the +visit. * Change the date straight from the event automatically created +in the calendar.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Sygel Technology
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/crm project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/crm_salesperson_planner/tests/__init__.py b/crm_salesperson_planner/tests/__init__.py new file mode 100644 index 00000000000..69669a08800 --- /dev/null +++ b/crm_salesperson_planner/tests/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from . import test_crm_salesperson_planner_visit +from . import test_crm_salesperson_planner_visit_template diff --git a/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit.py b/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit.py new file mode 100644 index 00000000000..2de9d090996 --- /dev/null +++ b/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit.py @@ -0,0 +1,326 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from datetime import timedelta + +from dateutil.relativedelta import relativedelta + +from odoo import _, fields +from odoo.exceptions import ValidationError +from odoo.tests import common +from odoo.tools import mute_logger + + +class TestCrmSalespersonPlannerVisitBase(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict( + cls.env.context, + mail_create_nolog=True, + mail_create_nosubscribe=True, + mail_notrack=True, + no_reset_password=True, + tracking_disable=True, + ) + ) + cls.visit_model = cls.env["crm.salesperson.planner.visit"] + cls.partner_model = cls.env["res.partner"] + cls.close_model = cls.env["crm.salesperson.planner.visit.close.reason"] + cls.close_wiz_model = cls.env["crm.salesperson.planner.visit.close.wiz"] + cls.partner1 = cls.partner_model.create( + { + "name": "Partner Visit 1", + "email": "partner.visit.1@example.com", + "phone": "1234567890", + } + ) + cls.partner1_contact1 = cls.partner_model.create( + { + "name": "Partner Contact Visit 1", + "email": "partner.visit.1@example.com", + "phone": "1234567890", + "parent_id": cls.partner1.id, + } + ) + cls.visit1 = cls.visit_model.create({"partner_id": cls.partner1.id}) + cls.visit2 = cls.visit_model.create( + {"partner_id": cls.partner1_contact1.id, "sequence": 1} + ) + cls.cancel = cls.close_model.create( + { + "name": "Cancel", + "close_type": "cancel", + "require_image": False, + "reschedule": False, + } + ) + cls.cancel_resch = cls.close_model.create( + { + "name": "Cancel", + "close_type": "cancel", + "require_image": False, + "reschedule": True, + } + ) + cls.cancel_img = cls.close_model.create( + { + "name": "Cancel", + "close_type": "cancel", + "require_image": True, + "reschedule": False, + } + ) + cls.incident = cls.close_model.create( + { + "name": "Incident", + "close_type": "incident", + "require_image": False, + "reschedule": False, + } + ) + + +class TestCrmSalespersonPlannerVisit(TestCrmSalespersonPlannerVisitBase): + def test_crm_salesperson_planner_visit(self): + self.assertNotEqual(self.visit1.name, "/") + self.assertEqual(self.visit1.state, "draft") + self.assertEqual(self.partner1.salesperson_planner_visit_count, 2) + self.assertEqual(self.partner1_contact1.salesperson_planner_visit_count, 1) + self.assertEqual(self.visit1.date, fields.Date.context_today(self.visit1)) + self.assertEqual( + self.visit_model.search( + [("partner_id", "child_of", self.partner1.id)], limit=1 + ), + self.visit2, + ) + + def config_close_wiz(self, att_close_type, vals): + additionnal_context = { + "active_model": self.visit_model._name, + "active_ids": self.visit1.ids, + "active_id": self.visit1.id, + "att_close_type": att_close_type, + } + close_wiz = self.close_wiz_model.with_context(**additionnal_context).create( + vals + ) + close_wiz.action_close_reason_apply() + + @mute_logger("odoo.models.unlink") + def test_crm_salesperson_close_wiz_cancel(self): + self.visit1.action_confirm() + self.assertEqual(self.visit1.state, "confirm") + self.config_close_wiz("close", {"reason_id": self.cancel.id, "notes": "Test"}) + self.assertEqual(self.visit1.state, "cancel") + self.assertEqual(self.visit1.close_reason_id.id, self.cancel.id) + self.assertEqual(self.visit1.close_reason_notes, "Test") + self.assertEqual( + self.visit_model.search_count( + [("partner_id", "child_of", self.partner1.id)] + ), + 2, + ) + + @mute_logger("odoo.models.unlink") + def test_crm_salesperson_close_wiz_cancel_resch(self): + self.visit1.action_confirm() + self.assertEqual(self.visit1.state, "confirm") + self.config_close_wiz( + "close", + { + "reason_id": self.cancel_resch.id, + "new_date": self.visit1.date + relativedelta(days=10), + "new_sequence": 40, + }, + ) + self.assertEqual(self.visit1.close_reason_id.id, self.cancel_resch.id) + self.assertEqual( + self.visit_model.search_count( + [ + ("partner_id", "=", self.partner1.id), + ("date", "=", self.visit1.date + relativedelta(days=10)), + ("sequence", "=", 40), + ("state", "=", "confirm"), + ] + ), + 1, + ) + + @mute_logger("odoo.models.unlink") + def test_crm_salesperson_close_wiz_cancel_img(self): + self.visit1.action_confirm() + self.assertEqual(self.visit1.state, "confirm") + detail_image = b"R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + self.config_close_wiz( + "close", {"reason_id": self.cancel_img.id, "image": detail_image} + ) + self.assertEqual(self.visit1.close_reason_id.id, self.cancel_img.id) + self.assertEqual(self.visit1.close_reason_image, detail_image) + + def test_crm_salesperson_close_wiz_incident(self): + self.visit1.action_confirm() + self.assertEqual(self.visit1.state, "confirm") + self.config_close_wiz("incident", {"reason_id": self.incident.id}) + self.assertEqual(self.visit1.state, "incident") + + def test_write_method_updates_calendar_event_user_id(self): + partner = self.env["res.partner"].create( + { + "name": "Test Partner", + } + ) + + visit = self.env["crm.salesperson.planner.visit"].create( + { + "name": "Test Visit", + "user_id": self.env.ref("base.user_demo").id, + "partner_id": partner.id, + } + ) + calendar_event = self.env["calendar.event"].create( + { + "name": "Test Event", + "user_id": self.env.ref("base.user_demo").id, + "partner_id": partner.id, + } + ) + visit.write({"calendar_event_id": calendar_event.id}) + + new_user = self.env.ref("base.user_admin") + visit.write({"user_id": new_user.id}) + + self.assertEqual(calendar_event.user_id, new_user) + + def test_action_done(self): + partner = self.env["res.partner"].create( + { + "name": "Ejemplo de partner", + } + ) + visit = self.env["crm.salesperson.planner.visit"].create( + { + "state": "confirm", + "partner_id": partner.id, + } + ) + + visit.action_done() + + self.assertEqual(visit.state, "done") + + with self.assertRaises(ValidationError): + visit.action_done() + + visit.state = "draft" + with self.assertRaises(ValidationError): + visit.action_done() + + +class TestResPartner(common.TransactionCase): + def test_action_view_salesperson_planner_visit(self): + partner = self.env["res.partner"].create( + {"name": "Test Partner", "is_company": True} + ) + + action = partner.action_view_salesperson_planner_visit() + + self.assertEqual(action["domain"], [("partner_id", "child_of", partner.id)]) + self.assertEqual(action["res_model"], "crm.salesperson.planner.visit") + self.assertIn("tree", action["view_mode"]) + self.assertIn("form", action["view_mode"]) + self.assertIn("pivot", action["view_mode"]) + + +class TestCalendarEvent(common.TransactionCase): + def test_write_user_id(self): + event = self.env["calendar.event"].create({"name": "Test Event"}) + + values = {"user_id": 1} + + event.write(values) + + self.assertIn("user_id", values) + self.assertEqual(values["user_id"], 1) + + +class TestCrmSalespersonPlannerVisitTemplate(common.TransactionCase): + def test_partner_ids_constraint(self): + template = self.env["crm.salesperson.planner.visit.template"].create( + { + "name": "Test Visit Template", + "partner_ids": [(0, 0, {"name": "Customer 1"})], + } + ) + + with self.assertRaises(ValidationError) as context: + template.partner_ids = [ + (0, 0, {"name": "Customer 2"}), + (0, 0, {"name": "Customer 3"}), + ] + + error_msg = _("Only one customer is allowed") + self.assertEqual(str(context.exception), error_msg) + + def test_action_view_salesperson_planner_visit(self): + template = self.env["crm.salesperson.planner.visit.template"].create( + { + "partner_id": 1, + "description": "Ejemplo de descripción", + } + ) + + action = template.action_view_salesperson_planner_visit() + + self.assertIsInstance(action, dict) + self.assertEqual(action.get("type"), "ir.actions.act_window") + + expected_domain = [("id", "=", template.visit_ids.ids)] + self.assertEqual(action.get("domain"), expected_domain) + + expected_context = { + "default_partner_id": template.partner_id.id, + "default_visit_template_id": template.id, + "default_description": template.description, + } + self.assertEqual(action.get("context"), expected_context) + + def test_action_cancel(self): + template = self.env["crm.salesperson.planner.visit.template"].create( + { + "state": "in-progress", + } + ) + + template.action_cancel() + + self.assertEqual(template.state, "cancel") + + def test_action_draft(self): + template = self.env["crm.salesperson.planner.visit.template"].create( + { + "state": "cancel", + } + ) + + template.action_draft() + + self.assertEqual(template.state, "draft") + + +class TestCrmSalespersonPlannerVisitTemplateCreate(common.TransactionCase): + def test_default_date_to(self): + wizard = self.env["crm.salesperson.planner.visit.template.create"].create({}) + + template = self.env["crm.salesperson.planner.visit.template"].create( + { + "last_visit_date": fields.Date.today(), + } + ) + wizard = wizard.with_context(active_id=template.id) + + default_date_to = wizard._default_date_to() + + expected_date = template.last_visit_date + timedelta(days=7) + self.assertEqual(default_date_to, expected_date) diff --git a/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit_template.py b/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit_template.py new file mode 100644 index 00000000000..c1109e92833 --- /dev/null +++ b/crm_salesperson_planner/tests/test_crm_salesperson_planner_visit_template.py @@ -0,0 +1,338 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# Copyright 2021 Sygel - Manuel Regidor +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from datetime import timedelta + +from odoo import exceptions, fields +from odoo.tests import common +from odoo.tools import mute_logger + + +class TestCrmSalespersonPlannerVisitTemplate(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict( + cls.env.context, + mail_create_nolog=True, + mail_create_nosubscribe=True, + mail_notrack=True, + no_reset_password=True, + tracking_disable=True, + ) + ) + cls.visit_template_model = cls.env["crm.salesperson.planner.visit.template"] + cls.partner_model = cls.env["res.partner"] + cls.close_reason_mode = cls.env["crm.salesperson.planner.visit.close.reason"] + cls.partner1 = cls.partner_model.create( + { + "name": "Partner Visit 1", + "email": "partner.visit.1@example.com", + "phone": "1234567890", + } + ) + cls.visit_template_base = cls.visit_template_model.create( + { + "partner_ids": [(6, False, cls.partner1.ids)], + "start_date": fields.Date.today(), + "stop_date": fields.Date.today(), + "start": fields.Date.today(), + "stop": fields.Date.today(), + } + ) + cls.close_reason = cls.close_reason_mode.create( + {"name": "close reason", "close_type": "cancel"} + ) + + def test_01_repeat_days(self): + self.visit_template_base.write( + { + "auto_validate": False, + "interval": 1, + "rrule_type": "daily", + "end_type": "count", + "count": 10, + } + ) + self.visit_template_base.action_validate() + self.visit_template_base.create_visits(days=4) + self.assertEqual(len(self.visit_template_base.visit_ids), 4) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.state == "draft" + ) + ), + 4, + ) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.calendar_event_id.id + ) + ), + 0, + ) + self.assertEqual(self.visit_template_base.state, "in-progress") + self.visit_template_base.create_visits(days=10) + self.assertEqual(len(self.visit_template_base.visit_ids), 10) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.state == "draft" + ) + ), + 10, + ) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.calendar_event_id.id + ) + ), + 0, + ) + self.assertEqual(self.visit_template_base.state, "done") + + def test_02_repeat_days_autovalidate(self): + self.visit_template_base.write( + { + "auto_validate": True, + "interval": 1, + "rrule_type": "daily", + "end_type": "count", + "count": 10, + } + ) + self.visit_template_base.action_validate() + self.visit_template_base.create_visits(days=4) + self.assertEqual(len(self.visit_template_base.visit_ids), 4) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.state == "draft" + ) + ), + 0, + ) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.calendar_event_id.id + ) + ), + 4, + ) + self.assertEqual(self.visit_template_base.state, "in-progress") + self.visit_template_base.create_visits(days=10) + self.assertEqual(len(self.visit_template_base.visit_ids), 10) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.state == "draft" + ) + ), + 0, + ) + self.assertEqual( + len( + self.visit_template_base.visit_ids.filtered( + lambda a: a.calendar_event_id.id + ) + ), + 10, + ) + self.assertEqual(self.visit_template_base.state, "done") + + def test_03_change_visit_date(self): + visit_template = self.visit_template_base.copy() + visit_template.write( + { + "auto_validate": True, + "interval": 1, + "rrule_type": "daily", + "end_type": "count", + "count": 10, + } + ) + visit_template.create_visits(days=10) + visit_0 = fields.first(visit_template.visit_ids) + event_id_0 = visit_0.calendar_event_id + self.assertEqual(visit_0.date, event_id_0.start_date) + visit_0.write({"date": fields.Date.today() + timedelta(days=7)}) + self.assertEqual(event_id_0.start_date, fields.Date.today() + timedelta(days=7)) + event_id_0.write( + { + "start": fields.Datetime.today() + timedelta(days=14), + "stop": fields.Datetime.today() + timedelta(days=14), + } + ) + self.assertEqual(visit_0.date, fields.Date.today() + timedelta(days=14)) + + @mute_logger("odoo.models.unlink") + def test_04_cancel_visit(self): + visit_template = self.visit_template_base.copy() + visit_template.write( + { + "auto_validate": True, + "interval": 1, + "rrule_type": "daily", + "end_type": "count", + "count": 10, + } + ) + visit_template.create_visits(days=10) + first_visit = fields.first(visit_template.visit_ids) + self.assertTrue(first_visit.calendar_event_id) + with self.assertRaises(exceptions.ValidationError): + first_visit.unlink() + self.assertEqual(len(visit_template.visit_ids), 10) + first_visit.action_cancel(self.close_reason) + self.assertFalse(first_visit.calendar_event_id) + first_visit.unlink() + self.assertEqual(len(visit_template.visit_ids), 9) + + def test_05_repeat_weeks(self): + self.visit_template_base.write( + { + "start_date": fields.Date.today(), + "interval": 1, + "rrule_type": "weekly", + "tue": True, + "end_type": "end_date", + "until": fields.Date.today() + timedelta(days=90), + } + ) + + dates = [ + self.visit_template_base.start_date + timedelta(days=i) for i in range(91) + ] + filtered_tue_dates = [d for d in dates if d.weekday() == 1] + + self.visit_template_base.action_validate() + self.assertFalse(self.visit_template_base.visit_ids) + create_model = self.env["crm.salesperson.planner.visit.template.create"] + create_item = create_model.with_context( + active_id=self.visit_template_base.id + ).create({"date_to": filtered_tue_dates[2]}) + create_item.create_visits() + self.assertEqual(self.visit_template_base.state, "done") + visit_dates = self.visit_template_base.visit_ids.mapped("date") + self.assertIn(fields.Date.from_string(filtered_tue_dates[4]), visit_dates) + self.assertEqual( + self.visit_template_base.last_visit_date, + fields.Date.from_string(filtered_tue_dates[len(filtered_tue_dates) - 1]), + ) + + def test_06_repeat_months_count_01(self): + self.visit_template_base.write( + { + "start_date": "2024-03-08", + "interval": 1, + "rrule_type": "monthly", + "end_type": "count", + "count": 2, + "month_by": "date", + "day": 1, + } + ) + self.visit_template_base.action_validate() + self.assertFalse(self.visit_template_base.visit_ids) + create_model = self.env["crm.salesperson.planner.visit.template.create"] + create_item = create_model.with_context( + active_id=self.visit_template_base.id + ).create({"date_to": "2024-12-13"}) + create_item.create_visits() + self.assertEqual(self.visit_template_base.state, "done") + self.assertEqual(len(self.visit_template_base.visit_ids), 2) + visit_dates = self.visit_template_base.visit_ids.mapped("date") + self.assertIn(fields.Date.from_string("2024-04-01"), visit_dates) + self.assertEqual( + self.visit_template_base.last_visit_date, + fields.Date.from_string("2024-05-01"), + ) + + def test_06_repeat_months_count_02(self): + self.visit_template_base.write( + { + "start_date": "2024-03-08", + "interval": 1, + "rrule_type": "monthly", + "end_type": "count", + "count": 2, + "month_by": "date", + "day": 1, + } + ) + self.visit_template_base.action_validate() + self.assertFalse(self.visit_template_base.visit_ids) + create_model = self.env["crm.salesperson.planner.visit.template.create"] + create_item = create_model.with_context( + active_id=self.visit_template_base.id + ).create({"date_to": "2024-12-13"}) + create_item.create_visits() + self.assertEqual(self.visit_template_base.state, "done") + self.assertEqual(len(self.visit_template_base.visit_ids), 2) + visit_dates = self.visit_template_base.visit_ids.mapped("date") + self.assertIn(fields.Date.from_string("2024-04-01"), visit_dates) + self.assertEqual( + self.visit_template_base.last_visit_date, + fields.Date.from_string("2024-05-01"), + ) + + def test_06_repeat_months_count_03(self): + self.visit_template_base.write( + { + "start_date": "2024-03-08", + "interval": 1, + "rrule_type": "monthly", + "end_type": "count", + "count": 2, + "month_by": "day", + "byday": "1", + "weekday": "MON", + } + ) + self.visit_template_base.action_validate() + self.assertFalse(self.visit_template_base.visit_ids) + create_model = self.env["crm.salesperson.planner.visit.template.create"] + create_item = create_model.with_context( + active_id=self.visit_template_base.id + ).create({"date_to": "2024-12-13"}) + create_item.create_visits() + self.assertEqual(self.visit_template_base.state, "done") + self.assertEqual(len(self.visit_template_base.visit_ids), 2) + visit_dates = self.visit_template_base.visit_ids.mapped("date") + self.assertIn(fields.Date.from_string("2024-04-01"), visit_dates) + self.assertEqual( + self.visit_template_base.last_visit_date, + fields.Date.from_string("2024-05-06"), + ) + + def test_07_repeat_yearly_count_01(self): + self.visit_template_base.write( + { + "start_date": "2024-03-08", + "interval": 1, + "rrule_type": "yearly", + "end_type": "count", + "count": 2, + } + ) + self.visit_template_base.action_validate() + self.assertFalse(self.visit_template_base.visit_ids) + create_model = self.env["crm.salesperson.planner.visit.template.create"] + create_item = create_model.with_context( + active_id=self.visit_template_base.id + ).create({"date_to": "2030-01-01"}) + create_item.create_visits() + self.assertEqual(self.visit_template_base.state, "done") + self.assertEqual(len(self.visit_template_base.visit_ids), 2) + visit_dates = self.visit_template_base.visit_ids.mapped("date") + self.assertIn(fields.Date.from_string("2024-03-08"), visit_dates) + self.assertEqual( + self.visit_template_base.last_visit_date, + fields.Date.from_string("2025-03-08"), + ) diff --git a/crm_salesperson_planner/views/crm_lead.xml b/crm_salesperson_planner/views/crm_lead.xml new file mode 100644 index 00000000000..8bfceb4796e --- /dev/null +++ b/crm_salesperson_planner/views/crm_lead.xml @@ -0,0 +1,17 @@ + + + + + crm.lead.view.crm.salesperson.planner + crm.lead + + + + + + + + + + diff --git a/crm_salesperson_planner/views/crm_salesperson_planner_menu.xml b/crm_salesperson_planner/views/crm_salesperson_planner_menu.xml new file mode 100644 index 00000000000..a3eb6ed5828 --- /dev/null +++ b/crm_salesperson_planner/views/crm_salesperson_planner_menu.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/crm_salesperson_planner/views/crm_salesperson_planner_visit_close_reason_views.xml b/crm_salesperson_planner/views/crm_salesperson_planner_visit_close_reason_views.xml new file mode 100644 index 00000000000..b53c52b714c --- /dev/null +++ b/crm_salesperson_planner/views/crm_salesperson_planner_visit_close_reason_views.xml @@ -0,0 +1,60 @@ + + + + + CRM - Salesperson Planner Visit Close Reason Tree + crm.salesperson.planner.visit.close.reason + + + + + + + + + + + CRM - Salesperson Planner Visit Close Reason Form + crm.salesperson.planner.visit.close.reason + +
+ +
+

+ +

+
+ + + + + + + + + +
+
+
+
+ + Close Reasons + crm.salesperson.planner.visit.close.reason + tree,form + +

+ Record reason for close commercial visits. +

+
+
+
diff --git a/crm_salesperson_planner/views/crm_salesperson_planner_visit_template_views.xml b/crm_salesperson_planner/views/crm_salesperson_planner_visit_template_views.xml new file mode 100644 index 00000000000..b4dcc670a80 --- /dev/null +++ b/crm_salesperson_planner/views/crm_salesperson_planner_visit_template_views.xml @@ -0,0 +1,176 @@ + + + + + CRM - Salesperson Planner Visit Template Tree + crm.salesperson.planner.visit.template + + + + + + + + + + + + + + CRM - Salesperson Planner Visit Template Form + crm.salesperson.planner.visit.template + +
+
+
+ +
+ +
+
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + Visit Templates + crm.salesperson.planner.visit.template + tree,form + +

+ Create and plan commercial visit templates +

+
+
+
diff --git a/crm_salesperson_planner/views/crm_salesperson_planner_visit_views.xml b/crm_salesperson_planner/views/crm_salesperson_planner_visit_views.xml new file mode 100644 index 00000000000..3c3d9712552 --- /dev/null +++ b/crm_salesperson_planner/views/crm_salesperson_planner_visit_views.xml @@ -0,0 +1,299 @@ + + + + + CRM - Salesperson Planner Visit Tree + crm.salesperson.planner.visit + + + + + + + + + + + + + + diff --git a/crm_salesperson_planner/wizards/__init__.py b/crm_salesperson_planner/wizards/__init__.py new file mode 100644 index 00000000000..1c13423b276 --- /dev/null +++ b/crm_salesperson_planner/wizards/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from . import crm_salesperson_planner_visit_close_wiz +from . import crm_salesperson_planner_visit_template_create diff --git a/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz.py b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz.py new file mode 100644 index 00000000000..40dbfc9562e --- /dev/null +++ b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz.py @@ -0,0 +1,63 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo import _, fields, models + + +class CrmSalespersonPlannerVisitCloseWiz(models.TransientModel): + _name = "crm.salesperson.planner.visit.close.wiz" + _description = "Get Close Reason" + + def _default_new_date(self): + visits = self.env["crm.salesperson.planner.visit"].browse( + self.env.context.get("active_id") + ) + return visits.date + + def _default_new_sequence(self): + visits = self.env["crm.salesperson.planner.visit"].browse( + self.env.context.get("active_id") + ) + return visits.sequence + + reason_id = fields.Many2one( + comodel_name="crm.salesperson.planner.visit.close.reason", + string="Reason", + required=True, + ) + image = fields.Image(max_width=1024, max_height=1024) + new_date = fields.Date(default=lambda self: self._default_new_date()) + new_sequence = fields.Integer( + string="Sequence", + help="Used to order Visits in the different views", + default=lambda self: self._default_new_sequence(), + ) + require_image = fields.Boolean( + string="Require Image", related="reason_id.require_image" + ) + reschedule = fields.Boolean(default=True) + allow_reschedule = fields.Boolean( + string="Allow Reschedule", related="reason_id.reschedule" + ) + notes = fields.Text() + + def action_close_reason_apply(self): + visits = self.env["crm.salesperson.planner.visit"].browse( + self.env.context.get("active_id") + ) + visit_close_find_method_name = "action_%s" % self.reason_id.close_type + if hasattr(visits, visit_close_find_method_name): + getattr(visits, visit_close_find_method_name)( + self.reason_id, self.image, self.notes + ) + if self.allow_reschedule and self.reschedule: + visits.copy( + { + "date": self.new_date, + "sequence": self.new_sequence, + "opportunity_ids": visits.opportunity_ids.ids, + } + ).action_confirm() + else: + raise ValueError(_("The close reason type haven't a function.")) + return {"type": "ir.actions.act_window_close"} diff --git a/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz_view.xml b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz_view.xml new file mode 100644 index 00000000000..d314d38a5ec --- /dev/null +++ b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_close_wiz_view.xml @@ -0,0 +1,58 @@ + + + + + crm.salesperson.lost.form + crm.salesperson.planner.visit.close.wiz + +
+ + + + + + + + + + +
+
+
+
+
+ + Close Reasons + ir.actions.act_window + crm.salesperson.planner.visit.close.wiz + form + + new + +
diff --git a/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.py b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.py new file mode 100644 index 00000000000..ea278d38382 --- /dev/null +++ b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.py @@ -0,0 +1,34 @@ +# Copyright 2021 Sygel - Valentin Vinagre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from datetime import timedelta + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + + +class CrmSalespersonPlannerVisitTemplateCreate(models.TransientModel): + _name = "crm.salesperson.planner.visit.template.create" + _description = "crm salesperson planner visit template create" + + def _default_date_to(self): + template = self.env["crm.salesperson.planner.visit.template"].browse( + self.env.context.get("active_id") + ) + date = template.last_visit_date or fields.Date.context_today(self) + return date + timedelta(days=7) + + date_to = fields.Date( + string="Date to", default=lambda self: self._default_date_to(), required=True + ) + + def create_visits(self): + template = self.env["crm.salesperson.planner.visit.template"].browse( + self.env.context.get("active_id") + ) + days = (self.date_to - fields.Date.context_today(self)).days + if days < 0: + raise ValidationError(_("The date can't be earlier than today")) + # Create visits + auto-confirm + auto-done + template.create_visits(days=days) + return {"type": "ir.actions.act_window_close"} diff --git a/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.xml b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.xml new file mode 100644 index 00000000000..5f29eb654a3 --- /dev/null +++ b/crm_salesperson_planner/wizards/crm_salesperson_planner_visit_template_create.xml @@ -0,0 +1,42 @@ + + + + + crm.salesperson.planner.visit.template.create.form + crm.salesperson.planner.visit.template.create + +
+ + + +
+
+
+
+
+ + Create Visits + ir.actions.act_window + crm.salesperson.planner.visit.template.create + form + + new + +