| @@ 235-299 (lines=65) @@ | ||
| 232 | }) |
|
| 233 | ||
| 234 | ||
| 235 | class Retenciones(CFDI): |
|
| 236 | """ |
|
| 237 | Estándar del Comprobante Fiscal Digital por Internet que ampara retenciones e información de pagos. Los importes se expresan en la moneda de pesos mexicanos (MXN). |
|
| 238 | """ |
|
| 239 | tag = '{http://www.sat.gob.mx/esquemas/retencionpago/2}Retenciones' |
|
| 240 | version = '2.0' |
|
| 241 | ||
| 242 | def __init__( |
|
| 243 | self, |
|
| 244 | lugar_exp_retenc: str, |
|
| 245 | cve_retenc: str, |
|
| 246 | emisor: Emisor | dict, |
|
| 247 | receptor: Receptor | dict, |
|
| 248 | periodo: Periodo | dict, |
|
| 249 | totales: Totales | dict, |
|
| 250 | folio_int: str = None, |
|
| 251 | desc_retenc: str = None, |
|
| 252 | cfdi_reten_relacionados: CfdiRetenRelacionados | dict = None, |
|
| 253 | complemento: XElement | Sequence[XElement] = None, |
|
| 254 | addenda: XElement | Sequence[XElement] = None, |
|
| 255 | fecha_exp: datetime = None, |
|
| 256 | ): |
|
| 257 | """ |
|
| 258 | Estándar del Comprobante Fiscal Digital por Internet que ampara retenciones e información de pagos. Los importes se expresan en la moneda de pesos mexicanos (MXN). |
|
| 259 | ||
| 260 | :param sello: Atributo requerido para contener el sello digital del comprobante que ampara retenciones e información de pagos, al que hacen referencia las reglas de resolución miscelánea vigente. El sello debe ser expresado como una cadena de texto en formato Base 64. |
|
| 261 | :param no_certificado: Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante de retención e información de pagos, de acuerdo con el acuse correspondiente a 20 posiciones otorgado por el sistema del SAT. |
|
| 262 | :param certificado: Atributo requerido que sirve para incorporar el certificado de sello digital que ampara el comprobante de retención e información de pagos. El certificado debe ser expresado como una cadena de texto en formato Base 64. |
|
| 263 | :param fecha_exp: Atributo requerido para la expresión de la fecha y hora de expedición del comprobante que ampara retenciones e información de pagos. Se expresa en la forma AAAA-MM-DDThh:mm:ss y debe corresponder con la hora local donde se expide el comprobante. |
|
| 264 | :param lugar_exp_retenc: Atributo requerido para incorporar el código postal del lugar de expedición del comprobante que ampara retenciones e información de pagos. |
|
| 265 | :param cve_retenc: Atributo requerido para expresar la clave de la retención e información de pagos de acuerdo al catálogo publicado en internet por el SAT. |
|
| 266 | :param emisor: Nodo requerido para expresar la información del contribuyente emisor del comprobante que ampara retenciones e información de pagos. |
|
| 267 | :param receptor: Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos. |
|
| 268 | :param periodo: Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos. |
|
| 269 | :param totales: Nodo requerido para expresar el total de las retenciones e información de los pagos efectuados en el período que ampara el comprobante. |
|
| 270 | :param folio_int: Atributo opcional para control interno del contribuyente que expresa el folio del comprobante que ampara retenciones e información de pagos. Permite números y/o letras. |
|
| 271 | :param desc_retenc: Atributo condicional que expresa la descripción de la retención e información de pagos. |
|
| 272 | :param cfdi_reten_relacionados: Nodo opcional para precisar la información de los comprobantes relacionados. |
|
| 273 | :param complemento: Nodo opcional donde se incluirá el complemento Timbre Fiscal Digital de manera obligatoria y los nodos complementarios determinados por el SAT, de acuerdo a las disposiciones particulares a un sector o actividad específica. |
|
| 274 | :param addenda: Nodo opcional para recibir las extensiones al formato que sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato de origen. |
|
| 275 | """ |
|
| 276 | ||
| 277 | fecha_exp = fecha_exp or datetime.now(tz=get_timezone(lugar_exp_retenc)).replace(tzinfo=None) |
|
| 278 | super().__init__({ |
|
| 279 | 'Version': self.version, |
|
| 280 | 'Sello': '', |
|
| 281 | 'FechaExp': fecha_exp, |
|
| 282 | 'LugarExpRetenc': lugar_exp_retenc, |
|
| 283 | 'CveRetenc': cve_retenc, |
|
| 284 | 'FolioInt': folio_int, |
|
| 285 | 'DescRetenc': desc_retenc, |
|
| 286 | 'CfdiRetenRelacionados': cfdi_reten_relacionados, |
|
| 287 | 'Emisor': emisor, |
|
| 288 | 'Receptor': receptor, |
|
| 289 | 'Periodo': periodo, |
|
| 290 | 'Totales': totales, |
|
| 291 | 'Complemento': complemento, |
|
| 292 | 'Addenda': addenda, |
|
| 293 | }) |
|
| 294 | ||
| 295 | def sign(self, signer: Signer): |
|
| 296 | self['NoCertificado'] = signer.certificate_number, |
|
| 297 | self['Certificado'] = signer.certificate_base64(), |
|
| 298 | self['Sello'] = signer.sign_sha256( |
|
| 299 | self.cadena_original().encode() |
|
| 300 | ) |
|
| 301 | ||
| @@ 195-255 (lines=61) @@ | ||
| 192 | }) |
|
| 193 | ||
| 194 | ||
| 195 | class Retenciones(CFDI): |
|
| 196 | """ |
|
| 197 | Estándar de Documento Electrónico Retenciones e Información de Pagos. |
|
| 198 | """ |
|
| 199 | tag = '{http://www.sat.gob.mx/esquemas/retencionpago/1}Retenciones' |
|
| 200 | version = '1.0' |
|
| 201 | ||
| 202 | def __init__( |
|
| 203 | self, |
|
| 204 | cve_retenc: str, |
|
| 205 | emisor: Emisor | dict, |
|
| 206 | receptor: Receptor | dict, |
|
| 207 | periodo: Periodo | dict, |
|
| 208 | totales: Totales | dict, |
|
| 209 | folio_int: str = None, |
|
| 210 | desc_retenc: str = None, |
|
| 211 | complemento: XElement | Sequence[XElement] = None, |
|
| 212 | addenda: XElement | Sequence[XElement] = None, |
|
| 213 | fecha_exp: datetime = None, |
|
| 214 | ): |
|
| 215 | """ |
|
| 216 | Estándar de Documento Electrónico Retenciones e Información de Pagos. |
|
| 217 | ||
| 218 | :param sello: Atributo requerido para contener el sello digital del documento de retención e información de pagos. El sello deberá ser expresado como una cadena de texto en formato base 64. |
|
| 219 | :param num_cert: Atributo requerido para expresar el número de serie del certificado de sello digital con el que se selló digitalmente el documento de la retención e información de pagos. |
|
| 220 | :param cert: Atributo requerido que sirve para incorporar el certificado de sello digital que ampara el documento de retención e información de pagos como texto, en formato base 64. |
|
| 221 | :param fecha_exp: Atributo requerido para la expresión de la fecha y hora de expedición del documento de retención e información de pagos. Se expresa en la forma yyyy-mm-ddThh:mm:ssTZD-6, de acuerdo con la especificación ISO 8601. |
|
| 222 | :param cve_retenc: Atributo requerido para expresar la clave de la retención e información de pagos de acuerdo al catálogo publicado en internet por el SAT. |
|
| 223 | :param emisor: Nodo requerido para expresar la información del contribuyente emisor del documento electrónico de retenciones e información de pagos. |
|
| 224 | :param receptor: Nodo requerido para expresar la información del contribuyente receptor del documento electrónico de retenciones e información de pagos. |
|
| 225 | :param periodo: Nodo requerido para expresar el periodo que ampara el documento de retenciones e información de pagos |
|
| 226 | :param totales: Nodo requerido para expresar el total de las retenciones e información de pagos efectuados en el período que ampara el documento. |
|
| 227 | :param folio_int: Atributo opcional para control interno del contribuyente que expresa el folio del documento que ampara la retención e información de pagos. Permite números y/o letras. |
|
| 228 | :param desc_retenc: Atributo opcional que expresa la descripción de la retención e información de pagos en caso de que en el atributo CveRetenc se haya elegido el valor para 'otro tipo de retenciones' |
|
| 229 | :param complemento: Nodo opcional donde se incluirá el complemento Timbre Fiscal Digital de manera obligatoria y los nodos complementarios determinados por el SAT, de acuerdo a las disposiciones particulares a un sector o actividad específica. |
|
| 230 | :param addenda: Nodo opcional para recibir las extensiones al formato que sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato de origen. |
|
| 231 | """ |
|
| 232 | ||
| 233 | fecha_exp = fecha_exp or datetime.now(tz=timezone(timedelta(hours=-6))) |
|
| 234 | super().__init__({ |
|
| 235 | 'Version': self.version, |
|
| 236 | 'Sello': '', |
|
| 237 | 'NumCert': '', |
|
| 238 | 'Cert': '', |
|
| 239 | 'FechaExp': fecha_exp, |
|
| 240 | 'CveRetenc': cve_retenc, |
|
| 241 | 'FolioInt': folio_int, |
|
| 242 | 'DescRetenc': desc_retenc, |
|
| 243 | 'Emisor': emisor, |
|
| 244 | 'Receptor': receptor, |
|
| 245 | 'Periodo': periodo, |
|
| 246 | 'Totales': totales, |
|
| 247 | 'Complemento': complemento, |
|
| 248 | 'Addenda': addenda, |
|
| 249 | }) |
|
| 250 | ||
| 251 | def sign(self, signer: Signer): |
|
| 252 | self['NumCert'] = signer.certificate_number |
|
| 253 | self['Cert'] = signer.certificate_base64() |
|
| 254 | self['Sello'] = signer.sign_sha1( |
|
| 255 | self.cadena_original().encode() |
|
| 256 | ) |
|
| 257 | ||