SAP HCM ABAP BAPI

From SapWiki

FM BAPI_BASICPAY_GETDETAIL

Ojo que esta BAPI calcula los conceptos indirectos :-)

FORM get_p0008_detail tables gt_bapi_wagetypes structure bapip0008p
                      USING p0008 LIKE p0008.
 DATA ld_amount_external LIKE  bapicurr-bapicurr.
 DATA lt_return LIKE TABLE OF bapireturn1 WITH HEADER LINE.
 CLEAR gt_bapi_wagetypes[].
 CALL FUNCTION 'BAPI_BASICPAY_GETDETAIL'
      EXPORTING
           employeenumber = p0008-pernr
           subtype        = p0008-subty
           objectid       = p0008-objps
           lockindicator  = p0008-sprps
           validitybegin  = p0008-begda
           validityend    = p0008-endda
           recordnumber   = p0008-seqnr
      IMPORTING
           return         = lt_return
      TABLES
           wagetypes      = gt_bapi_wagetypes.
endform.

Como leer codigo de empleado (PERNR) via usuario SAP (SY-UNAME)

Funciónes BAPI_USR01DOHR_GETEMPLOYEE - RP_GET_PERNR_FROM_USERID con usrty = '0001'

BAPI_PTMGRATTABS_MNGCREATION - Crear Absentismo IT2001

FORM crear_abs USING p_pernr 
                     p_subty 
                     p_begda 
                     p_endda 
                     p_beguz 
                     p_enduz 
                     p_simulate 
            CHANGING p_retorno TYPE bapiret2_tab
                     p_hrabsatt_out TYPE bapihrabsatt_out
                     p_text.

  DATA: lt_retorno      LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
        ls_key          TYPE bapihrtimeskey,  " Campos clave BAPI p.entradas tiempos personal (HR)
        ls_abs          TYPE bapihrabsatt_in. " Campos presencia/absentismo, entrada sin datos adicionale.

* Lock the employee record
  CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE'
    EXPORTING
      number = p_pernr
    IMPORTING
      return = ls_return
    EXCEPTIONS
      OTHERS = 1.
  if ls_return is NOT INITIAL .
    MOVE-CORRESPONDING ls_return to p_retorno.
    return.
  endif.

  CLEAR: ls_abs.
  ls_abs-from_date      = p_begda. " Inicio de la validez
  ls_abs-to_date        = p_endda. " Fin de la validez
  ls_abs-start_time     = p_beguz. " Hora de inicio
  ls_abs-end_time       = p_enduz. " Hora final
  ls_abs-abs_att_hours  = ''. " Horas de presencia/absentismo
  ls_abs-previous_day   = ''. " Indicador de día anterior

  IF  p_beguz IS NOT INITIAL AND p_enduz IS NOT INITIAL.
*  ----> Logica de Horas para el dia
    ls_abs-all_day_flag = space.
  ELSE.
*  ----> Logica Considera
    ls_abs-all_day_flag = 'X'.
  ENDIF.

  CALL FUNCTION 'BAPI_PTMGRATTABS_MNGCREATION'
    EXPORTING
      employeenumber = p_pernr " Nro. Personal
      abs_att_type   = p_subty             " Clase de Absentismos
      hrabsatt_in    = ls_abs              " Campos presencia/absentismo, entrada sin datos adicionales
      simulate       = p_simulate
    IMPORTING
      hrabsatt_out   = p_hrabsatt_out
      hrabsattext    = p_text
    TABLES
      return         = p_retorno. " Retorno

  CALL FUNCTION 'BAPI_EMPLOYEE_DEQUEUE'
    EXPORTING
      number        = p_pernr
            .

  loop at p_retorno into data(ls_retorno) where type = 'E' or type = 'A'.
  endloop
  if sy-subrc <> 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
*    CALL FUNCTION 'HR_PSBUFFER_INITIALIZE'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*    CALL FUNCTION 'HR_PSBUFFER_INITIALIZE'.
  endif.
ENDFORM.

BAPI_TIMEQUOTA_GETDETAILEDLIST - Rutinas para leer contingente

method GET_SALDO_DIAS.
*--------------------------------------------------------------------*
* Calculo de saldo días
*--------------------------------------------------------------------*
  DATA: lt_abs_quota TYPE TABLE OF bapihrquota,
        lt_ktart     TYPE tim_quota_type_tab,
        ra_ktart     TYPE RANGE OF p2006-ktart,
        wa_ktart     LIKE LINE OF ra_ktart.
  DATA lv_saldodias TYPE anzhl.

*--------------------------------------------------------------------*
* Calculo de saldo días
*--------------------------------------------------------------------*
  CALL FUNCTION 'BAPI_TIMEQUOTA_GETDETAILEDLIST'
    EXPORTING
      employeenumber          = i_solicitud-pernr
*     QUOTASELECTIONMOD       = '1' "absentismos
    TABLES
      absencequotareturntable = lt_abs_quota.

  CALL FUNCTION 'Z_HCM_CONTINGENTE_FROM_ABS'
    EXPORTING
      i_pernr = i_solicitud-pernr
      i_begda = i_solicitud-begda
      i_endda = i_solicitud-endda
      i_subty = i_solicitud-subty
    IMPORTING
      e_ktart = lt_ktart.

  LOOP AT lt_ktart INTO DATA(ls_ktart).
    wa_ktart-low = ls_ktart.
    wa_ktart-sign = 'I'.
    wa_ktart-option = 'EQ'.
    APPEND wa_ktart TO ra_ktart.
    CLEAR wa_ktart.
  ENDLOOP.

  lv_saldodias = 0.
  IF ra_ktart[] IS NOT INITIAL.
    LOOP AT lt_abs_quota INTO DATA(ls_abs_quota) WHERE quotatype IN ra_ktart.
      lv_saldodias = lv_saldodias + ls_abs_quota-rest_free.
    ENDLOOP.
  ENDIF.

  lv_saldodias = lv_saldodias - i_solicitud-quota_deduction.

  IF lv_saldodias < 0.
    lv_saldodias = 0.
  ENDIF.

  r_saldo = lv_saldodias.  "type anzhl
  endmethod.
  
FUNCTION z_hcm_contingente_from_abs.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     REFERENCE(I_PERNR) TYPE  PERNR_D
*"     REFERENCE(I_BEGDA) TYPE  BEGDA DEFAULT SY-DATUM
*"     REFERENCE(I_ENDDA) TYPE  ENDDA DEFAULT SY-DATUM
*"     REFERENCE(I_SUBTY) TYPE  T554S-SUBTY
*"  EXPORTING
*"     REFERENCE(E_KTART) TYPE  TIM_QUOTA_TYPE_TAB
*"----------------------------------------------------------------------
  DATA lt_p0001 TYPE TABLE OF p0001.
  DATA ls_t503 TYPE t503.
  DATA ls_t001p TYPE t001p.
  DATA ls_t554s TYPE t554s.
  DATA ls_t556c TYPE t556c.
  DATA ls_t556r TYPE t556r.

  CALL FUNCTION 'HR_READ_INFOTYPE'
    EXPORTING
      pernr           = i_pernr
      infty           = '0001'
    TABLES
      infty_tab       = lt_p0001
    EXCEPTIONS
      infty_not_found = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  LOOP AT lt_p0001 INTO DATA(ls_p0001) WHERE begda <= i_endda AND
                                             endda >= i_begda.
  ENDLOOP.
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  SELECT SINGLE * INTO ls_t503 FROM  t503
         WHERE  persg  = ls_p0001-persg
         AND    persk  = ls_p0001-persk.

  SELECT SINGLE * INTO ls_t001p FROM  t001p
         WHERE  werks  = ls_p0001-werks
         AND    btrtl  = ls_p0001-btrtl.

  SELECT  SINGLE * INTO ls_t554s FROM  t554s
         WHERE  moabw  = ls_t001p-moabw
         AND    subty  = i_subty
         AND    endda  >= i_begda
         AND    begda  <= i_endda.

  SELECT SINGLE * INTO ls_t556c FROM  t556c
         WHERE  mopgk  = ls_t503-konty
         AND    mozko  = ls_t001p-mozko
         AND    crule  = ls_t554s-crule
         AND    ctype  = 'Q'.

  SELECT SINGLE * INTO ls_t556r FROM t556r
                      WHERE             "
                            mopgk =  ls_t503-konty
                        AND mozko =   ls_t001p-mozko
                        AND qtype =  'A'
                        AND dedrg =  ls_t556c-deabp
                        AND endda >= i_begda
                        AND begda <= i_endda.

* copiado de LHRTIM00QUOTADEDUCTIONF01 #986
  CONSTANTS: QSTEP TYPE I VALUE 2.

  DATA: BEGIN OF selqtypes OCCURS 0,
          cktart(2) TYPE c,
        END OF selqtypes.

  DATA:qttps TYPE qttps.
  qttps = ls_t556r-qttps.

     DO 100 TIMES.
      selqtypes-cktart = qttps.
      IF selqtypes-cktart IS INITIAL.  "'  '"
        EXIT.                          "end-of-sequence was found
      ENDIF.
      APPEND selqtypes.
      SHIFT qttps BY qstep PLACES LEFT.
    ENDDO.

    loop at selqtypes.
      APPEND selqtypes-cktart to E_KTART.
    endloop.

ENDFUNCTION.

La función anterior es equivalente al siguiente método:

  DATA lt_p0001 TYPE p0001_tab.

  CALL FUNCTION 'HR_READ_INFOTYPE'
    EXPORTING
      pernr           = i_pernr
      infty           = '0001'
      begda           = i_begda
      endda           = i_endda
    TABLES
      infty_tab       = lt_p0001
    EXCEPTIONS
      infty_not_found = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  CALL METHOD cl_hrpaybr_absence_quotas=>get_quota_type_tab
    EXPORTING
      iv_pernr          = i_pernr
      iv_begda          = i_begda
      iv_endda          = i_endda
      it_p0001          = lt_p0001
      iv_subty          = i_subty
    IMPORTING
      et_quota_type_tab = ra_ktart.

Tabla Contingentes: T556R - Reglamentación secuencia liquidación p.contingentes absent.

tabla PTQUODED

Key Details regarding PTQUODED:

• Purpose: Contains entries for every day of absence deducted from an employee's quota, linked by document numbers of IT2001 and IT2006.

• Trigger: When a deductible absence (configured in T554S) is created via IT2001, the system automatically creates an entry in PTQUODED.

• Consistency Check: If deductions in IT2006 do not match IT2001 records, PTQUODED is often the source of the inconsistency, which can be fixed using report RPTBPC10 or HNZUPTC0.

• Common Issues: If LSMW is used to update absences, PTQUODED might not be updated, leading to discrepancies in PT50, requiring manual or report-based corrections.

• Key Fields: The table uses document numbers (DOCNR) and personnel numbers (PERNR) to link absence entries with quotas.