Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=================================
Product customer info elaboration
=================================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:26f045d301f922a77816e81237d321f03c0b5534d57ab575778f649caeecd352
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/18.0/product_customerinfo_elaboration
: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-18-0/sale-workflow-18-0-product_customerinfo_elaboration
: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=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This modules allows to use customers info structure, available in
*Sales* tab of the product form, also for defining customer information,
allowing to define default elaboration per customer and product.
**Table of contents**
.. contents::
:local:
Configuration
=============
To see this module working you need to define some elaborations as the
module
`sale_elaboration <https://github.com/OCA/sale-workflow/tree/18.0/sale_elaboration>`__
explains.
Usage
=====
To use this module, you need to:
1. Go to *Sales > Products > Products*
2. Create or select one of existing
3. Go to window *Sales* and create a new entry for some customer
4. Select one elaboration and one elaboration note
After this create a new quotation and select the partner with that was
configured. You will see that the elaboration and the elaboration note
is completed.
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:%20product_customerinfo_elaboration%0Aversion:%2018.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
-------
* Tecnativa
Contributors
------------
- `Tecnativa <https://www.tecnativa.com>`__ :
- Carlos Roca
- Ernesto Tejeda
- Sergio Teruel
- Juan Carlos Oñate
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/18.0/product_customerinfo_elaboration>`_ 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,16 @@
# Copyright 2022 Tecnativa - Carlos Roca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Product customer info elaboration",
"summary": "Allows to define default elaborations and elaboration notes on product"
" customerinfos",
"version": "18.0.1.0.0",
"development_status": "Beta",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/sale-workflow",
"category": "Sales Management",
"license": "AGPL-3",
"depends": ["product_customerinfo_sale", "sale_elaboration"],
"data": ["security/ir.model.access.csv", "views/product_views.xml"],
"installable": True,
}

View File

@@ -0,0 +1,44 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_supplierinfo_for_customer_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-21 07:23+0000\n"
"PO-Revision-Date: 2022-06-21 09:24+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
#. module: product_customerinfo_elaboration
#: model:ir.model,name:product_customerinfo_elaboration.model_product_customerinfo
msgid "Customer Pricelist"
msgstr "Tarifa de cliente"
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_product_customerinfo__elaboration_ids
msgid "Elaboration"
msgstr "Elaboración"
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_product_customerinfo__elaboration_note
msgid "Elaboration Note"
msgstr "Nota de elaboración"
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:product_customerinfo_elaboration.product_customerinfo_form_view
msgid "Elaborations"
msgstr "Elaboraciones"
#. module: product_customerinfo_elaboration
#: model:ir.model,name:product_customerinfo_elaboration.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea pedido de venta"

View File

@@ -0,0 +1,43 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_customerinfo_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-08-28 12:25+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\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 5.10.4\n"
#. module: product_customerinfo_elaboration
#: model:ir.model,name:product_customerinfo_elaboration.model_product_customerinfo
msgid "Customer Pricelist"
msgstr "Listino prezzi cliente"
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_product_customerinfo__elaboration_ids
msgid "Elaboration"
msgstr "Elaborazione"
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_product_customerinfo__elaboration_note
msgid "Elaboration Note"
msgstr "Nota elaborazione"
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:product_customerinfo_elaboration.product_customerinfo_form_view
msgid "Elaborations"
msgstr "Elaborazioni"
#. module: product_customerinfo_elaboration
#: model:ir.model,name:product_customerinfo_elaboration.model_sale_order_line
msgid "Sales Order Line"
msgstr "Riga ordine di vendita"

View File

@@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_customerinfo_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.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: product_customerinfo_elaboration
#: model:ir.model,name:product_customerinfo_elaboration.model_product_customerinfo
msgid "Customer Pricelist"
msgstr ""
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_product_customerinfo__elaboration_ids
msgid "Elaboration"
msgstr ""
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_product_customerinfo__elaboration_note
msgid "Elaboration Note"
msgstr ""
#. module: product_customerinfo_elaboration
#: model:ir.model.fields,field_description:product_customerinfo_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:product_customerinfo_elaboration.product_customerinfo_form_view
msgid "Elaborations"
msgstr ""
#. module: product_customerinfo_elaboration
#: model:ir.model,name:product_customerinfo_elaboration.model_sale_order_line
msgid "Sales Order Line"
msgstr ""

View File

@@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_supplierinfo_for_customer_elaboration
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.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: product_supplierinfo_for_customer_elaboration
#: model:ir.model,name:product_supplierinfo_for_customer_elaboration.model_product_customerinfo
msgid "Customer Pricelist"
msgstr ""
#. module: product_supplierinfo_for_customer_elaboration
#: model:ir.model.fields,field_description:product_supplierinfo_for_customer_elaboration.field_product_customerinfo__elaboration_ids
msgid "Elaboration"
msgstr ""
#. module: product_supplierinfo_for_customer_elaboration
#: model:ir.model.fields,field_description:product_supplierinfo_for_customer_elaboration.field_product_customerinfo__elaboration_note
msgid "Elaboration Note"
msgstr ""
#. module: product_supplierinfo_for_customer_elaboration
#: model:ir.model.fields,field_description:product_supplierinfo_for_customer_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:product_supplierinfo_for_customer_elaboration.product_customerinfo_form_view
msgid "Elaborations"
msgstr ""
#. module: product_supplierinfo_for_customer_elaboration
#: model:ir.model,name:product_supplierinfo_for_customer_elaboration.model_sale_order_line
msgid "Sales Order Line"
msgstr ""

View File

@@ -0,0 +1,2 @@
from . import product_customerinfo
from . import sale_order_line

View File

@@ -0,0 +1,19 @@
# Copyright 2022 Tecnativa - Carlos Roca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class ProductCustomerInfo(models.Model):
_inherit = "product.customerinfo"
elaboration_ids = fields.Many2many(comodel_name="product.elaboration")
elaboration_note = fields.Char(
store=True,
compute="_compute_elaboration_note",
readonly=False,
)
@api.depends("elaboration_ids")
def _compute_elaboration_note(self):
for line in self:
line.elaboration_note = ", ".join(line.elaboration_ids.mapped("name"))

View File

@@ -0,0 +1,50 @@
# Copyright 2022 Tecnativa - Carlos Roca
# Copyright 2023 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
elaboration_ids = fields.Many2many(
comodel_name="product.elaboration",
compute="_compute_elaboration_ids",
store=True,
readonly=False,
string="Elaborations",
)
@api.depends("product_id")
def _compute_elaboration_ids(self):
for line in self:
customer_info = line._get_product_customer_info()
if customer_info:
line.elaboration_ids = customer_info.elaboration_ids
def _get_product_customer_info(self):
customerinfo = self.product_id.customer_ids.filtered(
lambda pc: pc.elaboration_ids and pc.partner_id == self.order_id.partner_id
)[:1]
if not customerinfo:
customerinfo = self.product_id.customer_ids.filtered(
lambda pc: pc.elaboration_ids
and pc.partner_id == self.order_id.partner_id.commercial_partner_id
)[:1]
return customerinfo
@api.onchange("elaboration_ids")
def onchange_elaboration_ids(self):
for line in self:
customer_info = line._get_product_customer_info()
if (
customer_info
and line.elaboration_ids
and (
# Comparing with ids because comparison with newId doesn't work
line.elaboration_ids.ids == customer_info.elaboration_ids.ids
or not line.elaboration_ids
)
):
line.elaboration_note = customer_info.elaboration_note

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,4 @@
To see this module working you need to define some elaborations as the
module
[sale_elaboration](https://github.com/OCA/sale-workflow/tree/18.0/sale_elaboration)
explains.

View File

@@ -0,0 +1,5 @@
- [Tecnativa](https://www.tecnativa.com) :
- Carlos Roca
- Ernesto Tejeda
- Sergio Teruel
- Juan Carlos Oñate

View File

@@ -0,0 +1,4 @@
This modules allows to use customers info structure, available in
*Sales* tab of the product form, also for defining customer
information, allowing to define default elaboration per customer and
product.

View File

@@ -0,0 +1,10 @@
To use this module, you need to:
1. Go to *Sales \> Products \> Products*
2. Create or select one of existing
3. Go to window *Sales* and create a new entry for some customer
4. Select one elaboration and one elaboration note
After this create a new quotation and select the partner with that was
configured. You will see that the elaboration and the elaboration note
is completed.

View File

@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_product_customerinfo_stock_manager,product.customerinfo.stock_manager,product_customerinfo.model_product_customerinfo,stock.group_stock_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_product_customerinfo_stock_manager product.customerinfo.stock_manager product_customerinfo.model_product_customerinfo stock.group_stock_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,459 @@
<!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="product-customer-info-elaboration">
<h1>Product customer info elaboration</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:26f045d301f922a77816e81237d321f03c0b5534d57ab575778f649caeecd352
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/18.0/product_customerinfo_elaboration"><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-18-0/sale-workflow-18-0-product_customerinfo_elaboration"><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=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This modules allows to use customers info structure, available in
<em>Sales</em> tab of the product form, also for defining customer information,
allowing to define default elaboration per customer and product.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h2><a class="toc-backref" href="#toc-entry-1">Configuration</a></h2>
<p>To see this module working you need to define some elaborations as the
module
<a class="reference external" href="https://github.com/OCA/sale-workflow/tree/18.0/sale_elaboration">sale_elaboration</a>
explains.</p>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-2">Usage</a></h2>
<p>To use this module, you need to:</p>
<ol class="arabic simple">
<li>Go to <em>Sales &gt; Products &gt; Products</em></li>
<li>Create or select one of existing</li>
<li>Go to window <em>Sales</em> and create a new entry for some customer</li>
<li>Select one elaboration and one elaboration note</li>
</ol>
<p>After this create a new quotation and select the partner with that was
configured. You will see that the elaboration and the elaboration note
is completed.</p>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-3">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:%20product_customerinfo_elaboration%0Aversion:%2018.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-4">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-5">Authors</a></h3>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-6">Contributors</a></h3>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a> :<ul>
<li>Carlos Roca</li>
<li>Ernesto Tejeda</li>
<li>Sergio Teruel</li>
<li>Juan Carlos Oñate</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-7">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/18.0/product_customerinfo_elaboration">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_customerinfo_elaboration

View File

@@ -0,0 +1,70 @@
# Copyright 2022 Tecnativa - Carlos Roca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo.tests import Form
from odoo.addons.base.tests.common import BaseCommon
class TestCustomerinfoElaboration(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.customer0 = cls.env["res.partner"].create({"name": "Test partner 0"})
cls.customer1 = cls.env["res.partner"].create(
{"name": "Test partner 1", "parent_id": cls.customer0.id}
)
cls.customer2 = cls.env["res.partner"].create({"name": "Test partner 2"})
cls.product = cls.env["product.product"].create({"name": "Product test"})
cls.product_elab = cls.env["product.product"].create(
{"name": "Elaboration prod. test", "type": "service"}
)
cls.elaboration = cls.env["product.elaboration"].create(
{"name": "Test elaboration", "product_id": cls.product_elab.id}
)
cls.customer_info = cls.env["product.customerinfo"].create(
{
"partner_id": cls.customer0.id,
"product_tmpl_id": cls.product.product_tmpl_id.id,
"elaboration_ids": [(4, cls.elaboration.id)],
"elaboration_note": "Test elaboration note",
}
)
def _create_sale(self, partner):
so_form = Form(self.env["sale.order"])
so_form.partner_id = partner
with so_form.order_line.new() as ol_form:
ol_form.product_id = self.product
return so_form.save()
def test_sale_without_elaboration(self):
so = self._create_sale(self.customer2)
line = so.order_line
self.assertFalse(line.elaboration_ids)
self.assertFalse(line.elaboration_note)
def test_sale_direct_customerinfo_with_elaboration(self):
so = self._create_sale(self.customer0)
line = so.order_line
self.assertEqual(line.elaboration_ids, self.elaboration)
self.assertEqual(line.elaboration_note, "Test elaboration note")
def test_sale_parent_customerinfo_with_elaboration(self):
so = self._create_sale(self.customer1)
line = so.order_line
self.assertEqual(line.elaboration_ids, self.elaboration)
self.assertEqual(line.elaboration_note, "Test elaboration note")
def test_multiple_elaboration_per_customer(self):
product_elab_2 = self.env["product.product"].create(
{"name": "Elaboration prod. test 2", "type": "service"}
)
elaboration_2 = self.env["product.elaboration"].create(
{"name": "Test elaboration 2", "product_id": product_elab_2.id}
)
self.customer_info.elaboration_ids += elaboration_2
so = self._create_sale(self.customer0)
line = so.order_line
self.assertEqual(line.elaboration_ids, self.elaboration | elaboration_2)
self.assertEqual(line.elaboration_note, "Test elaboration, Test elaboration 2")

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Tecnativa - Carlos Roca
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="product_customerinfo_form_view" model="ir.ui.view">
<field name="model">product.customerinfo</field>
<field
name="inherit_id"
ref="product_customerinfo.product_customerinfo_form_view"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='product_tmpl_id']/.." position="after">
<group string="Elaborations">
<field name="elaboration_ids" widget="many2many_tags" />
<field name="elaboration_note" />
</group>
</xpath>
</field>
</record>
<record id="product_customerinfo_tree_view" model="ir.ui.view">
<field name="model">product.customerinfo</field>
<field
name="inherit_id"
ref="product_customerinfo.product_customerinfo_tree_view"
/>
<field name="arch" type="xml">
<xpath expr="//field[@name='price']" position="after">
<field name="elaboration_ids" optional="show" widget="many2many_tags" />
<field name="elaboration_note" optional="show" />
</xpath>
</field>
</record>
</odoo>