From 5bfc3a0f9c6d21ec91c6d434f1e5ab666711363d Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Wed, 16 Oct 2019 08:49:01 -0500 Subject: [PATCH 01/59] [ADD] fieldservice_sale_recurring --- fieldservice_sale_recurring/README.rst | 142 ++++++ fieldservice_sale_recurring/__init__.py | 4 + fieldservice_sale_recurring/__manifest__.py | 29 ++ .../models/__init__.py | 10 + .../models/fsm_recurring.py | 22 + .../models/product_template.py | 20 + .../models/sale_order.py | 40 ++ .../models/sale_order_line.py | 101 ++++ .../readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 9 + .../readme/DESCRIPTION.rst | 1 + .../readme/INSTALL.rst | 4 + .../readme/ROADMAP.rst | 2 + fieldservice_sale_recurring/readme/USAGE.rst | 6 + .../static/description/description/icon.png | Bin 0 -> 17808 bytes .../static/description/description/index.html | 464 +++++++++++++++++ .../static/description/icon.png | Bin 0 -> 17808 bytes .../static/description/index.html | 481 ++++++++++++++++++ .../views/fsm_recurring.xml | 19 + .../views/product_template.xml | 13 + .../views/sale_order.xml | 19 + 21 files changed, 1394 insertions(+) create mode 100644 fieldservice_sale_recurring/README.rst create mode 100644 fieldservice_sale_recurring/__init__.py create mode 100644 fieldservice_sale_recurring/__manifest__.py create mode 100644 fieldservice_sale_recurring/models/__init__.py create mode 100644 fieldservice_sale_recurring/models/fsm_recurring.py create mode 100644 fieldservice_sale_recurring/models/product_template.py create mode 100644 fieldservice_sale_recurring/models/sale_order.py create mode 100644 fieldservice_sale_recurring/models/sale_order_line.py create mode 100644 fieldservice_sale_recurring/readme/CONFIGURE.rst create mode 100644 fieldservice_sale_recurring/readme/CONTRIBUTORS.rst create mode 100644 fieldservice_sale_recurring/readme/DESCRIPTION.rst create mode 100644 fieldservice_sale_recurring/readme/INSTALL.rst create mode 100644 fieldservice_sale_recurring/readme/ROADMAP.rst create mode 100644 fieldservice_sale_recurring/readme/USAGE.rst create mode 100644 fieldservice_sale_recurring/static/description/description/icon.png create mode 100644 fieldservice_sale_recurring/static/description/description/index.html create mode 100644 fieldservice_sale_recurring/static/description/icon.png create mode 100644 fieldservice_sale_recurring/static/description/index.html create mode 100644 fieldservice_sale_recurring/views/fsm_recurring.xml create mode 100644 fieldservice_sale_recurring/views/product_template.xml create mode 100644 fieldservice_sale_recurring/views/sale_order.xml diff --git a/fieldservice_sale_recurring/README.rst b/fieldservice_sale_recurring/README.rst new file mode 100644 index 0000000000..dfedd041fc --- /dev/null +++ b/fieldservice_sale_recurring/README.rst @@ -0,0 +1,142 @@ +===================== +Field Service - Sales +===================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Ffield--service-lightgray.png?logo=github + :target: https://github.com/OCA/field-service/tree/12.0/fieldservice_sale + :alt: OCA/field-service +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_sale + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/264/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The module integrate the field service application with the sales one. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +To install Field Service and have the mapping features, you need to install GeoEngine. + +Please refer to the installation instructions available at: +https://github.com/OCA/geospatial/tree/12.0/base_geoengine + +Configuration +============= + +To setup a product for quoting and selling field service orders: + +* Go to Sales > Catalog > Products +* Create or select a product +* Set the Product Type to 'Service' under General Information tab +* Under Invoicing tab, set the Field Service Tracking option +* Select the FSM Order Template that will be used for creating FSM Orders when + a Sale Order is confirmed with this product + + +To setup a sales territory, you need to: + +* Go to Field Service > Master Data > Locations +* Create or select a location +* Go to the Sales tab and select the sales territory + +Usage +===== + +* Go to Sales app +* Create a new Quotation/Sale Order +* Set the FSM Location to be used +* On a Sale Order Line, select a product configured for field service orders +* Confirm the Sale Order +* Field Service Orders linked to SO lines are created + +Known issues / Roadmap +====================== + +The roadmap of the Field Service application is documented on +`Github `_. + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Open Source Integrators + +Contributors +~~~~~~~~~~~~ + +* Steve Campbell +* Maxime Chambreuil +* Wolfgang Hall +* Serpent Consulting Services Pvt. Ltd. +* Brian McMaster +* Raphaël Reverdy + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Open Source Integrators + +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. + +.. |maintainer-wolfhall| image:: https://github.com/wolfhall.png?size=40px + :target: https://github.com/wolfhall + :alt: wolfhall +.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px + :target: https://github.com/max3903 + :alt: max3903 +.. |maintainer-brian10048| image:: https://github.com/brian10048.png?size=40px + :target: https://github.com/brian10048 + :alt: brian10048 + +Current `maintainers `__: + +|maintainer-wolfhall| |maintainer-max3903| |maintainer-brian10048| + +This module is part of the `OCA/field-service `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_sale_recurring/__init__.py b/fieldservice_sale_recurring/__init__.py new file mode 100644 index 0000000000..66ca882fcc --- /dev/null +++ b/fieldservice_sale_recurring/__init__.py @@ -0,0 +1,4 @@ +# Copyright (C) 2018 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py new file mode 100644 index 0000000000..4a0ac34534 --- /dev/null +++ b/fieldservice_sale_recurring/__manifest__.py @@ -0,0 +1,29 @@ +# Copyright (C) 2018 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Field Service - Sales - Recurring', + 'version': '12.0.1.0.0', + 'summary': 'Sell recurring field services.', + 'category': 'Field Service', + 'author': 'Open Source Integrators, Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/field-service', + 'depends': [ + 'fieldservice_recurring', + 'fieldservice_sale', + ], + 'data': [ + 'views/fsm_recurring.xml', + 'views/product_template.xml', + 'views/sale_order.xml', + ], + 'license': 'AGPL-3', + 'development_status': 'Beta', + 'maintainers': [ + 'wolfhall', + 'max3903', + 'brian10048', + ], + 'installable': True, + 'auto_install': True, +} diff --git a/fieldservice_sale_recurring/models/__init__.py b/fieldservice_sale_recurring/models/__init__.py new file mode 100644 index 0000000000..36728ea16a --- /dev/null +++ b/fieldservice_sale_recurring/models/__init__.py @@ -0,0 +1,10 @@ +# Copyright (C) 2018 Brian McMaster +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + product_template, + sale_order, + sale_order_line, + fsm_recurring, +) diff --git a/fieldservice_sale_recurring/models/fsm_recurring.py b/fieldservice_sale_recurring/models/fsm_recurring.py new file mode 100644 index 0000000000..497f0195d1 --- /dev/null +++ b/fieldservice_sale_recurring/models/fsm_recurring.py @@ -0,0 +1,22 @@ +# Copyright (C) 2019 Brian McMaster +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ + + +class FSMRecurring(models.Model): + _inherit = 'fsm.recurring' + + sale_line_id = fields.Many2one('sale.order.line') + + def action_view_sales(self): + self.ensure_one() + return { + "type": "ir.actions.act_window", + "res_model": "sale.order", + "views": [[False, "form"]], + "res_id": self.sale_line_id.order_id.id, + "context": {"create": False}, + "name": _("Sales Orders"), + } diff --git a/fieldservice_sale_recurring/models/product_template.py b/fieldservice_sale_recurring/models/product_template.py new file mode 100644 index 0000000000..8f7574b7b0 --- /dev/null +++ b/fieldservice_sale_recurring/models/product_template.py @@ -0,0 +1,20 @@ +# Copyright (C) 2019 Brian McMaster +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + fsm_recurring_template_id = fields.Many2one( + 'fsm.recurring.template', 'Field Service Recurring Template', + help="Select a field service recurring order template to be created") + + @api.onchange('field_service_tracking') + def _onchange_field_service_tracking(self): + if self.field_service_tracking != 'recurring': + self.fsm_recurring_template_id = False + else: + super()._onchange_field_service_tracking() diff --git a/fieldservice_sale_recurring/models/sale_order.py b/fieldservice_sale_recurring/models/sale_order.py new file mode 100644 index 0000000000..3c85e6c615 --- /dev/null +++ b/fieldservice_sale_recurring/models/sale_order.py @@ -0,0 +1,40 @@ +# Copyright (C) 2019 Brian McMaster +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + fsm_recurring_ids = fields.Many2many( + 'fsm.recurring', compute='_compute_fsm_recurring_ids', + string='Field Service Recurring orders associated to this sale') + fsm_recurring_count = fields.Float( + string='FSM Recurring Orders', compute='_compute_fsm_recurring_ids') + + @api.multi + @api.depends('order_line.product_id') + def _compute_fsm_recurring_ids(self): + for order in self: + order.fsm_recurring_ids = self.env['fsm.recurring'].search([ + ('sale_line_id', 'in', order.order_line.ids)]) + order.fsm_recurring_count = len(order.fsm_recurring_ids) + + @api.multi + def action_view_fsm_recurring(self): + fsm_recurrings = self.mapped('fsm_recurring_ids') + action = self.env.ref( + 'fieldservice_recurring.action_fsm_recurring').read()[0] + if len(fsm_recurrings) > 1: + action['domain'] = [('id', 'in', fsm_recurrings.ids)] + elif len(fsm_recurrings) == 1: + action['views'] = [ + (self.env.ref( + 'fieldservice_recurring.fsm_recurring_form_view').id, + 'form')] + action['res_id'] = fsm_recurrings.id + else: + action = {'type': 'ir.actions.act_window_close'} + return action diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py new file mode 100644 index 0000000000..cee2f12ec1 --- /dev/null +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -0,0 +1,101 @@ +# Copyright (C) 2019 Brian McMaster +# Copyright (C) 2019 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + fsm_recurring_id = fields.Many2one( + 'fsm.recurring', 'Recurring Order', index=True, + help="Field Service Recurring Order generated by the sale order line") + + def _field_create_fsm_recurring_prepare_values(self): + self.ensure_one() + template = self.product_id.fsm_recurring_template_id + note = self.name + if template.description: + note += '\n ' + template.description + return { + 'customer_id': self.order_id.partner_id.id, + 'location_id': self.order_id.fsm_location_id.id, + 'start_date': self.order_id.date_fsm_request, + 'fsm_recurring_template_id': template.id, + 'description': note, + 'max_orders': template.max_orders, + 'fsm_frequency_set_id': template.fsm_frequency_set_id.id, + 'fsm_order_template_id': template.fsm_order_template_id.id, + 'sale_line_id': self.id, + 'company_id': self.company_id.id, + } + + @api.multi + def _field_create_fsm_recurring(self): + """ Generate fsm_recurring for the given so line, and link it. + :return a mapping with the so line id and its linked fsm_recurring + :rtype dict + """ + result = {} + for so_line in self: + # create fsm_recurring + values = so_line._field_create_fsm_recurring_prepare_values() + fsm_recurring = self.env['fsm.recurring'].sudo().create(values) + fsm_recurring.action_start() + so_line.write({'fsm_recurring_id': fsm_recurring.id}) + # post message on SO + msg_body = _( + """Field Service recurring Created (%s): %s + """) % (so_line.product_id.name, + fsm_recurring.id, + fsm_recurring.name) + so_line.order_id.message_post(body=msg_body) + # post message on fsm_recurring + fsm_recurring_msg = _( + """This recurring has been created from: %s (%s) + """) % (so_line.order_id.id, so_line.order_id.name, + so_line.product_id.name) + fsm_recurring.message_post(body=fsm_recurring_msg) + result[so_line.id] = fsm_recurring + return result + + @api.multi + def _field_find_fsm_recurring(self): + """ Find the fsm_recurring generated by the so lines. If no + fsm_recurring linked, it will be created automatically. + :return a mapping with the so line id and its linked + fsm_recurring + :rtype dict + """ + # one search for all so lines + fsm_recurrings = self.env['fsm.recurring'].search([ + ('sale_line_id', 'in', self.ids)]) + fsm_recurring_sol_mapping = { + fsm_recurring.sale_line_id.id: + fsm_recurring for fsm_recurring in fsm_recurrings} + result = {} + for so_line in self: + # If the SO was confirmed, cancelled, set to draft then confirmed, + # avoid creating a new fsm_recurring. + fsm_recurring = fsm_recurring_sol_mapping.get(so_line.id) + # If not found, create one fsm_recurring for the so line + if not fsm_recurring: + fsm_recurring = so_line._field_create_fsm_recurring( + )[so_line.id] + result[so_line.id] = fsm_recurring + return result + + @api.multi + def _field_service_generation(self): + """ For service lines, create the field service order. If it already + exists, it simply links the existing one to the line. + """ + for so_line in self.filtered(lambda sol: sol.is_field_service): + # create order + if so_line.product_id.field_service_tracking == 'recurring': + so_line._field_find_fsm_recurring() + else: + super()._field_service_generation() diff --git a/fieldservice_sale_recurring/readme/CONFIGURE.rst b/fieldservice_sale_recurring/readme/CONFIGURE.rst new file mode 100644 index 0000000000..2da32fbbd4 --- /dev/null +++ b/fieldservice_sale_recurring/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +To setup a product for quoting and selling field service orders: + +* Go to Sales > Catalog > Products +* Create or select a product +* Set the Product Type to 'Service' under General Information tab +* Under Invoicing tab, set the Field Service Tracking option +* Select the FSM Order Template that will be used for creating FSM Orders when + a Sale Order is confirmed with this product diff --git a/fieldservice_sale_recurring/readme/CONTRIBUTORS.rst b/fieldservice_sale_recurring/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..eabb35de88 --- /dev/null +++ b/fieldservice_sale_recurring/readme/CONTRIBUTORS.rst @@ -0,0 +1,9 @@ +* Open Source Integrators + + * Steve Campbell + * Maxime Chambreuil + * Wolfgang Hall + +* Serpent Consulting Services Pvt. Ltd. +* Brian McMaster +* Raphaël Reverdy diff --git a/fieldservice_sale_recurring/readme/DESCRIPTION.rst b/fieldservice_sale_recurring/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..51dc3140c5 --- /dev/null +++ b/fieldservice_sale_recurring/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows you to sell recurring field services. diff --git a/fieldservice_sale_recurring/readme/INSTALL.rst b/fieldservice_sale_recurring/readme/INSTALL.rst new file mode 100644 index 0000000000..8571f65376 --- /dev/null +++ b/fieldservice_sale_recurring/readme/INSTALL.rst @@ -0,0 +1,4 @@ +To install Field Service and have the mapping features, you need to install GeoEngine. + +Please refer to the installation instructions available at: +https://github.com/OCA/geospatial/tree/12.0/base_geoengine diff --git a/fieldservice_sale_recurring/readme/ROADMAP.rst b/fieldservice_sale_recurring/readme/ROADMAP.rst new file mode 100644 index 0000000000..f607015959 --- /dev/null +++ b/fieldservice_sale_recurring/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +The roadmap of the Field Service application is documented on +`Github `_. diff --git a/fieldservice_sale_recurring/readme/USAGE.rst b/fieldservice_sale_recurring/readme/USAGE.rst new file mode 100644 index 0000000000..051359a603 --- /dev/null +++ b/fieldservice_sale_recurring/readme/USAGE.rst @@ -0,0 +1,6 @@ +* Go to Sales +* Create a new Quotation/Sale Order +* Set the FSM Location to be used +* On a Sale Order Line, select a product configured for field service orders +* Confirm the Sale Order +* Field Service Orders linked to SO lines are created diff --git a/fieldservice_sale_recurring/static/description/description/icon.png b/fieldservice_sale_recurring/static/description/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..955674d8f0b8c47de3ffa9db25cb109fbe4a1091 GIT binary patch literal 17808 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 literal 0 HcmV?d00001 diff --git a/fieldservice_sale_recurring/static/description/description/index.html b/fieldservice_sale_recurring/static/description/description/index.html new file mode 100644 index 0000000000..734a351843 --- /dev/null +++ b/fieldservice_sale_recurring/static/description/description/index.html @@ -0,0 +1,464 @@ + + + + + + +Field Service + + + +
+

Field Service

+ + +

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

+

This module is the base of the Field Service application in Odoo.

+

Table of contents

+ +
+

Installation

+

To install Field Service and have the mapping features, you need to install GeoEngine.

+

Please refer to the installation instructions available at: +https://github.com/OCA/geospatial/tree/11.0/base_geoengine

+
+
+

Configuration

+

To configure this module, you need to:

+
    +
  • Go to Field Service > Configuration > Settings
  • +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  • Go to Field Service
  • +
  • Create or select an order
  • +
  • Follow the process
  • +
+
+
+

Known issues / Roadmap

+

The roadmap of the Field Service application is documented on +Github.

+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Open Source Integrators
  • +
+
+ +
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

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.

+

Current maintainers:

+

wolfhall max3903

+

This module is part of the OCA/field-service project on GitHub.

+

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

+
+
+
+ + diff --git a/fieldservice_sale_recurring/static/description/icon.png b/fieldservice_sale_recurring/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..955674d8f0b8c47de3ffa9db25cb109fbe4a1091 GIT binary patch literal 17808 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 literal 0 HcmV?d00001 diff --git a/fieldservice_sale_recurring/static/description/index.html b/fieldservice_sale_recurring/static/description/index.html new file mode 100644 index 0000000000..b84c32f94b --- /dev/null +++ b/fieldservice_sale_recurring/static/description/index.html @@ -0,0 +1,481 @@ + + + + + + +Field Service - Sales + + + +
+

Field Service - Sales

+ + +

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

+

The module integrate the field service application with the sales one.

+

Table of contents

+ +
+

Installation

+

To install Field Service and have the mapping features, you need to install GeoEngine.

+

Please refer to the installation instructions available at: +https://github.com/OCA/geospatial/tree/12.0/base_geoengine

+
+
+

Configuration

+

To setup a product for quoting and selling field service orders:

+
    +
  • Go to Sales > Catalog > Products
  • +
  • Create or select a product
  • +
  • Set the Product Type to ‘Service’ under General Information tab
  • +
  • Under Invoicing tab, set the Field Service Tracking option
  • +
  • +
    Select the FSM Order Template that will be used for creating FSM Orders when
    +
    a Sale Order is confirmed with this product
    +
    +
  • +
+

To setup a sales territory, you need to:

+
    +
  • Go to Field Service > Master Data > Locations
  • +
  • Create or select a location
  • +
  • Go to the Sales tab and select the sales territory
  • +
+
+
+

Usage

+
    +
  • Go to Sales app
  • +
  • Create a new Quotation/Sale Order
  • +
  • Set the FSM Location to be used
  • +
  • On a Sale Order Line, select a product configured for field service orders
  • +
  • Confirm the Sale Order
  • +
  • Field Service Orders linked to SO lines are created
  • +
+
+
+

Known issues / Roadmap

+

The roadmap of the Field Service application is documented on +Github.

+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Open Source Integrators
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

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.

+

Current maintainers:

+

wolfhall max3903 brian10048

+

This module is part of the OCA/field-service project on GitHub.

+

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

+
+
+
+ + diff --git a/fieldservice_sale_recurring/views/fsm_recurring.xml b/fieldservice_sale_recurring/views/fsm_recurring.xml new file mode 100644 index 0000000000..aedaeb3826 --- /dev/null +++ b/fieldservice_sale_recurring/views/fsm_recurring.xml @@ -0,0 +1,19 @@ + + + + fsm.recurring + + + + + + + + diff --git a/fieldservice_sale_recurring/views/product_template.xml b/fieldservice_sale_recurring/views/product_template.xml new file mode 100644 index 0000000000..2448089810 --- /dev/null +++ b/fieldservice_sale_recurring/views/product_template.xml @@ -0,0 +1,13 @@ + + + product.template.fieldservice.form + product.template + + + + + + + + diff --git a/fieldservice_sale_recurring/views/sale_order.xml b/fieldservice_sale_recurring/views/sale_order.xml new file mode 100644 index 0000000000..d82a655ff5 --- /dev/null +++ b/fieldservice_sale_recurring/views/sale_order.xml @@ -0,0 +1,19 @@ + + + sale.order.form.sale.fieldservice + sale.order + + + + + + + + From 6216cd2e2f8048f201fe969d08a50e0532183623 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Wed, 16 Oct 2019 10:17:13 -0500 Subject: [PATCH 02/59] Update fieldservice_sale_recurring/models/product_template.py Co-Authored-By: brian10048 --- fieldservice_sale_recurring/models/product_template.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fieldservice_sale_recurring/models/product_template.py b/fieldservice_sale_recurring/models/product_template.py index 8f7574b7b0..e1c589f666 100644 --- a/fieldservice_sale_recurring/models/product_template.py +++ b/fieldservice_sale_recurring/models/product_template.py @@ -8,6 +8,11 @@ class ProductTemplate(models.Model): _inherit = 'product.template' + field_service_tracking = fields.Selection( + selection_add=[ + ('recurring', 'Create a recurring order') + ] + ) fsm_recurring_template_id = fields.Many2one( 'fsm.recurring.template', 'Field Service Recurring Template', help="Select a field service recurring order template to be created") From e41d9b15fd2859fd1578def78dbe4633260e0df1 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 16 Oct 2019 16:31:29 +0000 Subject: [PATCH 03/59] [UPD] README.rst --- fieldservice_sale_recurring/README.rst | 41 +++++++------------ .../static/description/index.html | 37 ++++++----------- 2 files changed, 28 insertions(+), 50 deletions(-) diff --git a/fieldservice_sale_recurring/README.rst b/fieldservice_sale_recurring/README.rst index dfedd041fc..528d3e891a 100644 --- a/fieldservice_sale_recurring/README.rst +++ b/fieldservice_sale_recurring/README.rst @@ -1,6 +1,6 @@ -===================== -Field Service - Sales -===================== +================================= +Field Service - Sales - Recurring +================================= .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! @@ -14,10 +14,10 @@ Field Service - Sales :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github - :target: https://github.com/OCA/field-service/tree/12.0/fieldservice_sale + :target: https://github.com/OCA/field-service/tree/12.0/fieldservice_sale_recurring :alt: OCA/field-service .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_sale + :target: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_sale_recurring :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png :target: https://runbot.odoo-community.org/runbot/264/12.0 @@ -25,7 +25,7 @@ Field Service - Sales |badge1| |badge2| |badge3| |badge4| |badge5| -The module integrate the field service application with the sales one. +This module allows you to sell recurring field services. **Table of contents** @@ -52,17 +52,10 @@ To setup a product for quoting and selling field service orders: * Select the FSM Order Template that will be used for creating FSM Orders when a Sale Order is confirmed with this product - -To setup a sales territory, you need to: - -* Go to Field Service > Master Data > Locations -* Create or select a location -* Go to the Sales tab and select the sales territory - Usage ===== -* Go to Sales app +* Go to Sales * Create a new Quotation/Sale Order * Set the FSM Location to be used * On a Sale Order Line, select a product configured for field service orders @@ -81,7 +74,7 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -96,20 +89,16 @@ Authors Contributors ~~~~~~~~~~~~ -* Steve Campbell -* Maxime Chambreuil -* Wolfgang Hall +* Open Source Integrators + + * Steve Campbell + * Maxime Chambreuil + * Wolfgang Hall + * Serpent Consulting Services Pvt. Ltd. * Brian McMaster * Raphaël Reverdy -Other credits -~~~~~~~~~~~~~ - -The development of this module has been financially supported by: - -* Open Source Integrators - Maintainers ~~~~~~~~~~~ @@ -137,6 +126,6 @@ Current `maintainers `__: |maintainer-wolfhall| |maintainer-max3903| |maintainer-brian10048| -This module is part of the `OCA/field-service `_ project on GitHub. +This module is part of the `OCA/field-service `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_sale_recurring/static/description/index.html b/fieldservice_sale_recurring/static/description/index.html index b84c32f94b..54bb133896 100644 --- a/fieldservice_sale_recurring/static/description/index.html +++ b/fieldservice_sale_recurring/static/description/index.html @@ -4,7 +4,7 @@ -Field Service - Sales +Field Service - Sales - Recurring -
-

Field Service - Sales

+
+

Field Service - Sales - Recurring

-

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

-

The module integrate the field service application with the sales one.

+

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

+

This module allows you to sell recurring field services.

Table of contents

@@ -406,17 +405,11 @@

Configuration

-

To setup a sales territory, you need to:

-
    -
  • Go to Field Service > Master Data > Locations
  • -
  • Create or select a location
  • -
  • Go to the Sales tab and select the sales territory
  • -

Usage

    -
  • Go to Sales app
  • +
  • Go to Sales
  • Create a new Quotation/Sale Order
  • Set the FSM Location to be used
  • On a Sale Order Line, select a product configured for field service orders
  • @@ -434,7 +427,7 @@

    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 smashing it by providing a detailed and welcomed -feedback.

    +feedback.

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

@@ -448,23 +441,19 @@

Authors

Contributors

-
-

Other credits

-

The development of this module has been financially supported by:

- -
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose @@ -472,7 +461,7 @@

Maintainers

promote its widespread use.

Current maintainers:

wolfhall max3903 brian10048

-

This module is part of the OCA/field-service project on GitHub.

+

This module is part of the OCA/field-service project on GitHub.

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

From 31df97b533f4aa6c49461c31cf5cd673034d3994 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Thu, 7 Nov 2019 16:04:55 -0600 Subject: [PATCH 04/59] [FIX] fieldservice_sale_recurring --- fieldservice_sale_recurring/__manifest__.py | 1 + fieldservice_sale_recurring/security/ir.model.access.csv | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 fieldservice_sale_recurring/security/ir.model.access.csv diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index 4a0ac34534..0dde08c718 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -13,6 +13,7 @@ 'fieldservice_sale', ], 'data': [ + 'security/ir.model.access.csv', 'views/fsm_recurring.xml', 'views/product_template.xml', 'views/sale_order.xml', diff --git a/fieldservice_sale_recurring/security/ir.model.access.csv b/fieldservice_sale_recurring/security/ir.model.access.csv new file mode 100644 index 0000000000..890f6a0def --- /dev/null +++ b/fieldservice_sale_recurring/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_fsm_recurring_sale_user,fsm.recurring.sale.user,fieldservice_recurring.model_fsm_recurring,sales_team.group_sale_salesman,1,1,1,0 +access_fsm_recurring_template_sale_user,fsm.recurring.template.sale.user,fieldservice_recurring.model_fsm_recurring_template,sales_team.group_sale_salesman,1,0,0,0 From f58c19d5d9e09146216da7edbc88ab197a26bc88 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 14 Nov 2019 21:51:16 +0000 Subject: [PATCH 05/59] [UPD] Update fieldservice_sale_recurring.pot --- .../i18n/fieldservice_sale_recurring.pot | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot diff --git a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot new file mode 100644 index 0000000000..dad45e9579 --- /dev/null +++ b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot @@ -0,0 +1,128 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a recurring order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a single order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:48 +#, python-format +msgid "Field Service recurring Created (%s): %s\n" +" " +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "On Sales order confirmation, this product can generate a field\n" +" service order or field service recurring order." +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sale Order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#, python-format +msgid "Sales Orders" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:56 +#, python-format +msgid "This recurring has been created from: %s (%s)\n" +" " +msgstr "" + From f05b2df67aeab87871c7a8a070088ca2dc90e8c8 Mon Sep 17 00:00:00 2001 From: Maria Sparenberg Date: Fri, 22 Nov 2019 13:20:20 +0000 Subject: [PATCH 06/59] Added translation using Weblate (German) --- fieldservice_sale_recurring/i18n/de.po | 130 +++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/de.po diff --git a/fieldservice_sale_recurring/i18n/de.po b/fieldservice_sale_recurring/i18n/de.po new file mode 100644 index 0000000000..899cfb7315 --- /dev/null +++ b/fieldservice_sale_recurring/i18n/de.po @@ -0,0 +1,130 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-11-26 14:27+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\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 3.8\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Verkaufsaufträge" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a recurring order" +msgstr "Wiederkehrenden Auftrag erstellen" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a single order" +msgstr "Auftrag erstellen" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "Wiederkehrende Service-Aufträge" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "Vorlage für wiederkehrenden Service-Auftrag" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:48 +#, python-format +msgid "Field Service recurring Created (%s): %s\n" +" " +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "On Sales order confirmation, this product can generate a field\n" +" service order or field service recurring order." +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "Produktvorlage" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "Wiederkehrender Service-Auftrag" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "Wiederkehrender Auftrag" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Auftragszeile" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sale Order" +msgstr "Verkaufsauftrag" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Auftragszeile" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#, python-format +msgid "Sales Orders" +msgstr "Verkaufsaufträge" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:56 +#, python-format +msgid "This recurring has been created from: %s (%s)\n" +" " +msgstr "" From 51a3d8be8e1b7eb34fe482a6bc25bf9cde6c045a Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Mon, 25 Nov 2019 11:30:31 -0600 Subject: [PATCH 07/59] [IMP] fieldservice_sale_recurring --- fieldservice_sale_recurring/models/sale_order_line.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index cee2f12ec1..b6e8ae8b89 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -21,12 +21,13 @@ def _field_create_fsm_recurring_prepare_values(self): return { 'customer_id': self.order_id.partner_id.id, 'location_id': self.order_id.fsm_location_id.id, - 'start_date': self.order_id.date_fsm_request, + 'start_date': self.order_id.expected_date, 'fsm_recurring_template_id': template.id, 'description': note, 'max_orders': template.max_orders, 'fsm_frequency_set_id': template.fsm_frequency_set_id.id, 'fsm_order_template_id': template.fsm_order_template_id.id, + 'sale_id': self.order_id.id, 'sale_line_id': self.id, 'company_id': self.company_id.id, } From fcfa646bca5b44e0d6d3ca3bd88e00d850c5c902 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 10 Dec 2019 15:59:39 +0000 Subject: [PATCH 08/59] [UPD] Update fieldservice_sale_recurring.pot --- .../i18n/fieldservice_sale_recurring.pot | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot index dad45e9579..591527f2fa 100644 --- a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot +++ b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot @@ -25,12 +25,27 @@ msgstr "" #. module: fieldservice_sale_recurring #: selection:product.template,field_service_tracking:0 -msgid "Create a single order" +msgid "Create one FSM order per sale order" msgstr "" #. module: fieldservice_sale_recurring #: selection:product.template,field_service_tracking:0 -msgid "Don't create order" +msgid "Create one FSM order per sale order line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create FSM order" msgstr "" #. module: fieldservice_sale_recurring @@ -62,20 +77,13 @@ msgid "Field Service Tracking" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:48 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 #, python-format msgid "Field Service recurring Created (%s): %s\n" " " msgstr "" -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking -#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "On Sales order confirmation, this product can generate a field\n" -" service order or field service recurring order." -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template msgid "Product Template" @@ -119,7 +127,7 @@ msgid "Select a field service recurring order template to be created" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:56 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 #, python-format msgid "This recurring has been created from: %s (%s)\n" From 6dc412f8d9b39b44c7b7a05f96e96b01ef5e6e38 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Tue, 10 Dec 2019 16:18:37 +0000 Subject: [PATCH 09/59] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: field-service-12.0/field-service-12.0-fieldservice_sale_recurring Translate-URL: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_sale_recurring/ --- fieldservice_sale_recurring/i18n/de.po | 48 ++++++++++++++++++-------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/de.po b/fieldservice_sale_recurring/i18n/de.po index 899cfb7315..1d283fa5ac 100644 --- a/fieldservice_sale_recurring/i18n/de.po +++ b/fieldservice_sale_recurring/i18n/de.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * fieldservice_sale_recurring +# * fieldservice_sale_recurring # msgid "" msgstr "" @@ -28,12 +28,32 @@ msgstr "Wiederkehrenden Auftrag erstellen" #. module: fieldservice_sale_recurring #: selection:product.template,field_service_tracking:0 -msgid "Create a single order" -msgstr "Auftrag erstellen" +#, fuzzy +#| msgid "Create a recurring order" +msgid "Create one FSM order per sale order" +msgstr "Wiederkehrenden Auftrag erstellen" #. module: fieldservice_sale_recurring #: selection:product.template,field_service_tracking:0 -msgid "Don't create order" +msgid "Create one FSM order per sale order line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "" +"Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" +" will be created." +msgstr "" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create FSM order" msgstr "" #. module: fieldservice_sale_recurring @@ -65,20 +85,14 @@ msgid "Field Service Tracking" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:48 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 #, python-format -msgid "Field Service recurring Created (%s): %s\n" " " msgstr "" -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking -#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "On Sales order confirmation, this product can generate a field\n" -" service order or field service recurring order." -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template msgid "Product Template" @@ -122,9 +136,13 @@ msgid "Select a field service recurring order template to be created" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:56 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 #, python-format -msgid "This recurring has been created from: %s (%s)\n" " " msgstr "" + +#~ msgid "Create a single order" +#~ msgstr "Auftrag erstellen" From 2c309fb8fa3a9c46cdc8e4cdad6db873c28e418c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Ram=C3=ADrez=20S=C3=A1nchez?= Date: Tue, 10 Dec 2019 18:37:32 +0000 Subject: [PATCH 10/59] Added translation using Weblate (Spanish (Chile)) --- fieldservice_sale_recurring/i18n/es_CL.po | 154 ++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/es_CL.po diff --git a/fieldservice_sale_recurring/i18n/es_CL.po b/fieldservice_sale_recurring/i18n/es_CL.po new file mode 100644 index 0000000000..fead49bd04 --- /dev/null +++ b/fieldservice_sale_recurring/i18n/es_CL.po @@ -0,0 +1,154 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-12-10 21:04+0000\n" +"Last-Translator: Nelson Ramírez Sánchez \n" +"Language-Team: none\n" +"Language: es_CL\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 3.9.1\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Pedidos de Venta" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a recurring order" +msgstr "Crear un pedido recurrente" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order" +msgstr "Crear un FSM por pedido de venta" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order line" +msgstr "Crear un pedido de FSM por líneas de pedido" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" +"Determina qué ocurre en una confirmación de pedido de venta:\n" +" - Nada: nada adicional, comportamiento predeterminado.\n" +" - Por Pedido de Venta: Una Orden de FSMse creará por esta " +"venta.\n" +" - Por línea de Pedido de Venta:Una Orden de FSM por cada " +"línea de pedido\n" +" se creará." + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create FSM order" +msgstr "No crear pedido de FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "Pedidos Recurrentes de FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" +"Pedido Recurrente de Servicio de Campo generado por la línea de pedido de " +"venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "Plantilla de Servicio de Campor Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "Ordenes de Servicio de Campor Recurrente asociadas a esta venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "Seguimiento de Servicio de Campo" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#, python-format +msgid "Field Service recurring Created (%s): %s\n" +" " +msgstr "" +"Servicio de Campo recurrente Creado (%s): %s\n" +" " + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "Plantilla de Producto" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "Orden de Servicio de Campo Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "Pedido Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Línea de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sale Order" +msgstr "Pedido de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de Pedido de Venta" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#, python-format +msgid "Sales Orders" +msgstr "Pedidos de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" +"Seleccione una plantilla de pedido recurrente de servicio de campo para crear" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#, python-format +msgid "This recurring has been created from: %s (%s)\n" +" " +msgstr "" +"Esta recurrencia ha sido creado a partir de: %s (%s)\n" +" " From 311e8acbaa10c06fca76078b27060b817ca6595d Mon Sep 17 00:00:00 2001 From: brian10048 Date: Tue, 10 Dec 2019 17:19:11 -0500 Subject: [PATCH 11/59] [FIX] fieldservice_sale_recurring - Was not calling super properly and FSM orders on the sale line that were not recurring orders were not being created. - Delete unused computed field. --- .../models/sale_order_line.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index b6e8ae8b89..ccfbec32bf 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -94,9 +94,9 @@ def _field_service_generation(self): """ For service lines, create the field service order. If it already exists, it simply links the existing one to the line. """ - for so_line in self.filtered(lambda sol: sol.is_field_service): - # create order - if so_line.product_id.field_service_tracking == 'recurring': - so_line._field_find_fsm_recurring() - else: - super()._field_service_generation() + result = super()._field_service_generation() + for so_line in self.filtered( + lambda sol: sol.product_id.field_service_tracking == 'recurring' + ): + so_line._field_find_fsm_recurring() + return result From f8cd9065bf21ac58a8116bbd28ffe2d560d053a4 Mon Sep 17 00:00:00 2001 From: brian10048 Date: Mon, 30 Dec 2019 14:29:04 -0500 Subject: [PATCH 12/59] [FIX] fieldservice_sale_recurring: Product view --- fieldservice_sale_recurring/views/product_template.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fieldservice_sale_recurring/views/product_template.xml b/fieldservice_sale_recurring/views/product_template.xml index 2448089810..2ab11a35c8 100644 --- a/fieldservice_sale_recurring/views/product_template.xml +++ b/fieldservice_sale_recurring/views/product_template.xml @@ -4,9 +4,15 @@ product.template + + {'required': [('field_service_tracking', 'in', ['sale','line'])], + 'invisible':[('field_service_tracking', 'in', ['no','recurring'])]} + + + attrs="{'invisible':[('field_service_tracking', 'not in', ['recurring'])], + 'required': [('field_service_tracking', '=', 'recurring')]}"/> From 29d11226dd87fcac17c415127a98e1e2699be295 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 31 Dec 2019 15:31:26 +0000 Subject: [PATCH 13/59] fieldservice_sale_recurring 12.0.1.1.0 --- fieldservice_sale_recurring/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index 0dde08c718..cd1dd952d4 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Field Service - Sales - Recurring', - 'version': '12.0.1.0.0', + 'version': '12.0.1.1.0', 'summary': 'Sell recurring field services.', 'category': 'Field Service', 'author': 'Open Source Integrators, Odoo Community Association (OCA)', From 8f138376061d4be7f5c411b88202b9c0274f11b9 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Thu, 16 Jan 2020 11:39:15 -0600 Subject: [PATCH 14/59] [ADD] Spanish (es) translation --- fieldservice_sale_recurring/i18n/es.po | 154 +++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/es.po diff --git a/fieldservice_sale_recurring/i18n/es.po b/fieldservice_sale_recurring/i18n/es.po new file mode 100644 index 0000000000..91b83056de --- /dev/null +++ b/fieldservice_sale_recurring/i18n/es.po @@ -0,0 +1,154 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-12-10 21:04+0000\n" +"Last-Translator: Nelson Ramírez Sánchez \n" +"Language-Team: none\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 3.9.1\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Pedidos de Venta" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a recurring order" +msgstr "Crear un pedido recurrente" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order" +msgstr "Crear un FSM por pedido de venta" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order line" +msgstr "Crear un pedido de FSM por líneas de pedido" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" +"Determina qué ocurre en una confirmación de pedido de venta:\n" +" - Nada: nada adicional, comportamiento predeterminado.\n" +" - Por Pedido de Venta: Una Orden de FSMse creará por esta " +"venta.\n" +" - Por línea de Pedido de Venta:Una Orden de FSM por cada " +"línea de pedido\n" +" se creará." + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create FSM order" +msgstr "No crear pedido de FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "Pedidos Recurrentes de FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" +"Pedido Recurrente de Servicio de Campo generado por la línea de pedido de " +"venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "Plantilla de Servicio de Campor Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "Ordenes de Servicio de Campor Recurrente asociadas a esta venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "Seguimiento de Servicio de Campo" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#, python-format +msgid "Field Service recurring Created (%s): %s\n" +" " +msgstr "" +"Servicio de Campo recurrente Creado (%s): %s\n" +" " + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "Plantilla de Producto" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "Orden de Servicio de Campo Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "Pedido Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Línea de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sale Order" +msgstr "Pedido de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de Pedido de Venta" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#, python-format +msgid "Sales Orders" +msgstr "Pedidos de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" +"Seleccione una plantilla de pedido recurrente de servicio de campo para crear" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#, python-format +msgid "This recurring has been created from: %s (%s)\n" +" " +msgstr "" +"Esta recurrencia ha sido creado a partir de: %s (%s)\n" +" " From 00d80e41c057b90aecea0d2736300b4473a27683 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Thu, 16 Jan 2020 06:22:44 +0000 Subject: [PATCH 15/59] Added translation using Weblate (Portuguese (Brazil)) --- fieldservice_sale_recurring/i18n/pt_BR.po | 153 ++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/pt_BR.po diff --git a/fieldservice_sale_recurring/i18n/pt_BR.po b/fieldservice_sale_recurring/i18n/pt_BR.po new file mode 100644 index 0000000000..3053e6ae64 --- /dev/null +++ b/fieldservice_sale_recurring/i18n/pt_BR.po @@ -0,0 +1,153 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-06-17 22:19+0000\n" +"Last-Translator: Fernando Colus \n" +"Language-Team: none\n" +"Language: pt_BR\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 3.10\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Pedidos de Venda" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a recurring order" +msgstr "Crie uma ordem recorrente" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order" +msgstr "Crie um pedido FSM por pedido de venda" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order line" +msgstr "Crie um Pedido FSM por linha de pedido de venda" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" +"Determina o que acontece após a confirmação do pedido de venda:\n" +" - Nenhum: nada adicional, comportamento padrão.\n" +" - Por pedido de venda: um pedido FSM será criado para a " +"venda.\n" +" - Por linha de pedido de venda: um pedido FSM será criado " +"para cada linha\n" +" de pedido de venda." + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create FSM order" +msgstr "Não crie ordem FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "Ordens Recorrentes do FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" +"Pedido recorrente de serviço de campo gerado pela linha da ordem do cliente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "Modelo de Recorrência de Serviço de Campo" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "Pedidos recorrentes de Serviço de Campo associados a esta venda" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "Rastreamento de Serviços de Campo" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#, python-format +msgid "Field Service recurring Created (%s): %s\n" +" " +msgstr "" +"Serviço de campo recorrente criado (%s): %s\n" +" " + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "Modelo de Produto" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "Ordem de Serviço de Campo Recorrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "Ordem Recorrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Linha de Venda" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sale Order" +msgstr "Pedido de Venda" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Linha de Pedidos de Venda" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#, python-format +msgid "Sales Orders" +msgstr "Pedidos de Vendas" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" +"Selecione um modelo de ordem de serviço de campo recorrente a ser criado" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#, python-format +msgid "This recurring has been created from: %s (%s)\n" +" " +msgstr "" +"Esse recurso recorrente foi criado a partir de: %s (%s)\n" +" " From 8e260e6a32f92d25035f9ef1f3b5662b076d483b Mon Sep 17 00:00:00 2001 From: brian10048 Date: Sat, 14 Dec 2019 15:59:28 -0500 Subject: [PATCH 16/59] [IMP] fieldservice_sale_recurring: Add test --- fieldservice_sale_recurring/tests/__init__.py | 6 ++ .../tests/test_fsm_sale_recurring.py | 78 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 fieldservice_sale_recurring/tests/__init__.py create mode 100644 fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py diff --git a/fieldservice_sale_recurring/tests/__init__.py b/fieldservice_sale_recurring/tests/__init__.py new file mode 100644 index 0000000000..377f3a1864 --- /dev/null +++ b/fieldservice_sale_recurring/tests/__init__.py @@ -0,0 +1,6 @@ +# Copyright (C) 2019 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + test_fsm_sale_recurring, +) diff --git a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py new file mode 100644 index 0000000000..af9905d5db --- /dev/null +++ b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py @@ -0,0 +1,78 @@ +# Copyright (C) 2019 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo.addons.fieldservice_sale.tests.test_fsm_sale_order import ( + TestFSMSale +) + + +class TestFSMSaleRecurring(TestFSMSale): + + @classmethod + def setUpClass(cls): + super(TestFSMSaleRecurring, cls).setUpClass() + cls.test_location = cls.env.ref('fieldservice.test_location') + + # Setup products that when sold will create some FSM orders + cls.setUpFSMProducts() + + SaleOrder = cls.env['sale.order'].with_context(tracking_disable=True) + + cls.sale_order_recur = SaleOrder.create({ + 'partner_id': cls.partner_customer_usd.id, + 'fsm_location_id': cls.test_location.id, + 'pricelist_id': cls.pricelist_usd.id, + }) + cls.sale_line_recurring = cls.env['sale.order.line'].create({ + 'name': cls.product_fsm_recur.name, + 'product_id': cls.product_fsm_recur.id, + 'product_uom_qty': 1, + 'product_uom': cls.product_fsm_recur.uom_id.id, + 'price_unit': cls.product_fsm_recur.list_price, + 'order_id': cls.sale_order_recur.id, + 'tax_id': False, + }) + + @classmethod + def setUpFSMProducts(cls): + super(TestFSMSaleRecurring, cls).setUpFSMProducts() + + # Product that creates FSM Recurring Order + cls.product_fsm_recur = cls.env['product.product'].create({ + 'name': 'FSM Recurring Order Product', + 'categ_id': cls.env.ref('product.product_category_3').id, + 'standard_price': 425.0, + 'list_price': 500.0, + 'type': 'service', + 'uom_id': cls.env.ref('uom.product_uom_unit').id, + 'uom_po_id': cls.env.ref('uom.product_uom_unit').id, + 'invoice_policy': 'order', + 'field_service_tracking': 'recurring', + 'fsm_recurring_template_id': cls.env.ref( + 'fieldservice_recurring.recur_template_weekdays').id, + }) + + def test_fsm_sale_order_recurring(self): + """ Test the flow for a Sale Order that will generate + FSM Recurring Orders. + """ + sol_recur = self.sale_line_recurring + # Confirm the sale order that was setup + self.sale_order_recur.action_confirm() + + # FSM Recurring Order linked to Sale Order Line + FSM_Recurring = self.env['fsm.recurring'] + count_recurring = FSM_Recurring.search_count( + [('id', '=', sol_recur.fsm_recurring_id.id)]) + self.assertEqual( + count_recurring, 1, + """FSM Sale Recurring: Recurring Order should be linked to the + Sale Order Line""" + ) + # FSM Recurring Order linked to Sale Order + self.assertEqual( + len(self.sale_order_recur.fsm_recurring_ids.ids), 1, + """FSM Sale Recurring: Sale Order should create + 1 FSM Recurring Order""" + ) From 298b49a33ce7fb716ce121f81a0bbbc7805a8040 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 18 Oct 2020 14:37:25 +0000 Subject: [PATCH 17/59] fieldservice_sale_recurring 12.0.1.2.0 --- fieldservice_sale_recurring/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index cd1dd952d4..2e58d71550 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Field Service - Sales - Recurring', - 'version': '12.0.1.1.0', + 'version': '12.0.1.2.0', 'summary': 'Sell recurring field services.', 'category': 'Field Service', 'author': 'Open Source Integrators, Odoo Community Association (OCA)', From 7db3b38696e8679965c8e5d23be85ed458d5d4d0 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Sun, 22 Nov 2020 20:33:57 +0000 Subject: [PATCH 18/59] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: field-service-12.0/field-service-12.0-fieldservice_sale_recurring Translate-URL: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_sale_recurring/ --- fieldservice_sale_recurring/i18n/de.po | 1 - 1 file changed, 1 deletion(-) diff --git a/fieldservice_sale_recurring/i18n/de.po b/fieldservice_sale_recurring/i18n/de.po index 1d283fa5ac..216ca199f3 100644 --- a/fieldservice_sale_recurring/i18n/de.po +++ b/fieldservice_sale_recurring/i18n/de.po @@ -29,7 +29,6 @@ msgstr "Wiederkehrenden Auftrag erstellen" #. module: fieldservice_sale_recurring #: selection:product.template,field_service_tracking:0 #, fuzzy -#| msgid "Create a recurring order" msgid "Create one FSM order per sale order" msgstr "Wiederkehrenden Auftrag erstellen" From d0b1a794582b69728d923c2c09a221d146f34408 Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 16 Sep 2021 14:36:24 +0000 Subject: [PATCH 19/59] Added translation using Weblate (Italian) --- fieldservice_sale_recurring/i18n/it.po | 151 +++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/it.po diff --git a/fieldservice_sale_recurring/i18n/it.po b/fieldservice_sale_recurring/i18n/it.po new file mode 100644 index 0000000000..f08c4ff98d --- /dev/null +++ b/fieldservice_sale_recurring/i18n/it.po @@ -0,0 +1,151 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-09-26 17:34+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.3.2\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Ordini di vendita" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create a recurring order" +msgstr "Crea un ordine ricorrente" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order" +msgstr "Crea un ordine FSM per ordine di vendita" + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Create one FSM order per sale order line" +msgstr "Crea un ordine FSM per riga ordine di vendita" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" +"Definisce cosa accade alla conferma di un ordine di vendita:\n" +" - Niente: niente in aggiunta, comportamento predefinito.\n" +" - Per ordine di vendita: viene generato un ordine FSM per la " +"vendita.\n" +" - Per riga ordine di vendita: viene generato un ordine FSM " +"per ogni riga ordine di vendita." + +#. module: fieldservice_sale_recurring +#: selection:product.template,field_service_tracking:0 +msgid "Don't create FSM order" +msgstr "Non creare ordine FSM" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "Ordini FSM ricorrenti" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" +"Ordinei assistenza sul campo ricorrenti generati da riga ordine di vendita" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "Modello assistenza sul campo ricorrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "Ordini assistenza sul campo ricorrenti associati a questa vendita" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "Tracciamento assistenza sul campo" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#, python-format +msgid "Field Service recurring Created (%s): %s\n" +" " +msgstr "" +"Creata assistenza sul campo ricorrente (%s): %s\n" +" " + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "Modello prodotto" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "Ordine assistenza sul campo ricorrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "Ordine ricorrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Riga di vendita" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sale Order" +msgstr "Ordine di vendita" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Riga ordine di vendita" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#, python-format +msgid "Sales Orders" +msgstr "Ordini di vendita" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "Seleziona un modello ordine assistenza sul camp ricorrente da creare" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#, python-format +msgid "This recurring has been created from: %s (%s)\n" +" " +msgstr "" +"Questo ordine ricorrente è stato creato da: %s (%s)\n" +" " From 29168d7de01427f89cfc07ac4dbd9c8b898a087a Mon Sep 17 00:00:00 2001 From: hparfr Date: Tue, 28 Dec 2021 18:02:39 +0100 Subject: [PATCH 20/59] [IMP] fieldservice_sale_recurring : black, isort, prettier --- fieldservice_sale_recurring/__manifest__.py | 44 +- .../models/fsm_recurring.py | 6 +- .../models/product_template.py | 16 +- .../models/sale_order.py | 39 +- .../models/sale_order_line.py | 95 +- .../static/description/description/index.html | 1166 +++++++++++------ .../tests/test_fsm_sale_recurring.py | 89 +- .../views/fsm_recurring.xml | 18 +- .../views/product_template.xml | 17 +- .../views/sale_order.xml | 22 +- 10 files changed, 924 insertions(+), 588 deletions(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index 2e58d71550..1da5764508 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -2,29 +2,29 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Field Service - Sales - Recurring', - 'version': '12.0.1.2.0', - 'summary': 'Sell recurring field services.', - 'category': 'Field Service', - 'author': 'Open Source Integrators, Odoo Community Association (OCA)', - 'website': 'https://github.com/OCA/field-service', - 'depends': [ - 'fieldservice_recurring', - 'fieldservice_sale', + "name": "Field Service - Sales - Recurring", + "version": "12.0.1.2.0", + "summary": "Sell recurring field services.", + "category": "Field Service", + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/field-service", + "depends": [ + "fieldservice_recurring", + "fieldservice_sale", ], - 'data': [ - 'security/ir.model.access.csv', - 'views/fsm_recurring.xml', - 'views/product_template.xml', - 'views/sale_order.xml', + "data": [ + "security/ir.model.access.csv", + "views/fsm_recurring.xml", + "views/product_template.xml", + "views/sale_order.xml", ], - 'license': 'AGPL-3', - 'development_status': 'Beta', - 'maintainers': [ - 'wolfhall', - 'max3903', - 'brian10048', + "license": "AGPL-3", + "development_status": "Beta", + "maintainers": [ + "wolfhall", + "max3903", + "brian10048", ], - 'installable': True, - 'auto_install': True, + "installable": True, + "auto_install": True, } diff --git a/fieldservice_sale_recurring/models/fsm_recurring.py b/fieldservice_sale_recurring/models/fsm_recurring.py index 497f0195d1..8f1489a2b4 100644 --- a/fieldservice_sale_recurring/models/fsm_recurring.py +++ b/fieldservice_sale_recurring/models/fsm_recurring.py @@ -2,13 +2,13 @@ # Copyright (C) 2019 Open Source Integrators # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models, _ +from odoo import _, fields, models class FSMRecurring(models.Model): - _inherit = 'fsm.recurring' + _inherit = "fsm.recurring" - sale_line_id = fields.Many2one('sale.order.line') + sale_line_id = fields.Many2one("sale.order.line") def action_view_sales(self): self.ensure_one() diff --git a/fieldservice_sale_recurring/models/product_template.py b/fieldservice_sale_recurring/models/product_template.py index e1c589f666..3f5a82df9f 100644 --- a/fieldservice_sale_recurring/models/product_template.py +++ b/fieldservice_sale_recurring/models/product_template.py @@ -6,20 +6,20 @@ class ProductTemplate(models.Model): - _inherit = 'product.template' + _inherit = "product.template" field_service_tracking = fields.Selection( - selection_add=[ - ('recurring', 'Create a recurring order') - ] + selection_add=[("recurring", "Create a recurring order")] ) fsm_recurring_template_id = fields.Many2one( - 'fsm.recurring.template', 'Field Service Recurring Template', - help="Select a field service recurring order template to be created") + "fsm.recurring.template", + "Field Service Recurring Template", + help="Select a field service recurring order template to be created", + ) - @api.onchange('field_service_tracking') + @api.onchange("field_service_tracking") def _onchange_field_service_tracking(self): - if self.field_service_tracking != 'recurring': + if self.field_service_tracking != "recurring": self.fsm_recurring_template_id = False else: super()._onchange_field_service_tracking() diff --git a/fieldservice_sale_recurring/models/sale_order.py b/fieldservice_sale_recurring/models/sale_order.py index 3c85e6c615..b58f117753 100644 --- a/fieldservice_sale_recurring/models/sale_order.py +++ b/fieldservice_sale_recurring/models/sale_order.py @@ -6,35 +6,40 @@ class SaleOrder(models.Model): - _inherit = 'sale.order' + _inherit = "sale.order" fsm_recurring_ids = fields.Many2many( - 'fsm.recurring', compute='_compute_fsm_recurring_ids', - string='Field Service Recurring orders associated to this sale') + "fsm.recurring", + compute="_compute_fsm_recurring_ids", + string="Field Service Recurring orders associated to this sale", + ) fsm_recurring_count = fields.Float( - string='FSM Recurring Orders', compute='_compute_fsm_recurring_ids') + string="FSM Recurring Orders", compute="_compute_fsm_recurring_ids" + ) @api.multi - @api.depends('order_line.product_id') + @api.depends("order_line.product_id") def _compute_fsm_recurring_ids(self): for order in self: - order.fsm_recurring_ids = self.env['fsm.recurring'].search([ - ('sale_line_id', 'in', order.order_line.ids)]) + order.fsm_recurring_ids = self.env["fsm.recurring"].search( + [("sale_line_id", "in", order.order_line.ids)] + ) order.fsm_recurring_count = len(order.fsm_recurring_ids) @api.multi def action_view_fsm_recurring(self): - fsm_recurrings = self.mapped('fsm_recurring_ids') - action = self.env.ref( - 'fieldservice_recurring.action_fsm_recurring').read()[0] + fsm_recurrings = self.mapped("fsm_recurring_ids") + action = self.env.ref("fieldservice_recurring.action_fsm_recurring").read()[0] if len(fsm_recurrings) > 1: - action['domain'] = [('id', 'in', fsm_recurrings.ids)] + action["domain"] = [("id", "in", fsm_recurrings.ids)] elif len(fsm_recurrings) == 1: - action['views'] = [ - (self.env.ref( - 'fieldservice_recurring.fsm_recurring_form_view').id, - 'form')] - action['res_id'] = fsm_recurrings.id + action["views"] = [ + ( + self.env.ref("fieldservice_recurring.fsm_recurring_form_view").id, + "form", + ) + ] + action["res_id"] = fsm_recurrings.id else: - action = {'type': 'ir.actions.act_window_close'} + action = {"type": "ir.actions.act_window_close"} return action diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index ccfbec32bf..d7f52c9f43 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -2,81 +2,91 @@ # Copyright (C) 2019 Open Source Integrators # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models class SaleOrderLine(models.Model): _inherit = "sale.order.line" fsm_recurring_id = fields.Many2one( - 'fsm.recurring', 'Recurring Order', index=True, - help="Field Service Recurring Order generated by the sale order line") + "fsm.recurring", + "Recurring Order", + index=True, + help="Field Service Recurring Order generated by the sale order line", + ) def _field_create_fsm_recurring_prepare_values(self): self.ensure_one() template = self.product_id.fsm_recurring_template_id note = self.name if template.description: - note += '\n ' + template.description + note += "\n " + template.description return { - 'customer_id': self.order_id.partner_id.id, - 'location_id': self.order_id.fsm_location_id.id, - 'start_date': self.order_id.expected_date, - 'fsm_recurring_template_id': template.id, - 'description': note, - 'max_orders': template.max_orders, - 'fsm_frequency_set_id': template.fsm_frequency_set_id.id, - 'fsm_order_template_id': template.fsm_order_template_id.id, - 'sale_id': self.order_id.id, - 'sale_line_id': self.id, - 'company_id': self.company_id.id, + "customer_id": self.order_id.partner_id.id, + "location_id": self.order_id.fsm_location_id.id, + "start_date": self.order_id.expected_date, + "fsm_recurring_template_id": template.id, + "description": note, + "max_orders": template.max_orders, + "fsm_frequency_set_id": template.fsm_frequency_set_id.id, + "fsm_order_template_id": template.fsm_order_template_id.id, + "sale_id": self.order_id.id, + "sale_line_id": self.id, + "company_id": self.company_id.id, } @api.multi def _field_create_fsm_recurring(self): - """ Generate fsm_recurring for the given so line, and link it. - :return a mapping with the so line id and its linked fsm_recurring - :rtype dict + """Generate fsm_recurring for the given so line, and link it. + :return a mapping with the so line id and its linked fsm_recurring + :rtype dict """ result = {} for so_line in self: # create fsm_recurring values = so_line._field_create_fsm_recurring_prepare_values() - fsm_recurring = self.env['fsm.recurring'].sudo().create(values) + fsm_recurring = self.env["fsm.recurring"].sudo().create(values) fsm_recurring.action_start() - so_line.write({'fsm_recurring_id': fsm_recurring.id}) + so_line.write({"fsm_recurring_id": fsm_recurring.id}) # post message on SO - msg_body = _( - """Field Service recurring Created (%s): %s - """) % (so_line.product_id.name, - fsm_recurring.id, - fsm_recurring.name) + """ + ) + % (so_line.product_id.name, fsm_recurring.id, fsm_recurring.name) + ) so_line.order_id.message_post(body=msg_body) # post message on fsm_recurring - fsm_recurring_msg = _( - """This recurring has been created from: %s (%s) - """) % (so_line.order_id.id, so_line.order_id.name, - so_line.product_id.name) + """ + ) + % (so_line.order_id.id, so_line.order_id.name, so_line.product_id.name) + ) fsm_recurring.message_post(body=fsm_recurring_msg) result[so_line.id] = fsm_recurring return result @api.multi def _field_find_fsm_recurring(self): - """ Find the fsm_recurring generated by the so lines. If no - fsm_recurring linked, it will be created automatically. - :return a mapping with the so line id and its linked - fsm_recurring - :rtype dict + """Find the fsm_recurring generated by the so lines. If no + fsm_recurring linked, it will be created automatically. + :return a mapping with the so line id and its linked + fsm_recurring + :rtype dict """ # one search for all so lines - fsm_recurrings = self.env['fsm.recurring'].search([ - ('sale_line_id', 'in', self.ids)]) + fsm_recurrings = self.env["fsm.recurring"].search( + [("sale_line_id", "in", self.ids)] + ) fsm_recurring_sol_mapping = { - fsm_recurring.sale_line_id.id: - fsm_recurring for fsm_recurring in fsm_recurrings} + fsm_recurring.sale_line_id.id: fsm_recurring + for fsm_recurring in fsm_recurrings + } result = {} for so_line in self: # If the SO was confirmed, cancelled, set to draft then confirmed, @@ -84,19 +94,18 @@ def _field_find_fsm_recurring(self): fsm_recurring = fsm_recurring_sol_mapping.get(so_line.id) # If not found, create one fsm_recurring for the so line if not fsm_recurring: - fsm_recurring = so_line._field_create_fsm_recurring( - )[so_line.id] + fsm_recurring = so_line._field_create_fsm_recurring()[so_line.id] result[so_line.id] = fsm_recurring return result @api.multi def _field_service_generation(self): - """ For service lines, create the field service order. If it already - exists, it simply links the existing one to the line. + """For service lines, create the field service order. If it already + exists, it simply links the existing one to the line. """ result = super()._field_service_generation() for so_line in self.filtered( - lambda sol: sol.product_id.field_service_tracking == 'recurring' + lambda sol: sol.product_id.field_service_tracking == "recurring" ): so_line._field_find_fsm_recurring() return result diff --git a/fieldservice_sale_recurring/static/description/description/index.html b/fieldservice_sale_recurring/static/description/description/index.html index 734a351843..0b3535b24f 100644 --- a/fieldservice_sale_recurring/static/description/description/index.html +++ b/fieldservice_sale_recurring/static/description/description/index.html @@ -1,13 +1,12 @@ - - - -Field Service - - - -
-

Field Service

- - -

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

-

This module is the base of the Field Service application in Odoo.

-

Table of contents

- -
-

Installation

-

To install Field Service and have the mapping features, you need to install GeoEngine.

-

Please refer to the installation instructions available at: -https://github.com/OCA/geospatial/tree/11.0/base_geoengine

-
-
-

Configuration

-

To configure this module, you need to:

-
    -
  • Go to Field Service > Configuration > Settings
  • -
-
-
-

Usage

-

To use this module, you need to:

-
    -
  • Go to Field Service
  • -
  • Create or select an order
  • -
  • Follow the process
  • -
-
-
-

Known issues / Roadmap

-

The roadmap of the Field Service application is documented on -Github.

-
-
-

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 smashing it by providing a detailed and welcomed -feedback.

-

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

-
-
-

Credits

-
-

Authors

-
    -
  • Open Source Integrators
  • -
-
- -
-

Other credits

-

The development of this module has been financially supported by:

- -
-
-

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.

-

Current maintainers:

-

wolfhall max3903

-

This module is part of the OCA/field-service project on GitHub.

-

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

-
-
-
- +

+ Beta + License: AGPL-3 + OCA/field-service + Translate me on Weblate + Try me on Runbot +

+

This module is the base of the Field Service application in Odoo.

+

Table of contents

+
+ +
+
+

Installation

+

+ To install Field Service and have the mapping features, you need to install + GeoEngine. +

+

+ Please refer to the installation instructions available at: + https://github.com/OCA/geospatial/tree/11.0/base_geoengine +

+
+
+

Configuration

+

To configure this module, you need to:

+
    +
  • Go to Field Service > Configuration > Settings
  • +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  • Go to Field Service
  • +
  • Create or select an order
  • +
  • Follow the process
  • +
+
+
+

Known issues / Roadmap

+

+ The roadmap of the Field Service application is documented on + Github. +

+
+
+

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 smashing it by providing a detailed + and welcomed + feedback. +

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Open Source Integrators
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

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. +

+

+ Current + maintainers: +

+

+ wolfhall + max3903 +

+

+ This module is part of the + OCA/field-service + project on GitHub. +

+

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

+
+
+
+ diff --git a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py index af9905d5db..4e382f5393 100644 --- a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py +++ b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py @@ -2,77 +2,84 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.addons.fieldservice_sale.tests.test_fsm_sale_order import ( - TestFSMSale -) +from odoo.addons.fieldservice_sale.tests.test_fsm_sale_order import TestFSMSale class TestFSMSaleRecurring(TestFSMSale): - @classmethod def setUpClass(cls): super(TestFSMSaleRecurring, cls).setUpClass() - cls.test_location = cls.env.ref('fieldservice.test_location') + cls.test_location = cls.env.ref("fieldservice.test_location") # Setup products that when sold will create some FSM orders cls.setUpFSMProducts() - SaleOrder = cls.env['sale.order'].with_context(tracking_disable=True) + SaleOrder = cls.env["sale.order"].with_context(tracking_disable=True) - cls.sale_order_recur = SaleOrder.create({ - 'partner_id': cls.partner_customer_usd.id, - 'fsm_location_id': cls.test_location.id, - 'pricelist_id': cls.pricelist_usd.id, - }) - cls.sale_line_recurring = cls.env['sale.order.line'].create({ - 'name': cls.product_fsm_recur.name, - 'product_id': cls.product_fsm_recur.id, - 'product_uom_qty': 1, - 'product_uom': cls.product_fsm_recur.uom_id.id, - 'price_unit': cls.product_fsm_recur.list_price, - 'order_id': cls.sale_order_recur.id, - 'tax_id': False, - }) + cls.sale_order_recur = SaleOrder.create( + { + "partner_id": cls.partner_customer_usd.id, + "fsm_location_id": cls.test_location.id, + "pricelist_id": cls.pricelist_usd.id, + } + ) + cls.sale_line_recurring = cls.env["sale.order.line"].create( + { + "name": cls.product_fsm_recur.name, + "product_id": cls.product_fsm_recur.id, + "product_uom_qty": 1, + "product_uom": cls.product_fsm_recur.uom_id.id, + "price_unit": cls.product_fsm_recur.list_price, + "order_id": cls.sale_order_recur.id, + "tax_id": False, + } + ) @classmethod def setUpFSMProducts(cls): super(TestFSMSaleRecurring, cls).setUpFSMProducts() # Product that creates FSM Recurring Order - cls.product_fsm_recur = cls.env['product.product'].create({ - 'name': 'FSM Recurring Order Product', - 'categ_id': cls.env.ref('product.product_category_3').id, - 'standard_price': 425.0, - 'list_price': 500.0, - 'type': 'service', - 'uom_id': cls.env.ref('uom.product_uom_unit').id, - 'uom_po_id': cls.env.ref('uom.product_uom_unit').id, - 'invoice_policy': 'order', - 'field_service_tracking': 'recurring', - 'fsm_recurring_template_id': cls.env.ref( - 'fieldservice_recurring.recur_template_weekdays').id, - }) + cls.product_fsm_recur = cls.env["product.product"].create( + { + "name": "FSM Recurring Order Product", + "categ_id": cls.env.ref("product.product_category_3").id, + "standard_price": 425.0, + "list_price": 500.0, + "type": "service", + "uom_id": cls.env.ref("uom.product_uom_unit").id, + "uom_po_id": cls.env.ref("uom.product_uom_unit").id, + "invoice_policy": "order", + "field_service_tracking": "recurring", + "fsm_recurring_template_id": cls.env.ref( + "fieldservice_recurring.recur_template_weekdays" + ).id, + } + ) def test_fsm_sale_order_recurring(self): - """ Test the flow for a Sale Order that will generate - FSM Recurring Orders. + """Test the flow for a Sale Order that will generate + FSM Recurring Orders. """ sol_recur = self.sale_line_recurring # Confirm the sale order that was setup self.sale_order_recur.action_confirm() # FSM Recurring Order linked to Sale Order Line - FSM_Recurring = self.env['fsm.recurring'] + FSM_Recurring = self.env["fsm.recurring"] count_recurring = FSM_Recurring.search_count( - [('id', '=', sol_recur.fsm_recurring_id.id)]) + [("id", "=", sol_recur.fsm_recurring_id.id)] + ) self.assertEqual( - count_recurring, 1, + count_recurring, + 1, """FSM Sale Recurring: Recurring Order should be linked to the - Sale Order Line""" + Sale Order Line""", ) # FSM Recurring Order linked to Sale Order self.assertEqual( - len(self.sale_order_recur.fsm_recurring_ids.ids), 1, + len(self.sale_order_recur.fsm_recurring_ids.ids), + 1, """FSM Sale Recurring: Sale Order should create - 1 FSM Recurring Order""" + 1 FSM Recurring Order""", ) diff --git a/fieldservice_sale_recurring/views/fsm_recurring.xml b/fieldservice_sale_recurring/views/fsm_recurring.xml index aedaeb3826..04ddddb25a 100644 --- a/fieldservice_sale_recurring/views/fsm_recurring.xml +++ b/fieldservice_sale_recurring/views/fsm_recurring.xml @@ -1,17 +1,19 @@ - + fsm.recurring - + - diff --git a/fieldservice_sale_recurring/views/product_template.xml b/fieldservice_sale_recurring/views/product_template.xml index 2ab11a35c8..2c4ce0ae34 100644 --- a/fieldservice_sale_recurring/views/product_template.xml +++ b/fieldservice_sale_recurring/views/product_template.xml @@ -2,17 +2,24 @@ product.template.fieldservice.form product.template - + - {'required': [('field_service_tracking', 'in', ['sale','line'])], + {'required': [('field_service_tracking', 'in', ['sale','line'])], 'invisible':[('field_service_tracking', 'in', ['no','recurring'])]} - + diff --git a/fieldservice_sale_recurring/views/sale_order.xml b/fieldservice_sale_recurring/views/sale_order.xml index d82a655ff5..14ec3aa375 100644 --- a/fieldservice_sale_recurring/views/sale_order.xml +++ b/fieldservice_sale_recurring/views/sale_order.xml @@ -2,16 +2,22 @@ sale.order.form.sale.fieldservice sale.order - + - From 075eb04ca1ccf13b1b0e7140d3105e100b4d8a52 Mon Sep 17 00:00:00 2001 From: brian10048 Date: Sun, 19 Jul 2020 22:45:43 -0400 Subject: [PATCH 21/59] [MIG] fieldservice_sale_recurring: Migration to 13.0 --- fieldservice_sale_recurring/__manifest__.py | 2 +- fieldservice_sale_recurring/models/sale_order.py | 2 -- fieldservice_sale_recurring/models/sale_order_line.py | 5 +---- fieldservice_sale_recurring/readme/INSTALL.rst | 2 +- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index 1da5764508..5594fc7e85 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Field Service - Sales - Recurring", - "version": "12.0.1.2.0", + "version": "13.0.1.0.0", "summary": "Sell recurring field services.", "category": "Field Service", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/fieldservice_sale_recurring/models/sale_order.py b/fieldservice_sale_recurring/models/sale_order.py index b58f117753..8eaa42daa7 100644 --- a/fieldservice_sale_recurring/models/sale_order.py +++ b/fieldservice_sale_recurring/models/sale_order.py @@ -17,7 +17,6 @@ class SaleOrder(models.Model): string="FSM Recurring Orders", compute="_compute_fsm_recurring_ids" ) - @api.multi @api.depends("order_line.product_id") def _compute_fsm_recurring_ids(self): for order in self: @@ -26,7 +25,6 @@ def _compute_fsm_recurring_ids(self): ) order.fsm_recurring_count = len(order.fsm_recurring_ids) - @api.multi def action_view_fsm_recurring(self): fsm_recurrings = self.mapped("fsm_recurring_ids") action = self.env.ref("fieldservice_recurring.action_fsm_recurring").read()[0] diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index d7f52c9f43..cf6a923c82 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -2,7 +2,7 @@ # Copyright (C) 2019 Open Source Integrators # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import _, api, fields, models +from odoo import _, fields, models class SaleOrderLine(models.Model): @@ -35,7 +35,6 @@ def _field_create_fsm_recurring_prepare_values(self): "company_id": self.company_id.id, } - @api.multi def _field_create_fsm_recurring(self): """Generate fsm_recurring for the given so line, and link it. :return a mapping with the so line id and its linked fsm_recurring @@ -71,7 +70,6 @@ def _field_create_fsm_recurring(self): result[so_line.id] = fsm_recurring return result - @api.multi def _field_find_fsm_recurring(self): """Find the fsm_recurring generated by the so lines. If no fsm_recurring linked, it will be created automatically. @@ -98,7 +96,6 @@ def _field_find_fsm_recurring(self): result[so_line.id] = fsm_recurring return result - @api.multi def _field_service_generation(self): """For service lines, create the field service order. If it already exists, it simply links the existing one to the line. diff --git a/fieldservice_sale_recurring/readme/INSTALL.rst b/fieldservice_sale_recurring/readme/INSTALL.rst index 8571f65376..e5355c4b0f 100644 --- a/fieldservice_sale_recurring/readme/INSTALL.rst +++ b/fieldservice_sale_recurring/readme/INSTALL.rst @@ -1,4 +1,4 @@ To install Field Service and have the mapping features, you need to install GeoEngine. Please refer to the installation instructions available at: -https://github.com/OCA/geospatial/tree/12.0/base_geoengine +https://github.com/OCA/geospatial/tree/13.0/base_geoengine From 1aa57b1165cc1982368aa0fa0933f3bd9d782fa7 Mon Sep 17 00:00:00 2001 From: hparfr Date: Fri, 23 Jul 2021 16:01:40 +0200 Subject: [PATCH 22/59] [MIG] fieldservice_sale_recurring: Migration to 14.0 implement #735 Prefer fsm_order_template from product (directly) else from product.fsm_recurring_template Adapt product's view --- fieldservice_sale_recurring/__manifest__.py | 2 +- fieldservice_sale_recurring/models/sale_order_line.py | 6 +++--- fieldservice_sale_recurring/views/product_template.xml | 10 +--------- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index 5594fc7e85..4f17b682b7 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Field Service - Sales - Recurring", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "summary": "Sell recurring field services.", "category": "Field Service", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index cf6a923c82..017c365aa5 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -18,19 +18,19 @@ class SaleOrderLine(models.Model): def _field_create_fsm_recurring_prepare_values(self): self.ensure_one() template = self.product_id.fsm_recurring_template_id + product = self.product_id note = self.name if template.description: note += "\n " + template.description return { - "customer_id": self.order_id.partner_id.id, "location_id": self.order_id.fsm_location_id.id, "start_date": self.order_id.expected_date, "fsm_recurring_template_id": template.id, "description": note, "max_orders": template.max_orders, "fsm_frequency_set_id": template.fsm_frequency_set_id.id, - "fsm_order_template_id": template.fsm_order_template_id.id, - "sale_id": self.order_id.id, + "fsm_order_template_id": product.fsm_order_template_id.id + or template.fsm_order_template_id.id, "sale_line_id": self.id, "company_id": self.company_id.id, } diff --git a/fieldservice_sale_recurring/views/product_template.xml b/fieldservice_sale_recurring/views/product_template.xml index 2c4ce0ae34..bedeb8e8ab 100644 --- a/fieldservice_sale_recurring/views/product_template.xml +++ b/fieldservice_sale_recurring/views/product_template.xml @@ -7,18 +7,10 @@ ref="fieldservice_sale.view_product_fieldservice_form" /> - - {'required': [('field_service_tracking', 'in', ['sale','line'])], - 'invisible':[('field_service_tracking', 'in', ['no','recurring'])]} - - From 45cc1419f709d74cc5178e7f734eefd13c18894c Mon Sep 17 00:00:00 2001 From: hparfr Date: Wed, 23 Feb 2022 16:13:15 +0100 Subject: [PATCH 23/59] [FIX] fieldservice_sale_recurring fix test --- .../tests/test_fsm_sale_recurring.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py index 4e382f5393..b69f6bac72 100644 --- a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py +++ b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py @@ -13,6 +13,15 @@ def setUpClass(cls): # Setup products that when sold will create some FSM orders cls.setUpFSMProducts() + cls.partner_customer_usd = cls.env["res.partner"].create( + { + "name": "partner_a", + "company_id": False, + } + ) + cls.pricelist_usd = cls.env["product.pricelist"].search( + [("currency_id.name", "=", "USD")], limit=1 + ) SaleOrder = cls.env["sale.order"].with_context(tracking_disable=True) From b17cd8f562e1243a25f065151c96eb5cc4d04ac9 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 8 Mar 2022 09:10:53 +0000 Subject: [PATCH 24/59] [UPD] Update fieldservice_sale_recurring.pot --- .../i18n/fieldservice_sale_recurring.pot | 59 +++++++++++-------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot index 591527f2fa..7f9a6fda8c 100644 --- a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot +++ b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * fieldservice_sale_recurring +# * fieldservice_sale_recurring # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,24 +19,15 @@ msgid "Sale Orders" msgstr "" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring msgid "Create a recurring order" msgstr "" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order" -msgstr "" - -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order line" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "Determines what happens upon sale order confirmation:\n" +msgid "" +"Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" " - Per Sale Order: One FSM Order will be created for the sale.\n" " - Per Sale Order Line: One FSM Order for each sale order line\n" @@ -44,8 +35,11 @@ msgid "Determines what happens upon sale order confirmation:\n" msgstr "" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Don't create FSM order" +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__display_name +msgid "Display Name" msgstr "" #. module: fieldservice_sale_recurring @@ -77,13 +71,30 @@ msgid "Field Service Tracking" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "Field Service recurring Created (%s): %s\n" " " msgstr "" +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__id +msgid "ID" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line____last_update +msgid "Last Modified on" +msgstr "" + #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template msgid "Product Template" @@ -106,7 +117,7 @@ msgstr "" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order -msgid "Sale Order" +msgid "Sales Order" msgstr "" #. module: fieldservice_sale_recurring @@ -115,7 +126,7 @@ msgid "Sales Order Line" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 #, python-format msgid "Sales Orders" msgstr "" @@ -127,10 +138,10 @@ msgid "Select a field service recurring order template to be created" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "This recurring has been created from: %s (%s)\n" " " msgstr "" - From f350f8c6524f30e262003b8aa245fef1a19d434e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 8 Mar 2022 09:18:18 +0000 Subject: [PATCH 25/59] [UPD] README.rst --- fieldservice_sale_recurring/README.rst | 12 ++++++------ .../static/description/index.html | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fieldservice_sale_recurring/README.rst b/fieldservice_sale_recurring/README.rst index 528d3e891a..5457172b52 100644 --- a/fieldservice_sale_recurring/README.rst +++ b/fieldservice_sale_recurring/README.rst @@ -14,13 +14,13 @@ Field Service - Sales - Recurring :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github - :target: https://github.com/OCA/field-service/tree/12.0/fieldservice_sale_recurring + :target: https://github.com/OCA/field-service/tree/14.0/fieldservice_sale_recurring :alt: OCA/field-service .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_sale_recurring + :target: https://translation.odoo-community.org/projects/field-service-14-0/field-service-14-0-fieldservice_sale_recurring :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/264/12.0 + :target: https://runbot.odoo-community.org/runbot/264/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -38,7 +38,7 @@ Installation To install Field Service and have the mapping features, you need to install GeoEngine. Please refer to the installation instructions available at: -https://github.com/OCA/geospatial/tree/12.0/base_geoengine +https://github.com/OCA/geospatial/tree/13.0/base_geoengine Configuration ============= @@ -74,7 +74,7 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -126,6 +126,6 @@ Current `maintainers `__: |maintainer-wolfhall| |maintainer-max3903| |maintainer-brian10048| -This module is part of the `OCA/field-service `_ project on GitHub. +This module is part of the `OCA/field-service `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_sale_recurring/static/description/index.html b/fieldservice_sale_recurring/static/description/index.html index 54bb133896..a39742781d 100644 --- a/fieldservice_sale_recurring/static/description/index.html +++ b/fieldservice_sale_recurring/static/description/index.html @@ -367,7 +367,7 @@

Field Service - Sales - Recurring

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

This module allows you to sell recurring field services.

Table of contents

@@ -389,7 +389,7 @@

Field Service - Sales - Recurring

Installation

To install Field Service and have the mapping features, you need to install GeoEngine.

Please refer to the installation instructions available at: -https://github.com/OCA/geospatial/tree/12.0/base_geoengine

+https://github.com/OCA/geospatial/tree/13.0/base_geoengine

Configuration

@@ -427,7 +427,7 @@

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 smashing it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -461,7 +461,7 @@

Maintainers

promote its widespread use.

Current maintainers:

wolfhall max3903 brian10048

-

This module is part of the OCA/field-service project on GitHub.

+

This module is part of the OCA/field-service project on GitHub.

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

From b9e5cb36c54e8ab03a6e00e801ef0379d5ea6637 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Thu, 24 Mar 2022 19:32:23 +0000 Subject: [PATCH 26/59] Added translation using Weblate (Spanish (Argentina)) --- fieldservice_sale_recurring/i18n/es_AR.po | 165 ++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/es_AR.po diff --git a/fieldservice_sale_recurring/i18n/es_AR.po b/fieldservice_sale_recurring/i18n/es_AR.po new file mode 100644 index 0000000000..888bc07cc2 --- /dev/null +++ b/fieldservice_sale_recurring/i18n/es_AR.po @@ -0,0 +1,165 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-03-24 22:17+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\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.3.2\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Pedidos de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring +msgid "Create a recurring order" +msgstr "Crear un pedido recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "" +"Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" +"Determina qué sucede tras la confirmación del pedido de venta:\n" +" - Ninguno: nada adicional, comportamiento predeterminado.\n" +" - Por orden de venta: se creará un pedido de FSM para la " +"venta.\n" +" - Por línea de orden de venta: un pedido de FSM para cada " +"línea de pedido de venta\n" +" se creará." + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "Pedidos FSM Recurrentes" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" +"Pedido Recurrente de Servicio de Campo generado por línea de pedido de venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "Plantilla de Servicio de Campo Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "Pedidos de Servicio de Campo Recurrente asociados a esta venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "Rastreo de Servicio de Campo" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 +#, python-format +msgid "" +"Field Service recurring Created (%s): %s\n" +" " +msgstr "" +"Servicio de Campo recurrente Creado (%s): %s\n" +" " + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__id +msgid "ID" +msgstr "ID" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "Plantilla del Producto" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "Pedido Recurrente de Servicio de Campo" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "Pedido Recurrente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Línea de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sales Order" +msgstr "Pedidos de Venta" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de Pedido de Venta" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 +#, python-format +msgid "Sales Orders" +msgstr "Pedidos de Ventas" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" +"Seleccione una plantilla de servicio de campo recurrente para ser creada" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 +#, python-format +msgid "" +"This recurring has been created from: %s (%s)\n" +" " +msgstr "" +"Esta recurrencia ha sido creada desde: %s (%s)\n" +" " From 96367adf2221f0f712a79e16f7be41e02373102e Mon Sep 17 00:00:00 2001 From: Hpar Date: Mon, 18 Jul 2022 14:29:46 +0000 Subject: [PATCH 27/59] Added translation using Weblate (French) --- fieldservice_sale_recurring/i18n/fr.po | 150 +++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 fieldservice_sale_recurring/i18n/fr.po diff --git a/fieldservice_sale_recurring/i18n/fr.po b/fieldservice_sale_recurring/i18n/fr.po new file mode 100644 index 0000000000..06e9008c4c --- /dev/null +++ b/fieldservice_sale_recurring/i18n/fr.po @@ -0,0 +1,150 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_sale_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-07-18 17:06+0000\n" +"Last-Translator: Hpar \n" +"Language-Team: none\n" +"Language: fr\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.3.2\n" + +#. module: fieldservice_sale_recurring +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale +msgid "Sale Orders" +msgstr "Ventes" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring +msgid "Create a recurring order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "" +"Determines what happens upon sale order confirmation:\n" +" - None: nothing additional, default behavior.\n" +" - Per Sale Order: One FSM Order will be created for the sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order line\n" +" will be created." +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__display_name +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__display_name +msgid "Display Name" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count +#: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice +msgid "FSM Recurring Orders" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Field Service Recurring Order generated by the sale order line" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Field Service Recurring Template" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids +msgid "Field Service Recurring orders associated to this sale" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking +msgid "Field Service Tracking" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 +#, python-format +msgid "" +"Field Service recurring Created (%s): %s\n" +" " +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__id +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__id +msgid "ID" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order____last_update +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_product_template +msgid "Product Template" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_fsm_recurring +msgid "Recurring Field Service Order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id +msgid "Recurring Order" +msgstr "" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__sale_line_id +msgid "Sale Line" +msgstr "Ligne de vente" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order +msgid "Sales Order" +msgstr "Vente" + +#. module: fieldservice_sale_recurring +#: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line +msgid "Sales Order Line" +msgstr "Ligne de vente" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 +#, python-format +msgid "Sales Orders" +msgstr "Vente" + +#. module: fieldservice_sale_recurring +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id +#: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id +msgid "Select a field service recurring order template to be created" +msgstr "" + +#. module: fieldservice_sale_recurring +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 +#, python-format +msgid "" +"This recurring has been created from: %s (%s)\n" +" " +msgstr "" From d1d62ec117687650733d8dbccd353f2fc2e894ab Mon Sep 17 00:00:00 2001 From: Freni-OSI Date: Thu, 3 Nov 2022 18:33:46 +0530 Subject: [PATCH 28/59] [MIG]fieldservice_sale_recurring --- fieldservice_sale_recurring/__manifest__.py | 2 +- .../models/product_template.py | 2 +- .../models/sale_order_line.py | 22 ++-- .../tests/test_fsm_sale_recurring.py | 108 +++++++++++++++--- 4 files changed, 104 insertions(+), 30 deletions(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index 4f17b682b7..fed3e05028 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Field Service - Sales - Recurring", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "summary": "Sell recurring field services.", "category": "Field Service", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/fieldservice_sale_recurring/models/product_template.py b/fieldservice_sale_recurring/models/product_template.py index 3f5a82df9f..210ca24331 100644 --- a/fieldservice_sale_recurring/models/product_template.py +++ b/fieldservice_sale_recurring/models/product_template.py @@ -22,4 +22,4 @@ def _onchange_field_service_tracking(self): if self.field_service_tracking != "recurring": self.fsm_recurring_template_id = False else: - super()._onchange_field_service_tracking() + return super()._onchange_field_service_tracking() diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index 017c365aa5..f15e5e00d3 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -48,23 +48,19 @@ def _field_create_fsm_recurring(self): fsm_recurring.action_start() so_line.write({"fsm_recurring_id": fsm_recurring.id}) # post message on SO - msg_body = ( - _( - """Field Service recurring Created (%s): %s + msg_body = _( + """Field Service recurring Created ({}): {} """ - ) - % (so_line.product_id.name, fsm_recurring.id, fsm_recurring.name) - ) + ).format(so_line.product_id.name, fsm_recurring.id, fsm_recurring.name) so_line.order_id.message_post(body=msg_body) # post message on fsm_recurring - fsm_recurring_msg = ( - _( - """This recurring has been created from: %s (%s) + fsm_recurring_msg = _( + """This recurring has been created from: {} ({}) """ - ) - % (so_line.order_id.id, so_line.order_id.name, so_line.product_id.name) + ).format( + so_line.order_id.id, so_line.order_id.name, so_line.product_id.name ) fsm_recurring.message_post(body=fsm_recurring_msg) result[so_line.id] = fsm_recurring diff --git a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py index b69f6bac72..f3ec9f35dd 100644 --- a/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py +++ b/fieldservice_sale_recurring/tests/test_fsm_sale_recurring.py @@ -32,22 +32,20 @@ def setUpClass(cls): "pricelist_id": cls.pricelist_usd.id, } ) - cls.sale_line_recurring = cls.env["sale.order.line"].create( + cls.sale_order_recur2 = SaleOrder.create( { - "name": cls.product_fsm_recur.name, - "product_id": cls.product_fsm_recur.id, - "product_uom_qty": 1, - "product_uom": cls.product_fsm_recur.uom_id.id, - "price_unit": cls.product_fsm_recur.list_price, - "order_id": cls.sale_order_recur.id, - "tax_id": False, + "partner_id": cls.partner_customer_usd.id, + "fsm_location_id": cls.test_location.id, + "pricelist_id": cls.pricelist_usd.id, + } + ) + cls.sale_order = SaleOrder.create( + { + "partner_id": cls.partner_customer_usd.id, + "fsm_location_id": cls.test_location.id, + "pricelist_id": cls.pricelist_usd.id, } ) - - @classmethod - def setUpFSMProducts(cls): - super(TestFSMSaleRecurring, cls).setUpFSMProducts() - # Product that creates FSM Recurring Order cls.product_fsm_recur = cls.env["product.product"].create( { @@ -65,6 +63,79 @@ def setUpFSMProducts(cls): ).id, } ) + cls.product_fsm_recur2 = cls.env["product.product"].create( + { + "name": "FSM Recurring Order Product Test", + "categ_id": cls.env.ref("product.product_category_3").id, + "standard_price": 425.0, + "list_price": 500.0, + "type": "service", + "uom_id": cls.env.ref("uom.product_uom_unit").id, + "uom_po_id": cls.env.ref("uom.product_uom_unit").id, + "invoice_policy": "order", + "field_service_tracking": "recurring", + "fsm_recurring_template_id": cls.env.ref( + "fieldservice_recurring.recur_template_weekdays" + ).id, + } + ) + cls.product_fsm = cls.env["product.product"].create( + { + "name": "FSM Order Product", + "categ_id": cls.env.ref("product.product_category_3").id, + "standard_price": 425.0, + "list_price": 500.0, + "type": "service", + "uom_id": cls.env.ref("uom.product_uom_unit").id, + "uom_po_id": cls.env.ref("uom.product_uom_unit").id, + "invoice_policy": "order", + "field_service_tracking": "no", + } + ) + cls.sale_line_recurring = cls.env["sale.order.line"].create( + { + "name": cls.product_fsm_recur.name, + "product_id": cls.product_fsm_recur.id, + "product_uom_qty": 1, + "product_uom": cls.product_fsm_recur.uom_id.id, + "price_unit": cls.product_fsm_recur.list_price, + "order_id": cls.sale_order_recur.id, + "tax_id": False, + } + ) + cls.sale_line_recurring2 = cls.env["sale.order.line"].create( + { + "name": cls.product_fsm_recur2.name, + "product_id": cls.product_fsm_recur2.id, + "product_uom_qty": 1, + "product_uom": cls.product_fsm_recur2.uom_id.id, + "price_unit": cls.product_fsm_recur2.list_price, + "order_id": cls.sale_order_recur2.id, + "tax_id": False, + } + ) + cls.sale_line_recurring3 = cls.env["sale.order.line"].create( + { + "name": cls.product_fsm_recur.name, + "product_id": cls.product_fsm_recur.id, + "product_uom_qty": 1, + "product_uom": cls.product_fsm_recur.uom_id.id, + "price_unit": cls.product_fsm_recur.list_price, + "order_id": cls.sale_order_recur2.id, + "tax_id": False, + } + ) + cls.sale_line_recurring4 = cls.env["sale.order.line"].create( + { + "name": cls.product_fsm.name, + "product_id": cls.product_fsm.id, + "product_uom_qty": 1, + "product_uom": cls.product_fsm.uom_id.id, + "price_unit": cls.product_fsm.list_price, + "order_id": cls.sale_order.id, + "tax_id": False, + } + ) def test_fsm_sale_order_recurring(self): """Test the flow for a Sale Order that will generate @@ -73,10 +144,11 @@ def test_fsm_sale_order_recurring(self): sol_recur = self.sale_line_recurring # Confirm the sale order that was setup self.sale_order_recur.action_confirm() + self.sale_order_recur2.action_confirm() + self.sale_order.action_confirm() # FSM Recurring Order linked to Sale Order Line - FSM_Recurring = self.env["fsm.recurring"] - count_recurring = FSM_Recurring.search_count( + count_recurring = self.env["fsm.recurring"].search_count( [("id", "=", sol_recur.fsm_recurring_id.id)] ) self.assertEqual( @@ -85,6 +157,12 @@ def test_fsm_sale_order_recurring(self): """FSM Sale Recurring: Recurring Order should be linked to the Sale Order Line""", ) + sol_recur.fsm_recurring_id.action_view_sales() + self.product_fsm.product_tmpl_id._onchange_field_service_tracking() + self.product_fsm_recur.product_tmpl_id._onchange_field_service_tracking() + self.sale_order_recur.action_view_fsm_recurring() + self.sale_order_recur2.action_view_fsm_recurring() + self.sale_order.action_view_fsm_recurring() # FSM Recurring Order linked to Sale Order self.assertEqual( len(self.sale_order_recur.fsm_recurring_ids.ids), From 2dcd90dc3bd6e4a5d6c7422d2a1c6d6eff77aeae Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 8 Nov 2022 16:11:45 +0000 Subject: [PATCH 29/59] [UPD] README.rst --- fieldservice_sale_recurring/README.rst | 10 +++++----- .../static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fieldservice_sale_recurring/README.rst b/fieldservice_sale_recurring/README.rst index 5457172b52..95dd0173cc 100644 --- a/fieldservice_sale_recurring/README.rst +++ b/fieldservice_sale_recurring/README.rst @@ -14,13 +14,13 @@ Field Service - Sales - Recurring :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github - :target: https://github.com/OCA/field-service/tree/14.0/fieldservice_sale_recurring + :target: https://github.com/OCA/field-service/tree/15.0/fieldservice_sale_recurring :alt: OCA/field-service .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/field-service-14-0/field-service-14-0-fieldservice_sale_recurring + :target: https://translation.odoo-community.org/projects/field-service-15-0/field-service-15-0-fieldservice_sale_recurring :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/264/14.0 + :target: https://runbot.odoo-community.org/runbot/264/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -74,7 +74,7 @@ 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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -126,6 +126,6 @@ Current `maintainers `__: |maintainer-wolfhall| |maintainer-max3903| |maintainer-brian10048| -This module is part of the `OCA/field-service `_ project on GitHub. +This module is part of the `OCA/field-service `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_sale_recurring/static/description/index.html b/fieldservice_sale_recurring/static/description/index.html index a39742781d..6b79d871d6 100644 --- a/fieldservice_sale_recurring/static/description/index.html +++ b/fieldservice_sale_recurring/static/description/index.html @@ -367,7 +367,7 @@

Field Service - Sales - Recurring

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

This module allows you to sell recurring field services.

Table of contents

@@ -427,7 +427,7 @@

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 smashing it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -461,7 +461,7 @@

Maintainers

promote its widespread use.

Current maintainers:

wolfhall max3903 brian10048

-

This module is part of the OCA/field-service project on GitHub.

+

This module is part of the OCA/field-service project on GitHub.

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

From 322ba3efdbdc76c7ef3166b85695739b27784a1e Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 8 Nov 2022 16:16:13 +0000 Subject: [PATCH 30/59] [UPD] Update fieldservice_sale_recurring.pot --- .../i18n/fieldservice_sale_recurring.pot | 32 +++---------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot index 7f9a6fda8c..4556b37575 100644 --- a/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot +++ b/fieldservice_sale_recurring/i18n/fieldservice_sale_recurring.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -34,14 +34,6 @@ msgid "" " will be created." msgstr "" -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__display_name -msgid "Display Name" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -74,27 +66,11 @@ msgstr "" #: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format msgid "" -"Field Service recurring Created (%s): %s\n" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__id -msgid "ID" -msgstr "" - -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line____last_update -msgid "Last Modified on" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template msgid "Product Template" @@ -142,6 +118,6 @@ msgstr "" #, python-format msgid "" "This recurring has been created from: %s (%s)\n" +" # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" From 82c25fa1b1f6bf97a45367acb78b8a2a1dd4ce9d Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 8 Nov 2022 16:27:19 +0000 Subject: [PATCH 31/59] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: field-service-15.0/field-service-15.0-fieldservice_sale_recurring Translate-URL: https://translation.odoo-community.org/projects/field-service-15-0/field-service-15-0-fieldservice_sale_recurring/ --- fieldservice_sale_recurring/i18n/de.po | 41 +++++------ fieldservice_sale_recurring/i18n/es.po | 86 ++++++++++++++--------- fieldservice_sale_recurring/i18n/es_AR.po | 71 ++++++++++--------- fieldservice_sale_recurring/i18n/es_CL.po | 86 ++++++++++++++--------- fieldservice_sale_recurring/i18n/fr.po | 36 ++-------- fieldservice_sale_recurring/i18n/it.po | 86 ++++++++++++++--------- fieldservice_sale_recurring/i18n/pt_BR.po | 86 ++++++++++++++--------- 7 files changed, 263 insertions(+), 229 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/de.po b/fieldservice_sale_recurring/i18n/de.po index 216ca199f3..1d42ba0749 100644 --- a/fieldservice_sale_recurring/i18n/de.po +++ b/fieldservice_sale_recurring/i18n/de.po @@ -22,21 +22,10 @@ msgid "Sale Orders" msgstr "Verkaufsaufträge" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring msgid "Create a recurring order" msgstr "Wiederkehrenden Auftrag erstellen" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -#, fuzzy -msgid "Create one FSM order per sale order" -msgstr "Wiederkehrenden Auftrag erstellen" - -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order line" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking @@ -50,11 +39,6 @@ msgid "" " will be created." msgstr "" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Don't create FSM order" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -84,11 +68,11 @@ msgid "Field Service Tracking" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format msgid "" -"Field Service recurring Created (%s): %s\n" +"Field Service recurring Created ({}): {}\n" " " msgstr "" @@ -114,8 +98,8 @@ msgstr "Auftragszeile" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order -msgid "Sale Order" -msgstr "Verkaufsauftrag" +msgid "Sales Order" +msgstr "" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -123,7 +107,7 @@ msgid "Sales Order Line" msgstr "Auftragszeile" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 #, python-format msgid "Sales Orders" msgstr "Verkaufsaufträge" @@ -135,13 +119,20 @@ msgid "Select a field service recurring order template to be created" msgstr "" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format msgid "" "This recurring has been created from: %s (%s)\n" +" # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" +#, fuzzy +#~ msgid "Create one FSM order per sale order" +#~ msgstr "Wiederkehrenden Auftrag erstellen" + +#~ msgid "Sale Order" +#~ msgstr "Verkaufsauftrag" + #~ msgid "Create a single order" #~ msgstr "Auftrag erstellen" diff --git a/fieldservice_sale_recurring/i18n/es.po b/fieldservice_sale_recurring/i18n/es.po index 91b83056de..3198c378b1 100644 --- a/fieldservice_sale_recurring/i18n/es.po +++ b/fieldservice_sale_recurring/i18n/es.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * fieldservice_sale_recurring +# * fieldservice_sale_recurring # msgid "" msgstr "" @@ -22,27 +22,20 @@ msgid "Sale Orders" msgstr "Pedidos de Venta" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring msgid "Create a recurring order" msgstr "Crear un pedido recurrente" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order" -msgstr "Crear un FSM por pedido de venta" - -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order line" -msgstr "Crear un pedido de FSM por líneas de pedido" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "Determines what happens upon sale order confirmation:\n" +msgid "" +"Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" -" - Per Sale Order: One FSM Order will be created for the sale.\n" -" - Per Sale Order Line: One FSM Order for each sale order line\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" " will be created." msgstr "" "Determina qué ocurre en una confirmación de pedido de venta:\n" @@ -53,11 +46,6 @@ msgstr "" "línea de pedido\n" " se creará." -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Don't create FSM order" -msgstr "No crear pedido de FSM" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -89,15 +77,13 @@ msgid "Field Service Tracking" msgstr "Seguimiento de Servicio de Campo" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "Field Service recurring Created (%s): %s\n" +msgid "" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -"Servicio de Campo recurrente Creado (%s): %s\n" -" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -121,8 +107,8 @@ msgstr "Línea de Venta" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order -msgid "Sale Order" -msgstr "Pedido de Venta" +msgid "Sales Order" +msgstr "" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -130,7 +116,7 @@ msgid "Sales Order Line" msgstr "Línea de Pedido de Venta" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 #, python-format msgid "Sales Orders" msgstr "Pedidos de Venta" @@ -143,12 +129,42 @@ msgstr "" "Seleccione una plantilla de pedido recurrente de servicio de campo para crear" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "This recurring has been created from: %s (%s)\n" +msgid "" +"This recurring has been created from: {} ({})\n" " " msgstr "" -"Esta recurrencia ha sido creado a partir de: %s (%s)\n" -" " + +#~ msgid "Create one FSM order per sale order" +#~ msgstr "Crear un FSM por pedido de venta" + +#~ msgid "Create one FSM order per sale order line" +#~ msgstr "Crear un pedido de FSM por líneas de pedido" + +#~ msgid "Don't create FSM order" +#~ msgstr "No crear pedido de FSM" + +#, python-format +#~ msgid "" +#~ "Field Service recurring Created (%s): %s\n" +#~ " " +#~ msgstr "" +#~ "Servicio de Campo recurrente Creado (%s): %s\n" +#~ " " + +#~ msgid "Sale Order" +#~ msgstr "Pedido de Venta" + +#, python-format +#~ msgid "" +#~ "This recurring has been created from: %s (%s)\n" +#~ " " +#~ msgstr "" +#~ "Esta recurrencia ha sido creado a partir de: %s (%s)\n" +#~ " " diff --git a/fieldservice_sale_recurring/i18n/es_AR.po b/fieldservice_sale_recurring/i18n/es_AR.po index 888bc07cc2..e802185961 100644 --- a/fieldservice_sale_recurring/i18n/es_AR.po +++ b/fieldservice_sale_recurring/i18n/es_AR.po @@ -32,8 +32,10 @@ msgstr "Crear un pedido recurrente" msgid "" "Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" -" - Per Sale Order: One FSM Order will be created for the sale.\n" -" - Per Sale Order Line: One FSM Order for each sale order line\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" " will be created." msgstr "" "Determina qué sucede tras la confirmación del pedido de venta:\n" @@ -44,14 +46,6 @@ msgstr "" "línea de pedido de venta\n" " se creará." -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__display_name -msgid "Display Name" -msgstr "Mostrar Nombre" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -85,29 +79,10 @@ msgstr "Rastreo de Servicio de Campo" #: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format msgid "" -"Field Service recurring Created (%s): %s\n" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -"Servicio de Campo recurrente Creado (%s): %s\n" -" " - -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__id -msgid "ID" -msgstr "ID" - -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line____last_update -msgid "Last Modified on" -msgstr "Última Modificación el" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -157,9 +132,35 @@ msgstr "" #, python-format msgid "" "This recurring has been created from: %s (%s)\n" +" # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" -"Esta recurrencia ha sido creada desde: %s (%s)\n" -" " + +#~ msgid "Display Name" +#~ msgstr "Mostrar Nombre" + +#, python-format +#~ msgid "" +#~ "Field Service recurring Created (%s): %s\n" +#~ " " +#~ msgstr "" +#~ "Servicio de Campo recurrente Creado (%s): %s\n" +#~ " " + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" + +#, python-format +#~ msgid "" +#~ "This recurring has been created from: %s (%s)\n" +#~ " " +#~ msgstr "" +#~ "Esta recurrencia ha sido creada desde: %s (%s)\n" +#~ " " diff --git a/fieldservice_sale_recurring/i18n/es_CL.po b/fieldservice_sale_recurring/i18n/es_CL.po index fead49bd04..206a95125c 100644 --- a/fieldservice_sale_recurring/i18n/es_CL.po +++ b/fieldservice_sale_recurring/i18n/es_CL.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * fieldservice_sale_recurring +# * fieldservice_sale_recurring # msgid "" msgstr "" @@ -22,27 +22,20 @@ msgid "Sale Orders" msgstr "Pedidos de Venta" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring msgid "Create a recurring order" msgstr "Crear un pedido recurrente" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order" -msgstr "Crear un FSM por pedido de venta" - -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order line" -msgstr "Crear un pedido de FSM por líneas de pedido" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "Determines what happens upon sale order confirmation:\n" +msgid "" +"Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" -" - Per Sale Order: One FSM Order will be created for the sale.\n" -" - Per Sale Order Line: One FSM Order for each sale order line\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" " will be created." msgstr "" "Determina qué ocurre en una confirmación de pedido de venta:\n" @@ -53,11 +46,6 @@ msgstr "" "línea de pedido\n" " se creará." -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Don't create FSM order" -msgstr "No crear pedido de FSM" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -89,15 +77,13 @@ msgid "Field Service Tracking" msgstr "Seguimiento de Servicio de Campo" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "Field Service recurring Created (%s): %s\n" +msgid "" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -"Servicio de Campo recurrente Creado (%s): %s\n" -" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -121,8 +107,8 @@ msgstr "Línea de Venta" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order -msgid "Sale Order" -msgstr "Pedido de Venta" +msgid "Sales Order" +msgstr "" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -130,7 +116,7 @@ msgid "Sales Order Line" msgstr "Línea de Pedido de Venta" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 #, python-format msgid "Sales Orders" msgstr "Pedidos de Venta" @@ -143,12 +129,42 @@ msgstr "" "Seleccione una plantilla de pedido recurrente de servicio de campo para crear" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "This recurring has been created from: %s (%s)\n" +msgid "" +"This recurring has been created from: {} ({})\n" " " msgstr "" -"Esta recurrencia ha sido creado a partir de: %s (%s)\n" -" " + +#~ msgid "Create one FSM order per sale order" +#~ msgstr "Crear un FSM por pedido de venta" + +#~ msgid "Create one FSM order per sale order line" +#~ msgstr "Crear un pedido de FSM por líneas de pedido" + +#~ msgid "Don't create FSM order" +#~ msgstr "No crear pedido de FSM" + +#, python-format +#~ msgid "" +#~ "Field Service recurring Created (%s): %s\n" +#~ " " +#~ msgstr "" +#~ "Servicio de Campo recurrente Creado (%s): %s\n" +#~ " " + +#~ msgid "Sale Order" +#~ msgstr "Pedido de Venta" + +#, python-format +#~ msgid "" +#~ "This recurring has been created from: %s (%s)\n" +#~ " " +#~ msgstr "" +#~ "Esta recurrencia ha sido creado a partir de: %s (%s)\n" +#~ " " diff --git a/fieldservice_sale_recurring/i18n/fr.po b/fieldservice_sale_recurring/i18n/fr.po index 06e9008c4c..c20847b56a 100644 --- a/fieldservice_sale_recurring/i18n/fr.po +++ b/fieldservice_sale_recurring/i18n/fr.po @@ -32,19 +32,13 @@ msgstr "" msgid "" "Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" -" - Per Sale Order: One FSM Order will be created for the sale.\n" -" - Per Sale Order Line: One FSM Order for each sale order line\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" " will be created." msgstr "" -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__display_name -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__display_name -msgid "Display Name" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -77,27 +71,11 @@ msgstr "" #: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format msgid "" -"Field Service recurring Created (%s): %s\n" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__id -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line__id -msgid "ID" -msgstr "" - -#. module: fieldservice_sale_recurring -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_fsm_recurring____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order____last_update -#: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order_line____last_update -msgid "Last Modified on" -msgstr "" - #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template msgid "Product Template" @@ -145,6 +123,6 @@ msgstr "" #, python-format msgid "" "This recurring has been created from: %s (%s)\n" +" # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" diff --git a/fieldservice_sale_recurring/i18n/it.po b/fieldservice_sale_recurring/i18n/it.po index f08c4ff98d..8cd5f00426 100644 --- a/fieldservice_sale_recurring/i18n/it.po +++ b/fieldservice_sale_recurring/i18n/it.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * fieldservice_sale_recurring +# * fieldservice_sale_recurring # msgid "" msgstr "" @@ -22,27 +22,20 @@ msgid "Sale Orders" msgstr "Ordini di vendita" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring msgid "Create a recurring order" msgstr "Crea un ordine ricorrente" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order" -msgstr "Crea un ordine FSM per ordine di vendita" - -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order line" -msgstr "Crea un ordine FSM per riga ordine di vendita" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "Determines what happens upon sale order confirmation:\n" +msgid "" +"Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" -" - Per Sale Order: One FSM Order will be created for the sale.\n" -" - Per Sale Order Line: One FSM Order for each sale order line\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" " will be created." msgstr "" "Definisce cosa accade alla conferma di un ordine di vendita:\n" @@ -52,11 +45,6 @@ msgstr "" " - Per riga ordine di vendita: viene generato un ordine FSM " "per ogni riga ordine di vendita." -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Don't create FSM order" -msgstr "Non creare ordine FSM" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -87,15 +75,13 @@ msgid "Field Service Tracking" msgstr "Tracciamento assistenza sul campo" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "Field Service recurring Created (%s): %s\n" +msgid "" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -"Creata assistenza sul campo ricorrente (%s): %s\n" -" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -119,8 +105,8 @@ msgstr "Riga di vendita" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order -msgid "Sale Order" -msgstr "Ordine di vendita" +msgid "Sales Order" +msgstr "" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -128,7 +114,7 @@ msgid "Sales Order Line" msgstr "Riga ordine di vendita" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 #, python-format msgid "Sales Orders" msgstr "Ordini di vendita" @@ -140,12 +126,42 @@ msgid "Select a field service recurring order template to be created" msgstr "Seleziona un modello ordine assistenza sul camp ricorrente da creare" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "This recurring has been created from: %s (%s)\n" +msgid "" +"This recurring has been created from: {} ({})\n" " " msgstr "" -"Questo ordine ricorrente è stato creato da: %s (%s)\n" -" " + +#~ msgid "Create one FSM order per sale order" +#~ msgstr "Crea un ordine FSM per ordine di vendita" + +#~ msgid "Create one FSM order per sale order line" +#~ msgstr "Crea un ordine FSM per riga ordine di vendita" + +#~ msgid "Don't create FSM order" +#~ msgstr "Non creare ordine FSM" + +#, python-format +#~ msgid "" +#~ "Field Service recurring Created (%s): %s\n" +#~ " " +#~ msgstr "" +#~ "Creata assistenza sul campo ricorrente (%s): %s\n" +#~ " " + +#~ msgid "Sale Order" +#~ msgstr "Ordine di vendita" + +#, python-format +#~ msgid "" +#~ "This recurring has been created from: %s (%s)\n" +#~ " " +#~ msgstr "" +#~ "Questo ordine ricorrente è stato creato da: %s (%s)\n" +#~ " " diff --git a/fieldservice_sale_recurring/i18n/pt_BR.po b/fieldservice_sale_recurring/i18n/pt_BR.po index 3053e6ae64..baf822667c 100644 --- a/fieldservice_sale_recurring/i18n/pt_BR.po +++ b/fieldservice_sale_recurring/i18n/pt_BR.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * fieldservice_sale_recurring +# * fieldservice_sale_recurring # msgid "" msgstr "" @@ -22,27 +22,20 @@ msgid "Sale Orders" msgstr "Pedidos de Venda" #. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 +#: model:ir.model.fields.selection,name:fieldservice_sale_recurring.selection__product_template__field_service_tracking__recurring msgid "Create a recurring order" msgstr "Crie uma ordem recorrente" -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order" -msgstr "Crie um pedido FSM por pedido de venda" - -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Create one FSM order per sale order line" -msgstr "Crie um Pedido FSM por linha de pedido de venda" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__field_service_tracking -msgid "Determines what happens upon sale order confirmation:\n" +msgid "" +"Determines what happens upon sale order confirmation:\n" " - None: nothing additional, default behavior.\n" -" - Per Sale Order: One FSM Order will be created for the sale.\n" -" - Per Sale Order Line: One FSM Order for each sale order line\n" +" - Per Sale Order: One FSM Order will be created for the " +"sale.\n" +" - Per Sale Order Line: One FSM Order for each sale order " +"line\n" " will be created." msgstr "" "Determina o que acontece após a confirmação do pedido de venda:\n" @@ -53,11 +46,6 @@ msgstr "" "para cada linha\n" " de pedido de venda." -#. module: fieldservice_sale_recurring -#: selection:product.template,field_service_tracking:0 -msgid "Don't create FSM order" -msgstr "Não crie ordem FSM" - #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.view_order_form_inherit_sale_fieldservice @@ -88,15 +76,13 @@ msgid "Field Service Tracking" msgstr "Rastreamento de Serviços de Campo" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:49 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "Field Service recurring Created (%s): %s\n" +msgid "" +"Field Service recurring Created ({}): {}\n" " " msgstr "" -"Serviço de campo recorrente criado (%s): %s\n" -" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -120,8 +106,8 @@ msgstr "Linha de Venda" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order -msgid "Sale Order" -msgstr "Pedido de Venda" +msgid "Sales Order" +msgstr "" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -129,7 +115,7 @@ msgid "Sales Order Line" msgstr "Linha de Pedidos de Venda" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:21 +#: code:addons/fieldservice_sale_recurring/models/fsm_recurring.py:0 #, python-format msgid "Sales Orders" msgstr "Pedidos de Vendas" @@ -142,12 +128,42 @@ msgstr "" "Selecione um modelo de ordem de serviço de campo recorrente a ser criado" #. module: fieldservice_sale_recurring -#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:57 +#: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 #, python-format -msgid "This recurring has been created from: %s (%s)\n" +msgid "" +"This recurring has been created from: {} ({})\n" " " msgstr "" -"Esse recurso recorrente foi criado a partir de: %s (%s)\n" -" " + +#~ msgid "Create one FSM order per sale order" +#~ msgstr "Crie um pedido FSM por pedido de venda" + +#~ msgid "Create one FSM order per sale order line" +#~ msgstr "Crie um Pedido FSM por linha de pedido de venda" + +#~ msgid "Don't create FSM order" +#~ msgstr "Não crie ordem FSM" + +#, python-format +#~ msgid "" +#~ "Field Service recurring Created (%s): %s\n" +#~ " " +#~ msgstr "" +#~ "Serviço de campo recorrente criado (%s): %s\n" +#~ " " + +#~ msgid "Sale Order" +#~ msgstr "Pedido de Venda" + +#, python-format +#~ msgid "" +#~ "This recurring has been created from: %s (%s)\n" +#~ " " +#~ msgstr "" +#~ "Esse recurso recorrente foi criado a partir de: %s (%s)\n" +#~ " " From 722a62971901d7e891e3cfcd6e249ba0dba8c4b3 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Sat, 12 Nov 2022 04:35:13 +0000 Subject: [PATCH 32/59] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (18 of 18 strings) Translation: field-service-15.0/field-service-15.0-fieldservice_sale_recurring Translate-URL: https://translation.odoo-community.org/projects/field-service-15-0/field-service-15-0-fieldservice_sale_recurring/es_AR/ --- fieldservice_sale_recurring/i18n/es_AR.po | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/es_AR.po b/fieldservice_sale_recurring/i18n/es_AR.po index e802185961..014668919a 100644 --- a/fieldservice_sale_recurring/i18n/es_AR.po +++ b/fieldservice_sale_recurring/i18n/es_AR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2022-03-24 22:17+0000\n" +"PO-Revision-Date: 2022-11-12 04:46+0000\n" "Last-Translator: Ignacio Buioli \n" "Language-Team: none\n" "Language: es_AR\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3.2\n" +"X-Generator: Weblate 4.14.1\n" #. module: fieldservice_sale_recurring #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale @@ -83,6 +83,9 @@ msgid "" " # data-oe-model=fsm.recurring data-oe-id={}>{}\n" " " msgstr "" +"Servicio de Campo recurrente Creado ({}): {}\n" +" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -135,6 +138,9 @@ msgid "" " # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" +"La recurrencia ha sido creada desde: {} ({})\n" +" " #~ msgid "Display Name" #~ msgstr "Mostrar Nombre" From 06eed846df7c03626bd4c9f153990861383fb889 Mon Sep 17 00:00:00 2001 From: Nils Coenen | NICO SOLUTIONS - ENGINEERING & IT Date: Sat, 3 Dec 2022 13:35:34 +0000 Subject: [PATCH 33/59] Translated using Weblate (German) Currently translated at 100.0% (18 of 18 strings) Translation: field-service-15.0/field-service-15.0-fieldservice_sale_recurring Translate-URL: https://translation.odoo-community.org/projects/field-service-15-0/field-service-15-0-fieldservice_sale_recurring/de/ --- fieldservice_sale_recurring/i18n/de.po | 29 +++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/de.po b/fieldservice_sale_recurring/i18n/de.po index 1d42ba0749..eba755cd52 100644 --- a/fieldservice_sale_recurring/i18n/de.po +++ b/fieldservice_sale_recurring/i18n/de.po @@ -6,15 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2019-11-26 14:27+0000\n" -"Last-Translator: Maria Sparenberg \n" +"PO-Revision-Date: 2022-12-03 15:45+0000\n" +"Last-Translator: Nils Coenen | NICO SOLUTIONS - ENGINEERING & IT \n" "Language-Team: none\n" "Language: de\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 3.8\n" +"X-Generator: Weblate 4.14.1\n" #. module: fieldservice_sale_recurring #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale @@ -38,6 +39,13 @@ msgid "" "line\n" " will be created." msgstr "" +"Legt fest, was bei Auftragsbestätigung passiert:\n" +" - Nichts: nichts Zusätzliches, Standardverhalten.\n" +" - Pro Verkaufsauftrag: Für den Verkauf wird ein FSM-Auftrag " +"erstellt.\n" +" - Pro Verkaufsauftragszeile: Ein FSM-Auftrag für jede " +"Verkaufsauftragszeile\n" +" wird erstellt." #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count @@ -49,6 +57,8 @@ msgstr "Wiederkehrende Service-Aufträge" #: model:ir.model.fields,help:fieldservice_sale_recurring.field_sale_order_line__fsm_recurring_id msgid "Field Service Recurring Order generated by the sale order line" msgstr "" +"Wiederkehrender Field Service-Auftrag, der von der Verkaufsauftragsposition " +"generiert wird" #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__fsm_recurring_template_id @@ -60,12 +70,13 @@ msgstr "Vorlage für wiederkehrenden Service-Auftrag" #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_ids msgid "Field Service Recurring orders associated to this sale" msgstr "" +"Wiederkehrende Field Service Aufträge, die diesem Verkauf zugeordnet sind" #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_product__field_service_tracking #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_product_template__field_service_tracking msgid "Field Service Tracking" -msgstr "" +msgstr "Field Service Verfolgung" #. module: fieldservice_sale_recurring #: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 @@ -75,6 +86,9 @@ msgid "" " # data-oe-model=fsm.recurring data-oe-id={}>{}\n" " " msgstr "" +"Wiederkehrender Field Service Erstellt ({}): {}\n" +" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -99,7 +113,7 @@ msgstr "Auftragszeile" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order msgid "Sales Order" -msgstr "" +msgstr "Verkaufsauftrag" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -117,6 +131,8 @@ msgstr "Verkaufsaufträge" #: model:ir.model.fields,help:fieldservice_sale_recurring.field_product_template__fsm_recurring_template_id msgid "Select a field service recurring order template to be created" msgstr "" +"Wählen Sie eine zu erstellende wiederkehrende Auftragsvorlage für den Field " +"Service aus" #. module: fieldservice_sale_recurring #: code:addons/fieldservice_sale_recurring/models/sale_order_line.py:0 @@ -126,6 +142,9 @@ msgid "" " # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" +"Diese Wiederholung wurde erstellt aus: {} ({})\n" +" " #, fuzzy #~ msgid "Create one FSM order per sale order" From 089c5150202205d9f0ba9d9ebd724cbf933a7860 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 15 Nov 2022 17:19:11 +0000 Subject: [PATCH 34/59] Translated using Weblate (Italian) Currently translated at 100.0% (18 of 18 strings) Translation: field-service-15.0/field-service-15.0-fieldservice_sale_recurring Translate-URL: https://translation.odoo-community.org/projects/field-service-15-0/field-service-15-0-fieldservice_sale_recurring/it/ --- fieldservice_sale_recurring/i18n/it.po | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/fieldservice_sale_recurring/i18n/it.po b/fieldservice_sale_recurring/i18n/it.po index 8cd5f00426..8aa6164c04 100644 --- a/fieldservice_sale_recurring/i18n/it.po +++ b/fieldservice_sale_recurring/i18n/it.po @@ -6,15 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2021-09-26 17:34+0000\n" -"Last-Translator: mymage \n" +"PO-Revision-Date: 2023-01-18 11:48+0000\n" +"Last-Translator: Francesco Foresti \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.3.2\n" +"X-Generator: Weblate 4.14.1\n" #. module: fieldservice_sale_recurring #: model_terms:ir.ui.view,arch_db:fieldservice_sale_recurring.fsm_recurring_form_view_inherit_sale @@ -43,7 +43,8 @@ msgstr "" " - Per ordine di vendita: viene generato un ordine FSM per la " "vendita.\n" " - Per riga ordine di vendita: viene generato un ordine FSM " -"per ogni riga ordine di vendita." +"per ogni riga \n" +" ordine di vendita." #. module: fieldservice_sale_recurring #: model:ir.model.fields,field_description:fieldservice_sale_recurring.field_sale_order__fsm_recurring_count @@ -82,6 +83,9 @@ msgid "" " # data-oe-model=fsm.recurring data-oe-id={}>{}\n" " " msgstr "" +"Creato un servizio sul campo ricorrente ({}): {}\n" +" " #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_product_template @@ -106,7 +110,7 @@ msgstr "Riga di vendita" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order msgid "Sales Order" -msgstr "" +msgstr "Ordine di vendita" #. module: fieldservice_sale_recurring #: model:ir.model,name:fieldservice_sale_recurring.model_sale_order_line @@ -133,6 +137,9 @@ msgid "" " # data-oe-model=sale.order data-oe-id={}>{} ({})\n" " " msgstr "" +"Questo ordine ricorrente è stato creato da: {} ({})\n" +" " #~ msgid "Create one FSM order per sale order" #~ msgstr "Crea un ordine FSM per ordine di vendita" From fa67216db585cba897dcafa80a8f27af6e396418 Mon Sep 17 00:00:00 2001 From: Brian McMaster Date: Tue, 21 Feb 2023 15:58:27 -0500 Subject: [PATCH 35/59] [IMP] fieldservice_sale_recurring Adapt for logic changes in fieldservice_sale --- .../models/sale_order.py | 9 +++++ .../models/sale_order_line.py | 37 ------------------- 2 files changed, 9 insertions(+), 37 deletions(-) diff --git a/fieldservice_sale_recurring/models/sale_order.py b/fieldservice_sale_recurring/models/sale_order.py index 8eaa42daa7..aace966e72 100644 --- a/fieldservice_sale_recurring/models/sale_order.py +++ b/fieldservice_sale_recurring/models/sale_order.py @@ -41,3 +41,12 @@ def action_view_fsm_recurring(self): else: action = {"type": "ir.actions.act_window_close"} return action + + def _action_confirm(self): + """On SO confirmation, some lines generate field service recurrings.""" + result = super(SaleOrder, self)._action_confirm() + self.order_line.filtered( + lambda l: l.product_id.field_service_tracking == "recurring" + and not l.fsm_recurring_id + )._field_create_fsm_recurring() + return result diff --git a/fieldservice_sale_recurring/models/sale_order_line.py b/fieldservice_sale_recurring/models/sale_order_line.py index f15e5e00d3..fb6f930f47 100644 --- a/fieldservice_sale_recurring/models/sale_order_line.py +++ b/fieldservice_sale_recurring/models/sale_order_line.py @@ -65,40 +65,3 @@ def _field_create_fsm_recurring(self): fsm_recurring.message_post(body=fsm_recurring_msg) result[so_line.id] = fsm_recurring return result - - def _field_find_fsm_recurring(self): - """Find the fsm_recurring generated by the so lines. If no - fsm_recurring linked, it will be created automatically. - :return a mapping with the so line id and its linked - fsm_recurring - :rtype dict - """ - # one search for all so lines - fsm_recurrings = self.env["fsm.recurring"].search( - [("sale_line_id", "in", self.ids)] - ) - fsm_recurring_sol_mapping = { - fsm_recurring.sale_line_id.id: fsm_recurring - for fsm_recurring in fsm_recurrings - } - result = {} - for so_line in self: - # If the SO was confirmed, cancelled, set to draft then confirmed, - # avoid creating a new fsm_recurring. - fsm_recurring = fsm_recurring_sol_mapping.get(so_line.id) - # If not found, create one fsm_recurring for the so line - if not fsm_recurring: - fsm_recurring = so_line._field_create_fsm_recurring()[so_line.id] - result[so_line.id] = fsm_recurring - return result - - def _field_service_generation(self): - """For service lines, create the field service order. If it already - exists, it simply links the existing one to the line. - """ - result = super()._field_service_generation() - for so_line in self.filtered( - lambda sol: sol.product_id.field_service_tracking == "recurring" - ): - so_line._field_find_fsm_recurring() - return result From db5058d374bb5ba498fccba6af88df967bc564f4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 24 Feb 2023 13:19:40 +0000 Subject: [PATCH 36/59] fieldservice_sale_recurring 15.0.2.0.0 --- fieldservice_sale_recurring/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fieldservice_sale_recurring/__manifest__.py b/fieldservice_sale_recurring/__manifest__.py index fed3e05028..87e13285f8 100644 --- a/fieldservice_sale_recurring/__manifest__.py +++ b/fieldservice_sale_recurring/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Field Service - Sales - Recurring", - "version": "15.0.1.0.0", + "version": "15.0.2.0.0", "summary": "Sell recurring field services.", "category": "Field Service", "author": "Open Source Integrators, Odoo Community Association (OCA)", From d8da26bdc530bbafd1c7d13b2c4b6d2f68ff8025 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 12:53:52 +0000 Subject: [PATCH 37/59] [UPD] README.rst --- fieldservice_sale_recurring/README.rst | 15 +++--- .../static/description/index.html | 52 ++++++++++--------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/fieldservice_sale_recurring/README.rst b/fieldservice_sale_recurring/README.rst index 95dd0173cc..e520bf90cb 100644 --- a/fieldservice_sale_recurring/README.rst +++ b/fieldservice_sale_recurring/README.rst @@ -2,10 +2,13 @@ Field Service - Sales - Recurring ================================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b9cbb6a0bd7f2fea3b16a49f82b9463fd81a7760d096b0d3102745ac079f731e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Field Service - Sales - Recurring .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/field-service-15-0/field-service-15-0-fieldservice_sale_recurring :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/264/15.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/field-service&target_branch=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module allows you to sell recurring field services. @@ -73,7 +76,7 @@ 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 smashing it by providing a detailed and welcomed +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. diff --git a/fieldservice_sale_recurring/static/description/index.html b/fieldservice_sale_recurring/static/description/index.html index 6b79d871d6..59f95c3135 100644 --- a/fieldservice_sale_recurring/static/description/index.html +++ b/fieldservice_sale_recurring/static/description/index.html @@ -1,20 +1,20 @@ - + - + Field Service - Sales - Recurring - - -
-

Field Service

- - -

- Beta - License: AGPL-3 - OCA/field-service - Translate me on Weblate - Try me on Runbot -

-

This module is the base of the Field Service application in Odoo.

-

Table of contents

-
- -
-
-

Installation

-

- To install Field Service and have the mapping features, you need to install - GeoEngine. -

-

- Please refer to the installation instructions available at: - https://github.com/OCA/geospatial/tree/11.0/base_geoengine -

-
-
-

Configuration

-

To configure this module, you need to:

-
    -
  • Go to Field Service > Configuration > Settings
  • -
-
-
-

Usage

-

To use this module, you need to:

-
    -
  • Go to Field Service
  • -
  • Create or select an order
  • -
  • Follow the process
  • -
-
-
-

Known issues / Roadmap

-

- The roadmap of the Field Service application is documented on - Github. -

-
-
-

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 smashing it by providing a detailed - and welcomed - feedback. -

-

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

-
-
-

Credits

-
-

Authors

-
    -
  • Open Source Integrators
  • -
-
-
-

Contributors

- -
-
-

Other credits

-

The development of this module has been financially supported by:

- -
-
-

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. -

-

- Current - maintainers: -

-

- wolfhall - max3903 -

-

- This module is part of the - OCA/field-service - project on GitHub. -

-

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

-
-
-
- - diff --git a/fieldservice_sale_recurring/static/description/icon.png b/fieldservice_sale_recurring/static/description/icon.png index 955674d8f0b8c47de3ffa9db25cb109fbe4a1091..e3757caa15401e8ed72d8f824c645151bdf8536a 100644 GIT binary patch literal 29789 zcmeFadsxf;{|Elw*0v5?2d%7iB!`7qhjlJX*>WgL+}sh%aYdPm5@lBqop zk~AR*!q4*Yo)1CDdEn0+bqx5I-hU!uz+W01pMN7EXsRXr2N82}`eq2SfM$7nE{Mrm z@$2{R>8Jx-1PaB62*%7uGJlFDT}mdR#VkTHQd5E=V|XY6b{q76I8Gzy==gK>WAdh)C=kT2dJ^imSc+ zLuzjNkcpEm+VrZpB}4%(iPDU^2z^v1{2^4y<@X^a?9z}S z1hOQyd13c4D`_@=Hdpd8W)h3VN;3Dg9=f?Y$UaT2%03YSwCvm3jGQY0+^4NyQafZM z^pK%kB%{j)GdRqAODJ*p)(9d<7BN8`tkOS|*%qYGrN$ip-_SE6acSxvw|4zu#SF78 zB^l+$LsufASx}%ppurz1fH6NPE~_1fFx8){PXydr+P6}I&<&mJkToDpFumFmAPo4g ze*pEU3B5FQ2!+JZG!ED)Yv6a>h~Ep=4*q_2OUYK(wtivlX9xT_i=qZ*`2D+Nll!CL zztXTc9I|ir6{Minp_1lL8#gfXr&m09P^qXpV0j(1bMF=;6tfUqfZxAKVQxbiPtesO z{t=)5`|1Cv@qe=Mf7fBqfc~Fy7-A!bDu)$D_%kZ=!%^GNdV5t@cMDeV?A3KA;tqqm zjD~HnMWC4tXyZSMRp8e3>!W2UKfuxGXi%J5xP4rF&tB1?n3>&DA=xU-8DkaJEyuio zH9psAz)ry~&TU|oOMB%ODvO324~0@{s<-c|d)Yh3n|e?k!CX1}iGQkRjeja{QSx?s zYn4w^fWlxHeWqey0|bbg`Sgt29Zs`kb*A%@C!U9-8-F5F8OLCcs@o@h!nxg9Zshb#mC?7{oZjLCDC2{Jt#_>$p6rUf;Nyus&0r z4%z!&6-VMrzy6ns+4+^W?#x?{mE=kCTv8LlX4V zN9YX<92h?`&RMbh?^d44uS!;4ysT-1d7 zQV0LS-=wWOK-`=IyCu#eCo|#tX`3gZD5ns#&mJxtzO%=|{?-ZDYXPT(>FwUs=hKOx zs70oi^O|Xge$5VjWaIOpOk6z=d$GBt=aAx*L+H{8IF#ta4f%~Wc%?BTS0ZqycAqqa zs2LsG9&?tTJdSrU&frNWJvdPJ`bDBbZ(67|6WhJAL#-XYDA3?#C_cJcMR^uvKdNv_ zJ$Kwb=dZWkmF?}lH$`HpaRjY|A6&Vx(#`#c!j(zi2S2TojEI%~0i*4Rke4{7wv zjTZt|Jyl*%5gi&ybTw}7Cvs3>%QC$g8%s4Xv_m}!BxX94wwJ9}!&RKdk$64mGB2F`Bdq>3d0z)U19mAQ66#w5L)m*POZkg_;!|jX?Ct( z?ujq<3+Bx>hYzc(F=7`=ZL(>$bc_0g1JKDmGDhBKnDh5Wa9*h$A8+}4Y*1*{eQz9; z{f~!Au+hX30|f-pi@^RE$3k-inc&$~I~nPM3J6`D2Yy-IR_R!>Xe5c1+OMvc<-~6N zsW1r2`k7S{nXj6ylrUlyaHyIm^k&yaa*Z{kW&bl3)A;Hm#$f=N)_v}s_3+&0F=}R6 z<8E)HpReJnLKOsZAV3+yVq2F;phes6mJ~uF>O#lw%f|vH_`}Ej-%NzhUt>&pyCkne+*at$nal9WygjE)Qs9~%(UpS zh$I(R9Gd@Ib%z8)uI(S$!?o@H65#ejEwt^7)!|2+Esv}&cJMp=#dT^$S~`t6DvnXW zwe1i5Ru~BzRR2ap2AKz(J`?2PuwAG0opqj3a%tGEOb^uSEg_GrPMZosMupEYh*WWr zZ!*B0KI6y!AYm_6xuzIRENTF6-3(9 zzHaxi%q=R`dE$sflfFQHfORI^&DX=uEpb_8S#s4Xwqu)0LN!?|PG8VP`lDz#P-qP9 zg>|pUKTj?w2eNAUKcog-Fgwb0pI)%Lca1wtWefd*y$>vihFTWbX&VRbIk&0U*XmYd zj7tCAfks#!yzHwDdfGQLO{npy+;lU10@_HGgl9FpXK@~PnvT+2aiCFibF1na?Ldsw z69$mA3D&yA>@n1MOa9+tn7GGA3V|u-@fXv=@@R`_UUi>|{a=G1YcumR&AVuyNyP$K zf$IUv_U9c24mutRy6E~Ux0UwUsQ6bjJV<-wAnP`=j*)$Nw77f|d_W{+q@K1W&b`q} zyU|R~YgP#akfwfd8d!=7wcJ9P(w)<2PduZeqHACpK**7+xkJ{^4gb+K)?M4ayWMW_ zMBy^2EzBn_a)4aGncJfhQ5Nd{?OSVO+MBVZ4YjpK=X$$J+CH?J3w|E0$8G#tYg_QU zYtEv|Z#&Cu&TQX=e|)9Ukd?Oj-Kw-$S3?pz!vn_C;Nkfhj@ftDsMrC0xP&qFUB|?lo?yzfo^w38+A;*dF=X}X+}wu^_mMN{F`Gq-|J!a zyz~j-eLkecpuC%IQKe*L1a59E4WDb8v)t~}kB-b0|IzTIFQaQE8UH}`RfUfNcvH&H z^XRhpZNV8ozu9E8-kYcy?z5$BcS7Dz6_>mQuPv#6PNpgMC7DM*^!_GrcYT<~oL^m! z(%x)8I-xlyK7wNR_-V!JE(==E*ON5y{9_68aly!axNVQcah2e}0+7!5b0zzgPd1!AF)Hy#v8Q8a{yY$$;coLMA|DcV@Oa1u%IG>4_C183!kZ+m~xPhZeBntID zzo&l=GDd{aKTAK{hUocv{!|gyq|l-#{iK?8)^2^SVfN@G3QafmhnLbDv6K%+^x^vPiItc_`3~HQrsZqXwzutC-y=fT zi#GZ35nPf#eqX5AwG*b^nL$U_J-9D`u!pSG=EX)b#0olL zX20+|-#e}Y64@10e?F=4Ymp+?O*{?mZV?& zEbKV&Pm{HseO6NOQRAe{bxu-<>_H32S1}j?;+?SESBi^iyrw(9Q*-!ggRh?Sj0Xf z`o&&N8h(Q8^5oK!b!sTFcpfZ6x+5r{fC`CQ^5<0sqdIP#PcefC^ZJKEBZsn@EZm?- zf&wF27opm0)R0i9U;Gt{kEzeZJewU7b_48;A_jA`e{?GtqU)Z?I+1XnuZ)-eZ^qE2 zy6Ek_y~e^K@Vj!PL#t4{X=+t1^Jdy|MyxJyCurM8kV3(ISE{s^F_Bpt7!B)yEhrl4 z>?#yb-sP!g`pMYv|1ncf`82`p96G~JfQ0VqKijjx(wzv1AeugcPE1LY_&Wo&N}Vf@ zfi)j@guE&w%e?m1y*bc?yKT0eh)?&##ozvcOqm$x{9vyc0WeBtKElc?Bv7Ey?b>)@ zUG1~F$lEm>q$sAlpojE|p-tLt>F)Hu_o9&0F5ct0%$r-+dfyzkVNsSbKEqSpWBqMy zvn};ajnMr{*syV*jK|M$Wah+WrpGo5vf!p0Nw5uKf%8sw7Wme5Ye z{JI_09Q55iJ<1th;BU1DHVuq&FZdTa!a;X~*1tc~?bli_{nl{njpCGL{6s3o;a{Gd zBi4hc2R&MD2yLtGKw(bO`o6%DHbAT)hSEtDYOqjRIyqh;G%0i_WgP1K<*_KcT4jgc zWk^}Uk<}e4xa?cTDy)O!OpB3u4fO=R<7YcHzr`hOUtHh6uoer+4-vQM`bwXKPPC0U z0Cs0^h9j&%64Lxu56dU3SP)$9{OSH^p!O}?T(TK%P7Yb2$O_{f%%zdI#`9*hvJ#NP5Uo_lRGC4qkA zhq#!L_W{-b$%9s<|NaA;7Z(n$?B&%jN8W8J0IyN6U)h+gEn*CPm(z}dTS8MibvG9gOVRgX_j7UJxcb)v; z%CDc@M<#s##>;K|L^Y6F&b5f`t3Xn~vHvn#Wbo1cfHx)==~?+`%#ZpNi&ttyO%w5R zpDT|Ygr#!P2-QnQR;+jGHV#S1>!sc3GP~7HVOwGi14R! zy_4`=b{SN~{mDEFEkzL}V*wQE)bihKgrlDi`W0zD_FS!H6=5-79mB%s!ry_^BuG~L z6~_5s_{UT?71me4@$dh61qt7+(i>L&7nw|y59otGp`8WE{#@-NSz)mGT?8i6Y{?;W z_oA{`mGjau!WbkWcU`Kqo#GOaQZGSLv%W3NO+II>@|bbHgJjLVqVlVC)ds4%Ln4en z?yv$4Xve$Kb^cMRQGbd|oB&CaX&B>2AUk%iAa`Qj1&Hxs%Y@`{Ma5G2$O6jkL zmKqKUbpKofg;MU~!9Dgx0Xz8pdK1o|Mb&7sLiLLQ^_R9}tQ zXK>GbOh}L@(YN6X0QN9ua1Zd0V^AKqf0VU#Qybgpo2P1Hf@gk_msuhP37|PBZ}50e z)Z4e)AGE!f&f!>o0I5;dTKC&OlE_UOlap);HbzpC$Vqk}r@}Y>XMR3>d&oHU%b$fAVh%ePaitG8<;2jk5Gk<68vFGckR@76LY0V_dD7M1FU zkET>{R1%+zBn^tu5bN4ziY`mU^ELI_?Mw=|+ifwEv@549bDmFtduxgk<%t;;+#< zRdjt9hXz zR5DGT5c{NsiyuDEZYk3|tOQLHGtJ(OQG69+?1;sA;VM<5sRVA;5UqyX4Jps$W@rER zA>xyS2Fb|jTW6Mu+&Phb9tpUaus`3Q4hMSft3PcjWUaY8z-{d-uouW4ef@g4RoBwf zQcV5}&c4xl14s(Qg+Y;oO677tO6_suLFFA z$MN^RM~i;Ynh<|>NOTzfX%=KZo?3lw=`l1!o$6Ux&eTd?*5<0> z1DZcP^NlZfUF|cF{l4~YYS_zm+#*g?Z}{$Q zn4<8VBtS6tO>2)t4pLcbI3ICPAmr{6#Bhm;@6>yJf3)QDDKWh?WI#SdLo^~RPAqOu z0H#-S6jApd-Id_aT7`i=OJUG}U5RNcte+~>LwH=FI4+`B*eT1N@dK`6?$wF> zZ&aEaO$~E?!U9?3^dG>#wINu)nSG%c2-EwMnAAVA$Q_<)M-pgHf>xeD&I)tph`nYn zIl8J?wAT!1z#X3DDQo{ROIR+Ru>nqTA1BQdf3N5VN9Yc*DKPJyAgT*yMa8Z~={eFd zm5FEQ`u}{r(^ze>1ygZ8!EfZz0=ZW+vGNsYf0Y#cHMsqNc5Jd6NR6zEDUK=2i zmF5TE+`v)|BM>LV``Y0C*)=uld*#1wmN5e|PAnOeAox}QV3VD9>*X1s%H(|>e_RbD z^?Al?ML)Zho1WmDZS?8iInA-2Vy1jYUX=>Jw<2M<9Q~^ac zcxagFZRw`&5PMNJHJdcG3u?q!QQPqrh{wxsB~DTac=zXjqBee2xicWK;5PhY!P-S; z&&TW1?(3yRv^!YyR;K6#<+j>e-L8%9NT}`Cf^&y|Q zR%Y=lb?+2d%m!`~rEHiB$$?ym`h{nYzT_TtZB9aqE-&gJ#_j87#5(Y60v!L?)dWw> zpg4fzaoV~&v6)y2%XrfaOvmDzQ@^Gj9@i-bw1+cvAUqxJHF4TLX}08j!qhKDu0Xg~ z=YBiXwccTH?%`Q@Fth zwB}Afk>COAb#S7VEOz$Z4C=gstse>AY9SvF_EQZ_81AQV+TIz28PDTyI;(FBnPxes zu?8tTSn!M`h_E?_d`F z=zxclFlI>h0v2gYGu$2JtHEi=1Jm^Ri?p>vZsm}whRR>$rm#AS4)mX`esI6=#P(pTjlUH zCC6fJqFstvRuPqr>aMIbx8I=nBCFGV`iEyx!z-K|TB_HS)|{KpV6=xRX|q?|?#w?! zz5ik_Ep>O#OWq@e-chOg)D6xvBNyR!2E0^NS%D4ztICYT%nGYo^!d=0EVC#CKCrpt zn{;w!mGs_S5100SEMuw0U~B>3bJ$d5VoP2xOf>SieY|D-of8QwziuwC)<(PRX!&!! zU50N8i9y?KDpD)ywK{_JW#t4$C%+f_S%}zvIR&O5yis}e6NlS8%rcw!qPaD^&6njX zg?eM!6hBr9_CL~jUTr2zuThr4VLbQ{XE*#S3NyMwJcnj-A?7 z`(1t>l#m~#EL&Gbmx2`b-f^-mE1sS6Kwh#68CQoa2ofv14b!zfyZ@cdFx&Q$*s7#@ z0wOW71LD$OD<0j=PD?>zl+wLNnh!pApF(RsJGUh4l*0;C`~9cRu14|hv0esWeGtG} zvTi3Q?A4%UBV-4>MfY&lq&ban{9{km37snpUjt`ek;4NI9F*xNu2h1c!=NoRC04Q5 zc>dOhq7YqK&?eyJkSO2zB%a*vA|r1uoyetT(CpdXn+i~`Y)BvdV#N~`seq*bFg>KK zg~U;q;(1D_@E~eI0YCPkh;Hx$`TCjS@>p|8GXo%-G|pYakdjkefU2IoT_pH%w&xJ$ zg}VMJ=w-0{tBq+`2RtXJoD7}w49kL%BbY=4d^3UyH-C73Fd*v9QqOs!_ad#gPPRoJ z0J996#6J-d?0la&?)AVPH$DD2tuD(^={%?7wB z@k`y9E`^$1g8)TgZLtXCt<)qw%s^6R_&yMyo;QGxn zN0*|w^d+80#?wYG*4b%^Rcf#js}f4E1XTz!B$)v#qnnWZ-04M~W{%KV4Wpn1u5J*! zFvRyumV8sZ8bsbktFw2}1X#K$!z>JlC<^!B?5R{uCLrn4*r;|TUNu7= zhuEQ^QD2;pTzY-}CLI7GB0`y)0|RWMeR8xth>&u{3MMKviUgJ;4k#Dc`XG->mGv9d zU@*WGKO^)iE>N@lylgsR6SSVB6P2U{DzMaSkb|mE5bWI#ZK4b1P|C&`82##tyr=hk?QSg;sjY4r6z=-NzTLti}ELVW9 z02gV086%YfGT?u4_cSES6xBs-Daho1PV&G-P0%OE( zT-8-`JI>AD9^*8N z(zWUc*=JX@U8npMs3{HRbNkK1qE>c?5V;Mi@G1JyU`ODSW^X6@ZHr4?nAo*v1Auv) zw*fE@*T#}47?m;8%l}M7ph7^H%pZRh;!l}8k#9Kh8Cx8h#szng{w$IN?)H%v=dIS9 zz?PDUp@S+F_790r1+C~?kJim&JO10dL+fU`V#TX>W1cB))V)p9te%4z>tyU_!D+ca znj$na1ByRi@8sPFTH%X@4*5zgnk5m4z%dP4`5Dm%*C6vts>&mIILZepXjoqB^##k} zfB0HEoq*NM*Bkp=q0fK2)6r`zSBm$ThrZa6Kw78}yhv=~*l2}&#&|v4w?x;i(@`^D z2jnrGiZ-uFLNOag7cPtFQ2XsqSvBYxSj!m}5H)Rcd@MeE%3hb#-kK1VP78>!aLbU+ z(_SM0a0J|Rr;JnYXEU#jO|)i5Jsedn8nuek1VAlRO&`?#_pN3%L5_D2hrTEx&R)kL2e_Rr?T{XPiU6 zHs+ml@WI-3RK`jr<{%djl1>FS`qh$@H_6HMAPY_<*KCx=GNq znMlY~;B1mI0iy1sY30o%+?6(++(k}m$Sy&eQo2Ddw@tegPHU91oa|52N2jKOwD8bm z9^Min1qXK4b&J@PW2hTF^N63c-AosR7o8kaRxl}olRamA=|e=g_f8ETVTw;3!Yi&q zqk@IZ-h~Nl_7cv?^Tb=piZ_bB?iWOOJ-li~+P3^XP``ZA(BvW>1!e9-Q8PEk#k%La z>tFe0$gjdzoxLy?%{5G#=2vn2qszollq_k%?gEn-VTCdwasg!lBbz3k3=lBt<#4=x zNTB2$QvnKmKqxYZ7RUQTnFp72))|$4{Qk`7=r1$Uckhh=yQAy+yNWx_0&A_iJUt&B zPQ#-mj~*kJ86TK3*45>#qc@m6?uW)vWhjh##l;R&2sLIOm z`;(P|7d~(56GstoT4mT3JSR|xRo_7feyvx$asyfD!khZYLF1~aEHatKa0clRuhomj zDwjQwXGe=!OkmW9>{kz}8ejSSqla&*p=dOe{hQ$W`v>K;wnu za@CfZQ-SeWnz#CJK;n*6PqFXkcgOfEutwzSZ}VQets-TMU0dl=(O{mHR7{LXLovlx z9lg$if}c%-nWY+PW|P`@=RJ=(LfIA`CL})#DD$*+Y^+e){@%Z>qQwURQb(jw9xpl_ zR;z#THL}M;X|A+&yOK-SV|nY;QL_5)z;0u#hpKe^d?>KozMAA)21OyA^KHDQL4mb} zR?IDFT}NY~>w25E5p(rdK~=|f0&(uIcwQ+wF>&QAHIbEf+E0w@HEI<=GVq6$8S%D| zOSq`6+Zyv|2_tc}7)~hJiTufd{8Z#8MfRprIKd5UHaRsxZ%DEVux~8n5+SL7=`Xmx!90~Xoo~3IJfhN=y|!l3q~*o7 z83@&!--}6shivsxn60Z_2qZrWg+O9{pZC^8?Hur{A+2GjM}pGLY#8eFPCmY9S+*@v zqN6O1m>yDb?cbRV_g=HmJ?B5$U8{B0c$@8PB4OoRG@gy0NF;v3=P$uda5BxO4}v)*RD|S!4lEKC=M`{-Evrlr6-JhHfG~yujvTGh~*( z->}1I+alXolLUi(7^puqmFr1JexljyVF=MZ9cMiG)#}?~$gvCO$M^aV(fR42V#)WC z$q#ir>_VIn00Q4jTF)wQILeT!4|DM38Xza_gA!o~RyP`Hd!BgW^Y%uJLyTwTQ$?7S z??T)j!{R{fp%$^X5pXU;{RcT*M=L{#?&;d7;$k_wbk{g&9Sy$|Ma8~}TQ8CyK2~%i zMHlK`S0MCozhMjK4KPMSg-MR!ZhirBEI!!jBJr#)60<;1?&J1o*Zel4n;YxuMZh)^ zD{tT`{eb|j??r)7JZQZea8gCX>gsYLcWPKrPjKVX>e*pXD2qy^{Mhl9Ohb$4 zJuDC5uP1!zix^~!Pk?=ZvD(yQro`mlt*&LyK>?+1XnZ8s<>q>ST%H_$`6NJsGG1xR z)lAoM0=zin*bpW{w%3T?IloToP%mQT-jm#WVxzuvhAY%=u2ejes=ZDAe9aimAC?mV z^Tl?Ev8?%6k)w!)&y#ymPGNT+U22^EnY4b-U4thtu)N7^9n6vG3$@vKHRXVGf9-Thz~f^H`}hxo_$}dfJA*w|V^Q;~BKW0am~D|A zDWJC?W6(1&-Ev$n9K+DW^IWm=2jBT&6|-hQxyiw(ehHpic4Z)1>>fRK!x3AS#ckl+ou6bWVmrU$Xygne^ z+cN{33%!0*6s9@>KT=ToNSE$^ero9I_|t-O7kCOVVtNQlL=OFmbt^i# znScutJt%V~ZCxz!ab3$U$i74^;>Hnhq~YxO6;F*_0K_;`@%=yPrGN#q*K&dqZDXIx z;4Bz4Bt;tL24*&aeO)gCSRvMD!c@xh&x?$ML;wtr(Ee-IYdx6&94F^v7*ZK(`BUwq zT4%S+L<5fKDxRpXb1ODoRleD>B^*EwlLkwM@Dj>LvuwASdLMw-zXQnvi*K86r@UH6 z*52JlT3>n0?Y7HBdf^KVr$1PL6_|1#W8+HY3J?G!!D34j3n!8wPQ!=C4RSfa`=5Xz zfYOj?3Sw4^^wQ@KUz<}c*T|j9ax8vp8&ZlE1GV&*#5%Fb37`}K!!+|DS$_Gm`>og~ z`TC$6Li?ON57dgak&9$zIEU>iey>5ze^?wZhq{c{*|bGQaJRPeL%u%;r+5YBANw8u zlUgwM=2^K&)6yzix-jHz_4W|mYYE?21>FIwq8fqMG+{Ue)j1ovph=?*5oiUA#bQMM zUY)?^anr_1Sd_Bd7R;NZQqbHc=&3MepVcqR;cNKdkAHXrq!*aR!DO6Vy#njP!()VQ zaj)Xzh(9<49Ja0HVPscFL>%|4=&K%E-o-jnY6i# zHwWCGq1YC{Aa!z*x^3h2e|dQ9LZ$_*Oj$^gpeHZxs&p#SngE*MHd81WhC(}TC8~xL zwdfF2i~DO+v*exUyIgrENVLd?g*9?rut9#MhYdHc^<1ih2v!9mLHQelCWY&arjr<* zsxp83MdoVfXj}k!uw7ae5nJGtcv=CHRs5&En(ssT5(98qEdH95`_khH<8->JtB(S8 z2m*q*<)S6cJ8+nW*h828)7H6hd7j1ZrEguXk#>r{X46&56E*A_5xIsbrMay{)f`+z zEWoqaBiK8lC@5L%X!IqiJ0OB?>UGeaT-rqJy#3uFEK- z#2QHz(MRu1MaBZ}vZu2opiQ99&Mq(dl`%$7hks!dI@>9JOPck$38T3w6Nt$Z^L4IR z!K@qxc9v^Ao`?5zE;d@Qw>W5Hd1(Zn7O`_3$mf;NSv}In z(HMSibIOx9?&?buG-+SlRmOAtFiohzopdVhfE5`}mhF0aevKI_=QH3Z!Wv>{YTH-s za9fB|VYQ4ZnzLk5R(27}+6?O(jek)C+DBSHEyaJk&q94ni3NNBM;}u82T}r@3uf6O z7MFhX?HQ;0Z5wM_ZP8r|tznGJFI)GQXQCWP}(t_U?gI_jK}+SDm)mYF7Lpo%=!0E+}>77fek$&J9&8y)i3e&kMak*P~lT{qBa@>J0bPbRpAV$~1K6 zdQ+K!QR~a)$VJ<>Pscy=>Y^iBz#Uc#rSM2~BCBBFn}6AI&UtOwnT;jrsJOYPtwFrwQ*>NVr<5NA1*nmzK1(;olcc3}5*#X4$%# zmG&A<~cbJA=@+-l#BW8 zv-Ox=yxfnN<|KVo)UlZQ`g%{rJ|H)o!2oYXIGfD`T=ya3#XQ8QUpH}IuH3^-kN+L) zwB@_aZsYjrzwflQlmrNVZ~tvmu=|TG9UeXBghP0#w@1&t}&#N7potYBaL{jBL@Yetmrn(`*(O zykK#bcp{3fbI(KtaG0XjcRPR?@m45=KXCwW$1>fC6nbp@=wsWKQD#f|DqObDc^`ru z_2DM~WiNl~ftlBN93^AxE7xC;#x62F2^C(B|Mz{xn7V%&C`&N=Id2frSf$$}*#%Ah zmOI**QKJon%hcR7F^)qM<@g!0Yw^=c?_}R6dc@zq^?BDE#wfRw_a`~T#9kJ2zd?oC zpC28*uMp^;%RVf+>?_hQP5e+);9r#EMDqDH=dLGG&0795Q)Pz41p(>$7LD^pg3j%>kPls@Ko?%LGP z7lDTe0O^D1Tzo{E;>lLQz0RL)4##QuiEzT#KC}yZMJ`WuJ%7RPNgYZQa${Tcf1cad znx13@)a)B$cRT?{ON>j{ykA}~d$x9wxovfIbVwOBlSpS|)1}PeXVIh01<>J)ZfBy? z0&i)+Rx$q6F*MxHpd7_c*XU-=i9jfqPLx$mZ1nm!Q6Hib94f6%FM1%e|3w2=+K>_O zJPo4|?K zpST{{MmYhpKdMGR?a!wBo}F_;nmYri-J{@!@2XzR6VQ-8b9^uq?%m>YkMl(ynQ)Zr z+j8N7X7ahcB!HhN?f5F+dNH@L3|-oC69fhyfuVVe10`aPSPVKLsM~ zTCv|?73+|`nqxlQIG_+E+LPlsG5&XK2cn^ILoC1UnrIuj<)$$@g9Xz51f27*G>9Dx zB@^JA&hbN57|+M~2(5JSp-kb?@iWaJ(=kx!l%Dv`!)Na814uwG?q0*vtIKa2onF*B z)=GO9x-`tQo9XgBgdjr7Lh8p9TZzTMkg|cz8j%x{lR)cu zE+|73k78HhD`?2Gi;&cevcm#Cs8t1omNoB7az2+ZijrlRo|@u;_oXb>)&mt&?zo}b z7V1JS#oJ0>uVZCqQ0HHRZk(}*8RMd!nhr9U!5zPw%mL1^Hg!5~y9hsiDR$u~Wcyeo z?i*<~4nfbveaoD!Haeogb<0r_%V`SPTr>Ku5GWSXrrk&Py2oaMv|a4bw4IO!Rb7Z~ z`w=HV0qniW&5fy(4%n_gv3oBcU7eBe#gmJEXbxabPcX>s9`T8(6L@Vo^J-6B6dBw5 zt~r0IOd&d^mWyv3_rMk#)xND<5NEG3lgU3f{oz)hX=H5B^oY$b>R|Oq!+|!=V1RZs zhMyGzIb;6d;{?c@t`TF2LCh5B{`;0S z*KT%pur@v=a}(rZ4NzYKfQvy*3%kb260oK^(Y=V(2GS<=V%Do6=8q(N0t_Oki&H}Z znw!!wa|=Ij>?yoM_Kl~k1$O9dHk~Yt=n|iP{ugnnWK8AS6Ic)nP5nD4!y(vt)y22w zxB2K@Mz9l?%P*eA(Ju!`n%`h1L)LQ-Rva|;eanZq^($2Esl!o!V2g7RZ0pJ&zld!< z>2A+6r-dS9fz*a7D~0KH(dBh~Jy0J{n0L_(jl$CES~KiiKH6&vMl|LE9JDaD)U%nSlwMMqV`OqgfOX za?sSvy#?6@Ig&n$S;P@xE)wBxnC^P{nUTHL!<`0qrE76QLYtk{Os%Q^6VsbX4{&u_+N0{Lq#oo2n=h&T^(l zY|MmCsWJ*QxY+zHCZMqXDxrPT7I|s7r!)IUc*o}LACbUwP;Jb1FsIU=31~xZUuoTz z(C+3qIa95I24D1P!nbh@Q>f^MUyc6;rx?)Wgd79__BoNN*I^VYh_)_L6msRn>vhua zRp4=mT#cqY0hdv%M8wDSNDJ&&PAWaWVLGGX=v*lC+#XovqQMJe;2n`al@d6X2mZA# zo~HHi8MO&_1pQ8=S!)v=m90HqQapB*3X5zwG-OcG6SNhf-!%nBuy2We0ko`rs);Op z|GBGHPg;yppr}v$^eex7bU+^E`G^CTAvMP)*e_?ETUw1;#`If9iQR_y01=jn_k3nZ zlZH9ts+Gvdj>XJ#3#xs~(eD)CeUh+m-YA*N#P990G4)k|W%6Mdh6&AsiBzg6fz z?0h%wl$oeN|Dpcc^Cw?lz=#^O&Ws9TulUA6iSLgB1^AJzjQJRLv1proZ=?eK4s?%+ zXPw}sOoPsXlJ7MhD2ysEsEJvthJ_=lMf0`6XKo=+12e73j!!#QvGnUs7F{nzaLP15 z8~XK>4i3}8MEVU<$pKYBVeE0riWH>VoPd?Ci_vvB+?w}zFms!+~oA$eBjnkI{?N-GF@2(On!ezZ@PD!<=_I0o4 zzB(YHADA*33yQDPt_82wFfCS9k%##@Dxxd30nlC)aL2RxP#FSrqv6(HOkia$OddVA z90~WHgZdRIhP2@X=tr)p_qG;*ZfJWAgtbyh$RBg^u0}Ax(oph8PzIyMHQdVo{J=6Q zUSHo;>l*LQgo%(@(2D&hdwE%1pq-cC_?v|KnR?rD>M`z1=O?PJc8TAjt)7+(M3)yF zWW`2B0czL|Gs!T?F$At5P;eU(gfn=gIqM@5aGx$B+vF#Cm>*5c?YhFRIo6MQ_|bf-=zFhyhE5#v~E|m-`f2q!nG0Ey`J9w=3laWB{_AOc5s$Gi}S9_{DUlP3)3z>NllERy|B$5Ah*yDv}}7XpMB6o%o3sVi2m32svu>`a}_+uRMdL<<IK8@aL@5tVkod zn*|eOYC}UC)lu1SXV{C@9KE<(&so^gZpgQTPl3Z>xO|Ir%%y`Ce(sQBe7|nZ*JK4m zM85SPIp8NmQI?KQ+aIC(o{1{ZvyyeZRaU$ui@*aPf1)T~7+sc(JPk4VA)t8fwRv_5 z0SaZ6P4BWlW0;n6F^zZyKKaQxoT_aPCAyO=G{U`kaDsQ-NL^3{qQ&bA&5zogiT|Bd z_h3W2_Dz%1EGKKYkXrlBYC6dHn-}~jjiek5e#cTbNMEI{pGL}lX^b8UUFvIJ06`m$Uo+?k4DmE5(LU0shf^h~NTK&h^+&>~6mxX` zpy}wRG60gr=H6QLU9!##>_~B?XAJ-KuF+l-PHf&%W|ws_od|r2Y8L$F7-g8B4POY* zuO{BLO;=UQ7Jlcy%|3+lmT0|YAik(RP>fhi!itJbiGTuWW}q@HddtHG)~W?scxaZP z#KL?SH1L3KG~~ z5tKfi)~%MloW_U(Mqvn`xbKh&2<1`dM@JY&q?}q(n7zNoHeD9Bm1VphJc+RNpP8qH zU6va8Xj=D4g}#3|@!6S&#^JP(ZtQ4lelnGohI)4b<~VDC;t_xlrM~ zkPaW@N0iLKTeNLKMN@SWoIW zku?-nK+Jw(;IB0CJFLHnlD&jq6Crw}REOvtyiMXGP!<_IY(7UVYj6+1y(OS|ePs+BxowT{q7v?!eGe9-e{ZoW46l)#~ zx$a{{t*w#pLEV`j-N?&*!jO(^hXsy#vpu^8&7KJA1t#2O41l4UMd^ab<_Wn^JWT3MhnP!&-Z4^L^XSnHcK{W=U zEQ4fnL?L7m3ECC-#@zNMHY)V5-UvXyxezpqkYT>?*#`x7g0pn#^wbbZC~Ju3hkJZ2k>564;aSGp=g>uk-CG(hX4>A5AY7Z zqxO{SzYS`ya!U;X0J4bad2IrVzuB_`k*`1-NW?59a<;bI#Qjl-k}sz+y>tgXlfId~ z5lW{7`Q17%b8ZU3qDj{`EjH~Ih?Nm!^Hj5ylpTMQR1Kk&6gM&s(Z%5z(0m>F4r&(t zSp><0)!}h-%y4u%AdQ-5opRIUQf=L>N$=;eyZ zX87Y~4{p5AXsSapBZ_#>9mWK>pKmS&yo@)jJOb;cGVL@E_w{lJ5O|WcYcfjwbl}L*xim|J;hm{iH-Iqyk=ZNncz+>i1Yv+kw zTQH`7Z?R08vq(G<2YaORrLFQ`)4Tq@VP(>1_r(*F`$jxtv>G+eRHHX+rwl85sffk9 zl{Kz3^^LgM6sF55#r^C`(43zj{xW??QNNG5NjzvYHs)1)R1Ls0qAhi}?Zvps_t}qi z90ujGUkrGlIY+64J0mQ0w>f`}0SQjZh!`G-)W^?{Uf&n1UPV_&)t-05MgvrW#jwJf ziYPq3U~DN!91?E@8M#wb5{9I8n?}vu1=_{gS^r}Pi2Sz3rbbrRwokq61@Ig*Ao6Yg z=GR7Lvr_2YtPxA7!GPhumnF*}kwBk(`=>F$A>fDHxxTZh(Qe%^c(pg@TaB6fM))wc$)2*YtGaGlj`w1BMH!sv6w$iMSL#W{VDCqgY2IY95?xhSi*6Qg!c2r&s3$Dn6 zGRNTS8QwJT8q2F=qLo_l)m!XHVX$vv*Vg%IW!HsqojgCW+!c6bs9{f&0zK2HaV4y~ z^vXIhb}ifq28y;@DA=k`J5Mt zM|+Tg<~CJaI6zY(nZ4*uJBXryuVU9vBOen~lNSAAx3zhoI>yz@F|Z@*1?0{8(S%I;z&>+ zp*Ob9s;i!ZQEu@A*xsRiYJFmdll-b+rDF)!M9Vn4>na;`fD{0hK`5CJD!Z>op&9#q z4d64xYsiE5Y%l?|*Gv~)2+O<{HM#Ue(0%5%l67axBIBcfcVuc#1?Hv8zuX_ zz;7IIjr+~RV@XMA6LH`BGc&&s{v+z}nIbdzah&j@;LJ*dMdGVvUWap60uzMS`TJ9x z^xmaP;;6OfS9f)p+W1QDJVl!AtamtQDumyDWvkOHeMMV8ra6XlpKe5gw{DC63nvby zWBb>iE8WR>X0&h3`PJ9Dl+L@cuUDgu)Na}{7{`Fl64^pw&$|j*Tw=;Gwor{aHJOCM&u!8NcfJe(()MW2G+L}MqWEOfd!sxn6SMn+IZ#e6vXBq+e6!cugL*gVR+uU zL;_bMNtLa4i93;qsiw2qj0#0{2hX@HBUSM798gDES3f^+SO&mT6 zh${%1_QIxgvKdC14xdVmEJQosfktlSXK=BWBG})nEA3J*OjTRUb;tx6f^E^wa;u`f z0K78fkp#dbP4M8F`+|laam2M=V^A_ZtlPbdxGa}_3Og}u-X20xe&ydMKQp?O6_>oR z5waz^UkZVt2t#T*@GJ$$6(oP0%*tKY%v1;fO!!~1zYuQLiR(gB5H8QviuM4!gMDm= zgba<$wSe&0QZuS-!Y!&l&PVKTa{9P<9avn17NHdd82wxR0AY9Cp9|gs{gY1UyWpB2 z9;f;%=oRP0PSH)^&7&|vUWyucq62`ZH8CV^?z{Nvc>FR*J5W6Zw5vROfpy}~!(Zo|@?m{)!v4K$@RT(67!M#!J9UArqi5n74 zTx5s#?{LVlXXL%3BRWTjw-U+1pAt5m)4MD)F|u&XU3@o&k=HG-fqaXlxeA}KDK@mx z@vdyL&;jH~T1I}ZO$*p6qRz*LS7XcXOmSdXV#!hg z&GJ6HzL?)d_mdm@g3rL2*h1i$af^eC7B|>o#5$WygWDp$nEl5$e7sXSY1#J)j8)BC zSAfPXl(J#C<^i0}b>LMMn0@1`7jRQy-ATDy5k?ax%X~`&rZ3dTBDTff@6X!4u1LmxO`Fh!H2-%B<}^l z@GChP7o1sA0-VtX?sY>q)U?5L8Sr>3zC53ayW+US8P+aNdiXdcLGW>6!lMMn^(&bg zFIxZNV1B}O3Am0=;@_TMhdw;NTt4Z#I&hokL{)ZQ)q=yBTQ&ll{h}CVx5)rIvUH@Jy$7!++-;KQk8zGDL8TB-O2$Ii*? z@XCDo>bk(~!hiYt1yvcBH4Xt6uX+N{xq84hsd3Mf7oi%!>33kgjF^50)hJwTx(udE zizi6;daG$8xaj`gMfCYLSY*mW9j=ew3(BXQ7p@QkIHtPn{ zo*z3c9w@slIC`7MqX^g@=mG9+L>rxVW0YjLvfDVT=L_X5O;0>+ zIi^T4-1ZRoWTiY|PLqa9UC9;DT3jWJfCRQy7_)pu`}FnzPpoR_LnPn2>Rjli@D7F> zvlaqF26%=fVoEYes&_qD3|Q5H90xKQwe?G0pKVkZussZK1CNHrXlOt(7)b*kqseA8 z*^DNep-_r4na-2zVY>mXL_zHjH%3A9Axdo788nPw&%A|E)n2LqRR4mtf(B75fJ0r7 z#c)k)D|Z=4fsaK%$R2bCo}&-iKnAR2noQ^M^|XQSFM^rC7*_za9eR}_P~HqfegjY% zCcm~asbSl)H|~dXkQ}g>fw?9nAptZ#lK`>D$?kdP!3>lO3`G)Hg%2!(kFf#o_Dhnu zTMD_&fED7O21bX)eq2B$@`&9KPWFj5i6(nM-A1S?aPRU8=beHigmv;jXX&+llIPuw z(n4wL1{%ip0pTv-ZHPh*^M0FH)goIwk;mb3DWAskMBvSW5ceM{Gc?GE&|+AXi0n<^ zf!jH_np?_gf0`395qPL9gwfD}G0XGN zi-~N=&PaNo_$9{s!WWric~*PiiBxI(#}*!u1+N#0EVx|Fv{(}~kpK(#W}b#+j~%XG l0Irr$F`ogP4u+;2W(Fe$nSdxC_J^Pl_H^}gS?83{1OPi7tAGFi literal 17808 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 diff --git a/fieldservice_sale_recurring/static/description/icon.svg b/fieldservice_sale_recurring/static/description/icon.svg new file mode 100644 index 0000000000..c27c090fda --- /dev/null +++ b/fieldservice_sale_recurring/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file