@pairus/product-data 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -46,6 +46,12 @@ interface DocumentoDFe {
46
46
  tipo_documento?: string;
47
47
  manifestacao_status?: string;
48
48
  tem_xml_completo?: boolean;
49
+ /** Protocolo de autorização da NF-e (resNFe). */
50
+ protocolo?: string;
51
+ cnpj_destinatario?: string;
52
+ ie_emitente?: string;
53
+ ambiente?: string;
54
+ [campo: string]: any;
49
55
  }
50
56
  interface SincronizarDFeInput {
51
57
  cnpj: string;
@@ -72,12 +78,15 @@ interface ListarDocumentosDFeResponse {
72
78
  total: number;
73
79
  ult_nsu: string;
74
80
  max_nsu: string;
81
+ /** Data e hora da última sincronização com a SEFAZ. */
82
+ ultima_sincronizacao?: string | null;
75
83
  documentos: DocumentoDFe[];
76
84
  }
77
85
  interface ManifestarDFeInput {
78
86
  cnpj: string;
79
87
  chave_acesso: string;
80
88
  tipo_evento: TipoManifestacaoDFe | string;
89
+ /** Obrigatória apenas no 210240 (15 a 255 caracteres); a API a descarta nos demais eventos. */
81
90
  justificativa?: string;
82
91
  ambiente?: 'producao' | 'homologacao';
83
92
  }
@@ -87,6 +96,9 @@ interface ManifestarDFeResponse {
87
96
  xmotivo: string;
88
97
  protocolo?: string;
89
98
  tipo_evento?: string;
99
+ chave_acesso?: string;
100
+ /** 'ciencia', 'confirmada', 'desconhecida' ou 'nao_realizada'. */
101
+ manifestacao_status?: string;
90
102
  detalhes?: Record<string, any>;
91
103
  }
92
104
 
@@ -198,6 +210,8 @@ interface EmissaoNFeInput {
198
210
  informacoes_complementares?: string;
199
211
  id_token_csc?: string;
200
212
  codigo_csc?: string;
213
+ /** NFC-e: false impede a contingência off-line nesta venda; omitido segue a configuração da conta. */
214
+ permitir_contingencia?: boolean;
201
215
  [key: string]: any;
202
216
  }
203
217
  /** Opções de envio da emissão. */
@@ -210,7 +224,7 @@ interface EmissaoOptions {
210
224
  }
211
225
  interface EmissaoNFeResponse {
212
226
  sucesso: boolean;
213
- /** 'AUTORIZADA', 'REJEITADA', 'PENDENTE_RETORNO', 'DENEGADA' ou 'SIMULADA'. */
227
+ /** 'AUTORIZADA', 'REJEITADA', 'PENDENTE_RETORNO', 'DENEGADA', 'CONTINGENCIA' ou 'SIMULADA'. */
214
228
  status_sefaz: string;
215
229
  cStat: number;
216
230
  xMotivo: string;
@@ -289,6 +303,12 @@ declare class EmissaoResource extends BaseResource {
289
303
  inutilizar(params: InutilizacaoInput): Promise<EventoNFeResponse>;
290
304
  }
291
305
 
306
+ /**
307
+ * Tipos da predição fiscal (/v2/fiscal/predict) e do saneamento em lote (/v2/fiscal/sanitize).
308
+ *
309
+ * Espelham o contrato da API. Os nomes usados até a 1.5 (`cfop`, `avisos`, `imposto_seletivo` e
310
+ * `aliquota_efetiva_unificada` na raiz) continuam preenchidos pelo SDK a partir dos oficiais.
311
+ */
292
312
  interface IBSCBSData {
293
313
  cst: string;
294
314
  cClassTrib: string;
@@ -296,16 +316,29 @@ interface IBSCBSData {
296
316
  cbs_diferimento: number;
297
317
  cbs_reducao_aliquota: number;
298
318
  cbs_aliquota_efetiva: number;
319
+ aliquota_cbs_estimada?: number;
299
320
  ibs_aliquota_estadual: number;
300
321
  ibs_aliquota_municipal: number;
301
322
  ibs_diferimento: number;
302
323
  ibs_reducao_aliquota: number;
324
+ ibs_reducao_aliquota_estadual?: number;
325
+ ibs_reducao_aliquota_municipal?: number;
303
326
  ibs_aliquota_efetiva: number;
327
+ aliquota_ibs_estimada?: number;
328
+ aliquota_efetiva_unificada?: number;
329
+ vTotDFe_obrigatorio?: boolean;
304
330
  }
331
+ /** Imposto Seletivo: chega na chave `is` de `dados_tributarios`. */
305
332
  interface SelectiveTaxData {
306
- cst: string;
307
- cClassTribIS: string;
308
- aliquota: number;
333
+ incidencia?: boolean;
334
+ CSTIS?: string | null;
335
+ cClassTribIS?: string | null;
336
+ pIS?: number;
337
+ nota?: string | null;
338
+ /** @deprecated Use `CSTIS`. */
339
+ cst?: string | null;
340
+ /** @deprecated Use `pIS`. */
341
+ aliquota?: number;
309
342
  }
310
343
  interface FuelData {
311
344
  codigo_anp: string;
@@ -317,30 +350,55 @@ interface FuelData {
317
350
  }
318
351
  interface TaxPredictionData {
319
352
  ncm_sugerido: string;
320
- cest_sugerido?: string;
321
- cfop: string;
322
- cfop_devolucao?: string;
353
+ cest_sugerido?: string | null;
354
+ origem_mercadoria?: string;
355
+ origem_mercadoria_descricao?: string;
356
+ cfop_interno?: string;
357
+ cfop_externo?: string;
358
+ cfop_devolucao_interno?: string | null;
359
+ cfop_devolucao_externo?: string | null;
323
360
  icms_cst_csosn: string;
324
361
  icms_aliquota: number;
325
- icms_aliquota_st: number;
326
- icms_mva_st: number;
327
362
  icms_reducao_bc: number;
363
+ icms_sujeito_st?: boolean;
364
+ icms_mva_st: number;
365
+ icms_aliquota_st: number;
328
366
  icms_reducao_bc_st: number;
329
- icms_modalidade_bc: string;
330
- icms_modalidade_bc_st: string;
367
+ icms_modalidade_bc?: string | null;
368
+ icms_modalidade_bc_st?: string | null;
369
+ icms_credito_aliquota_sn?: number;
370
+ dados_desoneracao_suframa?: Record<string, any> | null;
331
371
  pis_cst: string;
332
372
  pis_aliquota: number;
333
373
  cofins_cst: string;
334
374
  cofins_aliquota: number;
335
- ipi_cst?: string;
375
+ ipi_cst?: string | null;
336
376
  ipi_aliquota?: number;
377
+ extipi?: string | null;
378
+ reforma_tributaria_nota?: string;
337
379
  ibscbs: IBSCBSData;
380
+ /** Imposto Seletivo (nome oficial da chave na API). */
381
+ is?: SelectiveTaxData;
382
+ combustivel_sujeito_anp?: boolean;
383
+ dados_combustivel?: FuelData | null;
384
+ diagnostico_anti_rejeicao?: Array<Record<string, string>>;
385
+ otimizacao_tributaria?: Record<string, any> | null;
386
+ difal?: Record<string, any> | null;
387
+ motor_ia: string;
388
+ avisos_fiscais?: string[];
389
+ disclaimer?: string;
390
+ /** @deprecated Use `cfop_interno` ou `cfop_externo` conforme a UF de destino (preenchido com `cfop_interno`). */
391
+ cfop?: string;
392
+ /** @deprecated Use `cfop_devolucao_interno` / `cfop_devolucao_externo`. */
393
+ cfop_devolucao?: string | null;
394
+ /** @deprecated Use `is`. */
338
395
  imposto_seletivo?: SelectiveTaxData;
339
- dados_combustivel?: FuelData;
396
+ /** @deprecated Use `ibscbs.aliquota_efetiva_unificada`. */
397
+ aliquota_efetiva_unificada?: number;
398
+ /** @deprecated Use `avisos_fiscais`. */
399
+ avisos?: string[];
400
+ /** @deprecated Não é devolvido pela API. */
340
401
  beneficio_fiscal?: string;
341
- aliquota_efetiva_unificada: number;
342
- motor_ia: string;
343
- avisos: string[];
344
402
  }
345
403
  interface TaxPredictionItemInput {
346
404
  xProd?: string;
@@ -354,6 +412,10 @@ interface TaxPredictionParams {
354
412
  ufDestino?: string;
355
413
  finalidade?: 'revenda' | 'consumo_final' | 'industrializacao' | string;
356
414
  destinatarioContribuinte?: boolean;
415
+ /** Alíquota de crédito de ICMS do Simples Nacional (pCredSN). */
416
+ aliquotaCreditoIcmsSn?: number;
417
+ destinatarioSuframa?: boolean;
418
+ inscricaoSuframa?: string;
357
419
  xProd?: string;
358
420
  gtin?: string;
359
421
  ncm?: string;
@@ -362,38 +424,49 @@ interface TaxPredictionParams {
362
424
  }
363
425
  interface TaxPredictionItemResult {
364
426
  item_index: number;
365
- xProd?: string;
427
+ xProd?: string | null;
366
428
  dados_tributarios: TaxPredictionData;
367
429
  }
368
430
  interface TaxPredictionResponse {
369
431
  status: string;
370
432
  provider: string;
371
- xProd?: string;
372
- dados_tributarios?: TaxPredictionData;
373
- resultados?: TaxPredictionItemResult[];
433
+ timestamp?: string;
434
+ motor_ia?: string | null;
435
+ xProd?: string | null;
436
+ dados_tributarios?: TaxPredictionData | null;
437
+ resultados?: TaxPredictionItemResult[] | null;
374
438
  }
439
+ /**
440
+ * Item do saneamento. A API exige `NCM`/`CEST` em maiúsculas; os nomes `ncm`, `cest`,
441
+ * `descricao` e `gtin` da 1.5 continuam aceitos e são convertidos pelo SDK.
442
+ */
375
443
  interface FiscalSanitizeItemInput {
376
- ncm: string;
444
+ NCM?: string;
445
+ CEST?: string;
446
+ xProd?: string;
447
+ id?: string;
448
+ /** @deprecated Use `NCM`. */
449
+ ncm?: string;
450
+ /** @deprecated Use `CEST`. */
377
451
  cest?: string;
452
+ /** @deprecated Use `xProd`. */
378
453
  descricao?: string;
454
+ /** @deprecated Use `id`. */
379
455
  gtin?: string;
380
456
  }
381
457
  interface FiscalSanitizeItemResult {
382
- ncm: string;
383
- ncm_valido: boolean;
384
- descricao_ncm?: string;
385
- cest_informado?: string;
386
- cest_sugerido?: string;
387
- sujeito_st: boolean;
388
- aliquotas_sugeridas?: Record<string, any>;
389
- avisos?: string[];
458
+ id?: string;
459
+ xProd?: string;
460
+ NCM_informado?: string;
461
+ CEST_informado?: string | null;
462
+ auditoria_fiscal: Record<string, any>;
390
463
  }
391
464
  interface FiscalSanitizeResponse {
392
465
  status: string;
393
466
  provider: string;
394
467
  timestamp?: string;
395
468
  total_itens: number;
396
- itens: Array<Record<string, any>>;
469
+ itens: FiscalSanitizeItemResult[];
397
470
  }
398
471
 
399
472
  declare class FiscalResource extends BaseResource {
@@ -403,8 +476,9 @@ declare class FiscalResource extends BaseResource {
403
476
  predict(params: TaxPredictionParams): Promise<TaxPredictionResponse>;
404
477
  /**
405
478
  * Audita e higieniza uma lista de produtos em lote perante as tabelas fiscais vigentes.
479
+ * Cada item precisa de `NCM` (aceita também `ncm`); `CEST`, `xProd` e `id` são opcionais.
406
480
  */
407
- sanitize(itens: Array<Record<string, any>>): Promise<any>;
481
+ sanitize(itens: FiscalSanitizeItemInput[]): Promise<FiscalSanitizeResponse>;
408
482
  }
409
483
 
410
484
  interface EnderecoNFSeInput {
@@ -450,6 +524,14 @@ interface RetencoesFederaisInput {
450
524
  aliquota_inss?: number;
451
525
  valor_inss?: number;
452
526
  }
527
+ /** Campos da Reforma Tributária (IBS e CBS) sobre serviços (LC 214/2025). */
528
+ interface ReformaTributariaServicoInput {
529
+ cst_ibs_cbs?: string;
530
+ cClassTrib?: string;
531
+ aliquota_ibs_estadual?: number;
532
+ aliquota_ibs_municipal?: number;
533
+ aliquota_cbs?: number;
534
+ }
453
535
  interface ServicoNFSeInput {
454
536
  item_lista_servico: string;
455
537
  discriminacao: string;
@@ -462,8 +544,10 @@ interface ServicoNFSeInput {
462
544
  valor_desconto_condicionado?: number;
463
545
  iss_retido?: boolean;
464
546
  aliquota_iss?: number;
547
+ /** '1' Exigível, '2' Não incidência, '3' Isenção, '4' Exportação, '5' Imunidade, '6'/'7' Suspensa. */
465
548
  exigibilidade_iss?: string;
466
549
  retencoes_federais?: RetencoesFederaisInput;
550
+ reforma_tributaria?: ReformaTributariaServicoInput;
467
551
  }
468
552
  interface NFSeEmissaoInput {
469
553
  prestador: PrestadorNFSeInput | Record<string, any>;
@@ -486,6 +570,8 @@ interface NFSeEmissaoResponse {
486
570
  data_emissao?: string;
487
571
  link_visualizacao?: string;
488
572
  danfse_pdf_base64?: string;
573
+ /** Alias de danfse_pdf_base64 devolvido pela API. */
574
+ danfse_base64?: string;
489
575
  xml_nfse?: string;
490
576
  valor_servicos: number;
491
577
  valor_iss: number;
@@ -494,7 +580,13 @@ interface NFSeEmissaoResponse {
494
580
  valor_liquido: number;
495
581
  erros?: string[];
496
582
  alertas?: string[];
497
- trilha_auditoria?: Record<string, any>[];
583
+ trilha_auditoria?: Array<{
584
+ autor: string;
585
+ acao: string;
586
+ justificativa_legal: string;
587
+ campos_alterados?: Record<string, any>;
588
+ timestamp: string;
589
+ }>;
498
590
  creditos_cobrados: number;
499
591
  tempo_processamento_ms: number;
500
592
  }
@@ -504,6 +596,7 @@ interface CancelamentoNFSeInput {
504
596
  inscricao_municipal: string;
505
597
  codigo_municipio_ibge: string;
506
598
  justificativa: string;
599
+ /** '1' Erro de emissão, '2' Serviço não prestado, '3' Duplicidade, '9' Outros. */
507
600
  motivo_codigo?: string;
508
601
  codigo_verificacao?: string;
509
602
  chave_acesso_nacional?: string;
@@ -535,6 +628,11 @@ declare class NFSeResource extends BaseResource {
535
628
  consultar(chaveOuNumero: string): Promise<Record<string, any>>;
536
629
  }
537
630
 
631
+ /**
632
+ * Tipos de produto do SDK. A API devolve o produto no layout da NF-e (`GTIN`, `NCM`, `CEST`) com
633
+ * marca, categoria, imagem e pesos em `infoAdicional` e a IA em `enriquecimentoIA`/`tributacaoIA`;
634
+ * o `ProductsResource` converte esse contrato para os tipos abaixo.
635
+ */
538
636
  interface ProductDetails {
539
637
  gtin: string;
540
638
  xProd: string;
@@ -549,10 +647,16 @@ interface ProductDetails {
549
647
  quantidadeEmbalagem?: number;
550
648
  dataCadastro?: string;
551
649
  dataAtualizacao?: string;
650
+ tpGTIN?: string;
651
+ fonte?: string;
652
+ /** Bloco `infoAdicional` original da API. */
653
+ infoAdicional?: Record<string, any>;
552
654
  }
553
655
  interface ProductResponse {
554
656
  status: string;
555
657
  provider: string;
658
+ cStat?: string;
659
+ xMotivo?: string;
556
660
  produto?: ProductDetails;
557
661
  raw_data?: Record<string, any>;
558
662
  }
@@ -562,6 +666,8 @@ interface ProductSearchResultItem {
562
666
  marca?: string;
563
667
  categoria?: string;
564
668
  score?: number;
669
+ /** Explicação da correspondência semântica. */
670
+ justificativa?: string;
565
671
  ncm?: string;
566
672
  cest?: string;
567
673
  imagem_url?: string;
@@ -571,12 +677,17 @@ interface ProductSearchResponse {
571
677
  provider: string;
572
678
  total_encontrados: number;
573
679
  termo_buscado: string;
680
+ motor_busca?: string;
574
681
  produtos: ProductSearchResultItem[];
575
682
  }
576
683
  interface ProductEnrichedDetails {
577
684
  gtin: string;
578
685
  xProd: string;
686
+ /** Nome saneado pela IA. */
687
+ xProd_higienizado?: string;
688
+ /** Descrição otimizada para SEO (`enriquecimentoIA.descricao_seo`). */
579
689
  descricao_completa?: string;
690
+ /** Atributos técnicos extraídos pela IA (`enriquecimentoIA.atributos`). */
580
691
  ficha_tecnica?: Record<string, any>;
581
692
  palavras_chave?: string[];
582
693
  ncm?: string;
@@ -586,7 +697,13 @@ interface ProductEnrichedDetails {
586
697
  imagem_url?: string;
587
698
  peso_bruto?: number;
588
699
  peso_liquido?: number;
700
+ /** Nó `tributacaoIA` da API. */
589
701
  dados_tributarios_sugeridos?: Record<string, any>;
702
+ tpGTIN?: string;
703
+ fonte?: string;
704
+ infoAdicional?: Record<string, any>;
705
+ enriquecimentoIA?: Record<string, any>;
706
+ tributacaoIA?: Record<string, any>;
590
707
  }
591
708
 
592
709
  declare class ProductsResource extends BaseResource {
@@ -672,4 +789,4 @@ declare class NetworkError extends PairusError {
672
789
  constructor(message: string);
673
790
  }
674
791
 
675
- export { AuthenticationError, type CancelamentoInput, type CancelamentoNFSeInput, type CancelamentoNFSeResponse, type CartaCorrecaoInput, DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT_MS, DFeResource, type DocumentoDFe, type EmissaoDestinatarioInput, type EmissaoItemInput, type EmissaoNFeInput, type EmissaoNFeResponse, type EmissaoOptions, type EmissaoPagamentoInput, EmissaoResource, type EnderecoNFSeInput, type EventoNFeResponse, FiscalResource, type FiscalSanitizeItemInput, type FiscalSanitizeItemResult, type FiscalSanitizeResponse, type FuelData, type IBSCBSData, type InutilizacaoInput, InvalidSignatureError, type ListarDocumentosDFeParams, type ListarDocumentosDFeResponse, type ManifestarDFeInput, type ManifestarDFeResponse, type NFSeEmissaoInput, type NFSeEmissaoResponse, NFSeResource, NetworkError, PairusAPIError, type PairusClientOptions, PairusError, PairusProductData, type PrestadorNFSeInput, type ProductDetails, type ProductEnrichedDetails, type ProductResponse, type ProductSearchResponse, type ProductSearchResultItem, ProductsResource, RateLimitError, type RetencoesFederaisInput, type SelectiveTaxData, type ServicoNFSeInput, type SincronizarDFeInput, type SincronizarDFeResponse, type TaxPredictionData, type TaxPredictionItemInput, type TaxPredictionItemResult, type TaxPredictionParams, type TaxPredictionResponse, type TipoManifestacaoDFe, type TomadorNFSeInput, type WebhookEvent, Webhooks };
792
+ export { AuthenticationError, type CancelamentoInput, type CancelamentoNFSeInput, type CancelamentoNFSeResponse, type CartaCorrecaoInput, DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT_MS, DFeResource, type DocumentoDFe, type EmissaoDestinatarioInput, type EmissaoItemInput, type EmissaoNFeInput, type EmissaoNFeResponse, type EmissaoOptions, type EmissaoPagamentoInput, EmissaoResource, type EnderecoNFSeInput, type EventoNFeResponse, FiscalResource, type FiscalSanitizeItemInput, type FiscalSanitizeItemResult, type FiscalSanitizeResponse, type FuelData, type IBSCBSData, type InutilizacaoInput, InvalidSignatureError, type ListarDocumentosDFeParams, type ListarDocumentosDFeResponse, type ManifestarDFeInput, type ManifestarDFeResponse, type NFSeEmissaoInput, type NFSeEmissaoResponse, NFSeResource, NetworkError, PairusAPIError, type PairusClientOptions, PairusError, PairusProductData, type PrestadorNFSeInput, type ProductDetails, type ProductEnrichedDetails, type ProductResponse, type ProductSearchResponse, type ProductSearchResultItem, ProductsResource, RateLimitError, type ReformaTributariaServicoInput, type RetencoesFederaisInput, type SelectiveTaxData, type ServicoNFSeInput, type SincronizarDFeInput, type SincronizarDFeResponse, type TaxPredictionData, type TaxPredictionItemInput, type TaxPredictionItemResult, type TaxPredictionParams, type TaxPredictionResponse, type TipoManifestacaoDFe, type TomadorNFSeInput, type WebhookEvent, Webhooks };
package/dist/index.js CHANGED
@@ -125,7 +125,7 @@ var BaseResource = class {
125
125
  const reqHeaders = {
126
126
  "Accept": "application/json",
127
127
  "X-API-Key": this.apiKey,
128
- "User-Agent": "Pairus-NodeJS-SDK/1.5.0",
128
+ "User-Agent": "Pairus-NodeJS-SDK/1.7.0",
129
129
  ...options.headers || {}
130
130
  };
131
131
  const isFormData = typeof FormData !== "undefined" && options.body instanceof FormData;
@@ -196,7 +196,7 @@ var BaseResource = class {
196
196
  const reqHeaders = {
197
197
  "Accept": "*/*",
198
198
  "X-API-Key": this.apiKey,
199
- "User-Agent": "Pairus-NodeJS-SDK/1.3.0",
199
+ "User-Agent": "Pairus-NodeJS-SDK/1.7.0",
200
200
  ...options.headers || {}
201
201
  };
202
202
  let lastError = null;
@@ -255,7 +255,7 @@ var BaseResource = class {
255
255
  const reqHeaders = {
256
256
  "Accept": "*/*",
257
257
  "X-API-Key": this.apiKey,
258
- "User-Agent": "Pairus-NodeJS-SDK/1.3.0",
258
+ "User-Agent": "Pairus-NodeJS-SDK/1.7.0",
259
259
  ...options.headers || {}
260
260
  };
261
261
  let lastError = null;
@@ -477,6 +477,33 @@ var EmissaoResource = class extends BaseResource {
477
477
  };
478
478
 
479
479
  // src/resources/fiscal.ts
480
+ function comNomesLegados(dados) {
481
+ const is = dados.is ?? dados.imposto_seletivo;
482
+ const impostoSeletivo = is ? { ...is, CSTIS: is.CSTIS ?? is.cst, cst: is.cst ?? is.CSTIS, pIS: is.pIS ?? is.aliquota, aliquota: is.aliquota ?? is.pIS } : void 0;
483
+ return {
484
+ ...dados,
485
+ cfop_interno: dados.cfop_interno ?? dados.cfop,
486
+ cfop: dados.cfop ?? dados.cfop_interno,
487
+ cfop_devolucao_interno: dados.cfop_devolucao_interno ?? dados.cfop_devolucao,
488
+ cfop_devolucao: dados.cfop_devolucao ?? dados.cfop_devolucao_interno,
489
+ is: impostoSeletivo,
490
+ imposto_seletivo: impostoSeletivo,
491
+ aliquota_efetiva_unificada: dados.aliquota_efetiva_unificada ?? dados.ibscbs?.aliquota_efetiva_unificada ?? 0,
492
+ avisos_fiscais: dados.avisos_fiscais ?? dados.avisos ?? [],
493
+ avisos: dados.avisos ?? dados.avisos_fiscais ?? []
494
+ };
495
+ }
496
+ function itemDeSaneamento(item) {
497
+ const { NCM, CEST, xProd, id, ncm, cest, descricao, gtin, ...extras } = item;
498
+ const convertido = {
499
+ ...extras,
500
+ NCM: NCM ?? ncm,
501
+ CEST: CEST ?? cest,
502
+ xProd: xProd ?? descricao,
503
+ id: id ?? gtin
504
+ };
505
+ return Object.fromEntries(Object.entries(convertido).filter(([, v]) => v !== void 0 && v !== null));
506
+ }
480
507
  var FiscalResource = class extends BaseResource {
481
508
  /**
482
509
  * Executa a predição fiscal completa da Reforma Tributária (IBS/CBS/IS) e NF-e.
@@ -489,25 +516,34 @@ var FiscalResource = class extends BaseResource {
489
516
  finalidade: params.finalidade || "revenda",
490
517
  destinatario_contribuinte: params.destinatarioContribuinte ?? true
491
518
  };
519
+ if (params.aliquotaCreditoIcmsSn !== void 0) payload.aliquota_credito_icms_sn = params.aliquotaCreditoIcmsSn;
520
+ if (params.destinatarioSuframa !== void 0) payload.destinatario_suframa = params.destinatarioSuframa;
521
+ if (params.inscricaoSuframa) payload.inscricao_suframa = params.inscricaoSuframa;
492
522
  if (params.xProd) payload.xProd = params.xProd;
493
523
  if (params.gtin) payload.gtin = params.gtin;
494
524
  if (params.ncm) payload.ncm = params.ncm;
495
525
  if (params.cest) payload.cest = params.cest;
496
526
  if (params.itens) payload.itens = params.itens;
497
- return this.request({
527
+ const res = await this.request({
498
528
  method: "POST",
499
529
  path: "/v2/fiscal/predict",
500
530
  body: payload
501
531
  });
532
+ return {
533
+ ...res,
534
+ dados_tributarios: res.dados_tributarios ? comNomesLegados(res.dados_tributarios) : res.dados_tributarios,
535
+ resultados: res.resultados?.map((r) => ({ ...r, dados_tributarios: comNomesLegados(r.dados_tributarios) }))
536
+ };
502
537
  }
503
538
  /**
504
539
  * Audita e higieniza uma lista de produtos em lote perante as tabelas fiscais vigentes.
540
+ * Cada item precisa de `NCM` (aceita também `ncm`); `CEST`, `xProd` e `id` são opcionais.
505
541
  */
506
542
  async sanitize(itens) {
507
543
  return this.request({
508
544
  method: "POST",
509
545
  path: "/v2/fiscal/sanitize",
510
- body: { itens }
546
+ body: { itens: itens.map(itemDeSaneamento) }
511
547
  });
512
548
  }
513
549
  };
@@ -556,6 +592,85 @@ var NFSeResource = class extends BaseResource {
556
592
  };
557
593
 
558
594
  // src/resources/products.ts
595
+ function primeiro(...valores) {
596
+ return valores.find((v) => v !== void 0 && v !== null && v !== "");
597
+ }
598
+ function numero(valor) {
599
+ const n = valor === void 0 || valor === null || valor === "" ? NaN : Number(valor);
600
+ return Number.isFinite(n) ? n : void 0;
601
+ }
602
+ function produtoDaApi(data, gtinFallback = "") {
603
+ const prod = data?.produto || data || {};
604
+ const info = prod.infoAdicional || {};
605
+ return {
606
+ gtin: String(primeiro(prod.GTIN, prod.gtin, gtinFallback) ?? ""),
607
+ xProd: primeiro(prod.xProd, prod.descricao) || "Descri\xE7\xE3o Indispon\xEDvel",
608
+ ncm: primeiro(prod.NCM, prod.ncm),
609
+ cest: primeiro(prod.CEST, prod.cest),
610
+ marca: primeiro(prod.marca, info.xMarca),
611
+ fabricante: prod.fabricante,
612
+ categoria: primeiro(prod.categoria, info.xCategoria),
613
+ imagemUrl: primeiro(prod.imagem_url, prod.thumbnail, info.urlImagem),
614
+ pesoBruto: numero(primeiro(prod.peso_bruto, info.pesoBruto)),
615
+ pesoLiquido: numero(primeiro(prod.peso_liquido, info.pesoLiquido)),
616
+ quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1),
617
+ tpGTIN: prod.tpGTIN ?? void 0,
618
+ fonte: prod.fonte ?? void 0,
619
+ infoAdicional: prod.infoAdicional ?? void 0
620
+ };
621
+ }
622
+ function produtoEnriquecidoDaApi(data, gtinFallback = "") {
623
+ const prod = data?.produto || data || {};
624
+ const base = produtoDaApi(prod, gtinFallback);
625
+ const enriquecimento = prod.enriquecimentoIA || {};
626
+ const atributos = enriquecimento.atributos || {};
627
+ const temAtributos = Object.keys(atributos).length > 0;
628
+ return {
629
+ gtin: base.gtin,
630
+ xProd: base.xProd,
631
+ xProd_higienizado: enriquecimento.xProd_higienizado,
632
+ descricao_completa: primeiro(prod.descricao_completa, enriquecimento.descricao_seo),
633
+ ficha_tecnica: prod.ficha_tecnica ?? (temAtributos ? atributos : void 0),
634
+ palavras_chave: prod.palavras_chave,
635
+ ncm: base.ncm,
636
+ cest: base.cest,
637
+ marca: primeiro(prod.marca, atributos.marca, base.marca),
638
+ categoria: primeiro(prod.categoria, enriquecimento.categoria_comercial, base.categoria),
639
+ imagem_url: base.imagemUrl,
640
+ peso_bruto: base.pesoBruto,
641
+ peso_liquido: primeiro(numero(prod.peso_liquido), numero(atributos.peso_liquido), base.pesoLiquido),
642
+ dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos ?? prod.tributacaoIA ?? void 0,
643
+ tpGTIN: base.tpGTIN,
644
+ fonte: base.fonte,
645
+ infoAdicional: base.infoAdicional,
646
+ enriquecimentoIA: prod.enriquecimentoIA ?? void 0,
647
+ tributacaoIA: prod.tributacaoIA ?? void 0
648
+ };
649
+ }
650
+ function buscaDaApi(data, query) {
651
+ const itens = (data?.resultados || data?.produtos || []).map((item) => {
652
+ const prod = produtoEnriquecidoDaApi(item.produto || item);
653
+ return {
654
+ gtin: prod.gtin,
655
+ xProd: prod.xProd,
656
+ marca: prod.marca,
657
+ categoria: prod.categoria,
658
+ score: item.score !== void 0 && item.score !== null ? Number(item.score) : void 0,
659
+ justificativa: item.justificativa ?? void 0,
660
+ ncm: prod.ncm,
661
+ cest: prod.cest,
662
+ imagem_url: prod.imagem_url
663
+ };
664
+ });
665
+ return {
666
+ status: data?.status || "success",
667
+ provider: data?.provider || "PAIRUS",
668
+ total_encontrados: itens.length,
669
+ termo_buscado: data?.query || query,
670
+ motor_busca: data?.motor_busca,
671
+ produtos: itens
672
+ };
673
+ }
559
674
  var ProductsResource = class extends BaseResource {
560
675
  /**
561
676
  * Consulta dados oficiais de um produto por código de barras GTIN/EAN (V1).
@@ -563,24 +678,8 @@ var ProductsResource = class extends BaseResource {
563
678
  */
564
679
  async get(gtin) {
565
680
  const gtinLimpo = gtin.replace(/\D/g, "");
566
- const data = await this.request({
567
- method: "GET",
568
- path: `/v1/gtin/${gtinLimpo}`
569
- });
570
- const prod = data.produto || data;
571
- return {
572
- gtin: prod.GTIN || prod.gtin || gtinLimpo,
573
- xProd: prod.xProd || prod.descricao || "Descri\xE7\xE3o Indispon\xEDvel",
574
- ncm: prod.NCM || prod.ncm,
575
- cest: prod.CEST || prod.cest,
576
- marca: prod.marca,
577
- fabricante: prod.fabricante,
578
- categoria: prod.categoria,
579
- imagemUrl: prod.imagem_url || prod.thumbnail,
580
- pesoBruto: prod.peso_bruto ? Number(prod.peso_bruto) : void 0,
581
- pesoLiquido: prod.peso_liquido ? Number(prod.peso_liquido) : void 0,
582
- quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1)
583
- };
681
+ const data = await this.request({ method: "GET", path: `/v1/gtin/${gtinLimpo}` });
682
+ return produtoDaApi(data, gtinLimpo);
584
683
  }
585
684
  /**
586
685
  * Consulta dados enriquecidos por IA, com SEO e ficha técnica estruturada (V2).
@@ -588,54 +687,16 @@ var ProductsResource = class extends BaseResource {
588
687
  */
589
688
  async getEnriched(gtin) {
590
689
  const gtinLimpo = gtin.replace(/\D/g, "");
591
- const data = await this.request({
592
- method: "GET",
593
- path: `/v2/gtin/${gtinLimpo}`
594
- });
595
- const prod = data.produto || data;
596
- return {
597
- gtin: prod.GTIN || prod.gtin || gtinLimpo,
598
- xProd: prod.xProd || prod.descricao || "Descri\xE7\xE3o Indispon\xEDvel",
599
- descricao_completa: prod.descricao_completa,
600
- ficha_tecnica: prod.ficha_tecnica,
601
- palavras_chave: prod.palavras_chave,
602
- ncm: prod.NCM || prod.ncm,
603
- cest: prod.CEST || prod.cest,
604
- marca: prod.marca,
605
- categoria: prod.categoria,
606
- imagem_url: prod.imagem_url,
607
- peso_bruto: prod.peso_bruto ? Number(prod.peso_bruto) : void 0,
608
- peso_liquido: prod.peso_liquido ? Number(prod.peso_liquido) : void 0,
609
- dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos
610
- };
690
+ const data = await this.request({ method: "GET", path: `/v2/gtin/${gtinLimpo}` });
691
+ return produtoEnriquecidoDaApi(data, gtinLimpo);
611
692
  }
612
693
  /**
613
694
  * Executa busca semântica por intenção/linguagem natural (V2).
614
695
  * @param query Termo livre de busca (ex: 'refrigerante zero lata').
615
696
  */
616
697
  async search(query) {
617
- const data = await this.request({
618
- method: "GET",
619
- path: "/v2/gtin/search",
620
- params: { q: query }
621
- });
622
- const itens = (data.produtos || []).map((item) => ({
623
- gtin: String(item.GTIN || item.gtin),
624
- xProd: String(item.xProd || item.descricao),
625
- marca: item.marca,
626
- categoria: item.categoria,
627
- score: item.score !== void 0 ? Number(item.score) : void 0,
628
- ncm: item.NCM || item.ncm,
629
- cest: item.CEST || item.cest,
630
- imagem_url: item.imagem_url
631
- }));
632
- return {
633
- status: data.status || "success",
634
- provider: data.provider || "PAIRUS",
635
- total_encontrados: itens.length,
636
- termo_buscado: query,
637
- produtos: itens
638
- };
698
+ const data = await this.request({ method: "GET", path: "/v2/gtin/search", params: { q: query } });
699
+ return buscaDaApi(data, query);
639
700
  }
640
701
  /**
641
702
  * Reconhece código de barras por visão computacional a partir de foto JPEG (OCR V2).
@@ -654,27 +715,8 @@ var ProductsResource = class extends BaseResource {
654
715
  formData.append("file", blob, "barcode.jpg");
655
716
  }
656
717
  }
657
- const data = await this.request({
658
- method: "POST",
659
- path: "/v2/gtin/scan",
660
- body: formData
661
- });
662
- const prod = data.produto || data;
663
- return {
664
- gtin: prod.GTIN || prod.gtin || "",
665
- xProd: prod.xProd || prod.descricao || "Descri\xE7\xE3o Indispon\xEDvel",
666
- descricao_completa: prod.descricao_completa,
667
- ficha_tecnica: prod.ficha_tecnica,
668
- palavras_chave: prod.palavras_chave,
669
- ncm: prod.NCM || prod.ncm,
670
- cest: prod.CEST || prod.cest,
671
- marca: prod.marca,
672
- categoria: prod.categoria,
673
- imagem_url: prod.imagem_url,
674
- peso_bruto: prod.peso_bruto ? Number(prod.peso_bruto) : void 0,
675
- peso_liquido: prod.peso_liquido ? Number(prod.peso_liquido) : void 0,
676
- dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos
677
- };
718
+ const data = await this.request({ method: "POST", path: "/v2/gtin/scan", body: formData });
719
+ return produtoEnriquecidoDaApi(data);
678
720
  }
679
721
  };
680
722