| @@ 171-232 (lines=62) @@ | ||
| 168 | }) |
|
| 169 | ||
| 170 | ||
| 171 | class Retenciones(CFDI): |
|
| 172 | """ |
|
| 173 | Estándar de Documento Electrónico Retenciones e Información de Pagos. |
|
| 174 | """ |
|
| 175 | tag = '{http://www.sat.gob.mx/esquemas/retencionpago/1}Retenciones' |
|
| 176 | version = '1.0' |
|
| 177 | ||
| 178 | def __init__( |
|
| 179 | self, |
|
| 180 | cve_retenc: str, |
|
| 181 | emisor: Issuer | dict, |
|
| 182 | receptor: Receptor | dict, |
|
| 183 | periodo: Periodo | dict, |
|
| 184 | totales: Totales | dict, |
|
| 185 | folio_int: str = None, |
|
| 186 | desc_retenc: str = None, |
|
| 187 | complemento: XElement | Sequence[XElement] = None, |
|
| 188 | addenda: XElement | Sequence[XElement] = None, |
|
| 189 | fecha_exp: datetime = None, |
|
| 190 | ): |
|
| 191 | """ |
|
| 192 | Estándar de Documento Electrónico Retenciones e Información de Pagos. |
|
| 193 | ||
| 194 | :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. |
|
| 195 | :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. |
|
| 196 | :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. |
|
| 197 | :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. |
|
| 198 | :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. |
|
| 199 | :param emisor: Nodo requerido para expresar la información del contribuyente emisor del documento electrónico de retenciones e información de pagos. |
|
| 200 | :param receptor: Nodo requerido para expresar la información del contribuyente receptor del documento electrónico de retenciones e información de pagos. |
|
| 201 | :param periodo: Nodo requerido para expresar el periodo que ampara el documento de retenciones e información de pagos |
|
| 202 | :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. |
|
| 203 | :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. |
|
| 204 | :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' |
|
| 205 | :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. |
|
| 206 | :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. |
|
| 207 | """ |
|
| 208 | ||
| 209 | fecha_exp = fecha_exp or datetime.now(tz=timezone(timedelta(hours=-6))) |
|
| 210 | super().__init__({ |
|
| 211 | 'Version': self.version, |
|
| 212 | 'Sello': '', |
|
| 213 | 'NumCert': emisor.certificate_number, |
|
| 214 | 'Cert': emisor.signer.certificate_base64(), |
|
| 215 | 'FechaExp': fecha_exp, |
|
| 216 | 'CveRetenc': cve_retenc, |
|
| 217 | 'FolioInt': folio_int, |
|
| 218 | 'DescRetenc': desc_retenc, |
|
| 219 | 'Emisor': { |
|
| 220 | "RFCEmisor": emisor.rfc, |
|
| 221 | "NomDenRazSocE": emisor.legal_name, |
|
| 222 | "CURPE": None |
|
| 223 | }, |
|
| 224 | 'Receptor': receptor, |
|
| 225 | 'Periodo': periodo, |
|
| 226 | 'Totales': totales, |
|
| 227 | 'Complemento': complemento, |
|
| 228 | 'Addenda': addenda, |
|
| 229 | }) |
|
| 230 | if emisor.signer: |
|
| 231 | self['Sello'] = emisor.signer.sign_sha1( |
|
| 232 | self.cadena_original().encode() |
|
| 233 | ) |
|
| 234 | ||
| @@ 211-278 (lines=68) @@ | ||
| 208 | }) |
|
| 209 | ||
| 210 | ||
| 211 | class Retenciones(CFDI): |
|
| 212 | """ |
|
| 213 | 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). |
|
| 214 | """ |
|
| 215 | tag = '{http://www.sat.gob.mx/esquemas/retencionpago/2}Retenciones' |
|
| 216 | version = '2.0' |
|
| 217 | ||
| 218 | def __init__( |
|
| 219 | self, |
|
| 220 | lugar_exp_retenc: str, |
|
| 221 | cve_retenc: str, |
|
| 222 | emisor: Issuer | dict, |
|
| 223 | receptor: Receptor | dict, |
|
| 224 | periodo: Periodo | dict, |
|
| 225 | totales: Totales | dict, |
|
| 226 | folio_int: str = None, |
|
| 227 | desc_retenc: str = None, |
|
| 228 | cfdi_reten_relacionados: CfdiRetenRelacionados | dict = None, |
|
| 229 | complemento: XElement | Sequence[XElement] = None, |
|
| 230 | addenda: XElement | Sequence[XElement] = None, |
|
| 231 | fecha_exp: datetime = None, |
|
| 232 | ): |
|
| 233 | """ |
|
| 234 | 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). |
|
| 235 | ||
| 236 | :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. |
|
| 237 | :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. |
|
| 238 | :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. |
|
| 239 | :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. |
|
| 240 | :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. |
|
| 241 | :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. |
|
| 242 | :param emisor: Nodo requerido para expresar la información del contribuyente emisor del comprobante que ampara retenciones e información de pagos. |
|
| 243 | :param receptor: Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos. |
|
| 244 | :param periodo: Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos. |
|
| 245 | :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. |
|
| 246 | :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. |
|
| 247 | :param desc_retenc: Atributo condicional que expresa la descripción de la retención e información de pagos. |
|
| 248 | :param cfdi_reten_relacionados: Nodo opcional para precisar la información de los comprobantes relacionados. |
|
| 249 | :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. |
|
| 250 | :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. |
|
| 251 | """ |
|
| 252 | ||
| 253 | fecha_exp = fecha_exp or datetime.now(tz=get_timezone(lugar_exp_retenc)).replace(tzinfo=None) |
|
| 254 | super().__init__({ |
|
| 255 | 'Version': self.version, |
|
| 256 | 'Sello': '', |
|
| 257 | 'NoCertificado': emisor.certificate_number, |
|
| 258 | 'Certificado': emisor.signer.certificate_base64(), |
|
| 259 | 'FechaExp': fecha_exp, |
|
| 260 | 'LugarExpRetenc': lugar_exp_retenc, |
|
| 261 | 'CveRetenc': cve_retenc, |
|
| 262 | 'FolioInt': folio_int, |
|
| 263 | 'DescRetenc': desc_retenc, |
|
| 264 | 'CfdiRetenRelacionados': cfdi_reten_relacionados, |
|
| 265 | 'Emisor': { |
|
| 266 | "RfcE": emisor.rfc, |
|
| 267 | "NomDenRazSocE": emisor.legal_name, |
|
| 268 | "RegimenFiscalE": emisor.tax_system |
|
| 269 | }, |
|
| 270 | 'Receptor': receptor, |
|
| 271 | 'Periodo': periodo, |
|
| 272 | 'Totales': totales, |
|
| 273 | 'Complemento': complemento, |
|
| 274 | 'Addenda': addenda, |
|
| 275 | }) |
|
| 276 | if emisor.signer: |
|
| 277 | self['Sello'] = emisor.signer.sign_sha256( |
|
| 278 | self.cadena_original().encode() |
|
| 279 | ) |
|
| 280 | ||