Skip to content

Catálogos SIFEN

Los valores válidos de cada campo con código, centralizados y validados.

ts
import { Iva, MeasureUnit, SaleType, TransactionType, ivaRate } from '@araitek/smartdocjs';

Iva.TEN;                     // '10_percent'
SaleType.CASH;               // 'cash'
MeasureUnit.UNIT;            // 77
TransactionType.SERVICES;    // 2

ivaRate(Iva.TEN);            // 0.10
SaleType.labels();           // { cash: 'Contado', credit: 'Crédito' }
SaleType.values();           // ['cash', 'credit']

Lo que viaja es el valor. El miembro es una constante con ese valor, así que Iva.TEN y '10_percent' son lo mismo, y las dos formas se pueden pasar indistintamente:

ts
Iva.coerce(Iva.TEN);         // '10_percent'
Iva.coerce('10_percent');    // '10_percent'
Iva.is('exempt');            // true

Iva.coerce('Exento');        // ValidationError: la etiqueta no es un valor

Las etiquetas son solo para mostrar en pantalla: se leen con labels() y labelOf(), y no se mandan.

En TypeScript, cada catálogo tiene además un tipo con el mismo nombre, que es la unión de sus valores:

ts
import { SaleType } from '@araitek/smartdocjs';

const tipo: SaleType = 'cash';       // ✓
const otro: SaleType = 'Contado';    // ✗ error de compilación

Cerrados y abiertos

Hay dos familias, y la diferencia importa.

Cerrados — valores de texto propios de SmartDoc. Mandar otra cosa es un error, y el SDK lo rechaza localmente con las opciones válidas.

Abiertos — códigos numéricos de SIFEN. La DNIT define el catálogo completo y la API lo acepta entero, así que el SDK deja pasar cualquier código oficial aunque no lo liste por nombre. Un código nuevo no obliga a esperar una versión del paquete.

ts
TransactionType.coerce(99);    // pasa: catálogo abierto
Currency.coerce('EUR');        // ValidationError: catálogo cerrado

TransactionType.isOpen();      // true
Currency.isOpen();             // false

SaleType

Cerrado. Campo saleType.

MiembroValorEtiqueta
SaleType.CASHcashContado
SaleType.CREDITcreditCrédito

El valor no es la etiqueta

Lo que viaja en el campo es 'cash' o 'credit'. 'Contado' y 'Crédito' son las etiquetas para mostrar en pantalla, y no se aceptan como valor: mandar 'Contado' lanza ValidationError sugiriendo 'cash'.

Iva

Cerrado. Campo items[].ivaType.

MiembroValorEtiquetaTasa
Iva.TEN10_percent10%0.10
Iva.FIVE5_percent5%0.05
Iva.EXEMPTexemptExento0
Iva.MIXED_TENmixed_10_percentMixto 10%0.10
Iva.MIXED_FIVEmixed_5_percentMixto 5%0.05

Los dos mixtos exigen ivaBase: el porcentaje de la línea que está gravado.

ts
import { Iva, isMixedIva, ivaRate } from '@araitek/smartdocjs';

ivaRate(Iva.FIVE);          // 0.05
isMixedIva(Iva.MIXED_TEN);  // true

El IVA va incluido en el precio

No se suma. Un ítem de 1.100.000 al 10% contiene 100.000 de IVA (1.100.000 / 11) sobre una base gravada de 1.000.000. Al 5% el divisor es 21.

Currency

Cerrado. Campo currency.

MiembroValorEtiqueta
Currency.PYGPYGGuaraníes
Currency.USDUSDDólares Americanos
Currency.PABPABBalboas

Con cualquiera distinta de PYG hace falta exchangeRate.

ClientType

Cerrado. Campo clientType.

MiembroValorEtiqueta
ClientType.PERSONpersonPersona
ClientType.ENTITYentityEntidad
ClientType.FOREIGN_ENTITYforeign_entityCliente Extranjero
ClientType.NOT_NOMINATEDnot_nominatedSin Nombre
ClientType.DIPLOMATICdiplomaticDiplomático
ClientType.GOVERNMENTgovernmentGobierno

Los recibos aceptan solo los tres primeros. FOREIGN_ENTITY es el único tipo que puede llevar dirección sin códigos geográficos paraguayos.

AssociatedDocumentType

Cerrado. Campo associatedDocumentType.

MiembroValorEtiqueta
ELECTRONIC_INVOICEelectronic_invoiceFactura Electrónica
PRINTED_INVOICEprinted_invoiceFactura Impresa
RETENTION_CERTIFICATEretention_certificateConstancia de Retención
NONEnoneNinguno

Notas de crédito y débito aceptan los dos primeros; los recibos aceptan además NONE.

ReceiptPaymentMethod

Cerrado. Campo paymentMethod del recibo.

MiembroValorEtiqueta
CASHcashEfectivo
CHECKcheckCheque
BANK_TRANSFERbank_transferTransferencia Bancaria

Con CHECK hacen falta checkBank y checkNumber.

ProviderType y ProviderDocumentType

Cerrados. Campos providerType y providerDocumentType de la autofactura.

ProviderTypeValorEtiqueta
NO_RUCno_rucNo Contribuyente
FOREIGNforeignExtranjero
ProviderDocumentTypeValorEtiqueta
PARAGUAYAN_IDparaguayan_dniCédula paraguaya
PASSPORTpassportPasaporte
FOREIGN_IDforeign_dniCédula Extranjera
RESIDENCE_CARDresidence_cardCarnet de residencia

TransactionType

Abierto. Campo transactionTypeCode, del 1 al 13.

CódigoMiembroDescripción
1MERCHANDISE_SALEVenta de mercadería
2SERVICESPrestación de servicios
3MIXEDMixto (venta de mercadería y servicios)
4FIXED_ASSET_SALEVenta de activo fijo
5CURRENCY_SALEVenta de divisas
6CURRENCY_PURCHASECompra de divisas
7PROMOTION_OR_SAMPLESPromoción o entrega de muestras
8DONATIONDonación
9ADVANCE_PAYMENTAnticipo
10PRODUCT_PURCHASECompra de productos
11SERVICES_PURCHASECompra de servicios
12TAX_CREDIT_SALEVenta de crédito fiscal
13MEDICAL_SAMPLESMuestras médicas (Art. 3 RG 24/2014)

MeasureUnit

Abierto. Campo items[].measureUnit. Por omisión UNIT (77).

CódigoMiembroDescripción
77UNITUnidad
885GLOBAL_UNITUnidad Medida Global
2329INTERNATIONAL_UNITUnidad Internacional
569RATIONRación
104DETERMINATIONDeterminación
2366COST_PER_THOUSANDCosto por Mil
891PER_MILEAGEPor Milaje
95MILLIMETERMilímetros
91CENTIMETERCentímetros
87 / 108METER / METER_ALTMetros
660LINEAR_METERMetro lineal
625KILOMETERKilómetros
94INCHPulgadas
103YARDYardas
96SQUARE_MILLIMETERMilímetros cuadrados
92SQUARE_CENTIMETERCentímetros cuadrados
109SQUARE_METERMetros cuadrados
869HECTAREHectáreas
93CUBIC_CENTIMETERCentímetros cúbicos
110CUBIC_METERMetros cúbicos
88MILLILITERMililitros
89LITERLitros
90MILLIGRAMMiligramos
86GRAMGramos
83KILOGRAMKilogramos
99TONTonelada
79KILOGRAM_PER_SQUARE_METERKilogramos por metro cuadrado
666SECONDSegundo
101MINUTEMinuto
100HOURHora
102DAYDía
98MONTHMes
97YEARAño

RemissionReason

Abierto. Campo reasonCode de la nota de remisión. Por omisión SALE (1).

CódigoMiembroDescripción
1SALETraslado por ventas
2CONSIGNMENTTraslado por consignación
3EXPORTExportación
4PURCHASETraslado por compra
5IMPORTImportación
6RETURNTraslado por devolución
7BETWEEN_COMPANY_LOCATIONSTraslado entre locales de la empresa
8TRANSFORMATIONTraslado de bienes por transformación
9REPAIRTraslado de bienes por reparación
10MOBILE_ISSUERTraslado por emisor móvil
11EXHIBITIONExhibición o demostración
12TRADE_FAIRParticipación en ferias
13PARCELTraslado de encomienda
14SEIZUREDecomiso
99OTHEROtro

RemissionResponsible

Abierto. Campo responsibleCode.

CódigoMiembroDescripción
1INVOICE_ISSUEREmisor de la factura
2INVOICE_AND_GOODS_HOLDERPoseedor de la factura y bienes
3CARRIER_COMPANYEmpresa transportista
4CUSTOMS_BROKERDespachante de Aduanas
5TRANSPORT_AGENTAgente de transporte o intermediario

Transporte

Abiertos. Campos de la nota de remisión.

CatálogoCampoValores
TransportTypetransportTypeCode1 OWN (Propio), 2 THIRD_PARTY (Tercero)
TransportModetransportModeCode1 LAND, 2 RIVER, 3 AIR, 4 MULTIMODAL
VehicleIdentificationTypetransportVehicleDocumentTypeCode1 VIN, 2 REGISTRATION

FreightResponsible (campo transportResponsibleCode):

CódigoMiembroDescripción
1INVOICE_ISSUEREmisor de la Factura Electrónica
2INVOICE_RECEIVERReceptor de la Factura Electrónica
3THIRD_PARTYTercero
4TRANSPORT_AGENTAgente intermediario del transporte
5OWN_TRANSPORTTransporte propio

El tipo de vehículo no es un catálogo

Vehicle.type es una descripción libre de 4 a 10 caracteres —'CAMION', 'Camioneta'—, distinta de TransportType, que sí es un código.

CarrierDocumentType

Abierto. Campo carrierDocumentTypeCode.

CódigoMiembroDescripción
1PARAGUAYAN_IDCédula paraguaya
2PASSPORTPasaporte
3FOREIGN_IDCédula extranjera
4RESIDENCE_CARDCarnet de residencia
5UNNAMEDInnominado
6DIPLOMATIC_CARDTarjeta Diplomática de exoneración fiscal
9UNSPECIFIEDNo especificado

PrintedDocumentType

Abierto. Campo associatedDocumentPrintedType.

CódigoMiembroDescripción
1INVOICEFactura
2CREDIT_NOTENota de crédito
3DEBIT_NOTENota de débito
4REMISSION_NOTENota de remisión
5WITHHOLDING_RECEIPTComprobante de retención

Países

249 códigos ISO-3. Van como datos, no como catálogo.

ts
import { constants } from '@araitek/smartdocjs';

const { countries } = constants;

countries.PARAGUAY;            // 'PRY'
countries.name('BRA');         // 'Brasil'
countries.code('Argentina');   // 'ARG'
countries.search('islas');     // [['COK', 'Islas Cook'], ['ALA', 'Islas Åland'], ...]
countries.isValid('XXX');      // false

Geografía

18 departamentos, 262 distritos y 6419 ciudades, embebidos en el paquete.

ts
import { geo } from '@araitek/smartdocjs';

const ciudad = geo.findCity('Asunción');
ciudad.code;              // 1
ciudad.district.code;
ciudad.department.code;

geo.searchCities('encarn');   // búsqueda parcial
geo.city(2226);               // por código
geo.departments();            // los 18

Ver Documentos para cómo se usan.

Estados

19 estados, compartidos por los seis tipos de documento. Ver Documentos.

ts
import { DocumentStatus, DocumentType, isSuccess, isTerminal } from '@araitek/smartdocjs';

isTerminal(DocumentStatus.APPROVED_BY_SET);                      // true
isTerminal(DocumentStatus.GENERATED, DocumentType.RECEIPT);      // true
isSuccess(DocumentStatus.GENERATED, DocumentType.INVOICE);       // false

Permisos

23 permisos, 12 de lectura y 11 de escritura. No hay jerarquía entre ellos.

ts
import { Permission, constants } from '@araitek/smartdocjs';

Permission.READ_INVOICES;             // 'read_invoices'
constants.permissions.ALL;            // los 23
constants.permissions.READ;           // los 12 de lectura