From c593f5c061c63cf28efa59e20dd72c17f9dfdfce Mon Sep 17 00:00:00 2001 From: Vins Date: Thu, 4 Apr 2024 16:03:11 +0200 Subject: [PATCH 1/6] fixed manage billing --- src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts | 2 ++ .../Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts | 2 +- .../Layouts/Subscription/SubscriptionFacturation/index.tsx | 5 +++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts b/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts index 382e8666..365bc894 100644 --- a/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts +++ b/src/front/Api/LeCoffreApi/Admin/Stripe/Stripe.ts @@ -43,6 +43,8 @@ export default class Stripe extends BaseAdmin { } public async getClientPortalSession(stripe_subscription_id: string) { + console.log(stripe_subscription_id); + const url = new URL(this.baseURl.concat(`/${stripe_subscription_id}`)); try { return await this.getRequest(url); diff --git a/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts b/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts index c49d43e2..f6f89005 100644 --- a/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts +++ b/src/front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions.ts @@ -26,7 +26,7 @@ export default class Subscriptions extends BaseAdmin { const query = { q }; if (q) Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value))); try { - return await this.getRequest(url); + return await this.getRequest(url); } catch (err) { this.onError(err); return Promise.reject(err); diff --git a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx index 6cba1cac..a4485188 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionFacturation/index.tsx @@ -32,8 +32,9 @@ export default function SubscriptionFacturation() { const manageBilling = async () => { try { const jwt = JwtService.getInstance().decodeJwt(); - const subscription = await Subscriptions.getInstance().get({ officeId: jwt?.office_Id }); - const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription.stripe_subscription_id!); + const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } }); + if (!subscription[0]) return; + const stripe_client_portal = await Stripe.getInstance().getClientPortalSession(subscription[0].stripe_subscription_id!); router.push(stripe_client_portal.url); } catch (error) {} }; From 4a03df7dc88faacd26b55a9afc782b0bc14ee0c2 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 16:21:50 +0200 Subject: [PATCH 2/6] :sparkles: small modifications --- .../Subscription/Components/SubscriptionTicket/index.tsx | 5 ++++- .../Layouts/Subscription/SubscriptionInvite/index.tsx | 4 ---- .../Layouts/Subscription/SubscriptionNew/index.tsx | 2 +- .../Layouts/Subscription/SubscriptionSuccess/index.tsx | 3 ++- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx b/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx index 89d34d4c..2a940f5c 100644 --- a/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx +++ b/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx @@ -1,7 +1,10 @@ import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import classes from "./classes.module.scss"; +import { EForfeitType } from "../../SubscriptionFacturation"; -type IProps = {}; +type IProps = { + forfeitType: EForfeitType; +}; export default function SubscriptionTicket(props: IProps) { return (
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx index 82dbcccb..2e4836a0 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -10,10 +10,6 @@ import { useCallback, useState } from "react"; import { TrashIcon } from "@heroicons/react/24/outline"; import PlusIcon from "@Assets/Icons/plus.svg"; -export enum EForfeitType { - "standard", - "unlimited", -} type EmailLine = { element: JSX.Element; id: number; diff --git a/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx index accd6b67..dd780c11 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionNew/index.tsx @@ -8,7 +8,7 @@ import Link from "next/link"; export default function SubscriptionNew() { return ( - +
diff --git a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx index 2f79ee80..c9cff7d5 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx @@ -7,6 +7,7 @@ import SubscriptionClientInfos from "../Components/SubscriptionClientInfos"; import Button from "@Front/Components/DesignSystem/Button"; import Link from "next/link"; import Module from "@Front/Config/Module"; +import { EForfeitType } from "../SubscriptionFacturation"; export default function SubscriptionSuccess() { return ( @@ -36,7 +37,7 @@ export default function SubscriptionSuccess() {
- +
From 239b73381e825659914fc6ef700028a97257d07a Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 16:32:21 +0200 Subject: [PATCH 3/6] :sparkles: Checkout ticket working --- .../SubscribeCheckoutTicket/index.tsx | 15 ++-- .../SubscriptionTicket/classes.module.scss | 31 ------- .../Components/SubscriptionTicket/index.tsx | 87 ------------------- .../SubscriptionError/classes.module.scss | 4 + .../SubscriptionSuccess/classes.module.scss | 4 + .../SubscriptionSuccess/index.tsx | 9 +- 6 files changed, 25 insertions(+), 125 deletions(-) delete mode 100644 src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/classes.module.scss delete mode 100644 src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx diff --git a/src/front/Components/Layouts/Subscription/Components/SubscribeCheckoutTicket/index.tsx b/src/front/Components/Layouts/Subscription/Components/SubscribeCheckoutTicket/index.tsx index 261bab7d..87d421cb 100644 --- a/src/front/Components/Layouts/Subscription/Components/SubscribeCheckoutTicket/index.tsx +++ b/src/front/Components/Layouts/Subscription/Components/SubscribeCheckoutTicket/index.tsx @@ -21,6 +21,7 @@ type IProps = { numberOfCollaborators: number; hasNavTab?: boolean; defaultFrequency?: EPaymentFrequency; + disableInputs?: boolean; }; export enum EPaymentFrequency { @@ -72,14 +73,16 @@ export default function SubscribeCheckoutTicket(props: IProps) { name="paymentFrequency" value={EPaymentFrequency.yearly.toString()} onChange={handleFrequencyChange} - defaultChecked={paymentFrequency === EPaymentFrequency.yearly}> + defaultChecked={paymentFrequency === EPaymentFrequency.yearly} + disabled={props.disableInputs}> Annuel + defaultChecked={paymentFrequency === EPaymentFrequency.monthly} + disabled={props.disableInputs}> Mensuel
@@ -186,9 +189,11 @@ export default function SubscribeCheckoutTicket(props: IProps) { )}
- + {!props.disableInputs && ( + + )} ); diff --git a/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/classes.module.scss b/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/classes.module.scss deleted file mode 100644 index a0312271..00000000 --- a/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/classes.module.scss +++ /dev/null @@ -1,31 +0,0 @@ -.root { - width: 372px; - display: flex; - flex-direction: column; - gap: 40px; - - box-shadow: 0px 8px 10px 0px #00000012; - padding: 24px; - border-radius: 16px; - .top-category { - display: flex; - justify-content: center; - align-items: center; - } - - .category { - display: flex; - flex-direction: column; - gap: 8px; - .line { - display: flex; - justify-content: space-between; - } - } - - .separator { - width: 100%; - height: 2px; - background: var(--grey-medium); - } -} diff --git a/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx b/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx deleted file mode 100644 index 2a940f5c..00000000 --- a/src/front/Components/Layouts/Subscription/Components/SubscriptionTicket/index.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; -import classes from "./classes.module.scss"; -import { EForfeitType } from "../../SubscriptionFacturation"; - -type IProps = { - forfeitType: EForfeitType; -}; -export default function SubscriptionTicket(props: IProps) { - return ( -
-
- - Récapitulatif - -
-
- -
- - Forfait standard - -
-
-
-
- - Plan individuel - - - 99 € - -
-
- - 2 collaborateurs - - - 13,98 € - -
-
- - 6,99 € x 2 - -
-
-
-
-
- - Sous-total - - - 112,98 € - -
-
- - FR TVA - - - 14 € - -
-
- - Taxes - - - 14 € - -
-
-
-
-
- - Total - - - 112,98 € - -
-
-
- ); -} diff --git a/src/front/Components/Layouts/Subscription/SubscriptionError/classes.module.scss b/src/front/Components/Layouts/Subscription/SubscriptionError/classes.module.scss index c0508d64..e7d63d20 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionError/classes.module.scss +++ b/src/front/Components/Layouts/Subscription/SubscriptionError/classes.module.scss @@ -3,7 +3,11 @@ gap: 104px; justify-content: center; + max-width: 1200px; + margin: auto; + .left { + flex: 1; display: flex; flex-direction: column; gap: 32px; diff --git a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/classes.module.scss b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/classes.module.scss index c0508d64..e7d63d20 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/classes.module.scss +++ b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/classes.module.scss @@ -3,7 +3,11 @@ gap: 104px; justify-content: center; + max-width: 1200px; + margin: auto; + .left { + flex: 1; display: flex; flex-direction: column; gap: 32px; diff --git a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx index c9cff7d5..64d70294 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx @@ -1,6 +1,5 @@ import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import classes from "./classes.module.scss"; -import SubscriptionTicket from "../Components/SubscriptionTicket"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import MessageBox from "@Front/Components/Elements/MessageBox"; import SubscriptionClientInfos from "../Components/SubscriptionClientInfos"; @@ -8,6 +7,7 @@ import Button from "@Front/Components/DesignSystem/Button"; import Link from "next/link"; import Module from "@Front/Config/Module"; import { EForfeitType } from "../SubscriptionFacturation"; +import SubscribeCheckoutTicket, { EPaymentFrequency } from "../Components/SubscribeCheckoutTicket"; export default function SubscriptionSuccess() { return ( @@ -37,7 +37,12 @@ export default function SubscriptionSuccess() {
- +
From 493b2d8a80ef2ff77045cafcc86ef86da95f95eb Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 16:33:35 +0200 Subject: [PATCH 4/6] :sparkles: mocked number --- .../Layouts/Subscription/SubscriptionSuccess/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx index 64d70294..a2b5b2a6 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx @@ -9,6 +9,7 @@ import Module from "@Front/Config/Module"; import { EForfeitType } from "../SubscriptionFacturation"; import SubscribeCheckoutTicket, { EPaymentFrequency } from "../Components/SubscribeCheckoutTicket"; +let numberOfCollaborators = 5; export default function SubscriptionSuccess() { return ( @@ -32,14 +33,18 @@ export default function SubscriptionSuccess() {
- +
From f5ce057a26bb25b1cf78e3987fad4d1748cb262b Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 4 Apr 2024 16:53:01 +0200 Subject: [PATCH 5/6] :sparkles: load subscription in success/error --- .../Subscription/SubscriptionError/index.tsx | 86 +++++++++----- .../Subscription/SubscriptionInvite/index.tsx | 2 + .../SubscriptionSuccess/index.tsx | 106 ++++++++++++------ 3 files changed, 134 insertions(+), 60 deletions(-) diff --git a/src/front/Components/Layouts/Subscription/SubscriptionError/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionError/index.tsx index 22dc4b5c..1c9cab17 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionError/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionError/index.tsx @@ -1,41 +1,77 @@ import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import classes from "./classes.module.scss"; -import SubscriptionTicket from "../Components/SubscriptionTicket"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import MessageBox from "@Front/Components/Elements/MessageBox"; import SubscriptionClientInfos from "../Components/SubscriptionClientInfos"; import Button from "@Front/Components/DesignSystem/Button"; +import { useCallback, useEffect, useState } from "react"; +import { Subscription } from "le-coffre-resources/dist/Admin"; +import JwtService from "@Front/Services/JwtService/JwtService"; +import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; +import SubscribeCheckoutTicket, { EPaymentFrequency } from "../Components/SubscribeCheckoutTicket"; +import { EForfeitType } from "../SubscriptionFacturation"; export default function SubscriptionError() { + const [subscription, setSubscription] = useState(null); + + const loadSubscription = useCallback(async () => { + const jwt = JwtService.getInstance().decodeJwt(); + const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } }); + console.log(subscription); + if (!subscription[0]) return; + setSubscription(subscription[0]); + }, []); + + const getFrequency = useCallback(() => { + if (!subscription) return; + const start = new Date(subscription.start_date); + const end = new Date(subscription.end_date); + + const diffTime = Math.abs(end.getTime() - start.getTime()); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + return diffDays >= 365 ? EPaymentFrequency.yearly : EPaymentFrequency.monthly; + }, [subscription]); + + useEffect(() => { + loadSubscription(); + }, [loadSubscription]); + return ( -
-
-
- - Paiement échoué - + {subscription && ( +
+
+
+ + Paiement échoué + +
+
+ + Votre transaction n'a pas pu être complétée. +
+
+ Malheureusement, nous n'avons pas pu traiter votre paiement et votre abonnement n'a pas été activé. Veuillez + vérifier vos informations de paiement et essayer à nouveau. +
+
+
+
+ +
+
+
-
- - Votre transaction n'a pas pu être complétée. -
-
- Malheureusement, nous n'avons pas pu traiter votre paiement et votre abonnement n'a pas été activé. Veuillez - vérifier vos informations de paiement et essayer à nouveau. -
+
+
-
-
- -
-
-
-
- -
-
+ )} ); } diff --git a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx index 2e4836a0..eb3fa504 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionInvite/index.tsx @@ -9,6 +9,7 @@ import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscripti import { useCallback, useState } from "react"; import { TrashIcon } from "@heroicons/react/24/outline"; import PlusIcon from "@Assets/Icons/plus.svg"; +import Module from "@Front/Config/Module"; type EmailLine = { element: JSX.Element; @@ -51,6 +52,7 @@ export default function SubscriptionInvite() { await Subscriptions.getInstance().post({ emails, }); + router.push(Module.getInstance().get().modules.pages.Subscription.pages.Manage.props.path); } catch (e) { console.error(e); } diff --git a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx index a2b5b2a6..6a4c2666 100644 --- a/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx +++ b/src/front/Components/Layouts/Subscription/SubscriptionSuccess/index.tsx @@ -8,48 +8,84 @@ import Link from "next/link"; import Module from "@Front/Config/Module"; import { EForfeitType } from "../SubscriptionFacturation"; import SubscribeCheckoutTicket, { EPaymentFrequency } from "../Components/SubscribeCheckoutTicket"; +import { useCallback, useEffect, useState } from "react"; +import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; +import JwtService from "@Front/Services/JwtService/JwtService"; +import { Subscription } from "le-coffre-resources/dist/Admin"; -let numberOfCollaborators = 5; export default function SubscriptionSuccess() { + const [subscription, setSubscription] = useState(null); + + const loadSubscription = useCallback(async () => { + const jwt = JwtService.getInstance().decodeJwt(); + const subscription = await Subscriptions.getInstance().get({ where: { office: { uid: jwt?.office_Id } } }); + console.log(subscription); + if (!subscription[0]) return; + setSubscription(subscription[0]); + }, []); + + const getFrequency = useCallback(() => { + if (!subscription) return; + const start = new Date(subscription.start_date); + const end = new Date(subscription.end_date); + + const diffTime = Math.abs(end.getTime() - start.getTime()); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + return diffDays >= 365 ? EPaymentFrequency.yearly : EPaymentFrequency.monthly; + }, [subscription]); + + useEffect(() => { + loadSubscription(); + }, [loadSubscription]); + return ( -
-
-
- - Abonnement réussi ! - + {subscription && ( +
+
+
+ + Abonnement réussi ! + +
+
+ + Votre transaction a été effectuée avec succès ! +
+
+ Votre abonnement a été pris en compte et est désormais actif. +
+
+
+
+ +
+
+ {subscription.type === "STANDARD" && ( + + + + )} + {subscription.type === "UNLIMITED" && ( + + + + )}
-
- - Votre transaction a été effectuée avec succès ! -
-
- Votre abonnement a été pris en compte et est désormais actif. -
+
+
-
-
- -
-
- - -
-
- -
-
+ )} ); } From 173481521c423801dfd40ef6d19507c13455d719 Mon Sep 17 00:00:00 2001 From: Vins Date: Thu, 4 Apr 2024 16:57:05 +0200 Subject: [PATCH 6/6] Changed login error wording --- src/front/Components/Layouts/Login/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/Components/Layouts/Login/index.tsx b/src/front/Components/Layouts/Login/index.tsx index 7c8ca0a1..0069ad29 100644 --- a/src/front/Components/Layouts/Login/index.tsx +++ b/src/front/Components/Layouts/Login/index.tsx @@ -77,7 +77,7 @@ export default function Login() { confirmText={"OK"}>
- Une erreur est survenue lors de la connexion. Veuillez réessayer. + Vous ne disposez pas d'un abonnement, veuillez contacter l'administrateur de votre office.