CSPlane

DOCUMENTAÇÃO BOOTCAMP CSPTECH - ORGANIZAÇÃO CSP PLANE

  • INTRODUÇÃO

Para a imersão, a CSP Tech sugeriu a elaboração de um cenário empresarial focado na venda, programação e gestão de despesas de viagens corporativas. Nesse contexto, cada colaborador da empresa cliente seria responsável por registrar suas próprias viagens e as despesas associadas, atendendo assim às demandas específicas do negócio.

A despeito do foco em desenvolvimento, durante a imersão tivemos contato com as principais funcionalidades de Salesforce, tanto em relação a parte funcional quanto em relação a parte de desenvolvimento, de modo a adentrar profundamente no ambiente Salesforce e em um cenário de negócios. Para solucionar os desafios propostos, o MVP da CSPlane foi criada, no qual, além de constar a solução de todos os exercícios propostos pela própria CSP Tech, o MVP da CSPlane incorpora as resoluções dos exercícios propostos e foi projetado para ser uma solução abrangente no contexto de gestão de viagens corporativas de modo a atender de maneira integral às necessidades básicas do cenário de negócios proposto.

Esse modelo inicial, além de incorporar as soluções desenvolvidas para os exercícios, também integra ferramentas e recursos avançados para otimizar a experiência do usuário e a eficiência operacional. O time se dedicou a personalizar e aprimorar o ambiente Salesforce, implementado, para tanto, novos objetos e campos customizados, Flows para a realização das tarefas, além de funcionalidades com Apex e testes para tal. Durante a imersão, a exploração da ferramenta Copado Essentials proporcionou uma oportunidade para aprofundar o entendimento sobre deploy em ambiente Salesforce.

  • Características do CSPlane

  • Objetos

Na primeira semana, nosso contato principal foi com a parte funcional, no qual estruturamos a organização da CSPlane para desenvolvimento futuro. Além dos Objetos e Campos customizados, fizemos implementações de Flows na organização. Cabe destacar que, em decisão conjunta, o grupo optou por utilizar Camel Case para nomear os futuros API Names da organização.

  • Principais objetos:

Despesa (Despesa__c)

  • Objeto para lançamento/reembolso de despesas do dia-a-dia de um colaborador que está em viagem, por exemplo alimentação, translados, etc-:

    | Campo | Tipo | Nome da API Salesforce | | --- | --- | --- | | Cliente | Relacionamento Pesquisa com objeto Conta | Cliente__c | | Colaborador | Relacionamento Pesquisa com objeto Contato | Colaborador__c | | Pagamento | Relacionamento Pesquisa com objeto Pagamento | Pagamento__c | | Custo | Moeda | Custo__c | | Data | Data | Data__c | | Descrição | Área de texto (255) | Descricao__c | | Status | Picklist | Status__c |

Viagem (Viagem__c)

  • Objeto personalizado para registro de viagens dos clientes:

    | Campo | Tipo | Nome da API Salesforce | | --- | --- | --- | | Cliente | Relacionamento Mestre-Detalhe | Cliente__c | | Colaborador | Relacionamento Mestre-Detalhe | Colaborador__c | | Pagamento | Relacionamento Pesquisa | Pagamento__c | | Prestador de Serviços | Relacionamento Pesquisa | PrestadoresServicos__c | | Custo | Moeda | Custo__c | | Data/Hora Ida | Data/Hora | DataHoraIda__c | | Data/Hora Volta | Data/Hora | DataHoraVolta__c | | Destino | Texto | Destino__c | | Id Controle Viagem | Fórmula | IdControle_Viagem__c | | Origem | Texto | Origem__c |

Pagamento (Pagamento__c)

  • Objeto personalizado para registro dos pagamentos realizados pelos clientes:

    | Campo | Tipo | Nome da API Salesforce | | --- | --- | --- | | Cliente | Relacionamento Pesquisa | Cliente__c | | Status | Picklist | Status__c | | Valor Total | Fórmula | ValorTotal__c | | Valor Total Despesas | Moeda | ValorTotalDespesas__c | | Valor Total Viagens | Moeda | ValorTotalViagens__c |

Flows


  • Fluxo “Conta - Atualiza Limite de Credito”

Descrição
Durante o primeiro exercício da CSP Tech, foi desenvolvido um fluxo focado na administração de solicitações de alteração do limite de crédito da conta da empresa. O fluxo é projetado para identificar se a solicitação é inédita ou se uma solicitação similar já existe. Se for uma nova solicitação, o valor indicado é capturado e armazenado na variável “NovoLimite” e o campo “LimiteSolicitado__c” é atualizado. Se já existe uma solicitação, uma tela informa o usuário para aguardar a análise da solicitação previamente submetida. Todas as novas solicitações são enviadas para análise e o usuário é notificado de que a revisão está em andamento.
Cenário
Na CSP Tech, João, um gerente, solicita um aumento no limite de crédito da conta da empresa. O fluxo é ativado, determinando se a solicitação de João é nova ou se uma já existe. Se for nova, o valor que João propõe é armazenado e a solicitação é enviada para análise. João é então informado de que sua solicitação está sendo revisada. Se uma solicitação semelhante já existir, João é notificado para aguardar a conclusão da análise existente.
Conclusão
O estabelecimento do fluxo "Alteração de Limite de Crédito" na CSP Tech tem sido instrumental em otimizar a eficiência na gestão de crédito da empresa. Este procedimento automatizado não apenas acelera o processamento de tais solicitações, mas também assegura uma comunicação clara e transparente com os solicitantes. A empresa agora beneficia de um manejo de crédito mais ágil e preciso, garantindo respostas rápidas e processos de aprovação eficientes, enquanto mantém os stakeholders informados em cada etapa.

Na plataforma:

O primeiro fluxo foi realizado no 1º exercício da CSP Tech, logo na primeira semana, se relacionando com a possibilidade de alteração de Limite de Crédito na Conta da empresa:

Um usuário solicita a aprovação de novo limite de crédito para determinada empresa, no qual, o fluxo verifica se já existe tal solicitação para àquela conta ou se trata de nova. A depender do resultado da verificação, é solicitado que se aguarde ou que se escolha o novo limite de crédito:

Tela caso seja verificado que tal solicitação é nova:

Tela caso seja verificado que tal solicitação já existe:

Após verificar que se trata de nova solicitação de crédito, o valor atribuído pelo usuário é capturado e adicionado à variável “NovoLimite”:

Após adicionar à variável “NovoLimite”, o campo “LimiteSolicitado__c” do registro do objeto conta é atualizado com tal limite:

Após, a solicitação é enviada para aprovação, resultando na tela a seguir:

Fluxo “Conta - Atualiza Limite de Credito”

Descrição
Durante o primeiro exercício da CSP Tech, foi desenvolvido um fluxo focado na administração de solicitações de alteração do limite de crédito da conta da empresa. O fluxo é projetado para identificar se a solicitação é inédita ou se uma solicitação similar já existe. Se for uma nova solicitação, o valor indicado é capturado e armazenado na variável “NovoLimite” e o campo “LimiteSolicitado__c” é atualizado. Se já existe uma solicitação, uma tela informa o usuário para aguardar a análise da solicitação previamente submetida. Todas as novas solicitações são enviadas para análise e o usuário é notificado de que a revisão está em andamento.
Cenário
Na CSP Tech, João, um gerente, solicita um aumento no limite de crédito da conta da empresa. O fluxo é ativado, determinando se a solicitação de João é nova ou se uma já existe. Se for nova, o valor que João propõe é armazenado e a solicitação é enviada para análise. João é então informado de que sua solicitação está sendo revisada. Se uma solicitação semelhante já existir, João é notificado para aguardar a conclusão da análise existente.
Conclusão
O estabelecimento do fluxo "Alteração de Limite de Crédito" na CSP Tech tem sido instrumental em otimizar a eficiência na gestão de crédito da empresa. Este procedimento automatizado não apenas acelera o processamento de tais solicitações, mas também assegura uma comunicação clara e transparente com os solicitantes. A empresa agora beneficia de um manejo de crédito mais ágil e preciso, garantindo respostas rápidas e processos de aprovação eficientes, enquanto mantém os stakeholders informados em cada etapa.
  • Na plataforma:

O primeiro fluxo foi realizado no 1º exercício da CSP Tech, logo na primeira semana, se relacionando com a possibilidade de alteração de Limite de Crédito na Conta da empresa:

Um usuário solicita a aprovação de novo limite de crédito para determinada empresa, no qual, o fluxo verifica se já existe tal solicitação para àquela conta ou se trata de nova. A depender do resultado da verificação, é solicitado que se aguarde ou que se escolha o novo limite de crédito.

Tela caso seja verificado que tal solicitação é nova.

Tela caso seja verificado que tal solicitação já existe.

Após verificar que se trata de nova solicitação de crédito, o valor atribuído pelo usuário é capturado e adicionado à variável “NovoLimite”.

Após adicionar à variável “NovoLimite”, o campo “LimiteSolicitado__c” do registro do objeto conta é atualizado com tal limite.

Após, a solicitação é enviada para aprovação, resultando na tela a seguir:

Tela final.

  • Fluxo “Despesas - Processo de Aprovação”

Descrição
Na solução do Exercício da primeira semana, concebemos um fluxo em que, ao ser criado um registro de despesa, é gerada e enviada uma notificação ao supervisor para aprovar ou rejeitar o gasto. O Fluxo é ativado pela criação desse registro e, depois de reunir as notificações, a fila de aprovação e os membros encarregados da aprovação, inicia-se um loop de iteração. Durante esta iteração, a notificação é enviada ao encarregado, garantindo que ele seja informado e possa acessar os detalhes da despesa para tomar sua decisão, seja pela aprovação seja pela rejeição.
Cenário
Na ABC Consultoria, Carlos, um consultor, registra suas despesas de viagem no novo sistema automatizado da empresa. Imediatamente, Roberto, seu supervisor, recebe uma notificação para revisar e aprovar ou rejeitar as despesas. O fluxo automatizado agiliza o processo, permitindo uma revisão rápida e eficiente, garantindo a conformidade com as políticas da empresa e aprimorando a gestão financeira.
Conclusão
A implementação do fluxo concebido proporcionou à ABC Consultoria um mecanismo eficaz e automatizado para o gerenciamento de despesas. Ele não só otimizou o tempo de processamento, mas também garantiu que todas as despesas fossem revisadas minuciosamente, assegurando a integridade financeira da empresa. O fluxo automatizado provou ser um investimento valioso, proporcionando eficiência, transparência e conformidade ao processo de controle de despesas da empresa.
  • Na plataforma:

O Fluxo acionado por registro se inicia após um registro do Objeto Despesa ser criado.

O Fluxo acionado por registro se inicia após um registro do Objeto Despesa ser criado.

Após, o ID do registro Despesa é coletado e enviado para o processo de aprovação.

Após, o ID do registro Despesa é coletado e enviado para o processo de aprovação.

Após, é obtido o ID da notificação personalizada, através de GetRecords, personalizada para enviar no componente de ação.

Após, é obtido o ID da notificação personalizada, através de GetRecords, personalizada para enviar no componente de ação.

Após, no Objeto Grupo, é obtida a fila responsável pela futura aprovação ou desaprovação da despesa. Cabe destacar que para esse processo vigorar restou necessário inserir nos Processos de Aprovação, recurso de automação do processo fornecido pelo Salesforce.

Após, no Objeto Grupo, é obtida a fila responsável pela futura aprovação ou desaprovação da despesa. Cabe destacar que para esse processo vigorar restou necessário inserir nos Processos de Aprovação, recurso de automação do processo fornecido pelo Salesforce.

Após o resultado acima, é obtido o ID do Grupo que se encontra nessa fila, sendo que logo após um loop é realizado nos IDs obtidos.

Após o resultado acima, é obtido o ID do Grupo que se encontra nessa fila, sendo que logo após um loop é realizado nos IDs obtidos.

Para cada item do loop, é adicionado a variável destinátarios, responsável por coletar tais IDs nos quais a notificação será direcionada.

Para cada item do loop, é adicionado a variável destinátarios, responsável por coletar tais IDs nos quais a notificação será direcionada.

Após, finalizando o ciclo, as informações coletadas são adicionadas à uma ação de notificação, momento no qual ela é disparada.

Após, finalizando o ciclo, as informações coletadas são adicionadas à uma ação de notificação, momento no qual ela é disparada.

Na plataforma

Untitled

A princípio, o fluxo é acionado quando um registro do objeto Despesa é criado, sendo que logo após uma ação é chamada.

A princípio, o fluxo é acionado quando um registro do objeto Despesa é criado, sendo que logo após uma ação é chamada.

Após, a notificação, a fila da aprovação e os membros do grupo são obtidos através do método get. Isso será importante no futuro, durante o loop

Após, a notificação, a fila da aprovação e os membros do grupo são obtidos através do método get. Isso será importante no futuro, durante o loop

Após, cada membro do grupo obtido acima, é enviado uma notificação da despesa para aprovação, encerrando, desta maneira, o presente fluxo.

Após, cada membro do grupo obtido acima, é enviado uma notificação da despesa para aprovação, encerrando, desta maneira, o presente fluxo.

Fluxo “Event - Criar compromisso de viagem”

Descrição
Para atender ao Exercício proposto na segunda semana, elaboramos um fluxo onde, a cada viagem registrada na organização pelo colaborador, automaticamente é gerado um compromisso/evento. Esse evento, além de combinar as informações dos destinos de ida e volta no título, notifica o representante sobre sua criação. Adicionalmente, bloqueia a possibilidade de agendamento de outros eventos para a data programada da viagem, assegurando que a agenda permaneça reservada para esse período específico.
Cenário
A XYZ Corp implementou um novo fluxo para melhor gerenciar as viagens de seus funcionários. Quando Ana, uma gerente de projeto, insere uma nova viagem no sistema, um evento é automaticamente criado e os detalhes da viagem, incluindo os destinos de ida e volta, são incorporados ao título do evento. João, o CEO, recebe uma notificação instantânea sobre o evento. Além disso, o sistema bloqueia automaticamente a data da viagem, evitando o agendamento de outros eventos, garantindo que João esteja disponível e informado sobre os compromissos de viagem de sua equipe.
Conclusão
A incorporação desse novo fluxo na XYZ Corp transformou a maneira como a empresa gerencia as viagens de seus colaboradores. Agora, com uma automação que não apenas registra detalhadamente cada viagem, mas também comunica eficientemente as informações pertinentes aos stakeholders, a empresa viu uma melhoria significativa na coordenação e na eficiência operacional. Este sistema se provou essencial para evitar sobreposições de agendamento e garantir que todas as partes relevantes estejam devidamente informadas e preparadas para os compromissos de viagem agendados. A XYZ Corp beneficia-se agora de um processo mais fluido, transparente e eficiente, otimizando a produtividade e a comunicação interna.

Na plataforma

No primeiro momento, acionado após a criação ou atualização do registro de Viagem, através do método Get, é obtido todos os registros do objeto Compromisso que se adequem as condições inseridas. Assim foi feito com intuito de verificar quais compromissos encontram-se entre aquela data cadastrada para viagem.

Após, tais registros são submetidos a um loop de interação, de modo a verificar se se trata de atualização (compromisso já existente) ou de novo compromisso. Assim foi realizado devido ao fato de que o Fluxo é acionado tanto na inserção de novos registos quanto atualização de preexistentes.

Após o último registro submetido ao loop citado acima, uma decisão pelo Flow é realizada, de modo a verificar se existe eventos naquela data. Para tanto, utilizada da variável ContadordeEventos, responsável por acordar os registros da viagem obtidos logo no início do Flow.

Caso se verifique que a agenda está livre, sem compromissos na data da viagem, após é submetido a nova decisão, de modo a verificar se trata de atualização do registro de viagem ou nova viagem.

Caso se trata de nova viagem, o Fluxo já parte para a parte final, no qual novo registro será criado no objeto compromisso.

Para tanto, são adicionados as informações da viagem, devidamente obtidas logo no início do Fluxo, são atribuídas ao registro do objeto Compromisso.

Após, através do getRecords, é obtido o modelo de Email, que se encontra cadastrado no “Modelos de Email Classic” do Salesforce que será enviado ao usuário final.

Após, um email é enviado, finalizando o fluxo.

Caso se trate de uma atualização de um registro de viagem preexistente, o fluxo é direcionado para atualização do registro com as informações obtidas ao início do fluxo principal, de modo a atualizar o registro de viagem, notificar a atuaçização, enviar notificação sobre o sucesso da operação, obter os emails necessários e enviar o email informando a alteração do evento.

Caso se verifique que existem registros de compromissos na data da viagem cadastrada, através do método GetRecords é obtido o ID das notificações para posterior envio de impossibilidade de criação do evento.

Após, ocorre a atribuição dos destinátários da notificação, enviando a notificação de agenda indisponível:

Texto do corpo da notificação: A viagem: {!$Record.Name} precisa ser ajustada, já existe um compromisso no intervalo de datas informado.

Fluxo “Event Cria Evento Viagem Apex”

Cenário
A XYZ Corp, buscando expandir a eficiência de seu sistema de gestão de viagens, integrou o uso de APEX para otimizar ainda mais o processo. Quando Carlos, um engenheiro de software, registra uma viagem no sistema, APEX é acionado, e um evento detalhado, contendo as informações de ida e volta, é automaticamente criado. Maria, a diretora de engenharia, recebe uma notificação instantânea e a data da viagem é bloqueada no calendário para evitar conflitos de agendamento.
Explicação
No seguimento do exercício da segunda semana, outro desafio foi proposto: recriar o fluxo de criação de compromisso de viagem utilizando APEX, permitindo assim uma imersão mais profunda nessa ferramenta. O objetivo era replicar a funcionalidade do fluxo original, onde um compromisso/evento é automaticamente gerado cada vez que uma viagem é registrada, assegurando a notificação ao representante e a reserva da data na agenda.
Conclusão
A adaptação do fluxo para o ambiente APEX na XYZ Corp não apenas validou a versatilidade da empresa em utilizar diferentes plataformas tecnológicas, mas também reforçou a eficácia do processo de gestão de viagens. A automação, detalhamento e comunicação aprimorados asseguram que cada viagem seja documentada e comunicada de maneira eficiente, garantindo que todos os stakeholders estejam sincronizados. Com APEX, a XYZ Corp aprimorou ainda mais a transparência, a coordenação e a eficiência na administração de viagens corporativas, reafirmando seu compromisso com a inovação e a excelência operacional.
  • Na plataforma:

Fluxo acionado pela criação de algum registro do objeto Viagem. Acionando o código Apex abaixo, fazendo com que um evento de viagem seja inserido no calendário:

Fluxo acionado pela criação de algum registro do objeto Viagem. Acionando o código Apex abaixo, fazendo com que um evento de viagem seja inserido no calendário:

public class CriaEventoViagem {
    @InvocableMethod(label='Cria Evento para Viagem' description='Cria Evento para Viagem' category ='Viagem__c')
   public static void criarEventoDataViagem(List<Viagem__c> novasViagens){

        List<Event> eventos = new List<Event>();

        for(Viagem__c viagem :novasViagens){
            Event evento = new Event();
            evento.Subject = viagem.Origem__c + ' - ' + viagem.Destino__c;
            evento.ActivityDateTime = viagem.DataHoraIda__c;
            evento.EndDateTime = viagem.DataHoraVolta__c;
            evento.WhatId = viagem.Id;
            evento.WhoId = viagem.Colaborador__c;
            eventos.add(evento);

        }
       system.debug('EVENTOS: ' + eventos);
       insert eventos;

        }

        }

Apex


Controller de Pagamentos

Descrição
O código apresentado é uma classe do Apex no Salesforce que facilita a gestão de pagamentos, clientes ativos, viagens e despesas. Ele é composto por métodos AuraEnabled que permitem a interação entre os componentes Aura/Lightning Web Components (LWC) e o back-end do Salesforce. O código é responsável por recuperar clientes ativos, obter detalhes de viagens e despesas com base em critérios específicos e criar registros de pagamento.
Cenário
Considerando uma empresa que utiliza o Salesforce para gerir seus clientes, viagens e despesas, este código seria essencial para automatizar e otimizar o processo de recuperação de dados e criação de pagamentos. Por exemplo, quando um cliente deseja visualizar suas viagens e despesas pendentes em um período específico, esta classe Apex pode ser invocada para fornecer os dados necessários de forma eficiente. Além disso, também facilita a criação de registros de pagamento associados a viagens e despesas específicas.
Conclusão
Esta classe Apex é um recurso valioso para qualquer organização que busca eficiência, precisão e automação na gestão de seus pagamentos e dados relacionados. Com os métodos bem definidos, a recuperação de dados e a criação de registros de pagamento se tornam tarefas simplificadas, permitindo que a empresa se concentre em aspectos mais estratégicos do negócio. A integração com componentes Aura/LWC garante uma experiência de usuário otimizada, tornando o processo não apenas funcional, mas também intuitivo para os usuários finais.
  • Na plataforma:
public class PagamentosGestaoController {

    //AuraEnabled feito para comunicar o LWC ou o component Aura com o APEX

    @AuraEnabled(cacheable=true)
    public static List<Account> getClientesAtivos(){
        return [SELECT Name 
                  FROM Account 
                  WHERE Status__c = 'Ativa' 
                  AND RecordType.Name = 'Cliente'];

    }

    @AuraEnabled
    public static List<Viagem__c> getViagens(Id contaId, Date dataInicio, Date dataFim){

        return [SELECT Origem__c, Destino__c, Custo__c, 
                        DataHoraIda__c, DataHoraVolta__c,
                        Colaborador__r.Name, Colaborador__r.FirstName
                FROM Viagem__c
                   WHERE 
                    DataHoraIda__c >= :dataInicio 
                AND DataHoraIda__c <= :dataFim
                AND Cliente__c = :contaId
                AND Pagamento__c = null
                ORDER BY DataHoraIda__c
               ];
    }

    @AuraEnabled
    public static List<Despesa__c> getDespesas(Id contaId, Date dataInicio, Date dataFim){

        return [SELECT Custo__c, DataDespesa__c, Descricao__c, Colaborador__r.Name, Colaborador__r.FirstName
                FROM Despesa__c
                   WHERE 
                    DataDespesa__c >= :dataInicio 
                AND DataDespesa__c <= :dataFim
                AND Cliente__c = :contaId
                AND Pagamento__c = null
                ORDER BY DataDespesa__c
               ];
    }

    @AuraEnabled
    public static Pagamento__c criarPagamento(Id contaId, List<Viagem__c> viagens, List<Despesa__c> despesas){

        Pagamento__c pagamento = new Pagamento__c();
        pagamento.Cliente__c = contaId;        
        pagamento.Status__c = 'Aguardando Pagamento';
        insert pagamento;

        Decimal valorTotalCustoViagem = 0;
        if(!viagens.isEmpty()){

            for(Viagem__c viagem : viagens){
                viagem.Pagamento__c = pagamento.Id;
                valorTotalCustoViagem += viagem.Custo__c;
            }
            update viagens;
        }

        Decimal valorTotalCustoDespesa = 0;
        if(!despesas.isEmpty()){
            for(Despesa__c despesa : despesas){
                despesa.Pagamento__c = pagamento.Id;
                valorTotalCustoDespesa += despesa.Custo__c;
            }
            update despesas;
        }

        pagamento.ValorTotalViagens__c = valorTotalCustoViagem;
        pagamento.ValorTotalDespesas__c = valorTotalCustoDespesa;
        update pagamento;

        //update new Pagamento__c(Id=pagamento.Id, ValorTotalViagens__c=valorTotalCustoViagem, ValorTotalDespesas__c=valorTotalCustoDespesa);

        Formula.recalculateFormulas(new List<Pagamento__c>{pagamento});

        System.debug('VALOR TOTAL PAGAMENTO ' + pagamento.ValorTotal__c);

        return pagamento;        
    }

    //Não está sendo usado, mas fiz para que vocês possam estudar como retornar uma classe customizada para um LWC ou AURA especifico
    public class Pagamento{
        @AuraEnabled
        public Id pagamentoId;
        @AuraEnabled
        public Decimal valorTotal;

        public Pagamento(Id pagamentoId, Decimal valorTotal){
            this.pagamentoId = pagamentoId;
            this.valorTotal = valorTotal;
        }
    }    
}

Criar Evento Viagem

Vide“Fluxo “Event Cria Evento Viagem Apex”

Controller do Gerador PDF de Pagamentos

Descrição
Este código pertence a uma classe controladora Apex em Salesforce que é especificamente utilizada para manipular e apresentar dados em uma página Visualforce que serve como um PDF. Ele se concentra em recuperar e formatar os dados do Pagamentoc, Viagemc, Despesac, e Account para serem exibidos no PDF. Aqui, Pagamentoc, Viagemc, Despesac, e Account são objetos personalizados em Salesforce. O método construtor ControllerPagamentoPDF() é responsável por inicializar os dados quando a página é carregada. Ele faz isso recuperando os IDs de pagamento e conta dos parâmetros da página e, em seguida, utiliza esses IDs para buscar os registros correspondentes do banco de dados.
Cenário
Suponha uma empresa que usa Salesforce para rastrear pagamentos, viagens e despesas. Eles precisam de uma forma automatizada de gerar faturas ou recibos em PDF para cada pagamento feito. Este código facilitará a geração automática desses documentos, garantindo que todas as informações necessárias, como detalhes do pagamento, informações da conta e dados do usuário, sejam recuperadas e exibidas de forma clara e precisa no documento PDF.
Conclusão
A classe ControllerPagamentoPDF é um recurso vital para automatizar e otimizar o processo de geração de documentos PDF em Salesforce. A sua aplicação garante que os documentos sejam criados de forma eficiente, contendo todas as informações necessárias e precisas. Assim, a empresa pode garantir a consistência, a precisão e a profissionalidade dos documentos fornecidos aos clientes ou utilizados internamente, economizando tempo e recursos significativos no processo.
  • Na plataforma:
public class ControllerPagamentoPDF {

    public Pagamento__c Pagamento {get; set;}

    public Viagem__c Viagem {get; set;}

    public Despesa__c Despesa {get; set;}

    public String PagamentoId {get;set;}

    public Account Account {get; set;}

    public String AccountId {get;set;}

    public string userName {get;set;}

    public String dt {get;set;}

    public ControllerPagamentoPDF(){

            this.PagamentoId = apexpages.currentpage().getparameters().get(PagamentoId);

         if(this.PagamentoId!=null) {

             this.PagamentoId = [SELECT Id FROM Pagamento__c WHERE Id =: this.PagamentoId LIMIT 1].Id;
//
            this.AccountId = apexpages.currentpage().getparameters().get(AccountId);

         if(this.AccountId!=null) {

             this.AccountId = [SELECT Id FROM Account WHERE Id =: this.AccountId LIMIT 1].Id;
//             

             this.userName=userinfo.getName();

             this.dt= date.today().format();        

        }

    }

}
}

Visual Force Page


  • Gerador de pagamento PDF

Descrição
O código apresentado é um exemplo de uma página Visualforce no Salesforce que é renderizada como um PDF. Este é um recurso útil quando você precisa gerar documentos PDF dinamicamente a partir dos dados no Salesforce. O exemplo mostra uma fatura sendo criada para uma conta, exibindo informações como o nome da conta, a data de criação, o contato e o e-mail. A página usa estilos CSS para formatar o layout e o conteúdo do PDF gerado.
Cenário
A CSPlane, que precisa enviar faturas mensais aos seus clientes. Ao invés de fazer isso manualmente, eles podem utilizar esse código para gerar automaticamente faturas em PDF. Quando um cliente faz um pagamento, um funcionário da CSPlane pode simplesmente acessar o registro de conta correspondente no Salesforce, e um PDF detalhado e formatado é gerado com todas as informações necessárias, pronto para ser enviado ao cliente.
Conclusão
A utilidade desse código é evidente em ambientes empresariais que requerem eficiência e precisão na criação de documentos. Ele não apenas economiza tempo, eliminando a necessidade de criar faturas manualmente, mas também reduz os erros humanos, garantindo que os clientes recebam informações precisas e consistentes. A personalização adicional pode ser integrada conforme necessário, tornando esta solução escalável e adaptável às necessidades em constante evolução dos negócios.
  • Na plataforma:
<apex:page controller="ControllerPagamentoPDF" applyHtmlTag="false" showHeader="false" renderAs="PDF">
    <html>
        <head>
            <style type="text/css">
                .header {
                    font-family: sans-serif;
                    padding-bottom: 30px;
                    width: 100%;
                }
                .logo {
                    width: 180px;
                    height: 90px;
                }
                .company-name {
                    font-size: 22pt;
                    padding-left: 10px;
                    padding-right: 140px;
                }
                .title {
                    font-size: 22pt;
                }
                .table {
                    font-family: sans-serif;
                    font-size: 12px;
                    width: 100%;
                }
                .table-header {
                    color: #fff;
                    background-color: rgb(3, 175, 243);
                }
                .table-header th {
                    padding-left: 5px;
                    padding-right: 170px;
                }
                .table-row td {
                    padding-left: 5px;
                    height: 30px;
                }
                .table-row td.width-35 {
                    width: 35%;
                }
                .table-row td.width-40 {
                    width: 40%;
                    text-align: right;
                }
            </style>
        </head>
        <body>
            <table class="header">
                <tr>
                    <td><apex:image id="logo2" value="{!$Resource.csplogo}" width="180" height="90"/></td>
                    <td class="company-name">CSPlane</td>
                    <td class="title">FATURA</td>
                </tr>
            </table>
            <br></br>
            <table class="table">
                <tr class="table-header">
                    <th>Bill To</th>
                </tr>
                <tr class="table-row">
                    <td class="width-35"><apex:outputField value="{!Account.Name}"/></td>
                    <td class="width-40">Created Date</td>
                    <td class="padding-left:5px;">{!dt}</td>
                </tr>
                <tr class="table-row">
                    <td class="width-35"><apex:outputField value="{!Account.BillingStreet}"/></td>
                    <td class="width-40">Contact Name</td>
                    <td class="padding-left:5px;">{!Account.Name}</td>
                </tr>
                <tr class="table-row">
                    <td class="width-35"><apex:outputField value="{!Account.BillingState}"/></td>
                    <td class="width-40">Email</td>    
                    <td class="padding-left:5px;">{!Account.Email__c}</td>
                </tr>
            </table>   
        </body>   
    </html>   
</apex:page>