login as:
~/abapcraft.dev — code, crafted in SAP
florin@s4hana:~/abap/posts/todo-list-100/src/zbp_todo_100.clas.locals_imp.abap $ cat zbp_todo_100.clas.locals_imp.abap
todo-list-100 / src / zbp_todo_100.clas.locals_imp.abap
ABAP 140 lines
CLASS lhc_zr_todo_100 DEFINITION INHERITING FROM cl_abap_behavior_handler.
  PRIVATE SECTION.
    METHODS:
      get_global_authorizations FOR GLOBAL AUTHORIZATION
        IMPORTING
        REQUEST requested_authorizations FOR zr_todo_100
        RESULT result,
      earlynumbering_create FOR NUMBERING
        IMPORTING entities FOR CREATE zr_todo_100,
      setdefaultstatus FOR DETERMINE ON MODIFY
        IMPORTING keys FOR zr_todo_100~setdefaultstatus,
      validatetitle FOR VALIDATE ON SAVE
        IMPORTING keys FOR zr_todo_100~validatetitle.

ENDCLASS.

CLASS lhc_zr_todo_100 IMPLEMENTATION.

  METHOD get_global_authorizations.

    IF requested_authorizations-%create = if_abap_behv=>mk-on.
      result-%create = if_abap_behv=>auth-allowed.
    ENDIF.
    IF requested_authorizations-%update = if_abap_behv=>mk-on.
      result-%update = if_abap_behv=>auth-allowed.
    ENDIF.
    IF requested_authorizations-%delete = if_abap_behv=>mk-on.
      result-%delete = if_abap_behv=>auth-allowed.
    ENDIF.

  ENDMETHOD.

  METHOD earlynumbering_create.

    LOOP AT entities INTO DATA(entity).

      IF entity-TaskUUID IS INITIAL.

        TRY.
            DATA(lv_uuid) = cl_system_uuid=>create_uuid_x16_static( ).

            APPEND VALUE #(
              %cid      = entity-%cid
              %key      = entity-%key
              %is_draft = entity-%is_draft
              TaskUUID  = lv_uuid
            ) TO mapped-zr_todo_100.

          CATCH cx_uuid_error INTO DATA(lx_uuid_error).

            APPEND VALUE #(
              %cid      = entity-%cid
              %key      = entity-%key
              %is_draft = entity-%is_draft
            ) TO failed-zr_todo_100.

            APPEND VALUE #(
              %cid      = entity-%cid
              %key      = entity-%key
              %is_draft = entity-%is_draft
              %msg      = new_message_with_text(
                            severity = if_abap_behv_message=>severity-error
                            text     = lx_uuid_error->get_text( ) )
            ) TO reported-zr_todo_100.

        ENDTRY.

      ELSE.

        " Important: also respond for instances that already have a UUID
        APPEND VALUE #(
          %cid      = entity-%cid
          %key      = entity-%key
          %is_draft = entity-%is_draft
          TaskUUID  = entity-TaskUUID
        ) TO mapped-zr_todo_100.

      ENDIF.

    ENDLOOP.

  ENDMETHOD.

  METHOD setDefaultStatus.

    CONSTANTS lc_status_open TYPE string VALUE 'OPEN'.

    READ ENTITIES OF zr_todo_100 IN LOCAL MODE
      ENTITY zr_todo_100
      FIELDS ( Status )
      WITH CORRESPONDING #( keys )
      RESULT DATA(todos).

    DATA update_todos TYPE TABLE FOR UPDATE zr_todo_100.

    LOOP AT todos INTO DATA(todo).
      IF todo-Status IS INITIAL.
        APPEND VALUE #(
          %tky   = todo-%tky
          Status = lc_status_open
        ) TO update_todos.
      ENDIF.
    ENDLOOP.

    IF update_todos IS NOT INITIAL.
      MODIFY ENTITIES OF zr_todo_100 IN LOCAL MODE
        ENTITY zr_todo_100
        UPDATE FIELDS ( Status )
        WITH update_todos.
    ENDIF.

  ENDMETHOD.

  METHOD validateTitle.
    READ ENTITIES OF zr_todo_100 IN LOCAL MODE
      ENTITY zr_todo_100
      FIELDS ( Title )
      WITH CORRESPONDING #( keys )
      RESULT DATA(todos).

    LOOP AT todos INTO DATA(todo).
      IF todo-Title IS INITIAL.
        APPEND VALUE #(
          %tky        = todo-%tky
        ) TO failed-zr_todo_100.

        APPEND VALUE #(
          %tky           = todo-%tky
          %state_area    = 'VALIDATE_TITLE'
          %element-Title = if_abap_behv=>mk-on
          %msg           = new_message_with_text(
                             severity = if_abap_behv_message=>severity-error
                             text     = 'Title must not be empty' )
        ) TO reported-zr_todo_100.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

ENDCLASS.