npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

cfdi-sat-nodejs

v2.0.0

Published

Librería para la creación de XML para comprobantes fiscales en México y catálogos.

Downloads

38

Readme

PAQUETE CFDI SAT PARA NODEJS

EN CONSTRUCCIÓN

Si la librería te ha servido, podrias hacermelo saber invitandome un café :)

Buy Me a Coffee

Librería generadora de XML y creación de CFDI impreso, permite crear XML de tipo Ingreso, Egreso y Traslado, generar Carta Porte, Nominas, etc. Incluye catálogos en JSON.

Tabla de contenido

Instalación

npm install --save cfdi-sat-nodejs

Importación

Para crear cualquier tipo de XML necesitas importar la librerÍa y una vez crear una nueva instancia.

const { FacturaCFDI } = require("cfdi-sat-nodejs");

const nuevaFactura = new FacturaCFDI();

XML de tipo ingreso

Aquí se te explica los diversos métodos para generar el XML y los requisitos que solicitan cada uno de estos métodos.

Método crearEmisor

nuevaFactura.crearEmisor(RFC, Nombre, RegimenFiscal);

se recibe 3 argumentos:

| Argumento | Tipo | Descripción | | ------------- | --------------- | ------------------------------------------------------------------------------------------- | | RFC | string | RFC del emisor del comprobante. | | Nombre | string | Correspondiente al nombre, denominación o razón social inscrito del emisor del comprobante. | | RegimenFiscal | string - number | Clave vigente del regimen fiscal del emisor. |

Método crearReceptor

nuevaFactura.crearReceptor(RFC, Nombre, RegimenFiscal, CodigoPostal, UsoCFDI);

se recibe estos argumentos:

| Argumento | Tipo | Descripción | | ---------------- | --------------- | ------------------------------------------------------------------------------------------------ | | RFC | string | RFC del receptor del comprobante. | | Nombre | string | Nombre, denominación o razón social inscrito del receptor del comprobante. | | RegimenFiscal | string - number | Clave vigente del regimen fiscal del receptor. | | CodigoPostal | string - number | Código postal del domicilio fiscal del receptor del comprobante. | | UsoCFDI | string | Se debe registrar la clave que corresponda al uso que le dará al comprobante fiscal el receptor. | | ResidenciaFiscal | string | Clave del país de residencia para efectos fiscales del receptor del comprobante. | | NumRegIdTrib | string - number | Número de registro de identidad fiscal del receptor cuando este sea residente en el extranjero. |

Método certificado

En este método debes cargar la ruta del certificado en su formato base sin convertir ya que la librería se encarga de ese proceso.

nuevaFactura.certificado(PathCertificado);

se recibe este único argumento:

| Argumento | Tipo | Descripción | | --------------- | ------ | ---------------------------- | | PathCertificado | string | Ruta del certificado (.cer). |

Método esGlobal

Si necesitas generar facturas globales, llama al método esGlobal con los parámetros correspondientes a la periodicidad, meses y año.

nuevaFactura.esGlobal(Periocidad, Meses, Año);

| Argumento | Tipo | Descripción | | ---------- | --------------- | ------------------------------------------------ | | Periocidad | string - number | Tipo de periodo del comprobante | | Meses | string - number | Meses que abarca los movimientos del comprobante | | Año | string - number | Año que abarca los movimientos del comprobante |

Método crearConceptos

const array = [
  {
    ClaveProdServ: 1234567890, // obligatorio
    Cantidad: 1, // obligatorio
    ClaveUnidad: "H87", // obligatorio
    Unidad: "Pieza", // obligatorio
    Descripcion: "Producto", // obligatorio
    ValorUnitario: 125, // obligatorio
    Importe: 125, // obligatorio
    ObjetoImp: "02", // obligatorio
    NoIdentificacion: 567384983723, // opcional
    Descuento: 25, // opcional
    Impuesto: {
      Impuesto: "002", // obligatorio
      TipoFactor: "Tasa", // obligatorio
      TasaOCuota: "0.16", // obligatorio
    },
    /// EN CASO QUE EL PRODUCTO O SERVICIO APLIQUE RETENCIONES
    Retenciones: [
      {
        Impuesto: "001", // obligatorio
        TipoFactor: "Tasa", // obligatorio
        TasaOCuota: "0.10", // obligatorio
      },
    ],
  },
];

nuevaFactura.crearConceptos(array);

Es muy importante que en este método se envié la información acorde a lo requerido por la librería debido a que si los nombres de las propiedades son distintas a los esperados se retornara un error.

El método recibe un array como argumento, dentro debe contender los objetos correspondientes a los productos o servicios a facturar. Al ser el único método relacionado con los conceptos, es necesario incluir los datos del impuesto y retenciones (en caso de aplicar) dentro de cada objeto junto al resto de datos tal cual se muestran arriba.

NOTA: Si ObjetoImp es "01" no es necesario incluir el objeto Impuesto ni el array Retenciones.

| Argumento | Tipo | Descripción | | ---------------- | --------------- | --------------------------------------------------------------------------------------------------------- | | ClaveProdServ | string - number | Clave que permita clasificar los conceptos del comprobante como productos o servicios. | | Cantidad | string - number | Cantidad de bienes o servicios que correspondan a cada concepto. | | ClaveUnidad | string | Clave unidad del producto o servicio. | | Unidad | string | Nombre de la unidad de medida correspondiente a la ClaveUnidad. | | Descripcion | string | Descripción del producto o servicio a facturar. | | ValorUnitario | string - number | Valor o precio unitario del producto o servicio. | | Importe | string - number | Importe total de producto o servicio, resultado de la multiplicación de la Cantidad por el ValorUnitario. | | ObjetoImp | string - number | Clave correspondiente para indicar si la operación es objeto o no de impuesto. | | NoIdentificacion | string | Identificador del producto o servicio, puede ser el código de barras, SKU o cualquier otro identificador. | | Descuento | number | Valor a aplicar al importe. debe contener la misma cantidad de decimales que el importe. |

Estos argumentos aplican tanto para el objeto Impuesto como al array Retenciones

| Argumento | Tipo | Descripción | | ---------- | --------------- | ---------------------------------------------------- | | Impuesto | string - number | Tipo de impuesto aplicable. | | TipoFactor | string | Tipo de factor que se aplica a la base del impuesto. | | TasaOCuota | string - number | Valor de la tasa o cuota del impuesto. |

En caso de tener un TipoFactor como "Exento" puede omitir el valor de TasaOCuota ya que la librería no lo toma en cuenta.

Método crearSello

En caso de querer generar un XMl ya sellado y listo para timbrar puede usar el siguiente método.

nuevaFactura.crearSello(PathLlavePrivada, Contraseña);

NOTA: La llave privada debe de estar en su formato base no convertida ya que la librería se encarga de convertirla.

| Argumento | Tipo | Descripción | | ---------------- | ------ | --------------------------------------------------- | | PathLlavePrivada | string | Ruta de la llave privada en su formato base (.key). | | Contraseña | string | Contraseña de la llave privada. |

SOBRE CARTA PORTE:

Método generarXml

const atributos = [
    Serie: 'F',                       // opcional (valor por defecto "F")
    Folio: 1,                         // obligatorio
    Fecha: '2022-01-27T11:49:48',     // opcional (valor por defecto "Hora actual")
    FormaPago: '02',                  // obligatorio
    CondicionesDePago: '3 meses',     // opcional (valor por defecto "")
    TipoDeComprobante: 'I',           // opcional (valor por defecto "I")
    MetodoPago: 'PUE',                // obligatorio
    LugarExpedicion: '00000',         // obligatorio
    Subtotal: 4545,                   // obligatorio
    Total: 4545,                      // obligatorio
    Moneda: 'MXN',                    // opcional (valor por defecto "MXN")
    Exportacion: "01",                // opcional (valor por defecto "01")
    Descuento: 0                      // opcional (valor por defecto "0")
];

const xml = nuevaFactura.generarXml(atributos)

En este método nos retorna el XML sin sellar. en caso de requerir el XML sellado vea el siguiente método.

Método generarXmlSellado

Para crear el XML sellado, es necesario que el método generarXmlSellado sea llamado de manera asincrónica. Esto se puede lograr utilizando async/await o la cadena de promesas con .then() y .catch().

const xmlSellado = await nuevaFactura.generarXmlSellado(atributos);

// Tambien puedes usar:

nuevaFactura
  .generarXmlSellado(atributos)
  .then((res) => {
    console.log(res);
  })
  .catch((error) => {
    console.log(error);
  });

Para generar el XML sellado es necesario incluir el método crearSello antes del método generarXmlSellado de lo contrario retorna un error.

| Argumento | Tipo | Descripción | | ----------------- | --------------- | -------------------------------------------------------------------------------------------------------- | | Serie | string | Prefijo o nombre de la serie de las facturas. | | Folio | string - number | Numero referente al movimiento. | | Fecha | string | Fecha actual en que se realiza el movimiento en formato AAAA-MM-DDThh:mm:ss | | FormaPago | string - number | Clave de la forma de pago de los bienes, la prestación de los servicios, el otorgamiento del uso o goce. | | CondicionesDePago | string | Condiciones comerciales aplicables para el pago del comprobante de tipo ingreso o egreso. | | TipoDeComprobante | string | Clave con la que se identifica el tipo de comprobante fiscal. | | MetodoPago | string - number | Clave que corresponda depende si se paga en una sola exhibición o en parcialidades. | | LugarExpedicion | string - number | Código postal del lugar de expedición del comprobante. | | Subtotal | string - number | Suma de los importes de los conceptos antes de descuentos e impuestos. | | Total | string - number | Suma del subtotal, menos los descuentos, más impuestos trasladados menos los impuestos retenidos. | | Moneda | string | Clave de la moneda utilizada para expresar los montos. | | Exportacion | string - number | Clave con la que se identifica si el comprobante ampara una operación de exportación. | | Descuento | string - number | Importe total de los descuentos aplicables antes de impuestos. |

SOBRE CARTA PORTE:

  • Si pretende generar un XML con complemento CartaPorte se recomienda usar el método generarXml en lugar del método generarXmlSellado

XML de tipo Egreso

Nota de crédito

Para crear un XML de nota de crédito puede utilizar los métodos para la creación de un CFDI de tipo ingreso, los únicos que debe cambiar es el tipo de comprobante a Egreso ("E") y la serie.

EJEMPLO:

const atributos = [
    Serie: 'NC',
    TipoDeComprobante: 'E'
    // el resto de valores
];

Devolución

Para crear un XML de devolución puede utilizar los métodos para la creación de un CFDI de tipo ingreso, los únicos que debe cambiar es el tipo de comprobante a Egreso ("E") y la serie.

EJEMPLO:

const atributos = [
    Serie: 'AC',
    TipoDeComprobante: 'E'
    // el resto de valores
];

XML de tipo Traslado

Para crear un XML de tipo Traslado puede usar los metodos para la creacion de un CFDI de tipo ingreso, los únicos que debe cambiar es el tipo de comprobante a Traslado ("T"), la serie y los totales deben ser igual a "0" y los conceptos deben tener el Objeto de impuesto igual a "01".

EJEMPLO:

const atributos = [
    Serie: 'Traslados',
    TipoDeComprobante: 'T'
    SubTotal: 0,
    Total: 0,
    // resto de valores
];

const conceptos = [
  {
    ObjetoImp: "01",
    // resto de valores
  }
];

Carta Porte

Para poder generar el complemento Carta Porte es necesario contar con el XML de tipo ingreso o traslado sin timbrar e información relacionada a este complemento.

Creando un nuevo complemento Carta Porte

const { CartaPorte } = require("cfdi-sat-nodejs");

const xml = "contenido del XML sin timbrar.";
const nuevaCartaPorte = new CartaPorte(xml);

NOTA: Aunque se admite un XML previamente sellado sin timbrar, se recomienda usa el XML sin sellar, esto para evitar tener que usar dos veces el método crearSello

Método crearRegimenesAduaneros

En caso que el traslado de bienes y/o servicios sea internacional puede usar el método Método crearRegimenesAduaneros

const Array = ["valor1", "valor2", "valor3"];

nuevaCartaPorte.crearRegimenesAduaneros(Array);

| Argumento | Tipo | Descripción | | --------- | ----- | ---------------------------------------------------------------- | | Array | array | Claves de los regímenes aduaneros aplicables (máximo 10 claves). |

Método crearUbicacionOrigen

Para la generación del complemento Carta Porte es necesario incluir datos de ubicación tanto de origen como de destino. Con el método crearUbicacionOrigen puede definir la información necesaria para la ubicación de tipo "Origen"

const data = {
  IDUbicacion: "OR000001", // Opcional
  RFCRemitenteDestinatario: "XIQB891116QE4", // Obligatorio
  NombreRemitenteDestinatario: "BERENICE XIMO QUEZADA", // Opcional
  FechaHoraSalidaLlegada: "2023-08-01T00:00:00", // Obligatorio
  Calle: "Domicilio", // Obligatorio
  NumeroExterior: 12, // Obligatorio
  NumeroInterior: 5, // Obligatorio
  Colonia: "0900", // Obligatorio
  Localidad: "06", // Obligatorio
  Referencia: "referencias", // Obligatorio
  Municipio: "015", // Obligatorio
  Estado: "CMX", // Obligatorio
  Pais: "MEX", // Obligatorio
  CodigoPostal: "06300", // Obligatorio
  // Opcional en caso de que el remitente sea extranjero y el RFC sea XEXX010101000
  NumRegIdTrib: "121585958",
  ResidenciaFiscal: "USA",
};

nuevaCartaPorte.crearUbicacionOrigen(data);

Método crearUbicacionDestino

Al igual que el método crearUbicacionOrigen es necesario especificar los datos de destino, para esto puede usar el método crearUbicacionDestino

const data = {
  IDUbicacion: "DE000001", // Opcional
  RFCRemitenteDestinatario: "XIQB891116QE4", // Obligatorio
  NombreRemitenteDestinatario: "BERENICE XIMO QUEZADA", // Opcional
  FechaHoraSalidaLlegada: "2023-08-01T00:00:00", // Obligatorio
  DistanciaRecorrida: 1548, // Obligatorio
  Calle: "Domicilio", // Obligatorio
  NumeroExterior: 12, // Obligatorio
  NumeroInterior: 5, // Obligatorio
  Colonia: "0900", // Obligatorio
  Localidad: "06", // Obligatorio
  Referencia: "referencias", // Obligatorio
  Municipio: "015", // Obligatorio
  Estado: "CMX", // Obligatorio
  Pais: "MEX", // Obligatorio
  CodigoPostal: "06300", // Obligatorio
  // Opcional en caso de que el remitente sea extranjero y el RFC sea XEXX010101000
  NumRegIdTrib: "121585958",
  ResidenciaFiscal: "USA",
};

nuevaCartaPorte.crearUbicacionDestino(data);

| Argumento | Tipo | Descripción | | --------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------- | | IDUbicacion | string | Identificador en caso de tener diferentes ubicaciones de origen o destino. (OR para origen y DE para destino). | | RFCRemitenteDestinatario | string | RFC del remitente o destinatario. | | NombreRemitenteDestinatario | string | Nombre del remitente o destinatario correspondiente al RFC. | | FechaHoraSalidaLlegada | string | Fecha estimada para registrar la hora de salida o llegada de los vienes en formato AAAA-MM-DDThh:mm:ss | | DistanciaRecorrida | string - number | (Valor solo para el método crearUbicacionDestino) Distancia recorrida en kilómetros entre el origen y destino. | | Calle | string | Nombre de la calle del domicilio del remitente o destinatario. | | NumeroExterior | string - number | Número exterior del domicilio del remitente o destinatario. | | NumeroInterior | string - number | Número interior del domicilio del remitente o destinatario. | | Colonia | string - number | Colonia del domicilio del remitente o destinatario. | | Localidad | string - number | Localidad del domicilio del remitente o destinatario. | | Referencia | string | Referencias del domicilio del remitente o destinatario. | | Municipio | string - number | Municipio del domicilio del remitente o destinatario. | | Estado | string | Estado perteneciente del remitente o destinatario. | | Pais | string | País del remitente o destinatario. | | CodigoPostal | string - number | Código postal del domicilio del remitente o destinatario. | | NumRegIdTrib | string - number | Identificación fiscal del remitente o destinatario en caso de residentes extranjeros. | | ResidenciaFiscal | string | País del remitente o destinatario en caso de residentes extranjeros. |

Método crearMercancias

const mercancias = {
  PesoBrutoTotal: 6, // Obligatorio
  UnidadPeso: "KGM", // Obligatorio
  NumTotalMercancias: 1, // Obligatorio
  LogisticaInversaRecoleccionDevolucion: true, // Opcional
};

newCartaPorte.crearMercancias(mercancias);

| Argumento | Tipo | Descripción | | ------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------ | | PesoBrutoTotal | string - number | Suma de los pesos de los bienes y/o mercancías con un margen diferencial del 10%. | | UnidadPeso | string | Clave de la unidad correspondiente al PesoBrutoTotal. | | NumTotalMercancias | string - number | Número total de los bienes y/o mercancías que se trasladan. | | LogisticaInversaRecoleccionDevolucion | boolean | En caso de ser una operación de logística inversa o devolución y solo para autotransporte debe existir este valor. |

Método crearMercancia

const objetoMercancia = {
  BienesTransp: 24131510, // Obligatorio
  Descripcion: "Refrigeradores de mostrador", // Obligatorio
  Cantidad: 1, // Obligatorio
  ClaveUnidad: "H87", // Obligatorio
  Unidad: "Pieza", // Obligatorio
  Dimensiones: "59/40/36cm", // Obligatorio
  MaterialPeligroso: "No", // Obligatorio
  PesoEnKg: 6, // Obligatorio
  FraccionArancelaria: 8418699999, // Obligatorio
  TipoMateria: "03", // Obligatorio
  // En caso que TipoMateria sea "05" debe existe la siguiente propiedad
  DescripcionMateria: "DescripcionMateria",
  // En caso que sea un material peligroso es necesario agregar estas propiedades
  CveMaterialPeligroso: 3496,
  Embalaje: "4D",
  DescripEmbalaje: " Cajas de madera contrachapada.",
  // En caso que el registro sea parte del sector COFEPRIS incluir estas propiedades
  SectorCOFEPRIS: "01",
  NombreIngredienteActivo: "NombreIngredienteActivo",
  NomQuimico: "NomQuimico",
  DenominacionGenericaProd: "DenominacionGenericaProd",
  DenominacionDistintivaProd: "DenominacionDistintivaProd",
  Fabricante: "Fabricante",
  FechaCaducidad: "2003-04-02",
  LoteMedicamento: "LoteMedicamento",
  FormaFarmaceutica: "FormaFarmaceutica",
  CondicionesEspTransp: "CondicionesEspTransp",
  RegistroSanitarioFolioAutorizacion: "RegistroSanitarioFolioAutorizacion",
  PermisoImportacion: "PermisoImportacion",
  FolioImpoVUCEM: "FolioImpoVUCEM",
  NumCAS: "NumCAS",
  RazonSocialEmpImp: "RazonSocialEmpImp",
  NumRegSanPlagCOFEPRIS: "NumRegSanPlagCOFEPRIS",
  DatosFabricante: "DatosFabricante",
  DatosFormulador: "DatosFormulador",
  DatosMaquilador: "DatosMaquilador",
  UsoAutorizado: "UsoAutorizado",
};

newCartaPorte.crearMercancia(objetoMercancia);

Método crearDocumentacionAduanera

const docAduanera = {
  TipoDocumento: "01", // Obligatorio
  // En caso que EntradaSalidaMerc sea diferente a "Entrada" y TipoDocumento sea distinto a "01" se debe omitir las siguientes propiedades
  NumPedimento: "10 47 3807 8003832",
  RFCImpo: "XEXX010101000",
};

// Puede encadenar el método crearDocumentacionAduanera a crearMercancia o simplemente usarlo por separado.
newCartaPorte
  .crearMercancia(objetoMercancia)
  .crearDocumentacionAduanera(docAduanera);

| Argumento | Tipo | Descripción | | ------------- | --------------- | ------------------------------------------------------------------------------------------------ | | TipoDocumento | string - number | Clave del tipo de documento aduanero. | | NumPedimento | string | Número de pedimento correspondiente a la importación de los bienes y/o mercancías. | | RFCImpo | string | RFC del importador de los bienes y/o mercancías que fue registrado en la documentación aduanera. |

Método crearCantidadTransporta

const cantTransporta = {
  Cantidad: 2, // Obligatorio
  IDOrigen: "OR000001", // Obligatorio
  IDDestino: "DE000001", // Obligatorio
  CvesTransporte: "01", // Opcional en caso de ser Autotransporte
};

// Puede encadenar el método crearCantidadTransporta a crearMercancia o simplemente usarlo por separado.
newCartaPorte
  .crearMercancia(objetoMercancia)
  .crearCantidadTransporta(cantTransporta);

| Argumento | Tipo | Descripción | | -------------- | --------------- | ---------------------------------------------------------------------- | | Cantidad | string - number | Número de los bienes y/o mercancías que se trasladan. | | IDOrigen | string | Valor registrado del campo IDUbicacion del TipoUbicacion "Origen". | | IDDestino | string | Valor registrado del campo IDUbicacion del TipoUbicacion "Destino". | | CvesTransporte | string - number | Medio de transporte por el que se trasladan los bienes y/o mercancías. |

A partir de este punto los siguientes métodos seran enfocados a los distintos tipos de transporte.

Método crearAutotransporte

const autotransporte = {
  PermSCT: "TPAF01", // Obligatorio
  NumPermisoSCT: "0X2XTXZ0X5X0X3X2X1X0", // Obligatorio
};

newCartaPorte.crearAutotransporte(autotransporte);

| Argumento | Tipo | Descripción | | ------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------- | | PermSCT | string | Permiso otorgado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT) o la autoridad análoga. | | NumPermisoSCT | string | Número de permiso otorgado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT) o la autoridad análoga. |

CITA: Cuando no se cuente con un permiso emitido por parte de la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT), debido a que no es requerido y se cuenta con un permiso de ámbito local o estatal, se debe registrar la clave TPXX00 en el campo Permiso SICT (PermSCT), registrando el número de permiso local o estatal en el campo Número de Permiso SICT (NumPermisoSCT). En caso de no requerir permiso se debe registrar la descripción Permiso no contemplado en el catálogo

Método crearIdentificacionVehicular

const identificacionVehicular = {
  ConfigVehicular: "C2R2", // Obligatorio
  PesoBrutoVehicular: 35.5, // Obligatorio
  PlacaVM: "5031&&", // Obligatorio
  AnioModeloVM: 2000, // Obligatorio
};

newCartaPorte
  .crearAutotransporte(autotransporte)
  .crearIdentificacionVehicular(identificacionVehicular); // Método

| Argumento | Tipo | Descripción | | ------------------ | --------------- | --------------------------------------------------------------------------------------------------- | | ConfigVehicular | string | Clave asignada al tipo de transporte en el que se realiza el traslado de los bienes y/o mercancías. | | PesoBrutoVehicular | string - number | Suma del peso vehicular y el peso de la carga. | | PlacaVM | string | Placa del vehículo en el que se realiza el traslado de bienes y/o mercancías. | | AnioModeloVM | string - number | Año del vehículo en el que se realiza el traslado de bienes y/o mercancías. |

Método crearSeguros

const seguros = {
  AseguraRespCivil: "PFG& Seguros S.A. de C.V.", // Obligatorio
  PolizaRespCivil: 154647, // Obligatorio
  AseguraCarga: "PFG& Seguros S.A. de C.V.", // Opcional
  PolizaCarga: 368549, // Opcional
  PrimaSeguro: 1200, // Opcional
  // EN CASO DE TRANSPORTAR MATERIAL PELIGROSO DEBE PROPORCIONAR LOS DATOS DE ESTAS PROPIEDADES
  AseguraMedAmbiente: "Olimpo S.A. de C.V",
  PolizaMedAmbiente: 987423,
};

newCartaPorte
  .crearAutotransporte(autotransporte)
  .crearIdentificacionVehicular(identificacionVehicular)
  .crearSeguros(seguros); // Método

CANTIDAD DE VECES QUE PUEDE SER LLAMADO EL MÉTODO: Ilimitado

| Argumento | Tipo | Descripción | | ------------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | AseguraRespCivil | string | nombre de la aseguradora que cubre los riesgos de responsabilidad civil del autotransporte. | | PolizaRespCivil | string - number | Número de la póliza de seguro que emite la aseguradora que cubre los riesgos de responsabilidad civil del autotransporte. | | AseguraCarga | string | Nombre de la aseguradora que cubre los riesgos de la carga (bienes y/o mercancías) transportada. | | PolizaCarga | string - number | Número de póliza que emite la aseguradora que cubre los riesgos de la carga (bienes y/o mercancías) transportada. | | PrimaSeguro | string - number | Valor del importe de la prima del seguro contratado. | | AseguraMedAmbiente | string | Nombre de la aseguradora que cubre los posibles daños al medio ambiente, aplicable para los transportistas que realicen el traslado de materiales o residuos peligrosos. | | PolizaMedAmbiente | string - number | Número de póliza asignado por la aseguradora, que cubre los posibles daños al medio ambiente. |

Método crearRemolques

const remolques = {
  SubTipoRem: "CTR004",
  Placa: "5031&&",
};

newCartaPorte
  .crearAutotransporte(autotransporte)
  .crearIdentificacionVehicular(identificacionVehicular)
  .crearSeguros(seguros)
  .crearRemolques(remolques); // Método

CANTIDAD DE VECES QUE PUEDE SER LLAMADO EL MÉTODO: Ilimitado

| Argumento | Tipo | Descripción | | ---------- | ------ | --------------------------------------------------------------------------------------------- | | SubTipoRem | string | Clave del subtipo de remolque o semirremolque. | | Placa | string | Placa del remolque o semirremolque en el que se realiza el traslado de bienes y/o mercancías. |

Método crearTipoFigura

const tipoFigura = {
  TipoFigura: "01", // Obligatorio
  NombreFigura: "Pancracio Chug Wan", // Obligatorio
  RFCFigura: "XXXX78041FXXX", // Opcional
  // En caso que el TipoFigura sea "01" debe proporcionar este dato
  NumLicencia: "000004",
  // En caso que el TipoFigura sea extranjero debe proporcionar estos datos
  NumRegIdTribFigura: 121585958,
  ResidenciaFiscalFigura: "USA",
};

newCartaPorte.crearTipoFigura(tipoFigura);

CANTIDAD DE VECES QUE PUEDE SER LLAMADO EL MÉTODO: Ilimitado

| Argumento | Tipo | Descripción | | ---------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | TipoFigura | string | Clave de la figura quien hace el traslado de bienes y/o mercancías. | | NombreFigura | string | Nombre de la figura de transporte que interviene en el traslado de los bienes y/o mercancías. | | RFCFigura | string | RFC de la figura de transporte que interviene en el traslado de los bienes y/o mercancías. | | NumLicencia | string - number | Número de la licencia de conducir o permiso otorgado al operador de la unidad que se realiza el traslado de bienes y/o mercancías. | | NumRegIdTribFigura | string - number | Número de identificación fiscal que corresponde al tipo de la figura de transporte. | | ResidenciaFiscalFigura | string | Clave del país que corresponde al tipo de figura de transporte |

Método crearPartesTransporte

const partesTransporte = {
  ParteTransporte: "PT01", // Obligatorio
};

newCartaPorte
  .crearTipoFigura(tipoFigura)
  .crearPartesTransporte(partesTransporte); // Método

CANTIDAD DE VECES QUE PUEDE SER LLAMADO EL MÉTODO: Ilimitado

| Argumento | Tipo | Descripción | | --------------- | ------ | ---------------------------------------------------------------------------------------------------------- | | ParteTransporte | string | Clave que pertenece al transporte o la parte de transporte que no es propiedad del emisor del comprobante. |

Método crearDomicilioTipoFigura

const domicilioTipoFigura = {
  Calle: "Avenida Reforma Norte", // Opcional
  NumeroExterior: 77, // Opcional
  NumeroInterior: 5, // Opcional
  Colonia: "Zona Hotelera Norte", // Opcional
  Localidad: "California", // Opcional
  Municipio: "San Francisco", // Opcional
  Estado: "CA", // Obligatorio
  Pais: "USA", // Obligatorio
  CodigoPostal: 49109, // Obligatorio
  Referencia: "Frente al parque de Santa Úrsula.", // Opcional
};

newCartaPorte
  .crearTipoFigura(tipoFigura)
  .crearPartesTransporte(partesTransporte)
  .crearDomicilioTipoFigura(domicilioTipoFigura); // Método

CANTIDAD DE VECES QUE PUEDE SER LLAMADO EL MÉTODO: 1

| Argumento | Tipo | Descripción | | -------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------ | | Calle | string | Calle en la que está ubicado el domicilio de la figura de transporte. | | NumeroExterior | string - number | Número exterior en donde se ubica el domicilio de la figura de transporte. | | NumeroInterior | string - number | Número interior en donde se ubica el domicilio de la figura de transporte. | | Colonia | string | Colonia en donde se ubica el domicilio de la figura de transporte. | | Localidad | string | Localidad que corresponda a la ciudad o población en donde se encuentra ubicado el domicilio de la figura de transporte. | | Municipio | string | Municipio, demarcación territorial o condado en donde se encuentra ubicado el domicilio de la figura de transporte. | | Estado | string | Estado, entidad, región, comunidad, en donde se encuentra ubicado el domicilio de la figura de transporte. | | Pais | string | Clave del país en donde se encuentra ubicado el domicilio de la Figura de transporte. | | CodigoPostal | string . number | Clave del código postal en donde se encuentra el domicilio de la figura del transporte. | | Referencia | string | Referencia geográfica adicional, que permita una fácil o precisa ubicación del domicilio de la figura del transporte. |

Método generarCartaPorte

const atributos = {
  TranspInternac: false, // Obligatorio
  TotalDistRec: 1, // Obligatorio
  // En caso que el traslado sea internacional debe proporcionar estos datos
  EntradaSalidaMerc: "Entrada",
  PaisOrigenDestino: "MEX",
  ViaEntradaSalida: "01",
  // Para el traslado de bienes y/o mercancias dentro de los polos de desarrollo para el bienestar del Istmo de Tehuantepec
  RegistroISTMO: true,
  UbicacionPoloOrigen: "01",
  UbicacionPoloDestino: "05",
};

await newCartaPorte.generarCartaPorte(atributos);

// ó

newCartaPorte.generarCartaPorte(atributos).then((res) => {
  console.log(res);
});

Catálogos

La librería cuenta con todos los catálogos proporcionados por el SAT actualizados, todos en formato JSON. Se proporciona un método para obtener todo el contenido de cada catalogo asi como un método para obtener específicamente un registro de un catálogo en especifico.

A continuación se colocan todos los métodos disponibles

/// Importar la clase y crear una nueva instancia
const { CatalogosSAT } = require("cfdi-sat-nodejs");
const catalogos = new CatalogosSAT();
/// Obtener un solo registro de un catálogo
catalogos.buscarEnCatalogo(Valor, Clave, NombreCatalogo);

/// Ejemplo de salida correcta
/*
{
  status: true,
  data: {
    clave: 'G01',
    descripcion: 'Adquisición de mercancías.',
    fisica: 'Sí',
    moral: 'Sí',
    regimen_receptor: '601, 603, 606, 612, 620, 621, 622, 623, 624, 625,626'
  }
}
*/

/// Ejemplo de salida errónea
/*
{ 
  status: false,
  data: null,
  message: 'Clave "G001" no encontrada en el catálogo "UsoCfdi"'
}
*/

| Argumento | Tipo | Descripción | | -------------- | ------ | --------------------------------- | | Valor | string | Valor a buscar en el catalogo | | Clave | string | Clave para filtrar en el catalogo | | NombreCatalogo | string | Nombre del catálogo |

/// Obtener todos los registros de cada catálogo
catalogos.obtenerCatalogo(NombreCatalogo);

/// Ejemplo de salida correcta
/*
{
  status: true,
  data: [
    {
      clave: 'G01',
      descripcion: 'Adquisición de mercancías.',
      fisica: 'Sí',
      moral: 'Sí',
      regimen_receptor: '601, 603, 606, 612, 620, 621, 622, 623, 624, 625,626'
    },
    {
      clave: 'G02',
      descripcion: 'Devoluciones, descuentos o bonificaciones.',
      fisica: 'Sí',
      moral: 'Sí',
      regimen_receptor: '601, 603, 606, 612, 620, 621, 622, 623, 624, 625,626'
    },
    ...
  ]
}
*/

/// Ejemplo de salida errónea
/*
{ 
  status: false,
  data: null,
  message: 'El catálogo "usocfdi" no existe'
}
*/

| Argumento | Tipo | Descripción | | -------------- | ------ | ------------------- | | NombreCatalogo | string | Nombre del catálogo |

LISTA DE CATALOGOS DISPONIBLES

  • FormaPago
  • Moneda
  • TipoDeComprobante
  • Exportacion
  • MetodoPago
  • CodigoPostalParteUno
  • CodigoPostalParteDos
  • Periodicidad
  • Meses
  • TipoRelacion
  • RegimenFiscal
  • Pais
  • UsoCfdi
  • ClaveProdServ
  • ClaveUnidad
  • ObjetoImpuesto
  • Impuesto
  • TipoFactor
  • TasaOCuota
  • Aduana
  • NumPedimentoAduana
  • PatenteAduanal
  • ColoniaParteUno
  • ColoniaParteDos
  • ColoniaParteTres
  • Estado
  • Localidad
  • Municipio
  • RegimenAduanero
  • ClaveTransporte
  • TipoEstacion
  • Estaciones
  • ClaveUnidadPeso
  • ClaveProdServCp
  • MaterialPeligroso
  • TipoEmbalaje
  • TipoPermiso
  • SectorCofepris
  • FormaFarmaceutica
  • CondicionesEspeciales
  • TipoMateria
  • DocumentoAduanero
  • ParteTransporte
  • FiguraTransporte
  • ConfigAutotransporte
  • SubtipoRemolque
  • RegistroIstmo
  • ConfigMaritima
  • ClaveTipoCarga
  • ContenedorMaritimo
  • NumAutorizacionNaviero
  • CodigoTransporteAereo
  • TipoDeServicio
  • DerechosDePaso
  • TipoCarro
  • Contenedor
  • TipoTrafico