2014-12-10 17:36:37 +01:00
|
|
|
diff -r 4e1ac035ae80 invoice.py
|
2015-02-19 10:21:09 +01:00
|
|
|
--- .a/trytond/trytond/modules/account_invoice/invoice.py Mon Oct 20 14:37:24 2014 +0200
|
|
|
|
+++ .b/trytond/trytond/modules/account_invoice/invoice.py Tue Dec 09 18:52:31 2014 +0100
|
2014-12-10 17:36:37 +01:00
|
|
|
@@ -114,15 +114,23 @@
|
|
|
|
'on_change_with_currency_date')
|
|
|
|
journal = fields.Many2One('account.journal', 'Journal', required=True,
|
|
|
|
states=_STATES, depends=_DEPENDS)
|
|
|
|
- move = fields.Many2One('account.move', 'Move', readonly=True)
|
|
|
|
+ move = fields.Many2One('account.move', 'Move', readonly=True,
|
|
|
|
+ domain=[
|
|
|
|
+ ('company', '=', Eval('company', -1)),
|
|
|
|
+ ],
|
|
|
|
+ depends=['company'])
|
|
|
|
cancel_move = fields.Many2One('account.move', 'Cancel Move', readonly=True,
|
|
|
|
+ domain=[
|
|
|
|
+ ('company', '=', Eval('company', -1)),
|
|
|
|
+ ],
|
|
|
|
states={
|
|
|
|
'invisible': Eval('type').in_(['out_invoice', 'out_credit_note']),
|
|
|
|
- })
|
|
|
|
+ },
|
|
|
|
+ depends=['company'])
|
|
|
|
account = fields.Many2One('account.account', 'Account', required=True,
|
|
|
|
- states=_STATES, depends=_DEPENDS + ['type'],
|
|
|
|
+ states=_STATES, depends=_DEPENDS + ['type', 'company'],
|
|
|
|
domain=[
|
|
|
|
- ('company', '=', Eval('context', {}).get('company', -1)),
|
|
|
|
+ ('company', '=', Eval('company', -1)),
|
|
|
|
If(Eval('type').in_(['out_invoice', 'out_credit_note']),
|
|
|
|
('kind', '=', 'receivable'),
|
|
|
|
('kind', '=', 'payable')),
|
|
|
|
@@ -130,7 +138,10 @@
|
|
|
|
payment_term = fields.Many2One('account.invoice.payment_term',
|
|
|
|
'Payment Term', required=True, states=_STATES, depends=_DEPENDS)
|
|
|
|
lines = fields.One2Many('account.invoice.line', 'invoice', 'Lines',
|
|
|
|
- states=_STATES, depends=['state', 'currency_date'])
|
|
|
|
+ domain=[
|
|
|
|
+ ('company', '=', Eval('company', -1)),
|
|
|
|
+ ],
|
|
|
|
+ states=_STATES, depends=['state', 'currency_date', 'company'])
|
|
|
|
taxes = fields.One2Many('account.invoice.tax', 'invoice', 'Tax Lines',
|
|
|
|
states=_STATES, depends=_DEPENDS)
|
|
|
|
comment = fields.Text('Comment', states=_STATES, depends=_DEPENDS)
|
|
|
|
@@ -151,10 +162,13 @@
|
|
|
|
'Lines to Pay'), 'get_lines_to_pay')
|
|
|
|
payment_lines = fields.Many2Many('account.invoice-account.move.line',
|
|
|
|
'invoice', 'line', readonly=True, string='Payment Lines',
|
|
|
|
+ domain=[
|
|
|
|
+ ('move.company', '=', Eval('company', -1)),
|
|
|
|
+ ],
|
|
|
|
states={
|
|
|
|
'invisible': (Eval('state') == 'paid') | ~Eval('payment_lines'),
|
|
|
|
},
|
|
|
|
- depends=['state'])
|
|
|
|
+ depends=['state', 'company'])
|
|
|
|
amount_to_pay_today = fields.Function(fields.Numeric('Amount to Pay Today',
|
|
|
|
digits=(16, Eval('currency_digits', 2)),
|
|
|
|
depends=['currency_digits']), 'get_amount_to_pay')
|
|
|
|
@@ -194,10 +208,6 @@
|
|
|
|
'account.'),
|
|
|
|
'missing_credit_account': ('The credit account on journal %s" '
|
|
|
|
'is missing.'),
|
|
|
|
- 'account_different_company': ('You can not create invoice '
|
|
|
|
- '"%(invoice)s" on company "%(invoice_company)s because '
|
|
|
|
- 'account "%(account)s has a different company '
|
|
|
|
- '(%(account_company)s.)'),
|
|
|
|
'same_account_on_line': ('Invoice "%(invoice)s" uses the same '
|
|
|
|
'account "%(account)s" for the invoice and in line '
|
|
|
|
'"%(line)s".'),
|
|
|
|
@@ -1001,6 +1011,7 @@
|
|
|
|
'period': period_id,
|
|
|
|
'date': accounting_date,
|
|
|
|
'origin': str(self),
|
|
|
|
+ 'company': self.company.id,
|
|
|
|
'lines': [('create', move_lines)],
|
|
|
|
}])
|
|
|
|
self.write([self], {
|
|
|
|
@@ -1117,19 +1128,9 @@
|
|
|
|
def validate(cls, invoices):
|
|
|
|
super(Invoice, cls).validate(invoices)
|
|
|
|
for invoice in invoices:
|
|
|
|
- invoice.check_account()
|
|
|
|
invoice.check_same_account()
|
|
|
|
invoice.check_cancel_move()
|
|
|
|
|
|
|
|
- def check_account(self):
|
|
|
|
- if self.account.company != self.company:
|
|
|
|
- self.raise_user_error('check_account', {
|
|
|
|
- 'invoice': self.rec_name,
|
|
|
|
- 'invoice_company': self.company.rec_name,
|
|
|
|
- 'account': self.account.rec_name,
|
|
|
|
- 'account_company': self.account.company.rec_name,
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
def check_same_account(self):
|
|
|
|
for line in self.lines:
|
|
|
|
if (line.type == 'line'
|
|
|
|
@@ -1279,6 +1280,7 @@
|
|
|
|
'journal': journal.id,
|
|
|
|
'period': period_id,
|
|
|
|
'date': date,
|
|
|
|
+ 'company': self.company.id,
|
|
|
|
'lines': [('create', lines)],
|
|
|
|
}])
|
|
|
|
Move.post([move])
|
|
|
|
@@ -1493,16 +1495,11 @@
|
|
|
|
depends=['invoice'])
|
|
|
|
currency_digits = fields.Function(fields.Integer('Currency Digits'),
|
|
|
|
'on_change_with_currency_digits')
|
|
|
|
- company = fields.Many2One('company.company', 'Company',
|
|
|
|
- states={
|
|
|
|
- 'required': ~Eval('invoice'),
|
|
|
|
- },
|
|
|
|
+ company = fields.Many2One('company.company', 'Company', required=True,
|
|
|
|
domain=[
|
|
|
|
('id', If(Eval('context', {}).contains('company'), '=', '!='),
|
|
|
|
Eval('context', {}).get('company', -1)),
|
|
|
|
- ],
|
|
|
|
- depends=['invoice'], select=True)
|
|
|
|
-
|
|
|
|
+ ], select=True)
|
|
|
|
sequence = fields.Integer('Sequence',
|
|
|
|
states={
|
|
|
|
'invisible': Bool(Eval('context', {}).get('standalone')),
|
|
|
|
@@ -1545,8 +1542,7 @@
|
|
|
|
'on_change_with_product_uom_category')
|
|
|
|
account = fields.Many2One('account.account', 'Account',
|
|
|
|
domain=[
|
|
|
|
- ('company', '=', Eval('_parent_invoice', {}).get('company',
|
|
|
|
- Eval('context', {}).get('company', -1))),
|
|
|
|
+ ('company', '=', Eval('company', -1)),
|
|
|
|
If(Bool(Eval('_parent_invoice')),
|
|
|
|
If(Eval('_parent_invoice', {}).get('type').in_(['out_invoice',
|
|
|
|
'out_credit_note']),
|
|
|
|
@@ -1561,7 +1557,7 @@
|
|
|
|
'invisible': Eval('type') != 'line',
|
|
|
|
'required': Eval('type') == 'line',
|
|
|
|
},
|
|
|
|
- depends=['type', 'invoice_type'])
|
|
|
|
+ depends=['type', 'invoice_type', 'company'])
|
|
|
|
unit_price = fields.Numeric('Unit Price', digits=(16, DIGITS),
|
|
|
|
states={
|
|
|
|
'invisible': Eval('type') != 'line',
|
|
|
|
@@ -1592,11 +1588,12 @@
|
|
|
|
['sale', 'both'],
|
|
|
|
['purchase', 'both']))
|
|
|
|
)],
|
|
|
|
+ ('company', '=', Eval('company', -1)),
|
|
|
|
],
|
|
|
|
states={
|
|
|
|
'invisible': Eval('type') != 'line',
|
|
|
|
},
|
|
|
|
- depends=['type', 'invoice_type'])
|
|
|
|
+ depends=['type', 'invoice_type', 'company'])
|
|
|
|
invoice_taxes = fields.Function(fields.One2Many('account.invoice.tax',
|
|
|
|
None, 'Invoice Taxes'), 'get_invoice_taxes')
|
|
|
|
origin = fields.Reference('Origin', selection='get_origin', select=True,
|
|
|
|
@@ -1624,11 +1621,6 @@
|
|
|
|
'"%(invoice)s" that is posted or paid.'),
|
|
|
|
'create': ('You can not add a line to invoice "%(invoice)s" '
|
|
|
|
'that is posted, paid or cancelled.'),
|
|
|
|
- 'account_different_company': (
|
|
|
|
- 'You can not create invoice line '
|
|
|
|
- '"%(line)s" on invoice "%(invoice)s of company '
|
|
|
|
- '"%(invoice_line_company)s because account "%(account)s '
|
|
|
|
- 'has company "%(account_company)s".'),
|
|
|
|
'same_account_on_invoice': ('You can not create invoice line '
|
|
|
|
'"%(line)s" on invoice "%(invoice)s" because the invoice '
|
|
|
|
'uses the same account (%(account)s).'),
|
|
|
|
@@ -1636,7 +1628,11 @@
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def __register__(cls, module_name):
|
|
|
|
+ pool = Pool()
|
|
|
|
+ Invoice = pool.get('account.invoice')
|
|
|
|
+ invoice = Invoice.__table__()
|
|
|
|
TableHandler = backend.get('TableHandler')
|
|
|
|
+ sql_table = cls.__table__()
|
|
|
|
super(InvoiceLine, cls).__register__(module_name)
|
|
|
|
cursor = Transaction().cursor
|
|
|
|
table = TableHandler(cursor, cls, module_name)
|
|
|
|
@@ -1647,6 +1643,15 @@
|
|
|
|
# Migration from 2.4: drop required on sequence
|
|
|
|
table.not_null_action('sequence', action='remove')
|
|
|
|
|
|
|
|
+ # Migration from 3.4: company is required
|
|
|
|
+ cursor.execute(*sql_table.join(invoice,
|
|
|
|
+ condition=sql_table.invoice == invoice.id
|
|
|
|
+ ).select(sql_table.id, invoice.company,
|
|
|
|
+ where=sql_table.company == None))
|
|
|
|
+ for line_id, company_id in cursor.fetchall():
|
|
|
|
+ cursor.execute(*sql_table.update([sql_table.company], [company_id],
|
|
|
|
+ where=sql_table.id == line_id))
|
|
|
|
+
|
|
|
|
@staticmethod
|
|
|
|
def order_sequence(tables):
|
|
|
|
table, _ = tables[None]
|
|
|
|
@@ -1977,31 +1982,8 @@
|
|
|
|
def validate(cls, lines):
|
|
|
|
super(InvoiceLine, cls).validate(lines)
|
|
|
|
for line in lines:
|
|
|
|
- line.check_account_company()
|
|
|
|
line.check_same_account()
|
|
|
|
|
|
|
|
- def check_account_company(self):
|
|
|
|
- if self.type == 'line':
|
|
|
|
- if self.invoice:
|
|
|
|
- if self.account.company != self.invoice.company:
|
|
|
|
- self.raise_user_error('account_different_company', {
|
|
|
|
- 'line': self.rec_name,
|
|
|
|
- 'invoice': self.invoice.rec_name,
|
|
|
|
- 'invoice_line_company':
|
|
|
|
- self.invoice.company.rec_name,
|
|
|
|
- 'account': self.account.rec_name,
|
|
|
|
- 'account_company': self.account.company.rec_name,
|
|
|
|
- })
|
|
|
|
- elif self.company:
|
|
|
|
- if self.account.company != self.company:
|
|
|
|
- self.raise_user_error('account_different_company', {
|
|
|
|
- 'line': self.rec_name,
|
|
|
|
- 'invoice': '/',
|
|
|
|
- 'invoice_line_company': self.company.rec_name,
|
|
|
|
- 'account': self.account.rec_name,
|
|
|
|
- 'account_company': self.account.company.rec_name,
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
def check_same_account(self):
|
|
|
|
if self.type == 'line':
|
|
|
|
if (self.invoice
|
|
|
|
@@ -2155,6 +2137,9 @@
|
|
|
|
])
|
|
|
|
tax_sign = fields.Numeric('Tax Sign', digits=(2, 0), required=True)
|
|
|
|
tax = fields.Many2One('account.tax', 'Tax',
|
|
|
|
+ domain=[
|
|
|
|
+ ('company', '=', Eval('_parent_invoice', {}).get('company', 0)),
|
|
|
|
+ ],
|
|
|
|
states={
|
|
|
|
'readonly': ~Eval('manual', False),
|
|
|
|
},
|
|
|
|
@@ -2169,10 +2154,6 @@
|
|
|
|
'"%(invoice)s" because it is posted or paid.'),
|
|
|
|
'create': ('You can not add line "%(line)s" to invoice '
|
|
|
|
'"%(invoice)s" because it is posted, paid or canceled.'),
|
|
|
|
- 'invalid_account_company': ('You can not create invoice '
|
|
|
|
- '"%(invoice)s" on company "%(invoice_company)s" using '
|
|
|
|
- 'account "%(account)s" from company '
|
|
|
|
- '"%(account_company)s".'),
|
|
|
|
'invalid_base_code_company': ('You can not create invoice '
|
|
|
|
'"%(invoice)s" on company "%(invoice_company)s" '
|
|
|
|
'using base tax code "%(base_code)s" from company '
|
|
|
|
@@ -2305,38 +2286,6 @@
|
|
|
|
cls.raise_user_error('create')
|
|
|
|
return super(InvoiceTax, cls).create(vlist)
|
|
|
|
|
|
|
|
- @classmethod
|
|
|
|
- def validate(cls, taxes):
|
|
|
|
- super(InvoiceTax, cls).validate(taxes)
|
|
|
|
- for tax in taxes:
|
|
|
|
- tax.check_company()
|
|
|
|
-
|
|
|
|
- def check_company(self):
|
|
|
|
- company = self.invoice.company
|
|
|
|
- if self.account.company != company:
|
|
|
|
- self.raise_user_error('invalid_account_company', {
|
|
|
|
- 'invoice': self.invoice.rec_name,
|
|
|
|
- 'invoice_company': self.invoice.company.rec_name,
|
|
|
|
- 'account': self.account.rec_name,
|
|
|
|
- 'account_company': self.account.company.rec_name,
|
|
|
|
- })
|
|
|
|
- if self.base_code:
|
|
|
|
- if self.base_code.company != company:
|
|
|
|
- self.raise_user_error('invalid_base_code_company', {
|
|
|
|
- 'invoice': self.invoice.rec_name,
|
|
|
|
- 'invoice_company': self.invoice.company.rec_name,
|
|
|
|
- 'base_code': self.base_code.rec_name,
|
|
|
|
- 'base_code_company': self.base_code.company.rec_name,
|
|
|
|
- })
|
|
|
|
- if self.tax_code:
|
|
|
|
- if self.tax_code.company != company:
|
|
|
|
- self.raise_user_error('invalid_tax_code_company', {
|
|
|
|
- 'invoice': self.invoice.rec_name,
|
|
|
|
- 'invoice_company': self.invoice.company.rec_name,
|
|
|
|
- 'tax_code': self.tax_code.rec_name,
|
|
|
|
- 'tax_code_company': self.tax_code.company.rec_name,
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
def get_move_line(self):
|
|
|
|
'''
|
|
|
|
Return a list of move lines values for invoice tax
|