81 lines
3.8 KiB
Python
81 lines
3.8 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class SignRequestItem(models.Model):
|
|
_inherit = "sign.request.item"
|
|
|
|
emsigner_status = fields.Char('emSigner Status', readonly=True, copy=False)
|
|
emsigner_return_value = fields.Char("emSigner Values", readonly=True, copy=False)
|
|
emsigner_transaction_number = fields.Char("emSigner Transaction Number", readonly=True, copy=False)
|
|
emsigner_reference_number = fields.Char("emSigner Reference Number", readonly=True, copy=False)
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
items = super().create(vals_list)
|
|
if not items:
|
|
return items
|
|
|
|
for request in items.sign_request_id:
|
|
related_records = items.filtered(lambda r: r.sign_request_id == request)
|
|
emsigner_roles = related_records.filtered(
|
|
lambda r: r.role_id and r.role_id.auth_method == 'emsigner'
|
|
).role_id
|
|
|
|
# If there are multiple emsigner roles or user is doing sign now, we do not set auth_method
|
|
if emsigner_roles:
|
|
if len(emsigner_roles) > 1:
|
|
emsigner_roles.auth_method = False
|
|
else:
|
|
emsigner_record = related_records.filtered(
|
|
lambda r: r.role_id in emsigner_roles
|
|
)
|
|
# must have signature items & only one document
|
|
if emsigner_record and (
|
|
not emsigner_record._get_current_signature_sign_items()
|
|
or len(emsigner_record.sign_request_id.template_id.document_ids) > 1
|
|
):
|
|
emsigner_record.role_id.auth_method = False
|
|
else:
|
|
# when we have multiple signers, we always keep the emsigner role last in the order
|
|
# and set the normal signers first
|
|
normal_signers = related_records - emsigner_record
|
|
|
|
normal_signers = normal_signers.sorted(key=lambda r: r.mail_sent_order or 1)
|
|
# normal signers first
|
|
for idx, signer in enumerate(normal_signers, start=1):
|
|
signer.mail_sent_order = idx
|
|
|
|
# Then emsigners get the last order(s)
|
|
last_order = len(normal_signers) + 1
|
|
emsigner_record.mail_sent_order = last_order
|
|
return items
|
|
|
|
def _get_current_signature_sign_items(self):
|
|
""" Get the sign items that are of type signature and are assigned to the current role.
|
|
"""
|
|
return self.sign_request_id.template_id.sign_item_ids.filtered(
|
|
lambda item: item.responsible_id.id == self.role_id.id and item.type_id.item_type == 'signature'
|
|
)
|
|
|
|
def _write_emsigner_data(self, reference_number, transaction_number, return_status):
|
|
self.ensure_one()
|
|
if self.emsigner_status or self.emsigner_transaction_number or self.emsigner_reference_number:
|
|
return
|
|
self.emsigner_status = return_status
|
|
self.emsigner_transaction_number = transaction_number
|
|
self.emsigner_reference_number = reference_number
|
|
|
|
def _post_fill_request_item(self):
|
|
for sri in self:
|
|
if sri.role_id.auth_method == 'emsigner' and not sri.emsigner_status and not sri.signed_without_extra_auth:
|
|
raise ValidationError(_("Sign request item is not validated yet."))
|
|
return super()._post_fill_request_item()
|
|
|
|
def sign(self, signature, **kwargs):
|
|
if self.role_id.auth_method == 'emsigner':
|
|
return self._sign(signature, validation_required=not self.signed_without_extra_auth, **kwargs)
|
|
return super().sign(signature, **kwargs)
|