============================ Account Dunning Fee Scenario ============================ Imports:: >>> import datetime as dt >>> 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.company.tests.tools import create_company >>> from trytond.tests.tools import activate_modules Activate modules:: >>> config = activate_modules('account_dunning_fee', create_company, create_chart) Reload the context:: >>> User = Model.get('res.user') >>> Group = Model.get('res.group') >>> config._context = User.get_preferences(True, config.context) Create fiscal year:: >>> fiscalyear = create_fiscalyear() >>> fiscalyear.click('create_period') >>> period = fiscalyear.periods[0] Get accounts:: >>> accounts = get_accounts() >>> receivable = accounts['receivable'] >>> revenue = accounts['revenue'] >>> Journal = Model.get('account.journal') >>> journal_revenue, = Journal.find([ ... ('code', '=', 'REV'), ... ]) >>> journal_revenue.save() Create account category:: >>> ProductCategory = Model.get('product.category') >>> account_category = ProductCategory(name="Account Category") >>> account_category.accounting = True >>> account_category.account_revenue = revenue >>> account_category.save() Create fees:: >>> Fee = Model.get('account.dunning.fee') >>> ProductTemplate = Model.get('product.template') >>> ProductUom = Model.get('product.uom') >>> unit, = ProductUom.find([('name', '=', 'Unit')]) >>> template_fee = ProductTemplate(name='Fee') >>> template_fee.default_uom = unit >>> template_fee.type = 'service' >>> template_fee.list_price = Decimal('10') >>> template_fee.account_category = account_category >>> template_fee.save() >>> product_fee, = template_fee.products >>> fee = Fee(name='Fee') >>> fee.product = product_fee >>> fee.journal = journal_revenue >>> fee.compute_method = 'list_price' >>> fee.save() >>> fee_pc = Fee(name='Fee 15%') >>> fee_pc.product = product_fee >>> fee_pc.journal = journal_revenue >>> fee_pc.compute_method = 'percentage' >>> fee_pc.percentage = Decimal('.15') >>> fee_pc.save() Create dunning procedure:: >>> Procedure = Model.get('account.dunning.procedure') >>> procedure = Procedure(name='Procedure Fee') >>> level = procedure.levels.new() >>> level.overdue = dt.timedelta(5) >>> level.fee = fee >>> level = procedure.levels.new() >>> level.overdue = dt.timedelta(10) >>> level.fee = fee_pc >>> procedure.save() Create parties:: >>> Party = Model.get('party.party') >>> customer = Party(name='Customer') >>> customer.dunning_procedure = procedure >>> customer.save() Create move:: >>> Move = Model.get('account.move') >>> move = Move() >>> move.period = period >>> move.journal = journal_revenue >>> move.date = period.start_date >>> line = move.lines.new() >>> line.account = revenue >>> line.credit = Decimal(100) >>> line = move.lines.new() >>> line.account = receivable >>> line.debit = Decimal(100) >>> line.party = customer >>> line.maturity_date = period.start_date >>> move.save() Check accounts:: >>> receivable.reload() >>> receivable.balance Decimal('100.00') >>> revenue.reload() >>> revenue.balance Decimal('-100.00') Create dunning on 5 days:: >>> Dunning = Model.get('account.dunning') >>> create_dunning = Wizard('account.dunning.create') >>> create_dunning.form.date = ( ... period.start_date + dt.timedelta(days=5)) >>> create_dunning.execute('create_') >>> dunning, = Dunning.find([]) Process dunning:: >>> process_dunning = Wizard('account.dunning.process', ... [dunning]) >>> process_dunning.execute('process') Check accounts:: >>> receivable.reload() >>> receivable.balance Decimal('110.00') >>> revenue.reload() >>> revenue.balance Decimal('-110.00') Create dunning on 10 days:: >>> Dunning = Model.get('account.dunning') >>> create_dunning = Wizard('account.dunning.create') >>> create_dunning.form.date = (period.start_date ... + dt.timedelta(days=10)) >>> create_dunning.execute('create_') >>> dunning, = Dunning.find([]) Process dunning:: >>> process_dunning = Wizard('account.dunning.process', ... [dunning]) >>> process_dunning.execute('process') Check accounts:: >>> receivable.reload() >>> receivable.balance Decimal('125.00') >>> revenue.reload() >>> revenue.balance Decimal('-125.00')