quarta-feira, 27 de novembro de 2013

UPC que retorna o valor INSS ( HCM210 )


/*****************************************************************************
**  Programa : prghur\upc\fr5440r7unep.p                                              
**  Descricao: UPC que retorna o valor INSS, se este for maior que o valor base Funcionario
******************************************************************************/                            
{include/i-epc200.i1}
   
/*parametros*/
def input param  p-ind-event as char no-undo.
def input-output param table for tt-epc.

define buffer bmovto_calcul_func for movto_calcul_func.
   
define variable v_valor1         as decimal     no-undo.
define variable v_valor2         as decimal     no-undo.
define variable v_valor3         as decimal     no-undo.
define variable v_val_inss1      as decimal     no-undo.
define variable v_val_inss2      as decimal     no-undo.
define variable v_val_inss3      as decimal     no-undo.
define variable v_val_ret1       as character   no-undo.
define variable v_val_ret2       as character   no-undo.
define variable v_val_ret3       as character   no-undo.
define variable v_val_ret_aux1   as character   no-undo.
define variable v_val_ret_aux2   as character   no-undo.
define variable v_val_ret_aux3   as character   no-undo.
define variable v_val_ret_auxt   as character   no-undo.
define variable v_val_ret_total  as character   no-undo.
define variable v_cont           as integer     no-undo.
define variable v_dat_refer      as date        no-undo.
define variable v_dat_penult     as date        no-undo.
define variable v_dat_antepenult as date        no-undo.
define variable v_ultim_dia_mes  as date        no-undo.
define variable v_mes            as int         no-undo.
define variable v_ano            as int         no-undo.

/*l½gica*/
find first tt-epc no-lock
     where tt-epc.cod-event = 'salario_segur_desemp'
       and tt-epc.cod-event = p-ind-event
   no-error.
if avail tt-epc then do:  

   assign v_dat_refer      = date(entry(4,tt-epc.val-parameter,";")).
/*           v_mes            = 0  */
/*           v_ano            = 0. */

   if (month(v_dat_refer) - 1) = 0 then do:
       assign v_ano = year(v_dat_refer) - 1.
      /* {prghur\fpp\fp9200.i15 12 v_ano v_ultim_dia_mes}*/
       assign v_dat_penult = v_ultim_dia_mes.
   end.

   else do:
       assign v_mes = month(v_dat_refer) - 1.
      /* {prghur\fpp\fp9200.i15 v_mes year(v_dat_refer) v_ultim_dia_mes}*/
       assign v_dat_penult = v_ultim_dia_mes.
   end.

/*    assign v_mes = 0  */
/*           v_ano = 0. */

   if (month(v_dat_penult) - 1) = 0 then do:
       assign v_ano = year(v_dat_penult) - 1.
      /* {prghur\fpp\fp9200.i15 12 v_ano v_ultim_dia_mes}*/
       assign v_dat_antepenult = v_ultim_dia_mes.
   end.

   else do:
       assign v_mes = month(v_dat_penult) - 1.
       /*{prghur\fpp\fp9200.i15 v_mes year(v_dat_penult) v_ultim_dia_mes}*/
       assign v_dat_antepenult = v_ultim_dia_mes.
   end.
 
   /* £ltima data */
   rescisao:
   for each det_rescis no-lock
      where det_rescis.cdn_empresa      = int(entry(1,tt-epc.val-parameter,";"))
        and det_rescis.cdn_estab        = int(entry(2,tt-epc.val-parameter,";"))
        and det_rescis.cdn_funcionario  = int(entry(3,tt-epc.val-parameter,";"))    
        and det_rescis.num_mes_refer_fp = month(v_dat_refer)
        and det_rescis.num_ano_refer_fp = year(v_dat_refer):

      do v_cont = 1 to det_rescis.qti_efp:
         if det_rescis.cdn_idx_efp_funcao_espcif[v_cont] = 18 then do:
            assign v_val_inss1 = v_val_inss1 + det_rescis.val_base_calc_fp[v_cont].
            leave rescisao.
         end.
      end.
   end.

   find last histor_sal_func no-lock
       where histor_sal_func.cdn_empresa     = int(entry(1,tt-epc.val-parameter,";"))
         and histor_sal_func.cdn_estab       = int(entry(2,tt-epc.val-parameter,";"))
         and histor_sal_func.cdn_funcionario = int(entry(3,tt-epc.val-parameter,";"))    
         and histor_sal_func.dat_liber_sal  <= v_dat_refer      
       no-error.
   if avail histor_sal_func then do:
      if v_val_inss1 > histor_sal_func.val_salario_mensal then
         assign v_valor1 = v_val_inss1.    
      else
         assign v_valor1 = histor_sal_func.val_salario_mensal.
   end.

   /* pen£ltima data */
   penultimo_envelope:
   for each bmovto_calcul_func no-lock
      where bmovto_calcul_func.cdn_empresa              = int(entry(1,tt-epc.val-parameter,";"))
        and bmovto_calcul_func.cdn_estab                = int(entry(2,tt-epc.val-parameter,";"))
        and bmovto_calcul_func.cdn_funcionario          = int(entry(3,tt-epc.val-parameter,";"))    
        and bmovto_calcul_func.num_mes_refer_fp         = month(v_dat_penult)
        and bmovto_calcul_func.num_ano_refer_fp         = year(v_dat_penult)
        and bmovto_calcul_func.idi_tip_fp               = 1
        and bmovto_calcul_func.qti_parc_habilit_calc_fp = 9:

      do v_cont = 1 to bmovto_calcul_func.qti_efp:
         if bmovto_calcul_func.cdn_idx_efp_funcao_espcif[v_cont] = 18 then do:
            assign v_val_inss2 = v_val_inss2 + bmovto_calcul_func.val_base_calc_fp[v_cont].
            leave penultimo_envelope.
         end.
      end.
   end.
   find last histor_sal_func no-lock
       where histor_sal_func.cdn_empresa     = int(entry(1,tt-epc.val-parameter,";"))
         and histor_sal_func.cdn_estab       = int(entry(2,tt-epc.val-parameter,";"))
         and histor_sal_func.cdn_funcionario = int(entry(3,tt-epc.val-parameter,";"))      
         and histor_sal_func.dat_liber_sal  <= v_dat_penult      
       no-error.
   if avail histor_sal_func then do:
      if v_val_inss2 > histor_sal_func.val_salario_mensal then
         assign v_valor2 = v_val_inss2.    
      else
         assign v_valor2 = histor_sal_func.val_salario_mensal.
   end.

   /* antepenultima data */
   antepenultimo_envelope:
   for each bmovto_calcul_func no-lock
      where bmovto_calcul_func.cdn_empresa              = int(entry(1,tt-epc.val-parameter,";"))
        and bmovto_calcul_func.cdn_estab                = int(entry(2,tt-epc.val-parameter,";"))
        and bmovto_calcul_func.cdn_funcionario          = int(entry(3,tt-epc.val-parameter,";"))    
        and bmovto_calcul_func.num_mes_refer_fp         = month(v_dat_antepenult)
        and bmovto_calcul_func.num_ano_refer_fp         = year(v_dat_antepenult)
        and bmovto_calcul_func.idi_tip_fp               = 1
        and bmovto_calcul_func.qti_parc_habilit_calc_fp = 9:

      do v_cont = 1 to bmovto_calcul_func.qti_efp:
         if bmovto_calcul_func.cdn_idx_efp_funcao_espcif[v_cont] = 18 then do:
            assign v_val_inss3 = v_val_inss3 + bmovto_calcul_func.val_base_calc_fp[v_cont].
            leave antepenultimo_envelope.
         end.
      end.
   end.
   find last histor_sal_func no-lock
       where histor_sal_func.cdn_empresa     = int(entry(1,tt-epc.val-parameter,";"))
         and histor_sal_func.cdn_estab       = int(entry(2,tt-epc.val-parameter,";"))
         and histor_sal_func.cdn_funcionario = int(entry(3,tt-epc.val-parameter,";"))      
         and histor_sal_func.dat_liber_sal  <= v_dat_antepenult      
       no-error.
   if avail histor_sal_func then do:
      if v_val_inss3 > histor_sal_func.val_salario_mensal then
         assign v_valor3 = v_val_inss3.    
      else
         assign v_valor3 = histor_sal_func.val_salario_mensal.
   end.

   assign v_val_ret_aux1 = string(v_valor1 * 100,">>>>>>>>>>9")
          v_val_ret_aux2 = string(v_valor2 * 100,">>>>>>>>>>9")
          v_val_ret_aux3 = string(v_valor3 * 100,">>>>>>>>>>9")
          v_val_ret_auxt = string( ((v_valor1 + v_valor2 + v_valor3) * 100),">>>>>>>>>>9")
          v_cont = 0.

   do v_cont = 1 to 11:
      assign v_val_ret1 = v_val_ret1 + substr(v_val_ret_aux1,v_cont,1) + " "
             v_val_ret2 = v_val_ret2 + substr(v_val_ret_aux2,v_cont,1) + " "
             v_val_ret3 = v_val_ret3 + substr(v_val_ret_aux3,v_cont,1) + " "
             v_val_ret_total = v_val_ret_total +  substr(v_val_ret_auxt,v_cont,1) + " ".
   end.

   assign tt-epc.val-parameter = v_val_ret1 + ";" + v_val_ret2 + ";" + v_val_ret3 + ";" + v_val_ret_total.

   return 'salario_segur_desemp-ok'.
end.

return 'salario_segur_desemp-nok'.

Nenhum comentário:

Postar um comentário