first commit

This commit is contained in:
root
2026-03-14 09:42:12 +00:00
commit 0adbd20c2c
10991 changed files with 1646955 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

Binary file not shown.

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Preu base"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Descompte"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Import descompte"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "% Descompte"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Descompte"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Basispreis"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Rabatt"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Rabattbetrag"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Rabattsatz"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Rabatt"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Precio base"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Descuento"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Importe descuento"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "% Descuento"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Descuento"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Prix de base"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Remise"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Montant de la remise"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Taux de remise"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Remise"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Alapár"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Engedmény"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Engedmény (összeg)"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Engedmény (%)"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Engedmény"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Prezzo Base"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Sconto"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Totale sconto"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Tasso di sconto"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Sconto"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Basisprijs"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Korting"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Korting hoeveelheid"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Kortingspercentage"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Korting"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Cena podstawowa"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Rabat"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Wartość rabatu"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Wysokość rabatu"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Rabat"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr "Preț Baza"
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr "Reducere"
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr "Sumă Reducere"
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr "Rata Reducere"
msgctxt "view:sale.line:"
msgid "%"
msgstr "%"
msgctxt "view:sale.line:"
msgid "Discount"
msgstr "Reducere"

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,27 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:sale.line,base_price:"
msgid "Base Price"
msgstr ""
msgctxt "field:sale.line,discount:"
msgid "Discount"
msgstr ""
msgctxt "field:sale.line,discount_amount:"
msgid "Discount Amount"
msgstr ""
msgctxt "field:sale.line,discount_rate:"
msgid "Discount Rate"
msgstr ""
msgctxt "view:sale.line:"
msgid "%"
msgstr ""
msgctxt "view:sale.line:"
msgid "Discount"
msgstr ""

View File

@@ -0,0 +1,151 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from trytond.model import fields
from trytond.modules.currency.fields import Monetary
from trytond.modules.product import price_digits, round_price
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
class Line(metaclass=PoolMeta):
__name__ = 'sale.line'
base_price = Monetary(
"Base Price", currency='currency', digits=price_digits,
states={
'invisible': Eval('type') != 'line',
'readonly': Eval('sale_state') != 'draft',
})
discount_rate = fields.Function(fields.Numeric(
"Discount Rate", digits=(None, 4),
states={
'invisible': Eval('type') != 'line',
'readonly': Eval('sale_state') != 'draft',
}),
'on_change_with_discount_rate', setter='set_discount_rate')
discount_amount = fields.Function(Monetary(
"Discount Amount", currency='currency', digits=price_digits,
states={
'invisible': Eval('type') != 'line',
'readonly': Eval('sale_state') != 'draft',
}),
'on_change_with_discount_amount', setter='set_discount_amount')
discount = fields.Function(fields.Char(
"Discount",
states={
'invisible': ~Eval('discount'),
}),
'on_change_with_discount')
@fields.depends(
methods=[
'compute_base_price', 'on_change_with_discount_rate',
'on_change_with_discount_amount', 'on_change_with_discount'])
def on_change_product(self):
super().on_change_product()
if self.product:
self.base_price = self.compute_base_price()
self.discount_rate = self.on_change_with_discount_rate()
self.discount_amount = self.on_change_with_discount_amount()
self.discount = self.on_change_with_discount()
@fields.depends('product', 'unit')
def compute_base_price(self):
pool = Pool()
Uom = pool.get('product.uom')
if (self.product
and (price := self.product.list_price_used) is not None):
if self.unit:
price = Uom.compute_price(
self.product.default_uom, price, self.unit)
return round_price(price)
@fields.depends(
methods=[
'compute_base_price', 'on_change_with_discount_rate',
'on_change_with_discount_amount', 'on_change_with_discount'])
def on_change_quantity(self):
super().on_change_quantity()
self.base_price = self.compute_base_price()
self.discount_rate = self.on_change_with_discount_rate()
self.discount_amount = self.on_change_with_discount_amount()
self.discount = self.on_change_with_discount()
@fields.depends('unit_price', 'base_price')
def on_change_with_discount_rate(self, name=None):
if self.unit_price is None or not self.base_price:
return
rate = 1 - self.unit_price / self.base_price
return rate.quantize(
Decimal(1) / 10 ** self.__class__.discount_rate.digits[1])
@fields.depends(
'base_price', 'discount_rate',
methods=['on_change_with_discount_amount', 'on_change_with_discount',
'on_change_with_amount'])
def on_change_discount_rate(self):
if self.base_price is not None and self.discount_rate is not None:
self.unit_price = round_price(
self.base_price * (1 - self.discount_rate))
self.discount_amount = self.on_change_with_discount_amount()
self.discount = self.on_change_with_discount()
self.amount = self.on_change_with_amount()
@classmethod
def set_discount_rate(cls, lines, name, value):
pass
@fields.depends('unit_price', 'base_price')
def on_change_with_discount_amount(self, name=None):
if self.unit_price is None or self.base_price is None:
return
return round_price(self.base_price - self.unit_price)
@fields.depends(
'base_price', 'discount_amount',
methods=['on_change_with_discount_rate', 'on_change_with_discount',
'on_change_with_amount'])
def on_change_discount_amount(self):
if self.base_price is not None and self.discount_amount is not None:
self.unit_price = round_price(
self.base_price - self.discount_amount)
self.discount_rate = self.on_change_with_discount_rate()
self.discount = self.on_change_with_discount()
self.amount = self.on_change_with_amount()
@classmethod
def set_discount_amount(cls, lines, name, value):
pass
@fields.depends(
'sale', '_parent_sale.currency',
methods=[
'on_change_with_discount_rate', 'on_change_with_discount_amount'])
def on_change_with_discount(self, name=None):
pool = Pool()
Lang = pool.get('ir.lang')
lang = Lang.get()
rate = self.on_change_with_discount_rate()
if not rate or rate % Decimal('0.01'):
amount = self.on_change_with_discount_amount()
if amount:
if self.sale and self.sale.currency:
return lang.currency(
amount, self.sale.currency, digits=price_digits[1])
else:
return lang.format_number(
amount, digits=price_digits[1], monetary=True)
else:
return lang.format('%i', rate * 100) + '%'
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('/form//label[@id="discount"]', 'states', {
'invisible': Eval('type') != 'line',
}, ['type']),
]

View File

@@ -0,0 +1,24 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="sale_line_view_form">
<field name="model">sale.line</field>
<field name="inherit" ref="sale.sale_line_view_form"/>
<field name="name">sale_line_form</field>
</record>
<record model="ir.ui.view" id="sale_line_view_list">
<field name="model">sale.line</field>
<field name="inherit" ref="sale.sale_line_view_tree"/>
<field name="name">sale_line_list</field>
</record>
<record model="ir.ui.view" id="sale_line_view_list_sequence">
<field name="model">sale.line</field>
<field name="inherit" ref="sale.sale_line_view_tree_sequence"/>
<field name="name">sale_line_list</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

View File

@@ -0,0 +1,78 @@
======================
Sale Discount Scenario
======================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model
>>> from trytond.modules.company.tests.tools import create_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules('sale_discount', create_company)
Create parties::
>>> Party = Model.get('party.party')
>>> customer = Party(name="Customer")
>>> customer.save()
Create product::
>>> ProductUom = Model.get('product.uom')
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> ProductTemplate = Model.get('product.template')
>>> template = ProductTemplate()
>>> template.name = 'product'
>>> template.default_uom = unit
>>> template.type = 'goods'
>>> template.salable = True
>>> template.list_price = Decimal('10')
>>> template.save()
>>> product, = template.products
Create a sale::
>>> Sale = Model.get('sale.sale')
>>> sale = Sale()
>>> sale.party = customer
>>> line = sale.lines.new()
>>> line.product = product
>>> line.quantity = 1
>>> line.base_price
Decimal('10.0000')
>>> line.unit_price
Decimal('10.0000')
Set a discount of 10%::
>>> line.discount_rate = Decimal('0.1')
>>> line.unit_price
Decimal('9.0000')
>>> line.discount_amount
Decimal('1.0000')
>>> line.discount
'10%'
>>> sale.save()
>>> line, = sale.lines
>>> line.unit_price
Decimal('9.0000')
>>> line.discount_amount
Decimal('1.0000')
>>> line.discount
'10%'
Set a discount amount::
>>> line.discount_amount = Decimal('3.3333')
>>> line.unit_price
Decimal('6.6667')
>>> line.discount_rate
Decimal('0.3333')
>>> line.discount
'$3.3333'

View File

@@ -0,0 +1,12 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.tests.test_tryton import ModuleTestCase
class SaleDiscountTestCase(ModuleTestCase):
'Test Sale Discount module'
module = 'sale_discount'
del ModuleTestCase

View File

@@ -0,0 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.tests.test_tryton import load_doc_tests
def load_tests(*args, **kwargs):
return load_doc_tests(__name__, __file__, *args, **kwargs)

View File

@@ -0,0 +1,12 @@
[tryton]
version=7.8.0
depends:
ir
product
sale
xml:
sale.xml
[register]
model:
sale.Line

View File

@@ -0,0 +1,17 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//label[@name='unit_price']" position="before">
<label name="base_price"/>
<field name="base_price"/>
<label id="discount" string="Discount"/>
<group col="-1" id="discounts">
<group col="-1" id="discount_rate">
<field name="discount_rate" factor="100" xexpand="0"/>
<label name="discount_rate" string="%" xalign="0.0" xexpand="1"/>
</group>
<field name="discount_amount"/>
</group>
</xpath>
</data>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='unit_price']" position="before">
<field name="base_price" optional="1"/>
<field name="discount_rate" factor="100" optional="1">
<suffix name="discount_rate" string="%"/>
</field>
<field name="discount_amount" optional="1"/>
</xpath>
</data>