Add method to post invoices by batch

issue10054
review333811002
This commit is contained in:
Cédric Krier committed 2021-02-27 15:23:46 +01:00
1 parent 7c1efcb8a4
commit e1f2871c3b
4 files changed
+57 -8

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Add method to post invoices by batch
* Add payment term date in invoice
* Raise warning on invoice with maturity dates on the past
* Remove foreign key for sequence of Invoice
+24 -1
View File
@@ -5,13 +5,15 @@ from collections import OrderedDict
from sql import Literal
from sql.conditionals import Coalesce
from trytond.model import (fields, ModelView, ModelSQL, MatchMixin,
from trytond.i18n import gettext
from trytond.model import (fields, ModelView, ModelSQL, Workflow, MatchMixin,
sequence_ordered)
from trytond.pyson import Eval, If, Bool
from trytond.pool import Pool, PoolMeta
from trytond.tools import grouped_slice
from trytond.transaction import Transaction
from trytond.modules.account.exceptions import ClosePeriodError
from trytond.modules.company.model import CompanyValueMixin
@@ -136,6 +138,27 @@ class Period(metaclass=PoolMeta):
table.drop_column('in_invoice_sequence')
table.drop_column('in_credit_note_sequence')
@classmethod
@ModelView.button
@Workflow.transition('close')
def close(cls, periods):
pool = Pool()
Invoice = pool.get('account.invoice')
company_ids = list({p.company.id for p in periods})
invoices = Invoice.search([
('company', 'in', company_ids),
('state', '=', 'posted'),
('move', '=', None),
])
if invoices:
names = ', '.join(i.rec_name for i in invoices[:5])
if len(invoices) > 5:
names += '...'
raise ClosePeriodError(
gettext('account_invoice.msg_close_period_non_posted_invoices',
invoices=names))
super().close()
class InvoiceSequence(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
'Invoice Sequence'
+29 -7
View File
@@ -244,8 +244,9 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin):
@classmethod
def __setup__(cls):
super(Invoice, cls).__setup__()
cls._check_modify_exclude = ['state', 'payment_lines', 'cancel_move',
'invoice_report_cache', 'invoice_report_format', 'lines']
cls._check_modify_exclude = {
'state', 'payment_lines', 'move', 'cancel_move',
'invoice_report_cache', 'invoice_report_format', 'lines'}
cls._order = [
('number', 'DESC NULLS FIRST'),
('id', 'DESC'),
@@ -265,6 +266,7 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin):
('draft', 'validated'),
('validated', 'posted'),
('draft', 'posted'),
('posted', 'posted'),
('posted', 'paid'),
('validated', 'draft'),
('paid', 'posted'),
@@ -302,8 +304,9 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin):
('invoice_date', '!=', None),
('type', '!=', 'in'),
],
'invisible': ~Eval('state').in_(['draft', 'validated']),
'depends': ['state'],
'invisible': (~Eval('state').in_(['draft', 'validated'])
| ((Eval('state') == 'posted') & Bool(Eval('move')))),
'depends': ['state', 'move'],
},
'pay': {
'invisible': Eval('state') != 'posted',
@@ -1200,7 +1203,7 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin):
actions = iter(args)
all_invoices = []
for invoices, values in zip(actions, actions):
if set(values) - set(cls._check_modify_exclude):
if set(values) - cls._check_modify_exclude:
cls.check_modify(invoices)
all_invoices += invoices
update_tax = [i for i in all_invoices if i.state == 'draft']
@@ -1463,11 +1466,30 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin):
Move.save(moves)
cls.save(invoices_in)
@classmethod
@Workflow.transition('posted')
def post_batch(cls, invoices):
pool = Pool()
Date = pool.get('ir.date')
today = Date.today()
cls.set_number(invoices)
for invoice in invoices:
if not invoice.payment_term_date:
invoice.payment_term_date = today
cls.save(invoices)
with Transaction().set_context(_skip_warnings=True):
cls.__queue__._post(invoices)
@classmethod
@ModelView.button
@Workflow.transition('posted')
def post(cls, invoices):
Move = Pool().get('account.move')
cls._post(invoices)
@classmethod
def _post(cls, invoices):
pool = Pool()
Move = pool.get('account.move')
cls.set_number(invoices)
moves = []
@@ -1528,7 +1550,7 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin):
delete_moves = []
to_save = []
for invoice in invoices:
if invoice.move:
if invoice.move or invoice.number:
if invoice.move.state == 'draft':
delete_moves.append(invoice.move)
elif not invoice.cancel_move:
+3
View File
@@ -69,6 +69,9 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.message" id="msg_invoice_payment_term_date_past">
<field name="text">The invoice "%(invoice)s" generates a payment date "%(date)s" in the past.</field>
</record>
<record model="ir.message" id="msg_close_period_non_posted_invoices">
<field name="text">To close the periods you must post the invoices "%(moves)s".</field>
</record>
</data>
</tryton>