# Customer
Por que dentro do cadastro de: customer e leads, temos duas formas de informar contatos??
Tem o select de contatos cadastrado e a subseção de cadastro de contatos.
# API:
## GET por id:
- /api/v8/customer/customers/271e0bfb-ca38-4cc1-bb2d-39650543476e
``` JSON
{
"id": "271e0bfb-ca38-4cc1-bb2d-39650543476e",
"createdAt": "2019-07-08T14:32:43.765Z",
"updatedAt": "2019-07-08T14:40:44.018Z",
"customerClassification": { //[Recurso de customer]
"id": "26a89a36-59a3-4cb2-9246-77214dace7dd",
"active": true,
"description": "Padrão"
},
"customerPersonType": { // [Recurso de customer]
"id": "1d6cce12-0372-45f9-9a18-56b4c2b3364e",
"active": true,
"description": "Pessoa Física",
"acronym": "PF" // é usado para alguma coisa no front?
},
"locationBusinessLines": [ // [Recurso de customer]
{
"id": "edd06259-fe77-4603-b158-21b1e2b2c9e9",
"active": true,
"description": "Ramo de teste 1",
"code": "123" // é usado para alguma coisa no front?
}
],
"active": true,
"name": "Cliente de teste 1 alterado",
"tradingName": "Nome fantasia alterado",
"birthday": "1989-05-02",
"code": "321abc",
"note": "Observação cliente 1 alterado",
"customerSince": "2019-07-08", // existe devido ao processo de conversão de um lead em customer?
"customerIdentificationDocuments": [ // [Recurso de customer]
{
// não exibe o id do registro no customer e se tivermos dois documentos iguais como serão diferenciados???
// [Recurso do administration] deixar somente "identificationDocumentId" ou manter a replicação dos dados que já tem hoje, mas precisaria atualizar futuramente via mensageria, se mantermos replicando colocar em um objeto "identificationDocument" para agrupar as informações
"identificationDocumentId": "47553b5e-2b3e-4e0f-8cc3-96d52ae8a9b3",
"identificationDocumentDescription": "CPF",
"identificationDocumentAcronym": "CPF",
"documentNumber": "22222222222"
}
],
"customerPhones": [
{
"id": "c0a39860-f495-4935-83cc-704c5f2ba6f0",
"createdAt": "2019-07-08T14:32:43.848Z", // acredito que não precisaria retornar
"updatedAt": "2019-07-08T14:40:44.004Z", // acredito que não precisaria retornar
// [Recurso do common-data] não é replicado hoje
"phoneTypeId": "edc10fc1-f4b6-45ea-ac02-d035d33fcec1",
"phoneNumber": "+5545999333333"
},
{
"id": "68104bf6-9ffc-4448-95c5-d9d3eb0a3872",
"createdAt": "2019-07-08T14:32:43.823Z",
"updatedAt": "2019-07-08T14:40:44.008Z",
"phoneTypeId": "67cd545a-cf05-441e-a0ec-635c44e60d41",
"phoneNumber": "+5545999444444"
}
],
"customerEmails": [
{
"id": "adbe5b67-2fb8-4629-a540-9bd78a2472f9",
"createdAt": "2019-07-08T14:32:43.802Z", // acredito que não precisaria retornar
"updatedAt": "2019-07-08T14:40:44.011Z", // acredito que não precisaria retornar
// [Recurso do common-data] não é replicado hoje
"emailTypeId": "301f0e6e-4270-472b-aa96-45ab017bcbb1",
"email": "teste@teste123.com"
}
],
// REMOVER TEM UM ENDPOINT PARA ISSO
"locations": [
{
"id": "4d414e12-680c-4ebd-a482-e130195ab8ed",
"locationTypes": [
{
"id": "4f693aaa-ac84-4f5f-899f-b2c4d17b124b",
"active": true,
"description": "Tipo de local 1",
"acronym": "TL1"
}
],
"locationBusinessLines": [
{
"id": "edd06259-fe77-4603-b158-21b1e2b2c9e9",
"active": true,
"description": "Ramo de teste 1",
"code": "123"
},
{
"id": "55692c27-2993-44e8-8e96-bb51752de34b",
"active": true,
"description": "Ramo de teste 2",
"code": "321"
}
],
"cityId": "c8992115-1e53-425b-a51b-a93332927cec",
"stateId": "5394319e-081a-4f24-b4e8-0b2a885b10c3",
"countryId": "cb67a8fe-f1b4-46b9-a90b-e30112dc8f73",
"active": true,
"headquarter": true,
"description": "Local 1",
"postalCode": "123abc",
"address": "123",
"complement": "456",
"standard": true,
"note": "Observação do local do cliente",
"locationPhones": [
{
"id": "e6855ea9-50cb-48b4-91b5-3167b1c85d29",
"createdAt": "2019-07-08T19:36:05.148Z",
"updatedAt": "2019-07-08T19:40:04.921Z",
"phoneTypeId": "67cd545a-cf05-441e-a0ec-635c44e60d41",
"phoneNumber": "+5545999158899"
}
],
"locationEmails": [
{
"id": "83a1ae44-1b14-49fb-a69d-cc4655df660c",
"createdAt": "2019-07-08T19:36:05.149Z",
"updatedAt": "2019-07-08T19:40:04.928Z",
"emailTypeId": "0694a50f-d25b-4b10-ae05-619b30731ba7",
"email": "local1@teste.com"
}
],
"areas": [
{
"id": "6b9ca303-1931-4ac8-a7d5-23b2da5ddbf3",
"areaType": {
"id": "f2a03f1b-4138-4c25-92a6-44d386b89825",
"active": true,
"description": "Tipo área 1",
"acronym": "TA1"
},
"location": {
"id": "4d414e12-680c-4ebd-a482-e130195ab8ed",
"description": "Local 1"
},
"description": "Área 1 do local 1",
"size": 280317.15,
"note": "Observação da área 1 do local 1",
"measurementUnitId": "ba4fe596-ec1d-4383-ae83-4cf6d0c19a60",
"measurementUnitAcronym": "m²",
"mappingId": "5f0be890-af53-4984-b750-f4d680b099b7",
"lastUpdatedAt": "2019-07-08T19:48:31.171Z"
}
],
"centralPointMappingId": "30e4405e-589e-4a1a-bc6c-a2ddb5275e2d",
"mappingId": "30ec148a-b96b-4c02-bb1c-23c58f4160d2",
"cityName": "Paso de la Patria",
"stateName": "Corrientes",
"countryName": "Argentina"
}
],
"customerGroups": [ // [Recurso de customer]
{
"id": "093f9dd3-88ae-4630-8590-606b93e9bb92",
"description": "Grupo de clientes de teste 1",
"active": true
}
],
// [Recurso de customer], acredito que poderia ser somente uma listagem com id e nome e renomerar para contacts
"contactCustomerLocations": [
{
"id": "fe3cac45-a61e-4933-94cd-3995bc9eeadd",
"createdAt": "2019-07-08T14:40:44.017Z",
"updatedAt": "2019-07-08T14:40:44.017Z",
"contact": {
"id": "3420f9d3-38b1-42ba-91c2-5dc9a4cfa370",
"name": "Contato de teste 1"
}
}
],
"centralPointMappingId": "8107e644-da46-4e8e-9d3d-24ce9e66aaca",
// não é a mesma informação do updatedAt??
"lastUpdatedAt": "2019-07-08T14:40:44.018Z",
"facebook": "Face cliente 1 alterado",
"instagram": "Insta cliente 1 alterado",
"linkedin": "Link cliente 1 alterado",
"twitter": "Twi cliente 1 alterado"
}
```
- acredito que podemos remover o locations
## GET lista todos:
- /api/v8/customer/customers/
- não exibe ou destaca de alguma forma os clientes inativos???
- na listagem de clientes precisa realmente do local padrão? se sim, na listagem de cliente, poderiamos ter então:
- caso necessário podemos colocar a mesma estrutura no get por id
```JSON
{
"standardLocation": {
"id": "2a85a31b-340e-4f18-90d2-9cc7e0ec8636",
"headquarter": true, // front usa para alguma coisa na listagem?
"description": "Local 2",
}
}
```
## POST:
```JSON
{
// faz sentido inserir um cliente como inativo na aplicação????
"active": true,
"imageId": null,
"customerPhones": [
{
// não precisaria enviar, poderia ser gerado pelo back
"id": "68104bf6-9ffc-4448-95c5-d9d3eb0a3872",
"phoneNumber": "+5545999111111",
"phoneTypeId": "5b45276b-e85d-45c8-8254-f50e6bf654a5",
//o que seria isso :|, precisa enviar mesmo?
"phoneTypeIdField": "dpd_new_phoneNumber_68104bf6-9ffc-4448-95c5-d9d3eb0a3872"
},
{
"id": "c0a39860-f495-4935-83cc-704c5f2ba6f0",
"phoneNumber": "+5545999222222",
"phoneTypeId": "5b45276b-e85d-45c8-8254-f50e6bf654a5",
"phoneTypeIdField": "dpd_new_phoneNumber_c0a39860-f495-4935-83cc-704c5f2ba6f0"
}
],
"customerEmails": [
{
// não precisaria enviar, poderia ser gerado pelo back
"id": "adbe5b67-2fb8-4629-a540-9bd78a2472f9",
"email": "teste@teste.com",
//o que seria isso :|, precisa enviar mesmo?
"emailTypeId": "3735642b-b975-4402-ae11-144ce71e965a",
"emailTypeIdField": "dpd_new_email_adbe5b67-2fb8-4629-a540-9bd78a2472f9"
}
],
"centralPointMappingId": null,
"customerClassification": {
"id": "26a89a36-59a3-4cb2-9246-77214dace7dd",
"active": true, // não precisaria enviar
"description": "Padrão" // não precisaria enviar
},
"contactCustomerLocations": [ // renomerar o nome para contacts, seria somente uma listagem de objetos com a propriedade id
{
"contact": {
"id": "3420f9d3-38b1-42ba-91c2-5dc9a4cfa370",
"name": "Contato de teste 1" // não precisaria enviar
}
}
],
"name": "Cliente de teste 1",
"customerPersonType": {
"id": "1d6cce12-0372-45f9-9a18-56b4c2b3364e",
"description": "Pessoa Física" // não precisaria enviar
},
"tradingName": "Nome fantasia",
"birthday": "1988-05-02",
"code": "abc123",
"facebook": "Face cliente 1",
"instagram": "Insta cliente 1",
"twitter": "Twi cliente 1",
"linkedin": "Link cliente 1",
"locationBusinessLines": [
{
"id": "edd06259-fe77-4603-b158-21b1e2b2c9e9",
"description": "Ramo de teste 1" // não precisaria enviar
}
],
"note": "Observação cliente 1",
"customerIdentificationDocuments": [
{
"customer": { // não precisaria enviar REMOVER
"id": ""
},
"documentNumber": "11111111111",
"identificationDocumentAcronym": "CPF", // não precisaria enviar
"identificationDocumentDescription": "CPF", // não precisaria enviar
"identificationDocumentId": "47553b5e-2b3e-4e0f-8cc3-96d52ae8a9b3"
}
],
"customerGroups": [
{
"id": "093f9dd3-88ae-4630-8590-606b93e9bb92",
"description": "Grupo de clientes de teste 1", // não precisaria enviar
"active": true // não precisaria enviar
}
]
}
```
# PUT:
``` JSON
{
"id": "271e0bfb-ca38-4cc1-bb2d-39650543476e",
"createdAt": "2019-07-08T14:32:43.765Z", // não faz sentido enviar
"updatedAt": "2019-07-08T14:40:44.018Z", // não faz sentido enviar
"customerClassification": {
"id": "26a89a36-59a3-4cb2-9246-77214dace7dd",
"active": true, // não faz sentido enviar
"description": "Padrão" // não faz sentido enviar
},
"customerPersonType": {
"id": "1d6cce12-0372-45f9-9a18-56b4c2b3364e",
"active": true, // não faz sentido enviar
"description": "Pessoa Física", // não faz sentido enviar
"acronym": "PF" // não faz sentido enviar
},
"locationBusinessLines": [
{
"id": "edd06259-fe77-4603-b158-21b1e2b2c9e9",
"active": true, // não faz sentido enviar
"description": "Ramo de teste 1", // não faz sentido enviar
"code": "123" // não faz sentido enviar
}
],
"active": true,
"name": "Cliente de teste 1 alterado",
"tradingName": "Nome fantasia alterado",
"birthday": "1989-05-02",
"code": "321abc",
"note": "Observação cliente 1 alterado",
"customerSince": "2019-07-08", // faz sentido alterar isso via API? senão não precisaria esta no PUT
"customerIdentificationDocuments": [
{
"identificationDocumentId": "47553b5e-2b3e-4e0f-8cc3-96d52ae8a9b3",
"identificationDocumentDescription": "CPF", // não faz sentido enviar
"identificationDocumentAcronym": "CPF", // não faz sentido enviar
"documentNumber": "22222222222"
}
],
"customerPhones": [
{
"id": "c0a39860-f495-4935-83cc-704c5f2ba6f0",
"createdAt": "2019-07-08T14:32:43.848Z", // não faz sentido enviar
"updatedAt": "2019-07-08T14:40:44.004Z", // não faz sentido enviar
"phoneTypeId": "edc10fc1-f4b6-45ea-ac02-d035d33fcec1",
"phoneNumber": "+5545999333333"
},
{
"id": "68104bf6-9ffc-4448-95c5-d9d3eb0a3872",
"createdAt": "2019-07-08T14:32:43.823Z",
"updatedAt": "2019-07-08T14:40:44.008Z",
"phoneTypeId": "67cd545a-cf05-441e-a0ec-635c44e60d41",
"phoneNumber": "+5545999444444"
}
],
"customerEmails": [
{
"id": "adbe5b67-2fb8-4629-a540-9bd78a2472f9",
"createdAt": "2019-07-08T14:32:43.802Z", // não faz sentido enviar
"updatedAt": "2019-07-08T14:40:44.011Z", // não faz sentido enviar
"emailTypeId": "301f0e6e-4270-472b-aa96-45ab017bcbb1",
"email": "teste@teste123.com"
}
],
// REMOVER pois tem endepoint específico para isso
"locations": [
{
"id": "4d414e12-680c-4ebd-a482-e130195ab8ed",
"locationTypes": [
{
"id": "4f693aaa-ac84-4f5f-899f-b2c4d17b124b",
"active": true,
"description": "Tipo de local 1",
"acronym": "TL1"
}
],
"locationBusinessLines": [
{
"id": "edd06259-fe77-4603-b158-21b1e2b2c9e9",
"active": true,
"description": "Ramo de teste 1",
"code": "123"
},
{
"id": "55692c27-2993-44e8-8e96-bb51752de34b",
"active": true,
"description": "Ramo de teste 2",
"code": "321"
}
],
"cityId": "c8992115-1e53-425b-a51b-a93332927cec",
"stateId": "5394319e-081a-4f24-b4e8-0b2a885b10c3",
"countryId": "cb67a8fe-f1b4-46b9-a90b-e30112dc8f73",
"active": true,
"headquarter": true,
"description": "Local 1",
"postalCode": "123abc",
"address": "123",
"complement": "456",
"standard": true,
"note": "Observação do local do cliente",
"locationPhones": [
{
"id": "e6855ea9-50cb-48b4-91b5-3167b1c85d29",
"createdAt": "2019-07-08T19:36:05.148Z",
"updatedAt": "2019-07-08T19:40:04.921Z",
"phoneTypeId": "67cd545a-cf05-441e-a0ec-635c44e60d41",
"phoneNumber": "+5545999158899"
}
],
"locationEmails": [
{
"id": "83a1ae44-1b14-49fb-a69d-cc4655df660c",
"createdAt": "2019-07-08T19:36:05.149Z",
"updatedAt": "2019-07-08T19:40:04.928Z",
"emailTypeId": "0694a50f-d25b-4b10-ae05-619b30731ba7",
"email": "local1@teste.com"
}
],
"areas": [
{
"id": "6b9ca303-1931-4ac8-a7d5-23b2da5ddbf3",
"areaType": {
"id": "f2a03f1b-4138-4c25-92a6-44d386b89825",
"active": true,
"description": "Tipo área 1",
"acronym": "TA1"
},
"location": {
"id": "4d414e12-680c-4ebd-a482-e130195ab8ed",
"description": "Local 1"
},
"description": "Área 1 do local 1",
"size": 280317.15,
"note": "Observação da área 1 do local 1",
"measurementUnitId": "ba4fe596-ec1d-4383-ae83-4cf6d0c19a60",
"measurementUnitAcronym": "m²",
"mappingId": "5f0be890-af53-4984-b750-f4d680b099b7",
"lastUpdatedAt": "2019-07-08T19:48:31.171Z"
}
],
"centralPointMappingId": "30e4405e-589e-4a1a-bc6c-a2ddb5275e2d",
"mappingId": "30ec148a-b96b-4c02-bb1c-23c58f4160d2",
"cityName": "Paso de la Patria",
"stateName": "Corrientes",
"countryName": "Argentina"
}
],
"customerGroups": [
{
"id": "093f9dd3-88ae-4630-8590-606b93e9bb92",
"description": "Grupo de clientes de teste 1", // não faz sentido enviar
"active": true // não faz sentido enviar
}
],
"contactCustomerLocations": [
// renomear para contacts e enviar uma listagem de objetos com id somente
{
"id": "fe3cac45-a61e-4933-94cd-3995bc9eeadd",
"createdAt": "2019-07-08T14:40:44.017Z",
"updatedAt": "2019-07-08T14:40:44.017Z",
"contact": {
"id": "3420f9d3-38b1-42ba-91c2-5dc9a4cfa370",
"name": "Contato de teste 1"
}
}
],
"centralPointMappingId": "8107e644-da46-4e8e-9d3d-24ce9e66aaca",
// não faz sentido enviar
"lastUpdatedAt": "2019-07-08T14:40:44.018Z",
"facebook": "Face cliente 1 alterado",
"instagram": "Insta cliente 1 alterado",
"linkedin": "Link cliente 1 alterado",
"twitter": "Twi cliente 1 alterado"
}
```
# Locations
- mantemos isolado ou alteramos para ser um subrecurso de "customers"
- se mantermos isolado seria bom removermos o GET customer/customer/<id>/locations, pois não é um subrecurso
- como temos um recurso isolado para areas seria bom removermos o GET cutomer/locations/<id>/areas ou então alterarmos area para ser um subrecurso de locations.
# Configurations
- todos os endpoints precisam ser revistos por completo
- temos: POST /configurations/customer e POST /configurations/location, que não poderiam existir, pois configurations é um recurso que pode ser do tipo customer/location/lead.
- outra opção seria isolar os endpoints, criando um para cada tipo customer-documents/location-documents/lead-documents e removendo o recurso configurations que existiria somente na persistência.
```JSON
// GET api/v8/customer/configurations
{
"items": [
{
"id": "67a4e71f-f096-4115-9e59-ab61aa4b1b47",
"userInterface": "LOCATION"
},
{
"id": "ccfcf9e3-249a-40e7-9f01-19921f8bc467",
"userInterface": "CUSTOMER",
"configurationIdentificationDocument": [
{
"id": "dd3b8026-5c37-4108-a505-a158dbce66dd",
"configuration": {
"id": "ccfcf9e3-249a-40e7-9f01-19921f8bc467"
},
"identificationDocumentId": "9202b26a-8cc3-47a2-a581-d580bd371366",
"identificationDocumentDescription": "CNPJ",
"identificationDocumentAcronym": "CNPJ",
"identificationDocumentMask": "##.###.###/####-##",
"required": false,
"customerPersonType": {
"id": "f56003bf-2994-4865-aff1-94212c5e0d2c",
"active": true,
"description": "Pessoa Jurídica",
"acronym": "PJ"
},
"active": true
},
{
"id": "54fb9979-2de7-4ed7-96b8-bebaedd0d28c",
"configuration": {
"id": "ccfcf9e3-249a-40e7-9f01-19921f8bc467"
},
"identificationDocumentId": "1fe8062f-984b-4238-a827-21c0e708c8f7",
"identificationDocumentDescription": "Teste",
"identificationDocumentAcronym": "TE",
"required": false,
"customerPersonType": {
"id": "1d6cce12-0372-45f9-9a18-56b4c2b3364e",
"active": true,
"description": "Pessoa Física",
"acronym": "PF"
},
"active": false
},
{
"id": "394fda38-35fb-4fa0-8fbd-fd041c99f410",
"configuration": {
"id": "ccfcf9e3-249a-40e7-9f01-19921f8bc467"
},
"identificationDocumentId": "47553b5e-2b3e-4e0f-8cc3-96d52ae8a9b3",
"identificationDocumentDescription": "CPF",
"identificationDocumentAcronym": "CPF",
"required": false,
"customerPersonType": {
"id": "1d6cce12-0372-45f9-9a18-56b4c2b3364e",
"active": true,
"description": "Pessoa Física",
"acronym": "PF"
},
"active": true
}
]
}
],
"count": 3,
"page": 0,
"pageSize": 500
}
```
- /api/v8/customer/configurations/interface/CUSTOMER e /api/v8/customer/configurations/customer são similares, por que temos as duas????