Nobody planned it that way. The ledger holds the purchase, the spreadsheet holds the schedule, and once a month someone reads one and types into the other. It works until an asset is disposed of mid-year, or a useful life is revised, or an auditor asks which journal entry corresponds to which asset, and then the answer is in a file that nobody else can open.
The monthly depreciation entry stops being typed. The schedule generates itself from each asset's acquisition, useful life and method, and lives on the ledger instead of a spreadsheet. Disposals, revisions and transfers post as journal entries against the asset itself, so the trail from entry to asset is a link rather than a filename.
Not from stock Odoo. Neither edition of the base product ships this the way NetSuite does, Odoo's own version is Enterprise, and Enterprise is licensed per user for the whole system, not per app.
It comes from account_asset_management, published by the Odoo Community
Association, free, maintained on the 18.0 branch. We install it, it runs on the
deployment you own, and the code stays yours.
That is the shape of the whole stack rather than an exception to it: you are not renting a feature list, you are running software you hold, and a missing piece is a free install rather than a tier to upgrade into. NetSuite's answer to the same gap is a SKU and a per-seat renewal, and that difference is the product.