@controleonline/ui-customers 1.0.81
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/.github/agents/developer.agent.md +30 -0
- package/.github/agents/devops.agent.md +30 -0
- package/.github/agents/qa.agent.md +30 -0
- package/.github/agents/security.agent.md +30 -0
- package/.scrutinizer.yml +20 -0
- package/AGENTS.md +50 -0
- package/FUNDING.yml +1 -0
- package/README.md +23 -0
- package/docs/technical/Client-Details-Franquia-Filial.md +18 -0
- package/docs/technical/Client-Details-People-Name-Case.md +103 -0
- package/docs/technical/Cliente-Vendedor-Vinculo-e-Permissoes.md +152 -0
- package/docs/wiki.md +1 -0
- package/package.json +32 -0
- package/scripts/validate-wiki-pointer.cjs +13 -0
- package/src/react/components/tabs/AddressesTab.js +494 -0
- package/src/react/components/tabs/CategoriesTab.js +196 -0
- package/src/react/components/tabs/ClassificationChips.js +494 -0
- package/src/react/components/tabs/ContactTab.js +621 -0
- package/src/react/components/tabs/ContactTab.styles.js +119 -0
- package/src/react/components/tabs/ContractsTab.js +13 -0
- package/src/react/components/tabs/DocumentsTab.js +463 -0
- package/src/react/components/tabs/DocumentsTab.styles.js +133 -0
- package/src/react/components/tabs/EmployeeContactRow.js +83 -0
- package/src/react/components/tabs/EmployeesTab.js +454 -0
- package/src/react/components/tabs/EmployeesTab.styles.js +172 -0
- package/src/react/components/tabs/FiscalTab.js +6 -0
- package/src/react/components/tabs/FranchiseCommissionSection.js +307 -0
- package/src/react/components/tabs/FranchiseLinksManageModal.js +215 -0
- package/src/react/components/tabs/FranchiseLinksTab.js +282 -0
- package/src/react/components/tabs/GeneralTab.js +466 -0
- package/src/react/components/tabs/GeneralTab.styles.js +101 -0
- package/src/react/components/tabs/MediaTab.js +356 -0
- package/src/react/components/tabs/PeopleCategoriesPanel.js +601 -0
- package/src/react/components/tabs/ProductsTab.js +236 -0
- package/src/react/components/tabs/ProductsTab.styles.js +143 -0
- package/src/react/components/tabs/SalesmanCommissionBlock.js +120 -0
- package/src/react/components/tabs/SalesmanManageModal.js +208 -0
- package/src/react/components/tabs/SalesmanTab.js +436 -0
- package/src/react/components/tabs/SalesmanTab.styles.js +4 -0
- package/src/react/components/tabs/UserApiKeyModal.js +90 -0
- package/src/react/components/tabs/UserFormModal.js +301 -0
- package/src/react/components/tabs/UsersTab.js +426 -0
- package/src/react/components/tabs/UsersTab.styles.js +283 -0
- package/src/react/components/tabs/UsersTab.styles.test.js +42 -0
- package/src/react/components/tabs/contactMutationMessage.js +18 -0
- package/src/react/components/tabs/employeeContacts.js +214 -0
- package/src/react/components/tabs/employeeUnlink.js +68 -0
- package/src/react/components/tabs/employeesTabHelpers.js +227 -0
- package/src/react/components/tabs/franchiseCommissionHelpers.js +134 -0
- package/src/react/components/tabs/franchiseLinksTab.helpers.js +247 -0
- package/src/react/components/tabs/generalTabHelpers.js +120 -0
- package/src/react/components/tabs/salesmanTab.helpers.js +114 -0
- package/src/react/components/tabs/salesmanTabHelpers.js +173 -0
- package/src/react/components/tabs/salesmanTabMedia.js +55 -0
- package/src/react/components/tabs/salesmanTabSession.js +39 -0
- package/src/react/components/tabs/useEmployeeUnlink.js +58 -0
- package/src/react/components/tabs/useFranchiseLinksManage.js +215 -0
- package/src/react/components/tabs/useSalesmanManage.js +222 -0
- package/src/react/components/tabs/usersTabHelpers.js +221 -0
- package/src/react/domain/productSupplierFlow.js +37 -0
- package/src/react/index.js +4 -0
- package/src/react/pages/ClientDetailsSkeleton.js +84 -0
- package/src/react/pages/clientDetailsHelpers.js +17 -0
- package/src/react/pages/clients.js +27 -0
- package/src/react/pages/details.js +529 -0
- package/src/react/pages/details.page.styles.js +105 -0
- package/src/react/pages/details.styles.js +15 -0
- package/src/react/pages/employees.js +69 -0
- package/src/react/pages/franchisees.js +30 -0
- package/src/react/pages/prospects.js +21 -0
- package/src/react/pages/provider.js +21 -0
- package/src/react/router/routes.js +104 -0
- package/src/react/styles/details.js +571 -0
- package/src/store/people_categories/index.js +72 -0
- package/src/tests/browser/manager/client-details-create-user.spec.js +321 -0
- package/src/tests/browser/manager/client-details-employee-unlink.spec.js +215 -0
- package/src/tests/browser/manager/client-details-employees-refresh.spec.js +271 -0
- package/src/tests/browser/manager/client-details-enable.spec.js +241 -0
- package/src/tests/browser/manager/client-details-fiscal-tabs.spec.js +410 -0
- package/src/tests/browser/manager/client-details-franchise-commission.spec.js +318 -0
- package/src/tests/browser/manager/client-details-franchise-links.spec.js +365 -0
- package/src/tests/browser/manager/client-details-media.spec.js +405 -0
- package/src/tests/browser/manager/client-details-relationships.spec.js +313 -0
- package/src/tests/browser/manager/client-details-salesman-commission.spec.js +291 -0
- package/src/tests/browser/manager/client-details-salesman-manage.spec.js +448 -0
- package/src/tests/react/components/tabs/contactMutationMessage.test.js +25 -0
- package/src/tests/react/components/tabs/employeeContacts.test.js +266 -0
- package/src/tests/react/components/tabs/employeeUnlink.test.js +67 -0
- package/src/tests/react/components/tabs/employeesTabHelpers.media.test.js +78 -0
- package/src/tests/react/components/tabs/employeesTabHelpers.test.js +64 -0
- package/src/tests/react/components/tabs/fiscalTabContract.test.mjs +29 -0
- package/src/tests/react/components/tabs/franchiseCommissionHelpers.test.js +128 -0
- package/src/tests/react/components/tabs/franchiseLinksTab.helpers.test.mjs +166 -0
- package/src/tests/react/components/tabs/generalTabHelpers.test.js +130 -0
- package/src/tests/react/components/tabs/peopleMediaTabs.test.js +322 -0
- package/src/tests/react/components/tabs/salesmanTab.helpers.test.mjs +75 -0
- package/src/tests/react/components/tabs/salesmanTabHelpers.test.js +142 -0
- package/src/tests/react/components/tabs/salesmanTabHelpers.test.mjs +92 -0
- package/src/tests/react/components/tabs/usersTabHelpers.test.js +59 -0
- package/src/tests/react/domain/productSupplierFlow.test.mjs +55 -0
- package/src/tests/react/pages/clientDetailsHelpers.test.js +98 -0
- package/src/tests/react/pages/employees.test.js +44 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Developer
|
|
3
|
+
description: Executor autônomo de issues do repositório ControleOnline/ui-customers, com fonte canônica centralizada no cto-mcp.
|
|
4
|
+
target: github-copilot
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Fonte canônica
|
|
8
|
+
|
|
9
|
+
Este wrapper é intencionalmente fino. Antes de agir, leia e siga, nesta ordem:
|
|
10
|
+
|
|
11
|
+
1. `https://github.com/ControleOnline/cto-mcp/blob/master/agents/agent/developer/agent.md`
|
|
12
|
+
|
|
13
|
+
Esse arquivo central referencia as regras-base de `automation/` no `cto-mcp`. Se este wrapper local divergir do conteúdo canônico do `cto-mcp`, prefira o `cto-mcp`, salvo quando o estado real deste repositório exigir adaptação operacional explícita.
|
|
14
|
+
|
|
15
|
+
## Contexto local
|
|
16
|
+
|
|
17
|
+
Você está operando no repositório `ControleOnline/ui-customers`.
|
|
18
|
+
|
|
19
|
+
Você conhece o ecossistema completo da ControleOnline. Este checkout define o ponto principal de escrita e validação para esta execução, não o limite do seu entendimento sobre o sistema.
|
|
20
|
+
|
|
21
|
+
- Checkout local: `app-community/modules/controleonline/ui-customers`
|
|
22
|
+
- Tipo: submódulo de app-community
|
|
23
|
+
- Família: frontend
|
|
24
|
+
- Branch base operacional: `master`
|
|
25
|
+
- Alvo preferencial de PR: `dev`
|
|
26
|
+
- `AGENTS.md` local: presente
|
|
27
|
+
|
|
28
|
+
Leia o `AGENTS.md` mais próximo antes de editar código. Se esta alteração tocar apenas o repositório atual, trabalhe aqui; se também exigir atualização do superprojeto que consome este repositório, registre ou entregue a composição necessária sem perder a separação de ownership.
|
|
29
|
+
|
|
30
|
+
_Arquivo gerado por `cto-mcp/scripts/sync-copilot-agents.mjs`._
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: DevOps
|
|
3
|
+
description: Operador de fluxo e automações do repositório ControleOnline/ui-customers, com fonte canônica centralizada no cto-mcp.
|
|
4
|
+
target: github-copilot
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Fonte canônica
|
|
8
|
+
|
|
9
|
+
Este wrapper é intencionalmente fino. Antes de agir, leia e siga, nesta ordem:
|
|
10
|
+
|
|
11
|
+
1. `https://github.com/ControleOnline/cto-mcp/blob/master/agents/agent/devops/agent.md`
|
|
12
|
+
|
|
13
|
+
Esse arquivo central referencia as regras-base de `automation/` no `cto-mcp`. Se este wrapper local divergir do conteúdo canônico do `cto-mcp`, prefira o `cto-mcp`, salvo quando o estado real deste repositório exigir adaptação operacional explícita.
|
|
14
|
+
|
|
15
|
+
## Contexto local
|
|
16
|
+
|
|
17
|
+
Você está operando no repositório `ControleOnline/ui-customers`.
|
|
18
|
+
|
|
19
|
+
Você conhece o ecossistema completo da ControleOnline. Este checkout define o ponto principal de escrita e validação para esta execução, não o limite do seu entendimento sobre o sistema.
|
|
20
|
+
|
|
21
|
+
- Checkout local: `app-community/modules/controleonline/ui-customers`
|
|
22
|
+
- Tipo: submódulo de app-community
|
|
23
|
+
- Família: frontend
|
|
24
|
+
- Branch base operacional: `master`
|
|
25
|
+
- Alvo preferencial de PR: `dev`
|
|
26
|
+
- `AGENTS.md` local: presente
|
|
27
|
+
|
|
28
|
+
Leia o `AGENTS.md` mais próximo antes de editar código. Se esta alteração tocar apenas o repositório atual, trabalhe aqui; se também exigir atualização do superprojeto que consome este repositório, registre ou entregue a composição necessária sem perder a separação de ownership.
|
|
29
|
+
|
|
30
|
+
_Arquivo gerado por `cto-mcp/scripts/sync-copilot-agents.mjs`._
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Quality Assurance
|
|
3
|
+
description: Revisor técnico de entregas do repositório ControleOnline/ui-customers, com fonte canônica centralizada no cto-mcp.
|
|
4
|
+
target: github-copilot
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Fonte canônica
|
|
8
|
+
|
|
9
|
+
Este wrapper é intencionalmente fino. Antes de agir, leia e siga, nesta ordem:
|
|
10
|
+
|
|
11
|
+
1. `https://github.com/ControleOnline/cto-mcp/blob/master/agents/agent/qa/agent.md`
|
|
12
|
+
|
|
13
|
+
Esse arquivo central referencia as regras-base de `automation/` no `cto-mcp`. Se este wrapper local divergir do conteúdo canônico do `cto-mcp`, prefira o `cto-mcp`, salvo quando o estado real deste repositório exigir adaptação operacional explícita.
|
|
14
|
+
|
|
15
|
+
## Contexto local
|
|
16
|
+
|
|
17
|
+
Você está operando no repositório `ControleOnline/ui-customers`.
|
|
18
|
+
|
|
19
|
+
Você conhece o ecossistema completo da ControleOnline. Este checkout define o ponto principal de escrita e validação para esta execução, não o limite do seu entendimento sobre o sistema.
|
|
20
|
+
|
|
21
|
+
- Checkout local: `app-community/modules/controleonline/ui-customers`
|
|
22
|
+
- Tipo: submódulo de app-community
|
|
23
|
+
- Família: frontend
|
|
24
|
+
- Branch base operacional: `master`
|
|
25
|
+
- Alvo preferencial de PR: `dev`
|
|
26
|
+
- `AGENTS.md` local: presente
|
|
27
|
+
|
|
28
|
+
Leia o `AGENTS.md` mais próximo antes de editar código. Se esta alteração tocar apenas o repositório atual, trabalhe aqui; se também exigir atualização do superprojeto que consome este repositório, registre ou entregue a composição necessária sem perder a separação de ownership.
|
|
29
|
+
|
|
30
|
+
_Arquivo gerado por `cto-mcp/scripts/sync-copilot-agents.mjs`._
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Security
|
|
3
|
+
description: Revisor de segurança do repositório ControleOnline/ui-customers, com fonte canônica centralizada no cto-mcp.
|
|
4
|
+
target: github-copilot
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Fonte canônica
|
|
8
|
+
|
|
9
|
+
Este wrapper é intencionalmente fino. Antes de agir, leia e siga, nesta ordem:
|
|
10
|
+
|
|
11
|
+
1. `https://github.com/ControleOnline/cto-mcp/blob/master/agents/agent/security/agent.md`
|
|
12
|
+
|
|
13
|
+
Esse arquivo central referencia as regras-base de `automation/` no `cto-mcp`. Se este wrapper local divergir do conteúdo canônico do `cto-mcp`, prefira o `cto-mcp`, salvo quando o estado real deste repositório exigir adaptação operacional explícita.
|
|
14
|
+
|
|
15
|
+
## Contexto local
|
|
16
|
+
|
|
17
|
+
Você está operando no repositório `ControleOnline/ui-customers`.
|
|
18
|
+
|
|
19
|
+
Você conhece o ecossistema completo da ControleOnline. Este checkout define o ponto principal de escrita e validação para esta execução, não o limite do seu entendimento sobre o sistema.
|
|
20
|
+
|
|
21
|
+
- Checkout local: `app-community/modules/controleonline/ui-customers`
|
|
22
|
+
- Tipo: submódulo de app-community
|
|
23
|
+
- Família: frontend
|
|
24
|
+
- Branch base operacional: `master`
|
|
25
|
+
- Alvo preferencial de PR: `dev`
|
|
26
|
+
- `AGENTS.md` local: presente
|
|
27
|
+
|
|
28
|
+
Leia o `AGENTS.md` mais próximo antes de editar código. Se esta alteração tocar apenas o repositório atual, trabalhe aqui; se também exigir atualização do superprojeto que consome este repositório, registre ou entregue a composição necessária sem perder a separação de ownership.
|
|
29
|
+
|
|
30
|
+
_Arquivo gerado por `cto-mcp/scripts/sync-copilot-agents.mjs`._
|
package/.scrutinizer.yml
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
checks:
|
|
2
|
+
javascript: true
|
|
3
|
+
|
|
4
|
+
build:
|
|
5
|
+
nodes:
|
|
6
|
+
analysis:
|
|
7
|
+
environment:
|
|
8
|
+
node: v16
|
|
9
|
+
project_setup:
|
|
10
|
+
override: true
|
|
11
|
+
tests:
|
|
12
|
+
override:
|
|
13
|
+
- js-scrutinizer-run
|
|
14
|
+
|
|
15
|
+
filter:
|
|
16
|
+
excluded_paths:
|
|
17
|
+
- "build/*"
|
|
18
|
+
- "coverage/*"
|
|
19
|
+
- "dist/*"
|
|
20
|
+
- "node_modules/*"
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
## Ponto de entrada
|
|
3
|
+
|
|
4
|
+
- A documentação funcional e de regras deste modulo vive na **wiki do proprio repositório** e na wiki principal do app.
|
|
5
|
+
- Regras transversais de qualidade, modularizacao e limites de componente vivem em `https://github.com/ControleOnline/agents-mcp/blob/master/skills/shared/code-quality.md`.
|
|
6
|
+
- Quando houver detalhe especifico de implementacao, prefira comentar no codigo em ingles perto da regra.
|
|
7
|
+
- Este arquivo deve ficar curto e servir apenas como ponte para as fontes oficiais.
|
|
8
|
+
|
|
9
|
+
## Documentação (navegação humana)
|
|
10
|
+
|
|
11
|
+
Sempre comece pela **Home** da wiki e siga as categorias abaixo.
|
|
12
|
+
|
|
13
|
+
| Categoria | Destino |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Home do módulo | https://github.com/ControleOnline/ui-customers/wiki |
|
|
16
|
+
| Wiki principal do app | https://github.com/ControleOnline/app-community/wiki |
|
|
17
|
+
| Wiki da API | https://github.com/ControleOnline/api-community/wiki |
|
|
18
|
+
| Visões do app (`APP_TYPE`) | https://github.com/ControleOnline/app-community/blob/master/MODOS_OPERACAO.md |
|
|
19
|
+
|
|
20
|
+
### Por categoria — cadastro e detalhe de clientes
|
|
21
|
+
|
|
22
|
+
| Página | O que documenta |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| [Cliente × Vendedor — vínculo e permissões](https://github.com/ControleOnline/ui-customers/wiki/Cliente-Vendedor-Vinculo-e-Permissoes) | Aba Vendedores no detalhe; corte MANAGER vs CRM/outros |
|
|
25
|
+
| [Client Details — aba Franquia/Filial (PJ → PJ)](https://github.com/ControleOnline/ui-customers/wiki/Client-Details-Franquia-Filial) | Vínculos franchisee/filial no detalhe de PJ; CRUD só MANAGER |
|
|
26
|
+
| [Client Details — preservação de capitalização (nome/alias)](https://github.com/ControleOnline/ui-customers/wiki/Client-Details-People-Name-Case) | Nome/alias de pessoa/colaborador sem forçar CAIXA ALTA (UI + API) |
|
|
27
|
+
| Página canônica do fluxo (CRM) | https://github.com/ControleOnline/ui-crm/wiki/Cliente-Vendedor-Vinculo-e-Permissoes |
|
|
28
|
+
|
|
29
|
+
Cópia versionada no Git: `docs/technical/Cliente-Vendedor-Vinculo-e-Permissoes.md`, `docs/technical/Client-Details-Franquia-Filial.md`, `docs/technical/Client-Details-People-Name-Case.md`
|
|
30
|
+
|
|
31
|
+
### Visão deste módulo
|
|
32
|
+
|
|
33
|
+
`ui-customers` é o **detalhe e cadastro de pessoas/clientes** reutilizado por várias visões do app (`CRM`, `MANAGER`, `POS`, etc.).
|
|
34
|
+
|
|
35
|
+
- Dono da tela `ClientDetails` e abas (geral, contatos, documentos, **vendedores**, **Franquia/Filial**, etc.).
|
|
36
|
+
- No fluxo comercial, recebe handoff do `ui-crm`.
|
|
37
|
+
- Gestão administrativa de vendedores, comissões e vínculos franquia/filial: apenas quando `APP_TYPE=MANAGER`.
|
|
38
|
+
- Fora de `MANAGER` (ex.: CRM): pode identificar o vendedor / ver listagem de franquia, sem CRUD administrativo.
|
|
39
|
+
|
|
40
|
+
## Regras específicas
|
|
41
|
+
|
|
42
|
+
- No contexto `provider`, a aba de produtos do detalhe da pessoa juridica deve permitir criar um novo produto sem sair do fluxo do fornecedor.
|
|
43
|
+
|
|
44
|
+
### Módulos relacionados (mesmo fluxo)
|
|
45
|
+
|
|
46
|
+
| Módulo | Papel | Entrada da documentação |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `ui-crm` | Entrada comercial / handoff | https://github.com/ControleOnline/ui-crm/wiki |
|
|
49
|
+
| `api-platform-people` | Backend `people_link` / SalesmanService | https://github.com/ControleOnline/api-platform-people/wiki |
|
|
50
|
+
| `app-community` | Home do app e mapa de submódulos | https://github.com/ControleOnline/app-community/wiki |
|
package/FUNDING.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
github: [controleonline]
|
package/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# UI Customers
|
|
2
|
+
|
|
3
|
+
Modulo React Native/Web para listagens e detalhes compartilhados de clientes, fornecedores e franquias.
|
|
4
|
+
|
|
5
|
+
## Relacionamentos
|
|
6
|
+
|
|
7
|
+
As abas de vendedores e contatos consultam o store `people_link`. Filtros de colecao usam IDs numericos; gravacoes preservam as IRIs exigidas pelo contrato JSON-LD.
|
|
8
|
+
|
|
9
|
+
## Validacao
|
|
10
|
+
|
|
11
|
+
Na raiz do `app-community`:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npm test -- --runInBand modules/controleonline/ui-customers/src/tests/react
|
|
15
|
+
npm run test:browser:manager -- --grep "scopes sellers and contacts"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Links obrigatorios
|
|
19
|
+
|
|
20
|
+
- [Documentacao para clientes](http://ajuda.controleonline.com/)
|
|
21
|
+
- [Site institucional](http://controleonline.com/)
|
|
22
|
+
- [Wiki tecnica](https://github.com/ControleOnline/ui-customers/wiki)
|
|
23
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Client Details — aba Franquia/Filial (PJ → PJ)
|
|
2
|
+
|
|
3
|
+
Espelho versionado da wiki:
|
|
4
|
+
https://github.com/ControleOnline/ui-customers/wiki/Client-Details-Franquia-Filial
|
|
5
|
+
|
|
6
|
+
Issue: https://github.com/ControleOnline/app-community/issues/453
|
|
7
|
+
|
|
8
|
+
## Resumo
|
|
9
|
+
|
|
10
|
+
Aba no detalhe de **Pessoa Jurídica** para vínculos PJ→PJ (`people_link.linkType` `franchisee` = Franquia, `filial` = Filial).
|
|
11
|
+
CRUD administrativo somente em `APP_TYPE=MANAGER`. Picker e listagem somente PJ. Comissão/royalties fora de escopo.
|
|
12
|
+
|
|
13
|
+
## Contrato
|
|
14
|
+
|
|
15
|
+
- `company` = PJ editada; `people` = PJ vinculada (`peopleType=J`).
|
|
16
|
+
- AuthZ de escrita no backend (`PeopleLink` + `securityFilter`); UI não é enforcement final.
|
|
17
|
+
- Componentes: `FranchiseLinksTab`, `FranchiseLinksManageModal`, `useFranchiseLinksManage`, `franchiseLinksTab.helpers`.
|
|
18
|
+
- Smoke: `src/tests/browser/manager/client-details-franchise-links.spec.js`.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Client Details — preservação de capitalização em nome/alias (People)
|
|
2
|
+
|
|
3
|
+
## Objetivo
|
|
4
|
+
|
|
5
|
+
Documentar a regra de negócio e o contrato técnico para **campos nominais** de pessoa/colaborador (`name`, `alias` / fantasia): o valor digitado pelo usuário é **persistido e relido com a mesma capitalização**, sem forçar CAIXA ALTA na UI nem no backend.
|
|
6
|
+
|
|
7
|
+
Origem: residual de [app-community#376](https://github.com/ControleOnline/app-community/issues/376) coberto em [app-community#626](https://github.com/ControleOnline/app-community/issues/626) (cadastro/detalhe de colaborador em `client-details` / EmployeesTab).
|
|
8
|
+
|
|
9
|
+
## Escopo
|
|
10
|
+
|
|
11
|
+
| Área | Comportamento canônico |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| UI (`ui-customers`) | Inputs de nome/alias **não** aplicam `toUpperCase` / `formatDisplayUppercase` / CSS `text-transform: uppercase` no fluxo de cadastro/edição de colaborador e detalhe de pessoa |
|
|
14
|
+
| Backend (`api-platform-people`) | `People::getName()` e `People::getAlias()` retornam o valor **armazenado** (sem `mb_strtoupper` na leitura) |
|
|
15
|
+
| Persistência | O payload de escrita grava o texto como recebido (após trim/whitespace apenas, quando aplicável) |
|
|
16
|
+
| Exibição | Listas e headers usam o valor retornado pela API, preservando capitalização |
|
|
17
|
+
| Busca | Continua case-insensitive no backend (não depende de caixa no valor gravado) |
|
|
18
|
+
|
|
19
|
+
### Fora de escopo / exceções legítimas
|
|
20
|
+
|
|
21
|
+
- Campos cujo domínio **exige** caixa alta (ex.: UF de endereço) continuam normalizados — a regra deve ser **explícita** no código e, se necessário, documentada localmente.
|
|
22
|
+
- Documentos fiscais (CNPJ/CPF) e formatação numérica/máscara não entram nesta regra de capitalização de nomes.
|
|
23
|
+
- Reforma geral de i18n.
|
|
24
|
+
|
|
25
|
+
## Fluxo (colaborador em client-details)
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
Usuário digita "Maria Silva" (nome) / "Mari" (alias)
|
|
29
|
+
│
|
|
30
|
+
▼
|
|
31
|
+
UI: normalizeIdentityValue = String(value) [sem uppercase]
|
|
32
|
+
│
|
|
33
|
+
▼
|
|
34
|
+
POST/PUT people (payload com capitalização original)
|
|
35
|
+
│
|
|
36
|
+
▼
|
|
37
|
+
Banco: name / alias gravados como enviados
|
|
38
|
+
│
|
|
39
|
+
▼
|
|
40
|
+
GET: People::getName / getAlias → valor armazenado
|
|
41
|
+
│
|
|
42
|
+
▼
|
|
43
|
+
UI lista / header / detalhe → "Maria Silva" / "Mari"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Modularização (UI)
|
|
47
|
+
|
|
48
|
+
| Arquivo | Papel na regra |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| `src/react/components/tabs/employeesTabHelpers.js` | `normalizeIdentityValue` → identidade (sem uppercase); helpers de create/display |
|
|
51
|
+
| `src/react/components/tabs/EmployeesTab.js` | Inputs de nome/alias no modal create **sem** forçar caixa alta no `onChangeText` |
|
|
52
|
+
| `src/react/components/tabs/generalTabHelpers.js` | Mesma política de identidade no detalhe PF |
|
|
53
|
+
| `src/react/pages/details.js` | Header / título de contato preservam capitalização gravada |
|
|
54
|
+
|
|
55
|
+
Limite absoluto do projeto: **≤ 500 linhas** por arquivo.
|
|
56
|
+
|
|
57
|
+
## Backend (`api-platform-people`)
|
|
58
|
+
|
|
59
|
+
- `People::getName(): string` — retorna `(string) ($this->name ?? '')` (comentário de referência a #626 / #376).
|
|
60
|
+
- `People::getAlias()` — idem para alias.
|
|
61
|
+
- Removido o uso de helper privado `uppercaseText` / `mb_strtoupper` na **leitura** desses getters.
|
|
62
|
+
- Setters gravam o valor recebido; a normalização de caixa **não** é aplicada na saída.
|
|
63
|
+
|
|
64
|
+
## Critérios de aceite (referência)
|
|
65
|
+
|
|
66
|
+
- É possível gravar `"Maria Silva"` e reler `"Maria Silva"` (não `"MARIA SILVA"`).
|
|
67
|
+
- Campos que legitimamente exigem caixa alta (se houver) continuam normalizados e documentados.
|
|
68
|
+
- Busca por nome não deixa de encontrar o registro por causa da capitalização.
|
|
69
|
+
- Sem regressão no save de colaborador / people.
|
|
70
|
+
|
|
71
|
+
## Testes
|
|
72
|
+
|
|
73
|
+
| Tipo | Cobertura |
|
|
74
|
+
| --- | --- |
|
|
75
|
+
| Unit (ui-customers) | Helpers de identidade com exemplos mistos (`Maria Silva` / `Mari`) |
|
|
76
|
+
| Unit / API (api-platform-people) | Getters de name/alias preservam case |
|
|
77
|
+
| Browser smoke | Fluxo de create/edit de colaborador (EmployeesTab) com nome misto, quando presente no suite de client-details |
|
|
78
|
+
|
|
79
|
+
## Visões do app (`APP_TYPE`)
|
|
80
|
+
|
|
81
|
+
- `MANAGER` / `CRM` / demais que usam `client-details` e aba Colaboradores: a regra vale para o detalhe compartilhado de pessoa — o módulo **não** deve reintroduzir uppercase em display ou input de nome/alias.
|
|
82
|
+
- `ui-customers` é o dono da UI de detalhe; `api-platform-people` é o dono da persistência e dos getters.
|
|
83
|
+
|
|
84
|
+
## O que este módulo **não** faz
|
|
85
|
+
|
|
86
|
+
- Não redefine busca full-text ou índices no backend.
|
|
87
|
+
- Não altera máscaras de documento (CNPJ/CPF).
|
|
88
|
+
- Não aplica title-case ou outras transformações “bonitas” automaticamente — apenas **preserva** o que o usuário digitou.
|
|
89
|
+
|
|
90
|
+
## Links cruzados
|
|
91
|
+
|
|
92
|
+
| Destino | URL |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| Home deste módulo | https://github.com/ControleOnline/ui-customers/wiki |
|
|
95
|
+
| Client Details — aba Colaboradores (refresh) | https://github.com/ControleOnline/ui-customers/wiki/Client-Details-EmployeesTab-Refresh |
|
|
96
|
+
| Client Details — criar usuário | https://github.com/ControleOnline/ui-customers/wiki/Client-Details-Criar-Usuario |
|
|
97
|
+
| Backend people (wiki) | https://github.com/ControleOnline/api-platform-people/wiki |
|
|
98
|
+
| App home | https://github.com/ControleOnline/app-community/wiki |
|
|
99
|
+
| Issue residual | https://github.com/ControleOnline/app-community/issues/626 |
|
|
100
|
+
| Issue original | https://github.com/ControleOnline/app-community/issues/376 |
|
|
101
|
+
| Visões do app | https://github.com/ControleOnline/app-community/blob/master/MODOS_OPERACAO.md |
|
|
102
|
+
|
|
103
|
+
Cópia versionada no Git (quando espelhada): `docs/technical/Client-Details-People-Name-Case.md`
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Cliente × Vendedor — vínculo e permissões
|
|
2
|
+
|
|
3
|
+
Documentação técnica do papel de **`ui-customers`** no fluxo de vínculo cliente↔vendedor (trilha `ui-crm#2` + gestão administrativa `ui-customers#20`).
|
|
4
|
+
|
|
5
|
+
## Como este módulo se encaixa
|
|
6
|
+
|
|
7
|
+
| Visão (`APP_TYPE`) | Uso de `ui-customers` neste fluxo |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| **CRM** | Recebe handoff do `ui-crm` e mostra o detalhe do cliente; lista o vendedor **sem** gestão administrativa (sem botão +, edit, delete, modal) |
|
|
10
|
+
| **MANAGER** | Detalhe administrativo: vincular, editar, remover vendedores; ver e editar comissão / mínimo (conforme regras de role) |
|
|
11
|
+
| Outros (POS, etc.) | Reutilizam o detalhe conforme permissão; não assumem regras comerciais do CRM nem CRUD de vendedores |
|
|
12
|
+
|
|
13
|
+
Página canônica do fluxo completo (CRM / backend):
|
|
14
|
+
- [ui-crm — Cliente × Vendedor](https://github.com/ControleOnline/ui-crm/wiki/Cliente-Vendedor-Vinculo-e-Permissoes)
|
|
15
|
+
- [api-platform-people — Cliente × Vendedor](https://github.com/ControleOnline/api-platform-people/wiki/Cliente-Vendedor-Vinculo-e-Permissoes)
|
|
16
|
+
|
|
17
|
+
## Objetivo
|
|
18
|
+
|
|
19
|
+
Registrar regras de negócio, modularização e contratos da aba **Vendedores** no detalhe do cliente:
|
|
20
|
+
|
|
21
|
+
1. listagem de vínculos `sellers-client` via store `people_link`;
|
|
22
|
+
2. gestão administrativa (vincular / editar / remover) **somente** quando `APP_TYPE=MANAGER`;
|
|
23
|
+
3. edição de comissão / mínimo (override) restrita a roles adequadas (`ROLE_SUPER` / `ROLE_OWNER` em MANAGER);
|
|
24
|
+
4. modularização dos componentes ≤ 500 linhas e testes focais.
|
|
25
|
+
|
|
26
|
+
## Repositórios afetados
|
|
27
|
+
|
|
28
|
+
| Módulo | Papel no fluxo |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `ui-crm` | Handoff do CRM para o detalhe do cliente com contexto de vendedores |
|
|
31
|
+
| `ui-customers` | Aba `Vendedores` no detalhe do cliente (listagem + gestão UI) |
|
|
32
|
+
| `api-platform-people` | Vínculo automático, distribuição de vendedores e recurso `people_link` |
|
|
33
|
+
| `app-community` | Fronteira de apps (`MANAGER` vs `CRM`) em `MODOS_OPERACAO.md` |
|
|
34
|
+
|
|
35
|
+
## Regras de negócio (UI)
|
|
36
|
+
|
|
37
|
+
### Permissões por app
|
|
38
|
+
|
|
39
|
+
| Capacidade | `APP_TYPE=MANAGER` | Fora de `MANAGER` (ex.: CRM) |
|
|
40
|
+
| --- | --- | --- |
|
|
41
|
+
| Ver quem é o vendedor vinculado | sim | sim |
|
|
42
|
+
| Botão **+** (vincular novo) | sim | não |
|
|
43
|
+
| Edit / delete por linha | sim | não |
|
|
44
|
+
| Modal de gestão (picker + comissão / mínimo) | sim | não |
|
|
45
|
+
| Ver % de comissão / mínimo | sim | não |
|
|
46
|
+
| Editar comissão (override) | sim (ROLE_SUPER / ROLE_OWNER) | não |
|
|
47
|
+
|
|
48
|
+
A fronteira oficial de **CRUD administrativo** é por **app** (`APP_TYPE === MANAGER`), via helper `canManageSalesmen(appType)`. A UI **não** é o enforcement final — escrita em `people_link` e comissão devem ser filtradas no backend.
|
|
49
|
+
|
|
50
|
+
### Modelo de dados (vínculos)
|
|
51
|
+
|
|
52
|
+
- `PeopleLink` com `linkType`:
|
|
53
|
+
- `client` — empresa ↔ cliente
|
|
54
|
+
- `salesman` — empresa ↔ vendedor
|
|
55
|
+
- `sellers-client` — vendedor ↔ cliente
|
|
56
|
+
- Campos sensíveis no vínculo: `comission`, `minimum_comission`
|
|
57
|
+
|
|
58
|
+
### Fluxo de gestão (MANAGER)
|
|
59
|
+
|
|
60
|
+
1. `SalesmanTab` carrega vínculos `sellers-client` do cliente.
|
|
61
|
+
2. Se `canManageSalesmen(appType)`:
|
|
62
|
+
- exibe botão **+** (`salesman-manage-add-btn`);
|
|
63
|
+
- por linha: ações de editar e remover;
|
|
64
|
+
- abre `SalesmanManageModal` com picker de vendedores da empresa (já com `linkType=salesman`) e campos de comissão / mínimo.
|
|
65
|
+
3. Save usa `people_link` actions (`save` / `remove`) com payload montado por `buildSalesmanSavePayload`.
|
|
66
|
+
4. Fora de MANAGER: apenas listagem + navegação para o detalhe da pessoa vinculada; nenhum controle de CRUD.
|
|
67
|
+
|
|
68
|
+
## Modularização (`ui-customers`)
|
|
69
|
+
|
|
70
|
+
Arquivos principais (todos ≤ 500 linhas):
|
|
71
|
+
|
|
72
|
+
| Arquivo | Responsabilidade |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| `src/react/components/tabs/SalesmanTab.js` | Aba: listagem, gate MANAGER, integração com modal e bloco de comissão |
|
|
75
|
+
| `src/react/components/tabs/useSalesmanManage.js` | Hook de gestão administrativa (load options, open/save/remove modal state) |
|
|
76
|
+
| `src/react/components/tabs/SalesmanManageModal.js` | Modal de vincular/editar (picker + comissão / mínimo) |
|
|
77
|
+
| `src/react/components/tabs/SalesmanCommissionBlock.js` | Bloco de exibição/edição de comissão (override por role) |
|
|
78
|
+
| `src/react/components/tabs/salesmanTab.helpers.js` | Helpers puros: `canManageSalesmen`, normalize, options, save payload |
|
|
79
|
+
| `src/react/components/tabs/salesmanTabHelpers.js` | Helpers de comissão / display (legado + override) |
|
|
80
|
+
| `src/react/components/tabs/salesmanTabMedia.js` | Media / avatar collection helpers |
|
|
81
|
+
| `src/react/components/tabs/salesmanTabSession.js` | `resolveAppType` (localStorage `app-type`) e session user |
|
|
82
|
+
|
|
83
|
+
Gate principal:
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
export const canManageSalesmen = appType =>
|
|
87
|
+
normalizeAppType(appType) === 'MANAGER';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`APP_TYPE` é lido de `localStorage.getItem('app-type')` via `resolveAppType()`.
|
|
91
|
+
|
|
92
|
+
## Contratos com outros módulos
|
|
93
|
+
|
|
94
|
+
| Origem | Expectativa |
|
|
95
|
+
| --- | --- |
|
|
96
|
+
| `ui-crm` | chega com `clientId`, `contextKey=client`, opcionalmente `initialTab=sellers` |
|
|
97
|
+
| `api-platform-people` | leitura/escrita de `people_link`; vínculo automático e campos de comissão; enforcement no backend |
|
|
98
|
+
| `app-community` | composição do submodule; `MODOS_OPERACAO.md` define fronteira MANAGER vs CRM |
|
|
99
|
+
|
|
100
|
+
```mermaid
|
|
101
|
+
flowchart LR
|
|
102
|
+
CRM["ui-crm\nCRM list/detail entry"]
|
|
103
|
+
NAV["clientDetailsNavigation\nclientId + contextKey + initialTab"]
|
|
104
|
+
DET["ui-customers\nClientDetails"]
|
|
105
|
+
TAB["SalesmanTab"]
|
|
106
|
+
HOOK["useSalesmanManage\n+ SalesmanManageModal"]
|
|
107
|
+
API["api-platform-people\nPeopleLink + SalesmanService"]
|
|
108
|
+
|
|
109
|
+
CRM --> NAV --> DET --> TAB
|
|
110
|
+
TAB -->|"APP_TYPE=MANAGER"| HOOK
|
|
111
|
+
TAB --> API
|
|
112
|
+
HOOK --> API
|
|
113
|
+
API -->|"auto-link on client"| API
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Segurança (pontos de atenção)
|
|
117
|
+
|
|
118
|
+
1. Restrição de CRUD e comissão fora de `MANAGER` **não** pode depender só de UI.
|
|
119
|
+
2. Escrita em `people_link` deve respeitar menor privilégio (evitar que “pode ler” vire “pode escrever” em outros `linkType`).
|
|
120
|
+
3. Escopo multiempresa: gestor de uma empresa não deve herdar gestão de `sellers-client` de outra empresa só porque o vendedor é compartilhado.
|
|
121
|
+
4. Commission override continua nas regras já aceitas (`ui-customers#10` / `#12`); manage não amplia privilégio além do contexto MANAGER.
|
|
122
|
+
|
|
123
|
+
## Testes
|
|
124
|
+
|
|
125
|
+
- Unit: `npm run test:salesman-tab` (helpers + gate `canManageSalesmen`).
|
|
126
|
+
- Browser smoke (MANAGER):
|
|
127
|
+
- `src/tests/browser/manager/client-details-salesman-manage.spec.js` — + / edit / delete + modal.
|
|
128
|
+
- `src/tests/browser/manager/client-details-salesman-commission.spec.js` — comissão.
|
|
129
|
+
- non-MANAGER: ausência de controles CRUD coberta nos smokes.
|
|
130
|
+
|
|
131
|
+
## Instalação / operação
|
|
132
|
+
|
|
133
|
+
Não há pacote isolado. O fluxo depende dos submódulos front (`ui-crm`, `ui-customers`) compostos no app e do módulo PHP `api-platform-people` na API.
|
|
134
|
+
|
|
135
|
+
Config relevante por empresa (backend):
|
|
136
|
+
|
|
137
|
+
- chave `salesman-distribution-strategy` (default `random`)
|
|
138
|
+
|
|
139
|
+
## Manutenção
|
|
140
|
+
|
|
141
|
+
Ao alterar este fluxo:
|
|
142
|
+
|
|
143
|
+
1. atualizar esta página e as cópias nos módulos afetados (`docs/technical/` + wiki);
|
|
144
|
+
2. manter testes focais de helpers da aba e smoke MANAGER vs non-MANAGER;
|
|
145
|
+
3. validar enforcement de `people_link` no backend antes de liberar exposição de comissão ou CRUD.
|
|
146
|
+
|
|
147
|
+
## Referências internas
|
|
148
|
+
|
|
149
|
+
- Issues: `ControleOnline/ui-crm#2` (fluxo original), `ControleOnline/ui-customers#20` (gestão administrativa MANAGER), `#10` / `#12` (comissão)
|
|
150
|
+
- PRs históricos: `ui-customers#3`, `ui-crm#10`, `api-platform-people#4`
|
|
151
|
+
- Fronteira de apps: [app-community/MODOS_OPERACAO.md](https://github.com/ControleOnline/app-community/blob/master/MODOS_OPERACAO.md)
|
|
152
|
+
- Cópia versionada no Git: `docs/technical/Cliente-Vendedor-Vinculo-e-Permissoes.md`
|
package/docs/wiki.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
https://github.com/ControleOnline/ui-customers/wiki
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@controleonline/ui-customers",
|
|
3
|
+
"version": "1.0.81",
|
|
4
|
+
"author": "ControleOnline",
|
|
5
|
+
"description": "ControleOnline customers Quasar UI Component",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "src/react/index.js",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"test": "npm run test:supplier-product-flow && npm run test:fiscal-shortcut && npm run test:documents && npm run test:employee-link-types && npm run test:salesman-tab",
|
|
10
|
+
"test:supplier-product-flow": "node --test src/tests/react/domain/productSupplierFlow.test.mjs",
|
|
11
|
+
"test:fiscal-shortcut": "node --test src/tests/react/components/tabs/fiscalTabContract.test.mjs",
|
|
12
|
+
"test:documents": "node --test src/tests/react/components/tabs/documentsTabHelpers.test.mjs src/tests/react/components/tabs/documentsTabContract.test.mjs",
|
|
13
|
+
"test:employee-link-types": "node --test src/tests/react/components/tabs/employeeLinkTypes.contract.test.mjs",
|
|
14
|
+
"test:salesman-tab": "node --test src/tests/react/components/tabs/salesmanTab.helpers.test.mjs src/tests/react/components/tabs/salesmanTabHelpers.test.mjs"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/controleonline/conline-quasar-ui"
|
|
19
|
+
},
|
|
20
|
+
"bugs": "",
|
|
21
|
+
"homepage": "https://www.controleonline.com/devs/plugins",
|
|
22
|
+
"browserslist": [
|
|
23
|
+
"last 1 version, not dead, ie >= 11"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@controleonline/ui-accounting": "*",
|
|
27
|
+
"@controleonline/ui-common": "*",
|
|
28
|
+
"@controleonline/ui-contracts": "*",
|
|
29
|
+
"@controleonline/ui-crm": "*",
|
|
30
|
+
"@controleonline/ui-people": "*"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const root = path.resolve(__dirname, '..');
|
|
4
|
+
const repo = path.basename(root);
|
|
5
|
+
const pointer = fs.readFileSync(path.join(root, 'docs/wiki.md'), 'utf8');
|
|
6
|
+
const expected = `https://github.com/ControleOnline/${repo}/wiki\n`;
|
|
7
|
+
if (pointer !== expected) throw new Error(`docs/wiki.md must contain only ${expected.trim()}`);
|
|
8
|
+
const gitmodulesPath = path.join(root, '.gitmodules');
|
|
9
|
+
if (fs.existsSync(gitmodulesPath)) {
|
|
10
|
+
const gitmodules = fs.readFileSync(gitmodulesPath, 'utf8');
|
|
11
|
+
if (/path\s*=\s*docs\/wiki/.test(gitmodules) || new RegExp(`${repo}\\.wiki\\.git`).test(gitmodules)) throw new Error('docs/wiki must not be configured as a wiki submodule');
|
|
12
|
+
}
|
|
13
|
+
console.log(`Validated wiki pointer for ${repo}.`);
|