satcfdi.create.cancela.cancelacionretencion   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 76
Duplicated Lines 52.63 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 40
dl 40
loc 76
ccs 16
cts 16
cp 1
rs 10
c 0
b 0
f 0
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A Folio.__init__() 0 18 1
A Cancelacion.__init__() 34 34 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1 1
from collections.abc import Sequence
2 1
from datetime import datetime
3
4 1
from ..w3.signature import signature_c14n_sha1
5 1
from ...models import Signer
6 1
from ...utils import ScalarMap
7 1
from ...xelement import XElement
8
9
10 1
class Folio(ScalarMap):
11
    """
12
    http://www.sat.gob.mx/esquemas/retencionpago/1
13
    Folio fiscal (UUID) a ser cancelado.
14
    """
15 1
    def __init__(
16
            self,
17
            uuid: str,
18
            motivo: str,
19
            folio_sustitucion: str = None,
20
    ): 
21
        """
22
        Folio fiscal (UUID) a ser cancelado.
23
        
24
        :param uuid: UUID generado en la operación de timbrado del comprobante solicitado.
25
        :param motivo: Clave del motivo de cancelación del comprobante.
26
        :param folio_sustitucion: Atributo condicional que representa al UUID que sustituye al folio fiscal cancelado. Es requerido cuando la clave del motivo de cancelación es 01.
27
        """
28
        
29 1
        super().__init__({
30
            'UUID': uuid,
31
            'Motivo': motivo,
32
            'FolioSustitucion': folio_sustitucion,
33
        })
34
        
35
36 1 View Code Duplication
class Cancelacion(XElement):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
37
    """
38
    Elemento raíz para realizar una solicitud de cancelación de CFDI.
39
    """
40 1
    tag = '{http://www.sat.gob.mx/esquemas/retencionpago/1}Cancelacion'
41
42 1
    def __init__(
43
            self,
44
            emisor: Signer,
45
            folios: Folio | Sequence[Folio | dict],
46
            fecha: datetime = None
47
    ):
48
        """
49
        Elemento raíz para realizar una solicitud de cancelación de CFDI.
50
51
        :param emisor: Atributo requerido para expresar el RFC del emisor del (os) CFDI a cancelar.
52
        :param fecha: Atributo requerido para expresar la fecha de la operación.
53
        :param folios: Colección de folios fiscales (UUID) a ser cancelados.
54
        """
55 1
        super().__init__({
56
            'RfcEmisor': emisor.rfc,
57
            'Fecha': fecha or datetime.now(),
58
            'Folios': folios,
59
        })
60 1
        self["_nsmap"] = {
61
            None: "http://www.sat.gob.mx/esquemas/retencionpago/1",
62
            "xsd": "http://www.w3.org/2001/XMLSchema",
63
            "xsi": "http://www.w3.org/2001/XMLSchema-instance"
64
        }
65
66 1
        sig = signature_c14n_sha1(
67
            signer=emisor,
68
            element=self.to_xml(),
69
            nsmap={
70
                None: 'http://www.w3.org/2000/09/xmldsig#',
71
                "xsd": "http://www.w3.org/2001/XMLSchema",
72
                "xsi": "http://www.w3.org/2001/XMLSchema-instance",
73
            }
74
        )
75 1
        self['Signature'] = sig
76
77