1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . ComponentModel . DataAnnotations ;
4+ using System . Linq ;
5+ using System . Text ;
6+ using System . Threading . Tasks ;
7+ using System . Xml . Serialization ;
8+
9+ namespace Fiscalapi . XmlDownloader . Common . Models
10+ {
11+ public class MetaItem
12+ {
13+ /// <summary>
14+ /// Folio de la factura - UUID
15+ /// </summary>
16+ public string InvoiceUuid { get ; set ; }
17+
18+ /// <summary>
19+ /// RFC del emisor del comprobante - RfcEmisor
20+ /// </summary>
21+ [ Required ]
22+ [ StringLength ( 13 ) ]
23+ public string IssuerTin { get ; set ; }
24+
25+ /// <summary>
26+ /// Nombre o razón social del emisor - NombreEmisor
27+ /// </summary>
28+ [ Required ]
29+ public string IssuerName { get ; set ; }
30+
31+ /// <summary>
32+ /// RFC del receptor del comprobante - RfcReceptor
33+ /// </summary>
34+ [ Required ]
35+ [ StringLength ( 13 ) ]
36+ public string RecipientTin { get ; set ; }
37+
38+ /// <summary>
39+ /// Nombre o razón social del receptor - NombreReceptor
40+ /// </summary>
41+ [ Required ]
42+ public string RecipientName { get ; set ; }
43+
44+ /// <summary>
45+ /// RFC del Proveedor Autorizado de Certificación (PAC) - RfcPac
46+ /// </summary>
47+ [ Required ]
48+ [ StringLength ( 13 ) ]
49+ public string PacTin { get ; set ; }
50+
51+ /// <summary>
52+ /// Fecha y hora de emisión del comprobante - FechaEmision
53+ /// </summary>
54+ public DateTime InvoiceDate { get ; set ; }
55+
56+ /// <summary>
57+ /// Fecha y hora de certificación por el SAT - FechaCertificacionSat
58+ /// </summary>
59+ public DateTime ? SatCertificationDate { get ; set ; }
60+
61+ /// <summary>
62+ /// Monto total del comprobante - Monto
63+ /// </summary>
64+ [ Range ( 0 , double . MaxValue ) ]
65+ public decimal Amount { get ; set ; }
66+
67+ /// <summary>
68+ /// Tipo de comprobante (I = Ingreso, E = Egreso, T = Traslado, N = Nómina, P = Pago) - EfectoComprobante
69+ /// </summary>
70+ [ Required ]
71+ [ StringLength ( 1 ) ]
72+ public string InvoiceType { get ; set ; }
73+
74+ /// <summary>
75+ /// Estatus del comprobante (1 = Vigente, 0 = Cancelado) - Estatus
76+ /// </summary>
77+ public int Status { get ; set ; }
78+
79+ /// <summary>
80+ /// Fecha de cancelación del comprobante (si aplica) - FechaCancelacion
81+ /// </summary>
82+ public DateTime ? CancellationDate { get ; set ; }
83+
84+
85+ /// <summary>
86+ /// Constructor con parámetros
87+ /// </summary>
88+ public MetaItem ( string invoiceUuid , string issuerTin , string issuerName , string recipientTin ,
89+ string recipientName , string pacTin , DateTime invoiceDate ,
90+ DateTime ? satCertificationDate , decimal amount , string invoiceType ,
91+ int status , DateTime ? cancellationDate = null )
92+ {
93+ InvoiceUuid = invoiceUuid ;
94+ IssuerTin = issuerTin ;
95+ IssuerName = issuerName ;
96+ RecipientTin = recipientTin ;
97+ RecipientName = recipientName ;
98+ PacTin = pacTin ;
99+ InvoiceDate = invoiceDate ;
100+ SatCertificationDate = satCertificationDate ;
101+ Amount = amount ;
102+ InvoiceType = invoiceType ;
103+ Status = status ;
104+ CancellationDate = cancellationDate ;
105+ }
106+
107+ /// <summary>
108+ /// Método para parsear una línea de texto separada por ~ al objeto MetaItem
109+ /// </summary>
110+ public static MetaItem CreateFromString ( string metadataTextLine )
111+ {
112+ if ( string . IsNullOrWhiteSpace ( metadataTextLine ) )
113+ throw new ArgumentException ( "Los datos no pueden estar vacíos" , nameof ( metadataTextLine ) ) ;
114+
115+ var fields = metadataTextLine . Split ( '~' ) ;
116+
117+ if ( fields . Length < 11 )
118+ throw new ArgumentException ( "Formato de datos inválido. Se requieren al menos 11 campos" ,
119+ nameof ( metadataTextLine ) ) ;
120+
121+ return new MetaItem (
122+ invoiceUuid : fields [ 0 ] ,
123+ issuerTin : fields [ 1 ] ,
124+ issuerName : fields [ 2 ] ,
125+ recipientTin : fields [ 3 ] ,
126+ recipientName : fields [ 4 ] ,
127+ pacTin : fields [ 5 ] ,
128+ invoiceDate : DateTime . Parse ( fields [ 6 ] ) ,
129+ satCertificationDate : string . IsNullOrEmpty ( fields [ 7 ] ) ? null : DateTime . Parse ( fields [ 7 ] ) ,
130+ amount : decimal . Parse ( fields [ 8 ] ) ,
131+ invoiceType : fields [ 9 ] ,
132+ status : int . Parse ( fields [ 10 ] ) ,
133+ cancellationDate : fields . Length > 11 && ! string . IsNullOrEmpty ( fields [ 11 ] )
134+ ? DateTime . Parse ( fields [ 11 ] )
135+ : null
136+ ) ;
137+ }
138+
139+ /// <summary>
140+ /// Convierte el objeto a string con formato separado por ~
141+ /// </summary>
142+ public override string ToString ( )
143+ {
144+ return $ "{ InvoiceUuid } ~{ IssuerTin } ~{ IssuerName } ~{ RecipientTin } ~{ RecipientName } ~{ PacTin } ~" +
145+ $ "{ InvoiceDate : yyyy-MM-dd HH:mm:ss} ~{ SatCertificationDate ? . ToString ( "yyyy-MM-dd HH:mm:ss" ) } ~" +
146+ $ "{ Amount } ~{ InvoiceType } ~{ Status } ~{ CancellationDate ? . ToString ( "yyyy-MM-dd HH:mm:ss" ) } ";
147+ }
148+
149+ /// <summary>
150+ /// Indica si el comprobante está vigente
151+ /// </summary>
152+ public bool IsActive => Status == 1 ;
153+
154+ /// <summary>
155+ /// Indica si el comprobante está cancelado
156+ /// </summary>
157+ public bool IsCancelled => Status == 0 ;
158+
159+
160+ /// <summary>
161+ /// Raw content in Base64 format.
162+ /// </summary>
163+ [ XmlIgnore ]
164+ public string ? Base64Content { get ; set ; }
165+ }
166+ }
0 commit comments