316 lines
12 KiB
ReStructuredText
316 lines
12 KiB
ReStructuredText
=======================
|
|
Sale Reporting Scenario
|
|
=======================
|
|
|
|
Imports::
|
|
|
|
>>> from decimal import Decimal
|
|
|
|
>>> from dateutil.relativedelta import relativedelta
|
|
|
|
>>> from proteus import Model
|
|
>>> 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, assertEqual
|
|
|
|
Activate modules::
|
|
|
|
>>> config = activate_modules('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 countries::
|
|
|
|
>>> Region = Model.get('country.region')
|
|
>>> Country = Model.get('country.country')
|
|
>>> Subdivision = Model.get('country.subdivision')
|
|
>>> north_america, = Region.find([('code_numeric', '=', '021')])
|
|
>>> country_us = Country(name="United States", region=north_america)
|
|
>>> country_us.save()
|
|
>>> california = Subdivision(
|
|
... name="California", type='state', country=country_us)
|
|
>>> california.save()
|
|
>>> new_york = Subdivision(
|
|
... name="New York", type='state', country=country_us)
|
|
>>> new_york.save()
|
|
|
|
Create party categories::
|
|
|
|
>>> PartyCategory = Model.get('party.category')
|
|
>>> party_category_root1 = PartyCategory(name="Root1")
|
|
>>> party_category_root1.save()
|
|
>>> party_category_child1 = PartyCategory(
|
|
... name="Child1", parent=party_category_root1)
|
|
>>> party_category_child1.save()
|
|
>>> party_category_child2 = PartyCategory(
|
|
... name="Child2", parent=party_category_root1)
|
|
>>> party_category_child2.save()
|
|
>>> party_category_root2 = PartyCategory(name="Root2")
|
|
>>> party_category_root2.save()
|
|
|
|
Create parties::
|
|
|
|
>>> Party = Model.get('party.party')
|
|
>>> customer1 = Party(name='Customer1')
|
|
>>> customer1.categories.append(PartyCategory(party_category_child1.id))
|
|
>>> customer1.categories.append(PartyCategory(party_category_root2.id))
|
|
>>> address, = customer1.addresses
|
|
>>> address.country = country_us
|
|
>>> address.subdivision = california
|
|
>>> customer1.save()
|
|
>>> customer2 = Party(name='Customer2')
|
|
>>> customer2.categories.append(PartyCategory(party_category_child2.id))
|
|
>>> address, = customer2.addresses
|
|
>>> address.country = country_us
|
|
>>> address.subdivision = new_york
|
|
>>> customer2.save()
|
|
|
|
Create account categories::
|
|
|
|
>>> Category = Model.get('product.category')
|
|
>>> account_category = Category(name="Account Category")
|
|
>>> account_category.accounting = True
|
|
>>> account_category.account_revenue = revenue
|
|
>>> account_category.save()
|
|
|
|
Create products::
|
|
|
|
>>> ProductUom = Model.get('product.uom')
|
|
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
|
|
>>> ProductTemplate = Model.get('product.template')
|
|
|
|
>>> template1 = ProductTemplate()
|
|
>>> template1.name = "Product1"
|
|
>>> template1.default_uom = unit
|
|
>>> template1.type = 'service'
|
|
>>> template1.salable = True
|
|
>>> template1.list_price = Decimal('10')
|
|
>>> template1.account_category = account_category
|
|
>>> template1.save()
|
|
>>> product1, = template1.products
|
|
|
|
>>> template2, = template1.duplicate(default={'name': "Product2"})
|
|
>>> template2.account_category = account_category
|
|
>>> template2.save()
|
|
>>> product2, = template2.products
|
|
|
|
>>> category_root1 = Category(name="Root1")
|
|
>>> category_root1.save()
|
|
>>> category_child1 = Category(name="Child1", parent=category_root1)
|
|
>>> category_child1.save()
|
|
>>> category_child2 = Category(name="Child2", parent=category_root1)
|
|
>>> category_child2.save()
|
|
>>> category_root2 = Category(name="Root2")
|
|
>>> category_root2.save()
|
|
|
|
>>> template1.categories.append(Category(category_child1.id))
|
|
>>> template1.categories.append(Category(category_root2.id))
|
|
>>> template1.save()
|
|
>>> template2.categories.append(Category(category_child2.id))
|
|
>>> template2.save()
|
|
|
|
Create sales::
|
|
|
|
>>> Sale = Model.get('sale.sale')
|
|
|
|
>>> sale1 = Sale()
|
|
>>> sale1.party = customer1
|
|
>>> sale1.sale_date = fiscalyear.start_date
|
|
>>> line = sale1.lines.new()
|
|
>>> line.product = product1
|
|
>>> line.quantity = 2
|
|
>>> line = sale1.lines.new()
|
|
>>> line.product = product2
|
|
>>> line.quantity = 1
|
|
>>> sale1.click('quote')
|
|
>>> sale1.click('confirm')
|
|
|
|
>>> sale2 = Sale()
|
|
>>> sale2.party = customer2
|
|
>>> sale2.sale_date = fiscalyear.start_date + relativedelta(months=1)
|
|
>>> line = sale2.lines.new()
|
|
>>> line.product = product1
|
|
>>> line.quantity = 1
|
|
>>> sale2.click('quote')
|
|
>>> sale2.click('confirm')
|
|
|
|
Check sale reporting per customer::
|
|
|
|
>>> Customer = Model.get('sale.reporting.customer')
|
|
>>> CustomerTimeseries = Model.get('sale.reporting.customer.time_series')
|
|
>>> context = dict(
|
|
... from_date=fiscalyear.start_date,
|
|
... to_date=fiscalyear.end_date,
|
|
... period='month')
|
|
>>> with config.set_context(context=context):
|
|
... reports = Customer.find([])
|
|
... time_series = CustomerTimeseries.find([])
|
|
>>> len(reports)
|
|
2
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.customer.id, r.number, r.revenue) for r in reports},
|
|
... {(customer1.id, 1, Decimal('30')),
|
|
... (customer2.id, 1, Decimal('10'))})
|
|
>>> len(time_series)
|
|
2
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.customer.id, r.date, r.number, r.revenue)
|
|
... for r in time_series},
|
|
... {(customer1.id, sale1.sale_date.replace(day=1), 1, Decimal('30')),
|
|
... (customer2.id, sale2.sale_date.replace(day=1), 1, Decimal('10'))})
|
|
|
|
Check sale reporting per customer categories::
|
|
|
|
>>> CustomerCategory = Model.get('sale.reporting.customer.category')
|
|
>>> CustomerCategoryTimeseries = Model.get(
|
|
... 'sale.reporting.customer.category.time_series')
|
|
>>> CustomerCategoryTree = Model.get('sale.reporting.customer.category.tree')
|
|
>>> with config.set_context(context=context):
|
|
... reports = CustomerCategory.find([])
|
|
... time_series = CustomerCategoryTimeseries.find([])
|
|
... tree = CustomerCategoryTree.find([])
|
|
>>> len(reports)
|
|
3
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.category.id, r.number, r.revenue) for r in reports},
|
|
... {(party_category_child1.id, 1, Decimal('30')),
|
|
... (party_category_root2.id, 1, Decimal('30')),
|
|
... (party_category_child2.id, 1, Decimal('10'))})
|
|
>>> len(time_series)
|
|
3
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({
|
|
... (r.category.id, r.date, r.number, r.revenue)
|
|
... for r in time_series},
|
|
... {
|
|
... (party_category_child1.id, sale1.sale_date.replace(day=1),
|
|
... 1, Decimal('30')),
|
|
... (party_category_root2.id, sale1.sale_date.replace(day=1),
|
|
... 1, Decimal('30')),
|
|
... (party_category_child2.id, sale2.sale_date.replace(day=1),
|
|
... 1, Decimal('10'))})
|
|
>>> len(tree)
|
|
4
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.name, r.revenue) for r in tree},
|
|
... {('Root1', Decimal('40')),
|
|
... ('Child1', Decimal('30')),
|
|
... ('Child2', Decimal('10')),
|
|
... ('Root2', Decimal('30'))})
|
|
>>> child1, = CustomerCategoryTree.find([('rec_name', '=', 'Child1')])
|
|
>>> child1.rec_name
|
|
'Child1'
|
|
|
|
Check sale reporting per product::
|
|
|
|
>>> Product = Model.get('sale.reporting.product')
|
|
>>> ProductTimeseries = Model.get('sale.reporting.product.time_series')
|
|
>>> with config.set_context(context=context):
|
|
... reports = Product.find([])
|
|
... time_series = ProductTimeseries.find([])
|
|
>>> len(reports)
|
|
2
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.product.id, r.number, r.revenue) for r in reports},
|
|
... {(product1.id, 2, Decimal('30')),
|
|
... (product2.id, 1, Decimal('10'))})
|
|
>>> len(time_series)
|
|
3
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.product.id, r.date, r.number, r.revenue)
|
|
... for r in time_series},
|
|
... {(product1.id, sale1.sale_date.replace(day=1), 1, Decimal('20')),
|
|
... (product2.id, sale1.sale_date.replace(day=1), 1, Decimal('10')),
|
|
... (product1.id, sale2.sale_date.replace(day=1), 1, Decimal('10'))})
|
|
|
|
Check sale reporting per product categories::
|
|
|
|
>>> ProductCategory = Model.get('sale.reporting.product.category')
|
|
>>> ProductCategoryTimeseries = Model.get(
|
|
... 'sale.reporting.product.category.time_series')
|
|
>>> ProductCategoryTree = Model.get('sale.reporting.product.category.tree')
|
|
>>> with config.set_context(context=context):
|
|
... reports = ProductCategory.find([])
|
|
... time_series = ProductCategoryTimeseries.find([])
|
|
... tree = ProductCategoryTree.find([])
|
|
>>> len(reports)
|
|
4
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.category.id, r.number, r.revenue) for r in reports},
|
|
... {(category_child1.id, 2, Decimal('30')),
|
|
... (category_root2.id, 2, Decimal('30')),
|
|
... (category_child2.id, 1, Decimal('10')),
|
|
... (account_category.id, 2, Decimal('40'))})
|
|
>>> len(time_series)
|
|
7
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.category.id, r.date, r.number, r.revenue)
|
|
... for r in time_series},
|
|
... {(category_child1.id, sale1.sale_date.replace(day=1), 1, Decimal('20')),
|
|
... (category_root2.id, sale1.sale_date.replace(day=1), 1, Decimal('20')),
|
|
... (category_child2.id, sale1.sale_date.replace(day=1), 1, Decimal('10')),
|
|
... (category_child1.id, sale2.sale_date.replace(day=1), 1, Decimal('10')),
|
|
... (category_root2.id, sale2.sale_date.replace(day=1), 1, Decimal('10')),
|
|
... (account_category.id, sale1.sale_date.replace(day=1), 1, Decimal('30')),
|
|
... (account_category.id, sale2.sale_date.replace(day=1), 1, Decimal('10'))})
|
|
>>> len(tree)
|
|
5
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.name, r.revenue) for r in tree},
|
|
... {('Root1', Decimal('40')),
|
|
... ('Child1', Decimal('30')),
|
|
... ('Child2', Decimal('10')),
|
|
... ('Root2', Decimal('30')),
|
|
... ('Account Category', Decimal('40'))})
|
|
>>> child1, = ProductCategoryTree.find([('rec_name', '=', 'Child1')])
|
|
>>> child1.rec_name
|
|
'Child1'
|
|
|
|
Check sale reporting per countries::
|
|
|
|
>>> RegionTree = Model.get('sale.reporting.region.tree')
|
|
>>> CountryTree = Model.get('sale.reporting.country.tree')
|
|
>>> CountryTimeseries = Model.get('sale.reporting.country.time_series')
|
|
>>> SubdivisionTimeseries = Model.get(
|
|
... 'sale.reporting.country.subdivision.time_series')
|
|
>>> with config.set_context(context=context):
|
|
... region = RegionTree(north_america.id)
|
|
... countries = CountryTree.find([])
|
|
... country_time_series = CountryTimeseries.find([])
|
|
... subdivision_time_series = SubdivisionTimeseries.find([])
|
|
>>> region.revenue
|
|
Decimal('40.00')
|
|
>>> region.parent.revenue
|
|
Decimal('40.00')
|
|
>>> len(countries)
|
|
3
|
|
>>> with config.set_context(context=context):
|
|
... sorted((c.region, c.number, c.revenue) for c in countries)
|
|
[('California', 1, Decimal('30.00')), ('New York', 1, Decimal('10.00')), ('United States', 2, Decimal('40.00'))]
|
|
>>> len(country_time_series)
|
|
2
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.country.id, r.date, r.number, r.revenue)
|
|
... for r in country_time_series},
|
|
... {(country_us.id, sale1.sale_date.replace(day=1), 1, Decimal('30')),
|
|
... (country_us.id, sale2.sale_date.replace(day=1), 1, Decimal('10'))})
|
|
>>> len(subdivision_time_series)
|
|
2
|
|
>>> with config.set_context(context=context):
|
|
... assertEqual({(r.subdivision.id, r.date, r.number, r.revenue)
|
|
... for r in subdivision_time_series},
|
|
... {(california.id, sale1.sale_date.replace(day=1), 1, Decimal('30')),
|
|
... (new_york.id, sale2.sale_date.replace(day=1), 1, Decimal('10'))})
|