Files
tradon/modules/purchase/tests/scenario_purchase_reporting.rst
2026-03-14 09:42:12 +00:00

146 lines
5.0 KiB
ReStructuredText

===========================
Purchase 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('purchase', create_company, create_chart)
>>> Party = Model.get('party.party')
>>> ProductUom = Model.get('product.uom')
>>> ProductTemplate = Model.get('product.template')
>>> Purchase = Model.get('purchase.purchase')
>>> Supplier = Model.get('purchase.reporting.supplier')
>>> SupplierTimeseries = Model.get(
... 'purchase.reporting.supplier.time_series')
>>> Product = Model.get('purchase.reporting.product')
>>> ProductTimeseries = Model.get('purchase.reporting.product.time_series')
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(create_fiscalyear())
>>> fiscalyear.click('create_period')
Get accounts::
>>> accounts = get_accounts()
>>> expense = accounts['expense']
Create parties::
>>> supplier1 = Party(name='Supplier1')
>>> supplier1.save()
>>> supplier2 = Party(name='Supplier2')
>>> supplier2.save()
Create products::
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
>>> template1 = ProductTemplate()
>>> template1.name = "Product1"
>>> template1.default_uom = unit
>>> template1.type = 'service'
>>> template1.purchasable = True
>>> template1.list_price = Decimal('20')
>>> template1.save()
>>> product1, = template1.products
>>> template2, = template1.duplicate(default={'name': "Product2"})
>>> product2, = template2.products
Create purchases::
>>> purchase1 = Purchase()
>>> purchase1.party = supplier1
>>> purchase1.purchase_date = fiscalyear.start_date
>>> line = purchase1.lines.new()
>>> line.product = product1
>>> line.quantity = 2
>>> line.unit_price = Decimal('10.0000')
>>> line = purchase1.lines.new()
>>> line.product = product2
>>> line.quantity = 1
>>> line.unit_price = Decimal('10.0000')
>>> purchase1.click('quote')
>>> purchase1.click('confirm')
>>> purchase2 = Purchase()
>>> purchase2.party = supplier2
>>> purchase2.purchase_date = (
... fiscalyear.start_date + relativedelta(months=1))
>>> line = purchase2.lines.new()
>>> line.product = product1
>>> line.quantity = 1
>>> line.unit_price = Decimal('10.0000')
>>> purchase2.click('quote')
>>> purchase2.click('confirm')
Check purchase reporting per supplier::
>>> context = dict(
... from_date=fiscalyear.start_date,
... to_date=fiscalyear.end_date,
... period='month')
>>> with config.set_context(context=context):
... reports = Supplier.find([])
... time_series = SupplierTimeseries.find([])
>>> len(reports)
2
>>> with config.set_context(context=context):
... assertEqual({(r.supplier.id, r.number, r.expense) for r in reports},
... {(supplier1.id, 1, Decimal('30')),
... (supplier2.id, 1, Decimal('10'))})
>>> len(time_series)
2
>>> purchase1_ts_date = purchase1.purchase_date.replace(day=1)
>>> purchase2_ts_date = purchase2.purchase_date.replace(day=1)
>>> with config.set_context(context=context):
... assertEqual({(r.supplier.id, r.date, r.number, r.expense)
... for r in time_series},
... {(supplier1.id, purchase1_ts_date, 1, Decimal('30')),
... (supplier2.id, purchase2_ts_date, 1, Decimal('10'))})
Check purchase reporting per product without supplier::
>>> with config.set_context(context=context):
... reports = Product.find([])
... time_series = ProductTimeseries.find([])
>>> len(reports)
0
Check purchase reporting per product with supplier::
>>> context['supplier'] = supplier1.id
>>> context['currency'] = purchase1.currency.id
>>> 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.expense) for r in reports},
... {(product1.id, 1, Decimal('20')),
... (product2.id, 1, Decimal('10'))})
>>> len(time_series)
2
>>> with config.set_context(context=context):
... assertEqual({(r.product.id, r.date, r.number, r.expense)
... for r in time_series},
... {(product1.id, purchase1_ts_date, 1, Decimal('20')),
... (product2.id, purchase1_ts_date, 1, Decimal('10'))})