Added restrictions when modifiying sent invoices.

This commit is contained in:
Sergio Morillo 2021-10-22 18:07:46 +02:00
parent 22b930b613
commit 1d3384523e
7 changed files with 147 additions and 4 deletions

View File

@ -48,3 +48,7 @@ def register():
aeat.CreateSiiReceivedPending,
load_pkcs12.LoadPKCS12,
module='aeat_sii', type_='wizard')
Pool.register(
invoice.Invoice2,
module='aeat_sii', type_='model',
depends=['account_invoice_posted2draft'])

View File

@ -201,6 +201,7 @@ class BaseInvoiceMapper(Model):
description = tools.unaccent(invoice.description)
if invoice.lines and invoice.lines[0].description:
description = tools.unaccent(invoice.lines[0].description)
description = self.serial_number(invoice)
return (description if not self._is_first_semester(invoice)

View File

@ -2,7 +2,7 @@
# copyright notices and license terms.
import hashlib
from decimal import Decimal
from trytond.model import ModelView, fields
from trytond.model import ModelView, fields, Workflow
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
@ -23,8 +23,14 @@ _SII_INVOICE_KEYS = ['sii_book_key', 'sii_operation_key', 'sii_issued_key',
class Invoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
sii_book_key = fields.Selection(BOOK_KEY, 'SII Book Key')
sii_operation_key = fields.Selection(OPERATION_KEY, 'SII Operation Key')
sii_book_key = fields.Selection(BOOK_KEY, 'SII Book Key',
states={
'required': Eval('state').in_(['posted', 'paid'])
}, depends=['state'])
sii_operation_key = fields.Selection(OPERATION_KEY, 'SII Operation Key',
states={
'required': Eval('state').in_(['posted', 'paid'])
}, depends=['state'])
sii_issued_key = fields.Selection(SEND_SPECIAL_REGIME_KEY,
'SII Issued Key',
states={
@ -273,3 +279,93 @@ class ResetSIIKeys(Wizard):
invoices = Invoice.browse(Transaction().context['active_ids'])
Invoice.reset_sii_keys(invoices)
return 'done'
class Invoice2(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
def __setup__(cls):
super().__setup__()
cls._sii_state_deny_draft = {
'Correcto', 'Correcta', 'AceptadoConErrores', 'AceptadaConErrores'
}
cls._deny_modify_sii_fields = {
'reference', 'party', 'invoice_date', 'party_tax_identifier'
}
@classmethod
@ModelView.button
@Workflow.transition('draft')
def draft(cls, invoices):
for invoice in invoices:
invoice.check_sent_sii()
super().draft(invoices)
@classmethod
@ModelView.button
@Workflow.transition('posted')
def post(cls, invoices):
for invoice in invoices:
if invoice.state in ('draft', 'validated'):
invoice.check_sent_sii()
super().post(invoices)
@classmethod
def write(cls, *args):
actions = iter(args)
args = []
for records, values in zip(actions, actions):
sii_vals = set(values) & cls._deny_modify_sii_fields
if sii_vals:
for record in records:
if record.type == 'in':
record.check_sent_sii(list(sii_vals))
args.extend((records, values))
super().write(*args)
def check_sent_sii(self, fields=[]):
pool = Pool()
ModelData = pool.get('ir.model.data')
User = pool.get('res.user')
Group = pool.get('res.group')
Warning = pool.get('res.user.warning')
if self.sii_state in self._sii_state_deny_draft and \
self.sii_communication_type != 'D0':
# check group
def in_group():
group = Group(ModelData.get_id(
'aeat_sii',
'group_invoice_sent_sii_posted2draft'))
transaction = Transaction()
user_id = transaction.user
if user_id == 0:
user_id = transaction.context.get('user', user_id)
if user_id == 0:
return True
user = User(user_id)
return group in user.groups
if fields:
raise UserError(gettext(
'aeat_sii.msg_invoice_deny_modify_sii_pk',
fields=', '.join(
[f['string'] for f in self.__class__.fields_get(
fields_names=fields).values()]),
invoice=self.rec_name,
sii_state=self.sii_state))
elif not in_group():
raise UserError(gettext(
'aeat_sii.msg_invoice_deny_draft_invalid_sii_state',
invoice=self.rec_name,
sii_state=self.sii_state))
else:
warning_key = ('aeat_sii.'
'msg_invoice_modify_invalid_sii_state_%s' % self.id)
if Warning.check(warning_key):
raise UserWarning(warning_key, gettext(
'aeat_sii.msg_invoice_modify_invalid_sii_state',
invoice=self.rec_name,
sii_state=self.sii_state))

View File

@ -40,6 +40,15 @@
<field name="action" ref="act_aeat_sii_reset_keys"/>
<field name="group" ref="group_aeat_sii_admin"/>
</record>
</data>
<data depends="account_invoice_posted2draft">
<record model="res.group" id="group_invoice_sent_sii_posted2draft">
<field name="name">Force Draft Account Invoice sent to SII</field>
</record>
<record model="res.user-res.group"
id="user_admin_group_invoice_sent_sii_posted2draft">
<field name="user" ref="res.user_admin"/>
<field name="group" ref="group_invoice_sent_sii_posted2draft"/>
</record>
</data>
</tryton>

View File

@ -1764,3 +1764,25 @@ msgstr "Cancel·lar"
msgctxt "wizard_button:aeat.sii.reset.keys,start,reset:"
msgid "Reset"
msgstr "Reiniciar"
msgctxt "model:ir.message,text:msg_invoice_deny_draft_invalid_sii_state"
msgid ""
"You can not set to draft invoice \"%(invoice)s\" because the SII state is \"%(sii_state)s\". Please first include the invoice in a Delete Invoice SII Book and send to AEAT."
msgstr ""
"No puede pasar a borrador la factura \"%(invoice)s\" porque su estado SII es \"%(sii_state)s\". Por favor incluya la factura en un libro SII de anulación de facturas y envíelo a la AEAT."
msgctxt "model:ir.message,text:msg_invoice_modify_invalid_sii_state"
msgid ""
"Invoice \"%(invoice)s\" was sent to SII and the state is \"%(sii_state)s\". Please remember after posting to send it again with a Modify SII Book."
msgstr ""
"La factura \"%(invoice)s\" fue enviada al SII y su estado es \"%(sii_state)s\". Por favor recuerde enviarla de nuevo a la AEAT en un libro SII de modificación de facturas tras contabilizarla."
msgctxt "model:ir.message,text:msg_invoice_deny_modify_sii_pk"
msgid ""
"Cannot modify \"%(fields)s\" on invoice \"%(invoice)s\" because its SII state is \"%(sii_state)s\". Please first include the invoice in a Delete Invoice SII Book and send to AEAT."
msgstr ""
"No puede modificar \"%(fields)s\" en la factura \"%(invoice)s\" porque su estado SII es \"%(sii_state)s\". Por favor incluya la fact
msgctxt "model:res.group,name:group_invoice_sent_sii_posted2draft"
msgid "Force Draft Account Invoice sent to SII"
msgstr "Forzar borrador factura enviada a SII"

View File

@ -38,5 +38,14 @@ If you edit them take care if you need to update again to SII</field>
<record model="ir.message" id="msg_wrong_identifier_type">
<field name="text">The party [%(party)s] of the invoice %(invoice)s must has a valid SII Identifier [VAT (only for intracommunity operators)].</field>
</record>
<record model="ir.message" id="msg_invoice_deny_draft_invalid_sii_state">
<field name="text">You can not set to draft invoice "%(invoice)s" because the SII state is "%(sii_state)s". Please first include the invoice in a Delete Invoice SII Book and send to AEAT.</field>
</record>
<record model="ir.message" id="msg_invoice_modify_invalid_sii_state">
<field name="text">Invoice "%(invoice)s" was sent to SII and the state is "%(sii_state)s". Please remember after posting to send it again with a Modify SII Book.</field>
</record>
<record model="ir.message" id="msg_invoice_deny_modify_sii_pk">
<field name="text">Cannot modify "%(fields)s" on invoice "%(invoice)s" because its SII state is "%(sii_state)s". Please first include the invoice in a Delete Invoice SII Book and send to AEAT.</field>
</record>
</data>
</tryton>

View File

@ -10,6 +10,8 @@ extras_depend:
sale
purchase
aeat_303
account_invoice_posted2draft
xml:
account.xml
aeat.xml