glpi-project / glpi

GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.
https://glpi-project.org
GNU General Public License v3.0
4.14k stars 1.28k forks source link

Discrepancies in the financial and administrative information #17065

Closed Berlinst closed 3 months ago

Berlinst commented 4 months ago

Code of Conduct

Is there an existing issue for this?

Version

10.0.15

Bug description

Hello! We’ve noticed some discrepancies in the 'Financial and administrative information' within the 'Management' tab of the assets in GLPI. Let me illustrate with two examples:

Example 1. image Date of the photo: 03-05-2024

Given that only 4 years have passed, the account's net value appears to be unexpectedly low at 311.11. Shouldn't it be at least 1900.00?

Example 2. image Date of the photo: 03-05-2024

Considering only 1 month has passed since the startup date, the account's net value seems unusually low at 8511.11. Shouldn't it be at least 9800.00?

Additionally, there are other related issues documented: #3082 and #3168 . As well as discussions on the GLPI forums at:

https://forum.glpi-project.org/viewtopic.php?id=5014 https://forum.glpi-project.org/viewtopic.php?id=159219

By the way, we would appreciate clarification on how the “Account net value” and the “Monthly TCO” are calculated.

Relevant log output

No response

Page URL

No response

Steps To reproduce

No response

Your GLPI setup information

Information about system installation and configuration
GLPI 10.0.15 ( => /usr/share/CLIENTES/teste/glpi/web/glpi)
Installation mode: TARBALL
Current language:en_GB

Server
 
Operating system: Linux servicetic-oracle-linux 5.4.17-2136.328.3.el8uek.x86_64 #​2 SMP Thu Jan 18 15:56:59 PST 2024 x86_64
PHP 8.2.18 fpm-fcgi (Core, PDO, Phar, Reflection, SPL, SimpleXML, Zend OPcache, apcu, bcmath, bz2, calendar, cgi-fcgi, ctype,
    curl, date, dom, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, imap, intl, json, ldap, libxml, mbstring, mysqli,
    mysqlnd, openssl, pcre, pdo_mysql, pdo_sqlite, posix, random, selinux, session, shmop, snmp, soap, sockets, sodium, sqlite3,
    standard, sysvmsg, sysvsem, sysvshm, tokenizer, xml, xmlreader, xmlrpc, xmlwriter, xsl, zip, zlib)
Setup: max_execution_time="300" memory_limit="1G" post_max_size="8M" safe_mode="" session.save_handler="files"
    upload_max_filesize="25M" disable_functions="" 
Software: Apache/2.4.37 (Oracle Linux) OpenSSL/1.1.1k ()
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0
Server Software: Percona Server (GPL), Release 28, Revision 47601f19
    Server Version: 8.0.36-28
    Server SQL Mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    Parameters: teste@localhost/teste
    Host info: Localhost via UNIX socket

PHP version (8.2.18) is supported.
Sessions configuration is OK.
Allocated memory is sufficient.
mysqli extension is installed.
Following extensions are installed: dom, fileinfo, filter, libxml, json, simplexml, xmlreader, xmlwriter.
curl extension is installed.
gd extension is installed.
intl extension is installed.
zlib extension is installed.
The constant SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES is present.
Database engine version (8.0.36) is supported.
No files from previous GLPI version detected.
The log file has been created successfully.
Write access to /var/lib/CLIENTES/teste/glpi/files/_cache has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_cron has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_documents has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_dumps has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_graphs has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_lock has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_pictures has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_plugins has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_rss has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_sessions has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_tmp has been validated.
Write access to /var/lib/CLIENTES/teste/glpi/files/_uploads has been validated.
For security reasons, SELinux mode should be Enforcing.

Web server root directory configuration seems safe.
Sessions configuration is secured.
OS and PHP are relying on 64 bits integers.
exif extension is installed.
ldap extension is installed.
openssl extension is installed.
Following extensions are installed: bz2, Phar, zip.
Zend OPcache extension is installed.
Following extensions are installed: ctype, iconv, mbstring, sodium.
Write access to /usr/share/CLIENTES/teste/glpi/web/glpi/marketplace has been validated.
Timezones seems loaded in database.

GLPI constants
 
GLPI_ROOT: "/usr/share/CLIENTES/teste/glpi/web/glpi"
GLPI_CONFIG_DIR: "/etc/CLIENTES/teste/glpi/db"
GLPI_MARKETPLACE_ALLOW_OVERRIDE: false
GLPI_VAR_DIR: "/var/lib/CLIENTES/teste/glpi/files"
GLPI_DOC_DIR: "/var/lib/CLIENTES/teste/glpi/files/_documents"
GLPI_CRON_DIR: "/var/lib/CLIENTES/teste/glpi/files/_cron"
GLPI_DUMP_DIR: "/var/lib/CLIENTES/teste/glpi/files/_dumps"
GLPI_GRAPH_DIR: "/var/lib/CLIENTES/teste/glpi/files/_graphs"
GLPI_LOCK_DIR: "/var/lib/CLIENTES/teste/glpi/files/_lock"
GLPI_PICTURE_DIR: "/var/lib/CLIENTES/teste/glpi/files/_pictures"
GLPI_PLUGIN_DOC_DIR: "/var/lib/CLIENTES/teste/glpi/files/_plugins"
GLPI_RSS_DIR: "/var/lib/CLIENTES/teste/glpi/files/_rss"
GLPI_SESSION_DIR: "/var/lib/CLIENTES/teste/glpi/files/_sessions"
GLPI_TMP_DIR: "/var/lib/CLIENTES/teste/glpi/files/_tmp"
GLPI_UPLOAD_DIR: "/var/lib/CLIENTES/teste/glpi/files/_uploads"
GLPI_CACHE_DIR: "/var/lib/CLIENTES/teste/glpi/files/_cache"
GLPI_LOG_DIR: "/var/log/CLIENTES/teste/glpi/log"
GLPI_SYSTEM_CRON: true
GLPI_MARKETPLACE_DIR: "/usr/share/CLIENTES/teste/glpi/web/glpi/marketplace"
GLPI_USE_CSRF_CHECK: "1"
GLPI_CSRF_EXPIRES: "7200"
GLPI_CSRF_MAX_TOKENS: "100"
GLPI_USE_IDOR_CHECK: "1"
GLPI_IDOR_EXPIRES: "7200"
GLPI_ALLOW_IFRAME_IN_RICH_TEXT: false
GLPI_SERVERSIDE_URL_ALLOWLIST: ["/^(https?|feed):\\/\\/[^@:]+(\\/.*)?$/"]
GLPI_TELEMETRY_URI: "https://telemetry.glpi-project.org"
GLPI_INSTALL_MODE: "TARBALL"
GLPI_NETWORK_MAIL: "glpi@teclib.com"
GLPI_NETWORK_SERVICES: "https://services.glpi-network.com"
GLPI_MARKETPLACE_MANUAL_DOWNLOADS: true
GLPI_USER_AGENT_EXTRA_COMMENTS: ""
GLPI_DISABLE_ONLY_FULL_GROUP_BY_SQL_MODE: "1"
GLPI_AJAX_DASHBOARD: "1"
GLPI_CALDAV_IMPORT_STATE: 0
GLPI_DEMO_MODE: "0"
GLPI_CENTRAL_WARNINGS: "1"
GLPI_TEXT_MAXSIZE: "4000"
GLPI_LOCAL_I18N_DIR: "/var/lib/CLIENTES/teste/glpi/files/_locales"
GLPI_INVENTORY_DIR: "/var/lib/CLIENTES/teste/glpi/files/_inventories"
GLPI_NETWORK_REGISTRATION_API_URL: "https://services.glpi-network.com/api/registration/"
GLPI_MARKETPLACE_PLUGINS_API_URI: "https://services.glpi-network.com/api/marketplace/"
GLPI_I18N_DIR: "/usr/share/CLIENTES/teste/glpi/web/glpi/locales"
GLPI_VERSION: "10.0.15"
GLPI_SCHEMA_VERSION: "10.0.15"
GLPI_MARKETPLACE_PRERELEASES: false
GLPI_MIN_PHP: "7.4.0"
GLPI_MAX_PHP: "8.4.0"
GLPI_YEAR: "2024"

Libraries
 
htmlawed/htmlawed version 1.2.14 in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/htmlawed/htmlawed)
phpmailer/phpmailer version 6.8.0 in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/phpmailer/phpmailer/src)
simplepie/simplepie version 1.5.8 in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/simplepie/simplepie/library)
tecnickcom/tcpdf version 6.7.5 in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/tecnickcom/tcpdf)
michelf/php-markdown in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/michelf/php-markdown/Michelf)
true/punycode in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/true/punycode/src)
iamcal/lib_autolink in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/iamcal/lib_autolink)
sabre/dav in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/sabre/dav/lib/DAV)
sabre/http in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/sabre/http/lib)
sabre/uri in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/sabre/uri/lib)
sabre/vobject in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/sabre/vobject/lib)
laminas/laminas-i18n in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/laminas/laminas-i18n/src)
laminas/laminas-servicemanager in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/laminas/laminas-servicemanager/src)
monolog/monolog in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/monolog/monolog/src/Monolog)
sebastian/diff in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/sebastian/diff/src)
donatj/phpuseragentparser in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/donatj/phpuseragentparser/src/UserAgent)
elvanto/litemoji in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/elvanto/litemoji/src)
symfony/console in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/symfony/console)
scssphp/scssphp in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/scssphp/scssphp/src)
laminas/laminas-mail in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/laminas/laminas-mail/src/Protocol)
laminas/laminas-mime in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/laminas/laminas-mime/src)
rlanvin/php-rrule in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/rlanvin/php-rrule/src)
ramsey/uuid in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/ramsey/uuid/src)
psr/log in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/psr/log/Psr/Log)
psr/simple-cache in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/psr/simple-cache/src)
psr/cache in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/psr/cache/src)
league/csv in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/league/csv/src)
mexitek/phpcolors in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/mexitek/phpcolors/src/Mexitek/PHPColors)
guzzlehttp/guzzle in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/guzzlehttp/guzzle/src)
guzzlehttp/psr7 in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/guzzlehttp/psr7/src)
glpi-project/inventory_format in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/glpi-project/inventory_format/lib/php)
wapmorgan/unified-archive in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/wapmorgan/unified-archive/src)
paragonie/sodium_compat in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/paragonie/sodium_compat/src)
symfony/cache in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/symfony/cache)
html2text/html2text in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/html2text/html2text/src)
symfony/css-selector in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/symfony/css-selector)
symfony/dom-crawler in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/symfony/dom-crawler)
twig/twig in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/twig/twig/src)
twig/string-extra in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/twig/string-extra)
symfony/polyfill-ctype not found
symfony/polyfill-iconv not found
symfony/polyfill-mbstring not found
symfony/polyfill-php80 not found
symfony/polyfill-php81 not found
symfony/polyfill-php82 in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/symfony/polyfill-php82)
league/oauth2-client in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/league/oauth2-client/src/Provider)
league/oauth2-google in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/league/oauth2-google/src/Provider)
thenetworg/oauth2-azure in (/usr/share/CLIENTES/teste/glpi/web/glpi/vendor/thenetworg/oauth2-azure/src/Provider)
phpCas version 1.6.1 in (/usr/share/pear)

SQL replicas
 
Not active

Notifications
 
Way of sending emails: SMTP+TLS (teste@servicetic.com.br@mail.servicetic.com.br)

Plugins list
 
    actualtime           Name: ActualTime                     Version: 2.1.0      State: Not installed                           
        Install Method: Manual
    news                 Name: Alertas                        Version: 1.12.0     State: Installed / not activated               
        Install Method: Manual
    fields               Name: Campos adicionais              Version: 1.20.6     State: Installed / not activated               
        Install Method: Manual
    behaviors            Name: Comportamentos                 Version: 2.7.2      State: Not installed                           
        Install Method: Manual
    costs                Name: Costs                          Version: 3.0.1      State: Not installed                           
        Install Method: Manual
    customlogin          Name: Custom Login                   Version: 1.0.6      State: Installed / not activated               
        Install Method: Manual
    formcreator          Name: Form Creator                   Version: 2.13.6     State: Not installed                           
        Install Method: Manual
    tag                  Name: Gerenciamento de Etiquetas     Version: 2.11.2     State: Not installed                           
        Install Method: Manual
    genericobject        Name: Gerenciamento de objetos       Version: 2.14.3     State: Installed / not activated               
        Install Method: Manual
    glpiinventory        Name: GLPI Inventory                 Version: 1.3.5      State: Installed / not activated               
        Install Method: Manual
    datainjection        Name: Importação de dados            Version: 2.13.1     State: Not installed                           
        Install Method: Manual
    pdf                  Name: Imprimir em PDF                Version: 3.0.0      State: Installed / not activated               
        Install Method: Manual
    mailanalyzer         Name: Mail Analyzer                  Version: 3.1.1      State: Installed / not activated               
        Install Method: Manual
    moreticket           Name: Mais Chamados                  Version: 1.7.1      State: Not installed                           
        Install Method: Manual
    satisfaction         Name: Mais satisfação                Version: 1.6.1      State: Not installed                           
        Install Method: Manual
    metabase             Name: Metabase                       Version: 1.3.3      State: Not installed                           
        Install Method: Manual
    mydashboard          Name: Meu Painel                     Version: 2.1.5      State: Installed / not activated               
        Install Method: Manual
    oauthimap            Name: Oauth IMAP                     Version: 1.4.3      State: Not installed                           
        Install Method: Manual
    example              Name: Plugin Example                 Version: 0.0.1      State: Installed / not activated               
        Install Method: Manual
    singlesignon         Name: Single Sign-on                 Version: 1.3.4      State: Installed / not activated               
        Install Method: Manual
    stsync               Name: ST-Sync                        Version: 1.0.0      State: Installed / not activated               
        Install Method: Manual
    tasklists            Name: Tasks list                     Version: 2.0.3      State: Installed / not activated               
        Install Method: Manual
    ticketcleaner        Name: Ticket Cleaner                 Version: 4.0.3      State: Installed / not activated               
        Install Method: Manual

Anything else?

No response

cconard96 commented 4 months ago

This isn't my area of expertise, so I cannot say there is a bug or not, but after some tests with XDebug I found a few things:

The value shown in the "Account net value" seems to be what the value would be at the end of the current year. When calculating the amortization, a set of values is calculated for each year between the purchase date and the current year. The first year is prorated. The values for each year include the starting value, value, and the annuity. Your first example has the starting date at the start of 2020, meaning this is the 5th year. The 144.44 value is how much is left after this year finishes (The left over is from the difference between the start of 2020 and the startup date).

TCO: Value + Cost From Tickets Monthly TCO: TCO / Months Between Purchase Date And Now

I don't currently know how the decreasing mode amortization is calculated. The code comments and variables are all in French (I'm not very good with it) and seems quite complex.

Berlinst commented 4 months ago

Hello @cconard96,

Thank you for your detailed response. Your explanations regarding "Monthly TCO" and "Account Net Value" were very enlightening and helped me understand better how these values are calculated in GLPI.

However, I'd like to raise a point about the "Account Net Value." You mentioned that it seems to represent what the value would be at the end of the current year, with the first year being prorated. While I understand this perspective, I believe that the "Account Net Value" should be calculated from the startup date up to the current date, rather than being estimated only until the end of the current year.

The reason for my suggestion is that if we were to sell the asset today, knowing its current value would be essential. Depreciation or amortization is a continuous process over time, so it would be more useful for GLPI users to have a representation of the asset's value up to the present moment.

Once again, thank you for your assistance and clarifications on these points.

Berlinst commented 4 months ago

@cconard96, just one more thing. You mentioned that you're not currently familiar with how the decreasing mode amortization is calculated in GLPI, but do you have any ideas or insights on how the 'Amortization Type: Decreasing' and 'Amortization Coefficient' works in general?

image

trasher commented 4 months ago

I've reworked linear part a while ago, see: https://github.com/glpi-project/glpi/pull/2931 Tests has been added, and it's been validated. This part should work as expected. Keep in mind it's based on exact date, not months.

To know how it works, you could rely on the following (I did not find any non french information): https://www.compta-facile.com/construire-tableau-plan-amortissement-lineaire/ https://www.compta-facile.com/construire-tableau-plan-amortissement-degressif/

Those are (certainly) french accountancy rules; I have a very little idea how this works in France; but absolutely not for all other countries (as I already said in https://github.com/glpi-project/glpi/issues/3082 several years ago).

Since the "linear" part was the simplest case and was still totally broken in 2017; I really doubt "decreasing" part has worked as expected from a while.