---
# System prepended metadata

title: Customer

---

# 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????
 