From a18aeceaafb3190d7a7525e92940744dc0747343 Mon Sep 17 00:00:00 2001 From: C?dric Krier Date: Tue, 12 Dec 2017 13:22:31 +0100 Subject: [PATCH] Update to 4.7 --- MANIFEST.in | 2 +- __init__.py | 4 +- invoice.fodt | 1157 ++++++++++++++++++++++++++++++++++++ invoice.odt | Bin 12952 -> 0 bytes invoice.py | 12 +- invoice.xml | 12 +- setup.py | 2 +- tests/scenario_invoice.rst | 8 +- tox.ini | 4 +- tryton.cfg | 2 +- 10 files changed, 1183 insertions(+), 20 deletions(-) create mode 100644 invoice.fodt delete mode 100644 invoice.odt diff --git a/MANIFEST.in b/MANIFEST.in index 1489ca2..4c6b589 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,4 +9,4 @@ include view/*.xml include locale/*.po include doc/* include tests/*.rst -include *.odt +include *.fodt diff --git a/__init__.py b/__init__.py index 497aecd..713e62f 100644 --- a/__init__.py +++ b/__init__.py @@ -1,10 +1,10 @@ # The COPYRIGHT file at the top level of this repository contains the full # copyright notices and license terms. from trytond.pool import Pool -from .invoice import * +from . import invoice def register(): Pool.register( - InvoiceLine, + invoice.InvoiceLine, module='account_invoice_discount', type_='model') diff --git a/invoice.fodt b/invoice.fodt new file mode 100644 index 0000000..2e6bfec --- /dev/null +++ b/invoice.fodt @@ -0,0 +1,1157 @@ + + + + LibreOffice/5.4.2.2.0$Linux_X86_64 LibreOffice_project/40m0$Build-22012-11-15T15:00:351P0D + + + 55541 + 0 + 25049 + 21408 + true + false + + + view2 + 3729 + 79347 + 0 + 55541 + 25047 + 76948 + 0 + 1 + false + 100 + false + false + + + + + false + true + true + true + 0 + true + true + + false + false + false + false + false + false + false + false + false + false + false + false + false + true + false + true + true + false + false + false + false + + false + false + false + true + false + false + + false + false + false + false + true + 2578396 + false + true + false + false + true + true + false + true + 0 + false + true + high-resolution + false + false + false + true + true + true + + true + false + false + true + false + false + false + + false + false + 882034 + false + 1 + true + false + false + 0 + false + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <if test="invoice.company.header"> + <for each="line in invoice.company.header.split('\n')"> + <line> + </for> + </if> + <invoice.company.rec_name> + + + <if test="invoice.company.footer"> + <for each="line in invoice.company.footer.split('\n')"> + <line> + </for> + </if> + + + + + + + + + + + + + <replace text:p="set_lang(invoice.party.lang and invoice.party.lang.code or 'en')"> + <replace text:p="invoice.set_lang(invoice.party.lang and invoice.party.lang.code or 'en')"> + <for each="line in invoice.invoice_address.full_address.split('\n')"> + <line> + </for> + <if test="invoice.party_tax_identifier"> + <invoice.party_tax_identifier.type_string>: <invoice.party_tax_identifier.code> + </if> + <if test="invoice.type == 'in'"> + Supplier Invoice N°:<invoice.number and ' ' + invoice.number or ''> + </if> + <if test="invoice.type == 'out'"> + <choose test=""> + <when test="invoice.state == 'draft'"> + Draft Invoice + </when> + <when test="invoice.state == 'validated'"> + Pro forma Invoice + </when> + <otherwise test=""> + Invoice N°:<invoice.number and ' ' + invoice.number or ''> + </otherwise> + </choose> + </if> + Description: <invoice.description or ''> + Reference: <invoice.origins or ''><', ' if (invoice.reference and invoice.origins) else ''><invoice.reference or ''> + <if test="invoice.invoice_date"> + Date: <format_date(invoice.invoice_date, invoice.party.lang)> + </if> + <if test="invoice.tax_identifier"> + <invoice.tax_identifier.type_string>: <invoice.tax_identifier.code> + </if> + + + + + + + + + + + + + Description + + + Quantity + + + + Unit Price + + + Discount + + + Taxes + + + Amount + + + + + + <for each="line in invoice.lines"> + + + + + + + + + + + + + <choose test=""> + + + + + + + + + + + + + <when test="line.type == 'line'"> + + + + + + + + + + + + + <for each="line in line.description.split('\n')"> + <line> + </for> + + + <(format_number(line.quantity, invoice.party.lang, digits=line.unit_digits) + (line.unit and (' ' + line.unit.symbol) or '')) or ''> + + + + <format_currency(line.unit_price, invoice.party.lang, invoice.currency)> + + + <format_number(line.discount * 100, invoice.party.lang)>% + + + <','.join('[' + str(x.sequence_number) + ']' for x in line.invoice_taxes)> + + + <format_currency(line.amount, invoice.party.lang, invoice.currency)> + + + + + + + + + + </when> + + + + + + + + + <when test="line.type == 'subtotal'"> + + + + + + + + + + + + + <for each="line in line.description.split('\n')"> + <line> + </for> + + + + + + + + + + <format_currency(line.amount, invoice.party.lang, invoice.currency)> + + + + + </when> + + + + + + + + + + + + + <when test="line.type == 'title'"> + + + + + + + + + + + + + <for each="line in line.description.split('\n')"> + <line> + </for> + + + + + + + + + + + + + </when> + + + + + + + + + + + + + <otherwise test=""> + + + + + + + + + + + + + <for each="line in line.description.split('\n')"> + <line> + </for> + + + + + + + + + + + + + </otherwise> + + + + + + + + + + + + + </choose> + + + + + + + + + + + + + </for> + + + + + + + + + + + + + + + + + + + + + + + + Tax + + + Base + + + Amount + + + + + + <for each="tax in invoice.taxes"> + + + + + + + <'[' + '%s' % tax.sequence_number + ']'><tax.description or ''> + + + <format_currency(tax.base, invoice.party.lang, invoice.currency)> + + + <format_currency(tax.amount, invoice.party.lang, invoice.currency)> + + + + + <if test="tax.legal_notice"> + + + + + + + <for each="line in tax.legal_notice.split('\n')"> + <line> + </for> + + + + + + + </if> + + + + + + + </for> + + + + + + + + + + + + + + Total (excl. taxes): + + + <format_currency(invoice.untaxed_amount, invoice.party.lang, invoice.currency)> + + + + + Taxes: + + + <format_currency(invoice.tax_amount, invoice.party.lang, invoice.currency)> + + + + + Total: + + + <format_currency(invoice.total_amount, invoice.party.lang, invoice.currency)> + + + + + + + + <if test="invoice.lines_to_pay"> + + + + + + + + Payment Term + <if test="invoice.payment_term and invoice.payment_term.description"> + <for each="description in (invoice.payment_term.description or '').split('\n')"> + <description> + </for> + </if> + + + + + + Date + + + Amount + + + + + + <for each="line in invoice.lines_to_pay"> + + + + + + <format_date(line.maturity_date, invoice.party.lang)> + + + <line.amount_second_currency and format_currency(line.amount_second_currency, invoice.party.lang, invoice.currency) or format_currency(line.debit - line.credit, invoice.party.lang, invoice.currency)> + + + + + </for> + + + + + </if> + <for each="comment in (invoice.comment or '').split('\n')"> + <comment> + </for> + + + \ No newline at end of file diff --git a/invoice.odt b/invoice.odt deleted file mode 100644 index b2a8457f84c68418f0700177fbc9f678da99ba63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12952 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 diff --git a/invoice.py b/invoice.py index 578bf28..06a8e73 100644 --- a/invoice.py +++ b/invoice.py @@ -33,13 +33,9 @@ class InvoiceLine: super(InvoiceLine, cls).__setup__() cls.unit_price.states['readonly'] = True cls.unit_price.digits = (20, price_digits[1] + discount_digits[1]) - if 'discount' not in cls.amount.on_change_with: - cls.amount.on_change_with.add('discount') - if 'gross_unit_price' not in cls.amount.on_change_with: - cls.amount.on_change_with.add('gross_unit_price') - @staticmethod - def default_discount(): + @classmethod + def default_discount(cls): return Decimal(0) def update_prices(self): @@ -78,6 +74,10 @@ class InvoiceLine: def on_change_discount(self): return self.update_prices() + @fields.depends('discount', 'gross_unit_price') + def on_change_with_amount(self): + return super(InvoiceLine, self).on_change_with_amount() + @fields.depends('gross_unit_price', 'unit_price', 'discount') def on_change_product(self): super(InvoiceLine, self).on_change_product() diff --git a/invoice.xml b/invoice.xml index 0a2a606..cbd1269 100644 --- a/invoice.xml +++ b/invoice.xml @@ -15,10 +15,20 @@ + + + + Invoice account.invoice account.invoice - account_invoice_discount/invoice.odt + account_invoice_discount/invoice.fodt + + + + form_print + account.invoice,-1 + diff --git a/setup.py b/setup.py index 1688a51..3c5c1ca 100644 --- a/setup.py +++ b/setup.py @@ -73,7 +73,7 @@ setup(name=name, ], package_data={ 'trytond.modules.account_invoice_discount': (info.get('xml', []) - + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.odt', + + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt', 'icons/*.svg', 'tests/*.rst']), }, classifiers=[ diff --git a/tests/scenario_invoice.rst b/tests/scenario_invoice.rst index 86c616b..67e067b 100644 --- a/tests/scenario_invoice.rst +++ b/tests/scenario_invoice.rst @@ -63,20 +63,16 @@ Create product:: >>> ProductUom = Model.get('product.uom') >>> unit, = ProductUom.find([('name', '=', 'Unit')]) >>> ProductTemplate = Model.get('product.template') - >>> Product = Model.get('product.product') - >>> product = Product() >>> template = ProductTemplate() >>> template.name = 'product' >>> template.default_uom = unit >>> template.type = 'service' >>> template.list_price = Decimal('20') - >>> template.cost_price = Decimal('12') >>> template.account_expense = expense >>> template.account_revenue = revenue >>> template.customer_taxes.append(tax) >>> template.save() - >>> product.template = template - >>> product.save() + >>> product, = template.products Create payment term:: @@ -179,7 +175,7 @@ Post invoice and check again invoice totals and taxes:: >>> credit_note_tax_code.sum Decimal('0.00') -Discounts are copyied when crediting the invoice:: +Discounts are copied when crediting the invoice:: >>> credit = Wizard('account.invoice.credit', [invoice]) >>> credit.form.with_refund = True diff --git a/tox.ini b/tox.ini index 08e43cf..527d859 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,10 @@ [tox] -envlist = {py27,py33,py34,py35}-{sqlite,postgresql,mysql},pypy-{sqlite,postgresql} +envlist = {py27,py34,py35,py36}-{sqlite,postgresql,mysql},pypy-{sqlite,postgresql} [testenv] commands = {envpython} setup.py test deps = - {py27,py33,py34,py35}-postgresql: psycopg2 >= 2.5 + {py27,py34,py35,py36}-postgresql: psycopg2 >= 2.5 pypy-postgresql: psycopg2cffi >= 2.5 mysql: MySQL-python sqlite: sqlitebck diff --git a/tryton.cfg b/tryton.cfg index b044ae0..9f91b73 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -1,5 +1,5 @@ [tryton] -version=4.3.0 +version=4.7.0 depends: ir account_invoice