From 772ed3523ed93ca4ad59fc55a6e711ce240b1154 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Mon, 17 Nov 2025 00:17:10 +0330 Subject: [PATCH] Enhance authentication flow; add user registration completion check and update contract acceptance process --- src/FrontOffice.Main/ConfigureServices.cs | 3 +- src/FrontOffice.Main/FrontOffice.Main.csproj | 3 +- src/FrontOffice.Main/Pages/Index.razor.cs | 6 + .../Pages/RegisterWizard.razor.cs | 280 ++++++++++++------ .../Shared/AuthDialog.razor.cs | 13 + src/FrontOffice.Main/Shared/MainLayout.razor | 2 +- .../Shared/MainLayout.razor.cs | 2 + .../Shared/SimpleOtpDialog.razor | 35 +++ src/FrontOffice.Main/Utilities/AuthService.cs | 53 +++- .../Utilities/UserAuthInfo.cs | 11 + src/FrontOffice.Main/wwwroot/test.html | 219 ++++++++++++++ 11 files changed, 536 insertions(+), 91 deletions(-) create mode 100644 src/FrontOffice.Main/Shared/SimpleOtpDialog.razor create mode 100644 src/FrontOffice.Main/Utilities/UserAuthInfo.cs create mode 100644 src/FrontOffice.Main/wwwroot/test.html diff --git a/src/FrontOffice.Main/ConfigureServices.cs b/src/FrontOffice.Main/ConfigureServices.cs index 903ea12..b92bb10 100644 --- a/src/FrontOffice.Main/ConfigureServices.cs +++ b/src/FrontOffice.Main/ConfigureServices.cs @@ -34,10 +34,11 @@ public static class ConfigureServices services.AddHttpContextAccessor(); // Register custom services + services.AddSingleton(); services.AddScoped(); services.AddScoped(); // Device detection: very light, dependency-free - services.AddScoped(); + services.AddTransient(); // PDF generation (Chromium only) services.AddSingleton(); diff --git a/src/FrontOffice.Main/FrontOffice.Main.csproj b/src/FrontOffice.Main/FrontOffice.Main.csproj index 672baf7..65a8f37 100644 --- a/src/FrontOffice.Main/FrontOffice.Main.csproj +++ b/src/FrontOffice.Main/FrontOffice.Main.csproj @@ -11,7 +11,7 @@ - + @@ -21,6 +21,7 @@ + diff --git a/src/FrontOffice.Main/Pages/Index.razor.cs b/src/FrontOffice.Main/Pages/Index.razor.cs index 5e9922e..e3a2c75 100644 --- a/src/FrontOffice.Main/Pages/Index.razor.cs +++ b/src/FrontOffice.Main/Pages/Index.razor.cs @@ -5,6 +5,7 @@ using MudBlazor; using System.Security.Cryptography; namespace FrontOffice.Main.Pages; + public partial class Index { [Inject] private PackageContract.PackageContractClient PackageClient { get; set; } = default!; @@ -68,6 +69,7 @@ public partial class Index Snackbar.Add("لطفاً ایمیل معتبر وارد کنید.", Severity.Warning); return; } + Snackbar.Add("به لیست انتظار «کارا بازار سلامت» اضافه شدید.", Severity.Success); _email = string.Empty; } @@ -76,14 +78,18 @@ public partial class Index { Navigation.NavigateTo($"{RouteConstants.Package.Detail}{packageId}"); } + private void NavigateToRegistrationWizard() { Navigation.NavigateTo(RouteConstants.Registration.Wizard); } private record Pack(long Id, string Title, string Body, string Image, long Price); + private record Plan(string Name, string Price, bool Highlight, IEnumerable Features); + private record QA(string Q, string A); + private readonly List _faqs = new() { new("دامنهٔ اختصاصی دارم؛ قابل اتصال است؟", "بله، پشت دامنه و گواهی SSL خودتان مستقر می‌شود."), diff --git a/src/FrontOffice.Main/Pages/RegisterWizard.razor.cs b/src/FrontOffice.Main/Pages/RegisterWizard.razor.cs index 8c3055d..ae5f8d4 100644 --- a/src/FrontOffice.Main/Pages/RegisterWizard.razor.cs +++ b/src/FrontOffice.Main/Pages/RegisterWizard.razor.cs @@ -7,6 +7,7 @@ using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using MudBlazor; +using Blazored.LocalStorage; namespace FrontOffice.Main.Pages; @@ -24,9 +25,18 @@ public partial class RegisterWizard private MudStepper? _mudStepper; private UpdateUserRequest _updateUserRequest = new(); private bool _isAuthenticated; + private CancellationTokenSource? _operationCts; + private UserAuthInfo _userAuthInfo; + private Guid signGuid = Guid.NewGuid(); + private const string TokenStorageKey = "auth:token"; + private readonly DialogOptions _normalWidth = new() { MaxWidth = MaxWidth.ExtraSmall, FullWidth = true }; [Inject] private AuthService AuthService { get; set; } = default!; + [Inject] private IDeviceDetector _deviceDetector { get; set; } = default!; [Inject] private IJSRuntime Js { get; set; } = default!; + [Inject] private ILocalStorageService LocalStorage { get; set; } = default!; + [Inject] private UserContract.UserContractClient UserClient { get; set; } = default!; + private string _nextButtonText => _activeStep switch { @@ -39,43 +49,53 @@ public partial class RegisterWizard protected override async Task OnAfterRenderAsync(bool firstRender) { _isAuthenticated = await AuthService.IsAuthenticatedAsync(); - if (_isAuthenticated && _activeStep == 0) + if (_isAuthenticated) { - await _mudStepper.NextStepAsync(); - _activeStep = 1; - await InvokeAsync(StateHasChanged); - } - else if (_isAuthenticated && _activeStep == 1) - { - try + _userAuthInfo = await AuthService.GetUserAuthInfo(); + if (_userAuthInfo.IsSignMainContract) { - var existUser = await UserContract.GetUserAsync(new Empty()); - if (existUser != null && !string.IsNullOrEmpty(existUser.FirstName) && - string.IsNullOrWhiteSpace(_model.FirstName)) - { - _model.FirstName = existUser.FirstName; - } - - if (existUser != null && !string.IsNullOrEmpty(existUser.LastName) && - string.IsNullOrWhiteSpace(_model.LastName)) - { - _model.LastName = existUser.LastName; - } - - if (existUser != null && !string.IsNullOrEmpty(existUser.NationalCode) && - string.IsNullOrWhiteSpace(_model.NationalCode)) - { - _model.NationalCode = existUser.NationalCode; - } - } - catch (Exception e) - { - Console.WriteLine(e); + Navigation.NavigateTo(RouteConstants.Profile.Index); } - await InvokeAsync(StateHasChanged); + if (_activeStep == 0) + { + await _mudStepper.NextStepAsync(); + _activeStep = 1; + await InvokeAsync(StateHasChanged); + } + else if (_activeStep == 1) + { + try + { + var existUser = await UserContract.GetUserAsync(new Empty()); + if (existUser != null && !string.IsNullOrEmpty(existUser.FirstName) && + string.IsNullOrWhiteSpace(_model.FirstName)) + { + _model.FirstName = existUser.FirstName; + } + + if (existUser != null && !string.IsNullOrEmpty(existUser.LastName) && + string.IsNullOrWhiteSpace(_model.LastName)) + { + _model.LastName = existUser.LastName; + } + + if (existUser != null && !string.IsNullOrEmpty(existUser.NationalCode) && + string.IsNullOrWhiteSpace(_model.NationalCode)) + { + _model.NationalCode = existUser.NationalCode; + } + } + catch (Exception e) + { + Console.WriteLine(e); + } + + await InvokeAsync(StateHasChanged); + } } + await base.OnAfterRenderAsync(firstRender); } @@ -98,16 +118,44 @@ public partial class RegisterWizard case 0: if (_authDialog._currentStep == AuthDialog.AuthStep.Phone) { - await _authDialog.SendOtpAsync(); + try + { + _isSubmitting = true; + await _authDialog.SendOtpAsync(); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + finally + { + _isSubmitting = false; + } + return; } else { - var verifyOtp = await _authDialog.VerifyOtpAsync(); - if (!verifyOtp) - return; - - _activeStep = 1; + try + { + _isSubmitting = true; + var verifyOtp = await _authDialog.VerifyOtpAsync(); + if (!verifyOtp) + return; + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + finally + { + _isSubmitting = false; + } + //continus in OnAfterRenderAsync method + // await _mudStepper.NextStepAsync(); + // _activeStep = 1; } break; @@ -126,7 +174,10 @@ public partial class RegisterWizard case 2: if (!await ValidateStepAsync(_stepThreeForm)) return; + await SubmitAsync(); + + break; } } @@ -142,12 +193,66 @@ public partial class RegisterWizard private async Task SubmitAsync() { + if (_operationCts == null || _operationCts.IsCancellationRequested) + { + _operationCts = new CancellationTokenSource(); + } + _isSubmitting = true; try { - await Task.Delay(800); + var parameters = new DialogParameters + { + { "ContentText", "لطفاً کد تأیید ارسال شده را وارد کنید." }, + { "ButtonText", "تأیید" }, + }; + var options = _deviceDetector.IsMobile() + ? new DialogOptions() { FullScreen = true} + : _normalWidth; + var response = await UserClient.CreateNewOtpTokenAsync(new CreateNewOtpTokenRequest() + { + Mobile = _userAuthInfo.MobileNumber, + Purpose = "signContract", + SignGuid = signGuid.ToString() + }, cancellationToken: _operationCts.Token); + if (response?.Success != true) + { + var errorMessage = string.IsNullOrWhiteSpace(response?.Message) + ? "ارسال رمز پویا با خطا مواجه شد. لطفاً دوباره تلاش کنید." + : response!.Message; + Snackbar.Add(errorMessage, Severity.Warning); + return; + } + + var dialog = await DialogService.ShowAsync("تأیید قرارداد", parameters,options); + var result = await dialog.Result; + if (result.Canceled || result.Data is not string otpCode || string.IsNullOrWhiteSpace(otpCode)) + { + Snackbar.Add("ورود کد تأیید الزامی است.", Severity.Warning); + return; + } + + var acceptContractResponse = await UserClient.AcceptContractAsync(new() + { + SignGuid = signGuid.ToString(), + Code = otpCode, + ContractHtml = GetContractHtml(), + + }, cancellationToken: _operationCts.Token); + if (!string.IsNullOrWhiteSpace(acceptContractResponse.Token)) + { + await LocalStorage.SetItemAsync(TokenStorageKey, acceptContractResponse.Token); + } + else + { + await LocalStorage.RemoveItemAsync(TokenStorageKey); + } + + _completed = true; - Snackbar.Add("ثبت‌نام اولیه با موفقیت انجام شد.", Severity.Success); + Snackbar.Add("ثبت‌نام اولیه و تأیید قرارداد با موفقیت انجام شد.", Severity.Success); + await InvokeAsync(StateHasChanged); + Navigation.NavigateTo(RouteConstants.Profile.Index); } finally { @@ -158,45 +263,8 @@ public partial class RegisterWizard private async void DownloadContract() { //var html = $"

قرارداد اولیه کاربر

نام: {_model.FirstName ?? "-"} {_model.LastName ?? "-"}

کد ملی: {_model.NationalCode ?? "-"}

این یک نسخه نمونه است.

"; - var html = - $"" + - "قرارداد تعهد و سلب مسئولیت کارابازار

قرارداد تعهد و سلب مسئولیت

بین کارابازار و کاربر

" + - "

این قرارداد تعهد و سلب مسئولیت («قرارداد») در تاریخ " + - $"{DateTime.Now.MiladiToJalali()} بین:

" + - "1. شرکت/مجموعه کارابازار (که از این پس «کارابازار» نامیده می‌شود)،

2. شخص حقیقی زیر (که از این پس «کاربر» نامیده می‌شود):

" + - $"

نام و نام خانوادگی کاربر: {_model.FirstName } {_model.LastName}

" + - $"

شماره ملی: {_model.NationalCode?.PersianToEnglish()}

" + - $"

شماره تماس: {_model.NationalCode?.PersianToEnglish() }

" + - "

کارابازار و کاربر که در این قرارداد جداگانه «طرف» و مجموعاً «طرفین» نامیده می‌شوند، با علم و آگاهی کامل، مفاد زیر را پذیرفته و امضا می‌نمایند.

ماده ۱ - موضوع قرارداد

" + - "

موضوع این قرارداد، تعیین حدود و چارچوب تعهدات و سلب مسئولیت کارابازار در قبال استفاده کاربر ازخدمات، باشگاه مشتریان، مزایا، طرح‌های همکاری، شبکه معرفی، خرید از فروشگاه‌های طرف‌قراردادو هرگونه امکانات و تسهیلات مرتبط است که حسب مورد توسط کارابازار یا از طریق پلتفرم‌ها و شرکت‌هایهمکار در اختیار کاربر قرار می‌گیرد، بدون اینکه جزئیات مدل کسب‌وکار، شیوه تأمین منابع مالی،شبکه همکاری یا ساختار داخلی آن در این قرارداد ذکر یا افشا شود.

" + - "

ماده ۲ - اقرار و آگاهی کاربر

۲-۱. کاربر اقرار می‌نماید که کلیه اطلاعات کلی لازم در خصوص نحوه فعالیت، مزایا، ریسک‌های احتمالی," + - "سازوکار کلی استفاده از خدمات، و چارچوب کلی همکاری را از مراجع رسمی معرفی‌شده توسط کارابازاردریافت کرده، سؤالات خود را مطرح نموده و پاسخ مناسب را دریافت نموده است.

۲-۲. کاربر با امضای این قرارداد اقرار می‌نماید که:

  • با اراده آزاد و بدون هرگونه اجبار، اکراه، فریب یا سوءاستفاده از ناآگاهی وارد این همکاری شده است.
  • از احتمال وجود ریسک‌های مالی، اعتباری، قانونی و شبکه‌ای مرتبط با فعالیت خود آگاه بوده و آن را می‌پذیرد.
  • " + - "
  • هرگونه تصمیم برای استفاده از تسهیلات، مزایا، خدمات باشگاه مشتریان، فعالیت در شبکه معرفی، خرید از فروشگاه‌ها و جذب افراد جدید، تصمیمی شخصی و آگاهانه است و به‌عنوان تعهد یا ضمانت بازده مشخص از سوی کارابازار تلقی نمی‌شود.
" + - "

ماده ۳ - سلب مسئولیت کارابازار

۳-۱. کاربر صراحتاً می‌پذیرد که کارابازار صرفاً در چارچوب قوانین و مقررات حاکم و مطابق قراردادها و تفاهم‌نامه‌های خود با شرکای تجاری و پلتفرم‌های همکار، خدمات و امکانات مشخصی را در اختیار کاربر قرار می‌دهد و هیچ‌گونه تعهدی نسبت به:

  • تحقق سود یا بازده مالی مشخص،
  • ثبات ارزش هرگونه اعتبار، امتیاز، یا منافع غیرنقدی که ممکن است در قالب طرح‌ها به کاربر تخصیص یابد،
  • " + - "
  • عملکرد اشخاص ثالث (از جمله پلتفرم‌ها، فروشگاه‌ها، شرکت‌های بیمه، ارائه‌دهندگان خدمات سلامت و هر شخص حقیقی یا حقوقی همکار)،
  • تصمیمات و اقدامات کاربر در جذب افراد جدید و ایجاد زیرمجموعه،

نداشته و نخواهد داشت مگر در حدودی که به‌صراحت در قرارداد یا قوانین آمره بر عهده کارابازار گذاشته شده است.

" + - "۳-۲. هرگونه خسارت، دعوی، تهدید، مطالبه، ادعا، شکایت یا پیگیری حقوقی که ناشی از تصمیمات شخصی کاربر،نحوه استفاده وی از تسهیلات و مزایا، جذب دیگران، خرید کالا و خدمات، یا تعاملات او با اشخاص ثالث باشد،مستقیماً متوجه خود کاربر است و کارابازار نسبت به آن هیچ‌گونه مسئولیت مدنی، کیفری، مالی یا قراردادی ندارد," + - "مگر در مواردی که طبق قوانین آمره، مسئولیت صریح و غیرقابل‌اسقاط بر عهده کارابازار قرار گرفته باشد.

۳-۳. کاربر می‌پذیرد که هیچ‌گونه ادعایی مبنی بر فریب، اغفال، ارائه اطلاعات نادرست یا وعده‌های خارج ازچهارچوب رسمی از سوی کارابازار یا نمایندگان رسمی آن، پس از امضای این قرارداد، از وی مسموع نخواهد بود،مگر آنکه طبق رأی قطعی مرجع قضایی صالح، خلاف آن ثابت شود.

ماده ۴ - مسئولیت کاربر در قبال تهدید، ادعا و شکایت

" + - "

۴-۱. کاربر متعهد است در صورت طرح هرگونه تهدید، ادعا، مطالبه، شکایت یا پیگیری حقوقی از سوی اشخاص ثالث(از جمله افراد جذب‌شده توسط کاربر، زیرمجموعه‌ها، خریداران معرفی‌شده یا سایر اشخاص)، که ناشی از عملکردشخصی کاربر، معرفی‌های وی، شیوه تبلیغ، وعده‌های خارج از چارچوب رسمی کارابازار، یا نقض قوانین و مقرراتباشد، خود رأساً پاسخگو باشد و کارابازار را از هرگونه مسئولیت و هزینه احتمالی در این خصوص مصون بدارد.

۴-۲. کاربر می‌پذیرد که:

  • هرگونه تهدید یا ادعای بی‌جا، غیرمنطقی، غیرمستند یا مغایر با مفاد این قرارداد، متوجه شخص کاربر است.
  • " + - "
  • در صورت وارد آمدن خسارت مادی یا معنوی به کارابازار ناشی از چنین تهدیدات یا ادعاهایی، کارابازار حق دارد نسبت به مطالبه خسارت از کاربر، طبق قوانین و از طریق مراجع صالح اقدام نماید.
" + - "

ماده ۵ - محرمانگی و عدم افشای جزئیات کسب‌وکار

۵-۱. کاربر می‌پذیرد که جزئیات فنی، مالی، ساختار شبکه، شیوه توزیع مزایا، قراردادهای داخلی کارابازار باشرکای تجاری و پلتفرم‌های همکار، اطلاعات محرمانه تجاری محسوب شده و خارج از این قرارداد است و افشای آن‌هاتوسط کاربر بدون مجوز کتبی کارابازار، مجاز نمی‌باشد.

۵-۲. کاربر حق استناد به عدم درج جزئیات ساختار کسب‌وکار در این قرارداد را به‌عنوان دلیل بطلان، فسخ یاادعای فریب علیه کارابازار از خود سلب می‌نماید.

" + - "

ماده ۶ - کد تأیید یکبارمصرف (OTP) و شناسه قرارداد

۶-۱. به منظور تأیید هویت کاربر و جایگزین کردن امضا در محیط غیرحضوری، برای این قرارداد یک شناسه یکتا(GUID) تولید شده و از طریق سامانه کارابازار، کد تأیید یکبارمصرف (OTP) مرتبط با آن برای کاربر ارسالمی‌گردد.

" + - "

۶-۲. کاربر با وارد کردن صحیح کد تأیید (OTP) در سامانه، اقرار می‌نماید که:

  • مالک شماره تماس ثبت‌شده در این قرارداد است یا با اجازه قانونی مالک از آن استفاده می‌کند،
  • از محتوای قرارداد به‌طور کامل آگاه است و آن را بدون ابهام و با رضایت کامل می‌پذیرد،
  • شناسه یکتا و OTP ارسال‌شده، معادل امضای الکترونیکی معتبر وی بر روی این قرارداد است.
" + - "

ماده ۷ - مدت، اصلاح و حاکمیت قانون

" + - "

۷-۱. این قرارداد از تاریخ تأیید نهایی (ثبت OTP) نافذ و لازم‌الاجرا بوده و تا زمانی که همکاری کاربر باکارابازار ادامه دارد، معتبر خواهد بود؛ مگر آنکه مطابق قوانین یا توافق طرفین، خاتمه یابد.

۷-۲. هرگونه اصلاح در مفاد این قرارداد صرفاً از طریق اطلاع‌رسانی رسمی کارابازار و پذیرش کاربر (اعم ازامضای مکتوب، تأیید در سامانه، یا سایر روش‌های الکترونیکی مورد تأیید کارابازار) معتبر خواهد بود.

۷-۳. این قرارداد از هر حیث، تابع قوانین و مقررات حاکم بر جمهوری اسلامی ایران بوده و در صورت بروز اختلاف،مراجع صالح قضایی محل استقرار کارابازار، صلاحیت رسیدگی خواهند داشت؛ مگر آنکه به نحو دیگری بین طرفین توافقشود." + - "

ماده ۸ - اقرار نهایی کاربر

کاربر با امضای این قرارداد (از طریق ثبت کد تأیید یکبارمصرف OTP متناظر با شناسه یکتا)، صریحاً اعلام می‌نماید که:" + - "

  • کلیه مفاد قرارداد را به‌دقت مطالعه نموده و آن را درک کرده است،
  • " + - "
  • پرسش‌های خود را مطرح نموده و پاسخ روشن دریافت کرده است،
  • ریسک‌ها، محدودیت‌ها و حدود مسئولیت کارابازار را می‌پذیرد،
  • حق هرگونه ادعای مغایر با مفاد این قرارداد، به‌ویژه ادعاهای بی‌اساس، غیرمنطقی یا ناشی از برداشت نادرست شخصی را از خود سلب و اسقاط می‌نماید؛ مگر در حدودی که قانون به‌طور آمره اجازه سلب آن را نداده باشد.

شناسه یکتای قرارداد :

"+Guid.NewGuid()+"

"; + var html = GetContractHtml(); try { // If HTML is short use GET to simplify (URL length safe) @@ -227,6 +295,50 @@ public partial class RegisterWizard //StateHasChanged(); } + public string GetContractHtml() + { + var html = + $"" + + "قرارداد تعهد و سلب مسئولیت کارابازار

قرارداد تعهد و سلب مسئولیت

بین کارابازار و کاربر

" + + "

این قرارداد تعهد و سلب مسئولیت («قرارداد») در تاریخ " + + $"{DateTime.Now.MiladiToJalali()} بین:

" + + "1. شرکت/مجموعه کارابازار (که از این پس «کارابازار» نامیده می‌شود)،

2. شخص حقیقی زیر (که از این پس «کاربر» نامیده می‌شود):

" + + $"

نام و نام خانوادگی کاربر: {_model.FirstName} {_model.LastName}

" + + $"

شماره ملی: {_model.NationalCode?.PersianToEnglish()}

" + + $"

شماره تماس: {_userAuthInfo.MobileNumber?.PersianToEnglish()}

" + + "

کارابازار و کاربر که در این قرارداد جداگانه «طرف» و مجموعاً «طرفین» نامیده می‌شوند، با علم و آگاهی کامل، مفاد زیر را پذیرفته و امضا می‌نمایند.

ماده ۱ - موضوع قرارداد

" + + "

موضوع این قرارداد، تعیین حدود و چارچوب تعهدات و سلب مسئولیت کارابازار در قبال استفاده کاربر ازخدمات، باشگاه مشتریان، مزایا، طرح‌های همکاری، شبکه معرفی، خرید از فروشگاه‌های طرف‌قراردادو هرگونه امکانات و تسهیلات مرتبط است که حسب مورد توسط کارابازار یا از طریق پلتفرم‌ها و شرکت‌هایهمکار در اختیار کاربر قرار می‌گیرد، بدون اینکه جزئیات مدل کسب‌وکار، شیوه تأمین منابع مالی،شبکه همکاری یا ساختار داخلی آن در این قرارداد ذکر یا افشا شود.

" + + "

ماده ۲ - اقرار و آگاهی کاربر

۲-۱. کاربر اقرار می‌نماید که کلیه اطلاعات کلی لازم در خصوص نحوه فعالیت، مزایا، ریسک‌های احتمالی," + + "سازوکار کلی استفاده از خدمات، و چارچوب کلی همکاری را از مراجع رسمی معرفی‌شده توسط کارابازاردریافت کرده، سؤالات خود را مطرح نموده و پاسخ مناسب را دریافت نموده است.

۲-۲. کاربر با امضای این قرارداد اقرار می‌نماید که:

  • با اراده آزاد و بدون هرگونه اجبار، اکراه، فریب یا سوءاستفاده از ناآگاهی وارد این همکاری شده است.
  • از احتمال وجود ریسک‌های مالی، اعتباری، قانونی و شبکه‌ای مرتبط با فعالیت خود آگاه بوده و آن را می‌پذیرد.
  • " + + "
  • هرگونه تصمیم برای استفاده از تسهیلات، مزایا، خدمات باشگاه مشتریان، فعالیت در شبکه معرفی، خرید از فروشگاه‌ها و جذب افراد جدید، تصمیمی شخصی و آگاهانه است و به‌عنوان تعهد یا ضمانت بازده مشخص از سوی کارابازار تلقی نمی‌شود.
" + + "

ماده ۳ - سلب مسئولیت کارابازار

۳-۱. کاربر صراحتاً می‌پذیرد که کارابازار صرفاً در چارچوب قوانین و مقررات حاکم و مطابق قراردادها و تفاهم‌نامه‌های خود با شرکای تجاری و پلتفرم‌های همکار، خدمات و امکانات مشخصی را در اختیار کاربر قرار می‌دهد و هیچ‌گونه تعهدی نسبت به:

  • تحقق سود یا بازده مالی مشخص،
  • ثبات ارزش هرگونه اعتبار، امتیاز، یا منافع غیرنقدی که ممکن است در قالب طرح‌ها به کاربر تخصیص یابد،
  • " + + "
  • عملکرد اشخاص ثالث (از جمله پلتفرم‌ها، فروشگاه‌ها، شرکت‌های بیمه، ارائه‌دهندگان خدمات سلامت و هر شخص حقیقی یا حقوقی همکار)،
  • تصمیمات و اقدامات کاربر در جذب افراد جدید و ایجاد زیرمجموعه،

نداشته و نخواهد داشت مگر در حدودی که به‌صراحت در قرارداد یا قوانین آمره بر عهده کارابازار گذاشته شده است.

" + + "۳-۲. هرگونه خسارت، دعوی، تهدید، مطالبه، ادعا، شکایت یا پیگیری حقوقی که ناشی از تصمیمات شخصی کاربر،نحوه استفاده وی از تسهیلات و مزایا، جذب دیگران، خرید کالا و خدمات، یا تعاملات او با اشخاص ثالث باشد،مستقیماً متوجه خود کاربر است و کارابازار نسبت به آن هیچ‌گونه مسئولیت مدنی، کیفری، مالی یا قراردادی ندارد," + + "مگر در مواردی که طبق قوانین آمره، مسئولیت صریح و غیرقابل‌اسقاط بر عهده کارابازار قرار گرفته باشد.

۳-۳. کاربر می‌پذیرد که هیچ‌گونه ادعایی مبنی بر فریب، اغفال، ارائه اطلاعات نادرست یا وعده‌های خارج ازچهارچوب رسمی از سوی کارابازار یا نمایندگان رسمی آن، پس از امضای این قرارداد، از وی مسموع نخواهد بود،مگر آنکه طبق رأی قطعی مرجع قضایی صالح، خلاف آن ثابت شود.

ماده ۴ - مسئولیت کاربر در قبال تهدید، ادعا و شکایت

" + + "

۴-۱. کاربر متعهد است در صورت طرح هرگونه تهدید، ادعا، مطالبه، شکایت یا پیگیری حقوقی از سوی اشخاص ثالث(از جمله افراد جذب‌شده توسط کاربر، زیرمجموعه‌ها، خریداران معرفی‌شده یا سایر اشخاص)، که ناشی از عملکردشخصی کاربر، معرفی‌های وی، شیوه تبلیغ، وعده‌های خارج از چارچوب رسمی کارابازار، یا نقض قوانین و مقرراتباشد، خود رأساً پاسخگو باشد و کارابازار را از هرگونه مسئولیت و هزینه احتمالی در این خصوص مصون بدارد.

۴-۲. کاربر می‌پذیرد که:

  • هرگونه تهدید یا ادعای بی‌جا، غیرمنطقی، غیرمستند یا مغایر با مفاد این قرارداد، متوجه شخص کاربر است.
  • " + + "
  • در صورت وارد آمدن خسارت مادی یا معنوی به کارابازار ناشی از چنین تهدیدات یا ادعاهایی، کارابازار حق دارد نسبت به مطالبه خسارت از کاربر، طبق قوانین و از طریق مراجع صالح اقدام نماید.
" + + "

ماده ۵ - محرمانگی و عدم افشای جزئیات کسب‌وکار

۵-۱. کاربر می‌پذیرد که جزئیات فنی، مالی، ساختار شبکه، شیوه توزیع مزایا، قراردادهای داخلی کارابازار باشرکای تجاری و پلتفرم‌های همکار، اطلاعات محرمانه تجاری محسوب شده و خارج از این قرارداد است و افشای آن‌هاتوسط کاربر بدون مجوز کتبی کارابازار، مجاز نمی‌باشد.

۵-۲. کاربر حق استناد به عدم درج جزئیات ساختار کسب‌وکار در این قرارداد را به‌عنوان دلیل بطلان، فسخ یاادعای فریب علیه کارابازار از خود سلب می‌نماید.

" + + "

ماده ۶ - کد تأیید یکبارمصرف (OTP) و شناسه قرارداد

۶-۱. به منظور تأیید هویت کاربر و جایگزین کردن امضا در محیط غیرحضوری، برای این قرارداد یک شناسه یکتا(GUID) تولید شده و از طریق سامانه کارابازار، کد تأیید یکبارمصرف (OTP) مرتبط با آن برای کاربر ارسالمی‌گردد.

" + + "

۶-۲. کاربر با وارد کردن صحیح کد تأیید (OTP) در سامانه، اقرار می‌نماید که:

  • مالک شماره تماس ثبت‌شده در این قرارداد است یا با اجازه قانونی مالک از آن استفاده می‌کند،
  • از محتوای قرارداد به‌طور کامل آگاه است و آن را بدون ابهام و با رضایت کامل می‌پذیرد،
  • شناسه یکتا و OTP ارسال‌شده، معادل امضای الکترونیکی معتبر وی بر روی این قرارداد است.
" + + "

ماده ۷ - مدت، اصلاح و حاکمیت قانون

" + + "

۷-۱. این قرارداد از تاریخ تأیید نهایی (ثبت OTP) نافذ و لازم‌الاجرا بوده و تا زمانی که همکاری کاربر باکارابازار ادامه دارد، معتبر خواهد بود؛ مگر آنکه مطابق قوانین یا توافق طرفین، خاتمه یابد.

۷-۲. هرگونه اصلاح در مفاد این قرارداد صرفاً از طریق اطلاع‌رسانی رسمی کارابازار و پذیرش کاربر (اعم ازامضای مکتوب، تأیید در سامانه، یا سایر روش‌های الکترونیکی مورد تأیید کارابازار) معتبر خواهد بود.

۷-۳. این قرارداد از هر حیث، تابع قوانین و مقررات حاکم بر جمهوری اسلامی ایران بوده و در صورت بروز اختلاف،مراجع صالح قضایی محل استقرار کارابازار، صلاحیت رسیدگی خواهند داشت؛ مگر آنکه به نحو دیگری بین طرفین توافقشود." + + "

ماده ۸ - اقرار نهایی کاربر

کاربر با امضای این قرارداد (از طریق ثبت کد تأیید یکبارمصرف OTP متناظر با شناسه یکتا)، صریحاً اعلام می‌نماید که:" + + "

  • کلیه مفاد قرارداد را به‌دقت مطالعه نموده و آن را درک کرده است،
  • " + + "
  • پرسش‌های خود را مطرح نموده و پاسخ روشن دریافت کرده است،
  • ریسک‌ها، محدودیت‌ها و حدود مسئولیت کارابازار را می‌پذیرد،
  • حق هرگونه ادعای مغایر با مفاد این قرارداد، به‌ویژه ادعاهای بی‌اساس، غیرمنطقی یا ناشی از برداشت نادرست شخصی را از خود سلب و اسقاط می‌نماید؛ مگر در حدودی که قانون به‌طور آمره اجازه سلب آن را نداده باشد.

شناسه یکتای قرارداد :

" + + signGuid + "

"; + return html; + } + private async Task SavePersonalInfo() { if (_stepTwoForm is null) return false; @@ -234,21 +346,14 @@ public partial class RegisterWizard await _stepTwoForm.Validate(); if (!_stepTwoForm.IsValid) return false; - + _isSubmitting = true; try { -// _updateUserRequest.AvatarPath="test"; -// _updateUserRequest.BirthDate=Timestamp.FromDateTime(DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc)); -// _updateUserRequest.EmailNotifications = true; -// _updateUserRequest.PushNotifications = true; -// _updateUserRequest.SmsNotifications = true; -// + _updateUserRequest.FirstName = _model.FirstName; _updateUserRequest.LastName = _model.LastName; _updateUserRequest.NationalCode = _model.NationalCode.PersianToEnglish(); - Console.WriteLine(_updateUserRequest.FirstName); - Console.WriteLine(_updateUserRequest.LastName); - Console.WriteLine(_updateUserRequest.NationalCode); + await UserContract.UpdateUserAsync(request: _updateUserRequest); Snackbar.Add("اطلاعات شخصی با موفقیت ذخیره شد.", Severity.Success); @@ -261,6 +366,7 @@ public partial class RegisterWizard } finally { + _isSubmitting = false; await InvokeAsync(StateHasChanged); } } diff --git a/src/FrontOffice.Main/Shared/AuthDialog.razor.cs b/src/FrontOffice.Main/Shared/AuthDialog.razor.cs index 1b0fd4e..3554ba1 100644 --- a/src/FrontOffice.Main/Shared/AuthDialog.razor.cs +++ b/src/FrontOffice.Main/Shared/AuthDialog.razor.cs @@ -1,6 +1,7 @@ using Blazored.LocalStorage; using FrontOffice.BFF.User.Protobuf.Protos.User; using FrontOffice.BFF.User.Protobuf.Validator; +using FrontOffice.Main.Utilities; using Grpc.Core; using Microsoft.AspNetCore.Components; using MudBlazor; @@ -47,6 +48,7 @@ public partial class AuthDialog : IDisposable [Inject] private ILocalStorageService LocalStorage { get; set; } = default!; [Inject] private UserContract.UserContractClient UserClient { get; set; } = default!; + [Inject] private AuthService AuthService { get; set; } = default!; [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } @@ -230,6 +232,17 @@ public partial class AuthDialog : IDisposable { MudDialog?.Close(); } + if (await AuthService.IsAuthenticatedAsync()) + { + if (!(await AuthService.IsCompleteRegisterAsync())) + { + Navigation.NavigateTo(RouteConstants.Registration.Wizard); + } + else + { + Navigation.NavigateTo(RouteConstants.Profile.Index); + } + } return true; } diff --git a/src/FrontOffice.Main/Shared/MainLayout.razor b/src/FrontOffice.Main/Shared/MainLayout.razor index 0e47376..77024f2 100644 --- a/src/FrontOffice.Main/Shared/MainLayout.razor +++ b/src/FrontOffice.Main/Shared/MainLayout.razor @@ -44,7 +44,7 @@ @if (_isAuthenticated) { - پروفایل + پروفایل خروج از حساب diff --git a/src/FrontOffice.Main/Shared/MainLayout.razor.cs b/src/FrontOffice.Main/Shared/MainLayout.razor.cs index dfa3ecc..3243bf8 100644 --- a/src/FrontOffice.Main/Shared/MainLayout.razor.cs +++ b/src/FrontOffice.Main/Shared/MainLayout.razor.cs @@ -50,7 +50,9 @@ public partial class MainLayout { Snackbar.Add(GlobalConstants.SuccessMsg, Severity.Success); } + StateHasChanged(); + Navigation.NavigateTo(RouteConstants.Main.MainPage); } private void NavigateToProfile() diff --git a/src/FrontOffice.Main/Shared/SimpleOtpDialog.razor b/src/FrontOffice.Main/Shared/SimpleOtpDialog.razor new file mode 100644 index 0000000..98fad4a --- /dev/null +++ b/src/FrontOffice.Main/Shared/SimpleOtpDialog.razor @@ -0,0 +1,35 @@ +@using MudBlazor + + + + @ContentText + + + + انصراف + @ButtonText + + + +@code { + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } + + [Parameter] public string ContentText { get; set; } = ""; + [Parameter] public string ButtonText { get; set; } = "تأیید"; + + private string? OtpCode { get; set; } + + private void Cancel() => MudDialog.Cancel(); + + private void Submit() => MudDialog.Close(DialogResult.Ok(OtpCode)); +} + diff --git a/src/FrontOffice.Main/Utilities/AuthService.cs b/src/FrontOffice.Main/Utilities/AuthService.cs index 004dfe3..c752433 100644 --- a/src/FrontOffice.Main/Utilities/AuthService.cs +++ b/src/FrontOffice.Main/Utilities/AuthService.cs @@ -1,6 +1,7 @@ using Blazored.LocalStorage; using Microsoft.AspNetCore.Components; using MudBlazor; +using System.IdentityModel.Tokens.Jwt; namespace FrontOffice.Main.Utilities; @@ -9,14 +10,16 @@ public class AuthService private readonly ILocalStorageService _localStorage; private readonly NavigationManager _navigation; private readonly ISnackbar _snackbar; + private readonly UserAuthInfo _userAuthInfo; private const string TokenStorageKey = "auth:token"; - public AuthService(ILocalStorageService localStorage, NavigationManager navigation, ISnackbar snackbar) + public AuthService(ILocalStorageService localStorage, NavigationManager navigation, ISnackbar snackbar, UserAuthInfo userAuthInfo) { _localStorage = localStorage; _navigation = navigation; _snackbar = snackbar; + _userAuthInfo = userAuthInfo; } public async Task IsAuthenticatedAsync() @@ -29,6 +32,54 @@ public class AuthService { return await _localStorage.GetItemAsync(TokenStorageKey); } + public async Task IsCompleteRegisterAsync() + { + await InitUserAuthInfo(); + if (_userAuthInfo.NationalCode ==null || _userAuthInfo.FirstName == null || _userAuthInfo.LastName == null || !_userAuthInfo.IsSignMainContract) + { + return false; + } + return true; + } + public bool IsCompleteRegister() + { + InitUserAuthInfo().GetAwaiter(); + if (_userAuthInfo.NationalCode ==null || _userAuthInfo.FirstName == null || _userAuthInfo.LastName == null || _userAuthInfo.IsSignMainContract) + { + return false; + } + return true; + } + public async Task GetUserAuthInfo() + { + await InitUserAuthInfo(); + return _userAuthInfo; + } + + public async Task InitUserAuthInfo() + { + var claims = await GetTokenClaimsAsync(); + _userAuthInfo.UserClaims= claims; + var firstName = claims.FirstOrDefault(c => c.key == "FirstName").value; + var lastName = claims.FirstOrDefault(c => c.key == "LastName").value; + var nationalCode = claims.FirstOrDefault(c => c.key == "NationalCode").value; + var mobileNumber = claims.FirstOrDefault(c => c.key == "MobileNumber").value; + var isSignMainContractStr = claims.FirstOrDefault(c => c.key == "IsSignMainContract").value; + _userAuthInfo.FirstName = firstName ?? string.Empty; + _userAuthInfo.LastName = lastName ?? string.Empty; + _userAuthInfo.NationalCode = nationalCode ?? string.Empty; + _userAuthInfo.MobileNumber = mobileNumber ?? string.Empty; + _userAuthInfo.IsSignMainContract = bool.TryParse(isSignMainContractStr, out var isSignMainContract) && isSignMainContract; + } + + private async Task?> GetTokenClaimsAsync() + { + var token = await GetTokenAsync(); + if (string.IsNullOrEmpty(token)) return null; + var handler = new JwtSecurityTokenHandler(); + var jwtToken = handler.ReadJwtToken(token); + return jwtToken.Claims.Select(c => (c.Type, c.Value)).ToList(); + } public async Task LogoutAsync() { diff --git a/src/FrontOffice.Main/Utilities/UserAuthInfo.cs b/src/FrontOffice.Main/Utilities/UserAuthInfo.cs new file mode 100644 index 0000000..b73845d --- /dev/null +++ b/src/FrontOffice.Main/Utilities/UserAuthInfo.cs @@ -0,0 +1,11 @@ +namespace FrontOffice.Main.Utilities; + +public class UserAuthInfo +{ + public List<(string key, string value)> UserClaims { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } + public string? NationalCode { get; set; } + public string? MobileNumber { get; set; } + public bool IsSignMainContract { get; set; } +} \ No newline at end of file diff --git a/src/FrontOffice.Main/wwwroot/test.html b/src/FrontOffice.Main/wwwroot/test.html new file mode 100644 index 0000000..89ea54e --- /dev/null +++ b/src/FrontOffice.Main/wwwroot/test.html @@ -0,0 +1,219 @@ + + + + + + قرارداد تعهد و سلب مسئولیت کارابازار + + + + +

قرارداد تعهد و سلب مسئولیت

+

بین کارابازار و کاربر

+ +
+

+ این قرارداد تعهد و سلب مسئولیت («قرارداد») در تاریخ + ....... / ....... / ........ + بین: +

+

+ 1. شرکت/مجموعه کارابازار (که از این پس «کارابازار» نامیده می‌شود)، +

+

+ 2. شخص حقیقی زیر (که از این پس «کاربر» نامیده می‌شود): +

+
+

نام و نام خانوادگی کاربر: ..........................................................

+

شماره ملی: ..........................................................

+

شماره تماس: ..........................................................

+

آدرس: ..................................................................................................................

+
+

+ کارابازار و کاربر که در این قرارداد جداگانه «طرف» و مجموعاً «طرفین» نامیده می‌شوند، با علم و آگاهی کامل، مفاد زیر را پذیرفته و امضا می‌نمایند. +

+
+ +
+

ماده ۱ - موضوع قرارداد

+

+ موضوع این قرارداد، تعیین حدود و چارچوب تعهدات و سلب مسئولیت کارابازار در قبال استفاده کاربر از + خدمات، باشگاه مشتریان، مزایا، طرح‌های همکاری، شبکه معرفی، خرید از فروشگاه‌های طرف‌قرارداد + و هرگونه امکانات و تسهیلات مرتبط است که حسب مورد توسط کارابازار یا از طریق پلتفرم‌ها و شرکت‌های + همکار در اختیار کاربر قرار می‌گیرد، بدون اینکه جزئیات مدل کسب‌وکار، شیوه تأمین منابع مالی، + شبکه همکاری یا ساختار داخلی آن در این قرارداد ذکر یا افشا شود. +

+ +

ماده ۲ - اقرار و آگاهی کاربر

+

+ ۲-۱. کاربر اقرار می‌نماید که کلیه اطلاعات کلی لازم در خصوص نحوه فعالیت، مزایا، ریسک‌های احتمالی، + سازوکار کلی استفاده از خدمات، و چارچوب کلی همکاری را از مراجع رسمی معرفی‌شده توسط کارابازار + دریافت کرده، سؤالات خود را مطرح نموده و پاسخ مناسب را دریافت نموده است. +

+

+ ۲-۲. کاربر با امضای این قرارداد اقرار می‌نماید که: +

+
    +
  • با اراده آزاد و بدون هرگونه اجبار، اکراه، فریب یا سوءاستفاده از ناآگاهی وارد این همکاری شده است.
  • +
  • از احتمال وجود ریسک‌های مالی، اعتباری، قانونی و شبکه‌ای مرتبط با فعالیت خود آگاه بوده و آن را می‌پذیرد.
  • +
  • هرگونه تصمیم برای استفاده از تسهیلات، مزایا، خدمات باشگاه مشتریان، فعالیت در شبکه معرفی، خرید از فروشگاه‌ها و جذب افراد جدید، تصمیمی شخصی و آگاهانه است و به‌عنوان تعهد یا ضمانت بازده مشخص از سوی کارابازار تلقی نمی‌شود.
  • +
+ +

ماده ۳ - سلب مسئولیت کارابازار

+

+ ۳-۱. کاربر صراحتاً می‌پذیرد که کارابازار صرفاً در چارچوب قوانین و مقررات حاکم و مطابق قراردادها و تفاهم‌نامه‌های خود با شرکای تجاری و پلتفرم‌های همکار، خدمات و امکانات مشخصی را در اختیار کاربر قرار می‌دهد و هیچ‌گونه تعهدی نسبت به: +

+
    +
  • تحقق سود یا بازده مالی مشخص،
  • +
  • ثبات ارزش هرگونه اعتبار، امتیاز، یا منافع غیرنقدی که ممکن است در قالب طرح‌ها به کاربر تخصیص یابد،
  • +
  • عملکرد اشخاص ثالث (از جمله پلتفرم‌ها، فروشگاه‌ها، شرکت‌های بیمه، ارائه‌دهندگان خدمات سلامت و هر شخص حقیقی یا حقوقی همکار)،
  • +
  • تصمیمات و اقدامات کاربر در جذب افراد جدید و ایجاد زیرمجموعه،
  • +
+

+ نداشته و نخواهد داشت مگر در حدودی که به‌صراحت در قرارداد یا قوانین آمره بر عهده کارابازار گذاشته شده است. +

+

+ ۳-۲. هرگونه خسارت، دعوی، تهدید، مطالبه، ادعا، شکایت یا پیگیری حقوقی که ناشی از تصمیمات شخصی کاربر، + نحوه استفاده وی از تسهیلات و مزایا، جذب دیگران، خرید کالا و خدمات، یا تعاملات او با اشخاص ثالث باشد، + مستقیماً متوجه خود کاربر است و کارابازار نسبت به آن هیچ‌گونه مسئولیت مدنی، کیفری، مالی یا قراردادی ندارد، + مگر در مواردی که طبق قوانین آمره، مسئولیت صریح و غیرقابل‌اسقاط بر عهده کارابازار قرار گرفته باشد. +

+

+ ۳-۳. کاربر می‌پذیرد که هیچ‌گونه ادعایی مبنی بر فریب، اغفال، ارائه اطلاعات نادرست یا وعده‌های خارج از + چهارچوب رسمی از سوی کارابازار یا نمایندگان رسمی آن، پس از امضای این قرارداد، از وی مسموع نخواهد بود، + مگر آنکه طبق رأی قطعی مرجع قضایی صالح، خلاف آن ثابت شود. +

+ +

ماده ۴ - مسئولیت کاربر در قبال تهدید، ادعا و شکایت

+

+ ۴-۱. کاربر متعهد است در صورت طرح هرگونه تهدید، ادعا، مطالبه، شکایت یا پیگیری حقوقی از سوی اشخاص ثالث + (از جمله افراد جذب‌شده توسط کاربر، زیرمجموعه‌ها، خریداران معرفی‌شده یا سایر اشخاص)، که ناشی از عملکرد + شخصی کاربر، معرفی‌های وی، شیوه تبلیغ، وعده‌های خارج از چارچوب رسمی کارابازار، یا نقض قوانین و مقررات + باشد، خود رأساً پاسخگو باشد و کارابازار را از هرگونه مسئولیت و هزینه احتمالی در این خصوص مصون بدارد. +

+

+ ۴-۲. کاربر می‌پذیرد که: +

+
    +
  • هرگونه تهدید یا ادعای بی‌جا، غیرمنطقی، غیرمستند یا مغایر با مفاد این قرارداد، متوجه شخص کاربر است.
  • +
  • در صورت وارد آمدن خسارت مادی یا معنوی به کارابازار ناشی از چنین تهدیدات یا ادعاهایی، کارابازار حق دارد نسبت به مطالبه خسارت از کاربر، طبق قوانین و از طریق مراجع صالح اقدام نماید.
  • +
+ +

ماده ۵ - محرمانگی و عدم افشای جزئیات کسب‌وکار

+

+ ۵-۱. کاربر می‌پذیرد که جزئیات فنی، مالی، ساختار شبکه، شیوه توزیع مزایا، قراردادهای داخلی کارابازار با + شرکای تجاری و پلتفرم‌های همکار، اطلاعات محرمانه تجاری محسوب شده و خارج از این قرارداد است و افشای آن‌ها + توسط کاربر بدون مجوز کتبی کارابازار، مجاز نمی‌باشد. +

+

+ ۵-۲. کاربر حق استناد به عدم درج جزئیات ساختار کسب‌وکار در این قرارداد را به‌عنوان دلیل بطلان، فسخ یا + ادعای فریب علیه کارابازار از خود سلب می‌نماید. +

+ +

ماده ۶ - کد تأیید یکبارمصرف (OTP) و شناسه قرارداد

+

+ ۶-۱. به منظور تأیید هویت کاربر و جایگزین کردن امضا در محیط غیرحضوری، برای این قرارداد یک شناسه یکتا + (GUID) تولید شده و از طریق سامانه کارابازار، کد تأیید یکبارمصرف (OTP) مرتبط با آن برای کاربر ارسال + می‌گردد. +

+

+ ۶-۲. کاربر با وارد کردن صحیح کد تأیید (OTP) در سامانه، اقرار می‌نماید که: +

+
    +
  • مالک شماره تماس ثبت‌شده در این قرارداد است یا با اجازه قانونی مالک از آن استفاده می‌کند،
  • +
  • از محتوای قرارداد به‌طور کامل آگاه است و آن را بدون ابهام و با رضایت کامل می‌پذیرد،
  • +
  • شناسه یکتا و OTP ارسال‌شده، معادل امضای الکترونیکی معتبر وی بر روی این قرارداد است.
  • +
+
+

شناسه یکتای قرارداد (GUID):

+

[GUID_HERE]

+
+ +

ماده ۷ - مدت، اصلاح و حاکمیت قانون

+

+ ۷-۱. این قرارداد از تاریخ تأیید نهایی (ثبت OTP) نافذ و لازم‌الاجرا بوده و تا زمانی که همکاری کاربر با + کارابازار ادامه دارد، معتبر خواهد بود؛ مگر آنکه مطابق قوانین یا توافق طرفین، خاتمه یابد. +

+

+ ۷-۲. هرگونه اصلاح در مفاد این قرارداد صرفاً از طریق اطلاع‌رسانی رسمی کارابازار و پذیرش کاربر (اعم از + امضای مکتوب، تأیید در سامانه، یا سایر روش‌های الکترونیکی مورد تأیید کارابازار) معتبر خواهد بود. +

+

+ ۷-۳. این قرارداد از هر حیث، تابع قوانین و مقررات حاکم بر جمهوری اسلامی ایران بوده و در صورت بروز اختلاف، + مراجع صالح قضایی محل استقرار کارابازار، صلاحیت رسیدگی خواهند داشت؛ مگر آنکه به نحو دیگری بین طرفین توافق + شود. +

+ +

ماده ۸ - اقرار نهایی کاربر

+

+ کاربر با امضای این قرارداد (از طریق ثبت کد تأیید یکبارمصرف OTP متناظر با شناسه یکتا)، صریحاً اعلام می‌نماید که: +

+
    +
  • کلیه مفاد قرارداد را به‌دقت مطالعه نموده و آن را درک کرده است،
  • +
  • پرسش‌های خود را مطرح نموده و پاسخ روشن دریافت کرده است،
  • +
  • ریسک‌ها، محدودیت‌ها و حدود مسئولیت کارابازار را می‌پذیرد،
  • +
  • حق هرگونه ادعای مغایر با مفاد این قرارداد، به‌ویژه ادعاهای بی‌اساس، غیرمنطقی یا ناشی از برداشت نادرست شخصی را از خود سلب و اسقاط می‌نماید؛ مگر در حدودی که قانون به‌طور آمره اجازه سلب آن را نداده باشد.
  • +
+
+ +
+
+

اطلاعات و تأیید کاربر:

+

نام و نام خانوادگی: ..........................................................

+

شماره ملی: ..........................................................

+

تاریخ: ....... / ....... / ........

+

امضا / تأیید الکترونیکی (OTP متناظر با GUID فوق):

+

..........................................................

+
+ + +
+ +

+ توضیح: این متن در حکم یک نمونه قرارداد تعهد و سلب مسئولیت است و جایگزین مشاوره حقوقی تخصصی نیست. + پیشنهاد می‌شود برای انطباق کامل با قوانین و نیازهای خاص کسب‌وکار، متن توسط مشاور حقوقی یا وکیل بررسی و در صورت لزوم اصلاح گردد. +

+ + + +``` +