cleaned OCA addon

This commit is contained in:
snt 2026-02-27 13:42:41 +01:00
parent d58c621ef1
commit 6381a2d985
21 changed files with 0 additions and 997 deletions

View file

@ -1,100 +0,0 @@
# Product Main Seller
## Summary
Adds a "Main Vendor" field to products that automatically tracks the primary supplier based on supplierinfo sequence.
## Features
- **Automatic Main Vendor**: Computed field showing the primary supplier
- **Based on Sequence**: Uses the supplierinfo with the lowest sequence number
- **Visible in Views**: Shows in product form and tree views
- **Searchable**: Can search and filter products by main vendor
- **Related Fields**: Access to vendor name and reference
## Technical Details
### Models Extended
- `product.template`: Main product template
- `product.product`: Product variants
### Fields Added
- `main_seller_id` (Many2one → res.partner, computed, stored)
- The main vendor for this product
- Computed from `seller_ids` with lowest sequence
- Stored for performance
- Searchable and filterable
### Computation Logic
The main vendor is determined by:
1. Looking at all supplierinfo records (`seller_ids`)
2. Filtering for valid suppliers (active partners)
3. Selecting the one with the **lowest sequence** number
4. If no suppliers, returns empty
## Dependencies
- `purchase` (Odoo core)
## Installation
```bash
docker-compose exec odoo odoo -d odoo -u product_main_seller --stop-after-init
```
## Usage
## Usage
### Viewing Main Vendor
1. Open a product form (Products > Products > [Product])
2. See "Main Vendor" field (usually in Purchase tab)
3. Field is automatically computed from vendor list
### Changing Main Vendor
To change the main vendor:
1. Go to product form > Purchase tab
2. Edit the vendor list (`seller_ids`)
3. Change the sequence numbers (lower = more priority)
4. Save - the "Main Vendor" will update automatically
### Searching by Vendor
```python
# Find all products from a specific vendor
products = self.env['product.template'].search([
('main_seller_id', '=', vendor_id)
])
```
## Use Cases in Kidekoop
This module is critical for:
- Vendor performance analysis
- Purchase order management
- Inventory planning by supplier
- Default supplier selection in purchase workflows
## Views Modified
- Product Template Form View
- Product Template Tree View
- Product Variant Form View
## Translations
- ✅ Spanish (es)
- ✅ Euskera (eu)
Located in `i18n/` directory.
---
**Version**: 18.0.1.0.0
**Category**: Purchase
**License**: AGPL-3

View file

@ -1,97 +0,0 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
===================
Product Main Vendor
===================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:c353b8931ca2140d6d80974f00d4e5e073b737283dc2770fe718a8842cd6bd4e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fpurchase--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/purchase-workflow/tree/18.0/product_main_seller
:alt: OCA/purchase-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-product_main_seller
: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/purchase-workflow&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the Odoo Product module to compute and display the
main Vendor of each products. The main vendor is the first vendor in the
vendors list.
|image1|
.. |image1| image:: https://raw.githubusercontent.com/OCA/purchase-workflow/18.0/product_main_seller/static/description/product_tree_view.png
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/purchase-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/purchase-workflow/issues/new?body=module:%20product_main_seller%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
-------
* GRAP
Contributors
------------
- Quentin Dupont (quentin.dupont@grap.coop)
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-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px
:target: https://github.com/legalsylvain
:alt: legalsylvain
.. |maintainer-quentinDupont| image:: https://github.com/quentinDupont.png?size=40px
:target: https://github.com/quentinDupont
:alt: quentinDupont
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-legalsylvain| |maintainer-quentinDupont|
This module is part of the `OCA/purchase-workflow <https://github.com/OCA/purchase-workflow/tree/18.0/product_main_seller>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -1,2 +0,0 @@
from . import models
from .hooks import pre_init_hook

View file

@ -1,21 +0,0 @@
# Copyright (C) 2022 - Today: GRAP (http://www.grap.coop)
# @author: Quentin Dupont (quentin.dupont@grap.coop)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Product Main Vendor",
"summary": "Main Vendor for a product",
"version": "18.0.1.0.0",
"category": "Purchase",
"author": "GRAP,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/purchase-workflow",
"license": "AGPL-3",
"depends": ["purchase"],
"maintainers": ["legalsylvain", "quentinDupont"],
"data": [
"views/view_product_product.xml",
"views/view_product_template.xml",
],
"installable": True,
"pre_init_hook": "pre_init_hook",
}

View file

@ -1,34 +0,0 @@
# Copyright 2024-Today - Sylvain Le GAL (GRAP)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
_logger = logging.getLogger(__name__)
def pre_init_hook(env):
_logger.info("Initializing column main_seller_id on table product_template")
cr = env.cr
cr.execute("""
ALTER TABLE product_template
ADD COLUMN IF NOT EXISTS main_seller_id integer;
""")
cr.execute("""
WITH numbered_supplierinfos as (
SELECT *, ROW_number() over (
partition BY product_tmpl_id
ORDER BY sequence, min_qty desc, price
) as row_number
FROM product_supplierinfo
),
first_supplierinfos as (
SELECT * from numbered_supplierinfos
WHERE row_number = 1
)
UPDATE product_template pt
SET main_seller_id = first_supplierinfos.partner_id
FROM first_supplierinfos
WHERE pt.id = first_supplierinfos.product_tmpl_id;
""")

View file

@ -1,37 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_main_seller
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-08 20:26+0000\n"
"PO-Revision-Date: 2024-07-08 20:26+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: product_main_seller
#: model:ir.model.fields,field_description:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,field_description:product_main_seller.field_product_template__main_seller_id
#: model_terms:ir.ui.view,arch_db:product_main_seller.view_product_template_search
msgid "Main Vendor"
msgstr "Fournisseur principal"
#. module: product_main_seller
#: model:ir.model,name:product_main_seller.model_product_template
msgid "Product"
msgstr "Produit"
#. module: product_main_seller
#: model:ir.model.fields,help:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,help:product_main_seller.field_product_template__main_seller_id
msgid "Put your supplier info in first position to set as main vendor"
msgstr ""
"Définir une information fournisseur en première position pour le définir "
"comme fournisseur principal"

View file

@ -1,37 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_main_seller
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-09-06 15:06+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.6.2\n"
#. module: product_main_seller
#: model:ir.model.fields,field_description:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,field_description:product_main_seller.field_product_template__main_seller_id
#: model_terms:ir.ui.view,arch_db:product_main_seller.view_product_template_search
msgid "Main Vendor"
msgstr "Fornitore principale"
#. module: product_main_seller
#: model:ir.model,name:product_main_seller.model_product_template
msgid "Product"
msgstr "Prodotto"
#. module: product_main_seller
#: model:ir.model.fields,help:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,help:product_main_seller.field_product_template__main_seller_id
msgid "Put your supplier info in first position to set as main vendor"
msgstr ""
"Inserire le informazioni fornitore nella prima posizione per impostarlo come "
"fornitore principale"

View file

@ -1,38 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_main_seller
# bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>, 2025.
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: Dutch\n"
"Language: nl\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"
"PO-Revision-Date: 2025-04-18 13:34+0200\n"
"X-Generator: Gtranslator 47.1\n"
#. module: product_main_seller
#: model:ir.model.fields,field_description:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,field_description:product_main_seller.field_product_template__main_seller_id
#: model_terms:ir.ui.view,arch_db:product_main_seller.view_product_template_search
msgid "Main Vendor"
msgstr "Hoofdleverancier"
#. module: product_main_seller
#: model:ir.model,name:product_main_seller.model_product_template
msgid "Product"
msgstr "Product"
#. module: product_main_seller
#: model:ir.model.fields,help:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,help:product_main_seller.field_product_template__main_seller_id
msgid "Put your supplier info in first position to set as main vendor"
msgstr ""
"Zet uw leverancier op de eerste plaats om deze als hoofdleverancier in te "
"stellen"

View file

@ -1,32 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * product_main_seller
#
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_main_seller
#: model:ir.model.fields,field_description:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,field_description:product_main_seller.field_product_template__main_seller_id
#: model_terms:ir.ui.view,arch_db:product_main_seller.view_product_template_search
msgid "Main Vendor"
msgstr ""
#. module: product_main_seller
#: model:ir.model,name:product_main_seller.model_product_template
msgid "Product"
msgstr ""
#. module: product_main_seller
#: model:ir.model.fields,help:product_main_seller.field_product_product__main_seller_id
#: model:ir.model.fields,help:product_main_seller.field_product_template__main_seller_id
msgid "Put your supplier info in first position to set as main vendor"
msgstr ""

View file

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

View file

@ -1,31 +0,0 @@
# Copyright (C) 2022 - Today: GRAP (http://www.grap.coop)
# @author: Quentin DUPONT (quentin.dupont@grap.coop)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api
from odoo import fields
from odoo import models
class ProductTemplate(models.Model):
_inherit = "product.template"
main_seller_id = fields.Many2one(
comodel_name="res.partner",
string="Main Vendor",
help="Put your supplier info in first position to set as main vendor",
compute="_compute_main_seller_id",
store=True,
)
@api.depends("variant_seller_ids.sequence", "variant_seller_ids.partner_id.active")
def _compute_main_seller_id(self):
for template in self:
if template.variant_seller_ids:
template.main_seller_id = fields.first(
template.variant_seller_ids.filtered(
lambda seller: seller.partner_id.active
)
).partner_id
else:
template.main_seller_id = False

View file

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

View file

@ -1 +0,0 @@
- Quentin Dupont (<quentin.dupont@grap.coop>)

View file

@ -1,5 +0,0 @@
This module extends the Odoo Product module to compute and display the
main Vendor of each products. The main vendor is the first vendor in the
vendors list.
![](../static/description/product_tree_view.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

View file

@ -1,434 +0,0 @@
<!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-main-vendor">
<h1>Product Main Vendor</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:c353b8931ca2140d6d80974f00d4e5e073b737283dc2770fe718a8842cd6bd4e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/purchase-workflow/tree/18.0/product_main_seller"><img alt="OCA/purchase-workflow" src="https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-product_main_seller"><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/purchase-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 module extends the Odoo Product module to compute and display the
main Vendor of each products. The main vendor is the first vendor in the
vendors list.</p>
<p><img alt="image1" src="https://raw.githubusercontent.com/OCA/purchase-workflow/18.0/product_main_seller/static/description/product_tree_view.png" /></p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/purchase-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/purchase-workflow/issues/new?body=module:%20product_main_seller%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-2">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-3">Authors</a></h3>
<ul class="simple">
<li>GRAP</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<ul class="simple">
<li>Quentin Dupont (<a class="reference external" href="mailto:quentin.dupont&#64;grap.coop">quentin.dupont&#64;grap.coop</a>)</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-5">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>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/legalsylvain"><img alt="legalsylvain" src="https://github.com/legalsylvain.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/quentinDupont"><img alt="quentinDupont" src="https://github.com/quentinDupont.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/purchase-workflow/tree/18.0/product_main_seller">OCA/purchase-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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View file

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

View file

@ -1,72 +0,0 @@
# Copyright (C) 2022 - Today: GRAP (http://www.grap.coop)
# @author: Quentin DUPONT (quentin.dupont@grap.coop)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import Command
from odoo.tests.common import TransactionCase
class TestSeller(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.product_workplace = cls.env.ref("product.product_product_24")
cls.product_acoustic = cls.env.ref("product.product_product_25")
cls.product_with_var_chair = cls.env.ref("product.product_product_11")
cls.product_without_seller_desk = cls.env.ref("product.product_product_3")
cls.partner_woodcorner = cls.env.ref("base.res_partner_1")
cls.partner_azure = cls.env.ref("base.res_partner_12")
def test_01_computed_main_vendor(self):
self.assertEqual(
self.product_acoustic.main_seller_id,
self.product_acoustic.seller_ids[0].partner_id,
)
self.assertEqual(
self.product_with_var_chair.main_seller_id,
self.product_acoustic.product_variant_ids[0]
.variant_seller_ids[0]
.partner_id,
)
def test_02_replace_supplierinfo(self):
self.product_acoustic.seller_ids = [
Command.clear(),
Command.create({"partner_id": self.partner_azure.id}),
]
self.assertEqual(self.product_acoustic.main_seller_id.id, self.partner_azure.id)
def test_03_add_supplierinfo_no_existing_supplierinfo(self):
self.product_without_seller_desk.seller_ids = [
Command.create({"partner_id": self.partner_azure.id}),
]
self.assertEqual(
self.product_without_seller_desk.main_seller_id.id, self.partner_azure.id
)
def test_03_add_supplierinfo_low_sequence(self):
self.product_workplace.seller_ids.write({"sequence": 1})
self.product_workplace.seller_ids = [
Command.create({"sequence": 100, "partner_id": self.partner_azure.id}),
]
self.assertNotEqual(
self.product_workplace.main_seller_id.id, self.partner_azure.id
)
def test_03_add_supplierinfo_high_sequence(self):
self.product_workplace.seller_ids.write({"sequence": 1000})
self.product_workplace.seller_ids = [
Command.create({"sequence": 100, "partner_id": self.partner_azure.id}),
]
self.assertEqual(
self.product_workplace.main_seller_id.id, self.partner_azure.id
)
def test_04_update_supplierinfo(self):
self.product_acoustic.seller_ids.write({"partner_id": self.partner_azure.id})
self.assertEqual(self.product_acoustic.main_seller_id.id, self.partner_azure.id)
def test_05_unlink_supplierinfo(self):
self.product_acoustic.seller_ids.unlink()
self.assertEqual(self.product_acoustic.main_seller_id.id, False)

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Copyright (C) 2022 - Today: GRAP (http://www.grap.coop)
@author: Quentin DUPONT (quentin.dupont@grap.coop)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-->
<odoo>
<record id="view_product_product_tree" model="ir.ui.view">
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_product_tree_view" />
<field name="arch" type="xml">
<field name="lst_price" position="before">
<field name="main_seller_id" optional="show" />
</field>
</field>
</record>
</odoo>

View file

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Copyright (C) 2022 - Today: GRAP (http://www.grap.coop)
@author: Quentin DUPONT (quentin.dupont@grap.coop)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-->
<odoo>
<record id="view_product_template_search" model="ir.ui.view">
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_search_view" />
<field name="arch" type="xml">
<field name="categ_id" position="after">
<field name="main_seller_id" />
</field>
<filter name="categ_id" position="after">
<filter
string="Main Vendor"
name="main_seller_id"
context="{'group_by':'main_seller_id'}"
/>
</filter>
</field>
</record>
<record id="view_product_template_tree" model="ir.ui.view">
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_tree_view" />
<field name="arch" type="xml">
<field name="list_price" position="before">
<field name="main_seller_id" optional="show" />
</field>
</field>
</record>
</odoo>