Compare commits
56 Commits
c815f8d358
...
production
| Author | SHA1 | Date | |
|---|---|---|---|
| b60d1da4b7 | |||
| 016b259da0 | |||
| bb789e443e | |||
| 0c1842cf02 | |||
| 392e038913 | |||
| d7f25efce2 | |||
| 5246d8c1ba | |||
| f5bfdba124 | |||
| c2c07c6b89 | |||
| 764742dbe7 | |||
| 955736d345 | |||
| ea357e9865 | |||
| a4061c041b | |||
| a108f89213 | |||
| c71062decf | |||
| 690aaa714b | |||
| 58037f0b49 | |||
| 3d84e726db | |||
| 9203dc7924 | |||
| 4989cd00e0 | |||
| bed35935ad | |||
| ceaaac3e23 | |||
| db35814ce3 | |||
| 7a5a2110c6 | |||
| 8dbc64cd86 | |||
| deadd197e6 | |||
| 671c8407e5 | |||
| 1956dcc5f4 | |||
| d59d829d5f | |||
| 3c216feb32 | |||
| 032b8eb448 | |||
| 088ea8dc7f | |||
| cd92a2f7b0 | |||
| 0c9eb5f9ef | |||
| 94fbf49fb9 | |||
| 4330a5eaa5 | |||
| 1e5e6bcf3d | |||
| d751c06a67 | |||
| 1c5aa0ce15 | |||
| caaf28b08e | |||
| 1914f703db | |||
| a606cd93cd | |||
| 8b78235ef5 | |||
| f02d082d7b | |||
| a11a3765b8 | |||
| 3cf5ad429d | |||
| 710ddbe261 | |||
| e2ca65ed98 | |||
| ae9b448a64 | |||
| 1ea928118d | |||
| 8f2d739d1f | |||
| 8e89d5e064 | |||
| 8bd961ade1 | |||
| 750d4c6b97 | |||
| 276a4c20f2 | |||
| 98a68074bc |
@@ -1,46 +0,0 @@
|
||||
|
||||
name: Push nuget and docker image Actions Workflow
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- stage-new
|
||||
jobs:
|
||||
Deploy:
|
||||
runs-on: windows
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: https://git.afrino.co/actions/checkout@v3
|
||||
- name: Setup dotnet
|
||||
uses: https://git.afrino.co/actions/setup-dotnet@v3
|
||||
with:
|
||||
dotnet-version: 7.0.x
|
||||
|
||||
- name: Remove Package Source
|
||||
run: dotnet nuget remove source FourSat
|
||||
continue-on-error: true
|
||||
- name: Add Package Source
|
||||
run: dotnet nuget add source --name FourSat --username systemuser --password sZSA7PTiv3pUSQZ https://git.afrino.co/api/packages/FourSat/nuget/index.json --store-password-in-clear-text
|
||||
|
||||
- name: Install dependencies
|
||||
run: dotnet restore ".\src\FrontOffice.Main\FrontOffice.Main.csproj"
|
||||
- name: Build
|
||||
run: dotnet build ".\src\FrontOffice.Main\FrontOffice.Main.csproj" --configuration Release --no-restore
|
||||
- name: Test
|
||||
run: dotnet test ".\src\FrontOffice.Main\FrontOffice.Main.csproj" --no-restore --verbosity normal
|
||||
- name: Recycle Apppool
|
||||
run: |
|
||||
& "C:\Windows\System32\inetsrv\appcmd.exe" recycle apppool /apppool.name:kbs1.ir
|
||||
shell: powershell
|
||||
- name: Stop Website
|
||||
run: |
|
||||
& "C:\Windows\System32\inetsrv\appcmd.exe" stop site /site.name:kbs1.ir
|
||||
shell: powershell
|
||||
- name: Publish
|
||||
run: dotnet publish ".\src\FrontOffice.Main\FrontOffice.Main.csproj" -c Release -o publish
|
||||
- name: Copy Publish To IIS Directory
|
||||
run: Get-ChildItem -Path "publish\*" | Copy-Item -Destination "E:\kbs1.ir\kbs1.ir\" -Recurse -Force
|
||||
- name: Start Website
|
||||
run: |
|
||||
& "C:\Windows\System32\inetsrv\appcmd.exe" start site /site.name:kbs1.ir
|
||||
shell: powershell
|
||||
@@ -6,15 +6,15 @@ on:
|
||||
- kub-stage
|
||||
|
||||
env:
|
||||
REGISTRY: 194.5.195.53:30080
|
||||
REGISTRY: 185.252.31.44:30080
|
||||
IMAGE_NAME: admin/frontoffice
|
||||
K8S_SERVER: 194.5.195.53
|
||||
K8S_SERVER: 185.252.31.44
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: 194.5.195.53:32082/docker-sshpass:latest
|
||||
image: 185.252.31.44:32082/docker-sshpass:latest
|
||||
options: --privileged
|
||||
steps:
|
||||
- name: Start Docker daemon
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
mkdir -p /etc/docker
|
||||
cat > /etc/docker/daemon.json << 'DAEMON'
|
||||
{
|
||||
"insecure-registries": ["194.5.195.53:30080", "194.5.195.53:32500", "194.5.195.53:32082"]
|
||||
"insecure-registries": ["185.252.31.44:30080", "185.252.31.44:32500", "185.252.31.44:32082"]
|
||||
}
|
||||
DAEMON
|
||||
echo "🚀 Starting Docker daemon..."
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
|
||||
- name: Login to Docker registries
|
||||
run: |
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login 194.5.195.53:32082 -u admin --password-stdin
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login 185.252.31.44:32082 -u admin --password-stdin
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u admin --password-stdin
|
||||
|
||||
- name: Build Docker Image
|
||||
@@ -73,10 +73,14 @@ jobs:
|
||||
|
||||
# Apply manifests and restart
|
||||
sshpass -e ssh -o StrictHostKeyChecking=no root@${{ env.K8S_SERVER }} "
|
||||
kubectl apply -f /tmp/frontoffice-deployment.yaml &&
|
||||
crictl rmi ${REGISTRY}/${IMAGE_NAME}:latest 2>/dev/null || true &&
|
||||
kubectl rollout restart deployment/frontoffice &&
|
||||
kubectl rollout status deployment/frontoffice --timeout=180s &&
|
||||
kubectl apply -n kbs-stage -f /tmp/frontoffice-deployment.yaml &&
|
||||
# Drop cached :latest so IfNotPresent/Always both pick the new digest
|
||||
# (crictl is broken on this host — use containerd ctr)
|
||||
ctr -n k8s.io images ls -q | grep -E 'frontoffice(:latest|@)' | while read -r ref; do
|
||||
ctr -n k8s.io images rm \"\$ref\" 2>/dev/null || true
|
||||
done
|
||||
kubectl -n kbs-stage rollout restart deployment/frontoffice &&
|
||||
kubectl -n kbs-stage rollout status deployment/frontoffice --timeout=180s &&
|
||||
rm -f /tmp/frontoffice-deployment.yaml
|
||||
"
|
||||
echo "✅ Deployed!"
|
||||
|
||||
@@ -6,15 +6,15 @@ on:
|
||||
- production
|
||||
|
||||
env:
|
||||
REGISTRY: 194.5.195.53:30080
|
||||
REGISTRY: 185.252.31.44:30080
|
||||
IMAGE_NAME: admin/frontoffice
|
||||
K8S_SERVER: 194.5.195.53
|
||||
K8S_SERVER: 45.149.79.127
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: 194.5.195.53:32082/docker-sshpass:latest
|
||||
image: 185.252.31.44:32082/docker-sshpass:latest
|
||||
options: --privileged
|
||||
steps:
|
||||
- name: Start Docker daemon
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
mkdir -p /etc/docker
|
||||
cat > /etc/docker/daemon.json << 'DAEMON'
|
||||
{
|
||||
"insecure-registries": ["194.5.195.53:30080", "194.5.195.53:32500", "194.5.195.53:32082"]
|
||||
"insecure-registries": ["185.252.31.44:30080", "185.252.31.44:32500", "185.252.31.44:32082"]
|
||||
}
|
||||
DAEMON
|
||||
echo "🚀 Starting Docker daemon..."
|
||||
@@ -40,7 +40,7 @@ jobs:
|
||||
done
|
||||
|
||||
if ! docker info >/dev/null 2>&1; then
|
||||
echo "❌ Docker daemon failed to start after 3 minutes"
|
||||
echo "❌ Docker daemon failed to start"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -50,15 +50,16 @@ jobs:
|
||||
|
||||
- name: Login to Docker registries
|
||||
run: |
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login 194.5.195.53:32082 -u admin --password-stdin
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login 185.252.31.44:32082 -u admin --password-stdin
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u admin --password-stdin
|
||||
|
||||
- name: Build Docker Image
|
||||
run: |
|
||||
cd src
|
||||
DOCKER_BUILDKIT=0 docker build --network host -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \
|
||||
DOCKER_BUILDKIT=0 docker build --network host -f FrontOffice.Main/Dockerfile \
|
||||
-t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \
|
||||
-t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:prod \
|
||||
-f FrontOffice.Main/Dockerfile .
|
||||
.
|
||||
|
||||
- name: Push to Registry
|
||||
run: |
|
||||
|
||||
@@ -20,7 +20,7 @@ spec:
|
||||
spec:
|
||||
containers:
|
||||
- name: frontoffice
|
||||
image: 194.5.195.53:30080/admin/frontoffice:prod
|
||||
image: 185.252.31.44:30080/admin/frontoffice:prod
|
||||
imagePullPolicy: Always
|
||||
ports:
|
||||
- containerPort: 80
|
||||
|
||||
@@ -4,7 +4,7 @@ apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: frontoffice
|
||||
namespace: default
|
||||
namespace: kbs-stage
|
||||
labels:
|
||||
app: frontoffice
|
||||
environment: staging
|
||||
@@ -20,7 +20,8 @@ spec:
|
||||
spec:
|
||||
containers:
|
||||
- name: frontoffice
|
||||
image: 194.5.195.53:30080/admin/frontoffice:latest
|
||||
image: 185.252.31.44:30080/admin/frontoffice:latest
|
||||
# Staging uses :latest — Always avoids stale node cache after registry retag
|
||||
imagePullPolicy: Always
|
||||
ports:
|
||||
- containerPort: 80
|
||||
@@ -43,7 +44,7 @@ apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: frontoffice-svc
|
||||
namespace: default
|
||||
namespace: kbs-stage
|
||||
labels:
|
||||
app: frontoffice
|
||||
spec:
|
||||
@@ -54,3 +55,31 @@ spec:
|
||||
targetPort: 80
|
||||
name: http
|
||||
type: ClusterIP
|
||||
|
||||
---
|
||||
# FrontOffice Ingress
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: frontoffice-ingress
|
||||
namespace: kbs-stage
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||
spec:
|
||||
ingressClassName: nginx
|
||||
tls:
|
||||
- hosts:
|
||||
- frontoffice.se.kbs1.ir
|
||||
secretName: frontoffice-tls
|
||||
rules:
|
||||
- host: frontoffice.se.kbs1.ir
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: frontoffice-svc
|
||||
port:
|
||||
number: 80
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM 194.5.195.53:32082/dotnet/sdk:9.0 AS build
|
||||
FROM 185.252.31.44:32082/dotnet/sdk:9.0 AS build
|
||||
WORKDIR /src
|
||||
|
||||
# Copy NuGet config and project file
|
||||
@@ -16,7 +16,7 @@ WORKDIR "/src/FrontOffice.Main"
|
||||
RUN dotnet publish "FrontOffice.Main.csproj" -c Release -o /app/publish
|
||||
|
||||
# Runtime stage - aspnet for Blazor Server
|
||||
FROM 194.5.195.53:32082/dotnet/aspnet:9.0 AS runtime
|
||||
FROM 185.252.31.44:32082/dotnet/aspnet:9.0 AS runtime
|
||||
WORKDIR /app
|
||||
COPY --from=build /app/publish .
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<packageSources>
|
||||
<clear />
|
||||
<!-- Nexus (hosts FourSat packages + proxies nuget.org) -->
|
||||
<add key="Nexus" value="http://194.5.195.53:32081/repository/nuget-all/index.json" allowInsecureConnections="true" />
|
||||
<add key="Nexus" value="http://185.252.31.44:32081/repository/nuget-all/index.json" allowInsecureConnections="true" />
|
||||
</packageSources>
|
||||
<packageSourceCredentials>
|
||||
<Nexus>
|
||||
|
||||
@@ -94,8 +94,47 @@
|
||||
}
|
||||
|
||||
@* ═══════════════════════════════════════════════
|
||||
2. HOW IT WORKS — 3 numbered steps
|
||||
1c. TWENTYCARD CREDIT — promo box
|
||||
═══════════════════════════════════════════════ *@
|
||||
<section class="py-4" style="background:var(--mud-palette-surface);">
|
||||
<MudContainer MaxWidth="MaxWidth.Medium">
|
||||
<MudPaper Elevation="0" Class="landing-twentycard-box rounded-xl pa-4 pa-md-5">
|
||||
<MudStack Row="true" Spacing="3" AlignItems="AlignItems.Start" Class="flex-wrap">
|
||||
<MudAvatar Color="Color.Info" Variant="Variant.Filled" Size="Size.Large" Class="rounded-lg" Style="min-width:56px;">
|
||||
<MudIcon Icon="@Icons.Material.Filled.AccountBalance" />
|
||||
</MudAvatar>
|
||||
<MudStack Spacing="2" Style="flex:1; min-width:220px;">
|
||||
<MudText Typo="Typo.h6">تأمین اعتبار ۲۰کارت</MudText>
|
||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">
|
||||
با تأمین اعتبار از طریق ۲۰کارت میتوانید بدون پرداخت نقدی کامل، هزینه خرید پکیج و محصولات در کارا بازار را پوشش دهید.
|
||||
فرایند درخواست و تأیید اعتبار در پنل ۲۰کارت انجام میشود و پس از آن پرداخت از همان مسیر در دسترس است.
|
||||
این روش برای کسانی مناسب است که میخواهند سریعتر وارد مسیر عضویت و خرید شوند.
|
||||
</MudText>
|
||||
<MudText Typo="Typo.body2">
|
||||
بعد از دریافت وام، میتوانید در کارا بازار از باشگاه مشتریان استفاده کنید و با فروش و دعوت، توسعه سرمایه داشته باشید.
|
||||
</MudText>
|
||||
<div class="mt-1">
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Info"
|
||||
Class="rounded-pill"
|
||||
StartIcon="@Icons.Material.Filled.OpenInNew"
|
||||
Disabled="@string.IsNullOrWhiteSpace(_twentyCardPortalUrl)"
|
||||
OnClick="OpenTwentyCardPortal">
|
||||
ورود به سایت ۲۰کارت
|
||||
</MudButton>
|
||||
</div>
|
||||
</MudStack>
|
||||
</MudStack>
|
||||
</MudPaper>
|
||||
</MudContainer>
|
||||
</section>
|
||||
|
||||
@* ═══════════════════════════════════════════════
|
||||
2. HOW IT WORKS — 3 numbered steps
|
||||
(appsettings Landing:ShowStepsSection; default false)
|
||||
═══════════════════════════════════════════════ *@
|
||||
@if (_showStepsSection)
|
||||
{
|
||||
<section class="section-landing">
|
||||
<MudContainer MaxWidth="MaxWidth.Large">
|
||||
<div class="text-center mb-8 fade-in-up">
|
||||
@@ -121,10 +160,14 @@
|
||||
</MudGrid>
|
||||
</MudContainer>
|
||||
</section>
|
||||
}
|
||||
|
||||
@* ═══════════════════════════════════════════════
|
||||
3. FEATURES — 6 cards with icons
|
||||
(appsettings Landing:ShowFeaturesSection; default false)
|
||||
═══════════════════════════════════════════════ *@
|
||||
@if (_showFeaturesSection)
|
||||
{
|
||||
<section class="section-landing" style="background:var(--mud-palette-background-gray);">
|
||||
<MudContainer MaxWidth="MaxWidth.Large">
|
||||
<div class="text-center mb-8 fade-in-up">
|
||||
@@ -152,6 +195,7 @@
|
||||
</MudGrid>
|
||||
</MudContainer>
|
||||
</section>
|
||||
}
|
||||
|
||||
@* ═══════════════════════════════════════════════
|
||||
4. STATS — Counter cards
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using FrontOffice.Main.Utilities;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.JSInterop;
|
||||
using MudBlazor;
|
||||
|
||||
@@ -16,8 +17,12 @@ public partial class Index : IDisposable
|
||||
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
||||
[Inject] private GuestActionGate GuestGate { get; set; } = default!;
|
||||
[Inject] private VATService VAT { get; set; } = default!;
|
||||
[Inject] private IConfiguration Configuration { get; set; } = default!;
|
||||
|
||||
private bool _isAuthenticated;
|
||||
private string _twentyCardPortalUrl = string.Empty;
|
||||
private bool _showStepsSection;
|
||||
private bool _showFeaturesSection;
|
||||
|
||||
// ── CMS page data ──
|
||||
private PageSettingsDto? _pageData;
|
||||
@@ -49,6 +54,10 @@ public partial class Index : IDisposable
|
||||
{
|
||||
MainService.OnChangeHandler += OnStateChanged;
|
||||
_isAuthenticated = await AuthService.IsAuthenticatedAsync();
|
||||
_twentyCardPortalUrl = Configuration["TwentyCard:CreditPortalUrl"] ?? string.Empty;
|
||||
// appsettings Landing:* — default false (hidden). Set true to restore sections.
|
||||
_showStepsSection = Configuration.GetValue("Landing:ShowStepsSection", false);
|
||||
_showFeaturesSection = Configuration.GetValue("Landing:ShowFeaturesSection", false);
|
||||
|
||||
// Load landing page settings from CMS
|
||||
try
|
||||
@@ -162,7 +171,7 @@ public partial class Index : IDisposable
|
||||
(Icons.Material.Outlined.VerifiedUser, "ثبتنام سریع و ساده", "در چند گام کوتاه حساب بسازید و شروع کنید.", 0),
|
||||
(Icons.Material.Outlined.StarBorder, "پاداشهای شفاف", "قوانین روشن، دسترسی آسان به سوابق و گزارشها.", 100),
|
||||
(Icons.Material.Outlined.Devices, "طراحی واکنشگرا", "تجربهای روان در موبایل و دسکتاپ.", 200),
|
||||
(Icons.Material.Outlined.Groups, "تیمسازی هوشمند", "ساختار درختی شبکه و مدیریت تیمهای فروش.", 300),
|
||||
(Icons.Material.Outlined.Groups, "تیمسازی هوشمند", "ساختار درختی سازمان و مدیریت تیمهای فروش.", 300),
|
||||
(Icons.Material.Outlined.Insights, "گزارشهای لحظهای", "داشبورد پویا برای مشاهده عملکرد و کمیسیون.", 400),
|
||||
(Icons.Material.Outlined.Lock, "امنیت بالا", "رمزنگاری اطلاعات و احراز هویت چندمرحلهای.", 500),
|
||||
};
|
||||
@@ -298,6 +307,12 @@ public partial class Index : IDisposable
|
||||
Navigation.NavigateTo(RouteConstants.Registration.Wizard);
|
||||
}
|
||||
|
||||
private async Task OpenTwentyCardPortal()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_twentyCardPortalUrl)) return;
|
||||
await JS.InvokeVoidAsync("open", _twentyCardPortalUrl, "_blank");
|
||||
}
|
||||
|
||||
private void NavigateToPost(string slug)
|
||||
{
|
||||
Navigation.NavigateTo($"/blog/{slug}");
|
||||
@@ -334,8 +349,10 @@ public partial class Index : IDisposable
|
||||
public string? HeroButtonPrimaryText { get; set; }
|
||||
public string? HeroButtonSecondaryText { get; set; }
|
||||
public List<TrustBadgeItem>? TrustBadges { get; set; }
|
||||
public bool? StepsEnabled { get; set; }
|
||||
public string? StepsTitle { get; set; }
|
||||
public List<StepItem>? Steps { get; set; }
|
||||
public bool? FeaturesEnabled { get; set; }
|
||||
public string? FeaturesTitle { get; set; }
|
||||
public List<FeatureItem>? Features { get; set; }
|
||||
public string? StatsTitle { get; set; }
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
@page "/profile/invitees"
|
||||
@attribute [Authorize]
|
||||
@attribute [Route(RouteConstants.Profile.Invitees)]
|
||||
@using CMSMicroservice.Protobuf.Protos.User
|
||||
@using CMSMicroservice.Protobuf.Protos.City
|
||||
@using DateTimeConverterCL
|
||||
@inject UserContract.UserContractClient UserClient
|
||||
@inject ISnackbar Snackbar
|
||||
|
||||
@@ -13,7 +11,7 @@
|
||||
<PageHeader Title="دعوتشدگان من" BackHref="@RouteConstants.Profile.Index" />
|
||||
|
||||
<MudText Typo="Typo.body2" Class="mud-text-secondary mb-4">
|
||||
افرادی که با شماره موبایل شما بهعنوان دعوتکننده ثبتنام کردهاند (متفاوت از زیرمجموعه شبکه).
|
||||
افرادی که با شماره موبایل شما بهعنوان دعوتکننده ثبتنام کردهاند (متفاوت از سازمان فروش).
|
||||
</MudText>
|
||||
|
||||
@if (_loading)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<MudDivider Class="my-4" />
|
||||
|
||||
<MudText Typo="Typo.body2" Color="Color.Secondary">
|
||||
موجودی کیف پول: @FormatPrice(_walletBalance)
|
||||
موجودی کیف پول اصلی: @FormatPrice(_walletBalance)
|
||||
</MudText>
|
||||
|
||||
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="mt-6"
|
||||
|
||||
@@ -319,17 +319,17 @@ public partial class RegisterWizard
|
||||
$"<p><span class='field-label'>شماره ملی:</span> {_model.NationalCode?.PersianToEnglish()}</p>" +
|
||||
$"<p><span class='field-label'>شماره تماس:</span> {_userAuthInfo.MobileNumber?.PersianToEnglish()}</p></div>" +
|
||||
"<p>کارابازار و کاربر که در این قرارداد جداگانه «طرف» و مجموعاً «طرفین» نامیده میشوند، با علم و آگاهی کامل، مفاد زیر را پذیرفته و امضا مینمایند.</p></div><div><p class='section-title'>ماده ۱ - موضوع قرارداد</p>" +
|
||||
"<p>موضوع این قرارداد، تعیین حدود و چارچوب تعهدات و سلب مسئولیت کارابازار در قبال استفاده کاربر ازخدمات، باشگاه مشتریان، مزایا، طرحهای همکاری، شبکه معرفی، خرید از فروشگاههای طرفقراردادو هرگونه امکانات و تسهیلات مرتبط است که حسب مورد توسط کارابازار یا از طریق پلتفرمها و شرکتهایهمکار در اختیار کاربر قرار میگیرد، بدون اینکه جزئیات مدل کسبوکار، شیوه تأمین منابع مالی،شبکه همکاری یا ساختار داخلی آن در این قرارداد ذکر یا افشا شود.</p>" +
|
||||
"<p>موضوع این قرارداد، تعیین حدود و چارچوب تعهدات و سلب مسئولیت کارابازار در قبال استفاده کاربر ازخدمات، باشگاه مشتریان، مزایا، طرحهای همکاری، سازمان معرفی، خرید از فروشگاههای طرفقراردادو هرگونه امکانات و تسهیلات مرتبط است که حسب مورد توسط کارابازار یا از طریق پلتفرمها و شرکتهایهمکار در اختیار کاربر قرار میگیرد، بدون اینکه جزئیات مدل کسبوکار، شیوه تأمین منابع مالی،سازمان همکاری یا ساختار داخلی آن در این قرارداد ذکر یا افشا شود.</p>" +
|
||||
"<p class='section-title'>ماده ۲ - اقرار و آگاهی کاربر</p><p>۲-۱. کاربر اقرار مینماید که کلیه اطلاعات کلی لازم در خصوص نحوه فعالیت، مزایا، ریسکهای احتمالی," +
|
||||
"سازوکار کلی استفاده از خدمات، و چارچوب کلی همکاری را از مراجع رسمی معرفیشده توسط کارابازاردریافت کرده، سؤالات خود را مطرح نموده و پاسخ مناسب را دریافت نموده است.</p><p>۲-۲. کاربر با امضای این قرارداد اقرار مینماید که:</p><ul><li>با اراده آزاد و بدون هرگونه اجبار، اکراه، فریب یا سوءاستفاده از ناآگاهی وارد این همکاری شده است.</li><li>از احتمال وجود ریسکهای مالی، اعتباری، قانونی و شبکهای مرتبط با فعالیت خود آگاه بوده و آن را میپذیرد.</li>" +
|
||||
"<li>هرگونه تصمیم برای استفاده از تسهیلات، مزایا، خدمات باشگاه مشتریان، فعالیت در شبکه معرفی، خرید از فروشگاهها و جذب افراد جدید، تصمیمی شخصی و آگاهانه است و بهعنوان تعهد یا ضمانت بازده مشخص از سوی کارابازار تلقی نمیشود.</li></ul>" +
|
||||
"<li>هرگونه تصمیم برای استفاده از تسهیلات، مزایا، خدمات باشگاه مشتریان، فعالیت در سازمان معرفی، خرید از فروشگاهها و جذب افراد جدید، تصمیمی شخصی و آگاهانه است و بهعنوان تعهد یا ضمانت بازده مشخص از سوی کارابازار تلقی نمیشود.</li></ul>" +
|
||||
"<p class='section-title'>ماده ۳ - سلب مسئولیت کارابازار</p><p>۳-۱. کاربر صراحتاً میپذیرد که کارابازار صرفاً در چارچوب قوانین و مقررات حاکم و مطابق قراردادها و تفاهمنامههای خود با شرکای تجاری و پلتفرمهای همکار، خدمات و امکانات مشخصی را در اختیار کاربر قرار میدهد و هیچگونه تعهدی نسبت به:</p><ul><li>تحقق سود یا بازده مالی مشخص،</li><li>ثبات ارزش هرگونه اعتبار، امتیاز، یا منافع غیرنقدی که ممکن است در قالب طرحها به کاربر تخصیص یابد،</li>" +
|
||||
"<li>عملکرد اشخاص ثالث (از جمله پلتفرمها، فروشگاهها، شرکتهای بیمه، ارائهدهندگان خدمات سلامت و هر شخص حقیقی یا حقوقی همکار)،</li><li>تصمیمات و اقدامات کاربر در جذب افراد جدید و ایجاد زیرمجموعه،</li></ul><p>نداشته و نخواهد داشت مگر در حدودی که بهصراحت در قرارداد یا قوانین آمره بر عهده کارابازار گذاشته شده است.</p><p>" +
|
||||
"۳-۲. هرگونه خسارت، دعوی، تهدید، مطالبه، ادعا، شکایت یا پیگیری حقوقی که ناشی از تصمیمات شخصی کاربر،نحوه استفاده وی از تسهیلات و مزایا، جذب دیگران، خرید کالا و خدمات، یا تعاملات او با اشخاص ثالث باشد،مستقیماً متوجه خود کاربر است و کارابازار نسبت به آن هیچگونه مسئولیت مدنی، کیفری، مالی یا قراردادی ندارد," +
|
||||
"مگر در مواردی که طبق قوانین آمره، مسئولیت صریح و غیرقابلاسقاط بر عهده کارابازار قرار گرفته باشد.</p><p>۳-۳. کاربر میپذیرد که هیچگونه ادعایی مبنی بر فریب، اغفال، ارائه اطلاعات نادرست یا وعدههای خارج ازچهارچوب رسمی از سوی کارابازار یا نمایندگان رسمی آن، پس از امضای این قرارداد، از وی مسموع نخواهد بود،مگر آنکه طبق رأی قطعی مرجع قضایی صالح، خلاف آن ثابت شود.</p><p class='section-title'>ماده ۴ - مسئولیت کاربر در قبال تهدید، ادعا و شکایت</p>" +
|
||||
"<p>۴-۱. کاربر متعهد است در صورت طرح هرگونه تهدید، ادعا، مطالبه، شکایت یا پیگیری حقوقی از سوی اشخاص ثالث(از جمله افراد جذبشده توسط کاربر، زیرمجموعهها، خریداران معرفیشده یا سایر اشخاص)، که ناشی از عملکردشخصی کاربر، معرفیهای وی، شیوه تبلیغ، وعدههای خارج از چارچوب رسمی کارابازار، یا نقض قوانین و مقرراتباشد، خود رأساً پاسخگو باشد و کارابازار را از هرگونه مسئولیت و هزینه احتمالی در این خصوص مصون بدارد.</p><p>۴-۲. کاربر میپذیرد که:</p><ul><li>هرگونه تهدید یا ادعای بیجا، غیرمنطقی، غیرمستند یا مغایر با مفاد این قرارداد، متوجه شخص کاربر است.</li>" +
|
||||
"<li>در صورت وارد آمدن خسارت مادی یا معنوی به کارابازار ناشی از چنین تهدیدات یا ادعاهایی، کارابازار حق دارد نسبت به مطالبه خسارت از کاربر، طبق قوانین و از طریق مراجع صالح اقدام نماید.</li></ul>" +
|
||||
"<p class='section-title'>ماده ۵ - محرمانگی و عدم افشای جزئیات کسبوکار</p><p>۵-۱. کاربر میپذیرد که جزئیات فنی، مالی، ساختار شبکه، شیوه توزیع مزایا، قراردادهای داخلی کارابازار باشرکای تجاری و پلتفرمهای همکار، اطلاعات محرمانه تجاری محسوب شده و خارج از این قرارداد است و افشای آنهاتوسط کاربر بدون مجوز کتبی کارابازار، مجاز نمیباشد.</p><p>۵-۲. کاربر حق استناد به عدم درج جزئیات ساختار کسبوکار در این قرارداد را بهعنوان دلیل بطلان، فسخ یاادعای فریب علیه کارابازار از خود سلب مینماید.</p>" +
|
||||
"<p class='section-title'>ماده ۵ - محرمانگی و عدم افشای جزئیات کسبوکار</p><p>۵-۱. کاربر میپذیرد که جزئیات فنی، مالی، ساختار سازمان، شیوه توزیع مزایا، قراردادهای داخلی کارابازار باشرکای تجاری و پلتفرمهای همکار، اطلاعات محرمانه تجاری محسوب شده و خارج از این قرارداد است و افشای آنهاتوسط کاربر بدون مجوز کتبی کارابازار، مجاز نمیباشد.</p><p>۵-۲. کاربر حق استناد به عدم درج جزئیات ساختار کسبوکار در این قرارداد را بهعنوان دلیل بطلان، فسخ یاادعای فریب علیه کارابازار از خود سلب مینماید.</p>" +
|
||||
"<p class='section-title'>ماده ۶ - کد تأیید یکبارمصرف (OTP) و شناسه قرارداد</p><p>۶-۱. به منظور تأیید هویت کاربر و جایگزین کردن امضا در محیط غیرحضوری، برای این قرارداد یک شناسه یکتا(GUID) تولید شده و از طریق سامانه کارابازار، کد تأیید یکبارمصرف (OTP) مرتبط با آن برای کاربر ارسالمیگردد.</p>" +
|
||||
"<p>۶-۲. کاربر با وارد کردن صحیح کد تأیید (OTP) در سامانه، اقرار مینماید که:</p><ul><li>مالک شماره تماس ثبتشده در این قرارداد است یا با اجازه قانونی مالک از آن استفاده میکند،</li><li>از محتوای قرارداد بهطور کامل آگاه است و آن را بدون ابهام و با رضایت کامل میپذیرد،</li><li>شناسه یکتا و OTP ارسالشده، معادل امضای الکترونیکی معتبر وی بر روی این قرارداد است.</li></ul>" +
|
||||
"<p class='section-title'>ماده ۷ - مدت، اصلاح و حاکمیت قانون</p>" +
|
||||
|
||||
@@ -45,6 +45,9 @@
|
||||
Href="https://wa.me/989123456789"
|
||||
Target="_blank" />
|
||||
</MudStack>
|
||||
<MudStack Row="true" Spacing="2" Class="enamad">
|
||||
<a referrerpolicy='origin' target='_blank' href='https://trustseal.enamad.ir/?id=688255&Code=uoMRGkyUYHAtMxkpBLB0KyPL5Ac66ACX'><img referrerpolicy='origin' src='https://trustseal.enamad.ir/logo.aspx?id=688255&Code=uoMRGkyUYHAtMxkpBLB0KyPL5Ac66ACX' alt='' style='cursor:pointer' code='uoMRGkyUYHAtMxkpBLB0KyPL5Ac66ACX'></a>
|
||||
</MudStack>
|
||||
</MudStack>
|
||||
</MudItem>
|
||||
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
|
||||
<MudTextField Value="ReferralCode"
|
||||
ValueChanged="@((string? v) => ReferralCodeChanged.InvokeAsync(v))"
|
||||
Label="کد معرف شبکه (اختیاری)"
|
||||
Label="کد معرف سازمان (اختیاری)"
|
||||
Variant="Variant.Outlined"
|
||||
Immediate="true"
|
||||
Placeholder="کد معرف ۱۰ رقمی"
|
||||
Class="mb-3"
|
||||
HelperText="جایگاه شما در شبکه — با لینک معرف پر میشود" />
|
||||
HelperText="جایگاه شما در سازمان — با لینک معرف پر میشود" />
|
||||
|
||||
<MudTextField Value="InviterMobile"
|
||||
ValueChanged="@((string? v) => InviterMobileChanged.InvokeAsync(v))"
|
||||
@@ -52,7 +52,7 @@
|
||||
Immediate="true"
|
||||
Placeholder="مثلاً 0912xxxxxxx"
|
||||
Class="mb-3"
|
||||
HelperText="کسی که شما را با سیستم آشنا کرده — متفاوت از معرف شبکه" />
|
||||
HelperText="کسی که شما را به کارابازار معرفی کرده — متفاوت از معرف سازمان" />
|
||||
|
||||
@if (!string.IsNullOrWhiteSpace(ErrorMessage))
|
||||
{
|
||||
|
||||
@@ -208,6 +208,6 @@ public class SeoMetadataProvider
|
||||
|
||||
private static string GetHomeCrawlableContent() =>
|
||||
"کارابازار سلامت (KBS) — باشگاه مشتریان و فروشگاه محصولات سلامت. " +
|
||||
"با عضویت در باشگاه مشتریان KBS از پاداش شفاف، کیف پول جادویی، فروشگاه اعتباری و شبکه فروش بهرهمند شوید. " +
|
||||
"با عضویت در باشگاه مشتریان KBS از پاداش شفاف، کیف پول جادویی، فروشگاه اعتباری و سازمان فروش بهرهمند شوید. " +
|
||||
"ثبتنام رایگان در kbs2.ir.";
|
||||
}
|
||||
|
||||
@@ -7,5 +7,5 @@ public class SeoSettings
|
||||
public string SiteUrl { get; set; } = "https://kbs2.ir";
|
||||
public string SiteName { get; set; } = "کارابازار سلامت";
|
||||
public string DefaultDescription { get; set; } =
|
||||
"باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و شبکه فروش.";
|
||||
"باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و سازمان فروش.";
|
||||
}
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
{
|
||||
"GwUrl": "https://cms.kbs1.ir",
|
||||
"GwUrl": "https://cms.kbs2.ir",
|
||||
"DownloadUrl": "",
|
||||
"TwentyCard": {
|
||||
"CreditPortalUrl": "https://20card.ir"
|
||||
},
|
||||
"EncryptionSettings": {
|
||||
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
||||
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
||||
@@ -17,5 +14,10 @@
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"Seo": {
|
||||
"SiteUrl": "https://kbs2.ir",
|
||||
"SiteName": "کارابازار سلامت",
|
||||
"DefaultDescription": "باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و شبکه فروش."
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
|
||||
@@ -2,12 +2,16 @@
|
||||
"Seo": {
|
||||
"SiteUrl": "https://kbs1.ir",
|
||||
"SiteName": "کارابازار سلامت",
|
||||
"DefaultDescription": "باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و شبکه فروش."
|
||||
"DefaultDescription": "باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و سازمان فروش."
|
||||
},
|
||||
"GwUrl": "https://cms.se.kbs1.ir",
|
||||
"DownloadUrl": "",
|
||||
"TwentyCard": {
|
||||
"CreditPortalUrl": "https://20card.ir"
|
||||
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
||||
},
|
||||
"Landing": {
|
||||
"ShowStepsSection": false,
|
||||
"ShowFeaturesSection": false
|
||||
},
|
||||
"EncryptionSettings": {
|
||||
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
||||
|
||||
@@ -2,12 +2,16 @@
|
||||
"Seo": {
|
||||
"SiteUrl": "http://localhost:5268",
|
||||
"SiteName": "کارابازار سلامت",
|
||||
"DefaultDescription": "باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و شبکه فروش."
|
||||
"DefaultDescription": "باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و سازمان فروش."
|
||||
},
|
||||
"GwUrl": "https://cms.se.kbs1.ir",
|
||||
"DownloadUrl": "",
|
||||
"TwentyCard": {
|
||||
"CreditPortalUrl": "https://20card.ir"
|
||||
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
||||
},
|
||||
"Landing": {
|
||||
"ShowStepsSection": false,
|
||||
"ShowFeaturesSection": false
|
||||
},
|
||||
"EncryptionSettings": {
|
||||
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
||||
|
||||
@@ -1617,6 +1617,12 @@ html, body {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ── Landing TwentyCard credit promo ── */
|
||||
.landing-twentycard-box {
|
||||
background: var(--ds-info-soft);
|
||||
border: 1px solid rgba(59, 130, 246, 0.22);
|
||||
}
|
||||
|
||||
/* ── Register Wizard Unified ── */
|
||||
.wizard-section {
|
||||
min-height: 80vh;
|
||||
|
||||
Reference in New Issue
Block a user