Merge branch 'dev' into staging

This commit is contained in:
Maxime Lalo 2024-04-04 15:35:42 +02:00
commit 7ee21e0e11
28 changed files with 663 additions and 262 deletions

View File

@ -19,6 +19,7 @@ export const collaboratorPrice = 6.99;
type IProps = { type IProps = {
forfeitType: EForfeitType; forfeitType: EForfeitType;
numberOfCollaborators: number; numberOfCollaborators: number;
hasNavTab?: boolean;
defaultFrequency?: EPaymentFrequency; defaultFrequency?: EPaymentFrequency;
}; };
@ -29,7 +30,7 @@ export enum EPaymentFrequency {
export default function SubscribeCheckoutTicket(props: IProps) { export default function SubscribeCheckoutTicket(props: IProps) {
const router = useRouter(); const router = useRouter();
const { forfeitType, numberOfCollaborators } = props; const { forfeitType, numberOfCollaborators, hasNavTab = true } = props;
const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(props.defaultFrequency ?? EPaymentFrequency.monthly); const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(props.defaultFrequency ?? EPaymentFrequency.monthly);
const [multiplier, setMultiplier] = useState<number>(1); const [multiplier, setMultiplier] = useState<number>(1);
@ -186,7 +187,7 @@ export default function SubscribeCheckoutTicket(props: IProps) {
</div> </div>
</div> </div>
<Button onClick={handleSubmitPayment} fullwidth className={classes["payment-button"]}> <Button onClick={handleSubmitPayment} fullwidth className={classes["payment-button"]}>
Passer au paiement {hasNavTab ? "Passer au paiement" : "Mettre à jour l'abonnement"}
</Button> </Button>
</div> </div>
</div> </div>

View File

@ -0,0 +1,98 @@
@import "@Themes/constants.scss";
.root {
display: flex;
justify-content: space-between;
gap: 104px;
max-width: 1400px;
margin: auto;
@media (max-width: $screen-m) {
margin-top: 40px;
margin-bottom: 40px;
gap: 72px;
}
@media (max-width: $screen-s) {
margin-bottom: 50px;
}
.left {
display: flex;
gap: 40px;
flex-direction: column;
.infos-container {
display: flex;
flex-direction: column;
gap: 16px;
.line {
svg {
min-width: 24px;
min-height: 24px;
}
display: flex;
gap: 16px;
}
}
}
.right {
width: 372px;
@media (max-width: $screen-m) {
margin-top: 50px;
}
@media (max-width: $screen-s) {
display: none;
}
}
button {
@media (max-width: $screen-s) {
display: none;
}
}
}
.bottom {
display: none;
position: sticky;
bottom: 0px;
flex-direction: column;
justify-content: center;
gap: 32px;
box-shadow: 0px 8px 10px 0px #00000012;
padding: 22px 16px;
border-radius: 16px 16px 0 0;
background: white;
@media (max-width: $screen-s) {
display: flex;
}
box-shadow: 0px 4px 24px 0px #00000026;
.forfeit-type {
text-align: center;
}
.container-frequency {
display: flex;
justify-content: space-between;
}
.separator {
width: 100%;
height: 1px;
background-color: gray;
}
.container-line {
display: flex;
justify-content: space-between;
gap: 24px;
}
.container-tight {
gap: 8px;
}
}

View File

@ -0,0 +1,131 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import NavTab from "@Front/Components/Elements/NavTab";
import SubscribeCheckoutTicket, { EPaymentFrequency, forfeitsPrices } from "../SubscribeCheckoutTicket";
import { EForfeitType } from "../../SubscriptionFacturation";
import { useEffect, useState } from "react";
import Check from "@Front/Components/Elements/Icons/Check";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import RadioBox from "@Front/Components/DesignSystem/RadioBox";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import useOpenable from "@Front/Hooks/useOpenable";
type IProps = {
hasNavTab?: boolean;
};
export default function SubscribeIllimityComponent({ hasNavTab = true }: IProps) {
const { close, isOpen, open } = useOpenable();
const formatFloat = (value: number) => {
return value.toFixed(2).replace(".", ",");
};
const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(EPaymentFrequency.monthly);
const [multiplier, setMultiplier] = useState<number>(1);
useEffect(() => {
setMultiplier(paymentFrequency === EPaymentFrequency.monthly ? 1 : 12);
}, [paymentFrequency]);
const handleFrequencyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setPaymentFrequency(parseInt(e.target.value) as EPaymentFrequency);
};
return (
<>
<DefaultTemplate title="Nouvelle souscription" hasBackArrow>
<div className={classes["root"]}>
<div className={classes["left"]}>
{hasNavTab && (
<NavTab
items={[
{ label: "Forfait standard", path: "/subscription/subscribe/standard" },
{ label: "Forfait illimité", path: "/subscription/subscribe/illimity" },
]}
/>
)}
<Typography typo={ITypo.H2} color={ITypoColor.BLACK}>
Nombre de collaborateurs illimité
</Typography>
<div className={classes["infos-container"]}>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Accompagnement facilité : profitez d'un onboarding individualisé, nous vous guidons pour une prise en
main optimale de l'application
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Support technique : notre équipe support est disponible pour vous assister en cas dincident
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Mises à jour régulières : bénéficiez de mises à jour fréquentes pour profiter des dernières
fonctionnalités, améliorations de sécurité et performances optimisées
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.BLACK} />
<Typography typo={ITypo.P_16} color={ITypoColor.BLACK}>
Sans limite d'utilisateurs
</Typography>
</div>
</div>
</div>
<div className={classes["right"]}>
<SubscribeCheckoutTicket forfeitType={EForfeitType.unlimited} numberOfCollaborators={1} hasNavTab={hasNavTab} />
</div>
</div>
</DefaultTemplate>
<Confirm isOpen={isOpen} onClose={close} showCancelButton={false} confirmText={"Passer au paiement"} closeBtn onAccept={close}>
<SubscribeCheckoutTicket
hasNavTab={hasNavTab}
forfeitType={EForfeitType.unlimited}
numberOfCollaborators={1}
defaultFrequency={paymentFrequency}
/>
</Confirm>
<div className={classes["bottom"]}>
<div className={classes["container-frequency"]}>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.yearly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.yearly}>
<Typography typo={ITypo.P_ERR_18}>Annuel</Typography>
</RadioBox>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.monthly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.monthly}>
<Typography typo={ITypo.P_ERR_18}>Mensuel</Typography>
</RadioBox>
</div>
<div className={classes["separator"]} />
<div className={classes["container-line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Total TTC
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
{formatFloat(forfeitsPrices[EForfeitType.unlimited] * 1.2 * multiplier)}
&nbsp;
</Typography>
</div>
<div className={classes["voir-recap"]}>
<Button fullwidth variant={EButtonVariant.LINE} onClick={open}>
Voir le récapitulatif plus en détail
</Button>
</div>
<div className={classes["payment-button"]}>
<Button fullwidth>{hasNavTab ? "Passer au paiement" : "Mettre à jour l'abonnement"}</Button>
</div>
</div>
</>
);
}

View File

@ -0,0 +1,98 @@
@import "@Themes/constants.scss";
.root {
display: flex;
justify-content: space-between;
gap: 104px;
max-width: 1400px;
margin: auto;
@media (max-width: $screen-m) {
margin-top: 40px;
margin-bottom: 40px;
gap: 72px;
}
@media (max-width: $screen-s) {
margin-bottom: 50px;
}
.left {
display: flex;
gap: 40px;
flex-direction: column;
.infos-container {
display: flex;
flex-direction: column;
gap: 16px;
.line {
svg {
min-width: 24px;
min-height: 24px;
}
display: flex;
gap: 16px;
}
}
}
.right {
width: 372px;
@media (max-width: $screen-m) {
margin-top: 50px;
}
@media (max-width: $screen-s) {
display: none;
}
}
button {
@media (max-width: $screen-s) {
display: none;
}
}
}
.bottom {
display: none;
position: sticky;
bottom: 0px;
flex-direction: column;
justify-content: center;
gap: 32px;
box-shadow: 0px 8px 10px 0px #00000012;
padding: 22px 16px;
border-radius: 16px 16px 0 0;
background: white;
@media (max-width: $screen-s) {
display: flex;
}
box-shadow: 0px 4px 24px 0px #00000026;
.forfeit-type {
text-align: center;
}
.container-frequency {
display: flex;
justify-content: space-between;
}
.separator {
width: 100%;
height: 1px;
background-color: gray;
}
.container-line {
display: flex;
justify-content: space-between;
gap: 24px;
}
.container-tight {
gap: 8px;
}
}

View File

@ -0,0 +1,139 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import NavTab from "@Front/Components/Elements/NavTab";
import NumberPicker from "@Front/Components/Elements/NumberPicker";
import SubscribeCheckoutTicket, { EPaymentFrequency, collaboratorPrice, forfeitsPrices } from "../SubscribeCheckoutTicket";
import { EForfeitType } from "../../SubscriptionFacturation";
import { useEffect, useState } from "react";
import Check from "@Front/Components/Elements/Icons/Check";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import RadioBox from "@Front/Components/DesignSystem/RadioBox";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import useOpenable from "@Front/Hooks/useOpenable";
// import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe";
// import { EType } from "le-coffre-resources/dist/Admin/Subscription";
type IProps = {
hasNavTab?: boolean;
};
export default function SubscribeStandardComponent({ hasNavTab = true }: IProps) {
const [numberOfCollaborators, setNumberOfCollaborators] = useState(1);
const { close, isOpen, open } = useOpenable();
const handleCollaboratorsChange = (value: number) => {
setNumberOfCollaborators(value);
};
const formatFloat = (value: number) => {
return value.toFixed(2).replace(".", ",");
};
const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(EPaymentFrequency.monthly);
const [multiplier, setMultiplier] = useState<number>(1);
useEffect(() => {
setMultiplier(paymentFrequency === EPaymentFrequency.monthly ? 1 : 12);
}, [paymentFrequency]);
const handleFrequencyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setPaymentFrequency(parseInt(e.target.value) as EPaymentFrequency);
};
return (
<>
<DefaultTemplate title="Nouvelle souscription" hasBackArrow>
<div className={classes["root"]}>
<div className={classes["left"]}>
{hasNavTab && (
<NavTab
items={[
{ label: "Forfait standard", path: "/subscription/subscribe/standard" },
{ label: "Forfait illimité", path: "/subscription/subscribe/illimity" },
]}
/>
)}
<Typography typo={ITypo.H2} color={ITypoColor.BLACK}>
Choisissez le nombre de collaborateurs pour votre abonnement
</Typography>
<NumberPicker defaultValue={1} onChange={handleCollaboratorsChange} min={1} />
<div className={classes["infos-container"]}>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Accompagnement facilité : profitez d'un onboarding individualisé, nous vous guidons pour une prise en
main optimale de l'application
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Support technique : notre équipe support est disponible pour vous assister en cas dincident
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Mises à jour régulières : bénéficiez de mises à jour fréquentes pour profiter des dernières
fonctionnalités, améliorations de sécurité et performances optimisées
</Typography>
</div>
</div>
</div>
<div className={classes["right"]}>
<SubscribeCheckoutTicket
forfeitType={EForfeitType.standard}
numberOfCollaborators={numberOfCollaborators}
hasNavTab={hasNavTab}
/>
</div>
</div>
</DefaultTemplate>
<Confirm isOpen={isOpen} onClose={close} showCancelButton={false} confirmText={"Passer au paiement"} closeBtn onAccept={close}>
<SubscribeCheckoutTicket
forfeitType={EForfeitType.standard}
numberOfCollaborators={numberOfCollaborators}
defaultFrequency={paymentFrequency}
hasNavTab={hasNavTab}
/>
</Confirm>
<div className={classes["bottom"]}>
<div className={classes["container-frequency"]}>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.yearly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.yearly}>
<Typography typo={ITypo.P_ERR_18}>Annuel</Typography>
</RadioBox>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.monthly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.monthly}>
<Typography typo={ITypo.P_ERR_18}>Mensuel</Typography>
</RadioBox>
</div>
<div className={classes["separator"]} />
<div className={classes["container-line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Total TTC
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
{formatFloat(
(forfeitsPrices[EForfeitType.standard] + collaboratorPrice * numberOfCollaborators) * 1.2 * multiplier,
)}
&nbsp;
</Typography>
</div>
<div className={classes["voir-recap"]}>
<Button fullwidth variant={EButtonVariant.LINE} onClick={open}>
Voir le récapitulatif plus en détail
</Button>
</div>
<div className={classes["payment-button"]}>
<Button fullwidth>Passer au paiement</Button>
</div>
</div>
</>
);
}

View File

@ -0,0 +1,5 @@
import SubscribeIllimityComponent from "../../Components/SubscribeIllimityComponent";
export default function SubscribeManageIllimity() {
return <SubscribeIllimityComponent hasNavTab={false} />;
}

View File

@ -0,0 +1,98 @@
@import "@Themes/constants.scss";
.root {
display: flex;
justify-content: space-between;
gap: 104px;
max-width: 1400px;
margin: auto;
@media (max-width: $screen-m) {
margin-top: 40px;
margin-bottom: 40px;
gap: 72px;
}
@media (max-width: $screen-s) {
margin-bottom: 50px;
}
.left {
display: flex;
gap: 40px;
flex-direction: column;
.infos-container {
display: flex;
flex-direction: column;
gap: 16px;
.line {
svg {
min-width: 24px;
min-height: 24px;
}
display: flex;
gap: 16px;
}
}
}
.right {
width: 372px;
@media (max-width: $screen-m) {
margin-top: 50px;
}
@media (max-width: $screen-s) {
display: none;
}
}
button {
@media (max-width: $screen-s) {
display: none;
}
}
}
.bottom {
display: none;
position: sticky;
bottom: 0px;
flex-direction: column;
justify-content: center;
gap: 32px;
box-shadow: 0px 8px 10px 0px #00000012;
padding: 22px 16px;
border-radius: 16px 16px 0 0;
background: white;
@media (max-width: $screen-s) {
display: flex;
}
box-shadow: 0px 4px 24px 0px #00000026;
.forfeit-type {
text-align: center;
}
.container-frequency {
display: flex;
justify-content: space-between;
}
.separator {
width: 100%;
height: 1px;
background-color: gray;
}
.container-line {
display: flex;
justify-content: space-between;
gap: 24px;
}
.container-tight {
gap: 8px;
}
}

View File

@ -0,0 +1,5 @@
import SubscribeStandardComponent from "../../Components/SubscribeStandardComponent";
export default function SubscribeManageStandard() {
return <SubscribeStandardComponent hasNavTab={false} />;
}

View File

@ -1,125 +1,5 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import SubscribeIllimityComponent from "../../Components/SubscribeIllimityComponent";
import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import NavTab from "@Front/Components/Elements/NavTab";
import SubscribeCheckoutTicket, { EPaymentFrequency, forfeitsPrices } from "../SubscribeCheckoutTicket";
import { EForfeitType } from "../../SubscriptionFacturation";
import { useEffect, useState } from "react";
import Check from "@Front/Components/Elements/Icons/Check";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import RadioBox from "@Front/Components/DesignSystem/RadioBox";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import useOpenable from "@Front/Hooks/useOpenable";
export default function SubscribeIllimity() { export default function SubscribeIllimity() {
const { close, isOpen, open } = useOpenable(); return <SubscribeIllimityComponent />;
const formatFloat = (value: number) => {
return value.toFixed(2).replace(".", ",");
};
const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(EPaymentFrequency.monthly);
const [multiplier, setMultiplier] = useState<number>(1);
useEffect(() => {
setMultiplier(paymentFrequency === EPaymentFrequency.monthly ? 1 : 12);
}, [paymentFrequency]);
const handleFrequencyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setPaymentFrequency(parseInt(e.target.value) as EPaymentFrequency);
};
return (
<>
<DefaultTemplate title="Nouvelle souscription" hasBackArrow>
<div className={classes["root"]}>
<div className={classes["left"]}>
<NavTab
items={[
{ label: "Forfait standard", path: "/subscription/subscribe/standard" },
{ label: "Forfait illimité", path: "/subscription/subscribe/illimity" },
]}
/>
<Typography typo={ITypo.H2} color={ITypoColor.BLACK}>
Nombre de collaborateurs illimité
</Typography>
<div className={classes["infos-container"]}>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Accompagnement facilité : profitez d'un onboarding individualisé, nous vous guidons pour une prise en
main optimale de l'application
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Support technique : notre équipe support est disponible pour vous assister en cas dincident
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Mises à jour régulières : bénéficiez de mises à jour fréquentes pour profiter des dernières
fonctionnalités, améliorations de sécurité et performances optimisées
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.BLACK} />
<Typography typo={ITypo.P_16} color={ITypoColor.BLACK}>
Sans limite d'utilisateurs
</Typography>
</div>
</div>
</div>
<div className={classes["right"]}>
<SubscribeCheckoutTicket forfeitType={EForfeitType.unlimited} numberOfCollaborators={1} />
</div>
</div>
</DefaultTemplate>
<Confirm isOpen={isOpen} onClose={close} showCancelButton={false} confirmText={"Passer au paiement"} closeBtn onAccept={close}>
<SubscribeCheckoutTicket
forfeitType={EForfeitType.unlimited}
numberOfCollaborators={1}
defaultFrequency={paymentFrequency}
/>
</Confirm>
<div className={classes["bottom"]}>
<div className={classes["container-frequency"]}>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.yearly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.yearly}>
<Typography typo={ITypo.P_ERR_18}>Annuel</Typography>
</RadioBox>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.monthly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.monthly}>
<Typography typo={ITypo.P_ERR_18}>Mensuel</Typography>
</RadioBox>
</div>
<div className={classes["separator"]} />
<div className={classes["container-line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Total TTC
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
{formatFloat(forfeitsPrices[EForfeitType.unlimited] * 1.2 * multiplier)}
&nbsp;
</Typography>
</div>
<div className={classes["voir-recap"]}>
<Button fullwidth variant={EButtonVariant.LINE} onClick={open}>
Voir le récapitulatif plus en détail
</Button>
</div>
<div className={classes["payment-button"]}>
<Button fullwidth>Passer au paiement</Button>
</div>
</div>
</>
);
} }

View File

@ -1,129 +1,5 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import SubscribeStandardComponent from "../../Components/SubscribeStandardComponent";
import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import NavTab from "@Front/Components/Elements/NavTab";
import NumberPicker from "@Front/Components/Elements/NumberPicker";
import SubscribeCheckoutTicket, { EPaymentFrequency, collaboratorPrice, forfeitsPrices } from "../SubscribeCheckoutTicket";
import { EForfeitType } from "../../SubscriptionFacturation";
import { useEffect, useState } from "react";
import Check from "@Front/Components/Elements/Icons/Check";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import RadioBox from "@Front/Components/DesignSystem/RadioBox";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import useOpenable from "@Front/Hooks/useOpenable";
// import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe";
// import { EType } from "le-coffre-resources/dist/Admin/Subscription";
export default function SubscribeStandard() { export default function SubscribeStandard() {
const [numberOfCollaborators, setNumberOfCollaborators] = useState(1); return <SubscribeStandardComponent />;
const { close, isOpen, open } = useOpenable();
const handleCollaboratorsChange = (value: number) => {
setNumberOfCollaborators(value);
};
const formatFloat = (value: number) => {
return value.toFixed(2).replace(".", ",");
};
const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(EPaymentFrequency.monthly);
const [multiplier, setMultiplier] = useState<number>(1);
useEffect(() => {
setMultiplier(paymentFrequency === EPaymentFrequency.monthly ? 1 : 12);
}, [paymentFrequency]);
const handleFrequencyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setPaymentFrequency(parseInt(e.target.value) as EPaymentFrequency);
};
return (
<>
<DefaultTemplate title="Nouvelle souscription" hasBackArrow>
<div className={classes["root"]}>
<div className={classes["left"]}>
<NavTab
items={[
{ label: "Forfait standard", path: "/subscription/subscribe/standard" },
{ label: "Forfait illimité", path: "/subscription/subscribe/illimity" },
]}
/>
<Typography typo={ITypo.H2} color={ITypoColor.BLACK}>
Choisissez le nombre de collaborateurs pour votre abonnement
</Typography>
<NumberPicker defaultValue={1} onChange={handleCollaboratorsChange} min={1} />
<div className={classes["infos-container"]}>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Accompagnement facilité : profitez d'un onboarding individualisé, nous vous guidons pour une prise en
main optimale de l'application
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Support technique : notre équipe support est disponible pour vous assister en cas dincident
</Typography>
</div>
<div className={classes["line"]}>
<Check color={ITypoColor.GREY} />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Mises à jour régulières : bénéficiez de mises à jour fréquentes pour profiter des dernières
fonctionnalités, améliorations de sécurité et performances optimisées
</Typography>
</div>
</div>
</div>
<div className={classes["right"]}>
<SubscribeCheckoutTicket forfeitType={EForfeitType.standard} numberOfCollaborators={numberOfCollaborators} />
</div>
</div>
</DefaultTemplate>
<Confirm isOpen={isOpen} onClose={close} showCancelButton={false} confirmText={"Passer au paiement"} closeBtn onAccept={close}>
<SubscribeCheckoutTicket
forfeitType={EForfeitType.standard}
numberOfCollaborators={numberOfCollaborators}
defaultFrequency={paymentFrequency}
/>
</Confirm>
<div className={classes["bottom"]}>
<div className={classes["container-frequency"]}>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.yearly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.yearly}>
<Typography typo={ITypo.P_ERR_18}>Annuel</Typography>
</RadioBox>
<RadioBox
name="paymentFrequencyInSubscription"
value={EPaymentFrequency.monthly.toString()}
onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.monthly}>
<Typography typo={ITypo.P_ERR_18}>Mensuel</Typography>
</RadioBox>
</div>
<div className={classes["separator"]} />
<div className={classes["container-line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Total TTC
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
{formatFloat(
(forfeitsPrices[EForfeitType.standard] + collaboratorPrice * numberOfCollaborators) * 1.2 * multiplier,
)}
&nbsp;
</Typography>
</div>
<div className={classes["voir-recap"]}>
<Button fullwidth variant={EButtonVariant.LINE} onClick={open}>
Voir le récapitulatif plus en détail
</Button>
</div>
<div className={classes["payment-button"]}>
<Button fullwidth>Passer au paiement</Button>
</div>
</div>
</>
);
} }

View File

@ -1,9 +1,9 @@
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import SubscriptionTicket from "../SubscriptionTicket"; import SubscriptionTicket from "../Components/SubscriptionTicket";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import MessageBox from "@Front/Components/Elements/MessageBox"; import MessageBox from "@Front/Components/Elements/MessageBox";
import SubscriptionClientInfos from "../SubscriptionClientInfos"; import SubscriptionClientInfos from "../Components/SubscriptionClientInfos";
import Button from "@Front/Components/DesignSystem/Button"; import Button from "@Front/Components/DesignSystem/Button";
export default function SubscriptionError() { export default function SubscriptionError() {

View File

@ -87,8 +87,7 @@ export default function SubscriptionFacturation() {
</div> </div>
<div className={classes["button-container"]}> <div className={classes["button-container"]}>
{forfeitType !== EForfeitType.standard && ( {forfeitType !== EForfeitType.standard && (
<Link <Link href={Module.getInstance().get().modules.pages.Subscription.pages.Manage.pages.Standard.props.path}>
href={Module.getInstance().get().modules.pages.Subscription.pages.Subscribe.pages.Standard.props.path}>
<Button fullwidth variant={EButtonVariant.GHOST}> <Button fullwidth variant={EButtonVariant.GHOST}>
Rétrograder mon abonnement Rétrograder mon abonnement
</Button> </Button>
@ -97,9 +96,7 @@ export default function SubscriptionFacturation() {
{forfeitType === EForfeitType.standard && ( {forfeitType === EForfeitType.standard && (
<> <>
<Link <Link
href={ href={Module.getInstance().get().modules.pages.Subscription.pages.Manage.pages.Standard.props.path}>
Module.getInstance().get().modules.pages.Subscription.pages.Subscribe.pages.Standard.props.path
}>
<Button fullwidth variant={EButtonVariant.PRIMARY}> <Button fullwidth variant={EButtonVariant.PRIMARY}>
Gérer mon abonnement Gérer mon abonnement
</Button> </Button>
@ -151,8 +148,7 @@ export default function SubscriptionFacturation() {
</Button> </Button>
)} )}
{forfeitType === EForfeitType.standard && ( {forfeitType === EForfeitType.standard && (
<Link <Link href={Module.getInstance().get().modules.pages.Subscription.pages.Manage.pages.Illimity.props.path}>
href={Module.getInstance().get().modules.pages.Subscription.pages.Subscribe.pages.Illimity.props.path}>
<Button fullwidth variant={EButtonVariant.GHOST}> <Button fullwidth variant={EButtonVariant.GHOST}>
Améliorer mon abonnement Améliorer mon abonnement
</Button> </Button>

View File

@ -1,9 +1,9 @@
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import SubscriptionTicket from "../SubscriptionTicket"; import SubscriptionTicket from "../Components/SubscriptionTicket";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import MessageBox from "@Front/Components/Elements/MessageBox"; import MessageBox from "@Front/Components/Elements/MessageBox";
import SubscriptionClientInfos from "../SubscriptionClientInfos"; import SubscriptionClientInfos from "../Components/SubscriptionClientInfos";
import Button from "@Front/Components/DesignSystem/Button"; import Button from "@Front/Components/DesignSystem/Button";
import Link from "next/link"; import Link from "next/link";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";

View File

@ -297,6 +297,22 @@
"props": { "props": {
"path": "/subscription/manage", "path": "/subscription/manage",
"labelKey": "manage" "labelKey": "manage"
},
"pages": {
"Standard": {
"enabled": true,
"props": {
"path": "/subscription/manage/standard",
"labelKey": "standard"
}
},
"Illimity": {
"enabled": true,
"props": {
"path": "/subscription/manage/illimity",
"labelKey": "illimity"
}
}
} }
}, },
"New": { "New": {

View File

@ -297,6 +297,22 @@
"props": { "props": {
"path": "/subscription/manage", "path": "/subscription/manage",
"labelKey": "manage" "labelKey": "manage"
},
"pages": {
"Standard": {
"enabled": true,
"props": {
"path": "/subscription/manage/standard",
"labelKey": "standard"
}
},
"Illimity": {
"enabled": true,
"props": {
"path": "/subscription/manage/illimity",
"labelKey": "illimity"
}
}
} }
}, },
"New": { "New": {

View File

@ -297,6 +297,22 @@
"props": { "props": {
"path": "/subscription/manage", "path": "/subscription/manage",
"labelKey": "manage" "labelKey": "manage"
},
"pages": {
"Standard": {
"enabled": true,
"props": {
"path": "/subscription/manage/standard",
"labelKey": "standard"
}
},
"Illimity": {
"enabled": true,
"props": {
"path": "/subscription/manage/illimity",
"labelKey": "illimity"
}
}
} }
}, },
"New": { "New": {

View File

@ -297,6 +297,22 @@
"props": { "props": {
"path": "/subscription/manage", "path": "/subscription/manage",
"labelKey": "manage" "labelKey": "manage"
},
"pages": {
"Standard": {
"enabled": true,
"props": {
"path": "/subscription/manage/standard",
"labelKey": "standard"
}
},
"Illimity": {
"enabled": true,
"props": {
"path": "/subscription/manage/illimity",
"labelKey": "illimity"
}
}
} }
}, },
"New": { "New": {

View File

@ -1,4 +1,4 @@
import SubscriptionManageCollaborators from "@Front/Components/Layouts/Subscription/SubscriptionManageCollaborators"; import SubscriptionManageCollaborators from "@Front/Components/Layouts/Subscription/Manage/SubscriptionManageCollaborators";
export default function Route() { export default function Route() {
return <SubscriptionManageCollaborators />; return <SubscriptionManageCollaborators />;

View File

@ -0,0 +1,5 @@
import SubscriptionManageIllimity from "@Front/Components/Layouts/Subscription/Manage/SubscriptionManageIllimity";
export default function Route() {
return <SubscriptionManageIllimity />;
}

View File

@ -0,0 +1,5 @@
import SubscriptionManageStandard from "@Front/Components/Layouts/Subscription/Manage/SubscriptionManageStandard";
export default function Route() {
return <SubscriptionManageStandard />;
}