{"id":19663325,"url":"https://github.com/jonasaacampos/sportexperience","last_synced_at":"2026-03-02T07:32:28.731Z","repository":{"id":177045068,"uuid":"659741388","full_name":"jonasaacampos/SportExperience","owner":"jonasaacampos","description":"Desenvolvimento rotinas de uma empresa especializada em eventos esportivos. Foram consumidas 2 APIs, aberta 1 API para outros sistemas, criadas tabelas, páginas, com validação de campos e interação com o usuário. A aplicação foi escrita em inglês e possui tradução para o português do Brasil.","archived":false,"fork":false,"pushed_at":"2023-06-28T21:37:05.000Z","size":7681,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-22T07:17:02.612Z","etag":null,"topics":["application-language","business-central","erp","microsoft"],"latest_commit_sha":null,"homepage":"","language":"AL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonasaacampos.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-28T13:09:26.000Z","updated_at":"2023-06-28T21:43:43.000Z","dependencies_parsed_at":"2023-07-10T07:00:12.790Z","dependency_job_id":null,"html_url":"https://github.com/jonasaacampos/SportExperience","commit_stats":null,"previous_names":["jonasaacampos/sportexperience"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jonasaacampos/SportExperience","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonasaacampos%2FSportExperience","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonasaacampos%2FSportExperience/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonasaacampos%2FSportExperience/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonasaacampos%2FSportExperience/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonasaacampos","download_url":"https://codeload.github.com/jonasaacampos/SportExperience/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonasaacampos%2FSportExperience/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29995013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T01:47:34.672Z","status":"online","status_checked_at":"2026-03-02T02:00:07.342Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["application-language","business-central","erp","microsoft"],"created_at":"2024-11-11T16:14:11.290Z","updated_at":"2026-03-02T07:32:28.715Z","avatar_url":"https://github.com/jonasaacampos.png","language":"AL","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n   \u003ca href='https://github.com/jonasaacampos'\u003e\n      \u003cimg alt=\"\" src=\"https://img.shields.io/static/v1?color=blue\u0026label=dynamics365\u0026message=dynamics 365\u0026style=for-the-badge\u0026logo=dynamics365\"/\u003e\n      \u003c/a\u003e\n      \u003cimg alt=\"\" src=\"https://img.shields.io/static/v1?color=blue\u0026label=office\u0026message=office 365\u0026style=for-the-badge\u0026logo=microsoftoffice\"/\u003e\n      \u003c/a\u003e\n      \u003cimg alt=\"\" src=\"https://img.shields.io/static/v1?color=blue\u0026label=microsoft\u0026message=Windows\u0026style=for-the-badge\u0026logo=microsoft\"/\u003e\n      \u003c/a\u003e\n      \n\u003c/p\u003e\n\n![Alt text](img/cover-repo.png)\n\n\u003ch1\u003eSport Experience\u003c/h1\u003e\n\n\u003e Desenvolvimento de algumas rotinas de uma empresa especializada em eventos esportivos.\nForam consumidas 2 APIs, aberta 1 API para outros sistemas, criadas tabelas, páginas, com validação de campos e interação com o usuário. A aplicação foi escrita em inglês e possui tradução para o portiguês do Brasil.\n\n\u003cimg alt=\"BC_logo\" src=\"img\\Dynamics-365-BC-logo-removebg.png?raw=true\" width=150 align=right\u003e\n\n[![](https://img.shields.io/badge/feito%20com%20%E2%9D%A4%20por-jaac-cyan)](https://github.com/jonasaacampos)\n[![LinkedIn Badge](https://img.shields.io/badge/LinkedIn-Profile-informational?style=flat\u0026logo=linkedin\u0026logoColor=white\u0026color=0D76A8)](https://www.linkedin.com/in/jonasaacampos)\n\n![](https://img.shields.io/badge/dynamics365-informational?style=flat\u0026logo=dynamics365\u0026logoColor=white\u0026color=gold)\n![](https://img.shields.io/badge/vscode-informational?style=flat\u0026logo=visualstudiocode\u0026logoColor=white\u0026color=magenta)\n\n\n----\n\u003ch2\u003eÍndice\u003c/h2\u003e\n\n- [Demo](#demo)\n- [Iniciar Projeto](#iniciar-projeto)\n- [Retorno das APIs](#retorno-das-apis)\n- [Documentação (descritivo) do projeto](#documentação-descritivo-do-projeto)\n- [Utilidades e Referências](#utilidades-e-referências)\n- [Cont(r)ate-me](#contrate-me)\n- [Agradecimentos](#agradecimentos)\n\n\n## Demo \n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eInfluencers API\u003c/b\u003e\u003c/summary\u003e\n\n![Alt text](img/Influencers_API.gif)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eMarketing Campaigns\u003c/b\u003e\u003c/summary\u003e\n\n![Alt text](img/marketingCampaigns.gif)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eReginal Runs (API Expose)\u003c/b\u003e\u003c/summary\u003e\n\n![Alt text](img/ReginalRuns.gif)\n\u003c/details\u003e\n\n[Slides utilizados para a apresentação do TCC](img/Sport%20Experience_TCC_Jonas_Campos.pdf)\n\n## Iniciar Projeto\n\n - [ ] Abra a paleta de comandos (`ctrl + shift + p`)\n - [ ] Digite `AL:Go!`\n - [ ] Insira o caminho do diretório (e crie um diretório vazio para o projeto)\n - [ ] Escolha a opção do servidor. No meu caso escolhi `Your own server`\n - [ ] Na opção de login, ignore esta etapa, apertando `esc`\n - [ ] Abra o arquivo `.vscode \u003e launch.json` e edite os parâmetros:\n   - [ ] `server` alterar para `http://NOME_OU_IP_SEU_SERVIDOR`\n   - [ ] `serverInstance` insira o nome da sua máquina virtual no lugar do padão `BC130`\n   - [ ] `name` o nome do seu servidor. Pode ser qualquer coisa\n   - [ ] ` \"startupObjectId\"` insira o objeto que iniciará por padrão após a compilação.\n - [ ] Após publicar o projeto pela primeira vez, insira o parâmetro `\"schemaUpdateMode\": \"Recreate\",`\n - [ ] Apague o arquivo `HelloWord.al` e inicie o desenvolvimento\n - [ ] Abra a paleta de comandos (`ctrl + shift + p`)\n - [ ] Digite `AL: Download Symbols`\n - [ ] Aparecerão os módulos baixados do diretório `.alpackages` na seção explorer do projeto\n - [ ] Compile o projeto, `F5` para depuração ou `ctrl + F5` para publicação direta\n\n## Retorno das APIs\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eSport Influencers (exemplo de retorno da requisição)\u003c/b\u003e \u003c/summary\u003e\n\n```json\n\n[\n  {\n    \"id\": 1,\n    \"name\": \"Cristiano Ronaldo\",\n    \"username\": \"CR7\",\n    \"email\": \"cristiano@ronaldo.com\",\n    \"address\": {\n      \"street\": \"Avenida dos Campeões\",\n      \"suite\": \"Apt. 7\",\n      \"city\": \"Madri\",\n      \"zipcode\": \"28001\",\n      \"geo\": {\n        \"lat\": \"40.4167\",\n        \"lng\": \"-3.7033\"\n      }\n    },\n    \"phone\": \"+34 123456789\",\n    \"website\": \"cristianoronaldo.com\",\n    \"company\": {\n      \"name\": \"CR7 Empreendimentos Esportivos\",\n      \"catchPhrase\": \"Transformando sonhos em realidade\",\n      \"bs\": \"Gerenciamento de carreiras esportivas\"\n    }\n  },\n  {\n    \"id\": 2,\n    \"name\": \"Neymar Jr.\",\n    \"username\": \"Neymar\",\n    \"email\": \"neymar@jr.com\",\n    \"address\": {\n      \"street\": \"Rua dos Craques\",\n      \"suite\": \"Apt. 10\",\n      \"city\": \"São Paulo\",\n      \"zipcode\": \"04578-910\",\n      \"geo\": {\n        \"lat\": \"-23.5644\",\n        \"lng\": \"-46.6517\"\n      }\n    },\n    \"phone\": \"+55 11 987654321\",\n    \"website\": \"neymarjr.com\",\n    \"company\": {\n      \"name\": \"NJ Sports\",\n      \"catchPhrase\": \"Paixão e dedicação pelo futebol\",\n      \"bs\": \"Marketing esportivo\"\n    }\n  },\n\n```\n\n  \u003c/details\u003e\n\n  \u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eGo Weather (exemplo de retorno da requisição)\u003c/b\u003e \u003c/summary\u003e\n\n```json\n\n{\n  \"temperature\": \"16 °C\",\n  \"wind\": \"28 km/h\",\n  \"description\": \"Rain, mist\",\n  \"forecast\": [\n    {\n      \"day\": \"1\",\n      \"temperature\": \"20 °C\",\n      \"wind\": \"13 km/h\"\n    },\n    {\n      \"day\": \"2\",\n      \"temperature\": \"+14 °C\",\n      \"wind\": \"12 km/h\"\n    },\n    {\n      \"day\": \"3\",\n      \"temperature\": \"18 °C\",\n      \"wind\": \"9 km/h\"\n    }\n  ]\n}\n\n```\n\n  \u003c/details\u003e\n\n## Documentação (descritivo) do projeto\n\n\u003e Aqui vou descrever a finalidade de adicionar cada componente, bem como o papel de cada um dentro do projeto.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e👓 1 - Tabelas e Páginas\u003c/b\u003e \u003c/summary\u003e\n\n  Ao criar uma **tabela**, definimos quais dados desejamos capturar na aplicação. As propriedades de cada campo são definidos na tabela.\n\n  Para que sejam exibido os dados, precisamos de criar **páginas**. Estas permitem que o usuário interaja com nosso aplicativo. Uma **página de lista** é a primeira página que o usuário acessará. A partir desta lista, é possível inserir, alterar e excluir dados. Quando informações mais detalhadas são necessárias, o usuário pode acessar a **página de cartão**.\n\n  \u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e⛔ 2 - Validação de campos e tratamento de erros\u003c/b\u003e \u003c/summary\u003e\n\n  Gatilhos (triggers) são funções que acontessem como resultado de uma ação. Estes podem ser ignorados a depender da regra de negócios. No nosso caso, o gatilho sempre será disparado para validar o campo data da última exibição.\n\n  Cada objeto AL possui um conjunto de gatilhos própiros.\n\n  Foi adicionado um tratamento de erro para que exiba uma mensagem para o usuário, utilizando rótulos (Label Data).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e👮🏾‍♀️ 3 - Classificação dos dados\u003c/b\u003e \u003c/summary\u003e\n\n  Com a constante coleta e manipulação de dados em massa, é preciso se atentar para as legislações de proteção à dados pessoais. No Business Central, os dados podem ser classificados de maneira simples, adicionando o parâmetro `DataClassification` com o seu devido valor.\n\n  Para ver a documentação com os valores possível, acesse [DataClassification Property](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/properties/devenv-dataclassification-property).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e📋 4 - Permissões de acesso\u003c/b\u003e\u003c/summary\u003e\n\n  \u003e Nada é pior do que testar, validar e entregar o aplicativo que o cliente não consegue acessar.\n\n  Para gerar automaticamente o arquivo de permissões, abra a paleta de comandos (`ctrl + shift + p`) e digite `AL: Generate permission set containing current extension objects`. Será criado um arquivo de permissões. Após publicar o projeto, o administrador pode acessar a política abra a página de política de permissões (`Tell me \u003e permissions sets`).\n\n  - **Atenção:** A criação da política de permissões sempre subescreverá o arquivo existente. Par amanter ambos, renomeie o arquivo `extensionsPermissionSet.xml`. \n  - É possível criar mais de uma política de permissões, por exemplo, uma rotina administrativa, uma de leitura e escrita, e outra de somente leitura.\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e🧾 5 - Relatórios\u003c/b\u003e\u003c/summary\u003e\n\n  Usando o snippet `report` foi criada a estutura básica do relatório. Como layout padrão, foi inserido o padrão RDLC.\n\n  - após a criação, o projeto foi compilado com `ctrl + shift + b`. Feito isso, o arquivo de layout foi criado automaticamente.\n  - o arquivo `.rdl` foi aberto e editado no Microsoft Report Buider\n    - No painel do Report Builder, selecionar: DataSet_Result \u003e Insert \u003e Table \u003e Table Wizard \u003e Chose an existing dataset \u003e Next \u003e Movido o campo `code` para o row group \u003e movidos demais campos para a seção valores \u003e Desmarcar todos as caixas \u003e Next \u003e Finish \u003e SAVE.\n\n  Um relatório é composto por duas partes:\n\n  1. Conjunto de dados (Dataset): é um arquivo `.al` que define as tabelas, campos, filtrose lógica do relatório\n  2. Layout: Arquivo RDLC, Word ou Excel que mostrará o relatório quando for gerado no BC.\n\n  Depois de instalado no BC, o cliente pode alterar ou criar novos layouts com o recurso *Custom Report Layouts*.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e🧾 6 - Link de Ajuda\u003c/b\u003e \u003c/summary\u003e\n\n  Inserido link (fictítio) para que no canto superior direito da página de lista, seja possível abrir documentação externa. O parâmetro de link de ajuda é inserido na Page List.\n\n\u003c/details\u003e\n\n\u003chr/\u003e\n\n## Utilidades e Referências\n\n- [Tables Overview](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-tables-overview)\n- [Pages Overview](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-pages-overview)\n- [Retaining table data after publishing](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-retaining-data-after-publishing)\n- [Triggers Overview](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/triggers-auto/devenv-triggers)\n- [Label Data Type](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/label/label-data-type)\n- [Classifying Data Sensitivity](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-classifying-data-sensitivity)\n- [Classifying Data in Dynamics 365](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-classifying-data)\n- [Create Users According to Licenses](https://learn.microsoft.com/en-us/dynamics365/business-central/ui-how-users-permissions)\n- [Microsoft® Report Builder](https://www.microsoft.com/en-us/download/details.aspx?id=53613)\n- [Reports Overview](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-reports)\n- [Report and Document Layouts Overview](https://learn.microsoft.com/en-us/dynamics365/business-central/ui-manage-report-layouts)\n- [Adding Help Links from Pages, Reports, and XMLports](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-adding-help-links-from-pages-tables-xmlports)\n- [Table Extension Object](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-table-ext-object)\n- [Page Extension Object](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-page-ext-object)\n- [Subscribing to events](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-subscribing-to-events)\n\n\u003c!-- CONTACT --\u003e\n\n## Cont(r)ate-me\n\n**Author:** Jonas Araujo de Avila Campos\n\n![Alt text](https://github.com/jonasaacampos/jonasaacampos/raw/master/img/banner2.png)\n\n\u003cp align='center'\u003e\n  \u003ca href='https://github.com/jonasaacampos'\u003e\n    \u003cimg src='https://img.shields.io/badge/GitHub-100000?style=for-the-badge\u0026logo=github\u0026logoColor=white'/\u003e\n  \u003c/a\u003e\n  \u003ca href='https://www.linkedin.com/in/jonasaacampos/'\u003e\n    \u003cimg src='https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white'/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Agradecimentos\n\n- Julio Chaves, por preparar e conduzir o treinamento\n- Colegas que seguiram até o final\n- Equipe de infra e RH da Alfa People","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonasaacampos%2Fsportexperience","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonasaacampos%2Fsportexperience","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonasaacampos%2Fsportexperience/lists"}