5 versões 25 entradas Actualizado em 02/07/2026

Nenhuma novidade encontrada para esta pesquisa.

Reforço da segurança nas comunicações da API

Foram reforçadas as proteções de segurança nas respostas da API e deixou de ser possível aceder a funcionalidades protegidas sem autenticação ou sem licença válida em determinados cenários internos, aumentando a fiabilidade do controlo de acessos.

Impressão de documentos em fila para evitar conflitos

Os pedidos de impressão de documentos passam a ser processados em fila, um de cada vez, evitando problemas quando são pedidas várias impressões ao mesmo tempo.

Pasta de destino de PDFs configurável

É agora possível configurar a pasta onde os ficheiros PDF gerados são guardados, através de uma nova opção nas definições da aplicação.

Tratamento correto de pastas de PDF vazias

Quando não existe nenhum ficheiro PDF na pasta de destino configurada, a aplicação deixa de gerar um erro inesperado e passa a devolver uma mensagem clara a indicar que não foi encontrado qualquer ficheiro.

Filtragem por vários documentos e séries na consulta de transações

A consulta de transações de artigos passa a permitir indicar mais do que um documento ou série em simultâneo, devolvendo os resultados correspondentes a todas as combinações pedidas.

Correção na consulta de artigos e transações

Foram corrigidos vários erros na consulta e processamento de transações de artigos: a listagem de componentes de um artigo passa a respeitar a ordem correta, evita-se um erro ao processar clientes sem número de contribuinte definido e corrige-se um problema ocasional no registo de pagamentos com vale que podia impedir a conclusão do documento.

API – Help document

How to see swagger to check json Struture – Access http://locahost:PORT/swagger

Go to endpoint v1/itemTransaction for example, and you can see example value to structure (this endpoint is used for Sales and Purchase documents):

Using QUERY Endpoint to get data:

Sage 50c Database Tables Structure: https://smartdigit.pt/SageDataDicionary.html

QUERY Endpoint: http://locahost:PORT/swagger/ui/index#!/Query/Query_V2Post

How to retrieve exception logs:

SELECT TOP(10) * FROM UX_SD_LOGS

How to filter by date

SELECT i.itemID, ItemNames.Description, i.ItemPictureName, i.FamilyID, f.Description
FROM Item I
INNER JOIN ItemNames ON i.itemID = ItemNames.ItemID
INNER JOIN Family f ON f.FamilyID = i.FamilyID
WHERE ItemNames.LanguageID = 'PTG' AND
CONCAT(CONVERT(VARCHAR(10), i.DtAlt, 120),' ', CAST(CONVERT(VARCHAR,DATEADD(SECOND, i.HrAlt*86400, 0),108) AS TIME)) > '2021-02-20 10:00:00'

SELECT        ItemID, BarCode, BarCodeType, ColorID, SizeID, PropertyID1, Description, UnitPrice, UnitOfSaleID, MaximumDecimals, Quantity, FindON, ItemType
FROM            (SELECT        i.ItemID, i.BarCode, i.BarCodeType, ISNULL(c.ColorID, 0) AS ColorID, ISNULL(s.SizeID, 0) AS SizeID, ISNULL(i.PropertyID1, NULL) AS PropertyID1, [in].Description,
                                                    CASE WHEN ispS.UnitPrice > 0 THEN ispS.UnitPrice ELSE isp.UnitPrice END AS UnitPrice, i.UnitOfSaleID, um.MaximumDecimals, NULL AS Quantity, 1 AS FindON, i.ItemType
                          FROM            dbo.Item AS i INNER JOIN
                                                    dbo.ItemNames AS [in] ON i.ItemID = [in].ItemID AND [in].LanguageID =
                                                        (SELECT        DefaultLanguageID
                                                          FROM            dbo.ConfSystem) INNER JOIN
                                                    dbo.UnitOfMeasure AS um ON um.UnitOfMeasureID = i.UnitOfSaleID INNER JOIN
                                                    dbo.ItemSellingPrices AS isp ON i.ItemID = isp.ItemID AND isp.PriceLineID = 1 AND isp.SizeID = 0 LEFT OUTER JOIN
                                                    dbo.ItemColor AS c ON i.ItemID = c.ItemID LEFT OUTER JOIN
                                                    dbo.ItemSize AS s ON i.ItemID = s.ItemID LEFT OUTER JOIN
                                                    dbo.ItemSellingPrices AS ispS ON i.ItemID = ispS.ItemID AND ispS.PriceLineID = 1 AND ispS.SizeID = s.SizeID
                          WHERE        (i.Discontinued = 0)
                          UNION
                          SELECT        POSi.ItemID, POSi.POSItemID, POSi.BarCodeType, ISNULL(POSi.ColorID, 0) AS ColorID, ISNULL(POSi.SizeID, 0) AS SizeID, ISNULL(i.PropertyID1, NULL) AS PropertyID1,
                                                   CASE WHEN POSi.Description <> '' THEN POSi.Description ELSE [in].Description END AS Description,
                                                   (CASE WHEN POSi.SalePrice > 0 THEN POSi.SalePrice ELSE (CASE WHEN ispS.UnitPrice > 0 THEN ispS.UnitPrice ELSE isp.UnitPrice END) END) AS UnitPrice, POSi.UnitOfMeasure, um.MaximumDecimals,
                                                   POSi.Quantity, 3 AS FindON, i.ItemType
                          FROM            dbo.POSIdentity AS POSi INNER JOIN
                                                   dbo.Item AS i ON POSi.ItemID = i.ItemID INNER JOIN
                                                   dbo.ItemNames AS [in] ON POSi.ItemID = [in].ItemID AND [in].LanguageID =
                                                       (SELECT        DefaultLanguageID
                                                         FROM            dbo.ConfSystem) INNER JOIN
                                                   dbo.UnitOfMeasure AS um ON um.UnitOfMeasureID = POSi.UnitOfMeasure INNER JOIN
                                                   dbo.ItemSellingPrices AS isp ON POSi.ItemID = isp.ItemID AND isp.PriceLineID = 1 AND isp.SizeID = POSi.SizeID LEFT OUTER JOIN
                                                   dbo.ItemSellingPrices AS ispS ON POSi.ItemID = ispS.ItemID AND ispS.PriceLineID = 1 AND ispS.SizeID = POSi.SizeID
                          WHERE        (POSi.POSItemID <> '') AND (i.Discontinued = 0)) AS T

CONCAT(CONVERT(VARCHAR(10), i.DtAlt, 120),' ', CAST(CONVERT(VARCHAR,DATEADD(SECOND, i.HrAlt*86400, 0),108) AS TIME)) > '2021-02-20 10:00:00'

Item list filtered by the language PTG and the date of the last change

dfsdf

SELECT i.itemID, ItemNames.Description, i.ItemPictureName, i.FamilyID, f.Description
FROM Item I
INNER JOIN ItemNames ON i.itemID = ItemNames.ItemID
INNER JOIN Family f ON f.FamilyID = i.FamilyID
WHERE ItemNames.LanguageID = 'PTG' AND
CONCAT(CONVERT(VARCHAR(10), i.DtAlt, 120),' ', CAST(CONVERT(VARCHAR,DATEADD(SECOND, i.HrAlt*86400, 0),108) AS TIME)) > '2021-02-20 10:00:00'

SELECT        ItemID, BarCode, BarCodeType, ColorID, SizeID, PropertyID1, Description, UnitPrice, UnitOfSaleID, MaximumDecimals, Quantity, FindON, ItemType
FROM            (SELECT        i.ItemID, i.BarCode, i.BarCodeType, ISNULL(c.ColorID, 0) AS ColorID, ISNULL(s.SizeID, 0) AS SizeID, ISNULL(i.PropertyID1, NULL) AS PropertyID1, [in].Description,
                                                    CASE WHEN ispS.UnitPrice > 0 THEN ispS.UnitPrice ELSE isp.UnitPrice END AS UnitPrice, i.UnitOfSaleID, um.MaximumDecimals, NULL AS Quantity, 1 AS FindON, i.ItemType
                          FROM            dbo.Item AS i INNER JOIN
                                                    dbo.ItemNames AS [in] ON i.ItemID = [in].ItemID AND [in].LanguageID =
                                                        (SELECT        DefaultLanguageID
                                                          FROM            dbo.ConfSystem) INNER JOIN
                                                    dbo.UnitOfMeasure AS um ON um.UnitOfMeasureID = i.UnitOfSaleID INNER JOIN
                                                    dbo.ItemSellingPrices AS isp ON i.ItemID = isp.ItemID AND isp.PriceLineID = 1 AND isp.SizeID = 0 LEFT OUTER JOIN
                                                    dbo.ItemColor AS c ON i.ItemID = c.ItemID LEFT OUTER JOIN
                                                    dbo.ItemSize AS s ON i.ItemID = s.ItemID LEFT OUTER JOIN
                                                    dbo.ItemSellingPrices AS ispS ON i.ItemID = ispS.ItemID AND ispS.PriceLineID = 1 AND ispS.SizeID = s.SizeID
                          WHERE        (i.Discontinued = 0)
                          UNION
                          SELECT        POSi.ItemID, POSi.POSItemID, POSi.BarCodeType, ISNULL(POSi.ColorID, 0) AS ColorID, ISNULL(POSi.SizeID, 0) AS SizeID, ISNULL(i.PropertyID1, NULL) AS PropertyID1,
                                                   CASE WHEN POSi.Description <> '' THEN POSi.Description ELSE [in].Description END AS Description,
                                                   (CASE WHEN POSi.SalePrice > 0 THEN POSi.SalePrice ELSE (CASE WHEN ispS.UnitPrice > 0 THEN ispS.UnitPrice ELSE isp.UnitPrice END) END) AS UnitPrice, POSi.UnitOfMeasure, um.MaximumDecimals,
                                                   POSi.Quantity, 3 AS FindON, i.ItemType
                          FROM            dbo.POSIdentity AS POSi INNER JOIN
                                                   dbo.Item AS i ON POSi.ItemID = i.ItemID INNER JOIN
                                                   dbo.ItemNames AS [in] ON POSi.ItemID = [in].ItemID AND [in].LanguageID =
                                                       (SELECT        DefaultLanguageID
                                                         FROM            dbo.ConfSystem) INNER JOIN
                                                   dbo.UnitOfMeasure AS um ON um.UnitOfMeasureID = POSi.UnitOfMeasure INNER JOIN
                                                   dbo.ItemSellingPrices AS isp ON POSi.ItemID = isp.ItemID AND isp.PriceLineID = 1 AND isp.SizeID = POSi.SizeID LEFT OUTER JOIN
                                                   dbo.ItemSellingPrices AS ispS ON POSi.ItemID = ispS.ItemID AND ispS.PriceLineID = 1 AND ispS.SizeID = POSi.SizeID
                          WHERE        (POSi.POSItemID <> '') AND (i.Discontinued = 0)) AS T

Get document identifiers and filter them by date

SELECT TransDocument, TransSerial, TransDocNumber, CONCAT(CONVERT(VARCHAR(10), DtAlt, 120),' ', CAST(CONVERT(VARCHAR,DATEADD(SECOND, HrAlt*86400, 0),108) AS TIME)) AS DtAlt FROM SaleTransaction 
WHERE CONCAT(CONVERT(VARCHAR(10), DtAlt, 120),' ', CAST(CONVERT(VARCHAR,DATEADD(SECOND, HrAlt*86400, 0),108) AS TIME)) > '2021-03-20 23:59:00'

Get list Open unpaid document of specific customer ordered by deferred payment date

SELECT CreateDate, DeferredPaymentDate, ContractReferenceNumber, TransSerial, TransDocument, TransDocNumber, TransInstallmentID, TotalAmount, TotalPendingAmount, DebitTotalAmount, CreditTotalAmount, PartyAccountTypeID, PartyAddressID
FROM CustomerLedgerAccount
  where TotalPendingAmount <> '0' and PartyID = '1'
  Order By DeferredPaymentDate

Manual (SmartAPI)

Minimum requirements:

  • .NET Framework 4.7.2
  • Database in SQL Server 2016 or above
  • Sage 2021 version or above

Introdução

A SmrtAPI é um produto que transforma toda a camada do sage numa WebAPI, conseguem com isso fazer qualquer operação que fazem em sage na SmartAPI.
Exemplos:
Criar/alterar/apagar Documentos
Criar/alterar/apagar Artigos
Criar/alterar/apagar qualquer tabela, documento
Comunicar guias á AT
Imprimir Documentos
Gerar Safts
e muito mais

Manual de instalação

O processo de instalação da extensibilidade é bastante simples. 
Pedimos ao utilizador que siga os passos abaixo indicados para instalar o produto SmartAPI.
Para a utilização a base de dados deve correr numa versão SQL Server 2016 ou superior.

Passo 1 – Instalação

Executar o exe de instalação do produto como administrador.

Irá ser apresentado o quadro de configuração, que irá servir para fazermos a ligação ao Sage

Versao Sage: Devemos selecionar se estamos a usar o 50c faturação ou 50c Loja
Empresa: ID/Nome da empresa (a mesma definida na area de sistema do sage)
Chave de Licença: Chave de licenciamento da aplicação SmartAPI
ID da Máquina: Caso pretendamos que o serviço use um machideID diferente do servidor, devemos indicar qual o machineID definido na conf de postos do Sage. (opcional)
Nome do Serviço: Nome a dar ao serviço (opcional)

Uma vez instalada a SmartAPI com sucesso, podemos verificar que foi criado um serviço no windows de nome SmartAPI.Sage50cLoja

Esse serviço é responsável por colocar em funcionamento toda a SmartAPI, para verificarmos se a API está em fucnionamento depois de garantir que o serviço está a correr sem problemas, na maquina onde foi instalada a smartAPI devemos abrir o seguinte link no browser http://localhost:5581/swagger/ui/index

Irá ser mostrado o swagger da api onde têm ativos todos os endpoints que o licencimaneto pedido tem acesso.

NOTAS
Caso pretendam alterar a API_KEY ou a porta default (5581) da SmartAPI devem editar o seguinte ficheiro
C:\SmartApps\API\Service\SmartAPI.ini



nesse ficheiro encontramos as seguintes settings
X-API-KEYS=pass de acesso á api, caso coloquem varias senhas, devem separar as mesmas por ponto e virgula, ficando algo como A-API-KEYS=DEMO1;DEMO2;DEMO3
APIPort=porta usada pela SmartAPI

De notar que qualquer alteração que façam ao ficheiro em questão, devem reiniciar o serviço SmartAPI, para que as novas configurações sejam carregadas no arranque.





x- Install SSL

Instalação

Após instalação da SmartAPI abrir o powershell como administrador,
posicionar na pasta \SelfHostSSL dentro da instalação da smartapi
cd C:\SmartApps\API_testes\Service\SelfHostSSL

executar o seguinte comando
powershell -ExecutionPolicy Bypass -File .\SelfhostCertificate.ps1

vai perguntar qual a porta que pretendemos usar, selecionamos a mais indicada

feito isso o certificado é instalado com sucesso.

Devemos agora alterar o SmartAPI.ini
alterar a porta para a indicada, e adicionar a TAG APIProtocol=https ao ficheiro

Reiniciar a API e está pronta para https





x- Create Cloudflare Tunnel

Instalação

executar o CloudflareProvisioner.exe, esse exe deve ser executado e gerido pela smartdigit
na instalação é questionado qual o endereço CNAME a usar e o endereço local da api e respetiva porta

no final da instalação é criado o tunel com sucesso

podemos agora validar o acesso




Downloads

Ficheiro Tamanho Data
API202302001.v21.05.05.exe 154 MB 10/07/2026 Descarregar
API202302001.v21.05.04.exe 154 MB 25/06/2026 Descarregar
API202302001.v21.05.03.exe 152 MB 29/04/2026 Descarregar