Compare commits
360 Commits
Feature/pr
...
Feature/ge
| Author | SHA1 | Date | |
|---|---|---|---|
| bac19b0bb2 | |||
| 1b4a380cc9 | |||
| b16261928c | |||
| cfceb2877f | |||
| 5a244ed35e | |||
| 42008d3c4d | |||
| 387682aedb | |||
| 577acfd0ae | |||
| 04cb584ae3 | |||
| f6cddff59d | |||
| 7b09cc53c3 | |||
| a7d3ff5298 | |||
| 8ecbbf6975 | |||
| 3720288bed | |||
| 4f400ccef0 | |||
| d777fad96b | |||
| fb7b04596c | |||
| 76d2c0e3c4 | |||
| a745dfff86 | |||
| 9bca1b81d6 | |||
| 9ff6b5cf56 | |||
|
|
04642b7257 | ||
| c1c9fe51cb | |||
|
|
0d2ac58bbb | ||
| 43ccb3a1dd | |||
| 0134111aba | |||
|
|
3cc7adae35 | ||
|
|
c97ea5356f | ||
| 69f4819bf6 | |||
|
|
1257e15b62 | ||
|
|
331fb24a99 | ||
| 3be1547137 | |||
| 900b4b3f4d | |||
| bdc6f95af8 | |||
| 7a73e69afa | |||
|
|
21302803b6 | ||
|
|
8ec13ffae1 | ||
|
|
5508d4e88f | ||
| 43abb74c61 | |||
| 73e6681baa | |||
| 90b2fd2eab | |||
| b7172630e2 | |||
| 0604514190 | |||
| d9c431e20e | |||
| ff5180eb75 | |||
| a1c9335487 | |||
|
|
2746bf69ea | ||
|
|
77dbb50512 | ||
|
|
1c7e8824c7 | ||
| 20ece4886c | |||
| 0eff1b9a66 | |||
|
|
0d33d79620 | ||
|
|
e4355faffc | ||
|
|
577fe5db76 | ||
| 587fa40d81 | |||
| b741ab9ed2 | |||
| b6fde4903a | |||
| 0772604432 | |||
|
|
ec8333c715 | ||
|
|
8aa93e089a | ||
| 59891d1199 | |||
| 7cb39b1b92 | |||
|
|
5580d56874 | ||
|
|
423b49e6e7 | ||
|
|
0ab3052251 | ||
| 38027352d6 | |||
| 43562fb49c | |||
|
|
5202779d9f | ||
| 80a58f8cdc | |||
| 7c611825a4 | |||
|
|
67a85735f0 | ||
|
|
bf46dfd1dc | ||
|
|
a1ed3ad648 | ||
|
|
35e6355069 | ||
| 8679abb1e7 | |||
| c8dddabdff | |||
| 6f076bdc77 | |||
|
|
4de2e12ac5 | ||
| 380ed8f6b1 | |||
| 7423391003 | |||
|
|
23b65cfbfe | ||
| 572f66f905 | |||
|
|
48b75d2baa | ||
| 140414b866 | |||
| 4ade9e12a6 | |||
|
|
63edb33bf5 | ||
| dd7e816767 | |||
| 1deeff996f | |||
| 2bea265989 | |||
| ef9b78b924 | |||
| 8ad296fe61 | |||
|
|
823110ea74 | ||
| 061058cbeb | |||
| 95d66c2d89 | |||
| 609daf4353 | |||
| a81e01ce2b | |||
| 2cd838a5e3 | |||
| c6ed46d8b7 | |||
| 3da7453ece | |||
|
|
9a591fabff | ||
| 9d09ef60f8 | |||
| 0757ac7e74 | |||
| a9789023ac | |||
| 34bd7ba444 | |||
| 16b11a8bb8 | |||
|
|
dd5455d80a | ||
| 9360dcad71 | |||
| 1971252713 | |||
| 02cc099104 | |||
| 43b124664e | |||
| d2dd67343b | |||
| 3d2b5ff6bd | |||
| 209aa5912d | |||
| 340685a06c | |||
| b20a56df26 | |||
| 8d93fa4fc6 | |||
| 8f10f7057c | |||
| 00b5066f6f | |||
| abd221cb55 | |||
| 33833a408c | |||
| c2fca9f9eb | |||
| a16c20440b | |||
| 1f365f3642 | |||
| 0bfcde6a3f | |||
| 4ada29a98a | |||
| 6f64ee1ce4 | |||
| 582da511c6 | |||
| 3340edcc17 | |||
| 385a885c93 | |||
| f99f199a77 | |||
| 287b31e356 | |||
| 5f8232809a | |||
| 3c72311096 | |||
| 250d17eba2 | |||
| 5db8e7d319 | |||
|
|
3300f60845 | ||
|
|
7537cfe5b8 | ||
|
|
3c1bf7dff0 | ||
| 6909fcf715 | |||
| fe66ff5aa3 | |||
| ce305edac4 | |||
| a49b825ce9 | |||
| fb62523a23 | |||
|
|
e171a4749c | ||
| 9b6c0d4cc4 | |||
| f8126b4000 | |||
|
|
cf62d75f0e | ||
|
|
f93e59b77c | ||
|
|
8f37d9f388 | ||
| 8e72b56758 | |||
| a6e1251445 | |||
| 490a1a69d5 | |||
| 7e3ea39d5b | |||
| 66a6c411d6 | |||
|
|
b03a806dfb | ||
| 14ff0a2e59 | |||
| 58f695fe95 | |||
| b4ccacd37e | |||
| 1fef8e355a | |||
| 147621de34 | |||
| d663857de1 | |||
|
|
4d326b1983 | ||
| aa37ca4b28 | |||
| 9bbdff9bc6 | |||
| 45615684ed | |||
| d11fdcf106 | |||
| eb9a3e52fe | |||
| 94955ea1b4 | |||
| 16c1ae04a9 | |||
| 656bb49fab | |||
| cf3f0564f9 | |||
| fb5b98bf25 | |||
| 12318a6a51 | |||
| 1e733f3f20 | |||
| 836e721b6f | |||
| 8fca1f3a91 | |||
| 2feca1f7f8 | |||
| 4e9cecbb74 | |||
| adf297455f | |||
| 1d656a590f | |||
|
|
a33d7c019c | ||
|
|
d62b5ca155 | ||
|
|
18a4334d8a | ||
| 84416fe1f5 | |||
|
|
bd1c1fa814 | ||
| d855684cd7 | |||
| 9e5e8d8e5d | |||
|
|
8496b52013 | ||
| 9eefdd8fd1 | |||
|
|
5c1547dced | ||
|
|
c09321d89d | ||
| 219e64c0f7 | |||
| b42217ed94 | |||
| 8b6786c09a | |||
| 45c5d20323 | |||
| ad6f872145 | |||
| d22805892a | |||
| 4da496cab8 | |||
| aa0eae6c83 | |||
| 2159901614 | |||
|
|
4b40580658 | ||
|
|
8bc9e044ae | ||
|
|
cddaf2f709 | ||
|
|
337cd40a4e | ||
| 7ce7854091 | |||
|
|
a98300cacd | ||
|
|
daded35ab1 | ||
|
|
ba778bb519 | ||
| 4c638cbdae | |||
|
|
27e8d302d9 | ||
|
|
54c67fe8f7 | ||
| 92e1d6de5c | |||
| c488f61a09 | |||
|
|
dc703fad3c | ||
| 54e5904951 | |||
|
|
a638913172 | ||
| a986212834 | |||
| 649242fc76 | |||
|
|
d254da1393 | ||
| ad4b0be033 | |||
| 733f39db9f | |||
| 94237434c5 | |||
| 2da8bc8a20 | |||
| 39a5918a11 | |||
| 8b217f6cd0 | |||
|
|
74bd802a3d | ||
| b58481a36f | |||
|
|
3fd17299f9 | ||
|
|
fc315cc908 | ||
|
|
abe07e1c4b | ||
|
|
6046f55ece | ||
| d80a36ec35 | |||
|
|
7b648b135e | ||
|
|
5998bd212f | ||
|
|
d77bffabdd | ||
| 4f0e5a34a4 | |||
| 5faa2062b9 | |||
|
|
69476f3f2d | ||
|
|
4bc65e500d | ||
| 07587d162f | |||
| 30b4f52896 | |||
| 134466547e | |||
| a191968c15 | |||
|
|
59bbb7aae6 | ||
| d740c36dc6 | |||
|
|
89de3162de | ||
|
|
132c8ac5a4 | ||
| b9e271de1a | |||
| e661bc2dcb | |||
|
|
f00fde4084 | ||
|
|
e8b3700cdf | ||
| 0ca35e3295 | |||
| 1a91743916 | |||
|
|
dd68473150 | ||
|
|
72e3859d2c | ||
| 46d193b45e | |||
| 1bfe41418b | |||
| 6a446d5972 | |||
|
|
acec101c4c | ||
|
|
7d92321d1c | ||
|
|
19f78a230c | ||
| 0e91e6f287 | |||
| 9df56ee19b | |||
| 8750604d96 | |||
| f27ce460fd | |||
|
|
934019c6c6 | ||
|
|
82bf10c2d5 | ||
|
|
19a72ac78d | ||
|
|
9cb42b7cef | ||
| 8e5d4c312e | |||
| 12fab5a9a5 | |||
| 20dd8f64f4 | |||
| b827493306 | |||
| 04c65eae93 | |||
| b4526a4338 | |||
| 2d879ce80a | |||
| 56e79d2099 | |||
| 93891f3837 | |||
|
|
5bdfbc572b | ||
| 4385a65cbc | |||
| 722f8dae7c | |||
|
|
07113353c4 | ||
| 4b39994de6 | |||
| 0dd2dc7c43 | |||
| 8c6336b9bd | |||
| 20c00893b6 | |||
| 20e3d454cf | |||
| b0d174a575 | |||
| 2bf31db6b2 | |||
| 7a4a6de84f | |||
| 293ea0f6f4 | |||
| 3ce4cf3966 | |||
| 4f16d7680c | |||
|
|
7a10d5ce59 | ||
|
|
3d88feeee7 | ||
|
|
f408624463 | ||
|
|
8296292e49 | ||
| be8deef167 | |||
| 84fb29c8c8 | |||
| 0969e8a5fd | |||
| 92e2282381 | |||
|
|
3b71b7d707 | ||
| 6123a53f01 | |||
| ec74db17eb | |||
| dc118cf18b | |||
| a11e54c333 | |||
|
|
2383e7a54f | ||
|
|
2ef1ea3d1a | ||
|
|
ebdc9b1e55 | ||
| 9e5a494881 | |||
| 2972807c9f | |||
| f7351454f3 | |||
| b64d0e5ffd | |||
| 35b7a3a3dd | |||
| fe93ef60c9 | |||
| ef865d9c68 | |||
|
|
61e35100f9 | ||
|
|
01d33ff340 | ||
| cd64e1d24d | |||
| d9da2e97ab | |||
|
|
1c1c8816a5 | ||
| a1e85261a6 | |||
| 000af89fd7 | |||
|
|
a4f3feba1c | ||
|
|
a3d286c040 | ||
|
|
902ef34757 | ||
|
|
e67aca37f9 | ||
| 2a31b27f9b | |||
| e05eb1236b | |||
| a7d3b1e96f | |||
| 73bef104fb | |||
|
|
b31559a29a | ||
|
|
e62270a9b7 | ||
|
|
998759e2dc | ||
|
|
49d401856f | ||
|
|
2faf6c1400 | ||
|
|
a01a927f6f | ||
| bca1e66f0f | |||
|
|
097d5a6e86 | ||
| 83a7bbf5f3 | |||
|
|
24501df615 | ||
| da46d45601 | |||
| 14fda440c1 | |||
| 85ce92af2c | |||
|
|
5777a869cf | ||
| ed6301831c | |||
| 2d0eb52211 | |||
| 05d8b738cc | |||
| 370feca81e | |||
| 339cea998a | |||
| b3f42af77c | |||
| eb49bf771d | |||
| ea896c4c11 | |||
| 167b2bce09 | |||
| 517f2d06ca | |||
| 0fbd5c9d3e | |||
| 8436f70aa0 | |||
| 9cf8447a83 | |||
| e124a4d5d9 | |||
| 7b9e7881c6 |
64
.gitea/workflows/deploy-dev.yml
Normal file
64
.gitea/workflows/deploy-dev.yml
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
name: Deploy Dev (Branch Trigger)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- Feature/general/docker
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE_NAME: gozareshgir-api
|
||||||
|
# مسیری که فایل docker-compose.yml مخصوص تست در سرور قرار دارد
|
||||||
|
SERVER_PATH: ~/apps/test-dev/backend-api
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# 1. لاگین به داکر هاب/رجیستری شخصی
|
||||||
|
- name: Login to Docker Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ secrets.DOCKER_REGISTRY }}
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
# 2. بیلد و پوش کردن ایمیج با تگ :dev
|
||||||
|
- name: Build and Push
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: ${{ secrets.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:dev
|
||||||
|
|
||||||
|
# 3. اتصال به سرور و آپدیت سرویس
|
||||||
|
- name: Update Service on Test Server
|
||||||
|
uses: appleboy/ssh-action@v1.0.3
|
||||||
|
env:
|
||||||
|
DOCKER_REGISTRY: ${{ secrets.DOCKER_REGISTRY }}
|
||||||
|
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
APP_VERSION: dev # ورژن تست همیشه dev است
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.SSH_HOST_TEST }}
|
||||||
|
username: ${{ secrets.SSH_USERNAME_TEST }}
|
||||||
|
key: ${{ secrets.SSH_KEY_TEST }}
|
||||||
|
port: 22
|
||||||
|
envs: DOCKER_REGISTRY,DOCKER_USERNAME,DOCKER_PASSWORD,APP_VERSION
|
||||||
|
script: |
|
||||||
|
cd ${{ env.SERVER_PATH }}
|
||||||
|
|
||||||
|
# لاگین مجدد در سرور برای اطمینان
|
||||||
|
echo "$DOCKER_PASSWORD" | docker login $DOCKER_REGISTRY -u $DOCKER_USERNAME --password-stdin
|
||||||
|
|
||||||
|
# اکسپورت کردن ورژن برای اینکه فایل داکر-کمپوز سرور آن را بشناسد
|
||||||
|
export APP_VERSION=$APP_VERSION
|
||||||
|
|
||||||
|
# دانلود ایمیج جدید و آپدیت کانتینر
|
||||||
|
docker compose pull
|
||||||
|
docker compose up -d --remove-orphans
|
||||||
|
|
||||||
|
# پاک کردن ایمیجهای قدیمی برای پر نشدن فضای سرور
|
||||||
|
docker image prune -f
|
||||||
7
.github/workflows/dotnet-developPublish.yml
vendored
7
.github/workflows/dotnet-developPublish.yml
vendored
@@ -5,8 +5,6 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- Main
|
- Main
|
||||||
|
|
||||||
env:
|
|
||||||
DOTNET_ENVIRONMENT: Development
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-deploy:
|
build-and-deploy:
|
||||||
@@ -37,12 +35,11 @@ jobs:
|
|||||||
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
|
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
|
||||||
-verb:sync `
|
-verb:sync `
|
||||||
-source:contentPath="$publishFolder" `
|
-source:contentPath="$publishFolder" `
|
||||||
-dest:contentPath="dadmehrg",computerName="https://171.22.24.15:8172/msdeploy.axd?site=dadmehrg",userName="Administrator",password="R2rNpdnetP3j>q5b18",authType="Basic" `
|
-dest:contentPath="dadmehrg",computerName="https://$env:SERVER_HOST:8172/msdeploy.axd?site=gozareshgir",userName="$env:DEPLOY_USER",password="$env:DEPLOY_PASSWORD",authType="Basic" `
|
||||||
-allowUntrusted `
|
-allowUntrusted `
|
||||||
-enableRule:AppOffline
|
-enableRule:AppOffline
|
||||||
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
SERVER_HOST: your-server-ip-or-domain
|
SERVER_HOST: 171.22.24.15
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
||||||
DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }}
|
DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }}
|
||||||
|
|||||||
24
.gitignore
vendored
24
.gitignore
vendored
@@ -1,3 +1,21 @@
|
|||||||
|
.env*
|
||||||
|
.env
|
||||||
|
certs/*.pfx
|
||||||
|
certs/*.pem
|
||||||
|
certs/*.key
|
||||||
|
certs/*.crt
|
||||||
|
Storage/
|
||||||
|
Logs/
|
||||||
|
*.user
|
||||||
|
*.suo
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
certs/*.pfx
|
||||||
|
certs/*.pem
|
||||||
|
certs/*.key
|
||||||
|
certs/*.crt
|
||||||
|
Storage/
|
||||||
|
Logs/
|
||||||
## Ignore Visual Studio temporary files, build results, and
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
## files generated by popular Visual Studio add-ons.
|
## files generated by popular Visual Studio add-ons.
|
||||||
##
|
##
|
||||||
@@ -362,3 +380,9 @@ MigrationBackup/
|
|||||||
# # Fody - auto-generated XML schema
|
# # Fody - auto-generated XML schema
|
||||||
# FodyWeavers.xsd
|
# FodyWeavers.xsd
|
||||||
.idea
|
.idea
|
||||||
|
/ServiceHost/appsettings.Development.json
|
||||||
|
/ServiceHost/appsettings.json
|
||||||
|
|
||||||
|
# Storage folder - ignore all uploaded files, thumbnails, and temporary files
|
||||||
|
ServiceHost/Storage
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="FluentValidation" Version="12.1.1" />
|
||||||
<PackageReference Include="IPE.SmsIR" Version="1.2.7" />
|
<PackageReference Include="IPE.SmsIR" Version="1.2.7" />
|
||||||
<PackageReference Include="EPPlus" Version="8.4.0" />
|
<PackageReference Include="EPPlus" Version="8.4.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.3.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.3.0" />
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ public class AuthHelper : IAuthHelper
|
|||||||
return Tools.DeserializeFromBsonList<int>(permissions); //Mahan
|
return Tools.DeserializeFromBsonList<int>(permissions); //Mahan
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasPermission(int permission)
|
||||||
|
{
|
||||||
|
return GetPermissions().Any(x => x == permission);
|
||||||
|
}
|
||||||
|
|
||||||
public long CurrentAccountId()
|
public long CurrentAccountId()
|
||||||
{
|
{
|
||||||
return IsAuthenticated()
|
return IsAuthenticated()
|
||||||
@@ -199,7 +204,7 @@ public class AuthHelper : IAuthHelper
|
|||||||
new("WorkshopSlug",slug),
|
new("WorkshopSlug",slug),
|
||||||
new("WorkshopId", account.WorkshopId.ToString()),
|
new("WorkshopId", account.WorkshopId.ToString()),
|
||||||
new("WorkshopName",account.WorkshopName??""),
|
new("WorkshopName",account.WorkshopName??""),
|
||||||
new("pm.userId", account.PmUserId?.ToString() ?? "0"),
|
new("pm.userId", account.PmUserId.ToString()),
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
public enum TypeOfSmsSetting
|
public enum TypeOfSmsSetting
|
||||||
{
|
{
|
||||||
|
//همه انواع پیامک
|
||||||
|
All = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک
|
/// پیامک
|
||||||
@@ -23,7 +25,7 @@ public enum TypeOfSmsSetting
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک
|
/// پیامک
|
||||||
/// هشدار اول
|
/// هشدار بدهی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Warning,
|
Warning,
|
||||||
|
|
||||||
@@ -33,4 +35,19 @@ public enum TypeOfSmsSetting
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
LegalAction,
|
LegalAction,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک تایید قراداد
|
||||||
|
/// </summary>
|
||||||
|
InstitutionContractConfirm,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال کد تاییدیه قرارداد مالی
|
||||||
|
/// </summary>
|
||||||
|
SendInstitutionContractConfirmationCode,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// یادآور وظایف
|
||||||
|
/// </summary>
|
||||||
|
TaskReminder,
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ public interface IFaceEmbeddingService
|
|||||||
Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding, float confidence, Dictionary<string, object> metadata = null);
|
Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding, float confidence, Dictionary<string, object> metadata = null);
|
||||||
Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId);
|
Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId);
|
||||||
Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId);
|
Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId);
|
||||||
|
Task<OperationResult> UpdateEmbeddingFullNameAsync(long employeeId, long workshopId, string newFullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FaceEmbeddingResponse
|
public class FaceEmbeddingResponse
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public interface IAuthHelper
|
|||||||
string CurrentAccountRole();
|
string CurrentAccountRole();
|
||||||
AuthViewModel CurrentAccountInfo();
|
AuthViewModel CurrentAccountInfo();
|
||||||
List<int> GetPermissions();
|
List<int> GetPermissions();
|
||||||
|
bool HasPermission(int permission);
|
||||||
long CurrentAccountId();
|
long CurrentAccountId();
|
||||||
string CurrentAccountMobile();
|
string CurrentAccountMobile();
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Net.Http;
|
|||||||
using System.Net.Http.Json;
|
using System.Net.Http.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace _0_Framework.Application.PaymentGateway;
|
namespace _0_Framework.Application.PaymentGateway;
|
||||||
@@ -12,18 +13,24 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
{
|
{
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private const long TerminalId = 99213700;
|
private const long TerminalId = 99213700;
|
||||||
|
private readonly ILogger<SepehrPaymentGateway> _logger;
|
||||||
|
|
||||||
public SepehrPaymentGateway(IHttpClientFactory httpClient)
|
public SepehrPaymentGateway(IHttpClientFactory httpClient, ILogger<SepehrPaymentGateway> logger)
|
||||||
{
|
{
|
||||||
|
_logger = logger;
|
||||||
_httpClient = httpClient.CreateClient();
|
_httpClient = httpClient.CreateClient();
|
||||||
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
|
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PaymentGatewayResponse> Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
|
public async Task<PaymentGatewayResponse> Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Create payment started. TransactionId: {TransactionId}, Amount: {Amount}", command.TransactionId, command.Amount);
|
||||||
command.ExtraData ??= new Dictionary<string, object>();
|
command.ExtraData ??= new Dictionary<string, object>();
|
||||||
|
_logger.LogInformation("Initializing extra data with FinancialInvoiceId: {FinancialInvoiceId}", command.FinancialInvoiceId);
|
||||||
command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
|
command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
|
||||||
var extraData = JsonConvert.SerializeObject(command.ExtraData);
|
var extraData = JsonConvert.SerializeObject(command.ExtraData);
|
||||||
|
_logger.LogInformation("Serialized extra data payload: {Payload}", extraData);
|
||||||
|
|
||||||
var res = await _httpClient.PostAsJsonAsync("GetToken", new
|
var res = await _httpClient.PostAsJsonAsync("GetToken", new
|
||||||
{
|
{
|
||||||
TerminalID = TerminalId,
|
TerminalID = TerminalId,
|
||||||
@@ -32,21 +39,25 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
callbackURL = command.CallBackUrl,
|
callbackURL = command.CallBackUrl,
|
||||||
payload = extraData
|
payload = extraData
|
||||||
}, cancellationToken: cancellationToken);
|
}, cancellationToken: cancellationToken);
|
||||||
|
_logger.LogInformation("Create payment request sent. StatusCode: {StatusCode}", res.StatusCode);
|
||||||
// خواندن محتوای پاسخ
|
// خواندن محتوای پاسخ
|
||||||
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
||||||
|
_logger.LogInformation("Create payment response content: {Content}", content);
|
||||||
|
|
||||||
// تبدیل پاسخ JSON به آبجکت داتنت
|
// تبدیل پاسخ JSON به آبجکت داتنت
|
||||||
var json = System.Text.Json.JsonDocument.Parse(content);
|
var json = System.Text.Json.JsonDocument.Parse(content);
|
||||||
|
_logger.LogInformation("Create payment JSON parsed successfully.");
|
||||||
|
|
||||||
// گرفتن مقدار AccessToken
|
// گرفتن مقدار AccessToken
|
||||||
var accessToken = json.RootElement.GetProperty("Accesstoken").ToString();
|
var accessToken = json.RootElement.GetProperty("Accesstoken").ToString();
|
||||||
var status = json.RootElement.GetProperty("Status").ToString();
|
var status = json.RootElement.GetProperty("Status").ToString();
|
||||||
|
_logger.LogInformation("Create payment parsed values. Status: {Status}, AccessToken: {AccessToken}", status, accessToken);
|
||||||
|
|
||||||
return new PaymentGatewayResponse
|
return new PaymentGatewayResponse
|
||||||
{
|
{
|
||||||
Status = status,
|
Status = status,
|
||||||
IsSuccess = status == "0",
|
IsSuccess = status == "0",
|
||||||
Token = accessToken
|
Token = accessToken,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,21 +66,24 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
|
|
||||||
public async Task<PaymentGatewayResponse> Verify(VerifyPaymentGateWayRequest command, CancellationToken cancellationToken = default)
|
public async Task<PaymentGatewayResponse> Verify(VerifyPaymentGateWayRequest command, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Verify payment started. DigitalReceipt: {DigitalReceipt}", command.DigitalReceipt);
|
||||||
var res = await _httpClient.PostAsJsonAsync("Advice", new
|
var res = await _httpClient.PostAsJsonAsync("Advice", new
|
||||||
{
|
{
|
||||||
digitalreceipt = command.DigitalReceipt,
|
digitalreceipt = command.DigitalReceipt,
|
||||||
Tid = TerminalId,
|
Tid = TerminalId,
|
||||||
}, cancellationToken: cancellationToken);
|
}, cancellationToken: cancellationToken);
|
||||||
|
_logger.LogInformation("Verify payment request sent. StatusCode: {StatusCode}", res.StatusCode);
|
||||||
// خواندن محتوای پاسخ
|
// خواندن محتوای پاسخ
|
||||||
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
||||||
|
_logger.LogInformation("Verify payment response content: {Content}", content);
|
||||||
|
|
||||||
// تبدیل پاسخ JSON به آبجکت داتنت
|
// تبدیل پاسخ JSON به آبجکت داتنت
|
||||||
var json = System.Text.Json.JsonDocument.Parse(content);
|
var json = System.Text.Json.JsonDocument.Parse(content);
|
||||||
|
_logger.LogInformation("Verify payment JSON parsed successfully.");
|
||||||
|
|
||||||
var message = json.RootElement.GetProperty("Message").GetString();
|
var message = json.RootElement.GetProperty("Message").GetString();
|
||||||
var status = json.RootElement.GetProperty("Status").GetString();
|
var status = json.RootElement.GetProperty("Status").GetString();
|
||||||
|
_logger.LogInformation("Verify payment parsed values. Status: {Status}, Message: {Message}", status, message);
|
||||||
return new PaymentGatewayResponse
|
return new PaymentGatewayResponse
|
||||||
{
|
{
|
||||||
Status = status,
|
Status = status,
|
||||||
|
|||||||
@@ -18,3 +18,17 @@ public class ApiResultViewModel
|
|||||||
public string DeliveryColor { get; set; }
|
public string DeliveryColor { get; set; }
|
||||||
public string FullName { get; set; }
|
public string FullName { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class ApiReportDto
|
||||||
|
{
|
||||||
|
public int MessageId { get; set; }
|
||||||
|
|
||||||
|
public long Mobile { get; set; }
|
||||||
|
|
||||||
|
public string SendUnixTime { get; set; }
|
||||||
|
public string DeliveryState { get; set; }
|
||||||
|
public string DeliveryUnixTime { get; set; }
|
||||||
|
public string DeliveryColor { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,6 +19,13 @@ public interface ISmsService
|
|||||||
bool SendAccountsInfo(string number,string fullName, string userName);
|
bool SendAccountsInfo(string number,string fullName, string userName);
|
||||||
Task<ApiResultViewModel> GetByMessageId(int messId);
|
Task<ApiResultViewModel> GetByMessageId(int messId);
|
||||||
Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate);
|
Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate);
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
Task<List<ApiReportDto>> GetApiReport(string startDate, string endDate);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
string DeliveryStatus(byte? dv);
|
string DeliveryStatus(byte? dv);
|
||||||
string DeliveryColorStatus(byte? dv);
|
string DeliveryColorStatus(byte? dv);
|
||||||
string UnixTimeStampToDateTime(int? unixTimeStamp);
|
string UnixTimeStampToDateTime(int? unixTimeStamp);
|
||||||
@@ -27,7 +34,7 @@ public interface ISmsService
|
|||||||
|
|
||||||
Task<double> GetCreditAmount();
|
Task<double> GetCreditAmount();
|
||||||
|
|
||||||
public Task<bool> SendInstitutionCreationVerificationLink(string number, string fullName, Guid institutionId, long contractingPartyId, long institutionContractId);
|
public Task<bool> SendInstitutionCreationVerificationLink(string number, string fullName, Guid institutionId, long contractingPartyId, long institutionContractId, string typeOfSms = null);
|
||||||
|
|
||||||
public Task<bool> SendInstitutionVerificationCode(string number, string code, string contractingPartyFullName,
|
public Task<bool> SendInstitutionVerificationCode(string number, string code, string contractingPartyFullName,
|
||||||
long contractingPartyId, long institutionContractId);
|
long contractingPartyId, long institutionContractId);
|
||||||
@@ -64,6 +71,7 @@ public interface ISmsService
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک مسدودی طرف حساب
|
/// پیامک مسدودی طرف حساب
|
||||||
|
/// قراردادهای قدیم
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="number"></param>
|
/// <param name="number"></param>
|
||||||
/// <param name="fullname"></param>
|
/// <param name="fullname"></param>
|
||||||
@@ -74,6 +82,19 @@ public interface ISmsService
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessage(string number, string fullname, string amount, string accountType, string id, string aprove);
|
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessage(string number, string fullname, string amount, string accountType, string id, string aprove);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک مسدودی طرف حساب
|
||||||
|
/// قرارداد های جدید
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="number"></param>
|
||||||
|
/// <param name="fullname"></param>
|
||||||
|
/// <param name="amount"></param>
|
||||||
|
/// <param name="code1"></param>
|
||||||
|
/// <param name="code2"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessageForElectronicContract(string number,
|
||||||
|
string fullname,
|
||||||
|
string amount, string code1, string code2);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region AlarmMessage
|
#region AlarmMessage
|
||||||
|
|||||||
@@ -39,4 +39,15 @@ public static class StaticWorkshopAccounts
|
|||||||
/// که کاربر همچنان به کارگاه دسترسی دارد
|
/// که کاربر همچنان به کارگاه دسترسی دارد
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static DateTime ContinuesWorkingDate = new DateTime(2150, 1, 1);
|
public static DateTime ContinuesWorkingDate = new DateTime(2150, 1, 1);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیستی آی دی نقش هایی که مسئول بیمه کارگاه هستند
|
||||||
|
/// 7 : بیمه ارشد
|
||||||
|
/// 8 : بیمه ساده
|
||||||
|
/// </summary>
|
||||||
|
public static List<long> InsuranceAccountsRoleIds = [7, 8];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@ public class ExcelGenerator
|
|||||||
{
|
{
|
||||||
public ExcelGenerator()
|
public ExcelGenerator()
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
}
|
}
|
||||||
public static byte[] GenerateExcel<T>(List<T> obj, string date = "") where T : class
|
public static byte[] GenerateExcel<T>(List<T> obj, string date = "") where T : class
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
using System;
|
#nullable enable
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using FluentValidation;
|
||||||
using Microsoft.AspNetCore.Diagnostics;
|
using Microsoft.AspNetCore.Diagnostics;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@@ -21,12 +24,24 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
|
|
||||||
public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception exception, CancellationToken cancellationToken)
|
public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception exception, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
_logger.LogError(
|
_logger.LogError(exception,
|
||||||
"Error Message: {exceptionMessage}, Time of occurrence {time}",
|
"Error Message: {exceptionMessage}, Type: {exceptionType}, Time: {time}, Path: {path}, TraceId: {traceId}",
|
||||||
exception.Message, DateTime.UtcNow);
|
exception.Message,
|
||||||
|
exception.GetType().FullName,
|
||||||
|
DateTime.UtcNow,
|
||||||
|
context.Request.Path,
|
||||||
|
context.TraceIdentifier);
|
||||||
|
|
||||||
(string Detail, string Title, int StatusCode, Dictionary<string, object>? Extra) details = exception switch
|
(string Detail, string Title, int StatusCode, Dictionary<string, object>? Extra) details = exception switch
|
||||||
{
|
{
|
||||||
|
ValidationException validationException =>
|
||||||
|
(
|
||||||
|
validationException.Errors.FirstOrDefault()?.ErrorMessage ?? "One or more validation errors occurred.",
|
||||||
|
"Validation Error",
|
||||||
|
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
||||||
|
null
|
||||||
|
),
|
||||||
|
|
||||||
InternalServerException =>
|
InternalServerException =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -34,6 +49,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
|
|
||||||
BadRequestException bre =>
|
BadRequestException bre =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -41,6 +57,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
||||||
bre.Extra
|
bre.Extra
|
||||||
),
|
),
|
||||||
|
|
||||||
NotFoundException =>
|
NotFoundException =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -48,6 +65,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status404NotFound,
|
context.Response.StatusCode = StatusCodes.Status404NotFound,
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
|
|
||||||
UnAuthorizeException =>
|
UnAuthorizeException =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -55,6 +73,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status401Unauthorized,
|
context.Response.StatusCode = StatusCodes.Status401Unauthorized,
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
|
|
||||||
_ =>
|
_ =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -73,8 +92,6 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
Extensions = details.Extra ?? new Dictionary<string, object>()
|
Extensions = details.Extra ?? new Dictionary<string, object>()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
problemDetails.Extensions.Add("traceId", context.TraceIdentifier);
|
problemDetails.Extensions.Add("traceId", context.TraceIdentifier);
|
||||||
|
|
||||||
await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);
|
await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using _0_Framework.Application;
|
|||||||
using _0_Framework.Application.FaceEmbedding;
|
using _0_Framework.Application.FaceEmbedding;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Http;
|
using Microsoft.Extensions.Http;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace _0_Framework.Infrastructure;
|
namespace _0_Framework.Infrastructure;
|
||||||
@@ -24,12 +25,12 @@ public class FaceEmbeddingService : IFaceEmbeddingService
|
|||||||
private readonly string _apiBaseUrl;
|
private readonly string _apiBaseUrl;
|
||||||
|
|
||||||
public FaceEmbeddingService(IHttpClientFactory httpClientFactory, ILogger<FaceEmbeddingService> logger,
|
public FaceEmbeddingService(IHttpClientFactory httpClientFactory, ILogger<FaceEmbeddingService> logger,
|
||||||
IFaceEmbeddingNotificationService notificationService = null)
|
IConfiguration configuration, IFaceEmbeddingNotificationService notificationService = null)
|
||||||
{
|
{
|
||||||
_httpClientFactory = httpClientFactory;
|
_httpClientFactory = httpClientFactory;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_notificationService = notificationService;
|
_notificationService = notificationService;
|
||||||
_apiBaseUrl = "http://localhost:8000";
|
_apiBaseUrl = configuration["FaceEmbeddingApi:BaseUrl"] ?? "http://localhost:8000";
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult> GenerateEmbeddingsAsync(long employeeId, long workshopId,
|
public async Task<OperationResult> GenerateEmbeddingsAsync(long employeeId, long workshopId,
|
||||||
@@ -81,7 +82,8 @@ public class FaceEmbeddingService : IFaceEmbeddingService
|
|||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
var responseContent = await response.Content.ReadAsStringAsync();
|
var responseContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogInformation("Embeddings generated successfully for Employee {EmployeeId}, Workshop {WorkshopId}",
|
_logger.LogInformation(
|
||||||
|
"Embeddings generated successfully for Employee {EmployeeId}, Workshop {WorkshopId}",
|
||||||
employeeId, workshopId);
|
employeeId, workshopId);
|
||||||
|
|
||||||
// ارسال اطلاعرسانی به سایر سیستمها
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
@@ -159,7 +161,8 @@ public class FaceEmbeddingService : IFaceEmbeddingService
|
|||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Embeddings generated successfully from streams for Employee {EmployeeId}", employeeId);
|
_logger.LogInformation("Embeddings generated successfully from streams for Employee {EmployeeId}",
|
||||||
|
employeeId);
|
||||||
|
|
||||||
// ارسال اطلاعرسانی به سایر سیستمها
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
if (_notificationService != null)
|
if (_notificationService != null)
|
||||||
@@ -184,7 +187,8 @@ public class FaceEmbeddingService : IFaceEmbeddingService
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error while generating embeddings from streams for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "Error while generating embeddings from streams for Employee {EmployeeId}",
|
||||||
|
employeeId);
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
@@ -343,4 +347,59 @@ public class FaceEmbeddingService : IFaceEmbeddingService
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> UpdateEmbeddingFullNameAsync(long employeeId, long workshopId,
|
||||||
|
string newFullName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
|
var requestBody = new
|
||||||
|
{
|
||||||
|
employee_id = employeeId,
|
||||||
|
workshop_id = workshopId,
|
||||||
|
employee_full_name = newFullName
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = await httpClient.PutAsJsonAsync("embeddings/update-name", requestBody);
|
||||||
|
|
||||||
|
if (response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Employee Name Changed For {EmployeeId} In workshop ={WorkshopId}", employeeId,
|
||||||
|
workshopId);
|
||||||
|
|
||||||
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
|
if (_notificationService != null)
|
||||||
|
{
|
||||||
|
//await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OperationResult { IsSuccedded = true, Message = "عملیات با موفقیت انجام شد" };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
|
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
||||||
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
|
return new OperationResult
|
||||||
|
{
|
||||||
|
IsSuccedded = false,
|
||||||
|
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error while Changing EmployeeFullName for Employee {EmployeeId}", employeeId);
|
||||||
|
return new OperationResult
|
||||||
|
{
|
||||||
|
IsSuccedded = false,
|
||||||
|
Message = "خطا در بهبود Embedding"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,624 +0,0 @@
|
|||||||
# راهنمای اتصال اپلیکیشن Android به SignalR برای Face Embedding
|
|
||||||
|
|
||||||
## 1. افزودن کتابخانه SignalR به پروژه Android
|
|
||||||
|
|
||||||
در فایل `build.gradle` (Module: app) خود، dependency زیر را اضافه کنید:
|
|
||||||
|
|
||||||
```gradle
|
|
||||||
dependencies {
|
|
||||||
// SignalR for Android
|
|
||||||
implementation 'com.microsoft.signalr:signalr:7.0.0'
|
|
||||||
|
|
||||||
// اگر از Kotlin استفاده میکنید:
|
|
||||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
|
|
||||||
|
|
||||||
// برای JSON پردازش:
|
|
||||||
implementation 'com.google.code.gson:gson:2.10.1'
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2. اضافه کردن Permission در AndroidManifest.xml
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
||||||
```
|
|
||||||
|
|
||||||
## 3. کد Java/Kotlin برای اتصال به SignalR
|
|
||||||
|
|
||||||
### نسخه Java:
|
|
||||||
|
|
||||||
```java
|
|
||||||
import com.microsoft.signalr.HubConnection;
|
|
||||||
import com.microsoft.signalr.HubConnectionBuilder;
|
|
||||||
import com.microsoft.signalr.HubConnectionState;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class FaceEmbeddingSignalRClient {
|
|
||||||
private static final String TAG = "FaceEmbeddingHub";
|
|
||||||
private HubConnection hubConnection;
|
|
||||||
private String serverUrl = "http://YOUR_SERVER_IP:PORT/trackingFaceEmbeddingHub"; // آدرس سرور خود را وارد کنید
|
|
||||||
private long workshopId;
|
|
||||||
|
|
||||||
public FaceEmbeddingSignalRClient(long workshopId) {
|
|
||||||
this.workshopId = workshopId;
|
|
||||||
initializeSignalR();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeSignalR() {
|
|
||||||
// ایجاد اتصال SignalR
|
|
||||||
hubConnection = HubConnectionBuilder
|
|
||||||
.create(serverUrl)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// دریافت رویداد ایجاد Embedding
|
|
||||||
hubConnection.on("EmbeddingCreated", (data) -> {
|
|
||||||
JsonObject jsonData = (JsonObject) data;
|
|
||||||
long employeeId = jsonData.get("employeeId").getAsLong();
|
|
||||||
String employeeFullName = jsonData.get("employeeFullName").getAsString();
|
|
||||||
String timestamp = jsonData.get("timestamp").getAsString();
|
|
||||||
|
|
||||||
Log.d(TAG, "Embedding Created - Employee: " + employeeFullName + " (ID: " + employeeId + ")");
|
|
||||||
|
|
||||||
// اینجا میتوانید دادههای جدید را از سرور بگیرید یا UI را بروزرسانی کنید
|
|
||||||
onEmbeddingCreated(employeeId, employeeFullName, timestamp);
|
|
||||||
|
|
||||||
}, JsonObject.class);
|
|
||||||
|
|
||||||
// دریافت رویداد حذف Embedding
|
|
||||||
hubConnection.on("EmbeddingDeleted", (data) -> {
|
|
||||||
JsonObject jsonData = (JsonObject) data;
|
|
||||||
long employeeId = jsonData.get("employeeId").getAsLong();
|
|
||||||
String timestamp = jsonData.get("timestamp").getAsString();
|
|
||||||
|
|
||||||
Log.d(TAG, "Embedding Deleted - Employee ID: " + employeeId);
|
|
||||||
onEmbeddingDeleted(employeeId, timestamp);
|
|
||||||
|
|
||||||
}, JsonObject.class);
|
|
||||||
|
|
||||||
// دریافت رویداد بهبود Embedding
|
|
||||||
hubConnection.on("EmbeddingRefined", (data) -> {
|
|
||||||
JsonObject jsonData = (JsonObject) data;
|
|
||||||
long employeeId = jsonData.get("employeeId").getAsLong();
|
|
||||||
String timestamp = jsonData.get("timestamp").getAsString();
|
|
||||||
|
|
||||||
Log.d(TAG, "Embedding Refined - Employee ID: " + employeeId);
|
|
||||||
onEmbeddingRefined(employeeId, timestamp);
|
|
||||||
|
|
||||||
}, JsonObject.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void connect() {
|
|
||||||
if (hubConnection.getConnectionState() == HubConnectionState.DISCONNECTED) {
|
|
||||||
hubConnection.start()
|
|
||||||
.doOnComplete(() -> {
|
|
||||||
Log.d(TAG, "Connected to SignalR Hub");
|
|
||||||
joinWorkshopGroup();
|
|
||||||
})
|
|
||||||
.doOnError(error -> {
|
|
||||||
Log.e(TAG, "Error connecting to SignalR: " + error.getMessage());
|
|
||||||
})
|
|
||||||
.subscribe();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void joinWorkshopGroup() {
|
|
||||||
// عضویت در گروه مخصوص این کارگاه
|
|
||||||
hubConnection.send("JoinWorkshopGroup", workshopId);
|
|
||||||
Log.d(TAG, "Joined workshop group: " + workshopId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void disconnect() {
|
|
||||||
if (hubConnection.getConnectionState() == HubConnectionState.CONNECTED) {
|
|
||||||
// خروج از گروه
|
|
||||||
hubConnection.send("LeaveWorkshopGroup", workshopId);
|
|
||||||
|
|
||||||
hubConnection.stop();
|
|
||||||
Log.d(TAG, "Disconnected from SignalR Hub");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// این متدها را در Activity/Fragment خود override کنید
|
|
||||||
protected void onEmbeddingCreated(long employeeId, String employeeFullName, String timestamp) {
|
|
||||||
// اینجا UI را بروزرسانی کنید یا داده جدید را بگیرید
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onEmbeddingDeleted(long employeeId, String timestamp) {
|
|
||||||
// اینجا UI را بروزرسانی کنید
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onEmbeddingRefined(long employeeId, String timestamp) {
|
|
||||||
// اینجا UI را بروزرسانی کنید
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### نسخه Kotlin:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
import com.microsoft.signalr.HubConnection
|
|
||||||
import com.microsoft.signalr.HubConnectionBuilder
|
|
||||||
import com.microsoft.signalr.HubConnectionState
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import android.util.Log
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
|
|
||||||
class FaceEmbeddingSignalRClient(private val workshopId: Long) {
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "FaceEmbeddingHub"
|
|
||||||
}
|
|
||||||
|
|
||||||
private lateinit var hubConnection: HubConnection
|
|
||||||
private val serverUrl = "http://YOUR_SERVER_IP:PORT/trackingFaceEmbeddingHub" // آدرس سرور خود را وارد کنید
|
|
||||||
|
|
||||||
init {
|
|
||||||
initializeSignalR()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initializeSignalR() {
|
|
||||||
hubConnection = HubConnectionBuilder
|
|
||||||
.create(serverUrl)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
// دریافت رویداد ایجاد Embedding
|
|
||||||
hubConnection.on("EmbeddingCreated", { data: JsonObject ->
|
|
||||||
val employeeId = data.get("employeeId").asLong
|
|
||||||
val employeeFullName = data.get("employeeFullName").asString
|
|
||||||
val timestamp = data.get("timestamp").asString
|
|
||||||
|
|
||||||
Log.d(TAG, "Embedding Created - Employee: $employeeFullName (ID: $employeeId)")
|
|
||||||
onEmbeddingCreated(employeeId, employeeFullName, timestamp)
|
|
||||||
}, JsonObject::class.java)
|
|
||||||
|
|
||||||
// دریافت رویداد حذف Embedding
|
|
||||||
hubConnection.on("EmbeddingDeleted", { data: JsonObject ->
|
|
||||||
val employeeId = data.get("employeeId").asLong
|
|
||||||
val timestamp = data.get("timestamp").asString
|
|
||||||
|
|
||||||
Log.d(TAG, "Embedding Deleted - Employee ID: $employeeId")
|
|
||||||
onEmbeddingDeleted(employeeId, timestamp)
|
|
||||||
}, JsonObject::class.java)
|
|
||||||
|
|
||||||
// دریافت رویداد بهبود Embedding
|
|
||||||
hubConnection.on("EmbeddingRefined", { data: JsonObject ->
|
|
||||||
val employeeId = data.get("employeeId").asLong
|
|
||||||
val timestamp = data.get("timestamp").asString
|
|
||||||
|
|
||||||
Log.d(TAG, "Embedding Refined - Employee ID: $employeeId")
|
|
||||||
onEmbeddingRefined(employeeId, timestamp)
|
|
||||||
}, JsonObject::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun connect() {
|
|
||||||
if (hubConnection.connectionState == HubConnectionState.DISCONNECTED) {
|
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
|
||||||
try {
|
|
||||||
hubConnection.start().blockingAwait()
|
|
||||||
Log.d(TAG, "Connected to SignalR Hub")
|
|
||||||
joinWorkshopGroup()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Log.e(TAG, "Error connecting to SignalR: ${e.message}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun joinWorkshopGroup() {
|
|
||||||
hubConnection.send("JoinWorkshopGroup", workshopId)
|
|
||||||
Log.d(TAG, "Joined workshop group: $workshopId")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun disconnect() {
|
|
||||||
if (hubConnection.connectionState == HubConnectionState.CONNECTED) {
|
|
||||||
hubConnection.send("LeaveWorkshopGroup", workshopId)
|
|
||||||
hubConnection.stop()
|
|
||||||
Log.d(TAG, "Disconnected from SignalR Hub")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// این متدها را override کنید
|
|
||||||
open fun onEmbeddingCreated(employeeId: Long, employeeFullName: String, timestamp: String) {
|
|
||||||
// اینجا UI را بروزرسانی کنید یا داده جدید را بگیرید
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun onEmbeddingDeleted(employeeId: Long, timestamp: String) {
|
|
||||||
// اینجا UI را بروزرسانی کنید
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun onEmbeddingRefined(employeeId: Long, timestamp: String) {
|
|
||||||
// اینجا UI را بروزرسانی کنید
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4. استفاده در Activity یا Fragment
|
|
||||||
|
|
||||||
### مثال با Login و دریافت WorkshopId
|
|
||||||
|
|
||||||
#### Java:
|
|
||||||
```java
|
|
||||||
public class LoginActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_login);
|
|
||||||
|
|
||||||
Button btnLogin = findViewById(R.id.btnLogin);
|
|
||||||
btnLogin.setOnClickListener(v -> performLogin());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void performLogin() {
|
|
||||||
// فراخوانی API لاگین
|
|
||||||
// فرض کنید response شامل workshopId است
|
|
||||||
|
|
||||||
// مثال ساده (باید از Retrofit یا کتابخانه مشابه استفاده کنید):
|
|
||||||
// LoginResponse response = apiService.login(username, password);
|
|
||||||
// long workshopId = response.getWorkshopId();
|
|
||||||
|
|
||||||
long workshopId = 123; // این را از response دریافت کنید
|
|
||||||
|
|
||||||
// ذخیره workshopId
|
|
||||||
SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE);
|
|
||||||
prefs.edit().putLong("workshopId", workshopId).apply();
|
|
||||||
|
|
||||||
// رفتن به صفحه اصلی
|
|
||||||
Intent intent = new Intent(this, MainActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MainActivity extends AppCompatActivity {
|
|
||||||
private FaceEmbeddingSignalRClient signalRClient;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_main);
|
|
||||||
|
|
||||||
// دریافت workshopId از SharedPreferences
|
|
||||||
SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE);
|
|
||||||
long workshopId = prefs.getLong("workshopId", 0);
|
|
||||||
|
|
||||||
if (workshopId == 0) {
|
|
||||||
// اگر workshopId وجود نداره، برگرد به صفحه لاگین
|
|
||||||
Intent intent = new Intent(this, LoginActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ایجاد و اتصال SignalR
|
|
||||||
signalRClient = new FaceEmbeddingSignalRClient(workshopId) {
|
|
||||||
@Override
|
|
||||||
protected void onEmbeddingCreated(long employeeId, String employeeFullName, String timestamp) {
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
// بروزرسانی UI
|
|
||||||
Toast.makeText(MainActivity.this,
|
|
||||||
"Embedding ایجاد شد برای: " + employeeFullName,
|
|
||||||
Toast.LENGTH_SHORT).show();
|
|
||||||
|
|
||||||
// دریافت دادههای جدید از API
|
|
||||||
refreshEmployeeList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onEmbeddingDeleted(long employeeId, String timestamp) {
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
// بروزرسانی UI
|
|
||||||
refreshEmployeeList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onEmbeddingRefined(long employeeId, String timestamp) {
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
// بروزرسانی UI
|
|
||||||
refreshEmployeeList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
signalRClient.connect();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
if (signalRClient != null) {
|
|
||||||
signalRClient.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshEmployeeList() {
|
|
||||||
// دریافت لیست جدید کارمندان از API
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Kotlin:
|
|
||||||
```kotlin
|
|
||||||
class LoginActivity : AppCompatActivity() {
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setContentView(R.layout.activity_login)
|
|
||||||
|
|
||||||
val btnLogin = findViewById<Button>(R.id.btnLogin)
|
|
||||||
btnLogin.setOnClickListener { performLogin() }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun performLogin() {
|
|
||||||
// فراخوانی API لاگین
|
|
||||||
// فرض کنید response شامل workshopId است
|
|
||||||
|
|
||||||
// مثال ساده (باید از Retrofit یا کتابخانه مشابه استفاده کنید):
|
|
||||||
// val response = apiService.login(username, password)
|
|
||||||
// val workshopId = response.workshopId
|
|
||||||
|
|
||||||
val workshopId = 123L // این را از response دریافت کنید
|
|
||||||
|
|
||||||
// ذخیره workshopId
|
|
||||||
val prefs = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE)
|
|
||||||
prefs.edit().putLong("workshopId", workshopId).apply()
|
|
||||||
|
|
||||||
// رفتن به صفحه اصلی
|
|
||||||
val intent = Intent(this, MainActivity::class.java)
|
|
||||||
startActivity(intent)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
|
||||||
private lateinit var signalRClient: FaceEmbeddingSignalRClient
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setContentView(R.layout.activity_main)
|
|
||||||
|
|
||||||
// دریافت workshopId از SharedPreferences
|
|
||||||
val prefs = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE)
|
|
||||||
val workshopId = prefs.getLong("workshopId", 0L)
|
|
||||||
|
|
||||||
if (workshopId == 0L) {
|
|
||||||
// اگر workshopId وجود نداره، برگرد به صفحه لاگین
|
|
||||||
val intent = Intent(this, LoginActivity::class.java)
|
|
||||||
startActivity(intent)
|
|
||||||
finish()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// ایجاد و اتصال SignalR
|
|
||||||
signalRClient = object : FaceEmbeddingSignalRClient(workshopId) {
|
|
||||||
override fun onEmbeddingCreated(employeeId: Long, employeeFullName: String, timestamp: String) {
|
|
||||||
runOnUiThread {
|
|
||||||
// بروزرسانی UI
|
|
||||||
Toast.makeText(this@MainActivity,
|
|
||||||
"Embedding ایجاد شد برای: $employeeFullName",
|
|
||||||
Toast.LENGTH_SHORT).show()
|
|
||||||
|
|
||||||
// دریافت دادههای جدید از API
|
|
||||||
refreshEmployeeList()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onEmbeddingDeleted(employeeId: Long, timestamp: String) {
|
|
||||||
runOnUiThread {
|
|
||||||
// بروزرسانی UI
|
|
||||||
refreshEmployeeList()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onEmbeddingRefined(employeeId: Long, timestamp: String) {
|
|
||||||
runOnUiThread {
|
|
||||||
// بروزرسانی UI
|
|
||||||
refreshEmployeeList()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
signalRClient.connect()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy() {
|
|
||||||
super.onDestroy()
|
|
||||||
signalRClient.disconnect()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun refreshEmployeeList() {
|
|
||||||
// دریافت لیست جدید کارمندان از API
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### مثال ساده بدون Login:
|
|
||||||
اگر workshopId را از قبل میدانید:
|
|
||||||
|
|
||||||
#### Java:
|
|
||||||
```java
|
|
||||||
public class MainActivity extends AppCompatActivity {
|
|
||||||
private FaceEmbeddingSignalRClient signalRClient;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_main);
|
|
||||||
|
|
||||||
long workshopId = 123; // شناسه کارگاه خود را وارد کنید
|
|
||||||
|
|
||||||
signalRClient = new FaceEmbeddingSignalRClient(workshopId) {
|
|
||||||
@Override
|
|
||||||
protected void onEmbeddingCreated(long employeeId, String employeeFullName, String timestamp) {
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
// بروزرسانی UI
|
|
||||||
Toast.makeText(MainActivity.this,
|
|
||||||
"Embedding ایجاد شد برای: " + employeeFullName,
|
|
||||||
Toast.LENGTH_SHORT).show();
|
|
||||||
|
|
||||||
// دریافت دادههای جدید از API
|
|
||||||
refreshEmployeeList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onEmbeddingDeleted(long employeeId, String timestamp) {
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
// بروزرسانی UI
|
|
||||||
refreshEmployeeList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
signalRClient.connect();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
if (signalRClient != null) {
|
|
||||||
signalRClient.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshEmployeeList() {
|
|
||||||
// دریافت لیست جدید کارمندان از API
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Kotlin:
|
|
||||||
```kotlin
|
|
||||||
class MainActivity : AppCompatActivity() {
|
|
||||||
private lateinit var signalRClient: FaceEmbeddingSignalRClient
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setContentView(R.layout.activity_main)
|
|
||||||
|
|
||||||
val workshopId = 123L // شناسه کارگاه خود را وارد کنید
|
|
||||||
|
|
||||||
signalRClient = object : FaceEmbeddingSignalRClient(workshopId) {
|
|
||||||
override fun onEmbeddingCreated(employeeId: Long, employeeFullName: String, timestamp: String) {
|
|
||||||
runOnUiThread {
|
|
||||||
// بروزرسانی UI
|
|
||||||
Toast.makeText(this@MainActivity,
|
|
||||||
"Embedding ایجاد شد برای: $employeeFullName",
|
|
||||||
Toast.LENGTH_SHORT).show()
|
|
||||||
|
|
||||||
// دریافت دادههای جدید از API
|
|
||||||
refreshEmployeeList()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onEmbeddingDeleted(employeeId: Long, timestamp: String) {
|
|
||||||
runOnUiThread {
|
|
||||||
// بروزرسانی UI
|
|
||||||
refreshEmployeeList()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
signalRClient.connect()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy() {
|
|
||||||
super.onDestroy()
|
|
||||||
signalRClient.disconnect()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun refreshEmployeeList() {
|
|
||||||
// دریافت لیست جدید کارمندان از API
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 5. نکات مهم
|
|
||||||
|
|
||||||
### آدرس سرور
|
|
||||||
- اگر روی شبیهساز اندروید تست میکنید و سرور روی localhost اجرا میشود، از آدرس `http://10.0.2.2:PORT` استفاده کنید
|
|
||||||
- اگر روی دستگاه فیزیکی تست میکنید، از آدرس IP شبکه محلی سرور استفاده کنید (مثل `http://192.168.1.100:PORT`)
|
|
||||||
- PORT پیشفرض معمولاً 5000 یا 5001 است (بسته به کانفیگ پروژه شما)
|
|
||||||
|
|
||||||
### دریافت WorkshopId از Login
|
|
||||||
بعد از login موفق، workshopId را از سرور دریافت کنید و در SharedPreferences یا یک Singleton ذخیره کنید:
|
|
||||||
|
|
||||||
```java
|
|
||||||
// بعد از login موفق
|
|
||||||
SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE);
|
|
||||||
prefs.edit().putLong("workshopId", workshopId).apply();
|
|
||||||
|
|
||||||
// استفاده در Activity
|
|
||||||
long workshopId = prefs.getLong("workshopId", 0);
|
|
||||||
```
|
|
||||||
|
|
||||||
یا در Kotlin:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
// بعد از login موفق
|
|
||||||
val prefs = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE)
|
|
||||||
prefs.edit().putLong("workshopId", workshopId).apply()
|
|
||||||
|
|
||||||
// استفاده در Activity
|
|
||||||
val workshopId = prefs.getLong("workshopId", 0L)
|
|
||||||
```
|
|
||||||
|
|
||||||
### مدیریت اتصال
|
|
||||||
برای reconnection خودکار:
|
|
||||||
|
|
||||||
```java
|
|
||||||
hubConnection.onClosed(exception -> {
|
|
||||||
Log.e(TAG, "Connection closed. Attempting to reconnect...");
|
|
||||||
new Handler().postDelayed(() -> connect(), 5000); // تلاش مجدد بعد از 5 ثانیه
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Thread Safety
|
|
||||||
همیشه UI updates را در main thread انجام دهید:
|
|
||||||
|
|
||||||
```java
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
// UI updates here
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 6. تست اتصال
|
|
||||||
|
|
||||||
برای تست میتوانید:
|
|
||||||
1. اپلیکیشن را اجرا کنید
|
|
||||||
2. از طریق Postman یا Swagger یک Embedding ایجاد کنید
|
|
||||||
3. باید در Logcat پیام "Embedding Created" را ببینید
|
|
||||||
|
|
||||||
## 7. خطایابی (Debugging)
|
|
||||||
|
|
||||||
برای دیدن جزئیات بیشتر:
|
|
||||||
|
|
||||||
```java
|
|
||||||
hubConnection = HubConnectionBuilder
|
|
||||||
.create(serverUrl)
|
|
||||||
.withHttpConnectionOptions(options -> {
|
|
||||||
options.setLogging(LogLevel.TRACE);
|
|
||||||
})
|
|
||||||
.build();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## خلاصه Endpoints
|
|
||||||
|
|
||||||
| نوع رویداد | متد SignalR | پارامترهای دریافتی |
|
|
||||||
|-----------|-------------|---------------------|
|
|
||||||
| ایجاد Embedding | `EmbeddingCreated` | workshopId, employeeId, employeeFullName, timestamp |
|
|
||||||
| حذف Embedding | `EmbeddingDeleted` | workshopId, employeeId, timestamp |
|
|
||||||
| بهبود Embedding | `EmbeddingRefined` | workshopId, employeeId, timestamp |
|
|
||||||
|
|
||||||
| متد ارسالی | پارامتر | توضیحات |
|
|
||||||
|-----------|---------|---------|
|
|
||||||
| `JoinWorkshopGroup` | workshopId | عضویت در گروه کارگاه |
|
|
||||||
| `LeaveWorkshopGroup` | workshopId | خروج از گروه کارگاه |
|
|
||||||
|
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
|
||||||
|
|
||||||
public class EditAccount : CreateAccount
|
public class EditAccount : CreateAccount
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
|
||||||
|
|
||||||
public class EditClientAccount : RegisterAccount
|
public class EditClientAccount : RegisterAccount
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
using Shared.Contracts.PmUser.Queries;
|
using Shared.Contracts.PmUser.Queries;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
@@ -35,7 +34,7 @@ public interface IAccountApplication
|
|||||||
OperationResult DeActive(long id);
|
OperationResult DeActive(long id);
|
||||||
OperationResult DirectLogin(long id);
|
OperationResult DirectLogin(long id);
|
||||||
|
|
||||||
AccountLeftWorkViewModel WorkshopList(long accountId);
|
// AccountLeftWorkViewModel WorkshopList(long accountId);
|
||||||
OperationResult SaveWorkshopAccount(
|
OperationResult SaveWorkshopAccount(
|
||||||
List<WorkshopAccountlistViewModel> workshopAccountList,
|
List<WorkshopAccountlistViewModel> workshopAccountList,
|
||||||
string startDate,
|
string startDate,
|
||||||
@@ -75,12 +74,7 @@ public interface IAccountApplication
|
|||||||
|
|
||||||
void CameraLogin(CameraLoginRequest request);
|
void CameraLogin(CameraLoginRequest request);
|
||||||
|
|
||||||
/// <summary>
|
Task<GetPmUserDto> GetPmUserAsync(long accountId);
|
||||||
/// دریافت کاربر پروگرام منیجر با اکانت آی دی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="accountId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<GetPmUserDto> GetPmUserByAccountId(long accountId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CameraLoginRequest
|
public class CameraLoginRequest
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
|
||||||
|
|
||||||
public class WorkshopSelectList
|
public class WorkshopSelectList
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
|
|
||||||
public record GetPmRolesDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// آی دی نقش
|
|
||||||
/// </summary>
|
|
||||||
public long Id { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// نام نقش
|
|
||||||
/// </summary>
|
|
||||||
public string RoleName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آی دی نقش در گزارشگیر
|
|
||||||
/// </summary>
|
|
||||||
public long? GozareshgirRoleId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست کدهای دسترسی
|
|
||||||
/// </summary>
|
|
||||||
public List<int> Permissions { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -2,13 +2,9 @@
|
|||||||
using _0_Framework.Application.Sms;
|
using _0_Framework.Application.Sms;
|
||||||
using _0_Framework.Exceptions;
|
using _0_Framework.Exceptions;
|
||||||
using AccountManagement.Application.Contracts.Account;
|
using AccountManagement.Application.Contracts.Account;
|
||||||
using AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
|
||||||
using AccountManagement.Domain.AccountAgg;
|
using AccountManagement.Domain.AccountAgg;
|
||||||
using AccountManagement.Domain.AccountLeftWorkAgg;
|
using AccountManagement.Domain.AccountLeftWorkAgg;
|
||||||
using AccountManagement.Domain.CameraAccountAgg;
|
using AccountManagement.Domain.CameraAccountAgg;
|
||||||
using AccountManagement.Domain.InternalApiCaller;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmRoleUserAgg;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
using AccountManagement.Domain.PositionAgg;
|
using AccountManagement.Domain.PositionAgg;
|
||||||
using AccountManagement.Domain.RoleAgg;
|
using AccountManagement.Domain.RoleAgg;
|
||||||
using AccountManagement.Domain.SubAccountAgg;
|
using AccountManagement.Domain.SubAccountAgg;
|
||||||
@@ -17,25 +13,12 @@ using AccountManagement.Domain.SubAccountRoleAgg;
|
|||||||
using Company.Domain._common;
|
using Company.Domain._common;
|
||||||
using Company.Domain.WorkshopAgg;
|
using Company.Domain.WorkshopAgg;
|
||||||
using Company.Domain.WorkshopSubAccountAgg;
|
using Company.Domain.WorkshopSubAccountAgg;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.JsonPatch.Operations;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
using Shared.Contracts.PmUser.Commands;
|
using Shared.Contracts.PmUser.Commands;
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
|
||||||
using Shared.Contracts.PmUser.Queries;
|
using Shared.Contracts.PmUser.Queries;
|
||||||
|
|
||||||
//using AccountManagement.Domain.RoleAgg;
|
//using AccountManagement.Domain.RoleAgg;
|
||||||
@@ -58,13 +41,19 @@ public class AccountApplication : IAccountApplication
|
|||||||
private readonly ISubAccountRoleRepository _subAccountRoleRepository;
|
private readonly ISubAccountRoleRepository _subAccountRoleRepository;
|
||||||
private readonly IWorkshopSubAccountRepository _workshopSubAccountRepository;
|
private readonly IWorkshopSubAccountRepository _workshopSubAccountRepository;
|
||||||
private readonly ISubAccountPermissionSubtitle1Repository _accountPermissionSubtitle1Repository;
|
private readonly ISubAccountPermissionSubtitle1Repository _accountPermissionSubtitle1Repository;
|
||||||
private readonly IPmUserRepository _pmUserRepository;
|
|
||||||
private readonly IUnitOfWork _unitOfWork;
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
private readonly IPmUserQueryService _pmUserQueryService;
|
private readonly IPmUserQueryService _pmUserQueryService;
|
||||||
private readonly IPmUserCommandService _pmUserCommandService;
|
private readonly IPmUserCommandService _pmUserCommandService;
|
||||||
|
|
||||||
public AccountApplication(IAccountRepository accountRepository, IPasswordHasher passwordHasher,
|
public AccountApplication(IAccountRepository accountRepository, IPasswordHasher passwordHasher,
|
||||||
IFileUploader fileUploader, IAuthHelper authHelper, IRoleRepository roleRepository, IWorker worker, ISmsService smsService, ICameraAccountRepository cameraAccountRepository, IPositionRepository positionRepository, IAccountLeftworkRepository accountLeftworkRepository, IWorkshopRepository workshopRepository, ISubAccountRepository subAccountRepository, ISubAccountRoleRepository subAccountRoleRepository, IWorkshopSubAccountRepository workshopSubAccountRepository, ISubAccountPermissionSubtitle1Repository accountPermissionSubtitle1Repository, IUnitOfWork unitOfWork, IPmUserRepository pmUserRepository, IPmUserQueryService pmUserQueryService, IPmUserCommandService pmUserCommandService)
|
IFileUploader fileUploader, IAuthHelper authHelper, IRoleRepository roleRepository, IWorker worker,
|
||||||
|
ISmsService smsService, ICameraAccountRepository cameraAccountRepository,
|
||||||
|
IPositionRepository positionRepository, IAccountLeftworkRepository accountLeftworkRepository,
|
||||||
|
IWorkshopRepository workshopRepository, ISubAccountRepository subAccountRepository,
|
||||||
|
ISubAccountRoleRepository subAccountRoleRepository, IWorkshopSubAccountRepository workshopSubAccountRepository,
|
||||||
|
ISubAccountPermissionSubtitle1Repository accountPermissionSubtitle1Repository, IUnitOfWork unitOfWork,
|
||||||
|
IPmUserQueryService pmUserQueryService, IPmUserCommandService pmUserCommandService)
|
||||||
{
|
{
|
||||||
_authHelper = authHelper;
|
_authHelper = authHelper;
|
||||||
_roleRepository = roleRepository;
|
_roleRepository = roleRepository;
|
||||||
@@ -78,13 +67,12 @@ public class AccountApplication : IAccountApplication
|
|||||||
_workshopSubAccountRepository = workshopSubAccountRepository;
|
_workshopSubAccountRepository = workshopSubAccountRepository;
|
||||||
_accountPermissionSubtitle1Repository = accountPermissionSubtitle1Repository;
|
_accountPermissionSubtitle1Repository = accountPermissionSubtitle1Repository;
|
||||||
_unitOfWork = unitOfWork;
|
_unitOfWork = unitOfWork;
|
||||||
_pmUserRepository = pmUserRepository;
|
|
||||||
_pmUserQueryService = pmUserQueryService;
|
_pmUserQueryService = pmUserQueryService;
|
||||||
_pmUserCommandService = pmUserCommandService;
|
_pmUserCommandService = pmUserCommandService;
|
||||||
_fileUploader = fileUploader;
|
_fileUploader = fileUploader;
|
||||||
_passwordHasher = passwordHasher;
|
_passwordHasher = passwordHasher;
|
||||||
_accountRepository = accountRepository;
|
_accountRepository = accountRepository;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult EditClient(EditClientAccount command)
|
public OperationResult EditClient(EditClientAccount command)
|
||||||
@@ -105,7 +93,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
(x.Mobile == command.Mobile && x.id != command.Id)))
|
(x.Mobile == command.Mobile && x.id != command.Id)))
|
||||||
return opreation.Failed("شماره موبایل تکراری است");
|
return opreation.Failed("شماره موبایل تکراری است");
|
||||||
if (_accountRepository.Exists(x =>
|
if (_accountRepository.Exists(x =>
|
||||||
(x.NationalCode == command.NationalCode && !string.IsNullOrWhiteSpace(x.NationalCode) && x.id != command.Id)))
|
(x.NationalCode == command.NationalCode && !string.IsNullOrWhiteSpace(x.NationalCode) &&
|
||||||
|
x.id != command.Id)))
|
||||||
return opreation.Failed("کد ملی تکراری است");
|
return opreation.Failed("کد ملی تکراری است");
|
||||||
if (_accountRepository.Exists(x =>
|
if (_accountRepository.Exists(x =>
|
||||||
(x.Email == command.Email && !string.IsNullOrWhiteSpace(x.Email) && x.id != command.Id)))
|
(x.Email == command.Email && !string.IsNullOrWhiteSpace(x.Email) && x.id != command.Id)))
|
||||||
@@ -113,7 +102,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
var path = $"profilePhotos";
|
var path = $"profilePhotos";
|
||||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
editAccount.EditClient(command.Fullname, command.Username, command.Mobile, picturePath, command.Email, command.NationalCode);
|
editAccount.EditClient(command.Fullname, command.Username, command.Mobile, picturePath, command.Email,
|
||||||
|
command.NationalCode);
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return opreation.Succcedded();
|
return opreation.Succcedded();
|
||||||
}
|
}
|
||||||
@@ -158,8 +148,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
if (_fileUploader != null)
|
if (_fileUploader != null)
|
||||||
{
|
{
|
||||||
picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
||||||
picturePath, roleName.Name, "true", "false");
|
picturePath, roleName.Name, "true", "false");
|
||||||
|
|
||||||
@@ -171,8 +161,11 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
if (command.IsProgramManagerUser)
|
if (command.IsProgramManagerUser)
|
||||||
{
|
{
|
||||||
|
if (command.UserRoles == null)
|
||||||
|
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||||
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||||
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username, account.Password, command.Mobile,
|
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username,
|
||||||
|
account.Password, command.Mobile,
|
||||||
null, account.id, pmUserRoles));
|
null, account.id, pmUserRoles));
|
||||||
if (!createPm.isSuccess)
|
if (!createPm.isSuccess)
|
||||||
{
|
{
|
||||||
@@ -181,7 +174,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//var url = "api/user/create";
|
//var url = "api/user/create";
|
||||||
//var key = SecretKeys.ProgramManagerInternalApi;
|
//var key = SecretKeys.ProgramManagerInternalApi;
|
||||||
|
|
||||||
@@ -268,6 +260,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
//);
|
//);
|
||||||
var userResult = await _pmUserQueryService.GetPmUserDataByAccountId(account.id);
|
var userResult = await _pmUserQueryService.GetPmUserDataByAccountId(account.id);
|
||||||
|
|
||||||
|
if (command.UserRoles == null)
|
||||||
|
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||||
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||||
|
|
||||||
//اگر کاربر در پروگرام منیجر قبلا ایجاد شده
|
//اگر کاربر در پروگرام منیجر قبلا ایجاد شده
|
||||||
@@ -279,7 +273,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
||||||
}
|
}
|
||||||
|
|
||||||
var editPm =await _pmUserCommandService.Edit(new EditPmUserDto(command.Fullname, command.Username, command.Mobile, account.id, pmUserRoles,
|
var editPm = await _pmUserCommandService.Edit(new EditPmUserDto(command.Fullname, command.Username,
|
||||||
|
command.Mobile, account.id, pmUserRoles,
|
||||||
command.IsProgramManagerUser));
|
command.IsProgramManagerUser));
|
||||||
if (!editPm.isSuccess)
|
if (!editPm.isSuccess)
|
||||||
{
|
{
|
||||||
@@ -314,7 +309,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
// _unitOfWork.RollbackAccountContext();
|
// _unitOfWork.RollbackAccountContext();
|
||||||
// return operation.Failed(response.Error);
|
// return operation.Failed(response.Error);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
else //اگر کاربر قبلا ایجاد نشده
|
else //اگر کاربر قبلا ایجاد نشده
|
||||||
{
|
{
|
||||||
@@ -328,11 +322,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname,
|
||||||
|
command.Username, account.Password, command.Mobile,
|
||||||
|
|
||||||
|
|
||||||
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username, account.Password, command.Mobile,
|
|
||||||
null, account.id, pmUserRoles));
|
null, account.id, pmUserRoles));
|
||||||
if (!createPm.isSuccess)
|
if (!createPm.isSuccess)
|
||||||
{
|
{
|
||||||
@@ -341,7 +332,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//var parameters = new CreateProgramManagerUser(
|
//var parameters = new CreateProgramManagerUser(
|
||||||
// command.Fullname,
|
// command.Fullname,
|
||||||
// command.Username,
|
// command.Username,
|
||||||
@@ -374,7 +364,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
// return operation.Failed(response.Error);
|
// return operation.Failed(response.Error);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_unitOfWork.CommitAccountContext();
|
_unitOfWork.CommitAccountContext();
|
||||||
@@ -388,7 +377,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
public OperationResult Login(Login command)
|
public OperationResult Login(Login command)
|
||||||
{
|
{
|
||||||
|
|
||||||
long idAutoriz = 0;
|
long idAutoriz = 0;
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
if (string.IsNullOrWhiteSpace(command.Password))
|
if (string.IsNullOrWhiteSpace(command.Password))
|
||||||
@@ -412,6 +400,29 @@ public class AccountApplication : IAccountApplication
|
|||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
//PmPermission
|
||||||
|
var PmUserData = _pmUserQueryService.GetPmUserDataByAccountId(account.id)
|
||||||
|
.GetAwaiter().GetResult();
|
||||||
|
long? pmUserId = null;
|
||||||
|
if (PmUserData != null)
|
||||||
|
{
|
||||||
|
if (PmUserData.AccountId > 0 && PmUserData.IsActive)
|
||||||
|
{
|
||||||
|
var pmUserPermissions =
|
||||||
|
PmUserData.RoleListDto != null
|
||||||
|
? PmUserData.RoleListDto
|
||||||
|
.SelectMany(x => x.Permissions)
|
||||||
|
.Where(p => p != 99)
|
||||||
|
.Distinct()
|
||||||
|
.ToList()
|
||||||
|
: new List<int>();
|
||||||
|
permissions.AddRange(pmUserPermissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
pmUserId = PmUserData.Id > 0 ? PmUserData.Id : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int? positionValue;
|
int? positionValue;
|
||||||
if (account.PositionId != null)
|
if (account.PositionId != null)
|
||||||
{
|
{
|
||||||
@@ -421,7 +432,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
positionValue = null;
|
positionValue = null;
|
||||||
}
|
}
|
||||||
var pmUserId = _pmUserQueryService.GetCurrentPmUserIdFromAccountId(account.id).GetAwaiter().GetResult();
|
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto,
|
, account.Username, account.Mobile, account.ProfilePhoto,
|
||||||
permissions, account.RoleName, account.AdminAreaPermission,
|
permissions, account.RoleName, account.AdminAreaPermission,
|
||||||
@@ -432,7 +443,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x =>
|
||||||
|
new WorkshopClaim
|
||||||
{
|
{
|
||||||
PersonnelCount = x.PersonnelCount,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Id = x.Id,
|
Id = x.Id,
|
||||||
@@ -451,10 +463,14 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
|
|
||||||
if ((account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" && account.IsActiveString == "true") || (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false" && account.IsActiveString == "true"))
|
if ((account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" &&
|
||||||
|
account.IsActiveString == "true") || (account.AdminAreaPermission == "true" &&
|
||||||
|
account.ClientAriaPermission == "false" &&
|
||||||
|
account.IsActiveString == "true"))
|
||||||
idAutoriz = 1;
|
idAutoriz = 1;
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" && account.IsActiveString == "true")
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
|
account.IsActiveString == "true")
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,7 +482,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||||
|
cameraAccount.IsActiveSting);
|
||||||
if (cameraAccount.IsActiveSting == "true")
|
if (cameraAccount.IsActiveSting == "true")
|
||||||
{
|
{
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
@@ -476,7 +493,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
idAutoriz = 0;
|
idAutoriz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subAccount != null)
|
if (subAccount != null)
|
||||||
@@ -506,12 +522,14 @@ public class AccountApplication : IAccountApplication
|
|||||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
||||||
authViewModel.WorkshopId = workshop.WorkshopId;
|
authViewModel.WorkshopId = workshop.WorkshopId;
|
||||||
}
|
}
|
||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return operation.Succcedded(idAutoriz);
|
return operation.Succcedded(idAutoriz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult LoginWithMobile(long id)
|
public OperationResult LoginWithMobile(long id)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
@@ -520,7 +538,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -536,14 +553,16 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName,
|
||||||
|
account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
account.IsActiveString == "true")
|
account.IsActiveString == "true")
|
||||||
{
|
{
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x =>
|
||||||
|
new WorkshopClaim
|
||||||
{
|
{
|
||||||
PersonnelCount = x.PersonnelCount,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Id = x.Id,
|
Id = x.Id,
|
||||||
@@ -562,13 +581,15 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
long idAutoriz = 0;
|
long idAutoriz = 0;
|
||||||
if (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" || account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false")
|
if (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" ||
|
||||||
|
account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false")
|
||||||
idAutoriz = 1;
|
idAutoriz = 1;
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false")
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false")
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
return operation.Succcedded(idAutoriz);
|
return operation.Succcedded(idAutoriz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Logout()
|
public void Logout()
|
||||||
{
|
{
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
@@ -604,6 +625,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
public EditAccount GetByVerifyCode(string code, string phone)
|
public EditAccount GetByVerifyCode(string code, string phone)
|
||||||
{
|
{
|
||||||
return _accountRepository.GetByVerifyCode(code, phone);
|
return _accountRepository.GetByVerifyCode(code, phone);
|
||||||
@@ -632,7 +654,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
await _accountRepository.RemoveCode(id);
|
await _accountRepository.RemoveCode(id);
|
||||||
|
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -677,7 +698,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -686,7 +706,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true", null);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true",
|
||||||
|
null);
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||||
{
|
{
|
||||||
PersonnelCount = x.PersonnelCount,
|
PersonnelCount = x.PersonnelCount,
|
||||||
@@ -706,9 +727,11 @@ public class AccountApplication : IAccountApplication
|
|||||||
authViewModel.WorkshopName = workshop.Name;
|
authViewModel.WorkshopName = workshop.Name;
|
||||||
authViewModel.WorkshopId = workshop.Id;
|
authViewModel.WorkshopId = workshop.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult DirectCameraLogin(long cameraAccountId)
|
public OperationResult DirectCameraLogin(long cameraAccountId)
|
||||||
{
|
{
|
||||||
var prAcc = _authHelper.CurrentAccountInfo();
|
var prAcc = _authHelper.CurrentAccountInfo();
|
||||||
@@ -718,47 +741,45 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
|
|
||||||
|
|
||||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||||
|
cameraAccount.IsActiveSting);
|
||||||
if (cameraAccount.IsActiveSting == "true")
|
if (cameraAccount.IsActiveSting == "true")
|
||||||
{
|
{
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return operation.Failed("این اکانت غیر فعال شده است");
|
return operation.Failed("این اکانت غیر فعال شده است");
|
||||||
}
|
}
|
||||||
|
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public AccountLeftWorkViewModel WorkshopList(long accountId)
|
// public AccountLeftWorkViewModel WorkshopList(long accountId)
|
||||||
{
|
// {
|
||||||
string fullname = this._accountRepository.GetById(accountId).Fullname;
|
// string fullname = this._accountRepository.GetById(accountId).Fullname;
|
||||||
List<WorkshopAccountlistViewModel> source = _accountLeftworkRepository.WorkshopList(accountId);
|
// List<WorkshopAccountlistViewModel> source = _accountLeftworkRepository.WorkshopList(accountId);
|
||||||
List<long> userWorkshopIds = source.Select(x => x.WorkshopId).ToList();
|
// List<long> userWorkshopIds = source.Select(x => x.WorkshopId).ToList();
|
||||||
List<WorkshopSelectList> allWorkshops = this._accountLeftworkRepository.GetAllWorkshops();
|
// List<WorkshopSelectList> allWorkshops = this._accountLeftworkRepository.GetAllWorkshops();
|
||||||
List<AccountViewModel> accountSelectList = this._accountRepository.GetAdminAccountSelectList();
|
// List<AccountViewModel> accountSelectList = this._accountRepository.GetAdminAccountSelectList();
|
||||||
(string StartWorkFa, string LeftWorkFa) byAccountId = this._accountLeftworkRepository.GetByAccountId(accountId);
|
// (string StartWorkFa, string LeftWorkFa) byAccountId = this._accountLeftworkRepository.GetByAccountId(accountId);
|
||||||
return new AccountLeftWorkViewModel()
|
// return new AccountLeftWorkViewModel()
|
||||||
{
|
// {
|
||||||
AccountId = accountId,
|
// AccountId = accountId,
|
||||||
AccountFullName = fullname,
|
// AccountFullName = fullname,
|
||||||
StartDateFa = byAccountId.StartWorkFa,
|
// StartDateFa = byAccountId.StartWorkFa,
|
||||||
LeftDateFa = byAccountId.LeftWorkFa,
|
// LeftDateFa = byAccountId.LeftWorkFa,
|
||||||
WorkshopAccountlist = source,
|
// WorkshopAccountlist = source,
|
||||||
WorkshopSelectList = new SelectList(allWorkshops.Where(x => !userWorkshopIds.Contains(x.Id)), "Id", "WorkshopFullName"),
|
// WorkshopSelectList = new SelectList(allWorkshops.Where(x => !userWorkshopIds.Contains(x.Id)), "Id", "WorkshopFullName"),
|
||||||
AccountSelectList = new SelectList(accountSelectList, "Id", "Fullname")
|
// AccountSelectList = new SelectList(accountSelectList, "Id", "Fullname")
|
||||||
};
|
// };
|
||||||
}
|
// }
|
||||||
|
|
||||||
public OperationResult SaveWorkshopAccount(
|
public OperationResult SaveWorkshopAccount(
|
||||||
List<WorkshopAccountlistViewModel> workshopAccountList,
|
List<WorkshopAccountlistViewModel> workshopAccountList,
|
||||||
@@ -768,10 +789,12 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
return this._accountLeftworkRepository.SaveWorkshopAccount(workshopAccountList, startDate, leftDate, accountId);
|
return this._accountLeftworkRepository.SaveWorkshopAccount(workshopAccountList, startDate, leftDate, accountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult CreateNewWorkshopAccount(long currentAccountId, long newAccountId)
|
public OperationResult CreateNewWorkshopAccount(long currentAccountId, long newAccountId)
|
||||||
{
|
{
|
||||||
return this._accountLeftworkRepository.CopyWorkshopToNewAccount(currentAccountId, newAccountId);
|
return this._accountLeftworkRepository.CopyWorkshopToNewAccount(currentAccountId, newAccountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Mahan
|
#region Mahan
|
||||||
|
|
||||||
public List<AccountViewModel> AccountsForAssign(long taskId)
|
public List<AccountViewModel> AccountsForAssign(long taskId)
|
||||||
@@ -785,6 +808,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
return new List<AccountViewModel>();
|
return new List<AccountViewModel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _accountRepository.GetAccountsByPositionId(positionId);
|
return _accountRepository.GetAccountsByPositionId(positionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -802,7 +826,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -811,10 +834,10 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, account.Position.PositionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName,
|
||||||
|
account.AdminAreaPermission, account.ClientAriaPermission, account.Position.PositionValue);
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
|
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
|
||||||
@@ -823,8 +846,11 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password, string rePassword)
|
|
||||||
|
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password,
|
||||||
|
string rePassword)
|
||||||
{
|
{
|
||||||
OperationResult op = new();
|
OperationResult op = new();
|
||||||
|
|
||||||
@@ -842,7 +868,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) && string.IsNullOrWhiteSpace(rePassword))
|
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) &&
|
||||||
|
string.IsNullOrWhiteSpace(rePassword))
|
||||||
return op.Failed("چیزی برای تغییر وجود ندارد");
|
return op.Failed("چیزی برای تغییر وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
@@ -868,20 +895,22 @@ public class AccountApplication : IAccountApplication
|
|||||||
var entity = _accountRepository.Get(command.AccountId);
|
var entity = _accountRepository.Get(command.AccountId);
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||||
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password, command.RePassword);
|
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password,
|
||||||
|
command.RePassword);
|
||||||
if (validationResult.IsSuccedded == false)
|
if (validationResult.IsSuccedded == false)
|
||||||
return validationResult;
|
return validationResult;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(command.RePassword))
|
if (!string.IsNullOrWhiteSpace(command.RePassword))
|
||||||
{
|
{
|
||||||
|
|
||||||
entity.ChangePassword(_passwordHasher.Hash(command.Password));
|
entity.ChangePassword(_passwordHasher.Hash(command.Password));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
||||||
{
|
{
|
||||||
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto, entity.RoleName);
|
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto,
|
||||||
|
entity.RoleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
@@ -977,6 +1006,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
// return claimsResponse.Failed(ApplicationMessages.WrongUserPass);
|
// return claimsResponse.Failed(ApplicationMessages.WrongUserPass);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
@@ -1015,8 +1045,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<GetPmUserDto> GetPmUserByAccountId(long accountId)
|
public async Task<GetPmUserDto> GetPmUserAsync(long accountId)
|
||||||
{
|
{
|
||||||
return await _pmUserRepository.GetPmUserByAccountId(accountId);
|
return await _pmUserQueryService.GetPmUserDataByAccountId(accountId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using AccountManagement.Application.Contracts.Account;
|
using AccountManagement.Application.Contracts.Account;
|
||||||
using AccountManagement.Application.Contracts.CameraAccount;
|
using AccountManagement.Application.Contracts.CameraAccount;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
|
|||||||
@@ -4,13 +4,7 @@ using AccountManagement.Domain.RoleAgg;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
|
||||||
using AccountManagement.Domain.InternalApiCaller;
|
|
||||||
using Company.Domain._common;
|
using Company.Domain._common;
|
||||||
using AccountManagement.Application.Contracts.Ticket;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmPermissionAgg;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using Shared.Contracts.PmRole.Commands;
|
using Shared.Contracts.PmRole.Commands;
|
||||||
using GetPmRolesDto = Shared.Contracts.PmRole.Queries.GetPmRolesDto;
|
using GetPmRolesDto = Shared.Contracts.PmRole.Queries.GetPmRolesDto;
|
||||||
@@ -22,18 +16,15 @@ namespace AccountManagement.Application;
|
|||||||
public class RoleApplication : IRoleApplication
|
public class RoleApplication : IRoleApplication
|
||||||
{
|
{
|
||||||
private readonly IRoleRepository _roleRepository;
|
private readonly IRoleRepository _roleRepository;
|
||||||
private readonly IPmRoleRepository _pmRoleRepository;
|
|
||||||
private readonly IPmUserRepository _pmUserRepository;
|
|
||||||
private readonly IPmRoleQueryService _pmRoleQueryService;
|
private readonly IPmRoleQueryService _pmRoleQueryService;
|
||||||
private readonly IPmRoleCommandService _pmRoleCommandService;
|
private readonly IPmRoleCommandService _pmRoleCommandService;
|
||||||
private readonly IUnitOfWork _unitOfWork;
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
public RoleApplication(IRoleRepository roleRepository, IUnitOfWork unitOfWork, IPmRoleRepository pmRoleRepository, IPmUserRepository pmUserRepository, IPmRoleQueryService pmRoleQueryService, IPmRoleCommandService pmRoleCommandService)
|
public RoleApplication(IRoleRepository roleRepository, IUnitOfWork unitOfWork, IPmRoleQueryService pmRoleQueryService, IPmRoleCommandService pmRoleCommandService)
|
||||||
{
|
{
|
||||||
_roleRepository = roleRepository;
|
_roleRepository = roleRepository;
|
||||||
_unitOfWork = unitOfWork;
|
_unitOfWork = unitOfWork;
|
||||||
_pmRoleRepository = pmRoleRepository;
|
|
||||||
_pmUserRepository = pmUserRepository;
|
|
||||||
_pmRoleQueryService = pmRoleQueryService;
|
_pmRoleQueryService = pmRoleQueryService;
|
||||||
_pmRoleCommandService = pmRoleCommandService;
|
_pmRoleCommandService = pmRoleCommandService;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,11 @@ using AccountManagement.Domain.AccountAgg;
|
|||||||
using AccountManagement.Domain.CameraAccountAgg;
|
using AccountManagement.Domain.CameraAccountAgg;
|
||||||
using AccountManagement.Domain.SubAccountAgg;
|
using AccountManagement.Domain.SubAccountAgg;
|
||||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||||
using Company.Domain.WorkshopAccountAgg;
|
|
||||||
using Company.Domain.WorkshopSubAccountAgg;
|
using Company.Domain.WorkshopSubAccountAgg;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
|
||||||
|
|
||||||
|
|
||||||
namespace AccountManagement.Application
|
namespace AccountManagement.Application
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using AccountManagement.Application.Contracts.TaskSubject;
|
using AccountManagement.Application.Contracts.TaskSubject;
|
||||||
using AccountManagement.Domain.TaskSubjectAgg;
|
using AccountManagement.Domain.TaskSubjectAgg;
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application;
|
namespace AccountManagement.Application;
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
using AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
using AccountMangement.Infrastructure.EFCore.PmDbConetxt;
|
|
||||||
using AccountMangement.Infrastructure.EFCore.Repository.PmRepositories;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
|
|
||||||
namespace AccountManagement.Configuration;
|
|
||||||
|
|
||||||
public class PmDbBootstrapper
|
|
||||||
{
|
|
||||||
public static void Configure(IServiceCollection services, string connectionString)
|
|
||||||
{
|
|
||||||
services.AddTransient<IPmRoleRepository, PmRoleRepository>();
|
|
||||||
services.AddTransient<IPmUserRepository, PmUserRepository>();
|
|
||||||
services.AddDbContext<PmDbContext>(x => x.UseSqlServer(connectionString));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,7 @@ public interface IAccountLeftworkRepository : IRepository<long, AccountLeftWork>
|
|||||||
{
|
{
|
||||||
(string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId);
|
(string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId);
|
||||||
List<WorkshopAccountlistViewModel> WorkshopList(long accountId);
|
List<WorkshopAccountlistViewModel> WorkshopList(long accountId);
|
||||||
List<WorkshopSelectList> GetAllWorkshops();
|
// List<WorkshopSelectList> GetAllWorkshops();
|
||||||
|
|
||||||
OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId);
|
OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId);
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
|
|
||||||
namespace AccountManagement.Domain.PmDomains.PmPermissionAgg;
|
|
||||||
|
|
||||||
public class PmPermission
|
|
||||||
{
|
|
||||||
public long Id { get; private set; }
|
|
||||||
public int Code { get; private set; }
|
|
||||||
public PmRole Role { get; private set; }
|
|
||||||
|
|
||||||
public PmPermission(int code)
|
|
||||||
{
|
|
||||||
Code = code;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
using _0_Framework.Domain;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
|
|
||||||
namespace AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
|
|
||||||
public interface IPmRoleRepository :IRepository<long, PmRole>
|
|
||||||
{
|
|
||||||
Task<List<GetPmRolesDto>> GetPmRoleList(long? gozareshgirRoleId);
|
|
||||||
|
|
||||||
Task<PmRole?> GetPmRoleToEdit(long gozareshgirRoleId);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using _0_Framework.Domain;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmPermissionAgg;
|
|
||||||
|
|
||||||
namespace AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
|
|
||||||
public class PmRole : EntityBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// نام نقش
|
|
||||||
/// </summary>
|
|
||||||
public string RoleName { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست پرمیشن کد ها
|
|
||||||
/// </summary>
|
|
||||||
public List<PmPermission> PmPermission { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ای دی نقش در گزارشگیر
|
|
||||||
/// </summary>
|
|
||||||
public long? GozareshgirRoleId { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
protected PmRole()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public PmRole(string roleName,long? gozareshgirRolId, List<PmPermission> permissions)
|
|
||||||
{
|
|
||||||
RoleName = roleName;
|
|
||||||
PmPermission = permissions;
|
|
||||||
GozareshgirRoleId = gozareshgirRolId;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Edit(string roleName, List<PmPermission> permissions)
|
|
||||||
{
|
|
||||||
RoleName = roleName;
|
|
||||||
PmPermission = permissions;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
|
|
||||||
namespace AccountManagement.Domain.PmDomains.PmRoleUserAgg;
|
|
||||||
|
|
||||||
public class PmRoleUser
|
|
||||||
{
|
|
||||||
public PmRoleUser(long roleId)
|
|
||||||
{
|
|
||||||
RoleId = roleId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long Id { get; private set; }
|
|
||||||
public long RoleId { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
public PmUser User { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
using _0_Framework.Domain;
|
|
||||||
using AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Shared.Contracts.PmUser.Queries;
|
|
||||||
|
|
||||||
namespace AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
|
|
||||||
public interface IPmUserRepository : IRepository<long, PmUser>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت کاربر پروگرام منیجر جهتد ویرایش
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="accountId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<PmUser?> GetByPmUsertoEditbyAccountId(long accountId);
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت کرابر پروگرام منیجر با اکانت آی دی در گزارشگیر
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="accountId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<GetPmUserDto> GetPmUserByAccountId(long accountId);
|
|
||||||
}
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using _0_Framework.Domain;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmRoleUserAgg;
|
|
||||||
|
|
||||||
|
|
||||||
namespace AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// کاربر
|
|
||||||
/// </summary>
|
|
||||||
public class PmUser : EntityBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// ایجاد
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="fullName"></param>
|
|
||||||
/// <param name="userName"></param>
|
|
||||||
/// <param name="password"></param>
|
|
||||||
/// <param name="mobile"></param>
|
|
||||||
/// <param name="email"></param>
|
|
||||||
/// <param name="accountId"></param>
|
|
||||||
/// <param name="roles"></param>
|
|
||||||
public PmUser(string fullName, string userName, string password, string mobile, string email, long? accountId, List<PmRoleUser> roles)
|
|
||||||
{
|
|
||||||
FullName = fullName;
|
|
||||||
UserName = userName;
|
|
||||||
Password = password;
|
|
||||||
Mobile = mobile;
|
|
||||||
Email = email;
|
|
||||||
IsActive = true;
|
|
||||||
AccountId = accountId;
|
|
||||||
RoleUser = roles;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected PmUser()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// نام و نام خانوادگی
|
|
||||||
/// </summary>
|
|
||||||
public string FullName { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// نام کاربری
|
|
||||||
/// </summary>
|
|
||||||
public string UserName { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// گذرواژه
|
|
||||||
/// </summary>
|
|
||||||
public string Password { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// مسیر عکس پروفایل
|
|
||||||
/// </summary>
|
|
||||||
public string ProfilePhotoPath { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// شماره موبایل
|
|
||||||
/// </summary>
|
|
||||||
public string Mobile { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ایمیل
|
|
||||||
/// </summary>
|
|
||||||
public string Email { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// فعال/غیر فعال بودن یوزر
|
|
||||||
/// </summary>
|
|
||||||
public bool IsActive { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// کد یکبارمصرف ورود
|
|
||||||
/// </summary>
|
|
||||||
public string VerifyCode { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آی دی کاربر در گزارشگیر
|
|
||||||
/// </summary>
|
|
||||||
public long? AccountId { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// لیست پرمیشن کد ها
|
|
||||||
/// </summary>
|
|
||||||
public List<PmRoleUser> RoleUser { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// آپدیت کاربر
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="fullName"></param>
|
|
||||||
/// <param name="userName"></param>
|
|
||||||
/// <param name="mobile"></param>
|
|
||||||
/// <param name="roles"></param>
|
|
||||||
/// <param name="isActive"></param>
|
|
||||||
public void Edit(string fullName, string userName, string mobile, List<PmRoleUser> roles, bool isActive)
|
|
||||||
{
|
|
||||||
FullName = fullName;
|
|
||||||
UserName = userName;
|
|
||||||
Mobile = mobile;
|
|
||||||
RoleUser = roles;
|
|
||||||
IsActive = isActive;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// غیرفعال سازی
|
|
||||||
/// </summary>
|
|
||||||
public void DeActive()
|
|
||||||
{
|
|
||||||
IsActive = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// فعال سازی
|
|
||||||
/// </summary>
|
|
||||||
public void ReActive()
|
|
||||||
{
|
|
||||||
IsActive = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
using AccountManagement.Domain.AccountAgg;
|
using AccountManagement.Domain.AccountAgg;
|
||||||
using AccountMangement.Infrastructure.EFCore.Mappings;
|
using AccountMangement.Infrastructure.EFCore.Mappings;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System;
|
using System;
|
||||||
@@ -26,7 +26,6 @@ using AccountManagement.Domain.SubAccountPermissionSubtitle2Agg;
|
|||||||
using AccountManagement.Domain.SubAccountPermissionSubtitle3Agg;
|
using AccountManagement.Domain.SubAccountPermissionSubtitle3Agg;
|
||||||
using AccountManagement.Domain.SubAccountPermissionSubtitle4Agg;
|
using AccountManagement.Domain.SubAccountPermissionSubtitle4Agg;
|
||||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||||
using AccountMangement.Infrastructure.EFCore.Seed;
|
|
||||||
using AccountManagement.Domain.TaskScheduleAgg;
|
using AccountManagement.Domain.TaskScheduleAgg;
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore
|
namespace AccountMangement.Infrastructure.EFCore
|
||||||
@@ -60,9 +59,10 @@ namespace AccountMangement.Infrastructure.EFCore
|
|||||||
|
|
||||||
public DbSet<TaskSchedule> TaskSchedules { get; set; }
|
public DbSet<TaskSchedule> TaskSchedules { get; set; }
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
public DbSet<SubAccount> SubAccounts { get; set; }
|
public DbSet<SubAccount> SubAccounts { get; set; }
|
||||||
public DbSet<SubAccountRole> SubAccountRoles { get; set; }
|
public DbSet<SubAccountRole> SubAccountRoles { get; set; }
|
||||||
|
|||||||
@@ -24,4 +24,8 @@
|
|||||||
<Folder Include="Services\" />
|
<Folder Include="Services\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Mappings\BugReportMapping.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
using AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore.Mappings.PmMappings;
|
|
||||||
|
|
||||||
public class PmRoleMapping : IEntityTypeConfiguration<PmRole>
|
|
||||||
{
|
|
||||||
public void Configure(EntityTypeBuilder<PmRole> builder)
|
|
||||||
{
|
|
||||||
builder.ToTable("PmRoles", t => t.ExcludeFromMigrations());
|
|
||||||
builder.HasKey(x => x.id);
|
|
||||||
|
|
||||||
builder.Property(x => x.RoleName).HasMaxLength(100).IsRequired();
|
|
||||||
|
|
||||||
builder.OwnsMany(x => x.PmPermission, navigationBuilder =>
|
|
||||||
{
|
|
||||||
navigationBuilder.HasKey(x => x.Id);
|
|
||||||
navigationBuilder.ToTable("PmRolePermissions", t => t.ExcludeFromMigrations());
|
|
||||||
|
|
||||||
navigationBuilder.WithOwner(x => x.Role);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore.Mappings.PmMappings;
|
|
||||||
|
|
||||||
public class PmUserMapping :IEntityTypeConfiguration<PmUser>
|
|
||||||
{
|
|
||||||
public void Configure(EntityTypeBuilder<PmUser> builder)
|
|
||||||
{
|
|
||||||
builder.ToTable("Users");
|
|
||||||
builder.HasKey(x => x.id);
|
|
||||||
|
|
||||||
builder.Property(x => x.FullName).HasMaxLength(100).IsRequired();
|
|
||||||
builder.Property(x => x.UserName).HasMaxLength(100).IsRequired();
|
|
||||||
builder.Property(x => x.Password).HasMaxLength(1000).IsRequired();
|
|
||||||
builder.Property(x => x.ProfilePhotoPath).HasMaxLength(500).IsRequired(false);
|
|
||||||
builder.Property(x => x.Mobile).HasMaxLength(20).IsRequired();
|
|
||||||
builder.Property(x => x.Email).HasMaxLength(150).IsRequired(false); ;
|
|
||||||
builder.Property(x => x.VerifyCode).HasMaxLength(10).IsRequired(false);
|
|
||||||
builder.OwnsMany(x => x.RoleUser, navigationBuilder =>
|
|
||||||
{
|
|
||||||
navigationBuilder.HasKey(x => x.Id);
|
|
||||||
navigationBuilder.ToTable("RoleUsers");
|
|
||||||
navigationBuilder.WithOwner(x => x.User);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
using AccountMangement.Infrastructure.EFCore.Mappings;
|
|
||||||
using AccountMangement.Infrastructure.EFCore.Mappings.PmMappings;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore.PmDbConetxt;
|
|
||||||
|
|
||||||
public class PmDbContext : DbContext
|
|
||||||
{
|
|
||||||
public PmDbContext(DbContextOptions<PmDbContext> options) : base(options)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
public DbSet<PmUser> Users { get; set; } = null!;
|
|
||||||
public DbSet<PmRole> PmRoles { get; set; } = null!;
|
|
||||||
|
|
||||||
|
|
||||||
public PmDbContext()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
var assembly = typeof(PmUserMapping).Assembly;
|
|
||||||
modelBuilder.ApplyConfigurationsFromAssembly(assembly);
|
|
||||||
//SubAccountPermissionSeeder.Seed(modelBuilder);
|
|
||||||
base.OnModelCreating(modelBuilder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18,13 +18,12 @@ public class AccountLeftworkRepository : RepositoryBase<long, AccountLeftWork>,
|
|||||||
{
|
{
|
||||||
private readonly AccountContext _accountContext;
|
private readonly AccountContext _accountContext;
|
||||||
private readonly IWorkshopAccountRepository _workshopAccountRepository;
|
private readonly IWorkshopAccountRepository _workshopAccountRepository;
|
||||||
private readonly IWorkshopApplication _workshopApplication;
|
|
||||||
|
|
||||||
public AccountLeftworkRepository(AccountContext accountContext, IWorkshopAccountRepository workshopAccountRepository, IWorkshopApplication workshopApplication) : base(accountContext)
|
public AccountLeftworkRepository(AccountContext accountContext,
|
||||||
|
IWorkshopAccountRepository workshopAccountRepository) : base(accountContext)
|
||||||
{
|
{
|
||||||
_accountContext = accountContext;
|
_accountContext = accountContext;
|
||||||
_workshopAccountRepository = workshopAccountRepository;
|
_workshopAccountRepository = workshopAccountRepository;
|
||||||
_workshopApplication = workshopApplication;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public (string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId)
|
public (string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId)
|
||||||
@@ -58,14 +57,14 @@ public class AccountLeftworkRepository : RepositoryBase<long, AccountLeftWork>,
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<WorkshopSelectList> GetAllWorkshops()
|
// public List<WorkshopSelectList> GetAllWorkshops()
|
||||||
{
|
// {
|
||||||
return this._workshopApplication.GetWorkshopAll().Select(x => new WorkshopSelectList()
|
// return this._workshopApplication.GetWorkshopAll().Select(x => new WorkshopSelectList()
|
||||||
{
|
// {
|
||||||
Id = x.Id,
|
// Id = x.Id,
|
||||||
WorkshopFullName = x.WorkshopFullName
|
// WorkshopFullName = x.WorkshopFullName
|
||||||
}).ToList();
|
// }).ToList();
|
||||||
}
|
// }
|
||||||
|
|
||||||
public OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId)
|
public OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
using _0_Framework.InfraStructure;
|
|
||||||
using AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmRoleAgg;
|
|
||||||
using AccountMangement.Infrastructure.EFCore.PmDbConetxt;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore.Repository.PmRepositories;
|
|
||||||
|
|
||||||
public class PmRoleRepository : RepositoryBase<long, PmRole>, IPmRoleRepository
|
|
||||||
{
|
|
||||||
private readonly PmDbContext _pmDbContext;
|
|
||||||
public PmRoleRepository(PmDbContext context) : base(context)
|
|
||||||
{
|
|
||||||
_pmDbContext = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<GetPmRolesDto>> GetPmRoleList(long? gozareshgirRoleId)
|
|
||||||
{
|
|
||||||
var query = _pmDbContext.PmRoles.AsQueryable();
|
|
||||||
if (gozareshgirRoleId != null && gozareshgirRoleId > 0)
|
|
||||||
query = query.Where(x => x.GozareshgirRoleId == gozareshgirRoleId);
|
|
||||||
var res = await query
|
|
||||||
.Select(p => new GetPmRolesDto()
|
|
||||||
{
|
|
||||||
Id = p.id,
|
|
||||||
RoleName = p.RoleName,
|
|
||||||
GozareshgirRoleId = p.GozareshgirRoleId,
|
|
||||||
Permissions = p.PmPermission.Select(x => x.Code).ToList()
|
|
||||||
|
|
||||||
})
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<PmRole?> GetPmRoleToEdit(long gozareshgirRoleId)
|
|
||||||
{
|
|
||||||
return await _pmDbContext.PmRoles.FirstOrDefaultAsync(x => x.GozareshgirRoleId == gozareshgirRoleId);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
using _0_Framework.InfraStructure;
|
|
||||||
using AccountManagement.Application.Contracts.ProgramManager;
|
|
||||||
using AccountManagement.Domain.PmDomains.PmUserAgg;
|
|
||||||
using AccountMangement.Infrastructure.EFCore.PmDbConetxt;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Shared.Contracts.PmUser.Queries;
|
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore.Repository.PmRepositories;
|
|
||||||
|
|
||||||
public class PmUserRepository :RepositoryBase<long, PmUser>, IPmUserRepository
|
|
||||||
{
|
|
||||||
private readonly PmDbContext _pmDbContext;
|
|
||||||
public PmUserRepository(PmDbContext context, PmDbContext pmDbContext) : base(context)
|
|
||||||
{
|
|
||||||
_pmDbContext = pmDbContext;
|
|
||||||
}
|
|
||||||
public async Task<PmUser?> GetByPmUsertoEditbyAccountId(long accountId)
|
|
||||||
{
|
|
||||||
return await _pmDbContext.Users.FirstOrDefaultAsync(x => x.AccountId == accountId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<GetPmUserDto> GetPmUserByAccountId(long accountId)
|
|
||||||
{
|
|
||||||
var query = await _pmDbContext.Users.FirstOrDefaultAsync(x => x.AccountId == accountId);
|
|
||||||
if (query == null)
|
|
||||||
return new GetPmUserDto();
|
|
||||||
List<long> roles = query.RoleUser.Select(x => x.RoleId).ToList();
|
|
||||||
return new GetPmUserDto()
|
|
||||||
{
|
|
||||||
FullName = query.FullName,
|
|
||||||
UserName = query.UserName,
|
|
||||||
ProfilePhotoPath = query.ProfilePhotoPath,
|
|
||||||
Mobile = query.Mobile,
|
|
||||||
IsActive = query.IsActive,
|
|
||||||
AccountId = query.AccountId,
|
|
||||||
Roles = roles,
|
|
||||||
RoleListDto = await _pmDbContext.PmRoles.Where(x => roles.Contains(x.id)).Select(x => new RoleListDto()
|
|
||||||
{
|
|
||||||
RoleName = x.RoleName,
|
|
||||||
RoleId = x.id,
|
|
||||||
Permissions = x.PmPermission.Select(x => x.Code).ToList()
|
|
||||||
}).ToListAsync(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -12,8 +12,14 @@
|
|||||||
<ProjectReference Include="..\..\0_Framework\0_Framework.csproj" />
|
<ProjectReference Include="..\..\0_Framework\0_Framework.csproj" />
|
||||||
<ProjectReference Include="..\..\AccountManagement.Configuration\AccountManagement.Configuration.csproj" />
|
<ProjectReference Include="..\..\AccountManagement.Configuration\AccountManagement.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\PersonalContractingParty.Config\PersonalContractingParty.Config.csproj" />
|
<ProjectReference Include="..\..\PersonalContractingParty.Config\PersonalContractingParty.Config.csproj" />
|
||||||
|
<ProjectReference Include="..\..\ProgramManager\src\Infrastructure\GozareshgirProgramManager.Infrastructure\GozareshgirProgramManager.Infrastructure.csproj" />
|
||||||
<ProjectReference Include="..\..\Query.Bootstrapper\Query.Bootstrapper.csproj" />
|
<ProjectReference Include="..\..\Query.Bootstrapper\Query.Bootstrapper.csproj" />
|
||||||
<ProjectReference Include="..\..\WorkFlow\Infrastructure\WorkFlow.Infrastructure.Config\WorkFlow.Infrastructure.Config.csproj" />
|
<ProjectReference Include="..\..\WorkFlow\Infrastructure\WorkFlow.Infrastructure.Config\WorkFlow.Infrastructure.Config.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
|
||||||
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using _0_Framework.Application.Sms;
|
||||||
using Company.Domain.ContarctingPartyAgg;
|
using Company.Domain.ContarctingPartyAgg;
|
||||||
using Company.Domain.InstitutionContractAgg;
|
using Company.Domain.InstitutionContractAgg;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
@@ -11,20 +13,26 @@ public class JobSchedulerRegistrator
|
|||||||
private readonly IBackgroundJobClient _backgroundJobClient;
|
private readonly IBackgroundJobClient _backgroundJobClient;
|
||||||
private readonly SmsReminder _smsReminder;
|
private readonly SmsReminder _smsReminder;
|
||||||
private readonly IInstitutionContractRepository _institutionContractRepository;
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
|
private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository;
|
||||||
private static DateTime? _lastRunCreateTransaction;
|
private static DateTime? _lastRunCreateTransaction;
|
||||||
private static DateTime? _lastRunSendMonthlySms;
|
private static DateTime? _lastRunSendMonthlySms;
|
||||||
|
private readonly ISmsService _smsService;
|
||||||
|
private readonly ILogger<JobSchedulerRegistrator> _logger;
|
||||||
|
|
||||||
|
|
||||||
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository)
|
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger<JobSchedulerRegistrator> logger, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository)
|
||||||
{
|
{
|
||||||
_smsReminder = smsReminder;
|
_smsReminder = smsReminder;
|
||||||
_backgroundJobClient = backgroundJobClient;
|
_backgroundJobClient = backgroundJobClient;
|
||||||
_institutionContractRepository = institutionContractRepository;
|
_institutionContractRepository = institutionContractRepository;
|
||||||
|
_smsService = smsService;
|
||||||
|
_logger = logger;
|
||||||
|
_institutionContractSmsServiceRepository = institutionContractSmsServiceRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Register()
|
public void Register()
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("hangfire Started");
|
||||||
RecurringJob.AddOrUpdate(
|
RecurringJob.AddOrUpdate(
|
||||||
"InstitutionContract.CreateFinancialTransaction",
|
"InstitutionContract.CreateFinancialTransaction",
|
||||||
() => CreateFinancialTransaction(),
|
() => CreateFinancialTransaction(),
|
||||||
@@ -47,6 +55,49 @@ public class JobSchedulerRegistrator
|
|||||||
() => SendBlockSms(),
|
() => SendBlockSms(),
|
||||||
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
);
|
);
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendInstitutionContractConfirmSms",
|
||||||
|
() => SendInstitutionContractConfirmSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendWarningSms",
|
||||||
|
() => SendWarningSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendLegalActionSms",
|
||||||
|
() => SendLegalActionSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.Block",
|
||||||
|
() => Block(),
|
||||||
|
"*/30 * * * *" // هر 30 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.UnBlock",
|
||||||
|
() => UnBlock(),
|
||||||
|
"*/10 * * * *"
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.DeActiveInstitutionEndOfContract",
|
||||||
|
() => DeActiveInstitutionEndOfContract(),
|
||||||
|
"*/30 * * * *"
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.BlueDeActiveAfterZeroDebt",
|
||||||
|
() => BlueDeActiveAfterZeroDebt(),
|
||||||
|
"*/10 * * * *"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -60,7 +111,7 @@ public class JobSchedulerRegistrator
|
|||||||
var now = DateTime.Now;
|
var now = DateTime.Now;
|
||||||
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
||||||
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
||||||
|
_logger.LogInformation("CreateFinancialTransaction job run");
|
||||||
if (now.Date == endOfMonthGr.Date && now.Hour >= 2 && now.Hour < 4 &&
|
if (now.Date == endOfMonthGr.Date && now.Hour >= 2 && now.Hour < 4 &&
|
||||||
now.Date != _lastRunCreateTransaction?.Date)
|
now.Date != _lastRunCreateTransaction?.Date)
|
||||||
{
|
{
|
||||||
@@ -86,7 +137,7 @@ public class JobSchedulerRegistrator
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
//_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
|
await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,14 +156,14 @@ public class JobSchedulerRegistrator
|
|||||||
var now = DateTime.Now;
|
var now = DateTime.Now;
|
||||||
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
||||||
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
||||||
|
_logger.LogInformation("SendFirstDayOfMonthSms job run");
|
||||||
if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 &&
|
if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 &&
|
||||||
now.Date != _lastRunSendMonthlySms?.Date)
|
now.Date != _lastRunSendMonthlySms?.Date)
|
||||||
{
|
{
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendMonthlySms(now);
|
await _institutionContractSmsServiceRepository.SendMonthlySms(now);
|
||||||
_lastRunSendMonthlySms = now;
|
_lastRunSendMonthlySms = now;
|
||||||
Console.WriteLine("Send Monthly sms executed");
|
Console.WriteLine("Send Monthly sms executed");
|
||||||
|
|
||||||
@@ -133,7 +184,8 @@ public class JobSchedulerRegistrator
|
|||||||
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
||||||
public async System.Threading.Tasks.Task SendReminderSms()
|
public async System.Threading.Tasks.Task SendReminderSms()
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendReminderSmsForBackgroundTask();
|
_logger.LogInformation("SendReminderSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendReminderSmsForBackgroundTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -143,7 +195,110 @@ public class JobSchedulerRegistrator
|
|||||||
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
public async System.Threading.Tasks.Task SendBlockSms()
|
public async System.Threading.Tasks.Task SendBlockSms()
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendBlockSmsForBackgroundTask();
|
_logger.LogInformation("SendBlockSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendInstitutionContractConfirmSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendInstitutionContractConfirmSmsTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک هشدار
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendWarningSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendWarningSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendLegalActionSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendWarningSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بلاگ سازی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task Block()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("block job run");
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var executeDate = now.ToFarsi().Substring(8, 2);
|
||||||
|
if (executeDate == "20")
|
||||||
|
{
|
||||||
|
if (now.Hour >= 9 && now.Hour < 10)
|
||||||
|
{
|
||||||
|
await _institutionContractSmsServiceRepository.Block(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آنبلاک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task UnBlock()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("UnBlock job run");
|
||||||
|
|
||||||
|
await _institutionContractSmsServiceRepository.UnBlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیر فعال سازی قراداد های پایان یافته
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("DeActiveInstitutionEndOfContract job run");
|
||||||
|
|
||||||
|
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var executeDate = now.ToFarsi().Substring(8, 2);
|
||||||
|
if (executeDate == "01")
|
||||||
|
{
|
||||||
|
if (now.Hour >= 9 && now.Hour < 10)
|
||||||
|
{
|
||||||
|
await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیرفعال سازس قرارداد های آبی که بدهی ندارند
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 800)]
|
||||||
|
public async System.Threading.Tasks.Task BlueDeActiveAfterZeroDebt()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("BlueDeActiveAfterZeroDebt job run");
|
||||||
|
await _institutionContractSmsServiceRepository.BlueDeActiveAfterZeroDebt();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using GozareshgirProgramManager.Application.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
|
||||||
|
public class NullBoardNotificationPublisher:IBoardNotificationPublisher
|
||||||
|
{
|
||||||
|
public Task SendProjectStatusChanged(long userId, TaskSectionStatus oldStatus, TaskSectionStatus newStatus, Guid sectionId)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,13 +7,47 @@ using BackgroundInstitutionContract.Task;
|
|||||||
using BackgroundInstitutionContract.Task.Jobs;
|
using BackgroundInstitutionContract.Task.Jobs;
|
||||||
using CompanyManagment.App.Contracts.Hubs;
|
using CompanyManagment.App.Contracts.Hubs;
|
||||||
using CompanyManagment.EFCore.Services;
|
using CompanyManagment.EFCore.Services;
|
||||||
|
using GozareshgirProgramManager.Application._Bootstrapper;
|
||||||
|
using GozareshgirProgramManager.Application.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application.Modules.Users.Commands.CreateUser;
|
||||||
|
using GozareshgirProgramManager.Infrastructure;
|
||||||
|
using GozareshgirProgramManager.Infrastructure.Persistence.Seed;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
using PersonalContractingParty.Config;
|
using PersonalContractingParty.Config;
|
||||||
using Query.Bootstrapper;
|
using Query.Bootstrapper;
|
||||||
|
using Serilog;
|
||||||
|
using Serilog.Events;
|
||||||
|
using Shared.Contracts.PmUser.Queries;
|
||||||
using WorkFlow.Infrastructure.Config;
|
using WorkFlow.Infrastructure.Config;
|
||||||
|
|
||||||
|
var logDirectory = @"C:\Logs\Hangfire\BackgroundInstitutionContract\";
|
||||||
|
|
||||||
|
if (!Directory.Exists(logDirectory))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(logDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.Logger = new LoggerConfiguration()
|
||||||
|
//NO EF Core log
|
||||||
|
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
|
||||||
|
|
||||||
|
//NO DbCommand log
|
||||||
|
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning)
|
||||||
|
|
||||||
|
//NO Microsoft Public log
|
||||||
|
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
|
||||||
|
//.MinimumLevel.Information()
|
||||||
|
.WriteTo.File(
|
||||||
|
path: Path.Combine(logDirectory, "institution-contract-log-.txt"),
|
||||||
|
rollingInterval: RollingInterval.Day,
|
||||||
|
retainedFileCountLimit: 30,
|
||||||
|
shared: true,
|
||||||
|
outputTemplate:
|
||||||
|
"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"
|
||||||
|
).CreateLogger();
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
var hangfireConnectionString = builder.Configuration.GetConnectionString("HangfireDb");
|
var hangfireConnectionString = builder.Configuration.GetConnectionString("HangfireDb");
|
||||||
builder.Services.AddHangfire(x => x.UseSqlServerStorage(hangfireConnectionString));
|
builder.Services.AddHangfire(x => x.UseSqlServerStorage(hangfireConnectionString));
|
||||||
@@ -26,7 +60,7 @@ builder.Services.AddTransient<ISmsService, SmsService>();
|
|||||||
builder.Services.AddTransient<IUidService, UidService>();
|
builder.Services.AddTransient<IUidService, UidService>();
|
||||||
builder.Services.AddTransient<IFileUploader, FileUploader>();
|
builder.Services.AddTransient<IFileUploader, FileUploader>();
|
||||||
builder.Services.Configure<AppSettingConfiguration>(builder.Configuration);
|
builder.Services.Configure<AppSettingConfiguration>(builder.Configuration);
|
||||||
|
builder.Services.AddScoped<IBoardNotificationPublisher, NullBoardNotificationPublisher>();
|
||||||
#region MongoDb
|
#region MongoDb
|
||||||
|
|
||||||
var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
|
var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
|
||||||
@@ -38,17 +72,28 @@ builder.Services.AddSingleton<IMongoDatabase>(mongoDatabase);
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
builder.Services.AddProgramManagerApplication();
|
||||||
|
builder.Services.AddProgramManagerInfrastructure(builder.Configuration);
|
||||||
|
|
||||||
|
|
||||||
PersonalBootstrapper.Configure(builder.Services, connectionString);
|
PersonalBootstrapper.Configure(builder.Services, connectionString);
|
||||||
TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
|
TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
|
||||||
AccountManagementBootstrapper.Configure(builder.Services, connectionString);
|
AccountManagementBootstrapper.Configure(builder.Services, connectionString);
|
||||||
WorkFlowBootstrapper.Configure(builder.Services, connectionString);
|
WorkFlowBootstrapper.Configure(builder.Services, connectionString);
|
||||||
|
|
||||||
QueryBootstrapper.Configure(builder.Services);
|
QueryBootstrapper.Configure(builder.Services);
|
||||||
JobsBootstrapper.Configure(builder.Services);
|
JobsBootstrapper.Configure(builder.Services);
|
||||||
builder.Services.AddHttpClient();
|
builder.Services.AddHttpClient();
|
||||||
builder.Services.AddHttpContextAccessor();
|
builder.Services.AddHttpContextAccessor();
|
||||||
builder.Services.AddSignalR();
|
builder.Services.AddSignalR();
|
||||||
|
|
||||||
|
|
||||||
|
builder.Host.UseSerilog();
|
||||||
|
Log.Information("SERILOG STARTED SUCCESSFULLY");
|
||||||
|
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
app.MapHub<SendSmsHub>("/sendSmsHub");
|
app.MapHub<SendSmsHub>("/sendSmsHub");
|
||||||
|
|
||||||
app.MapHangfireDashboard();
|
app.MapHangfireDashboard();
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
|
|
||||||
//mahan Docker
|
//mahan Docker
|
||||||
//"MesbahDb": "Data Source=localhost,5069;Initial Catalog=mesbah_db;User ID=sa;Password=YourPassword123;TrustServerCertificate=True;",
|
//"MesbahDb": "Data Source=localhost,5069;Initial Catalog=mesbah_db;User ID=sa;Password=YourPassword123;TrustServerCertificate=True;",
|
||||||
//"HangfireDb": "Data Source=.;Initial Catalog=hangfire_db;Integrated Security=True;TrustServerCertificate=true;",
|
"HangfireDb": "Data Source=.;Initial Catalog=hangfire_db;Integrated Security=True;TrustServerCertificate=true;",
|
||||||
"HangfireDb": "Data Source=185.208.175.186;Initial Catalog=hangfire_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;"
|
//"HangfireDb": "Data Source=185.208.175.186;Initial Catalog=hangfire_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;"
|
||||||
},
|
},
|
||||||
|
|
||||||
"GoogleRecaptchaV3": {
|
"GoogleRecaptchaV3": {
|
||||||
|
|||||||
248
CONFIGURATION_SUMMARY.md
Normal file
248
CONFIGURATION_SUMMARY.md
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
# ✅ Docker Bind Mounts Configuration - Summary
|
||||||
|
|
||||||
|
## What Was Changed
|
||||||
|
|
||||||
|
### 1. docker-compose.yml
|
||||||
|
**Before:**
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
- ./ServiceHost/certs:/app/certs:ro
|
||||||
|
- app_storage:/app/Storage # ❌ Docker volume
|
||||||
|
- app_logs:/app/Logs # ❌ Docker volume
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
app_storage:
|
||||||
|
driver: local
|
||||||
|
app_logs:
|
||||||
|
driver: local
|
||||||
|
```
|
||||||
|
|
||||||
|
**After:**
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
# ✅ Bind mounts for production-critical data on Windows host
|
||||||
|
- ./ServiceHost/certs:/app/certs:ro
|
||||||
|
- D:/AppData/Faces:/app/Faces
|
||||||
|
- D:/AppData/Storage:/app/Storage
|
||||||
|
- D:/AppData/Logs:/app/Logs
|
||||||
|
|
||||||
|
# ✅ No volumes section needed
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. New Files Created
|
||||||
|
- `DOCKER_BIND_MOUNTS_SETUP.md` - Complete documentation
|
||||||
|
- `setup-bind-mounts.ps1` - Automated setup script
|
||||||
|
- `QUICK_REFERENCE.md` - Quick command reference
|
||||||
|
|
||||||
|
## Path Mapping
|
||||||
|
|
||||||
|
| Container (Linux paths) | Windows Host (forward slash) | Actual Windows Path |
|
||||||
|
|-------------------------|------------------------------|---------------------|
|
||||||
|
| `/app/Faces` | `D:/AppData/Faces` | `D:\AppData\Faces` |
|
||||||
|
| `/app/Storage` | `D:/AppData/Storage` | `D:\AppData\Storage`|
|
||||||
|
| `/app/Logs` | `D:/AppData/Logs` | `D:\AppData\Logs` |
|
||||||
|
|
||||||
|
**Note:** Docker Compose on Windows accepts both `D:/` and `D:\` but prefers forward slashes.
|
||||||
|
|
||||||
|
## Application Code Compatibility
|
||||||
|
|
||||||
|
Your application uses:
|
||||||
|
```csharp
|
||||||
|
Path.Combine(env.ContentRootPath, "Faces"); // → /app/Faces
|
||||||
|
Path.Combine(env.ContentRootPath, "Storage"); // → /app/Storage
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `env.ContentRootPath` = `/app` in the container.
|
||||||
|
|
||||||
|
✅ **No code changes required!** The bind mounts map directly to these paths.
|
||||||
|
|
||||||
|
## Setup Instructions
|
||||||
|
|
||||||
|
### Option 1: Automated Setup (Recommended)
|
||||||
|
```powershell
|
||||||
|
# Navigate to project directory
|
||||||
|
cd D:\GozareshgirOrginal\OriginalGozareshgir
|
||||||
|
|
||||||
|
# Run setup script with permissions
|
||||||
|
.\setup-bind-mounts.ps1 -GrantFullPermissions
|
||||||
|
|
||||||
|
# Start the application
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Option 2: Manual Setup
|
||||||
|
```powershell
|
||||||
|
# 1. Create directories
|
||||||
|
New-Item -ItemType Directory -Force -Path "D:\AppData\Faces"
|
||||||
|
New-Item -ItemType Directory -Force -Path "D:\AppData\Storage"
|
||||||
|
New-Item -ItemType Directory -Force -Path "D:\AppData\Logs"
|
||||||
|
|
||||||
|
# 2. Grant permissions
|
||||||
|
icacls "D:\AppData\Faces" /grant Everyone:F /T
|
||||||
|
icacls "D:\AppData\Storage" /grant Everyone:F /T
|
||||||
|
icacls "D:\AppData\Logs" /grant Everyone:F /T
|
||||||
|
|
||||||
|
# 3. Start the application
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Verification Checklist
|
||||||
|
|
||||||
|
After starting the container:
|
||||||
|
|
||||||
|
1. **Check if directories are mounted:**
|
||||||
|
```powershell
|
||||||
|
docker exec gozareshgir-servicehost ls -la /app
|
||||||
|
```
|
||||||
|
Should show: `Faces/`, `Storage/`, `Logs/`
|
||||||
|
|
||||||
|
2. **Test write access from container:**
|
||||||
|
```powershell
|
||||||
|
docker exec gozareshgir-servicehost sh -c "echo 'test' > /app/Storage/test.txt"
|
||||||
|
Get-Content D:\AppData\Storage\test.txt # Should display: test
|
||||||
|
Remove-Item D:\AppData\Storage\test.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Test write access from host:**
|
||||||
|
```powershell
|
||||||
|
"test from host" | Out-File "D:\AppData\Storage\host-test.txt"
|
||||||
|
docker exec gozareshgir-servicehost cat /app/Storage/host-test.txt
|
||||||
|
Remove-Item D:\AppData\Storage\host-test.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Check application logs:**
|
||||||
|
```powershell
|
||||||
|
docker logs gozareshgir-servicehost --tail 50
|
||||||
|
# Or directly on host:
|
||||||
|
Get-Content D:\AppData\Logs\gozareshgir_log.txt -Tail 50
|
||||||
|
```
|
||||||
|
|
||||||
|
## Data Persistence Guarantees
|
||||||
|
|
||||||
|
✅ **Files persist through:**
|
||||||
|
- `docker-compose down`
|
||||||
|
- `docker-compose restart`
|
||||||
|
- Container removal (`docker rm`)
|
||||||
|
- Image rebuilds (`docker-compose build`)
|
||||||
|
- Server reboots (with `restart: unless-stopped`)
|
||||||
|
|
||||||
|
✅ **Direct access:**
|
||||||
|
- Files can be accessed from Windows Explorer at `D:\AppData\*`
|
||||||
|
- Can be backed up using Windows Backup, robocopy, or any backup software
|
||||||
|
- Can be edited directly on the host (changes visible in container immediately)
|
||||||
|
|
||||||
|
⚠️ **Data does NOT survive:**
|
||||||
|
- Deleting the host directories (`D:\AppData\*`)
|
||||||
|
- Formatting the D: drive
|
||||||
|
- Without regular backups, hardware failures
|
||||||
|
|
||||||
|
## Production Checklist
|
||||||
|
|
||||||
|
Before deploying to production:
|
||||||
|
|
||||||
|
- [ ] Run `setup-bind-mounts.ps1 -GrantFullPermissions`
|
||||||
|
- [ ] Verify disk space on D: drive (at least 50 GB recommended)
|
||||||
|
- [ ] Set up scheduled backups (see `DOCKER_BIND_MOUNTS_SETUP.md`)
|
||||||
|
- [ ] Replace `Everyone` with specific service account for permissions
|
||||||
|
- [ ] Enable NTFS encryption for sensitive data (optional)
|
||||||
|
- [ ] Test container restart: `docker-compose restart`
|
||||||
|
- [ ] Test data persistence: Create a test file, restart container, verify file exists
|
||||||
|
- [ ] Configure monitoring for disk space usage
|
||||||
|
|
||||||
|
## Security Recommendations
|
||||||
|
|
||||||
|
1. **Restrict permissions** (production):
|
||||||
|
```powershell
|
||||||
|
# Replace Everyone with specific account
|
||||||
|
icacls "D:\AppData\Faces" /grant "DOMAIN\ServiceAccount:(OI)(CI)F" /T
|
||||||
|
icacls "D:\AppData\Storage" /grant "DOMAIN\ServiceAccount:(OI)(CI)F" /T
|
||||||
|
icacls "D:\AppData\Logs" /grant "DOMAIN\ServiceAccount:(OI)(CI)F" /T
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Enable encryption** for sensitive data:
|
||||||
|
```powershell
|
||||||
|
cipher /e "D:\AppData\Faces"
|
||||||
|
cipher /e "D:\AppData\Storage"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Set up audit logging:**
|
||||||
|
```powershell
|
||||||
|
auditpol /set /subcategory:"File System" /success:enable /failure:enable
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backup Strategy
|
||||||
|
|
||||||
|
### Scheduled Backup (Recommended)
|
||||||
|
```powershell
|
||||||
|
# Create daily backup at 2 AM
|
||||||
|
$action = New-ScheduledTaskAction -Execute "robocopy" -Argument '"D:\AppData" "D:\Backups\AppData" /MIR /Z /LOG:"D:\Backups\backup.log"'
|
||||||
|
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
|
||||||
|
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "GozareshgirBackup" -Description "Daily backup of Gozareshgir data"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Backup
|
||||||
|
```powershell
|
||||||
|
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
|
||||||
|
robocopy "D:\AppData" "D:\Backups\AppData_$timestamp" /MIR /Z
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Issue: Container starts but files not appearing
|
||||||
|
**Solution:**
|
||||||
|
```powershell
|
||||||
|
# Check mount points
|
||||||
|
docker inspect gozareshgir-servicehost --format='{{json .Mounts}}' | ConvertFrom-Json
|
||||||
|
|
||||||
|
# Verify directories exist
|
||||||
|
Test-Path D:\AppData\Faces
|
||||||
|
Test-Path D:\AppData\Storage
|
||||||
|
Test-Path D:\AppData\Logs
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue: Permission denied errors
|
||||||
|
**Solution:**
|
||||||
|
```powershell
|
||||||
|
# Re-grant permissions
|
||||||
|
icacls "D:\AppData\Faces" /grant Everyone:F /T
|
||||||
|
icacls "D:\AppData\Storage" /grant Everyone:F /T
|
||||||
|
icacls "D:\AppData\Logs" /grant Everyone:F /T
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue: Out of disk space
|
||||||
|
**Solution:**
|
||||||
|
```powershell
|
||||||
|
# Check disk usage
|
||||||
|
Get-ChildItem D:\AppData -Recurse | Measure-Object -Property Length -Sum
|
||||||
|
|
||||||
|
# Clean old log files (example: older than 30 days)
|
||||||
|
Get-ChildItem D:\AppData\Logs -Recurse -File | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} | Remove-Item
|
||||||
|
```
|
||||||
|
|
||||||
|
## Support & Documentation
|
||||||
|
|
||||||
|
- **Full Documentation:** `DOCKER_BIND_MOUNTS_SETUP.md`
|
||||||
|
- **Quick Reference:** `QUICK_REFERENCE.md`
|
||||||
|
- **Setup Script:** `setup-bind-mounts.ps1`
|
||||||
|
|
||||||
|
## Migration from Docker Volumes (If applicable)
|
||||||
|
|
||||||
|
If you previously used Docker volumes, migrate the data:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 1. Stop the container
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# 2. Copy data from old volumes to host
|
||||||
|
docker run --rm -v old_volume_name:/source -v D:/AppData/Storage:/dest alpine cp -av /source/. /dest/
|
||||||
|
|
||||||
|
# 3. Start with new bind mounts
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Configuration Date:** January 2026
|
||||||
|
**Tested On:** Windows Server 2019/2022 with Docker Desktop
|
||||||
|
**Status:** ✅ Production Ready
|
||||||
|
|
||||||
195
Company.Domain/CameraBugReportAgg/CameraBugReport.cs
Normal file
195
Company.Domain/CameraBugReportAgg/CameraBugReport.cs
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مدل دامنه برای گزارش خرابی دوربین
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReport
|
||||||
|
{
|
||||||
|
[BsonId]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
public CameraBugReport()
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid();
|
||||||
|
CreationDate = DateTime.Now;
|
||||||
|
Status = CameraBugReportStatus.Open;
|
||||||
|
Screenshots = new List<CameraBugReportScreenshot>();
|
||||||
|
Logs = new List<CameraBugReportLog>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CameraBugReport(
|
||||||
|
string title,
|
||||||
|
string description,
|
||||||
|
string userEmail,
|
||||||
|
string deviceModel,
|
||||||
|
string osVersion,
|
||||||
|
string manufacturer,
|
||||||
|
string buildNumber,
|
||||||
|
string appVersion,
|
||||||
|
string screenResolution,
|
||||||
|
bool isCharging,
|
||||||
|
int batteryLevel,
|
||||||
|
int storageInMB,
|
||||||
|
int memoryInMB,
|
||||||
|
string networkType,
|
||||||
|
string platform,
|
||||||
|
string deviceId,
|
||||||
|
string packageName,
|
||||||
|
DateTime installTime,
|
||||||
|
DateTime lastUpdateTime,
|
||||||
|
string flavor,
|
||||||
|
CameraBugReportType type,
|
||||||
|
CameraBugPriority priority,
|
||||||
|
long? accountId = null,
|
||||||
|
string stackTrace = null) : this()
|
||||||
|
|
||||||
|
{
|
||||||
|
Priority = priority;
|
||||||
|
Type = type;
|
||||||
|
Flavor = flavor;
|
||||||
|
LastUpdateTime = lastUpdateTime;
|
||||||
|
InstallTime = installTime;
|
||||||
|
PackageName = packageName;
|
||||||
|
BuildNumber = buildNumber;
|
||||||
|
AppVersion = appVersion;
|
||||||
|
NetworkType = networkType;
|
||||||
|
IsCharging = isCharging;
|
||||||
|
BatteryLevel = batteryLevel;
|
||||||
|
StorageInMB = storageInMB;
|
||||||
|
MemoryInMB = memoryInMB;
|
||||||
|
ScreenResolution = screenResolution;
|
||||||
|
DeviceId = deviceId;
|
||||||
|
Manufacturer = manufacturer;
|
||||||
|
Platform = platform;
|
||||||
|
OsVersion = osVersion;
|
||||||
|
DeviceModel = deviceModel;
|
||||||
|
AccountId = accountId;
|
||||||
|
UserEmail = userEmail;
|
||||||
|
Description = description;
|
||||||
|
Title = title;
|
||||||
|
StackTrace = stackTrace;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BsonElement("screenshots")]
|
||||||
|
public List<CameraBugReportScreenshot> Screenshots { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("logs")]
|
||||||
|
public List<CameraBugReportLog> Logs { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("updateDate")]
|
||||||
|
public DateTime? UpdateDate { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("creationDate")]
|
||||||
|
public DateTime CreationDate { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("stackTrace")]
|
||||||
|
public string StackTrace { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("status")]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
public CameraBugReportStatus Status { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("priority")]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
|
||||||
|
public CameraBugPriority Priority { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("type")]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
|
||||||
|
public CameraBugReportType Type { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("flavor")]
|
||||||
|
public string Flavor { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("lastUpdateTime")]
|
||||||
|
public DateTime LastUpdateTime { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("installTime")]
|
||||||
|
public DateTime InstallTime { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("packageName")]
|
||||||
|
public string PackageName { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("buildNumber")]
|
||||||
|
public string BuildNumber { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("appVersion")]
|
||||||
|
public string AppVersion { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("networkType")]
|
||||||
|
public string NetworkType { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("isCharging")]
|
||||||
|
public bool IsCharging { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("batteryLevel")]
|
||||||
|
public int BatteryLevel { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("storageInMB")]
|
||||||
|
public int StorageInMB { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("memoryInMB")]
|
||||||
|
public int MemoryInMB { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("screenResolution")]
|
||||||
|
public string ScreenResolution { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("deviceId")]
|
||||||
|
public string DeviceId { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("manufacturer")]
|
||||||
|
public string Manufacturer { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("platform")]
|
||||||
|
public string Platform { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("osVersion")]
|
||||||
|
public string OsVersion { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("deviceModel")]
|
||||||
|
public string DeviceModel { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("accountId")]
|
||||||
|
public long? AccountId { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("userEmail")]
|
||||||
|
public string UserEmail { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("description")]
|
||||||
|
public string Description { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("title")]
|
||||||
|
public string Title { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public void ChangeStatus(CameraBugReportStatus newStatus)
|
||||||
|
{
|
||||||
|
UpdateDate = DateTime.Now;
|
||||||
|
Status = newStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChangePriority(CameraBugPriority newPriority)
|
||||||
|
{
|
||||||
|
Priority = newPriority;
|
||||||
|
UpdateDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddScreenshot(string base64Data, string fileName)
|
||||||
|
{
|
||||||
|
Screenshots.Add(new CameraBugReportScreenshot
|
||||||
|
{ Base64Data = base64Data, FileName = fileName, UploadDate = DateTime.Now });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddLog(string logMessage)
|
||||||
|
{
|
||||||
|
Logs.Add(new CameraBugReportLog { Message = logMessage, Timestamp = DateTime.Now });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
20
Company.Domain/CameraBugReportAgg/CameraBugReportLog.cs
Normal file
20
Company.Domain/CameraBugReportAgg/CameraBugReportLog.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// لاگهای گزارش خرابی دوربین
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReportLog : EntityBase
|
||||||
|
{
|
||||||
|
// FK و navigation property حذف شد برای MongoDB
|
||||||
|
[BsonElement("message")]
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
[BsonElement("timestamp")]
|
||||||
|
public DateTime Timestamp { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// عکسهای ضمیمه شده به گزارش خرابی دوربین (Base64 encoded)
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReportScreenshot : EntityBase
|
||||||
|
{
|
||||||
|
// FK و navigation property حذف شد برای MongoDB
|
||||||
|
[BsonElement("base64Data")]
|
||||||
|
public string Base64Data { get; set; }
|
||||||
|
|
||||||
|
[BsonElement("fileName")]
|
||||||
|
public string FileName { get; set; }
|
||||||
|
|
||||||
|
[BsonElement("uploadDate")]
|
||||||
|
public DateTime UploadDate { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.InfraStructure;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// رابط انبار گزارش خرابی دوربین برای MongoDB
|
||||||
|
/// </summary>
|
||||||
|
public interface ICameraBugReportRepository
|
||||||
|
{
|
||||||
|
// Async methods for MongoDB operations
|
||||||
|
Task CreateAsync(CameraBugReport bugReport);
|
||||||
|
Task UpdateAsync(CameraBugReport bugReport);
|
||||||
|
Task<CameraBugReport> GetByIdAsync(Guid id);
|
||||||
|
Task<List<CameraBugReport>> GetAllAsync();
|
||||||
|
Task<List<CameraBugReport>> GetAllAsync(int skip, int take);
|
||||||
|
Task DeleteAsync(Guid id);
|
||||||
|
Task<bool> IsExistAsync(Guid id);
|
||||||
|
Task<List<CameraBugReport>> FilterAsync(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null,
|
||||||
|
int skip = 0,
|
||||||
|
int take = 10);
|
||||||
|
Task<int> CountAsync(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null);
|
||||||
|
}
|
||||||
@@ -31,7 +31,7 @@ public class Checkout : EntityBase
|
|||||||
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
||||||
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
||||||
ICollection<CheckoutLoanInstallment> loanInstallments,
|
ICollection<CheckoutLoanInstallment> loanInstallments,
|
||||||
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList)
|
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList, ICollection<CheckoutReward> rewards,double rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -71,7 +71,7 @@ public class Checkout : EntityBase
|
|||||||
TotalClaims = totalClaims;
|
TotalClaims = totalClaims;
|
||||||
TotalDeductions = totalDeductions;
|
TotalDeductions = totalDeductions;
|
||||||
TotalPayment = totalPayment;
|
TotalPayment = totalPayment;
|
||||||
RewardPay = 0;
|
RewardPay = rewardPay;
|
||||||
IsActiveString = "true";
|
IsActiveString = "true";
|
||||||
Signature = signature;
|
Signature = signature;
|
||||||
MarriedAllowance = marriedAllowance;
|
MarriedAllowance = marriedAllowance;
|
||||||
@@ -93,6 +93,7 @@ public class Checkout : EntityBase
|
|||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
EmployeeMandatoryHours = employeeMandatoryHours;
|
EmployeeMandatoryHours = employeeMandatoryHours;
|
||||||
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
||||||
|
Rewards = rewards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -130,7 +131,7 @@ public class Checkout : EntityBase
|
|||||||
public double BonusesPay { get; private set; }
|
public double BonusesPay { get; private set; }
|
||||||
public double YearsPay { get; private set; }
|
public double YearsPay { get; private set; }
|
||||||
public double LeavePay { get; private set; }
|
public double LeavePay { get; private set; }
|
||||||
public double? RewardPay { get; private set; }
|
public double RewardPay { get; private set; }
|
||||||
public double InsuranceDeduction { get; private set; }
|
public double InsuranceDeduction { get; private set; }
|
||||||
public double TaxDeducation { get; private set; }
|
public double TaxDeducation { get; private set; }
|
||||||
public double InstallmentDeduction { get; private set; }
|
public double InstallmentDeduction { get; private set; }
|
||||||
@@ -223,6 +224,8 @@ public class Checkout : EntityBase
|
|||||||
|
|
||||||
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
||||||
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
||||||
|
|
||||||
|
public ICollection<CheckoutReward> Rewards { get; set; } = [];
|
||||||
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -239,7 +242,7 @@ public class Checkout : EntityBase
|
|||||||
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
||||||
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
||||||
, string archiveCode, string personnelCode,
|
, string archiveCode, string personnelCode,
|
||||||
string totalClaims, string totalDeductions, double totalPayment, double? rewardPay)
|
string totalClaims, string totalDeductions, double totalPayment, double rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -337,6 +340,11 @@ public class Checkout : EntityBase
|
|||||||
InstallmentDeduction = installmentsAmount;
|
InstallmentDeduction = installmentsAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetReward(ICollection<CheckoutReward> rewards, double rewardAmount)
|
||||||
|
{
|
||||||
|
RewardPay = rewardAmount;
|
||||||
|
Rewards = rewards;
|
||||||
|
}
|
||||||
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
||||||
{
|
{
|
||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
|
|||||||
57
Company.Domain/CheckoutAgg/ValueObjects/CheckoutReward.cs
Normal file
57
Company.Domain/CheckoutAgg/ValueObjects/CheckoutReward.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Company.Domain.CheckoutAgg.ValueObjects;
|
||||||
|
|
||||||
|
public class CheckoutReward
|
||||||
|
{
|
||||||
|
public CheckoutReward(string amount, double amountDouble, string grantDateFa, DateTime grantDateGr, string description, string title, long entityId)
|
||||||
|
{
|
||||||
|
Amount = amount;
|
||||||
|
AmountDouble = amountDouble;
|
||||||
|
GrantDateFa = grantDateFa;
|
||||||
|
GrantDateGr = grantDateGr;
|
||||||
|
Description = description;
|
||||||
|
Title = title;
|
||||||
|
EntityId = entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ پاداش
|
||||||
|
/// string
|
||||||
|
/// </summary>
|
||||||
|
public string Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ پاداش
|
||||||
|
/// double
|
||||||
|
/// </summary>
|
||||||
|
public double AmountDouble { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اعطاء
|
||||||
|
/// شمسی
|
||||||
|
/// </summary>
|
||||||
|
public string GrantDateFa { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اعطاء
|
||||||
|
/// میلادی
|
||||||
|
/// </summary>
|
||||||
|
public DateTime GrantDateGr { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// توضیحات
|
||||||
|
/// </summary>
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// عنوان
|
||||||
|
/// </summary>
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی پاداش
|
||||||
|
/// </summary>
|
||||||
|
public long EntityId { get; set; }
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
using System;
|
||||||
|
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
@@ -32,7 +33,9 @@ public interface IPersonalContractingPartyRepository :IRepository<long, Personal
|
|||||||
List<PersonalContractingPartyViewModel> SearchForMain(PersonalContractingPartySearchModel searchModel2);
|
List<PersonalContractingPartyViewModel> SearchForMain(PersonalContractingPartySearchModel searchModel2);
|
||||||
OperationResult DeletePersonalContractingParties(long id);
|
OperationResult DeletePersonalContractingParties(long id);
|
||||||
bool GetHasContract(long id);
|
bool GetHasContract(long id);
|
||||||
|
[Obsolete("از متدهای async استفاده کنید")]
|
||||||
OperationResult DeActiveAll(long id);
|
OperationResult DeActiveAll(long id);
|
||||||
|
[Obsolete("از متدهای async استفاده کنید")]
|
||||||
OperationResult ActiveAll(long id);
|
OperationResult ActiveAll(long id);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -76,4 +79,9 @@ public interface IPersonalContractingPartyRepository :IRepository<long, Personal
|
|||||||
|
|
||||||
Task<PersonalContractingParty> GetByNationalCode(string nationalCode);
|
Task<PersonalContractingParty> GetByNationalCode(string nationalCode);
|
||||||
Task<PersonalContractingParty> GetByNationalId(string registerId);
|
Task<PersonalContractingParty> GetByNationalId(string registerId);
|
||||||
|
|
||||||
|
Task<OperationResult> DeActiveAllAsync(long id);
|
||||||
|
Task<OperationResult> ActiveAllAsync(long id);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -48,6 +48,10 @@ public interface IContractRepository : IRepository<long, Contract>
|
|||||||
bool Remove(long id);
|
bool Remove(long id);
|
||||||
|
|
||||||
List<ContractViweModel> SearchForClient(ContractSearchModel searchModel);
|
List<ContractViweModel> SearchForClient(ContractSearchModel searchModel);
|
||||||
|
|
||||||
|
Task<PagedResult<GetContractListForClientResponse>> GetContractListForClient(GetContractListForClientRequest searchModel);
|
||||||
|
|
||||||
|
Task<List<ContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
||||||
#endregion
|
#endregion
|
||||||
#region NewChangeByHeydari
|
#region NewChangeByHeydari
|
||||||
|
|
||||||
@@ -63,4 +67,8 @@ public interface IContractRepository : IRepository<long, Contract>
|
|||||||
ContractViweModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime startOfMonth, DateTime endOfMonth);
|
ContractViweModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime startOfMonth, DateTime endOfMonth);
|
||||||
List<ContractViweModel> GetByWorkshopIdInDates(long workshopId, DateTime contractStart, DateTime contractEnd);
|
List<ContractViweModel> GetByWorkshopIdInDates(long workshopId, DateTime contractStart, DateTime contractEnd);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ public interface IEmployeeRepository : IRepository<long, Employee>
|
|||||||
#region Api
|
#region Api
|
||||||
Task<List<EmployeeSelectListViewModel>> GetSelectList(string searchText,long id);
|
Task<List<EmployeeSelectListViewModel>> GetSelectList(string searchText,long id);
|
||||||
Task<List<GetEmployeeListViewModel>> GetList(GetEmployeeListSearchModel searchModel);
|
Task<List<GetEmployeeListViewModel>> GetList(GetEmployeeListSearchModel searchModel);
|
||||||
|
Task<List<GetClientEmployeeListViewModel>> GetClientEmployeeList(GetClientEmployeeListSearchModel searchModel, long workshopId);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,4 +10,6 @@ public interface IFinancialInvoiceRepository : IRepository<long, FinancialInvoic
|
|||||||
EditFinancialInvoice GetDetails(long id);
|
EditFinancialInvoice GetDetails(long id);
|
||||||
List<FinancialInvoiceViewModel> Search(FinancialInvoiceSearchModel searchModel);
|
List<FinancialInvoiceViewModel> Search(FinancialInvoiceSearchModel searchModel);
|
||||||
Task<FinancialInvoice> GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
|
Task<FinancialInvoice> GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
|
||||||
|
Task<FinancialInvoice> GetUnPaidFinancialInvoiceByContractingPartyIdAndAmount(long contractingPartyId,
|
||||||
|
double amount);
|
||||||
}
|
}
|
||||||
@@ -56,9 +56,13 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
void UpdateStatusIfNeeded(long institutionContractId);
|
void UpdateStatusIfNeeded(long institutionContractId);
|
||||||
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
||||||
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
||||||
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request);
|
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request, string contractStart = null);
|
||||||
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
||||||
|
|
||||||
|
#region Creation
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Extension
|
#region Extension
|
||||||
|
|
||||||
@@ -87,60 +91,7 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
Task<List<InstitutionContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
Task<List<InstitutionContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
||||||
|
|
||||||
|
|
||||||
#region ReminderSMS
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست - ارسال پیامک
|
|
||||||
/// فراخوانی از سمت بک گراند سرویس
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<bool> SendReminderSmsForBackgroundTask();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک صورت حساب ماهانه
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="now"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendMonthlySms(DateTime now);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک مسدودی از طرف بک گراند سرویس
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendBlockSmsForBackgroundTask();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست واجد شرایط بلاک
|
|
||||||
/// جهت ارسال پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="checkDate"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<BlockSmsListData>> GetBlockListData(DateTime checkDate);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="smsListData"></param>
|
|
||||||
/// <param name="typeOfSms"></param>
|
|
||||||
/// <param name="sendMessStart"></param>
|
|
||||||
/// <param name="sendMessEnd"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendBlockSmsToContractingParties(List<BlockSmsListData> smsListData, string typeOfSms,
|
|
||||||
string sendMessStart, string sendMessEnd);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///دریافت لیست بدهکارن
|
|
||||||
/// جهت ارسال پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SmsListData>> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک های یاد آور بدهی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region CreateMontlyTransaction
|
#region CreateMontlyTransaction
|
||||||
|
|
||||||
@@ -153,5 +104,21 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Task<long> GetIdByInstallmentId(long installmentId);
|
Task<long> GetIdByInstallmentId(long installmentId);
|
||||||
|
Task<InstitutionContract> GetPreviousContract(long currentInstitutionContractId);
|
||||||
|
Task<InstitutionContractCreationInquiryResult> CreationInquiry(InstitutionContractCreationInquiryRequest request);
|
||||||
|
Task<InstitutionContractCreationWorkshopsResponse> GetCreationWorkshops(InstitutionContractCreationWorkshopsRequest request);
|
||||||
|
Task<InstitutionContractCreationPlanResponse> GetCreationInstitutionPlan(InstitutionContractCreationPlanRequest request);
|
||||||
|
Task<InstitutionContractCreationPaymentResponse> GetCreationPaymentMethod(InstitutionContractCreationPaymentRequest request);
|
||||||
|
Task<InstitutionContractDiscountResponse> SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request);
|
||||||
|
Task<InstitutionContractDiscountResponse> ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request);
|
||||||
|
Task<OperationResult> CreationComplete(InstitutionContractExtensionCompleteRequest request);
|
||||||
|
Task<InstitutionContract> GetIncludeInstallments(long id);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractAgg;
|
||||||
|
|
||||||
|
public interface IInstitutionContractSmsServiceRepository : IRepository<long, InstitutionContract>
|
||||||
|
{
|
||||||
|
#region reminderSMs
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendInstitutionContractConfirmSmsTask();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//هشدار و اقدام قضایی
|
||||||
|
#region WarningOrLegalActionSmsListData
|
||||||
|
/// <summary>
|
||||||
|
/// اجرای تسک پیامک هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست بدهکاران آبی جهت هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsListData>> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="smsListData"></param>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendWarningOrLegalActionSms(List<SmsListData> smsListData, TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//بلاک - آنبلاک - پیامک بلاک -
|
||||||
|
// غیر فعال سازی قراداد های پایان یافته
|
||||||
|
#region Block
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک مسدودی از طرف بک گراند سرویس
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendBlockSmsForBackgroundTask();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست واجد شرایط بلاک
|
||||||
|
/// جهت ارسال پیامک مسدودی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<BlockSmsListData>> GetBlockListData(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک مسدودی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="smsListData"></param>
|
||||||
|
/// <param name="typeOfSms"></param>
|
||||||
|
/// <param name="sendMessStart"></param>
|
||||||
|
/// <param name="sendMessEnd"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendBlockSmsToContractingParties(List<BlockSmsListData> smsListData, string typeOfSms,
|
||||||
|
string sendMessStart, string sendMessEnd);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بلاک سازی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task Block(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست بدهکارانی که باید بلاک شوند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<long>> GetToBeBlockList(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آنبلاک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task UnBlock();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیر فعالسازی قرارداد های پایان یافته
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task DeActiveInstitutionEndOfContract(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیرفعال سازس قرارداد های آبی که بدهی ندارند
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task BlueDeActiveAfterZeroDebt();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region ReminderSMS
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست - ارسال پیامک
|
||||||
|
/// فراخوانی از سمت بک گراند سرویس
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> SendReminderSmsForBackgroundTask();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک صورت حساب ماهانه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="now"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendMonthlySms(DateTime now);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///دریافت لیست بدهکارن
|
||||||
|
/// جهت ارسال پیامک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsListData>> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک های یاد آور بدهی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -98,6 +98,11 @@ public class InstitutionContract : EntityBase
|
|||||||
// مبلغ قرارداد
|
// مبلغ قرارداد
|
||||||
public double ContractAmount { get; private set; }
|
public double ContractAmount { get; private set; }
|
||||||
|
|
||||||
|
public double ContractAmountWithTax => !IsOldContract ? ContractAmount + ContractAmountTax
|
||||||
|
: ContractAmount;
|
||||||
|
|
||||||
|
public double ContractAmountTax => ContractAmount*0.10;
|
||||||
|
|
||||||
//خسارت روزانه
|
//خسارت روزانه
|
||||||
public double DailyCompenseation { get; private set; }
|
public double DailyCompenseation { get; private set; }
|
||||||
|
|
||||||
@@ -159,6 +164,10 @@ public class InstitutionContract : EntityBase
|
|||||||
|
|
||||||
public List<InstitutionContractAmendment> Amendments { get; private set; }
|
public List<InstitutionContractAmendment> Amendments { get; private set; }
|
||||||
|
|
||||||
|
public InstitutionContractSigningType? SigningType { get; private set; }
|
||||||
|
|
||||||
|
public bool IsOldContract => LawId== 0;
|
||||||
|
|
||||||
public InstitutionContract()
|
public InstitutionContract()
|
||||||
{
|
{
|
||||||
ContactInfoList = [];
|
ContactInfoList = [];
|
||||||
@@ -262,6 +271,10 @@ public class InstitutionContract : EntityBase
|
|||||||
{
|
{
|
||||||
WorkshopGroup = null;
|
WorkshopGroup = null;
|
||||||
}
|
}
|
||||||
|
public void SetSigningType(InstitutionContractSigningType signingType)
|
||||||
|
{
|
||||||
|
SigningType = signingType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractAmendment : EntityBase
|
public class InstitutionContractAmendment : EntityBase
|
||||||
|
|||||||
@@ -10,13 +10,15 @@ public class InstitutionContractWorkshopCurrent:InstitutionContractWorkshopBase
|
|||||||
public InstitutionContractWorkshopCurrent(string workshopName, bool hasRollCallPlan,
|
public InstitutionContractWorkshopCurrent(string workshopName, bool hasRollCallPlan,
|
||||||
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
||||||
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
||||||
int personnelCount, double price,long institutionContractWorkshopGroupId,InstitutionContractWorkshopGroup workshopGroup,long workshopId) : base(workshopName, hasRollCallPlan,
|
int personnelCount, double price,long institutionContractWorkshopGroupId,
|
||||||
|
InstitutionContractWorkshopGroup workshopGroup,long workshopId,long initialWorkshopId) : base(workshopName, hasRollCallPlan,
|
||||||
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan,
|
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan,
|
||||||
hasContractPlanInPerson, hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price)
|
hasContractPlanInPerson, hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price)
|
||||||
{
|
{
|
||||||
InstitutionContractWorkshopGroupId = institutionContractWorkshopGroupId;
|
InstitutionContractWorkshopGroupId = institutionContractWorkshopGroupId;
|
||||||
WorkshopGroup = workshopGroup;
|
WorkshopGroup = workshopGroup;
|
||||||
WorkshopId = workshopId;
|
WorkshopId = workshopId;
|
||||||
|
InitialWorkshopId = initialWorkshopId;
|
||||||
}
|
}
|
||||||
public long InstitutionContractWorkshopGroupId { get; private set; }
|
public long InstitutionContractWorkshopGroupId { get; private set; }
|
||||||
public InstitutionContractWorkshopGroup WorkshopGroup { get; private set; }
|
public InstitutionContractWorkshopGroup WorkshopGroup { get; private set; }
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ public class InstitutionContractWorkshopGroup : EntityBase
|
|||||||
!InitialWorkshops.Cast<InstitutionContractWorkshopBase>()
|
!InitialWorkshops.Cast<InstitutionContractWorkshopBase>()
|
||||||
.SequenceEqual(CurrentWorkshops.Cast<InstitutionContractWorkshopBase>());
|
.SequenceEqual(CurrentWorkshops.Cast<InstitutionContractWorkshopBase>());
|
||||||
|
|
||||||
|
public bool IsInPersonContract => InitialWorkshops.Any(x => x.Services.ContractInPerson);
|
||||||
|
|
||||||
public InstitutionContractWorkshopGroup(long institutionContractId,
|
public InstitutionContractWorkshopGroup(long institutionContractId,
|
||||||
List<InstitutionContractWorkshopInitial> initialDetails)
|
List<InstitutionContractWorkshopInitial> initialDetails)
|
||||||
{
|
{
|
||||||
@@ -37,4 +39,10 @@ public class InstitutionContractWorkshopGroup : EntityBase
|
|||||||
CurrentWorkshops = updatedDetails.ToList();
|
CurrentWorkshops = updatedDetails.ToList();
|
||||||
LastModifiedDate = DateTime.Now;
|
LastModifiedDate = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddCurrentWorkshop(InstitutionContractWorkshopCurrent currentWorkshop)
|
||||||
|
{
|
||||||
|
CurrentWorkshops.Add(currentWorkshop);
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ public class InstitutionContractWorkshopInitial:InstitutionContractWorkshopBase
|
|||||||
WorkshopCreated = true;
|
WorkshopCreated = true;
|
||||||
WorkshopCurrent = new InstitutionContractWorkshopCurrent(WorkshopName,Services.RollCall,Services.RollCallInPerson,
|
WorkshopCurrent = new InstitutionContractWorkshopCurrent(WorkshopName,Services.RollCall,Services.RollCallInPerson,
|
||||||
Services.CustomizeCheckout,Services.Contract,Services.ContractInPerson,Services.Insurance,
|
Services.CustomizeCheckout,Services.Contract,Services.ContractInPerson,Services.Insurance,
|
||||||
Services.InsuranceInPerson,PersonnelCount,Price,InstitutionContractWorkshopGroupId,WorkshopGroup,workshopId);
|
Services.InsuranceInPerson,PersonnelCount,Price,InstitutionContractWorkshopGroupId,WorkshopGroup,workshopId,id);
|
||||||
WorkshopCurrent.SetEmployers(Employers.Select(x=>x.EmployerId).ToList());
|
WorkshopCurrent.SetEmployers(Employers.Select(x=>x.EmployerId).ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,340 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
||||||
|
using MongoDB.Bson;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractCreationTempAgg;
|
||||||
|
|
||||||
|
public class InstitutionContractCreationTemp
|
||||||
|
{
|
||||||
|
public InstitutionContractCreationTemp()
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid();
|
||||||
|
}
|
||||||
|
|
||||||
|
[BsonId] // Specifies this field as the _id in MongoDB
|
||||||
|
[BsonRepresentation(BsonType.String)] // Ensures the GUID is stored as a string
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نوع حقوقی طرف قرارداد (حقیقی یا حقوقی)
|
||||||
|
/// </summary>
|
||||||
|
public LegalType ContractingPartyLegalType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// اطلاعات شخص حقیقی
|
||||||
|
/// </summary>
|
||||||
|
public InstitutionContractCreationTempRealParty RealParty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// اطلاعات شخص حقوقی
|
||||||
|
/// </summary>
|
||||||
|
public InstitutionContractCreationTempLegalParty LegalParty { get; set; }
|
||||||
|
|
||||||
|
public string Address { get; set; }
|
||||||
|
public string City { get; set; }
|
||||||
|
public string Province { get; set; }
|
||||||
|
public List<EditContactInfo> ContactInfos { get; set; }
|
||||||
|
public long RepresentativeId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public List<InstitutionContractCreationTempWorkshop> Workshops { get; set; }
|
||||||
|
|
||||||
|
public InstitutionContractCreationPlanDetail OneMonth { get; set; }
|
||||||
|
public InstitutionContractCreationPlanDetail ThreeMonths { get; set; }
|
||||||
|
public InstitutionContractCreationPlanDetail SixMonths { get; set; }
|
||||||
|
public InstitutionContractCreationPlanDetail TwelveMonths { get; set; }
|
||||||
|
public InstitutionContractPaymentMonthlyViewModel MonthlyPayment { get; set; }
|
||||||
|
public InstitutionContractPaymentOneTimeViewModel OneTimePayment { get; set; }
|
||||||
|
|
||||||
|
public bool HasContractInPerson { get; set; }
|
||||||
|
|
||||||
|
public InstitutionContractDuration? Duration { get; set; }
|
||||||
|
|
||||||
|
public void SetContractingPartyInfo(LegalType legalType,
|
||||||
|
InstitutionContractCreationTempRealParty realParty,
|
||||||
|
InstitutionContractCreationTempLegalParty legalParty)
|
||||||
|
{
|
||||||
|
ContractingPartyLegalType = legalType;
|
||||||
|
RealParty = realParty;
|
||||||
|
LegalParty = legalParty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetWorkshopsAndPlanAmounts(List<InstitutionContractCreationTempWorkshop> workshops,
|
||||||
|
InstitutionContractCreationPlanDetail oneMonth,
|
||||||
|
InstitutionContractCreationPlanDetail threeMonth, InstitutionContractCreationPlanDetail sixMonth,
|
||||||
|
InstitutionContractCreationPlanDetail twelveMonth, bool hasContractInPerson)
|
||||||
|
{
|
||||||
|
Workshops = workshops;
|
||||||
|
OneMonth = oneMonth;
|
||||||
|
ThreeMonths = threeMonth;
|
||||||
|
SixMonths = sixMonth;
|
||||||
|
TwelveMonths = twelveMonth;
|
||||||
|
HasContractInPerson = hasContractInPerson;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAmountAndDuration(InstitutionContractDuration duration,InstitutionContractPaymentMonthlyViewModel monthly,
|
||||||
|
InstitutionContractPaymentOneTimeViewModel oneTime)
|
||||||
|
{
|
||||||
|
Duration = duration;
|
||||||
|
MonthlyPayment = monthly;
|
||||||
|
OneTimePayment = oneTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SetContractingPartyContactInfo(string address, string city, string province, List<EditContactInfo> requestContactInfos,long representativeId)
|
||||||
|
{
|
||||||
|
Address = address;
|
||||||
|
City = city;
|
||||||
|
Province = province;
|
||||||
|
ContactInfos = requestContactInfos;
|
||||||
|
RepresentativeId = representativeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InstitutionContractCreationTempLegalParty
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// آیدی طرف حساب در صورتی که از قبل ایجاد شده باشد
|
||||||
|
/// </summary>
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام شرکت
|
||||||
|
/// </summary>
|
||||||
|
public string CompanyName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره ثبت
|
||||||
|
/// </summary>
|
||||||
|
public string RegisterId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه ملی شرکت
|
||||||
|
/// </summary>
|
||||||
|
public string NationalId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره تلفن شرکت
|
||||||
|
/// </summary>
|
||||||
|
public string PhoneNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه موقت طرف قرارداد
|
||||||
|
/// </summary>
|
||||||
|
public long ContractingPartyTempId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// کد ملی نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public string NationalCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ تولد نماینده قانونی فارسی
|
||||||
|
/// </summary>
|
||||||
|
public string BirthDateFa { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public string FName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام خانوادگی نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public string LName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام پدر نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public string FatherName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره شناسنامه نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public string IdNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// وضعیت احراز هویت نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public bool IsAuth { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سمت نماینده قانونی در شرکت
|
||||||
|
/// </summary>
|
||||||
|
public string Position { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جنسیت نماینده قانونی
|
||||||
|
/// </summary>
|
||||||
|
public Gender Gender { get; set; }
|
||||||
|
|
||||||
|
public string IdNumberSeri { get; set; }
|
||||||
|
|
||||||
|
public string IdNumberSerial { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InstitutionContractCreationTempRealParty
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// آیدی طرف حساب در صورتی که از قبل ایجاد شده باشد
|
||||||
|
/// </summary>
|
||||||
|
public long Id { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// کد ملی
|
||||||
|
/// </summary>
|
||||||
|
public string NationalCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ تولد فارسی
|
||||||
|
/// </summary>
|
||||||
|
public string BirthDateFa { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره تلفن
|
||||||
|
/// </summary>
|
||||||
|
public string PhoneNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// وضعیت احراز هویت
|
||||||
|
/// </summary>
|
||||||
|
public bool IsAuth { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام
|
||||||
|
/// </summary>
|
||||||
|
public string FName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام خانوادگی
|
||||||
|
/// </summary>
|
||||||
|
public string LName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام پدر
|
||||||
|
/// </summary>
|
||||||
|
public string FatherName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره شناسنامه
|
||||||
|
/// </summary>
|
||||||
|
public string IdNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه موقت طرف قرارداد
|
||||||
|
/// </summary>
|
||||||
|
public long ContractingPartyTempId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جنسیت
|
||||||
|
/// </summary>
|
||||||
|
public Gender Gender { get; set; }
|
||||||
|
|
||||||
|
public string IdNumberSeri { get; set; }
|
||||||
|
|
||||||
|
public string IdNumberSerial { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InstitutionContractCreationTempPlan
|
||||||
|
{
|
||||||
|
public InstitutionContractCreationTempPlan(string contractStart, string contractEnd,
|
||||||
|
string oneMonthPaymentDiscounted, string oneMonthDiscount, string oneMonthOriginalPayment,
|
||||||
|
string totalPayment, string dailyCompensation, string obligation)
|
||||||
|
{
|
||||||
|
ContractStart = contractStart;
|
||||||
|
ContractEnd = contractEnd;
|
||||||
|
OneMonthPaymentDiscounted = oneMonthPaymentDiscounted;
|
||||||
|
OneMonthDiscount = oneMonthDiscount;
|
||||||
|
OneMonthOriginalPayment = oneMonthOriginalPayment;
|
||||||
|
TotalPayment = totalPayment;
|
||||||
|
DailyCompensation = dailyCompensation;
|
||||||
|
Obligation = obligation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ContractStart { get; set; }
|
||||||
|
public string ContractEnd { get; set; }
|
||||||
|
public string OneMonthPaymentDiscounted { get; set; }
|
||||||
|
public string OneMonthDiscount { get; set; }
|
||||||
|
public string OneMonthOriginalPayment { get; set; }
|
||||||
|
public string TotalPayment { get; set; }
|
||||||
|
public string DailyCompensation { get; set; }
|
||||||
|
public string Obligation { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InstitutionContractCreationTempWorkshop
|
||||||
|
{
|
||||||
|
public InstitutionContractCreationTempWorkshop(string workshopName, int countPerson, bool contractAndCheckout, bool contractAndCheckoutInPerson,
|
||||||
|
bool insurance, bool insuranceInPerson,
|
||||||
|
bool rollCall,bool rollCallInPerson, bool customizeCheckout,double price,long workshopId)
|
||||||
|
{
|
||||||
|
WorkshopName = workshopName;
|
||||||
|
CountPerson = countPerson;
|
||||||
|
ContractAndCheckout = contractAndCheckout;
|
||||||
|
Insurance = insurance;
|
||||||
|
RollCall = rollCall;
|
||||||
|
CustomizeCheckout = customizeCheckout;
|
||||||
|
ContractAndCheckoutInPerson = contractAndCheckoutInPerson;
|
||||||
|
InsuranceInPerson = insuranceInPerson;
|
||||||
|
RollCallInPerson = rollCallInPerson;
|
||||||
|
Price = price;
|
||||||
|
WorkshopId = workshopId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long WorkshopId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام کارگاه
|
||||||
|
/// </summary>
|
||||||
|
public string WorkshopName { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تعداد پرسنل
|
||||||
|
/// </summary>
|
||||||
|
public int CountPerson { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
#region ServiceSelection
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// قرارداد و تصفیه
|
||||||
|
/// </summary>
|
||||||
|
public bool ContractAndCheckout { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بیمه
|
||||||
|
/// </summary>
|
||||||
|
public bool Insurance { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// حضورغباب
|
||||||
|
/// </summary>
|
||||||
|
public bool RollCall { get; private set; }
|
||||||
|
|
||||||
|
public bool RollCallInPerson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// فیش غیر رسمی
|
||||||
|
/// </summary>
|
||||||
|
public bool CustomizeCheckout { get;private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// خدمات حضوری قرداد و تصفیه
|
||||||
|
/// </summary>
|
||||||
|
public bool ContractAndCheckoutInPerson { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// خدمات حضوری بیمه
|
||||||
|
/// </summary>
|
||||||
|
public bool InsuranceInPerson { get; private set; }
|
||||||
|
|
||||||
|
public double Price{ get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interface برای Repository مربوط به فلگ ارسال قرارداد
|
||||||
|
/// </summary>
|
||||||
|
public interface IInstitutionContractSendFlagRepository
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد یک رکورد جدید برای فلگ ارسال قرارداد
|
||||||
|
/// </summary>
|
||||||
|
Task Create(InstitutionContractSendFlag flag);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بازیابی فلگ بر اساس شناسه قرارداد
|
||||||
|
/// </summary>
|
||||||
|
Task<InstitutionContractSendFlag> GetByContractId(long contractId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بهروزرسانی فلگ ارسال
|
||||||
|
/// </summary>
|
||||||
|
Task Update(InstitutionContractSendFlag flag);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بررسی اینکه آیا قرارداد ارسال شده است
|
||||||
|
/// </summary>
|
||||||
|
Task<bool> IsContractSent(long contractId);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
using System;
|
||||||
|
using MongoDB.Bson;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نمایندگی فلگ ارسال قرارداد در MongoDB
|
||||||
|
/// این موجودیت برای ردیابی اینکه آیا قرارداد ارسال شده است استفاده میشود
|
||||||
|
/// </summary>
|
||||||
|
public class InstitutionContractSendFlag
|
||||||
|
{
|
||||||
|
public InstitutionContractSendFlag(long institutionContractId,bool isSent)
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid();
|
||||||
|
InstitutionContractId = institutionContractId;
|
||||||
|
IsSent = isSent;
|
||||||
|
CreatedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه یکتای MongoDB
|
||||||
|
/// </summary>
|
||||||
|
[BsonId]
|
||||||
|
[BsonRepresentation(BsonType.String)]
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه قرارداد در SQL
|
||||||
|
/// </summary>
|
||||||
|
public long InstitutionContractId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا قرارداد ارسال شده است
|
||||||
|
/// </summary>
|
||||||
|
public bool IsSent { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ و زمان ارسال
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? SentDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ و زمان ایجاد رکورد
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CreatedDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ و زمان آخرین بهروزرسانی
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? LastModifiedDate { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// علامتگذاری قرارداد به عنوان ارسالشده
|
||||||
|
/// </summary>
|
||||||
|
public void MarkAsSent()
|
||||||
|
{
|
||||||
|
IsSent = true;
|
||||||
|
SentDate = DateTime.Now;
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بازگردانی علامت ارسال
|
||||||
|
/// </summary>
|
||||||
|
public void MarkAsNotSent()
|
||||||
|
{
|
||||||
|
IsSent = false;
|
||||||
|
SentDate = null;
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بهروزرسانی علامت آخری اصلاح
|
||||||
|
/// </summary>
|
||||||
|
public void UpdateLastModified()
|
||||||
|
{
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
using _0_Framework.Domain;
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.InstitutionPlan;
|
using CompanyManagment.App.Contracts.InstitutionPlan;
|
||||||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.InstitutionPlanAgg;
|
namespace Company.Domain.InstitutionPlanAgg;
|
||||||
|
|
||||||
@@ -26,4 +28,18 @@ public interface IPlanPercentageRepository : IRepository<long, PlanPercentage>
|
|||||||
/// <param name="command"></param>
|
/// <param name="command"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
InstitutionPlanViewModel GetInstitutionPlanForWorkshop(WorkshopTempViewModel command);
|
InstitutionPlanViewModel GetInstitutionPlanForWorkshop(WorkshopTempViewModel command);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت دیتای مودال ایجاد
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<CreateServiceAmountDto> GetCreateModalData();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست مبالغ سرویس ها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<PagedResult<InstitutionPlanListDto>> GetList(
|
||||||
|
InstitutionPlanSearchModel searchModel);
|
||||||
}
|
}
|
||||||
@@ -73,10 +73,12 @@ public interface IInsuranceListRepository:IRepository<long, InsuranceList>
|
|||||||
Task<InsuranceListConfirmOperation> GetInsuranceOperationDetails(long id);
|
Task<InsuranceListConfirmOperation> GetInsuranceOperationDetails(long id);
|
||||||
|
|
||||||
Task<InsuranceListTabsCountViewModel> GetTabCounts(InsuranceListSearchModel searchModel);
|
Task<InsuranceListTabsCountViewModel> GetTabCounts(InsuranceListSearchModel searchModel);
|
||||||
|
Task<PagedResult<InsuranceClientListViewModel>> GetInsuranceClientList(InsuranceClientSearchModel searchModel);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
Task<List<InsuranceListViewModel>> GetNotCreatedWorkshop(InsuranceListSearchModel searchModel);
|
Task<List<InsuranceListViewModel>> GetNotCreatedWorkshop(InsuranceListSearchModel searchModel);
|
||||||
|
Task<InsuranceClientPrintViewModel> ClientPrintOne(long id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
using System;
|
using _0_Framework.Application;
|
||||||
using System.Collections.Generic;
|
|
||||||
using _0_Framework.Application;
|
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionPlan;
|
||||||
using CompanyManagment.App.Contracts.Leave;
|
using CompanyManagment.App.Contracts.Leave;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.LeaveAgg;
|
namespace Company.Domain.LeaveAgg;
|
||||||
|
|
||||||
@@ -10,7 +12,7 @@ public interface ILeaveRepository : IRepository<long, Leave>
|
|||||||
{
|
{
|
||||||
EditLeave GetDetails(long id);
|
EditLeave GetDetails(long id);
|
||||||
List<LeaveViewModel> search(LeaveSearchModel searchModel);
|
List<LeaveViewModel> search(LeaveSearchModel searchModel);
|
||||||
OperationResult RemoveLeave(long id);
|
Task<OperationResult> RemoveLeave(long id);
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
List<LeaveViewModel> GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime start, DateTime end);
|
List<LeaveViewModel> GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime start, DateTime end);
|
||||||
@@ -28,10 +30,35 @@ public interface ILeaveRepository : IRepository<long, Leave>
|
|||||||
LeavePrintViewModel PrintOne(long id);
|
LeavePrintViewModel PrintOne(long id);
|
||||||
List<LeavePrintViewModel> PrintAll(List<long> id);
|
List<LeavePrintViewModel> PrintAll(List<long> id);
|
||||||
|
|
||||||
|
Task<List<LeavePrintResponseViewModel>> PrintAllAsync(List<long> ids, long workshopId);
|
||||||
|
|
||||||
#region Vafa
|
#region Vafa
|
||||||
|
|
||||||
List<LeaveViewModel> LastLeaveMain(LeaveSearchModel searchModel);
|
List<LeaveViewModel> LastLeaveMain(LeaveSearchModel searchModel);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
bool CheckIfValidToEdit(long id);
|
bool CheckIfValidToEdit(long id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست مرخصی ها در کلاینت
|
||||||
|
/// Api
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<PagedResult<leaveListDto>> GetList(
|
||||||
|
LeaveListSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست گروه بندی شده
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<GroupLeaveListDto>> GetGroupList(LeaveListSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پرینت لیستی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ids"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<LeaveListPrintDto> ListPrint(List<long> ids);
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,16 @@
|
|||||||
using System;
|
using _0_Framework.Domain;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Domain;
|
|
||||||
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
||||||
using CompanyManagment.App.Contracts.Contract;
|
using CompanyManagment.App.Contracts.Contract;
|
||||||
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
||||||
using CompanyManagment.App.Contracts.Leave;
|
using CompanyManagment.App.Contracts.Leave;
|
||||||
using CompanyManagment.App.Contracts.Loan;
|
using CompanyManagment.App.Contracts.Loan;
|
||||||
|
using CompanyManagment.App.Contracts.Reward;
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
using CompanyManagment.App.Contracts.RollCall;
|
||||||
using CompanyManagment.App.Contracts.SalaryAid;
|
using CompanyManagment.App.Contracts.SalaryAid;
|
||||||
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.RollCallAgg;
|
namespace Company.Domain.RollCallAgg;
|
||||||
|
|
||||||
@@ -53,6 +54,9 @@ public interface IRollCallMandatoryRepository : IRepository<long, RollCall>
|
|||||||
List<SalaryAidViewModel> SalaryAidsForCheckout(long employeeId, long workshopId, DateTime checkoutStart,
|
List<SalaryAidViewModel> SalaryAidsForCheckout(long employeeId, long workshopId, DateTime checkoutStart,
|
||||||
DateTime checkoutEnd);
|
DateTime checkoutEnd);
|
||||||
|
|
||||||
|
List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
||||||
|
DateTime checkoutStart);
|
||||||
|
|
||||||
Task<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart,
|
Task<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart,
|
||||||
DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command,bool holidayWorking);
|
DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command,bool holidayWorking);
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,30 @@
|
|||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using _0_Framework.Domain;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.SmsResultAgg;
|
namespace Company.Domain.SmsResultAgg;
|
||||||
|
|
||||||
public interface ISmsResultRepository : IRepository<long, SmsResult>
|
public interface ISmsResultRepository : IRepository<long, SmsResult>
|
||||||
{
|
{
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست پیامکها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsReportDto>> GetSmsReportList(SmsReportSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اکسپند لیست هر تاریخ
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <param name="date"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date);
|
||||||
|
|
||||||
|
#endregion
|
||||||
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
||||||
}
|
}
|
||||||
@@ -316,7 +316,10 @@ public class Workshop : EntityBase
|
|||||||
IsStaticCheckout = isStaticCheckout;
|
IsStaticCheckout = isStaticCheckout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddContractingPartyId(long contractingPartyId)
|
||||||
|
{
|
||||||
|
ContractingPartyId = contractingPartyId;
|
||||||
|
}
|
||||||
public void Active(string archiveCode)
|
public void Active(string archiveCode)
|
||||||
{
|
{
|
||||||
this.IsActive = true;
|
this.IsActive = true;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class CustomizeWorkshopGroupSettingExcelGenerator
|
|||||||
{
|
{
|
||||||
public static byte[] Generate(List<CustomizeWorkshopGroupExcelViewModel> groups)
|
public static byte[] Generate(List<CustomizeWorkshopGroupExcelViewModel> groups)
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using (var package = new ExcelPackage())
|
using (var package = new ExcelPackage())
|
||||||
{
|
{
|
||||||
var worksheet = package.Workbook.Worksheets.Add("GroupsAndEmployees");
|
var worksheet = package.Workbook.Worksheets.Add("GroupsAndEmployees");
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class CaseManagementExcelGenerator
|
|||||||
};
|
};
|
||||||
public static byte[] GenerateCheckoutTempExcelInfo(List<FileExcelViewModel> data)
|
public static byte[] GenerateCheckoutTempExcelInfo(List<FileExcelViewModel> data)
|
||||||
{
|
{
|
||||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new ExcelPackage();
|
using var package = new ExcelPackage();
|
||||||
CreateSheet(data, package,"همه");
|
CreateSheet(data, package,"همه");
|
||||||
CreateSheet(data.Where(x=>x.Status ==2).ToList(), package,"فعال");
|
CreateSheet(data.Where(x=>x.Status ==2).ToList(), package,"فعال");
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class CustomizeCheckoutExcelGenerator
|
|||||||
};
|
};
|
||||||
public static byte[] GenerateCheckoutTempExcelInfo(List<CustomizeCheckoutTempExcelViewModel> data, List<string> selectedParameters)
|
public static byte[] GenerateCheckoutTempExcelInfo(List<CustomizeCheckoutTempExcelViewModel> data, List<string> selectedParameters)
|
||||||
{
|
{
|
||||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new ExcelPackage();
|
using var package = new ExcelPackage();
|
||||||
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ public class EmployeeBankInfoExcelGenerator
|
|||||||
{
|
{
|
||||||
public static byte[] Generate(List<EmployeeBankInfoExcelViewModel> list)
|
public static byte[] Generate(List<EmployeeBankInfoExcelViewModel> list)
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new ExcelPackage();
|
using var package = new ExcelPackage();
|
||||||
var worksheet = package.Workbook.Worksheets.Add("EmployeeBankInfo");
|
var worksheet = package.Workbook.Worksheets.Add("EmployeeBankInfo");
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ public class EmployeeBankInfoExcelGenerator
|
|||||||
|
|
||||||
public static byte[] Generate2(List<EmployeeBankInfoExcelViewModel> list)
|
public static byte[] Generate2(List<EmployeeBankInfoExcelViewModel> list)
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new ExcelPackage();
|
using var package = new ExcelPackage();
|
||||||
foreach (var employee in list)
|
foreach (var employee in list)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,86 +8,129 @@ using System.Text.RegularExpressions;
|
|||||||
|
|
||||||
namespace CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
namespace CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
||||||
|
|
||||||
|
// Enum برای تعریف ستونهای موجود
|
||||||
|
public enum ExcelColumnType
|
||||||
|
{
|
||||||
|
RowNumber, // ردیف
|
||||||
|
PhysicalContract, // قرارداد فیزیکی
|
||||||
|
ContractNo, // شماره قرارداد
|
||||||
|
Representative, // معرف
|
||||||
|
ContractingPartyName, // طرف حساب
|
||||||
|
ArchiveCode, // شماره کارفرما
|
||||||
|
EmployerName, // کارفرما
|
||||||
|
WorkshopName, // کارگاهها (چندخطی)
|
||||||
|
WorkshopCount, // تعداد کارگاه
|
||||||
|
EmployeeCount, // مجموع پرسنل
|
||||||
|
ContractStartDate, // شروع قرارداد
|
||||||
|
ContractEndDate, // پایان قرارداد
|
||||||
|
InstallmentAmount, // مبلغ قسط
|
||||||
|
ContractAmount, // مبلغ قرارداد
|
||||||
|
FinancialStatus // وضعیت مالی
|
||||||
|
}
|
||||||
|
|
||||||
|
// کلاس کانفیگ برای تنظیم ستونهای نمایشی
|
||||||
|
public class ExcelColumnConfig
|
||||||
|
{
|
||||||
|
public List<ExcelColumnType> VisibleColumns { get; set; }
|
||||||
|
|
||||||
|
public ExcelColumnConfig()
|
||||||
|
{
|
||||||
|
// فعلاً تمام ستونها فعال هستند
|
||||||
|
VisibleColumns = new List<ExcelColumnType>
|
||||||
|
{
|
||||||
|
ExcelColumnType.PhysicalContract,
|
||||||
|
ExcelColumnType.ContractNo,
|
||||||
|
ExcelColumnType.Representative,
|
||||||
|
ExcelColumnType.ContractingPartyName,
|
||||||
|
ExcelColumnType.ArchiveCode,
|
||||||
|
ExcelColumnType.EmployerName,
|
||||||
|
ExcelColumnType.WorkshopName,
|
||||||
|
ExcelColumnType.WorkshopCount,
|
||||||
|
ExcelColumnType.EmployeeCount,
|
||||||
|
ExcelColumnType.ContractStartDate,
|
||||||
|
ExcelColumnType.ContractEndDate,
|
||||||
|
ExcelColumnType.InstallmentAmount,
|
||||||
|
ExcelColumnType.ContractAmount,
|
||||||
|
ExcelColumnType.FinancialStatus
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class InstitutionContractExcelGenerator
|
public class InstitutionContractExcelGenerator
|
||||||
{
|
{
|
||||||
|
private static ExcelColumnConfig _columnConfig = new ExcelColumnConfig();
|
||||||
|
|
||||||
public static byte[] GenerateExcel(List<InstitutionContractViewModel> institutionContractViewModels)
|
public static byte[] GenerateExcel(List<InstitutionContractExcelViewModel> contractViewModels)
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new ExcelPackage();
|
using var package = new ExcelPackage();
|
||||||
var allWorksheet = package.Workbook.Worksheets.Add("همه");
|
|
||||||
|
|
||||||
var blueWorksheet = package.Workbook.Worksheets.Add("آبی");
|
// ایجاد شیت برای هر تب با دادههای مربوطه
|
||||||
blueWorksheet.TabColor = Color.LightBlue;
|
foreach (var viewModel in contractViewModels)
|
||||||
|
{
|
||||||
var grayWorksheet = package.Workbook.Worksheets.Add("خاکستری");
|
var worksheet = CreateWorksheet(package, viewModel.Tab);
|
||||||
grayWorksheet.TabColor = Color.LightGray;
|
CreateExcelSheet(viewModel.GetInstitutionContractListItemsViewModels ?? new List<GetInstitutionContractListItemsViewModel>(), worksheet);
|
||||||
|
}
|
||||||
var redWorksheet = package.Workbook.Worksheets.Add("قرمز");
|
|
||||||
redWorksheet.TabColor = Color.LightCoral;
|
|
||||||
|
|
||||||
var purpleWorksheet = package.Workbook.Worksheets.Add("بنفش");
|
|
||||||
purpleWorksheet.TabColor = Color.MediumPurple;
|
|
||||||
|
|
||||||
var blackWorksheet = package.Workbook.Worksheets.Add("مشکی");
|
|
||||||
blackWorksheet.TabColor = Color.DimGray;
|
|
||||||
|
|
||||||
var yellowWorksheet = package.Workbook.Worksheets.Add("زرد");
|
|
||||||
yellowWorksheet.TabColor = Color.Yellow;
|
|
||||||
|
|
||||||
var whiteWorksheet = package.Workbook.Worksheets.Add("سفید");
|
|
||||||
whiteWorksheet.TabColor = Color.White;
|
|
||||||
|
|
||||||
|
|
||||||
CreateExcelSheet(institutionContractViewModels, allWorksheet);
|
|
||||||
|
|
||||||
var blueContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "blue").ToList();
|
|
||||||
CreateExcelSheet(blueContracts, blueWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(blueContracts).ToList();
|
|
||||||
|
|
||||||
var grayContracts = institutionContractViewModels.Where(x => x.IsContractingPartyBlock == "true").ToList();
|
|
||||||
CreateExcelSheet(grayContracts, grayWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(grayContracts).ToList();
|
|
||||||
|
|
||||||
var redContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "red").ToList();
|
|
||||||
CreateExcelSheet(redContracts, redWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(redContracts).ToList();
|
|
||||||
|
|
||||||
var purpleContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "purple").ToList();
|
|
||||||
CreateExcelSheet(purpleContracts, purpleWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(purpleContracts).ToList();
|
|
||||||
|
|
||||||
var blackContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "black").ToList();
|
|
||||||
CreateExcelSheet(blackContracts, blackWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(blackContracts).ToList();
|
|
||||||
|
|
||||||
var yellowContracts = institutionContractViewModels
|
|
||||||
.Where(x => string.IsNullOrWhiteSpace(x.ExpireColor) && x.WorkshopCount == "0").ToList();
|
|
||||||
CreateExcelSheet(yellowContracts, yellowWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(yellowContracts).ToList();
|
|
||||||
|
|
||||||
var otherContracts = institutionContractViewModels;
|
|
||||||
CreateExcelSheet(otherContracts, whiteWorksheet);
|
|
||||||
|
|
||||||
return package.GetAsByteArray();
|
return package.GetAsByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CreateExcelSheet(List<InstitutionContractViewModel> institutionContractViewModels, ExcelWorksheet worksheet)
|
/// <summary>
|
||||||
|
/// ایجاد شیت بر اساس نوع تب
|
||||||
|
/// </summary>
|
||||||
|
private static ExcelWorksheet CreateWorksheet(ExcelPackage package, InstitutionContractListStatus? status)
|
||||||
{
|
{
|
||||||
// Headers
|
return status switch
|
||||||
worksheet.Cells[1, 1].Value = "شماره قرارداد";
|
{
|
||||||
worksheet.Cells[1, 2].Value = "طرف حساب";
|
InstitutionContractListStatus.DeactiveWithDebt =>
|
||||||
worksheet.Cells[1, 3].Value = "شماره کارفرما";
|
CreateColoredWorksheet(package, "غیرفعال دارای بدهی", Color.LightBlue),
|
||||||
worksheet.Cells[1, 4].Value = "کارفرما ها";
|
|
||||||
worksheet.Cells[1, 5].Value = "کارگاه ها";
|
|
||||||
worksheet.Cells[1, 6].Value = "مجبوع پرسنل";
|
|
||||||
worksheet.Cells[1, 7].Value = "شروع قرارداد";
|
|
||||||
worksheet.Cells[1, 8].Value = "پایان قرارداد";
|
|
||||||
worksheet.Cells[1, 9].Value = "مبلغ قرارداد (بدون کارگاه)";
|
|
||||||
worksheet.Cells[1, 10].Value = "مبلغ قرارداد";
|
|
||||||
worksheet.Cells[1, 11].Value = "وضعیت مالی";
|
|
||||||
|
|
||||||
using (var range = worksheet.Cells[1, 1, 1, 11])
|
InstitutionContractListStatus.Deactive =>
|
||||||
|
CreateColoredWorksheet(package, "غیرفعال", Color.LightGray),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.PendingForRenewal =>
|
||||||
|
CreateColoredWorksheet(package, "در انتظار تمدید", Color.LightCoral),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.Free =>
|
||||||
|
CreateColoredWorksheet(package, "بنفش", Color.MediumPurple),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.Block =>
|
||||||
|
CreateColoredWorksheet(package, "بلاک", Color.DimGray),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.WithoutWorkshop =>
|
||||||
|
CreateColoredWorksheet(package, "بدون کارگاه", Color.Yellow),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.Active =>
|
||||||
|
CreateColoredWorksheet(package, "فعال", Color.White),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.PendingForVerify =>
|
||||||
|
CreateColoredWorksheet(package, "در انتظار تایید", Color.OrangeRed),
|
||||||
|
|
||||||
|
null => CreateColoredWorksheet(package, "کل قرارداد ها", Color.White),
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(status), status, null)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد شیت با رنگ تب
|
||||||
|
/// </summary>
|
||||||
|
private static ExcelWorksheet CreateColoredWorksheet(ExcelPackage package, string sheetName, Color tabColor)
|
||||||
|
{
|
||||||
|
var worksheet = package.Workbook.Worksheets.Add(sheetName);
|
||||||
|
worksheet.TabColor = tabColor;
|
||||||
|
return worksheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CreateExcelSheet(List<GetInstitutionContractListItemsViewModel> contractItems, ExcelWorksheet worksheet)
|
||||||
|
{
|
||||||
|
// دریافت نقشه ستونهای مرئی
|
||||||
|
var visibleColumnIndices = GetVisibleColumnIndices();
|
||||||
|
int columnCount = visibleColumnIndices.Count;
|
||||||
|
|
||||||
|
// تنظیم Headers
|
||||||
|
SetupHeaders(worksheet, visibleColumnIndices, columnCount);
|
||||||
|
|
||||||
|
using (var range = worksheet.Cells[1, 1, 1, columnCount])
|
||||||
{
|
{
|
||||||
range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
|
range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
|
||||||
range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
|
range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
|
||||||
@@ -110,30 +153,35 @@ public class InstitutionContractExcelGenerator
|
|||||||
|
|
||||||
int row = 2;
|
int row = 2;
|
||||||
|
|
||||||
for (int i = 0; i < institutionContractViewModels.Count; i++)
|
for (int i = 0; i < contractItems.Count; i++)
|
||||||
{
|
{
|
||||||
var contract = institutionContractViewModels[i];
|
var contract = contractItems[i];
|
||||||
var employers = contract.EmployerViewModels?.ToList() ?? new();
|
var employers = contract.EmployerNames?.ToList() ?? new();
|
||||||
var workshops = contract.WorkshopViewModels?.ToList() ?? new();
|
var workshops = contract.WorkshopNames?.ToList() ?? new();
|
||||||
|
|
||||||
int maxRows = Math.Max(employers.Count, workshops.Count);
|
int maxRows = 1; // هر قرارداد فقط یک ردیف؛ نیازی به مرج عمودی نیست
|
||||||
maxRows = Math.Max(1, maxRows);
|
|
||||||
|
|
||||||
int startRow = row;
|
int startRow = row;
|
||||||
int endRow = row + maxRows - 1;
|
int endRow = row + maxRows - 1;
|
||||||
|
|
||||||
// 🎨 دریافت رنگ پسزمینه از مقدار رنگ موجود در داده
|
// 🎨 دریافت رنگ پسزمینه بر اساس وضعیت قرارداد
|
||||||
string colorName = contract.ExpireColor.ToLower();
|
var fillColor = GetColorByStatus(contract.ListStatus, contract.WorkshopsCount);
|
||||||
var fillColor = GetColorByName(colorName, contract.WorkshopCount, contract.IsContractingPartyBlock);
|
|
||||||
|
|
||||||
for (int j = 0; j < maxRows; j++)
|
for (int j = 0; j < maxRows; j++)
|
||||||
{
|
{
|
||||||
int currentRow = row + j;
|
int currentRow = row + j;
|
||||||
|
|
||||||
worksheet.Cells[currentRow, 4].Value = j < employers.Count ? employers[j].FullName : null;
|
// پر کردن ستونهای employer و workshop
|
||||||
worksheet.Cells[currentRow, 5].Value = j < workshops.Count ? workshops[j].WorkshopFullName : null;
|
var employerColIndex = GetColumnIndexForType(ExcelColumnType.EmployerName, visibleColumnIndices);
|
||||||
|
var workshopColIndex = GetColumnIndexForType(ExcelColumnType.WorkshopName, visibleColumnIndices);
|
||||||
|
|
||||||
for (int col = 1; col <= 11; col++)
|
if (employerColIndex > 0)
|
||||||
|
worksheet.Cells[currentRow, employerColIndex].Value = j < employers.Count ? employers[j] : null;
|
||||||
|
|
||||||
|
if (workshopColIndex > 0)
|
||||||
|
worksheet.Cells[currentRow, workshopColIndex].Value = j < workshops.Count ? workshops[j] : null;
|
||||||
|
|
||||||
|
for (int col = 1; col <= columnCount; col++)
|
||||||
{
|
{
|
||||||
var cell = worksheet.Cells[currentRow, col];
|
var cell = worksheet.Cells[currentRow, col];
|
||||||
|
|
||||||
@@ -154,109 +202,235 @@ public class InstitutionContractExcelGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 🧱 مرج و مقداردهی ستونهای اصلی
|
// 🧱 مرج و مقداردهی ستونهای اصلی
|
||||||
worksheet.Cells[startRow, 1, endRow, 1].Merge = true;
|
FillColumnData(worksheet, contract, startRow, endRow, visibleColumnIndices);
|
||||||
worksheet.Cells[startRow, 1].Value = contract.ContractNo;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 2, endRow, 2].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 2].Value = contract.ContractingPartyName;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 3, endRow, 3].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 3].Value = contract.ArchiveCode;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 6, endRow, 6].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 6].Value = contract.EmployeeCount;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 7, endRow, 7].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 7].Value = contract.ContractStartFa;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 8, endRow, 8].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 8].Value = contract.ContractEndFa;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 9, endRow, 9].Merge = true;
|
|
||||||
var contractWithoutWorkshopAmountCell = worksheet.Cells[startRow, 9];
|
|
||||||
contractWithoutWorkshopAmountCell.Value = contract.WorkshopCount == "0" ? MoneyToDouble(contract.ContractAmount) : "";
|
|
||||||
contractWithoutWorkshopAmountCell.Style.Numberformat.Format = "#,##0";
|
|
||||||
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 10, endRow, 10].Merge = true;
|
|
||||||
var contractAmountCell = worksheet.Cells[startRow, 10];
|
|
||||||
contractAmountCell.Value = contract.WorkshopCount != "0" ? MoneyToDouble(contract.ContractAmount) : "";
|
|
||||||
contractAmountCell.Style.Numberformat.Format = "#,##0";
|
|
||||||
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 11, endRow, 11].Merge = true;
|
|
||||||
var balance = MoneyToDouble(contract.BalanceStr);
|
|
||||||
var balanceCell = worksheet.Cells[startRow, 11];
|
|
||||||
balanceCell.Value = balance;
|
|
||||||
balanceCell.Style.Numberformat.Format = "#,##0";
|
|
||||||
|
|
||||||
if (balance > 0)
|
|
||||||
balanceCell.Style.Font.Color.SetColor(Color.Red);
|
|
||||||
else if (balance < 0)
|
|
||||||
balanceCell.Style.Font.Color.SetColor(Color.Green);
|
|
||||||
|
|
||||||
// 📦 بوردر ضخیم خارجی برای هر سطر
|
// 📦 بوردر ضخیم خارجی برای هر سطر
|
||||||
var boldRange = worksheet.Cells[startRow, 1, endRow, 11];
|
var boldRange = worksheet.Cells[startRow, 1, endRow, columnCount];
|
||||||
boldRange.Style.Border.BorderAround(ExcelBorderStyle.Medium);
|
boldRange.Style.Border.BorderAround(ExcelBorderStyle.Medium);
|
||||||
|
|
||||||
row += maxRows;
|
row += maxRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetupPrintSettings(worksheet, visibleColumnIndices, columnCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت فهرست ستونهای مرئی بر اساس کانفیگ
|
||||||
|
/// </summary>
|
||||||
|
private static List<ExcelColumnType> GetVisibleColumnIndices()
|
||||||
|
{
|
||||||
|
return _columnConfig.VisibleColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت شماره ستون برای یک نوع ستون خاص
|
||||||
|
/// </summary>
|
||||||
|
private static int GetColumnIndexForType(ExcelColumnType columnType, List<ExcelColumnType> visibleColumns)
|
||||||
|
{
|
||||||
|
var index = visibleColumns.IndexOf(columnType);
|
||||||
|
return index >= 0 ? index + 1 : 0; // 1-based indexing
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت متن header برای یک نوع ستون
|
||||||
|
/// </summary>
|
||||||
|
private static string GetColumnHeader(ExcelColumnType columnType)
|
||||||
|
{
|
||||||
|
return columnType switch
|
||||||
|
{
|
||||||
|
ExcelColumnType.RowNumber => "ردیف",
|
||||||
|
ExcelColumnType.PhysicalContract => "قرارداد فیزیکی",
|
||||||
|
ExcelColumnType.ContractNo => "شماره قرارداد",
|
||||||
|
ExcelColumnType.Representative => "معرف",
|
||||||
|
ExcelColumnType.ContractingPartyName => "طرف حساب",
|
||||||
|
ExcelColumnType.ArchiveCode => "شماره کارفرما",
|
||||||
|
ExcelColumnType.EmployerName => "کارفرما",
|
||||||
|
ExcelColumnType.WorkshopName => "کارگاهها",
|
||||||
|
ExcelColumnType.WorkshopCount => "تعداد کارگاه",
|
||||||
|
ExcelColumnType.EmployeeCount => "مجموع پرسنل",
|
||||||
|
ExcelColumnType.ContractStartDate => "شروع قرارداد",
|
||||||
|
ExcelColumnType.ContractEndDate => "پایان قرارداد",
|
||||||
|
ExcelColumnType.InstallmentAmount => "مبلغ قسط",
|
||||||
|
ExcelColumnType.ContractAmount => "مبلغ قرارداد",
|
||||||
|
ExcelColumnType.FinancialStatus => "وضعیت مالی",
|
||||||
|
_ => ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تنظیم Headerهای ستونها
|
||||||
|
/// </summary>
|
||||||
|
private static void SetupHeaders(ExcelWorksheet worksheet, List<ExcelColumnType> visibleColumns, int columnCount)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < visibleColumns.Count; i++)
|
||||||
|
{
|
||||||
|
worksheet.Cells[1, i + 1].Value = GetColumnHeader(visibleColumns[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پر کردن دادههای ستونها برای یک قرارداد
|
||||||
|
/// </summary>
|
||||||
|
private static void FillColumnData(ExcelWorksheet worksheet, GetInstitutionContractListItemsViewModel contract, int startRow, int endRow, List<ExcelColumnType> visibleColumns)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < visibleColumns.Count; i++)
|
||||||
|
{
|
||||||
|
int columnIndex = i + 1; // 1-based indexing
|
||||||
|
var columnType = visibleColumns[i];
|
||||||
|
|
||||||
|
// Merge cells for non-repeating columns
|
||||||
|
worksheet.Cells[startRow, columnIndex, endRow, columnIndex].Merge = true;
|
||||||
|
|
||||||
|
var cell = worksheet.Cells[startRow, columnIndex];
|
||||||
|
|
||||||
|
switch (columnType)
|
||||||
|
{
|
||||||
|
case ExcelColumnType.PhysicalContract:
|
||||||
|
var physicalText = contract.IsOldContract
|
||||||
|
? (contract.HasSigniture ? "موجود" : "ناموجود")
|
||||||
|
: (contract.IsInPersonContract ? "الکترونیکی حضوری" : "الکترونیکی غیر حضوری");
|
||||||
|
|
||||||
|
cell.Value = physicalText;
|
||||||
|
cell.Style.Font.Bold = true;
|
||||||
|
cell.Style.Font.Color.SetColor(physicalText switch
|
||||||
|
{
|
||||||
|
"موجود" => Color.Green,
|
||||||
|
"ناموجود" => Color.Red,
|
||||||
|
"الکترونیکی حضوری" => Color.Purple,
|
||||||
|
_ => Color.Blue
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractNo:
|
||||||
|
cell.Value = contract.ContractNo;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.Representative:
|
||||||
|
cell.Value = contract.RepresentativeName;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractingPartyName:
|
||||||
|
cell.Value = contract.ContractingPartyName;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ArchiveCode:
|
||||||
|
cell.Value = contract.ArchiveNo;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.EmployerName:
|
||||||
|
// این ستون چندخطی است و داخل loop پر میشود
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.WorkshopName:
|
||||||
|
// این ستون چندخطی است و داخل loop پر میشود
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.WorkshopCount:
|
||||||
|
cell.Value = contract.WorkshopsCount;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.EmployeeCount:
|
||||||
|
cell.Value = contract.EmployeesCount;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractStartDate:
|
||||||
|
cell.Value = contract.ContractStartFa;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractEndDate:
|
||||||
|
cell.Value = contract.ContractEndFa;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.InstallmentAmount:
|
||||||
|
cell.Value = contract.InstallmentAmount;
|
||||||
|
cell.Style.Numberformat.Format = "#,##0";
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractAmount:
|
||||||
|
cell.Value = contract.ContractAmount;
|
||||||
|
cell.Style.Numberformat.Format = "#,##0";
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.FinancialStatus:
|
||||||
|
cell.Value = contract.Balance;
|
||||||
|
cell.Style.Numberformat.Format = "#,##0";
|
||||||
|
|
||||||
|
if (contract.Balance > 0)
|
||||||
|
cell.Style.Font.Color.SetColor(Color.Red);
|
||||||
|
else if (contract.Balance < 0)
|
||||||
|
cell.Style.Font.Color.SetColor(Color.Green);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تنظیم تنظیمات چاپ و عرض ستونها
|
||||||
|
/// </summary>
|
||||||
|
private static void SetupPrintSettings(ExcelWorksheet worksheet, List<ExcelColumnType> visibleColumns, int columnCount)
|
||||||
|
{
|
||||||
worksheet.PrinterSettings.PaperSize = ePaperSize.A4;
|
worksheet.PrinterSettings.PaperSize = ePaperSize.A4;
|
||||||
worksheet.PrinterSettings.Orientation = eOrientation.Landscape;
|
worksheet.PrinterSettings.Orientation = eOrientation.Landscape;
|
||||||
worksheet.PrinterSettings.FitToPage = true;
|
worksheet.PrinterSettings.FitToPage = true;
|
||||||
worksheet.PrinterSettings.FitToWidth = 1;
|
worksheet.PrinterSettings.FitToWidth = 1;
|
||||||
worksheet.PrinterSettings.FitToHeight = 0;
|
worksheet.PrinterSettings.FitToHeight = 0;
|
||||||
worksheet.PrinterSettings.Scale = 85;
|
worksheet.PrinterSettings.Scale = 85;
|
||||||
int contractNoCol = 1;
|
|
||||||
int contractingPartyNameCol = 2;
|
// تنظیم عرض ستونها بر اساس نوع ستون
|
||||||
int archiveNoCol = 3;
|
for (int i = 0; i < visibleColumns.Count; i++)
|
||||||
int employersCol = 4;
|
{
|
||||||
int workshopsCol = 5;
|
int columnIndex = i + 1;
|
||||||
int employeeCountCol = 6;
|
worksheet.Columns[columnIndex].Width = GetColumnWidth(visibleColumns[i]);
|
||||||
int startContractCol = 7;
|
}
|
||||||
int endContractCol = 8;
|
|
||||||
int contractWithoutWorkshopAmountCol = 9;
|
|
||||||
int contractAmountCol = 10;
|
|
||||||
int balanceCol = 11;
|
|
||||||
worksheet.Columns[contractNoCol].Width = 17;
|
|
||||||
worksheet.Columns[contractingPartyNameCol].Width = 40;
|
|
||||||
worksheet.Columns[archiveNoCol].Width = 10;
|
|
||||||
worksheet.Columns[employersCol].Width = 40;
|
|
||||||
worksheet.Columns[workshopsCol].Width = 45;
|
|
||||||
worksheet.Columns[employeeCountCol].Width = 12;
|
|
||||||
worksheet.Columns[startContractCol].Width = 12;
|
|
||||||
worksheet.Columns[endContractCol].Width = 12;
|
|
||||||
worksheet.Columns[contractWithoutWorkshopAmountCol].Width = 18;
|
|
||||||
worksheet.Columns[contractAmountCol].Width = 12;
|
|
||||||
worksheet.Columns[balanceCol].Width = 12;
|
|
||||||
worksheet.View.RightToLeft = true; // فارسی
|
worksheet.View.RightToLeft = true; // فارسی
|
||||||
//worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت عرض ستون پیشفرض برای هر نوع ستون
|
||||||
|
/// </summary>
|
||||||
|
private static double GetColumnWidth(ExcelColumnType columnType)
|
||||||
|
{
|
||||||
|
return columnType switch
|
||||||
|
{
|
||||||
|
ExcelColumnType.RowNumber => 8,
|
||||||
|
ExcelColumnType.PhysicalContract => 15,
|
||||||
|
ExcelColumnType.ContractNo => 17,
|
||||||
|
ExcelColumnType.Representative => 15,
|
||||||
|
ExcelColumnType.ContractingPartyName => 40,
|
||||||
|
ExcelColumnType.ArchiveCode => 10,
|
||||||
|
ExcelColumnType.EmployerName => 40,
|
||||||
|
ExcelColumnType.WorkshopName => 45,
|
||||||
|
ExcelColumnType.WorkshopCount => 12,
|
||||||
|
ExcelColumnType.EmployeeCount => 12,
|
||||||
|
ExcelColumnType.ContractStartDate => 12,
|
||||||
|
ExcelColumnType.ContractEndDate => 12,
|
||||||
|
ExcelColumnType.InstallmentAmount => 15,
|
||||||
|
ExcelColumnType.ContractAmount => 15,
|
||||||
|
ExcelColumnType.FinancialStatus => 12,
|
||||||
|
_ => 12
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double MoneyToDouble(string value)
|
private static double MoneyToDouble(string value)
|
||||||
{
|
{
|
||||||
Console.WriteLine(value);
|
if (string.IsNullOrEmpty(value))
|
||||||
|
return 0;
|
||||||
|
|
||||||
var min = value.Length > 1 ? value.Substring(0, 2) : "";
|
var min = value.Length > 1 ? value.Substring(0, 2) : "";
|
||||||
var test = min == "\u200e\u2212" ? value.MoneyToDouble() * -1 : value.MoneyToDouble();
|
var test = min == "\u200e\u2212" ? value.MoneyToDouble() * -1 : value.MoneyToDouble();
|
||||||
|
|
||||||
Console.WriteLine(test);
|
|
||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
private static Color GetColorByName(string name, string workshopCount, string IsContractingPartyBlock)
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت رنگ بر اساس وضعیت قرارداد
|
||||||
|
/// </summary>
|
||||||
|
private static Color GetColorByStatus(InstitutionContractListStatus status, int workshopsCount)
|
||||||
{
|
{
|
||||||
return name switch
|
return status switch
|
||||||
{
|
{
|
||||||
"blue" => Color.LightBlue,
|
InstitutionContractListStatus.DeactiveWithDebt => Color.LightBlue,
|
||||||
_ when IsContractingPartyBlock == "true" => Color.LightGray,
|
InstitutionContractListStatus.Deactive => Color.LightGray,
|
||||||
"red" => Color.LightCoral,
|
InstitutionContractListStatus.PendingForRenewal => Color.LightCoral,
|
||||||
"purple" => Color.MediumPurple,
|
InstitutionContractListStatus.Free => Color.MediumPurple,
|
||||||
"black" => Color.DimGray,
|
InstitutionContractListStatus.Block => Color.DimGray,
|
||||||
var n when string.IsNullOrWhiteSpace(n) && workshopCount == "0" => Color.Yellow,
|
InstitutionContractListStatus.WithoutWorkshop => Color.Yellow,
|
||||||
|
InstitutionContractListStatus.Active => Color.White,
|
||||||
_ => Color.White
|
_ => Color.White
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class InstitutionContractExcelViewModel
|
||||||
|
{
|
||||||
|
public InstitutionContractListStatus? Tab { get; set; }
|
||||||
|
public List<GetInstitutionContractListItemsViewModel> GetInstitutionContractListItemsViewModels { get; set; }
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public class RollCallExcelGenerator : ExcelGenerator
|
|||||||
{
|
{
|
||||||
public static byte[] CaseHistoryExcelForEmployee(CaseHistoryRollCallExcelForEmployeeViewModel data)
|
public static byte[] CaseHistoryExcelForEmployee(CaseHistoryRollCallExcelForEmployeeViewModel data)
|
||||||
{
|
{
|
||||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new OfficeOpenXml.ExcelPackage();
|
using var package = new OfficeOpenXml.ExcelPackage();
|
||||||
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
||||||
var rollCalls = data.RollCalls;
|
var rollCalls = data.RollCalls;
|
||||||
@@ -181,7 +181,7 @@ public class RollCallExcelGenerator : ExcelGenerator
|
|||||||
|
|
||||||
public static byte[] CaseHistoryExcelForOneDay(CaseHistoryRollCallForOneDayViewModel data)
|
public static byte[] CaseHistoryExcelForOneDay(CaseHistoryRollCallForOneDayViewModel data)
|
||||||
{
|
{
|
||||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new OfficeOpenXml.ExcelPackage();
|
using var package = new OfficeOpenXml.ExcelPackage();
|
||||||
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
||||||
var rollCalls = data.RollCalls;
|
var rollCalls = data.RollCalls;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class SalaryAidImportExcel
|
|||||||
ValidData = []
|
ValidData = []
|
||||||
};
|
};
|
||||||
|
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
|
|
||||||
if (file == null || file.Length == 0)
|
if (file == null || file.Length == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public class WorkshopRollCallExcelExporter
|
|||||||
{
|
{
|
||||||
public static byte[] Export(List<WorkshopRollCallExcelViewModel> workshops)
|
public static byte[] Export(List<WorkshopRollCallExcelViewModel> workshops)
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using (var package = new ExcelPackage())
|
using (var package = new ExcelPackage())
|
||||||
{
|
{
|
||||||
var ws = package.Workbook.Worksheets.Add("Workshops");
|
var ws = package.Workbook.Worksheets.Add("Workshops");
|
||||||
|
|||||||
@@ -0,0 +1,176 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Company.Domain.CameraBugReportAgg;
|
||||||
|
using MongoDB.Bson;
|
||||||
|
using MongoDB.Driver;
|
||||||
|
|
||||||
|
namespace CompanyManagement.Infrastructure.Mongo.CameraBugReportRepo;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیادهسازی انبار گزارش خرابی دوربین برای MongoDB
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReportRepository : ICameraBugReportRepository
|
||||||
|
{
|
||||||
|
private readonly IMongoCollection<CameraBugReport> _cameraBugReports;
|
||||||
|
|
||||||
|
public CameraBugReportRepository(IMongoDatabase database)
|
||||||
|
{
|
||||||
|
_cameraBugReports = database.GetCollection<CameraBugReport>("CameraBugReports");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task CreateAsync(CameraBugReport bugReport)
|
||||||
|
{
|
||||||
|
await _cameraBugReports.InsertOneAsync(bugReport);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAsync(CameraBugReport bugReport)
|
||||||
|
{
|
||||||
|
await _cameraBugReports.ReplaceOneAsync(
|
||||||
|
x => x.Id == bugReport.Id,
|
||||||
|
bugReport);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<CameraBugReport> GetByIdAsync(Guid id)
|
||||||
|
{
|
||||||
|
return await _cameraBugReports
|
||||||
|
.Find(x => x.Id == id)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<CameraBugReport>> GetAllAsync()
|
||||||
|
{
|
||||||
|
return await _cameraBugReports
|
||||||
|
.Find(_ => true)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<CameraBugReport>> GetAllAsync(int skip, int take)
|
||||||
|
{
|
||||||
|
return await _cameraBugReports
|
||||||
|
.Find(_ => true)
|
||||||
|
.Skip(skip)
|
||||||
|
.Limit(take)
|
||||||
|
.SortByDescending(x => x.CreationDate)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(Guid id)
|
||||||
|
{
|
||||||
|
await _cameraBugReports.DeleteOneAsync(x => x.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> IsExistAsync(Guid id)
|
||||||
|
{
|
||||||
|
var result = await _cameraBugReports
|
||||||
|
.Find(x => x.Id == id)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
return result != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<CameraBugReport>> FilterAsync(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null,
|
||||||
|
int skip = 0,
|
||||||
|
int take = 10)
|
||||||
|
{
|
||||||
|
var filterDefinition = BuildFilterDefinition(type, priority, status, searchTerm);
|
||||||
|
|
||||||
|
return await _cameraBugReports
|
||||||
|
.Find(filterDefinition)
|
||||||
|
.Skip(skip)
|
||||||
|
.Limit(take)
|
||||||
|
.SortByDescending(x => x.CreationDate)
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<int> CountAsync(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null)
|
||||||
|
{
|
||||||
|
var filterDefinition = BuildFilterDefinition(type, priority, status, searchTerm);
|
||||||
|
var count = await _cameraBugReports.CountDocumentsAsync(filterDefinition);
|
||||||
|
return (int)count;
|
||||||
|
}
|
||||||
|
|
||||||
|
private FilterDefinition<CameraBugReport> BuildFilterDefinition(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null)
|
||||||
|
{
|
||||||
|
var filters = new List<FilterDefinition<CameraBugReport>>();
|
||||||
|
|
||||||
|
if (type.HasValue)
|
||||||
|
filters.Add(Builders<CameraBugReport>.Filter.Eq(x => x.Type, type.Value));
|
||||||
|
|
||||||
|
if (priority.HasValue)
|
||||||
|
filters.Add(Builders<CameraBugReport>.Filter.Eq(x => x.Priority, priority.Value));
|
||||||
|
|
||||||
|
if (status.HasValue)
|
||||||
|
filters.Add(Builders<CameraBugReport>.Filter.Eq(x => x.Status, status.Value));
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(searchTerm))
|
||||||
|
{
|
||||||
|
var searchFilter = Builders<CameraBugReport>.Filter.Or(
|
||||||
|
Builders<CameraBugReport>.Filter.Regex(x => x.Title, new BsonRegularExpression(searchTerm, "i")),
|
||||||
|
Builders<CameraBugReport>.Filter.Regex(x => x.Description, new BsonRegularExpression(searchTerm, "i")),
|
||||||
|
Builders<CameraBugReport>.Filter.Regex(x => x.UserEmail, new BsonRegularExpression(searchTerm, "i"))
|
||||||
|
);
|
||||||
|
filters.Add(searchFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters.Count == 0)
|
||||||
|
return Builders<CameraBugReport>.Filter.Empty;
|
||||||
|
|
||||||
|
return Builders<CameraBugReport>.Filter.And(filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sync methods from IRepository interface (not used in MongoDB flow but required for interface implementation)
|
||||||
|
public CameraBugReport Get(long id)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("استفاده از GetByIdAsync برای MongoDB");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CameraBugReport> Get()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("استفاده از GetAllAsync برای MongoDB");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Create(CameraBugReport entity)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("استفاده از CreateAsync برای MongoDB");
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ExistsIgnoreQueryFilter(System.Linq.Expressions.Expression<Func<CameraBugReport, bool>> expression)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("استفاده از IsExistAsync برای MongoDB");
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Exists(System.Linq.Expressions.Expression<Func<CameraBugReport, bool>> expression)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("استفاده از FilterAsync برای MongoDB");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveChanges()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("MongoDB نیازی به SaveChanges ندارد");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SaveChangesAsync()
|
||||||
|
{
|
||||||
|
// MongoDB خودکار ذخیره میکند، بنابراین این متد خالی است
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction> BeginTransactionAsync()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException("MongoDB اعاملات را بصورت متفاوت مدیریت میکند");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
|
using MongoDB.Driver;
|
||||||
|
|
||||||
|
namespace CompanyManagement.Infrastructure.Mongo.InstitutionContractSendFlagRepo;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Repository برای مدیریت فلگ ارسال قرارداد در MongoDB
|
||||||
|
/// </summary>
|
||||||
|
public class InstitutionContractSendFlagRepository : IInstitutionContractSendFlagRepository
|
||||||
|
{
|
||||||
|
private readonly IMongoCollection<InstitutionContractSendFlag> _collection;
|
||||||
|
|
||||||
|
public InstitutionContractSendFlagRepository(IMongoDatabase database)
|
||||||
|
{
|
||||||
|
_collection = database.GetCollection<InstitutionContractSendFlag>("InstitutionContractSendFlag");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Create(InstitutionContractSendFlag flag)
|
||||||
|
{
|
||||||
|
await _collection.InsertOneAsync(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<InstitutionContractSendFlag> GetByContractId(long contractId)
|
||||||
|
{
|
||||||
|
var filter = Builders<InstitutionContractSendFlag>.Filter
|
||||||
|
.Eq(x => x.InstitutionContractId, contractId);
|
||||||
|
|
||||||
|
return await _collection.Find(filter).FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task Update(InstitutionContractSendFlag flag)
|
||||||
|
{
|
||||||
|
var filter = Builders<InstitutionContractSendFlag>.Filter
|
||||||
|
.Eq(x => x.InstitutionContractId, flag.InstitutionContractId);
|
||||||
|
|
||||||
|
await _collection.ReplaceOneAsync(filter, flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> IsContractSent(long contractId)
|
||||||
|
{
|
||||||
|
var flag = await GetByContractId(contractId);
|
||||||
|
return flag != null && flag.IsSent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Remove(long contractId)
|
||||||
|
{
|
||||||
|
var filter = Builders<InstitutionContractSendFlag>.Filter
|
||||||
|
.Eq(x => x.InstitutionContractId, contractId);
|
||||||
|
|
||||||
|
await _collection.DeleteOneAsync(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@ using System.Collections.Generic;
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using Company.Application.Contracts.AuthorizedBankDetails;
|
using Company.Application.Contracts.AuthorizedBankDetails;
|
||||||
|
|
||||||
namespace Company.Application.Contracts.AuthorizedBankDetails
|
namespace CompanyManagment.App.Contracts.AuthorizedBankDetails
|
||||||
{
|
{
|
||||||
public interface IAuthorizedBankDetailsApplication
|
public interface IAuthorizedBankDetailsApplication
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||||
|
{
|
||||||
|
public class CameraBugReportDetailViewModel
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public string UserEmail { get; set; }
|
||||||
|
public long? AccountId { get; set; }
|
||||||
|
public string DeviceModel { get; set; }
|
||||||
|
public string OsVersion { get; set; }
|
||||||
|
public string Platform { get; set; }
|
||||||
|
public string Manufacturer { get; set; }
|
||||||
|
public string DeviceId { get; set; }
|
||||||
|
public string ScreenResolution { get; set; }
|
||||||
|
public int MemoryInMB { get; set; }
|
||||||
|
public int StorageInMB { get; set; }
|
||||||
|
public int BatteryLevel { get; set; }
|
||||||
|
public bool IsCharging { get; set; }
|
||||||
|
public string NetworkType { get; set; }
|
||||||
|
public string AppVersion { get; set; }
|
||||||
|
public string BuildNumber { get; set; }
|
||||||
|
public string PackageName { get; set; }
|
||||||
|
public DateTime InstallTime { get; set; }
|
||||||
|
public DateTime LastUpdateTime { get; set; }
|
||||||
|
public string Flavor { get; set; }
|
||||||
|
public CameraBugReportType Type { get; set; }
|
||||||
|
public CameraBugPriority Priority { get; set; }
|
||||||
|
public CameraBugReportStatus Status { get; set; }
|
||||||
|
public string StackTrace { get; set; }
|
||||||
|
public DateTime CreationDate { get; set; }
|
||||||
|
public DateTime? UpdateDate { get; set; }
|
||||||
|
public List<string> Logs { get; set; }
|
||||||
|
public List<CameraBugReportScreenshotViewModel> Screenshots { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CameraBugReportScreenshotViewModel
|
||||||
|
{
|
||||||
|
public string FileName { get; set; }
|
||||||
|
public DateTime UploadDate { get; set; }
|
||||||
|
public string Base64Data { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||||
|
{
|
||||||
|
public class CameraBugReportViewModel
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public string UserEmail { get; set; }
|
||||||
|
public long? AccountId { get; set; }
|
||||||
|
public string DeviceModel { get; set; }
|
||||||
|
public string AppVersion { get; set; }
|
||||||
|
public CameraBugReportType Type { get; set; }
|
||||||
|
public CameraBugPriority Priority { get; set; }
|
||||||
|
public CameraBugReportStatus Status { get; set; }
|
||||||
|
public DateTime CreationDate { get; set; }
|
||||||
|
public DateTime? UpdateDate { get; set; }
|
||||||
|
public int LogsCount { get; set; }
|
||||||
|
public int ScreenshotsCount { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||||
|
{
|
||||||
|
public class CreateCameraBugReportCommand
|
||||||
|
{
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public string UserEmail { get; set; }
|
||||||
|
public long? AccountId { get; set; }
|
||||||
|
public string DeviceModel { get; set; }
|
||||||
|
public string OsVersion { get; set; }
|
||||||
|
public string Platform { get; set; }
|
||||||
|
public string Manufacturer { get; set; }
|
||||||
|
public string DeviceId { get; set; }
|
||||||
|
public string ScreenResolution { get; set; }
|
||||||
|
public int MemoryInMB { get; set; }
|
||||||
|
public int StorageInMB { get; set; }
|
||||||
|
public int BatteryLevel { get; set; }
|
||||||
|
public bool IsCharging { get; set; }
|
||||||
|
public string NetworkType { get; set; }
|
||||||
|
public string AppVersion { get; set; }
|
||||||
|
public string BuildNumber { get; set; }
|
||||||
|
public string PackageName { get; set; }
|
||||||
|
public DateTime InstallTime { get; set; }
|
||||||
|
public DateTime LastUpdateTime { get; set; }
|
||||||
|
public string Flavor { get; set; }
|
||||||
|
public CameraBugReportType Type { get; set; }
|
||||||
|
public CameraBugPriority Priority { get; set; }
|
||||||
|
public string StackTrace { get; set; }
|
||||||
|
public List<string> Logs { get; set; }
|
||||||
|
public List<string> Screenshots { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||||
|
{
|
||||||
|
public class EditCameraBugReportCommand
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public CameraBugPriority Priority { get; set; }
|
||||||
|
public CameraBugReportStatus Status { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Application;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||||
|
{
|
||||||
|
public interface ICameraBugReportApplication
|
||||||
|
{
|
||||||
|
Task<OperationResult> CreateAsync(CreateCameraBugReportCommand command);
|
||||||
|
Task<OperationResult> EditAsync(EditCameraBugReportCommand command);
|
||||||
|
Task<OperationResult> DeleteAsync(Guid id);
|
||||||
|
Task<List<CameraBugReportViewModel>> GetAllAsync(CameraBugReportSearchModel searchModel);
|
||||||
|
Task<CameraBugReportDetailViewModel> GetDetailsAsync(Guid id);
|
||||||
|
Task<bool> IsExistAsync(Guid id);
|
||||||
|
|
||||||
|
// Keep sync methods for backward compatibility but they delegate to async
|
||||||
|
OperationResult Create(CreateCameraBugReportCommand command);
|
||||||
|
OperationResult Edit(EditCameraBugReportCommand command);
|
||||||
|
OperationResult Delete(Guid id);
|
||||||
|
List<CameraBugReportViewModel> GetAll(CameraBugReportSearchModel searchModel);
|
||||||
|
CameraBugReportDetailViewModel GetDetails(Guid id);
|
||||||
|
bool IsExist(Guid id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CameraBugReportSearchModel
|
||||||
|
{
|
||||||
|
public CameraBugReportType? Type { get; set; }
|
||||||
|
public CameraBugPriority? Priority { get; set; }
|
||||||
|
public CameraBugReportStatus? Status { get; set; }
|
||||||
|
public string SearchTerm { get; set; }
|
||||||
|
public int PageNumber { get; set; } = 1;
|
||||||
|
public int PageSize { get; set; } = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// </summary>
|
||||||
|
/// وضعیت گزارش خرابی دوربین
|
||||||
|
/// <summary>
|
||||||
|
public enum CameraBugReportStatus
|
||||||
|
{
|
||||||
|
Reopened = 5, // مجدداً باز شده
|
||||||
|
Closed = 4, // بسته شده
|
||||||
|
Fixed = 3, // رفع شده
|
||||||
|
InProgress = 2, // در حال بررسی
|
||||||
|
Open = 1, // باز
|
||||||
|
}
|
||||||
|
|
||||||
|
/// </summary>
|
||||||
|
/// اولویت گزارش خرابی دوربین
|
||||||
|
/// <summary>
|
||||||
|
public enum CameraBugPriority
|
||||||
|
{
|
||||||
|
Low = 4, // پایین
|
||||||
|
Medium = 3, // متوسط
|
||||||
|
High = 2, // بالا
|
||||||
|
Critical = 1, // بحرانی
|
||||||
|
}
|
||||||
|
|
||||||
|
/// </summary>
|
||||||
|
/// انواع گزارش خرابی دوربین
|
||||||
|
/// <summary>
|
||||||
|
public enum CameraBugReportType
|
||||||
|
{
|
||||||
|
Other = 8, // سایر
|
||||||
|
CrashOnCapture = 7, // کرش هنگام عکسبرداری
|
||||||
|
LightingIssue = 6, // مشکل روشنایی
|
||||||
|
FocusIssue = 5, // مشکل فوکوس
|
||||||
|
PerformanceIssue = 4, // مشکل عملکردی
|
||||||
|
FaceRecognitionFailed = 3, // شناسایی چهره ناموفق
|
||||||
|
BlurryImage = 2, // تصویر مبهم
|
||||||
|
CameraNotWorking = 1, // دوربین کار نمیکند
|
||||||
|
}
|
||||||
@@ -193,4 +193,9 @@ public class CreateCheckout
|
|||||||
/// پایه سنوات قبل از تاثیر ساعت کار
|
/// پایه سنوات قبل از تاثیر ساعت کار
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double BaseYearUnAffected { get; set; }
|
public double BaseYearUnAffected { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا برای محاسبه پاداش مجاز است
|
||||||
|
/// </summary>
|
||||||
|
public bool RewardPayCompute { get; set; }
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
<NoWarn>$(NoWarn);1591</NoWarn>
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -20,7 +22,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="CopyDocs" AfterTargets="Build">
|
<Target Name="CopyDocs" AfterTargets="Build">
|
||||||
<Copy SourceFiles="$(OutputPath)CompanyManagment.App.Contracts.xml" DestinationFolder="../ServiceHost\bin\Debug\net8.0\" />
|
<Copy SourceFiles="$(TargetDir)CompanyManagment.App.Contracts.xml"
|
||||||
|
DestinationFolder="../ServiceHost\bin\$(Configuration)\net10.0\"
|
||||||
|
Condition="Exists('$(TargetDir)CompanyManagment.App.Contracts.xml')" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.Contract;
|
||||||
|
|
||||||
|
public enum ContractListOrderType
|
||||||
|
{
|
||||||
|
ByContractCreationDate,
|
||||||
|
BySignedContract,
|
||||||
|
ByUnSignedContract,
|
||||||
|
ByPersonnelCode,
|
||||||
|
ByPersonnelCodeDescending,
|
||||||
|
ByContractStartDate,
|
||||||
|
ByContractStartDateDescending
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.Contract;
|
||||||
|
|
||||||
|
public class GetContractListForClientRequest: PaginationRequest
|
||||||
|
{
|
||||||
|
public int Year { get; set; }
|
||||||
|
public int Month { get; set; }
|
||||||
|
public string StartDate { get; set; }
|
||||||
|
public string EndDate { get; set; }
|
||||||
|
public long EmployeeId { get; set; }
|
||||||
|
public ContractListOrderType? OrderType { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.Contract;
|
||||||
|
|
||||||
|
public class GetContractListForClientResponse
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string PersonnelCode { get; set; }
|
||||||
|
public string ContractNo { get; set; }
|
||||||
|
public string EmployeeFullName { get; set; }
|
||||||
|
public string ContractStart { get; set; }
|
||||||
|
public string ContractEnd { get; set; }
|
||||||
|
public bool IsSigned { get; set; }
|
||||||
|
public string DailyWage { get; set; }
|
||||||
|
public string AvgWorkingHour { get; set; }
|
||||||
|
public string FamilyAllowance { get; set; }
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
using CompanyManagment.App.Contracts.Workshop;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.Contract;
|
namespace CompanyManagment.App.Contracts.Contract;
|
||||||
|
|
||||||
public interface IContractApplication
|
public interface IContractApplication
|
||||||
@@ -45,7 +47,20 @@ public interface IContractApplication
|
|||||||
#region Client
|
#region Client
|
||||||
|
|
||||||
OperationResult Remove(long id);
|
OperationResult Remove(long id);
|
||||||
|
|
||||||
|
[Obsolete("این متد منسوخ شده است. لطفاً از متد GetContractListForClient استفاده کنید.")]
|
||||||
List<ContractViweModel> SearchForClient(ContractSearchModel searchModel);
|
List<ContractViweModel> SearchForClient(ContractSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیست قراردادها برای کلاینت
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<PagedResult<GetContractListForClientResponse>>
|
||||||
|
GetContractListForClient(GetContractListForClientRequest searchModel);
|
||||||
|
Task<ContractPrintViewModel> PrintOneAsync(long id);
|
||||||
|
Task<List<ContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region NewChangeByHeydari
|
#region NewChangeByHeydari
|
||||||
@@ -58,3 +73,75 @@ public interface IContractApplication
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ContractPrintViewModel
|
||||||
|
{
|
||||||
|
public string ContractNo { get; set; }
|
||||||
|
public ContractPrintEmployerViewModel Employer { get; set; }
|
||||||
|
public ContractPrintEmployeeViewModel Employee { get; set; }
|
||||||
|
public ContractPrintTypeOfContractViewModel TypeOfContract { get; set; }
|
||||||
|
public ContractPrintFeesViewModel Fees { get; set; }
|
||||||
|
public string ConditionAndDetials { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContractPrintFeesViewModel
|
||||||
|
{
|
||||||
|
public string DailyWage { get; set; }
|
||||||
|
public string FamilyAllowance { get; set; }
|
||||||
|
public string ConsumableItems { get; set; }
|
||||||
|
public string HousingAllowance { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContractPrintTypeOfContractViewModel
|
||||||
|
{
|
||||||
|
public string ContractType { get; set; }
|
||||||
|
public string JobName { get; set; }
|
||||||
|
public string SetContractDate { get; set; }
|
||||||
|
public string ContarctStart { get; set; }
|
||||||
|
public string ContractEnd { get; set; }
|
||||||
|
public string WorkingHoursWeekly { get; set; }
|
||||||
|
public List<string> WorkshopAddress { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContractPrintEmployeeViewModel
|
||||||
|
{
|
||||||
|
public string FullName { get; set; }
|
||||||
|
public string NationalCode { get; set; }
|
||||||
|
public string IdNumber { get; set; }
|
||||||
|
public string DateOfBirth { get; set; }
|
||||||
|
public string FatherName { get; set; }
|
||||||
|
public string LevelOfEducation { get; set; }
|
||||||
|
public string Address { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContractPrintEmployerViewModel
|
||||||
|
{
|
||||||
|
public LegalType LegalType { get; set; }
|
||||||
|
public ContractPrintRealEmployerViewModel RealEmployer { get; set; }
|
||||||
|
public ContractPrintLegalEmployerViewModel LegalEmployer { get; set; }
|
||||||
|
public string WorkshopName { get; set; }
|
||||||
|
public string Address { get; set; }
|
||||||
|
public string WorkshopCode { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContractPrintLegalEmployerViewModel
|
||||||
|
{
|
||||||
|
public string CompanyName { get; set; }
|
||||||
|
public string NationalId { get; set; }
|
||||||
|
public string RegisterId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContractPrintRealEmployerViewModel
|
||||||
|
{
|
||||||
|
public string FullName { get; set; }
|
||||||
|
public string NationalCode { get; set; }
|
||||||
|
public string IdNumber { get; set; }
|
||||||
|
}
|
||||||
@@ -60,7 +60,7 @@ public interface IEmployeeApplication
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<OperationResult<EmployeeByNationalCodeInWorkshopViewModel>>
|
Task<OperationResult<EmployeeByNationalCodeInWorkshopViewModel>>
|
||||||
ValidateCreateEmployeeClientByNationalCodeAndWorkshopId(string nationalCode,
|
ValidateCreateEmployeeClientByNationalCodeAndWorkshopId(string nationalCode,
|
||||||
string birthDate, long workshopId);
|
string birthDate,bool authorizedCanceled, long workshopId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پرسنل هایی که در کارگاهی از سمت ادمین شروع به کار کرده اند
|
/// پرسنل هایی که در کارگاهی از سمت ادمین شروع به کار کرده اند
|
||||||
@@ -95,6 +95,41 @@ public interface IEmployeeApplication
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<List<GetEmployeeListViewModel>> GetList(GetEmployeeListSearchModel searchModel);
|
Task<List<GetEmployeeListViewModel>> GetList(GetEmployeeListSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیست کل پرسنل کلاینت
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<GetClientEmployeeListViewModel>> GetClientEmployeeList(GetClientEmployeeListSearchModel searchModel, long workshopId);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class GetClientEmployeeListSearchModel
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetClientEmployeeListViewModel
|
||||||
|
{
|
||||||
|
public string FullName { get; set; }
|
||||||
|
public long EmployeeId { get; set; }
|
||||||
|
public long WorkshopId { get; set; }
|
||||||
|
public long PersonnelCode { get; set; }
|
||||||
|
public string MaritalStatus { get; set; }
|
||||||
|
public string NationalCode { get; set; }
|
||||||
|
public string IdNumber { get; set; }
|
||||||
|
public string DateOfBirthFa { get; set; }
|
||||||
|
public string FatherName { get; set; }
|
||||||
|
public int ChildrenCount { get; set; }
|
||||||
|
public string LastStartInsuranceWork { get; set; }
|
||||||
|
public string LastLeftInsuranceWork { get; set; }
|
||||||
|
public string LastStartContractWork { get; set; }
|
||||||
|
public string LastLeftContractWork { get; set; }
|
||||||
|
public bool HasContractLeftWork { get; set; }
|
||||||
|
public bool HasInsuranceLeftWork { get; set; }
|
||||||
|
public bool LeftWorkCompletely { get; set; }
|
||||||
|
public bool PendingStartWork { get; set; }
|
||||||
|
public bool PendingLeftWork { get; set; }
|
||||||
|
}
|
||||||
@@ -13,5 +13,6 @@ namespace CompanyManagment.App.Contracts.EmployeeDocuments
|
|||||||
public string EmployerName { get; set; }
|
public string EmployerName { get; set; }
|
||||||
public List<EmployeeDocumentItemViewModel> SubmittedItems { get; set; }
|
public List<EmployeeDocumentItemViewModel> SubmittedItems { get; set; }
|
||||||
public int EmployeesWithoutDocumentCount { get; set; }
|
public int EmployeesWithoutDocumentCount { get; set; }
|
||||||
|
public long EmployeeId { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user