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)