(RUC) DV - Dígito Verificador Panamá

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Koriotto
    Junior Member
    • mar
    • 24

    #1

    (RUC) DV - Dígito Verificador Panamá

    Hola a todos,

    Les agradecería mucho me puedan ayudar con este tema.

    Alguien tiene el código para devolver o calcular el dígito verificador (DV) a partir del RUC ó cédula de un contribuyente de Panamá?

    He encontrado en la página oficial el algoritmo pero no esta nada claro por las casuísticas de RUC que presenta.

    Gracias de antemano por la ayuda.
  • Koriotto
    Junior Member
    • mar
    • 24

    #2
    Listo

    Me respondo yo solo la solución ya esta creada, gracias por su atención.

    Comentario

    • sconoredhot
      Senior Member
      • feb
      • 341

      #3
      hola

      Podrias compartirla?
      Sebas

      Desarrollador ABAP.

      Comentario

      • Koriotto
        Junior Member
        • mar
        • 24

        #4
        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

        Comentario

        • don 4D
          Junior Member
          • abr
          • 1

          #5
          ¿qué lenguaje es?

          ¿podrías decirnos qué lenguaje es este? ¿Alguien tiene esta rutina en otro lenguaje?

          Comentario

          • Koriotto
            Junior Member
            • mar
            • 24

            #6
            El lenguaje es ABAP.

            Comentario

            Trabajando...