satcfdi.create.cfd.detallista   B
last analyzed

Complexity

Total Complexity 48

Size/Duplication

Total Lines 1010
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 452
dl 0
loc 1010
rs 8.5599
c 0
b 0
f 0
wmc 48

48 Methods

Rating   Name   Duplication   Size   Complexity  
A InvoiceCreator.__init__() 0 10 1
B Detallista.__init__() 0 45 1
A NetPayment.__init__() 0 8 1
A MonetaryAmountOrPercentage.__init__() 0 8 1
A GrossPrice.__init__() 0 6 1
A Rate.__init__() 0 8 1
A SpecialInstruction.__init__() 0 8 1
A TotalAllowanceCharge.__init__() 0 10 1
A AlternateTradeItemIdentification.__init__() 0 8 1
A TimePeriodDue.__init__() 0 8 1
A NetAmount.__init__() 0 6 1
A PaymentTerms.__init__() 0 12 1
A AlternatePartyIdentification.__init__() 0 8 1
A PalletInformation.__init__() 0 10 1
A Transport.__init__() 0 6 1
B LineItem.__init__() 0 38 1
A AdditionalInformation.__init__() 0 6 1
A ReferenceIdentification.__init__() 0 8 1
A ShipTo.__init__() 0 8 1
A TotalAmount.__init__() 0 6 1
A InvoicedQuantity.__init__() 0 8 1
A SerialShippingContainerCode.__init__() 0 8 1
A DeliveryNote.__init__() 0 8 1
A AditionalQuantity.__init__() 0 8 1
A RequestForPaymentIdentification.__init__() 0 6 1
A AllowanceCharge.__init__() 0 14 1
A LogisticUnits.__init__() 0 6 1
A OrderIdentification.__init__() 0 8 1
A Buyer.__init__() 0 8 1
A Currency.__init__() 0 10 1
A PersonOrDepartmentName.__init__() 0 6 1
A ContactInformation.__init__() 0 6 1
A ShipmentDetail.__init__() 0 4 1
A NameAndAddress.__init__() 0 6 1
A RatePerUnit.__init__() 0 6 1
A Customs.__init__() 0 12 1
A Seller.__init__() 0 8 1
A GrossAmount.__init__() 0 6 1
A LotNumber.__init__() 0 8 1
A PaymentTimePeriod.__init__() 0 6 1
A DiscountPayment.__init__() 0 8 1
A Description.__init__() 0 8 1
A TradeItemTaxInformation.__init__() 0 12 1
A TotalLineAmount.__init__() 0 8 1
A TradeItemDescriptionInformation.__init__() 0 8 1
A TradeItemTaxAmount.__init__() 0 8 1
A TradeItemIdentification.__init__() 0 6 1
A NetPrice.__init__() 0 6 1

How to fix   Complexity   

Complexity

Complex classes like satcfdi.create.cfd.detallista often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
"""detallista http://www.sat.gob.mx/detallista"""
2
from decimal import Decimal
3
from datetime import datetime, date, time
4
from collections.abc import Sequence
5
from ...cfdi import CFDI
6
from ...xelement import XElement
7
from ...utils import ScalarMap
8
9
10
class TotalAllowanceCharge(ScalarMap):
11
    """
12
    Nodo opcional que especifica el monto total de cargos o descuentos
13
    
14
    :param allowance_or_charge_type: Atributo para especificar los cargos o descuentos consolidados
15
    :param special_services_type: Nodo opcional que especifica el tipo de descuento o cargo. Este atributo sólo se utiliza si el comprador conoce el tipo de descuento o cargo.
16
    :param amount: Nodo opcional que especifica el monto total de los cargos o descuentos
17
    """
18
    
19
    def __init__(
20
            self,
21
            allowance_or_charge_type: str,
22
            special_services_type: str = None,
23
            amount: Decimal | int = None,
24
    ): 
25
        super().__init__({
26
            'AllowanceOrChargeType': allowance_or_charge_type,
27
            'SpecialServicesType': special_services_type,
28
            'Amount': amount,
29
        })
30
        
31
32
class TotalAmount(ScalarMap):
33
    """
34
    Nodo opcional que especifica el monto total de las líneas de artículos.
35
    
36
    :param amount: Nodo requerido que especifica el monto
37
    """
38
    
39
    def __init__(
40
            self,
41
            amount: Decimal | int,
42
    ): 
43
        super().__init__({
44
            'Amount': amount,
45
        })
46
        
47
48
class TradeItemTaxAmount(ScalarMap):
49
    """
50
    Nodo opcional que especifica el importe o porcentaje del descuento
51
    
52
    :param tax_percentage: Nodo requerido que especifica el porcentaje del impuesto
53
    :param tax_amount: Nodo requerido que especifica el monto del impuesto
54
    """
55
    
56
    def __init__(
57
            self,
58
            tax_percentage: Decimal | int,
59
            tax_amount: Decimal | int,
60
    ): 
61
        super().__init__({
62
            'TaxPercentage': tax_percentage,
63
            'TaxAmount': tax_amount,
64
        })
65
        
66
67
class TradeItemTaxInformation(ScalarMap):
68
    """
69
    Nodo opcional que especifica los impuestos por cada línea de artículo
70
    
71
    :param tax_type_description: Nodo requerido que especifica el tipo de arancel, impuesto o cuota.
72
    :param reference_number: Nodo opcional que especifica el numero de identificación del impuesto. Numero asignado al comprador por una jurisdicción de impuesto
73
    :param trade_item_tax_amount: Nodo opcional que especifica el importe o porcentaje del descuento
74
    :param tax_category: Nodo opcional que especifica el identificador de impuesto retenido o transferido
75
    """
76
    
77
    def __init__(
78
            self,
79
            tax_type_description: str,
80
            reference_number: str = None,
81
            trade_item_tax_amount: TradeItemTaxAmount | dict = None,
82
            tax_category: str = None,
83
    ): 
84
        super().__init__({
85
            'TaxTypeDescription': tax_type_description,
86
            'ReferenceNumber': reference_number,
87
            'TradeItemTaxAmount': trade_item_tax_amount,
88
            'TaxCategory': tax_category,
89
        })
90
        
91
92
class RatePerUnit(ScalarMap):
93
    """
94
    Nodo opcional que especifica la Tarifa por unidad
95
    
96
    :param amount_per_unit: Nodo requerido que especifica el importe monetario del cargo o descuento por unidad
97
    """
98
    
99
    def __init__(
100
            self,
101
            amount_per_unit: str,
102
    ): 
103
        super().__init__({
104
            'AmountPerUnit': amount_per_unit,
105
        })
106
        
107
108
class MonetaryAmountOrPercentage(ScalarMap):
109
    """
110
    Nodo requerido que especifica la cantidad monetaria o descuento por linea de articulo
111
    
112
    :param percentage_per_unit: Nodo requerido que especifica el porcentaje del cargo o descuento
113
    :param rate_per_unit: Nodo opcional que especifica la Tarifa por unidad
114
    """
115
    
116
    def __init__(
117
            self,
118
            percentage_per_unit: str,
119
            rate_per_unit: RatePerUnit | dict = None,
120
    ): 
121
        super().__init__({
122
            'PercentagePerUnit': percentage_per_unit,
123
            'RatePerUnit': rate_per_unit,
124
        })
125
        
126
127
class AllowanceCharge(ScalarMap):
128
    """
129
    Nodo opcional que especifica la información de los cargos o descuentos globales por línea de artículo
130
    
131
    :param allowance_charge_type: Atributo para especificar el cargo o descuento
132
    :param monetary_amount_or_percentage: Nodo requerido que especifica la cantidad monetaria o descuento por linea de articulo
133
    :param settlement_type: Atributo para especificar la imputación del cargo o descuento
134
    :param sequence_number: Atributo para especificar la secuencia de cálculo
135
    :param special_services_type: Nodo opcional que especifica el tipo de descuento o cargo. Este atributo sólo se utiliza si el comprador conoce el tipo de descuento o cargo.
136
    """
137
    
138
    def __init__(
139
            self,
140
            allowance_charge_type: str,
141
            monetary_amount_or_percentage: MonetaryAmountOrPercentage | dict,
142
            settlement_type: str = None,
143
            sequence_number: str = None,
144
            special_services_type: str = None,
145
    ): 
146
        super().__init__({
147
            'AllowanceChargeType': allowance_charge_type,
148
            'MonetaryAmountOrPercentage': monetary_amount_or_percentage,
149
            'SettlementType': settlement_type,
150
            'SequenceNumber': sequence_number,
151
            'SpecialServicesType': special_services_type,
152
        })
153
        
154
155
class LotNumber(ScalarMap):
156
    """
157
    Nodo requerido que especifica el No. De lote
158
    
159
    :param _text: 
160
    :param production_date: Atributo para especificar la fecha de producción
161
    """
162
    
163
    def __init__(
164
            self,
165
            _text: str,
166
            production_date: date = None,
167
    ): 
168
        super().__init__({
169
            '_text': _text,
170
            'ProductionDate': production_date,
171
        })
172
        
173
174
class Transport(ScalarMap):
175
    """
176
    Nodo requerido que especifica el pago de transporte de embalaje
177
    
178
    :param method_of_payment: Nodo requerido que especifica el metodo de pago
179
    """
180
    
181
    def __init__(
182
            self,
183
            method_of_payment: str,
184
    ): 
185
        super().__init__({
186
            'MethodOfPayment': method_of_payment,
187
        })
188
        
189
190
class Description(ScalarMap):
191
    """
192
    Nodo requerido que especifica la descripción del empaquetado
193
    
194
    :param _text: 
195
    :param type: Atributo para especificar el tipo de empaquetado
196
    """
197
    
198
    def __init__(
199
            self,
200
            _text: str,
201
            type: str,
202
    ): 
203
        super().__init__({
204
            '_text': _text,
205
            'Type': type,
206
        })
207
        
208
209
class PalletInformation(ScalarMap):
210
    """
211
    Nodo opcional que especifica la información de empaquetado
212
    
213
    :param pallet_quantity: Nodo requerido que especifica el numero de paquetes
214
    :param description: Nodo requerido que especifica la descripción del empaquetado
215
    :param transport: Nodo requerido que especifica el pago de transporte de embalaje
216
    """
217
    
218
    def __init__(
219
            self,
220
            pallet_quantity: str,
221
            description: Description | dict,
222
            transport: Transport | dict,
223
    ): 
224
        super().__init__({
225
            'PalletQuantity': pallet_quantity,
226
            'Description': description,
227
            'Transport': transport,
228
        })
229
        
230
231
class SerialShippingContainerCode(ScalarMap):
232
    """
233
    Nodo requerido que especifica la información de Rangos de identificación de productos
234
    
235
    :param _text: 
236
    :param type: Atributo para especificar el codigo del numero de identidad
237
    """
238
    
239
    def __init__(
240
            self,
241
            _text: str,
242
            type: str,
243
    ): 
244
        super().__init__({
245
            '_text': _text,
246
            'Type': type,
247
        })
248
        
249
250
class LogisticUnits(ScalarMap):
251
    """
252
    Nodo opcional que especifica la información de identificación logística
253
    
254
    :param serial_shipping_container_code: Nodo requerido que especifica la información de Rangos de identificación de productos
255
    """
256
    
257
    def __init__(
258
            self,
259
            serial_shipping_container_code: SerialShippingContainerCode | dict,
260
    ): 
261
        super().__init__({
262
            'SerialShippingContainerCode': serial_shipping_container_code,
263
        })
264
        
265
266
class NameAndAddress(ScalarMap):
267
    """
268
    Nodo requerido que especifica la etiqueta padre que indica que se empezará a definir el nombre y dirección de la ubicación donde esta la aduana
269
    
270
    :param name: Nodo requerido que especifica el nombre de la Aduana
271
    """
272
    
273
    def __init__(
274
            self,
275
            name: str,
276
    ): 
277
        super().__init__({
278
            'Name': name,
279
        })
280
        
281
282
class AlternatePartyIdentification(ScalarMap):
283
    """
284
    Nodo requerido que especifica la identificación del no. pedimento a nivel detalle
285
    
286
    :param _text: 
287
    :param type: Atributo para especificar el codigo de identificación secundaria
288
    """
289
    
290
    def __init__(
291
            self,
292
            _text: str,
293
            type: str,
294
    ): 
295
        super().__init__({
296
            '_text': _text,
297
            'Type': type,
298
        })
299
        
300
301
class Customs(ScalarMap):
302
    """
303
    Nodo opcional que especifica la ubicación donde se especifica el identificador de la aduana
304
    
305
    :param alternate_party_identification: Nodo requerido que especifica la identificación del no. pedimento a nivel detalle
306
    :param reference_date: Nodo requerido que especifica la fecha del pedimento YYYYMMDD
307
    :param name_and_address: Nodo requerido que especifica la etiqueta padre que indica que se empezará a definir el nombre y dirección de la ubicación donde esta la aduana
308
    :param gln: Nodo opcional que especifica el número global de localización (GLN) de la aduana
309
    """
310
    
311
    def __init__(
312
            self,
313
            alternate_party_identification: AlternatePartyIdentification | dict,
314
            reference_date: date,
315
            name_and_address: NameAndAddress | dict,
316
            gln: str = None,
317
    ): 
318
        super().__init__({
319
            'AlternatePartyIdentification': alternate_party_identification,
320
            'ReferenceDate': reference_date,
321
            'NameAndAddress': name_and_address,
322
            'Gln': gln,
323
        })
324
        
325
326
class ReferenceIdentification(ScalarMap):
327
    """
328
    Nodo opcional que especifica la referencia adicional de los productos
329
    
330
    :param _text: 
331
    :param type: Atributo para especificar el tipo de referencia
332
    """
333
    
334
    def __init__(
335
            self,
336
            _text: str,
337
            type: str,
338
    ): 
339
        super().__init__({
340
            '_text': _text,
341
            'Type': type,
342
        })
343
        
344
345
class AdditionalInformation(ScalarMap):
346
    """
347
    Nodo opcional que especifica la información adicional de referencia en el detalle de productos
348
    
349
    :param reference_identification: Nodo opcional que especifica la referencia adicional de los productos
350
    """
351
    
352
    def __init__(
353
            self,
354
            reference_identification: ReferenceIdentification | dict = None,
355
    ): 
356
        super().__init__({
357
            'ReferenceIdentification': reference_identification,
358
        })
359
        
360
361
class NetPrice(ScalarMap):
362
    """
363
    Nodo opcional que especifica la declaración del precion neto
364
    
365
    :param amount: Nodo requerido que especifica el precio neto de cada artículo
366
    """
367
    
368
    def __init__(
369
            self,
370
            amount: Decimal | int,
371
    ): 
372
        super().__init__({
373
            'Amount': amount,
374
        })
375
        
376
377
class GrossPrice(ScalarMap):
378
    """
379
    Nodo opcional que especifica la declaración del precio bruto
380
    
381
    :param amount: Nodo requerido que especifica el precio Bruto del artículo sin incluir descuento ni cargos
382
    """
383
    
384
    def __init__(
385
            self,
386
            amount: Decimal | int,
387
    ): 
388
        super().__init__({
389
            'Amount': amount,
390
        })
391
        
392
393
class AditionalQuantity(ScalarMap):
394
    """
395
    Nodo opcional que especifica la cantidad que se esta declarando como adicional
396
    
397
    :param _text: 
398
    :param quantity_type: Atributo para especificar el codigo de tipo de cantidad adicional declarada
399
    """
400
    
401
    def __init__(
402
            self,
403
            _text: Decimal | int,
404
            quantity_type: str,
405
    ): 
406
        super().__init__({
407
            '_text': _text,
408
            'QuantityType': quantity_type,
409
        })
410
        
411
412
class TradeItemDescriptionInformation(ScalarMap):
413
    """
414
    Nodo opcional que especifica el inicio de la descripción del artículo
415
    
416
    :param long_text: Nodo requerido que especifica la descripción del artículo solicitado
417
    :param language: Atributo para especificar el codigo del idioma en que esta la descripción del articulo
418
    """
419
    
420
    def __init__(
421
            self,
422
            long_text: str,
423
            language: str = None,
424
    ): 
425
        super().__init__({
426
            'LongText': long_text,
427
            'Language': language,
428
        })
429
        
430
431
class AlternateTradeItemIdentification(ScalarMap):
432
    """
433
    Nodo opcional que especifica el numero de identificación adicional para el artículo.
434
    
435
    :param _text: 
436
    :param type: Atributo para especificar el tipo de identificación adicional, en caso de no utilizar condigo GTIN
437
    """
438
    
439
    def __init__(
440
            self,
441
            _text: str,
442
            type: str,
443
    ): 
444
        super().__init__({
445
            '_text': _text,
446
            'Type': type,
447
        })
448
        
449
450
class GrossAmount(ScalarMap):
451
    """
452
    Nodo opcional que especifica el importe bruto
453
    
454
    :param amount: Nodo requerido que especifica el importe bruto de la línea de artículo
455
    """
456
    
457
    def __init__(
458
            self,
459
            amount: Decimal | int,
460
    ): 
461
        super().__init__({
462
            'Amount': amount,
463
        })
464
        
465
466
class NetAmount(ScalarMap):
467
    """
468
    Nodo requerido que especifica el importe neto
469
    
470
    :param amount: Nodo requerido que especifica el importe neto de la línea de artículo
471
    """
472
    
473
    def __init__(
474
            self,
475
            amount: Decimal | int,
476
    ): 
477
        super().__init__({
478
            'Amount': amount,
479
        })
480
        
481
482
class TotalLineAmount(ScalarMap):
483
    """
484
    Nodo requerido que especifica los importes monetarios por línea de articulo
485
    
486
    :param net_amount: Nodo requerido que especifica el importe neto
487
    :param gross_amount: Nodo opcional que especifica el importe bruto
488
    """
489
    
490
    def __init__(
491
            self,
492
            net_amount: NetAmount | dict,
493
            gross_amount: GrossAmount | dict = None,
494
    ): 
495
        super().__init__({
496
            'NetAmount': net_amount,
497
            'GrossAmount': gross_amount,
498
        })
499
        
500
501
class InvoicedQuantity(ScalarMap):
502
    """
503
    Nodo requerido que especifica la cantidad facturada del producto en la línea de articulo actual
504
    
505
    :param _text: 
506
    :param unit_of_measure: Atributo para especificar la unidad de medida, solo si el articulo es de unidad variable
507
    """
508
    
509
    def __init__(
510
            self,
511
            _text: Decimal | int,
512
            unit_of_measure: str,
513
    ): 
514
        super().__init__({
515
            '_text': _text,
516
            'UnitOfMeasure': unit_of_measure,
517
        })
518
        
519
520
class TradeItemIdentification(ScalarMap):
521
    """
522
    Nodo requerido que especifica la identificación de cada artículo
523
    
524
    :param gtin: Nodo requerido que especifica el código EAN del artículo solicitado
525
    """
526
    
527
    def __init__(
528
            self,
529
            gtin: str,
530
    ): 
531
        super().__init__({
532
            'Gtin': gtin,
533
        })
534
        
535
536
class LineItem(ScalarMap):
537
    """
538
    Nodo opcional que especifica la linea de detalle de la factura
539
    
540
    :param trade_item_identification: Nodo requerido que especifica la identificación de cada artículo
541
    :param invoiced_quantity: Nodo requerido que especifica la cantidad facturada del producto en la línea de articulo actual
542
    :param total_line_amount: Nodo requerido que especifica los importes monetarios por línea de articulo
543
    :param type: Atributo para especificar el tipo de línea de detalle
544
    :param number: Atributo para especificar el numero secuencial que se asigna a cada línea de detalle
545
    :param alternate_trade_item_identification: Nodo opcional que especifica el numero de identificación adicional para el artículo.
546
    :param trade_item_description_information: Nodo opcional que especifica el inicio de la descripción del artículo
547
    :param aditional_quantity: Nodo opcional que especifica la cantidad que se esta declarando como adicional
548
    :param gross_price: Nodo opcional que especifica la declaración del precio bruto
549
    :param net_price: Nodo opcional que especifica la declaración del precion neto
550
    :param additional_information: Nodo opcional que especifica la información adicional de referencia en el detalle de productos
551
    :param customs: Nodo opcional que especifica la ubicación donde se especifica el identificador de la aduana
552
    :param logistic_units: Nodo opcional que especifica la información de identificación logística
553
    :param pallet_information: Nodo opcional que especifica la información de empaquetado
554
    :param extended_attributes: Nodo opcional que especifica la información adicional de lote del producto facturado
555
    :param allowance_charge: Nodo opcional que especifica la información de los cargos o descuentos globales por línea de artículo
556
    :param trade_item_tax_information: Nodo opcional que especifica los impuestos por cada línea de artículo
557
    """
558
    
559
    def __init__(
560
            self,
561
            trade_item_identification: TradeItemIdentification | dict,
562
            invoiced_quantity: InvoicedQuantity | dict,
563
            total_line_amount: TotalLineAmount | dict,
564
            type: str = None,
565
            number: int = None,
566
            alternate_trade_item_identification: AlternateTradeItemIdentification | dict | Sequence[AlternateTradeItemIdentification | dict] = None,
567
            trade_item_description_information: TradeItemDescriptionInformation | dict = None,
568
            aditional_quantity: AditionalQuantity | dict | Sequence[AditionalQuantity | dict] = None,
569
            gross_price: GrossPrice | dict = None,
570
            net_price: NetPrice | dict = None,
571
            additional_information: AdditionalInformation | dict = None,
572
            customs: Customs | dict | Sequence[Customs | dict] = None,
573
            logistic_units: LogisticUnits | dict = None,
574
            pallet_information: PalletInformation | dict = None,
575
            extended_attributes: LotNumber | dict | Sequence[LotNumber | dict] = None,
576
            allowance_charge: AllowanceCharge | dict | Sequence[AllowanceCharge | dict] = None,
577
            trade_item_tax_information: TradeItemTaxInformation | dict | Sequence[TradeItemTaxInformation | dict] = None,
578
    ): 
579
        super().__init__({
580
            'TradeItemIdentification': trade_item_identification,
581
            'InvoicedQuantity': invoiced_quantity,
582
            'TotalLineAmount': total_line_amount,
583
            'Type': type,
584
            'Number': number,
585
            'AlternateTradeItemIdentification': alternate_trade_item_identification,
586
            'TradeItemDescriptionInformation': trade_item_description_information,
587
            'AditionalQuantity': aditional_quantity,
588
            'GrossPrice': gross_price,
589
            'NetPrice': net_price,
590
            'AdditionalInformation': additional_information,
591
            'Customs': customs,
592
            'LogisticUnits': logistic_units,
593
            'PalletInformation': pallet_information,
594
            'ExtendedAttributes': extended_attributes,
595
            'AllowanceCharge': allowance_charge,
596
            'TradeItemTaxInformation': trade_item_tax_information,
597
        })
598
        
599
600
class Rate(ScalarMap):
601
    """
602
    Nodo opcional que especifica la tarifa
603
    
604
    :param base: Atributo para especificar la base del porcentaje que se aplicara
605
    :param percentage: Nodo opcional que especifica el porcentaje de descuento que se está aplicando según se ha indicado en el campo anterior a toda la factura
606
    """
607
    
608
    def __init__(
609
            self,
610
            base: str,
611
            percentage: Decimal | int,
612
    ): 
613
        super().__init__({
614
            'Base': base,
615
            'Percentage': percentage,
616
        })
617
        
618
619
class ShipmentDetail(ScalarMap):
620
    """
621
    Nodo opcional que especifica la información pertinente para el embarque de la mercancía.
622
    
623
    """
624
    
625
    def __init__(
626
            self,
627
    ): 
628
        super().__init__({
629
        })
630
        
631
632
class DiscountPayment(ScalarMap):
633
    """
634
    Nodo opcional que especifica los descuentos por pago
635
    
636
    :param discount_type: Atributo para especificar el calificador de porcentajes
637
    :param percentage: Nodo requerido que especifica el valor de los porcentajes que serán descontados o cargados si la factura no se paga dentro del término. El porcentaje será en base al valor de la factura
638
    """
639
    
640
    def __init__(
641
            self,
642
            discount_type: str,
643
            percentage: str,
644
    ): 
645
        super().__init__({
646
            'DiscountType': discount_type,
647
            'Percentage': percentage,
648
        })
649
        
650
651
class TimePeriodDue(ScalarMap):
652
    """
653
    Nodo requerido que especifica el tiempo de pago
654
    
655
    :param time_period: Atributo para especificar el tipo de periodo
656
    :param value: Nodo requerido que especifica el numero de periodos
657
    """
658
    
659
    def __init__(
660
            self,
661
            time_period: str,
662
            value: str,
663
    ): 
664
        super().__init__({
665
            'TimePeriod': time_period,
666
            'Value': value,
667
        })
668
        
669
670
class PaymentTimePeriod(ScalarMap):
671
    """
672
    Nodo opcional que especifica el periodo de pago de la factura
673
    
674
    :param time_period_due: Nodo requerido que especifica el tiempo de pago
675
    """
676
    
677
    def __init__(
678
            self,
679
            time_period_due: TimePeriodDue | dict,
680
    ): 
681
        super().__init__({
682
            'TimePeriodDue': time_period_due,
683
        })
684
        
685
686
class NetPayment(ScalarMap):
687
    """
688
    Nodo opcional que especifica las condiciones de pago
689
    
690
    :param net_payment_terms_type: Atributo para especificar las condiciones de pago
691
    :param payment_time_period: Nodo opcional que especifica el periodo de pago de la factura
692
    """
693
    
694
    def __init__(
695
            self,
696
            net_payment_terms_type: str,
697
            payment_time_period: PaymentTimePeriod | dict = None,
698
    ): 
699
        super().__init__({
700
            'NetPaymentTermsType': net_payment_terms_type,
701
            'PaymentTimePeriod': payment_time_period,
702
        })
703
        
704
705
class PaymentTerms(ScalarMap):
706
    """
707
    Nodo opcional que especifica los términos de pago de la factura
708
    
709
    :param payment_terms_event: Atributo para especificar la referencia del tiempo de pago
710
    :param payment_terms_relation_time: Atributo para especificar el termino de relación del tiempo de pago
711
    :param net_payment: Nodo opcional que especifica las condiciones de pago
712
    :param discount_payment: Nodo opcional que especifica los descuentos por pago
713
    """
714
    
715
    def __init__(
716
            self,
717
            payment_terms_event: str = None,
718
            payment_terms_relation_time: str = None,
719
            net_payment: NetPayment | dict = None,
720
            discount_payment: DiscountPayment | dict = None,
721
    ): 
722
        super().__init__({
723
            'PaymentTermsEvent': payment_terms_event,
724
            'PaymentTermsRelationTime': payment_terms_relation_time,
725
            'NetPayment': net_payment,
726
            'DiscountPayment': discount_payment,
727
        })
728
        
729
730
class Currency(ScalarMap):
731
    """
732
    Nodo opcional que especifica el tipo de divisa utilizada, para efectos de comprobantes fiscales digitales emitidos UNICAMENTE se podrá utilizar como divisa la moneda nacional (MXN), sin embargo dentro del complemento se podrá detallar en otra de forma informativa. Lo detallado en esta etiqueta deberá coincidir con lo declarado en las etiquetas del SAT considerando el tipo de cambio.
733
    
734
    :param currency_isocode: Atributo para especificar el codigo de la moneda utilizada para detallar la relación de facturas.Todas las cantidades posteriores seran expresadas en la divisa detallada en esta etiqueta
735
    :param currency_function: Nodo requerido que especifica la función de divisa
736
    :param rate_of_change: Nodo opcional que especifical la tasa de cambio que se aplica a las monedas. La regla general para calcular la tasa de cambio es la siguiente: Divisa de Referencia multiplicada por la Tasa = Divisa Objetivo
737
    """
738
    
739
    def __init__(
740
            self,
741
            currency_isocode: str,
742
            currency_function: str | Sequence[str],
743
            rate_of_change: Decimal | int = None,
744
    ): 
745
        super().__init__({
746
            'CurrencyISOCode': currency_isocode,
747
            'CurrencyFunction': currency_function,
748
            'RateOfChange': rate_of_change,
749
        })
750
        
751
752
class InvoiceCreator(ScalarMap):
753
    """
754
    Nodo opcional que especifica la ubicación donde se especifica el identificador del emisor de la factura si es distinto del identificador del proveedor.
755
    
756
    :param gln: Nodo opcional que especifica el número global de localización (GLN)de la ubicación del emisor de la factura
757
    :param alternate_party_identification: Nodo opcional que especifica la identificación secundaria del emisor de la factura
758
    :param name_and_address:
759
    """
760
    
761
    def __init__(
762
            self,
763
            gln: str = None,
764
            alternate_party_identification: AlternatePartyIdentification | dict = None,
765
            name_and_address: NameAndAddress | dict = None,
766
    ): 
767
        super().__init__({
768
            'Gln': gln,
769
            'AlternatePartyIdentification': alternate_party_identification,
770
            'NameAndAddress': name_and_address,
771
        })
772
        
773
774
class ShipTo(ScalarMap):
775
    """
776
    Nodo opcional que especifica la ubicación donde debe realizarse la entrega de la mercancía.
777
    
778
    :param gln: Nodo opcional que especifica el número global de localización (GLN) de la ubicación a entregar la mercancía
779
    :param name_and_address: Nodo opcional que especifica el nombre y dirección de la ubicación donde debe realizarse la entrega de mercancía
780
    """
781
    
782
    def __init__(
783
            self,
784
            gln: str = None,
785
            name_and_address: NameAndAddress | dict = None,
786
    ): 
787
        super().__init__({
788
            'Gln': gln,
789
            'NameAndAddress': name_and_address,
790
        })
791
        
792
793
class Seller(ScalarMap):
794
    """
795
    Nodo opcional que especifica información del vendedor
796
    
797
    :param gln: Nodo requerido que especifica el número global de localización (GLN) del vendedor.
798
    :param alternate_party_identification: Nodo requerido que especifica el código para identificar qué tipo de identificación secundaria se le asignó al proveedor
799
    """
800
    
801
    def __init__(
802
            self,
803
            gln: str,
804
            alternate_party_identification: AlternatePartyIdentification | dict,
805
    ): 
806
        super().__init__({
807
            'Gln': gln,
808
            'AlternatePartyIdentification': alternate_party_identification,
809
        })
810
        
811
812
class DeliveryNote(ScalarMap):
813
    """
814
    Nodo opcional donde se especifica información de recepción de mercancia.Información emitida por el comprador cuando recibe la mercancía que es facturada
815
    
816
    :param reference_identification: Nodo requerido que especifica el numero de folio. Número emitido por el comprador cuando recibe la mercancía que es facturada
817
    :param reference_date: Nodo opcional que especifica la fecha en que fue asignado el no. de folio de recibo
818
    """
819
    
820
    def __init__(
821
            self,
822
            reference_identification: str | Sequence[str],
823
            reference_date: date = None,
824
    ): 
825
        super().__init__({
826
            'ReferenceIdentification': reference_identification,
827
            'ReferenceDate': reference_date,
828
        })
829
        
830
831
class SpecialInstruction(ScalarMap):
832
    """
833
    Nodo opcional que especifica que tipo de instrucciones comerciales son enviadas
834
    
835
    :param code: Atributo para especificar el codigo del tipo de instrucciones comerciales que son enviadas
836
    :param text: Nodo requerido que especifica información de texto que aplica a todo el mensaje de la factura. La información estará en función al código del tema de texto
837
    """
838
    
839
    def __init__(
840
            self,
841
            code: str,
842
            text: str | Sequence[str],
843
    ): 
844
        super().__init__({
845
            'Code': code,
846
            'Text': text,
847
        })
848
        
849
850
class PersonOrDepartmentName(ScalarMap):
851
    """
852
    Etiqueta que especifica el contacto de compras
853
    
854
    :param text: Contacto de Nodo requerido que especifica el contacto de compras
855
    """
856
    
857
    def __init__(
858
            self,
859
            text: str,
860
    ): 
861
        super().__init__({
862
            'Text': text,
863
        })
864
        
865
866
class ContactInformation(ScalarMap):
867
    """
868
    Nodo requerido que especifica información del contacto de compras
869
    
870
    :param person_or_department_name: Etiqueta que especifica el contacto de compras
871
    """
872
    
873
    def __init__(
874
            self,
875
            person_or_department_name: PersonOrDepartmentName | dict,
876
    ): 
877
        super().__init__({
878
            'PersonOrDepartmentName': person_or_department_name,
879
        })
880
        
881
882
class Buyer(ScalarMap):
883
    """
884
    Nodo requerido que especifica información del comprador
885
    
886
    :param gln: Nodo requerido que especifica el número global de localización (GLN) del comprador.
887
    :param contact_information: Nodo requerido que especifica información del contacto de compras
888
    """
889
    
890
    def __init__(
891
            self,
892
            gln: str,
893
            contact_information: ContactInformation | dict = None,
894
    ): 
895
        super().__init__({
896
            'Gln': gln,
897
            'ContactInformation': contact_information,
898
        })
899
        
900
901
class OrderIdentification(ScalarMap):
902
    """
903
    Nodo requerido que especifica información sobre la orden de compra a la que hace referencia la factura
904
    
905
    :param reference_identification: Nodo requerido que especifica el número de orden de compra (comprador) a la que hace referencia la factura
906
    :param reference_date: Nodo opcional que especifica la fecha de la orden de compra(comprador) a la que hace referencia la factura
907
    """
908
    
909
    def __init__(
910
            self,
911
            reference_identification: ReferenceIdentification | dict | Sequence[ReferenceIdentification | dict],
912
            reference_date: date = None,
913
    ): 
914
        super().__init__({
915
            'ReferenceIdentification': reference_identification,
916
            'ReferenceDate': reference_date,
917
        })
918
        
919
920
class RequestForPaymentIdentification(ScalarMap):
921
    """
922
    Nodo requerido que especifica la transacción a utilizar
923
    
924
    :param entity_type: Nodo requerido que especifica el tipo de transacción
925
    """
926
    
927
    def __init__(
928
            self,
929
            entity_type: str,
930
    ): 
931
        super().__init__({
932
            'EntityType': entity_type,
933
        })
934
        
935
936
class Detallista(CFDI):
937
    """
938
    Complemento requerido para la emision y recepcion de comprobantes fiscales digitales en el sector Retail
939
    
940
    :param document_status: Función del mensaje
941
    :param request_for_payment_identification: Nodo requerido que especifica la transacción a utilizar
942
    :param order_identification: Nodo requerido que especifica información sobre la orden de compra a la que hace referencia la factura
943
    :param additional_information: Nodo requerido que especifica las referencias adicionales a nivel global de la factura
944
    :param buyer: Nodo requerido que especifica información del comprador
945
    :param type: Tipo de transacción bajo estandar del sector detallista
946
    :param content_version: Versión del estandar XML utilizado para la elaboración de la guia del sector detallista
947
    :param special_instruction: Nodo opcional que especifica que tipo de instrucciones comerciales son enviadas
948
    :param delivery_note: Nodo opcional donde se especifica información de recepción de mercancia.Información emitida por el comprador cuando recibe la mercancía que es facturada
949
    :param seller: Nodo opcional que especifica información del vendedor
950
    :param ship_to: Nodo opcional que especifica la ubicación donde debe realizarse la entrega de la mercancía.
951
    :param invoice_creator: Nodo opcional que especifica la ubicación donde se especifica el identificador del emisor de la factura si es distinto del identificador del proveedor.
952
    :param customs: Nodo opcional que especifica la ubicación de la aduana
953
    :param currency: Nodo opcional que especifica el tipo de divisa utilizada, para efectos de comprobantes fiscales digitales emitidos UNICAMENTE se podrá utilizar como divisa la moneda nacional (MXN), sin embargo dentro del complemento se podrá detallar en otra de forma informativa. Lo detallado en esta etiqueta deberá coincidir con lo declarado en las etiquetas del SAT considerando el tipo de cambio.
954
    :param payment_terms: Nodo opcional que especifica los términos de pago de la factura
955
    :param shipment_detail: Nodo opcional que especifica la información pertinente para el embarque de la mercancía.
956
    :param allowance_charge: Nodo opcional que especifica la información de los cargos o descuentos globales mercantiles por factura
957
    :param line_item: Nodo opcional que especifica la linea de detalle de la factura
958
    :param total_amount: Nodo opcional que especifica el monto total de las líneas de artículos.
959
    :param total_allowance_charge: Nodo opcional que especifica el monto total de cargos o descuentos
960
    """
961
    
962
    tag = '{http://www.sat.gob.mx/detallista}detallista'
963
    document_structure_version = 'AMC8.1'
964
    
965
    def __init__(
966
            self,
967
            document_status: str,
968
            request_for_payment_identification: RequestForPaymentIdentification | dict,
969
            order_identification: OrderIdentification | dict,
970
            additional_information: ReferenceIdentification | dict | Sequence[ReferenceIdentification | dict],
971
            buyer: Buyer | dict,
972
            type: str = None,
973
            content_version: str = None,
974
            special_instruction: SpecialInstruction | dict | Sequence[SpecialInstruction | dict] = None,
975
            delivery_note: DeliveryNote | dict = None,
976
            seller: Seller | dict = None,
977
            ship_to: ShipTo | dict = None,
978
            invoice_creator: InvoiceCreator | dict = None,
979
            customs: str | Sequence[str] = None,
980
            currency: Currency | dict | Sequence[Currency | dict] = None,
981
            payment_terms: PaymentTerms | dict = None,
982
            shipment_detail: ShipmentDetail | dict = None,
983
            allowance_charge: AllowanceCharge | dict | Sequence[AllowanceCharge | dict] = None,
984
            line_item: LineItem | dict | Sequence[LineItem | dict] = None,
985
            total_amount: TotalAmount | dict = None,
986
            total_allowance_charge: TotalAllowanceCharge | dict | Sequence[TotalAllowanceCharge | dict] = None,
987
    ): 
988
        super().__init__({
989
            'DocumentStructureVersion': self.document_structure_version,
990
            'DocumentStatus': document_status,
991
            'RequestForPaymentIdentification': request_for_payment_identification,
992
            'OrderIdentification': order_identification,
993
            'AdditionalInformation': additional_information,
994
            'Buyer': buyer,
995
            'Type': type,
996
            'ContentVersion': content_version,
997
            'SpecialInstruction': special_instruction,
998
            'DeliveryNote': delivery_note,
999
            'Seller': seller,
1000
            'ShipTo': ship_to,
1001
            'InvoiceCreator': invoice_creator,
1002
            'Customs': customs,
1003
            'Currency': currency,
1004
            'PaymentTerms': payment_terms,
1005
            'ShipmentDetail': shipment_detail,
1006
            'AllowanceCharge': allowance_charge,
1007
            'LineItem': line_item,
1008
            'TotalAmount': total_amount,
1009
            'TotalAllowanceCharge': total_allowance_charge,
1010
        })
1011
        
1012
1013