Manuais
PHC GO Guia de Contexto e Termos PHC GO
 

Introdução


Este artigo explica o exemplo utilizado ao longo de todos os artigos da série Usa PHC CS, bem como o significado dos termos usados na explicação de cada artigo.

Os vários artigos desta série são fornecidos com o intuito de facilitar a transição da programação da framework PHC CS em Visual FoxPro para a framework PHC GO em .NET Framework, utilizando Visual Basic.

Recomenda-se a leitura dos artigos pela ordem indicada, de forma a apresentar as diversas tecnologias e técnicas de programação em sequência crescente de complexidade e funcionalidade.



    PHC GO


    O PHC GO é uma aplicação de gestão com módulos como faturação, compras, salários e outros que são semelhantes aos módulos de gestão existentes nas aplicações do PHC CS.

    Semelhantes a nível do negócio pois existe em ambos a figura do cliente, de uma fatura, o fornecedor e a compra, mas funcionam em cenários diferentes

    Têm por isso terminologias e estruturas diferentes, além disso, o PHC CS assenta numa tecnologia de computador pessoal e servidor comum, e o PHC GO é uma solução de nuvem (cloud).

    Add-ons


    No PHC GO, a customização faz-se numa instalação de PHC GO em modo de parceiro desenvolvedor, onde é construído um add-on que depois pode ser comercializado na loja de add-ons da PHC: https://phcsoftware.com/pt/phc-go-store

    Outra alterativa é a instalação direta numa aplicação de PHC GO de um cliente final, em modo privado, que não passa pela publicação na loja, este cenário é mais adequado quando o add-on é feito especificamente para as necessidades de uma empresa.

    O equivalente mais próximo no PHC CS são os templates disponíveis em Supervisor - Templates de Software. Um add-on agrupa diversas peças programadas na aplicação PHC GO na opção GO Studio – Toolbox.

    Propriedade Intelectual


    No PHC GO, existem dois locais onde se pode colocar código produzido pelos add-ons, no frontend em linguagem de programação TypeScript onde existe um SDK só para frontend (.sdk) e no backend em linguagem .Net Visual Basic onde também existe um SDK só para backend (.SDK).

    Na programação de frontend, o código é armazenado e executado no browser do cliente. Por ser interpretado e não compilado, este código não está completamente protegido contra acessos não autorizados, podendo ser visualizado através das ferramentas disponibilizadas pelos browsers ou por outras existentes.

    Para salvaguardar a propriedade intelectual dos programadores de add-ons, o SDK de frontend disponibiliza a função runBusinessRuleOnDemand. Esta função permite executar código a pedido no backend, alcançando vários objetivos: centralizar o código num único local, possibilitar o seu reaproveitamento entre diferentes ecrãs e, acima de tudo, protegê-lo contra acessos indevidos.

    O código de backend dos add-ons é compilado diretamente na DLL da aplicação do PHC GO. Diferentemente da framework do PHC CS, o código não está armazenado na base de dados nem acessível para visualização no frontend.

    Mais detalhes podem ser encontrados no manual: Usa PHC - SDK de add-ons.

    Terminologia


    Ao longo dos vários artigos desta série, utilizaremos alguns termos para nos referirmos a comportamentos técnicos da solução PHC GO, que são:

    • Cloud: Refere-se que a aplicação está alojada não no computador local do cliente, mas num servidor existente num datacenter na internet.

    • URL: (Uniform Resource Locator) Um URL se refere ao endereço de rede no qual se encontra algum recurso informático, no caso do PHC GO será o endereço para a cloud onde se encontra a aplicação backend.

    • Cliente Final: refere-se à instalação da empresa que adquiriu a aplicação PHC GO, a instalação resume-se a um URL de internet, único por cada aplicação do PHC GO existente na cloud, que o cliente coloca no seu browser para aceder á aplicação.

    • Browser: Quando é referido o navegador de internet que está a ser usado no frontend, ou seja, no computador do cliente final.

    • Frontend / Browser: Utilizado quando nos referimos à interface gráfica da aplicação PHC GO que está a ser executada no browser.

    • Backend / Servidor: Refere-se à aplicação alojada na cloud, que recebe pedidos do frontend, processa-os e devolve o resultado para o cliente final.

    • Entidade: Termo usado para designar as tabelas da base de dados no PHC GO.

    • Sistema: Utilizado quando nos referimos a um componente que faz parte integrante da aplicação PHC GO, como, por exemplo, a entidade de sistema documentos de faturação.

    • Utilizador: Pode referir-se ao utilizador que trabalha na aplicação PHC GO no cliente final, ou seja, um utilizador registado na aplicação, ou a uma customização aplicada por um addon, como, por exemplo, a entidade de utilizador "álbuns de música".

    • Case das Instruções: Pode referir-se ao utilizador que trabalha na aplicação PHC GO no cliente final, ou seja, um utilizador registado na aplicação, ou a uma customização aplicada por um addon, como, por exemplo, a entidade de utilizador "álbuns de música".

    • API / Engine: A aplicação do PHC GO tem uma API para cada entidade principal, excluindo as entidades filhas porque estas fazem parte da entidade principal, e essa API está disponível na internet para ser chamada utilizando REST.

      Cada API disponibiliza vários serviços relacionados com a sua entidade, desde os mais gerais, como criar, alterar, apagar ou consultar registos, até serviços mais específicos, como, por exemplo, assinar um documento de faturação.

      Este conjunto de APIs é denominado de Engine, que possui os seus próprios requisitos de autenticação e funcionamento. O engine é a forma como a aplicação backend se torna acessível na internet, permitindo ser chamada tanto pela aplicação frontend da PHC como por outras aplicações desenvolvidas por terceiros que integram com o PHC GO.

    • SDK Frontend / Backend: Existe uma série de funções disponíveis para serem utilizadas nas customizações quando estas aceitam código, nesse código pode-se utilizar a palavra chave sdk. (em minúsculas) para aceder ao SDK de frontend e SDK. para aceder ao SDK de backend.

      O SDK de frontend pode ser utilizado quando no local onde escrevemos o código, em baixo do lado direito tem uma tag com o nome Typescript e para o backend a tag diz VB.NET.


    Contexto


    Vamos utilizar o mesmo exemplo ao longo dos vários artigos do Usa PHC CS, assim, em cada artigo é abordado uma tecnologia e funcionalidade diferente, mas todos estão ligados entre si pelo mesmo contexto, facilitando a compreensão dos temas abordados.

    O nosso contexto envolve o desenvolvimento de uma aplicação destinada à gestão de uma coleção discográfica. Esta aplicação possui uma tabela principal, dedicada ao armazenamento dos álbuns existentes, e uma tabela secundária, destinada ao registo das músicas associadas a cada álbum.

    A tabela de álbuns funciona como o núcleo central da aplicação, armazenando informações essenciais sobre cada álbum, enquanto a tabela de músicas serve para detalhar as faixas individuais que compõem cada um desses álbuns.

    Dentro desta estrutura, a tabela de álbuns não só permite o registo e atualização de dados sobre os álbuns, como também facilita a ligação a múltiplas músicas, formando assim uma coleção organizada e facilmente navegável.

    Por exemplo, cada registo na tabela de álbuns pode incluir campos como o título do álbum, o artista, o ano de lançamento, e o género musical, enquanto a tabela de músicas associada pode incluir informações como o título da faixa, a duração, e a posição no álbum.

    Esta organização em tabelas relacionadas é fundamental para uma gestão eficiente da coleção discográfica, permitindo ao utilizador explorar de forma intuitiva as relações entre álbuns e as suas músicas.

    A aplicação poderá, ainda, ser expandida para incluir funcionalidades adicionais, como a capacidade de associar capas de álbuns, informações sobre artistas, ou até mesmo criar playlists baseadas nas músicas registadas, oferecendo assim uma ferramenta robusta e flexível para qualquer colecionador ou entusiasta de música

    Bandas / Cantores


    Cada registo da entidade u0000_singer representa uma banda ou interprete musical.

    ' Código PHC GO – VB.NET

    <AttTable("u0000_singer"), AttTableFlags(TableFlags.IsUserTable)>
    Public Class u0000_singerVO
    Inherits BusinessVO

    <AttLenght(80,0), AttList(OrderTypes.Ascending,1), AttLogInfo()>
    Public Property [nome]() As String

    <AttLenght(60,0), AttList(), AttLogInfo()>
    Public Property [genre]() As String

    <AttLenght(25,0), AttFieldStamp()>
    Public Property [u0000_singerstamp]() As String

    Public Property [remarks]() As String

    End Class

    Músicas


    Cada registo da entidade u0000_musica representa uma música da coleção discográfica, esta entidade é considerada uma entidade secundária (filha) pois faz parte da entidade principal u0000_album.

    Toda a gestão desta ligação entre o álbum e as suas músicas é feito automaticamente pela framework do PHC GO, sendo que as músicas são mostradas no ecrã correspondente é entidade de álbuns, não existindo um ecrã próprio para entidades secundárias.

    ' Código PHC GO – VB.NET

    <AttTable("u0000_musica"), AttTableFlags(TableFlags.IsUserTable)>
    Public Class u0000_musicaVO
    Inherits BusinessVO

    <AttLenght(80,0)>
    Public Property [nome]() As String

    <AttLenght(25,0), AttForeignKey(GetType(u0000_albumVO)), AttIndex()>
    Public Property [u0000_albumstamp]() As String

    <AttLenght(25,0), AttFieldStamp()>
    Public Property [u0000_musicastamp]() As String

    <AttParent(), XmlIgnore(), AttNotField()>
    Public Property parentVO As u0000_albumVO

    End Class

    Álbuns


    Cada registo da entidade u0000_album representa um álbum de uma determinada banda da entidade u0000_singer que inclui diversas músicas da entidade u0000_musica.

    Cada álbum tem uma única banda, é uma relação de um para um, definida pela seguinte expressão: u0000_album.singerstamp = u0000_singer. U0000_singerstamp.

    Cada álbum tem uma coleção interna de músicas guardada na propriedade u0000_musica, trata-se se uma ligação de um para muitos, cada álbum tem várias músicas, definida pela seguinte expressão: u0000_album. U0000_albumstamp = u0000_musica. U0000_albumstamp.

    ' Código PHC GO – VB.NET

    <AttTable("u0000_album"), AttTableFlags(TableFlags.IsUserTable)>
    Public Class u0000_albumVO
    Inherits BusinessVO

    <AttLenght(80,0), AttList(OrderTypes.Ascending,1), AttLogInfo()>
    Public Property [nome]() As String

    <AttLenght(1,0),AttList(),AttLogInfo()>
    Public Property [rarity]() As Boolean

    <AttLenght(2,0), AttMandatory(), AttList(), AttLogInfo(), AttSmartField()>
    Public Property [state]() As String

    <AttLenght(25,0),AttFieldStamp()>
    Public Property [u0000_albumstamp]() As String

    <AttLenght(0,0), AttList(), AttLogInfo()>
    Public Property [singername]() As String

    <AttLenght(60,0), AttList(), AttLogInfo()>
    Public Property [genre]() As String

    <AttLenght(25,0)>
    Public Property [singerstamp]() As String

    <AttLenght(60,0)>
    Public Property [stdesign]() As String

    <AttLenght(18,0)>
    Public Property [stref]() As String

    <AttLenght(25,0), AttForeignKey(GetType(ImageInfoVO))>
    Public Property [imgfront]() As String

    <AttLenght(25,0), AttForeignKey(GetType(ImageInfoVO))>
    Public Property [imgback]() As String

    <AttCollection(GetType(u0000_musicaVO))>
    Public Property u0000_musica As List(Of u0000_musicaVO)

    End Class

    Artigos e Serviços


    Estendemos também a entidade de artigos e serviços, para incluir um campo escondido que serve para conseguirmos detetar quando estamos a criar uma referência a partir da entidade de álbuns.

    <AttTable("u0000_st_album"), AttTableFlags(TableFlags.IsUserTable)>
    Public Class u0000_st_albumVO
    Inherits BusinessVO

    <AttLenght(25,0)>
    Public Property [albumstamp]() As String

    <AttLenght(25,0), AttForeignKey(GetType(StVO)), AttIndex()>
    Public Property [ststamp]() As String

    <AttLenght(25,0), AttFieldStamp()>
    Public Property [u0000_st_albumstamp]() As String

    <AttParent(), XmlIgnore(), AttNotField()>
    Public Property parentVO As FrameworkStVO

    End Class

    Public Class FrameworkStVO
    Inherits StVO

    <AttCollection(GetType(u0000_st_albumVO))>
    Public Property u0000_st_album As u0000_st_albumVO

    End Class