diff --git a/client/package.json b/client/package.json
index d780f0d69..d447ae552 100644
--- a/client/package.json
+++ b/client/package.json
@@ -62,6 +62,7 @@
"react-icons": "^5.0.1",
"react-image-lightbox": "^5.1.4",
"react-intersection-observer": "^9.5.3",
+ "react-markdown": "^9.0.1",
"react-number-format": "^5.1.4",
"react-redux": "^9.1.0",
"react-resizable": "^3.0.5",
@@ -99,6 +100,7 @@
"buildcra": "cross-env-shell VITE_APP_GIT_SHA=\\\"`git rev-parse --short HEAD`\\\" vite build",
"test": "cypress open",
"eject": "react-scripts eject",
+ "eulaize": "node src/utils/eulaize.js",
"madge": "madge --image ./madge-graph.svg --extensions js,jsx,ts,tsx --circular ."
},
"eslintConfig": {
diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx
index d858ce36a..caa5b94f2 100644
--- a/client/src/App/App.jsx
+++ b/client/src/App/App.jsx
@@ -8,6 +8,7 @@ import {Route, Routes} from "react-router-dom";
import {createStructuredSelector} from "reselect";
import DocumentEditorContainer from "../components/document-editor/document-editor.container";
import ErrorBoundary from "../components/error-boundary/error-boundary.component";
+
//Component Imports
import LoadingSpinner from "../components/loading-spinner/loading-spinner.component";
import DisclaimerPage from "../pages/disclaimer/disclaimer.page";
@@ -20,6 +21,7 @@ import {selectBodyshop, selectCurrentUser,} from "../redux/user/user.selectors";
import PrivateRoute from "../components/PrivateRoute";
import "./App.styles.scss";
import handleBeta from "../utils/betaHandler";
+import Eula from "../components/eula/eula.component";
const ResetPassword = lazy(() =>
import("../pages/reset-password/reset-password.component")
@@ -42,7 +44,6 @@ const mapDispatchToProps = (dispatch) => ({
});
export function App({bodyshop, checkUserSession, currentUser, online, setOnline}) {
-
const client = useSplitClient().client;
const [listenersAdded, setListenersAdded] = useState(false)
const {t} = useTranslation();
@@ -121,6 +122,10 @@ export function App({bodyshop, checkUserSession, currentUser, online, setOnline}
/>
);
+ if (!currentUser.eulaIsAccepted) {
+ return
+ }
+
// Any route that is not assigned and matched will default to the Landing Page component
return (
}>
@@ -131,10 +136,12 @@ export function App({bodyshop, checkUserSession, currentUser, online, setOnline}
}/>
}/>
}/>
- }>
+ }>
}/>
- }>
+ }>
}/>
}>
diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss
index 8eab784c9..c49788f4d 100644
--- a/client/src/App/App.styles.scss
+++ b/client/src/App/App.styles.scss
@@ -147,23 +147,11 @@
}
}
-//Update row highlighting on production board.
-.ant-table-tbody > tr.ant-table-row:hover > td {
- background: #e7f3ff !important;
-}
-
-.ant-table-tbody > tr.ant-table-row-selected > td {
- background: #e6f7ff !important;
-}
-
.job-line-manual {
color: tomato;
font-style: italic;
}
-td.ant-table-column-sort {
- background-color: transparent;
-}
.ant-table-tbody > tr.ant-table-row:nth-child(2n) > td {
background-color: #f4f4f4;
diff --git a/client/src/App/themeProvider.js b/client/src/App/themeProvider.js
index 9bf301d61..a35278ea2 100644
--- a/client/src/App/themeProvider.js
+++ b/client/src/App/themeProvider.js
@@ -1,4 +1,9 @@
import {defaultsDeep} from "lodash";
+import {theme} from "antd";
+
+const {defaultAlgorithm, darkAlgorithm} = theme;
+
+let isDarkMode = false;
/**
* Default theme
@@ -6,6 +11,11 @@ import {defaultsDeep} from "lodash";
*/
const defaultTheme = {
components: {
+ Table: {
+ rowHoverBg: '#e7f3ff',
+ rowSelectedBg: '#e6f7ff',
+ headerSortHoverBg: 'transparent',
+ },
Menu: {
darkItemHoverBg: '#1677ff',
itemHoverBg: '#1677ff',
@@ -40,7 +50,11 @@ const devTheme = {
*/
const prodTheme = {};
-const theme = process.env.NODE_ENV === "development" ? devTheme
+const currentTheme = process.env.NODE_ENV === "development" ? devTheme
: prodTheme;
-export default defaultsDeep(theme, defaultTheme);
\ No newline at end of file
+const finaltheme = {
+ algorithm: isDarkMode ? darkAlgorithm : defaultAlgorithm,
+ ...defaultsDeep(currentTheme, defaultTheme)
+}
+export default finaltheme;
\ No newline at end of file
diff --git a/client/src/components/eula/eula.component.jsx b/client/src/components/eula/eula.component.jsx
new file mode 100644
index 000000000..964a0751d
--- /dev/null
+++ b/client/src/components/eula/eula.component.jsx
@@ -0,0 +1,226 @@
+import React, { useCallback, useEffect, useRef, useState } from "react";
+import {Button, Card, Checkbox, Col, Form, Input, Modal, notification, Row, Space} from "antd";
+import Markdown from "react-markdown";
+import { createStructuredSelector } from "reselect";
+import { selectCurrentEula, selectCurrentUser } from "../../redux/user/user.selectors";
+import { connect } from "react-redux";
+import { FormDatePicker } from "../form-date-picker/form-date-picker.component";
+import { INSERT_EULA_ACCEPTANCE } from "../../graphql/user.queries";
+import { useMutation } from "@apollo/client";
+import { acceptEula } from "../../redux/user/user.actions";
+import { useTranslation } from "react-i18next";
+import day from '../../utils/day';
+
+import './eula.styles.scss';
+
+const Eula = ({ currentEula, currentUser, acceptEula }) => {
+ const [formReady, setFormReady] = useState(false);
+ const [hasEverScrolledToBottom, setHasEverScrolledToBottom] = useState(false);
+ const [insertEulaAcceptance] = useMutation(INSERT_EULA_ACCEPTANCE);
+ const [form] = Form.useForm();
+ const markdownCardRef = useRef(null);
+ const { t } = useTranslation();
+ const [api, contextHolder] = notification.useNotification();
+
+ const handleScroll = (e) => {
+ const bottom = e.target.scrollHeight - 100 <= e.target.scrollTop + e.target.clientHeight;
+ if (bottom && !hasEverScrolledToBottom) {
+ setHasEverScrolledToBottom(true);
+ }
+ };
+
+ const handleChange = useCallback(() => {
+ form.validateFields({ validateOnly: true })
+ .then(() => setFormReady(hasEverScrolledToBottom))
+ .catch(() => setFormReady(false));
+ }, [form, hasEverScrolledToBottom]);
+
+ useEffect(() => {
+ handleChange();
+ }, [handleChange, hasEverScrolledToBottom, form]);
+
+ const onFinish = async ({ acceptTerms, ...formValues }) => {
+ const eulaId = currentEula.id;
+ const useremail = currentUser.email;
+
+ try {
+ const { accepted_terms, ...otherFormValues } = formValues;
+ await insertEulaAcceptance({
+ variables: {
+ eulaAcceptance: {
+ eulaid: eulaId,
+ useremail,
+ ...otherFormValues,
+ date_accepted: new Date(),
+ }
+ }
+ });
+ acceptEula();
+ } catch (err) {
+ api.error({
+ message: t('eula.errors.acceptance.message'),
+ description: t('eula.errors.acceptance.description'),
+ placement: 'bottomRight',
+ duration: 5000,
+
+ });
+ console.log(`${t('eula.errors.acceptance.message')}`);
+ console.dir({
+ message: err.message,
+ stack: err.stack,
+ });
+ }
+ };
+
+ return (
+ <>
+ {contextHolder}
+ (
+
+ )}
+ closable={false}
+ >
+
+
+
+
+
+
+
+ {!hasEverScrolledToBottom && (
+
+ {t('eula.content.never_scrolled')}
+
+ )}
+
+
+ >
+ )
+}
+
+const EulaFormComponent = ({ form, handleChange, onFinish, t }) => (
+
+
+
+);
+
+const mapStateToProps = createStructuredSelector({
+ currentEula: selectCurrentEula,
+ currentUser: selectCurrentUser,
+});
+
+const mapDispatchToProps = (dispatch) => ({
+ acceptEula: () => dispatch(acceptEula()),
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(Eula);
\ No newline at end of file
diff --git a/client/src/components/eula/eula.styles.scss b/client/src/components/eula/eula.styles.scss
new file mode 100644
index 000000000..6e12e7032
--- /dev/null
+++ b/client/src/components/eula/eula.styles.scss
@@ -0,0 +1,21 @@
+.eula-modal {
+ top: 20px;
+}
+
+.eula-markdown-card {
+ max-height: 50vh;
+ overflow-y: auto;
+ background-color: lightgray;
+}
+
+.eula-markdown-div {
+ padding: 0 10px 0 10px;
+}
+
+.eula-never-scrolled {
+ text-align: center;
+}
+
+.eula-accept-button {
+ width: 100%;
+}
\ No newline at end of file
diff --git a/client/src/components/form-date-picker/form-date-picker.component.jsx b/client/src/components/form-date-picker/form-date-picker.component.jsx
index 0f84fe68e..187d8d841 100644
--- a/client/src/components/form-date-picker/form-date-picker.component.jsx
+++ b/client/src/components/form-date-picker/form-date-picker.component.jsx
@@ -16,7 +16,16 @@ export default connect(mapStateToProps, mapDispatchToProps)(FormDatePicker);
const dateFormat = "MM/DD/YYYY";
-export function FormDatePicker({bodyshop, value, onChange, onBlur, onlyFuture, isDateOnly = true, ...restProps }) {
+export function FormDatePicker({
+ bodyshop,
+ value,
+ onChange,
+ onBlur,
+ onlyFuture,
+ onlyToday,
+ isDateOnly = true,
+ ...restProps
+ }) {
const ref = useRef();
const handleChange = (newDate) => {
@@ -87,9 +96,13 @@ export function FormDatePicker({bodyshop, value, onChange, onBlur, onlyFuture, i
onBlur={onBlur || handleBlur}
showToday={false}
disabledTime
- {...(onlyFuture && {
- disabledDate: (d) => dayjs().subtract(1, "day").isAfter(d),
- })}
+ disabledDate={(d) => {
+ if (onlyToday) {
+ return !dayjs().isSame(d, 'day');
+ } else if (onlyFuture) {
+ return dayjs().subtract(1, "day").isAfter(d);
+ }
+ }}
{...restProps}
/>
diff --git a/client/src/graphql/bodyshop.queries.js b/client/src/graphql/bodyshop.queries.js
index 44c95114d..5615f676f 100644
--- a/client/src/graphql/bodyshop.queries.js
+++ b/client/src/graphql/bodyshop.queries.js
@@ -8,6 +8,21 @@ export const INTROSPECTION = gql`
}
}
`;
+
+export const QUERY_EULA = gql`
+ query QUERY_EULA($now: timestamptz!) {
+ eulas(where: {effective_date: {_lte: $now}, _or: [{end_date: {_is_null: true}}, {end_date: {_gt: $now}}]}) {
+ id
+ content
+
+ eula_acceptances {
+ id
+ date_accepted
+ }
+ }
+ }
+`;
+
export const QUERY_BODYSHOP = gql`
query QUERY_BODYSHOP {
bodyshops(where: { associations: { active: { _eq: true } } }) {
diff --git a/client/src/graphql/user.queries.js b/client/src/graphql/user.queries.js
index 09ba53787..d69429ba5 100644
--- a/client/src/graphql/user.queries.js
+++ b/client/src/graphql/user.queries.js
@@ -31,6 +31,14 @@ export const UPDATE_ASSOCIATION = gql`
}
`;
+export const INSERT_EULA_ACCEPTANCE = gql`
+ mutation INSERT_EULA_ACCEPTANCE($eulaAcceptance:eula_acceptances_insert_input!) {
+ insert_eula_acceptances_one(object: $eulaAcceptance){
+ id
+ }
+ }
+`;
+
export const UPSERT_USER = gql`
mutation UPSERT_USER($authEmail: String!, $authToken: String!) {
insert_users(
diff --git a/client/src/redux/user/user.actions.js b/client/src/redux/user/user.actions.js
index e3b7d076c..b5c62a73c 100644
--- a/client/src/redux/user/user.actions.js
+++ b/client/src/redux/user/user.actions.js
@@ -109,3 +109,13 @@ export const setAuthlevel = (authlevel) => ({
type: UserActionTypes.SET_AUTH_LEVEL,
payload: authlevel,
});
+
+export const setCurrentEula = (eula) => ({
+ type: UserActionTypes.SET_CURRENT_EULA,
+ payload: eula,
+});
+
+export const acceptEula = () => ({
+ type: UserActionTypes.EULA_ACCEPTED,
+});
+
diff --git a/client/src/redux/user/user.reducer.js b/client/src/redux/user/user.reducer.js
index f9e391e61..5a1644f3b 100644
--- a/client/src/redux/user/user.reducer.js
+++ b/client/src/redux/user/user.reducer.js
@@ -3,6 +3,7 @@ import UserActionTypes from "./user.types";
const INITIAL_STATE = {
currentUser: {
authorized: null,
+ eulaIsAccepted: false,
//language: "en-US"
},
bodyshop: null,
@@ -17,6 +18,7 @@ const INITIAL_STATE = {
loading: false,
},
authLevel: 0,
+ currentEula: null,
};
const userReducer = (state = INITIAL_STATE, action) => {
@@ -63,11 +65,19 @@ const userReducer = (state = INITIAL_STATE, action) => {
loading: false,
},
};
+ case UserActionTypes.EULA_ACCEPTED:
+ return {
+ ...state,
+ currentUser:{...state.currentUser, eulaIsAccepted: true},
+ currentEula: null,
+ };
case UserActionTypes.SIGN_IN_SUCCESS:
+ const{ currentEula,...currentUser} = action.payload
return {
...state,
loginLoading: false,
- currentUser: action.payload,
+ currentUser: currentUser,
+ currentEula,
error: null,
};
case UserActionTypes.SIGN_OUT_SUCCESS:
diff --git a/client/src/redux/user/user.sagas.js b/client/src/redux/user/user.sagas.js
index 03c217df0..50201ba5d 100644
--- a/client/src/redux/user/user.sagas.js
+++ b/client/src/redux/user/user.sagas.js
@@ -43,6 +43,9 @@ import {
validatePasswordResetSuccess,
} from "./user.actions";
import UserActionTypes from "./user.types";
+import client from "../../utils/GraphQLClient";
+import {QUERY_EULA} from "../../graphql/bodyshop.queries";
+import day from "../../utils/day";
const fpPromise = FingerprintJS.load();
@@ -73,6 +76,8 @@ export function* signInWithEmail({ payload: { email, password } }) {
export function* onCheckUserSession() {
yield takeLatest(UserActionTypes.CHECK_USER_SESSION, isUserAuthenticated);
}
+
+
export function* isUserAuthenticated() {
try {
logImEXEvent("redux_auth_check");
@@ -85,6 +90,15 @@ export function* isUserAuthenticated() {
LogRocket.identify(user.email);
+ const eulaQuery = yield client.query({
+ query: QUERY_EULA,
+ variables: {
+ now: day()
+ },
+ });
+
+ const eulaIsAccepted = eulaQuery.data.eulas.length > 0 && eulaQuery.data.eulas[0].eula_acceptances.length > 0;
+
yield put(
signInSuccess({
uid: user.uid,
@@ -92,6 +106,8 @@ export function* isUserAuthenticated() {
displayName: user.displayName,
photoURL: user.photoURL,
authorized: true,
+ eulaIsAccepted,
+ currentEula: eulaIsAccepted ? null : eulaQuery.data.eulas[0],
})
);
} catch (error) {
diff --git a/client/src/redux/user/user.selectors.js b/client/src/redux/user/user.selectors.js
index ba02c677b..6e2193a10 100644
--- a/client/src/redux/user/user.selectors.js
+++ b/client/src/redux/user/user.selectors.js
@@ -36,3 +36,8 @@ export const selectLoginLoading = createSelector(
[selectUser],
(user) => user.loginLoading
);
+
+export const selectCurrentEula = createSelector(
+ [selectUser],
+ (user) => user.currentEula
+);
diff --git a/client/src/redux/user/user.types.js b/client/src/redux/user/user.types.js
index 7728fcb53..0e153b31a 100644
--- a/client/src/redux/user/user.types.js
+++ b/client/src/redux/user/user.types.js
@@ -32,5 +32,7 @@ const UserActionTypes = {
CHECK_ACTION_CODE_START: "CHECK_ACTION_CODE_START",
CHECK_ACTION_CODE_SUCCESS: "CHECK_ACTION_CODE_SUCCESS",
CHECK_ACTION_CODE_FAILURE: "CHECK_ACTION_CODE_FAILURE",
+ SET_CURRENT_EULA: "SET_CURRENT_EULA",
+ EULA_ACCEPTED : "EULA_ACCEPTED",
};
export default UserActionTypes;
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index 919f7e297..dcddeb7cd 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -933,6 +933,41 @@
"updated": "Document updated successfully. "
}
},
+ "eula": {
+ "titles": {
+ "modal": "Terms and Conditions",
+ "upper_card": "Acknowledgement"
+ },
+ "messages": {
+ "first_name": "Please enter your first name.",
+ "last_name": "Please enter your last name.",
+ "business_name": "Please enter your legal business name.",
+ "phone_number": "Please enter your phone number.",
+ "date_accepted": "Please enter Today's Date.",
+ "accepted_terms": "Please accept the terms and conditions of this agreement."
+ },
+ "buttons": {
+ "accept": "Accept EULA"
+ },
+ "labels": {
+ "first_name": "First Name",
+ "last_name": "Last Name",
+ "business_name": "Legal Business Name",
+ "phone_number": "Phone Number",
+ "address": "Address",
+ "date_accepted": "Date Accepted",
+ "accepted_terms": "I accept the terms and conditions of this agreement."
+ },
+ "content": {
+ "never_scrolled": "You must scroll to the bottom of the Terms and Conditions before accepting."
+ },
+ "errors": {
+ "acceptance": {
+ "message": "Eula Acceptance Error",
+ "description": "Something went wrong while accepting the EULA. Please try again."
+ }
+ }
+ },
"emails": {
"errors": {
"notsent": "Email not sent. Error encountered while sending {{message}}"
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index a798f790c..4fd6a54fa 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -933,6 +933,41 @@
"updated": ""
}
},
+ "eula": {
+ "titles": {
+ "modal": "Terms and Conditions",
+ "upper_card": "Acknowledgement"
+ },
+ "messages": {
+ "first_name": "Please enter your first name.",
+ "last_name": "Please enter your last name.",
+ "business_name": "Please enter your legal business name.",
+ "phone_number": "Please enter your phone number.",
+ "date_accepted": "Please enter Today's Date.",
+ "accepted_terms": "Please accept the terms and conditions of this agreement."
+ },
+ "buttons": {
+ "accept": "Accept EULA"
+ },
+ "labels": {
+ "first_name": "First Name",
+ "last_name": "Last Name",
+ "business_name": "Legal Business Name",
+ "phone_number": "Phone Number",
+ "address": "Address",
+ "date_accepted": "Date Accepted",
+ "accepted_terms": "I accept the terms and conditions of this agreement."
+ },
+ "content": {
+ "never_scrolled": "You must scroll to the bottom of the Terms and Conditions before accepting."
+ },
+ "errors": {
+ "acceptance": {
+ "message": "Eula Acceptance Error",
+ "description": "Something went wrong while accepting the EULA. Please try again."
+ }
+ }
+ },
"emails": {
"errors": {
"notsent": "Correo electrónico no enviado Se encontró un error al enviar {{message}}"
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index b65abaf04..70b09f588 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -933,6 +933,41 @@
"updated": ""
}
},
+ "eula": {
+ "titles": {
+ "modal": "Terms and Conditions",
+ "upper_card": "Acknowledgement"
+ },
+ "messages": {
+ "first_name": "Please enter your first name.",
+ "last_name": "Please enter your last name.",
+ "business_name": "Please enter your legal business name.",
+ "phone_number": "Please enter your phone number.",
+ "date_accepted": "Please enter Today's Date.",
+ "accepted_terms": "Please accept the terms and conditions of this agreement."
+ },
+ "buttons": {
+ "accept": "Accept EULA"
+ },
+ "labels": {
+ "first_name": "First Name",
+ "last_name": "Last Name",
+ "business_name": "Legal Business Name",
+ "phone_number": "Phone Number",
+ "address": "Address",
+ "date_accepted": "Date Accepted",
+ "accepted_terms": "I accept the terms and conditions of this agreement."
+ },
+ "content": {
+ "never_scrolled": "You must scroll to the bottom of the Terms and Conditions before accepting."
+ },
+ "errors": {
+ "acceptance": {
+ "message": "Eula Acceptance Error",
+ "description": "Something went wrong while accepting the EULA. Please try again."
+ }
+ }
+ },
"emails": {
"errors": {
"notsent": "Courriel non envoyé. Erreur rencontrée lors de l'envoi de {{message}}"
diff --git a/client/src/utils/day.js b/client/src/utils/day.js
index b16e16262..0b29aac61 100644
--- a/client/src/utils/day.js
+++ b/client/src/utils/day.js
@@ -32,11 +32,6 @@ import objectSupport from 'dayjs/plugin/objectSupport';
import toArray from 'dayjs/plugin/toArray';
import toObject from 'dayjs/plugin/toObject';
-// import badMutable from 'dayjs/plugin/badMutable';
-// import preParsePostFormat from 'dayjs/plugin/preParsePostFormat';
-
-
-// dayjs.extend(badMutable); // TODO: Client Update - This is not advised, scoreboard page
dayjs.extend(toObject);
dayjs.extend(toArray);
dayjs.extend(objectSupport);
@@ -46,7 +41,6 @@ dayjs.extend(isToday);
dayjs.extend(localeData);
dayjs.extend(quarterOfYear);
dayjs.extend(localizedFormat);
-// dayjs.extend(preParsePostFormat); // TODO: This should not be needed
dayjs.extend(isLeapYear);
dayjs.extend(isoWeeksInYear);
dayjs.extend(isoWeek);
diff --git a/client/src/utils/eulaize.js b/client/src/utils/eulaize.js
new file mode 100644
index 000000000..26b972f15
--- /dev/null
+++ b/client/src/utils/eulaize.js
@@ -0,0 +1,16 @@
+const fs = require('fs');
+
+
+const filename = process.argv[2];
+
+fs.readFile(filename, 'utf8', (err, data) => {
+ if (err) {
+ console.error(`Error reading file ${filename}:`, err);
+ return;
+ }
+ const filteredData = JSON.stringify(data);
+ console.log('Select the content between the quotes below and paste it into the EULA Content field in the EULA Content table in the database.')
+ console.log('--------------------------------------------------')
+ console.log(filteredData);
+ console.log('--------------------------------------------------')
+});
\ No newline at end of file
diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml
index fda2aa44a..a8e271f93 100644
--- a/hasura/metadata/tables.yaml
+++ b/hasura/metadata/tables.yaml
@@ -2442,7 +2442,7 @@
_eq: X-Hasura-User-Id
columns:
- address
- - buisness_name
+ - business_name
- date_accepted
- eulaid
- first_name
@@ -2454,7 +2454,7 @@
permission:
columns:
- address
- - buisness_name
+ - business_name
- first_name
- last_name
- phone_number
diff --git a/hasura/migrations/1705712927924_alter_table_public_eula_acceptances_alter_column_buisness_name/down.sql b/hasura/migrations/1705712927924_alter_table_public_eula_acceptances_alter_column_buisness_name/down.sql
new file mode 100644
index 000000000..8c4d38542
--- /dev/null
+++ b/hasura/migrations/1705712927924_alter_table_public_eula_acceptances_alter_column_buisness_name/down.sql
@@ -0,0 +1 @@
+alter table "public"."eula_acceptances" rename column "business_name" to "buisness_name";
diff --git a/hasura/migrations/1705712927924_alter_table_public_eula_acceptances_alter_column_buisness_name/up.sql b/hasura/migrations/1705712927924_alter_table_public_eula_acceptances_alter_column_buisness_name/up.sql
new file mode 100644
index 000000000..7dc59b9f6
--- /dev/null
+++ b/hasura/migrations/1705712927924_alter_table_public_eula_acceptances_alter_column_buisness_name/up.sql
@@ -0,0 +1 @@
+alter table "public"."eula_acceptances" rename column "buisness_name" to "business_name";
diff --git a/hasura/migrations/1705715500461_alter_table_public_eula_acceptances_alter_column_phone_number/down.sql b/hasura/migrations/1705715500461_alter_table_public_eula_acceptances_alter_column_phone_number/down.sql
new file mode 100644
index 000000000..08ab66099
--- /dev/null
+++ b/hasura/migrations/1705715500461_alter_table_public_eula_acceptances_alter_column_phone_number/down.sql
@@ -0,0 +1 @@
+alter table "public"."eula_acceptances" alter column "phone_number" set not null;
diff --git a/hasura/migrations/1705715500461_alter_table_public_eula_acceptances_alter_column_phone_number/up.sql b/hasura/migrations/1705715500461_alter_table_public_eula_acceptances_alter_column_phone_number/up.sql
new file mode 100644
index 000000000..de5721802
--- /dev/null
+++ b/hasura/migrations/1705715500461_alter_table_public_eula_acceptances_alter_column_phone_number/up.sql
@@ -0,0 +1 @@
+alter table "public"."eula_acceptances" alter column "phone_number" drop not null;
diff --git a/hasura/migrations/1705715523486_alter_table_public_eula_acceptances_alter_column_address/down.sql b/hasura/migrations/1705715523486_alter_table_public_eula_acceptances_alter_column_address/down.sql
new file mode 100644
index 000000000..fa66ebd58
--- /dev/null
+++ b/hasura/migrations/1705715523486_alter_table_public_eula_acceptances_alter_column_address/down.sql
@@ -0,0 +1 @@
+alter table "public"."eula_acceptances" alter column "address" set not null;
diff --git a/hasura/migrations/1705715523486_alter_table_public_eula_acceptances_alter_column_address/up.sql b/hasura/migrations/1705715523486_alter_table_public_eula_acceptances_alter_column_address/up.sql
new file mode 100644
index 000000000..d571c7cf3
--- /dev/null
+++ b/hasura/migrations/1705715523486_alter_table_public_eula_acceptances_alter_column_address/up.sql
@@ -0,0 +1 @@
+alter table "public"."eula_acceptances" alter column "address" drop not null;