====================== Analytic Sale 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 ( ... create_payment_term, set_fiscalyear_invoice_sequences) >>> from trytond.modules.company.tests.tools import create_company >>> from trytond.tests.tools import activate_modules, assertEqual Activate modules:: >>> config = activate_modules('analytic_sale', create_company, create_chart) Create fiscal year:: >>> fiscalyear = set_fiscalyear_invoice_sequences( ... create_fiscalyear()) >>> fiscalyear.click('create_period') Get accounts:: >>> accounts = get_accounts() >>> revenue = accounts['revenue'] >>> expense = accounts['expense'] Create analytic accounts:: >>> AnalyticAccount = Model.get('analytic_account.account') >>> root = AnalyticAccount(type='root', name='Root') >>> root.save() >>> analytic_account = AnalyticAccount(root=root, parent=root, ... name='Analytic') >>> analytic_account.save() Create parties:: >>> Party = Model.get('party.party') >>> customer = Party(name='Customer') >>> customer.save() Create account category:: >>> ProductCategory = Model.get('product.category') >>> account_category = ProductCategory(name="Account Category") >>> account_category.accounting = True >>> account_category.account_expense = expense >>> account_category.account_revenue = revenue >>> account_category.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.account_category = account_category >>> template.save() >>> product, = template.products Create payment term:: >>> payment_term = create_payment_term() >>> payment_term.save() Sale with analytic accounts:: >>> Sale = Model.get('sale.sale') >>> SaleLine = Model.get('sale.line') >>> sale = Sale() >>> sale.party = customer >>> sale.payment_term = payment_term >>> sale.invoice_method = 'order' >>> sale_line = sale.lines.new() >>> entry, = sale_line.analytic_accounts >>> assertEqual(entry.root, root) >>> entry.account = analytic_account >>> sale_line.product = product >>> sale_line.quantity = 5 >>> sale.click('quote') >>> sale.click('confirm') >>> sale.state 'processing' Check analytic accounts on invoice:: >>> Invoice = Model.get('account.invoice') >>> invoice = Invoice(sale.invoices[0].id) >>> invoice_line, = invoice.lines >>> entry, = invoice_line.analytic_accounts >>> assertEqual(entry.account, analytic_account) Sale with an empty analytic account:: >>> Sale = Model.get('sale.sale') >>> SaleLine = Model.get('sale.line') >>> sale = Sale() >>> sale.party = customer >>> sale.payment_term = payment_term >>> sale.invoice_method = 'order' >>> sale_line = sale.lines.new() >>> entry, = sale_line.analytic_accounts >>> sale_line.product = product >>> sale_line.quantity = 5 >>> sale.click('quote') >>> sale.click('confirm') >>> sale.state 'processing' >>> invoice, = sale.invoices Check invoice analytic accounts:: >>> invoice_line, = invoice.lines >>> entry, = invoice_line.analytic_accounts >>> entry.account Return sales using the wizard:: >>> return_sale = Wizard('sale.return_sale', [sale]) >>> return_sale.execute('return_') >>> returned_sale, = Sale.find([ ... ('state', '=', 'draft'), ... ]) >>> sale_line, = returned_sale.lines >>> entry, = sale_line.analytic_accounts >>> entry.account