Rotinas e telas
Novas rotinas e telas que encaixam no fluxo do usuário.
- Cadastros MVC
- Browses e wizards
- Pontos de entrada
A Ventura Lab desenvolve customizações em AdvPL e TLPP para empresas que precisam que o ERP siga o processo delas, e não o contrário. Do levantamento à entrega, com código limpo e documentado.
#include "tlpp-core.th"#include "tlpp-rest.th" namespace ventura.lab // Regra de negócio do cliente, exposta via API@Get("/api/v1/pedido/status")User Function PedStatus() Local oResp := JsonObject():New() oResp["status"] := "entregue" oResp["prazo"] := "no combinado" oRest:setResponse( oResp:toJson() )Return .T.
Se algum destes cenários parece familiar, o Protheus de vocês tem espaço para trabalhar melhor.
Controle paralelo em planilha porque o Protheus "não tem essa tela".
Cadastro MVC dentro do ERP, integrado ao resto do processo.
Relatório exportado, filtrado e montado na mão todo fim de mês.
TReport com os filtros e o layout que a gestão realmente usa.
Dado digitado duas vezes: uma no Protheus, outra no outro sistema.
Integração via API REST, com log de cada envio.
Fonte antigo que ninguém quer mexer porque "pode quebrar tudo".
Code review, refatoração e documentação para evoluir sem medo.
Cada pedido da gestão vira um relatório novo, e ninguém consegue cruzar os dados sozinho.
Visões no SmartView: o próprio usuário filtra, agrupa e exporta.
Centenas de registros digitados um a um a partir de uma planilha.
Importação via ExecAuto, com as validações da rotina padrão e log de erros.
Equipe de campo liga para alguém consultar o Protheus por ela.
Tela web em PO UI, acessada pelo navegador ou pelo celular.
Aprovação parada esperando alguém lembrar de abrir o sistema.
Workflow por e-mail: o aprovador recebe, decide e o Protheus atualiza.
Rotina de fechamento que leva horas e trava os usuários.
Código e queries otimizados, com o ambiente analisado de ponta a ponta.
Atualização de release adiada há anos por medo de quebrar as customizações.
Virada planejada: fontes compatibilizados, testes em homologação e subida acompanhada.
Cada serviço é um protocolo: escopo claro, entrega testada e documentação que outro desenvolvedor consegue ler depois.
Novas rotinas e telas que encaixam no fluxo do usuário.
Informação certa, no formato que a operação usa.
Protheus conversando com outros sistemas e trabalhando sozinho.
O Protheus fora do SmartClient, no navegador e no celular.
Fontes existentes revisados, corrigidos e mais rápidos.
Release nova sem perder as customizações, e um ambiente que aguenta o dia a dia.
Trechos do tipo de código que a gente escreve todo dia. Escolha um experimento para ver.
Static Function ModelDef() Local oStru := FWFormStruct( 1, "ZA1" ) Local oModel := MPFormModel():New( "VLCAD01M", , {|o| VldTudo(o)} ) oModel:AddFields( "ZA1MASTER", , oStru ) oModel:SetPrimaryKey( { "ZA1_FILIAL", "ZA1_COD" } ) oModel:SetDescription( "Contratos de Serviço" )Return oModel // Validação final antes de gravarStatic Function VldTudo( oModel ) Local dFim := oModel:GetValue( "ZA1MASTER", "ZA1_DTFIM" )Return dFim >= dDataBase
Static Function ReportDef() Local oReport := TReport():New( "VLREL01", "Faturamento por Cliente",; "VLREL01", {|oRep| PrintReport(oRep)} ) Local oSec := TRSection():New( oReport, "Clientes", { "SA1" } ) TRCell():New( oSec, "A1_COD", "SA1" ) TRCell():New( oSec, "A1_NOME", "SA1" ) TRCell():New( oSec, "TOTAL", , "Total", "@E 999,999,999.99", 15 ) // Totalizador no fim da seção TRFunction():New( oSec:Cell("TOTAL"), , "SUM" )Return oReport
// Validação na confirmação do pedido de vendaUser Function MT410TOK() Local lRet := .T. If M->C5_TIPO == "N" .And. Empty( M->C5_XCONTR ) Help( , , "VLAB", , "Informe o contrato do cliente.", 1, 0 ) lRet := .F. EndIf Return lRet
// Job diário: avisa o financeiro sobre títulos vencidosUser Function VLJOB01( aParam ) Local cAlias := GetNextAlias() RpcSetEnv( aParam[1], aParam[2] ) BeginSql Alias cAlias SELECT E1_NUM, E1_CLIENTE, E1_SALDO FROM %table:SE1% WHERE E1_VENCREA < %exp:dDataBase% AND E1_SALDO > 0 EndSql EnviaAviso( cAlias ) RpcClearEnv()Return
// Objeto de negócio publicado no TOTVS SmartView@totvsFrameworkTReportsIntegratedProvider(active=.T., team="SIGAFAT", tables="SF2")Class VlFatCliente From IntegratedProvider Public Method new() as object Public Method getSchema() as objectEndClass Method getSchema() as object Class VlFatCliente self:addProperty( "cliente", "Cliente", "string", "Código", "F2_CLIENTE" ) self:addProperty( "total", "Total", "number", "Valor bruto", "F2_VALBRUT" )Return self:oSchema
// Recebe pedidos de um e-commerce ou outro sistema@Post("/api/vlab/v1/pedidos")User Function VLAPI02() Local jBody := JsonObject():New() Local cErro := jBody:FromJson( oRest:getBodyRequest() ) If !Empty( cErro ) oRest:setStatusCode( 400 ) Return oRest:setResponse( '{"erro":"JSON inválido"}' ) EndIf GravaPedido( jBody ) oRest:setStatusCode( 201 )Return oRest:setResponse( '{"status":"criado"}' )
// Importa uma linha da planilha como pedido de vendaStatic Function ImportaPed( cCliente, cLoja, cProd, nQtd ) Local aCab := {} Local aItens := {} Private lMsErroAuto := .F. aAdd( aCab, { "C5_TIPO", "N", Nil } ) aAdd( aCab, { "C5_CLIENTE", cCliente, Nil } ) aAdd( aCab, { "C5_LOJACLI", cLoja, Nil } ) aAdd( aItens, { { "C6_PRODUTO", cProd, Nil }, { "C6_QTDVEN", nQtd, Nil } } ) MSExecAuto( {|x, y, z| MATA410(x, y, z)}, aCab, aItens, 3 )Return !lMsErroAuto
// Tela web de aprovação usando a API do Protheus@Component({ selector: 'vl-aprovacoes', templateUrl: './aprovacoes.component.html' })export class AprovacoesComponent { readonly service = '/api/vlab/v1/pedidos?status=pendente'; readonly columns: PoTableColumn[] = [ { property: 'numero', label: 'Pedido' }, { property: 'cliente', label: 'Cliente' }, { property: 'total', label: 'Total', type: 'currency', format: 'BRL' } ]; readonly actions: PoPageAction[] = [ { label: 'Aprovar', action: () => this.aprovar() } ];}
// Antes: um DbSeek por nota, milhares de idas ao banco// Depois: uma query só, agregada no próprio bancoBeginSql Alias cAlias SELECT D2_CLIENTE, SUM(D2_TOTAL) TOTAL FROM %table:SD2% SD2 WHERE D2_FILIAL = %xFilial:SD2% AND D2_EMISSAO BETWEEN %exp:dIni% AND %exp:dFim% AND SD2.%notDel% GROUP BY D2_CLIENTEEndSql
Customização boa não é só funcionar hoje. É continuar funcionando na próxima atualização do Protheus.
Tudo via pontos de entrada, MVC e fontes próprios. As atualizações da TOTVS seguem seguras.
Nomes claros, padrão de projeto e comentários onde importa. Sem dependência de uma pessoa só.
Cada entrega vem com descrição do que foi feito, parâmetros criados e como testar.
Validação em ambiente de homologação com o usuário-chave antes de subir.
Mantemos o legado em AdvPL e escrevemos o novo em TLPP, com namespaces e REST nativo.
O mesmo conhecimento vira aula aberta na Ventura Academy. Transparência sobre como trabalhamos.
Quatro etapas, cada uma com uma entrega concreta. Sem surpresa no meio do caminho.
Entendemos o processo, o problema e o ambiente Protheus de vocês.
Escopo, prazo e valor fechados por escrito antes de qualquer linha de código.
Código seguindo as boas práticas TOTVS, validado em homologação.
Implantação acompanhada e documentação de tudo que foi feito.
O que a gente aprende desenvolvendo para clientes vira aula gratuita na Ventura Academy, o canal de ensino de AdvPL e TLPP.
Se você é dev e quer aprender Protheus na prática, comece por lá.
Trilhas de AdvPL e TLPP do zero ao avançado, com exemplos reais.
Sim. O trabalho é 100% remoto, com acesso ao ambiente de homologação de vocês ou a um ambiente fornecido pela equipe de TI.
Não. Toda customização é feita por pontos de entrada, rotinas próprias e MVC, para que as atualizações do Protheus não quebrem nada.
Depois do diagnóstico, enviamos uma proposta com escopo, prazo e valor fechados. Para demandas contínuas, também dá para combinar um pacote de horas mensal.
Sim. Criamos objetos de negócio em TLPP que alimentam relatórios, visões e tabelas dinâmicas no SmartView, e também levamos relatórios TReport existentes para lá.
Sim. Levantamos as customizações, ajustamos o que for incompatível com a nova release, testamos em homologação e acompanhamos a subida em produção. Também instalamos e configuramos ambientes.
Depende de como foram feitas. Levantamos as rotinas e telas customizadas, avaliamos o que é compatível com a nova arquitetura do SmartX e planejamos a adaptação ou a conversão do que precisar, sem parar a operação.
Conseguimos. Analisamos o ambiente e os fontes envolvidos, identificamos o gargalo (código, query, índice ou configuração) e otimizamos o que estiver travando a operação.
Dá. Começamos com um code review para entender o que existe, apontar riscos e propor o que corrigir primeiro.
Tudo o que está no escopo é entregue. Ajustes e novas demandas fora do escopo são orçados à parte, como um novo projeto ou dentro de um pacote de horas mensal.
Monte o briefing ao lado e mande pelo WhatsApp, ou fale direto por um dos canais.