Code Duplication    Length = 34-34 lines in 2 locations

satcfdi/create/cfd/cfdi40.py 2 locations

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