forlogic-core 1.7.2 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -873,6 +873,183 @@ KR1 50% dos indicadores de empreendimento e áreas de negócio atingindo a meta
873
873
 
874
874
  ---
875
875
 
876
+ ### 🔗 Enrichment de Múltiplos Campos de Usuário do Qualiex
877
+
878
+ O `forlogic-core` suporta enriquecimento automático de **múltiplos campos de ID de usuário** com dados do Qualiex (nome, email, username).
879
+
880
+ #### **Configuração Global**
881
+
882
+ Configure o enrichment uma vez na inicialização do app:
883
+
884
+ ```typescript
885
+ import { setQualiexConfig } from 'forlogic-core';
886
+
887
+ // Configuração básica (usa localStorage como fallback)
888
+ setQualiexConfig({
889
+ enableUserEnrichment: true,
890
+ enableUsersApi: true,
891
+ });
892
+
893
+ // Configuração avançada (recomendado)
894
+ setQualiexConfig({
895
+ enableUserEnrichment: true,
896
+ enableUsersApi: true,
897
+ getAccessToken: () => localStorage.getItem('qualiex_access_token'),
898
+ getCompanyId: () => localStorage.getItem('selectedUnitId'),
899
+ userNameFieldSuffix: '_name', // default
900
+ userEmailFieldSuffix: '_email', // default
901
+ userUsernameFieldSuffix: '_username', // default
902
+ });
903
+ ```
904
+
905
+ #### **Uso Básico: Lista de Campos de ID**
906
+
907
+ Use `userIdFields` para enriquecer múltiplos campos de ID automaticamente:
908
+
909
+ ```typescript
910
+ import { createSimpleService } from 'forlogic-core';
911
+
912
+ const { service, useCrudHook } = createSimpleService({
913
+ tableName: 'evaluations',
914
+ schemaName: 'performance',
915
+ entityName: 'Avaliação',
916
+ searchFields: ['title', 'description'],
917
+ enableQualiexEnrichment: true,
918
+
919
+ // ✅ Lista de campos de ID para enriquecer
920
+ userIdFields: ['target_user_id', 'evaluator_user_id'],
921
+ });
922
+ ```
923
+
924
+ **Resultado automático:**
925
+ - `target_user_id` → `target_user_name` (nome do usuário)
926
+ - `evaluator_user_id` → `evaluator_user_name` (nome do usuário)
927
+
928
+ #### **Uso Avançado: Mapeamento Customizado**
929
+
930
+ Use `userFieldsMapping` para controlar exatamente quais campos de saída criar:
931
+
932
+ ```typescript
933
+ const { service, useCrudHook } = createSimpleService({
934
+ tableName: 'evaluations',
935
+ entityName: 'Avaliação',
936
+ enableQualiexEnrichment: true,
937
+
938
+ // ✅ Mapeamento granular de campos
939
+ userFieldsMapping: [
940
+ {
941
+ idField: 'target_user_id',
942
+ nameField: 'avaliado_nome', // customizado
943
+ emailField: 'avaliado_email', // opcional
944
+ },
945
+ {
946
+ idField: 'evaluator_user_id',
947
+ nameField: 'avaliador_nome',
948
+ emailField: 'avaliador_email',
949
+ usernameField: 'avaliador_username', // opcional
950
+ },
951
+ ],
952
+ });
953
+ ```
954
+
955
+ **Resultado customizado:**
956
+ - `target_user_id` → `avaliado_nome`, `avaliado_email`
957
+ - `evaluator_user_id` → `avaliador_nome`, `avaliador_email`, `avaliador_username`
958
+
959
+ #### **Enrichment Manual (Casos Avançados)**
960
+
961
+ Para casos onde você precisa enriquecer dados fora do `createSimpleService`:
962
+
963
+ ```typescript
964
+ import { QualiexEnrichmentService } from 'forlogic-core';
965
+
966
+ // Enriquecer entidades manualmente
967
+ const enrichedData = await QualiexEnrichmentService.enrichWithUserData(entities, {
968
+ entityName: 'Avaliações',
969
+ userIdFields: ['target_user_id', 'evaluator_user_id'],
970
+ });
971
+
972
+ // Ou com mapeamento customizado
973
+ const enrichedData = await QualiexEnrichmentService.enrichWithUserData(entities, {
974
+ entityName: 'Avaliações',
975
+ userFieldsMapping: [
976
+ { idField: 'target_user_id', nameField: 'avaliado_nome' },
977
+ { idField: 'evaluator_user_id', nameField: 'avaliador_nome' },
978
+ ],
979
+ });
980
+ ```
981
+
982
+ #### **Utilitários de Derivação de Campos**
983
+
984
+ Use helpers para gerar nomes de campos de forma consistente:
985
+
986
+ ```typescript
987
+ import { deriveNameField, deriveEmailField } from 'forlogic-core';
988
+
989
+ deriveNameField('target_user_id'); // => "target_user_name"
990
+ deriveEmailField('evaluator_user_id'); // => "evaluator_user_email"
991
+ ```
992
+
993
+ #### **Retrocompatibilidade**
994
+
995
+ O comportamento legado (`id_user` → `responsible_name`) continua funcionando sem mudanças:
996
+
997
+ ```typescript
998
+ // Código antigo funciona normalmente
999
+ const { service } = createSimpleService({
1000
+ tableName: 'processes',
1001
+ entityName: 'Processo',
1002
+ enableQualiexEnrichment: true,
1003
+ // Automaticamente enriquece id_user -> responsible_name
1004
+ });
1005
+ ```
1006
+
1007
+ #### **Características**
1008
+
1009
+ ✅ **Cache inteligente**: Usuários Qualiex são cacheados por 5 minutos
1010
+ ✅ **Resiliência**: Falhas não quebram a UI (apenas logs no console)
1011
+ ✅ **Deduplicação**: IDs duplicados são buscados apenas uma vez
1012
+ ✅ **Não sobrescreve**: Campos já preenchidos não são alterados
1013
+ ✅ **Type-safe**: TypeScript valida configurações
1014
+ ✅ **Retrocompatível**: Projetos antigos continuam funcionando
1015
+
1016
+ #### **Boas Práticas**
1017
+
1018
+ ✅ **BOM**: Configurar `getAccessToken` e `getCompanyId` para evitar dependência de localStorage
1019
+
1020
+ ```typescript
1021
+ setQualiexConfig({
1022
+ enableUserEnrichment: true,
1023
+ getAccessToken: async () => {
1024
+ // Buscar token de forma segura (ex: context, Zustand, etc)
1025
+ return myAuthStore.getToken();
1026
+ },
1027
+ getCompanyId: () => myAppStore.getSelectedCompanyId(),
1028
+ });
1029
+ ```
1030
+
1031
+ ❌ **EVITAR**: Múltiplos campos apontando para o mesmo campo de saída
1032
+
1033
+ ```typescript
1034
+ // ❌ Conflito: ambos escrevem em "user_name"
1035
+ userFieldsMapping: [
1036
+ { idField: 'created_by_id', nameField: 'user_name' },
1037
+ { idField: 'updated_by_id', nameField: 'user_name' }, // Conflito!
1038
+ ]
1039
+ ```
1040
+
1041
+ ✅ **BOM**: Usar sufixos distintos
1042
+
1043
+ ```typescript
1044
+ // ✅ Campos de saída únicos
1045
+ userFieldsMapping: [
1046
+ { idField: 'created_by_id', nameField: 'created_by_name' },
1047
+ { idField: 'updated_by_id', nameField: 'updated_by_name' },
1048
+ ]
1049
+ ```
1050
+
1051
+ ---
1052
+
876
1053
  ### 🏢 Sistema de Gestores de Locais (Qualiex)
877
1054
 
878
1055
  Componentes para gerenciamento de gestores e membros de locais/sublocais integrados com a API Qualiex.
package/dist/README.md CHANGED
@@ -873,6 +873,183 @@ KR1 50% dos indicadores de empreendimento e áreas de negócio atingindo a meta
873
873
 
874
874
  ---
875
875
 
876
+ ### 🔗 Enrichment de Múltiplos Campos de Usuário do Qualiex
877
+
878
+ O `forlogic-core` suporta enriquecimento automático de **múltiplos campos de ID de usuário** com dados do Qualiex (nome, email, username).
879
+
880
+ #### **Configuração Global**
881
+
882
+ Configure o enrichment uma vez na inicialização do app:
883
+
884
+ ```typescript
885
+ import { setQualiexConfig } from 'forlogic-core';
886
+
887
+ // Configuração básica (usa localStorage como fallback)
888
+ setQualiexConfig({
889
+ enableUserEnrichment: true,
890
+ enableUsersApi: true,
891
+ });
892
+
893
+ // Configuração avançada (recomendado)
894
+ setQualiexConfig({
895
+ enableUserEnrichment: true,
896
+ enableUsersApi: true,
897
+ getAccessToken: () => localStorage.getItem('qualiex_access_token'),
898
+ getCompanyId: () => localStorage.getItem('selectedUnitId'),
899
+ userNameFieldSuffix: '_name', // default
900
+ userEmailFieldSuffix: '_email', // default
901
+ userUsernameFieldSuffix: '_username', // default
902
+ });
903
+ ```
904
+
905
+ #### **Uso Básico: Lista de Campos de ID**
906
+
907
+ Use `userIdFields` para enriquecer múltiplos campos de ID automaticamente:
908
+
909
+ ```typescript
910
+ import { createSimpleService } from 'forlogic-core';
911
+
912
+ const { service, useCrudHook } = createSimpleService({
913
+ tableName: 'evaluations',
914
+ schemaName: 'performance',
915
+ entityName: 'Avaliação',
916
+ searchFields: ['title', 'description'],
917
+ enableQualiexEnrichment: true,
918
+
919
+ // ✅ Lista de campos de ID para enriquecer
920
+ userIdFields: ['target_user_id', 'evaluator_user_id'],
921
+ });
922
+ ```
923
+
924
+ **Resultado automático:**
925
+ - `target_user_id` → `target_user_name` (nome do usuário)
926
+ - `evaluator_user_id` → `evaluator_user_name` (nome do usuário)
927
+
928
+ #### **Uso Avançado: Mapeamento Customizado**
929
+
930
+ Use `userFieldsMapping` para controlar exatamente quais campos de saída criar:
931
+
932
+ ```typescript
933
+ const { service, useCrudHook } = createSimpleService({
934
+ tableName: 'evaluations',
935
+ entityName: 'Avaliação',
936
+ enableQualiexEnrichment: true,
937
+
938
+ // ✅ Mapeamento granular de campos
939
+ userFieldsMapping: [
940
+ {
941
+ idField: 'target_user_id',
942
+ nameField: 'avaliado_nome', // customizado
943
+ emailField: 'avaliado_email', // opcional
944
+ },
945
+ {
946
+ idField: 'evaluator_user_id',
947
+ nameField: 'avaliador_nome',
948
+ emailField: 'avaliador_email',
949
+ usernameField: 'avaliador_username', // opcional
950
+ },
951
+ ],
952
+ });
953
+ ```
954
+
955
+ **Resultado customizado:**
956
+ - `target_user_id` → `avaliado_nome`, `avaliado_email`
957
+ - `evaluator_user_id` → `avaliador_nome`, `avaliador_email`, `avaliador_username`
958
+
959
+ #### **Enrichment Manual (Casos Avançados)**
960
+
961
+ Para casos onde você precisa enriquecer dados fora do `createSimpleService`:
962
+
963
+ ```typescript
964
+ import { QualiexEnrichmentService } from 'forlogic-core';
965
+
966
+ // Enriquecer entidades manualmente
967
+ const enrichedData = await QualiexEnrichmentService.enrichWithUserData(entities, {
968
+ entityName: 'Avaliações',
969
+ userIdFields: ['target_user_id', 'evaluator_user_id'],
970
+ });
971
+
972
+ // Ou com mapeamento customizado
973
+ const enrichedData = await QualiexEnrichmentService.enrichWithUserData(entities, {
974
+ entityName: 'Avaliações',
975
+ userFieldsMapping: [
976
+ { idField: 'target_user_id', nameField: 'avaliado_nome' },
977
+ { idField: 'evaluator_user_id', nameField: 'avaliador_nome' },
978
+ ],
979
+ });
980
+ ```
981
+
982
+ #### **Utilitários de Derivação de Campos**
983
+
984
+ Use helpers para gerar nomes de campos de forma consistente:
985
+
986
+ ```typescript
987
+ import { deriveNameField, deriveEmailField } from 'forlogic-core';
988
+
989
+ deriveNameField('target_user_id'); // => "target_user_name"
990
+ deriveEmailField('evaluator_user_id'); // => "evaluator_user_email"
991
+ ```
992
+
993
+ #### **Retrocompatibilidade**
994
+
995
+ O comportamento legado (`id_user` → `responsible_name`) continua funcionando sem mudanças:
996
+
997
+ ```typescript
998
+ // Código antigo funciona normalmente
999
+ const { service } = createSimpleService({
1000
+ tableName: 'processes',
1001
+ entityName: 'Processo',
1002
+ enableQualiexEnrichment: true,
1003
+ // Automaticamente enriquece id_user -> responsible_name
1004
+ });
1005
+ ```
1006
+
1007
+ #### **Características**
1008
+
1009
+ ✅ **Cache inteligente**: Usuários Qualiex são cacheados por 5 minutos
1010
+ ✅ **Resiliência**: Falhas não quebram a UI (apenas logs no console)
1011
+ ✅ **Deduplicação**: IDs duplicados são buscados apenas uma vez
1012
+ ✅ **Não sobrescreve**: Campos já preenchidos não são alterados
1013
+ ✅ **Type-safe**: TypeScript valida configurações
1014
+ ✅ **Retrocompatível**: Projetos antigos continuam funcionando
1015
+
1016
+ #### **Boas Práticas**
1017
+
1018
+ ✅ **BOM**: Configurar `getAccessToken` e `getCompanyId` para evitar dependência de localStorage
1019
+
1020
+ ```typescript
1021
+ setQualiexConfig({
1022
+ enableUserEnrichment: true,
1023
+ getAccessToken: async () => {
1024
+ // Buscar token de forma segura (ex: context, Zustand, etc)
1025
+ return myAuthStore.getToken();
1026
+ },
1027
+ getCompanyId: () => myAppStore.getSelectedCompanyId(),
1028
+ });
1029
+ ```
1030
+
1031
+ ❌ **EVITAR**: Múltiplos campos apontando para o mesmo campo de saída
1032
+
1033
+ ```typescript
1034
+ // ❌ Conflito: ambos escrevem em "user_name"
1035
+ userFieldsMapping: [
1036
+ { idField: 'created_by_id', nameField: 'user_name' },
1037
+ { idField: 'updated_by_id', nameField: 'user_name' }, // Conflito!
1038
+ ]
1039
+ ```
1040
+
1041
+ ✅ **BOM**: Usar sufixos distintos
1042
+
1043
+ ```typescript
1044
+ // ✅ Campos de saída únicos
1045
+ userFieldsMapping: [
1046
+ { idField: 'created_by_id', nameField: 'created_by_name' },
1047
+ { idField: 'updated_by_id', nameField: 'updated_by_name' },
1048
+ ]
1049
+ ```
1050
+
1051
+ ---
1052
+
876
1053
  ### 🏢 Sistema de Gestores de Locais (Qualiex)
877
1054
 
878
1055
  Componentes para gerenciamento de gestores e membros de locais/sublocais integrados com a API Qualiex.