diff --git a/backend/database/Cupon.py b/backend/database/Cupon.py
new file mode 100644
index 00000000..ad3e2b70
--- /dev/null
+++ b/backend/database/Cupon.py
@@ -0,0 +1,8 @@
+import sqlalchemy as sql
+from web import sql_database as db
+
+
+class Cupon(db.Model):
+ id = sql.Column(sql.Integer, primary_key=True)
+ name = sql.Column(sql.String(100), nullable=False, unique=True)
+ color = sql.Column(sql.String(7), nullable=False)
\ No newline at end of file
diff --git a/backend/database/CuponDrink.py b/backend/database/CuponDrink.py
new file mode 100644
index 00000000..f78154e8
--- /dev/null
+++ b/backend/database/CuponDrink.py
@@ -0,0 +1,18 @@
+import sqlalchemy as sql
+from web import sql_database as db
+from sqlalchemy.orm import relationship
+
+
+class CuponDrink(db.Model):
+ id = sql.Column(sql.Integer, primary_key=True)
+ cupon_id = sql.Column(sql.Integer, sql.ForeignKey(
+ 'cupon.id'), nullable=False)
+ cupon = relationship(
+ 'database.Cupon.Cupon', lazy="joined")
+
+ drink_id = sql.Column(sql.Integer, sql.ForeignKey(
+ 'drink.id'), nullable=False)
+ drink = relationship(
+ 'database.Drink.Drink', lazy="joined")
+
+ price = sql.Column(sql.Float, nullable=False)
\ No newline at end of file
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index c73ade9e..f3f80a5a 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1431,6 +1431,11 @@
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
"integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg=="
},
+ "@ctrl/tinycolor": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.0.2.tgz",
+ "integrity": "sha512-fKQinXE9pJ83J1n+C3rDl2xNLJwfoYNvXLRy5cYZA9hBJJw2q+sbb/AOSNKmLxnTWyNTmy4994dueSwP4opi5g=="
+ },
"@emoji-mart/data": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.1.2.tgz",
@@ -10782,6 +10787,14 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
+ "mui-color-input": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mui-color-input/-/mui-color-input-2.0.1.tgz",
+ "integrity": "sha512-NM7wuHccm8biSFP3WR66rVP0+jNovLnC8cyxGYd+T/BUeIZpXPN4DQcU9NpXNE3lSCi/9IaPdSQcsza2vTw6Mg==",
+ "requires": {
+ "@ctrl/tinycolor": "^4.0.2"
+ }
+ },
"multicast-dns": {
"version": "7.2.5",
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index ac216e55..f8821047 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -20,6 +20,7 @@
"date-fns": "^2.30.0",
"emoji-mart": "^5.5.2",
"js-cookie": "^3.0.5",
+ "mui-color-input": "^2.0.1",
"react": "^18.2.0",
"react-countup": "^6.5.0",
"react-dom": "^18.2.0",
diff --git a/frontend/src/Components/Admin/Cupons/AddCupon.tsx b/frontend/src/Components/Admin/Cupons/AddCupon.tsx
new file mode 100644
index 00000000..f9212558
--- /dev/null
+++ b/frontend/src/Components/Admin/Cupons/AddCupon.tsx
@@ -0,0 +1,20 @@
+import { Stack, TextField, Typography } from '@mui/material'
+import React, { useState } from 'react'
+import style from './cupon.module.scss';
+import { MuiColorInput } from 'mui-color-input';
+
+type Props = {}
+
+const AddCupon = (props: Props) => {
+ const [color, setcolor] = useState("#ffdd00")
+ return (
+
+
+
+ {setcolor(value)}} />
+
+
+ )
+}
+
+export default AddCupon
\ No newline at end of file
diff --git a/frontend/src/Components/Admin/Cupons/CuponDisplay.tsx b/frontend/src/Components/Admin/Cupons/CuponDisplay.tsx
new file mode 100644
index 00000000..8921f5f8
--- /dev/null
+++ b/frontend/src/Components/Admin/Cupons/CuponDisplay.tsx
@@ -0,0 +1,33 @@
+import { Button, Paper, Stack, Typography } from '@mui/material'
+import React from 'react'
+import style from './cupon.module.scss';
+import SellIcon from '@mui/icons-material/Sell';
+import Spacer from '../../Common/Spacer';
+import DeleteIcon from '@mui/icons-material/Delete';
+import EditIcon from '@mui/icons-material/Edit';
+
+type Props = {}
+
+const CuponDisplay = (props: Props) => {
+ return (
+
+
+
+
+ Rentner
+
+
+
+
+
+
+
+
+ )
+}
+
+export default CuponDisplay
\ No newline at end of file
diff --git a/frontend/src/Components/Admin/Cupons/Overview.tsx b/frontend/src/Components/Admin/Cupons/Overview.tsx
new file mode 100644
index 00000000..38761ebe
--- /dev/null
+++ b/frontend/src/Components/Admin/Cupons/Overview.tsx
@@ -0,0 +1,35 @@
+import React from 'react'
+import CuponDisplay from './CuponDisplay'
+import { Button, Stack, Typography } from '@mui/material'
+import AddIcon from '@mui/icons-material/Add';
+import style from './cupon.module.scss';
+import Spacer from '../../Common/Spacer';
+import { useNavigate } from 'react-router-dom';
+
+type Props = {}
+
+const Overview = (props: Props) => {
+ const navigate = useNavigate();
+ return (
+
+
+
+ Cupons
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Overview
\ No newline at end of file
diff --git a/frontend/src/Components/Admin/Cupons/cupon.module.scss b/frontend/src/Components/Admin/Cupons/cupon.module.scss
new file mode 100644
index 00000000..9a611e0f
--- /dev/null
+++ b/frontend/src/Components/Admin/Cupons/cupon.module.scss
@@ -0,0 +1,18 @@
+@import "../../Common/variables.module.scss";
+
+.cuponsPage{
+ padding: $padding;
+}
+
+.addCuponPage{
+ padding: $padding;
+}
+
+.cuponDisplayContainer{
+ width: fit-content;
+ padding: $padding;
+}
+
+.cuponDisplayHeadline{
+ display: flex;
+}
\ No newline at end of file
diff --git a/frontend/src/Components/Admin/Overview/Overview.tsx b/frontend/src/Components/Admin/Overview/Overview.tsx
index 495d9b52..65857d13 100644
--- a/frontend/src/Components/Admin/Overview/Overview.tsx
+++ b/frontend/src/Components/Admin/Overview/Overview.tsx
@@ -17,9 +17,9 @@ import Infobox from '../../Common/InfoBox/Infobox';
import { Area, AreaChart, Bar, BarChart, CartesianGrid, Legend, Tooltip, XAxis, YAxis } from 'recharts';
import TopDepter from '../Common/TopDepter/TopDepter';
import { RootState } from '../../../Reducer/reducerCombiner';
-import { BENUTZER_ZAHL, BUDGET, EINSTELLUNGEN, GELD_VERTEILUNG, GETRAENKE, LETZE_100_KAEUFE, MITGLIEDER, TRANSAKTIONEN, VERSTECKTE_NUTZER } from '../../Common/Internationalization/i18n';
+import { BENUTZER_ZAHL, BUDGET, CUPONS, EINSTELLUNGEN, GELD_VERTEILUNG, GETRAENKE, LETZE_100_KAEUFE, MITGLIEDER, TRANSAKTIONEN, VERSTECKTE_NUTZER } from '../../Common/Internationalization/i18n';
import { Transaction } from '../../../types/ResponseTypes';
-
+import SellIcon from '@mui/icons-material/Sell';
type Props = {}
@@ -179,6 +179,16 @@ const Overview = (props: Props) => {
{TRANSAKTIONEN}
+