RUC Paraguay

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

RUC Paraguay

Mensagem por TerraSoftware »

Caros colegas.

Preciso validar documentos paraguaios (RUC), tanto de pessoa fisica como juridica, alguem pode me ajudar?
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

RUC Paraguay

Mensagem por TerraSoftware »

Caros colegas.
Já consegui validar o RUC pessoa juridica.
Ainda me falta o RUC pessoa fisica.
Alguem pode me ajudar?
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

RUC Paraguay

Mensagem por rochinha »

Amiguinho

O que acontece ao validar PF, algum erro, invalidação?
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

RUC Paraguay

Mensagem por fladimir »

Colega....

Poderia mostrar como fez para validar o RUC pessoa jurídica??

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

RUC Paraguay

Mensagem por TerraSoftware »

Caros colegas.

A validacao do RUC juridica é assim:

Código: Selecionar todos

// onde vg é o RUC digitado com 9 digitos
nBaseMax  := 11
cNumero_al:= left(vg,8)
nDicer := substr(vg,9,1)
k  := 2
aux:= 0
v_total:= 0
for i:= len(cNumero_al) to 1 step -1
    if k > nBaseMax
       k:= 2
    endif
    aux:= val(substr(cNumero_al, i, 1))
    v_total:= v_total + (aux * k)
    k:= k + 1   
next i
resto:= mod(v_total, 11)
dv:= 0
if resto > 1
   dv:= 11 - resto
endif
if nDicer # strzero(int(dv),1)
   alert("RUC incorreto.")
endif
No caso do RUC fisica a validação sempre retorna um digito verificador diferente do certo. Provavelmente por que o RUC fisica tem 8 digitos e o juridica tem 9.
Deve haver outra formula para o RUC fisica.
Resta agora descobri-la.
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

RUC Paraguay

Mensagem por rochinha »

Amiguinho

Pelo jeito voce ja tem a resposta mas ainda não enxergou na função.

Se o RUC fisica tem 8 digitos e o juridica tem 9 voce pode testar antes e alterar as linhas abaixo:

Código: Selecionar todos

cNumero_al:= left(vg,8)
nDicer := substr(vg,9,1)
Cálculo:

Código: Selecionar todos

//
lRUCFisica := iif( len(alltrim(vg))=8, .t., .f. )
//
cNumero_al:= left(vg,iif( lRUCFisica, 7, 8 ))
nDicer := substr(vg,iif( lRUCFisica, 8, 9 ),1)
Resposta:

Código: Selecionar todos

if nDicer # strzero(int(dv),1)
   alert("RUC "+iif( lRUCFisica, "Fisico", "Juridico" )+" incorreto.")
endif
Se a formula de codigo for a mesma o que mudará será apenas o tamanho da string à ser calculada.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

RUC Paraguay

Mensagem por TerraSoftware »

Caro colega Rochinha.
Sua ideia nao deu certo, obrigado pela tentativa.
Acredito que para RUC fisica realmente exista outra formula, o problema é que nao estou encontrando a bendita.
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

RUC Paraguay

Mensagem por rochinha »

Amiguinho,

Este trecho me deixou numa duvida:

Código: Selecionar todos

resto:= mod(v_total, 11)
dv:= 0
if resto > 1
   dv:= 11 - resto
endif
Nele:
- se resto for 0 ou 1 então o digito será sempre 0?
- não seria o caso de usar if resto >= 1?

Ainda assim no entanto encontrei a seguinte função, um pouco diferente da sua mas não especifica nada em relação a RUC Juridica ou Fisica:

Código: Selecionar todos

// Funcion para calcular el digito verificador de un ruc - py
// @author en PL/SQL: www.set.gov.py
// @author en Power Builder: Robert Galeano Fernandez - rgfpy - www.sourcepy.com
/*
  ARGUMENTOS
  Arg1(string): vruc: numero de cedula o numero de ruc sin dv
  Arg2(integer): vbase_max: numero max que puede obtener el digito verificador
  Return: retorna el numero de digito verificador
*/
 
double vnuevo_ruc_aux = 0
double vresto
long i1
long k = 2
string vnuevo_ruc
string vletra_ruc
integer vdigito
 
// generamos nuevo ruc, comprobamos si el caracter obtenido es numerico o string si es string convertimos en su valor ascii
FOR i1 = 1 to len(vruc)
  vletra_ruc = upper(mid(vruc,i1,1))
  IF not (vletra_ruc >= "0" and vletra_ruc <= "9") then
    vnuevo_ruc += string(asc(vletra_ruc))
  ELSE
    vnuevo_ruc += vletra_ruc
  END IF
NEXT
 
// generamos el nuevo numero de ruc aux partiendo en orden DESC de acuerdo al nuevo ruc generado, tomando cada letra en el ciclo y multiplicarlo por el acumulador k
FOR i1 = len(vnuevo_ruc) to 1 step -1
  IF k > vbase_max then k = 2
 
    vnuevo_ruc_aux += integer(mid(vnuevo_ruc,i1,1)) * k
    k += 1
NEXT
 
// obtener el resto de la division de vnuevo_ruc_aux entre 11
vresto = mod(vnuevo_ruc_aux, 11)
 
// si el resto es mayor a 1 restamos con 11 sino igualamos a 0
IF vresto > 1 then
  vdigito = 11 - vresto
ELSE
  vdigito = 0
END IF
 
return vdigito
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder