Criando vaga padrão com campo customizado
Conceitos importantes!
Não é possível criar um novo campo pela API, portanto todos os campos customizados devem estar previamente corretamente cadastrados na plataforma para que possamos utilizá-los no momento de criar uma vaga. Logo, um campo customizado sempre estará atrelado à uma vaga. Caso alguma modificação ocorra no campo pelo setup, essa só refletirá nas vagas que forem criadas após a modificação.
Essa modificação pode ser:
- a inclusão/remoção de uma opção na lista suspensa de um campo
 - alteração do tipo do campo
 - alteração da obrigatoriedade
 
Se um campo customizado for utilizado na integração ele não pode ser removido da plataforma e mesmo que seja recriado com o mesmo nome, o seu id será alterado e isso impactará no DExPARA de campos.
Estrutura dos campos customizados
id: identificador do camporequired: se o campo é obrigatório ou nãolabel: título do campotype: tipo do campoorder: ordem do campovalue: resposta do campo (caso houver)enum: possíveis respostas disponíveis
Unicamente na estrutura de Campos do tipo Condicional temos algumas chaves extras:
conditionalOptions: é um array que armazena informações associadas a resposta do campo condicional, possuindo as chaves abaixo:conditionalOption: a resposta no qual está associada do campo condicionalconditionalQuestions: as perguntas associadas que poderão ser respondidas caso a opção condicional acima seja escolhida
Abaixo temos alguns exemplos da estrutura de dados de Campos Customizados, sendo dos tipos boolean, lista suspensa (select) e conditional
[
   {
      "id":"57e848a6-8e76-4f70-b72b-8833896f5c8a",
      "required":false,
      "label":"Você possui aprovação para essa vaga?",
      "type":"boolean",
      "order":1
   },
   {
      "id":"771d9680-00cc-4485-81cc-2a2fc2fc0581",
      "required":true,
      "label":"Qual o período?",
      "type":"select",
      "order":2,
      "enum":[
         "Manhã",
         "Tarde",
         "Noite"
      ],
      "value":"Manhã"
   },
   {
      "id":"123d9680-00cc-4485-81cc-2a2fc2fc0581",
      "required":false,
      "label":"Essa vaga foi requisitada internamente?",
      "type":"conditional",
      "order":3,
      "value":"Não",
      "enum":[
         "Sim",
         "Não"
      ],
      "conditionalOptions":[
         {
            "conditionalOption":"Sim",
            "conditionalQuestions":[
               {
                  "id":"42223321-8419-4532-8443-9d40bccc4190",
                  "required":false,
                  "label":"Quem requisitou a vaga?",
                  "type":"string",
                  "order":1
               }
            ]
         }
      ]
   }
]
Para que uma resposta seja apagada, deverá ser ser enviado o id com o value sendo  null.
O que é um Campo Condicional?
Um campo tipo Condicional é um Campo Customizado que possibilita a definição prévia de possíveis respostas para o campo - como se fosse um campo do tipo seleção simples.
O diferencial deste campo para o de seleção simples, é que nele é possível criar e associar novos campos a uma resposta especifica, que possibilitará ser respondido de acordo com a resposta realizada.
Um exemplo de Campo Condicional poderia ser uma pergunta do tipo: A vaga requer CNH?. Como resposta para essa pergunta, o campo proporciona a possibilidade de definição prévia das possíveis respostas, como por exemplo: Sim e Não. Diferente do campo de seleção simples, o Campo Condicional de acordo com a resposta efetuada para a pergunta, possibilita responder outros campos, que foram associados a resposta escolhida. Na criação de um campo do tipo Condicional, o usuário pode criar e fazer a associação das novas perguntas com as respostas existentes. Continuando no exemplo, caso seja respondida a opção Sim, será possível responder outras duas perguntas, como por exemplo: Qual o tipo da CNH necessária para a vaga?. Já se a resposta fosse Não, não existiria mais nenhuma pergunta associada.
No diagrama abaixo é possível observar uma ilustração do cenário explicado.
Como responder um Campo Condicional na API Pública?
Como apresentado anteriormente, o mesmo padrão vale para perguntas do tipo Condicional, devendo seguir a mesma estrutura do customFields, passando o identificador (id) do Campo Condicional e a resposta para o campo (value).
Para os campos associados é o mesmo cenário, deverá responder o id e o value, porém, é preciso que opção correspondente do campo condicional para os campos associados esteja já preenchida, ou seja enviada em conjunto. Caso a resposta do campo condicional não for preenchida ou se responder um campo associado à outra resposta do campo condicional, a resposta não será considerada.
{
   "customFields":[
      {
         "id":"identificador-do-campo-condicional", // Essa vaga requer CNH?
         "value":"Sim"
      },
      {
         "id":"identificador-do-campo-associado", // Qual o tipo da CNH necessária?
         "value":"B"
      }
   ]
}
Para que uma resposta seja apagada, deverá ser ser enviado o id com o value sendo  null. Caso a resposta campo condicional seja apagada, ou seu valor alterado para outra opção, as respostas dos campos associados à antiga opção também serão apagadas.
Fluxo de integração:
É necessário enviar um array de objetos, onde em cada objeto deverá existir duas propriedades.
id: o identificador do campo que será respondidovalue: a resposta para o campo
 "customFields": [
    {
      "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
      "value": "Sim"
    }   
  ]
Obtenha o id de um campo customizado:
- Acesse o endpoint GET findcompanycustomfields
 - Salve o(s) results.id do(s) campo(s) que deseja
 
Faça a requisição de criação de vaga:
- Com o (s) 
id(S)em mãos, faça a requisição para a API POST Jobs, adicionando o objetocustomFieldsem sua requisição. 
| Parâmetro | Descrição | 
|---|---|
| code | Refere-se ao código interno da vaga atribuído pelo sistema terceiro | 
| name | Título dado para a vaga | 
| type | Modo de contratação | 
| publicationType | Se a vaga será interna ou externa | 
| numVacancies | Número de pessoas que serão contratadas para uma mesma vaga. | 
| departmentId | Código da área gerado automaticamente pela Gupy (campo Id) que a vaga está atrelada. | 
| roleId | Código do cargo gerado automaticamente pela Gupy (campo Id) que a vaga está atrelada. | 
| branchId | Código da filial gerado automaticamente pela Gupy (campo Id) | 
| customFields | Array de objetos com id e value | 
Exemplo de requisição:
curl --request POST \
     --url https://api.gupy.io/api/v1/jobs \
     --header 'accept: application/json' \
     --header 'authorization: Bearer xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx' \
     --header 'content-type: application/json' \
     --data '
{
  "type": "vacancy_type_effective",
  "publicationType": "internal",
  "departmentId": 5962,
  "roleId": 7872,
  "name": "Desenvolvedor Backend",
  "numVacancies": 1,
  "customFields": [
    {
      "id": "c8db52a6-f4a7-431a-8183-983f8c83cbbb",
      "value": "preenchendo um campo customizado pela API"
    }
  ]
}
'Exemplo de resposta:
{
  "id": 7168332,
  "code": "0266-7168090",
  "name": "Desenvolvedor Backend",
  "status": "draft",
  "type": "vacancy_type_effective",
  "publicationType": "internal",
  "numVacancies": 1,
  "departmentId": 5962,
  "departmentName": "Administrativo (ML)",
  "roleId": 7872,
  "roleName": "Analista Teste Z",
  "subsidiaryId": null,
  "subsidiaryName": null,
  "createdAt": "2024-05-15T00:47:10.936Z",
  "updatedAt": "2024-05-15T00:47:11.032Z",
  "hiringDeadline": null,
  "description": null,
  "responsibilities": null,
  "prerequisites": null,
  "additionalInformation": null,
  "notes": null,
  "disabilities": false,
  "addressStreet": null,
  "addressNumber": null,
  "addressCity": null,
  "addressState": null,
  "addressStateShortName": null,
  "addressCountry": null,
  "addressCountryShortName": null,
  "addressComplements": null,
  "addressDistrict": null,
  "addressZipCode": null,
  "addressLatitude": null,
  "addressLongitude": null,
  "remoteWorking": false,
  "workplaceType": "on-site",
  "reason": null,
  "image": null,
  "socialMediaImage": null,
  "applicationDeadline": null,
  "careerPageId": null,
  "careerPageName": null,
  "vacancyCodes": [],
  "managerId": null,
  "managerName": null,
  "managerEmail": null,
  "recruiterId": null,
  "recruiterName": null,
  "recruiterEmail": null,
  "salary": {
    "currency": null,
    "startsAt": null,
    "endsAt": null
  },
  "customFields": [
    {
      "id": "6a833913-d65c-40ae-9a91-132bf7627b73",
      "required": true,
      "label": "Vaga Confidencial?",
      "type": "boolean",
      "order": 1
    },
    {
      "id": "e24226fc-eb95-4fcb-baeb-4d5a792859d8",
      "required": true,
      "label": "Substituição? ",
      "type": "text",
      "order": 2
    },
    {
      "id": "4c490a25-a91a-4762-825e-1a42b6543b4f",
      "required": true,
      "label": "Informe a Superintendência",
      "type": "select",
      "order": 3,
      "enum": [
        "1\t\tA"
      ]
    },
    {
      "id": "eb8078e7-f5e3-4d9d-b9cd-73974671dcfc",
      "required": true,
      "label": "Horário de trabalho",
      "type": "time",
      "order": 4
    },
    {
      "id": "c01422d8-b2d2-4a51-a7fa-acece31a8db7",
      "required": true,
      "label": "Campo condicional",
      "type": "conditional",
      "order": 5,
      "enum": [
        "Isso é um teste",
        "Essa opção é inválida",
        "Adicionando um aqui",
        "AAAAAAAA"
      ],
      "conditionalOptions": [
        {
          "conditionalOption": "Isso é um teste",
          "conditionalQuestions": [
            {
              "id": "dfe16eac-d973-4ca0-8c8b-7657104b1b13",
              "required": true,
              "label": "Digite o numero do teste",
              "type": "select",
              "order": 1,
              "enum": [
                "Teste 1",
                "teste 2"
              ]
            }
          ]
        },
        {
          "conditionalOption": "Essa opção é inválida",
          "conditionalQuestions": []
        },
        {
          "conditionalOption": "Adicionando um aqui",
          "conditionalQuestions": []
        },
        {
          "conditionalOption": "AAAAAAAA",
          "conditionalQuestions": []
        }
      ]
    },
    {
      "id": "c8db52a6-f4a7-431a-8183-983f8c83cbbb",
      "required": false,
      "label": "teste",
      "type": "text",
      "order": 6,
      "value": "preenchendo um campo customizado pela API"
    },
    {
      "id": "c3619a79-b783-4a9f-8153-2ab7f54ba7cc",
      "required": false,
      "label": "Teste \\t",
      "type": "select",
      "order": 7,
      "enum": [
        "12321\ta",
        "123123\ts",
        "123123123\tsd",
        "123123\tdd"
      ]
    }
  ],
  "jobRatingCriterias": [],
  "cancelReason": null,
  "cancelReasonNotes": null,
  "canceledByEmail": null,
  "cancelAt": null,
  "publishedAt": null,
  "closedAt": null,
  "approvedAt": null,
  "disapprovedAt": null,
  "lastFreezeDate": null,
  "lastUnfreezeDate": null,
  "creatorId": 22011,
  "creatorName": "Public API",
  "creatorEmail": "[email protected]",
  "videoUrl": null,
  "approvers": null,
  "workflowRequestMethod": null,
  "branchId": null,
  "branchName": null
}- Repare que customFields vem dentro de um array [] e que o único preenchido com value é o que foi enviado na requisição POST. Quando for publicar a vaga será necessário preencher todos os campos customizados que são obrigatórios, ou seja onde 
required:true 
Dúvidas frequentes:
- Estou desenvolvendo uma integração e alguns campos condicionais foram criados na plataforma, porém os ids se alteram e não consigo realizar o DExPARA corretamente. O que fazer? Os ids não são fixos?
 
Resposta:
Conforme apresentado anteriormente, temos a seguinte estrutura exemplo de campos customizados condicionais:
{
   "id":"123d9680-00cc-4485-81cc-2a2fc2fc0581",
   "required":false,
   "label":"Essa vaga requer CNH?",
   "type":"conditional",
   "order":1,
   "value":"Sim",
   "enum":[
      "Sim",
      "Não"
   ],
   "conditionalOptions":[
      {
         "conditionalOption":"Sim",
         "conditionalQuestions":[
            {
               "id":"42223321-8419-4532-8443-9d40bccc4190",
               "required":false,
               "label":"Qual o tipo da CNH necessária?",
               "type":"select",
               "order":1,
               "value":"B",
               "enum":[
                  "A",
                  "B",
                  "C",
                  "D",
                  "E"
               ]
            }
         ]
      },
      {
         "conditionalOption":"Não",
         "conditionalQuestions":[
            
         ]
      }
   ]
}
Onde o "id":"123d9680-00cc-4485-81cc-2a2fc2fc0581" se refere ao id do campo principal e suas respectivas opções de seleção localizadas dentro do array enum[] e o id":"42223321-8419-4532-8443-9d40bccc4190" se refere ao campo criado a partir de uma das opções de seleção no caso a opção "Sim"
Exemplo prático:
No exemplo abaixo o campo Contrato de trabalho  possui o id principal e os campos Escala de trabalho padrão, Escala de trabalho - flex e Escala de trabalho possuem cada qual seu id específico e assim ocorrerá para cada novo campo que possa ser criado a partir de uma opção de seleção.
Considere esse fator no mapeamento de campos da sua integração, pois no envio do webhook irá apenas o id correspondente ao campo que foi selecionado como resposta, mas como as respostas variam entre as vagas você poderá receber diferentes ids a cada integração.
Para conhecer todos os ids de todos os campos customizados que estão criados na plataforma consulte o endpoint listing custom fields of a company for job creation
- Os campos customizados podem variar de acordo com o template das vagas? Como procuro quais campos customizados um template possui?
 
Resposta: Sim, podem variar. Um template pode ser criado e momentos depois um campo customizado ser criado na plataforma, logo esse template não vai atualizar com o novo campo, mas templates criados a partir desse momento vão ter em sua configuração o novo campo. Para saber quais campos customizados um template possui, disponibilizamos a API Listing custom-fields of a job template
- Os campos customizados podem variar de acordo com as vagas? Como procuro quais campos customizados uma vaga específica possui?
 
Resposta: Sim, podem variar. Uma vaga pode ser criada e momentos depois um campo customizado ser criado na plataforma, logo essa vaga não vai atualizar com o novo campo, mas vagas criados a partir desse momento vão ter em sua configuração o novo campo. Para saber quais campos customizados uma vaga possui, disponibilizamos a API Listing custom fields of a job
Possíveis erros
Campos customizados modificados
- Campos customizados do tipo múltipla seleção, por exemplo, são formados por arrays. Alterar essa configuração fará com que ocorram erros. Se atente ao tipo de campo customizado e como é a sua respectiva estrutura para a implementação correta.
 - Um novo campo customizado só poderá ser utilizado em vagas criadas posteriores à ele. A deleção e posterior criação de um campo customizado altera o seu Id.
 - Quando um campo é tipo lista suspensa (select) apenas valores iguais aos da lista cadastrada (que estão no enum []) serão aceitos.
 
Updated 5 months ago
