Initial commit: OCA Workflow Process packages (456 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:00 +02:00
commit d366e42934
18799 changed files with 1284507 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Sale Order - Recurrence
Odoo addon: sale_order_recurrence
## Installation
```bash
pip install odoo-bringout-oca-sale-workflow-sale_order_recurrence
```
## Dependencies
This addon depends on:
- sale
## Manifest Information
- **Name**: Sale Order - Recurrence
- **Version**: 16.0.1.0.0
- **Category**: Sale
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/sale-workflow](https://github.com/OCA/sale-workflow) branch 16.0, addon `sale_order_recurrence`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Sale_order_recurrence Module - sale_order_recurrence
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for sale_order_recurrence. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [sale](../../odoo-bringout-oca-ocb-sale)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon sale_order_recurrence or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-sale-workflow-sale_order_recurrence"
# or
uv pip install odoo-bringout-oca-sale-workflow-sale_order_recurrence"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in sale_order_recurrence.
```mermaid
classDiagram
class sale_order_recurrence_wizard
class sale_order_recurrence_wizard_date_line
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: sale_order_recurrence. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon sale_order_recurrence
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in sale_order_recurrence.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../sale_order_recurrence/security/ir.model.access.csv)**
- 2 model access rules
## Record Rules
Row-level security rules defined in:
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../sale_order_recurrence/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon sale_order_recurrence
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-sale-workflow-sale_order_recurrence"
version = "16.0.0"
description = "Sale Order - Recurrence - Duplication Tools for Sale Orders with a certain recurrence"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-sale>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["sale_order_recurrence"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,103 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=======================
Sale Order - Recurrence
=======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:10ed1139398fed3ffa0067032de474abec9d19ee7ff273c74190671298fa043f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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%2Fsale--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/sale-workflow/tree/16.0/sale_order_recurrence
:alt: OCA/sale-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/sale-workflow-16-0/sale-workflow-16-0-sale_order_recurrence
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module provides a wizard that facilitates the recurrence of sales with a
certain recurrence.
User defines a begin date and recurrence (week, monthly) and the wizard creates
draft quotations with the dates selected in the wizard
It's useful for users who regularly sell the same products to the same customer,
such as bakers who receive the same orders from shops every week.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to
* go to Sale / Sales / Quotation (or Sale Orders)
* Select any sale order and click on 'Action' / 'Recurrence Wizard'
.. figure:: https://raw.githubusercontent.com/OCA/sale-workflow/16.0/sale_order_recurrence/static/description/sale_order_recurrence_wizard_form.png
And wizard creates quotations
.. figure:: https://raw.githubusercontent.com/OCA/sale-workflow/16.0/sale_order_recurrence/static/description/quotations_created_with_wizard.png
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/sale-workflow/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_order_recurrence%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* GRAP
Contributors
~~~~~~~~~~~~
* Sylvain LE GAL
* Quentin DUPONT
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/sale-workflow <https://github.com/OCA/sale-workflow/tree/16.0/sale_order_recurrence>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1 @@
from . import models

View file

@ -0,0 +1,22 @@
# Copyright (C) 2015 - Today: GRAP (http://www.grap.coop)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Sale Order - Recurrence",
"summary": "Duplication Tools for Sale Orders with a certain recurrence",
"version": "16.0.1.0.0",
"category": "Sale",
"author": "GRAP, " "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/sale-workflow",
"license": "AGPL-3",
"depends": [
"sale",
],
"data": [
"security/ir.model.access.csv",
"views/view_sale_order_recurrence_wizard.xml",
"views/action.xml",
],
"installable": True,
}

View file

@ -0,0 +1,151 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_recurrence
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__begin_date
msgid "Begin Date"
msgstr "Begin Date"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Cancel"
msgstr "Otkaži"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__create_uid
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__create_date
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__commitment_date
msgid "Delivery Date"
msgstr "Datum dostave"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__display_name
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Duplicate"
msgstr "Dupliciraj"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Duplicate and Open"
msgstr "Duplicate and Open"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__id
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__id
msgid "ID"
msgstr "ID"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__include_current_date
msgid "Include Current Date"
msgstr "Include Current Date"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard____last_update
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__write_uid
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__write_date
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: sale_order_recurrence
#: model:ir.model.fields.selection,name:sale_order_recurrence.selection__sale_order_recurrence_wizard__recurrence_type__month
msgid "Monthly"
msgstr "Mjesečno"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__date_line_ids
msgid "New Dates"
msgstr "New Dates"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__partner_id
msgid "Partner"
msgstr "Partner"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__recurrence_duration
msgid "Recurrence Duration"
msgstr "Recurrence Duration"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__recurrence_type
msgid "Recurrence Type"
msgstr "Recurrence Type"
#. module: sale_order_recurrence
#: model:ir.actions.act_window,name:sale_order_recurrence.action_sale_order_recurrence_wizard
msgid "Recurrence Wizard"
msgstr "Recurrence Wizard"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__order_id
msgid "Sale Order"
msgstr "Prodajni nalog"
#. module: sale_order_recurrence
#: model:ir.model,name:sale_order_recurrence.model_sale_order_recurrence_wizard
msgid "Sale Order Duplication Wizard"
msgstr "Sale Order Duplication Wizard"
#. module: sale_order_recurrence
#: model:ir.model,name:sale_order_recurrence.model_sale_order_recurrence_wizard_date_line
msgid "Sale Order Duplication Wizard Line"
msgstr "Sale Order Duplication Wizard Line"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Sale to duplicate"
msgstr "Sale to duplicate"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Settings"
msgstr "Postavke"
#. module: sale_order_recurrence
#: model:ir.model.fields.selection,name:sale_order_recurrence.selection__sale_order_recurrence_wizard__recurrence_type__week
msgid "Weekly"
msgstr "Sedmično"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__wizard_id
msgid "Wizard"
msgstr "ID čarobnjaka"

View file

@ -0,0 +1,163 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_recurrence
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-05 10:27+0000\n"
"PO-Revision-Date: 2024-06-05 10:27+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__begin_date
msgid "Begin Date"
msgstr "Date de début"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Cancel"
msgstr "Annuler"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__create_uid
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__create_date
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__create_date
msgid "Created on"
msgstr "Créé le"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__commitment_date
msgid "Delivery Date"
msgstr "Date de livraison"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__display_name
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Duplicate"
msgstr "Dupliquer"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Duplicate and Open"
msgstr "Dupliquer et ouvrir"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__id
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__id
msgid "ID"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__include_current_date
msgid "Include Current Date"
msgstr "Inclure la date courante"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard____last_update
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__write_uid
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__write_date
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: sale_order_recurrence
#: model:ir.model.fields.selection,name:sale_order_recurrence.selection__sale_order_recurrence_wizard__recurrence_type__month
msgid "Monthly"
msgstr "Mensuelle"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__date_line_ids
msgid "New Dates"
msgstr "Nouvelles Dates"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__partner_id
msgid "Partner"
msgstr "Partenaire"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__recurrence_duration
msgid "Recurrence Duration"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__recurrence_type
msgid "Recurrence Type"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.actions.act_window,name:sale_order_recurrence.action_sale_order_recurrence_wizard
msgid "Recurrence Wizard"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__order_id
msgid "Sale Order"
msgstr "Commande de vente"
#. module: sale_order_recurrence
#: model:ir.model,name:sale_order_recurrence.model_sale_order_recurrence_wizard
msgid "Sale Order Duplication Wizard"
msgstr "sale.order.recurrence.wizard"
#. module: sale_order_recurrence
#: model:ir.model,name:sale_order_recurrence.model_sale_order_recurrence_wizard_date_line
msgid "Sale Order Duplication Wizard Line"
msgstr "sale.order.recurrence.wizard.date.line"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Sale to duplicate"
msgstr "Vente à dupliquer"
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Settings"
msgstr "Configuration"
#. module: sale_order_recurrence
#: model:ir.model.fields.selection,name:sale_order_recurrence.selection__sale_order_recurrence_wizard__recurrence_type__week
msgid "Weekly"
msgstr "Hebdomadaire"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__wizard_id
msgid "Wizard"
msgstr "Assistant"
#~ msgid "Duplication Duration"
#~ msgstr "Durée de la recurrence"
#~ msgid "Duplication Type"
#~ msgstr "Type de recurrence"
#~ msgid "Duplication Wizard"
#~ msgstr "Assistant de recurrence"

View file

@ -0,0 +1,151 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_recurrence
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__begin_date
msgid "Begin Date"
msgstr ""
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Cancel"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__create_uid
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__create_uid
msgid "Created by"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__create_date
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__create_date
msgid "Created on"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__commitment_date
msgid "Delivery Date"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__display_name
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__display_name
msgid "Display Name"
msgstr ""
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Duplicate"
msgstr ""
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Duplicate and Open"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__id
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__id
msgid "ID"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__include_current_date
msgid "Include Current Date"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard____last_update
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__write_uid
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__write_date
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields.selection,name:sale_order_recurrence.selection__sale_order_recurrence_wizard__recurrence_type__month
msgid "Monthly"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__date_line_ids
msgid "New Dates"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__partner_id
msgid "Partner"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__recurrence_duration
msgid "Recurrence Duration"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__recurrence_type
msgid "Recurrence Type"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.actions.act_window,name:sale_order_recurrence.action_sale_order_recurrence_wizard
msgid "Recurrence Wizard"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard__order_id
msgid "Sale Order"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model,name:sale_order_recurrence.model_sale_order_recurrence_wizard
msgid "Sale Order Duplication Wizard"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model,name:sale_order_recurrence.model_sale_order_recurrence_wizard_date_line
msgid "Sale Order Duplication Wizard Line"
msgstr ""
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Sale to duplicate"
msgstr ""
#. module: sale_order_recurrence
#: model_terms:ir.ui.view,arch_db:sale_order_recurrence.view_sale_order_recurrence_wizard_form
msgid "Settings"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields.selection,name:sale_order_recurrence.selection__sale_order_recurrence_wizard__recurrence_type__week
msgid "Weekly"
msgstr ""
#. module: sale_order_recurrence
#: model:ir.model.fields,field_description:sale_order_recurrence.field_sale_order_recurrence_wizard_date_line__wizard_id
msgid "Wizard"
msgstr ""

View file

@ -0,0 +1,2 @@
from . import sale_order_recurrence_wizard
from . import sale_order_recurrence_wizard_date_line

View file

@ -0,0 +1,126 @@
# Copyright (C) 2015 - Today: GRAP (http://www.grap.coop)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# @author: Quentin DUPONT (https://twitter.com/pondupont)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import datetime
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models
class SaleOrderRecurrenceWizard(models.TransientModel):
_name = "sale.order.recurrence.wizard"
_description = "Sale Order Duplication Wizard"
_RECURRENCE_TYPE_KEYS = [
("week", "Weekly"),
("month", "Monthly"),
]
# Column Section
order_id = fields.Many2one(
comodel_name="sale.order",
string="Sale Order",
readonly=True,
)
partner_id = fields.Many2one(
comodel_name="res.partner",
string="Partner",
readonly=True,
)
begin_date = fields.Date(
required=True,
)
include_current_date = fields.Boolean(default=False)
recurrence_type = fields.Selection(
selection=_RECURRENCE_TYPE_KEYS,
default="week",
required=True,
)
recurrence_duration = fields.Integer(required=True, default=0)
date_line_ids = fields.One2many(
comodel_name="sale.order.recurrence.wizard.date.line",
inverse_name="wizard_id",
string="New Dates",
)
@api.model
def default_get(self, fields_list):
res = super().default_get(fields_list)
order_id = self.env.context.get("active_id", False)
if not order_id:
res.update({"order_id": False})
res.update({"partner_id": False})
res.update({"begin_date": False})
else:
order = self.env["sale.order"].browse(order_id)
res.update({"order_id": order_id})
res.update({"partner_id": order.partner_id.id})
res.update({"begin_date": order.date_order.strftime("%Y-%m-%d")})
return res
# View Section
@api.onchange(
"begin_date", "recurrence_type", "recurrence_duration", "include_current_date"
)
def onchange_recurrence_settings(self):
self.ensure_one()
self.date_line_ids = []
if self.begin_date and self.recurrence_type and self.recurrence_duration:
date_line_ids = []
date_line_ids.append((5, 0, 0))
begin_index = 0
end_index = self.recurrence_duration
if not self.include_current_date:
begin_index += 1
end_index += 1
for i in range(begin_index, end_index):
if self.recurrence_type == "week":
current_date = self.begin_date + datetime.timedelta(weeks=i)
else:
current_date = self.begin_date + relativedelta(months=i)
date_line_ids.append(
(
0,
0,
{
"commitment_date": current_date.strftime("%Y-%m-%d"),
},
)
)
self.date_line_ids = date_line_ids
def duplicate_button(self):
self._duplicate()
return True
def duplicate_open_button(self):
order_ids = self._duplicate()
action_name = "sale.action_quotations"
action = self.env["ir.actions.act_window"]._for_xml_id(action_name)
action["domain"] = "[('id', 'in', [" + ",".join(map(str, order_ids)) + "])]"
return action
def _duplicate(self):
self.ensure_one()
order_ids = []
for date_line in self.date_line_ids:
order_ids.append(
self.order_id.copy(
default={
"commitment_date": date_line.commitment_date,
"date_order": date_line.commitment_date,
}
).id
)
return order_ids

View file

@ -0,0 +1,15 @@
# Copyright (C) 2015 - Today: GRAP (http://www.grap.coop)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class SaleOrderRecurrenceWizardDateLine(models.TransientModel):
_name = "sale.order.recurrence.wizard.date.line"
_description = "Sale Order Duplication Wizard Line"
wizard_id = fields.Many2one(comodel_name="sale.order.recurrence.wizard")
commitment_date = fields.Date(string="Delivery Date", required=True)

View file

@ -0,0 +1,2 @@
* Sylvain LE GAL
* Quentin DUPONT

View file

@ -0,0 +1,8 @@
This module provides a wizard that facilitates the recurrence of sales with a
certain recurrence.
User defines a begin date and recurrence (week, monthly) and the wizard creates
draft quotations with the dates selected in the wizard
It's useful for users who regularly sell the same products to the same customer,
such as bakers who receive the same orders from shops every week.

View file

@ -0,0 +1,11 @@
To use this module, you need to
* go to Sale / Sales / Quotation (or Sale Orders)
* Select any sale order and click on 'Action' / 'Recurrence Wizard'
.. figure:: ../static/description/sale_order_recurrence_wizard_form.png
And wizard creates quotations
.. figure:: ../static/description/quotations_created_with_wizard.png

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sale_order_recurrence_wizard_user,sale.order.recurrence.wizard,model_sale_order_recurrence_wizard,sales_team.group_sale_salesman,1,1,1,1
access_sale_order_recurrence_wizard_date_line_user,sale.order.recurrence.wizard.date.line,model_sale_order_recurrence_wizard_date_line,sales_team.group_sale_salesman,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sale_order_recurrence_wizard_user sale.order.recurrence.wizard model_sale_order_recurrence_wizard sales_team.group_sale_salesman 1 1 1 1
3 access_sale_order_recurrence_wizard_date_line_user sale.order.recurrence.wizard.date.line model_sale_order_recurrence_wizard_date_line sales_team.group_sale_salesman 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,451 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="sale-order-recurrence">
<h1>Sale Order - Recurrence</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:10ed1139398fed3ffa0067032de474abec9d19ee7ff273c74190671298fa043f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/sale-workflow/tree/16.0/sale_order_recurrence"><img alt="OCA/sale-workflow" src="https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/sale-workflow-16-0/sale-workflow-16-0-sale_order_recurrence"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module provides a wizard that facilitates the recurrence of sales with a
certain recurrence.</p>
<p>User defines a begin date and recurrence (week, monthly) and the wizard creates
draft quotations with the dates selected in the wizard</p>
<p>Its useful for users who regularly sell the same products to the same customer,
such as bakers who receive the same orders from shops every week.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-1">Usage</a></h2>
<p>To use this module, you need to</p>
<ul class="simple">
<li>go to Sale / Sales / Quotation (or Sale Orders)</li>
<li>Select any sale order and click on Action / Recurrence Wizard</li>
</ul>
<div class="figure">
<img alt="https://raw.githubusercontent.com/OCA/sale-workflow/16.0/sale_order_recurrence/static/description/sale_order_recurrence_wizard_form.png" src="https://raw.githubusercontent.com/OCA/sale-workflow/16.0/sale_order_recurrence/static/description/sale_order_recurrence_wizard_form.png" />
</div>
<p>And wizard creates quotations</p>
<div class="figure">
<img alt="https://raw.githubusercontent.com/OCA/sale-workflow/16.0/sale_order_recurrence/static/description/quotations_created_with_wizard.png" src="https://raw.githubusercontent.com/OCA/sale-workflow/16.0/sale_order_recurrence/static/description/quotations_created_with_wizard.png" />
</div>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/sale-workflow/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_order_recurrence%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-3">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-4">Authors</a></h3>
<ul class="simple">
<li>GRAP</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-5">Contributors</a></h3>
<ul class="simple">
<li>Sylvain LE GAL</li>
<li>Quentin DUPONT</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h3>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/16.0/sale_order_recurrence">OCA/sale-workflow</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
from . import test_sale_order_recurrence

View file

@ -0,0 +1,72 @@
# Copyright (C) 2018 - Today: GRAP (http://www.grap.coop)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase
class TestSaleOrderRecurrence(TransactionCase):
def setUp(self):
super(TestSaleOrderRecurrence, self).setUp()
self.wizard_obj = self.env["sale.order.recurrence.wizard"]
self.order_obj = self.env["sale.order"]
self.order = self.env.ref("sale.sale_order_6")
# Test Section
def test_01_duplicate_quotation(self):
quotation_qty = len(self.order_obj.search([]))
wizard = self.wizard_obj.create(
{
"order_id": self.order.id,
"partner_id": self.order.partner_id.id,
"begin_date": "2024-01-01",
"include_current_date": False,
"recurrence_type": "week",
"recurrence_duration": 3,
}
)
# test open button and weekly recurrence
wizard.onchange_recurrence_settings()
wizard.duplicate_open_button()
new_quotation_qty = len(self.order_obj.search([]))
self.assertEqual(
quotation_qty + 3,
new_quotation_qty,
"Duplication wizard should create new sale orders",
)
# test other button and monthly recurrence
wizard = self.wizard_obj.create(
{
"order_id": self.order.id,
"partner_id": self.order.partner_id.id,
"begin_date": "2025-01-01",
"include_current_date": True,
"recurrence_type": "month",
"recurrence_duration": 5,
}
)
wizard.onchange_recurrence_settings()
wizard.duplicate_button()
new_quotation_qty = len(self.order_obj.search([]))
self.assertEqual(
quotation_qty + 3 + 5,
new_quotation_qty,
"Duplication wizard should create new sale orders",
)
def test_02_wzd_default_get(self):
wzd_obj = self.wizard_obj.with_context(
active_id=self.order.id,
)
result = wzd_obj.default_get(
fields_list=[],
)
self.assertEqual(
result["order_id"],
self.order.id,
)
self.assertEqual(
result["partner_id"],
self.order.partner_id.id,
)

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Copyright (C) 2018 - Today: GRAP (http://www.grap.coop)
@author: Sylvain LE GAL (https://twitter.com/legalsylvain)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-->
<odoo>
<record id="action_sale_order_recurrence_wizard" model="ir.actions.act_window">
<field name="name">Recurrence Wizard</field>
<field name="res_model">sale.order.recurrence.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="binding_model_id" ref="sale.model_sale_order" />
</record>
</odoo>

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Copyright (C) 2015 - Today: GRAP (http://www.grap.coop)
@author: Sylvain LE GAL (https://twitter.com/legalsylvain)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-->
<odoo>
<record id="view_sale_order_recurrence_wizard_form" model="ir.ui.view">
<field name="model">sale.order.recurrence.wizard</field>
<field name="arch" type="xml">
<form>
<group col="4" string="Sale to duplicate">
<group>
<field name="order_id" />
<field name="partner_id" />
</group>
</group>
<group col="4" string="Settings">
<field name="begin_date" />
<field name="include_current_date" />
<field name="recurrence_type" />
<field
name="recurrence_duration"
widget="numeric_step"
options="{'step': 1, 'min': 0}"
/>
</group>
<group>
<field name="date_line_ids" nolabel="1" colspan="2">
<tree editable="bottom">
<field name="commitment_date" />
</tree>
</field>
</group>
<footer>
<button
name="duplicate_button"
string="Duplicate"
type="object"
class="oe_highlight"
/>
<button
name="duplicate_open_button"
string="Duplicate and Open"
type="object"
/>
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
</odoo>