API Multiemisor - Facturama/facturama-python-sdk GitHub Wiki
CSD (Certificado de los Sellos Digitales)
Para poder emitir facturas es importante contar con los CSD de cada Emisor.
Cargar un CSD
csdRequest = {
Rfc = "aaa010101aaa",
Certificate = "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",
PrivateKey = "MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAgEAAoIBAQACAggAMBQGCCqGSIb3DQMHBAgwggS+AgEAMASCBMh4EHl7aNSCaMDA1VlRoXCZ5UUmqErAbuck7ujDnmKxSaOGzJzn1hAlfBWJNtr1rgiCXRHB5/2qJ/CnTOkCcgutvs1xl3vxHgY1+N9I60iZUG+yjfEd+ungL4alXXMtKgZ8CkQXaeYIeQXFdyZ5jUU07Cy+LjMrIOAh1m/VnL6U/qW3dY+oJmII6gCG0SKcfCojeCpBVL2ispK2CBTpMDO4hd7vnbFhafl9/wUkAncmz5SHLjXPMKgmK7HvBiUSMRYFCjcNEBvMshI7E1//nG8pi0Xrmbq4MfT1B+SF8vbA39hCqKP32m+QFlOduHlaFSnW96UkMBT5hF1qImwU3HTbtKfAumo3BLzYJ9XP7Y6eVOFFSSsXudrAt94mH7CojUjazGHBsqagsUY85Q7Cz0TTvnnvWFNFAj/xbQm6nT1VL8FkdJm8hEb5YLaOqQZ8y1AEv8sCq/M51aHglexuzGFIIUTF+/XQGeYDBITlS6z2TryoHp8n1+6LpClL51WrIfaSxyMEtG2fmAHN82iNujOP6MBR7aMZ6dfxJctFRAaWlmi89wa5VhyeaoDzkx1roJznF3MLxVKROmYLDYk142IwRtTgWrex4Wnidpo4unrfL+uj6VwTUDk0cizaYvamRhlZ/LXdwyB1syb/GQGu94gSzB1zAzb5/IIbtyofK+/tVTv08OMpCqHfBye1QJQg+vxQHMkbhZH6sEgORSEjuidW13DTKi8xyryQsD5WccMh8WDxMuAVFUldrwWdGilFKg0G99S/XJWLwKB74Nv0v/Ygdp6/d9T0fFD3FXpb9RznErCgfVSMtrPv1svGg3QFwh+qmkzjh+NBwUrmmqEjNshji+9SB4fnJNYlKVvu4WAzMKliixUkRcCID1QYwLtiyWuwZDYxKTnk7Y1LXmRGqqhNbh4kdnTNUdkxEjqp+UVtBdaxswa6s4qrLbNeD7VN+1KJEMN6/zZ6+2Uj2KBMzaDA0zwAHMB1gyPkgX0v47e61iffaVAUQzDGYGbDERG2vT8234NSDdgqzOpsf7il2Pv+uF0oab+db62JiRvOEjNefXG5p8KRudYyaVO8N7iTdRRj/A/yDwjmSq9dDCZEZE0cD6BEaAgmjvqwF5IvGgJGnWYKhrOGBPv+VL6zGOXo/L9zenxYwKNTHzNYlvug/t4gXQmArroqA2YKBGpYb8/FY/q3t3k+u1bXWvNLOzWi81InvxFSCTu6l9GBCthyWwekWdoL6ssSzOmzPr/d2klSRST3ByJmAJzLGJFsj6AL01BaUVWERH0s+GmnSWOU8ZIQVGF7aOEWWbtD0vyjJRxQnxPxn+Tt3oT9Nob10QGwG/2tNZtZuhAMf1yt+cF8jl0hC/LI0FtMqmLAkxaEOiXHmFuKXbAjFxIjdIwgWsAZe1cTLzR44jIKwlB64jvh1LXmJ5jCszLd/fuCEB0XZUWLDRCZVb82MqcZl7U/gaFazSqm71NNafCDzWjWO4ukWN1lcTDJE05KgeRqoYIEcpU8jXy/CAEaoseA1bWDnfnLJk2axVXzmrtYnojyKjTjDz3In41Kjsx3nNOegqtH7O2gl9YBzJfgwZmF0ldk+udcotc0JwIXYWk7b5HmRgXWa+WvDHSwyLzMrbw=",
PrivateKeyPassword = "12345678a"
}
client.csdsMultiEmisor.Upload(csdRequest)
Eliminar CSD
client.csdsMultiEmisor.Delete(csd.Rfc)
CFDI 3.3
Para crear el CFDI debemos contar con los CSD cargados
Creacion de CFDI 3.3
import facturama
client = facturama
client._credentials = ('pruebas', 'pruebas2011')
cfdi = {
"Folio" : "100",
"Serie" : "R",
"Currency" : "MXN",
"ExpeditionPlace" : "78116",
"PaymentConditions" : "CREDITO A SIETE DIAS",
"CfdiType" : "I",
"PaymentForm" : "03",
"PaymentMethod" : "PUE",
"Issuer" : {
"FiscalRegime" : "601",
"Name" : "Emisor SA de CV",
"Rfc" : "AAA010101AAA"
},
"Receiver" : {
"Rfc" : "RSS2202108U5",
"Name" : "RADIAL SOFTWARE SOLUTIONS",
"CfdiUse" : "P01"
},
"Items" : [
{
"ProductCode" : "10101504",
"IdentificationNumber" : "EDL",
"Description" : "Estudios de viabilidad",
"Unit" : "NO APLICA",
"UnitCode" : "MTS",
"UnitPrice" : '50.00m',
"Quantity" : '2.00m',
"Subtotal" : '100.00m',
"Taxes" : [
{
"Total" : '16.00',
"Name" : "IVA",
"Base" : '100.00m',
"Rate" : '0.160000',
"IsRetention" : "false"
}
],
"Total" : '116.0m'
}
]
}
cfdiCreated = client.CfdiMultiEmisor.Create(cfdi)
CFDI Complemento de pago
import facturama
facturama._credentials = ('username', 'password')
facturama.sandbox = True
cfdi_object_multi_complemento_pago = {
"Issuer": {
"FiscalRegime": "601",
"Rfc": "AAA010101AAA",
"Name": "EXPRESION EN SOFTWARE"
},
"Receiver": {
"Name": "SERVICIOS ADMINISTRATIVOS AXKAN DEL BAJIO S.C",
"CfdiUse": "P01",
"Rfc": "SAA1609301X7"
},
"CfdiType": "P",
"NameId": "1",
"Folio": "93",
"ExpeditionPlace": "76140",
"Complemento": {
"Payments": [{
"Date": "2018-10-04",
"PaymentForm": "03",
"Amount": "11142.21",
"RelatedDocuments": [{
"Uuid": "C94C8AF3-C774-4D4C-802E-781411934A6E",
"Serie": "BQ",
"Folio": "2205",
"Currency": "USD",
"ExchangeRate": "19.2107",
"PaymentMethod": "PUE",
"PartialityNumber": "1",
"PreviousBalanceAmount": "1160.00",
"AmountPaid": "580.00",
"ImpSaldoInsoluto": "580.00"
}]
}]
}
}
cfdi = facturama.CfdiMultiEmisor.create(cfdi_object_multi_complemento_pago)
CFDI Complemento de pago por cuentas de terceros
import facturama
facturama._credentials = ('username', 'password')
facturama.sandbox = True
cfdi_object_multi_complemento_terceros = {
"Issuer": {
"FiscalRegime": "601",
"Rfc": "AAA010101AAA",
"Name": "EXPRESION EN SOFTWARE"
},
"Receiver": {
"Name": "Jose de Jesus Romero Alvarado",
"CfdiUse": "G03",
"Rfc": "ROAJ850914837"
},
"CfdiType": "I",
"NameId": "01",
"ExpeditionPlace": "45037",
"PaymentForm": "01",
"PaymentMethod": "PUE",
"Folio": "95",
"Currency": "MXN",
"Date": "2019-06-19T12:45:29",
"Items": [{
"Quantity": "1",
"ProductCode": "10121806",
"UnitCode": "58",
"Unit": " kilogramo neto",
"Description": "consumo",
"IdentificationNumber": "-",
"UnitPrice": "1000",
"Subtotal": "1000.00",
"Taxes": [{
"Name": "IVA",
"Rate": "0.16",
"Total": "160",
"Base": "1000",
"IsRetention": "false",
"IsFederalTax": "true"
}],
"Total": "1160.00",
"Complement": {
"ThirdPartyAccount": {
"Rfc": "ESO1202108R2",
"Name": "Expresion en Software",
"Taxes": [{
"Name": "IVA",
"Rate": "0.16",
"Amount": "1000"
}]
}
}
}]
}
cfdi = facturama.CfdiMultiEmisor.create(cfdi_object_multi_complemento_terceros)
CFDI Complemento de pago donativos
import facturama
facturama._credentials = ('username', 'password')
facturama.sandbox = True
cfdi_object_multi_complemento_donativos= {
"CfdiType": "I",
"Currency": "MXN",
"Date": "2019-06-19T13:45:00",
"ExpeditionPlace": "51873",
"NameId": "9",
"Folio": "94",
"PaymentForm": "12",
"PaymentMethod": "PUE",
"Serie": "Nueva",
"Complemento": {
"Donation": {
"AuthorizationDate": "30/01/2019",
"AuthorizationNumber": "B400-05-08-2014-005",
"Legend": "El comprobante es un donativo"
}
},
"Items": [{
"Description": "Cobija de lana y algodon",
"IdProduct": "LNzPKg5ydGCdkPAr8W1v7Q2",
"ProductCode": "20102000",
"IdentificationNumber": "FP114",
"Quantity": "3",
"Subtotal": "3000",
"Total": "3000",
"Unit": "NO APLICA",
"UnitCode": "EA",
"UnitPrice": "1000"
}],
"Issuer": {
"FiscalRegime": "601",
"Rfc": "AAA010101AAA",
"Name": "EXPRESION EN SOFTWARE"
},
"Receiver": {
"CfdiUse": "D04",
"Name": "Abarrotes del centro",
"Rfc": "XAXX010101000"
}
}
cfdi = facturama.CfdiMultiEmisor.create(cfdi_object_multi_complemento_donativos)
Cancelación
Consulta la guía en el siguiente link: https://apisandbox.facturama.mx/guias/api-multi/cfdi/cancelacion
- Estructura- client.CfdiMultiEmisor.Delete(cfdiId, motive, uuidReplacement)
- motive=(01 or 02 or 03 or 04)
- uuidReplacement=(UUID or null)
client.CfdiMultiEmisor.Delete(cfdiCreated.Id, '01', '50AD4DD3-8BA1-4A28-BC1B-F7CD61A8F93D')
Descarga de XML
client.CfdiMultiEmisor.saveAsXML("factura.xml", cfdiCreated.Id);
Consultar facturas con filtro
filter = dict(rfc='XAXX010101000',
folioStart = 100,
folioEnd = 200
)
data = client.CfdiMultiEmisor.list(filter)