Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 10

DATA: LS_POD TYPE ZSSD_DELIVERY_POST_STRUC,

LV_BEGIN_IDX TYPE I,
LV_END_IDX TYPE I,
LT_POD_BAD TYPE TABLE OF ZSSD_DELIVERY_POST_STRUC.

DATA: LV_DELIVERY TYPE VBELN_VL,


LS_RETURN TYPE BAPIRET2,
LV_ERROR TYPE C,
LV_MSG_TYPE TYPE BAPI_MTYPE,
LV_MSG_NO TYPE SYMSGNO,
LV_NB_POST LIKE BAPIRET2-MESSAGE_V1.

DATA: LV_NB_RECORD TYPE I,


LV_NB_ERROR_LINE TYPE I,
LV_NB_LINE TYPE I,
LV_NB_UPD_INDX TYPE I.

* delivery Header Structure


DATA: LS_VBKOK TYPE VBKOK.

* Delivery Item
DATA: LT_VBPOK TYPE TABLE OF VBPOK,
LS_VBPOK TYPE VBPOK.

FIELD-SYMBOLS: <LFS_POD_LINE> LIKE ZSSD_DELIVERY_POST_STRUC,


<LFS_MOB_DELIV_I> LIKE ZSD_MOB_DELIV_I.
DATA: LV_POST_PGI TYPE XFELD.
* Variables to update text
DATA: LV_TEXTNAME TYPE THEAD-TDNAME,
LT_LINES LIKE TLINE OCCURS 0 WITH HEADER LINE,
LT_TEXTH LIKE TEXTH_GN OCCURS 0 WITH HEADER LINE,
LT_TEXTL LIKE TEXTL_GN OCCURS 0 WITH HEADER LINE.
DATA: LT_MOB_DELIV_I LIKE ZSD_MOB_DELIV_I OCCURS 0 WITH HEADER LINE.

* convert delivery numbers into internal foramt


LOOP AT IT_POD_LIST ASSIGNING <LFS_POD_LINE>.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <LFS_POD_LINE>-DELIVERY
IMPORTING
OUTPUT = <LFS_POD_LINE>-DELIVERY.

ENDLOOP.
SORT IT_POD_LIST BY DELIVERY LINE.

data: la_body TYPE soli,


lt_body TYPE soli_tab.
clear: la_body.
CONCATENATE '1' 'delivery:' <lfs_pod_line>-delivery INTO la_body SEPARATED BY
space.
append la_body to lt_body.

* if there is no text update or qty update then just update the z-table
LOOP AT IT_POD_LIST INTO LS_POD WHERE ITEM_NOTE IS INITIAL AND
POD_QTY IS INITIAL.
data: ls_qty TYPE char20.
ls_qty = ls_pod-pod_Qty.
clear: la_body.
CONCATENATE '2' 'Item' ls_pod-line ls_qty ls_pod-item_note INTO la_body SEPARATED
BY space.
append la_body to lt_body.

CLEAR: LT_MOB_DELIV_I.
LT_MOB_DELIV_I-VBELN_VL = LS_POD-DELIVERY.
LT_MOB_DELIV_I-POSNR_VL = LS_POD-LINE.
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'C'.
LT_MOB_DELIV_I-QTY_CHANGE = 'C'.
LT_MOB_DELIV_I-DEL_QTY = LS_POD-SALE_QTY.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = LS_POD-SALE_UOM
LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LT_MOB_DELIV_I-DEL_UOM
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
APPEND LT_MOB_DELIV_I.
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
ENDLOOP.

* update the line item text


LOOP AT IT_POD_LIST ASSIGNING <LFS_POD_LINE> WHERE ITEM_NOTE IS NOT INITIAL.
CLEAR: LT_LINES, LT_MOB_DELIV_I.
REFRESH: LT_LINES.

* prepare z-table entry


LT_MOB_DELIV_I-VBELN_VL = <LFS_POD_LINE>-DELIVERY.
LT_MOB_DELIV_I-POSNR_VL = <LFS_POD_LINE>-LINE.
LT_MOB_DELIV_I-DEL_QTY = <LFS_POD_LINE>-SALE_QTY.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = <LFS_POD_LINE>-SALE_UOM
LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LT_MOB_DELIV_I-DEL_UOM
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

LT_LINES-TDFORMAT = '*'.
LT_LINES-TDLINE = <LFS_POD_LINE>-ITEM_NOTE(132).
APPEND LT_LINES.
LT_LINES-TDLINE = <LFS_POD_LINE>-ITEM_NOTE+132.
APPEND LT_LINES.
CLEAR: LV_TEXTNAME.
CONCATENATE <LFS_POD_LINE>-DELIVERY <LFS_POD_LINE>-LINE
INTO LV_TEXTNAME.
CALL FUNCTION 'CREATE_TEXT'
EXPORTING
FID = '0002'
FLANGUAGE = SY-LANGU
FNAME = LV_TEXTNAME
FOBJECT = 'VBBP'
SAVE_DIRECT = 'X'
* FFORMAT = '*'
TABLES
FLINES = LT_LINES
EXCEPTIONS
NO_INIT = 1
NO_SAVE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
* update Z table with error flag
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'B'.
* assume no qty change. this will be updated later if qty is changed
LT_MOB_DELIV_I-QTY_CHANGE = 'C'.
ET_RETURN-ID = 'ZSD_MOB'.
ET_RETURN-NUMBER = 000.
ET_RETURN-MESSAGE_V1 = <LFS_POD_LINE>-DELIVERY.
ET_RETURN-MESSAGE_V2 = <LFS_POD_LINE>-LINE.
ET_RETURN-TYPE = 'E'.
APPEND ET_RETURN.
ELSE.
* update Z table with success flag
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'A'.
* assume no qty change. this will be updated later if qty is changed
LT_MOB_DELIV_I-QTY_CHANGE = 'C'.
ENDIF.
APPEND LT_MOB_DELIV_I.
ENDLOOP.

IF LT_MOB_DELIV_I[] IS NOT INITIAL.


MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
CLEAR: LT_MOB_DELIV_I.
REFRESH: LT_MOB_DELIV_I.
ENDIF.

* exit if there are any errors. do not update qty until text are uploaded
successfully
IF ET_RETURN[] IS NOT INITIAL.
EXIT.
ENDIF.

* before updating the qty get all the entries for item from Z-table
* so qty flag can be updated correctly.
IF IT_POD_LIST[] IS NOT INITIAL.
SELECT *
INTO TABLE LT_MOB_DELIV_I
FROM ZSD_MOB_DELIV_I
FOR ALL ENTRIES IN IT_POD_LIST
WHERE VBELN_VL = IT_POD_LIST-DELIVERY
AND POSNR_VL = IT_POD_LIST-LINE.
ENDIF.

* now we update the Delivery Item Qty


LOOP AT IT_POD_LIST INTO LS_POD WHERE POD_QTY IS NOT INITIAL.
IF LV_DELIVERY NE LS_POD-DELIVERY.
clear: la_body.
CONCATENATE '3' 'Item' ls_pod-line ls_qty ls_pod-item_note INTO la_body SEPARATED
BY space.
append la_body to lt_body.

DESCRIBE TABLE LT_VBPOK LINES LV_NB_LINE.


IF LV_NB_LINE NE 0.
* update delivery
PERFORM UPDATE_DELIVERY TABLES LT_VBPOK
LT_TEXTH
LT_TEXTL
ET_RETURN
USING LV_DELIVERY
LV_POST_PGI.
DESCRIBE TABLE ET_RETURN LINES LV_NB_ERROR_LINE.
IF LV_NB_ERROR_LINE NE 0.
* update z-table with failure and exit
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
EXIT.
ELSE.
* modify z-table to success and update
LOOP AT LT_MOB_DELIV_I ASSIGNING <LFS_MOB_DELIV_I>.
<LFS_MOB_DELIV_I>-QTY_CHANGE = 'A'.
ENDLOOP.
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
* call method to block the sales order for delivery
ZCL_SD_MOB=>SO_MOB_APP_DEL_BLK_AND_MSG( EXPORTING IM_VBELN_VL =
LV_DELIVERY
IM_POSNR_VL = LS_VBPOK-
POSNR_VL ).
ENDIF.
ENDIF.
CLEAR: LT_VBPOK, LT_TEXTH, LT_TEXTL.
REFRESH: LT_VBPOK, LT_TEXTH, LT_TEXTL.
LV_BEGIN_IDX = SY-TABIX.
LV_END_IDX = SY-TABIX.
LV_DELIVERY = LS_POD-DELIVERY.
ENDIF.

* if there is any adjustments to process, then prepare line item


* otherwise do not need to do anything for that line
* IF LS_POD-SALE_QTY <> 0 OR
* ( LS_POD-SALE_QTY EQ 0 AND LS_POD-ZERO_COUNT EQ 'X' ).
LS_VBPOK-VBELN_VL = LS_POD-DELIVERY.
LS_VBPOK-POSNR_VL = LS_POD-LINE.
LS_VBPOK-MATNR = LS_POD-MATERIAL.
LS_VBPOK-CHARG = LS_POD-BATCH.
LS_VBPOK-LIANP = 'X'.
* update delivery qty only. no need to do anything else
LS_VBPOK-LFIMG = LS_POD-SALE_QTY.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = LS_POD-SALE_UOM
LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LS_VBPOK-VRKME
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

clear: la_body.
CONCATENATE '4' 'Item' ls_pod-line ls_qty ls_pod-item_note INTO la_body SEPARATED
BY space.
append la_body to lt_body.
* LS_VBPOK-VRKME = LS_POD-SALE_UOM.
* if Qty is Zero then delete the line item
IF LS_VBPOK-LFIMG = 0.
LS_VBPOK-LIPS_DEL = 'X'.
ENDIF.
* LS_VBPOK-LGMNG = LS_POD-STOCK_QTY.
* LS_VBPOK-MEINS = LS_POD-STOCK_UOM.
LV_END_IDX = SY-TABIX.
APPEND LS_VBPOK TO LT_VBPOK.

LV_NB_RECORD = LV_NB_RECORD + 1.
READ TABLE LT_MOB_DELIV_I WITH KEY VBELN_VL = LS_POD-DELIVERY
POSNR_VL = LS_POD-LINE.
IF SY-SUBRC = 0.
CLEAR: LV_NB_UPD_INDX.
LV_NB_UPD_INDX = SY-TABIX.
LT_MOB_DELIV_I-QTY_CHANGE = 'B'.
LT_MOB_DELIV_I-DEL_QTY = LS_POD-SALE_QTY.
LT_MOB_DELIV_I-DEL_UOM = LS_VBPOK-VRKME.
MODIFY LT_MOB_DELIV_I INDEX LV_NB_UPD_INDX.
ELSE.
LT_MOB_DELIV_I-VBELN_VL = LS_POD-DELIVERY.
LT_MOB_DELIV_I-POSNR_VL = LS_POD-LINE.
LT_MOB_DELIV_I-QTY_CHANGE = 'B'.
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'C'.
LT_MOB_DELIV_I-DEL_QTY = LS_POD-SALE_QTY.
LT_MOB_DELIV_I-DEL_UOM = LS_VBPOK-VRKME.
APPEND LT_MOB_DELIV_I.
ENDIF.
* ENDIF.
ENDLOOP.

DESCRIBE TABLE LT_VBPOK LINES LV_NB_LINE.


IF LV_NB_LINE NE 0.
* update delivery

clear: la_body.
CONCATENATE '5' lv_post_pgi INTO la_body SEPARATED BY space.
append la_body to lt_body.

PERFORM UPDATE_DELIVERY TABLES LT_VBPOK


LT_TEXTH
LT_TEXTL
ET_RETURN
USING LV_DELIVERY
LV_POST_PGI.
DESCRIBE TABLE ET_RETURN LINES LV_NB_ERROR_LINE.
IF LV_NB_ERROR_LINE NE 0.
* update z-table with failure and exit
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
EXIT.
ELSE.
* modify z-table to success and upate
LOOP AT LT_MOB_DELIV_I ASSIGNING <LFS_MOB_DELIV_I>.
<LFS_MOB_DELIV_I>-QTY_CHANGE = 'A'.
ENDLOOP.
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
* call method to block the sales order for delivery
ZCL_SD_MOB=>SO_MOB_APP_DEL_BLK_AND_MSG( EXPORTING IM_VBELN_VL = LV_DELIVERY
IM_POSNR_VL = LS_VBPOK-
POSNR_VL ).
ENDIF.
ENDIF.

YCL_SEND_EMAIL=>SEND_MAIL_TO_SO_WRITER( EXPORTING im_t_body = lt_body ).

___________ PGI ____________________

DATA: ls_vbkok TYPE vbkok,


lv_error_any TYPE xfeld,
lv_error_in_item_deletion TYPE xfeld,
lv_error_in_pod_update TYPE xfeld,
lv_error_in_interface TYPE xfeld,
lv_error_in_goods_issue TYPE xfeld,
lv_error_in_final_check TYPE xfeld,
lv_error_partner_update TYPE xfeld,
lv_error_sernr_update TYPE xfeld,
lv_error_id TYPE sy-msgid,
lv_error_type TYPE sy-msgty,
lv_error_no TYPE sy-msgno,
lv_error_v1 TYPE sy-msgv1,
lv_error_v2 TYPE sy-msgv2,
lv_error_v3 TYPE sy-msgv3,
lv_error_v4 TYPE sy-msgv4.

DATA: lt_prot LIKE prott OCCURS 0 WITH HEADER LINE.


DATA: lv_delivery TYPE vbeln_vl.
DATA: lt_mob_deliv_h LIKE zsd_mob_deliv_h OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS: <lfs_mob_deliv_h> LIKE zsd_mob_deliv_h.
DATA: lv_date TYPE d,
lv_time TYPE t,
lv_timestamp TYPE timestamp,
lv_tzone TYPE ttzz-tzone.

* convert the delivery number into internal format


CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = i_delivery
IMPORTING
output = lv_delivery.

e_delivery = lv_delivery.

DATA: la_body TYPE soli,


lt_body TYPE soli_tab.
CLEAR: la_body.
CONCATENATE '1-PGI' 'at line 75' i_update INTO la_body SEPARATED BY space.
APPEND la_body TO lt_body.

IF i_update = 'X'.

** first check if signature update was successful or not


** if not do not do PGI. Technically this should not be even called from the app
** but trap that scenario here anyway
** comment out for now to test only PGI scenario
*
CLEAR: la_body.
CONCATENATE '2-PGI' 'at line 86' INTO la_body SEPARATED BY space.
APPEND la_body TO lt_body.

SELECT SINGLE *
INTO lt_mob_deliv_h
FROM zsd_mob_deliv_h
WHERE vbeln_vl = lv_delivery.
*
** check signature upload is successful first
* IF SY-SUBRC <> 0 OR
* LT_MOB_DELIV_H-SIGN_STATUS <> 'Y'.
* ET_RETURN-ID = 'ZSD_MOB'.
* ET_RETURN-TYPE = 'E'.
* ET_RETURN-NUMBER = 004.
* ET_RETURN-MESSAGE_V1 = LV_DELIVERY.
* APPEND ET_RETURN.
* EXIT.
* ELSE.
* set the data to update the table
lt_mob_deliv_h-vbeln_vl = lv_delivery.
lt_mob_deliv_h-longitude = c_longitude.
lt_mob_deliv_h-latitude = c_latitude.
lt_mob_deliv_h-signed_by = c_signed_by.
* Enhancements to app 2017 March
lt_mob_deliv_h-loaded_by = c_loaded_by.
lt_mob_deliv_h-cartons = c_cartons.
lt_mob_deliv_h-coils = c_coils.
lt_mob_deliv_h-pieces = c_pieces.
lt_mob_deliv_h-reels = c_reels.
lt_mob_deliv_h-pallets = c_pallets.
lt_mob_deliv_h-bundles = c_bundles.
lt_mob_deliv_h-ship_description = c_ship_description.
lt_mob_deliv_h-manifest_id = c_manifestid.

lv_date = c_signed_date.
lv_time = c_signed_time.
* Time coming in is in UTC timezone. Convert to System timezone
lv_tzone = 'UTC'.
CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_timestamp TIME ZONE
lv_tzone.
SELECT SINGLE tzonesys
INTO lv_tzone
FROM ttzcu.
CONVERT TIME STAMP lv_timestamp TIME ZONE lv_tzone INTO DATE lv_date TIME
lv_time.
c_signed_date = lv_date.
c_signed_time = lv_time.
lt_mob_deliv_h-signed_date = c_signed_date.
lt_mob_deliv_h-signed_time = c_signed_time.
* ENDIF.

* check delivery is not already PGI'd


SELECT SINGLE wadat_ist wbstk
INTO (c_pgi_date, c_pgi_status)
FROM likp
JOIN vbuk
ON ( likp~vbeln = vbuk~vbeln )
WHERE likp~vbeln = lv_delivery.

IF ( c_pgi_date IS NOT INITIAL AND


c_pgi_status = 'C' ).
et_return-id = 'ZSD_MOB'.
et_return-type = 'E'.
et_return-number = 005.
et_return-message_v1 = lv_delivery.
APPEND et_return.
* if Delivery is PGI'd in SAP but not updated in Z-table then update it
IF lt_mob_deliv_h-pgi_status <> 'Y'.
lt_mob_deliv_h-pgi_status = 'Y'.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
ENDIF.
EXIT.
ENDIF.

CLEAR: la_body.
CONCATENATE '3-PGI' 'at line 161' c_pgi_upd_status INTO la_body SEPARATED BY
space.
APPEND la_body TO lt_body.

* do we even have to perform PGI?


IF c_pgi_upd_status = 'N'.
lt_mob_deliv_h-pgi_status = ' '.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
EXIT.
ENDIF.
* signature is updated, delivery is not PGI'd already so perform PGI
* setup data for FM

ls_vbkok-vbeln_vl = lv_delivery.
ls_vbkok-wabuc = 'X'.

CLEAR: la_body.
CONCATENATE '4-PGI' 'at line 179' 'Before call func' INTO la_body SEPARATED BY
space.
APPEND la_body TO lt_body.

CALL FUNCTION 'WS_DELIVERY_UPDATE_2'


EXPORTING
vbkok_wa = ls_vbkok
no_messages_update_1 = 'X'
commit = 'X'
* IF_NO_BUFFER_REFRESH = 'X'
* IF_LATE_DELIVERY_UPD = 'X'
delivery = lv_delivery
if_error_messages_send = ''
IMPORTING
ef_error_any = lv_error_any
ef_error_in_item_deletion = lv_error_in_item_deletion
ef_error_in_pod_update = lv_error_in_pod_update
ef_error_in_interface = lv_error_in_interface
ef_error_in_goods_issue = lv_error_in_goods_issue
ef_error_in_final_check = lv_error_in_final_check
ef_error_partner_update = lv_error_partner_update
ef_error_sernr_update = lv_error_sernr_update
TABLES
prot = lt_prot
EXCEPTIONS
error_message = 4.
IF lv_error_any EQ 'X' OR
sy-subrc = 4.
lv_error_id = sy-msgid.
lv_error_type = sy-msgty.
lv_error_no = sy-msgno.
lv_error_v1 = sy-msgv1.
lv_error_v2 = sy-msgv2.
lv_error_v3 = sy-msgv3.
lv_error_v4 = sy-msgv4.

PERFORM message_to_bapiret2
TABLES et_return
USING lv_error_id
lv_error_type
lv_error_no
lv_error_v1
lv_error_v2
lv_error_v3
lv_error_v4.
* there was an error, update the table with fail status
lt_mob_deliv_h-pgi_status = 'N'.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
ELSE.
* no error, update the table with success status
lt_mob_deliv_h-pgi_status = 'Y'.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
ENDIF.
ENDIF.

clear: la_body.
CONCATENATE '5-PGI' 'at line 236' INTO la_body SEPARATED BY space.
append la_body to lt_body.

* read PGI date/time after PGI.


SELECT SINGLE wadat_ist wbstk
INTO (c_pgi_date, c_pgi_status)
FROM likp
JOIN vbuk
ON ( likp~vbeln = vbuk~vbeln )
WHERE likp~vbeln = lv_delivery.
* read existing z-table entry if it is there
SELECT SINGLE longitude latitude pgi_status sign_status
signed_by signed_date signed_time
INTO (c_longitude, c_latitude, c_pgi_upd_status,
c_sign_status, c_signed_by, c_signed_date, c_signed_time)
FROM zsd_mob_deliv_h
WHERE vbeln_vl = lv_delivery.

YCL_SEND_EMAIL=>SEND_MAIL_TO_SO_WRITER( EXPORTING im_t_body = lt_body ).

ENDFUNCTION.

check ZSD_MOB function modules and add more email code. Later check if there is
something that can be changed to not PGI.

8000017455 - test delivery

You might also like