@orbe-agro/client-core 5.6.161 → 5.6.163

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 (160) hide show
  1. package/dist/@ecme/assets/styles/app.css +7 -0
  2. package/dist/@ecme/assets/styles/tailwind/index.css +7 -0
  3. package/dist/@ecme/components/template/Footer.js +1 -1
  4. package/dist/@types/base/@types/api/request/originacao/TLiquidarContratoRequest.d.ts +1 -0
  5. package/dist/@types/base/@types/api/request/originacao/TLiquidarContratoRequest.d.ts.map +1 -1
  6. package/dist/@types/base/@types/api/request/originacao/TSimularRoyaltiesRequest.d.ts +1 -0
  7. package/dist/@types/base/@types/api/request/originacao/TSimularRoyaltiesRequest.d.ts.map +1 -1
  8. package/dist/@types/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.d.ts +5 -0
  9. package/dist/@types/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.d.ts.map +1 -0
  10. package/dist/@types/base/@types/api/response/originacao/TProcessoFiscalResponse.d.ts +1 -0
  11. package/dist/@types/base/@types/api/response/originacao/TProcessoFiscalResponse.d.ts.map +1 -1
  12. package/dist/@types/base/@types/filters/index.d.ts +2 -0
  13. package/dist/@types/base/@types/filters/index.d.ts.map +1 -1
  14. package/dist/@types/base/@types/models/performance/ppr.d.ts +69 -0
  15. package/dist/@types/base/@types/models/performance/ppr.d.ts.map +1 -1
  16. package/dist/@types/base/components/filters/DynamicFilterField.d.ts.map +1 -1
  17. package/dist/@types/base/components/filters/DynamicListTableFilter.d.ts +37 -0
  18. package/dist/@types/base/components/filters/DynamicListTableFilter.d.ts.map +1 -0
  19. package/dist/@types/base/components/filters/index.d.ts +1 -0
  20. package/dist/@types/base/components/filters/index.d.ts.map +1 -1
  21. package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts +27 -1
  22. package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts.map +1 -1
  23. package/dist/@types/base/configs/endpoints.config/gestaoServicos/config/contratoServico.d.ts +20 -0
  24. package/dist/@types/base/configs/endpoints.config/gestaoServicos/config/contratoServico.d.ts.map +1 -0
  25. package/dist/@types/base/configs/endpoints.config/gestaoServicos/gestaoServicos.d.ts +22 -0
  26. package/dist/@types/base/configs/endpoints.config/gestaoServicos/gestaoServicos.d.ts.map +1 -0
  27. package/dist/@types/base/configs/endpoints.config/originacao/config/cockpitFiscal.d.ts +1 -0
  28. package/dist/@types/base/configs/endpoints.config/originacao/config/cockpitFiscal.d.ts.map +1 -1
  29. package/dist/@types/base/configs/endpoints.config/originacao/config/processoFiscal.d.ts +3 -0
  30. package/dist/@types/base/configs/endpoints.config/originacao/config/processoFiscal.d.ts.map +1 -1
  31. package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts +1 -1
  32. package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts.map +1 -1
  33. package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts +5 -1
  34. package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts.map +1 -1
  35. package/dist/@types/base/configs/endpoints.config/performance/config/ppr.d.ts +2 -0
  36. package/dist/@types/base/configs/endpoints.config/performance/config/ppr.d.ts.map +1 -1
  37. package/dist/@types/base/configs/endpoints.config/performance/performance.d.ts +2 -0
  38. package/dist/@types/base/configs/endpoints.config/performance/performance.d.ts.map +1 -1
  39. package/dist/@types/base/configs/navigation.config/modules.navigation.d.ts.map +1 -1
  40. package/dist/@types/base/configs/navigation.config/modules.submenu/gestaoServicos/submenu.gestaoServicos.d.ts +4 -0
  41. package/dist/@types/base/configs/navigation.config/modules.submenu/gestaoServicos/submenu.gestaoServicos.d.ts.map +1 -0
  42. package/dist/@types/base/configs/navigation.config/modules.submenu/index.d.ts +1 -0
  43. package/dist/@types/base/configs/navigation.config/modules.submenu/index.d.ts.map +1 -1
  44. package/dist/@types/base/configs/navigation.config/submenu/gestaoServicos/cadastros.submenu.d.ts +4 -0
  45. package/dist/@types/base/configs/navigation.config/submenu/gestaoServicos/cadastros.submenu.d.ts.map +1 -0
  46. package/dist/@types/base/configs/navigation.config/submenu/gestaoServicos/config/contratoServico.submenu.d.ts +4 -0
  47. package/dist/@types/base/configs/navigation.config/submenu/gestaoServicos/config/contratoServico.submenu.d.ts.map +1 -0
  48. package/dist/@types/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.d.ts +4 -0
  49. package/dist/@types/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.d.ts.map +1 -0
  50. package/dist/@types/base/configs/navigation.config/submenu/performance/config/ppr.submenu.d.ts.map +1 -1
  51. package/dist/@types/base/services/index.d.ts +1 -1
  52. package/dist/@types/base/services/index.d.ts.map +1 -1
  53. package/dist/@types/base/services/modules/gestaoServicos/contratoServico/ContratoServicoService.d.ts +6 -0
  54. package/dist/@types/base/services/modules/gestaoServicos/contratoServico/ContratoServicoService.d.ts.map +1 -0
  55. package/dist/@types/base/services/modules/gestaoServicos/index.d.ts +2 -0
  56. package/dist/@types/base/services/modules/gestaoServicos/index.d.ts.map +1 -0
  57. package/dist/@types/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.d.ts +2 -0
  58. package/dist/@types/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.d.ts.map +1 -1
  59. package/dist/@types/base/services/modules/originacao/processoFiscal/processoFiscalService.d.ts +8 -0
  60. package/dist/@types/base/services/modules/originacao/processoFiscal/processoFiscalService.d.ts.map +1 -1
  61. package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts +1 -1
  62. package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts.map +1 -1
  63. package/dist/@types/base/services/modules/performance/PerformanceService.d.ts +6 -1
  64. package/dist/@types/base/services/modules/performance/PerformanceService.d.ts.map +1 -1
  65. package/dist/@types/base/services/query.d.ts +15 -0
  66. package/dist/@types/base/services/query.d.ts.map +1 -1
  67. package/dist/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.js +2 -0
  68. package/dist/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.js.map +1 -0
  69. package/dist/base/assets/styles/init.css +7 -0
  70. package/dist/base/components/filters/DynamicFilterField.js +49 -19
  71. package/dist/base/components/filters/DynamicFilterField.js.map +1 -1
  72. package/dist/base/components/filters/DynamicListTableFilter.js +116 -0
  73. package/dist/base/components/filters/DynamicListTableFilter.js.map +1 -0
  74. package/dist/base/components/filters/index.js +3 -1
  75. package/dist/base/components/filters/index.js.map +1 -1
  76. package/dist/base/components/index.js +8 -6
  77. package/dist/base/components/index.js.map +1 -1
  78. package/dist/base/configs/endpoints.config/endpoints.navigation.js +3 -1
  79. package/dist/base/configs/endpoints.config/endpoints.navigation.js.map +1 -1
  80. package/dist/base/configs/endpoints.config/gestaoServicos/config/contratoServico.js +11 -0
  81. package/dist/base/configs/endpoints.config/gestaoServicos/config/contratoServico.js.map +1 -0
  82. package/dist/base/configs/endpoints.config/gestaoServicos/gestaoServicos.js +8 -0
  83. package/dist/base/configs/endpoints.config/gestaoServicos/gestaoServicos.js.map +1 -0
  84. package/dist/base/configs/endpoints.config/originacao/config/cockpitFiscal.js +2 -1
  85. package/dist/base/configs/endpoints.config/originacao/config/cockpitFiscal.js.map +1 -1
  86. package/dist/base/configs/endpoints.config/originacao/config/processoFiscal.js +4 -1
  87. package/dist/base/configs/endpoints.config/originacao/config/processoFiscal.js.map +1 -1
  88. package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js +1 -1
  89. package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js.map +1 -1
  90. package/dist/base/configs/endpoints.config/performance/config/ppr.js +3 -1
  91. package/dist/base/configs/endpoints.config/performance/config/ppr.js.map +1 -1
  92. package/dist/base/configs/index.js +18 -16
  93. package/dist/base/configs/index.js.map +1 -1
  94. package/dist/base/configs/navigation.config/index.js +18 -16
  95. package/dist/base/configs/navigation.config/index.js.map +1 -1
  96. package/dist/base/configs/navigation.config/modules.navigation.js +2 -0
  97. package/dist/base/configs/navigation.config/modules.navigation.js.map +1 -1
  98. package/dist/base/configs/navigation.config/modules.submenu/gestaoServicos/submenu.gestaoServicos.js +107 -0
  99. package/dist/base/configs/navigation.config/modules.submenu/gestaoServicos/submenu.gestaoServicos.js.map +1 -0
  100. package/dist/base/configs/navigation.config/modules.submenu/index.js +2 -0
  101. package/dist/base/configs/navigation.config/modules.submenu/index.js.map +1 -1
  102. package/dist/base/configs/navigation.config/submenu/gestaoServicos/cadastros.submenu.js +18 -0
  103. package/dist/base/configs/navigation.config/submenu/gestaoServicos/cadastros.submenu.js.map +1 -0
  104. package/dist/base/configs/navigation.config/submenu/gestaoServicos/config/contratoServico.submenu.js +15 -0
  105. package/dist/base/configs/navigation.config/submenu/gestaoServicos/config/contratoServico.submenu.js.map +1 -0
  106. package/dist/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.js +17 -0
  107. package/dist/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.js.map +1 -0
  108. package/dist/base/configs/navigation.config/submenu/performance/config/ppr.submenu.js +3 -1
  109. package/dist/base/configs/navigation.config/submenu/performance/config/ppr.submenu.js.map +1 -1
  110. package/dist/base/index.js +236 -226
  111. package/dist/base/index.js.map +1 -1
  112. package/dist/base/services/index.js +8 -2
  113. package/dist/base/services/modules/gestaoServicos/contratoServico/ContratoServicoService.js +37 -0
  114. package/dist/base/services/modules/gestaoServicos/contratoServico/ContratoServicoService.js.map +1 -0
  115. package/dist/base/services/modules/gestaoServicos/index.js +8 -0
  116. package/dist/base/services/modules/gestaoServicos/index.js.map +1 -0
  117. package/dist/base/services/modules/index.js +6 -1
  118. package/dist/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.js +8 -1
  119. package/dist/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.js.map +1 -1
  120. package/dist/base/services/modules/originacao/processoFiscal/processoFiscalService.js +23 -0
  121. package/dist/base/services/modules/originacao/processoFiscal/processoFiscalService.js.map +1 -1
  122. package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js +2 -2
  123. package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js.map +1 -1
  124. package/dist/base/services/modules/performance/PerformanceService.js +38 -0
  125. package/dist/base/services/modules/performance/PerformanceService.js.map +1 -1
  126. package/dist/base/services/modules/performance/index.js +6 -1
  127. package/dist/base/services/query.js +26 -0
  128. package/dist/base/services/query.js.map +1 -1
  129. package/lib/base/@types/api/request/originacao/TLiquidarContratoRequest.ts +1 -0
  130. package/lib/base/@types/api/request/originacao/TSimularRoyaltiesRequest.ts +1 -0
  131. package/lib/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.ts +5 -0
  132. package/lib/base/@types/api/response/originacao/TProcessoFiscalResponse.ts +1 -0
  133. package/lib/base/@types/filters/index.ts +2 -0
  134. package/lib/base/@types/models/performance/ppr.ts +74 -0
  135. package/lib/base/components/filters/DynamicFilterField.tsx +51 -20
  136. package/lib/base/components/filters/DynamicListTableFilter.tsx +180 -0
  137. package/lib/base/components/filters/index.ts +1 -0
  138. package/lib/base/configs/endpoints.config/endpoints.navigation.ts +3 -1
  139. package/lib/base/configs/endpoints.config/gestaoServicos/config/contratoServico.ts +10 -0
  140. package/lib/base/configs/endpoints.config/gestaoServicos/gestaoServicos.ts +7 -0
  141. package/lib/base/configs/endpoints.config/originacao/config/cockpitFiscal.ts +1 -0
  142. package/lib/base/configs/endpoints.config/originacao/config/processoFiscal.ts +3 -0
  143. package/lib/base/configs/endpoints.config/originacao/config/saldoTicket.ts +1 -1
  144. package/lib/base/configs/endpoints.config/performance/config/ppr.ts +2 -0
  145. package/lib/base/configs/navigation.config/modules.navigation.ts +2 -1
  146. package/lib/base/configs/navigation.config/modules.submenu/gestaoServicos/submenu.gestaoServicos.ts +107 -0
  147. package/lib/base/configs/navigation.config/modules.submenu/index.ts +1 -0
  148. package/lib/base/configs/navigation.config/submenu/gestaoServicos/cadastros.submenu.ts +18 -0
  149. package/lib/base/configs/navigation.config/submenu/gestaoServicos/config/contratoServico.submenu.ts +15 -0
  150. package/lib/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.ts +17 -0
  151. package/lib/base/configs/navigation.config/submenu/performance/config/ppr.submenu.ts +2 -0
  152. package/lib/base/services/index.ts +1 -0
  153. package/lib/base/services/modules/gestaoServicos/contratoServico/ContratoServicoService.ts +36 -0
  154. package/lib/base/services/modules/gestaoServicos/index.ts +1 -0
  155. package/lib/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.ts +8 -0
  156. package/lib/base/services/modules/originacao/processoFiscal/processoFiscalService.ts +25 -0
  157. package/lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts +2 -2
  158. package/lib/base/services/modules/performance/PerformanceService.ts +42 -0
  159. package/lib/base/services/query.ts +49 -0
  160. package/package.json +1 -1
@@ -112,3 +112,77 @@ export type TCreateIndicadorMetaSetorialGeral = {
112
112
  parametrosCcIds: number[]
113
113
  escalonamentos: TEscalonamentoMetaSetorialGeral[]
114
114
  }
115
+
116
+ export type TEscalonamentoMetaSetorialPorCc = {
117
+ id?: number
118
+ ordem: number
119
+ percentualMinimo: number | null
120
+ percentualPagamento: number
121
+ }
122
+
123
+ export type TIndicadorMetaSetorialPorCc = {
124
+ id?: number
125
+ parametroCcId: number
126
+ nome: string
127
+ peso: number
128
+ metaPlanejada: number
129
+ unidadeMedida: string
130
+ formaCalculo: string
131
+ fonteDados: string
132
+ objetivo: string
133
+ polaridade: 'MAIOR_MELHOR' | 'MENOR_MELHOR'
134
+ frequencia: 'MENSAL' | 'BIMESTRAL' | 'TRIMESTRAL' | 'SEMESTRAL' | 'ANUAL'
135
+ responsavelId: number
136
+ validadorId: number
137
+ escalonamentos: TEscalonamentoMetaSetorialPorCc[]
138
+ ativo?: boolean
139
+ dataCriacao?: string
140
+ dataAtualizacao?: string | null
141
+ usuarioCriacaoId?: number
142
+ usuarioAtualizacaoId?: number | null
143
+ }
144
+
145
+ export type TFindMonitorIndicadorMetaSetorialPorCc = {
146
+ id?: number
147
+ parametroCcId: number
148
+ nome: string
149
+ peso: number
150
+ metaPlanejada: number
151
+ polaridade: 'MAIOR_MELHOR' | 'MENOR_MELHOR'
152
+ frequencia: 'MENSAL' | 'BIMESTRAL' | 'TRIMESTRAL' | 'SEMESTRAL' | 'ANUAL'
153
+ dataCriacao?: string
154
+ usuarioCriacaoId?: number
155
+ }
156
+
157
+ export type TCreateIndicadorMetaSetorialPorCc = {
158
+ parametroCcId: number
159
+ nome: string
160
+ peso: number
161
+ metaPlanejada: number
162
+ unidadeMedida: string
163
+ formaCalculo: string
164
+ fonteDados: string
165
+ objetivo: string
166
+ polaridade: 'MAIOR_MELHOR' | 'MENOR_MELHOR'
167
+ frequencia: 'MENSAL' | 'BIMESTRAL' | 'TRIMESTRAL' | 'SEMESTRAL' | 'ANUAL'
168
+ responsavelId: number
169
+ validadorId: number
170
+ escalonamentos: TEscalonamentoMetaSetorialPorCc[]
171
+ }
172
+
173
+ export type TUpdateIndicadorMetaSetorialPorCc = {
174
+ id: number
175
+ parametroCcId: number
176
+ nome: string
177
+ peso: number
178
+ metaPlanejada: number
179
+ unidadeMedida: string
180
+ formaCalculo: string
181
+ fonteDados: string
182
+ objetivo: string
183
+ polaridade: 'MAIOR_MELHOR' | 'MENOR_MELHOR'
184
+ frequencia: 'MENSAL' | 'BIMESTRAL' | 'TRIMESTRAL' | 'SEMESTRAL' | 'ANUAL'
185
+ responsavelId: number
186
+ validadorId: number
187
+ escalonamentos: TEscalonamentoMetaSetorialPorCc[]
188
+ }
@@ -95,6 +95,7 @@ const StandaloneField: React.FC<StandaloneFieldProps> = ({ item, lookupRegistry
95
95
  <LookupComponent
96
96
  name={descriptor.field}
97
97
  label={descriptor.label}
98
+ multiSelect={descriptor.multiSelect}
98
99
  />
99
100
  )
100
101
  }
@@ -117,26 +118,56 @@ const StandaloneField: React.FC<StandaloneFieldProps> = ({ item, lookupRegistry
117
118
  <Controller
118
119
  name={descriptor.field}
119
120
  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
- )}
121
+ render={({ field, fieldState: { error } }) => {
122
+ if (descriptor.multiSelect) {
123
+ // Multi-select: value é string[], onChange recebe opções como array
124
+ const selectedOptions = options.filter(
125
+ (o) => (field.value as string[] | undefined)?.includes(o.value)
126
+ )
127
+ return (
128
+ <FormItem
129
+ className="text-xs"
130
+ label={descriptor.label}
131
+ invalid={!!error}
132
+ errorMessage={error?.message}
133
+ >
134
+ <Select
135
+ isClearable
136
+ isMulti
137
+ size="sm"
138
+ placeholder="Selecione uma ou mais opções"
139
+ options={options}
140
+ value={selectedOptions.length > 0 ? selectedOptions : null}
141
+ onChange={(opts: readonly { value: string; label: string }[] | null) =>
142
+ field.onChange(opts ? [...opts].map((o) => o.value) : null)
143
+ }
144
+ onBlur={field.onBlur}
145
+ />
146
+ </FormItem>
147
+ )
148
+ }
149
+
150
+ return (
151
+ <FormItem
152
+ className="text-xs"
153
+ label={descriptor.label}
154
+ invalid={!!error}
155
+ errorMessage={error?.message}
156
+ >
157
+ <Select
158
+ isClearable
159
+ size="sm"
160
+ placeholder="Selecione uma opção"
161
+ options={options}
162
+ value={options.find((o) => o.value === field.value) ?? null}
163
+ onChange={(opt: { value: string; label: string } | null) =>
164
+ field.onChange(opt?.value ?? null)
165
+ }
166
+ onBlur={field.onBlur}
167
+ />
168
+ </FormItem>
169
+ )
170
+ }}
140
171
  />
141
172
  )
142
173
  }
@@ -0,0 +1,180 @@
1
+ import React, { useState } from 'react'
2
+ import Button from '@/components/ui/Button/index'
3
+ import Drawer from '@/components/ui/Drawer/index'
4
+ import { Form } from '@/components/ui/Form/index'
5
+ import { Badge } from '@/components/ui/index'
6
+ import { FormProvider, useForm } from 'react-hook-form'
7
+ import { useTranslation } from 'react-i18next'
8
+ import { TbFilter } from 'react-icons/tb'
9
+ import useFilterMetadata from '@base/hooks/filters/useFilterMetadata'
10
+ import DynamicFilterPanel from './DynamicFilterPanel'
11
+ import type {
12
+ IFilterFieldDescriptor,
13
+ TLookupComponentRegistry,
14
+ } from '@base/@types/filters'
15
+
16
+ /**
17
+ * Props para o DynamicListTableFilter — componente genérico de filtros
18
+ * que renderiza um botão com badge + drawer com formulário dinâmico.
19
+ *
20
+ * Cada list-table que quiser filtros dinâmicos cria um wrapper de ~10 linhas
21
+ * que extrai os valores do seu hook específico e passa como props.
22
+ */
23
+ export interface DynamicListTableFilterProps {
24
+ /** Chave SWR única para cache do filter-metadata (ex: '/originacao/api/saldo-ticket/filter-metadata') */
25
+ swrKey: string
26
+ /** Função que busca os metadados de filtro no backend */
27
+ metadataFetcher: () => Promise<IFilterFieldDescriptor[]>
28
+ /** Estado atual dos filtros (vem da store do módulo) */
29
+ filterParams: Record<string, unknown>
30
+ /** Atualiza o estado dos filtros (recebendo params limpos) */
31
+ setFilterParams: (payload: Record<string, unknown>) => void
32
+ /** Número de filtros ativos (para o badge) */
33
+ activeFiltersCount: number
34
+ /**
35
+ * Mapa de resource → componente de lookup.
36
+ * Mesmo tipo usado pelo DynamicFilterPanel.
37
+ * @example { 'business-partner': BusinessPartnerLookup, 'safra': SafraLookup }
38
+ */
39
+ lookupRegistry?: TLookupComponentRegistry
40
+ /**
41
+ * Mapa de resource → função de extração de valor primitivo.
42
+ * Usado no onSubmit para transformar objetos completos armazenados no RHF
43
+ * nos valores planos que a API espera.
44
+ * @example { 'business-partner': (obj) => obj?.id, 'safra': (obj) => obj?.id }
45
+ */
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ extractValueRegistry?: Record<string, (obj: any) => unknown>
48
+ }
49
+
50
+ const DynamicListTableFilter: React.FC<DynamicListTableFilterProps> = ({
51
+ swrKey,
52
+ metadataFetcher,
53
+ filterParams,
54
+ setFilterParams,
55
+ activeFiltersCount,
56
+ lookupRegistry,
57
+ extractValueRegistry,
58
+ }) => {
59
+ const [filterIsOpen, setFilterIsOpen] = useState(false)
60
+
61
+ const { fields, isLoading: metadataLoading, error: metadataError } = useFilterMetadata(
62
+ swrKey,
63
+ metadataFetcher,
64
+ )
65
+
66
+ // Sem zod schema: o backend define quais campos existem e todos são opcionais.
67
+ // O defaultValues reconstitui o estado atual dos filtros ao reabrir o drawer.
68
+ const methods = useForm<Record<string, unknown>>({
69
+ defaultValues: filterParams,
70
+ })
71
+
72
+ const onSubmit = (data: Record<string, unknown>) => {
73
+ // Constrói um mapa rápido de field → lookup.resource para os campos com lookup
74
+ const lookupResourceByField = new Map<string, string>()
75
+ for (const f of fields) {
76
+ if (f.lookup) {
77
+ lookupResourceByField.set(f.field, f.lookup.resource)
78
+ }
79
+ }
80
+
81
+ const cleanParams: Record<string, unknown> = {}
82
+ for (const [key, value] of Object.entries(data)) {
83
+ if (value === null || value === undefined || value === '') continue
84
+
85
+ const resource = lookupResourceByField.get(key)
86
+ // Campo de lookup com extractFn registrado → extrai o primitivo (id, codigo)
87
+ // Se o extractFn não existir (lookup não registrado no registry), trata como texto comum
88
+ const extractFn = resource && extractValueRegistry?.[resource]
89
+ if (extractFn) {
90
+ // Multi-select lookup: value é um array de objetos → extrai primitivo de cada um
91
+ if (Array.isArray(value)) {
92
+ const primitives = value.map((v) => extractFn(v)).filter((p) => p !== null && p !== undefined)
93
+ if (primitives.length > 0) {
94
+ cleanParams[key] = primitives
95
+ }
96
+ } else {
97
+ const primitive = extractFn(value)
98
+ if (primitive !== null && primitive !== undefined) {
99
+ cleanParams[key] = primitive
100
+ }
101
+ }
102
+ } else {
103
+ cleanParams[key] = value
104
+ }
105
+ }
106
+ setFilterParams(cleanParams)
107
+ setFilterIsOpen(false)
108
+ }
109
+
110
+ const onClearFilters = () => {
111
+ // Zera explicitamente cada campo registrado pelos metadados.
112
+ // Usar reset({}) sozinho não é suficiente: o react-hook-form mantém o registro
113
+ // dos campos dinâmicos e pode devolver valores antigos em submits subsequentes.
114
+ // Também inclui os campos de range (startField/endField) que ficam registrados
115
+ // separadamente no form pelo DynamicFilterField/RangeField.
116
+ const clearedValues: Record<string, null> = {}
117
+ for (const f of fields) {
118
+ clearedValues[f.field] = null
119
+ }
120
+ methods.reset(clearedValues)
121
+ setFilterParams({})
122
+ setFilterIsOpen(false)
123
+ }
124
+
125
+ const { t } = useTranslation()
126
+
127
+ return (
128
+ <>
129
+ <Badge className="ml-auto mr-4" content={activeFiltersCount}>
130
+ <Button icon={<TbFilter />} className='text-xs' onClick={() => setFilterIsOpen(true)}>
131
+ {t('common.actions.filter')}
132
+ </Button>
133
+ </Badge>
134
+ <Drawer
135
+ title={<span className="font-bold">Filtros</span>}
136
+ isOpen={filterIsOpen}
137
+ className="text-xs"
138
+ onClose={() => setFilterIsOpen(false)}
139
+ onRequestClose={() => setFilterIsOpen(false)}
140
+ >
141
+ <FormProvider {...methods}>
142
+ <Form
143
+ className="h-full"
144
+ containerClassName="flex h-full flex-col"
145
+ onSubmit={methods.handleSubmit(onSubmit)}
146
+ >
147
+ <div className="flex-1 overflow-y-auto overflow-hidden pr-3">
148
+ {metadataLoading && (
149
+ <div className="flex justify-center py-6 text-sm text-gray-500">
150
+ Carregando filtros...
151
+ </div>
152
+ )}
153
+ {metadataError && !metadataLoading && (
154
+ <div className="flex justify-center py-6 text-sm text-red-500">
155
+ Falha ao carregar filtros. Tente novamente.
156
+ </div>
157
+ )}
158
+ {!metadataLoading && !metadataError && (
159
+ <DynamicFilterPanel
160
+ fields={fields}
161
+ lookupRegistry={lookupRegistry}
162
+ />
163
+ )}
164
+ </div>
165
+ <div className="flex justify-end flex-col gap-2 mt-auto border-t dark:border-t-zinc-600">
166
+ <Button variant="plain" type="button" onClick={onClearFilters}>
167
+ Limpar filtros
168
+ </Button>
169
+ <Button variant="solid" type="submit">
170
+ Filtrar
171
+ </Button>
172
+ </div>
173
+ </Form>
174
+ </FormProvider>
175
+ </Drawer>
176
+ </>
177
+ )
178
+ }
179
+
180
+ export default DynamicListTableFilter
@@ -1,2 +1,3 @@
1
1
  export { default as DynamicFilterField } from './DynamicFilterField'
2
2
  export { default as DynamicFilterPanel } from './DynamicFilterPanel'
3
+ export { default as DynamicListTableFilter } from './DynamicListTableFilter'
@@ -47,6 +47,7 @@ import consultaBuonny from './transportadora/consultaBuonny'
47
47
  import consultaVerttice from './transportadora/consultaVerttice'
48
48
  import bayer from './bayer/bayer'
49
49
  import insumos from './insumos/insumos'
50
+ import gestaoServicos from './gestaoServicos/gestaoServicos'
50
51
  import vinculoFuncionalidadeRole from './adm/config/vinculoFuncionalidadeRole'
51
52
  import sap from './sap/sap'
52
53
  import agendamento from './agendamento/agendamento'
@@ -111,7 +112,8 @@ const endpointNavigationConfig = {
111
112
  agendamento,
112
113
  controleAcesso,
113
114
  performance,
114
- ativos
115
+ ativos,
116
+ gestaoServicos
115
117
  }
116
118
 
117
119
  export default endpointNavigationConfig
@@ -0,0 +1,10 @@
1
+ const CONTRATO_SERVICO_BASE_URL = '/gestao-servicos/api/contrato-servico'
2
+
3
+ const contratoServico = {
4
+ create: { endpoint: CONTRATO_SERVICO_BASE_URL, httpMethod: 'post' },
5
+ update: { endpoint: CONTRATO_SERVICO_BASE_URL, httpMethod: 'put' },
6
+ findMonitor: { endpoint: `${CONTRATO_SERVICO_BASE_URL}/find-monitor`, httpMethod: 'post' },
7
+ findOne: { endpoint: CONTRATO_SERVICO_BASE_URL, httpMethod: 'get' }
8
+ }
9
+
10
+ export default contratoServico
@@ -0,0 +1,7 @@
1
+ import contratoServico from "./config/contratoServico"
2
+
3
+ const gestaoServicos = {
4
+ contratoServico: contratoServico,
5
+ }
6
+
7
+ export default gestaoServicos
@@ -1,5 +1,6 @@
1
1
  const cockpitFiscal = {
2
2
  findAll: (params?: string) => `/originacao/api/cockpit-fiscal?${params ?? ""}`,
3
+ filterMetadata: '/originacao/api/cockpit-fiscal/filter-metadata',
3
4
  };
4
5
 
5
6
  export default cockpitFiscal;
@@ -1,6 +1,9 @@
1
1
  const processoFiscal = {
2
+ create: '/originacao/api/processo-fiscal',
3
+ update: (id: string) => `/originacao/api/processo-fiscal/${id}`,
2
4
  uploadNotaFiscal: (id: string) => `/originacao/api/processo-fiscal/${id}/upload-nota-fiscal`,
3
5
  downloadNotaFiscal: (url: string) => `/originacao/api/processo-fiscal/nota-fiscal/${url}`,
6
+ listByContrato: (contratoId: string | number) => `/originacao/api/processo-fiscal?contratoId=${contratoId}`,
4
7
  };
5
8
 
6
9
  export default processoFiscal;
@@ -1,5 +1,5 @@
1
1
  const saldoTicket = {
2
- buscarSaldoContrato: (id: string) => `/originacao/api/saldo-ticket/contrato/${id}`,
2
+ buscarSaldoContrato: (id: string, processoFiscalId: string | number) => `/originacao/api/saldo-ticket/contrato/${id}?processoFiscalId=${processoFiscalId}`,
3
3
  findAll: (params?: string) => `/originacao/api/saldo-ticket?${params ?? ""}`,
4
4
  historicoById: (id: string, params?: string) => `/originacao/api/saldo-ticket/${id}/historicos?${params ?? ""}`,
5
5
  buscarSaldoDisponivel: '/originacao/api/saldo-ticket/saldo-disponivel',
@@ -7,6 +7,8 @@ const ppr = {
7
7
  indicadoresMetaGlobalFindMonitor: '/performance/api/ppr/indicadores/meta-global/find-monitor',
8
8
  indicadoresMetaSetorialGeral: '/performance/api/ppr/indicadores/meta-setorial-geral',
9
9
  indicadoresMetaSetorialGeralFindMonitor: '/performance/api/ppr/indicadores/meta-setorial-geral/find-monitor',
10
+ indicadoresMetaSetorialPorCc: '/performance/api/ppr/indicadores/meta-setorial-por-cc',
11
+ indicadoresMetaSetorialPorCcFindMonitor: '/performance/api/ppr/indicadores/meta-setorial-por-cc/find-monitor',
10
12
  };
11
13
 
12
14
  export default ppr;
@@ -28,7 +28,7 @@ import subMenuJuridico from './modules.submenu/juridico/submenu.juridico'
28
28
  import subMenuBayer from './modules.submenu/bayer/submenu.bayer'
29
29
  import subMenuCrm from './modules.submenu/crm/subMenuCrm.navigation'
30
30
  import subMenuPerformance from './modules.submenu/performance/submenu.performance'
31
- import { subMenuAtivos } from './modules.submenu'
31
+ import { subMenuAtivos, subMenuGestaoServicos } from './modules.submenu'
32
32
  import hubFiscalNavigationConfig from './modules.submenu/HubFiscal/hubFiscal.navigation'
33
33
 
34
34
  const modulesNavigationConfig: NavigationTree[] = [
@@ -57,6 +57,7 @@ const modulesNavigationConfig: NavigationTree[] = [
57
57
  subMenuRacao,
58
58
  subMenuCompras,
59
59
  subMenuControleAcesso,
60
+ subMenuGestaoServicos,
60
61
  ...subMenuCrm,
61
62
  dadosunificadosNavigationConfig,
62
63
  ...dadosMestresNavigationConfig,
@@ -0,0 +1,107 @@
1
+ import { ADMIN, USER } from '@/constants/roles.constant'
2
+ import { NavigationTree } from '@/@types/navigation'
3
+ import { NAV_ITEM_TYPE_COLLAPSE, NAV_ITEM_TYPE_ITEM } from '@/constants/navigation.constant'
4
+
5
+ const subMenuGestaoServicos: NavigationTree = {
6
+ key: 'modules.gestaoServicos',
7
+ path: '',
8
+ title: 'Gestão de Serviços',
9
+ translateKey: 'nav.modules.gestaoServicos.title',
10
+ icon: 'gestaoServicos',
11
+ type: NAV_ITEM_TYPE_COLLAPSE,
12
+ authority: [ADMIN, USER],
13
+ subMenu: [
14
+ {
15
+ key: 'modules.gestaoServicos.dashboard',
16
+ path: '/gestao-servicos',
17
+ title: 'Dashboard',
18
+ translateKey: 'nav.modules.gestaoServicos.dashboard',
19
+ icon: 'dashboard',
20
+ type: NAV_ITEM_TYPE_ITEM,
21
+ authority: [ADMIN, USER],
22
+ subMenu: [],
23
+ },
24
+ {
25
+ key: 'modules.gestaoServicos.contratos',
26
+ path: '/gestao-servicos/contratos',
27
+ title: 'Contratos',
28
+ translateKey: 'nav.modules.gestaoServicos.contratos',
29
+ icon: 'contratoServico',
30
+ type: NAV_ITEM_TYPE_ITEM,
31
+ authority: [ADMIN, USER],
32
+ subMenu: [],
33
+ },
34
+ {
35
+ key: 'modules.gestaoServicos.agenda',
36
+ path: '/gestao-servicos/agenda',
37
+ title: 'Agenda',
38
+ translateKey: 'nav.modules.gestaoServicos.agenda',
39
+ icon: 'calendar',
40
+ type: NAV_ITEM_TYPE_ITEM,
41
+ authority: [ADMIN, USER],
42
+ subMenu: [],
43
+ },
44
+ {
45
+ key: 'modules.gestaoServicos.notasFiscais',
46
+ path: '/gestao-servicos/notas-fiscais',
47
+ title: 'Notas Fiscais',
48
+ translateKey: 'nav.modules.gestaoServicos.notasFiscais',
49
+ icon: 'receipt',
50
+ type: NAV_ITEM_TYPE_ITEM,
51
+ authority: [ADMIN, USER],
52
+ subMenu: [],
53
+ },
54
+ {
55
+ key: 'modules.gestaoServicos.pagamentos',
56
+ path: '/gestao-servicos/pagamentos',
57
+ title: 'Pagamentos',
58
+ translateKey: 'nav.modules.gestaoServicos.pagamentos',
59
+ icon: 'currency-dollar',
60
+ type: NAV_ITEM_TYPE_ITEM,
61
+ authority: [ADMIN, USER],
62
+ subMenu: [],
63
+ },
64
+ {
65
+ key: 'modules.gestaoServicos.aprovacoes',
66
+ path: '/gestao-servicos/aprovacoes',
67
+ title: 'Minhas Aprovações',
68
+ translateKey: 'nav.modules.gestaoServicos.aprovacoes',
69
+ icon: 'checkmark',
70
+ type: NAV_ITEM_TYPE_ITEM,
71
+ authority: [ADMIN, USER],
72
+ subMenu: [],
73
+ },
74
+ {
75
+ key: 'modules.gestaoServicos.configCentroCusto',
76
+ path: '/gestao-servicos/configuracoes/centros-custo',
77
+ title: 'Config. Centro Custo',
78
+ translateKey: 'nav.modules.gestaoServicos.configCentroCusto',
79
+ icon: 'settings',
80
+ type: NAV_ITEM_TYPE_ITEM,
81
+ authority: [ADMIN, USER],
82
+ subMenu: [],
83
+ },
84
+ {
85
+ key: 'modules.gestaoServicos.fornecedor',
86
+ path: '/gestao-servicos/fornecedor/contratos',
87
+ title: 'Visão Fornecedor',
88
+ translateKey: 'nav.modules.gestaoServicos.fornecedor',
89
+ icon: 'user',
90
+ type: NAV_ITEM_TYPE_ITEM,
91
+ authority: [ADMIN, USER],
92
+ subMenu: [],
93
+ },
94
+ {
95
+ key: 'modules.gestaoServicos.historico',
96
+ path: '/gestao-servicos/historico',
97
+ title: 'Histórico',
98
+ translateKey: 'nav.modules.gestaoServicos.historico',
99
+ icon: 'history',
100
+ type: NAV_ITEM_TYPE_ITEM,
101
+ authority: [ADMIN, USER],
102
+ subMenu: [],
103
+ },
104
+ ],
105
+ }
106
+
107
+ export default subMenuGestaoServicos
@@ -11,3 +11,4 @@ export { default as subMenuRacao } from './racao/submenu.racao';
11
11
  export { default as subMenuTemplate } from './template/submenu.template';
12
12
  export { default as subMenuPerformance } from './performance/submenu.performance';
13
13
  export { default as subMenuAtivos } from './ativos/submenu.ativos';
14
+ export { default as subMenuGestaoServicos } from './gestaoServicos/submenu.gestaoServicos';
@@ -0,0 +1,18 @@
1
+ import { NavigationTree } from '@/@types/navigation'
2
+ import { NAV_ITEM_TYPE_COLLAPSE, NAV_ITEM_TYPE_ITEM } from '@/constants/navigation.constant'
3
+ import contratoServicoSubmenu from './config/contratoServico.submenu'
4
+
5
+ const cadastrosSubmenu: NavigationTree = {
6
+ key: 'modules.gestaoServicos.cadastros',
7
+ path: '',
8
+ title: 'Cadastros',
9
+ translateKey: 'nav.modules.gestaoServicos.cadastros',
10
+ icon: '',
11
+ type: NAV_ITEM_TYPE_COLLAPSE,
12
+ authority: [],
13
+ subMenu: [
14
+ contratoServicoSubmenu,
15
+ ],
16
+ }
17
+
18
+ export default cadastrosSubmenu
@@ -0,0 +1,15 @@
1
+ import { NavigationTree } from '@/@types/navigation'
2
+ import { NAV_ITEM_TYPE_ITEM } from '@/constants/navigation.constant'
3
+
4
+ const contratoServicoSubmenu: NavigationTree = {
5
+ key: 'modules.gestaoServicos.contratoServico',
6
+ path: '/gestao-servicos/contratos',
7
+ title: 'Contratos',
8
+ translateKey: 'nav.modules.gestaoServicos.contratoServico',
9
+ icon: 'contratoServico',
10
+ type: NAV_ITEM_TYPE_ITEM,
11
+ authority: [],
12
+ subMenu: [],
13
+ }
14
+
15
+ export default contratoServicoSubmenu
@@ -0,0 +1,17 @@
1
+ import { NavigationTree } from '@/@types/navigation'
2
+ import { NAV_ITEM_TYPE_ITEM } from '@/constants/navigation.constant'
3
+ import { ADMIN } from '@/constants/roles.constant'
4
+
5
+ const metaSetorialPorCcPprSubmenu: NavigationTree = {
6
+ key: 'modules.performance.ppr.metaSetorialPorCc',
7
+ path: '/performance/ppr/meta-setorial-por-cc',
8
+ title: 'Meta Setorial por CC',
9
+ translateKey: 'nav.modules.performance.ppr.metaSetorialPorCc.title',
10
+ icon: '',
11
+ type: NAV_ITEM_TYPE_ITEM,
12
+ forceShowTitle: true,
13
+ authority: [ADMIN],
14
+ subMenu: [],
15
+ }
16
+
17
+ export default metaSetorialPorCcPprSubmenu
@@ -4,6 +4,7 @@ import { ADMIN } from '@/constants/roles.constant'
4
4
  import aberturaAnoPprSubmenu from './aberturaAnoPpr.submenu'
5
5
  import metaGlobalPprSubmenu from './metaGlobalPpr.submenu'
6
6
  import metaSetorialGeralPprSubmenu from './metaSetorialGeralPpr.submenu'
7
+ import metaSetorialPorCcPprSubmenu from './metaSetorialPorCcPpr.submenu'
7
8
 
8
9
  const pprSubmenu: NavigationTree = {
9
10
  key: 'modules.performance.ppr',
@@ -17,6 +18,7 @@ const pprSubmenu: NavigationTree = {
17
18
  aberturaAnoPprSubmenu,
18
19
  metaGlobalPprSubmenu,
19
20
  metaSetorialGeralPprSubmenu,
21
+ metaSetorialPorCcPprSubmenu,
20
22
  ],
21
23
  }
22
24
 
@@ -7,6 +7,7 @@ export * from './http';
7
7
  export {
8
8
  getDefaultQueryParams,
9
9
  buildQueryString,
10
+ buildQueryStringRepeated,
10
11
  generateQueryParams,
11
12
  getBaseTableParams
12
13
  } from './query';