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