@orbe-agro/client-core 5.6.160 → 5.6.162

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 (132) 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/@ecme/locales/lang/ptBR/nav.js +2 -0
  5. package/dist/@ecme/locales/lang/ptBR/nav.js.map +1 -1
  6. package/dist/@types/@ecme/locales/lang/ptBR/nav.d.ts.map +1 -1
  7. package/dist/@types/base/@types/api/request/originacao/TLiquidarContratoRequest.d.ts +1 -0
  8. package/dist/@types/base/@types/api/request/originacao/TLiquidarContratoRequest.d.ts.map +1 -1
  9. package/dist/@types/base/@types/api/request/originacao/TSimularRoyaltiesRequest.d.ts +1 -0
  10. package/dist/@types/base/@types/api/request/originacao/TSimularRoyaltiesRequest.d.ts.map +1 -1
  11. package/dist/@types/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.d.ts +5 -0
  12. package/dist/@types/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.d.ts.map +1 -0
  13. package/dist/@types/base/@types/api/response/originacao/TProcessoFiscalResponse.d.ts +1 -0
  14. package/dist/@types/base/@types/api/response/originacao/TProcessoFiscalResponse.d.ts.map +1 -1
  15. package/dist/@types/base/@types/filters/index.d.ts +2 -0
  16. package/dist/@types/base/@types/filters/index.d.ts.map +1 -1
  17. package/dist/@types/base/@types/models/performance/ppr.d.ts +69 -0
  18. package/dist/@types/base/@types/models/performance/ppr.d.ts.map +1 -1
  19. package/dist/@types/base/components/filters/DynamicFilterField.d.ts.map +1 -1
  20. package/dist/@types/base/components/filters/DynamicListTableFilter.d.ts +37 -0
  21. package/dist/@types/base/components/filters/DynamicListTableFilter.d.ts.map +1 -0
  22. package/dist/@types/base/components/filters/index.d.ts +1 -0
  23. package/dist/@types/base/components/filters/index.d.ts.map +1 -1
  24. package/dist/@types/base/configs/endpoints.config/compras/compras.d.ts +4 -0
  25. package/dist/@types/base/configs/endpoints.config/compras/compras.d.ts.map +1 -1
  26. package/dist/@types/base/configs/endpoints.config/compras/config/ordemCompra.d.ts +4 -0
  27. package/dist/@types/base/configs/endpoints.config/compras/config/ordemCompra.d.ts.map +1 -1
  28. package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts +11 -1
  29. package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts.map +1 -1
  30. package/dist/@types/base/configs/endpoints.config/originacao/config/cockpitFiscal.d.ts +1 -0
  31. package/dist/@types/base/configs/endpoints.config/originacao/config/cockpitFiscal.d.ts.map +1 -1
  32. package/dist/@types/base/configs/endpoints.config/originacao/config/processoFiscal.d.ts +3 -0
  33. package/dist/@types/base/configs/endpoints.config/originacao/config/processoFiscal.d.ts.map +1 -1
  34. package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts +1 -1
  35. package/dist/@types/base/configs/endpoints.config/originacao/config/saldoTicket.d.ts.map +1 -1
  36. package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts +5 -1
  37. package/dist/@types/base/configs/endpoints.config/originacao/originacao.d.ts.map +1 -1
  38. package/dist/@types/base/configs/endpoints.config/performance/config/ppr.d.ts +2 -0
  39. package/dist/@types/base/configs/endpoints.config/performance/config/ppr.d.ts.map +1 -1
  40. package/dist/@types/base/configs/endpoints.config/performance/performance.d.ts +2 -0
  41. package/dist/@types/base/configs/endpoints.config/performance/performance.d.ts.map +1 -1
  42. package/dist/@types/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.d.ts +4 -0
  43. package/dist/@types/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.d.ts.map +1 -0
  44. package/dist/@types/base/configs/navigation.config/submenu/performance/config/ppr.submenu.d.ts.map +1 -1
  45. package/dist/@types/base/services/index.d.ts +1 -1
  46. package/dist/@types/base/services/index.d.ts.map +1 -1
  47. package/dist/@types/base/services/modules/compras/ordemCompra/OrdemCompraService.d.ts +4 -0
  48. package/dist/@types/base/services/modules/compras/ordemCompra/OrdemCompraService.d.ts.map +1 -1
  49. package/dist/@types/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.d.ts +2 -0
  50. package/dist/@types/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.d.ts.map +1 -1
  51. package/dist/@types/base/services/modules/originacao/processoFiscal/processoFiscalService.d.ts +8 -0
  52. package/dist/@types/base/services/modules/originacao/processoFiscal/processoFiscalService.d.ts.map +1 -1
  53. package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts +1 -1
  54. package/dist/@types/base/services/modules/originacao/saldoTicket/saldoTicketService.d.ts.map +1 -1
  55. package/dist/@types/base/services/modules/performance/PerformanceService.d.ts +6 -1
  56. package/dist/@types/base/services/modules/performance/PerformanceService.d.ts.map +1 -1
  57. package/dist/@types/base/services/query.d.ts +15 -0
  58. package/dist/@types/base/services/query.d.ts.map +1 -1
  59. package/dist/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.js +2 -0
  60. package/dist/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.js.map +1 -0
  61. package/dist/base/assets/styles/init.css +7 -0
  62. package/dist/base/components/filters/DynamicFilterField.js +49 -19
  63. package/dist/base/components/filters/DynamicFilterField.js.map +1 -1
  64. package/dist/base/components/filters/DynamicListTableFilter.js +116 -0
  65. package/dist/base/components/filters/DynamicListTableFilter.js.map +1 -0
  66. package/dist/base/components/filters/index.js +3 -1
  67. package/dist/base/components/filters/index.js.map +1 -1
  68. package/dist/base/components/index.js +8 -6
  69. package/dist/base/components/index.js.map +1 -1
  70. package/dist/base/configs/endpoints.config/compras/config/ordemCompra.js +2 -1
  71. package/dist/base/configs/endpoints.config/compras/config/ordemCompra.js.map +1 -1
  72. package/dist/base/configs/endpoints.config/originacao/config/cockpitFiscal.js +2 -1
  73. package/dist/base/configs/endpoints.config/originacao/config/cockpitFiscal.js.map +1 -1
  74. package/dist/base/configs/endpoints.config/originacao/config/processoFiscal.js +4 -1
  75. package/dist/base/configs/endpoints.config/originacao/config/processoFiscal.js.map +1 -1
  76. package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js +1 -1
  77. package/dist/base/configs/endpoints.config/originacao/config/saldoTicket.js.map +1 -1
  78. package/dist/base/configs/endpoints.config/performance/config/ppr.js +3 -1
  79. package/dist/base/configs/endpoints.config/performance/config/ppr.js.map +1 -1
  80. package/dist/base/configs/navigation.config/modules.submenu/flux/submenu.flux.js +2 -2
  81. package/dist/base/configs/navigation.config/modules.submenu/flux/submenu.flux.js.map +1 -1
  82. package/dist/base/configs/navigation.config/modules.submenu/orcamento/submenu.orcamento.js +2 -2
  83. package/dist/base/configs/navigation.config/modules.submenu/orcamento/submenu.orcamento.js.map +1 -1
  84. package/dist/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.js +17 -0
  85. package/dist/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.js.map +1 -0
  86. package/dist/base/configs/navigation.config/submenu/performance/config/ppr.submenu.js +3 -1
  87. package/dist/base/configs/navigation.config/submenu/performance/config/ppr.submenu.js.map +1 -1
  88. package/dist/base/index.js +236 -227
  89. package/dist/base/index.js.map +1 -1
  90. package/dist/base/services/index.js +10 -3
  91. package/dist/base/services/modules/compras/index.js +2 -1
  92. package/dist/base/services/modules/compras/ordemCompra/OrdemCompraService.js +8 -0
  93. package/dist/base/services/modules/compras/ordemCompra/OrdemCompraService.js.map +1 -1
  94. package/dist/base/services/modules/index.js +8 -2
  95. package/dist/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.js +8 -1
  96. package/dist/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.js.map +1 -1
  97. package/dist/base/services/modules/originacao/processoFiscal/processoFiscalService.js +23 -0
  98. package/dist/base/services/modules/originacao/processoFiscal/processoFiscalService.js.map +1 -1
  99. package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js +2 -2
  100. package/dist/base/services/modules/originacao/saldoTicket/saldoTicketService.js.map +1 -1
  101. package/dist/base/services/modules/performance/PerformanceService.js +38 -0
  102. package/dist/base/services/modules/performance/PerformanceService.js.map +1 -1
  103. package/dist/base/services/modules/performance/index.js +6 -1
  104. package/dist/base/services/query.js +26 -0
  105. package/dist/base/services/query.js.map +1 -1
  106. package/lib/@ecme/locales/lang/ptBR/nav.ts +2 -0
  107. package/lib/base/@types/api/request/originacao/TLiquidarContratoRequest.ts +1 -0
  108. package/lib/base/@types/api/request/originacao/TSimularRoyaltiesRequest.ts +1 -0
  109. package/lib/base/@types/api/request/originacao/TUpdateProcessoFiscalRequest.ts +5 -0
  110. package/lib/base/@types/api/response/originacao/TProcessoFiscalResponse.ts +1 -0
  111. package/lib/base/@types/filters/index.ts +2 -0
  112. package/lib/base/@types/models/performance/ppr.ts +74 -0
  113. package/lib/base/components/filters/DynamicFilterField.tsx +51 -20
  114. package/lib/base/components/filters/DynamicListTableFilter.tsx +180 -0
  115. package/lib/base/components/filters/index.ts +1 -0
  116. package/lib/base/configs/endpoints.config/compras/config/ordemCompra.ts +1 -0
  117. package/lib/base/configs/endpoints.config/originacao/config/cockpitFiscal.ts +1 -0
  118. package/lib/base/configs/endpoints.config/originacao/config/processoFiscal.ts +3 -0
  119. package/lib/base/configs/endpoints.config/originacao/config/saldoTicket.ts +1 -1
  120. package/lib/base/configs/endpoints.config/performance/config/ppr.ts +2 -0
  121. package/lib/base/configs/navigation.config/modules.submenu/flux/submenu.flux.ts +2 -2
  122. package/lib/base/configs/navigation.config/modules.submenu/orcamento/submenu.orcamento.ts +2 -2
  123. package/lib/base/configs/navigation.config/submenu/performance/config/metaSetorialPorCcPpr.submenu.ts +17 -0
  124. package/lib/base/configs/navigation.config/submenu/performance/config/ppr.submenu.ts +2 -0
  125. package/lib/base/services/index.ts +1 -0
  126. package/lib/base/services/modules/compras/ordemCompra/OrdemCompraService.ts +8 -0
  127. package/lib/base/services/modules/originacao/cockpitFiscal/cockpitFiscalService.ts +8 -0
  128. package/lib/base/services/modules/originacao/processoFiscal/processoFiscalService.ts +25 -0
  129. package/lib/base/services/modules/originacao/saldoTicket/saldoTicketService.ts +2 -2
  130. package/lib/base/services/modules/performance/PerformanceService.ts +42 -0
  131. package/lib/base/services/query.ts +49 -0
  132. package/package.json +1 -1
@@ -69,6 +69,8 @@ export interface ILookupComponentProps {
69
69
  /** Label vindo dos metadados do backend */
70
70
  label: string
71
71
  disabled?: boolean
72
+ /** Quando true, o componente deve permitir seleção múltipla */
73
+ multiSelect?: boolean
72
74
  }
73
75
 
74
76
  /**
@@ -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'
@@ -6,6 +6,7 @@ const ordemCompra = {
6
6
  update: { endpoint: ORDEM_COMPRA_BASE_URL, httpMethod: 'put' },
7
7
  executeAcaoOrdemCompra: { endpoint: `${ORDEM_COMPRA_BASE_URL}/execute-acao`, httpMethod: 'post' },
8
8
  findOrdensComprasNfeByIdsFornecedores: { endpoint: `${ORDEM_COMPRA_BASE_URL}/find-ordens-compras-by-ids-fornecedores`, httpMethod: 'post' },
9
+ editarValor: { endpoint: ORDEM_COMPRA_BASE_URL, httpMethod: 'patch' },
9
10
  }
10
11
 
11
12
  export default ordemCompra
@@ -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;
@@ -5,10 +5,10 @@ import fluxSubmenu from '../../submenu/flux/flux.submenu'
5
5
 
6
6
  const subMenuFlux: NavigationTree =
7
7
  {
8
- key: 'modules.flux.cadastros',
8
+ key: 'modules.flux',
9
9
  path: '',
10
10
  title: 'Flux',
11
- translateKey: 'nav.modules.flux.cadastros.title',
11
+ translateKey: 'nav.modules.flux.title',
12
12
  icon: 'form',
13
13
  type: NAV_ITEM_TYPE_COLLAPSE,
14
14
  authority: [ADMIN],
@@ -5,10 +5,10 @@ import orcamentoSubmenu from '../../submenu/orcamento/orcamento.submenu'
5
5
 
6
6
  const subMenuOrcamento: NavigationTree =
7
7
  {
8
- key: 'modules.orcamento.cadastros',
8
+ key: 'modules.orcamento',
9
9
  path: '',
10
10
  title: 'Orçamento',
11
- translateKey: 'nav.modules.orcamento.cadastros.title',
11
+ translateKey: 'nav.modules.orcamento.title',
12
12
  icon: '',
13
13
  type: NAV_ITEM_TYPE_COLLAPSE,
14
14
  authority: [ADMIN],
@@ -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';
@@ -34,6 +34,14 @@ export async function apiExecuteAcaoOrdemCompra(data) {
34
34
  })
35
35
  }
36
36
 
37
+ export async function apiEditarValorOrdemCompra(id: number, itens: { idItem: number; valorUnitario: number }[]) {
38
+ return ApiService.fetchDataWithAxios<any>({
39
+ url: `${ORDEM_COMPRA_ENDPOINT.editarValor.endpoint}/${id}/valor`,
40
+ method: ORDEM_COMPRA_ENDPOINT.editarValor.httpMethod,
41
+ data: { itens },
42
+ })
43
+ }
44
+
37
45
  export async function apiFindOrdensComprasNfeByIdsFornecedores(data) {
38
46
  return ApiService.fetchDataWithAxios<any>({
39
47
  url: ORDEM_COMPRA_ENDPOINT.findOrdensComprasNfeByIdsFornecedores.endpoint,
@@ -2,6 +2,7 @@ import ApiService from "@/services/ApiService";
2
2
  import { TQueryResponse } from "@base/@types/api";
3
3
  import { TCockpitFiscalResponse } from "@base/@types/api/response/originacao/TCockpitFiscalResponse";
4
4
  import endpointNavigationConfig from "@base/configs/endpoints.config/endpoints.navigation";
5
+ import { IFilterFieldDescriptor } from "@base/@types/filters";
5
6
 
6
7
  const COCKPIT_FISCAL_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.cockpitFiscal;
7
8
 
@@ -10,4 +11,11 @@ export async function apiFindAllCockpitFiscal(params?: string) {
10
11
  url: COCKPIT_FISCAL_ORIGINACAO_ENDPOINT.findAll(params),
11
12
  method: "get",
12
13
  });
14
+ }
15
+
16
+ export async function apiFindCockpitFiscalFilterMetadata() {
17
+ return ApiService.fetchDataWithAxios<IFilterFieldDescriptor[]>({
18
+ url: COCKPIT_FISCAL_ORIGINACAO_ENDPOINT.filterMetadata,
19
+ method: "get",
20
+ });
13
21
  }
@@ -1,4 +1,6 @@
1
1
  import ApiService from "@/services/ApiService";
2
+ import { TProcessoFiscalResponse } from "@base/@types/api/response/originacao/TProcessoFiscalResponse";
3
+ import { TUpdateProcessoFiscalRequest } from "@base/@types/api/request/originacao/TUpdateProcessoFiscalRequest";
2
4
  import endpointNavigationConfig from "@base/configs/endpoints.config/endpoints.navigation";
3
5
 
4
6
  const PROCESSO_FISCAL_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.processoFiscal;
@@ -17,4 +19,27 @@ export async function apiGetNotaFiscal(url: string) {
17
19
  method: "get",
18
20
  responseType: "blob"
19
21
  });
22
+ }
23
+
24
+ export async function apiCreateProcessoFiscal(data: { contratoId: number; quantidade: number }) {
25
+ return ApiService.fetchDataWithAxios<void>({
26
+ url: PROCESSO_FISCAL_ORIGINACAO_ENDPOINT.create,
27
+ method: "post",
28
+ data,
29
+ });
30
+ }
31
+
32
+ export async function apiUpdateProcessoFiscal(id: string | number, data: TUpdateProcessoFiscalRequest) {
33
+ return ApiService.fetchDataWithAxios<void>({
34
+ url: PROCESSO_FISCAL_ORIGINACAO_ENDPOINT.update(String(id)),
35
+ method: "put",
36
+ data,
37
+ });
38
+ }
39
+
40
+ export async function apiListarProcessosFiscais(contratoId: string | number): Promise<TProcessoFiscalResponse[]> {
41
+ return ApiService.fetchDataWithAxios<TProcessoFiscalResponse[]>({
42
+ url: PROCESSO_FISCAL_ORIGINACAO_ENDPOINT.listByContrato(contratoId),
43
+ method: "get",
44
+ });
20
45
  }
@@ -11,9 +11,9 @@ import { IFilterFieldDescriptor } from "@base/@types/filters";
11
11
 
12
12
  const SALDO_TICKET_ORIGINACAO_ENDPOINT = endpointNavigationConfig.originacao.saldoTicket;
13
13
 
14
- export async function apiBuscarSaldoContrato(id: number | string) {
14
+ export async function apiBuscarSaldoContrato(id: number | string, processoFiscalId: number | string) {
15
15
  return ApiService.fetchDataWithAxios<TSaldoContratoResponse>({
16
- url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoContrato(String(id)),
16
+ url: SALDO_TICKET_ORIGINACAO_ENDPOINT.buscarSaldoContrato(String(id), processoFiscalId),
17
17
  method: "get",
18
18
  });
19
19
  }
@@ -9,11 +9,15 @@ import {
9
9
  TAnoPpr,
10
10
  TCreateIndicadorMetaGlobal,
11
11
  TCreateIndicadorMetaSetorialGeral,
12
+ TCreateIndicadorMetaSetorialPorCc,
12
13
  TFindMonitorIndicadorMetaGlobal,
13
14
  TFindMonitorIndicadorMetaSetorialGeral,
15
+ TFindMonitorIndicadorMetaSetorialPorCc,
14
16
  TIndicadorMetaGlobal,
15
17
  TIndicadorMetaSetorialGeral,
18
+ TIndicadorMetaSetorialPorCc,
16
19
  TParametroCcPpr,
20
+ TUpdateIndicadorMetaSetorialPorCc,
17
21
  TUpdateParametroCcStatusPpr,
18
22
  } from '@base/@types/models/performance/ppr'
19
23
  import { endpointsConfig } from '@base/configs'
@@ -324,3 +328,41 @@ export async function apiDeleteIndicadorMetaSetorialGeral(id: number) {
324
328
  })
325
329
  }
326
330
 
331
+ export async function apiGetIndicadoresMetaSetorialPorCc(body?: IFilterParams) {
332
+ return ApiService.fetchDataWithAxios<TQueryResponse<TFindMonitorIndicadorMetaSetorialPorCc>>({
333
+ url: endpointsConfig.performance.ppr.indicadoresMetaSetorialPorCcFindMonitor,
334
+ method: 'post',
335
+ data: body,
336
+ })
337
+ }
338
+
339
+ export async function apiGetIndicadorMetaSetorialPorCcById(id: number) {
340
+ return ApiService.fetchDataWithAxios<TIndicadorMetaSetorialPorCc>({
341
+ url: `${endpointsConfig.performance.ppr.indicadoresMetaSetorialPorCc}/${id}`,
342
+ method: 'get',
343
+ })
344
+ }
345
+
346
+ export async function apiCreateIndicadorMetaSetorialPorCc(data: TCreateIndicadorMetaSetorialPorCc) {
347
+ return ApiService.fetchDataWithAxios<TIndicadorMetaSetorialPorCc>({
348
+ url: endpointsConfig.performance.ppr.indicadoresMetaSetorialPorCc,
349
+ method: 'post',
350
+ data,
351
+ })
352
+ }
353
+
354
+ export async function apiUpdateIndicadorMetaSetorialPorCc(data: TUpdateIndicadorMetaSetorialPorCc) {
355
+ return ApiService.fetchDataWithAxios<TIndicadorMetaSetorialPorCc>({
356
+ url: endpointsConfig.performance.ppr.indicadoresMetaSetorialPorCc,
357
+ method: 'put',
358
+ data,
359
+ })
360
+ }
361
+
362
+ export async function apiDeleteIndicadorMetaSetorialPorCc(id: number) {
363
+ return ApiService.fetchDataWithAxios<void>({
364
+ url: `${endpointsConfig.performance.ppr.indicadoresMetaSetorialPorCc}/${id}`,
365
+ method: 'delete',
366
+ })
367
+ }
368
+