Lightning Web Components
Construir uma UI personalizada em torno da REDA Financials é um trabalho comum de LWC — os objetos são objetos personalizados, os serviços de dados são os padrão, e seus componentes ficam ao lado dos do pacote em qualquer página Lightning. O trabalho fino está no que você constrói sobre.
Acesso a dados a partir dos seus componentes
- Lightning Data Service em primeiro lugar:
lightning-record-form, os adaptadores wire e a UI API falam fluentemente com objetosrefin__— CRUD com layouts, FLS e validações resolvidos de graça. - Seu Apex onde a lógica mora: um controlador que consulta faturas, ou chama
refin.GlobalTaxServicepara pré-visualização de impostos em tempo real na sua própria UI de cotação (veja Desenvolvimento em Apex na REDA). - Mudanças de status a partir da UI = contabilização: um botão no seu componente que faz PATCH do status para 'Posted' via LDS executa o mecanismo completo — construa o tratamento de erros em torno da mensagem do DML, que já é texto pronto para o usuário.
Compondo com as páginas do pacote
- As páginas de registro estão abertas: coloque seus componentes nas páginas de registro empacotadas (ou clone a flexipage e reorganize) — um painel personalizado de "contexto do contrato" ao lado da fatura, um cartão de propriedade no ativo.
- Os formulários se estendem sem código: antes de escrever um componente para "adicionar um campo ao formulário da fatura", verifique os conjuntos de campos — os formulários empacotados ganham colunas de forma declarativa.
- A navegação é padrão: seus componentes criam links diretos para qualquer registro ou lista da REDA usando o serviço de navegação da plataforma; as telas empacotadas fazem o mesmo de volta.
Padrões que valem a pena
- Painéis de contexto verticais — os dados do seu setor (propriedade, projeto, caso) exibidos ao lado do documento financeiro que os referencia.
- Criação guiada — um assistente que coleta as entradas do seu domínio, cria o documento em rascunho via LDS e entrega o usuário ao formulário padrão para a parte contábil.
- Painéis somente leitura — consultas via adaptador wire sobre faturas/livro razão com a visualização de sua escolha, complementando os painéis padrão.
Um componente na prática: a pré-visualização de impostos da cotação de locação da Meridian
A equipe de locação da Meridian Properties Group queria mostrar o aluguel com impostos incluídos durante a negociação, antes de qualquer fatura existir. O componente é um LWC REDA de manual: sua UI, seu controlador, o mecanismo do pacote. O controlador monta uma solicitação para refin.GlobalTaxService a partir das entradas da cotação:
refin.GlobalTaxService.TaxRequest req = new refin.GlobalTaxService.TaxRequest();
req.entityId = quote.entityId;
req.accountId = quote.tenantAccountId;
req.transactionDate = Date.today();
req.side = 'Sales';
refin.GlobalTaxService.TaxLineRequest line = new refin.GlobalTaxService.TaxLineRequest();
line.lineKey = 'rent-1'; // ecoado de volta para correlação
line.amount = quote.monthlyRent;
line.productId = quote.rentProductId;
req.lines = new List<refin.GlobalTaxService.TaxLineRequest>{ line };
refin.GlobalTaxService.TaxResponse res = refin.GlobalTaxService.calculateTax(req);
A resposta traz totalTaxAmount e resultados por linha (alíquota, valor, contas contábeis resolvidas), correlacionados de volta por lineKey. Como o contrato não realiza nenhum DML e nunca lança exceção para quem o chama, o componente verifica res.success, exibe res.errorMessage quando falso, e copia os valores de que precisa para seu próprio formato de resposta no wire. Quando o contrato é assinado e a fatura real é contabilizada meses depois, os números batem até o centavo — um único mecanismo, dois consumidores.
As proteções que sua UI herda
| Comportamento da plataforma/pacote | Consequência de design para seu componente |
|---|---|
| Documentos contabilizados ficam bloqueados, exceto campos de fluxo de trabalho na lista de permissões | Desative as opções de edição quando o Status for Posted — o salvamento falharia de qualquer forma, com a mensagem do pacote |
| Contabilização = a atualização Draft→Posted, mecanismo e proteções incluídos | Seu botão "Contabilizar" é uma única atualização LDS mais a exibição honesta de erros; nunca reimplemente a lógica de contabilização no lado do cliente |
| Usuários sem licença têm gravações contábeis recusadas com uma mensagem literal | Exiba a mensagem tal como está — ela já orienta o usuário a contatar o administrador |
| Erros de DML trazem texto de validação já pronto para o usuário | Seu toast pode exibir a mensagem bruta; nenhuma tabela de tradução de códigos de erro é necessária |
| Os conjuntos de campos conduzem os formulários empacotados | Acompanhe-os: construa seus editores de linha a partir dos mesmos describes de conjuntos de campos, para que sua UI e o formulário empacotado nunca discordem sobre as colunas |
Erros comuns a evitar
| Erro | Por que prejudica | Faça isto em vez disso |
|---|---|---|
| Reconstruir o formulário da fatura porque "precisa de mais um campo" | Semanas de trabalho duplicando uma superfície de produto já mantida | Os conjuntos de campos adicionam o campo em minutos; construa componentes para o que os conjuntos de campos não conseguem fazer |
| Calcular o imposto no lado do cliente "por responsividade" | Seu JavaScript e o mecanismo de contabilização acabarão divergindo — na frente de um cliente | Chame o GlobalTaxService através do seu controlador; armazene em cache no componente se necessário |
Gravar refin__Accounting_Transaction__c a partir de um controlador | Linhas de livro razão forjadas manualmente são exatamente o que as proteções existem para impedir | Crie documentos e contabilize-os; o livro razão se grava sozinho |
| Assumir que componentes empacotados podem ser incorporados ao seu DOM | Seus alvos de exposição e componentes internos não são um contrato documentado | Componha no nível da página Lightning; trate os LWCs empacotados como superfícies de produto |
| Testar apenas como administrador | Usuários reais esbarram em FLS, conjuntos de permissões e a licença — os caminhos de erro do seu componente nunca foram exercitados | Teste como um usuário com exatamente o conjunto de permissões empacotado que seu público terá |
O que vem a seguir
- Extensibilidade por FieldSets — a alternativa sem código a verificar primeiro.
- Desenvolvimento em Apex na REDA — a camada de lógica.
- Integração de Fluxos do Salesforce — o meio-termo declarativo.
Perguntas frequentes
Componha no nível da página (regiões do Lightning App Builder) em vez de aninhar programaticamente. Os alvos expostos (exposed targets) determinam onde os componentes empacotados podem ser posicionados; trate seus componentes internos como privados.
Prefira LDS/UI API (a aplicação já está embutida); em controladores Apex personalizados, use consultas USER_MODE. O pacote usa USER_MODE nas leituras que servem a um usuário e SYSTEM_MODE onde o motor precisa enxergar o quadro completo independentemente do acesso do usuário em execução: contabilização, sequências, totalizações. No seu próprio código de interface, use USER_MODE por padrão e recorra a SYSTEM_MODE apenas quando puder dizer por quê.
Sim. Nenhum conjunto de permissões empacotado concede acesso de classe a refin.GlobalTaxService (só PDFGeneratorAPI e EInvoiceTrailCreator são concedidos, porque as ações de Fluxo empacotadas os chamam), então o usuário em execução precisa que ele seja concedido explicitamente. Verifique com o conjunto de permissões real em um sandbox; o modo de falha é evidente e imediato.
Se você construiu sobre a superfície estável — objetos refin__ via LDS/UI API, as classes Apex globais, composição no nível da página — sim, pelo contrato do pacote gerenciado. O que quebra é depender dos componentes internos empacotados ou de classes públicas, motivo pelo qual este artigo continua orientando você a evitar ambos.
Literalmente. As mensagens de proteção são escritas como frases voltadas ao usuário ("Este documento requer aprovação antes da contabilização." e similares) — um toast exibindo a mensagem bruta do DML é genuinamente a melhor UX, e permanece correto conforme o pacote evolui suas regras.
Isso foi útil?