*&---------------------------------------------------------------------*
*& Report ZSCH_012_SPEISEKARTE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsch_012_speisekarte.

*INCLUDE <icon>.

TYPES: BEGIN OF gst_speise,
         carrid     TYPE s_carr_id,
         mealnumber TYPE s_mealnum,
         mealtype   TYPE s_mealtype,
         text       TYPE s_mealtext,
       END OF gst_speise.


DATA: gs_smeal   TYPE smeal,
      gt_speisen TYPE STANDARD TABLE OF gst_speise WITH DEFAULT KEY.

* Selektionsbild

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.
  PARAMETERS     pa_carr TYPE s_carr_id DEFAULT 'LH'     OBLIGATORY.
  PARAMETERS     pa_lang TYPE spras     DEFAULT sy-langu OBLIGATORY.
  SELECT-OPTIONS so_meal FOR gs_smeal-mealnumber.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
  PARAMETERS:
    pa_alle  RADIOBUTTON GROUP typ DEFAULT 'X' USER-COMMAND flip,
    pa_vegi  RADIOBUTTON GROUP typ,
    pa_fisch RADIOBUTTON GROUP typ,
    pa_meat  RADIOBUTTON GROUP typ.
  PARAMETERS pa_icon AS CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN END OF BLOCK b2.

* --Pruefen
AT SELECTION-SCREEN ON pa_carr.
  SELECT SINGLE carrid
    FROM scarr
    INTO @DATA(lv_found)
    WHERE carrid = @pa_carr.
  IF sy-subrc <> 0.
    MESSAGE |Fluggesellschaft { pa_carr } gibt es nicht.| TYPE 'E'.
  ENDIF.

* Umgestalten
AT SELECTION-SCREEN OUTPUT.
* Wenn ein konkreter Gerichtstyp aktiv ist, so_meal sperren.
  LOOP AT SCREEN INTO DATA(ls_screen).
    IF ls_screen-name CP 'SO_MEAL*'.
      IF pa_alle = abap_true.
        ls_screen-input = 1.
      ELSE.
        CLEAR: so_meal, so_meal[].
        ls_screen-input = 0.
      ENDIF.
      MODIFY SCREEN FROM ls_screen.
    ENDIF.
  ENDLOOP.

* Liste vorbereiten

TOP-OF-PAGE.
  WRITE: / 'Speisekarte –', pa_carr,
         / sy-uline.
  WRITE: / 'Nummer',
          10 'Typ',
          14 'Bezeichnung'.
  WRITE  / sy-uline.

* Hauptverarbeitung
START-OF-SELECTION.
  DATA lv_typ TYPE s_mealtype.

  IF     pa_vegi  = abap_true.
    lv_typ = 'VE'.
  ELSEIF pa_fisch = abap_true.
    lv_typ = 'FI'.
  ELSEIF pa_meat  = abap_true.
    lv_typ = 'FL'.
  ENDIF.

  SELECT m~carrid,
         m~mealnumber,
         m~mealtype,
         t~text
    FROM smeal  AS m
    LEFT OUTER JOIN smealt AS t
      ON  m~carrid     = t~carrid
      AND m~mealnumber = t~mealnumber
      AND t~sprache    = @pa_lang
    WHERE m~carrid     = @pa_carr
      AND m~mealnumber IN @so_meal
      AND ( @lv_typ IS INITIAL OR m~mealtype = @lv_typ )
    INTO TABLE @gt_speisen.

  IF sy-subrc <> 0.
    MESSAGE 'Der Koch hat heute frei – keine Gerichte gefunden.' TYPE 'S'.
    RETURN.
  ENDIF.

  LOOP AT gt_speisen INTO DATA(gs_speise).
    WRITE: / gs_speise-mealnumber,
             gs_speise-mealtype,
             gs_speise-text.
    IF pa_icon = abap_true.
      WRITE SWITCH #( gs_speise-mealtype
             WHEN 'VE' THEN icon_selection
             WHEN 'FI' THEN icon_transfer_structure
             WHEN 'FL' THEN icon_gis_pan
             ELSE space ) AS ICON.
    ENDIF.
  ENDLOOP.

END-OF-SELECTION.
  IF lines( gt_speisen ) > 0.
    WRITE: / |Gesamt: { lines( gt_speisen ) } Gerichte.|.
  ENDIF.