Exemplo da API CPF com NodeJS

NodeJS

Aprenda a integrar a API CPF do SintegraWS com NodeJS utilizando exemplos de código práticos.

Siga o exemplo abaixo para implementar a API CPF com NodeJS no seu ambiente de desenvolvimento e aprimorar a confiabilidade do seu sistema.

  (async () => {
    // Aqui você define os valores dos parâmetros da API:
    // Este código assume Node.js 18+ com fetch e AbortController nativos
    const token = 'SEU_TOKEN_AQUI';
    const cpf = '12345678901';
    const dataNascimento = '03061988';
    // Antes de tudo, validar o CPF
    if (!isValidCPF(cpf)) {
      console.error("CPF inválido!");
      return;
    }
  
    // Montando a URL com parâmetros codificados
    const url = `https://www.sintegraws.com.br/api/v1/execute-api.php?token=${encodeURIComponent(token)}&cpf=${encodeURIComponent(cpf)}&data-nascimento=${encodeURIComponent(dataNascimento)}&plugin=CPF`;
  
    // Criar AbortController para implementar o timeout manualmente
    const controller = new AbortController();
    const signal = controller.signal;
  
    // Timeout de 120 segundos
    const timeout = setTimeout(() => {
      controller.abort();
    }, 120000);
  
    try {
      const response = await fetch(url, { signal });
      if (!response.ok) {
        throw new Error(`Erro na requisição: ${response.status} ${response.statusText}`);
      }
  
      const data = await response.json();
      if (data.status === "OK") {
        console.log("Status está OK!");
      } else {
        console.log("Status não está OK ou não encontrado.");
      }
    } catch (error) {
      console.error('Erro ao chamar a API:', error);
    } finally {
      clearTimeout(timeout);
    }
  })();

  // Essa função é utilizada para validar o CPF antes de realizar a chamada na API
  function isValidCPF(cpf) {
    // Remove todos os caracteres não-numéricos
    cpf = cpf.replace(/[^\d]+/g, '');
    // Verifica se tem 11 dígitos
    if (cpf.length !== 11) return false;
    // Verifica se todos os dígitos são iguais
    if (/^(.)\1+$/.test(cpf)) return false;
  
    let add = 0;
    for (let i = 0; i < 9; i++) {
      add += parseInt(cpf.charAt(i)) * (10 - i);
    }
    let rev = 11 - (add % 11);
    rev = (rev === 10 || rev === 11) ? 0 : rev;
    if (rev !== parseInt(cpf.charAt(9))) return false;
  
    add = 0;
    for (let i = 0; i < 10; i++) {
      add += parseInt(cpf.charAt(i)) * (11 - i);
    }
    rev = 11 - (add % 11);
    rev = (rev === 10 || rev === 11) ? 0 : rev;
    return (rev === parseInt(cpf.charAt(10)));
  }
  (async () => {
    // Aqui você define os valores dos parâmetros da API:
    const token = 'SEU_TOKEN_AQUI';
    const cpf = '12345678901';
    const dataNascimento = '03061988';
    // Antes de tudo, validar o CPF
    if (!isValidCPF(cpf)) {
      console.error("CPF inválido!");
      return;
    }
  
    // Montando a URL com os parâmetros codificados para evitar problemas com caracteres especiais
    const url = `https://www.sintegraws.com.br/api/v1/execute-api.php?token=${encodeURIComponent(token)}&cpf=${encodeURIComponent(cpf)}&data-nascimento=${encodeURIComponent(dataNascimento)}&plugin=CPF`;
  
    // Criamos um AbortController para permitir cancelar a requisição, caso atinja o timeout
    const controller = new AbortController();
    const signal = controller.signal;
  
    // Definimos um timeout de 120 segundos (120.000 milissegundos).
    // Se a requisição não responder nesse tempo, abortamos.
    const timeout = setTimeout(() => {
      controller.abort();
    }, 120000);
  
    try {
      // Fazendo a requisição GET usando fetch e aguardando a resposta.
      // Passamos o 'signal' do AbortController para poder abortar se necessário.
      const response = await fetch(url, { signal });
  
      // Verificando se o status da resposta é OK (200)
      if (!response.ok) {
        // Se não for, lançamos um erro para cair no bloco catch
        throw new Error(`Erro na requisição: ${response.status} ${response.statusText}`);
      }
  
      // Convertendo a resposta para JSON
      const data = await response.json();
  
      // Aqui você pode manipular os dados retornados da API.
      // Vamos apenas verificar se o campo "status" é "OK"
      if (data.status === "OK") {
        console.log("Status está OK!");
      } else {
        console.log("Status não está OK ou não encontrado.");
      }
    } catch (error) {
      // Tratando qualquer erro que possa ocorrer durante a requisição ou o processamento,
      // incluindo o erro de timeout (AbortError) ou problemas de rede.
      console.error('Erro ao chamar a API:', error);
    } finally {
      // Limpamos o timeout, garantindo que não fique pendente após o término da operação.
      clearTimeout(timeout);
    }
  })();

  // Essa função é utilizada para validar o CPF antes de realizar a chamada na API
  function isValidCPF(cpf) {
    // Remove todos os caracteres não-numéricos
    cpf = cpf.replace(/[^\d]+/g, '');
    // Verifica se tem 11 dígitos
    if (cpf.length !== 11) return false;
    // Verifica se todos os dígitos são iguais
    if (/^(.)\1+$/.test(cpf)) return false;
  
    let add = 0;
    for (let i = 0; i < 9; i++) {
      add += parseInt(cpf.charAt(i)) * (10 - i);
    }
    let rev = 11 - (add % 11);
    rev = (rev === 10 || rev === 11) ? 0 : rev;
    if (rev !== parseInt(cpf.charAt(9))) return false;
  
    add = 0;
    for (let i = 0; i < 10; i++) {
      add += parseInt(cpf.charAt(i)) * (11 - i);
    }
    rev = 11 - (add % 11);
    rev = (rev === 10 || rev === 11) ? 0 : rev;
    return (rev === parseInt(cpf.charAt(10)));
  }
  package main

  import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
    "time"
  )

  func main() {
    // Aqui você define os valores dos parâmetros da API:
    token := "SEU_TOKEN_AQUI"
    cpf := "12345678901"
    dataNascimento := "03061988"

    if !isValidCPF(cpf) {
      fmt.Println("CPF inválido!")
      return
    }


    // Montando a URL com parâmetros codificados
    requestUrl := "https://www.sintegraws.com.br/api/v1/execute-api.php?token=" + url.QueryEscape(token) + "&cpf=" + url.QueryEscape(cpf) + "&data-nascimento=" + url.QueryEscape(dataNascimento) + "&plugin=CPF"

    client := http.Client{
      Timeout: 120 * time.Second,
    }

    resp, err := client.Get(requestUrl)
    if err != nil {
      fmt.Println("Erro ao chamar a API:", err)
      return
    }
    defer resp.Body.Close()

    if resp.StatusCode < 200 || resp.StatusCode >= 300 {
      fmt.Printf("Erro na requisição: %d\n", resp.StatusCode)
      return
    }

    body, err := io.ReadAll(resp.Body)
    if err != nil {
      fmt.Println("Erro ao ler resposta:", err)
      return
    }

    var data map[string]interface{}
    if err := json.Unmarshal(body, &data); err != nil {
      fmt.Println("Erro ao converter JSON:", err)
      return
    }

    if data["status"] == "OK" {
      fmt.Println("Status está OK!")
    } else {
      fmt.Println("Status não está OK ou não encontrado.")
    }
  }

  func digitsOnly(value string) string {
    digits := make([]rune, 0, len(value))
    for _, char := range value {
      if char >= '0' && char <= '9' {
        digits = append(digits, char)
      }
    }
    return string(digits)
  }

  func isValidCPF(cpf string) bool {
    cpf = digitsOnly(cpf)
    if len(cpf) != 11 {
      return false
    }

    allEqual := true
    for i := 1; i < len(cpf); i++ {
      if cpf[i] != cpf[0] {
        allEqual = false
        break
      }
    }
    if allEqual {
      return false
    }

    sum := 0
    for i := 0; i < 9; i++ {
      sum += int(cpf[i]-'0') * (10 - i)
    }
    digit := 11 - (sum % 11)
    if digit == 10 || digit == 11 {
      digit = 0
    }
    if digit != int(cpf[9]-'0') {
      return false
    }

    sum = 0
    for i := 0; i < 10; i++ {
      sum += int(cpf[i]-'0') * (11 - i)
    }
    digit = 11 - (sum % 11)
    if digit == 10 || digit == 11 {
      digit = 0
    }
    return digit == int(cpf[10]-'0')
  }
  <?php
  $token = 'SEU_TOKEN_AQUI';
  $cpf = '12345678901';
  $dataNascimento = '03061988';

  if (!isValidCPF($cpf)) {
    echo 'CPF inválido!';
    exit;
  }


  $query = [
    'token' => $token,
    'cpf' => $cpf,
    'data-nascimento' => $dataNascimento,
    'plugin' => 'CPF'
  ];

  $url = 'https://www.sintegraws.com.br/api/v1/execute-api.php?' . http_build_query($query);

  $curl = curl_init();
  curl_setopt_array($curl, [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 120,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_CUSTOMREQUEST => 'GET',
  ]);

  $response = curl_exec($curl);
  $error = curl_error($curl);
  curl_close($curl);

  if ($error) {
    echo 'Erro ao chamar a API: ' . $error;
    exit;
  }

  $data = json_decode($response, true);

  if (isset($data['status']) && $data['status'] === 'OK') {
    echo 'Status está OK!';
  } else {
    echo 'Status não está OK ou não encontrado.';
  }

  function onlyDigits($value)
  {
    return preg_replace('/\D/', '', $value);
  }

  function isValidCPF($cpf)
  {
    $cpf = onlyDigits($cpf);
    if (strlen($cpf) != 11) return false;
    if (preg_match('/^(\d)\1{10}$/', $cpf)) return false;

    for ($t = 9; $t < 11; $t++) {
      $sum = 0;
      for ($i = 0; $i < $t; $i++) {
        $sum += intval($cpf[$i]) * (($t + 1) - $i);
      }
      $digit = ((10 * $sum) % 11) % 10;
      if (intval($cpf[$t]) != $digit) return false;
    }

    return true;
  }
  import requests

  def only_digits(value):
      return ''.join(char for char in value if char.isdigit())

  def is_valid_cpf(cpf):
      cpf = only_digits(cpf)
      if len(cpf) != 11 or cpf == cpf[0] * 11:
          return False

      for size in range(9, 11):
          total = sum(int(cpf[i]) * ((size + 1) - i) for i in range(size))
          digit = ((total * 10) % 11) % 10
          if int(cpf[size]) != digit:
              return False

      return True

  # Aqui você define os valores dos parâmetros da API:
  token = 'SEU_TOKEN_AQUI'
  cpf = '12345678901'
  data_nascimento = '03061988'

  if not is_valid_cpf(cpf):
      print('CPF inválido!')
      raise SystemExit


  params = {
      'token': token,
      'cpf': cpf,
      'data-nascimento': data_nascimento,
      'plugin': 'CPF'
  }

  try:
      response = requests.get('https://www.sintegraws.com.br/api/v1/execute-api.php', params=params, timeout=120)
      response.raise_for_status()
      data = response.json()

      if data.get('status') == 'OK':
          print('Status está OK!')
      else:
          print('Status não está OK ou não encontrado.')
  except requests.RequestException as error:
      print('Erro ao chamar a API:', error)
  using System;
  using System.Net.Http;
  using System.Text.Json;
  using System.Threading.Tasks;

  class Program
  {
    static async Task Main()
    {
      // Aqui você define os valores dos parâmetros da API:
      var token = "SEU_TOKEN_AQUI";
      var cpf = "12345678901";
      var dataNascimento = "03061988";

      if (!IsValidCPF(cpf))
      {
        Console.WriteLine("CPF inválido!");
        return;
      }


      var url = $"https://www.sintegraws.com.br/api/v1/execute-api.php?token={Uri.EscapeDataString(token)}&cpf={Uri.EscapeDataString(cpf)}&data-nascimento={Uri.EscapeDataString(dataNascimento)}&plugin=CPF";

      using var client = new HttpClient();
      client.Timeout = TimeSpan.FromSeconds(120);

      try
      {
        var response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode();

        var json = await response.Content.ReadAsStringAsync();
        var data = JsonSerializer.Deserialize<JsonElement>(json);

        if (data.TryGetProperty("status", out var status) && status.GetString() == "OK")
        {
          Console.WriteLine("Status está OK!");
        }
        else
        {
          Console.WriteLine("Status não está OK ou não encontrado.");
        }
      }
      catch (Exception error)
      {
        Console.WriteLine($"Erro ao chamar a API: {error.Message}");
      }
    }

    static string OnlyDigits(string value)
    {
      var digits = "";
      foreach (var character in value)
      {
        if (char.IsDigit(character))
        {
          digits += character;
        }
      }
      return digits;
    }

    static bool IsValidCPF(string cpf)
    {
      cpf = OnlyDigits(cpf);
      if (cpf.Length != 11) return false;

      var allEqual = true;
      for (var i = 1; i < cpf.Length; i++)
      {
        if (cpf[i] != cpf[0])
        {
          allEqual = false;
          break;
        }
      }
      if (allEqual) return false;

      for (var size = 9; size < 11; size++)
      {
        var sum = 0;
        for (var i = 0; i < size; i++)
        {
          sum += (cpf[i] - '0') * ((size + 1) - i);
        }
        var digit = ((sum * 10) % 11) % 10;
        if ((cpf[size] - '0') != digit) return false;
      }

      return true;
    }
  }
  import java.io.IOException;
  import java.net.URI;
  import java.net.URLEncoder;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;
  import java.nio.charset.StandardCharsets;
  import java.time.Duration;

  public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
      // Aqui você define os valores dos parâmetros da API:
      String token = "SEU_TOKEN_AQUI";
      String cpf = "12345678901";
      String dataNascimento = "03061988";

      if (!isValidCPF(cpf)) {
          System.err.println("CPF inválido!");
          return;
      }


      String url = "https://www.sintegraws.com.br/api/v1/execute-api.php?token=" + URLEncoder.encode(token, StandardCharsets.UTF_8) + "&cpf=" + URLEncoder.encode(cpf, StandardCharsets.UTF_8) + "&data-nascimento=" + URLEncoder.encode(dataNascimento, StandardCharsets.UTF_8) + "&plugin=CPF";

      HttpClient client = HttpClient.newBuilder()
        .connectTimeout(Duration.ofSeconds(120))
        .build();

      HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .timeout(Duration.ofSeconds(120))
        .GET()
        .build();

      HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

      if (response.statusCode() >= 200 && response.statusCode() < 300) {
        System.out.println(response.body());
      } else {
        System.out.println("Erro na requisição: " + response.statusCode());
      }
    }

    private static String onlyDigits(String value) {
        return value.replaceAll("\\D", "");
    }

    private static boolean isValidCPF(String cpf) {
        cpf = onlyDigits(cpf);
        if (cpf.length() != 11) return false;
        if (cpf.matches("(\\d)\\1{10}")) return false;

        for (int size = 9; size < 11; size++) {
            int sum = 0;
            for (int i = 0; i < size; i++) {
                sum += Character.getNumericValue(cpf.charAt(i)) * ((size + 1) - i);
            }
            int digit = ((sum * 10) % 11) % 10;
            if (Character.getNumericValue(cpf.charAt(size)) != digit) return false;
        }

        return true;
    }
  }
  import Foundation

  func isValidCPF(_ cpf: String) -> Bool {
    let numbers = cpf.filter { $0.isNumber }.compactMap { Int(String($0)) }
    if numbers.count != 11 { return false }
    if Set(numbers).count == 1 { return false }

    var sum = 0
    for index in 0..<9 {
      sum += numbers[index] * (10 - index)
    }
    var digit = 11 - (sum % 11)
    if digit == 10 || digit == 11 { digit = 0 }
    if digit != numbers[9] { return false }

    sum = 0
    for index in 0..<10 {
      sum += numbers[index] * (11 - index)
    }
    digit = 11 - (sum % 11)
    if digit == 10 || digit == 11 { digit = 0 }

    return digit == numbers[10]
  }

  // Aqui você define os valores dos parâmetros da API:
  let token = "SEU_TOKEN_AQUI"
  let cpf = "12345678901"
  let dataNascimento = "03061988"

  guard isValidCPF(cpf) else {
    print("CPF inválido!")
    exit(0)
  }


  var components = URLComponents(string: "https://www.sintegraws.com.br/api/v1/execute-api.php")!
  components.queryItems = [
    URLQueryItem(name: "token", value: token),
    URLQueryItem(name: "cpf", value: cpf),
    URLQueryItem(name: "data-nascimento", value: dataNascimento),
    URLQueryItem(name: "plugin", value: "CPF")
  ]

  let request = URLRequest(url: components.url!, timeoutInterval: 120)

  URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
      print("Erro ao chamar a API: \(error)")
      return
    }

    guard let data = data else {
      print("Resposta vazia")
      return
    }

    do {
      let json = try JSONSerialization.jsonObject(with: data, options: [])
      print(json)
    } catch {
      print("Erro ao converter JSON: \(error)")
    }
  }.resume()
  #Include "protheus.ch"
  
  User Function ChamarAPI()
    // Aqui você define os valores dos parâmetros da API
    Local cToken           := "SEU_TOKEN_AQUI"
    Local cCPF             := "12345678901"
    Local cDataNascimento  := "03061988"
    Local cBaseURL       := "https://www.sintegraws.com.br/api/v1/execute-api.php"
    Local cURL, cResp    := ""
    Local nStatus        := 0
    Local oJson

    If !IsValidCPF(cCPF)
      Conout("CPF inválido!")
      Return
    EndIf

    cURL := cBaseURL + ;
    "?token="             + URLEncode(cToken) + ;
    "&cpf="               + URLEncode(cCPF) + ;
    "&data-nascimento="   + URLEncode(cDataNascimento) + ;
    "&plugin=CPF"

    HttpSetTimeOut(120000)
    cResp := HttpGet(cURL)
    nStatus := HttpResult()

    If nStatus <> 200
      Conout("Erro na requisição: " + Ltrim(Str(nStatus)))
      Return
    EndIf

    If Empty(cResp)
      Conout("Resposta vazia.")
      Return
    EndIf

    oJson := JsonDecode(cResp)
    If oJson == Nil
      Conout("Erro ao decodificar JSON.")
      Return
    EndIf

    If oJson["status"] == "OK"
      Conout("Status está OK!")
    Else
      Conout("Status não está OK ou não encontrado.")
    EndIf
  Return

  Static Function IsValidCPF(cCpf)
    Local cClean := ""
    Local i, nSum, nRest

    For i := 1 To Len(cCpf)
      If IsDigit(SubStr(cCpf,i,1))
        cClean += SubStr(cCpf,i,1)
      EndIf
    Next i

    If Len(cClean) <> 11
      Return .F.
    EndIf

    If (cClean == Replicate(SubStr(cClean,1,1),11))
      Return .F.
    EndIf

    nSum := 0
    For i := 1 To 9
      nSum += Val(SubStr(cClean,i,1)) * (11 - i)
    Next i
    nRest := 11 - (nSum % 11)
    If (nRest == 10 .Or. nRest == 11)
      nRest := 0
    EndIf
    If nRest <> Val(SubStr(cClean,10,1))
      Return .F.
    EndIf

    nSum := 0
    For i := 1 To 10
      nSum += Val(SubStr(cClean,i,1)) * (12 - i)
    Next i
    nRest := 11 - (nSum % 11)
    If (nRest == 10 .Or. nRest == 11)
      nRest := 0
    EndIf

    Return (nRest == Val(SubStr(cClean,11,1)))
  EndFunc
  REPORT z_chamar_api.
  
  DATA: lv_token               TYPE string VALUE 'SEU_TOKEN_AQUI',
        lv_cpf                 TYPE string VALUE '12345678901',
        lv_data_nasc           TYPE string VALUE '03061988',
        lv_url                 TYPE string,
        lv_response            TYPE string,
        lv_status_code         TYPE i,
        lv_encoded_token       TYPE string,
        lv_encoded_cpf         TYPE string,
        lv_encoded_dn          TYPE string,
        lv_valid_cpf           TYPE abap_bool.
  
  CALL FUNCTION 'ESCAPE_URL'
    EXPORTING unescaped = lv_token
    IMPORTING escaped   = lv_encoded_token.
  
  CALL FUNCTION 'ESCAPE_URL'
    EXPORTING unescaped = lv_cpf
    IMPORTING escaped   = lv_encoded_cpf.
  
  CALL FUNCTION 'ESCAPE_URL'
    EXPORTING unescaped = lv_data_nasc
    IMPORTING escaped   = lv_encoded_dn.

  PERFORM is_valid_cpf USING lv_cpf CHANGING lv_valid_cpf.
  IF lv_valid_cpf <> abap_true.
    WRITE: / 'CPF inválido!'.
    EXIT.
  ENDIF.
  
  lv_url = |https://www.sintegraws.com.br/api/v1/execute-api.php?token={ lv_encoded_token }&cpf={ lv_encoded_cpf }&data-nascimento={ lv_encoded_dn }&plugin=CPF|.
  
  DATA(lo_http_client) = NEW cl_http_client( ).
  
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING url = lv_url
    IMPORTING client = lo_http_client
    EXCEPTIONS OTHERS = 4.
  
  IF sy-subrc <> 0.
    WRITE: / 'Erro ao criar o HTTP Client'.
    EXIT.
  ENDIF.
  
  lo_http_client->timeout = 120.
  lo_http_client->request->set_header_field( name = '~request_method' value = 'GET' ).
  
  CALL METHOD lo_http_client->send
    EXCEPTIONS OTHERS = 4.
  
  IF sy-subrc <> 0.
    WRITE: / 'Erro ao enviar requisição HTTP.'.
    EXIT.
  ENDIF.
  
  CALL METHOD lo_http_client->receive
    EXCEPTIONS OTHERS = 4.
  
  IF sy-subrc <> 0.
    WRITE: / 'Erro ao receber resposta HTTP.'.
    EXIT.
  ENDIF.
  
  lv_status_code = lo_http_client->response->get_status( ).
  IF lv_status_code <> 200.
    WRITE: / |Erro na requisição: { lv_status_code }|.
    lo_http_client->close( ).
    EXIT.
  ENDIF.
  
  lv_response = lo_http_client->response->get_data( ).
  lo_http_client->close( ).
  
  DATA(lo_json) = NEW /ui2/cl_json( ).
  DATA(ls_result) = lo_json->deserialize( EXPORTING json = lv_response ).
  
  DATA(lv_status) = VALUE string( ls_result[ 'status' ] ).
  
  IF lv_status = 'OK'.
    WRITE: / 'Status está OK!'.
  ELSE.
    WRITE: / 'Status não está OK ou não encontrado.'.
  ENDIF.
  
  FORM is_valid_cpf USING p_cpf TYPE string CHANGING p_valid TYPE abap_bool.
    DATA: lv_cpf TYPE string.
    lv_cpf = p_cpf.
    TRANSLATE lv_cpf TO UPPER CASE.
    REPLACE ALL NON DIGITS IN lv_cpf WITH ''.
  
    IF strlen( lv_cpf ) <> 11.
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    DATA lv_first TYPE c LENGTH 1.
    lv_first = lv_cpf(1).
  
    IF lv_cpf = lv_first && lv_cpf = lv_first(11).
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    DATA: i TYPE i, sum TYPE i, rest TYPE i, val TYPE i.
    sum = 0.
    DO 9 TIMES.
      i = sy-index.
      val = lv_cpf+i(1).
      sum = sum + val * (10 - i).
    ENDDO.
    rest = 11 - ( sum MOD 11 ).
    IF rest = 10 OR rest = 11.
      rest = 0.
    ENDIF.
    IF rest <> lv_cpf+9(1).
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    sum = 0.
    DO 10 TIMES.
      i = sy-index.
      val = lv_cpf+i(1).
      sum = sum + val * (11 - i).
    ENDDO.
    rest = 11 - ( sum MOD 11 ).
    IF rest = 10 OR rest = 11.
      rest = 0.
    ENDIF.
    IF rest <> lv_cpf+10(1).
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    p_valid = abap_true.
  ENDFORM.