@pairus/product-data 1.5.0 → 1.6.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
 
@@ -289,6 +301,12 @@ declare class EmissaoResource extends BaseResource {
289
301
  inutilizar(params: InutilizacaoInput): Promise<EventoNFeResponse>;
290
302
  }
291
303
 
304
+ /**
305
+ * Tipos da predição fiscal (/v2/fiscal/predict) e do saneamento em lote (/v2/fiscal/sanitize).
306
+ *
307
+ * Espelham o contrato da API. Os nomes usados até a 1.5 (`cfop`, `avisos`, `imposto_seletivo` e
308
+ * `aliquota_efetiva_unificada` na raiz) continuam preenchidos pelo SDK a partir dos oficiais.
309
+ */
292
310
  interface IBSCBSData {
293
311
  cst: string;
294
312
  cClassTrib: string;
@@ -296,16 +314,29 @@ interface IBSCBSData {
296
314
  cbs_diferimento: number;
297
315
  cbs_reducao_aliquota: number;
298
316
  cbs_aliquota_efetiva: number;
317
+ aliquota_cbs_estimada?: number;
299
318
  ibs_aliquota_estadual: number;
300
319
  ibs_aliquota_municipal: number;
301
320
  ibs_diferimento: number;
302
321
  ibs_reducao_aliquota: number;
322
+ ibs_reducao_aliquota_estadual?: number;
323
+ ibs_reducao_aliquota_municipal?: number;
303
324
  ibs_aliquota_efetiva: number;
325
+ aliquota_ibs_estimada?: number;
326
+ aliquota_efetiva_unificada?: number;
327
+ vTotDFe_obrigatorio?: boolean;
304
328
  }
329
+ /** Imposto Seletivo: chega na chave `is` de `dados_tributarios`. */
305
330
  interface SelectiveTaxData {
306
- cst: string;
307
- cClassTribIS: string;
308
- aliquota: number;
331
+ incidencia?: boolean;
332
+ CSTIS?: string | null;
333
+ cClassTribIS?: string | null;
334
+ pIS?: number;
335
+ nota?: string | null;
336
+ /** @deprecated Use `CSTIS`. */
337
+ cst?: string | null;
338
+ /** @deprecated Use `pIS`. */
339
+ aliquota?: number;
309
340
  }
310
341
  interface FuelData {
311
342
  codigo_anp: string;
@@ -317,30 +348,55 @@ interface FuelData {
317
348
  }
318
349
  interface TaxPredictionData {
319
350
  ncm_sugerido: string;
320
- cest_sugerido?: string;
321
- cfop: string;
322
- cfop_devolucao?: string;
351
+ cest_sugerido?: string | null;
352
+ origem_mercadoria?: string;
353
+ origem_mercadoria_descricao?: string;
354
+ cfop_interno?: string;
355
+ cfop_externo?: string;
356
+ cfop_devolucao_interno?: string | null;
357
+ cfop_devolucao_externo?: string | null;
323
358
  icms_cst_csosn: string;
324
359
  icms_aliquota: number;
325
- icms_aliquota_st: number;
326
- icms_mva_st: number;
327
360
  icms_reducao_bc: number;
361
+ icms_sujeito_st?: boolean;
362
+ icms_mva_st: number;
363
+ icms_aliquota_st: number;
328
364
  icms_reducao_bc_st: number;
329
- icms_modalidade_bc: string;
330
- icms_modalidade_bc_st: string;
365
+ icms_modalidade_bc?: string | null;
366
+ icms_modalidade_bc_st?: string | null;
367
+ icms_credito_aliquota_sn?: number;
368
+ dados_desoneracao_suframa?: Record<string, any> | null;
331
369
  pis_cst: string;
332
370
  pis_aliquota: number;
333
371
  cofins_cst: string;
334
372
  cofins_aliquota: number;
335
- ipi_cst?: string;
373
+ ipi_cst?: string | null;
336
374
  ipi_aliquota?: number;
375
+ extipi?: string | null;
376
+ reforma_tributaria_nota?: string;
337
377
  ibscbs: IBSCBSData;
378
+ /** Imposto Seletivo (nome oficial da chave na API). */
379
+ is?: SelectiveTaxData;
380
+ combustivel_sujeito_anp?: boolean;
381
+ dados_combustivel?: FuelData | null;
382
+ diagnostico_anti_rejeicao?: Array<Record<string, string>>;
383
+ otimizacao_tributaria?: Record<string, any> | null;
384
+ difal?: Record<string, any> | null;
385
+ motor_ia: string;
386
+ avisos_fiscais?: string[];
387
+ disclaimer?: string;
388
+ /** @deprecated Use `cfop_interno` ou `cfop_externo` conforme a UF de destino (preenchido com `cfop_interno`). */
389
+ cfop?: string;
390
+ /** @deprecated Use `cfop_devolucao_interno` / `cfop_devolucao_externo`. */
391
+ cfop_devolucao?: string | null;
392
+ /** @deprecated Use `is`. */
338
393
  imposto_seletivo?: SelectiveTaxData;
339
- dados_combustivel?: FuelData;
394
+ /** @deprecated Use `ibscbs.aliquota_efetiva_unificada`. */
395
+ aliquota_efetiva_unificada?: number;
396
+ /** @deprecated Use `avisos_fiscais`. */
397
+ avisos?: string[];
398
+ /** @deprecated Não é devolvido pela API. */
340
399
  beneficio_fiscal?: string;
341
- aliquota_efetiva_unificada: number;
342
- motor_ia: string;
343
- avisos: string[];
344
400
  }
345
401
  interface TaxPredictionItemInput {
346
402
  xProd?: string;
@@ -354,6 +410,10 @@ interface TaxPredictionParams {
354
410
  ufDestino?: string;
355
411
  finalidade?: 'revenda' | 'consumo_final' | 'industrializacao' | string;
356
412
  destinatarioContribuinte?: boolean;
413
+ /** Alíquota de crédito de ICMS do Simples Nacional (pCredSN). */
414
+ aliquotaCreditoIcmsSn?: number;
415
+ destinatarioSuframa?: boolean;
416
+ inscricaoSuframa?: string;
357
417
  xProd?: string;
358
418
  gtin?: string;
359
419
  ncm?: string;
@@ -362,38 +422,49 @@ interface TaxPredictionParams {
362
422
  }
363
423
  interface TaxPredictionItemResult {
364
424
  item_index: number;
365
- xProd?: string;
425
+ xProd?: string | null;
366
426
  dados_tributarios: TaxPredictionData;
367
427
  }
368
428
  interface TaxPredictionResponse {
369
429
  status: string;
370
430
  provider: string;
371
- xProd?: string;
372
- dados_tributarios?: TaxPredictionData;
373
- resultados?: TaxPredictionItemResult[];
431
+ timestamp?: string;
432
+ motor_ia?: string | null;
433
+ xProd?: string | null;
434
+ dados_tributarios?: TaxPredictionData | null;
435
+ resultados?: TaxPredictionItemResult[] | null;
374
436
  }
437
+ /**
438
+ * Item do saneamento. A API exige `NCM`/`CEST` em maiúsculas; os nomes `ncm`, `cest`,
439
+ * `descricao` e `gtin` da 1.5 continuam aceitos e são convertidos pelo SDK.
440
+ */
375
441
  interface FiscalSanitizeItemInput {
376
- ncm: string;
442
+ NCM?: string;
443
+ CEST?: string;
444
+ xProd?: string;
445
+ id?: string;
446
+ /** @deprecated Use `NCM`. */
447
+ ncm?: string;
448
+ /** @deprecated Use `CEST`. */
377
449
  cest?: string;
450
+ /** @deprecated Use `xProd`. */
378
451
  descricao?: string;
452
+ /** @deprecated Use `id`. */
379
453
  gtin?: string;
380
454
  }
381
455
  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[];
456
+ id?: string;
457
+ xProd?: string;
458
+ NCM_informado?: string;
459
+ CEST_informado?: string | null;
460
+ auditoria_fiscal: Record<string, any>;
390
461
  }
391
462
  interface FiscalSanitizeResponse {
392
463
  status: string;
393
464
  provider: string;
394
465
  timestamp?: string;
395
466
  total_itens: number;
396
- itens: Array<Record<string, any>>;
467
+ itens: FiscalSanitizeItemResult[];
397
468
  }
398
469
 
399
470
  declare class FiscalResource extends BaseResource {
@@ -403,8 +474,9 @@ declare class FiscalResource extends BaseResource {
403
474
  predict(params: TaxPredictionParams): Promise<TaxPredictionResponse>;
404
475
  /**
405
476
  * Audita e higieniza uma lista de produtos em lote perante as tabelas fiscais vigentes.
477
+ * Cada item precisa de `NCM` (aceita também `ncm`); `CEST`, `xProd` e `id` são opcionais.
406
478
  */
407
- sanitize(itens: Array<Record<string, any>>): Promise<any>;
479
+ sanitize(itens: FiscalSanitizeItemInput[]): Promise<FiscalSanitizeResponse>;
408
480
  }
409
481
 
410
482
  interface EnderecoNFSeInput {
@@ -450,6 +522,14 @@ interface RetencoesFederaisInput {
450
522
  aliquota_inss?: number;
451
523
  valor_inss?: number;
452
524
  }
525
+ /** Campos da Reforma Tributária (IBS e CBS) sobre serviços (LC 214/2025). */
526
+ interface ReformaTributariaServicoInput {
527
+ cst_ibs_cbs?: string;
528
+ cClassTrib?: string;
529
+ aliquota_ibs_estadual?: number;
530
+ aliquota_ibs_municipal?: number;
531
+ aliquota_cbs?: number;
532
+ }
453
533
  interface ServicoNFSeInput {
454
534
  item_lista_servico: string;
455
535
  discriminacao: string;
@@ -462,8 +542,10 @@ interface ServicoNFSeInput {
462
542
  valor_desconto_condicionado?: number;
463
543
  iss_retido?: boolean;
464
544
  aliquota_iss?: number;
545
+ /** '1' Exigível, '2' Não incidência, '3' Isenção, '4' Exportação, '5' Imunidade, '6'/'7' Suspensa. */
465
546
  exigibilidade_iss?: string;
466
547
  retencoes_federais?: RetencoesFederaisInput;
548
+ reforma_tributaria?: ReformaTributariaServicoInput;
467
549
  }
468
550
  interface NFSeEmissaoInput {
469
551
  prestador: PrestadorNFSeInput | Record<string, any>;
@@ -486,6 +568,8 @@ interface NFSeEmissaoResponse {
486
568
  data_emissao?: string;
487
569
  link_visualizacao?: string;
488
570
  danfse_pdf_base64?: string;
571
+ /** Alias de danfse_pdf_base64 devolvido pela API. */
572
+ danfse_base64?: string;
489
573
  xml_nfse?: string;
490
574
  valor_servicos: number;
491
575
  valor_iss: number;
@@ -494,7 +578,13 @@ interface NFSeEmissaoResponse {
494
578
  valor_liquido: number;
495
579
  erros?: string[];
496
580
  alertas?: string[];
497
- trilha_auditoria?: Record<string, any>[];
581
+ trilha_auditoria?: Array<{
582
+ autor: string;
583
+ acao: string;
584
+ justificativa_legal: string;
585
+ campos_alterados?: Record<string, any>;
586
+ timestamp: string;
587
+ }>;
498
588
  creditos_cobrados: number;
499
589
  tempo_processamento_ms: number;
500
590
  }
@@ -504,6 +594,7 @@ interface CancelamentoNFSeInput {
504
594
  inscricao_municipal: string;
505
595
  codigo_municipio_ibge: string;
506
596
  justificativa: string;
597
+ /** '1' Erro de emissão, '2' Serviço não prestado, '3' Duplicidade, '9' Outros. */
507
598
  motivo_codigo?: string;
508
599
  codigo_verificacao?: string;
509
600
  chave_acesso_nacional?: string;
@@ -535,6 +626,11 @@ declare class NFSeResource extends BaseResource {
535
626
  consultar(chaveOuNumero: string): Promise<Record<string, any>>;
536
627
  }
537
628
 
629
+ /**
630
+ * Tipos de produto do SDK. A API devolve o produto no layout da NF-e (`GTIN`, `NCM`, `CEST`) com
631
+ * marca, categoria, imagem e pesos em `infoAdicional` e a IA em `enriquecimentoIA`/`tributacaoIA`;
632
+ * o `ProductsResource` converte esse contrato para os tipos abaixo.
633
+ */
538
634
  interface ProductDetails {
539
635
  gtin: string;
540
636
  xProd: string;
@@ -549,10 +645,16 @@ interface ProductDetails {
549
645
  quantidadeEmbalagem?: number;
550
646
  dataCadastro?: string;
551
647
  dataAtualizacao?: string;
648
+ tpGTIN?: string;
649
+ fonte?: string;
650
+ /** Bloco `infoAdicional` original da API. */
651
+ infoAdicional?: Record<string, any>;
552
652
  }
553
653
  interface ProductResponse {
554
654
  status: string;
555
655
  provider: string;
656
+ cStat?: string;
657
+ xMotivo?: string;
556
658
  produto?: ProductDetails;
557
659
  raw_data?: Record<string, any>;
558
660
  }
@@ -562,6 +664,8 @@ interface ProductSearchResultItem {
562
664
  marca?: string;
563
665
  categoria?: string;
564
666
  score?: number;
667
+ /** Explicação da correspondência semântica. */
668
+ justificativa?: string;
565
669
  ncm?: string;
566
670
  cest?: string;
567
671
  imagem_url?: string;
@@ -571,12 +675,17 @@ interface ProductSearchResponse {
571
675
  provider: string;
572
676
  total_encontrados: number;
573
677
  termo_buscado: string;
678
+ motor_busca?: string;
574
679
  produtos: ProductSearchResultItem[];
575
680
  }
576
681
  interface ProductEnrichedDetails {
577
682
  gtin: string;
578
683
  xProd: string;
684
+ /** Nome saneado pela IA. */
685
+ xProd_higienizado?: string;
686
+ /** Descrição otimizada para SEO (`enriquecimentoIA.descricao_seo`). */
579
687
  descricao_completa?: string;
688
+ /** Atributos técnicos extraídos pela IA (`enriquecimentoIA.atributos`). */
580
689
  ficha_tecnica?: Record<string, any>;
581
690
  palavras_chave?: string[];
582
691
  ncm?: string;
@@ -586,7 +695,13 @@ interface ProductEnrichedDetails {
586
695
  imagem_url?: string;
587
696
  peso_bruto?: number;
588
697
  peso_liquido?: number;
698
+ /** Nó `tributacaoIA` da API. */
589
699
  dados_tributarios_sugeridos?: Record<string, any>;
700
+ tpGTIN?: string;
701
+ fonte?: string;
702
+ infoAdicional?: Record<string, any>;
703
+ enriquecimentoIA?: Record<string, any>;
704
+ tributacaoIA?: Record<string, any>;
590
705
  }
591
706
 
592
707
  declare class ProductsResource extends BaseResource {
@@ -672,4 +787,4 @@ declare class NetworkError extends PairusError {
672
787
  constructor(message: string);
673
788
  }
674
789
 
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 };
790
+ 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.6.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.6.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.6.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