feat: Update week number handling to use WeekDefinitionId and improve UI components
Build and Deploy / build (push) Successful in 2m25s

This commit is contained in:
masoodafar-web
2025-12-20 03:17:04 +03:30
parent d1940033db
commit 869cf7e516
17 changed files with 372 additions and 353 deletions
+172 -200
View File
@@ -1,212 +1,184 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
<BlazorCacheBootResources>false</BlazorCacheBootResources>
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
<BlazorCacheBootResources>false</BlazorCacheBootResources>
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Common\NewFolder\**" />
<Content Remove="Common\NewFolder\**" />
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
<EmbeddedResource Remove="Common\NewFolder\**" />
<None Remove="Common\NewFolder\**" />
<!-- =========================================================== -->
<!-- TEMPORARILY EXCLUDED - Missing Proto Projects -->
<!-- TODO: Create these proto projects in BackOffice.BFF -->
<!-- =========================================================== -->
<!-- DiscountShop Pages & Services - FULLY ENABLED -->
<!-- <Compile Remove="Pages\DiscountShop\**" /> -->
<!-- <Content Remove="Pages\DiscountShop\**" /> -->
<!-- <Compile Remove="Services\DiscountProduct\**" /> -->
<!-- <Compile Remove="Services\DiscountCategory\**" /> -->
<!-- <Compile Remove="Services\DiscountOrder\**" /> -->
<!-- Tag Pages & Services - ENABLED -->
<!-- <Compile Remove="Pages\\Tag\\**" /> -->
<!-- <Content Remove="Pages\\Tag\\**" /> -->
<!-- <Compile Remove="Services\\Tag\\**" /> -->
<!-- PublicMessages Pages & Services - ENABLED -->
<!-- <Compile Remove="Pages\PublicMessages\**" /> -->
<!-- <Content Remove="Pages\PublicMessages\**" /> -->
<!-- <Compile Remove="Services\PublicMessage\**" /> -->
<!-- ManualPayment - ENABLED -->
<!-- <Compile Remove="Pages\Payment\ManualPayments.razor" /> -->
<!-- <Content Remove="Pages\Payment\ManualPayments.razor" /> -->
<!-- <Compile Remove="Pages\Payment\ManualPayments.razor.cs" /> -->
<!-- <Compile Remove="Pages\Payment\Components\ManualPaymentDialog.razor" /> -->
<!-- <Content Remove="Pages\Payment\Components\ManualPaymentDialog.razor" /> -->
<!-- <Compile Remove="Pages\Payment\Components\ManualPaymentDialog.razor.cs" /> -->
<!-- Dashboard widgets - ENABLED -->
<!-- <Compile Remove="Pages\Dashboard\DiscountShopWidget.razor" /> -->
<!-- <Content Remove="Pages\Dashboard\DiscountShopWidget.razor" /> -->
<!-- <Compile Remove="Pages\Dashboard\DiscountShopWidget.razor.cs" /> -->
<!-- BulkEdit - ENABLED -->
<!-- <Compile Remove="Pages\Products\BulkEdit.razor" /> -->
<!-- <Content Remove="Pages\Products\BulkEdit.razor" /> -->
<!-- <Compile Remove="Pages\Products\BulkEdit.razor.cs" /> -->
<!-- GalleryDialog - ENABLED (proto added) -->
<!-- <Compile Remove="Pages\Products\Components\GalleryDialog.razor" /> -->
<!-- <Content Remove="Pages\Products\Components\GalleryDialog.razor" /> -->
<!-- <Compile Remove="Pages\Products\Components\GalleryDialog.razor.cs" /> -->
<!-- CreateDialog/UpdateDialog - ENABLED (proto added) -->
<!-- <Compile Remove="Pages\Products\Components\CreateDialog.razor" /> -->
<!-- <Content Remove="Pages\Products\Components\CreateDialog.razor" /> -->
<!-- <Compile Remove="Pages\Products\Components\CreateDialog.razor.cs" /> -->
<!-- <Compile Remove="Pages\Products\Components\UpdateDialog.razor" /> -->
<!-- <Content Remove="Pages\Products\Components\UpdateDialog.razor" /> -->
<!-- <Compile Remove="Pages\Products\Components\UpdateDialog.razor.cs" /> -->
<!-- Category/Product DragDrop pages - ENABLED -->
<!-- <Compile Remove="Pages\Category\CategoryProductsDragDropPage.razor" /> -->
<!-- <Content Remove="Pages\Category\CategoryProductsDragDropPage.razor" /> -->
<!-- <Compile Remove="Pages\Category\CategoryProductsDragDropPage.razor.cs" /> -->
<!-- <Compile Remove="Pages\Products\ProductCategoriesDragDropPage.razor" /> -->
<!-- <Content Remove="Pages\Products\ProductCategoriesDragDropPage.razor" /> -->
<!-- <Compile Remove="Pages\Products\ProductCategoriesDragDropPage.razor.cs" /> -->
<!-- UserOrder Components - RESTORED - proto methods exist -->
<!-- <Compile Remove="Pages\UserOrder\Components\CancelOrderDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\CancelOrderDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\CancelOrderDialog.razor.cs" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ApplyDiscountDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\ApplyDiscountDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ApplyDiscountDialog.razor.cs" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ChangeOrderStatusDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\ChangeOrderStatusDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ChangeOrderStatusDialog.razor.cs" /> -->
<!-- UserOrderDetailsDialog - RESTORED - VAT fields exist in proto -->
<!-- <Compile Remove="Pages\UserOrder\Components\UserOrderDetailsDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\UserOrderDetailsDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\UserOrderDetailsDialog.razor.cs" /> -->
<!-- UserOrderMainPage - RESTORED - dialogs are back -->
<!-- <Compile Remove="Pages\UserOrder\UserOrderMainPage.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\UserOrderMainPage.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\UserOrderMainPage.razor.cs" /> -->
<!-- Transactions - ENABLED -->
<!-- <Compile Remove="Pages\Payment\Transactions.razor" /> -->
<!-- <Content Remove="Pages\Payment\Transactions.razor" /> -->
<!-- <Compile Remove="Pages\Payment\Transactions.razor.cs" /> -->
</ItemGroup>
<ItemGroup>
<Compile Remove="Common\NewFolder\**"/>
<Content Remove="Common\NewFolder\**"/>
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
<EmbeddedResource Remove="Common\NewFolder\**"/>
<None Remove="Common\NewFolder\**"/>
<ItemGroup>
<!-- =========================================================== -->
<!-- TEMPORARILY EXCLUDED - Missing Proto Projects -->
<!-- TODO: Create these proto projects in BackOffice.BFF -->
<!-- =========================================================== -->
<!-- DiscountShop Pages & Services - FULLY ENABLED -->
<!-- <Compile Remove="Pages\DiscountShop\**" /> -->
<!-- <Content Remove="Pages\DiscountShop\**" /> -->
<!-- <Compile Remove="Services\DiscountProduct\**" /> -->
<!-- <Compile Remove="Services\DiscountCategory\**" /> -->
<!-- <Compile Remove="Services\DiscountOrder\**" /> -->
<!-- Tag Pages & Services - ENABLED -->
<!-- <Compile Remove="Pages\\Tag\\**" /> -->
<!-- <Content Remove="Pages\\Tag\\**" /> -->
<!-- <Compile Remove="Services\\Tag\\**" /> -->
<!-- PublicMessages Pages & Services - ENABLED -->
<!-- <Compile Remove="Pages\PublicMessages\**" /> -->
<!-- <Content Remove="Pages\PublicMessages\**" /> -->
<!-- <Compile Remove="Services\PublicMessage\**" /> -->
<!-- ManualPayment - ENABLED -->
<!-- <Compile Remove="Pages\Payment\ManualPayments.razor" /> -->
<!-- <Content Remove="Pages\Payment\ManualPayments.razor" /> -->
<!-- <Compile Remove="Pages\Payment\ManualPayments.razor.cs" /> -->
<!-- <Compile Remove="Pages\Payment\Components\ManualPaymentDialog.razor" /> -->
<!-- <Content Remove="Pages\Payment\Components\ManualPaymentDialog.razor" /> -->
<!-- <Compile Remove="Pages\Payment\Components\ManualPaymentDialog.razor.cs" /> -->
<!-- Dashboard widgets - ENABLED -->
<!-- <Compile Remove="Pages\Dashboard\DiscountShopWidget.razor" /> -->
<!-- <Content Remove="Pages\Dashboard\DiscountShopWidget.razor" /> -->
<!-- <Compile Remove="Pages\Dashboard\DiscountShopWidget.razor.cs" /> -->
<!-- BulkEdit - ENABLED -->
<!-- <Compile Remove="Pages\Products\BulkEdit.razor" /> -->
<!-- <Content Remove="Pages\Products\BulkEdit.razor" /> -->
<!-- <Compile Remove="Pages\Products\BulkEdit.razor.cs" /> -->
<!-- GalleryDialog - ENABLED (proto added) -->
<!-- <Compile Remove="Pages\Products\Components\GalleryDialog.razor" /> -->
<!-- <Content Remove="Pages\Products\Components\GalleryDialog.razor" /> -->
<!-- <Compile Remove="Pages\Products\Components\GalleryDialog.razor.cs" /> -->
<!-- CreateDialog/UpdateDialog - ENABLED (proto added) -->
<!-- <Compile Remove="Pages\Products\Components\CreateDialog.razor" /> -->
<!-- <Content Remove="Pages\Products\Components\CreateDialog.razor" /> -->
<!-- <Compile Remove="Pages\Products\Components\CreateDialog.razor.cs" /> -->
<!-- <Compile Remove="Pages\Products\Components\UpdateDialog.razor" /> -->
<!-- <Content Remove="Pages\Products\Components\UpdateDialog.razor" /> -->
<!-- <Compile Remove="Pages\Products\Components\UpdateDialog.razor.cs" /> -->
<!-- Category/Product DragDrop pages - ENABLED -->
<!-- <Compile Remove="Pages\Category\CategoryProductsDragDropPage.razor" /> -->
<!-- <Content Remove="Pages\Category\CategoryProductsDragDropPage.razor" /> -->
<!-- <Compile Remove="Pages\Category\CategoryProductsDragDropPage.razor.cs" /> -->
<!-- <Compile Remove="Pages\Products\ProductCategoriesDragDropPage.razor" /> -->
<!-- <Content Remove="Pages\Products\ProductCategoriesDragDropPage.razor" /> -->
<!-- <Compile Remove="Pages\Products\ProductCategoriesDragDropPage.razor.cs" /> -->
<!-- UserOrder Components - RESTORED - proto methods exist -->
<!-- <Compile Remove="Pages\UserOrder\Components\CancelOrderDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\CancelOrderDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\CancelOrderDialog.razor.cs" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ApplyDiscountDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\ApplyDiscountDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ApplyDiscountDialog.razor.cs" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ChangeOrderStatusDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\ChangeOrderStatusDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\ChangeOrderStatusDialog.razor.cs" /> -->
<!-- UserOrderDetailsDialog - RESTORED - VAT fields exist in proto -->
<!-- <Compile Remove="Pages\UserOrder\Components\UserOrderDetailsDialog.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\Components\UserOrderDetailsDialog.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\Components\UserOrderDetailsDialog.razor.cs" /> -->
<!-- UserOrderMainPage - RESTORED - dialogs are back -->
<!-- <Compile Remove="Pages\UserOrder\UserOrderMainPage.razor" /> -->
<!-- <Content Remove="Pages\UserOrder\UserOrderMainPage.razor" /> -->
<!-- <Compile Remove="Pages\UserOrder\UserOrderMainPage.razor.cs" /> -->
<!-- Transactions - ENABLED -->
<!-- <Compile Remove="Pages\Payment\Transactions.razor" /> -->
<!-- <Content Remove="Pages\Payment\Transactions.razor" /> -->
<!-- <Compile Remove="Pages\Payment\Transactions.razor.cs" /> -->
</ItemGroup>
<ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0"/>
<PackageReference Include="Foursat.BackOffice.BFF.Category.Protobuf" Version="0.0.5"/>
<PackageReference Include="Foursat.BackOffice.BFF.ClubMembership.Protobuf" Version="0.0.7"/>
<PackageReference Include="Foursat.BackOffice.BFF.Commission.Protobuf" Version="0.0.13"/>
<PackageReference Include="Foursat.BackOffice.BFF.Common.Protobuf" Version="0.0.3"/>
<PackageReference Include="Foursat.BackOffice.BFF.Configuration.Protobuf" Version="1.0.7"/>
<PackageReference Include="Foursat.BackOffice.BFF.DiscountCategory.Protobuf" Version="0.0.3"/>
<PackageReference Include="Foursat.BackOffice.BFF.DiscountOrder.Protobuf" Version="0.0.3"/>
<PackageReference Include="Foursat.BackOffice.BFF.DiscountProduct.Protobuf" Version="0.0.3"/>
<PackageReference Include="Foursat.BackOffice.BFF.DiscountShoppingCart.Protobuf" Version="0.0.3"/>
<PackageReference Include="Foursat.BackOffice.BFF.Health.Protobuf" Version="1.0.5"/>
<PackageReference Include="Foursat.BackOffice.BFF.ManualPayment.Protobuf" Version="0.0.5"/>
<PackageReference Include="Foursat.BackOffice.BFF.NetworkMembership.Protobuf" Version="0.0.11"/>
<PackageReference Include="Foursat.BackOffice.BFF.Otp.Protobuf" Version="0.0.113"/>
<PackageReference Include="FourSat.BackOffice.BFF.Package.Protobuf" Version="0.0.113"/>
<PackageReference Include="Foursat.BackOffice.BFF.Products.Protobuf" Version="0.0.11"/>
<PackageReference Include="Foursat.BackOffice.BFF.ProductTag.Protobuf" Version="0.0.3"/>
<PackageReference Include="Foursat.BackOffice.BFF.PublicMessage.Protobuf" Version="0.0.5"/>
<PackageReference Include="Foursat.BackOffice.BFF.Role.Protobuf" Version="0.0.113"/>
<PackageReference Include="Foursat.BackOffice.BFF.Tag.Protobuf" Version="0.0.4"/>
<PackageReference Include="Foursat.BackOffice.BFF.User.Protobuf" Version="0.0.114"/>
<PackageReference Include="Foursat.BackOffice.BFF.UserAddress.Protobuf" Version="0.0.113"/>
<PackageReference Include="Foursat.BackOffice.BFF.UserOrder.Protobuf" Version="0.0.116"/>
<PackageReference Include="Foursat.BackOffice.BFF.UserRole.Protobuf" Version="0.0.113"/>
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
<!-- Proto Projects - Using ProjectReference for latest changes -->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Category.Protobuf/BackOffice.BFF.Category.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.ClubMembership.Protobuf/BackOffice.BFF.ClubMembership.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Commission.Protobuf/BackOffice.BFF.Commission.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Common.Protobuf/BackOffice.BFF.Common.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Configuration.Protobuf/BackOffice.BFF.Configuration.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountCategory.Protobuf/BackOffice.BFF.DiscountCategory.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountOrder.Protobuf/BackOffice.BFF.DiscountOrder.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountProduct.Protobuf/BackOffice.BFF.DiscountProduct.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountShoppingCart.Protobuf/BackOffice.BFF.DiscountShoppingCart.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Health.Protobuf/BackOffice.BFF.Health.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/BackOffice.BFF.ManualPayment.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.NetworkMembership.Protobuf/BackOffice.BFF.NetworkMembership.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Otp.Protobuf/BackOffice.BFF.Otp.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Package.Protobuf/BackOffice.BFF.Package.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Products.Protobuf/BackOffice.BFF.Products.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.ProductTag.Protobuf/BackOffice.BFF.ProductTag.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/BackOffice.BFF.PublicMessage.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Role.Protobuf/BackOffice.BFF.Role.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Tag.Protobuf/BackOffice.BFF.Tag.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.User.Protobuf/BackOffice.BFF.User.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.UserAddress.Protobuf/BackOffice.BFF.UserAddress.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/BackOffice.BFF.UserOrder.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.UserRole.Protobuf/BackOffice.BFF.UserRole.Protobuf.csproj" />-->
<PackageReference Include="HtmlAgilityPack" Version="1.12.1"/>
<PackageReference Include="DateTimeConverterCL" Version="1.0.0"/>
<PackageReference Include="Grpc.Core" Version="2.46.6"/>
<PackageReference Include="Grpc.Net.Client" Version="2.71.0"/>
<PackageReference Include="Grpc.Net.Client.Web" Version="2.71.0"/>
<PackageReference Include="Mapster" Version="7.4.0"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.11"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.11"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.11" PrivateAssets="all"/>
<PackageReference Include="Foursat.BackOffice.BFF.Category.Protobuf" Version="0.0.4" />
<PackageReference Include="Foursat.BackOffice.BFF.ClubMembership.Protobuf" Version="0.0.6" />
<PackageReference Include="Foursat.BackOffice.BFF.Commission.Protobuf" Version="0.0.12" />
<PackageReference Include="Foursat.BackOffice.BFF.Common.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.Configuration.Protobuf" Version="1.0.6" />
<PackageReference Include="Foursat.BackOffice.BFF.DiscountCategory.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.DiscountOrder.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.DiscountProduct.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.DiscountShoppingCart.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.Health.Protobuf" Version="1.0.4" />
<PackageReference Include="Foursat.BackOffice.BFF.ManualPayment.Protobuf" Version="0.0.4" />
<PackageReference Include="Foursat.BackOffice.BFF.NetworkMembership.Protobuf" Version="0.0.9" />
<PackageReference Include="Foursat.BackOffice.BFF.Otp.Protobuf" Version="0.0.112" />
<PackageReference Include="FourSat.BackOffice.BFF.Package.Protobuf" Version="0.0.112" />
<PackageReference Include="Foursat.BackOffice.BFF.Products.Protobuf" Version="0.0.9" />
<PackageReference Include="Foursat.BackOffice.BFF.ProductTag.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.PublicMessage.Protobuf" Version="0.0.4" />
<!-- Products: Using ProjectReference for latest proto features (ToggleProductStatus, BulkUpdate, CategoryId filter) -->
<!--<PackageReference Include="Foursat.BackOffice.BFF.Products.Protobuf" Version="0.0.8" />-->
<PackageReference Include="Foursat.BackOffice.BFF.Role.Protobuf" Version="0.0.112" />
<PackageReference Include="Foursat.BackOffice.BFF.Tag.Protobuf" Version="0.0.2" />
<PackageReference Include="Foursat.BackOffice.BFF.User.Protobuf" Version="0.0.113" />
<PackageReference Include="Foursat.BackOffice.BFF.UserRole.Protobuf" Version="0.0.112" />
<PackageReference Include="Foursat.BackOffice.BFF.UserAddress.Protobuf" Version="0.0.112" />
<PackageReference Include="Foursat.BackOffice.BFF.UserOrder.Protobuf" Version="0.0.115" />
<!-- UserOrder: Using ProjectReference for latest proto features (CancelOrder, ApplyDiscount, UpdateOrderStatus) -->
<!--<PackageReference Include="Foursat.BackOffice.BFF.UserOrder.Protobuf" Version="0.0.114" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Products.Protobuf/BackOffice.BFF.Products.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/BackOffice.BFF.UserOrder.Protobuf.csproj" />-->
<!--<PackageReference Include="Foursat.BackOffice.BFF.Commission.Protobuf" Version="0.0.2" />-->
<!--<PackageReference Include="Foursat.BackOffice.BFF.ClubMembership.Protobuf" Version="0.0.1" />-->
<!--<PackageReference Include="Foursat.BackOffice.BFF.NetworkMembership.Protobuf" Version="0.0.1" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Commission.Protobuf/BackOffice.BFF.Commission.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.ClubMembership.Protobuf/BackOffice.BFF.ClubMembership.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.NetworkMembership.Protobuf/BackOffice.BFF.NetworkMembership.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Configuration.Protobuf/BackOffice.BFF.Configuration.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Health.Protobuf/BackOffice.BFF.Health.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/BackOffice.BFF.PublicMessage.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/BackOffice.BFF.ManualPayment.Protobuf.csproj" />-->
<!-- Proto projects for Discount Shop and Tag features -->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountProduct.Protobuf/BackOffice.BFF.DiscountProduct.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountCategory.Protobuf/BackOffice.BFF.DiscountCategory.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountOrder.Protobuf/BackOffice.BFF.DiscountOrder.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.DiscountShoppingCart.Protobuf/BackOffice.BFF.DiscountShoppingCart.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Tag.Protobuf/BackOffice.BFF.Tag.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.ProductTag.Protobuf/BackOffice.BFF.ProductTag.Protobuf.csproj" />-->
<!-- <ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Common.Protobuf/BackOffice.BFF.Common.Protobuf.csproj" />-->
<!-- -->
<PackageReference Include="HtmlAgilityPack" Version="1.12.1" />
<PackageReference Include="DateTimeConverterCL" Version="1.0.0" />
<PackageReference Include="Grpc.Core" Version="2.46.6" />
<PackageReference Include="Grpc.Net.Client" Version="2.71.0" />
<PackageReference Include="Grpc.Net.Client.Web" Version="2.71.0" />
<PackageReference Include="Mapster" Version="7.4.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.11" PrivateAssets="all" />
<PackageReference Include="MudBlazor" Version="8.14.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.8.0" />
<PackageReference Include="Tizzani.MudBlazor.HtmlEditor" Version="2.3.0" />
</ItemGroup>
<ItemGroup>
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>
<PackageReference Include="MudBlazor" Version="8.14.0"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4"/>
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.8.0"/>
<PackageReference Include="Tizzani.MudBlazor.HtmlEditor" Version="2.3.0"/>
</ItemGroup>
<ItemGroup>
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js"/>
</ItemGroup>
</Project>
@@ -5,7 +5,7 @@
Value="@_selectedWeek"
DebounceInterval="300"
ValueChanged="@OnSelected"
ToStringFunc="@(e => e?.WeekNumber ?? string.Empty)"
ToStringFunc="@(e => e?.DisplayName ?? string.Empty)"
SearchFunc="@Search"
Variant="Variant.Outlined"
Clearable="true"
@@ -11,8 +11,15 @@ public partial class WeekNumberPicker
[Inject] public IPersianDateTimeService PersianDateTime { get; set; } = default!;
[Parameter] public string Label { get; set; } = "انتخاب هفته";
[Parameter] public string? SelectedWeekNumber { get; set; }
[Parameter] public EventCallback<string?> SelectedWeekNumberChanged { get; set; }
// WeekDefinitionId based binding (preferred)
[Parameter] public long? SelectedWeekDefinitionId { get; set; }
[Parameter] public EventCallback<long?> SelectedWeekDefinitionIdChanged { get; set; }
// Legacy string-based binding (deprecated, kept for compatibility)
// [Parameter] public long? SelectedWeekNumber { get; set; }
// [Parameter] public EventCallback<long?> SelectedWeekNumberChanged { get; set; }
[Parameter] public bool CoerceText { get; set; } = true; // اجازه ورود دستی
[Parameter] public int FutureWeeksCount { get; set; } = 4;
[Parameter] public int PastWeeksCount { get; set; } = 12;
@@ -25,20 +32,30 @@ public partial class WeekNumberPicker
{
await LoadWeeks();
if (!string.IsNullOrWhiteSpace(SelectedWeekNumber) && _allWeeks.Any())
if (SelectedWeekDefinitionId.HasValue && SelectedWeekDefinitionId.Value > 0 && _allWeeks.Any())
{
_selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekNumber == SelectedWeekNumber);
_selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekDefinitionId.Value);
}
// else if (SelectedWeekNumber!=null && SelectedWeekNumber>0 && _allWeeks.Any())
// {
// _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekNumber);
// }
}
protected override async Task OnParametersSetAsync()
{
if (!string.IsNullOrWhiteSpace(SelectedWeekNumber) &&
_selectedWeek?.WeekNumber != SelectedWeekNumber &&
if (SelectedWeekDefinitionId.HasValue && SelectedWeekDefinitionId.Value > 0 &&
_selectedWeek?.WeekDefinitionId != SelectedWeekDefinitionId.Value &&
_isLoaded)
{
_selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekNumber == SelectedWeekNumber);
_selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekDefinitionId.Value);
}
// else if (SelectedWeekNumber!=null && SelectedWeekNumber>0 &&
// _selectedWeek?.WeekDefinitionId != SelectedWeekNumber &&
// _isLoaded)
// {
// _selectedWeek = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == SelectedWeekNumber);
// }
}
private async Task LoadWeeks()
@@ -85,23 +102,28 @@ public partial class WeekNumberPicker
if (string.IsNullOrWhiteSpace(value))
return _allWeeks;
// جستجو در شماره هفته
// جستجو در DisplayName یا DisplayText
return _allWeeks
.Where(w => w.WeekNumber.Contains(value, StringComparison.OrdinalIgnoreCase))
.Where(w => w.DisplayName.Contains(value, StringComparison.OrdinalIgnoreCase) ||
w.DisplayText.Contains(value, StringComparison.OrdinalIgnoreCase))
.ToList();
}
private async Task OnSelected(WeekInfo? selected)
{
_selectedWeek = selected;
SelectedWeekNumber = selected?.WeekNumber;
await SelectedWeekNumberChanged.InvokeAsync(SelectedWeekNumber);
SelectedWeekDefinitionId = selected?.WeekDefinitionId;
// SelectedWeekNumber = selected.WeekDefinitionId;
await SelectedWeekDefinitionIdChanged.InvokeAsync(SelectedWeekDefinitionId);
// await SelectedWeekNumberChanged.InvokeAsync(SelectedWeekNumber);
}
private async Task OnClear()
{
_selectedWeek = null;
SelectedWeekNumber = null;
await SelectedWeekNumberChanged.InvokeAsync(null);
SelectedWeekDefinitionId = null;
// SelectedWeekNumber = null;
await SelectedWeekDefinitionIdChanged.InvokeAsync(null);
// await SelectedWeekNumberChanged.InvokeAsync(null);
}
}
@@ -33,7 +33,7 @@
</tr>
<tr>
<td><strong>شماره هفته:</strong></td>
<td>@Payout.WeekNumber</td>
<td>@Payout.WeekDisplayName</td>
</tr>
<tr>
<td><strong>تعداد بالانس:</strong></td>
@@ -21,7 +21,7 @@
<MudCardContent>
<MudText Typo="Typo.h6" Color="Color.Primary">استخر هفتگی</MudText>
<MudText Typo="Typo.h4">@(_poolData?.TotalPoolAmount.ToString("N0") ?? "0") ریال</MudText>
<MudText Typo="Typo.body2" Color="Color.Secondary">هفته @(_currentWeekNumberPersian)</MudText>
<MudText Typo="Typo.body2" Color="Color.Secondary">@_currentWeekDisplayText</MudText>
</MudCardContent>
</MudCard>
</MudItem>
@@ -79,8 +79,8 @@
@if (_allWeeks.Any())
{
<MudSelect T="string"
Value="_currentWeekNumber"
<MudSelect T="long"
Value="_currentWeekDefinitionId"
Label="شماره هفته"
Variant="Variant.Outlined"
Margin="Margin.Dense"
@@ -90,7 +90,7 @@
@if (_availableWeeks?.CurrentWeek != null)
{
<MudSelectItem Value="@_availableWeeks.CurrentWeek.WeekNumber">
<MudSelectItem Value="@_availableWeeks.CurrentWeek.WeekDefinitionId">
<MudText>
<MudIcon Icon="@Icons.Material.Filled.Today" Size="Size.Small" Class="ml-2" />
@_availableWeeks.CurrentWeek.DisplayText
@@ -104,7 +104,7 @@
<MudListSubheader>هفته‌های محاسبه شده</MudListSubheader>
@foreach (var week in _availableWeeks.CalculatedWeeks)
{
<MudSelectItem Value="@week.WeekNumber">
<MudSelectItem Value="@week.WeekDefinitionId">
<MudText>
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" Color="Color.Success" Size="Size.Small" Class="ml-2" />
@week.DisplayText
@@ -125,7 +125,7 @@
<MudListSubheader>هفته‌های محاسبه نشده</MudListSubheader>
@foreach (var week in _availableWeeks.PendingWeeks)
{
<MudSelectItem Value="@week.WeekNumber">
<MudSelectItem Value="@week.WeekDefinitionId">
<MudText>
<MudIcon Icon="@Icons.Material.Filled.AccessTime" Color="Color.Warning" Size="Size.Small" Class="ml-2" />
@week.DisplayText
@@ -140,7 +140,7 @@
<MudListSubheader>هفته‌های آینده</MudListSubheader>
@foreach (var week in _availableWeeks.FutureWeeks)
{
<MudSelectItem Value="@week.WeekNumber">
<MudSelectItem Value="@week.WeekDefinitionId">
<MudText>
<MudIcon Icon="@Icons.Material.Filled.CalendarMonth" Color="Color.Info" Size="Size.Small" Class="ml-2" />
@week.DisplayText
@@ -152,10 +152,7 @@
}
else
{
<WeekNumberPicker Label="شماره هفته"
@bind-SelectedWeekNumber="_currentWeekNumber"
CoerceText="true"
Style="max-width: 250px;" />
<MudText Color="Color.Warning">لیست هفته‌ها بارگذاری نشده</MudText>
}
<MudButton Variant="Variant.Filled"
@@ -180,7 +177,7 @@
</tr>
<tr>
<td><strong>شماره هفته:</strong></td>
<td>@_poolData.WeekNumber</td>
<td>@_currentWeekDisplayName</td>
</tr>
<tr>
<td><strong>مجموع استخر:</strong></td>
@@ -14,12 +14,13 @@ public partial class Dashboard
[Inject] public NavigationManager NavigationManager { get; set; }
[SupplyParameterFromQuery(Name = "week")]
public string? WeekQueryParam { get; set; }
[SupplyParameterFromQuery(Name = "weekId")]
public long? WeekIdQueryParam { get; set; }
private bool _isLoading = true;
private string _currentWeekNumber = string.Empty;
private string _currentWeekNumberPersian = string.Empty; // هفته به شمسی
private long _currentWeekDefinitionId;
private string _currentWeekDisplayName = string.Empty;
private string _currentWeekDisplayText = string.Empty; // نمایش فارسی
private GetWeeklyCommissionPoolResponse? _poolData;
// Available weeks data
@@ -32,19 +33,22 @@ public partial class Dashboard
await LoadAvailableWeeks();
// اگر query string آمده، از آن استفاده کن
if (!string.IsNullOrWhiteSpace(WeekQueryParam))
if (WeekIdQueryParam.HasValue && WeekIdQueryParam.Value > 0)
{
_currentWeekNumber = WeekQueryParam;
_currentWeekDefinitionId = WeekIdQueryParam.Value;
// پیدا کردن نام نمایشی از لیست هفته‌ها
var weekInfo = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == _currentWeekDefinitionId);
_currentWeekDisplayName = weekInfo?.DisplayName ?? "";
_currentWeekDisplayText = weekInfo?.DisplayText ?? "";
}
else
else if (_availableWeeks?.CurrentWeek != null)
{
// محاسبه شماره هفته جاری (میلادی برای API)
_currentWeekNumber = GetCurrentWeekNumber();
// استفاده از هفته جاری
_currentWeekDefinitionId = _availableWeeks.CurrentWeek.WeekDefinitionId;
_currentWeekDisplayName = _availableWeeks.CurrentWeek.DisplayName;
_currentWeekDisplayText = _availableWeeks.CurrentWeek.DisplayText;
}
// تبدیل به شمسی برای نمایش
_currentWeekNumberPersian = PersianDateTime.ConvertWeekNumberToPersian(_currentWeekNumber);
await LoadPoolData();
}
@@ -71,18 +75,18 @@ public partial class Dashboard
catch (Exception ex)
{
Snackbar.Add($"خطا در بارگذاری لیست هفته‌ها: {ex.Message}", Severity.Warning);
// Fallback to current week
_currentWeekNumber = GetCurrentWeekNumber();
}
}
private async Task OnWeekChanged(string weekNumber)
private async Task OnWeekChanged(long weekDefinitionId)
{
_currentWeekNumber = weekNumber;
_currentWeekNumberPersian = PersianDateTime.ConvertWeekNumberToPersian(weekNumber);
_currentWeekDefinitionId = weekDefinitionId;
var weekInfo = _allWeeks.FirstOrDefault(w => w.WeekDefinitionId == weekDefinitionId);
_currentWeekDisplayName = weekInfo?.DisplayName ?? "";
_currentWeekDisplayText = weekInfo?.DisplayText ?? "";
// به‌روزرسانی URL با query string
var uri = NavigationManager.GetUriWithQueryParameter("week", weekNumber);
var uri = NavigationManager.GetUriWithQueryParameter("weekId", weekDefinitionId.ToString());
NavigationManager.NavigateTo(uri, false);
await LoadPoolData();
@@ -90,6 +94,12 @@ public partial class Dashboard
private async Task LoadPoolData()
{
if (_currentWeekDefinitionId <= 0)
{
Snackbar.Add("هفته انتخاب نشده است", Severity.Warning);
return;
}
try
{
_isLoading = true;
@@ -97,12 +107,12 @@ public partial class Dashboard
var request = new GetWeeklyCommissionPoolRequest
{
WeekNumber = _currentWeekNumber
WeekDefinitionId = _currentWeekDefinitionId
};
_poolData = await CommissionContract.GetWeeklyCommissionPoolAsync(request);
Console.WriteLine(JsonSerializer.Serialize(_poolData));
Snackbar.Add($"اطلاعات Pool هفته {_currentWeekNumber} بارگذاری شد", Severity.Success);
Snackbar.Add($"اطلاعات Pool هفته {_currentWeekDisplayName} بارگذاری شد", Severity.Success);
}
catch (Exception ex)
{
@@ -120,7 +130,7 @@ public partial class Dashboard
{
var confirmed = await DialogService.ShowMessageBox(
"تایید",
$"آیا از اجرای محاسبه دستی برای هفته {_currentWeekNumber} مطمئن هستید؟",
$"آیا از اجرای محاسبه دستی برای هفته {_currentWeekDisplayName} مطمئن هستید؟",
yesText: "بله", cancelText: "خیر");
if (confirmed == true)
@@ -129,7 +139,7 @@ public partial class Dashboard
{
await CommissionContract.TriggerWeeklyCalculationAsync(new TriggerWeeklyCalculationRequest()
{
WeekNumber = _currentWeekNumber,
WeekDefinitionId = _currentWeekDefinitionId,
ForceRecalculate = true,
SkipBalances = false,
SkipPayouts = false,
@@ -147,12 +157,4 @@ public partial class Dashboard
}
}
}
private string GetCurrentWeekNumber()
{
var today = DateTime.Now;
var calendar = CultureInfo.CurrentCulture.Calendar;
var weekOfYear = calendar.GetWeekOfYear(today, CalendarWeekRule.FirstDay, DayOfWeek.Saturday);
return $"{today.Year}-W{weekOfYear:D2}";
}
}
@@ -20,10 +20,8 @@
<MudStack Row="true" Spacing="2">
<UserAutoComplete Label="جستجوی کاربر"
@bind-SelectedUserId="_filterUserId" />
<WeekNumberPicker Label="شماره هفته"
@bind-SelectedWeekNumber="_filterWeekNumber"
CoerceText="true"
/>
<WeekNumberPicker Label="انتخاب هفته"
@bind-SelectedWeekDefinitionId="_filterWeekDefinitionId" />
<MudSelect @bind-Value="_filterStatus"
Label="وضعیت"
Variant="Variant.Outlined"
@@ -55,12 +53,9 @@
</CellTemplate>
</PropertyColumn>
<PropertyColumn Property="x => x.WeekNumber" Title="هفته">
<PropertyColumn Property="x => x.WeekDisplayName" Title="هفته">
<CellTemplate>
@{
var persianWeek = PersianDateTime.ConvertWeekNumberToPersian(context.Item.WeekNumber);
}
<MudText Typo="Typo.body2">@persianWeek</MudText>
<MudText Typo="Typo.body2">@context.Item.WeekDisplayName</MudText>
</CellTemplate>
</PropertyColumn>
@@ -15,7 +15,7 @@ public partial class UserPayouts
private MudDataGrid<UserCommissionPayoutModel> _gridData;
private long? _filterUserId;
private string? _filterWeekNumber;
private long? _filterWeekDefinitionId;
private int? _filterStatus;
private async Task<GridData<UserCommissionPayoutModel>> ServerReload(GridState<UserCommissionPayoutModel> state)
@@ -37,9 +37,9 @@ public partial class UserPayouts
request.Filter.UserId = _filterUserId.Value;
}
if (!string.IsNullOrWhiteSpace(_filterWeekNumber))
if (_filterWeekDefinitionId.HasValue && _filterWeekDefinitionId.Value > 0)
{
request.Filter.WeekNumber = _filterWeekNumber;
request.Filter.WeekDefinitionId = _filterWeekDefinitionId.Value;
}
if (_filterStatus.HasValue)
@@ -60,7 +60,7 @@
Filterable="true"
SortMode="SortMode.Multiple">
<Columns>
<PropertyColumn Property="x => x.WeekNumber" Title="هفته" />
<PropertyColumn Property="x => x.WeekDisplayName" Title="هفته" />
<PropertyColumn Property="x => x.TotalPoolAmount" Title="مبلغ کل استخر" Format="N0">
<CellTemplate>
<MudText>@context.Item.TotalPoolAmount.ToString("N0") ریال</MudText>
@@ -106,7 +106,7 @@
Variant="Variant.Text"
Color="Color.Info"
StartIcon="@Icons.Material.Filled.People"
Href="@($"/commission/payouts?week={context.Item.WeekNumber}")">
Href="@($"/commission/payouts?weekDefinitionId={context.Item.WeekDefinitionId}")">
پرداخت‌ها
</MudButton>
</CellTemplate>
@@ -197,7 +197,8 @@
_reports = response.Models.Select(x => new WeeklyPoolReportModel
{
WeekNumber = x.WeekNumber,
WeekDefinitionId = x.WeekDefinitionId,
WeekDisplayName = x.WeekDisplayName,
TotalPoolAmount = x.TotalPoolAmount,
TotalBalances = x.TotalBalances,
ValuePerBalance = x.ValuePerBalance,
@@ -224,7 +225,7 @@
private void ViewDetails(WeeklyPoolReportModel report)
{
Navigation.NavigateTo($"/commission/dashboard?week={report.WeekNumber}");
Navigation.NavigateTo($"/commission/dashboard?weekId={report.WeekDefinitionId}");
}
private void CalculateStatistics()
@@ -242,7 +243,8 @@
// Model for weekly pool reports
private class WeeklyPoolReportModel
{
public string WeekNumber { get; set; }
public long WeekDefinitionId { get; set; }
public string WeekDisplayName { get; set; } = "";
public long TotalPoolAmount { get; set; }
public int TotalBalances { get; set; }
public long ValuePerBalance { get; set; }
@@ -41,7 +41,7 @@
<MudCardContent>
<MudStack Spacing="1">
<MudText Typo="Typo.body2" Color="Color.Secondary">هفته جاری</MudText>
<MudText Typo="Typo.h5">@_currentWeek</MudText>
<MudText Typo="Typo.h5">@_currentWeekDisplayName</MudText>
</MudStack>
</MudCardContent>
</MudCard>
@@ -219,7 +219,8 @@
[Inject] public ClubMembershipContract.ClubMembershipContractClient ClubClient { get; set; }
private bool _loading = false;
private string _currentWeek = "";
private long _currentWeekDefinitionId = 0;
private string _currentWeekDisplayName = string.Empty;
private GetWeeklyCommissionPoolResponse? _currentPool;
private long _totalClubMembers = 0;
@@ -236,22 +237,39 @@
_loading = true;
try
{
// Get current week in ISO 8601 format
_currentWeek = GetCurrentWeekNumber();
// Load Commission data
// Get current week from available weeks API
try
{
var commissionRequest = new GetWeeklyCommissionPoolRequest
var availableWeeksRequest = new GetAvailableWeeksRequest
{
WeekNumber = _currentWeek
FutureWeeksCount = 0,
PastWeeksCount = 0
};
var commissionResponse = await CommissionClient.GetWeeklyCommissionPoolAsync(commissionRequest);
_currentPool = commissionResponse;
var availableWeeksResponse = await CommissionClient.GetAvailableWeeksAsync(availableWeeksRequest);
if (availableWeeksResponse?.CurrentWeek != null)
{
_currentWeekDefinitionId = availableWeeksResponse.CurrentWeek.WeekDefinitionId;
_currentWeekDisplayName = availableWeeksResponse.CurrentWeek.DisplayName;
}
}
catch (Exception ex)
catch { /* Ignore - will skip pool loading */ }
// Load Commission data
if (_currentWeekDefinitionId > 0)
{
Snackbar.Add($"خطا در بارگذاری داده‌های کمیسیون: {ex.Message}", Severity.Warning);
try
{
var commissionRequest = new GetWeeklyCommissionPoolRequest
{
WeekDefinitionId = _currentWeekDefinitionId
};
var commissionResponse = await CommissionClient.GetWeeklyCommissionPoolAsync(commissionRequest);
_currentPool = commissionResponse;
}
catch (Exception ex)
{
Snackbar.Add($"خطا در بارگذاری داده‌های کمیسیون: {ex.Message}", Severity.Warning);
}
}
// Load Club membership data
@@ -23,7 +23,7 @@
</MudItem>
<MudItem xs="12" md="3">
<WeekNumberPicker Label="شماره هفته"
@bind-SelectedWeekNumber="_filterWeekNumber"
@bind-SelectedWeekDefinitionId="_filterWeekDefinitionId"
CoerceText="true" />
</MudItem>
<MudItem xs="12" md="2">
@@ -69,7 +69,7 @@
Hover="true">
<Columns>
<PropertyColumn Property="x => x.UserId" Title="شناسه کاربر" />
<PropertyColumn Property="x => x.WeekNumber" Title="هفته" />
<PropertyColumn Property="x => x.WeekDisplayName" Title="هفته" />
<PropertyColumn Property="x => x.LeftBalance" Title="موجودی چپ">
<CellTemplate>
<MudChip T="string" Color="Color.Success" Size="Size.Small">
@@ -153,7 +153,7 @@
[Inject] public CommissionContract.CommissionContractClient CommissionClient { get; set; }
private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
private long? _filterUserId = null;
private string _filterWeekNumber = "";
private long? _filterWeekDefinitionId = null;
private int? _minBalance = null;
private int? _maxBalance = null;
private bool _onlyActive = false;
@@ -178,9 +178,9 @@ private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
request.UserId = _filterUserId.Value;
}
if (!string.IsNullOrWhiteSpace(_filterWeekNumber))
if (_filterWeekDefinitionId.HasValue && _filterWeekDefinitionId.Value > 0)
{
request.WeekNumber = _filterWeekNumber;
request.WeekDefinitionId = _filterWeekDefinitionId.Value;
}
var response = await CommissionClient.GetUserWeeklyBalancesAsync(request);
@@ -188,7 +188,7 @@ private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
var items = response.Models.Select(b => new UserWeeklyBalanceModel
{
UserId = b.UserId,
WeekNumber = b.WeekNumber,
WeekDisplayName = b.WeekDisplayName,
LeftBalance = b.LeftLegBalances,
RightBalance = b.RightLegBalances,
MatchedBalance = b.TotalBalances,
@@ -247,7 +247,7 @@ private MudDataGrid <UserWeeklyBalanceModel> _grid { get; set; }
private class UserWeeklyBalanceModel
{
public long UserId { get; set; }
public string WeekNumber { get; set; }
public string WeekDisplayName { get; set; }
public int LeftBalance { get; set; }
public int RightBalance { get; set; }
public int MatchedBalance { get; set; }
@@ -34,7 +34,7 @@
<div style="max-width: 200px; min-width: 150px;">
<WeekNumberPicker Label="هفته فعالسازی"
@bind-SelectedWeekNumber="_activationWeekFilter" />
@bind-SelectedWeekDefinitionId="_activationWeekFilter" />
</div>
<MudSpacer />
<MudStack Row="true" Spacing="2">
@@ -118,11 +118,11 @@
</CellTemplate>
</PropertyColumn>
<PropertyColumn Property="x => x.ActivationWeekNumber" Title="هفته فعالسازی">
<PropertyColumn Property="x => x.ActivationWeekDefinitionId" Title="هفته فعالسازی">
<CellTemplate>
@if (!string.IsNullOrEmpty(context.Item.ActivationWeekNumber))
@if (context.Item.ActivationWeekDefinitionId != null)
{
<MudText Typo="Typo.body2">@context.Item.ActivationWeekNumber</MudText>
<MudText Typo="Typo.body2">@context.Item.ActivationWeekDefinitionId</MudText>
}
else
{
@@ -180,7 +180,7 @@
private int _rightCount;
private DotNetObjectReference<NetworkTreeViewer> _dotNetRef;
private bool? _clubActiveFilter;
private string? _activationWeekFilter;
private long? _activationWeekFilter;
protected override void OnInitialized()
{
@@ -213,7 +213,7 @@
UserId = _searchUserId.Value,
MaxDepth = 20,
IsClubActive = _clubActiveFilter.HasValue ? _clubActiveFilter.Value : null,
ActivationWeekNumber = !string.IsNullOrEmpty(_activationWeekFilter) ? _activationWeekFilter : null
ActivationWeekDefinitionId = _activationWeekFilter!=null ? _activationWeekFilter : null
};
_treeData = await NetworkContract.GetNetworkTreeAsync(request);
@@ -248,7 +248,7 @@
isActive = n.IsClubActive,
isClubActive = n.IsClubActive,
isActivatedInTargetWeek = n.IsActivatedInTargetWeek,
activationWeekNumber = _activationWeekFilter ?? "", // فیلتر UI
activationWeekNumber = _activationWeekFilter ?? 0, // فیلتر UI
clubActivatedAt = n.ClubActivatedAt?.ToDateTime().ToLocalTime().ToString("yyyy/MM/dd") ?? "",
userCreated = n.UserCreated?.ToDateTime().ToLocalTime().ToString("yyyy/MM/dd") ?? ""
}).ToArray();
@@ -56,7 +56,14 @@
</MudItem>
</MudStack>
<MudNumericField T="int" HideSpinButtons="true" @bind-Value="Model.Discount" Disabled="_isLoading" Label="تخفیف (%)" Variant="Variant.Outlined" Margin="Margin.Dense" />
<MudStack Row="true" AlignItems="AlignItems.Center">
<MudItem xs="6">
<MudNumericField T="int" HideSpinButtons="true" @bind-Value="Model.Discount" Disabled="_isLoading" Label="تخفیف (%)" Variant="Variant.Outlined" Margin="Margin.Dense" />
</MudItem>
<MudItem xs="6">
<MudNumericField T="int" HideSpinButtons="true" @bind-Value="Model.RemainingCount" Disabled="_isLoading" Label="تعداد موجودی" Variant="Variant.Outlined" Margin="Margin.Dense" />
</MudItem>
</MudStack>
<MudTextField T="string" @bind-Value="Model.ShortInfomation" Disabled="_isLoading" Label="خلاصه" Variant="Variant.Outlined" Margin="Margin.Dense" />
@@ -42,7 +42,14 @@
</MudItem>
</MudStack>
<MudNumericField T="int" HideSpinButtons="true" @bind-Value="Model.Discount" Disabled="_isLoading" Label="تخفیف (%)" Variant="Variant.Outlined" Margin="Margin.Dense" />
<MudStack Row="true" AlignItems="AlignItems.Center">
<MudItem xs="6">
<MudNumericField T="int" HideSpinButtons="true" @bind-Value="Model.Discount" Disabled="_isLoading" Label="تخفیف (%)" Variant="Variant.Outlined" Margin="Margin.Dense" />
</MudItem>
<MudItem xs="6">
<MudNumericField T="int" HideSpinButtons="true" @bind-Value="Model.RemainingCount" Disabled="_isLoading" Label="تعداد موجودی" Variant="Variant.Outlined" Margin="Margin.Dense" />
</MudItem>
</MudStack>
<MudTextField T="string" @bind-Value="Model.ShortInfomation" Disabled="_isLoading" Label="خلاصه" Variant="Variant.Outlined" Margin="Margin.Dense" />
@@ -142,6 +142,23 @@
<PropertyColumn Property="x => x.Price" Title="قیمت" />
<TemplateColumn Title="موجودی" CellStyle="text-wrap: nowrap;">
<CellTemplate>
@if (context.Item.RemainingCount <= 0)
{
<MudChip T="string" Color="Color.Error" Size="Size.Small">ناموجود</MudChip>
}
else if (context.Item.RemainingCount < 10)
{
<MudChip T="string" Color="Color.Warning" Size="Size.Small">@context.Item.RemainingCount</MudChip>
}
else
{
<MudChip T="string" Color="Color.Success" Size="Size.Small">@context.Item.RemainingCount</MudChip>
}
</CellTemplate>
</TemplateColumn>
<TemplateColumn StickyLeft="true" Title="عملیات" CellStyle="text-wrap: nowrap;" HeaderStyle="text-wrap: nowrap;">
<CellTemplate>
<MudStack Row="true" AlignItems="AlignItems.Center">
@@ -2,8 +2,7 @@ using BackOffice.BFF.Products.Protobuf.Protos.Products;
using BackOffice.BFF.Protobuf.Common;
using BackOffice.Common.BaseComponents;
using BackOffice.Common.Utilities;
// TODO: Uncomment when Tag proto project is created
// using BackOffice.Pages.Tag.Components;
using BackOffice.Pages.Tag.Components;
using BackOffice.Pages.Products.Components;
using Mapster;
using Microsoft.AspNetCore.Components;
@@ -163,9 +162,6 @@ public partial class ProductsMainPage
}
}
// TODO: Re-enable when CreateProductDialog and UpdateProductDialog are available
// These dialogs need ImageFile/ThumbnailFile fields in proto
/*
public async Task Update(DataModel model)
{
var parameters = new DialogParameters<UpdateDialog> { { x => x.Model, model.Adapt<UpdateProductsRequest>() } };
@@ -179,12 +175,6 @@ public partial class ProductsMainPage
Snackbar.Add("عملیات با موفقیت انجام شد", Severity.Success);
}
}
*/
public async Task Update(DataModel model)
{
Snackbar.Add("ویرایش محصول موقتاً غیرفعال است - در حال توسعه", Severity.Warning);
}
private async Task OnDelete(DataModel model)
{
@@ -208,8 +198,6 @@ public partial class ProductsMainPage
await _gridData.ReloadServerData();
}
// TODO: Re-enable when CreateProductDialog is available
/*
public async Task CreateNew()
{
var dialog = await DialogService.ShowAsync<CreateDialog>("افزودن محصول", new DialogParameters<CreateDialog> { { x => x.Model, new CreateNewProductsRequest() } }, new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Small });
@@ -220,12 +208,6 @@ public partial class ProductsMainPage
Snackbar.Add("عملیات با موفقیت انجام شد", Severity.Success);
}
}
*/
public async Task CreateNew()
{
Snackbar.Add("افزودن محصول موقتاً غیرفعال است - در حال توسعه", Severity.Warning);
}
public async Task OnFilterSubmit()
{
@@ -245,15 +227,13 @@ public partial class ProductsMainPage
// TODO: Enable when GalleryDialog is working (needs AddProductImageAsync/RemoveProductImageAsync in proto)
public async Task OpenGallery(DataModel model)
{
// var parameters = new DialogParameters<GalleryDialog>
// {
// { x => x.ProductId, model.Id },
// { x => x.ProductTitle, model.Title }
// };
// await DialogService.ShowAsync<GalleryDialog>("گالری تصاویر", parameters,
// new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium });
Snackbar.Add("گالری تصاویر در حال توسعه است", Severity.Info);
await Task.CompletedTask;
var parameters = new DialogParameters<GalleryDialog>
{
{ x => x.ProductId, model.Id },
{ x => x.ProductTitle, model.Title }
};
await DialogService.ShowAsync<GalleryDialog>("گالری تصاویر", parameters,
new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium });
}
public void OpenCategoryMapping(DataModel model)
@@ -261,20 +241,16 @@ public partial class ProductsMainPage
Navigation.NavigateTo($"{RouteConstance.ProductCategories}{model.Id}");
}
// TODO: Enable when Tag proto project is created
public async Task OpenTagAssignment(DataModel model)
{
// var parameters = new DialogParameters<AssignTagsDialog>
// {
// { x => x.ProductId, model.Id },
// { x => x.ProductTitle, model.Title }
// };
var parameters = new DialogParameters<AssignTagsDialog>
{
{ x => x.ProductId, model.Id },
{ x => x.ProductTitle, model.Title }
};
// await DialogService.ShowAsync<AssignTagsDialog>("مدیریت تگ‌های محصول", parameters,
// new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true });
await Task.CompletedTask;
Snackbar.Add("قابلیت تگ‌گذاری در حال توسعه است", Severity.Info);
await DialogService.ShowAsync<AssignTagsDialog>("مدیریت تگ‌های محصول", parameters,
new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true });
}
public async Task OpenImagePreview(string imagePath, string title)
@@ -61,7 +61,8 @@
<MudCardContent>
<MudStack Spacing="3">
<WeekNumberPicker Label="شماره هفته برای اجرای دستی"
@bind-SelectedWeekNumber="_manualWeekNumber"
@bind-SelectedWeekDefinitionId="_manualWeekDefinitionId"
@* @bind-SelectedWeekNumber="_manualWeekDisplayName" *@
CoerceText="true" />
<MudButton Variant="Variant.Filled"
@@ -144,7 +145,7 @@
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="زمان">@PersianDateTime.ConvertToPersianDateTime(context.ExecutionTime)</MudTd>
<MudTd DataLabel="هفته">@PersianDateTime.ConvertWeekNumberToPersian(context.WeekNumber)</MudTd>
<MudTd DataLabel="هفته">@context.WeekDisplayName</MudTd>
<MudTd DataLabel="وضعیت">
<MudChip T="string"
Color="@(context.Status == "موفق" ? Color.Success : Color.Error)"
@@ -184,7 +185,8 @@
private DateTime _nextRunTime = DateTime.Now.AddDays(1);
private int _successfulRuns = 45;
private int _failedRuns = 2;
private string _manualWeekNumber = "";
private long? _manualWeekDefinitionId;
private string _manualWeekDisplayName = "";
private bool _isProcessing = false;
private List<ExecutionLogModel> _executionLog = new();
@@ -210,15 +212,15 @@
private async Task RunManualCalculation()
{
if (string.IsNullOrWhiteSpace(_manualWeekNumber))
if (!_manualWeekDefinitionId.HasValue || _manualWeekDefinitionId.Value <= 0)
{
Snackbar.Add("لطفا شماره هفته را وارد کنید", Severity.Warning);
Snackbar.Add("لطفا هفته را انتخاب کنید", Severity.Warning);
return;
}
var confirmed = await DialogService.ShowMessageBox(
"اجرای دستی محاسبات",
$"آیا از اجرای محاسبات برای هفته {PersianDateTime.ConvertWeekNumberToPersian(_manualWeekNumber)} اطمینان دارید؟",
$"آیا از اجرای محاسبات برای هفته {_manualWeekDisplayName} اطمینان دارید؟",
yesText: "بله، اجرا شود", cancelText: "لغو");
if (confirmed == true)
@@ -228,13 +230,13 @@
{
var request = new Foursat.BackOffice.BFF.Commission.Protos.TriggerWeeklyCalculationRequest
{
WeekNumber = _manualWeekNumber
WeekDefinitionId = _manualWeekDefinitionId.Value
};
await CommissionClient.TriggerWeeklyCalculationAsync(request);
var persianWeek = PersianDateTime.ConvertWeekNumberToPersian(_manualWeekNumber);
Snackbar.Add($"محاسبات هفته {persianWeek} با موفقیت آغاز شد", Severity.Success);
_manualWeekNumber = "";
Snackbar.Add($"محاسبات هفته {_manualWeekDisplayName} با موفقیت آغاز شد", Severity.Success);
_manualWeekDefinitionId = null;
_manualWeekDisplayName = "";
await RefreshLog();
}
catch (Exception ex)
@@ -283,7 +285,8 @@
_executionLog = response.Models.Select(log => new ExecutionLogModel
{
ExecutionTime = log.StartedAt?.ToDateTime() ?? DateTime.MinValue,
WeekNumber = log.WeekNumber,
WeekDefinitionId = log.WeekDefinitionId,
WeekDisplayName = log.WeekDisplayName,
Status = log.Success ? "موفق" : "ناموفق",
Duration = $"{log.DurationMs / 1000.0:F1} ثانیه",
ProcessedCount = log.RecordsProcessed,
@@ -319,7 +322,8 @@
private class ExecutionLogModel
{
public DateTime ExecutionTime { get; set; }
public string WeekNumber { get; set; } = "";
public long WeekDefinitionId { get; set; }
public string WeekDisplayName { get; set; } = "";
public string Status { get; set; } = "";
public string Duration { get; set; } = "";
public int ProcessedCount { get; set; }