Ver Mensaje Individual
  #4  
Viejo 07/03/16, 07:43:39
Koriotto Koriotto is offline
Junior Member
 
Fecha de Ingreso: mar 2014
Mensajes: 24
FUNCTION Y_VALIDAR_RUC_PANAMA.
*"--------------------------------------------------------------------
*" IMPORTING
*" REFERENCE(I_RUC) “RUC a validar
*" REFERENCE(I_DV) “DV a evaluar (No tiene "-")
*" REFERENCE(I_TIPO) “Tipo 1 pers. natural, Tipo 2 pers. jurídica *" EXPORTING
*" REFERENCE(O_DV) “DV obtenido (debe coincidir con I_DV)
*" EXCEPTIONS
*" WRONG_DV

DATA: lv_ruc_in TYPE char20.
lv_i_ruc TYPE lfa1-stcd5,
lv_dv TYPE lfa1-stcd2,
lv_ructb TYPE char21,
lv_dv_length TYPE i,
lv_sw TYPE flag,
lv_ref TYPE char2,
lv_ind TYPE i, "Indice
lv_peso TYPE i VALUE 2, "Peso
lv_suma TYPE p DECIMALS 0, "acumulador
lv_dv1 TYPE i, "Calculated DV 1
lv_dv2 TYPE i, "Calculated DV 2
lv_dv1_c TYPE char1,
lv_dv2_c TYPE char1,
lv_dv_in TYPE char2,
lv_dv_out TYPE char2,
lv_repet TYPE flag,
lv_resto TYPE i,
lv_divisor TYPE i VALUE 11,
ls_error TYPE REF TO cx_sy_conversion_no_number.

lv_ruc_in = i_ruc.
lv_dv = i_dv.

lv_dv_length = strlen( lv_dv ).
IF lv_dv_length EQ 1.
CONCATENATE '0' lv_dv INTO lv_dv.
ENDIF.

TRANSLATE lv_dv USING ' 0'.

IF i_tipo EQ 3.
EXIT.
ENDIF.

CONDENSE lv_dv NO-GAPS.
MOVE lv_dv TO lv_dv_in.

PERFORM zf_init_values.
lv_i_ruc = i_ruc.

PERFORM zf_format_ruc USING i_tipo
CHANGING lv_i_ruc.

SHIFT lv_ruc_in RIGHT DELETING TRAILING space.
TRANSLATE lv_ruc_in USING ' 0'.
MOVE lv_ruc_in TO lv_ructb.

IF lv_ructb+6(1) EQ 'N' OR
lv_ructb+7(1) EQ 'N' OR
lv_ructb+10(1) EQ 'N'.
* Rutina de Personas naturales y números tributarios
IF lv_ructb+6(1) EQ 'N'.
lv_ructb+6(1) = '5'.
ELSEIF lv_ructb+7(1) EQ 'N'.
lv_ructb+7(1) = '5'.
ENDIF.

IF lv_ructb+10(1) EQ 'N' AND lv_ructb+11(1) EQ 'T'.
"Nros Tributarios o Naturalizados
lv_ructb+10(1) = '4'.
lv_ructb+11(1) = '3'.

ELSEIF lv_ructb CS 'PE'." Panameño Extranjero
TRANSLATE lv_ructb USING 'P7'.
TRANSLATE lv_ructb USING 'E5'.

ELSEIF lv_ructb CS 'PI'."Panameño Indigena
TRANSLATE lv_ructb USING 'P7'.
TRANSLATE lv_ructb USING 'I9'.

ELSEIF lv_ructb CS 'AV'."Antes vigencia
TRANSLATE lv_ructb USING 'A1'.
TRANSLATE lv_ructb USING 'V5'.
"Extranjero
ELSEIF lv_ructb CS 'E'. "Extranjero
TRANSLATE lv_ructb USING 'E5'.
* Incluir caso "N"
ELSEIF lv_ructb CS 'N'. "Caso 'N'
TRANSLATE lv_ructb USING 'N4'.
ENDIF.

ELSEIF lv_ructb+7(1) NE 'N'."Persona jurídica

IF lv_ructb+3(1) EQ '0' AND lv_ructb+4(1) EQ '0' AND lv_ructb+5(1) < 5. "Formato antiguo
lv_sw = 'X'.
* Rutina de referencia cruzada
CONCATENATE lv_ructb+5(1) lv_ructb+6(1) INTO lv_ref.
READ TABLE it_arr WITH KEY arr_val = lv_ref.
IF sy-subrc EQ 0.
lv_ructb+5(1) = 0.
lv_ructb+6(1) = it_arr-arr_dig.
ENDIF.
ENDIF.
ENDIF.

****RUTINA DV
* Primer digito
DATA: v_valor TYPE i.
lv_ind = 19.
lv_peso = 2.
lv_suma = 0.
lv_repet = lv_sw.
DO 20 TIMES.
IF lv_peso = 12 AND lv_repet EQ 'X'.
lv_peso = lv_peso - 1.
CLEAR lv_repet.
ENDIF.

TRY.
v_valor = lv_ructb+lv_ind(1).
CATCH cx_sy_conversion_no_number INTO ls_error.
ENDTRY.

lv_suma = lv_suma + ( lv_peso * v_valor ).
lv_peso = lv_peso + 1.
lv_ind = lv_ind - 1.
ENDDO.

IF lv_suma > 0.

lv_resto = lv_suma MOD lv_divisor.

IF lv_resto EQ 0 OR lv_resto EQ 1.
lv_dv1 = 0.
ELSE.
lv_dv1 = lv_divisor - lv_resto.
lv_ructb+20(1) = lv_dv1.
ENDIF.
ENDIF.

* Segundo dígito
CLEAR: lv_resto.
lv_ind = 20.
lv_peso = 2.
lv_suma = 0.
lv_repet = lv_sw.
DO 21 TIMES.
IF lv_peso = 12 AND lv_repet EQ 'X'.
lv_peso = lv_peso - 1.
CLEAR lv_repet.
ENDIF.

TRY.
v_valor = lv_ructb+lv_ind(1).
CATCH cx_sy_conversion_no_number INTO ls_error.
ENDTRY.

lv_suma = lv_suma + ( lv_peso * v_valor ).
lv_peso = lv_peso + 1.
lv_ind = lv_ind - 1.
ENDDO.

IF lv_suma > 0.

lv_resto = lv_suma MOD lv_divisor.

IF lv_resto EQ 0 OR lv_resto EQ 1.
lv_dv2 = 0.
ELSE.
lv_dv2 = lv_divisor - lv_resto.
ENDIF.
ENDIF.

lv_dv1_c = lv_dv1.
lv_dv2_c = lv_dv2.
CONCATENATE lv_dv1_c lv_dv2_c INTO lv_dv_out.

o_dv = lv_dv_out.
IF lv_dv_in NE lv_dv_out.
RAISE wrong_dv.
ELSE.
ENDIF.

ENDFUNCTION.

*&---------------------------------------------------------------------*
*& Form ZF_INIT_VALUES
*&---------------------------------------------------------------------*
FORM zf_init_values .

it_arr-arr_val = 00.
it_arr-arr_dig = 0.
APPEND it_arr.
it_arr-arr_val = 10.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 11.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 12.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 13.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 14.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 15.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 16.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 17.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 18.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 19.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 20.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 21.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 22.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 23.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 24.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 25.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 26.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 27.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 28.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 29.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 30.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 31.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 32.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 33.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 34.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 35.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 36.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 37.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 38.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 39.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 40.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 41.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 42.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 43.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 44.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 45.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 46.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 47.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 48.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 49.
it_arr-arr_dig = 7.
APPEND it_arr.

ENDFORM. " ZF_INIT_VALUES

*&---------------------------------------------------------------------*
*& Form ZF_FORMAT_RUC
*&---------------------------------------------------------------------*
FORM zf_format_ruc USING p_tipo CHANGING ruc_out.

DATA: seg1(11) TYPE c,
seg2(11) TYPE c,
seg3(11) TYPE c,
seg4(11) TYPE c.

DATA: libro_n(4) TYPE c,
tomo3_n(3) TYPE c,
tomo4_n(4) TYPE c,
asiento_n(5) TYPE c,
asiento_n6(6) TYPE c,
prov(2) TYPE c,
sigla(2) TYPE c.

DATA: tomo_j(9) TYPE c,
folio_j(4) TYPE c,
asiento_j(6) TYPE c.

DATA: length TYPE i,
off TYPE i,
ruc_in TYPE char30.
DATA: v_length_seg1 TYPE i,
v_length_seg2 TYPE i,
v_length_seg3 TYPE i,
v_length_ruc TYPE i,

v_length_ruc_20 TYPE i VALUE '20'.
CLEAR: prov, sigla, off.
CLEAR: v_length_seg1, v_length_seg2, v_length_seg3.

*Formatear ruc
ruc_in = ruc_out.
SPLIT ruc_in AT '-' INTO seg1 seg2 seg3 seg4.

v_length_seg1 = strlen( seg1 ).
v_length_seg2 = strlen( seg2
v_length_seg3 = strlen( seg3 ).
v_length_ruc = v_length_seg1 + v_length_seg2 + v_length_seg3.

IF v_length_ruc GT v_length_ruc_20.

MESSAGE e000(wn) WITH 'RUC supera la longitud permitida'.
ELSE.

IF ruc_in CS 'PAS'. "Extranjeros con Pasaporte

ruc_out = ruc_in.

ELSEIF seg2 CS 'NT' AND NOT seg4 IS INITIAL. "número tributario
DO 2 TIMES.
IF seg1+off(1) CA '1234567890'.
CONCATENATE prov seg1+off(1) INTO prov.
ADD 1 TO off.
ENDIF.
ENDDO.

sigla = 'NT'.

CONCATENATE prov sigla INTO seg1.

libro_n = seg1.
WRITE libro_n TO libro_n USING EDIT MASK 'RR____'.
TRANSLATE libro_n USING ' 0'.

tomo3_n = seg3.
WRITE tomo3_n TO tomo3_n USING EDIT MASK 'RR___'.
TRANSLATE tomo3_n USING ' 0'.

asiento_n = seg4.
WRITE asiento_n TO asiento_n USING EDIT MASK 'RR_____'.
TRANSLATE asiento_n USING ' 0'.

IF p_tipo EQ '1'.
CONCATENATE '5' libro_n tomo3_n asiento_n INTO ruc_out.
ELSEIF p_tipo EQ '2'.
CONCATENATE libro_n tomo3_n asiento_n INTO ruc_out.
ENDIF.

ELSEIF p_tipo EQ 1 AND seg1 NA sy-abcde AND seg2 NA syabcde. "Persona natural sin sigla

IF v_length_seg3 GT '6'.
MESSAGE e000(wn) WITH 'Formato RUC incorrecto'.
ELSE.

length = strlen( seg1 ).

IF length = 2.
prov = seg1.
sigla = '00'.
ELSE.
CONCATENATE '0' seg1 INTO prov.
sigla = '00'.
ENDIF.
CONCATENATE prov sigla INTO seg1.

libro_n = seg1.
WRITE libro_n TO libro_n USING EDIT MASK 'RR____'.
TRANSLATE libro_n USING ' 0'.

asiento_n = seg3.
WRITE asiento_n TO asiento_n USING EDIT MASK 'RR_____'.
TRANSLATE asiento_n USING ' 0'.

IF length = 4.

tomo4_n = seg2.
WRITE tomo4_n TO tomo4_n USING EDIT MASK 'RR____'.
TRANSLATE tomo4_n USING ' 0'.
CONCATENATE 'N' libro_n tomo4_n asiento_n INTO ruc_out.

ELSE.

tomo3_n = seg2.
WRITE tomo3_n TO tomo3_n USING EDIT MASK 'RR___'.
TRANSLATE tomo3_n USING ' 0'.
CONCATENATE 'N' libro_n tomo3_n asiento_n INTO ruc_out.

ENDIF.
ENDIF.
ELSEIF p_tipo EQ 1 AND ( seg1 CA sy-abcde OR
seg2 CA sy-abcde ). "Persona natural con sigla

IF v_length_seg3 GT '6'. MESSAGE e000(wn) WITH 'Formato RUC incorrecto'. ELSE.
IF seg1 CS 'PE' OR seg2 CS 'PE'.
length = strlen( seg2 ).
prov = '00'.
sigla = 'PE'.

ELSEIF seg1 CS 'PI' OR seg2 CS 'PI'.
length = strlen( seg3 ).
prov = seg1.

sigla = 'PI'.

ELSEIF seg1 CS 'N' OR seg2 CS 'N'.
length = strlen( seg2 ).
prov = '00'.
sigla = 'N0'.

ELSEIF seg1 CS 'E' OR seg2 CS 'E'.
length = strlen( seg2 ).
prov = '00'.
sigla = 'E0'.

ELSEIF seg1 CS 'AV' OR seg2 CS 'AV'.

length = strlen( seg3 ).
prov = seg1.

sigla = 'AV'.

ENDIF.

CONCATENATE prov sigla INTO seg1.

libro_n = seg1.
WRITE libro_n TO libro_n USING EDIT MASK 'RR____'.
TRANSLATE libro_n USING ' 0'.

IF seg4 IS INITIAL.

IF strlen( seg3 ) LE 5.
asiento_n = seg3.
CLEAR asiento_n6.
ELSE.
asiento_n6 = seg3.
CLEAR asiento_n.
ENDIF.
ELSE.

IF strlen( seg4 ) LE 5.
asiento_n = seg4.
CLEAR asiento_n6.
ELSE.
asiento_n6 = seg4.
CLEAR asiento_n.
ENDIF.
ENDIF.

IF asiento_n IS NOT INITIAL.
WRITE asiento_n TO asiento_n USING EDIT MASK 'RR_____'.
TRANSLATE asiento_n USING ' 0'.
ENDIF.

IF asiento_n6 IS NOT INITIAL.
WRITE asiento_n6 TO asiento_n6 USING EDIT MASK 'RR______'.
TRANSLATE asiento_n6 USING ' 0'.
ENDIF.

IF length = 4.

IF seg4 IS INITIAL.
tomo4_n = seg2.
ELSE.
tomo4_n = seg3.
ENDIF.
WRITE tomo4_n TO tomo4_n USING EDIT MASK 'RR____'.
TRANSLATE tomo4_n USING ' 0'.

CONCATENATE 'N' libro_n tomo4_n asiento_n INTO ruc_out.
ELSE.

IF seg4 IS INITIAL.
tomo3_n = seg2.
ELSE.
tomo3_n = seg3.
ENDIF.
WRITE tomo3_n TO tomo3_n USING EDIT MASK 'RR___'.
TRANSLATE tomo3_n USING ' 0'.

IF asiento_n IS NOT INITIAL.
CONCATENATE 'N' libro_n tomo3_n asiento_n INTO ruc_out.
ELSE.
CONCATENATE 'N' libro_n tomo3_n asiento_n6 INTO ruc_out.
ENDIF.

ENDIF.

ENDIF.

ELSEIF p_tipo EQ 2. "Persona Jurídica

IF v_length_seg1 GT '10'
OR v_length_seg2 GT '4'
OR v_length_seg3 GT '6'.

MESSAGE e000(wn) WITH 'Formato RUC incorrecto'.
ELSE.

IF seg2 IS INITIAL. "No tiene "-"

ruc_out = ruc_in.

ELSE.
tomo_j = seg1.
folio_j = seg2.
asiento_j = seg3.

WRITE tomo_j TO tomo_j USING EDIT MASK 'RR_________'.

WRITE folio_j TO folio_j USING EDIT MASK 'RR____'.
WRITE asiento_j TO asiento_j USING EDIT MASK 'RR______'.

TRANSLATE tomo_j USING ' 0'.
TRANSLATE folio_j USING ' 0'.
TRANSLATE asiento_j USING ' 0'.

CONCATENATE tomo_j folio_j asiento_j INTO ruc_out.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " ZF_FORMAT_RUC
Responder Con Cita