Skip to content

Commit

Permalink
Merge pull request #114 from Marvelous-O/gym-management-app
Browse files Browse the repository at this point in the history
Gym management app
  • Loading branch information
Katerina-Chernevskaya authored Nov 19, 2024
2 parents 45e20c8 + 69af787 commit 9c545ad
Show file tree
Hide file tree
Showing 72 changed files with 49,258 additions and 0 deletions.
171 changes: 171 additions & 0 deletions samples/gym-management-app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# Gym Management App

## Summary

The Gym Management App is designed to enhance efficiency and reduce costs for gym owners. This application streamlines the process of member registration, subscription management, and communication through automated workflows.

![picture of the sample](assets/LandingPage.PNG)

## Applies to

![Power Apps](https://img.shields.io/badge/Power%20Apps-Yes-green "Yes")
![Power Automate](https://img.shields.io/badge/Power%20Automate-Yes-green "Yes")
![Power BI](https://img.shields.io/badge/Power%20BI-No-red "No")
![Power Pages](https://img.shields.io/badge/Power%20Pages-No-red "No")
![Power Virtual Agents](https://img.shields.io/badge/Power%20Virtual%20Agents-No-red "No")
![Dataverse](https://img.shields.io/badge/Dataverse-No-red "No")
![AI Builder](https://img.shields.io/badge/AI%20Builder-No-red "No")
![Custom Connectors](https://img.shields.io/badge/Custom%20Connectors-No-red "No")
![Power Fx](https://img.shields.io/badge/Power%20Fx-Yes-green "Yes")

## Compatibility

![Premium License](https://img.shields.io/badge/Premium%20License-Not%20Required-red.svg "Premium license not required")
![Experimental Features](https://img.shields.io/badge/Experimental%20Features-Yes-green.svg "Does rely on experimental features")

## Contributors

* [Marvelous Omotoso](https://github.com/Marvelous-O)

## Version history

|Version|Date|Comments|
|-------|------|---------------|
|1.0|October 27, 2024|Initial release|

## Prerequisites

- Make sure Office 365 Outlook is enabled in your environment for E-mail sending
- The Sharepoint list must be the Datasource, the app uses Sharepoint as the Datasource.

### Creating the Data Source

- Create a SharePoint List with the following columns:

| Column Name | Column Type |
| ------------------ | ------------------------------------------------------------------------------------ |
| Date | Date and Time |
| Name | Single Line of Text |
|EmailAddress | Single Line of Text |
|PhoneNumber | Number |
|MembershipPlan | Choice (Daily, Weekly, Monthly, Quarterly(3 Months), Half a year(6 Months), Yaerly(12 Months))|
|PersonalTraining | Choice(No, Daily, Silver, Diamond, Gold, VIP, Boxing) |
|DueDate | Calculated Column (Check how to create this below) |
|Gender | Choice (Male, Female) |
|DueDate2 | Date and Time |

**NOTE:** Make sure your column names are exactly the way it is written above.

### How to Create Due Date Calculated Column

Step 1: Add a Column
![Prompt Admin Products](assets/DueDateStep1.png)

Step 2: Scroll Down to select see all column types

![Prompt Admin Products](assets/DueDateStep2.png)

Step 3: Click on Next

![Prompt Admin Products](assets/DueDateStep3.png)

Step 4: Select Calculated(Calculations based on other columns) and Due Date : as the column name

![Prompt Admin Products](assets/DueDateStep4.png)

Step 5: Scroll down to formula and paste in this formula:

```
=IF([MembershipPlan]="Daily",[Date]+1,IF([MembershipPlan]="Weekly",[Date]+7,IF([MembershipPlan]="Monthly",[Date]+30,IF([MembershipPlan]="Quarterly(3 Months)",[Date]+90,IF([MembershipPlan]="Half a year(6 Months)",[Date]+180,IF([MembershipPlan]="Yearly(12 Months)",[Date]+365))))))
```

Scroll down to select Date and Time where it says `The data type returned from this formula is: ` and change the Date and Time Format to **Date Only**

![Prompt Admin Products](assets/DueDateStep5.png)

## Minimal path to awesome

### Using the solution zip

* [Download](./solution/gym-management-app.zip) the `.zip` from the `solution` folder.
* Within **Power Apps Studio**, import the solution `.zip` file using **Solutions** > **Import Solution** and select the `.zip` file you just packed.
* When importing the solution you will be prompted to connect a SharePoint site and Office 365 Outlook, kindly connect your SharePoint Site and Office365 Outlook. Use the SharePoint list you created in step 1 as the data source.

### Using the source code

You can also use the [Power Apps CLI](https://docs.microsoft.com/powerapps/developer/data-platform/powerapps-cli) to pack the source code by following these steps:

* Clone the repository to a local drive
* Pack the source files back into a solution `.zip` file:

```bash
pac solution pack --zipfile pathtodestinationfile --folder pathtosourcefolder --processCanvasApps
```

Making sure to replace `pathtosourcefolder` to point to the path to this sample's `sourcecode` folder, and `pathtodestinationfile` to point to the path of this solution's `.zip` file (located under the `solution` folder)

* Within **Power Apps Studio**, import the solution `.zip` file using **Solutions** > **Import Solution** and select the `.zip` file you just packed.

## Features

This template not only gives you a good foundation for customizing your own Membership Registration system, it also demonstrates patterns that you can use across other apps.

### Key Features of the solution include:

A dashboard landing page featuring Registered Memebers and Subscription Due Date which was calculated by the app in respect to the Memeber's Subcription Package . Ability to search for a member's details either by Name or E-mail, without having to search through a long list of Excel Spreadsheet.
![Prompt Admin Products](assets/LandingPage.PNG)

**Automated Member Registration**: New members' information is directly entered into the app, eliminating manual data entry.
![Prompt Admin Products](assets/NewReg1.PNG)
![Prompt Admin Products](assets/NewReg2.PNG)
**Subscription Management**: The app automatically calculates the subscription due date based on the plan selected during registration.
![Prompt Admin Products](assets/EditScreen.PNG)
**Automated Communication**:
- Sends a welcome message immediately after registration.
![Prompt Admin Products](assets/EmailScreenshot.PNG)
- Sends a reminder email 7 days before the subscription is due.
- Sends another reminder email 3 days before the subscription is due.
![Prompt Admin Products](assets/RenewalEmail.PNG)
* The Ability to edit already registered member if he or she changes contacts.
![Prompt Admin Products](assets/EditScreen.PNG)
### Data Sources
- Sharepoint List
### Automated Flow
**Automated Welcome Message**
![Prompt Admin Products](assets/FlowForWelcomeMessage.png)
**Automated Subscription Renewal**
![Prompt Admin Products](assets/SubscriptionRenewalFlow.png)
**Due Date Flow:** (How I used a calculated column for Filter Query in Power Automate)
![Prompt Admin Products](assets/DueDateFlow.png)
Calculated columns can't be used for filter queries in Power Automate. Here's what I did: I created another flow to always copy the data from the calculated column (which is the calculated due date) to another column named DueDate2 as soon as a new member is registered. This new column became a regular date column, making it non-calculated. The Subscription Reminder Flow filters the DueDate2 column to check which members' subscriptions are almost due.

## Help

We do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues.

If you encounter any issues while using this sample, you can [create a new issue](https://github.com/pnp/powerapps-samples/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A%2Ctype%3Abug-suspected&template=bug-report.yml&sample=gym-management-app&authors=@Marvelous-O&title=gym-management-app%20-%20).

For questions regarding this sample, [create a new question](https://github.com/pnp/powerapps-samples/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A%2Ctype%3Abug-suspected&template=question.yml&sample=gym-management-app&authors=@Marvelous-O&title=gym-management-app%20-%20).

Finally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/powerapps-samples/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A%2Ctype%3Abug-suspected&template=suggestion.yml&sample=gym-management-app&authors=@Marvelous-O&title=gym-management-app%20-%20).

## Disclaimer

**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**

<img src="https://m365-visitor-stats.azurewebsites.net/powerplatform-samples/samples/gym-management-app" aria-hidden="true" />
Binary file added samples/gym-management-app/assets/DueDateFlow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added samples/gym-management-app/assets/EditScreen.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added samples/gym-management-app/assets/LandingPage.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added samples/gym-management-app/assets/NewReg1.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added samples/gym-management-app/assets/NewReg2.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
68 changes: 68 additions & 0 deletions samples/gym-management-app/assets/sample.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[
{
"name": "pnp-powerplatform-samples-gym-management-app",
"source": "pnp",
"title": "Gym Management App",
"shortDescription": "The Gym Management App is designed to enhance efficiency and reduce costs for gym owners.",
"url": "https://github.com/pnp/powerplatform-samples/tree/main/samples/gym-management-app",
"downloadUrl": "https://pnp.github.io/download-partial/?url=https://github.com/pnp/powerplatform-samples/tree/main/samples/gym-management-app",
"longDescription": [
"The Gym Management App is designed to enhance efficiency and reduce costs for gym owners."
],
"creationDateTime": "2024-10-27",
"updateDateTime": "2024-10-27",
"products": [
"Power Apps",
"Power Automate",
"Power Fx",
"Power Platform"
],
"tags": [
"management app"
],
"categories": [
"CANVAS",
"CLOUD-FLOW"
],
"metadata": [
{
"key": "POWERAPPS-EXPERIMENTAL",
"value": "No"
},
{
"key": "POWERAPPS-PREMIUM",
"value": "No"
},
{
"key": "POWERAPPS-ONPREM",
"value": "No"
},
{
"key": "POWERAPPS-CUSTOMCONNECTOR",
"value": "No"
}
],
"thumbnails": [
{
"type": "image",
"order": 100,
"url": "https://github.com/pnp/powerplatform-samples/raw/main/samples/gym-management-app/assets/LandingPage.PNG",
"alt": "App preview"
}
],
"authors": [
{
"gitHubAccount": "Marvelous-O",
"pictureUrl": "https://github.com/Marvelous-O.png",
"name": "Marvelous Omotoso"
}
],
"references": [
{
"name": "Microsoft Power Platform documentation",
"description": "Discover how to make the most of Microsoft Power Platform products with online training courses, docs, and videos covering product capabilities and how-to guides.",
"url": "https://learn.microsoft.com/power-platform/"
}
]
}
]
Binary file not shown.
8 changes: 8 additions & 0 deletions samples/gym-management-app/sourcecode/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# msbuild output directories
/bin
/obj

# MSBuild Binary and Structured Log
*.binlog
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PowerAppsTargetsPath>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\PowerApps</PowerAppsTargetsPath>
</PropertyGroup>

<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
<Import Project="$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Solution.props" Condition="Exists('$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Solution.props')" />

<PropertyGroup>
<ProjectGuid>5cc85dd8-7b42-4fcb-938d-c6b3e190d3ab</ProjectGuid>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<!--Remove TargetFramework when this is available in 16.1-->
<TargetFramework>net462</TargetFramework>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<SolutionRootPath>src</SolutionRootPath>
</PropertyGroup>

<!--
Solution Packager overrides, un-comment to use: SolutionPackagerType (Managed, Unmanaged, Both)
Solution Localization Control, if you want to enabled localization of your solution, un-comment SolutionPackageEnableLocalization and set the value to true. - Requires use of -loc flag on Solution Clone or Sync
-->
<!--
<PropertyGroup>
<SolutionPackageType>Managed</SolutionPackageType>
<SolutionPackageEnableLocalization>false</SolutionPackageEnableLocalization>
</PropertyGroup>
-->

<ItemGroup>
<PackageReference Include="Microsoft.PowerApps.MSBuild.Solution" Version="1.*" />
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>

<ItemGroup>
<ExcludeDirectories Include="$(MSBuildThisFileDirectory)\.gitignore" />
<ExcludeDirectories Include="$(MSBuildThisFileDirectory)\bin\**" />
<ExcludeDirectories Include="$(MSBuildThisFileDirectory)\obj\**" />
<ExcludeDirectories Include="$(MSBuildThisFileDirectory)\*.cdsproj" />
<ExcludeDirectories Include="$(MSBuildThisFileDirectory)\*.cdsproj.user" />
<ExcludeDirectories Include="$(MSBuildThisFileDirectory)\*.sln" />
</ItemGroup>

<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)\**" Exclude="@(ExcludeDirectories)" />
<Content Include="$(SolutionPackageZipFilePath)">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>

<Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
<Import Project="$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Solution.targets" Condition="Exists('$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Solution.targets')" />

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<CanvasApp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>gym_703fitnessmembershipregapp_9e622</Name>
<AppVersion>2024-11-18T18:23:30Z</AppVersion>
<Status>Ready</Status>
<CreatedByClientVersion>3.24111.11.0</CreatedByClientVersion>
<MinClientVersion>3.24111.11.0</MinClientVersion>
<Tags>{"primaryDeviceWidth":"1366","primaryDeviceHeight":"768","supportsPortrait":"true","supportsLandscape":"true","primaryFormFactor":"Tablet","showStatusBar":"true","publisherVersion":"3.24111.11","minimumRequiredApiVersion":"2.2.0","hasComponent":"false","hasUnlockedComponent":"false","isUnifiedRootApp":"false","offlineLargeFilesSupport":"false","sienaVersion":"20241109T164816Z-3.24102.17.0","coauthoringEnabled":"true","multipleWritersEnabled":"true","acceptedCoauthoringTerms":"true"}</Tags>
<IsCdsUpgraded>0</IsCdsUpgraded>
<GalleryItemId xsi:nil="true"></GalleryItemId>
<BackgroundColor>RGBA(0,176,240,1)</BackgroundColor>
<DisplayName>Gym Membership Reg App</DisplayName>
<Description>Gym Membership Registration App</Description>
<CommitMessage xsi:nil="true"></CommitMessage>
<Publisher></Publisher>
<AuthorizationReferences>[]</AuthorizationReferences>
<ConnectionReferences>{"7e410418-325a-4130-b683-8e3a17115e7f":{"id":"/providers/microsoft.powerapps/apis/shared_sharepointonline","displayName":"SharePoint","iconUri":"https://connectoricons-prod.azureedge.net/u/jayawan/releases/v1.0.1697/1.0.1697.3786/sharepointonline/icon.png","dataSources":["ListVariables"],"dependencies":[],"dependents":[],"parameterHints":{},"parameterHintsV2":{},"isOnPremiseConnection":false,"bypassConsent":false,"dataSets":{"https://1zvkt.sharepoint.com/sites/DRMARV_marv_EnvVariables":{"datasetOverride":{"name":"https://1zvkt.sharepoint.com/sites/DRMARV","environmentVariableName":"marv_EnvVariables"},"dataSources":{"ListVariables":{"tableName":"edbad80d-1941-4655-80b7-18b6542c364e","tableNameOverride":{"name":"edbad80d-1941-4655-80b7-18b6542c364e","environmentVariableName":"marv_ListVariables"}}}}},"apiTier":"Standard","actions":["providers/PowerPlatform.Governance/Operations/Read","providers/PowerPlatform.Governance/Operations/Write","providers/PowerPlatform.Governance/Operations/Delete"]}}</ConnectionReferences>
<DatabaseReferences>{}</DatabaseReferences>
<AppComponents>[]</AppComponents>
<AppComponentDependencies>[]</AppComponentDependencies>
<CanConsumeAppPass>1</CanConsumeAppPass>
<CanvasAppType>0</CanvasAppType>
<BypassConsent>0</BypassConsent>
<AdminControlBypassConsent>0</AdminControlBypassConsent>
<EmbeddedApp xsi:nil="true"></EmbeddedApp>
<IntroducedVersion>1.0</IntroducedVersion>
<CdsDependencies>{"cdsdependencies":[{"logicalname":"marv_EnvVariables","componenttype":380,"componenttypeplatformname":"EnvironmentVariableDefinition"},{"logicalname":"marv_ListVariables","componenttype":380,"componenttypeplatformname":"EnvironmentVariableDefinition"}]}</CdsDependencies>
<IsCustomizable>1</IsCustomizable>
<BackgroundImageUri>/CanvasApps/gym_703fitnessmembershipregapp_9e622_BackgroundImageUri</BackgroundImageUri>
<DocumentUri>/CanvasApps/gym_703fitnessmembershipregapp_9e622_DocumentUri.msapp</DocumentUri>
<AdditionalUris>
<AdditionalUri>/CanvasApps/gym_703fitnessmembershipregapp_9e622_AdditionalUris0_identity.json</AdditionalUri>
</AdditionalUris>
</CanvasApp>
Loading

0 comments on commit 9c545ad

Please sign in to comment.