¶ Análise quanto a implementação do cálculo de depreciação em tempo real
Superintendência Estadual de Tecnologia da Informação e Comunicação
Última Alteração
Versão
Time:
Esquadrão Suicida
20/03/2024
1.0
Integrantes:
Diego Barros/ Vinicius Rosa / Igor Ramos
Product Owner:
Nara Galvão
A intenção do estudo é fazer uma análise quanto a possibilidade de alterar o modelo atual de depreciação para que os cálculos sejam gerados em tempo real ao invés de armazenar os valores em banco de dados.
Atualmente, o cálculo de depreciação no e-Estado tem as seguintes operações:
Quando um bem é incorporado, todas as depreciações do bem até o fim da sua vida útil é gerada e registrada no banco.
Quando o bem é transferido para outra unidade, as depreciações são transferidas para o novo bem criado no destino.
Quando o bem é cedido (guarda) para outra unidade as depreciações são transferidas para o novo bem criado no destino.
Quando o bem é avaliado as depreciações são geradas novamente a partir da data da avaliação.
Quando o bem é reclassificado a conta de depreciação é atualizada.
Identificar a quantidade de ciclos de depreciação (ou seja, quantos recálculos aconteceu)
CONSULTAR as avaliações
CONSULTAR os impairment tests
CONSULTAR o histórico do bem para recuperar o valor e a taxa residual
Verificar se o bem podia depreciar na data sendo verificada
Verificar se está no mesmo ciclo de depreciação
Preencher os seguintes campos:
Valor depreciado acumulado atual: Basta multiplicar a iteração atual pelo valor de depreciação mensal do ciclo atual
Valor contábil líquido: Basta pegar o valor do valor depreciado acumulado atual e diminuir pelo valor do bem recuperado do histórico
Valor depreciado acumulado total: CALCULAR, para cada ciclo anterior, a última depreciação e recuperar o Valor depreciado acumulado atual. A soma de tudo + o somatório da depreciação atual do período sendo calculado é o Valor depreciado acumulado total
Valor depreciado acumulado anos anteriores: CALCULAR última depreciação do ano anterior e recuperar o Valor depreciado acumulado total
Valor depreciado acumulado ano corrente: CALCULAR a última depreciação de cada ciclo (do mesmo ano) anterior ao ciclo atual para poder recuperar o Valor depreciado acumulado atual
*CONSULTAR significa uma consulta diretamente no banco.
*CALCULAR significa realizar os passos acima para calcular outro período, pois é necessário saber os valores de tal período para processar o cálculo corrente.
¶ Desafios para implementação do cálculo em tempo real
Paginações nos relatórios maiores, sempre que necessário, não funcionariam corretamente, pois só seria possível saber se o bem tem depreciação ou não após a execução do cálculo. Ou seja, ao paginar 50.000 bens, pode ser que no meio deles tenha bens que não tem depreciação, porém no momento dessa consulta não tem como saber já que não tem cálculo salvo.
Números de consultas sempre que um cálculo é necessário.
O principal impacto quanto a essa implementação é a quantidade de consultas realizadas para cada cálculo, onde, a nível de relatório, se torna uma quantidade muito grande de consultas.
Existem campos que são necessários e para descobrir o valor deles é necessário realizar o cálculo de depreciações anteriores pois são campos de soma e, portanto, é necessário saber o valor anterior para saber com o que somar. Calcular depreciações anteriores significa que mais consultas serão realizadas. São eles:
Valor depreciado acumulado total: Esse campo é referente ao somatório das depreciações ocorridas no bem.
Nos casos em que os valores do cálculo foi atualizado (avaliação) é necessário calcular a última depreciação antes da atualização dos valores (para cada mudança ocorrida).
No exemplo abaixo, houve duas avaliações, em 06/2023 e 11/2023. Como o valor de depreciação mensal não foi constante por conta dessas avaliações, é necessário descobrir quanto que o bem depreciou no total com cada um desses valores.
Nos casos onde não há avaliação, o valor de depreciação é constante e, portanto, basta multiplicar o valor de depreciação mensal pela vida útil atual do bem, conforme exemplo abaixo:
Valor depreciado acumulado dos anos anteriores: Esse campo é referente à depreciação total dos anos anteriores.
Pode desecandear vários cálculos, não é possível afirmar quantos. Irá disparar no mínimo mais um cálculo, isso supondo que só tem um ano anterior, o que não é o caso da maioria dos bens.
Para os casos onde não há avaliação, será necessário um cálculo a mais, referente à última depreciação do ano anterior, para poder recuperar o valor depreciado acumulado total, pois esse vai ter a informação necessária para preencher o valor depreciado acumulado dos anos anteriores
Para os casos onde há avaliação, irá acontecer mais cálculos, isso porque não basta apenas calcular a última depreciação do ano anterior. Será necessário aplicar todas as regras referente a avaliação. Nesse caso, como o campo necessário é o valor depreciado acumulado total, será necessário aplicar as regras de cálculo dessa campo, ou seja, descobrir o total depreciado com aqueles valores, só assim será possível descobrir o valor depreciado acumulado dos anos anteriores. No exemplo abaixo, somente para esse campo serão 4 cálculos.
Valor depreciado acumulado ano corrente: O total de depreciado no ano corrente.
Sem avaliação: Basta identificar quantas depreciações ocorreram no ano e multiplicar pelo valor de depreciação mensal, o resultado disso seria o valor depreciado acumulado ano corrente
Com avaliação: Seria necessário recuperar o valor de depreciação mensal referente a cada valor durante o ano e multiplicar pela quantidade de depreciações que teve com esse valor. A soma dessas multiplicações seria o valor depreciado acumulado ano corrente
Exemplo de depreciação de um bem sem avaliação
Para calcular a depreciação de 03/2023, por exemplo, seria necessário 1 cálculos a mais além do principal, ou seja, 3 consultas a mais no banco (no mínimo).
Exemplo de depreciação de um bem com avaliação
Para calcular a depreciação de 03/2023, por exemplo, seria necessário 6 cálculos a mais além do principal, ou seja, 18 consultas a mais no banco (no mínimo).
O que acaba gerando várias consultas é a necessidade de saber uma depreciação anterior para poder usar no cálculo da depreciação corrente. Para cada cálculo é necessário:
Consultar o histórico do bem na data informada
Consultar se o bem teve atualizações de cálculos, ou seja:
Avaliação
Impairment test
Se sim, será necessária calcular depreciações anteriores para buscar os valores corretamente e utilizar nas somas.
Uma alternativa para diminuir a quantidade de consultas é, sempre que fizer um cálculo, calcular TODAS as depreciações, dessa forma é possível fazer uma única consulta para retornar os históricos dos bens. Porém, seria necessário SEMPRE gerar tudo.
Fazendo o cálculo para 10.000 bens, por exemplo, supondo que todos tenham 48 meses de depreciações já ocorridas, seriam 48 x 10.000 = 480.000 cálculos, porém com essa alternativa a quantidade de consultas seria diminuída para, em príncipio, sempre 3. Ainda existiria a necessidade de saber cálculos anteriores para somar com o atual, porém o array com todas as depreciações estaria em memória e a consulta seria na própria aplicação.
Mesmo com essa alternativa 3 consultas para cada cálculo pode se tornar uma quantia muita grande quando necessário lidar com relatórios.
Uma melhoria na alternativa acima seria consultar de antemão tudo o que for necessário para todos os bens.
Exemplo para 10.000 bens:
Consultar todos os históricos de todos os bens
Consultar todas as avaliações de todos os bens
Consultar todos os impairment tests de dos bens
Dessa forma, independentemente da quantidade de bens a ser feito o cálculo, seriam necessários sempre 3 consultas
Qual o problema dessa abordagem?
As consultas, principalmente a nível de relatório, se tornarão pesadas, pois a quantidade de dados consultados será muito grande.
Todos esses dados serão mantidos em memória na aplicação, o que pode acabar estourando a memória.
Isso evita a necessidade de consultar sempre no banco, porém as consultas ainda existirão, mas agora a nível de aplicação. As buscas serão feitas em arrays provavelmente muito grandes o que pode demorar tanto ou mais que consultar diretamente no banco.
Os registros no banco evitam as várias consultas que podem ser necessárias dependendo de cada caso. Mesmo pensando em um alternativa onde a quantidade de consultas é menor, ou seja, 3 consultas por cálculo, ainda assim seriam, por exemplo, 30.000 consultas para 10.000 bens. Sem contar que mesmo diminuindo a quantidade de consultas com essa alternativa, ela talvez não seja viável pela quantidade de cálculos que serão realizados.
Com a outra alternativa, no exemplo de bem sem avaliação, o caso mais simples, são 6 consultas para calcular a depreciação de 1 mês. 6 x 10.000 = 60.000 consultas.
Com a outra alternativa, no exemplo de bem com avaliação, o caso mais complexo, são 18 consultas para calcular a depreciação de 1 mês. 18 x 10.000 = 180.000 consultas.
A única desvantagem de ter as depreciações em banco são em casos onde houver a necessidade de mudar a regra, ou ser necessário corrigir algo no cálculo. O último caso é possível evitar com muitos testes. O mais “preocupante” seria o caso de mudar a regra. Porém, as mudanças de regras não ocorreriam sempre, na verdade nunca ocorreu, apenas faltou definir qual era a correta. Caso aconteça de mudar algum dia, será que a mudança realmente seria desde o início ou a partir da data da mudança? É mais provável que seja a partir da data da mudança da regra e, portanto, as depreciações anteriores precisariam ser mantidas. Caso seja desde o início, seria uma correção ao longo do ano por parte da contabilidade e, portanto, não haveria problema em esperar, no máximo, uma semana para processar tudo novamente.