Monday, March 21, 2011

Send Greetings mail on Birthday

REPORT zbirthday MESSAGE-ID zhr.

DATA : BEGIN OF it_pa0002 OCCURS 0,
pernr LIKE pa0002-pernr,
nachn LIKE pa0002-nachn,
vorna LIKE pa0002-vorna,
gbdat like pa0002-gbdat,
END OF it_pa0002.

DATA : BEGIN OF it_pa0000 OCCURS 0,
pernr LIKE pa0000-pernr,
END OF it_pa0000.

START-OF-SELECTION.

SELECT pernr nachn vorna gbdat
FROM pa0002
INTO TABLE it_pa0002
WHERE endda >= sy-datum
AND begda <= sy-datum .

IF sy-subrc = 0.
SORT it_pa0002 BY pernr.
DELETE ADJACENT DUPLICATES FROM it_pa0002 COMPARING pernr.
ELSE.
MESSAGE i000 WITH 'No records exist'.
STOP.
ENDIF.

SELECT pernr FROM pa0000
INTO TABLE it_pa0000
FOR ALL ENTRIES IN it_pa0002
WHERE pernr = it_pa0002-pernr
AND endda >= sy-datum
AND begda <= sy-datum
AND stat2 = '3'.

IF sy-subrc = 0.
SORT it_pa0000 BY pernr.
DELETE ADJACENT DUPLICATES FROM it_pa0000 COMPARING pernr.
ELSE.
MESSAGE i000 WITH 'No records exist'.
STOP.
ENDIF.

*--Send Mail
LOOP AT it_pa0000.

PERFORM send_mail.

ENDLOOP.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
* Send Mail
*----------------------------------------------------------------------*
FORM send_mail.

DATA : lit_objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
lit_objtxt LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lit_objbin LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lit_reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE.

DATA : dl_objhead TYPE soli_tab,
dl_doc_chng TYPE sodocchgi1,
dl_lines_bin TYPE i,
dl_lines_txt TYPE i.

clear : it_pa0002.

READ TABLE it_pa0002 WITH KEY pernr = it_pa0000-pernr.
IF it_pa0002-gbdat+4(4) = sy-datum+4(4).

*--Body of the Mail
CONCATENATE 'Dear' it_pa0002-vorna it_pa0002-nachn ',' INTO lit_objtxt
SEPARATED BY space.
APPEND lit_objtxt.

lit_objtxt = ''.
APPEND lit_objtxt.

CONCATENATE 'Wish you a Very Happy Birthday!' '' INTO
lit_objtxt SEPARATED BY space.
APPEND lit_objtxt.

lit_objtxt = ''.
APPEND lit_objtxt.

lit_objtxt = 'Regards,'.
APPEND lit_objtxt.

lit_objtxt = 'HR Team.'.
APPEND lit_objtxt.

DESCRIBE TABLE lit_objtxt LINES dl_lines_txt.

***---Document information.
CONCATENATE 'Birthday' '' INTO dl_doc_chng-obj_name
SEPARATED BY space.

CONCATENATE 'Birthday' ' Greetings' INTO dl_doc_chng-obj_descr
SEPARATED BY space.

dl_doc_chng-sensitivty = 'F'. "Functional object
dl_doc_chng-obj_langu = sy-langu.

lit_objpack-transf_bin = space.
lit_objpack-head_start = 1.
lit_objpack-head_num = 0.
lit_objpack-body_start = 1.
lit_objpack-body_num = dl_lines_txt.
lit_objpack-doc_type = 'RAW'.
APPEND lit_objpack.

*-- E-mail receivers
SELECT SINGLE
usrid_long
FROM pa0105
INTO lit_reclist-receiver
WHERE pernr = it_pa0000-pernr
AND subty = '0010'.
IF sy-subrc = 0.
lit_reclist-rec_type = 'U'.
APPEND lit_reclist.
ENDIF.

*-- Fill in HR or Managers Email ID
* lit_reclist-receiver = ''.
* lit_reclist-copy = 'X'.
* lit_reclist-rec_type = 'U'.
* APPEND lit_reclist.

*--Sending mail.
IF lit_reclist[] IS NOT INITIAL.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = dl_doc_chng
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = lit_objpack
contents_txt = lit_objtxt
receivers = lit_reclist
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.

ENDIF.

ENDFORM. " SEND_MAIL

Annual Perk Calculation

Write your coding in user Exit : HRINHRA0 , FM - EXIT_HINCALC0_005 in the
Include ZXPPYINU04.

When Company leased accomodation is given the Annual Perk Calculation was
not calculated according to the clients requirement.
Also the negative diff rent was not shown in deductions.

*&---------------------------------------------------------------------*
*& Include ZXPPYINU04
*&---------------------------------------------------------------------*

DATA : v_amount LIKE pa0581-rtamt,
v_basis TYPE maxbt,
v_diff TYPE maxbt,
v_elig_amount LIKE pa0581-rtamt.

IF NOT _hra[] IS INITIAL.

READ TABLE _hra INDEX 1.

IF sy-subrc = 0 AND _hra-accom = '5'.

v_amount = _hra-rtamt.
_wgtyp_tab-abart = '*'.
_wgtyp_tab-lgart = '/3RI'. " Rent wage type
_wgtyp_tab-betrg = v_amount. " Rent amount

APPEND _wgtyp_tab.
CLEAR _wgtyp_tab.

*--Get basis amount
LOOP AT _it WHERE lgart = '/115'.
v_basis = v_basis + _it-betrg.
ENDLOOP.

*--Get eligible amount
LOOP AT _it WHERE lgart = '1011'.
v_elig_amount = v_elig_amount + _it-betrg.
ENDLOOP.

*--Get difference amount
* _delgrt_mon = v_elig_amount - v_amount.

*--Get Yearly basis amount
v_basis = v_basis * 12.

*--Get Yearly rent amount
v_amount = v_amount * 12.

v_diff = ( v_basis - v_amount ) * 15 / 100 .

*--Calculate Yearly eligible amount
v_elig_amount = v_elig_amount * 12 .

IF v_diff > v_elig_amount.
_tcprk = v_elig_amount.
ELSE.
_tcprk = v_diff.
ENDIF.

ENDIF.

ENDIF.

Calculate EMI (Equated Monthly Instalments) in Infotype 0045

Write your coding in user Exit : PBAS0001 , FM - EXIT_SAPFP50M_002 in the
Include ZXPADU02.

From Indian payroll view , there was a difference in calculation of EMI
amounts , the amount calculated in system differs from the ones calculated
in EXCEL sheet.
The below coding solves the problem.(Same as EXCEL calculation)

EMI Calculation Courtesy Link


*&---------------------------------------------------------------------*
*& Include ZXPADU02
*&---------------------------------------------------------------------*

DATA : i0045 LIKE p0045.
DATA : v_durn TYPE pea_scrmm.
DATA : p_durn(6) TYPE n,
p_intr TYPE p DECIMALS 5,
p_loan TYPE p DECIMALS 2,
v_emi TYPE p DECIMALS 2,
v_dltyp TYPE dltyp.

CHECK sy-tcode = 'PA30'.

CLEAR : p_durn , v_durn , v_emi , p_loan , p_intr , i0045 , v_dltyp.

CASE: innnn-infty.

WHEN '0045'.

SELECT SINGLE dltyp
FROM t506a
INTO v_dltyp
WHERE dlart EQ innnn-subty.

IF innnn-endda = '99991231'.
MESSAGE e208(00) WITH 'Determine end date'.
EXIT.
ENDIF.

CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn
EXPORTING
prelp = innnn
IMPORTING
pnnnn = i0045.

CALL FUNCTION 'HR_HK_DIFF_BT_2_DATES'
EXPORTING
date1 = i0045-endda
date2 = i0045-tilbg
output_format = '04'
IMPORTING
* YEARS =
months = v_durn
* DAYS =
EXCEPTIONS
invalid_dates_specified = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

p_durn = v_durn.

*--Interest rate
p_intr = i0045-indin / 1200 .
p_loan = i0045-darbt.

v_emi = ( ( ( 1 + p_intr ) ** p_durn ) - 1 ).

IF v_emi IS NOT INITIAL.
*--Calculate EMI

IF v_dltyp = 'A'.
i0045-anrte = ( p_loan * p_intr ) *
( ( ( 1 + p_intr ) ** p_durn ) /
( ( ( 1 + p_intr ) ** p_durn ) - 1 ) ).
ELSEIF v_dltyp = 'I'.
i0045-tilbt = ( p_loan * p_intr ) *
( ( ( 1 + p_intr ) ** p_durn ) /
( ( ( 1 + p_intr ) ** p_durn ) - 1 ) ).
ENDIF.

ENDIF.

CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
EXPORTING
pnnnn = i0045
IMPORTING
prelp = innnn.

ENDCASE.