O protheus-lib-core é um pacote NPM cujo objetivo é facilitar a criação de apps voltados para o Protheus. Para isso, ele disponibiliza alguns serviços e interceptadores HTTP. 

Ele tem como base os pacotes do Angular e PO UI. Sua main version acompanha as versões do Angular e PO UI, logo a versão 14 do Protheus-lib-core tem como dependências as versões 14 do Angular e do PO UI.


Versões

Abaixo serão listados os recursos da biblioteca.



Comandos que permitem a integração de códigos ADVPL com códigos Javascript.

Repositório com exemplos




Esse recurso funciona apenas quando a aplicação é executada pelo Protheus. Para mais informações, clique aqui.

Para garantir melhor performance e boas práticas da aplicação, recomenda-se converter as informações disponibilizadas em serviços web.

Pré-requisitos

Para desenvolver essa integração, é necessário:

  1. Na aplicação web, criar o arquivo advpltojs.js em assets/preload. Esse arquivo irá receber e tratar as instruções ADVPL que foram enviadas.
  2. No fonte que chama a aplicação (utilizando a FwCallApp), criar uma Static Function com o nome JsToAdvpl. Essa função irá receber e tratar as instruções Javascript que foram enviadas. Importante: o fonte não pode ser tlpp, pois em tlpp não existe a chamada de funções estáticas.


Arquivo advpltojs.js na aplicação web

Esse arquivo deve conter uma função e javascript para receber e tratar as instruções ADVPL enviadas. Essa função deve receber dois parâmetros: codeType que indica qual o código da ação que foi definido e content que fornece a informação que deve ser tratada.

function(codeType, content) {
  // Se a interação que recebi for igual a mensagemProtheus
	if (codeType == 'mensagemProtheus') {
    // Eu dou um alert com a informação que recebi para trabalhar
		alert('Mensagem recebida do Protheus: ' + content);
	}
}


Static Function JsToAdvpl

Essa função recebe três parâmetros: oWebChannel que é o objeto do TWebEngine, cType que indica qual o código da ação que foi definido e cContent que fornece a informação que deve ser tratada.

Function callAppExample()
    FwCallApp('nome-do-app.app')
Return Nil

Static Function JsToAdvpl(oWebChannel,cType,cContent)
    Do Case
        // Se a interação que recebi for igual a mensagemJavascript
        Case cType == 'mensagemJavascript'
            // Imprimo no server a informação que recebi para trabalhar
            Conout(cContent)
    End
Return .T.


Enviando interações

  1. Para enviar as interações desejadas da aplicação web para o Protheus, utilizamos a função jsToAdvpl() do serviço ProJsToAdvplService disponibilizado pela biblioteca;
  2. Para enviar as interações desejadas do Protheus para a aplicação web, utilizamos o método AdvplToJs() disponibilizado pelo oWebChannel.


function(codeType, content) {
  // Se a interação que recebi for igual a mensagemProtheus
    if (codeType == 'mensagemProtheus') {
    // Eu dou um alert com a informação que recebi para trabalhar
        alert('Mensagem recebida do Protheus: ' + content);
    }
}
import { Component } from '@angular/core';
import { ProJsToAdvplService } from '@totvs/protheus-lib-core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'doc-lib-core';

  constructor(private proJsToAdvplService: ProJsToAdvplService) {}

  click1(): void {
    this.proJsToAdvplService.jsToAdvpl('mensagemJavascript', 'Comando Javascript')
  }

  click2(): void {
    this.proJsToAdvplService.jsToAdvpl('receberProtheus', '')
  }
}
Function doclibcore()
    FwCallApp("doc-lib-core")
Return
 
Static Function JsToAdvpl(oWebChannel,cType,cContent)
    Do Case
        // Se a interação que recebi for igual a mensagemJavascript
        Case cType == 'mensagemJavascript'
            // Imprimo a informação que recebi para trabalhar
            alert('O que veio do JS: ' + cContent)
        // Se a interação que recebi for igual a receberProtheus
        Case cType == 'receberProtheus'
            // Envio um comando ADVPL para minha aplicação Web
            oWebChannel:AdvPLToJS('mensagemProtheus', 'Comando ADVPL')
    End
Return .T.
ServiçoDescriçãoRetorno
ProAppConfigServiceFunção que fecha a aplicação webvoid

Parâmetros

NomeTipoDescriçãoObrigatórioDefault
askboolean

Indica se deve forçar (true) o fechamento ou não (false). Caso o valor seja false,

irá apresentar uma pergunta se deve fechar ou não o aplicativo.

Nãotrue

Exemplo

fechar(): void {
	this.proAppConfigService.callAppClose(true);
}
ServiçoDescriçãoRetorno
ProAdapterBaseV2ServiceFunção que retorna query params (aceitos pela FwAdapterBaseV2) no formato HttpParams.HttpParams

Parâmetros

NomeTipoDescriçãoObrigatórioDefault
pagenumber

Número da página

Não1
pageSizenumberQuantidade de registros a serem retornados na páginaNão20
filterstringFiltro a ser utilizado na requisiçãoNãoVazio
fieldsstringCampos a serem retornados pela requisiçãoNãoVazio
orderstringOrdenação a ser utilizada no retorno da requisiçãoNãoVazio

Exemplo

getCustomers(): Observable<ProAdapterBaseV2<Customer>> {
    const parameters = this.proAdapterBaseV2Service.getHttpParams(1, 10, "contains(name, 'TOTVS')", "id,name", '-id');
    return this.httpClient.get('seu endpoint', { params: parameters})
}
ServiçoDescriçãoRetorno
ProThreadInfoServiceRetorna id, username, nome e emails do usuário logadoObservable de ProUserInfo

Exemplo

getUserInfo(): void {
    this.proThreadInfoService.getUserInfoThread().subscribe({
      next: (res: ProUserInfo) => this.user = res
    });
  }
ServiçoDescriçãoRetorno
ProBranchServiceRetorna as filiais do usuárioObservable de ProBranchList

Parâmetros

NomeTipoDescriçãoObrigatórioDefault
descriptionstring

Descrição da filial

NãoVazio
pagenumberNúmero da páginaNão1
pageSizenumberQuantidade de registros a serem retornados na páginaNão10

Exemplo

getUserBranches(): void {
    this.proBranchService.getUserBranches('Filial 01', 1, 20).subscribe({
      next: res => this.branches = res
    });
  }
ServiçoDescriçãoRetorno
ProCompanyServiceRetorna as empresas do usuárioObservable de ProCompanyList

Parâmetros

NomeTipoDescriçãoObrigatórioDefault
corporateNamestring

Nome da empresa

NãoVazio
pagenumberNúmero da páginaNão1
pageSizenumberQuantidade de registros a serem retornados na páginaNão10

Exemplo

getUserCompanies(): void {
    this.proCompanyService.getUserCompanies('Empresa 01', 1, 20).subscribe({
      next: res => this.companies = res
    });
  }
ServiçoDescriçãoRetorno
ProUserAccessServiceRetorna se o usuário logado possui acesso a determinada rotina e/ou sub-rotinaObservable

Parâmetros

NomeTipoDescriçãoObrigatórioDefault
cRotinastring

Nome da rotina a ser pesquisada

Sim
nOpcnumberPosição no menudef da sub-rotina a ser pesquisada, caso não seja passado será feita a pesquisa de acesso considerando apenas a função baseNão

Exemplo

getAccess(){
    this.proUserAccessService.userHasAccess(this.cRotina).subscribe({
      next: ( acesso => {
	    const proUserAccess: ProUserAccessInterface = acesso as ProUserAccessInterface;
        console.log(acesso);
        this.poAlert.alert({title: cType , message: "Acesso: " + proUserAccess.access + "\n" + "Messagem: " + proUserAccess.message });
    })});
  }
{
    access: false,
    message: "Esse usuário não possui acesso para executar essa operação.\r\nMenu: MATA010 / Rotina: A010Inclui"
}
ServiçoDescriçãoRetorno
ProUserInfoServiceRetorna informações adicionais do usuário logadoObservable

Parâmetros:

Utiliza o usuário logado para efetuar a pesquisa

Exemplo

pswRet(){
    this.proUserInfoService.pswRet().subscribe(
      pswret => {
        const proUserPswRet: ProUserPswretInterface = pswret as ProUserPswretInterface;
        console.log(proUserPswRet);
        this.poAlert.alert({title: "okok" , message: proUserPswRet.user_id + " - " + proUserPswRet.user_name });
      }
    );
  }
{
    "user_id": "000000",
    "user_name": "Administrador",
    "user_full_name": "Administrador",
    "expiration_date": "00/00/00",
    "number_of_days_to_expire": 999,
    "authorization_to_change_the_password": true,
    "change_password_at_next_logon": false,
    "groups_array": [
        "000000"
    ],
    "superiors": "",
    "department": "",
    "position": "",
    "email": "[email protected]",
    "number_of_simultaneous_accesses": 99,
    "date_of_last_change": "2022/07/04",
    "user_blocked": false,
    "number_of_digits_for_the_year": 4,
    "listener_for_calls": false,
    "extension": "",
    "operation_log": "",
    "company_branch_and_registration": "",
    "allow_changing_system_database": true,
    "days_to_go_back": 0,
    "days_to_go_forward": 0,
    "date_of_inclusion_in_the_system": "2015/08/28",
    "global_field_level": 5,
    "access_times": [
        "00:00|23:59",
        "00:00|23:59",
        "00:00|23:59",
        "00:00|23:59",
        "00:00|23:59",
        "00:00|23:59",
        "00:00|23:59"
    ],
    "path_for_disk_printing": "\\SPOOL\\",
    "driver_for_direct_port_printing": "EPSON.DRV",
    "accesses": "SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNNNNNNNNNNSNSNNSNNSNSSNNSSSSSSSSNNNNNSSSSNNNSSSSSSSSSSSNNNNNNSNNNSNNSSSSSSSSSNNSSSNSSSSSSSSSSSSNSSNNSSNSSSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN",
    "companies_array": [
        "@@@@"
    ],
    "pe_useracs": "",
    "print_type": 1,
    "page_format": 1,
    "environment_type": 1,
    "prioritize_group_configuration": false,
    "print_option": "",
    "access_other_print_directories": false,
    "modules_array": [
        "015\\system\\SIGAATF.XNU",
        "025\\system\\SIGACOM.XNU",
        "035\\system\\SIGACON.xnu",
        "045\\system\\SIGAEST.XNU",
        "055SIGAFAT",
        "065\\system\\SIGAFIN.XNU",
        "075\\system\\SIGAGPE.XNU",
        "085\\system\\SIGAFAS.xnu",
        "095\\system\\SIGAFIS.XNU",
        "105\\system\\SIGAPCP.XNU",
        "115\\system\\SIGAVEI.XNU",
        "125\\system\\SIGALOJA.XNU",
        "135\\system\\SIGATMK.XNU",
        "145\\system\\SIGAOFI.XNU",
        "155\\system\\SIGARPM.xnu",
        "165\\system\\SIGAPON.XNU",
        "175\\system\\SIGAEIC.XNU",
        "185\\system\\SIGATCF.XNU",
        "195\\system\\SIGAMNT.XNU",
        "205\\system\\SIGARSP.XNU",
        "215\\system\\SIGAQIE.XNU",
        "225\\system\\SIGAQMT.XNU",
        "235\\system\\SIGAFRT.XNU",
        "245\\system\\SIGAQDO.XNU",
        "255\\system\\SIGAQIP.XNU",
        "265\\system\\SIGATRM.XNU",
        "275\\system\\SIGAEIF.xnu",
        "285\\system\\SIGATEC.XNU",
        "295\\system\\SIGAEEC.XNU",
        "305\\system\\SIGAEFF.XNU",
        "315\\system\\SIGAECO.XNU",
        "325\\system\\SIGAAFV.xnu",
        "335\\system\\SIGAPLS.XNU",
        "345\\system\\SIGACTB.XNU",
        "355\\system\\SIGAMDT.XNU",
        "365\\system\\SIGAQNC.XNU",
        "375\\system\\SIGAQAD.XNU",
        "385\\system\\SIGAQCP.xnu",
        "395\\system\\SIGAOMS.XNU",
        "405\\system\\SIGACSA.XNU",
        "415\\system\\SIGAPEC.XNU",
        "425\\system\\SIGAWMS.XNU",
        "435\\system\\SIGATMS.XNU",
        "445\\system\\SIGAPMS.XNU",
        "455\\system\\SIGACDA.XNU",
        "465\\system\\SIGAACD.XNU",
        "475\\system\\SIGAPPAP.XNU",
        "485\\system\\SIGAREP.XNU",
        "495\\system\\SIGAGE.XNU",
        "505\\system\\SIGAEDC.XNU",
        "515\\system\\SIGAHSP.XNU",
        "525\\system\\SIGAVDOC.xnu",
        "535\\system\\SIGAAPD.XNU",
        "545\\system\\SIGAGSP.XNU",
        "555\\system\\SIGACRD.XNU",
        "565\\system\\SIGASGA.XNU",
        "575\\system\\SIGAPCO.XNU",
        "585\\system\\SIGAGPR.XNU",
        "595\\system\\SIGAGAC.XNU",
        "605\\system\\SIGAPRA.XNU",
        "615\\system\\SIGAHGP.xnu",
        "625\\system\\SIGAHHG.xnu",
        "635\\system\\SIGAHPL.xnu",
        "645\\system\\SIGAAPT.XNU",
        "655\\system\\SIGAGAV.XNU",
        "665\\system\\SIGAICE.XNU",
        "675\\system\\SIGAAGR.XNU",
        "685\\system\\SIGAARM.xnu",
        "695\\system\\SIGAGCT.XNU",
        "705\\system\\SIGAORG.XNU",
        "715\\system\\SIGALVE.xnu",
        "725\\system\\SIGAPHOTO.XNU",
        "735\\system\\SIGACRM.XNU",
        "745\\system\\SIGABPM.XNU",
        "755\\system\\SIGAAPON.xnu",
        "765\\system\\SIGAJURI.XNU",
        "775\\system\\SIGAPFS.XNU",
        "785\\system\\SIGAGFE.XNU",
        "795\\system\\SIGASFC.XNU",
        "805\\system\\SIGAACV.xnu",
        "815\\system\\SIGALOG.xnu",
        "825\\system\\SIGADPR.XNU",
        "835\\system\\SIGAVPON.xnu",
        "845\\system\\SIGATAF.XNU",
        "855\\system\\SIGAESS.XNU",
        "865\\system\\SIGAVDF.XNU",
        "875\\system\\SIGAGCP.XNU",
        "885\\system\\SIGAGTP.xnu",
        "895\\system\\SIGATUR.xnu",
        "905\\system\\SIGAGCV.xnu",
        "915\\system\\SIGAPDS.XNU",
        "92X\\system\\SIGATFL.XNU",
        "93X\\system\\SIGACEN.XNU",
        "94X",
        "95X",
        "965\\system\\SIGAESP2.xnu",
        "975SIGAESP",
        "985\\system\\SIGAESP1.xnu",
        "995\\system\\SIGACFG.XNU"
    ]
}

Interface base para o retorno de APIs que utilizam a classe FwAdapterBaseV2.

Propriedades

PropriedadeTipo
itemsArray<T> - o T indica o tipo dos registros a serem retornados no array
hasNextboolean
remainingRecordsnumber