sexta-feira, 29 de novembro de 2013

Formula para Pagamento de Comissão de Plantio de Cana,com base nos Serviços com Tipo de Serviço = 4 ( HCM210 )


/**************************************************************
**
** FM0000005 - Formula para pagamento de comissao de plantio de
**             cana,com base nos servicos com Tipo Servico = 4.
**************************************************************/

def input param p-row-movto as rowid no-undo.
def buffer cmovto_formul for movto_agric_det.
def buffer bmovto_formul for movto_agric_det.
def buffer bserv_agric   for serv_agric.
def buffer bdet_calend_formul for det_calend_turma_localid.
def buffer bfunc_localid for func_localid.

def var v_qtd_plantio as dec no-undo.
def var v_dat_movto   as date no-undo.
def var v_val_diaria  as dec no-undo.
def var v_val_exced   as dec no-undo.
def var v_val_hExtra  as dec no-undo.
def var v_val_comis   as dec no-undo.
def var v_val_serv_diaria as dec no-undo.

find movto_agric_det where 
     rowid(movto_agric_det) = p-row-movto no-lock no-error.
if avail movto_agric_det then do:
    find funcionario of movto_agric_det no-lock no-error.
    assign v_dat_movto = movto_agric_det.dat_movto_agric.
    /*Se j  gerou o servi‡o da comissÆo, nÆo necessita efetuar novamento o c lculo*/
    if can-find(first bmovto_formul of funcionario where
               bmovto_formul.dat_movto_agric = v_dat_movto and
               bmovto_formul.cdn_serv_agric = 410) then 
        return.

    /*Acumular a quantidade plantada para o dia do movimento*/
    for each bmovto_formul of funcionario where
        bmovto_formul.dat_movto_agric = v_dat_movto:
        find bserv_agric of bmovto_formul no-lock no-error.
        if bserv_agric.cdn_tip_serv_agric = 4 then /*Plantio de Cana*/
            assign v_qtd_plantio = v_qtd_plantio + bmovto_formul.qtd_serv_agric.
        if bserv_agric.idi_tip_serv_agric = 10 then /*Hora Extra*/
            assign v_val_hExtra = v_val_hExtra + bmovto_formul.val_serv_agric.
        if bserv_agric.cdn_serv_agric = 2 then
            assign v_val_serv_diaria = v_val_serv_diaria + bmovto_formul.val_serv_agric.
    end.

    /*Encontrar o valor da di ria na data do movimento*/
    find last histor_sal_func of funcionario where
         histor_sal_func.dat_liber_sal <= v_dat_movto no-lock no-error.
    if avail histor_sal_func then do:
        find last func_turno_trab of funcionario no-lock where
             func_turno_trab.dat_inic_lotac_func <= v_dat_movto no-error.
        
        find turno_trab of func_turno_trab no-lock no-error.
        assign v_val_diaria = trunc(round(funcionario.val_salario_atual / turno_trab.qtd_hrs_padr_quinz_rh * 
                                        turno_trab.qtd_hrs_padr_dia_rh,2),2).
    end.
    if v_qtd_plantio <= 5 then
        assign v_val_comis = v_val_diaria.
    else
        if v_qtd_plantio > 10 then
            assign v_val_comis = 26.40. 
        else
            case v_qtd_plantio :
                when dec(9) then
                    assign v_val_comis = 22.80. 
                when dec(10) then
                    assign v_val_comis = 26.40.
                otherwise 
                    assign v_val_comis = v_qtd_plantio * 2.
            end case.
    
    /*Descontar Horas Extras do valor da comissÆo*/
    assign v_val_comis = v_val_comis - v_val_hExtra.
    if v_val_comis < v_val_diaria then
       assign v_val_comis = v_val_diaria.

    /*Descontar Servi‡o 2 (di ria) da comissÆo*/
    assign v_val_comis = v_val_comis - v_val_serv_diaria.

    /*
    if v_val_comis < v_val_diaria then
       assign v_val_comis = v_val_diaria.
    */

    /*Achar calend rio para ver se o movimento ‚ em dia de feriado*/
    find last bfunc_localid of funcionario no-lock where
         bfunc_localid.dat_inic_lotac_func <= v_dat_movto no-error.
    find bdet_calend_formul no-lock where
         bdet_calend_formul.cdn_turno_trab = func_turno_trab.cdn_turno_trab and
         bdet_calend_formul.cdn_turma_trab = func_turno_trab.cdn_turma_trab and
         bdet_calend_formul.cod_pais       = bfunc_localid.cod_pais         and
         bdet_calend_formul.cdn_localidade = bfunc_localid.cdn_localid no-error.
    if avail bdet_calend_formul and
        bdet_calend_formul.idi_sit_dia_trab = 4 then do: /*feriado*/
        assign v_val_comis = v_val_comis * 2.
        if v_val_comis < v_val_diaria * 2 then
            assign v_val_comis = v_val_diaria * 2.
    end.
    
    if v_val_comis > 0 then do:
        find first bmovto_formul of funcionario where
                   bmovto_formul.dat_movto_agric = v_dat_movto and
                   bmovto_formul.cdn_serv_agric = 410 no-lock no-error.
        if not avail bmovto_formul then do:
            create bmovto_formul.
            assign bmovto_formul.cdn_empresa            = funcionario.cdn_empresa
                   bmovto_formul.cdn_estab              = funcionario.cdn_estab
                   bmovto_formul.cdn_funcionario        = funcionario.cdn_funcionario
                   bmovto_formul.dat_movto_agric        = v_dat_movto
                   bmovto_formul.idi_orig_movto_agric   = 3
                   bmovto_formul.cdn_serv_agric         = 410
                   bmovto_formul.qtd_serv_agric         = 1
                   bmovto_formul.val_serv_agric         = trunc(round(v_val_comis,2),2).
            find last cmovto_formul of funcionario where
                      cmovto_formul.dat_movto_agric = v_dat_movto no-lock no-error.

            assign bmovto_formul.num_lancto_movto_agric = cmovto_formul.num_lancto_movto_agric + 1.
        end.
    end.
end.

Nenhum comentário:

Postar um comentário