Code Duplication    Length = 34-34 lines in 2 locations

satcfdi/create/cfd/cfdi40.py 2 locations

@@ 158-191 (lines=34) @@
155
        )
156
157
158
class Retencion(ScalarMap):
159
    """
160
    Nodo requerido para la información detallada de un traslado de impuesto específico.
161
162
    :param base: Atributo requerido para señalar la suma de los atributos Base de los conceptos del impuesto trasladado. No se permiten valores negativos.
163
    :param impuesto: Atributo requerido para señalar la clave del tipo de impuesto retencion.
164
    :param tipo_factor: Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto.
165
    :param tasa_o_cuota: Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada por los conceptos amparados en el comprobante.
166
    :param importe: Atributo condicional para señalar la suma del importe del impuesto trasladado, agrupado por impuesto, TipoFactor y TasaOCuota. No se permiten valores negativos.
167
    """
168
169
    def __init__(
170
            self,
171
            impuesto: str,
172
            tipo_factor: str,
173
            tasa_o_cuota: Decimal | int = None,
174
            importe: Decimal | int = None,
175
            base: Decimal | int = None,
176
    ):
177
        super().__init__({
178
            'Base': base,
179
            'Impuesto': CatImpuesto.get(impuesto, impuesto),
180
            'TipoFactor': tipo_factor,
181
            'TasaOCuota': tasa_o_cuota,
182
            'Importe': importe,
183
        })
184
185
    @classmethod
186
    def parse(cls, impuesto: str):
187
        parts = impuesto.split("|")
188
        return cls(
189
            impuesto=parts[0],
190
            tipo_factor=parts[1],
191
            tasa_o_cuota=Decimal(parts[2]) if len(parts) > 2 else None,
192
        )
193
194
@@ 121-154 (lines=34) @@
118
        })
119
120
121
class Traslado(ScalarMap):
122
    """
123
    Nodo requerido para la información detallada de un traslado de impuesto específico.
124
125
    :param base: Atributo requerido para señalar la suma de los atributos Base de los conceptos del impuesto trasladado. No se permiten valores negativos.
126
    :param impuesto: Atributo requerido para señalar la clave del tipo de impuesto retencion.
127
    :param tipo_factor: Atributo requerido para señalar la clave del tipo de factor que se aplica a la base del impuesto.
128
    :param tasa_o_cuota: Atributo condicional para señalar el valor de la tasa o cuota del impuesto que se traslada por los conceptos amparados en el comprobante.
129
    :param importe: Atributo condicional para señalar la suma del importe del impuesto trasladado, agrupado por impuesto, TipoFactor y TasaOCuota. No se permiten valores negativos.
130
    """
131
132
    def __init__(
133
            self,
134
            impuesto: str,
135
            tipo_factor: str,
136
            tasa_o_cuota: Decimal | int = None,
137
            importe: Decimal | int = None,
138
            base: Decimal | int = None,
139
    ):
140
        super().__init__({
141
            'Base': base,
142
            'Impuesto': CatImpuesto.get(impuesto, impuesto),
143
            'TipoFactor': tipo_factor,
144
            'TasaOCuota': tasa_o_cuota,
145
            'Importe': importe,
146
        })
147
148
    @classmethod
149
    def parse(cls, impuesto: str):
150
        parts = impuesto.split("|")
151
        return cls(
152
            impuesto=parts[0],
153
            tipo_factor=parts[1],
154
            tasa_o_cuota=Decimal(parts[2]) if len(parts) > 2 else None,
155
        )
156
157