Operaciones

Catálogo SAT

Referencia de catálogo SAT por API

La aplicación administrativa de FiscalPOP

Régimen Fiscal

{clave:String, descripción:String}[]
Puedes usar tanto el masterToken como el authToken para realizar consultas

API endpoint
    
GET: https://api.fiscalpop.com/api/v1/sat/regimenFiscal/:masterToken||:authToken
    
Respuesta correcta
    
[
    {
        "clave": "601", // valor que utilizas para el CFDI JSON
        "descripcion": "General de Ley Personas Morales"
    },
    {
        "clave": "603",
        "descripcion": "Personas Morales con Fines no Lucrativos"
    },
    {
        "clave": "605",
        "descripcion": "Sueldos y Salarios e Ingresos Asimilados a Salarios"
    },
    {
        "clave": "606",
        "descripcion": "Arrendamiento"
    },
    ...
]
    

Uso CFDI

{clave:String, descripcion:String, persFisica:Bool, persModal:Bool}[].
Puedes usar tanto el masterToken como el authToken para realizar consultas

API endpoint
    
GET: https://api.fiscalpop.com/api/v1/sat/usoCfdi/:masterToken||:authToken
    
Respuesta correcta
    
[
    {
        "clave": "G01",
        "persFisica": true,
        "persMoral": true,
        "descripcion": "Adquisición de mercancías"
    },
    {
        "clave": "I01",
        "persFisica": true,
        "persMoral": true,
        "descripcion": "Construcciones"
    },
    {
        "clave": "I02",
        "persFisica": true,
        "persMoral": true,
        "descripcion": "Mobiliario y equipo de oficina por inversiones"
    },
    {
        "clave": "G03",
        "persFisica": true,
        "persMoral": true,
        "descripcion": "Gastos en General"
    },
    ...
]
    

Formas de pago

{key:String, label:String}[].
Puedes usar tanto el masterToken como el authToken para realizar consultas

API endpoint
    
GET: https://api.fiscalpop.com/api/v1/sat/payTypes/:masterToken||:authToken
    
Respuesta correcta
    
[
    {
        "key": "01",
        "label": "Efectivo"
    },
    {
        "key": "02",
        "label": "Cheque"
    },
    {
        "key": "03",
        "label": "Transferencia"
    },
    ...
]
    

Productos o Servicios

El catálogo todal del SAT es demasiado extenso para entregarse completo con un solo query. Por ello tenemos la forma de usar la ruta de catálogo de productos y servicios es una comparación de palabras en la que recibimos un campo: {compare: String} donde puedes agregar un texto que busques para comparar entre la descripción y palabras similares de cada elemento.

{clave:String, descripcion:String, trasladoIVA:Bool, trasladoIEPS:Bool, complemento:String, palabrasSimilares:String, match:Number}[].
Puedes usar tanto el masterToken como el authToken para realizar consultas

API endpoint
    
POST: https://api.fiscalpop.com/api/v1/sat/productosServicios/:masterToken||:authToken
    
Cuerpo del request (req.body, application/json)
    
{
    "compare": "cafetería", // Texto a comparar, buscar similitudes
}
    
Respuesta correcta
    
[
    {
        "clave": "95121503",
        "descripcion": "Cafetería",
        "trasladoIVA": false,
        "trasladoIEPS": false,
        "complemento": "",
        "palabrasSimilares": "",
        "match": 10
    },
    {
        "clave": "90101700",
        "descripcion": "Servicios de cafetería",
        "trasladoIVA": false,
        "trasladoIEPS": false,
        "complemento": "",
        "palabrasSimilares": "",
        "match": 3.3333333333333335
    },
    {
        "clave" : "10101902",
        "descripcion" : "Escarabajos",
        "trasladoIVA" : false,
        "trasladoIEPS" : false,
        "complemento" : "",
        "palabrasSimilares" : "Mariquitas,Sanjuaneros",
        "match": -1
    }    
    ...
]
    

Clave de Unidad

{clave:String, descripcion:String, trasladoIVA:Bool, trasladoIEPS:Bool, complemento:String, palabrasSimilares:String, match:Number}[].
Puedes usar tanto el masterToken como el authToken para realizar consultas

API endpoint
    
POST: https://api.fiscalpop.com/api/v1/sat/claveUnidades/:masterToken||:authToken
    
Cuerpo del request (req.body, application/json)
    
{
    "compare": "Kilogramo", // Texto a comparar, buscar similitudes
}
    
Respuesta correcta
    
[
    {
        "clave": "KGM",
        "nombre": "Kilogramo",
        "simbolo": "kg",
        "match": 14
    },
    {
        "clave": "M94",
        "nombre": "Kilogramo metro",
        "simbolo": "kg·m",
        "match": 9
    },
    {
        "clave": "53",
        "nombre": "Kilogramo teórico",
        "simbolo": "",
        "match": 9
    },
    {
        "clave": "QK",
        "nombre": "Cuarto de kilogramo",
        "simbolo": "",
        "match": 7.333333333333334
    },
    ...
]
    

Impuestos

{tipo:"Fijo"||"Rango", min:Number, max:Number, impuesto:String, factor:"Tasa"||"Cuota, traslado:Bool, retencion:Bool}[].
Puedes usar tanto el masterToken como el authToken para realizar consultas

API endpoint
    
GET: https://api.fiscalpop.com/api/v1/sat/impuestos/:masterToken||:authToken
    
Respuesta correcta
    
[
    {
        "tipo": "Fijo",
        "min": null,
        "max": 0,
        "impuesto": "IVA",
        "factor": "Tasa",
        "traslado": true,
        "retencion": false,
    },
    {
        "tipo": "Fijo",
        "min": null,
        "max": 0.3,
        "impuesto": "IEPS",
        "factor": "Tasa",
        "traslado": true,
        "retencion": true,
    },
    {
        "tipo": "Rango",
        "min": 0,
        "max": 0.16,
        "impuesto": "IVA",
        "factor": "Tasa",
        "traslado": false,
        "retencion": true,
    },
    {
        "tipo": "Fijo",
        "min": null,
        "max": 0.265,
        "impuesto": "IEPS",
        "factor": "Tasa",
        "traslado": true,
        "retencion": true,
    },
    {
        "tipo": "Fijo",
        "min": null,
        "max": 0.16,
        "impuesto": "IVA",
        "factor": "Tasa",
        "traslado": true,
        "retencion": false,
    }, // El IVA tradicional que vemos en todas partes
    ...
]
    

Como agregar Impuesto a concepto

Los campos que deberás usar en el CFDI JSON de tu factura son {type:'iva', retencion:false, tasa:0.16}.

Como usar los campos de impuesto en cada concepto (Psudo-code)
    
// Obtenemos la lista de impuestos y buscamos el impuesto que queremos
const impuestos = https.get('https://api.fiscalpop.com/api/v1/sat/impuestos/:masterToken');
const IVA = impuestos.filter(function(e) {return e.tipo === 'Fijo' && e.impuesto === 'IVA'});
const ivaDeseado = IVA.filter(function(e) { return e.max === 0.16});
console.log(ivaDeseado);

[{
    "tipo": "Fijo",
    "min": null,
    "max": 0.16,
    "impuesto": "IVA",
    "factor": "Tasa",
    "traslado": true,
    "retencion": false,
}]

// Obtenemos el JSON del CFDI que queremos con su concepto
const cfdiJSON = {
    "formaPago": "01",
    "metodoPago": "PUE",
    "lugarExpedicion": "06700",
    "receptor": { ... },
    "conceptos": [
        {
            "claveProdServ": "10101500",
            "claveUnidad": "KGM",
            "cantidad": 1,
            "descripcion": "PROYECTO ILUMINACION MASCAREÑO",
            "valorUnitario": 2000
        }
    ]
}
// Agregamos los campos necesarios del impuesto al concepto
cfdiJSON.conceptos[0].impuestos = [];
cfdiJSON.conceptos[0].impuestos.push({
    type: ivaDeseado.impuesto.toLowerCase(),
    retencion: !ivaDeseado.traslado, Inverso a traslado 
    tasa: ivaDeseado.max
});

    

Abajo mostraremos como agregar el campo de impuestos a nuestro concepto en el CFDI JSON desde el browser utilizando el API de fetch() (también window.fetch()).
Asumamos que la variable cfdiJSON es la misma mostrada arriba.

Como usar los campos de impuesto en cada concepto (Javascript, Browser)
    
console.log('cfdiJSON: ', cfdiJSON);
// Nos debe mostrar el CFDI de antes

// Usamos el API de fetch desde el browser (intenta Ctrl + Shift + i en tu browser)
const authToken = '659ddcb1-799b-4149-86e8-1b8b54bb56ec';
fetch('https://api.fiscalpop.com/api/v1/sat/impuestos/'+authToken)
    .then(response => response.json())
    .then(impuestos => {
        console.log(impuestos)
        // Array de impuestos [{...}, {...}, ... x16] 
        const ivaDeseado = impuestos.find((e)  => e.tipo === 'Fijo' && e.impuesto === 'IVA' && e.max === 0.16);    
        cfdiJSON.conceptos[0].impuestos = [];
        cfdiJSON.conceptos[0].impuestos.push({
            type: ivaDeseado.impuesto.toLowerCase(),
            retencion: !ivaDeseado.traslado, // Inverso a traslado 
            tasa: ivaDeseado.max
        });
        // Ya tenemos el impuesto agregado a nuestro cfdiJSON
    })