Translate

quarta-feira, 14 de outubro de 2026

Taming D365 F&O Storage: Finding Files in the Database and Cleaning Them Up

Most Dynamics 365 Finance and Operations environments store far more files than anyone planned for. Some stay under a few GB; others pass 500 GB or even 1 TB of file and database consumption. This post gathers, in one place, how to find out where those files live, how to clean them up with standard and custom routines, and how to move them out of the expensive storage tiers.

Why this matters now

Storage capacity for finance and operations apps is reported and enforced in the Power Platform admin center (PPAC). Each environment shows two numbers under Resources > Capacity > Finance and Operations:

Metric What it measures
Finance and operations database usage Size of the environment’s Azure SQL database, including large container (BLOB) and memo fields
Finance and operations file usage Files kept in the Microsoft-managed Azure Blob Storage behind the environment (usually shown as AXDB.File)

Database capacity is the scarcer and more expensive of the two. A file that sits inside a database table counts against it. The same file in blob storage counts as file capacity, and the same file in SharePoint or your own Azure Storage Account does not count against F&O capacity at all.

The database usage figure has a table-level drill-down in PPAC. That drill-down is the single most useful starting point for everything below.

Before you start. Every environment is different: version, localizations, ISV solutions, customizations, integrations and legal retention rules all change the picture. Menu paths, table names and field values in this post reflect what I have seen and what Microsoft documents at the time of writing. Items marked Verify are not confirmed for every version and must be checked by the professional responsible for each customer, in a sandbox, before anything is changed or deleted in production.

Where a file can live in F&O

Location How it is stored Counts against
Database A container (BLOB) field in a table, for example DocuValue.File when a document type uses Location = Database, or any standard or custom table with a binary field Database capacity
Azure storage (Microsoft-managed blob) The file is in the environment’s blob storage; the database keeps only a pointer (DocuRef/DocuValue) File capacity
SharePoint Online The file is in a SharePoint library; the database keeps only a pointer SharePoint storage, outside F&O capacity
Your own storage (custom) The file is in an Azure Storage Account or DMS you own, reached through an integration; F&O keeps a URL or reference Your Azure or DMS subscription

Two practical rules come out of this table:

  • “Azure storage” in document management means the Microsoft-managed blob of the environment, not a Storage Account in your subscription. As far as I know, F&O has no standard option to point document management at your own Storage Account. Verify for the version you run.
  • A large container field anywhere, standard or custom, is effectively a file inside the database, even when document management is never involved.

Part 1 – Finding files in the database

Work in a sandbox with a recent copy of production. You will need System administrator access in F&O, PPAC access to the capacity pages, and SQL access to the sandbox database (just-in-time access for Tier-2+ sandboxes, direct access on development environments). Never run heavy diagnostic queries against production.

A good order of work:

  1. Export the PPAC table drill-down for database usage and note the 30 largest tables.
  2. Run the table-size query below in the sandbox and compare it with PPAC.
  3. Go through the seven areas in this section.
  4. Record each finding (source, tables, MB, database or blob, proposed action, owner).

Start here: the largest tables and their LOB space

SELECT TOP 50
       t.name AS table_name,
       SUM(CASE WHEN p.index_id IN (0,1) THEN p.rows ELSE 0 END) AS row_count,
       SUM(a.total_pages) * 8 / 1024.0 AS total_mb,
       SUM(CASE WHEN a.type = 2 THEN a.total_pages ELSE 0 END) * 8 / 1024.0 AS lob_mb
FROM sys.tables t
JOIN sys.partitions p ON p.object_id = t.object_id
JOIN sys.allocation_units a ON a.container_id = p.partition_id
GROUP BY t.name
ORDER BY total_mb DESC;

lob_mb (LOB_DATA allocation units) is the space used by large fields: containers, memos and XML. A table with a high lob_mb is a strong candidate for “files hidden in the database”. Sandbox numbers can differ slightly from PPAC because of indexes and compression; use PPAC as the official figure and SQL to find the cause.

1. Document management (attachments)

This is the most common source, especially in environments upgraded from AX 2012, where old attachments may arrive with their binary still inside DocuValue.

In F&O:

  1. Organization administration > Document management > Document types: for each type note Class (Attach file, Attach URL, Simple note), Group and Location. Any type with Class = Attach file and Location = Database sends files into the database.
  2. Document management parameters: check the allowed file types, any file size limit, and the SharePoint tab.
  3. Active document tables: which tables users can attach to.
  4. Check the document types other features use: Electronic reporting parameters, print archive, vendor invoice automation, ISV solutions and custom integrations.

Key tables: DocuType (types and location), DocuRef (link to the business record: RefTableId, RefRecId, TypeId, ValueRecId) and DocuValue (file name, StorageProviderId, AccessInformation and the FILE_ container).

StorageProviderId = 0 means database and 1 means Azure storage. SharePoint uses another value, often reported as 2. Verify: run the first query below to see which values actually exist in your environment.

-- Where attachments live and how much sits inside the database
SELECT v.STORAGEPROVIDERID,
       COUNT(*) AS files,
       SUM(CAST(DATALENGTH(v.FILE_) AS BIGINT)) / 1048576.0 AS mb_in_database
FROM DOCUVALUE v
GROUP BY v.STORAGEPROVIDERID;

-- Which source tables and years hold the most attachments
SELECT t.NAME AS source_table,
       YEAR(r.CREATEDDATETIME) AS year_created,
       v.STORAGEPROVIDERID,
       COUNT(*) AS files,
       SUM(CAST(DATALENGTH(v.FILE_) AS BIGINT)) / 1048576.0 AS mb_in_database
FROM DOCUREF r
JOIN DOCUVALUE v ON v.RECID = r.VALUERECID
LEFT JOIN TABLEIDTABLE t ON t.ID = r.REFTABLEID
GROUP BY t.NAME, YEAR(r.CREATEDDATETIME), v.STORAGEPROVIDERID
ORDER BY files DESC;

-- Orphan DocuValue rows (no DocuRef pointing to them)
SELECT COUNT(*) FROM DOCUVALUE v
WHERE NOT EXISTS (SELECT 1 FROM DOCUREF r WHERE r.VALUERECID = v.RECID);

Verify: the column is usually FILE_ because File is a reserved word (sp_columns 'DOCUVALUE' confirms it). TABLEIDTABLE maps table IDs to names in the versions I have used; if it is not available, use SQLDICTIONARY with FIELDID = 0. Rows with STORAGEPROVIDERID = 1 and a filled FILE_ suggest binaries duplicated in the database, which I have seen after migrations.

Every SSRS report printed with the Archive destination keeps a copy. With high volumes of invoices, confirmations and packing slips, this grows quickly and has no standard automatic cleanup.

  • Organization administration > Inquiries and reports > Print archive: filter by date and report to see the monthly volume.
  • Print management per module (for example Accounts receivable > Setup > Forms > Form setup > Print management): which documents include Archive.
  • Print destination settings saved on batch jobs, which can archive without going through print management.
  • The archive’s files are attachments of PrintJobHeader; run the source-table query above and look for that table.

3. Electronic reporting (ER)

ER keeps its files permanently: templates, files sent to the Archive destination and outputs of ER jobs. Unlike Data management, there is no automatic retention; a file is deleted only together with the record it is attached to (Microsoft Learn).

  • Electronic reporting parameters > Attachments: the document types used for configurations, job archive, temporary files and others, and their Location.
  • Electronic reporting destination: formats with Archive enabled.
  • Electronic reporting jobs: volume and age of jobs (table ERFormatMappingRunJobTable and its attachments).
  • Old, unused configuration versions also keep their templates.

4. Data management framework (DMF)

DMF keeps package files in the managed blob, but its staging tables and execution history live in the database. High-frequency recurring integrations can push staging and log tables to tens of GB.

  • Job history volume per day and project, and the Job history cleanup settings.
  • Projects that could use Skip staging.
  • Recurring data jobs and their frequency; export projects whose packages nobody downloads.
  • Tables to measure: all *Staging tables, DMFDefinitionGroupExecution, DMFDefinitionGroupExecutionHistory, DMFExecution, DMFStagingLog, DMFStagingLogDetail, DMFStagingExecutionErrors, DMFStagingValidationLog.

5. Email, batch, alerts and logs

Several standard features write binaries or large payloads straight into container fields.

Table What it holds Where to look in F&O
SysOutgoingEmailTable / SysOutgoingEmailData Body and attachments of every email sent by the email distributor (invoice PDFs, for example) System administration > Periodic tasks > Email processing > Email history
SysEmailHistory Email history Email parameters / View email history
BatchJobHistory / BatchHistory Batch history and infolog System administration > Inquiries > Batch jobs
EventInbox / EventInboxData Alerts and notifications Alerts
SysDatabaseLog Database log (audit of changes) System administration > Inquiries > Database > Database log
HcmPersonImage, CompanyImage Photos and logos Workers / Legal entities
-- Email attachments per year
SELECT YEAR(e.CREATEDDATETIME) AS year_created,
       COUNT(DISTINCT e.EMAILITEMID) AS emails,
       SUM(CAST(DATALENGTH(d.DATA) AS BIGINT)) / 1048576.0 AS attachment_mb
FROM SYSOUTGOINGEMAILTABLE e
LEFT JOIN SYSOUTGOINGEMAILDATA d ON d.EMAILITEMID = e.EMAILITEMID
GROUP BY YEAR(e.CREATEDDATETIME)
ORDER BY year_created;

-- Every binary column in the database
SELECT t.name AS table_name, c.name AS column_name, ty.name AS data_type
FROM sys.columns c
JOIN sys.tables t ON t.object_id = c.object_id
JOIN sys.types ty ON ty.user_type_id = c.user_type_id
WHERE ty.name IN ('varbinary', 'image')
ORDER BY t.name;

For each relevant table returned, measure the real volume with SUM(CAST(DATALENGTH(<column>) AS BIGINT)).

6. Localizations and electronic invoicing

Localizations with electronic fiscal documents (Brazil, Mexico, Italy, India and others) store submitted XML, authority responses and events. They may be attachments or long text (nvarchar(max)) fields in localization tables. Check the electronic document submission log, the document types used by electronic invoicing, and the long-text columns in country-specific tables. Removing anything here depends on legal retention rules, which differ per country and per company: this is a decision for the tax team, not only for IT.

7. Customizations and integrations

In environments with hundreds of GB, the cause is often custom code: integration logs that keep the full payload of every call, custom log tables without retention, or attachments created automatically for each processed record.

  • In the metadata, look for container fields (AxTableFieldContainer) and unlimited string fields used for payloads.
  • In X++, look for DocumentManagement::attachFile, direct DocuRef/DocuValue inserts, BinData, con2Buf, MemoryStream written into table fields, and tables named *Log, *Payload, *Request, *Response.
  • Cross the results with the table-size query using your model’s table prefix.
Get-ChildItem -Recurse -Filter *.xml -Path .\<YourModel>\AxTable |
  Select-String -Pattern 'AxTableFieldContainer' |
  Select-Object Path -Unique

Part 2 – Cleanup routines

Cleanup in F&O deletes data permanently; there is no recycle bin. Microsoft’s own guidance is to run cleanup routines only after the business has confirmed the data is no longer needed, and to test each one in a non-production environment first (Microsoft Learn). The retention periods below are starting points for discussion, not recommendations for any specific company.

Document management

There is no standard retention policy for attachments. Reduction comes from four directions:

  1. Limit what comes in. Keep only the file types the business uses, set a size limit if your version offers one, and switch any Attach file document type with Location = Database to Azure storage or SharePoint. The change applies to new attachments only.
  2. Clean orphans. The batch job Scan for orphaned document references finds attachments whose business record no longer exists and creates Deletes a bundle of orphaned document references jobs to remove them. Check under System administration > Inquiries > Batch jobs that it exists and recurs. Verify the job names and behavior in your version.
  3. Watch deferred deletion. If attachment recovery (deferred deletion) is enabled, deleted attachments are kept for a number of days and keep consuming space until then. Verify whether your version has this setting and how it is configured.
  4. Apply retention by document type. For attachments with no value after a period (delivery photos, integration files, generated PDFs), agree a rule per document type and source table and implement a custom batch job (pattern in Part 3).
  • Prevent: remove the Archive destination from documents that are already emailed and logged, can be reprinted from the journal, or are stored in a DMS or tax portal. Review print destination settings saved on batch jobs too.
  • Clean: in Organization administration > Inquiries and reports > Print archive, filter by date and delete. Deleting the record removes its attached file. For large volumes, use a custom batch job or a third-party tool that adds a print archive cleanup (Docentric AX, for example, offers one in its free edition; evaluate any third-party option yourself).

Electronic reporting

  • Prevent: keep the Archive destination only for formats that really need a copy inside F&O. Use a SharePoint document type for the job archive if files must be kept long term.
  • Clean: in Electronic reporting jobs, filter by date and format, export the list as evidence and delete. Attached files are removed with the jobs. Remove configuration versions that are no longer used, keeping at least the current and the previous version.

Data management

Since September 2023, job history and related staging data older than 90 days are deleted automatically. For a shorter retention, use the Execution history cleanup feature; the old Staging cleanup routine is deprecated (Microsoft Learn).

  • In the Data management workspace, open Job history cleanup, set the number of days, the maximum execution hours per run and, if needed, export history before deleting. Schedule it daily, outside business hours.
  • Use Skip staging where the entity and the process allow it.
  • Review the frequency of recurring data jobs and fix entities that fail repeatedly.

Email, batch, alerts and logs

Routine Path (may vary by version) What it removes
Email history retention Email parameters: Number of days to retain email history, plus the batch job SysEmailHistoryCleanupBatch SysEmailHistory
Sent email cleanup No standard routine in many versions; Microsoft support has suggested a custom X++ script SysOutgoingEmailTable, SysOutgoingEmailData
Batch job history clean-up System administration > Periodic tasks BatchJobHistory, BatchHistory, BatchConstraintsHistory
Batch job clean-up System administration > Periodic tasks Finished batch jobs
Notification clean up System administration > Periodic tasks EventInbox, EventInboxData
Database log clean up System administration > Inquiries > Database > Database log SysDatabaseLog

For sent emails, delete only those already sent, never queued or failed ones, and test in a sandbox first. For the database log, also review Database log setup: auditing high-volume transactional tables is a common cause of growth. Records with electronic signatures cannot be deleted by the standard routine.

Sources for the email items are Microsoft support articles KA-23493 and KA-23879 on the Dynamics community site. Verify the parameter names and batch class in your version.

Functional history routines

They do not remove files, but they often clear the tables at the top of the PPAC drill-down. All need approval from the process owner.

Module Examples
Sales and procurement Sales update history cleanup, Order events cleanup, Purchase update history cleanup
General ledger and projects Clean up ledger journals, Delete project journals (posted journals can no longer be reversed afterwards)
Inventory Inventory journals cleanup, On-hand entries cleanup, Transfer order update history cleanup
Warehouse Work creation history, Wave processing history, Mobile device activity log, Work user session log, Work exceptions log
Production and costing Production orders cleanup, Clean up registrations, Clean up the costing sheet cache
Master planning Plan version cleanup (monthly, while MRP is not running)

Some routines, such as Inventory dimensions cleanup and Inventory journal data correction, delete data without any log. Use them only with a clear reason and after testing.

A starting schedule

Adjust frequency and retention to the policy each customer approves.

Routine Frequency Starting retention
DMF job history cleanup Daily 7–30 days for recurring integrations, up to 90 for manual loads
Batch job history clean-up Daily 30–90 days
Email history Daily 30–90 days
Sent emails (custom) Weekly Around 90 days
Notification clean up, batch job clean-up Weekly 30 days
Orphaned document references Daily or weekly —
Print archive, ER jobs, old attachments Monthly Per document type and legal requirement
Database log Monthly As agreed with audit
Functional routines Monthly or quarterly As agreed with each process owner

For the first cleanup of a large volume, work from the oldest data forward, in slices (one year at a time, for example), outside period-end closing, and record the space released in PPAC after each slice.

Part 3 – Moving files out of the database and to your own storage

There are two different moves, and it helps to keep them apart:

  • Database → managed blob or SharePoint, which converts database usage into file usage (or SharePoint storage).
  • Managed blob → storage you own, which takes files out of F&O capacity altogether.

Option 1: SharePoint for new attachments (standard)

Set the document type’s Location to SharePoint. New files go to SharePoint Online; existing ones do not move by themselves. Current requirements include granting Sites.ReadWrite.All to the Microsoft Dynamics 365 finance and operations application in Entra ID, because the older Microsoft-managed connection has been deprecated, and avoiding SharePoint managed-device policies, which block the integration (Microsoft Learn). SharePoint storage has its own cost and governance; it is simply outside F&O capacity.

Option 2: migrate database attachments to Azure storage

For attachments with StorageProviderId = 0 and a filled FILE_: change the document type’s Location so the database stops growing, then run a custom batch job that reads each container, stores the file again through the document management API, updates the pointer, and clears the binary. Validate samples (open migrated attachments in F&O) before clearing anything, and run by year or document type.

Option 3: export to your own Azure Storage Account (custom)

This is the pattern I would consider for large legacy volumes. It is a design outline, not a tested product; each customer’s security, legal and access requirements will shape the details.

  1. Select attachments by document type, source table, age and storage provider.
  2. Read the content with the document management API (for example DocumentManagement::getAttachmentStream; Verify the method available in your version).
  3. Send the stream to an Azure Storage Account the customer owns, ideally through an intermediary such as an Azure Function or Logic App using Managed Identity, so no storage keys live in F&O.
  4. Use a deterministic path, for example <company>/<table>/<year>/<RecId>_<filename>.
  5. Confirm the upload (size or hash) before deleting anything.
  6. If users still need access, replace the attachment with a URL-type attachment that points to an endpoint issuing short-lived access (a short SAS, for example). Never store a long-lived SAS in a URL.
  7. Delete the original attachment through DocuRef.delete() so the managed file is removed too.
  8. In the Storage Account, use Cool or Archive tiers with lifecycle rules, and immutability for documents under legal retention.

A custom cleanup batch pattern (X++)

The skeleton below shows the shape of a SysOperation batch job that deletes attachments by document type, source table and age. It is illustrative and untested: review, compile and test it in your own environment, and adapt it to the tables you need (PrintJobHeader, ERFormatMappingRunJobTable, SysOutgoingEmailTable and custom logs follow the same idea).

// Illustrative only - review, compile and test before any use.
class XXXAttachmentCleanupService extends SysOperationServiceBase
{
    private const int CommitSize = 500;

    public void process(XXXAttachmentCleanupContract _contract)
    {
        DocuRef     docuRef;
        TableId     refTableId = tableName2Id(_contract.parmRefTableName());
        utcdatetime cutOff     = DateTimeUtil::addDays(DateTimeUtil::utcNow(),
                                                       -_contract.parmRetentionDays());
        int         maxRecords = _contract.parmMaxRecords();
        int         total, inBlock;

        if (_contract.parmRetentionDays() <= 0)
        {
            throw error("Retention must be greater than zero.");
        }

        if (_contract.parmSimulate())
        {
            select count(RecId) from docuRef
                where docuRef.TypeId          == _contract.parmDocuTypeId()
                   && docuRef.RefTableId      == refTableId
                   && docuRef.CreatedDateTime <  cutOff;
            info(strFmt("Simulation: %1 attachments would be deleted.", docuRef.RecId));
            return;
        }

        do
        {
            inBlock = 0;
            ttsbegin;
            while select forupdate docuRef
                where docuRef.TypeId          == _contract.parmDocuTypeId()
                   && docuRef.RefTableId      == refTableId
                   && docuRef.CreatedDateTime <  cutOff
            {
                // Optional: export to your own storage first (see Option 3)
                docuRef.delete();   // standard logic also removes DocuValue and the stored file
                inBlock++;
                total++;
                if (inBlock >= CommitSize || (maxRecords && total >= maxRecords))
                {
                    break;
                }
            }
            ttscommit;
        }
        while (inBlock >= CommitSize && (!maxRecords || total < maxRecords));

        info(strFmt("%1 attachments deleted.", total));
    }
}

Principles that matter more than the code itself:

  • Delete through the table’s delete() method. delete_from with skipDeleteMethod, skipDataMethods or direct SQL removes the row but can leave the file behind as an orphan in blob storage.
  • Commit in blocks, cap records per run, offer a simulation mode, and log what was removed.
  • New custom tables should be born with a retention parameter and a cleanup job; integration logs should keep a summary, not the full payload.

Governance and monitoring

Cleanup is easier to get right when the roles are clear:

Role Responsibility
Business process owner Approves the retention period for each kind of data
Tax / finance Confirms legal retention and where the legally valid copy lives
F&O administrator Configures and schedules the batch jobs
Developer Builds custom cleanup and fixes customizations that create volume
Power Platform administrator Follows capacity in PPAC

A light monthly routine keeps the problem from coming back:

  1. Record database and file usage for each production environment in PPAC.
  2. Compare the 20 largest tables in the drill-down with the previous month.
  3. Confirm every cleanup job ran successfully.
  4. After each sandbox refresh, rerun the attachment queries by year and source table.

Useful warning signs: growth of more than a few percent a month without a business reason, any new growth in attachments stored in the database, failed cleanup jobs, or a custom table entering the top 20.

Checklist

What to verify in your own environment

These points are based on experience and community sources rather than on official documentation for every version. Treat them as hypotheses to confirm:

Item Why it needs checking
StorageProviderId values beyond 0 and 1 (SharePoint) Values may differ; query your own data
Column and helper table names (FILE_, TABLEIDTABLE) Physical names can change between versions
Menu paths and routine names Microsoft moves and renames items; use page search
Orphaned attachment jobs and deferred deletion Availability and behavior depend on version and features enabled
Email cleanup parameters and batch class Based on Microsoft support articles, not core documentation
Third-party tools mentioned Evaluate licensing, support and fit yourself
X++ sample Illustrative and untested
Retention periods suggested Starting points only; legal and business rules decide

Closing note

There is no single right answer for every customer. One environment’s problem is a print archive nobody cleaned for five years; another’s is a custom integration log keeping every payload; a third simply has a document type still pointing at the database since the AX 2009/2012 upgrade. Measure first, agree retention with the people who own the data, automate the cleanup, and keep watching the numbers.

If you have found other sources of growth, or other ways to deal with them, I would like to hear about them.

Sources

sábado, 10 de outubro de 2026

Privileged User Management no D365 F&O

 

Acesso privilegiado com prazo de validade e gravação

· @Francisco

Introdução

O D365 F&O agora permite conceder acesso elevado com horário de início e término e gravar tudo o que o usuário faz nesse intervalo. Isso resolve um dos achados de auditoria mais comuns em projetos de ERP: contas com papéis de administrador ou de gestor financeiro que permanecem ativas "para sempre".

Na prática, alguém sempre precisa de um acesso extra: um key user que vai investigar um problema em produção, um contador cobrindo as férias de um colega, um consultor ajudando no fechamento do mês. O problema não é conceder o acesso, é esquecer de retirá-lo e não ter evidência do que foi feito com ele.

Neste post, mostro como as duas funcionalidades do Security Governance resolvem isso juntas: Temporary role management (acesso com prazo) e Privileged user management (gravação e rastro de auditoria).

As duas peças do Security Governance

As duas funcionalidades são independentes, mas foram pensadas para trabalharem juntas: uma controla o que o usuário pode fazer e por quanto tempo; a outra registra o que ele efetivamente fez.

Temporary role management

Privileged user management

Objetivo

Atribuir papéis de segurança por um período (sessão)

Gravar a atividade de contas privilegiadas por um período

O que muda no usuário

Os papéis (Merge ou Replace)

O estado da conta (habilitada ou desabilitada)

Duração máxima

Sem limite

24 horas por sessão

Status para liberar o processamento

Planned

Approve

Logs disponíveis

Audit logs, User log, User role change log

Audit logs, User log, Recordings

Ao final da sessão

Usuário volta aos papéis originais

Conta volta ao estado original

Em ambos os casos, só quem tem o papel System administrator cria e aprova as sessões, e é um processo em batch que efetivamente aplica e reverte as mudanças.

Habilitando a funcionalidade

As telas só aparecem depois de ativar a feature User security governance no Feature management:

  1. Acesse System administration > Workspaces > Feature management.
  2. Pesquise por User security governance.
  3. Selecione Enable now.

Com a feature ativa, os dois formulários ficam disponíveis em:

  • System administration > Security > Security governance > Temporary role management
  • System administration > Security > Security governance > Privileged user management

Dica: antes de usar em produção, valide a feature em um ambiente de sandbox (Tier-2) com a mesma versão da plataforma. Como o processamento depende de batch, vale confirmar se o servidor de batch do ambiente está saudável.

Temporary role management: o acesso com prazo de validade

Uma sessão de papel temporário atribui um conjunto de papéis a um usuário entre uma data/hora de início e uma de fim. Quando a sessão termina, o usuário volta exatamente aos papéis que tinha antes. Casos típicos: cobertura de férias e divisão temporária de uma função entre várias pessoas.

Ciclo de vida da sessão

  1. Em Temporary role management, clique em New. O registro nasce com status Draft.
  2. Informe o User ID, o tipo de sessão, o início e o fim.
  3. Em Assign roles, escolha os papéis temporários. Se o acesso deve valer apenas para algumas empresas, use Assign organizations.
  4. Um System administrator aprova mudando o Change status para Planned.
  5. O batch processa a sessão (ou o admin clica em Process manualmente). No horário de início, o status passa para Active.
  6. Ao fim do horário, os papéis temporários são revogados e o status passa a 'Finished'.

Merge ou Replace?

  • Merge soma os papéis temporários aos que o usuário já possui. É o caso mais comum: o usuário continua fazendo o trabalho dele e ainda ganha algo a mais.
  • Replace substitui os papéis atuais pelos temporários durante a sessão. Útil quando o usuário vai assumir outra função e não deve acumular acessos (pense na segregação de funções).

Em ambos, ao final, os papéis originais são devolvidos. A aba Original roles mostra o que o usuário tinha antes, o que ajuda na revisão.

Rastreabilidade

  • Audit logs: cada mudança de status, quando, por quem e se foi o batch ou um administrador que processou.
  • User log: os logins do usuário durante a sessão ativa (e o momento em que a sessão terminou). Logins fora da janela não aparecem aqui.
  • User role change log: todas as alterações de papéis realizadas durante a sessão.

Atenção: ao contrário da gravação, não há limite de duração para uma sessão de papel temporário. Cabe ao processo interno definir um teto razoável.

Privileged user management: gravando o que foi feito

O Privileged user management agenda uma sessão para uma conta e, durante essa sessão, grava as interações do usuário na interface por meio do Task recorder. A ideia é ter evidência objetiva, para fins de auditoria e compliance, de que uma conta com poderes elevados não foi usada para nada fora do combinado.

Ciclo de vida da sessão

  1. Em Privileged user management, clique em New. O registro nasce como Draft.
  2. Informe o User ID e as janelas de início e de fim. A sessão pode durar, no máximo, 24 horas.
  3. Defina se a conta deve ser habilitada (se estava desabilitada) ou desabilitada quando a sessão começar. Ao final, a conta volta ao estado original.
  4. Um System administrator aprova mudando o Change status para Approve.
  5. O batch processa a sessão (ou o admin processa manualmente). Ao fechar a janela, o status passa para Ended.

Consentimento e gravação

Quando o administrador agenda a sessão, o sistema avisa que o Task recorder vai capturar as interações do usuário; seguir em frente significa concordar com a gravação. Do lado do usuário, ao entrar no sistema durante a sessão, aparece uma mensagem de consentimento no topo da página. Se ele continuar usando o F&O, a sessão será gravada; se não concordar, deve fechar a aplicação.

O Task recorder registra o tipo de ação (clique em botão, preenchimento de campo, navegação) e os dados associados a ela. Cada sessão gera uma gravação separada, armazenada na aba Recordings, a partir da qual pode ser baixada. As gravações ficam lá até que alguém as apague manualmente.

Rastreabilidade

  • Audit logs: mudanças de status, data/hora, autor e se a aprovação veio do batch ou de um administrador.
  • User log: os logins da conta durante a sessão privilegiada, com o tempo gasto em cada um. Nada fora da janela é registrado.
  • Recordings: o arquivo do Task Recorder de cada sessão.

A Microsoft recomenda usar o recurso apenas para contas realmente privilegiadas, cada uma com uma função única, e mantê-las desabilitadas quando não estiverem em uso. A opção de habilitar a conta apenas durante a sessão se encaixa exatamente nesse modelo.

Cenário prático: 30 minutos de Accountant, com gravação

Um key user precisa do papel de Accountant por 30 minutos (das 16:00 às 16:30) para investigar um lançamento em produção. A área de controles exige que o acesso seja temporário e que haja evidência de que nenhuma configuração foi alterada.

[embed: node/2c143013-5dea]

As duas sessões correm em paralelo: uma concede e revoga o papel, a outra grava o que acontece no meio.

Passo 1: conceder o papel temporário

Em Temporary role management:

  1. Crie um registro e informe o User ID.
  2. Escolha Merge para manter os papéis atuais do usuário.
  3. Informe início às 16:00 e fim às 16:30.
  4. Em Assign roles, inclua Accountant e System user.
  5. Mude o status para Planned.

Pegadinha: se o System user não estiver entre os papéis temporários, o sistema retorna um erro ao processar a sessão. Inclua-o sempre.

Passo 2: agendar o batch (uma única vez)

O processamento das sessões depende de um job em batch recorrente. Configure-o uma vez, com recorrência curta (por exemplo, a cada poucos minutos, conforme a precisão de horário de que vocês precisam). A partir daí, ele aplica e revoga as sessões sozinho. Quando a sessão for aplicada, o status muda para Active e o papel aparece na atribuição do usuário.

Passo 3: agendar a gravação

Em Privileged user management:

  1. Crie um registro com o mesmo User ID.
  2. Defina a janela de gravação, por exemplo, das 16:05 às 16:30.
  3. Mude o status para Approve.
  4. Se ainda não houver um batch ativo para esse processo, configure-o; se já houver, não é preciso criar outro.

Quando o usuário entrar no sistema dentro da janela, verá o aviso de que a sessão está sendo gravada.

Passo 4: o fim das sessões

Às 16:30, as duas sessões terminam: o registro de papel temporário passa para Finished (o Accountant é removido) e o de gravação passa para Ended. A gravação fica disponível na aba Recordings.

Uma observação de desenho: no exemplo, a gravação começa cinco minutos após o papel. Em produção eu prefiro alinhar as duas janelas, ou começar a gravação antes, para não deixar nenhum minuto de acesso elevado sem registro.

Analisando a gravação com Security diagnostics

O arquivo baixado da aba Recordings pode ser lido no próprio F&O, sem precisar abrir o Task recorder e reproduzir passo a passo:

  1. Baixe a gravação em Privileged user management > Recordings > Download.
  2. Acesse System administration > Security > Security diagnostics for task recordings.
  3. Selecione "Open from this PC", clique em "Browse" e escolha o arquivo.

Após o upload, o sistema lista os pontos de entrada de segurança acionados e as telas visitadas pelo usuário durante a sessão. É esse resultado que fecha o ciclo para o auditor: quem teve o acesso, por quanto tempo e o que fez com ele.

Boas práticas e pegadinhas

  • Use os dois juntos. O papel temporário sem gravação reduz o tempo de exposição, mas não gera evidência do uso. Gravação sem papel temporário gera evidência, mas o acesso continua lá depois.
  • Inclua o System user nos papéis temporários. Sem ele, o processamento falha.
  • Monitore o batch. Se o job parar, as sessões nem começam nem terminam na hora. Um papel que deveria ter sido revogado permanece ativo, o que é justamente o risco que se quer evitar.
  • Defina um teto interno para Temporary role management. O produto não limita a duração; a política da empresa deve fazê-lo.
  • Mantenha as contas privilegiadas desabilitadas fora das sessões e use a opção para habilitá-las apenas durante a janela de gravação.
  • Prefira Replace quando houver conflito de segregação de funções. Se o papel temporário, somado aos atuais, cria um conflito (por exemplo, entre cadastro de fornecedor e liberação de pagamento), substituir é mais seguro do que mesclar.
  • Restrinja por empresa com Assign organizations quando o acesso só fizer sentido em uma entidade legal.
  • Cuide das gravações. Elas ficam guardadas até que alguém as apague. Defina quem baixa, onde arquiva e por quanto tempo, em conformidade com a política de retenção e com a LGPD/GDPR, já que contêm dados de usuário.
  • Avise os usuários antes. A mensagem de consentimento aparece no login, mas comunicar o processo com antecedência evita surpresa e sessões abandonadas.

Conclusão

Com Temporary role management e Privileged user management, o D365 F&O passa a cobrir nativamente o ciclo completo de acesso privilegiado: conceder com prazo, revogar automaticamente e comprovar o que foi feito. Para quem atende a auditorias SOX ou a controles de ITGC, isso substitui planilhas e lembretes manuais por evidências geradas pelo próprio sistema.

O investimento é pequeno: ativar uma feature, agendar um batch e alinhar o processo com a área de controles. O retorno é sair da próxima auditoria sem o clássico achado de "administrador permanente".

Referências

quarta-feira, 30 de setembro de 2026

D365F&O - Atualizações via Power Platform

Com a migração da administração do Dynamics 365 Finance and Operations do Lifecycle Services (LCS) para o Power Platform admin center (PPAC), uma das dúvidas mais frequentes é: como ficam os Service Updates, os Quality Updates (PQU) e os hotfixes?

Neste post reúno o que está documentado hoje pela Microsoft (e alguns pontos da comunidade) considerando exclusivamente um ambiente Sandbox criado no Power Platform (USE ou UDE), sem qualquer envolvimento do LCS.

1. O modelo mudou: o F&O agora é uma aplicação

Em ambientes unificados, o Finance and Operations deixa de ser um "ambiente" próprio e passa a ser uma aplicação Dynamics 365 instalada num ambiente Power Platform com Dataverse. Na prática, isto significa que Service Updates e Quality Updates são aplicados pela mesma operação: atualizar a versão da aplicação Dynamics 365 Finance and Operations Provisioning App.

Nomenclatura das versões

No PPAC as versões seguem o formato 10.0.XX.N, onde 10.0.XX é o service update e N indica o nível de PQU incluído.

Versão Significado Disponível em
10.0.40.2 (Preview) 10.0.40 com 3 PQUs, build preview Apenas ambientes com early release cycle
10.0.39.4 10.0.39 com 5 PQUs Todas as geografias
10.0.38.9 10.0.38 com 10 PQUs Todas as geografias

Pontos importantes:

  • Cada versão disponível já inclui o PQU mais recente daquele service update.
  • Não é possível escolher um build anterior de uma mesma versão.
  • Builds preview só aparecem em ambientes com early release cycle.

O calendário oficial de PQU já publica o mapeamento entre o build "clássico" e a versão do Provisioning App. Exemplo: o train 10.0.48 Release-6 corresponde ao App version 10.0.2645.136, Platform 7.0.7996.119 e Unified Environment Provisioning Application Version 10.0.48.7.

2. Aplicar manualmente um Service Update ou Quality Update num Sandbox

  1. Aceda ao PPAC → Environments → selecione o ambiente.
  2. No cartão Resources, clique em Dynamics 365 apps.
  3. Selecione Dynamics 365 Finance and Operations Provisioning App → … → Manage.
    Se a opção Manage não aparecer, o ambiente já está na versão mais recente.
  4. Confirme o aviso. Na nova página, escolha a versão na lista (só aparecem versões superiores à instalada).
    Se a lista estiver vazia, não submeta o pedido: o ambiente já está atualizado.
  5. Aceite os termos e clique em Install. O estado da aplicação passa a Installing; a Microsoft indica cerca de 1 hora de duração.

Acompanhar a operação

Além do painel Details da aplicação, o progresso pode ser acompanhado na app Finance and Operations Package Manager (PPAC → Resources → Power Apps), no separador Operation History.

Via Power Platform CLI (preview)

O grupo de comandos pac dynamics já permite automatizar este processo:

# Listar versões disponíveis para o ambiente
pac dynamics get-fin-ops-versions --environment https://meuambiente.crm4.dynamics.com

# Aplicar uma versão específica (operação de longa duração)
pac dynamics apply-fin-ops-version --version 10.0.47.5 --environment https://meuambiente.crm4.dynamics.com

# Consultar erros recentes de operações
pac dynamics get-fin-ops-operation-errors --environment https://meuambiente.crm4.dynamics.com

3. Service Updates automáticos em ambientes unificados

A Microsoft mantém uma página de calendário específica para ambientes unificados, com o build e a versão do Provisioning App de cada service update. Os clientes com ambientes agendados recebem notificação antes do rollout.

O rollout segue o modelo de estações (o mesmo usado pelos PQUs):

Estação Regiões
Station 1Apenas ambientes opted-in
Station 2Canada Central/East, France Central, India Central, Norway East, Switzerland West
Station 3France South, India South, Norway West, Switzerland North, South Africa North, Australia East/South East, UK South, UAE North, Japan East, South East Asia
Station 4East Asia, UK West, Japan West, Brazil South, North Europe, East US, UAE Central
Station 5West Europe, Central US, West US
Station 6DoD, GCC, China

Detalhe importante: o service update automático 10.0.48 aplica-se apenas a ambientes em 10.0.46 ou anterior; ambientes já em 10.0.47 ou superior são ignorados. Ou seja, o auto-update atua sobre ambientes que ficaram para trás, e quem se mantém atualizado manualmente não é "empurrado".

E pausar?

O mecanismo de pause service updates documentado é exclusivo do LCS. No PPAC, o controlo disponível são as Maintenance Settings do Finance and Operations. Via CLI, o parâmetro --updated-maintenance-window-cadence do comando pac dynamics update-fin-ops-maintenance-settings aceita os valores EveryUpdate, EveryOtherUpdate e Regulated. Até ao momento, não encontrei documentação no Microsoft Learn que detalhe o comportamento de cada valor no PPAC.

4. Proactive Quality Updates (PQU)

  • Mesmo calendário: segundo a Microsoft, não há diferença no agendamento de PQUs entre ambientes unificados e ambientes geridos pelo LCS.
  • Cadência quinzenal: a partir da 10.0.47, os PQUs passaram de um ciclo de 28 dias para um ciclo de duas semanas.
  • Sandbox primeiro: produção recebe o PQU sempre pelo menos 5 dias depois dos sandboxes.
  • Não é possível adiar, reagendar ou pausar um PQU, nem pedir exclusão da cadência quinzenal.
  • Aplicação antecipada: é possível instalar um PQU antes do calendário. Em ambientes unificados isso equivale a escolher a versão .N mais alta no Provisioning App. Se o ambiente já tiver um build igual ou superior, o PQU agendado é ignorado.
  • PQU ignorado quando existe um service update agendado nos 7 dias seguintes.
  • Sem rollback: após aplicado, um PQU não pode ser revertido. Em ambientes unificados, a alternativa prática é trabalhar com cópias/backups do ambiente antes de atualizar.
  • Notificações: chegam pelo Message center do Microsoft 365 admin center.

Receber PQUs em dias úteis (apenas produção)

  1. PPAC → ambiente de produção → Settings.
  2. Em Updates, selecione Maintenance Settings.
  3. Na secção Finance and Operations Maintenance Settings, escolha os Maintenance window days.
  4. Guarde. (Também é possível via pac dynamics update-fin-ops-maintenance-settings --updated-maintenance-window-days-of-week.)

5. E os hotfixes individuais (KB)?

Este é o ponto com menos documentação. Tudo o que a Microsoft documenta sobre aplicar hotfixes manualmente refere-se ao LCS. No PPAC:

  • O Asset library não existe: pacotes ficam no Azure DevOps e são importados diretamente para o Dataverse.
  • Não é possível escolher um build anterior de uma versão, nem (segundo a FAQ do UDE) provisionar/atualizar para um runtime update específico.
  • Não encontrei documentação oficial que descreva a seleção de um KB avulso num ambiente unificado.
Conclusão prática: em ambientes unificados, o "hotfix" chega sempre como parte do PQU cumulativo seguinte, aplicado automaticamente ou manualmente através do Provisioning App. Se um fix crítico ainda não estiver num PQU, o caminho é abrir um ticket de suporte. A consulta da lista de KBs de um PQU continua documentada apenas via LCS.

6. Outros pontos úteis

  • Builds preview: em unified, o acesso é feito através do early release cycle do ambiente (o First Release Program documentado é configurado no LCS).
  • Paridade de versões entre ambientes: a Microsoft sugere usar a cópia de ambiente para alinhar um UDE com a versão de um sandbox ou produção. Em ambientes unificados, a cópia leva dados e código, portanto também a versão.
  • UDE: as funcionalidades do Unified Developer Experience estão GA a partir da 10.0.39.
  • Modo manutenção: ativar o Administration mode no PPAC tem o mesmo efeito do maintenance mode do LCS.

Lacunas atuais na documentação

  • A semântica das cadências EveryOtherUpdate e Regulated no PPAC.
  • Como consultar a lista de KBs de um PQU sem acesso ao LCS.

Se tiverem experiência com algum destes pontos, deixem nos comentários!

Referências

terça-feira, 25 de agosto de 2026

Dynamics 365 Finance & Operations 10.0.49: As novidades que merecem atenção!

D365 Finance & Operations 10.0.49: o que realmente muda no seu dia a dia

Toda nova versão do D365 F&O traz uma longa lista de novidades — mas nem tudo merece o mesmo nível de atenção. Na 10.0.49 (build 10.0.2790), separei o que é só ruído do que vai exigir teste, decisão ou ajuste de processo antes de chegar à produção.

TL;DR: mais automação no financeiro (pré-pagamento por linha, liquidação desacoplada, reconciliação bancária com revisão), planejamento mais preciso no supply chain, classificação dinâmica de trabalho no armazém com Power Fx — e uma mudança de ferramenta para quem desenvolve X++ que não pode ficar para a última semana do projeto.


📅 Quando isso chega ao seu ambiente?

Fase Data
Preview Julho de 2026
GA (self-update) Setembro de 2026
GA (auto-update) Outubro de 2026

Data de disponibilidade não é sinônimo de "ativar tudo no dia seguinte". O caminho seguro continua sendo: sandbox primeiro, integrações revisadas, usuários-chave validando os processos críticos.


💰 Financeiro: menos trabalho manual, mais rastreabilidade

Pré-pagamento agora pode ser calculado por linha

Até aqui, a regra de adiantamento valia para o documento inteiro. Agora dá para diferenciar por linha.

Cenário real: equipamento de 100.000 com 30% de adiantamento + instalação de 20.000 com 50% de adiantamento. Antes, uma regra única distorcia um dos dois. Agora, cada linha respeita sua própria condição.

📍 Ativação: Accounts receivable parameters, com Prepayment customer invoice habilitado no Feature management.

Datas contábeis que se ajustam sozinhas

Requisição criada em 30/06, aprovação arrasta até depois do fechamento do período. Em vez de travar o processo, o sistema reprocessa para o próximo período aberto do mesmo ano fiscal e reavalia o orçamento automaticamente.

Menos ping-pong com o financeiro — mas vale confirmar se essa automação bate com a política de períodos e os requisitos de auditoria da empresa.

Reservas orçamentárias com mais controle

Um pacote de melhorias que ataca perguntas que todo controller já fez pelo menos uma vez:

  • O compromisso ainda está mesmo aberto?
  • Um documento finalizado continua consumindo orçamento por engano?
  • Existe alguma relação quebrada entre compromisso e liquidação?
  • O fechamento do exercício está sendo respeitado no saldo exibido?

Prioridade alta de teste para quem trabalha com setor público ou governança orçamentária forte.

Pagamento contabilizado, liquidação em fila

Delay settlement from journal posting separa dois momentos que hoje são um só: contabilizar o pagamento e concluir a liquidação. Se o volume travar a liquidação, o pagamento entra mesmo assim — e a liquidação roda depois, automática ou manual.

⚠️ Ganho de continuidade operacional, mas alguém precisa monitorar a fila e tratar os casos que não se liquidam sozinhos.

Reconciliação bancária com um "ok" humano antes de fechar

As regras de correspondência continuam automáticas, mas agora é possível revisar e aprovar o resultado antes de marcar como conciliado. Útil para valores altos, contas sensíveis ou exceções que ninguém quer descobrir depois do fechamento.

De brinde: filtro de transações de bridge por conta bancária, cliente/fornecedor, referência, número de cheque e período — relevante para quem trabalha com alto volume.

Ativos fixos e moeda de reporte

Ajustes de moeda de reporte agora acompanham corretamente divisões de ativos registrados em moeda estrangeira (o recurso de contabilização do ajuste ainda está em preview). Antes de ativar, vale revisar transações antigas, lançamentos não contabilizados e registros zerados em moeda de reporte.

Electronic Reporting fica mais robusto

  • Geração nativa de GS1-128, GS1 DataMatrix e GS1 QR Code
  • Funções DIV e MOD nas fórmulas
  • Respeito ao número de cópias do Print management
  • Menor consumo de memória em execuções grandes
  • Validação de múltiplas versões de configuração numa única operação, com histórico

DIV(25, 10) = 2 caixas completas · MOD(25, 10) = 5 unidades restantes — simples, mas resolve paginação, agrupamento de volumes e dígitos verificadores.


📦 Supply Chain: planejamento mais fino, armazém mais inteligente

Master planning respeita melhor a realidade da produção

Duas melhorias que se somam: consideração de períodos fechados em calendários de transporte e, principalmente, sub-BOM e sub-roteiro entrando na redução de previsão. Resultado esperado: menos excesso de compra e produção quando já existe suprimento no meio do caminho.

📍 Antes de confiar no novo comportamento, rode um cenário de comparação: ordens planejadas, datas e quantidades, antes x depois.

Reserva de matéria-prima presa ao mesmo lote (preview)

Pensado para rastreabilidade em produção — típico caso de indústria alimentícia, onde a ordem precisa consumir de um único lote sempre que o estoque permitir. Testar com regras de validade, localização e disponibilidade parcial é obrigatório antes de ligar em produção.

ASN de entrada vira despatch advice

O aviso antecipado de embarque do fornecedor agora entra como despatch advice, permitindo organizar docas, equipe e conferência antes do caminhão chegar. Ganho direto de produtividade no recebimento.

Uma localização, um proprietário

Nova regra impede múltiplos proprietários numa mesma localização de armazém — importante em operações de terceiros ou consignação. Antes de ativar: audite os saldos atuais, porque dado legado com múltiplos proprietários vai pedir limpeza.

Mapeamento de status de estoque para integrações externas

Um sistema externo manda Available, Blocked, QualityHold — e agora dá para mapear isso direto para os status internos do SCM, com efeito claro em reserva, picking e disponibilidade para venda.

Classificação dinâmica de trabalho com Power Fx

Provavelmente o recurso mais "de engenharia" da lista: uma fórmula Power Fx substitui vários templates estáticos de work classification, decidindo em tempo real pool de trabalho, prioridade, diretiva de localização e classe de trabalho.

Switch(workTable.Load.CarrierCode,
    "Carrier1", {WorkPoolId: "Carrier1", DefaultWorkPriority: 100},
    "Carrier2", {WorkPoolId: "Carrier2", DefaultWorkPriority: 50},
    "Carrier3", {WorkPoolId: "Carrier3", DefaultWorkPriority: 10}
)

Ou, direcionando por zona refrigerada:

{ WorkClassId: Concatenate("S-", workLine.ZoneId) }

Poderoso, mas pede governança: documente as fórmulas, teste os casos sem correspondência e confira se a lógica se encaixa no agrupamento de templates já existente.

E ainda: melhorias incrementais

CAPA, consolidação de transações de estoque, sincronização de estabelecimento em entregas diretas, bloqueio de registros de chão de fábrica após o cálculo diário, escalabilidade de filas do message processor e rastreamento de alterações de preço para o Azure Product Search.


⚠️ O que passou a ser obrigatório

Nem tudo é opt-in. Ficaram obrigatórios nesta versão:

  • Finance: customer and vendor netting, melhorias de reconciliação bancária, cash position, cash control e diversas validações de pagamento
  • Supply Chain: Advanced quality management, integrações do Inventory Visibility, dispense management, recálculo de datas em entregas diretas, recursos de rebates

Isso muda o jogo do planejamento: não basta escolher o que ativar — é preciso mapear o que mudou de comportamento por padrão e testar os processos que dependem disso.


✅ Checklist rápido para o projeto

  1. Confirme versão atual, canal de atualização e data planejada
  2. Inventário de customizações X++, extensões, integrações e ER
  3. Separe: novo opcional, ativado por padrão, obrigatório, preview
  4. Teste ponta a ponta: compras, vendas, pagamentos, fechamento, produção, planejamento, recebimento
  5. Compare master planning antes x depois
  6. Teste reconciliação bancária, liquidação em fila e filas de processamento
  7. Valide ER: cópias, idiomas, destinos, códigos de barras
  8. Teste regras de armazém com transportadoras, zonas e mudança de carga
  9. Revise permissões, batch jobs e monitoramento
  10. Documente decisões e mantenha um plano de rollback — mesmo em One Version

🛠️ Atenção, devs: o Visual Studio muda a partir do PU74

A partir do PU74, o Visual Studio 2022 deixa de ser suportado para desenvolvimento X++ — o ambiente suportado passa a ser o Visual Studio 2026. Isso não é só uma preferência de IDE: máquinas de desenvolvimento, agentes de build, pipelines de CI/CD e extensões precisam ser revisados.

Não deixe essa migração para a última etapa do projeto — ela afeta diretamente a capacidade de compilar, testar e publicar.


Conclusão

A 10.0.49 segue a direção que o D365 F&O vem tomando há tempo: mais automação nos controles financeiros, mais inteligência no armazém, mais integração e rastreabilidade. Os ganhos mais claros para a maioria dos projetos estão em pré-pagamento por linha, liquidação desacoplada, reconciliação bancária com revisão, ER otimizado, planejamento mais preciso e classificação dinâmica de trabalho.

Trate a atualização como projeto de negócio, não como aplicação de pacote. Testar os novos comportamentos, preparar os usuários e revisar as integrações vai pesar tanto quanto instalar a versão em si.


Fontes