Tema
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 valorLas 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ónCerrados 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(); // falseSaleType
Cerrado. Campo saleType.
| Miembro | Valor | Etiqueta |
|---|---|---|
SaleType.CASH | cash | Contado |
SaleType.CREDIT | credit | Cré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.
| Miembro | Valor | Etiqueta | Tasa |
|---|---|---|---|
Iva.TEN | 10_percent | 10% | 0.10 |
Iva.FIVE | 5_percent | 5% | 0.05 |
Iva.EXEMPT | exempt | Exento | 0 |
Iva.MIXED_TEN | mixed_10_percent | Mixto 10% | 0.10 |
Iva.MIXED_FIVE | mixed_5_percent | Mixto 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); // trueEl 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.
| Miembro | Valor | Etiqueta |
|---|---|---|
Currency.PYG | PYG | Guaraníes |
Currency.USD | USD | Dólares Americanos |
Currency.PAB | PAB | Balboas |
Con cualquiera distinta de PYG hace falta exchangeRate.
ClientType
Cerrado. Campo clientType.
| Miembro | Valor | Etiqueta |
|---|---|---|
ClientType.PERSON | person | Persona |
ClientType.ENTITY | entity | Entidad |
ClientType.FOREIGN_ENTITY | foreign_entity | Cliente Extranjero |
ClientType.NOT_NOMINATED | not_nominated | Sin Nombre |
ClientType.DIPLOMATIC | diplomatic | Diplomático |
ClientType.GOVERNMENT | government | Gobierno |
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.
| Miembro | Valor | Etiqueta |
|---|---|---|
ELECTRONIC_INVOICE | electronic_invoice | Factura Electrónica |
PRINTED_INVOICE | printed_invoice | Factura Impresa |
RETENTION_CERTIFICATE | retention_certificate | Constancia de Retención |
NONE | none | Ninguno |
Notas de crédito y débito aceptan los dos primeros; los recibos aceptan además NONE.
ReceiptPaymentMethod
Cerrado. Campo paymentMethod del recibo.
| Miembro | Valor | Etiqueta |
|---|---|---|
CASH | cash | Efectivo |
CHECK | check | Cheque |
BANK_TRANSFER | bank_transfer | Transferencia Bancaria |
Con CHECK hacen falta checkBank y checkNumber.
ProviderType y ProviderDocumentType
Cerrados. Campos providerType y providerDocumentType de la autofactura.
ProviderType | Valor | Etiqueta |
|---|---|---|
NO_RUC | no_ruc | No Contribuyente |
FOREIGN | foreign | Extranjero |
ProviderDocumentType | Valor | Etiqueta |
|---|---|---|
PARAGUAYAN_ID | paraguayan_dni | Cédula paraguaya |
PASSPORT | passport | Pasaporte |
FOREIGN_ID | foreign_dni | Cédula Extranjera |
RESIDENCE_CARD | residence_card | Carnet de residencia |
TransactionType
Abierto. Campo transactionTypeCode, del 1 al 13.
| Código | Miembro | Descripción |
|---|---|---|
| 1 | MERCHANDISE_SALE | Venta de mercadería |
| 2 | SERVICES | Prestación de servicios |
| 3 | MIXED | Mixto (venta de mercadería y servicios) |
| 4 | FIXED_ASSET_SALE | Venta de activo fijo |
| 5 | CURRENCY_SALE | Venta de divisas |
| 6 | CURRENCY_PURCHASE | Compra de divisas |
| 7 | PROMOTION_OR_SAMPLES | Promoción o entrega de muestras |
| 8 | DONATION | Donación |
| 9 | ADVANCE_PAYMENT | Anticipo |
| 10 | PRODUCT_PURCHASE | Compra de productos |
| 11 | SERVICES_PURCHASE | Compra de servicios |
| 12 | TAX_CREDIT_SALE | Venta de crédito fiscal |
| 13 | MEDICAL_SAMPLES | Muestras médicas (Art. 3 RG 24/2014) |
MeasureUnit
Abierto. Campo items[].measureUnit. Por omisión UNIT (77).
| Código | Miembro | Descripción |
|---|---|---|
| 77 | UNIT | Unidad |
| 885 | GLOBAL_UNIT | Unidad Medida Global |
| 2329 | INTERNATIONAL_UNIT | Unidad Internacional |
| 569 | RATION | Ración |
| 104 | DETERMINATION | Determinación |
| 2366 | COST_PER_THOUSAND | Costo por Mil |
| 891 | PER_MILEAGE | Por Milaje |
| 95 | MILLIMETER | Milímetros |
| 91 | CENTIMETER | Centímetros |
| 87 / 108 | METER / METER_ALT | Metros |
| 660 | LINEAR_METER | Metro lineal |
| 625 | KILOMETER | Kilómetros |
| 94 | INCH | Pulgadas |
| 103 | YARD | Yardas |
| 96 | SQUARE_MILLIMETER | Milímetros cuadrados |
| 92 | SQUARE_CENTIMETER | Centímetros cuadrados |
| 109 | SQUARE_METER | Metros cuadrados |
| 869 | HECTARE | Hectáreas |
| 93 | CUBIC_CENTIMETER | Centímetros cúbicos |
| 110 | CUBIC_METER | Metros cúbicos |
| 88 | MILLILITER | Mililitros |
| 89 | LITER | Litros |
| 90 | MILLIGRAM | Miligramos |
| 86 | GRAM | Gramos |
| 83 | KILOGRAM | Kilogramos |
| 99 | TON | Tonelada |
| 79 | KILOGRAM_PER_SQUARE_METER | Kilogramos por metro cuadrado |
| 666 | SECOND | Segundo |
| 101 | MINUTE | Minuto |
| 100 | HOUR | Hora |
| 102 | DAY | Día |
| 98 | MONTH | Mes |
| 97 | YEAR | Año |
RemissionReason
Abierto. Campo reasonCode de la nota de remisión. Por omisión SALE (1).
| Código | Miembro | Descripción |
|---|---|---|
| 1 | SALE | Traslado por ventas |
| 2 | CONSIGNMENT | Traslado por consignación |
| 3 | EXPORT | Exportación |
| 4 | PURCHASE | Traslado por compra |
| 5 | IMPORT | Importación |
| 6 | RETURN | Traslado por devolución |
| 7 | BETWEEN_COMPANY_LOCATIONS | Traslado entre locales de la empresa |
| 8 | TRANSFORMATION | Traslado de bienes por transformación |
| 9 | REPAIR | Traslado de bienes por reparación |
| 10 | MOBILE_ISSUER | Traslado por emisor móvil |
| 11 | EXHIBITION | Exhibición o demostración |
| 12 | TRADE_FAIR | Participación en ferias |
| 13 | PARCEL | Traslado de encomienda |
| 14 | SEIZURE | Decomiso |
| 99 | OTHER | Otro |
RemissionResponsible
Abierto. Campo responsibleCode.
| Código | Miembro | Descripción |
|---|---|---|
| 1 | INVOICE_ISSUER | Emisor de la factura |
| 2 | INVOICE_AND_GOODS_HOLDER | Poseedor de la factura y bienes |
| 3 | CARRIER_COMPANY | Empresa transportista |
| 4 | CUSTOMS_BROKER | Despachante de Aduanas |
| 5 | TRANSPORT_AGENT | Agente de transporte o intermediario |
Transporte
Abiertos. Campos de la nota de remisión.
| Catálogo | Campo | Valores |
|---|---|---|
TransportType | transportTypeCode | 1 OWN (Propio), 2 THIRD_PARTY (Tercero) |
TransportMode | transportModeCode | 1 LAND, 2 RIVER, 3 AIR, 4 MULTIMODAL |
VehicleIdentificationType | transportVehicleDocumentTypeCode | 1 VIN, 2 REGISTRATION |
FreightResponsible (campo transportResponsibleCode):
| Código | Miembro | Descripción |
|---|---|---|
| 1 | INVOICE_ISSUER | Emisor de la Factura Electrónica |
| 2 | INVOICE_RECEIVER | Receptor de la Factura Electrónica |
| 3 | THIRD_PARTY | Tercero |
| 4 | TRANSPORT_AGENT | Agente intermediario del transporte |
| 5 | OWN_TRANSPORT | Transporte 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ódigo | Miembro | Descripción |
|---|---|---|
| 1 | PARAGUAYAN_ID | Cédula paraguaya |
| 2 | PASSPORT | Pasaporte |
| 3 | FOREIGN_ID | Cédula extranjera |
| 4 | RESIDENCE_CARD | Carnet de residencia |
| 5 | UNNAMED | Innominado |
| 6 | DIPLOMATIC_CARD | Tarjeta Diplomática de exoneración fiscal |
| 9 | UNSPECIFIED | No especificado |
PrintedDocumentType
Abierto. Campo associatedDocumentPrintedType.
| Código | Miembro | Descripción |
|---|---|---|
| 1 | INVOICE | Factura |
| 2 | CREDIT_NOTE | Nota de crédito |
| 3 | DEBIT_NOTE | Nota de débito |
| 4 | REMISSION_NOTE | Nota de remisión |
| 5 | WITHHOLDING_RECEIPT | Comprobante 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'); // falseGeografí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 18Ver 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); // falsePermisos
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