1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

[RESOLVIDO] Trava de saldo negativo

Discussão em 'EMS , HCM e Totvs 11' iniciado por rafael.andrade, Janeiro 26, 2016.

?

Foi fácil de compreender o problema?

Poll closed Fevereiro 25, 2016.
  1. Sim, claro

    1 voto(s)
    100.0%
  2. mais ou menos, mas tive que reler uma ou mais vezes

    0 voto(s)
    0.0%
  3. Não

    0 voto(s)
    0.0%
  4. Não entendi nada!!!

    0 voto(s)
    0.0%
Status do Tópico:
Não esta aberto para novas mensagens.
  1. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Blz, vou dar uma olhada...vlw pela força.

    Abraço

    Rafael
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Eu tenho upc para a ceapi001 ....
    Código:
    /*  ------------------------------------------------------
        Programa .: upc/upc-ceapi001.p
        Autor ....: Richard Edgar - Imesul
        Data .....: 30/12/2011
        Descricao : Verificar se usuario pode movimentar em
                    deposito.
        ------------------------------------------------------ */
        {grid2/error.i}
    
        {utp/ut-glob.i}
        {include/i-epc200.i1}
    
        define variable codigo    as character no-undo.
        define variable codigo_GF as character no-undo.
    
        define new global shared variable cssf0309 as character no-undo.
    
        define variable parametrosGlobais as imesul.common.ParametrosGlobais           no-undo.
        define variable ordemProducao     as imesul.ems2.producao.OrdemProducao        no-undo.
        define variable estoqueQtd        as modular.ems2.producao.SaldoEstoqueQtidade no-undo.
        define variable error             as ExceptionControl                          no-undo.
        define variable erroOrdemProducao as logical                                   no-undo.
    
    
        define buffer ttMovto-estoq for movto-estoq.
        define variable reqSucata as logical no-undo.
    
        assign error             = ExceptionControl:getInstance()
               parametrosGlobais = new imesul.common.ParametrosGlobais().
    
        procedure picontrole-vasilhames:
            define input        parameter p-ind-event as character no-undo.
            define input-output parameter table for tt-epc.
    
            if p-ind-event = 'controle-vasilhames' then do:
                find first tt-epc
                     where tt-epc.cod-event     = p-ind-event
                       and tt-epc.cod-parameter = 'movto-estoq-rowid'
                           no-error.
    
                if avail tt-epc then do:
                    for first movto-estoq no-lock
                        where rowid (movto-estoq) = to-rowid(tt-epc.val-parameter):
    
                        if parametrosGlobais:getUsuario() <> 'RPW' then do:
                            if parametrosGlobais:getUsuario() <> 'MARCELO' then do:
                                if parametrosGlobais:getUsuario() <> 'JONATAS' then do:
                                    if parametrosGlobais:getUsuario() <> 'RODOLFO' then do:
                                        if parametrosGlobais:getUsuario() <> 'FERNANDA' then do:
                                            if movto-estoq.cod-depos = 'PRE' or
                                               movto-estoq.cod-depos = 'CQ'  then do:
                                                if movto-estoq.tipo-trans  = 1 and
                                                   movto-estoq.cod-estabel = '101' then do:
                                                    run utp/ut-msgs.p('show',17006,substitute('DEPOSITO &1 sem permissÆo para ENTRADAS~~O deposito &1 foi travado por ordem da diretoria', movto-estoq.cod-depos)).
                                                    return 'NOK'.
                                                end.
                                            end.
                                        end.
                                    end.
                                end.
                            end.
                        end.
    
                        find first cst_permissao_movto_deposito no-lock
                             where cst_permissao_movto_deposito.cod_usuario = c-seg-usuario
                               and cst_permissao_movto_deposito.cod-estabel = movto-estoq.cod-estabel
                               and cst_permissao_movto_deposito.cod-depos   = movto-estoq.cod-depos
                                   no-error.
                        if avail cst_permissao_movto_deposito then do:
                            if cst_permissao_movto_deposito.acesso[movto-estoq.esp-docto] = no then do:
                                run utp/ut-msgs.p('show',17006,substitute('Usuario sem permissao de movimento de estoque.~~ O usuario &1 nÆo est  cadastrado para movimentar estoque',c-seg-usuario)).
                                create tt-epc.
                                assign tt-epc.cod-event     = 'ERROR':u
                                       tt-epc.cod-parameter = 'EPC-ERROR':u
                                       tt-epc.val-parameter = substitute('Usuario &1 sem permissao de movimento de estoque.', c-seg-usuario).
                                return 'NOK'.
                            end.
                        end.
    
                        find first item no-lock
                             where item.it-codigo = movto-estoq.it-codigo
                               and item.fm-codigo = '10590'
                                   no-error.
                        if avail item then do:
                            if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'ACA' then do:
                                assign reqSucata = yes.
                                for each ttMovto-estoq no-lock
                                    where ttMovto-estoq.nr-ord-produ = movto-estoq.nr-ord-produ:
                                    if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'REQ' then do:
                                        find first item no-lock
                                             where item.it-codigo = ttMovto-estoq.it-codigo
                                               and item.fm-codigo = '10590'
                                                   no-error.
                                        if not avail item then assign reqSucata = no.
                                    end.
                                end.
                                if not reqSucata then do:
                                    run utp/ut-msgs.p('show',17006,'Tipo de movimento invalido.~~NÆo permitido movimentos tipo ACA para itens de SUCATA com materia prima normal').
                                    create tt-epc.
                                    assign tt-epc.cod-event     = 'ERROR':u
                                           tt-epc.cod-parameter = 'EPC-ERROR':u
                                           tt-epc.val-parameter = 'NÆo permitido movimentos tipo ACA para itens de SUCATA com materia prima normal'.
                                    return 'NOK'.
                                end.
                            end.
    
                            if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'ROP' then do:
                                find first cst_ger_plano_ordens no-lock
                                     where cst_ger_plano_ordens.nr-ord-produ = movto-estoq.nr-ord-produ
                                           no-error.
                                if not avail cst_ger_plano_ordens then do:
                                    run utp/ut-msgs.p('show',17006,'Erro reporte de sucata.~~NÆo permitido reporte de sucata').
                                    create tt-epc.
                                    assign tt-epc.cod-event     = 'ERROR':u
                                           tt-epc.cod-parameter = 'EPC-ERROR':u
                                           tt-epc.val-parameter = 'NÆo permitido reporte de sucata'.
                                    return 'NOK'.
                                end.
                            end.
                        end.
    
                        case {ininc/i03in218.i 4 movto-estoq.esp-docto}:
                            when 'ACA' then run testeREQ.
                            when 'ROP' then if movto-estoq.tipo-trans = 1 then run testeREQ.
                        end case.
                        if return-value = 'NOK' then return 'NOK'.
    
                        for first nota-fiscal no-lock
                            where nota-fiscal.cod-estabel = movto-estoq.cod-estabel
                              and nota-fiscal.serie       = movto-estoq.serie-docto
                              and nota-fiscal.nr-nota-fis = movto-estoq.nro-docto:
    
                            for each it-nota-fisc of nota-fiscal:
                                case nota-fiscal.cod-canal-venda:
                                    when 105 then assign it-nota-fisc.cod-unid-negoc = 'ENA'.
                                    when 108 then assign it-nota-fisc.cod-unid-negoc = 'ITA'.
                                    when 110 then assign it-nota-fisc.cod-unid-negoc = 'SCA'.
                                    when 112 then assign it-nota-fisc.cod-unid-negoc = 'SCP'.
                                    when 122 then assign it-nota-fisc.cod-unid-negoc = 'DLA'.
                                    when 142 then assign it-nota-fisc.cod-unid-negoc = 'CLA'.
                                    when 147 then assign it-nota-fisc.cod-unid-negoc = 'CLA'.
                                end.
                            end.
    
                            find first ttMovto-estoq exclusive-lock
                                 where recid(ttMovto-estoq) = recid(movto-estoq)
                                       no-error.
    
                            if avail ttMovto-estoq then do:
                                case nota-fiscal.cod-canal-venda:
                                    when 105 then assign ttmovto-estoq.cod-unid-negoc = 'ENA'.
                                    when 108 then assign ttmovto-estoq.cod-unid-negoc = 'ITA'.
                                    when 110 then assign ttmovto-estoq.cod-unid-negoc = 'SCA'.
                                    when 112 then assign ttmovto-estoq.cod-unid-negoc = 'SCP'.
                                    when 122 then assign ttmovto-estoq.cod-unid-negoc = 'DLA'.
                                    when 142 then assign ttmovto-estoq.cod-unid-negoc = 'CLA'.
                                    when 147 then assign ttmovto-estoq.cod-unid-negoc = 'CLA'.
                                end.
                                case nota-fiscal.cod-canal-venda:
                                    when 105 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'ENA'.
                                    when 108 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'ITA'.
                                    when 110 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'SCA'.
                                    when 112 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'SCP'.
                                    when 122 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'DLA'.
                                    when 142 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'CLA'.
                                    when 147 then assign ttmovto-estoq.cod-unid-negoc-sdo = 'CLA'.
                                end.
                                release ttMovto-estoq no-error.
                            end.
                        end.
                        if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'RRQ' then do:
                            assign estoqueQTD = new modular.ems2.producao.SaldoEstoqueQtidade().
                            error:clearExceptions().
                            do {&try}:
                                estoqueQTD:findBYID(movto-estoq.it-codigo, movto-estoq.cod-estabel).
                                estoqueQTD:setSaldo(estoqueQTD:getSaldo() + estoqueQTD:getUnidades(movto-estoq.quantidade)).
                                estoqueQTD:save().
                            {&catch}
                            error:clearExceptions().
                           
                            delete object estoqueQTD.
                        end.
    
                        if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'EAC' or
                           {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'REQ' then do:
                            assign estoqueQTD = new modular.ems2.producao.SaldoEstoqueQtidade().
                            error:clearExceptions().
                            do {&try}:
                                estoqueQTD:findBYID(movto-estoq.it-codigo, movto-estoq.cod-estabel).
                                estoqueQTD:setSaldo(estoqueQTD:getSaldo() - estoqueQTD:getUnidades(movto-estoq.quantidade)).
                                estoqueQTD:save().
                            {&catch}
                            error:clearExceptions().
                           
                            delete object estoqueQTD.
                        end.
    
                    end.
                end.
            end.
            return 'ok'.
        end procedure.
    
        procedure testeREQ:
            define buffer bf_movto-estoq for movto-estoq.
    
            define variable saldoREQ as decimal no-undo.
            define variable saldoACA as decimal no-undo.
    
            define variable nivel       as integer no-undo.
            define variable liberaOrdem as logical no-undo.
    
            assign saldoREQ = 0.
            for first ord-prod no-lock
                where ord-prod.nr-ord-produ = movto-estoq.nr-ord-produ:
    
                for each cst_ger_plano_ordens no-lock
                    where cst_ger_plano_ordens.nr-ord-produ = ord-prod.nr-ord-produ
                    ,
                    first cst_ger_plano of cst_ger_plano_ordens no-lock
                    where cst_ger_plano.situacao = 2:
    
                    assign saldoACA = 0.
                    for each bf_movto-estoq no-lock
                        where bf_movto-estoq.nr-ord-produ = ord-prod.nr-ord-produ:
                        case {ininc/i03in218.i 4 bf_movto-estoq.esp-docto}:
                            when 'ACA' then assign saldoACA = saldoACA + bf_movto-estoq.quantidade.
                            when 'EAC' then assign saldoACA = saldoACA - bf_movto-estoq.quantidade.
                            when 'ROP' then do:
                                case bf_movto-estoq.tipo-trans:
                                    when 1 then assign saldoACA = saldoACA + bf_movto-estoq.quantidade.
                                    when 2 then assign saldoACA = saldoACA - bf_movto-estoq.quantidade.
                                end case.
                            end.
                        end case.
                    end.
    
                    assign liberaOrdem = no.
                    if parametrosGlobais:getUsuario() = 'datasul' then do:
                        assign liberaOrdem = yes.
                    end.
    
                    if cssf0309 = 'cssf0309' then do:
                        assign liberaOrdem = yes.
                    end.
    
                    if not liberaOrdem then do:
                        if saldoACA < ord-prod.qt-ordem then do:
                            run utp/ut-msgs.p('show',17006,'Erro de processo ordem produ‡Æo~~Esta ordem nÆo tem permissÆo para reporte parcial, contate responsavel da area').
                            return 'NOK'.
                        end.
                    end.
                end.
    
                if ord-prod.log-2 = no then do:
                    for each  bf_movto-estoq no-lock
                        where bf_movto-estoq.nr-ord-produ = ord-prod.nr-ord-produ:
    
                        case {ininc/i03in218.i 4 bf_movto-estoq.esp-docto}:
                            when 'REQ' then assign saldoREQ = saldoREQ + bf_movto-estoq.quantidade.
                            when 'RRQ' then assign saldoREQ = saldoREQ - bf_movto-estoq.quantidade.
                        end case.
                    end.
    
                    if saldoREQ <= 0 then do:
                        run utp/ut-msgs.p('show',17006,'Erro de processo ordem produ‡Æo~~Esta ordem nÆo tem permissÆo para reporte sem REQUISI€ÇO, contate responsavel da area').
                        return 'NOK'.
                    end.
    
                end.
            end.
    
            return 'ok'.
    
        end procedure.
    
    
    Inclusive tem uma rotina que não permite usuarios alterar saldo de estoque para determinados depositos sem um previo cadastro.
    lorenzi e reissobr curtiram isso.
  3. marcosflizi

    marcosflizi Membro Participativo

    Bom dia.
    Amigo, olha você vai criar uma lentidão no seu sistema, pois imagina se for fazer o movimento para trás precisará pegar o saldo na data e ler os movimentos até o dia em que deseja fazer e então verificar a possibilidade ou não. Imagina em um reporte de produção que tem uns 80 componentes para baixar, ele ter que ler cada um dos itens requisitados e fazer sua baixa.
    Para você não conheço nenhum ERP no mercado que faça desta forma a validação todos se baseiam no saldo atual.

    Mas se você fizer e quiser me repassar para verificar se podemos melhorar, posso te ajudar. Aqui o pessoal da controladoria desejou isto, e desistimos bem por este motivos.

    Atenciosamente.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página