Files
Cédric Krier 4683fde7ac Make scenario independent of the current day
The fiscal years are created centered on the passed date such that if the
current day change during the execution, the fiscal year is still usable.
Also fiscal year can be created for a range of dates such that it is guarantee
that the dates are in the fiscal year.
And finally remove datetime and dateutil import when they are not used.

Closes #9977
2023-01-01 10:36:03 +01:00

151 lines
4.7 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime
from dateutil.relativedelta import relativedelta
from proteus import Model, Wizard
from trytond.modules.company.tests.tools import get_company
__all__ = ['create_fiscalyear', 'create_chart', 'get_accounts',
'create_tax', 'create_tax_code']
def create_fiscalyear(company=None, today=None, config=None):
"Create a fiscal year for the company on today or range"
FiscalYear = Model.get('account.fiscalyear', config=config)
Sequence = Model.get('ir.sequence', config=config)
SequenceType = Model.get('ir.sequence.type', config=config)
if not company:
company = get_company(config=config)
if not today:
today = datetime.date.today()
if isinstance(today, datetime.date):
start_date = end_date = today
else:
start_date, end_date = today
today = start_date + (end_date - start_date) / 2
start_date = min(start_date, today - relativedelta(months=6, day=1))
end_date = max(end_date, today + relativedelta(months=5, day=31))
assert start_date <= end_date
fiscalyear = FiscalYear(name=str(today.year))
fiscalyear.start_date = start_date
fiscalyear.end_date = end_date
fiscalyear.company = company
sequence_type, = SequenceType.find(
[('name', '=', "Account Move")], limit=1)
post_move_sequence = Sequence(
name=str(today.year),
sequence_type=sequence_type,
company=company)
post_move_sequence.save()
fiscalyear.post_move_sequence = post_move_sequence
return fiscalyear
def create_chart(
company=None, chart='account.account_template_root_en', config=None):
"Create chart of accounts"
AccountTemplate = Model.get('account.account.template', config=config)
ModelData = Model.get('ir.model.data', config=config)
if not company:
company = get_company(config=config)
module, xml_id = chart.split('.')
data, = ModelData.find([
('module', '=', module),
('fs_id', '=', xml_id),
], limit=1)
account_template = AccountTemplate(data.db_id)
create_chart = Wizard('account.create_chart', config=config)
create_chart.execute('account')
create_chart.form.account_template = account_template
create_chart.form.company = company
create_chart.execute('create_account')
accounts = get_accounts(company, config=config)
if accounts['receivable'].party_required:
create_chart.form.account_receivable = accounts['receivable']
if accounts['payable'].party_required:
create_chart.form.account_payable = accounts['payable']
create_chart.execute('create_properties')
return create_chart
def get_accounts(company=None, config=None):
"Return accounts per kind"
Account = Model.get('account.account', config=config)
if not company:
company = get_company(config=config)
accounts = {}
for type in ['receivable', 'payable', 'revenue', 'expense']:
try:
accounts[type], = Account.find([
('type.%s' % type, '=', True),
('company', '=', company.id),
('closed', '!=', True),
], limit=1)
except ValueError:
pass
try:
accounts['cash'], = Account.find([
('company', '=', company.id),
('name', '=', 'Main Cash'),
('closed', '!=', True),
], limit=1)
except ValueError:
pass
try:
accounts['tax'], = Account.find([
('company', '=', company.id),
('name', '=', 'Main Tax'),
('closed', '!=', True),
], limit=1)
except ValueError:
pass
return accounts
def create_tax(rate, company=None, config=None):
"Create a tax of rate"
Tax = Model.get('account.tax', config=config)
if not company:
company = get_company(config=config)
accounts = get_accounts(company, config=config)
tax = Tax()
tax.name = 'Tax %s' % rate
tax.description = tax.name
tax.type = 'percentage'
tax.rate = rate
tax.invoice_account = accounts['tax']
tax.credit_note_account = accounts['tax']
return tax
def create_tax_code(
tax, amount='tax', type='invoice', operator='+', config=None):
"Create a tax code for the tax"
TaxCode = Model.get('account.tax.code', config=config)
tax_code = TaxCode(name="Tax Code %s" % tax.name)
tax_code.company = tax.company
line = tax_code.lines.new()
line.operator = '+'
line.tax = tax
line.amount = amount
line.type = type
return tax_code