Skip to content

Commit 98153d4

Browse files
authored
add sale_order_default_payment_term (#176)
* add sale_order_default_payment_term
1 parent 33d62f1 commit 98153d4

File tree

7 files changed

+202
-0
lines changed

7 files changed

+202
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
===============================
2+
Sale Order Default Payment Term
3+
===============================
4+
5+
This module sets the first payment term as default when creating a new sales order.
6+
7+
Features
8+
========
9+
10+
* Automatically sets the first payment term (ordered by ID) as the default payment term for new sales orders
11+
* Overrides the payment_term_id field in the sale.order model to provide this default value
12+
13+
Configuration
14+
=============
15+
16+
No special configuration is needed. After installing the module, the first payment term in the system will be automatically set as default for new sales orders. You can change the order of payment terms as usual.
17+
18+
Usage
19+
=====
20+
21+
* When creating a new sales order, the payment term will be automatically set to the first payment term in the system
22+
* Users can still manually change the payment term if needed
23+
24+
Testing
25+
=======
26+
27+
The module includes unit tests to verify:
28+
29+
* The default payment term is correctly set when creating a new sales order
30+
* Manually selected payment terms are respected
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"name": "Sale Order Default Payment Term",
3+
"version": "15.0.1.0.0",
4+
"category": "Sales",
5+
"summary": "Set the first payment term as default when creating a new sales order",
6+
"author": "Nitrokey GmbH",
7+
"website": "https://github.com/OCA/server-tools",
8+
"license": "AGPL-3",
9+
"depends": ["sale", "account"],
10+
"data": [],
11+
"installable": True,
12+
"auto_install": False,
13+
"application": False,
14+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import sale
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from odoo import api, models
2+
3+
4+
class SaleOrder(models.Model):
5+
_inherit = "sale.order"
6+
7+
@api.model
8+
def _default_payment_term_id(self):
9+
"""Set the first payment term as default when creating a new sales order."""
10+
# Get the first payment term from the system using default ordering (sequence, id)
11+
first_payment_term = self.env["account.payment.term"].search([], limit=1)
12+
return first_payment_term
13+
14+
@api.model
15+
def create(self, vals):
16+
"""Override create to set default payment term if needed."""
17+
# If partner_id is provided but payment_term_id is not
18+
if vals.get("partner_id") and not vals.get("payment_term_id"):
19+
# Check if partner has a payment term
20+
partner = self.env["res.partner"].browse(vals["partner_id"])
21+
if partner.property_payment_term_id:
22+
# Use partner's payment term
23+
vals["payment_term_id"] = partner.property_payment_term_id.id
24+
else:
25+
# Use our default
26+
vals["payment_term_id"] = self._default_payment_term_id().id
27+
28+
return super().create(vals)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_default_payment_term
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
from odoo.tests.common import TransactionCase
2+
3+
4+
class TestDefaultPaymentTerm(TransactionCase):
5+
"""Test the default payment term functionality."""
6+
7+
def setUp(self):
8+
super().setUp()
9+
# Create test data
10+
self.payment_term_1 = self.env["account.payment.term"].create(
11+
{
12+
"name": "Test Payment Term 1",
13+
"line_ids": [
14+
(
15+
0,
16+
0,
17+
{
18+
"value": "balance",
19+
"days": 0,
20+
},
21+
)
22+
],
23+
}
24+
)
25+
self.payment_term_2 = self.env["account.payment.term"].create(
26+
{
27+
"name": "Test Payment Term 2",
28+
"line_ids": [
29+
(
30+
0,
31+
0,
32+
{
33+
"value": "balance",
34+
"days": 30,
35+
},
36+
)
37+
],
38+
}
39+
)
40+
self.partner = self.env["res.partner"].create(
41+
{
42+
"name": "Test Partner",
43+
}
44+
)
45+
46+
def test_default_payment_term(self):
47+
"""Test that the first payment term is set as default for new sales orders."""
48+
# Get the first payment term from the system using default ordering (sequence, id)
49+
first_payment_term = self.env["account.payment.term"].search([], limit=1)
50+
51+
# Make sure we have the actual ID for comparison
52+
self.assertTrue(
53+
first_payment_term.exists(),
54+
"At least one payment term must exist in the system",
55+
)
56+
57+
# Create a new sales order
58+
sale_order = self.env["sale.order"].create(
59+
{
60+
"partner_id": self.partner.id,
61+
}
62+
)
63+
64+
# Check that the payment term is set to the first payment term
65+
self.assertEqual(
66+
sale_order.payment_term_id.id,
67+
first_payment_term.id,
68+
"The default payment term should be the first one in the system",
69+
)
70+
71+
def test_manual_payment_term_selection(self):
72+
"""Test that a manually selected payment term is respected."""
73+
# Create a new sales order with a specific payment term
74+
sale_order = self.env["sale.order"].create(
75+
{
76+
"partner_id": self.partner.id,
77+
"payment_term_id": self.payment_term_2.id,
78+
}
79+
)
80+
81+
# Check that the payment term is set to the specified payment term
82+
self.assertEqual(
83+
sale_order.payment_term_id,
84+
self.payment_term_2,
85+
"The payment term should be the one specified during creation",
86+
)
87+
88+
def test_partner_payment_term(self):
89+
"""Test that the partner's payment term is used when available."""
90+
# Set a payment term on the partner
91+
self.partner.property_payment_term_id = self.payment_term_2
92+
93+
# Verify the partner's payment term is set correctly
94+
self.assertEqual(
95+
self.partner.property_payment_term_id.id,
96+
self.payment_term_2.id,
97+
"Partner's payment term should be set correctly",
98+
)
99+
100+
# Create a new sales order with this partner
101+
sale_order = self.env["sale.order"].create(
102+
{
103+
"partner_id": self.partner.id,
104+
}
105+
)
106+
107+
# Debug: Log payment term IDs
108+
import logging
109+
110+
_logger = logging.getLogger(__name__)
111+
_logger.info(
112+
"Partner payment term ID: %s", self.partner.property_payment_term_id.id
113+
)
114+
_logger.info("Sale order payment term ID: %s", sale_order.payment_term_id.id)
115+
_logger.info("Test payment term 2 ID: %s", self.payment_term_2.id)
116+
117+
# Our module sets the default payment term, but the standard Odoo behavior
118+
# should prioritize the partner's payment term if it exists.
119+
# This test verifies that the standard behavior is preserved.
120+
self.assertEqual(
121+
sale_order.payment_term_id.id,
122+
self.payment_term_2.id,
123+
"The payment term should be the one from the partner's property_payment_term_id",
124+
)
125+
126+
# Clean up: Unset the payment term on the partner to avoid influencing other tests
127+
self.partner.property_payment_term_id = False

0 commit comments

Comments
 (0)