|
#1
|
|||
|
|||
Listo
Me respondo yo solo la solución ya esta creada, gracias por su atención.
|
#2
|
|||
|
|||
hola
Podrias compartirla?
__________________
Sebas Desarrollador ABAP. |
#3
|
|||
|
|||
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 |
#4
|
|||
|
|||
¿qué lenguaje es?
¿podrías decirnos qué lenguaje es este? ¿Alguien tiene esta rutina en otro lenguaje?
|
#5
|
|||
|
|||
El lenguaje es ABAP.
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|