@orbe-agro/client-core 5.6.118 → 5.6.119

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.
Files changed (80) hide show
  1. package/dist/@types/base/@types/filters/index.d.ts +60 -0
  2. package/dist/@types/base/@types/filters/index.d.ts.map +1 -0
  3. package/dist/@types/base/@types/index.d.ts +1 -0
  4. package/dist/@types/base/@types/index.d.ts.map +1 -1
  5. package/dist/@types/base/components/filters/DynamicFilterField.d.ts +23 -0
  6. package/dist/@types/base/components/filters/DynamicFilterField.d.ts.map +1 -0
  7. package/dist/@types/base/components/filters/DynamicFilterPanel.d.ts +30 -0
  8. package/dist/@types/base/components/filters/DynamicFilterPanel.d.ts.map +1 -0
  9. package/dist/@types/base/components/filters/index.d.ts +3 -0
  10. package/dist/@types/base/components/filters/index.d.ts.map +1 -0
  11. package/dist/@types/base/components/index.d.ts +1 -0
  12. package/dist/@types/base/components/index.d.ts.map +1 -1
  13. package/dist/@types/base/configs/endpoints.config/centralNfe/centralNfe.d.ts +4 -0
  14. package/dist/@types/base/configs/endpoints.config/centralNfe/centralNfe.d.ts.map +1 -1
  15. package/dist/@types/base/configs/endpoints.config/centralNfe/config/nfe.d.ts +4 -0
  16. package/dist/@types/base/configs/endpoints.config/centralNfe/config/nfe.d.ts.map +1 -1
  17. package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts +5 -0
  18. package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts.map +1 -1
  19. package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts +1 -0
  20. package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts.map +1 -1
  21. package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts +1 -0
  22. package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts.map +1 -1
  23. package/dist/@types/base/hooks/filters/useFilterMetadata.d.ts +26 -0
  24. package/dist/@types/base/hooks/filters/useFilterMetadata.d.ts.map +1 -0
  25. package/dist/@types/base/hooks/index.d.ts +1 -0
  26. package/dist/@types/base/hooks/index.d.ts.map +1 -1
  27. package/dist/@types/base/services/modules/centralNfe/nfe/NfeService.d.ts +1 -0
  28. package/dist/@types/base/services/modules/centralNfe/nfe/NfeService.d.ts.map +1 -1
  29. package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts +2 -0
  30. package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts.map +1 -1
  31. package/dist/@types/base/utils/filters/groupFilterFields.d.ts +15 -0
  32. package/dist/@types/base/utils/filters/groupFilterFields.d.ts.map +1 -0
  33. package/dist/@types/base/utils/index.d.ts +1 -0
  34. package/dist/@types/base/utils/index.d.ts.map +1 -1
  35. package/dist/base/@types/filters/index.js +2 -0
  36. package/dist/base/@types/filters/index.js.map +1 -0
  37. package/dist/base/@types/index.js +1 -0
  38. package/dist/base/@types/index.js.map +1 -1
  39. package/dist/base/components/filters/DynamicFilterField.js +156 -0
  40. package/dist/base/components/filters/DynamicFilterField.js.map +1 -0
  41. package/dist/base/components/filters/DynamicFilterPanel.js +19 -0
  42. package/dist/base/components/filters/DynamicFilterPanel.js.map +1 -0
  43. package/dist/base/components/filters/index.js +7 -0
  44. package/dist/base/components/filters/index.js.map +1 -0
  45. package/dist/base/components/index.js +11 -6
  46. package/dist/base/components/index.js.map +1 -1
  47. package/dist/base/configs/endpoints.config/centralNfe/config/nfe.js +1 -0
  48. package/dist/base/configs/endpoints.config/centralNfe/config/nfe.js.map +1 -1
  49. package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js +2 -1
  50. package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js.map +1 -1
  51. package/dist/base/hooks/filters/useFilterMetadata.js +23 -0
  52. package/dist/base/hooks/filters/useFilterMetadata.js.map +1 -0
  53. package/dist/base/hooks/index.js +2 -0
  54. package/dist/base/hooks/index.js.map +1 -1
  55. package/dist/base/index.js +230 -222
  56. package/dist/base/index.js.map +1 -1
  57. package/dist/base/services/modules/centralNfe/index.js +2 -1
  58. package/dist/base/services/modules/centralNfe/nfe/NfeService.js +7 -0
  59. package/dist/base/services/modules/centralNfe/nfe/NfeService.js.map +1 -1
  60. package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js +7 -0
  61. package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js.map +1 -1
  62. package/dist/base/utils/filters/groupFilterFields.js +56 -0
  63. package/dist/base/utils/filters/groupFilterFields.js.map +1 -0
  64. package/dist/base/utils/index.js +2 -0
  65. package/dist/base/utils/index.js.map +1 -1
  66. package/lib/base/@types/filters/index.ts +87 -0
  67. package/lib/base/@types/index.ts +1 -0
  68. package/lib/base/components/filters/DynamicFilterField.tsx +213 -0
  69. package/lib/base/components/filters/DynamicFilterPanel.tsx +50 -0
  70. package/lib/base/components/filters/index.ts +2 -0
  71. package/lib/base/components/index.ts +4 -1
  72. package/lib/base/configs/endpoints.config/centralNfe/config/nfe.ts +1 -0
  73. package/lib/base/configs/endpoints.config/originacao/config/saldoTicket.ts +2 -1
  74. package/lib/base/hooks/filters/useFilterMetadata.ts +43 -0
  75. package/lib/base/hooks/index.ts +2 -1
  76. package/lib/base/services/modules/centralNfe/nfe/NfeService.ts +8 -0
  77. package/lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts +8 -0
  78. package/lib/base/utils/filters/groupFilterFields.ts +93 -0
  79. package/lib/base/utils/index.ts +1 -0
  80. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NfeService.js","sources":["../../../../../../lib/base/services/modules/centralNfe/nfe/NfeService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport endpointConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\n\nconst NFE_ENDPOINT = endpointConfig.centralNfe.nfe;\n\nexport async function apiFindMonitorNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.findMonitor.endpoint,\n method: NFE_ENDPOINT.findMonitor.httpMethod,\n data: body,\n })\n}\n\nexport async function apiCountNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.count.endpoint,\n method: NFE_ENDPOINT.count.httpMethod,\n data: body,\n })\n}\n\nexport async function apiFindOneNfe(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.findOne.endpoint}/${id}`,\n method: NFE_ENDPOINT.findOne.httpMethod\n })\n}\n\nexport async function apiUpdateNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.update.endpoint,\n method: NFE_ENDPOINT.update.httpMethod,\n data: body,\n })\n}\n\nexport async function downloadPdfByChaveAcesso(chaveAcesso: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.downloadPdfByChaveAcesso.endpoint}/${chaveAcesso}`,\n method: NFE_ENDPOINT.downloadPdfByChaveAcesso.httpMethod\n })\n}\n\nexport async function buscaValidacaoImposto(id: number, numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.validacaoImposto.endpoint\n .replace('{id}', id.toString())\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.validacaoImposto.httpMethod\n })\n}\n\nexport async function addLancamentoManual(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.addLancamentoManual.endpoint,\n method: NFE_ENDPOINT.addLancamentoManual.httpMethod,\n data: body\n })\n}\n\nexport async function apiDesvincularOrdemCompra(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.desvincularOrdemCompra.endpoint,\n method: NFE_ENDPOINT.desvincularOrdemCompra.httpMethod,\n data: body\n })\n}\n\nexport async function apiEstornarPedidoCompra(numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarPedidoCompra.endpoint\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiEstornarOperacao(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarOperacao.endpoint\n .replace('{id}', id.toString()),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiSetNfeLock(idNfe: number, lock: boolean) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.lock.endpoint,\n method: NFE_ENDPOINT.lock.httpMethod,\n params: {\n idNfe,\n lock\n }\n })\n}"],"names":["endpointConfig"],"mappings":";;AAGA,MAAM,eAAeA,yBAAe,WAAW;AAE/C,eAAsB,kBAAkB,MAAM;AAC1C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,YAAY;AAAA,IAC9B,QAAQ,aAAa,YAAY;AAAA,IACjC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,YAAY,MAAM;AACpC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,MAAM;AAAA,IACxB,QAAQ,aAAa,MAAM;AAAA,IAC3B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,cAAc,IAAY;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,QAAQ,QAAQ,IAAI,EAAE;AAAA,IAC3C,QAAQ,aAAa,QAAQ;AAAA,EAAA,CAChC;AACL;AAEA,eAAsB,aAAa,MAAM;AACrC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,OAAO;AAAA,IACzB,QAAQ,aAAa,OAAO;AAAA,IAC5B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,yBAAyB,aAAqB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,yBAAyB,QAAQ,IAAI,WAAW;AAAA,IACrE,QAAQ,aAAa,yBAAyB;AAAA,EAAA,CACjD;AACL;AAEA,eAAsB,sBAAsB,IAAY,cAAsB;AAC1E,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,SAAA,CAAU,EAC7B,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,iBAAiB;AAAA,EAAA,CACzC;AACL;AAEA,eAAsB,oBAAoB,MAAM;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,oBAAoB;AAAA,IACtC,QAAQ,aAAa,oBAAoB;AAAA,IACzC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,0BAA0B,MAAM;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,uBAAuB;AAAA,IACzC,QAAQ,aAAa,uBAAuB;AAAA,IAC5C,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,wBAAwB,cAAsB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,qBAAqB,SAClC,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,oBAAoB,IAAY;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,UAAU;AAAA,IAClC,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,cAAc,OAAe,MAAe;AAC9D,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,KAAK;AAAA,IACvB,QAAQ,aAAa,KAAK;AAAA,IAC1B,QAAQ;AAAA,MACJ;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,CACH;AACL;"}
1
+ {"version":3,"file":"NfeService.js","sources":["../../../../../../lib/base/services/modules/centralNfe/nfe/NfeService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport endpointConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\n\nconst NFE_ENDPOINT = endpointConfig.centralNfe.nfe;\n\nexport async function apiFindMonitorNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.findMonitor.endpoint,\n method: NFE_ENDPOINT.findMonitor.httpMethod,\n data: body,\n })\n}\n\nexport async function apiCountNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.count.endpoint,\n method: NFE_ENDPOINT.count.httpMethod,\n data: body,\n })\n}\n\nexport async function apiFindOneNfe(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.findOne.endpoint}/${id}`,\n method: NFE_ENDPOINT.findOne.httpMethod\n })\n}\n\nexport async function apiUpdateNfe(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.update.endpoint,\n method: NFE_ENDPOINT.update.httpMethod,\n data: body,\n })\n}\n\nexport async function downloadPdfByChaveAcesso(chaveAcesso: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: `${NFE_ENDPOINT.downloadPdfByChaveAcesso.endpoint}/${chaveAcesso}`,\n method: NFE_ENDPOINT.downloadPdfByChaveAcesso.httpMethod\n })\n}\n\nexport async function buscaValidacaoImposto(id: number, numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.validacaoImposto.endpoint\n .replace('{id}', id.toString())\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.validacaoImposto.httpMethod\n })\n}\n\nexport async function addLancamentoManual(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.addLancamentoManual.endpoint,\n method: NFE_ENDPOINT.addLancamentoManual.httpMethod,\n data: body\n })\n}\n\nexport async function apiDesvincularOrdemCompra(body) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.desvincularOrdemCompra.endpoint,\n method: NFE_ENDPOINT.desvincularOrdemCompra.httpMethod,\n data: body\n })\n}\n\nexport async function apiEstornarPedidoCompra(numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarPedidoCompra.endpoint\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiEstornarOperacao(id: number) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.estornarOperacao.endpoint\n .replace('{id}', id.toString()),\n method: NFE_ENDPOINT.estornarPedidoCompra.httpMethod\n })\n}\n\nexport async function apiFinalizarPedido(numeroPedido: string) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.finalizarPedido.endpoint\n .replace('{numeroPedido}', numeroPedido),\n method: NFE_ENDPOINT.finalizarPedido.httpMethod\n })\n}\n\nexport async function apiSetNfeLock(idNfe: number, lock: boolean) {\n return ApiService.fetchDataWithAxios<any>({\n url: NFE_ENDPOINT.lock.endpoint,\n method: NFE_ENDPOINT.lock.httpMethod,\n params: {\n idNfe,\n lock\n }\n })\n}"],"names":["endpointConfig"],"mappings":";;AAGA,MAAM,eAAeA,yBAAe,WAAW;AAE/C,eAAsB,kBAAkB,MAAM;AAC1C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,YAAY;AAAA,IAC9B,QAAQ,aAAa,YAAY;AAAA,IACjC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,YAAY,MAAM;AACpC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,MAAM;AAAA,IACxB,QAAQ,aAAa,MAAM;AAAA,IAC3B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,cAAc,IAAY;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,QAAQ,QAAQ,IAAI,EAAE;AAAA,IAC3C,QAAQ,aAAa,QAAQ;AAAA,EAAA,CAChC;AACL;AAEA,eAAsB,aAAa,MAAM;AACrC,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,OAAO;AAAA,IACzB,QAAQ,aAAa,OAAO;AAAA,IAC5B,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,yBAAyB,aAAqB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,GAAG,aAAa,yBAAyB,QAAQ,IAAI,WAAW;AAAA,IACrE,QAAQ,aAAa,yBAAyB;AAAA,EAAA,CACjD;AACL;AAEA,eAAsB,sBAAsB,IAAY,cAAsB;AAC1E,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,SAAA,CAAU,EAC7B,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,iBAAiB;AAAA,EAAA,CACzC;AACL;AAEA,eAAsB,oBAAoB,MAAM;AAC5C,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,oBAAoB;AAAA,IACtC,QAAQ,aAAa,oBAAoB;AAAA,IACzC,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,0BAA0B,MAAM;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,uBAAuB;AAAA,IACzC,QAAQ,aAAa,uBAAuB;AAAA,IAC5C,MAAM;AAAA,EAAA,CACT;AACL;AAEA,eAAsB,wBAAwB,cAAsB;AAChE,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,qBAAqB,SAClC,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,oBAAoB,IAAY;AAClD,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,iBAAiB,SAC9B,QAAQ,QAAQ,GAAG,UAAU;AAAA,IAClC,QAAQ,aAAa,qBAAqB;AAAA,EAAA,CAC7C;AACL;AAEA,eAAsB,mBAAmB,cAAsB;AAC3D,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,gBAAgB,SAC7B,QAAQ,kBAAkB,YAAY;AAAA,IAC3C,QAAQ,aAAa,gBAAgB;AAAA,EAAA,CACxC;AACL;AAEA,eAAsB,cAAc,OAAe,MAAe;AAC9D,SAAO,WAAW,mBAAwB;AAAA,IACtC,KAAK,aAAa,KAAK;AAAA,IACvB,QAAQ,aAAa,KAAK;AAAA,IAC1B,QAAQ;AAAA,MACJ;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,CACH;AACL;"}
@@ -43,11 +43,18 @@ async function apiUpdateStatusSaldoTicket(id, status, tipoSaldo, justificativa)
43
43
  }
44
44
  });
45
45
  }
46
+ async function apiFindSaldoFilterMetadata() {
47
+ return ApiService.fetchDataWithAxios({
48
+ url: SALDO_TICKET_ORIGINACAO_ENDPOINT.filterMetadata,
49
+ method: "get"
50
+ });
51
+ }
46
52
  export {
47
53
  apiBuscarSaldoContrato,
48
54
  apiBuscarSaldoDisponivel,
49
55
  apiFindAllSaldo,
50
56
  apiFindHistoricoByIdSaldo,
57
+ apiFindSaldoFilterMetadata,
51
58
  apiFindSaldoMetrics,
52
59
  apiUpdateStatusSaldoTicket
53
60
  };
@@ -1 +1 @@
1
- {"version":3,"file":"saldoTicketService.js","sources":["../../../../../../lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport { TSaldoContratoResponse } from \"@base/@types/api/response/originacao/TSaldoContratoResponse\";\nimport endpointNavigationConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\nimport { TQueryResponse } from \"@base/@types/api\";\nimport { TFindAllSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllSaldoResponse\";\nimport { TFindAllMetricsSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllMetricsSaldoResponse\";\nimport { TEntityHistoricoResponse } from \"@base/@types/api/response/originacao/TEntityHistoricoResponse\";\nimport { StatusSaldoTicket } from \"@base/@types/enums/originacao/StatusSaldoTicket\";\nimport { TipoSaldo } from \"@base/@types/enums/originacao/TipoSaldo\";\n\nconst SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;\n\nexport async function apiBuscarSaldoContrato(id: number | string) {\n return ApiService.fetchDataWithAxios<TSaldoContratoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoContrato(String(id)),\n method: \"get\",\n });\n}\n\nexport async function apiFindAllSaldo(params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TFindAllSaldoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAll(params),\n method: \"get\",\n });\n}\n\nexport async function apiFindHistoricoByIdSaldo(id: number | string, params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TEntityHistoricoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.historicoById(String(id), params),\n method: \"get\",\n });\n}\n\n\nexport async function apiBuscarSaldoDisponivel(data) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoDisponivel,\n method: \"post\",\n data\n });\n}\n\nexport async function apiFindSaldoMetrics(params?: string) {\n return ApiService.fetchDataWithAxios<TFindAllMetricsSaldoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAllMetrics(params),\n method: \"get\",\n });\n}\n\nexport async function apiUpdateStatusSaldoTicket(\n id: number | string,\n status: StatusSaldoTicket,\n tipoSaldo: TipoSaldo,\n justificativa: string\n) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.updateStatus(String(id)),\n method: \"patch\",\n data: {\n status,\n tipoSaldo,\n justificativa\n }\n });\n}"],"names":[],"mappings":";;AAUA,MAAM,mCAAmC,yBAAyB,WAAW;AAE7E,eAAsB,uBAAuB,IAAqB;AAChE,SAAO,WAAW,mBAA2C;AAAA,IAC3D,KAAK,iCAAiC,oBAAoB,OAAO,EAAE,CAAC;AAAA,IACpE,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,gBAAgB,QAAiB;AACrD,SAAO,WAAW,mBAA0D;AAAA,IAC1E,KAAK,iCAAiC,QAAQ,MAAM;AAAA,IACpD,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,0BAA0B,IAAqB,QAAiB;AACpF,SAAO,WAAW,mBAA6D;AAAA,IAC7E,KAAK,iCAAiC,cAAc,OAAO,EAAE,GAAG,MAAM;AAAA,IACtE,QAAQ;AAAA,EAAA,CACT;AACH;AAGA,eAAsB,yBAAyB,MAAM;AACnD,SAAO,WAAW,mBAAmB;AAAA,IACnC,KAAK,iCAAiC;AAAA,IACtC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,oBAAoB,QAAiB;AACzD,SAAO,WAAW,mBAAiD;AAAA,IACjE,KAAK,iCAAiC,eAAe,MAAM;AAAA,IAC3D,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,2BACpB,IACA,QACA,WACA,eACA;AACA,SAAO,WAAW,mBAAmB;AAAA,IACnC,KAAK,iCAAiC,aAAa,OAAO,EAAE,CAAC;AAAA,IAC7D,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CACD;AACH;"}
1
+ {"version":3,"file":"saldoTicketService.js","sources":["../../../../../../lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts"],"sourcesContent":["import ApiService from \"@/services/ApiService\";\nimport { TSaldoContratoResponse } from \"@base/@types/api/response/originacao/TSaldoContratoResponse\";\nimport endpointNavigationConfig from \"@base/configs/endpoints.config/endpoints.navigation\";\nimport { TQueryResponse } from \"@base/@types/api\";\nimport { TFindAllSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllSaldoResponse\";\nimport { TFindAllMetricsSaldoResponse } from \"@base/@types/api/response/originacao/TFindAllMetricsSaldoResponse\";\nimport { TEntityHistoricoResponse } from \"@base/@types/api/response/originacao/TEntityHistoricoResponse\";\nimport { StatusSaldoTicket } from \"@base/@types/enums/originacao/StatusSaldoTicket\";\nimport { TipoSaldo } from \"@base/@types/enums/originacao/TipoSaldo\";\nimport { IFilterFieldDescriptor } from \"@base/@types/filters\";\n\nconst SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;\n\nexport async function apiBuscarSaldoContrato(id: number | string) {\n return ApiService.fetchDataWithAxios<TSaldoContratoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoContrato(String(id)),\n method: \"get\",\n });\n}\n\nexport async function apiFindAllSaldo(params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TFindAllSaldoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAll(params),\n method: \"get\",\n });\n}\n\nexport async function apiFindHistoricoByIdSaldo(id: number | string, params?: string) {\n return ApiService.fetchDataWithAxios<TQueryResponse<TEntityHistoricoResponse>>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.historicoById(String(id), params),\n method: \"get\",\n });\n}\n\n\nexport async function apiBuscarSaldoDisponivel(data) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoDisponivel,\n method: \"post\",\n data\n });\n}\n\nexport async function apiFindSaldoMetrics(params?: string) {\n return ApiService.fetchDataWithAxios<TFindAllMetricsSaldoResponse>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.findAllMetrics(params),\n method: \"get\",\n });\n}\n\nexport async function apiUpdateStatusSaldoTicket(\n id: number | string,\n status: StatusSaldoTicket,\n tipoSaldo: TipoSaldo,\n justificativa: string\n) {\n return ApiService.fetchDataWithAxios({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.updateStatus(String(id)),\n method: \"patch\",\n data: {\n status,\n tipoSaldo,\n justificativa\n }\n });\n}\n\nexport async function apiFindSaldoFilterMetadata() {\n return ApiService.fetchDataWithAxios<IFilterFieldDescriptor[]>({\n url: SALDO_TICKET_ORIGINACAO_ENDPOINT.filterMetadata,\n method: \"get\",\n });\n}"],"names":[],"mappings":";;AAWA,MAAM,mCAAmC,yBAAyB,WAAW;AAE7E,eAAsB,uBAAuB,IAAqB;AAChE,SAAO,WAAW,mBAA2C;AAAA,IAC3D,KAAK,iCAAiC,oBAAoB,OAAO,EAAE,CAAC;AAAA,IACpE,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,gBAAgB,QAAiB;AACrD,SAAO,WAAW,mBAA0D;AAAA,IAC1E,KAAK,iCAAiC,QAAQ,MAAM;AAAA,IACpD,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,0BAA0B,IAAqB,QAAiB;AACpF,SAAO,WAAW,mBAA6D;AAAA,IAC7E,KAAK,iCAAiC,cAAc,OAAO,EAAE,GAAG,MAAM;AAAA,IACtE,QAAQ;AAAA,EAAA,CACT;AACH;AAGA,eAAsB,yBAAyB,MAAM;AACnD,SAAO,WAAW,mBAAmB;AAAA,IACnC,KAAK,iCAAiC;AAAA,IACtC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,oBAAoB,QAAiB;AACzD,SAAO,WAAW,mBAAiD;AAAA,IACjE,KAAK,iCAAiC,eAAe,MAAM;AAAA,IAC3D,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,eAAsB,2BACpB,IACA,QACA,WACA,eACA;AACA,SAAO,WAAW,mBAAmB;AAAA,IACnC,KAAK,iCAAiC,aAAa,OAAO,EAAE,CAAC;AAAA,IAC7D,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CACD;AACH;AAEA,eAAsB,6BAA6B;AACjD,SAAO,WAAW,mBAA6C;AAAA,IAC7D,KAAK,iCAAiC;AAAA,IACtC,QAAQ;AAAA,EAAA,CACT;AACH;"}
@@ -0,0 +1,56 @@
1
+ function groupFilterFields(fields) {
2
+ const rangeGroupMap = /* @__PURE__ */ new Map();
3
+ for (const field of fields) {
4
+ if (field.rangeGroup) {
5
+ if (!rangeGroupMap.has(field.rangeGroup)) {
6
+ rangeGroupMap.set(field.rangeGroup, []);
7
+ }
8
+ rangeGroupMap.get(field.rangeGroup).push(field);
9
+ }
10
+ }
11
+ const result = [];
12
+ const rangeGroupInserted = /* @__PURE__ */ new Set();
13
+ for (const field of fields) {
14
+ if (field.rangeGroup) {
15
+ if (!rangeGroupInserted.has(field.rangeGroup)) {
16
+ rangeGroupInserted.add(field.rangeGroup);
17
+ const groupFields = rangeGroupMap.get(field.rangeGroup);
18
+ if (groupFields.length < 2) {
19
+ result.push({ kind: "standalone", descriptor: groupFields[0] });
20
+ continue;
21
+ }
22
+ const sorted = [...groupFields].sort((a, b) => {
23
+ const aIsDe = /De$/i.test(a.field);
24
+ const bIsDe = /De$/i.test(b.field);
25
+ if (aIsDe && !bIsDe) return -1;
26
+ if (!aIsDe && bIsDe) return 1;
27
+ return a.field.localeCompare(b.field);
28
+ });
29
+ const rangeGroup = {
30
+ kind: "range",
31
+ rangeGroup: field.rangeGroup,
32
+ label: deriveRangeLabel(sorted),
33
+ startField: sorted[0],
34
+ endField: sorted[1]
35
+ };
36
+ result.push(rangeGroup);
37
+ }
38
+ } else {
39
+ const standalone = {
40
+ kind: "standalone",
41
+ descriptor: field
42
+ };
43
+ result.push(standalone);
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ function deriveRangeLabel(fields) {
49
+ if (fields.length === 0) return "";
50
+ const raw = fields[0].label;
51
+ return raw.replace(/\s+(De|Até|Ate)$/i, "").trim() || raw;
52
+ }
53
+ export {
54
+ groupFilterFields
55
+ };
56
+ //# sourceMappingURL=groupFilterFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupFilterFields.js","sources":["../../../../lib/base/utils/filters/groupFilterFields.ts"],"sourcesContent":["import type {\n IFilterFieldDescriptor,\n IFilterRangeGroup,\n TFilterRenderItem,\n IFilterStandaloneField,\n} from '@base/@types/filters'\n\n/**\n * Agrupa IFilterFieldDescriptors em itens renderizáveis.\n *\n * - Campos com o mesmo rangeGroup não-nulo são fundidos em um único IFilterRangeGroup.\n * - Todos os demais campos se tornam IFilterStandaloneField.\n * - A ordem da lista original é preservada: o grupo aparece na posição do seu primeiro campo.\n * - Se um rangeGroup tiver menos de 2 campos, cada um é tratado como standalone (fallback seguro).\n *\n * @example\n * // dataEnvioDe + dataEnvioAte (mesmo rangeGroup) → IFilterRangeGroup { startField, endField }\n * // id, operacao, businessPartnerId → IFilterStandaloneField[]\n */\nexport function groupFilterFields(fields: IFilterFieldDescriptor[]): TFilterRenderItem[] {\n // Primeiro passo: coletar todos os campos de cada rangeGroup\n const rangeGroupMap = new Map<string, IFilterFieldDescriptor[]>()\n for (const field of fields) {\n if (field.rangeGroup) {\n if (!rangeGroupMap.has(field.rangeGroup)) {\n rangeGroupMap.set(field.rangeGroup, [])\n }\n rangeGroupMap.get(field.rangeGroup)!.push(field)\n }\n }\n\n // Segundo passo: percorrer os campos mantendo a ordem, inserindo o grupo\n // na posição do seu primeiro membro\n const result: TFilterRenderItem[] = []\n const rangeGroupInserted = new Set<string>()\n\n for (const field of fields) {\n if (field.rangeGroup) {\n // Apenas insere o grupo uma vez (na posição do primeiro campo)\n if (!rangeGroupInserted.has(field.rangeGroup)) {\n rangeGroupInserted.add(field.rangeGroup)\n const groupFields = rangeGroupMap.get(field.rangeGroup)!\n\n // Fallback seguro: se o backend enviar apenas um campo do par, trata como standalone\n if (groupFields.length < 2) {\n result.push({ kind: 'standalone', descriptor: groupFields[0] })\n continue\n }\n\n // Garante que o campo \"De\" (início) vem antes de \"Ate\"/\"Até\" (fim).\n // Não pode usar localeCompare simples pois \"Ate\" < \"De\" alfabeticamente.\n const sorted = [...groupFields].sort((a, b) => {\n const aIsDe = /De$/i.test(a.field)\n const bIsDe = /De$/i.test(b.field)\n if (aIsDe && !bIsDe) return -1\n if (!aIsDe && bIsDe) return 1\n return a.field.localeCompare(b.field)\n })\n\n const rangeGroup: IFilterRangeGroup = {\n kind: 'range',\n rangeGroup: field.rangeGroup,\n label: deriveRangeLabel(sorted),\n startField: sorted[0],\n endField: sorted[1],\n }\n result.push(rangeGroup)\n }\n } else {\n const standalone: IFilterStandaloneField = {\n kind: 'standalone',\n descriptor: field,\n }\n result.push(standalone)\n }\n }\n\n return result\n}\n\n/**\n * Deriva um label legível para o grupo de range.\n * Remove sufixos \"De\", \"Até\" e \"Ate\" do label do primeiro campo.\n *\n * @example\n * // \"Data Envio De\" → \"Data Envio\"\n * // \"Data Envio Até\" → \"Data Envio\"\n */\nfunction deriveRangeLabel(fields: IFilterFieldDescriptor[]): string {\n if (fields.length === 0) return ''\n const raw = fields[0].label\n return raw.replace(/\\s+(De|Até|Ate)$/i, '').trim() || raw\n}\n"],"names":[],"mappings":"AAmBO,SAAS,kBAAkB,QAAuD;AAErF,QAAM,oCAAoB,IAAA;AAC1B,aAAW,SAAS,QAAQ;AACxB,QAAI,MAAM,YAAY;AAClB,UAAI,CAAC,cAAc,IAAI,MAAM,UAAU,GAAG;AACtC,sBAAc,IAAI,MAAM,YAAY,CAAA,CAAE;AAAA,MAC1C;AACA,oBAAc,IAAI,MAAM,UAAU,EAAG,KAAK,KAAK;AAAA,IACnD;AAAA,EACJ;AAIA,QAAM,SAA8B,CAAA;AACpC,QAAM,yCAAyB,IAAA;AAE/B,aAAW,SAAS,QAAQ;AACxB,QAAI,MAAM,YAAY;AAElB,UAAI,CAAC,mBAAmB,IAAI,MAAM,UAAU,GAAG;AAC3C,2BAAmB,IAAI,MAAM,UAAU;AACvC,cAAM,cAAc,cAAc,IAAI,MAAM,UAAU;AAGtD,YAAI,YAAY,SAAS,GAAG;AACxB,iBAAO,KAAK,EAAE,MAAM,cAAc,YAAY,YAAY,CAAC,GAAG;AAC9D;AAAA,QACJ;AAIA,cAAM,SAAS,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM;AAC3C,gBAAM,QAAQ,OAAO,KAAK,EAAE,KAAK;AACjC,gBAAM,QAAQ,OAAO,KAAK,EAAE,KAAK;AACjC,cAAI,SAAS,CAAC,MAAO,QAAO;AAC5B,cAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,iBAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,QACxC,CAAC;AAED,cAAM,aAAgC;AAAA,UAClC,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,OAAO,iBAAiB,MAAM;AAAA,UAC9B,YAAY,OAAO,CAAC;AAAA,UACpB,UAAU,OAAO,CAAC;AAAA,QAAA;AAEtB,eAAO,KAAK,UAAU;AAAA,MAC1B;AAAA,IACJ,OAAO;AACH,YAAM,aAAqC;AAAA,QACvC,MAAM;AAAA,QACN,YAAY;AAAA,MAAA;AAEhB,aAAO,KAAK,UAAU;AAAA,IAC1B;AAAA,EACJ;AAEA,SAAO;AACX;AAUA,SAAS,iBAAiB,QAA0C;AAChE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,MAAM,OAAO,CAAC,EAAE;AACtB,SAAO,IAAI,QAAQ,qBAAqB,EAAE,EAAE,UAAU;AAC1D;"}
@@ -1,7 +1,9 @@
1
1
  import { getLogoFilename } from "./logo.js";
2
2
  import { validateEmail } from "./validateEmail/validateEmail.js";
3
+ import { groupFilterFields } from "./filters/groupFilterFields.js";
3
4
  export {
4
5
  getLogoFilename,
6
+ groupFilterFields,
5
7
  validateEmail
6
8
  };
7
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,87 @@
1
+ // Tipos para o sistema de filtros dinâmicos guiados por metadados do backend.
2
+ // Este padrão é compartilhado entre todos os microfrontends que implementam
3
+ // o endpoint /filter-metadata.
4
+ //
5
+ // Convenção de nomenclatura seguida no projeto:
6
+ // I* → interfaces (objetos com estrutura definida)
7
+ // T* → type aliases (unions, primitivos, tipos genéricos)
8
+
9
+ export type TFilterDataType = 'NUMBER' | 'STRING' | 'DATE' | 'ENUM'
10
+
11
+ export type TFilterOperator = 'EQUALS' | 'BETWEEN' | 'LIKE' | 'IN'
12
+
13
+ export interface IFilterAllowedValue {
14
+ value: string
15
+ label: string
16
+ }
17
+
18
+ export interface IFilterLookup {
19
+ resource: string
20
+ }
21
+
22
+ /** Shape exata retornada pelo endpoint /filter-metadata do backend */
23
+ export interface IFilterFieldDescriptor {
24
+ field: string
25
+ label: string
26
+ dataType: TFilterDataType
27
+ operator: TFilterOperator
28
+ rangeGroup: string | null
29
+ multiSelect: boolean
30
+ allowedValues: IFilterAllowedValue[] | null
31
+ lookup: IFilterLookup | null
32
+ }
33
+
34
+ // ---------------------------------------------------------------------------
35
+ // Estruturas processadas após o agrupamento de campos de range
36
+ // ---------------------------------------------------------------------------
37
+
38
+ /** Dois campos DATE+BETWEEN com o mesmo rangeGroup fundidos em uma unidade renderizável */
39
+ export interface IFilterRangeGroup {
40
+ kind: 'range'
41
+ rangeGroup: string
42
+ /** Label derivado: remove sufixo "De"/"Até" do primeiro campo */
43
+ label: string
44
+ startField: IFilterFieldDescriptor
45
+ endField: IFilterFieldDescriptor
46
+ }
47
+
48
+ /** Campo standalone: qualquer campo que não faça parte de um rangeGroup */
49
+ export interface IFilterStandaloneField {
50
+ kind: 'standalone'
51
+ descriptor: IFilterFieldDescriptor
52
+ }
53
+
54
+ /** Union discriminada usada pelo renderizador — evita lógica if/else espalhada */
55
+ export type TFilterRenderItem = IFilterRangeGroup | IFilterStandaloneField
56
+
57
+ // ---------------------------------------------------------------------------
58
+ // Contrato do Lookup Registry
59
+ // ---------------------------------------------------------------------------
60
+
61
+ /**
62
+ * Props mínimas que o sistema genérico precisa passar para um componente de lookup.
63
+ * O componente deve armazenar o valor PRIMITIVO (id, codigo, etc.) sob `name`
64
+ * no react-hook-form — nunca o objeto completo.
65
+ */
66
+ export interface ILookupComponentProps {
67
+ /** Nome do campo no react-hook-form (= nome do param na API) */
68
+ name: string
69
+ /** Label vindo dos metadados do backend */
70
+ label: string
71
+ disabled?: boolean
72
+ }
73
+
74
+ /**
75
+ * Mapa de resource string → componente React de lookup.
76
+ * Cada microfrontend define o seu próprio registry com os componentes adequados.
77
+ *
78
+ * @example
79
+ * const myRegistry: TLookupComponentRegistry = {
80
+ * 'business-partner': BusinessPartnerLookup,
81
+ * 'safra': SafraLookup,
82
+ * }
83
+ */
84
+ export type TLookupComponentRegistry = Record<
85
+ string,
86
+ React.ComponentType<ILookupComponentProps>
87
+ >
@@ -1,5 +1,6 @@
1
1
  // Types exports from base
2
2
  export * from './api';
3
+ export * from './filters';
3
4
  export * from './forms';
4
5
  export * from './models';
5
6
  export * from './store';
@@ -0,0 +1,213 @@
1
+ import React from 'react'
2
+ import { Controller, useFormContext } from 'react-hook-form'
3
+ import { DatePicker, FormItem, Input, Select } from '@/components/ui'
4
+ import DatePickerRange from '@/components/ui/DatePicker/DatePickerRange'
5
+ import type {
6
+ TFilterRenderItem,
7
+ IFilterStandaloneField,
8
+ IFilterRangeGroup,
9
+ TLookupComponentRegistry,
10
+ } from '@base/@types/filters'
11
+
12
+ interface DynamicFilterFieldProps {
13
+ item: TFilterRenderItem
14
+ lookupRegistry?: TLookupComponentRegistry
15
+ }
16
+
17
+ /**
18
+ * Renderiza o componente de formulário correto para um TFilterRenderItem.
19
+ *
20
+ * Regras de renderização:
21
+ * - `kind === 'range'` → DatePickerRange (dois campos DATE+BETWEEN fundidos)
22
+ * - `kind === 'standalone'`:
23
+ * - `lookup != null` → componente do lookupRegistry (async select)
24
+ * - `allowedValues != null` → Select com opções fixas (ENUM)
25
+ * - `dataType === 'DATE'` → DatePicker
26
+ * - `dataType === 'NUMBER'` → Input type="number"
27
+ * - `dataType === 'STRING'` → Input type="text"
28
+ *
29
+ * Deve ser usado DENTRO de um FormProvider.
30
+ */
31
+ const DynamicFilterField: React.FC<DynamicFilterFieldProps> = ({ item, lookupRegistry }) => {
32
+ if (item.kind === 'range') {
33
+ return <RangeField item={item} />
34
+ }
35
+ return <StandaloneField item={item} lookupRegistry={lookupRegistry} />
36
+ }
37
+
38
+ // ---------------------------------------------------------------------------
39
+ // Range field: DatePickerRange gerenciando dois campos reais no form
40
+ // ---------------------------------------------------------------------------
41
+
42
+ interface RangeFieldProps {
43
+ item: IFilterRangeGroup
44
+ }
45
+
46
+ const RangeField: React.FC<RangeFieldProps> = ({ item }) => {
47
+ const { setValue, watch } = useFormContext()
48
+
49
+ const startValue = watch(item.startField.field)
50
+ const endValue = watch(item.endField.field)
51
+
52
+ // Reconstrói o tuple [Date|null, Date|null] a partir das strings armazenadas.
53
+ // Usa 'T00:00:00' para forçar parse em horário local (sem isso, 'YYYY-MM-DD'
54
+ // é interpretado como UTC midnight e exibe um dia anterior no fuso UTC-3).
55
+ const rangeValue: [Date | null, Date | null] = [
56
+ startValue ? new Date(`${startValue}T00:00:00`) : null,
57
+ endValue ? new Date(`${endValue}T00:00:00`) : null,
58
+ ]
59
+
60
+ const handleChange = (value: [Date | null, Date | null]) => {
61
+ const [start, end] = value ?? [null, null]
62
+ setValue(item.startField.field, start ? formatDate(start) : null, { shouldDirty: true })
63
+ setValue(item.endField.field, end ? formatDate(end) : null, { shouldDirty: true })
64
+ }
65
+
66
+ return (
67
+ <FormItem className="text-xs" label={item.label}>
68
+ <DatePickerRange
69
+ size="sm"
70
+ value={rangeValue}
71
+ onChange={handleChange}
72
+ />
73
+ </FormItem>
74
+ )
75
+ }
76
+
77
+ // ---------------------------------------------------------------------------
78
+ // Standalone field: delega para lookup registry ou input genérico
79
+ // ---------------------------------------------------------------------------
80
+
81
+ interface StandaloneFieldProps {
82
+ item: IFilterStandaloneField
83
+ lookupRegistry?: TLookupComponentRegistry
84
+ }
85
+
86
+ const StandaloneField: React.FC<StandaloneFieldProps> = ({ item, lookupRegistry }) => {
87
+ const { descriptor } = item
88
+ const { control } = useFormContext()
89
+
90
+ // Lookup: delega para o componente registrado no microfrontend
91
+ if (descriptor.lookup) {
92
+ const LookupComponent = lookupRegistry?.[descriptor.lookup.resource]
93
+ if (LookupComponent) {
94
+ return (
95
+ <LookupComponent
96
+ name={descriptor.field}
97
+ label={descriptor.label}
98
+ />
99
+ )
100
+ }
101
+ // Fallback: lookup não registrado no registry → input de texto simples
102
+ console.warn(
103
+ `[DynamicFilterField] lookup resource "${descriptor.lookup.resource}" não encontrado no registry. ` +
104
+ `Renderizando como input de texto para o campo "${descriptor.field}".`
105
+ )
106
+ // Continua para renderizar o input de texto (fallback seguro)
107
+ }
108
+
109
+ // ENUM: select com opções fixas vindas dos metadados
110
+ if (descriptor.allowedValues && descriptor.allowedValues.length > 0) {
111
+ const options = descriptor.allowedValues.map((opt) => ({
112
+ value: opt.value,
113
+ label: opt.label,
114
+ }))
115
+
116
+ return (
117
+ <Controller
118
+ name={descriptor.field}
119
+ control={control}
120
+ render={({ field, fieldState: { error } }) => (
121
+ <FormItem
122
+ className="text-xs"
123
+ label={descriptor.label}
124
+ invalid={!!error}
125
+ errorMessage={error?.message}
126
+ >
127
+ <Select
128
+ isClearable
129
+ size="sm"
130
+ placeholder="Selecione uma opção"
131
+ options={options}
132
+ value={options.find((o) => o.value === field.value) ?? null}
133
+ onChange={(opt: { value: string; label: string } | null) =>
134
+ field.onChange(opt?.value ?? null)
135
+ }
136
+ onBlur={field.onBlur}
137
+ />
138
+ </FormItem>
139
+ )}
140
+ />
141
+ )
142
+ }
143
+
144
+ // DATE com operator EQUALS: DatePicker simples
145
+ if (descriptor.dataType === 'DATE') {
146
+ return (
147
+ <Controller
148
+ name={descriptor.field}
149
+ control={control}
150
+ render={({ field, fieldState: { error } }) => (
151
+ <FormItem
152
+ className="text-xs"
153
+ label={descriptor.label}
154
+ invalid={!!error}
155
+ errorMessage={error?.message}
156
+ >
157
+ <DatePicker
158
+ size="sm"
159
+ className="text-xs"
160
+ placeholder="Selecione uma data"
161
+ value={field.value ? new Date(`${field.value}T00:00:00`) : null}
162
+ onChange={(date: Date | null) =>
163
+ field.onChange(date ? formatDate(date) : null)
164
+ }
165
+ onBlur={field.onBlur}
166
+ />
167
+ </FormItem>
168
+ )}
169
+ />
170
+ )
171
+ }
172
+
173
+ // NUMBER ou STRING (inclui fallback de lookup não registrado)
174
+ const inputType = descriptor.dataType === 'NUMBER' ? 'number' : 'text'
175
+
176
+ return (
177
+ <Controller
178
+ name={descriptor.field}
179
+ control={control}
180
+ render={({ field, fieldState: { error } }) => (
181
+ <FormItem
182
+ className="text-xs"
183
+ label={descriptor.label}
184
+ invalid={!!error}
185
+ errorMessage={error?.message}
186
+ >
187
+ <Input
188
+ {...field}
189
+ size="sm"
190
+ type={inputType}
191
+ placeholder={`${descriptor.label}`}
192
+ value={field.value ?? ''}
193
+ onChange={(e) => field.onChange(e.target.value || null)}
194
+ />
195
+ </FormItem>
196
+ )}
197
+ />
198
+ )
199
+ }
200
+
201
+ // ---------------------------------------------------------------------------
202
+ // Utilitário
203
+ // ---------------------------------------------------------------------------
204
+
205
+ /** Formata uma Date para 'YYYY-MM-DD' sem dependências externas */
206
+ function formatDate(date: Date): string {
207
+ const y = date.getFullYear()
208
+ const m = String(date.getMonth() + 1).padStart(2, '0')
209
+ const d = String(date.getDate()).padStart(2, '0')
210
+ return `${y}-${m}-${d}`
211
+ }
212
+
213
+ export default DynamicFilterField
@@ -0,0 +1,50 @@
1
+ import React, { useMemo } from 'react'
2
+ import type { IFilterFieldDescriptor, TLookupComponentRegistry } from '@base/@types/filters'
3
+ import { groupFilterFields } from '@base/utils/filters/groupFilterFields'
4
+ import DynamicFilterField from './DynamicFilterField'
5
+
6
+ interface DynamicFilterPanelProps {
7
+ /** Metadados de filtros vindos do endpoint /filter-metadata */
8
+ fields: IFilterFieldDescriptor[]
9
+ /**
10
+ * Mapa de resource → componente de lookup.
11
+ * Definido pelo microfrontend consumidor — permite que cada app
12
+ * registre os seus próprios componentes de async select.
13
+ */
14
+ lookupRegistry?: TLookupComponentRegistry
15
+ }
16
+
17
+ /**
18
+ * Renderiza todos os campos de filtro dinamicamente a partir dos metadados do backend.
19
+ *
20
+ * - Agrupa automaticamente campos de range (mesmo rangeGroup + BETWEEN) em um DatePickerRange.
21
+ * - Delega a renderização individual para DynamicFilterField.
22
+ * - Deve ser usado DENTRO de um FormProvider.
23
+ *
24
+ * @example
25
+ * <FormProvider {...methods}>
26
+ * <DynamicFilterPanel
27
+ * fields={metadataFields}
28
+ * lookupRegistry={saldoTicketLookupRegistry}
29
+ * />
30
+ * </FormProvider>
31
+ */
32
+ const DynamicFilterPanel: React.FC<DynamicFilterPanelProps> = ({ fields, lookupRegistry }) => {
33
+ // groupFilterFields é uma função pura — o useMemo garante que o agrupamento
34
+ // só recalcula quando `fields` muda (na prática, apenas uma vez por sessão)
35
+ const renderItems = useMemo(() => groupFilterFields(fields), [fields])
36
+
37
+ return (
38
+ <>
39
+ {renderItems.map((item) => (
40
+ <DynamicFilterField
41
+ key={item.kind === 'range' ? `range__${item.rangeGroup}` : item.descriptor.field}
42
+ item={item}
43
+ lookupRegistry={lookupRegistry}
44
+ />
45
+ ))}
46
+ </>
47
+ )
48
+ }
49
+
50
+ export default DynamicFilterPanel
@@ -0,0 +1,2 @@
1
+ export { default as DynamicFilterField } from './DynamicFilterField'
2
+ export { default as DynamicFilterPanel } from './DynamicFilterPanel'
@@ -2,7 +2,7 @@
2
2
  // Route components
3
3
  export * from './routes';
4
4
 
5
- // Table components
5
+ // Table components
6
6
  export * from './table';
7
7
 
8
8
  // Tool components
@@ -10,3 +10,6 @@ export * from './tools';
10
10
 
11
11
  // View components
12
12
  export * from './views';
13
+
14
+ // Filter components (dynamic metadata-driven filters)
15
+ export * from './filters';
@@ -11,6 +11,7 @@ const nfe = {
11
11
  desvincularOrdemCompra: { endpoint: `${NFE_BASE_URL}/desvincular-ordem-compra`, httpMethod: 'post' },
12
12
  estornarPedidoCompra: { endpoint: `${NFE_BASE_URL}/estornar-pedido-compra/{numeroPedido}`, httpMethod: 'post' },
13
13
  estornarOperacao: { endpoint: `${NFE_BASE_URL}/estornar-operacao?id={id}`, httpMethod: 'post' },
14
+ finalizarPedido: { endpoint: `${NFE_BASE_URL}/finalizar-pedido/{numeroPedido}`, httpMethod: 'post' },
14
15
  lock: { endpoint: `${NFE_BASE_URL}/lock`, httpMethod: 'post' },
15
16
  }
16
17
 
@@ -4,7 +4,8 @@ const saldoTicket = {
4
4
  historicoById: (id: string, params?: string) => `/originacao/api/saldo-ticket/${id}/historicos?${params ?? ""}`,
5
5
  buscarSaldoDisponivel: '/originacao/api/saldo-ticket/saldo-disponivel',
6
6
  findAllMetrics: (params?: string) => `/originacao/api/saldo-ticket/metrics?${params ?? ""}`,
7
- updateStatus: (id: string) => `/originacao/api/saldo-ticket/${id}/forcar-status-saldo`
7
+ updateStatus: (id: string) => `/originacao/api/saldo-ticket/${id}/forcar-status-saldo`,
8
+ filterMetadata: '/originacao/api/saldo-ticket/filter-metadata',
8
9
  };
9
10
 
10
11
  export default saldoTicket;
@@ -0,0 +1,43 @@
1
+ import useSWR from 'swr'
2
+ import type { IFilterFieldDescriptor } from '@base/@types/filters'
3
+
4
+ /**
5
+ * Busca e faz cache dos metadados de filtros de um endpoint específico.
6
+ *
7
+ * Usa configurações imutáveis de SWR: os dados são buscados uma única vez
8
+ * por sessão e nunca revalidados automaticamente, pois metadados de filtro são
9
+ * estruturais e não mudam durante o uso da aplicação.
10
+ *
11
+ * O `fetcher` deve ser a função de serviço correspondente ao endpoint,
12
+ * garantindo que a chamada passe pelo ApiService (Axios + token de autenticação).
13
+ *
14
+ * @param swrKey - Chave única de cache SWR (ex: '/originacao/api/saldo-ticket/filter-metadata')
15
+ * @param fetcher - Função que realiza a chamada à API e retorna IFilterFieldDescriptor[]
16
+ *
17
+ * @example
18
+ * const { fields, isLoading, error } = useFilterMetadata(
19
+ * '/originacao/api/saldo-ticket/filter-metadata',
20
+ * apiFindSaldoFilterMetadata,
21
+ * )
22
+ */
23
+ export default function useFilterMetadata(
24
+ swrKey: string,
25
+ fetcher: () => Promise<IFilterFieldDescriptor[]>,
26
+ ) {
27
+ const { data, error, isLoading } = useSWR<IFilterFieldDescriptor[]>(
28
+ swrKey || null,
29
+ fetcher,
30
+ {
31
+ revalidateOnFocus: false,
32
+ revalidateOnReconnect: false,
33
+ revalidateIfStale: false,
34
+ dedupingInterval: 600_000, // 10 minutos — metadados são imutáveis por sessão
35
+ }
36
+ )
37
+
38
+ return {
39
+ fields: data ?? [],
40
+ isLoading,
41
+ error,
42
+ }
43
+ }
@@ -77,4 +77,5 @@ export { default as useIdleTimeout } from './useIdleTimeout';
77
77
  export { default as useFindProdutosByDepositoList } from './dm/produto/useFindProdutosByDepositoList';
78
78
  export { default as useBusinessPartnerFindMonitorTransportadoraList } from './dm/businessPartner/useBusinessPartnerFindMonitorTransportadoraList';
79
79
  export { default as useSapFindUniaoUtilizacaoLimiteCreditoByBusinessPartner } from './sap/uniaoUtilizacaoLimiteCredito/useSapFindUniaoUtilizacaoLimiteCreditoByCliente';
80
- export { default as useDadosUnificadosList } from './crm/dadosUnificados/useDadosUnificadosList';
80
+ export { default as useDadosUnificadosList } from './crm/dadosUnificados/useDadosUnificadosList';
81
+ export { default as useFilterMetadata } from './filters/useFilterMetadata';
@@ -82,6 +82,14 @@ export async function apiEstornarOperacao(id: number) {
82
82
  })
83
83
  }
84
84
 
85
+ export async function apiFinalizarPedido(numeroPedido: string) {
86
+ return ApiService.fetchDataWithAxios<any>({
87
+ url: NFE_ENDPOINT.finalizarPedido.endpoint
88
+ .replace('{numeroPedido}', numeroPedido),
89
+ method: NFE_ENDPOINT.finalizarPedido.httpMethod
90
+ })
91
+ }
92
+
85
93
  export async function apiSetNfeLock(idNfe: number, lock: boolean) {
86
94
  return ApiService.fetchDataWithAxios<any>({
87
95
  url: NFE_ENDPOINT.lock.endpoint,
@@ -7,6 +7,7 @@ import { TFindAllMetricsSaldoResponse } from "@base/@types/api/response/originac
7
7
  import { TEntityHistoricoResponse } from "@base/@types/api/response/originacao/TEntityHistoricoResponse";
8
8
  import { StatusSaldoTicket } from "@base/@types/enums/originacao/StatusSaldoTicket";
9
9
  import { TipoSaldo } from "@base/@types/enums/originacao/TipoSaldo";
10
+ import { IFilterFieldDescriptor } from "@base/@types/filters";
10
11
 
11
12
  const SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;
12
13
 
@@ -62,4 +63,11 @@ export async function apiUpdateStatusSaldoTicket(
62
63
  justificativa
63
64
  }
64
65
  });
66
+ }
67
+
68
+ export async function apiFindSaldoFilterMetadata() {
69
+ return ApiService.fetchDataWithAxios<IFilterFieldDescriptor[]>({
70
+ url: SALDO_TICKET_ORIGINACAO_ENDPOINT.filterMetadata,
71
+ method: "get",
72
+ });
65
73
  }