156 lines
4.0 KiB
ReStructuredText
156 lines
4.0 KiB
ReStructuredText
========================
|
|
Invoice Payment Scenario
|
|
========================
|
|
|
|
Imports::
|
|
|
|
>>> from decimal import Decimal
|
|
|
|
>>> from proteus import Model, Wizard
|
|
>>> from trytond.modules.account.tests.tools import (
|
|
... create_chart, create_fiscalyear, get_accounts)
|
|
>>> from trytond.modules.account_invoice.tests.tools import (
|
|
... set_fiscalyear_invoice_sequences)
|
|
>>> from trytond.modules.company.tests.tools import create_company
|
|
>>> from trytond.tests.tools import activate_modules
|
|
|
|
Activate modules::
|
|
|
|
>>> config = activate_modules(
|
|
... ['account_payment', 'account_invoice'], create_company, create_chart)
|
|
|
|
Create fiscal year::
|
|
|
|
>>> fiscalyear = set_fiscalyear_invoice_sequences(create_fiscalyear())
|
|
>>> fiscalyear.click('create_period')
|
|
|
|
Get accounts::
|
|
|
|
>>> accounts = get_accounts()
|
|
>>> payable = accounts['payable']
|
|
>>> receivable = accounts['receivable']
|
|
>>> revenue = accounts['revenue']
|
|
|
|
>>> Journal = Model.get('account.journal')
|
|
>>> expense, = Journal.find([('code', '=', 'EXP')])
|
|
|
|
Create payment journal::
|
|
|
|
>>> PaymentJournal = Model.get('account.payment.journal')
|
|
>>> payment_journal = PaymentJournal(name='Manual',
|
|
... process_method='manual')
|
|
>>> payment_journal.save()
|
|
|
|
Create party::
|
|
|
|
>>> Party = Model.get('party.party')
|
|
>>> party = Party(name='Party')
|
|
>>> party.save()
|
|
|
|
Create invoice::
|
|
|
|
>>> Invoice = Model.get('account.invoice')
|
|
>>> invoice = Invoice()
|
|
>>> invoice.party = party
|
|
>>> line = invoice.lines.new()
|
|
>>> line.description = 'Description'
|
|
>>> line.account = revenue
|
|
>>> line.quantity = 1
|
|
>>> line.unit_price = Decimal('100')
|
|
>>> invoice.click('post')
|
|
>>> invoice.state
|
|
'posted'
|
|
>>> invoice.amount_to_pay
|
|
Decimal('100.00')
|
|
>>> line_to_pay, = invoice.lines_to_pay
|
|
>>> bool(line_to_pay.payment_direct_debit)
|
|
False
|
|
|
|
Partially pay line::
|
|
|
|
>>> Payment = Model.get('account.payment')
|
|
>>> pay_line = Wizard('account.move.line.pay', [line_to_pay])
|
|
>>> pay_line.execute('next_')
|
|
>>> pay_line.execute('next_')
|
|
>>> payment, = Payment.find()
|
|
>>> payment.amount = Decimal('20')
|
|
>>> payment.click('submit')
|
|
|
|
Check amount to pay::
|
|
|
|
>>> invoice.reload()
|
|
>>> invoice.amount_to_pay
|
|
Decimal('80.00')
|
|
|
|
Process the payment::
|
|
|
|
>>> process_payment = payment.click('process_wizard')
|
|
|
|
Check amount to pay::
|
|
|
|
>>> invoice.reload()
|
|
>>> invoice.amount_to_pay
|
|
Decimal('80.00')
|
|
|
|
Fail the payment::
|
|
|
|
>>> payment.click('fail')
|
|
|
|
Check amount to pay::
|
|
|
|
>>> invoice.reload()
|
|
>>> invoice.amount_to_pay
|
|
Decimal('100.00')
|
|
|
|
Create multiple valid payments for one line::
|
|
|
|
>>> line_to_pay, = invoice.lines_to_pay
|
|
>>> pay_line = Wizard('account.move.line.pay', [line_to_pay])
|
|
>>> pay_line.execute('next_')
|
|
>>> pay_line.execute('next_')
|
|
>>> payment, = pay_line.actions[0]
|
|
>>> payment.amount
|
|
Decimal('100.00')
|
|
>>> payment.amount = Decimal('30.00')
|
|
>>> payment.save()
|
|
>>> pay_line = Wizard('account.move.line.pay', [line_to_pay])
|
|
>>> pay_line.execute('next_')
|
|
>>> pay_line.execute('next_')
|
|
>>> payment, = pay_line.actions[0]
|
|
>>> payment.amount
|
|
Decimal('70.00')
|
|
>>> payment.amount = Decimal('30.00')
|
|
>>> payment.save()
|
|
>>> payments = Payment.find([('state', '=', 'draft')])
|
|
>>> Payment.click(payments, 'submit')
|
|
|
|
Check amount to pay::
|
|
|
|
>>> invoice.reload()
|
|
>>> invoice.amount_to_pay
|
|
Decimal('40.00')
|
|
|
|
Set party as direct debit::
|
|
|
|
>>> party.payment_direct_debit = True
|
|
>>> party.save()
|
|
|
|
Create invoice::
|
|
|
|
>>> Invoice = Model.get('account.invoice')
|
|
>>> invoice = Invoice()
|
|
>>> invoice.party = party
|
|
>>> bool(invoice.payment_direct_debit)
|
|
True
|
|
>>> line = invoice.lines.new()
|
|
>>> line.description = 'Description'
|
|
>>> line.account = revenue
|
|
>>> line.quantity = 1
|
|
>>> line.unit_price = Decimal('50')
|
|
>>> invoice.click('post')
|
|
>>> invoice.state
|
|
'posted'
|
|
>>> line_to_pay, = invoice.lines_to_pay
|
|
>>> bool(line_to_pay.payment_direct_debit)
|
|
True
|