Compare commits
No commits in common. "dev" and "command-1.0.20" have entirely different histories.
dev
...
command-1.
901 changed files with 26024 additions and 2204326 deletions
|
|
@ -23,11 +23,3 @@
|
||||||
**/values.dev.yaml
|
**/values.dev.yaml
|
||||||
LICENSE
|
LICENSE
|
||||||
README.md
|
README.md
|
||||||
.git
|
|
||||||
**/bin/
|
|
||||||
**/obj/
|
|
||||||
.vscode/
|
|
||||||
.dockerignore
|
|
||||||
.gitignore
|
|
||||||
README.md
|
|
||||||
*.md
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
name: Build & Deploy Checkin Service
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "checkin-dev[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
- "checkin-dev[0-9]+.[0-9]+.[0-9]+*"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ vars.CONTAINER_REGISTRY }}
|
|
||||||
REGISTRY_USERNAME: ${{ vars.CONTAINER_REGISTRY_USERNAME }}
|
|
||||||
REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
|
|
||||||
CONTAINER_IMAGE_NAME: ${{ vars.CONTAINER_REGISTRY }}/${{ vars.CONTAINER_IMAGE_OWNER }}
|
|
||||||
IMAGE_VERSION: latest
|
|
||||||
SERVICE_NAME: hrms-api-checkin
|
|
||||||
DISCORD_WEBHOOK: ${{ vars.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Tag Version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "push" ]]; then
|
|
||||||
VERSION=$(echo "${{ github.ref_name }}" | sed 's/checkin-dev//g')
|
|
||||||
echo "IMAGE_VERSION=${VERSION}" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_VERSION=${{ env.IMAGE_VERSION }}-${{ github.run_number }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ env.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ env.REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64
|
|
||||||
context: .
|
|
||||||
file: ./BMA.EHR.CheckInConsumer/Dockerfile
|
|
||||||
tags: ${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:latest,${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_VERSION }}
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Remote Deploy
|
|
||||||
uses: appleboy/ssh-action@v1.2.1
|
|
||||||
with:
|
|
||||||
host: ${{ vars.SSH_DEPLOY_HOST }}
|
|
||||||
port: ${{ vars.SSH_DEPLOY_PORT }}
|
|
||||||
username: ${{ secrets.SSH_DEPLOY_USER }}
|
|
||||||
password: ${{ secrets.SSH_DEPLOY_PASSWORD }}
|
|
||||||
script: |
|
|
||||||
cd ~/repo
|
|
||||||
./replace-env.sh API_CHECKIN "${{ env.IMAGE_VERSION }}"
|
|
||||||
./deploy.sh ${{ env.SERVICE_NAME }}
|
|
||||||
|
|
||||||
- name: Discord Notification
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
STATUS="${{ job.status == 'success' && '✅ Success' || '❌ Failed' }}"
|
|
||||||
COLOR="${{ job.status == 'success' && '3066993' || '15158332' }}"
|
|
||||||
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{
|
|
||||||
\"embeds\": [{
|
|
||||||
\"title\": \"$STATUS\",
|
|
||||||
\"description\": \"**Build & Deploy**\\n- Image: \`${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}\`\\n- Version: \`${{ env.IMAGE_VERSION }}\`\\n- By: \`${{ gitea.actor }}\`\",
|
|
||||||
\"color\": $COLOR,
|
|
||||||
\"footer\": {
|
|
||||||
\"text\": \"Release Notification\",
|
|
||||||
\"icon_url\": \"https://example.com/success-icon.png\"
|
|
||||||
},
|
|
||||||
\"timestamp\": \"$TIMESTAMP\"
|
|
||||||
}]
|
|
||||||
}" \
|
|
||||||
${{ env.DISCORD_WEBHOOK }}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
name: Build & Deploy Discipline Service
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "discipline-dev[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
- "discipline-dev[0-9]+.[0-9]+.[0-9]+*"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ vars.CONTAINER_REGISTRY }}
|
|
||||||
REGISTRY_USERNAME: ${{ vars.CONTAINER_REGISTRY_USERNAME }}
|
|
||||||
REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
|
|
||||||
CONTAINER_IMAGE_NAME: ${{ vars.CONTAINER_REGISTRY }}/${{ vars.CONTAINER_IMAGE_OWNER }}
|
|
||||||
IMAGE_VERSION: latest
|
|
||||||
SERVICE_NAME: hrms-api-discipline
|
|
||||||
DISCORD_WEBHOOK: ${{ vars.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Tag Version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "push" ]]; then
|
|
||||||
VERSION=$(echo "${{ github.ref_name }}" | sed 's/discipline-dev//g')
|
|
||||||
echo "IMAGE_VERSION=${VERSION}" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_VERSION=${{ env.IMAGE_VERSION }}-${{ github.run_number }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ env.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ env.REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64
|
|
||||||
context: .
|
|
||||||
file: ./BMA.EHR.Discipline.Service/Dockerfile
|
|
||||||
tags: ${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:latest,${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_VERSION }}
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Remote Deploy
|
|
||||||
uses: appleboy/ssh-action@v1.2.1
|
|
||||||
with:
|
|
||||||
host: ${{ vars.SSH_DEPLOY_HOST }}
|
|
||||||
port: ${{ vars.SSH_DEPLOY_PORT }}
|
|
||||||
username: ${{ secrets.SSH_DEPLOY_USER }}
|
|
||||||
password: ${{ secrets.SSH_DEPLOY_PASSWORD }}
|
|
||||||
script: |
|
|
||||||
cd ~/repo
|
|
||||||
./replace-env.sh API_DISCIPLINE "${{ env.IMAGE_VERSION }}"
|
|
||||||
./deploy.sh ${{ env.SERVICE_NAME }}
|
|
||||||
|
|
||||||
- name: Discord Notification
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
STATUS="${{ job.status == 'success' && '✅ Success' || '❌ Failed' }}"
|
|
||||||
COLOR="${{ job.status == 'success' && '3066993' || '15158332' }}"
|
|
||||||
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{
|
|
||||||
\"embeds\": [{
|
|
||||||
\"title\": \"$STATUS\",
|
|
||||||
\"description\": \"**Build & Deploy**\\n- Image: \`${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}\`\\n- Version: \`${{ env.IMAGE_VERSION }}\`\\n- By: \`${{ gitea.actor }}\`\",
|
|
||||||
\"color\": $COLOR,
|
|
||||||
\"footer\": {
|
|
||||||
\"text\": \"Release Notification\",
|
|
||||||
\"icon_url\": \"https://example.com/success-icon.png\"
|
|
||||||
},
|
|
||||||
\"timestamp\": \"$TIMESTAMP\"
|
|
||||||
}]
|
|
||||||
}" \
|
|
||||||
${{ env.DISCORD_WEBHOOK }}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
name: Build & Deploy Insignia Service
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "insignia-dev[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
- "insignia-dev[0-9]+.[0-9]+.[0-9]+*"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ vars.CONTAINER_REGISTRY }}
|
|
||||||
REGISTRY_USERNAME: ${{ vars.CONTAINER_REGISTRY_USERNAME }}
|
|
||||||
REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
|
|
||||||
CONTAINER_IMAGE_NAME: ${{ vars.CONTAINER_REGISTRY }}/${{ vars.CONTAINER_IMAGE_OWNER }}
|
|
||||||
IMAGE_VERSION: latest
|
|
||||||
SERVICE_NAME: hrms-api-insignia
|
|
||||||
DISCORD_WEBHOOK: ${{ vars.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Tag Version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "push" ]]; then
|
|
||||||
VERSION=$(echo "${{ github.ref_name }}" | sed 's/insignia-dev//g')
|
|
||||||
echo "IMAGE_VERSION=${VERSION}" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_VERSION=${{ env.IMAGE_VERSION }}-${{ github.run_number }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ env.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ env.REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64
|
|
||||||
context: .
|
|
||||||
file: ./BMA.EHR.Insignia/Dockerfile
|
|
||||||
tags: ${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:latest,${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_VERSION }}
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Remote Deploy
|
|
||||||
uses: appleboy/ssh-action@v1.2.1
|
|
||||||
with:
|
|
||||||
host: ${{ vars.SSH_DEPLOY_HOST }}
|
|
||||||
port: ${{ vars.SSH_DEPLOY_PORT }}
|
|
||||||
username: ${{ secrets.SSH_DEPLOY_USER }}
|
|
||||||
password: ${{ secrets.SSH_DEPLOY_PASSWORD }}
|
|
||||||
script: |
|
|
||||||
cd ~/repo
|
|
||||||
./replace-env.sh API_INSIGNIA "${{ env.IMAGE_VERSION }}"
|
|
||||||
./deploy.sh ${{ env.SERVICE_NAME }}
|
|
||||||
|
|
||||||
- name: Discord Notification
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
STATUS="${{ job.status == 'success' && '✅ Success' || '❌ Failed' }}"
|
|
||||||
COLOR="${{ job.status == 'success' && '3066993' || '15158332' }}"
|
|
||||||
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{
|
|
||||||
\"embeds\": [{
|
|
||||||
\"title\": \"$STATUS\",
|
|
||||||
\"description\": \"**Build & Deploy**\\n- Image: \`${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}\`\\n- Version: \`${{ env.IMAGE_VERSION }}\`\\n- By: \`${{ gitea.actor }}\`\",
|
|
||||||
\"color\": $COLOR,
|
|
||||||
\"footer\": {
|
|
||||||
\"text\": \"Release Notification\",
|
|
||||||
\"icon_url\": \"https://example.com/success-icon.png\"
|
|
||||||
},
|
|
||||||
\"timestamp\": \"$TIMESTAMP\"
|
|
||||||
}]
|
|
||||||
}" \
|
|
||||||
${{ env.DISCORD_WEBHOOK }}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
name: Build & Deploy Leave Service
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "leave-dev[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
- "leave-dev[0-9]+.[0-9]+.[0-9]+*"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ vars.CONTAINER_REGISTRY }}
|
|
||||||
REGISTRY_USERNAME: ${{ vars.CONTAINER_REGISTRY_USERNAME }}
|
|
||||||
REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
|
|
||||||
CONTAINER_IMAGE_NAME: ${{ vars.CONTAINER_REGISTRY }}/${{ vars.CONTAINER_IMAGE_OWNER }}
|
|
||||||
IMAGE_VERSION: latest
|
|
||||||
SERVICE_NAME: hrms-api-leave
|
|
||||||
DISCORD_WEBHOOK: ${{ vars.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Tag Version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "push" ]]; then
|
|
||||||
VERSION=$(echo "${{ github.ref_name }}" | sed 's/leave-dev//g')
|
|
||||||
echo "IMAGE_VERSION=${VERSION}" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_VERSION=${{ env.IMAGE_VERSION }}-${{ github.run_number }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ env.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ env.REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64
|
|
||||||
context: .
|
|
||||||
file: ./BMA.EHR.Leave/Dockerfile
|
|
||||||
tags: ${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:latest,${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_VERSION }}
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Remote Deploy
|
|
||||||
uses: appleboy/ssh-action@v1.2.1
|
|
||||||
with:
|
|
||||||
host: ${{ vars.SSH_DEPLOY_HOST }}
|
|
||||||
port: ${{ vars.SSH_DEPLOY_PORT }}
|
|
||||||
username: ${{ secrets.SSH_DEPLOY_USER }}
|
|
||||||
password: ${{ secrets.SSH_DEPLOY_PASSWORD }}
|
|
||||||
script: |
|
|
||||||
cd ~/repo
|
|
||||||
./replace-env.sh API_LEAVE "${{ env.IMAGE_VERSION }}"
|
|
||||||
./deploy.sh ${{ env.SERVICE_NAME }}
|
|
||||||
|
|
||||||
- name: Discord Notification
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
STATUS="${{ job.status == 'success' && '✅ Success' || '❌ Failed' }}"
|
|
||||||
COLOR="${{ job.status == 'success' && '3066993' || '15158332' }}"
|
|
||||||
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{
|
|
||||||
\"embeds\": [{
|
|
||||||
\"title\": \"$STATUS\",
|
|
||||||
\"description\": \"**Build & Deploy**\\n- Image: \`${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}\`\\n- Version: \`${{ env.IMAGE_VERSION }}\`\\n- By: \`${{ gitea.actor }}\`\",
|
|
||||||
\"color\": $COLOR,
|
|
||||||
\"footer\": {
|
|
||||||
\"text\": \"Release Notification\",
|
|
||||||
\"icon_url\": \"https://example.com/success-icon.png\"
|
|
||||||
},
|
|
||||||
\"timestamp\": \"$TIMESTAMP\"
|
|
||||||
}]
|
|
||||||
}" \
|
|
||||||
${{ env.DISCORD_WEBHOOK }}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
name: Build & Deploy Placement Service
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "placement-dev[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
- "placement-dev[0-9]+.[0-9]+.[0-9]+*"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ vars.CONTAINER_REGISTRY }}
|
|
||||||
REGISTRY_USERNAME: ${{ vars.CONTAINER_REGISTRY_USERNAME }}
|
|
||||||
REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
|
|
||||||
CONTAINER_IMAGE_NAME: ${{ vars.CONTAINER_REGISTRY }}/${{ vars.CONTAINER_IMAGE_OWNER }}
|
|
||||||
IMAGE_VERSION: latest
|
|
||||||
SERVICE_NAME: hrms-api-placement
|
|
||||||
DISCORD_WEBHOOK: ${{ vars.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Tag Version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "push" ]]; then
|
|
||||||
VERSION=$(echo "${{ github.ref_name }}" | sed 's/placement-dev//g')
|
|
||||||
echo "IMAGE_VERSION=${VERSION}" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_VERSION=${{ env.IMAGE_VERSION }}-${{ github.run_number }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ env.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ env.REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64
|
|
||||||
context: .
|
|
||||||
file: ./BMA.EHR.Placement.Service/Dockerfile
|
|
||||||
tags: ${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:latest,${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_VERSION }}
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Remote Deploy
|
|
||||||
uses: appleboy/ssh-action@v1.2.1
|
|
||||||
with:
|
|
||||||
host: ${{ vars.SSH_DEPLOY_HOST }}
|
|
||||||
port: ${{ vars.SSH_DEPLOY_PORT }}
|
|
||||||
username: ${{ secrets.SSH_DEPLOY_USER }}
|
|
||||||
password: ${{ secrets.SSH_DEPLOY_PASSWORD }}
|
|
||||||
script: |
|
|
||||||
cd ~/repo
|
|
||||||
./replace-env.sh API_PLACEMENT "${{ env.IMAGE_VERSION }}"
|
|
||||||
./deploy.sh ${{ env.SERVICE_NAME }}
|
|
||||||
|
|
||||||
- name: Discord Notification
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
STATUS="${{ job.status == 'success' && '✅ Success' || '❌ Failed' }}"
|
|
||||||
COLOR="${{ job.status == 'success' && '3066993' || '15158332' }}"
|
|
||||||
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{
|
|
||||||
\"embeds\": [{
|
|
||||||
\"title\": \"$STATUS\",
|
|
||||||
\"description\": \"**Build & Deploy**\\n- Image: \`${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}\`\\n- Version: \`${{ env.IMAGE_VERSION }}\`\\n- By: \`${{ gitea.actor }}\`\",
|
|
||||||
\"color\": $COLOR,
|
|
||||||
\"footer\": {
|
|
||||||
\"text\": \"Release Notification\",
|
|
||||||
\"icon_url\": \"https://example.com/success-icon.png\"
|
|
||||||
},
|
|
||||||
\"timestamp\": \"$TIMESTAMP\"
|
|
||||||
}]
|
|
||||||
}" \
|
|
||||||
${{ env.DISCORD_WEBHOOK }}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
name: Build & Deploy Retirement Service
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "retirement-dev[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
- "retirement-dev[0-9]+.[0-9]+.[0-9]+*"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ vars.CONTAINER_REGISTRY }}
|
|
||||||
REGISTRY_USERNAME: ${{ vars.CONTAINER_REGISTRY_USERNAME }}
|
|
||||||
REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
|
|
||||||
CONTAINER_IMAGE_NAME: ${{ vars.CONTAINER_REGISTRY }}/${{ vars.CONTAINER_IMAGE_OWNER }}
|
|
||||||
IMAGE_VERSION: latest
|
|
||||||
SERVICE_NAME: hrms-api-retirement
|
|
||||||
DISCORD_WEBHOOK: ${{ vars.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Tag Version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "push" ]]; then
|
|
||||||
VERSION=$(echo "${{ github.ref_name }}" | sed 's/retirement-dev//g')
|
|
||||||
echo "IMAGE_VERSION=${VERSION}" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_VERSION=${{ env.IMAGE_VERSION }}-${{ github.run_number }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ env.REGISTRY_USERNAME }}
|
|
||||||
password: ${{ env.REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
platforms: linux/amd64
|
|
||||||
context: .
|
|
||||||
file: ./BMA.EHR.Retirement.Service/Dockerfile
|
|
||||||
tags: ${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:latest,${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}:${{ env.IMAGE_VERSION }}
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Remote Deploy
|
|
||||||
uses: appleboy/ssh-action@v1.2.1
|
|
||||||
with:
|
|
||||||
host: ${{ vars.SSH_DEPLOY_HOST }}
|
|
||||||
port: ${{ vars.SSH_DEPLOY_PORT }}
|
|
||||||
username: ${{ secrets.SSH_DEPLOY_USER }}
|
|
||||||
password: ${{ secrets.SSH_DEPLOY_PASSWORD }}
|
|
||||||
script: |
|
|
||||||
cd ~/repo
|
|
||||||
./replace-env.sh API_RETIREMENT "${{ env.IMAGE_VERSION }}"
|
|
||||||
./deploy.sh ${{ env.SERVICE_NAME }}
|
|
||||||
|
|
||||||
- name: Discord Notification
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
STATUS="${{ job.status == 'success' && '✅ Success' || '❌ Failed' }}"
|
|
||||||
COLOR="${{ job.status == 'success' && '3066993' || '15158332' }}"
|
|
||||||
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{
|
|
||||||
\"embeds\": [{
|
|
||||||
\"title\": \"$STATUS\",
|
|
||||||
\"description\": \"**Build & Deploy**\\n- Image: \`${{ env.CONTAINER_IMAGE_NAME }}/${{ env.SERVICE_NAME }}\`\\n- Version: \`${{ env.IMAGE_VERSION }}\`\\n- By: \`${{ gitea.actor }}\`\",
|
|
||||||
\"color\": $COLOR,
|
|
||||||
\"footer\": {
|
|
||||||
\"text\": \"Release Notification\",
|
|
||||||
\"icon_url\": \"https://example.com/success-icon.png\"
|
|
||||||
},
|
|
||||||
\"timestamp\": \"$TIMESTAMP\"
|
|
||||||
}]
|
|
||||||
}" \
|
|
||||||
${{ env.DISCORD_WEBHOOK }}
|
|
||||||
22
.github/workflows/discord-notify.yml
vendored
22
.github/workflows/discord-notify.yml
vendored
|
|
@ -1,22 +0,0 @@
|
||||||
name: Discord PR Notify
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
discord:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Send Discord
|
|
||||||
run: |
|
|
||||||
curl -X POST "${{ secrets.DISCORD_WEBHOOK_PULLREQUEST }}" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "🔔 **Service:** ${{ github.repository }}",
|
|
||||||
"description": "👤 **Author:** ${{ github.event.pull_request.user.login }}\n🌿 **Branch:** ${{ github.event.pull_request.head.ref }} → ${{ github.event.pull_request.base.ref }}\n📦 **Pull Request:** [#${{ github.event.pull_request.number }} - ${{ github.event.pull_request.title }}](${{ github.event.pull_request.html_url }})",
|
|
||||||
"color": 5814783,
|
|
||||||
"timestamp": "${{ github.event.pull_request.created_at }}"
|
|
||||||
}]
|
|
||||||
}'
|
|
||||||
101
.github/workflows/dockerhub-release-checkin.yaml
vendored
101
.github/workflows/dockerhub-release-checkin.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - CheckIn Consumer
|
|
||||||
run-name: DockerHub Release - CheckIn Consumer by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "checkin-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-checkin
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.CheckInConsumer/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR CheckIn Consumer
|
|
||||||
org.opencontainers.image.description=HRMS CheckIn Consumer Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
101
.github/workflows/dockerhub-release-command.yaml
vendored
101
.github/workflows/dockerhub-release-command.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - Command Service
|
|
||||||
run-name: DockerHub Release - Command Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "command-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-command
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Command.Service/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR Command Service
|
|
||||||
org.opencontainers.image.description=HRMS Command API Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
101
.github/workflows/dockerhub-release-discipline.yaml
vendored
101
.github/workflows/dockerhub-release-discipline.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - Discipline Service
|
|
||||||
run-name: DockerHub Release - Discipline Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "discipline-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-discipline
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Discipline.Service/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR Discipline Service
|
|
||||||
org.opencontainers.image.description=HRMS Discipline API Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
101
.github/workflows/dockerhub-release-insignia.yaml
vendored
101
.github/workflows/dockerhub-release-insignia.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - Insignia Service
|
|
||||||
run-name: DockerHub Release - Insignia Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "insignia-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-insignia
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Insignia/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR Insignia Service
|
|
||||||
org.opencontainers.image.description=HRMS Insignia API Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
119
.github/workflows/dockerhub-release-leave.yaml
vendored
119
.github/workflows/dockerhub-release-leave.yaml
vendored
|
|
@ -1,119 +0,0 @@
|
||||||
name: DockerHub Release - Leave Service
|
|
||||||
run-name: DockerHub Release - Leave Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "leave-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
# branches:
|
|
||||||
# - main
|
|
||||||
# - develop
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-leave
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
elif [[ $GITHUB_REF == 'refs/heads/'* ]]; then
|
|
||||||
BRANCH_NAME=${GITHUB_REF#refs/heads/}
|
|
||||||
IMAGE_VER="${BRANCH_NAME}-latest"
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Extract metadata for Docker
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}
|
|
||||||
tags: |
|
|
||||||
type=ref,event=tag
|
|
||||||
type=ref,event=branch
|
|
||||||
type=raw,value=${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
type=raw,value=latest,enable={{is_default_branch}}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Leave/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Image digest
|
|
||||||
run: echo "Image pushed with digest ${{ steps.build.outputs.digest }}"
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
101
.github/workflows/dockerhub-release-placement.yaml
vendored
101
.github/workflows/dockerhub-release-placement.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - Placement Service
|
|
||||||
run-name: DockerHub Release - Placement Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "placement-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-placement
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Placement.Service/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR Placement Service
|
|
||||||
org.opencontainers.image.description=HRMS Placement API Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
101
.github/workflows/dockerhub-release-reportv2.yaml
vendored
101
.github/workflows/dockerhub-release-reportv2.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - Report Service
|
|
||||||
run-name: DockerHub Release - Report Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "reportv2-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-reportv2
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Report.Service/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR Report Service
|
|
||||||
org.opencontainers.image.description=HRMS Report API Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
101
.github/workflows/dockerhub-release-retirement.yaml
vendored
101
.github/workflows/dockerhub-release-retirement.yaml
vendored
|
|
@ -1,101 +0,0 @@
|
||||||
name: DockerHub Release - Retirement Service
|
|
||||||
run-name: DockerHub Release - Retirement Service by ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "retirement-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
IMAGE_VER:
|
|
||||||
description: "Image version (e.g., latest, v1.0.0)"
|
|
||||||
required: false
|
|
||||||
default: "latest"
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: hrms-api-retirement
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-to-dockerhub:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Generate version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo "image_ver=${IMAGE_VER}" >> $GITHUB_OUTPUT
|
|
||||||
echo "Generated version: ${IMAGE_VER}"
|
|
||||||
|
|
||||||
- name: Display version
|
|
||||||
run: |
|
|
||||||
echo "Git Ref: $GITHUB_REF"
|
|
||||||
echo "Image Version: ${{ steps.gen_ver.outputs.image_ver }}"
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{env.DOCKERHUB_REGISTRY}}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: BMA.EHR.Retirement.Service/Dockerfile
|
|
||||||
platforms: linux/amd64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.title=BMA EHR Retirement Service
|
|
||||||
org.opencontainers.image.description=HRMS Retirement API Service
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Notify Discord on success
|
|
||||||
if: success()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="✅ DockerHub release succeeded\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
|
|
||||||
- name: Notify Discord on failure
|
|
||||||
if: failure()
|
|
||||||
env:
|
|
||||||
IMAGE_VER: ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
run: |
|
|
||||||
TAG_INFO="Tag: ${IMAGE_VER:-unknown}"
|
|
||||||
REF_INFO="Ref: ${GITHUB_REF}"
|
|
||||||
ACTOR_INFO="Actor: ${GITHUB_ACTOR}"
|
|
||||||
MSG="❌ DockerHub release failed\n${TAG_INFO}\n${REF_INFO}\n${ACTOR_INFO}"
|
|
||||||
curl -s -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d "{\"content\":\"${MSG}\"}" \
|
|
||||||
"$DISCORD_WEBHOOK"
|
|
||||||
180
.github/workflows/release_Retirement.yaml
vendored
180
.github/workflows/release_Retirement.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "retirement-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-retirement-service
|
IMAGE_NAME: ehr/bma-ehr-retirement-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-retirement
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-retirement
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_retirement.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_retirement.yaml --input IMAGE_VER=retirement-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Login in to registry
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/login-action@v2
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
registry: ${{env.REGISTRY}}
|
||||||
with:
|
username: ${{secrets.DOCKER_USER}}
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
- name: Build and load local docker image
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
uses: docker/build-push-action@v3
|
||||||
- name: Build and load local docker image
|
with:
|
||||||
uses: docker/build-push-action@v3
|
context: .
|
||||||
with:
|
platforms: linux/amd64
|
||||||
context: .
|
file: BMA.EHR.Retirement.Service/Dockerfile
|
||||||
platforms: linux/amd64
|
push: true
|
||||||
file: BMA.EHR.Retirement.Service/Dockerfile
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
|
|
||||||
- name: Reload docker compose
|
- name: Reload docker compose
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
with:
|
with:
|
||||||
host: ${{env.DEPLOY_HOST}}
|
host: ${{env.DEPLOY_HOST}}
|
||||||
username: frappet
|
username: frappet
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
port: ${{env.DEPLOY_PORT}}
|
port: 22
|
||||||
script: |
|
script: |
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
docker compose pull
|
docker-compose pull
|
||||||
docker compose up -d
|
docker-compose up -d
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
- name: Notify Discord Success
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
with:
|
||||||
curl -H "Content-Type: application/json" \
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
-X POST \
|
message: |
|
||||||
-d '{
|
-Success✅✅✅
|
||||||
"embeds": [{
|
Image: ${{env.IMAGE_NAME}}
|
||||||
"title": "✅ Deployment Success!",
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
By: ${{secrets.DOCKER_USER}}
|
||||||
"color": 3066993,
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
"footer": {
|
if: failure()
|
||||||
"text": "Release Notification",
|
with:
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
},
|
message: |
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
-Failure❌❌❌
|
||||||
}]
|
Image: ${{env.IMAGE_NAME}}
|
||||||
}' \
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
By: ${{secrets.DOCKER_USER}}
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
90
.github/workflows/release_checkin_consumer.yaml
vendored
90
.github/workflows/release_checkin_consumer.yaml
vendored
|
|
@ -1,90 +0,0 @@
|
||||||
name: release-dev
|
|
||||||
run-name: release-dev ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
# push:
|
|
||||||
# tags:
|
|
||||||
# - "consumer-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
REGISTRY: docker.frappet.com
|
|
||||||
IMAGE_NAME: ehr/bma-ehr-checkin-consumer
|
|
||||||
DEPLOY_HOST: frappet.com
|
|
||||||
DEPLOY_PORT: 10102
|
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-leave
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# act workflow_dispatch -W .github/workflows/release_leave.yaml --input IMAGE_VER=leave-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
|
||||||
release-dev:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
# skip Set up QEMU because it fail on act and container
|
|
||||||
# Gen Version try to get version from tag or inut
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
- name: Gen Version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
|
||||||
- name: Check Version
|
|
||||||
run: |
|
|
||||||
echo $GITHUB_REF
|
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: ${{env.REGISTRY}}
|
|
||||||
username: ${{secrets.DOCKER_USER}}
|
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
|
||||||
- name: Build and push docker image
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
file: BMA.EHR.CheckInConsumer/Dockerfile
|
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
- name: Remote Deployment
|
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
|
||||||
with:
|
|
||||||
host: ${{env.DEPLOY_HOST}}
|
|
||||||
username: frappet
|
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
|
||||||
port: 10102
|
|
||||||
script: |
|
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
|
||||||
- uses: snow-actions/line-notify@v1.1.0
|
|
||||||
if: success()
|
|
||||||
with:
|
|
||||||
access_token: ${{ secrets.TOKEN_LINE }}
|
|
||||||
message: |
|
|
||||||
-Success✅✅✅
|
|
||||||
Image: ${{env.IMAGE_NAME}}
|
|
||||||
Version: ${{ steps.gen_ver.outputs.IMAGE_VER }}
|
|
||||||
By: ${{secrets.DOCKER_USER}}
|
|
||||||
- uses: snow-actions/line-notify@v1.1.0
|
|
||||||
if: failure()
|
|
||||||
with:
|
|
||||||
access_token: ${{ secrets.TOKEN_LINE }}
|
|
||||||
message: |
|
|
||||||
-Failure❌❌❌
|
|
||||||
Image: ${{env.IMAGE_NAME}}
|
|
||||||
Version: ${{ steps.gen_ver.outputs.IMAGE_VER }}
|
|
||||||
By: ${{secrets.DOCKER_USER}}
|
|
||||||
180
.github/workflows/release_command.yaml
vendored
180
.github/workflows/release_command.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "command-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-command-service
|
IMAGE_NAME: ehr/bma-ehr-command-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-command
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-command
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_command.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_command.yaml --input IMAGE_VER=command-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Login in to registry
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/login-action@v2
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
registry: ${{env.REGISTRY}}
|
||||||
with:
|
username: ${{secrets.DOCKER_USER}}
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
- name: Build and load local docker image
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
uses: docker/build-push-action@v3
|
||||||
- name: Build and load local docker image
|
with:
|
||||||
uses: docker/build-push-action@v3
|
context: .
|
||||||
with:
|
platforms: linux/amd64
|
||||||
context: .
|
file: BMA.EHR.Command.Service/Dockerfile
|
||||||
platforms: linux/amd64
|
push: true
|
||||||
file: BMA.EHR.Command.Service/Dockerfile
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
|
|
||||||
- name: Reload docker compose
|
- name: Reload docker compose
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
with:
|
with:
|
||||||
host: ${{env.DEPLOY_HOST}}
|
host: ${{env.DEPLOY_HOST}}
|
||||||
username: frappet
|
username: frappet
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
port: ${{env.DEPLOY_PORT}}
|
port: 22
|
||||||
script: |
|
script: |
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
docker compose pull
|
docker-compose pull
|
||||||
docker compose up -d
|
docker-compose up -d
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
- name: Notify Discord Success
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
with:
|
||||||
curl -H "Content-Type: application/json" \
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
-X POST \
|
message: |
|
||||||
-d '{
|
-Success✅✅✅
|
||||||
"embeds": [{
|
Image: ${{env.IMAGE_NAME}}
|
||||||
"title": "✅ Deployment Success!",
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
By: ${{secrets.DOCKER_USER}}
|
||||||
"color": 3066993,
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
"footer": {
|
if: failure()
|
||||||
"text": "Release Notification",
|
with:
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
},
|
message: |
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
-Failure❌❌❌
|
||||||
}]
|
Image: ${{env.IMAGE_NAME}}
|
||||||
}' \
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
By: ${{secrets.DOCKER_USER}}
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
180
.github/workflows/release_discipline.yaml
vendored
180
.github/workflows/release_discipline.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "discipline-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-discipline-service
|
IMAGE_NAME: ehr/bma-ehr-discipline-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-discipline
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-discipline
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_discipline.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_discipline.yaml --input IMAGE_VER=discipline-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Login in to registry
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/login-action@v2
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
registry: ${{env.REGISTRY}}
|
||||||
with:
|
username: ${{secrets.DOCKER_USER}}
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
- name: Build and load local docker image
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
uses: docker/build-push-action@v3
|
||||||
- name: Build and load local docker image
|
with:
|
||||||
uses: docker/build-push-action@v3
|
context: .
|
||||||
with:
|
platforms: linux/amd64
|
||||||
context: .
|
file: BMA.EHR.Discipline.Service/Dockerfile
|
||||||
platforms: linux/amd64
|
push: true
|
||||||
file: BMA.EHR.Discipline.Service/Dockerfile
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
|
|
||||||
- name: Reload docker compose
|
- name: Reload docker compose
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
with:
|
with:
|
||||||
host: ${{env.DEPLOY_HOST}}
|
host: ${{env.DEPLOY_HOST}}
|
||||||
username: frappet
|
username: frappet
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
port: ${{env.DEPLOY_PORT}}
|
port: 22
|
||||||
script: |
|
script: |
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
docker compose pull
|
docker-compose pull
|
||||||
docker compose up -d
|
docker-compose up -d
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
- name: Notify Discord Success
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
with:
|
||||||
curl -H "Content-Type: application/json" \
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
-X POST \
|
message: |
|
||||||
-d '{
|
-Success✅✅✅
|
||||||
"embeds": [{
|
Image: ${{env.IMAGE_NAME}}
|
||||||
"title": "✅ Deployment Success!",
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
By: ${{secrets.DOCKER_USER}}
|
||||||
"color": 3066993,
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
"footer": {
|
if: failure()
|
||||||
"text": "Release Notification",
|
with:
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
},
|
message: |
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
-Failure❌❌❌
|
||||||
}]
|
Image: ${{env.IMAGE_NAME}}
|
||||||
}' \
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
By: ${{secrets.DOCKER_USER}}
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
180
.github/workflows/release_insignia.yaml
vendored
180
.github/workflows/release_insignia.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "insignia-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-insignia-service
|
IMAGE_NAME: ehr/bma-ehr-insignia-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-insignia
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-insignia
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_insignia.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_insignia.yaml --input IMAGE_VER=insignia-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Login in to registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ${{env.REGISTRY}}
|
||||||
|
username: ${{secrets.DOCKER_USER}}
|
||||||
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
|
- name: Build and load local docker image
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64
|
||||||
|
file: BMA.EHR.Insignia.Service/Dockerfile
|
||||||
|
push: true
|
||||||
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Reload docker compose
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
host: ${{env.DEPLOY_HOST}}
|
||||||
with:
|
username: frappet
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
port: 22
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
script: |
|
||||||
- name: Build and push docker image
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
uses: docker/build-push-action@v3
|
docker-compose pull
|
||||||
with:
|
docker-compose up -d
|
||||||
context: .
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
platforms: linux/amd64
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
file: BMA.EHR.Insignia/Dockerfile
|
if: success()
|
||||||
push: true
|
with:
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
- name: Remote Deployment
|
message: |
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
-Success✅✅✅
|
||||||
with:
|
Image: ${{env.IMAGE_NAME}}
|
||||||
host: ${{env.DEPLOY_HOST}}
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
username: frappet
|
By: ${{secrets.DOCKER_USER}}
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
port: 10102
|
if: failure()
|
||||||
script: |
|
with:
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
docker compose pull
|
message: |
|
||||||
docker compose up -d
|
-Failure❌❌❌
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
Image: ${{env.IMAGE_NAME}}
|
||||||
- name: Notify Discord Success
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
if: success()
|
By: ${{secrets.DOCKER_USER}}
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "✅ Deployment Success!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
|
||||||
"color": 3066993,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
180
.github/workflows/release_leave.yaml
vendored
180
.github/workflows/release_leave.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "leave-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-leave-service
|
IMAGE_NAME: ehr/bma-ehr-leave-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-leave
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-leave
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_leave.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_leave.yaml --input IMAGE_VER=leave-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Login in to registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ${{env.REGISTRY}}
|
||||||
|
username: ${{secrets.DOCKER_USER}}
|
||||||
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
|
- name: Build and load local docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64
|
||||||
|
file: BMA.EHR.Leave.Service/Dockerfile
|
||||||
|
push: true
|
||||||
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Reload docker compose
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
host: ${{env.DEPLOY_HOST}}
|
||||||
with:
|
username: frappet
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
port: 22
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
script: |
|
||||||
- name: Build and push docker image
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
uses: docker/build-push-action@v3
|
docker-compose pull
|
||||||
with:
|
docker-compose up -d
|
||||||
context: .
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
platforms: linux/amd64
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
file: BMA.EHR.Leave/Dockerfile
|
if: success()
|
||||||
push: true
|
with:
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
- name: Remote Deployment
|
message: |
|
||||||
uses: appleboy/ssh-action@v1
|
-Success✅✅✅
|
||||||
with:
|
Image: ${{env.IMAGE_NAME}}
|
||||||
host: ${{env.DEPLOY_HOST}}
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
username: frappet
|
By: ${{secrets.DOCKER_USER}}
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
port: 10102
|
if: failure()
|
||||||
script: |
|
with:
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
docker compose pull
|
message: |
|
||||||
docker compose up -d
|
-Failure❌❌❌
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
Image: ${{env.IMAGE_NAME}}
|
||||||
- name: Notify Discord Success
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
if: success()
|
By: ${{secrets.DOCKER_USER}}
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "✅ Deployment Success!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
|
||||||
"color": 3066993,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
107
.github/workflows/release_metadata.yaml
vendored
107
.github/workflows/release_metadata.yaml
vendored
|
|
@ -1,107 +0,0 @@
|
||||||
name: release-dev
|
|
||||||
run-name: release-dev ${{ github.actor }}
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "metadata-[0-9]+.[0-9]+.[0-9]+"
|
|
||||||
workflow_dispatch:
|
|
||||||
env:
|
|
||||||
REGISTRY: docker.frappet.com
|
|
||||||
IMAGE_NAME: ehr/bma-ehr-metadata-service
|
|
||||||
DEPLOY_HOST: frappet.com
|
|
||||||
DEPLOY_PORT: 10102
|
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-metadata
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# act workflow_dispatch -W .github/workflows/release_metadata.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
|
||||||
release-dev:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Set output tags
|
|
||||||
id: vars
|
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
||||||
- name: Gen Version
|
|
||||||
id: gen_ver
|
|
||||||
run: |
|
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
|
||||||
else
|
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
|
||||||
fi
|
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
|
||||||
IMAGE_VER='test-vBeta'
|
|
||||||
fi
|
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
|
||||||
- name: Check Version
|
|
||||||
run: |
|
|
||||||
echo $GITHUB_REF
|
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Login in to registry
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: ${{env.REGISTRY}}
|
|
||||||
username: ${{secrets.DOCKER_USER}}
|
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
|
||||||
- name: Build and load local docker image
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64
|
|
||||||
file: BMA.EHR.MetaData.Service/Dockerfile
|
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
|
|
||||||
- name: Reload docker compose
|
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
|
||||||
with:
|
|
||||||
host: ${{env.DEPLOY_HOST}}
|
|
||||||
username: frappet
|
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
|
||||||
port: ${{env.DEPLOY_PORT}}
|
|
||||||
script: |
|
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
|
||||||
- name: Notify Discord Success
|
|
||||||
if: success()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "✅ Deployment Success!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
|
||||||
"color": 3066993,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
10
.github/workflows/release_orgEmployee.yaml
vendored
10
.github/workflows/release_orgEmployee.yaml
vendored
|
|
@ -12,9 +12,7 @@ env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-org-employee-service
|
IMAGE_NAME: ehr/bma-ehr-org-employee-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-org-employee
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-org-employee
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
@ -63,11 +61,11 @@ jobs:
|
||||||
host: ${{env.DEPLOY_HOST}}
|
host: ${{env.DEPLOY_HOST}}
|
||||||
username: frappet
|
username: frappet
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
port: ${{env.DEPLOY_PORT}}
|
port: 22
|
||||||
script: |
|
script: |
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
docker compose pull
|
docker-compose pull
|
||||||
docker compose up -d
|
docker-compose up -d
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
- uses: snow-actions/line-notify@v1.1.0
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
if: success()
|
if: success()
|
||||||
|
|
|
||||||
180
.github/workflows/release_placement.yaml
vendored
180
.github/workflows/release_placement.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "placement-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-placement-service
|
IMAGE_NAME: ehr/bma-ehr-placement-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-placement
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-placement
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_placement.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_placement.yaml --input IMAGE_VER=placement-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Login in to registry
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/login-action@v2
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
registry: ${{env.REGISTRY}}
|
||||||
with:
|
username: ${{secrets.DOCKER_USER}}
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
- name: Build and load local docker image
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
uses: docker/build-push-action@v3
|
||||||
- name: Build and load local docker image
|
with:
|
||||||
uses: docker/build-push-action@v3
|
context: .
|
||||||
with:
|
platforms: linux/amd64
|
||||||
context: .
|
file: BMA.EHR.Placement.Service/Dockerfile
|
||||||
platforms: linux/amd64
|
push: true
|
||||||
file: BMA.EHR.Placement.Service/Dockerfile
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
|
|
||||||
- name: Reload docker compose
|
- name: Reload docker compose
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
with:
|
with:
|
||||||
host: ${{env.DEPLOY_HOST}}
|
host: ${{env.DEPLOY_HOST}}
|
||||||
username: frappet
|
username: frappet
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
port: ${{env.DEPLOY_PORT}}
|
port: 22
|
||||||
script: |
|
script: |
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
docker compose pull
|
docker-compose pull
|
||||||
docker compose up -d
|
docker-compose up -d
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
- name: Notify Discord Success
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
with:
|
||||||
curl -H "Content-Type: application/json" \
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
-X POST \
|
message: |
|
||||||
-d '{
|
-Success✅✅✅
|
||||||
"embeds": [{
|
Image: ${{env.IMAGE_NAME}}
|
||||||
"title": "✅ Deployment Success!",
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
By: ${{secrets.DOCKER_USER}}
|
||||||
"color": 3066993,
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
"footer": {
|
if: failure()
|
||||||
"text": "Release Notification",
|
with:
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
},
|
message: |
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
-Failure❌❌❌
|
||||||
}]
|
Image: ${{env.IMAGE_NAME}}
|
||||||
}' \
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
By: ${{secrets.DOCKER_USER}}
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
180
.github/workflows/release_report.yaml
vendored
180
.github/workflows/release_report.yaml
vendored
|
|
@ -1,107 +1,87 @@
|
||||||
name: release-dev
|
name: release-dev
|
||||||
run-name: release-dev ${{ github.actor }}
|
run-name: release-dev ${{ github.actor }}
|
||||||
on:
|
on:
|
||||||
# push:
|
# push:
|
||||||
# tags:
|
# tags:
|
||||||
# - "reportv2-[0-9]+.[0-9]+.[0-9]+"
|
# - 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
workflow_dispatch:
|
# tags-ignore:
|
||||||
|
# - '2.*'
|
||||||
|
# Allow run workflow manually from Action tab
|
||||||
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-report-v2-service
|
IMAGE_NAME: ehr/bma-ehr-report-v2-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
DEPLOY_PORT: 10102
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-report-v2
|
||||||
# COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-report-v2
|
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# act workflow_dispatch -W .github/workflows/release_report.yaml --input IMAGE_VER=latest -s DOCKER_USER=admin -s DOCKER_PASS=FPTadmin2357 -s SSH_PASSWORD=FPTadmin2357
|
# act workflow_dispatch -W .github/workflows/release_report.yaml --input IMAGE_VER=report-1.0.0 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
|
||||||
release-dev:
|
release-dev:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set output tags
|
# skip Set up QEMU because it fail on act and container
|
||||||
id: vars
|
- name: Gen Version
|
||||||
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
id: gen_ver
|
||||||
- name: Gen Version
|
run: |
|
||||||
id: gen_ver
|
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
||||||
run: |
|
IMAGE_VER='${GITHUB_REF/refs\/tags\//}'
|
||||||
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
|
else
|
||||||
IMAGE_VER=${{ steps.vars.outputs.tag }}
|
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
||||||
else
|
fi
|
||||||
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
|
if [[ $IMAGE_VER == '' ]]; then
|
||||||
fi
|
IMAGE_VER='test-vBeta'
|
||||||
if [[ $IMAGE_VER == '' ]]; then
|
fi
|
||||||
IMAGE_VER='test-vBeta'
|
echo '::set-output name=image_ver::'$IMAGE_VER
|
||||||
fi
|
- name: Test Version
|
||||||
echo '::set-output name=image_ver::'$IMAGE_VER
|
run: |
|
||||||
- name: Check Version
|
echo $GITHUB_REF
|
||||||
run: |
|
echo ${{ steps.gen_ver.outputs.image_ver }}
|
||||||
echo $GITHUB_REF
|
- name: Set up Docker Buildx
|
||||||
echo ${{ steps.gen_ver.outputs.image_ver }}
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Login in to registry
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/login-action@v2
|
||||||
- name: Login in to registry
|
with:
|
||||||
uses: docker/login-action@v2
|
registry: ${{env.REGISTRY}}
|
||||||
with:
|
username: ${{secrets.DOCKER_USER}}
|
||||||
registry: ${{env.REGISTRY}}
|
password: ${{secrets.DOCKER_PASS}}
|
||||||
username: ${{secrets.DOCKER_USER}}
|
- name: Build and load local docker image
|
||||||
password: ${{secrets.DOCKER_PASS}}
|
uses: docker/build-push-action@v3
|
||||||
- name: Build and load local docker image
|
with:
|
||||||
uses: docker/build-push-action@v3
|
context: .
|
||||||
with:
|
platforms: linux/amd64
|
||||||
context: .
|
file: BMA.EHR.Report.Service/Dockerfile
|
||||||
platforms: linux/amd64
|
push: true
|
||||||
file: BMA.EHR.Report.Service/Dockerfile
|
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
||||||
push: true
|
|
||||||
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
|
|
||||||
|
|
||||||
- name: Reload docker compose
|
- name: Reload docker compose
|
||||||
uses: appleboy/ssh-action@v0.1.8
|
uses: appleboy/ssh-action@v0.1.8
|
||||||
with:
|
with:
|
||||||
host: ${{env.DEPLOY_HOST}}
|
host: ${{env.DEPLOY_HOST}}
|
||||||
username: frappet
|
username: frappet
|
||||||
password: ${{ secrets.SSH_PASSWORD }}
|
password: ${{ secrets.SSH_PASSWORD }}
|
||||||
port: ${{env.DEPLOY_PORT}}
|
port: 22
|
||||||
script: |
|
script: |
|
||||||
cd "${{env.COMPOSE_PATH}}"
|
cd "${{env.COMPOSE_PATH}}"
|
||||||
docker compose pull
|
docker-compose pull
|
||||||
docker compose up -d
|
docker-compose up -d
|
||||||
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
|
||||||
- name: Notify Discord Success
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
with:
|
||||||
curl -H "Content-Type: application/json" \
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
-X POST \
|
message: |
|
||||||
-d '{
|
-Success✅✅✅
|
||||||
"embeds": [{
|
Image: ${{env.IMAGE_NAME}}
|
||||||
"title": "✅ Deployment Success!",
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`",
|
By: ${{secrets.DOCKER_USER}}
|
||||||
"color": 3066993,
|
- uses: snow-actions/line-notify@v1.1.0
|
||||||
"footer": {
|
if: failure()
|
||||||
"text": "Release Notification",
|
with:
|
||||||
"icon_url": "https://example.com/success-icon.png"
|
access_token: ${{ env.TOKEN_LINE }}
|
||||||
},
|
message: |
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
-Failure❌❌❌
|
||||||
}]
|
Image: ${{env.IMAGE_NAME}}
|
||||||
}' \
|
Version: ${{ github.event.inputs.IMAGE_VER }}
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
By: ${{secrets.DOCKER_USER}}
|
||||||
|
|
||||||
- name: Notify Discord Failure
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
curl -H "Content-Type: application/json" \
|
|
||||||
-X POST \
|
|
||||||
-d '{
|
|
||||||
"embeds": [{
|
|
||||||
"title": "❌ Deployment Failed!",
|
|
||||||
"description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`",
|
|
||||||
"color": 15158332,
|
|
||||||
"footer": {
|
|
||||||
"text": "Release Notification",
|
|
||||||
"icon_url": "https://example.com/failure-icon.png"
|
|
||||||
},
|
|
||||||
"timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
|
|
||||||
}]
|
|
||||||
}' \
|
|
||||||
${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
|
|
|
||||||
2
.github/workflows/release_reportV2.yaml
vendored
2
.github/workflows/release_reportV2.yaml
vendored
|
|
@ -12,7 +12,7 @@ env:
|
||||||
REGISTRY: docker.frappet.com
|
REGISTRY: docker.frappet.com
|
||||||
IMAGE_NAME: ehr/bma-ehr-report-v2-service
|
IMAGE_NAME: ehr/bma-ehr-report-v2-service
|
||||||
DEPLOY_HOST: frappet.com
|
DEPLOY_HOST: frappet.com
|
||||||
COMPOSE_PATH: /home/frappet/docker/bma-ehr
|
COMPOSE_PATH: /home/frappet/docker/bma-ehr-report-v2
|
||||||
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
TOKEN_LINE: uxuK5hDzS2DsoC5piJBrWRLiz8GgY7iMZZldOWsDDF0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
|
||||||
19
.gitignore
vendored
19
.gitignore
vendored
|
|
@ -16,19 +16,6 @@
|
||||||
# Mono auto generated files
|
# Mono auto generated files
|
||||||
mono_crash.*
|
mono_crash.*
|
||||||
|
|
||||||
# JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
|
||||||
.idea/
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
out/
|
|
||||||
.idea_modules/
|
|
||||||
atlassian-ide-plugin.xml
|
|
||||||
com_crashlytics_export_strings.xml
|
|
||||||
crashlytics.properties
|
|
||||||
crashlytics-build.properties
|
|
||||||
fabric.properties
|
|
||||||
|
|
||||||
# Build results
|
# Build results
|
||||||
[Dd]ebug/
|
[Dd]ebug/
|
||||||
[Dd]ebugPublic/
|
[Dd]ebugPublic/
|
||||||
|
|
@ -374,9 +361,3 @@ MigrationBackup/
|
||||||
|
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
# VS Code C# Dev Kit cache
|
|
||||||
*.lscache
|
|
||||||
|
|
||||||
# Claude Code
|
|
||||||
.claude/
|
|
||||||
13
.idea/.idea.BMA.EHR.Solution/.idea/.gitignore
generated
vendored
Normal file
13
.idea/.idea.BMA.EHR.Solution/.idea/.gitignore
generated
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Rider ignored files
|
||||||
|
/contentModel.xml
|
||||||
|
/.idea.BMA.EHR.Solution.iml
|
||||||
|
/projectSettingsUpdater.xml
|
||||||
|
/modules.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
1
.idea/.idea.BMA.EHR.Solution/.idea/.name
generated
Normal file
1
.idea/.idea.BMA.EHR.Solution/.idea/.name
generated
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
BMA.EHR.Solution
|
||||||
|
After Width: | Height: | Size: 16 B |
11
.idea/.idea.BMA.EHR.Solution/.idea/aws.xml
generated
Normal file
11
.idea/.idea.BMA.EHR.Solution/.idea/aws.xml
generated
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="accountSettings">
|
||||||
|
<option name="activeRegion" value="us-east-1" />
|
||||||
|
<option name="recentlyUsedRegions">
|
||||||
|
<list>
|
||||||
|
<option value="us-east-1" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
4
.idea/.idea.BMA.EHR.Solution/.idea/encodings.xml
generated
Normal file
4
.idea/.idea.BMA.EHR.Solution/.idea/encodings.xml
generated
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||||
|
</project>
|
||||||
8
.idea/.idea.BMA.EHR.Solution/.idea/indexLayout.xml
generated
Normal file
8
.idea/.idea.BMA.EHR.Solution/.idea/indexLayout.xml
generated
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="UserContentModel">
|
||||||
|
<attachedFolders />
|
||||||
|
<explicitIncludes />
|
||||||
|
<explicitExcludes />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/.idea.BMA.EHR.Solution/.idea/vcs.xml
generated
Normal file
6
.idea/.idea.BMA.EHR.Solution/.idea/vcs.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
version: 37
|
|
||||||
jobs:
|
|
||||||
- name: CI for UAT
|
|
||||||
steps:
|
|
||||||
- !CheckoutStep
|
|
||||||
name: checkout code
|
|
||||||
cloneCredential: !DefaultCredential {}
|
|
||||||
withLfs: false
|
|
||||||
withSubmodules: false
|
|
||||||
condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
|
|
||||||
- !GenerateChecksumStep
|
|
||||||
name: generate project checksum
|
|
||||||
files: '**/*.csproj'
|
|
||||||
targetFile: checksum
|
|
||||||
condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
|
|
||||||
- !SetupCacheStep
|
|
||||||
name: set up nuget cache
|
|
||||||
key: nuget_packages_@file:checksum@
|
|
||||||
loadKeys:
|
|
||||||
- nuget_packages
|
|
||||||
paths:
|
|
||||||
- /root/.nuget/packages
|
|
||||||
uploadStrategy: UPLOAD_IF_NOT_HIT
|
|
||||||
condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
|
|
||||||
- !CommandStep
|
|
||||||
name: test and analyze
|
|
||||||
runInContainer: true
|
|
||||||
image: mcr.microsoft.com/dotnet/sdk
|
|
||||||
interpreter: !DefaultInterpreter
|
|
||||||
commands: |
|
|
||||||
set -e
|
|
||||||
dotnet tool install -g roslynator.dotnet.cli
|
|
||||||
dotnet test -l trx --collect:"XPlat Code Coverage"
|
|
||||||
#/root/.dotnet/tools/roslynator analyze -o roslynator-analysis.xml
|
|
||||||
useTTY: true
|
|
||||||
condition: NEVER
|
|
||||||
- !PublishTRXReportStep
|
|
||||||
name: publish unit test report
|
|
||||||
reportName: Unit Test
|
|
||||||
filePatterns: '**/*.trx'
|
|
||||||
condition: NEVER
|
|
||||||
- !PublishCoberturaReportStep
|
|
||||||
name: publish code coverage report
|
|
||||||
reportName: Code Coverage
|
|
||||||
filePatterns: '**/coverage.cobertura.xml'
|
|
||||||
condition: NEVER
|
|
||||||
- !PublishRoslynatorReportStep
|
|
||||||
name: publish code problem report
|
|
||||||
reportName: Code Problems
|
|
||||||
filePatterns: roslynator-analysis.xml
|
|
||||||
failThreshold: HIGH
|
|
||||||
condition: NEVER
|
|
||||||
- !SetBuildVersionStep
|
|
||||||
name: set build version
|
|
||||||
buildVersion: '@tag@'
|
|
||||||
condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
|
|
||||||
- !BuildImageStep
|
|
||||||
name: build docker image - Leave
|
|
||||||
dockerfile: ./BMA.EHR.Leave/Dockerfile
|
|
||||||
output: !RegistryOutput
|
|
||||||
tags: hrms-git.chin.in.th/bma-hrms/hrms-api-leave:@build_version@ hrms-git.chin.in.th/bma-hrms/hrms-api-leave:latest
|
|
||||||
condition: NEVER
|
|
||||||
- !BuildImageStep
|
|
||||||
name: build docker image - Checkin
|
|
||||||
dockerfile: ./BMA.EHR.CheckInConsumer/Dockerfile
|
|
||||||
output: !RegistryOutput
|
|
||||||
tags: hrms-git.chin.in.th/bma-hrms/hrms-api-checkin:@build_version@ hrms-git.chin.in.th/bma-hrms/hrms-api-checkin:latest
|
|
||||||
condition: NEVER
|
|
||||||
- !BuildImageStep
|
|
||||||
name: build docker image - Insignia
|
|
||||||
dockerfile: ./BMA.EHR.Insignia/Dockerfile
|
|
||||||
output: !RegistryOutput
|
|
||||||
tags: hrms-git.chin.in.th/bma-hrms/hrms-api-insignia:@build_version@ hrms-git.chin.in.th/bma-hrms/hrms-api-insignia:latest
|
|
||||||
condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
|
|
||||||
triggers:
|
|
||||||
- !TagCreateTrigger
|
|
||||||
tags: uat-*
|
|
||||||
branches: main
|
|
||||||
retryCondition: never
|
|
||||||
maxRetries: 3
|
|
||||||
retryDelay: 30
|
|
||||||
timeout: 14400
|
|
||||||
91
.vscode/launch.json
vendored
91
.vscode/launch.json
vendored
|
|
@ -1,60 +1,35 @@
|
||||||
{
|
{
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||||
// Use hover for the description of the existing attributes
|
// Use hover for the description of the existing attributes
|
||||||
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
|
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
|
||||||
"name": ".NET Core Launch (web)",
|
"name": ".NET Core Launch (web)",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"preLaunchTask": "build",
|
"preLaunchTask": "build",
|
||||||
// If you have changed target frameworks, make sure to update the program path.
|
// If you have changed target frameworks, make sure to update the program path.
|
||||||
"program": "${workspaceFolder}/BMA.EHR.Leave/bin/Debug/net7.0/BMA.EHR.Leave.dll",
|
"program": "${workspaceFolder}/BMA.EHR.Leave.Service/bin/Debug/net7.0/BMA.EHR.Leave.Service.dll",
|
||||||
"args": [],
|
"args": [],
|
||||||
"cwd": "${workspaceFolder}/BMA.EHR.Leave",
|
"cwd": "${workspaceFolder}/BMA.EHR.Leave.Service",
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
|
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
|
||||||
"serverReadyAction": {
|
"serverReadyAction": {
|
||||||
"action": "openExternally",
|
"action": "openExternally",
|
||||||
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
|
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
|
||||||
},
|
},
|
||||||
"env": {
|
"env": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
},
|
},
|
||||||
"sourceFileMap": {
|
"sourceFileMap": {
|
||||||
"/Views": "${workspaceFolder}/Views"
|
"/Views": "${workspaceFolder}/Views"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
"name": ".NET Core Attach",
|
||||||
// Use hover for the description of the existing attributes
|
"type": "coreclr",
|
||||||
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
|
"request": "attach"
|
||||||
"name": ".NET Core Launch (web) - Insignia",
|
}
|
||||||
"type": "coreclr",
|
]
|
||||||
"request": "launch",
|
|
||||||
"preLaunchTask": "build",
|
|
||||||
// If you have changed target frameworks, make sure to update the program path.
|
|
||||||
"program": "${workspaceFolder}/BMA.EHR.Insignia/bin/Debug/net7.0/BMA.EHR.Insignia.dll",
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}/BMA.EHR.Insignia",
|
|
||||||
"stopAtEntry": false,
|
|
||||||
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
|
|
||||||
"serverReadyAction": {
|
|
||||||
"action": "openExternally",
|
|
||||||
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
|
|
||||||
},
|
|
||||||
"env": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
},
|
|
||||||
"sourceFileMap": {
|
|
||||||
"/Views": "${workspaceFolder}/Views"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": ".NET Core Attach",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "attach"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
@ -23,12 +23,11 @@ namespace BMA.EHR.Application
|
||||||
services.AddTransient<CommandStatusRepository>();
|
services.AddTransient<CommandStatusRepository>();
|
||||||
services.AddTransient<InsigniaPeriodsRepository>();
|
services.AddTransient<InsigniaPeriodsRepository>();
|
||||||
services.AddTransient<RetirementRepository>();
|
services.AddTransient<RetirementRepository>();
|
||||||
services.AddTransient<RetirementEmployeeRepository>();
|
|
||||||
services.AddTransient<UserProfileRepository>();
|
services.AddTransient<UserProfileRepository>();
|
||||||
services.AddTransient<OrganizationCommonRepository>();
|
services.AddTransient<OrganizationCommonRepository>();
|
||||||
services.AddTransient<InboxRepository>();
|
services.AddTransient<InboxRepository>();
|
||||||
services.AddTransient<NotificationRepository>();
|
services.AddTransient<NotificationRepository>();
|
||||||
//services.AddTransient<RetirementRepository>();
|
services.AddTransient<RetirementRepository>();
|
||||||
services.AddTransient<RetireReportRepository>();
|
services.AddTransient<RetireReportRepository>();
|
||||||
services.AddTransient<InsigniaReportRepository>();
|
services.AddTransient<InsigniaReportRepository>();
|
||||||
services.AddTransient<CommandReportRepository>();
|
services.AddTransient<CommandReportRepository>();
|
||||||
|
|
@ -37,7 +36,7 @@ namespace BMA.EHR.Application
|
||||||
services.AddTransient<EmailSenderService>();
|
services.AddTransient<EmailSenderService>();
|
||||||
services.AddTransient<CandidateReportRepository>();
|
services.AddTransient<CandidateReportRepository>();
|
||||||
services.AddTransient<MinIOExamService>();
|
services.AddTransient<MinIOExamService>();
|
||||||
services.AddTransient<PermissionRepository>();
|
|
||||||
services.AddTransient<HolidayRepository>();
|
services.AddTransient<HolidayRepository>();
|
||||||
|
|
||||||
//services.AddTransient<UserDutyTimeRepository>();
|
//services.AddTransient<UserDutyTimeRepository>();
|
||||||
|
|
@ -53,16 +52,12 @@ namespace BMA.EHR.Application
|
||||||
services.AddTransient<UserDutyTimeRepository>();
|
services.AddTransient<UserDutyTimeRepository>();
|
||||||
services.AddTransient<AdditionalCheckRequestRepository>();
|
services.AddTransient<AdditionalCheckRequestRepository>();
|
||||||
services.AddTransient<UserCalendarRepository>();
|
services.AddTransient<UserCalendarRepository>();
|
||||||
services.AddTransient<CheckInJobStatusRepository>();
|
|
||||||
|
|
||||||
services.AddTransient<LeaveTypeRepository>();
|
services.AddTransient<LeaveTypeRepository>();
|
||||||
services.AddTransient<LeaveRequestRepository>();
|
services.AddTransient<LeaveRequestRepository>();
|
||||||
services.AddTransient<LeaveBeginningRepository>();
|
|
||||||
|
|
||||||
services.AddTransient<MinIOLeaveService>();
|
services.AddTransient<MinIOLeaveService>();
|
||||||
|
|
||||||
services.AddTransient<LeaveProcessJobStatusRepository>();
|
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,6 @@
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
|
||||||
<NoWarn>$(NoWarn);$(WarningsNotAsErrors)</NoWarn>
|
|
||||||
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,6 @@ namespace BMA.EHR.Application.Common.Interfaces
|
||||||
|
|
||||||
void Attatch<T>(T entity) where T : class;
|
void Attatch<T>(T entity) where T : class;
|
||||||
|
|
||||||
void Detach<T>(T entity) where T : class;
|
|
||||||
|
|
||||||
Task<int> SaveChangesAsync();
|
Task<int> SaveChangesAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ namespace BMA.EHR.Application.Messaging
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
//throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,14 +1,9 @@
|
||||||
using System.Net.Http.Headers;
|
using BMA.EHR.Application.Common.Interfaces;
|
||||||
using System.Net.Http.Json;
|
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
|
||||||
using BMA.EHR.Application.Repositories.MessageQueue;
|
using BMA.EHR.Application.Repositories.MessageQueue;
|
||||||
using BMA.EHR.Domain.Models.Discipline;
|
using BMA.EHR.Domain.Models.Discipline;
|
||||||
using BMA.EHR.Domain.Models.Retirement;
|
using BMA.EHR.Domain.Models.Retirement;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using BMA.EHR.Application.Requests;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories
|
namespace BMA.EHR.Application.Repositories
|
||||||
{
|
{
|
||||||
|
|
@ -18,60 +13,33 @@ namespace BMA.EHR.Application.Repositories
|
||||||
private readonly IDisciplineDbContext _dbDisContext;
|
private readonly IDisciplineDbContext _dbDisContext;
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly NotificationRepository _repositoryNoti;
|
private readonly NotificationRepository _repositoryNoti;
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
public DisciplineRepository(IApplicationDBContext dbContext,
|
public DisciplineRepository(IApplicationDBContext dbContext,
|
||||||
IDisciplineDbContext dbDisContext,
|
IDisciplineDbContext dbDisContext,
|
||||||
NotificationRepository repositoryNoti,
|
NotificationRepository repositoryNoti,
|
||||||
IConfiguration configuration,
|
|
||||||
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_dbDisContext = dbDisContext;
|
_dbDisContext = dbDisContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_repositoryNoti = repositoryNoti;
|
_repositoryNoti = repositoryNoti;
|
||||||
_configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//เรื่องร้องเรียน
|
//เรื่องร้องเรียน
|
||||||
public async Task NotifyDisciplineComplaint()
|
public async Task NotifyDisciplineComplaint()
|
||||||
{
|
{
|
||||||
var cronjobNotis = await _dbDisContext.Set<DisciplineComplaint>()
|
var cronjobNotis = await _dbDisContext.Set<DisciplineComplaint>()
|
||||||
.Include(x => x.DisciplineComplaint_Profiles)
|
|
||||||
.Where(x => x.DateNotification != null)
|
.Where(x => x.DateNotification != null)
|
||||||
.Where(x => x.DateNotification.Value.Date == DateTime.Now.Date)
|
.Where(x => x.DateNotification.Value.Date == DateTime.Now.Date)
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
foreach (var cronjobNoti in cronjobNotis)
|
foreach (var cronjobNoti in cronjobNotis)
|
||||||
{
|
{
|
||||||
var baseAPIOrg = _configuration["API"];
|
await _repositoryNoti.PushNotificationAsync(
|
||||||
var apiUrlOrg = $"{baseAPIOrg}/org/workflow/find/director";
|
Guid.Parse("08dbca3a-8b6a-4a4e-8b23-1f62e4f30ef6"),
|
||||||
var refId = new List<Guid>();
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _res = await client.PostAsJsonAsync(apiUrlOrg, new
|
|
||||||
{
|
|
||||||
refId = cronjobNoti.DisciplineComplaint_Profiles.Select(x => x.PersonId),
|
|
||||||
});
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
var org = JsonConvert.DeserializeObject<DirectorRequest>(_result);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
refId = org.result.Select(x => Guid.Parse(x.id)).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _repositoryNoti.PushNotificationsAsync(
|
|
||||||
refId.ToArray(),
|
|
||||||
$"แจ้งเตือนบันทึกข้อมูลร้องเรียนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
$"แจ้งเตือนบันทึกข้อมูลร้องเรียนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
||||||
$"แจ้งเตือนบันทึกข้อมูลร้องเรียนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
$"แจ้งเตือนบันทึกข้อมูลร้องเรียนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}"
|
||||||
"",
|
);
|
||||||
"",
|
|
||||||
true,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,39 +47,16 @@ namespace BMA.EHR.Application.Repositories
|
||||||
public async Task NotifyDisciplineInvestigate()
|
public async Task NotifyDisciplineInvestigate()
|
||||||
{
|
{
|
||||||
var cronjobNotis = await _dbDisContext.Set<DisciplineInvestigate>()
|
var cronjobNotis = await _dbDisContext.Set<DisciplineInvestigate>()
|
||||||
.Include(x => x.DisciplineInvestigate_ProfileComplaints)
|
|
||||||
.Where(x => x.InvestigationDateEnd != null && x.InvestigationDateEnd.Value.Date.AddDays(-7) == DateTime.Now.Date)
|
.Where(x => x.InvestigationDateEnd != null && x.InvestigationDateEnd.Value.Date.AddDays(-7) == DateTime.Now.Date)
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
foreach (var cronjobNoti in cronjobNotis)
|
foreach (var cronjobNoti in cronjobNotis)
|
||||||
{
|
{
|
||||||
var baseAPIOrg = _configuration["API"];
|
await _repositoryNoti.PushNotificationAsync(
|
||||||
var apiUrlOrg = $"{baseAPIOrg}/org/workflow/find/director";
|
Guid.Parse("08dbca3a-8b6a-4a4e-8b23-1f62e4f30ef6"),
|
||||||
var refId = new List<Guid>();
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _res = await client.PostAsJsonAsync(apiUrlOrg, new
|
|
||||||
{
|
|
||||||
refId = cronjobNoti.DisciplineInvestigate_ProfileComplaints.Select(x => x.PersonId),
|
|
||||||
});
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
var org = JsonConvert.DeserializeObject<DirectorRequest>(_result);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
refId = org.result.Select(x => Guid.Parse(x.id)).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _repositoryNoti.PushNotificationsAsync(
|
|
||||||
refId.ToArray(),
|
|
||||||
$"แจ้งเตือนบันทึกข้อมูลสืบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
$"แจ้งเตือนบันทึกข้อมูลสืบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
||||||
$"แจ้งเตือนบันทึกข้อมูลสืบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
$"แจ้งเตือนบันทึกข้อมูลสืบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}"
|
||||||
"",
|
);
|
||||||
"",
|
|
||||||
true,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
@ -120,39 +65,16 @@ namespace BMA.EHR.Application.Repositories
|
||||||
public async Task NotifyDisciplineDisciplinary()
|
public async Task NotifyDisciplineDisciplinary()
|
||||||
{
|
{
|
||||||
var cronjobNotis = await _dbDisContext.Set<DisciplineDisciplinary>()
|
var cronjobNotis = await _dbDisContext.Set<DisciplineDisciplinary>()
|
||||||
.Include(x => x.DisciplineDisciplinary_ProfileComplaintInvestigates)
|
|
||||||
.Where(x => x.DisciplinaryDateEnd != null && x.DisciplinaryDateEnd.Value.Date.AddDays(-7) == DateTime.Now.Date)
|
.Where(x => x.DisciplinaryDateEnd != null && x.DisciplinaryDateEnd.Value.Date.AddDays(-7) == DateTime.Now.Date)
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
foreach (var cronjobNoti in cronjobNotis)
|
foreach (var cronjobNoti in cronjobNotis)
|
||||||
{
|
{
|
||||||
var baseAPIOrg = _configuration["API"];
|
await _repositoryNoti.PushNotificationAsync(
|
||||||
var apiUrlOrg = $"{baseAPIOrg}/org/workflow/find/director";
|
Guid.Parse("08dbca3a-8b6a-4a4e-8b23-1f62e4f30ef6"),
|
||||||
var refId = new List<Guid>();
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _res = await client.PostAsJsonAsync(apiUrlOrg, new
|
|
||||||
{
|
|
||||||
refId = cronjobNoti.DisciplineDisciplinary_ProfileComplaintInvestigates.Select(x => x.PersonId),
|
|
||||||
});
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
var org = JsonConvert.DeserializeObject<DirectorRequest>(_result);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
refId = org.result.Select(x => Guid.Parse(x.id)).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _repositoryNoti.PushNotificationsAsync(
|
|
||||||
refId.ToArray(),
|
|
||||||
$"แจ้งเตือนบันทึกข้อมูลสอบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
$"แจ้งเตือนบันทึกข้อมูลสอบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
||||||
$"แจ้งเตือนบันทึกข้อมูลสอบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}",
|
$"แจ้งเตือนบันทึกข้อมูลสอบสวนก่อนวันสิ้นสุดเรื่อง {cronjobNoti.Title}"
|
||||||
"",
|
);
|
||||||
"",
|
|
||||||
true,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,10 @@
|
||||||
using Amazon.Runtime.Internal.Endpoints.StandardLibrary;
|
using Amazon.S3.Model.Internal.MarshallTransformations;
|
||||||
using Amazon.S3.Model.Internal.MarshallTransformations;
|
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
using BMA.EHR.Application.Common.Interfaces;
|
||||||
using BMA.EHR.Domain.Models.Base;
|
using BMA.EHR.Domain.Models.Base;
|
||||||
using BMA.EHR.Domain.Models.HR;
|
using BMA.EHR.Domain.Models.HR;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories
|
namespace BMA.EHR.Application.Repositories
|
||||||
{
|
{
|
||||||
|
|
@ -32,7 +26,7 @@ namespace BMA.EHR.Application.Repositories
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_dbSet = _dbContext.Set<T>();
|
_dbSet = _dbContext.Set<T>();
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
// _configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -45,134 +39,10 @@ namespace BMA.EHR.Application.Repositories
|
||||||
|
|
||||||
protected bool? IsPlacementAdmin => _httpContextAccessor?.HttpContext?.User?.IsInRole("placement1");
|
protected bool? IsPlacementAdmin => _httpContextAccessor?.HttpContext?.User?.IsInRole("placement1");
|
||||||
|
|
||||||
protected string? AccessToken => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"];
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
#region " For Call External API "
|
|
||||||
|
|
||||||
protected async Task<string> GetExternalAPIAsync(string apiPath, string accessToken, string apiKey, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", apiKey);
|
|
||||||
var _res = await client.GetAsync(apiPath,cancellationToken: combinedCts.Token);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
return _result;
|
|
||||||
}
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected async Task<string> SendExternalAPIAsync(HttpMethod method, string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
// สร้าง request message
|
|
||||||
var request = new HttpRequestMessage(method, apiPath);
|
|
||||||
|
|
||||||
|
|
||||||
var json = JsonConvert.SerializeObject(body);
|
|
||||||
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", apiKey);
|
|
||||||
var _res = await client.SendAsync(request, combinedCts.Token);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
return _result;
|
|
||||||
}
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
var json = JsonConvert.SerializeObject(body);
|
|
||||||
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
|
|
||||||
//stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", apiKey);
|
|
||||||
var _res = await client.PostAsync(apiPath, stringContent, combinedCts.Token);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
return _result;
|
|
||||||
}
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected async Task<bool> PostExternalAPIBooleanAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
var json = JsonConvert.SerializeObject(body);
|
|
||||||
var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
|
|
||||||
stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", apiKey);
|
|
||||||
var _res = await client.PostAsync(apiPath, stringContent, combinedCts.Token);
|
|
||||||
return _res.IsSuccessStatusCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public async Task<Guid> GetProfileOrganizationAsync(string citizenId)
|
public async Task<Guid> GetProfileOrganizationAsync(string citizenId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -2,11 +2,7 @@
|
||||||
using BMA.EHR.Domain.Models.Base;
|
using BMA.EHR.Domain.Models.Base;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System.IO.Pipes;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves
|
namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
{
|
{
|
||||||
|
|
@ -28,6 +24,7 @@ namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_dbSet = _dbContext.Set<T>();
|
_dbSet = _dbContext.Set<T>();
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -40,44 +37,10 @@ namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
|
|
||||||
protected bool? IsPlacementAdmin => _httpContextAccessor?.HttpContext?.User?.IsInRole("placement1");
|
protected bool? IsPlacementAdmin => _httpContextAccessor?.HttpContext?.User?.IsInRole("placement1");
|
||||||
|
|
||||||
protected string? AccessToken => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"];
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
public async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
var json = JsonConvert.SerializeObject(body);
|
|
||||||
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
|
|
||||||
//stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", apiKey);
|
|
||||||
var _res = await client.PostAsync(apiPath, stringContent, combinedCts.Token);
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
return _result;
|
|
||||||
}
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public virtual async Task<IReadOnlyList<T>> GetAllAsync()
|
public virtual async Task<IReadOnlyList<T>> GetAllAsync()
|
||||||
{
|
{
|
||||||
return await _dbSet.ToListAsync();
|
return await _dbSet.ToListAsync();
|
||||||
|
|
@ -103,24 +66,6 @@ namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<IReadOnlyList<T>> AddRangeAsync(List<T> entities)
|
|
||||||
{
|
|
||||||
foreach (var entity in entities)
|
|
||||||
{
|
|
||||||
if (entity is EntityBase)
|
|
||||||
{
|
|
||||||
(entity as EntityBase).CreatedUserId = UserId ?? "";
|
|
||||||
(entity as EntityBase).CreatedFullName = FullName ?? "System Administrator";
|
|
||||||
(entity as EntityBase).CreatedAt = DateTime.Now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await _dbSet.AddRangeAsync(entities);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
|
|
||||||
return entities;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual async Task<T> UpdateAsync(T entity)
|
public virtual async Task<T> UpdateAsync(T entity)
|
||||||
{
|
{
|
||||||
if (entity is EntityBase)
|
if (entity is EntityBase)
|
||||||
|
|
@ -130,7 +75,6 @@ namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
(entity as EntityBase).LastUpdatedAt = DateTime.Now;
|
(entity as EntityBase).LastUpdatedAt = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
//_dbContext.Detach(entity);
|
|
||||||
_dbSet.Update(entity);
|
_dbSet.Update(entity);
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,587 +0,0 @@
|
||||||
using Amazon.S3.Model;
|
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
|
||||||
using BMA.EHR.Application.Messaging;
|
|
||||||
using BMA.EHR.Application.Responses.Profiles;
|
|
||||||
using BMA.EHR.Domain.Extensions;
|
|
||||||
using BMA.EHR.Domain.Models.Leave.Commons;
|
|
||||||
using BMA.EHR.Domain.Models.Leave.Requests;
|
|
||||||
using BMA.EHR.Domain.Shared;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
|
||||||
{
|
|
||||||
public class LeaveBeginningRepository : GenericLeaveRepository<Guid, LeaveBeginning>
|
|
||||||
{
|
|
||||||
#region " Fields "
|
|
||||||
|
|
||||||
private readonly ILeaveDbContext _dbContext;
|
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
||||||
private readonly OrganizationCommonRepository _organizationCommonRepository;
|
|
||||||
private readonly UserProfileRepository _userProfileRepository;
|
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
private readonly EmailSenderService _emailSenderService;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Keyed locks to serialize get-or-create for LeaveBeginning rows by (ProfileId, LeaveYear, LeaveTypeId).
|
|
||||||
/// Prevents duplicate inserts when concurrent requests (e.g. UI calling /user/check twice) hit the same key.
|
|
||||||
/// </summary>
|
|
||||||
private static readonly ConcurrentDictionary<string, SemaphoreSlim> _getOrAddLocks = new();
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Constructor and Destuctor "
|
|
||||||
|
|
||||||
public LeaveBeginningRepository(ILeaveDbContext dbContext,
|
|
||||||
IHttpContextAccessor httpContextAccessor,
|
|
||||||
OrganizationCommonRepository organizationCommonRepository,
|
|
||||||
UserProfileRepository userProfileRepository,
|
|
||||||
IConfiguration configuration,
|
|
||||||
EmailSenderService emailSenderService) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
|
||||||
_dbContext = dbContext;
|
|
||||||
_httpContextAccessor = httpContextAccessor;
|
|
||||||
_organizationCommonRepository = organizationCommonRepository;
|
|
||||||
_userProfileRepository = userProfileRepository;
|
|
||||||
_configuration = configuration;
|
|
||||||
_emailSenderService = emailSenderService;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Properties "
|
|
||||||
|
|
||||||
protected Guid UserOrganizationId
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (UserId != null || UserId != "")
|
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
|
||||||
else
|
|
||||||
return Guid.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public async Task<List<LeaveBeginning>> GetAllByYearAsync(int year)
|
|
||||||
{
|
|
||||||
return await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.Where(x => x.LeaveYear == year)
|
|
||||||
.ToListAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<LeaveBeginning?> GetByYearAndTypeIdAsync(int year, Guid typeId)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId);
|
|
||||||
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task UpdateLeaveUsageAsync(int year, Guid typeId, Guid userId, double day)
|
|
||||||
{
|
|
||||||
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
|
|
||||||
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
|
||||||
if (pf == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
if (data == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
data.LeaveDaysUsed += day;
|
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task UpdateLeaveCountAsync(int year, Guid typeId, Guid userId, int count)
|
|
||||||
{
|
|
||||||
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
|
|
||||||
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
|
||||||
if (pf == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
if (data == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
data.LeaveCount += count;
|
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ProcessEarlyLeaveRequest(int year)
|
|
||||||
{
|
|
||||||
// Get Early Leave Request (กรองตามปีงบประมาณ: 1 ต.ค. (year-1) – 30 ก.ย. (year))
|
|
||||||
var fiscalStart = new DateTime(year - 1, 10, 1);
|
|
||||||
var fiscalEnd = new DateTime(year, 9, 30);
|
|
||||||
|
|
||||||
var leaveReq = await _dbContext.Set<LeaveRequest>()
|
|
||||||
.Include(x => x.Type)
|
|
||||||
.Where(x => x.LeaveStatus == "APPROVE")
|
|
||||||
.Where(x => x.LeaveStartDate.Date <= fiscalEnd && x.LeaveEndDate.Date >= fiscalStart)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
foreach (var leave in leaveReq)
|
|
||||||
{
|
|
||||||
await GetByYearAndTypeIdForUserWithUpdateAsync(year, leave.Type.Id, leave.KeycloakUserId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ProcessEarlyLeaveRequestSchedule()
|
|
||||||
{
|
|
||||||
int year = DateTime.Now.Year;
|
|
||||||
await ProcessEarlyLeaveRequest(year);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<LeaveBeginning?> GetByYearAndTypeIdForUserAsync(int year, Guid typeId, Guid userId)
|
|
||||||
{
|
|
||||||
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
|
|
||||||
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
|
||||||
if (pf == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
var govAge = (pf?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
|
|
||||||
|
|
||||||
var leaveType = await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Id == typeId);
|
|
||||||
|
|
||||||
LeaveBeginning Factory()
|
|
||||||
{
|
|
||||||
var limit = 0.0;
|
|
||||||
|
|
||||||
var prev = _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefault(x => x.LeaveYear == year - 1 && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
// คำนวณปีงบประมาณจาก startDate (ปีงบประมาณเริ่ม 1 ต.ค. และสิ้นสุด 30 ก.ย.)
|
|
||||||
var isCurrentYear = DateTime.Now.Year == year;
|
|
||||||
|
|
||||||
|
|
||||||
var prevRemain = 0.0;
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
prevRemain = isCurrentYear ? prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0) : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (govAge >= 180)
|
|
||||||
{
|
|
||||||
if (govAge >= 3650)
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 30) limit = 30;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 20) limit = 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new LeaveBeginning
|
|
||||||
{
|
|
||||||
LeaveYear = year,
|
|
||||||
LeaveTypeId = typeId,
|
|
||||||
ProfileId = pf.Id,
|
|
||||||
Prefix = pf.Prefix,
|
|
||||||
FirstName = pf.FirstName,
|
|
||||||
LastName = pf.LastName,
|
|
||||||
LeaveDaysUsed = 0,
|
|
||||||
LeaveDays = leaveType?.Code == "LV-005" ? limit : 0,
|
|
||||||
RootDnaId = pf.RootDnaId,
|
|
||||||
Child1DnaId = pf.Child1DnaId,
|
|
||||||
Child2DnaId = pf.Child2DnaId,
|
|
||||||
Child3DnaId = pf.Child3DnaId,
|
|
||||||
Child4DnaId = pf.Child4DnaId
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return await GetOrAddForUserAsync(year, typeId, pf.Id, Factory);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<LeaveBeginning?> GetByYearAndTypeIdForUserWithUpdateAsync(int year, Guid typeId, Guid userId)
|
|
||||||
{
|
|
||||||
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
|
|
||||||
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
|
||||||
if (pf == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
var govAge = (pf?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
|
|
||||||
|
|
||||||
var leaveType = await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Id == typeId);
|
|
||||||
|
|
||||||
|
|
||||||
var limit = 0.0;
|
|
||||||
|
|
||||||
var prev = _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefault(x => x.LeaveYear == year - 1 && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
var prevRemain = 0.0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (govAge >= 180)
|
|
||||||
{
|
|
||||||
if (govAge >= 3650)
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 30) limit = 30;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 20) limit = 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Where(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id)
|
|
||||||
.FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
if (data != null)
|
|
||||||
{
|
|
||||||
data.LeaveDays = leaveType?.Code == "LV-005" ? limit : 0;
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
// return new LeaveBeginning
|
|
||||||
// {
|
|
||||||
// LeaveYear = year,
|
|
||||||
// LeaveTypeId = typeId,
|
|
||||||
// ProfileId = pf.Id,
|
|
||||||
// Prefix = pf.Prefix,
|
|
||||||
// FirstName = pf.FirstName,
|
|
||||||
// LastName = pf.LastName,
|
|
||||||
// LeaveDaysUsed = 0,
|
|
||||||
// LeaveDays = leaveType?.Code == "LV-005" ? limit : 0,
|
|
||||||
// RootDnaId = pf.RootDnaId,
|
|
||||||
// Child1DnaId = pf.Child1DnaId,
|
|
||||||
// Child2DnaId = pf.Child2DnaId,
|
|
||||||
// Child3DnaId = pf.Child3DnaId,
|
|
||||||
// Child4DnaId = pf.Child4DnaId
|
|
||||||
// };
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<LeaveBeginning?> GetByYearAndTypeIdForUser(int year, Guid typeId, GetProfileByKeycloakIdDto? pf)
|
|
||||||
{
|
|
||||||
var govAge = (pf?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
|
|
||||||
|
|
||||||
var leaveType = await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Id == typeId);
|
|
||||||
|
|
||||||
LeaveBeginning Factory()
|
|
||||||
{
|
|
||||||
var limit = 0.0;
|
|
||||||
|
|
||||||
var prev = _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefault(x => x.LeaveYear == year - 1 && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
// คำนวณปีงบประมาณจาก startDate (ปีงบประมาณเริ่ม 1 ต.ค. และสิ้นสุด 30 ก.ย.)
|
|
||||||
var isCurrentYear = DateTime.Now.Year == year;
|
|
||||||
|
|
||||||
var prevRemain = 0.0;
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
prevRemain = isCurrentYear ? prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0) : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (govAge >= 180)
|
|
||||||
{
|
|
||||||
if (govAge >= 3650)
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 30) limit = 30;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 20) limit = 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new LeaveBeginning
|
|
||||||
{
|
|
||||||
LeaveYear = year,
|
|
||||||
LeaveTypeId = typeId,
|
|
||||||
ProfileId = pf.Id,
|
|
||||||
Prefix = pf.Prefix,
|
|
||||||
FirstName = pf.FirstName,
|
|
||||||
LastName = pf.LastName,
|
|
||||||
LeaveDaysUsed = 0,
|
|
||||||
LeaveDays = leaveType?.Code == "LV-005" ? limit : 0,
|
|
||||||
RootDnaId = pf.RootDnaId,
|
|
||||||
Child1DnaId = pf.Child1DnaId,
|
|
||||||
Child2DnaId = pf.Child2DnaId,
|
|
||||||
Child3DnaId = pf.Child3DnaId,
|
|
||||||
Child4DnaId = pf.Child4DnaId
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return await GetOrAddForUserAsync(year, typeId, pf.Id, Factory);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<LeaveBeginning?> GetByYearAndTypeIdForUser2Async(int year, Guid typeId, Guid userId)
|
|
||||||
{
|
|
||||||
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
|
|
||||||
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
|
|
||||||
if (pf == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var govAge = (pf?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
|
|
||||||
|
|
||||||
var leaveType = await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Id == typeId);
|
|
||||||
|
|
||||||
LeaveBeginning Factory()
|
|
||||||
{
|
|
||||||
var limit = 0.0;
|
|
||||||
|
|
||||||
var prev = _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefault(x => x.LeaveYear == year - 1 && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
// คำนวณปีงบประมาณจาก startDate (ปีงบประมาณเริ่ม 1 ต.ค. และสิ้นสุด 30 ก.ย.)
|
|
||||||
var isCurrentYear = DateTime.Now.Year == year;
|
|
||||||
|
|
||||||
var prevRemain = 0.0;
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
prevRemain = isCurrentYear ? prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0) : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (govAge >= 180)
|
|
||||||
{
|
|
||||||
if (govAge >= 3650)
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 30) limit = 30;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 20) limit = 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new LeaveBeginning
|
|
||||||
{
|
|
||||||
LeaveYear = year,
|
|
||||||
LeaveTypeId = typeId,
|
|
||||||
ProfileId = pf.Id,
|
|
||||||
Prefix = pf.Prefix,
|
|
||||||
FirstName = pf.FirstName,
|
|
||||||
LastName = pf.LastName,
|
|
||||||
LeaveDaysUsed = 0,
|
|
||||||
LeaveDays = leaveType?.Code == "LV-005" ? limit : 0,
|
|
||||||
RootDnaId = pf.RootDnaId,
|
|
||||||
Child1DnaId = pf.Child1DnaId,
|
|
||||||
Child2DnaId = pf.Child2DnaId,
|
|
||||||
Child3DnaId = pf.Child3DnaId,
|
|
||||||
Child4DnaId = pf.Child4DnaId
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return await GetOrAddForUserAsync(year, typeId, pf.Id, Factory);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get-or-create a LeaveBeginning row for (ProfileId, LeaveYear, LeaveTypeId) with concurrency protection.
|
|
||||||
/// Uses a keyed SemaphoreSlim to serialize within-process requests, and re-queries after acquiring the lock.
|
|
||||||
/// If a cross-process insert wins (unique index violation), the duplicate key exception is caught and the row
|
|
||||||
/// created by the winner is returned.
|
|
||||||
/// </summary>
|
|
||||||
private async Task<LeaveBeginning?> GetOrAddForUserAsync(int year, Guid typeId, Guid profileId, Func<LeaveBeginning> factory)
|
|
||||||
{
|
|
||||||
var key = $"{profileId}_{year}_{typeId}";
|
|
||||||
var semaphore = _getOrAddLocks.GetOrAdd(key, _ => new SemaphoreSlim(1, 1));
|
|
||||||
await semaphore.WaitAsync();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Re-query inside the lock — another thread may have created it while we waited.
|
|
||||||
var existing = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == profileId);
|
|
||||||
if (existing != null)
|
|
||||||
{
|
|
||||||
return existing;
|
|
||||||
}
|
|
||||||
|
|
||||||
var entity = factory();
|
|
||||||
_dbContext.Set<LeaveBeginning>().Add(entity);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
catch (DbUpdateException)
|
|
||||||
{
|
|
||||||
// Cross-process/cross-server race hit the unique index (IX_LeaveBeginnings_ProfileId_LeaveYear_LeaveTypeId).
|
|
||||||
// Detach the failed insert and return the row created by the winner.
|
|
||||||
_dbContext.Detach(entity);
|
|
||||||
var winner = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == profileId);
|
|
||||||
return winner;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
semaphore.Release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<LeaveBeginning>> GetAllByYearAndTypeAsync(int year, Guid typeId, List<ProfileData> userIdList)
|
|
||||||
{
|
|
||||||
|
|
||||||
var updateList = new List<LeaveBeginning>();
|
|
||||||
var result = new List<LeaveBeginning>();
|
|
||||||
|
|
||||||
var beginningList = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.Where(x => x.LeaveYear == year && x.LeaveTypeId == typeId)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
foreach (var pf in userIdList)
|
|
||||||
{
|
|
||||||
//var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(id, AccessToken);
|
|
||||||
//if (pf == null)
|
|
||||||
//{
|
|
||||||
// continue; // Goto Next Id
|
|
||||||
//}
|
|
||||||
|
|
||||||
var profile = await _userProfileRepository.GetProfileByProfileIdAsync(pf.Id, AccessToken);
|
|
||||||
if (profile == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var govAge = (pf?.DateStart?.Date ?? DateTime.Now.Date).DiffDay(DateTime.Now.Date);
|
|
||||||
|
|
||||||
var leaveType = await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Id == typeId);
|
|
||||||
|
|
||||||
var data = beginningList.FirstOrDefault(x => x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
if (data == null)
|
|
||||||
{
|
|
||||||
var limit = 0.0;
|
|
||||||
|
|
||||||
var prev = await _dbContext.Set<LeaveBeginning>()
|
|
||||||
.Include(x => x.LeaveType)
|
|
||||||
.FirstOrDefaultAsync(x => x.LeaveYear == year - 1 && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
|
|
||||||
|
|
||||||
var prevRemain = 0.0;
|
|
||||||
if (prev != null)
|
|
||||||
{
|
|
||||||
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (govAge >= 180)
|
|
||||||
{
|
|
||||||
if (govAge >= 3650)
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 30) limit = 30;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 10 + prevRemain;
|
|
||||||
if (limit > 20) limit = 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = new LeaveBeginning
|
|
||||||
{
|
|
||||||
LeaveYear = year,
|
|
||||||
LeaveTypeId = typeId,
|
|
||||||
ProfileId = pf.Id,
|
|
||||||
Prefix = pf.Prefix,
|
|
||||||
FirstName = pf.FirstName,
|
|
||||||
LastName = pf.LastName,
|
|
||||||
LeaveDaysUsed = 0,
|
|
||||||
LeaveDays = leaveType?.Code == "LV-005" ? limit : 0,
|
|
||||||
RootDnaId = profile.RootDnaId,
|
|
||||||
Child1DnaId = profile.Child1DnaId,
|
|
||||||
Child2DnaId = profile.Child2DnaId,
|
|
||||||
Child3DnaId = profile.Child3DnaId,
|
|
||||||
Child4DnaId = profile.Child4DnaId
|
|
||||||
};
|
|
||||||
|
|
||||||
updateList.Add(data);
|
|
||||||
}
|
|
||||||
result.Add(data);
|
|
||||||
}
|
|
||||||
if (!updateList.Any())
|
|
||||||
{
|
|
||||||
await _dbContext.Set<LeaveBeginning>().AddRangeAsync(updateList);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProfileData
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; } = Guid.Empty;
|
|
||||||
|
|
||||||
public string Prefix { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string FirstName { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string LastName { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public DateTime? DateStart { get; set; } = null;
|
|
||||||
|
|
||||||
public DateTime? DateAppoint { get; set; } = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -46,7 +46,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
@ -57,7 +57,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
|
||||||
|
|
||||||
public async Task<LeaveType?> GetLeaveTypeByCodeAsync(string code)
|
public async Task<LeaveType?> GetLeaveTypeByCodeAsync(string code)
|
||||||
{
|
{
|
||||||
return await _dbContext.Set<LeaveType>().AsNoTracking().FirstOrDefaultAsync(x => x.Code == code);
|
return await _dbContext.Set<LeaveType>().FirstOrDefaultAsync(x => x.Code == code);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,10 @@
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
using BMA.EHR.Application.Common.Interfaces;
|
||||||
using BMA.EHR.Application.Messaging;
|
using BMA.EHR.Application.Messaging;
|
||||||
using BMA.EHR.Application.Repositories.Commands;
|
|
||||||
using BMA.EHR.Application.Responses;
|
|
||||||
using BMA.EHR.Domain.Extensions;
|
|
||||||
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
||||||
using BMA.EHR.Domain.Models.Notifications;
|
|
||||||
using BMA.EHR.Domain.Shared;
|
using BMA.EHR.Domain.Shared;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Serilog;
|
|
||||||
using System.Diagnostics;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
{
|
{
|
||||||
|
|
@ -24,8 +18,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
private readonly UserProfileRepository _userProfileRepository;
|
private readonly UserProfileRepository _userProfileRepository;
|
||||||
private readonly IConfiguration _configuration;
|
private readonly IConfiguration _configuration;
|
||||||
private readonly EmailSenderService _emailSenderService;
|
private readonly EmailSenderService _emailSenderService;
|
||||||
private readonly IApplicationDBContext _appContext;
|
|
||||||
private readonly CommandRepository _commandRepository;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
@ -36,9 +28,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
OrganizationCommonRepository organizationCommonRepository,
|
OrganizationCommonRepository organizationCommonRepository,
|
||||||
UserProfileRepository userProfileRepository,
|
UserProfileRepository userProfileRepository,
|
||||||
IConfiguration configuration,
|
IConfiguration configuration,
|
||||||
EmailSenderService emailSenderService,
|
EmailSenderService emailSenderService) : base(dbContext, httpContextAccessor)
|
||||||
IApplicationDBContext appContext,
|
|
||||||
CommandRepository commandRepository) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
|
|
@ -46,8 +36,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
_userProfileRepository = userProfileRepository;
|
_userProfileRepository = userProfileRepository;
|
||||||
_configuration = configuration;
|
_configuration = configuration;
|
||||||
_emailSenderService = emailSenderService;
|
_emailSenderService = emailSenderService;
|
||||||
_appContext = appContext;
|
|
||||||
_commandRepository = commandRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -59,7 +47,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
@ -69,47 +57,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
public override async Task<AdditionalCheckRequest> AddAsync(AdditionalCheckRequest entity)
|
|
||||||
{
|
|
||||||
await base.AddAsync(entity);
|
|
||||||
|
|
||||||
var userId = UserId != null ? Guid.Parse(UserId) : Guid.Empty;
|
|
||||||
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken ?? "");
|
|
||||||
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken ?? "");
|
|
||||||
|
|
||||||
// fix issue : SIT ระบบบันทึกเวลาปฏิบัติงาน>>ลงเวลากรณีพิเศษ (ไม่มีแจ้งเตือนไปยังผู้บังคับบัญชา) #969
|
|
||||||
// send noti + inbox + mail
|
|
||||||
// send inbox and notification
|
|
||||||
var subject_str = $"มีการขออนุมัติลงเวลากรณีพิเศษ";
|
|
||||||
var body_str = $"โปรดพิจารณาคำร้องขอลงเวลาในกรณีพิเศษจาก {profile.Prefix}{profile.FirstName} {profile.LastName} ในวันที่ {entity.CheckDate.Date.ToThaiShortDate2()}";
|
|
||||||
|
|
||||||
var subject = subject_str;
|
|
||||||
var body = body_str;
|
|
||||||
_emailSenderService.SendMail(subject, body, "dev@frappet.com");
|
|
||||||
|
|
||||||
|
|
||||||
var inbox = new Inbox
|
|
||||||
{
|
|
||||||
Subject = subject_str,
|
|
||||||
Body = body_str,
|
|
||||||
ReceiverUserId = profile.CommanderId == Guid.Empty || profile.CommanderId == null ? Guid.Parse("08dbca3a-8b6a-4a4e-8b23-1f62e4f30ef6") : profile.CommanderId.Value,
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_appContext.Set<Inbox>().Add(inbox);
|
|
||||||
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = body_str,
|
|
||||||
ReceiverUserId = profile.CommanderId == Guid.Empty || profile.CommanderId == null ? Guid.Parse("08dbca3a-8b6a-4a4e-8b23-1f62e4f30ef6") : profile.CommanderId.Value,
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_appContext.Set<Notification>().Add(noti);
|
|
||||||
await _appContext.SaveChangesAsync();
|
|
||||||
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<AdditionalCheckRequest>> GetAdditionalCheckRequestsByUserId(Guid keycloakId, int year, int month)
|
public async Task<List<AdditionalCheckRequest>> GetAdditionalCheckRequestsByUserId(Guid keycloakId, int year, int month)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
@ -145,147 +92,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<AdditionalCheckRequest>> GetAdditionalCheckRequestsByAdminRole(int year, int month, string role, string nodeId, int? node, string? keyword)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<AdditionalCheckRequest>().AsQueryable()
|
|
||||||
.Where(x => (x.CheckDate.Year == year && x.CheckDate.Month == month))
|
|
||||||
.OrderByDescending(x => x.CreatedAt.Date)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(keyword))
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
(
|
|
||||||
(x.Prefix ?? "") + (x.FirstName ?? "") + " " + (x.LastName ?? "")).Contains(keyword)
|
|
||||||
|| x.Description.Contains(keyword)
|
|
||||||
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (role == "OWNER")
|
|
||||||
{
|
|
||||||
node = null;
|
|
||||||
}
|
|
||||||
if (role == "OWNER" || role == "CHILD")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true))))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "BROTHER")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "ROOT")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => x.RootDnaId == Guid.Parse(nodeId!)).ToList();
|
|
||||||
}
|
|
||||||
// else if (role == "PARENT")
|
|
||||||
// {
|
|
||||||
// data = data
|
|
||||||
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null && x.Child1DnaId != Guid.Empty).ToList();
|
|
||||||
// }
|
|
||||||
else if (role == "NORMAL")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child1DnaId == Guid.Empty || x.Child1DnaId == null) :
|
|
||||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child2DnaId == Guid.Empty || x.Child2DnaId == null) :
|
|
||||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child3DnaId == Guid.Empty || x.Child3DnaId == null) :
|
|
||||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child4DnaId == Guid.Empty || x.Child4DnaId == null) :
|
|
||||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
|
|
||||||
true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<AdditionalCheckRequest>> GetAdditionalCheckRequestsByAdminRole2(DateTime startDate, DateTime endDate, string role, string nodeId, int? node, string? keyword, string? status)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<AdditionalCheckRequest>().AsQueryable()
|
|
||||||
.Where(x => (x.CheckDate.Date >= startDate.Date && x.CheckDate.Date <= endDate.Date))
|
|
||||||
.OrderByDescending(x => x.CreatedAt.Date)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
if(!string.IsNullOrEmpty(status))
|
|
||||||
data = data.Where(x => x.Status == status).ToList();
|
|
||||||
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(keyword))
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
(
|
|
||||||
(x.Prefix ?? "") + (x.FirstName ?? "") + " " + (x.LastName ?? "")).Contains(keyword)
|
|
||||||
|| x.Description.Contains(keyword)
|
|
||||||
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (role == "OWNER")
|
|
||||||
{
|
|
||||||
node = null;
|
|
||||||
}
|
|
||||||
if (role == "OWNER" || role == "CHILD")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true))))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "BROTHER")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "ROOT")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => x.RootDnaId == Guid.Parse(nodeId!)).ToList();
|
|
||||||
}
|
|
||||||
// else if (role == "PARENT")
|
|
||||||
// {
|
|
||||||
// data = data
|
|
||||||
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null && x.Child1DnaId != Guid.Empty).ToList();
|
|
||||||
// }
|
|
||||||
else if (role == "NORMAL")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child1DnaId == Guid.Empty || x.Child1DnaId == null) :
|
|
||||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child2DnaId == Guid.Empty || x.Child2DnaId == null) :
|
|
||||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child3DnaId == Guid.Empty || x.Child3DnaId == null) :
|
|
||||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) &&
|
|
||||||
(x.Child4DnaId == Guid.Empty || x.Child4DnaId == null) :
|
|
||||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
|
|
||||||
true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,191 +0,0 @@
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
|
||||||
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
|
||||||
{
|
|
||||||
public class CheckInJobStatusRepository : GenericLeaveRepository<Guid, CheckInJobStatus>
|
|
||||||
{
|
|
||||||
#region " Fields "
|
|
||||||
|
|
||||||
private readonly ILeaveDbContext _dbContext;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Constructor and Destructor "
|
|
||||||
|
|
||||||
public CheckInJobStatusRepository(ILeaveDbContext dbContext,
|
|
||||||
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
|
||||||
_dbContext = dbContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Methods "
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status จาก TaskId
|
|
||||||
/// </summary>
|
|
||||||
public async Task<CheckInJobStatus?> GetByTaskIdAsync(Guid taskId)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<CheckInJobStatus>()
|
|
||||||
.Where(x => x.TaskId == taskId)
|
|
||||||
.FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status จาก UserId และสถานะ
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<CheckInJobStatus>> GetByUserIdAndStatusAsync(Guid userId, string status)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<CheckInJobStatus>()
|
|
||||||
.Where(x => x.KeycloakUserId == userId && x.Status == status)
|
|
||||||
.OrderByDescending(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status ที่ยัง pending หรือ processing
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<CheckInJobStatus>> GetPendingOrProcessingJobsAsync(Guid userId)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<CheckInJobStatus>()
|
|
||||||
.Where(x => x.KeycloakUserId == userId &&
|
|
||||||
(x.Status == "PENDING" || x.Status == "PROCESSING"))
|
|
||||||
//.OrderByDescending(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// อัปเดตสถานะเป็น Processing
|
|
||||||
/// </summary>
|
|
||||||
public async Task<CheckInJobStatus> UpdateToProcessingAsync(Guid taskId)
|
|
||||||
{
|
|
||||||
var job = await GetByTaskIdAsync(taskId);
|
|
||||||
if (job != null)
|
|
||||||
{
|
|
||||||
job.Status = "PROCESSING";
|
|
||||||
job.ProcessingDate = DateTime.Now;
|
|
||||||
await UpdateAsync(job);
|
|
||||||
}
|
|
||||||
return job!;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// อัปเดตสถานะเป็น Completed
|
|
||||||
/// </summary>
|
|
||||||
public async Task<CheckInJobStatus> UpdateToCompletedAsync(Guid taskId, string? additionalData = null)
|
|
||||||
{
|
|
||||||
var job = await GetByTaskIdAsync(taskId);
|
|
||||||
if (job != null)
|
|
||||||
{
|
|
||||||
job.Status = "COMPLETED";
|
|
||||||
job.CompletedDate = DateTime.Now;
|
|
||||||
if (!string.IsNullOrEmpty(additionalData))
|
|
||||||
{
|
|
||||||
job.AdditionalData = additionalData;
|
|
||||||
}
|
|
||||||
await UpdateAsync(job);
|
|
||||||
}
|
|
||||||
return job!;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// อัปเดตสถานะเป็น Failed
|
|
||||||
/// </summary>
|
|
||||||
public async Task<CheckInJobStatus> UpdateToFailedAsync(Guid taskId, string errorMessage)
|
|
||||||
{
|
|
||||||
var job = await GetByTaskIdAsync(taskId);
|
|
||||||
if (job != null)
|
|
||||||
{
|
|
||||||
job.Status = "FAILED";
|
|
||||||
job.CompletedDate = DateTime.Now;
|
|
||||||
job.ErrorMessage = errorMessage;
|
|
||||||
await UpdateAsync(job);
|
|
||||||
}
|
|
||||||
return job!;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูลงานที่ค้างอยู่ในสถานะ PENDING หรือ PROCESSING เกินเวลาที่กำหนด (นาที)
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<CheckInJobStatus>> GetStalePendingOrProcessingJobsAsync(int timeoutMinutes = 30)
|
|
||||||
{
|
|
||||||
//var cutoffDate = DateTime.Now.AddMinutes(-timeoutMinutes);
|
|
||||||
var cutoffDate = DateTime.Now.AddMinutes(-timeoutMinutes);
|
|
||||||
var staleJobs = await _dbContext.Set<CheckInJobStatus>()
|
|
||||||
.Where(x => (x.Status == "PENDING" || x.Status == "PROCESSING")
|
|
||||||
&& x.CreatedDate <= cutoffDate)
|
|
||||||
.OrderBy(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return staleJobs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูลงานที่ค้างอยู่ในสถานะ PENDING หรือ PROCESSING เกินเวลาที่กำหนด (นาที) ของ user คนใดคนหนึ่ง
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<CheckInJobStatus>> GetStalePendingOrProcessingJobsByUserAsync(Guid userId, int timeoutMinutes = 30)
|
|
||||||
{
|
|
||||||
var cutoffDate = DateTime.Now.AddMinutes(-timeoutMinutes);
|
|
||||||
//var cutoffDate = new DateTime(2026, 5, 28, 23, 59, 59);
|
|
||||||
var staleJobs = await _dbContext.Set<CheckInJobStatus>()
|
|
||||||
.Where(x => x.KeycloakUserId == userId
|
|
||||||
&& (x.Status == "PENDING" || x.Status == "PROCESSING")
|
|
||||||
&& x.CreatedDate < cutoffDate)
|
|
||||||
.OrderBy(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return staleJobs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Mark งานที่ค้างเกินเวลาที่กำหนดเป็น FAILED
|
|
||||||
/// </summary>
|
|
||||||
public async Task<int> MarkStaleJobsAsFailedAsync(int timeoutMinutes = 30)
|
|
||||||
{
|
|
||||||
var staleJobs = await GetStalePendingOrProcessingJobsAsync(timeoutMinutes);
|
|
||||||
|
|
||||||
foreach (var job in staleJobs)
|
|
||||||
{
|
|
||||||
job.Status = "FAILED";
|
|
||||||
job.CompletedDate = DateTime.Now;
|
|
||||||
job.ErrorMessage = $"งานค้างในสถานะ {job.Status} เกิน {timeoutMinutes} นาที ระบบทำเครื่องหมายเป็น FAILED อัตโนมัติ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (staleJobs.Any())
|
|
||||||
{
|
|
||||||
_dbContext.Set<CheckInJobStatus>().UpdateRange(staleJobs);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
return staleJobs.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ล้างข้อมูล Job Status ที่เก่าเกิน X วัน
|
|
||||||
/// </summary>
|
|
||||||
public async Task<int> CleanupOldJobsAsync(int daysOld = 30)
|
|
||||||
{
|
|
||||||
var cutoffDate = DateTime.Now.AddDays(-daysOld);
|
|
||||||
var oldJobs = await _dbContext.Set<CheckInJobStatus>()
|
|
||||||
.Where(x => x.CreatedDate < cutoffDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
_dbContext.Set<CheckInJobStatus>().RemoveRange(oldJobs);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
|
|
||||||
return oldJobs.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -46,7 +46,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
@ -61,12 +61,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return await _dbContext.Set<DutyTime>().Where(x => x.IsActive).ToListAsync();
|
return await _dbContext.Set<DutyTime>().Where(x => x.IsActive).ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DutyTime?> GetDefaultAsync(CancellationToken cancellationToken = default)
|
public async Task<DutyTime?> GetDefaultAsync()
|
||||||
{
|
{
|
||||||
// กำหนด timeout เป็น 30 นาที
|
return await _dbContext.Set<DutyTime>().Where(x => x.IsDefault).FirstOrDefaultAsync();
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
return await _dbContext.Set<DutyTime>().Where(x => x.IsDefault).FirstOrDefaultAsync(combinedCts.Token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -1,795 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.IO;
|
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
|
||||||
using BMA.EHR.Application.Repositories.Leaves.LeaveRequests;
|
|
||||||
using BMA.EHR.Application.Repositories.MetaData;
|
|
||||||
using BMA.EHR.Application.Responses.Profiles;
|
|
||||||
using BMA.EHR.Domain.Extensions;
|
|
||||||
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
|
||||||
{
|
|
||||||
public class LeaveProcessJobStatusRepository: GenericLeaveRepository<Guid, LeaveProcessJobStatus>
|
|
||||||
{
|
|
||||||
#region " Fields "
|
|
||||||
|
|
||||||
private readonly ILeaveDbContext _dbContext;
|
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
||||||
private readonly UserProfileRepository _userProfileRepository;
|
|
||||||
private readonly HolidayRepository _holidayRepository;
|
|
||||||
private readonly DutyTimeRepository _dutyTimeRepository;
|
|
||||||
private readonly UserDutyTimeRepository _userDutyTimeRepository;
|
|
||||||
private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository;
|
|
||||||
private readonly LeaveRequestRepository _leaveRequestRepository;
|
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
private readonly IWebHostEnvironment _env;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Constructor and Destructor "
|
|
||||||
|
|
||||||
public LeaveProcessJobStatusRepository(ILeaveDbContext dbContext,
|
|
||||||
IHttpContextAccessor httpContextAccessor,
|
|
||||||
UserProfileRepository userProfileRepository,
|
|
||||||
HolidayRepository holidayRepository,
|
|
||||||
DutyTimeRepository dutyTimeRepository,
|
|
||||||
UserDutyTimeRepository userDutyTimeRepository,
|
|
||||||
ProcessUserTimeStampRepository processUserTimeStampRepository,
|
|
||||||
LeaveRequestRepository leaveRequestRepository,
|
|
||||||
IConfiguration configuration,
|
|
||||||
IWebHostEnvironment env) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
|
||||||
_dbContext = dbContext;
|
|
||||||
_httpContextAccessor = httpContextAccessor;
|
|
||||||
_userProfileRepository = userProfileRepository;
|
|
||||||
_holidayRepository = holidayRepository;
|
|
||||||
_configuration = configuration;
|
|
||||||
_leaveRequestRepository = leaveRequestRepository;
|
|
||||||
_dutyTimeRepository = dutyTimeRepository;
|
|
||||||
_userDutyTimeRepository = userDutyTimeRepository;
|
|
||||||
_processUserTimeStampRepository = processUserTimeStampRepository;
|
|
||||||
_env = env;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Methods "
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status จาก TaskId
|
|
||||||
/// </summary>
|
|
||||||
public async Task<LeaveProcessJobStatus?> GetByTaskIdAsync(Guid id)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<LeaveProcessJobStatus>()
|
|
||||||
.Where(x => x.Id == id)
|
|
||||||
.FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status จาก UserId และสถานะ
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<LeaveProcessJobStatus>> GetByUserIdAndStatusAsync(Guid userId, string status)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<LeaveProcessJobStatus>()
|
|
||||||
.Where(x => x.CreatedUserId == userId.ToString("D") && x.Status == status)
|
|
||||||
.OrderByDescending(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status จาก UserId
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<LeaveProcessJobStatus>> GetByUserIdAsync(Guid userId)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<LeaveProcessJobStatus>()
|
|
||||||
.Where(x => x.CreatedUserId == userId.ToString("D"))
|
|
||||||
.OrderByDescending(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ดึงข้อมูล Job Status ที่ยัง pending หรือ processing
|
|
||||||
/// </summary>
|
|
||||||
public async Task<List<LeaveProcessJobStatus>> GetPendingOrProcessingJobsAsync(Guid userId)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<LeaveProcessJobStatus>()
|
|
||||||
.Where(x => x.CreatedUserId == userId.ToString("D") &&
|
|
||||||
(x.Status == "PENDING" || x.Status == "PROCESSING"))
|
|
||||||
//.OrderByDescending(x => x.CreatedDate)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<LeaveProcessJobStatus>> GetPendingJobsAsync()
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<LeaveProcessJobStatus>()
|
|
||||||
.Where(x => x.Status == "PENDING")
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// อัปเดตสถานะเป็น Processing
|
|
||||||
/// </summary>
|
|
||||||
public async Task<LeaveProcessJobStatus> UpdateToProcessingAsync(Guid id)
|
|
||||||
{
|
|
||||||
var job = await GetByTaskIdAsync(id);
|
|
||||||
if (job != null)
|
|
||||||
{
|
|
||||||
job.Status = "PROCESSING";
|
|
||||||
job.ProcessingDate = DateTime.Now;
|
|
||||||
await UpdateAsync(job);
|
|
||||||
}
|
|
||||||
return job!;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// อัปเดตสถานะเป็น Completed
|
|
||||||
/// </summary>
|
|
||||||
public async Task<LeaveProcessJobStatus> UpdateToCompletedAsync(Guid id, string? additionalData = null)
|
|
||||||
{
|
|
||||||
var job = await GetByTaskIdAsync(id);
|
|
||||||
if (job != null)
|
|
||||||
{
|
|
||||||
job.Status = "COMPLETED";
|
|
||||||
job.CompletedDate = DateTime.Now;
|
|
||||||
await UpdateAsync(job);
|
|
||||||
}
|
|
||||||
return job!;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// อัปเดตสถานะเป็น Failed
|
|
||||||
/// </summary>
|
|
||||||
public async Task<LeaveProcessJobStatus> UpdateToFailedAsync(Guid id, string errorMessage)
|
|
||||||
{
|
|
||||||
var job = await GetByTaskIdAsync(id);
|
|
||||||
if (job != null)
|
|
||||||
{
|
|
||||||
job.Status = "FAILED";
|
|
||||||
job.CompletedDate = DateTime.Now;
|
|
||||||
job.ErrorMessage = errorMessage;
|
|
||||||
await UpdateAsync(job);
|
|
||||||
}
|
|
||||||
return job!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ProcessTaskAsync(Guid rootDnaId, DateTime? startDate, DateTime? endDate)
|
|
||||||
{
|
|
||||||
|
|
||||||
var profiles = new List<GetProfileByKeycloakIdRootDto>();
|
|
||||||
var dateStart = startDate?.Date ?? DateTime.Now.Date;
|
|
||||||
var dateEnd = endDate?.Date ?? DateTime.Now.Date;
|
|
||||||
|
|
||||||
var holidays = await _holidayRepository.GetHolidayAsync(dateStart, dateEnd);
|
|
||||||
var weekend = _holidayRepository.GetWeekEnd(dateStart, dateEnd);
|
|
||||||
var excludeDates = holidays.Union(weekend).ToList();
|
|
||||||
|
|
||||||
var dateList = new List<LoopDate>();
|
|
||||||
for (DateTime i = dateStart; i <= dateEnd; i = i.AddDays(1))
|
|
||||||
{
|
|
||||||
if (holidays.Contains(i))
|
|
||||||
{
|
|
||||||
var d = await _holidayRepository.GetHolidayAsync(i);
|
|
||||||
dateList.Add(new LoopDate
|
|
||||||
{
|
|
||||||
date = i,
|
|
||||||
isHoliday = true,
|
|
||||||
isWeekEnd = false,
|
|
||||||
dateRemark = d
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else if (weekend.Contains(i))
|
|
||||||
{
|
|
||||||
dateList.Add(new LoopDate
|
|
||||||
{
|
|
||||||
date = i,
|
|
||||||
isHoliday = true,
|
|
||||||
isWeekEnd = false,
|
|
||||||
dateRemark = "วันหยุด"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dateList.Add(new LoopDate
|
|
||||||
{
|
|
||||||
date = i,
|
|
||||||
isHoliday = false,
|
|
||||||
isWeekEnd = false,
|
|
||||||
dateRemark = ""
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
|
|
||||||
if (defaultRound == null)
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่พบรอบการลงเวลา Default");
|
|
||||||
}
|
|
||||||
|
|
||||||
var employees = new List<DateResultReport>();
|
|
||||||
|
|
||||||
foreach (var dd in dateList.Where(x => !x.isHoliday && !x.isWeekEnd))
|
|
||||||
{
|
|
||||||
profiles = await _userProfileRepository.GetAllOfficerByRootDnaId(rootDnaId.ToString(),dd.date);
|
|
||||||
foreach (var p in profiles)
|
|
||||||
{
|
|
||||||
var count = 1;
|
|
||||||
var keycloakUserId = p.Keycloak ?? Guid.Empty;
|
|
||||||
|
|
||||||
var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd.date);
|
|
||||||
|
|
||||||
var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}";
|
|
||||||
|
|
||||||
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id, dd.date);
|
|
||||||
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
|
|
||||||
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
|
|
||||||
|
|
||||||
var duty = userRound ?? defaultRound;
|
|
||||||
|
|
||||||
// check วันลาของแต่ละคน
|
|
||||||
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd.date);
|
|
||||||
var remarkStr = string.Empty;
|
|
||||||
var status = string.Empty;
|
|
||||||
var stampType = string.Empty;
|
|
||||||
var stampAmount = 0.0;
|
|
||||||
|
|
||||||
if (leaveReq != null)
|
|
||||||
{
|
|
||||||
switch (leaveReq.Type.Code.ToUpper())
|
|
||||||
{
|
|
||||||
case "LV-001":
|
|
||||||
case "LV-002":
|
|
||||||
case "LV-005":
|
|
||||||
remarkStr += leaveReq.Type.Name;
|
|
||||||
var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper();
|
|
||||||
|
|
||||||
if(leaveReq.LeaveStartDate.Date == leaveReq.LeaveEndDate.Date)
|
|
||||||
{
|
|
||||||
if (leaveRange == "MORNING")
|
|
||||||
remarkStr += "ครึ่งวันเช้า";
|
|
||||||
else if (leaveRange == "AFTERNOON")
|
|
||||||
remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
|
|
||||||
|
|
||||||
// var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
|
||||||
// if (leaveRangeEnd == "MORNING")
|
|
||||||
// remarkStr += "ครึ่งวันเช้า";
|
|
||||||
// else if (leaveRangeEnd == "AFTERNOON")
|
|
||||||
// remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
|
|
||||||
var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
|
||||||
if (leaveRange != leaveRangeEnd)
|
|
||||||
{
|
|
||||||
if (leaveRangeEnd == "MORNING")
|
|
||||||
remarkStr += " - ครึ่งวันเช้า";
|
|
||||||
else if (leaveRangeEnd == "AFTERNOON")
|
|
||||||
remarkStr += " - ครึ่งวันบ่าย";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(dd.date == leaveReq.LeaveStartDate.Date)
|
|
||||||
{
|
|
||||||
if (leaveRange == "MORNING")
|
|
||||||
remarkStr += "ครึ่งวันเช้า";
|
|
||||||
else if (leaveRange == "AFTERNOON")
|
|
||||||
remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
}
|
|
||||||
else if(dd.date == leaveReq.LeaveEndDate.Date)
|
|
||||||
{
|
|
||||||
var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
|
||||||
if (leaveRangeEnd == "MORNING")
|
|
||||||
remarkStr += "ครึ่งวันเช้า";
|
|
||||||
else if (leaveRangeEnd == "AFTERNOON")
|
|
||||||
remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
else
|
|
||||||
remarkStr += "เต็มวัน";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remarkStr += "เต็มวัน";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
remarkStr += leaveReq.Type.Name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
status = "LEAVE";
|
|
||||||
if(leaveReq.LeaveStartDate.Date == dd.date)
|
|
||||||
{
|
|
||||||
stampType = leaveReq.LeaveRange ?? "";
|
|
||||||
stampAmount = leaveReq.LeaveRange != "ALL" ? 0.5 : 1;
|
|
||||||
}
|
|
||||||
else if(leaveReq.LeaveEndDate.Date == dd.date)
|
|
||||||
{
|
|
||||||
stampAmount = leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1;
|
|
||||||
stampType = leaveReq.LeaveRangeEnd ?? "";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
stampAmount = leaveReq.LeaveRange != "ALL" || leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1;
|
|
||||||
if(stampType == "ALL") stampType = "FULL_DAY";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (timeStamps == null)
|
|
||||||
{
|
|
||||||
if (dd.date <= DateTime.Now.Date)
|
|
||||||
{
|
|
||||||
remarkStr = "ขาดราชการ";
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
if (dd.isHoliday == true)
|
|
||||||
{
|
|
||||||
remarkStr = $"วันหยุด ({dd.dateRemark})";
|
|
||||||
status = "HOLIDAY";
|
|
||||||
}
|
|
||||||
else if (dd.isWeekEnd)
|
|
||||||
{
|
|
||||||
remarkStr = dd.dateRemark;
|
|
||||||
status = "WEEKEND";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else remarkStr = "";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// check status ของการลงเวลา
|
|
||||||
if (timeStamps.CheckOut != null)
|
|
||||||
{
|
|
||||||
if (timeStamps.CheckOutStatus == "ABSENT")
|
|
||||||
{
|
|
||||||
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckOut ? $" (นอกสถานที่:{timeStamps.CheckOutLocationName})".Trim() : "");
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
}
|
|
||||||
else if (timeStamps.CheckInStatus == "ABSENT")
|
|
||||||
{
|
|
||||||
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
}
|
|
||||||
else if (timeStamps.CheckInStatus == "LATE")
|
|
||||||
{
|
|
||||||
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
status = "LATE";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
//lateTotal += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (timeStamps.CheckInStatus == "ABSENT")
|
|
||||||
{
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
}
|
|
||||||
else if (timeStamps.CheckInStatus == "LATE")
|
|
||||||
{
|
|
||||||
status = "LATE";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
//lateTotal += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var emp = new DateResultReport
|
|
||||||
{
|
|
||||||
profileId = p.Id.ToString(),
|
|
||||||
stampDate = dd.date,
|
|
||||||
stampType = stampType,
|
|
||||||
stampAmount = stampAmount,
|
|
||||||
remark = remarkStr,
|
|
||||||
status = status
|
|
||||||
};
|
|
||||||
|
|
||||||
employees.Add(emp);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write employees to JSON file
|
|
||||||
// var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
|
|
||||||
// var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Exports", fileName);
|
|
||||||
|
|
||||||
// // Ensure directory exists
|
|
||||||
// var directory = Path.GetDirectoryName(filePath);
|
|
||||||
// if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
|
|
||||||
// {
|
|
||||||
// Directory.CreateDirectory(directory);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var jsonOptions = new JsonSerializerOptions
|
|
||||||
// {
|
|
||||||
// WriteIndented = true,
|
|
||||||
// Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
|
||||||
// };
|
|
||||||
|
|
||||||
// var jsonContent = JsonSerializer.Serialize(employees, jsonOptions);
|
|
||||||
// await File.WriteAllTextAsync(filePath, jsonContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
//call api
|
|
||||||
var apiPath = $"{_configuration["API"]}/org/unauthorize/profile/absent-late/batch";
|
|
||||||
var apiKey = _configuration["API_KEY"];
|
|
||||||
var body = new
|
|
||||||
{
|
|
||||||
records = employees.Where(x => x.status == "ABSENT" || x.status == "LATE").ToList()
|
|
||||||
};
|
|
||||||
|
|
||||||
var apiResult = await PostExternalAPIAsync(apiPath, AccessToken ?? "", body, apiKey);
|
|
||||||
if(apiResult == "")
|
|
||||||
{
|
|
||||||
throw new Exception($"เรียก API {apiPath} ไม่สำเร็จ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ProcessEmpTaskAsync(Guid rootDnaId, DateTime? startDate, DateTime? endDate)
|
|
||||||
{
|
|
||||||
|
|
||||||
var profiles = new List<GetProfileByKeycloakIdRootDto>();
|
|
||||||
var dateStart = startDate?.Date ?? DateTime.Now.Date;
|
|
||||||
var dateEnd = endDate?.Date ?? DateTime.Now.Date;
|
|
||||||
|
|
||||||
var holidays = await _holidayRepository.GetHolidayAsync(dateStart, dateEnd);
|
|
||||||
var weekend = _holidayRepository.GetWeekEnd(dateStart, dateEnd);
|
|
||||||
var excludeDates = holidays.Union(weekend).ToList();
|
|
||||||
|
|
||||||
var dateList = new List<LoopDate>();
|
|
||||||
for (DateTime i = dateStart; i <= dateEnd; i = i.AddDays(1))
|
|
||||||
{
|
|
||||||
if (holidays.Contains(i))
|
|
||||||
{
|
|
||||||
var d = await _holidayRepository.GetHolidayAsync(i);
|
|
||||||
dateList.Add(new LoopDate
|
|
||||||
{
|
|
||||||
date = i,
|
|
||||||
isHoliday = true,
|
|
||||||
isWeekEnd = false,
|
|
||||||
dateRemark = d
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else if (weekend.Contains(i))
|
|
||||||
{
|
|
||||||
dateList.Add(new LoopDate
|
|
||||||
{
|
|
||||||
date = i,
|
|
||||||
isHoliday = true,
|
|
||||||
isWeekEnd = false,
|
|
||||||
dateRemark = "วันหยุด"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dateList.Add(new LoopDate
|
|
||||||
{
|
|
||||||
date = i,
|
|
||||||
isHoliday = false,
|
|
||||||
isWeekEnd = false,
|
|
||||||
dateRemark = ""
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
|
|
||||||
if (defaultRound == null)
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่พบรอบการลงเวลา Default");
|
|
||||||
}
|
|
||||||
|
|
||||||
var employees = new List<DateResultReport>();
|
|
||||||
|
|
||||||
foreach (var dd in dateList.Where(x => !x.isHoliday && !x.isWeekEnd))
|
|
||||||
{
|
|
||||||
profiles = await _userProfileRepository.GetAllEmployeeByRootDnaId(rootDnaId.ToString(),dd.date);
|
|
||||||
foreach (var p in profiles)
|
|
||||||
{
|
|
||||||
var count = 1;
|
|
||||||
var keycloakUserId = p.Keycloak ?? Guid.Empty;
|
|
||||||
|
|
||||||
var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd.date);
|
|
||||||
|
|
||||||
var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}";
|
|
||||||
|
|
||||||
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id, dd.date);
|
|
||||||
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
|
|
||||||
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
|
|
||||||
|
|
||||||
var duty = userRound ?? defaultRound;
|
|
||||||
|
|
||||||
// check วันลาของแต่ละคน
|
|
||||||
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd.date);
|
|
||||||
var remarkStr = string.Empty;
|
|
||||||
var status = string.Empty;
|
|
||||||
var stampType = string.Empty;
|
|
||||||
var stampAmount = 0.0;
|
|
||||||
|
|
||||||
if (leaveReq != null)
|
|
||||||
{
|
|
||||||
switch (leaveReq.Type.Code.ToUpper())
|
|
||||||
{
|
|
||||||
case "LV-001":
|
|
||||||
case "LV-002":
|
|
||||||
case "LV-005":
|
|
||||||
remarkStr += leaveReq.Type.Name;
|
|
||||||
var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper();
|
|
||||||
|
|
||||||
if(leaveReq.LeaveStartDate.Date == leaveReq.LeaveEndDate.Date)
|
|
||||||
{
|
|
||||||
if (leaveRange == "MORNING")
|
|
||||||
remarkStr += "ครึ่งวันเช้า";
|
|
||||||
else if (leaveRange == "AFTERNOON")
|
|
||||||
remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
|
|
||||||
|
|
||||||
// var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
|
||||||
// if (leaveRangeEnd == "MORNING")
|
|
||||||
// remarkStr += "ครึ่งวันเช้า";
|
|
||||||
// else if (leaveRangeEnd == "AFTERNOON")
|
|
||||||
// remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
|
|
||||||
var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
|
||||||
if (leaveRange != leaveRangeEnd)
|
|
||||||
{
|
|
||||||
if (leaveRangeEnd == "MORNING")
|
|
||||||
remarkStr += " - ครึ่งวันเช้า";
|
|
||||||
else if (leaveRangeEnd == "AFTERNOON")
|
|
||||||
remarkStr += " - ครึ่งวันบ่าย";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(dd.date == leaveReq.LeaveStartDate.Date)
|
|
||||||
{
|
|
||||||
if (leaveRange == "MORNING")
|
|
||||||
remarkStr += "ครึ่งวันเช้า";
|
|
||||||
else if (leaveRange == "AFTERNOON")
|
|
||||||
remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
}
|
|
||||||
else if(dd.date == leaveReq.LeaveEndDate.Date)
|
|
||||||
{
|
|
||||||
var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
|
||||||
if (leaveRangeEnd == "MORNING")
|
|
||||||
remarkStr += "ครึ่งวันเช้า";
|
|
||||||
else if (leaveRangeEnd == "AFTERNOON")
|
|
||||||
remarkStr += "ครึ่งวันบ่าย";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remarkStr += "เต็มวัน";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
remarkStr += leaveReq.Type.Name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
status = "LEAVE";
|
|
||||||
if(leaveReq.LeaveStartDate.Date == dd.date)
|
|
||||||
{
|
|
||||||
stampType = leaveReq.LeaveRange ?? "";
|
|
||||||
stampAmount = leaveReq.LeaveRange != "ALL" ? 0.5 : 1;
|
|
||||||
}
|
|
||||||
else if(leaveReq.LeaveEndDate.Date == dd.date)
|
|
||||||
{
|
|
||||||
stampAmount = leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1;
|
|
||||||
stampType = leaveReq.LeaveRangeEnd ?? "";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
stampAmount = leaveReq.LeaveRange != "ALL" || leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1;
|
|
||||||
if(stampType == "ALL") stampType = "FULL_DAY";
|
|
||||||
//stampAmount = leaveReq.LeaveRange != "ALL" || leaveReq.LeaveRangeEnd != "ALL" ? 0.5 : 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (timeStamps == null)
|
|
||||||
{
|
|
||||||
if (dd.date <= DateTime.Now.Date)
|
|
||||||
{
|
|
||||||
remarkStr = "ขาดราชการ";
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
if (dd.isHoliday == true)
|
|
||||||
{
|
|
||||||
remarkStr = $"วันหยุด ({dd.dateRemark})";
|
|
||||||
status = "HOLIDAY";
|
|
||||||
}
|
|
||||||
else if (dd.isWeekEnd)
|
|
||||||
{
|
|
||||||
remarkStr = dd.dateRemark;
|
|
||||||
status = "WEEKEND";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else remarkStr = "";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// check status ของการลงเวลา
|
|
||||||
if (timeStamps.CheckOut != null)
|
|
||||||
{
|
|
||||||
if (timeStamps.CheckOutStatus == "ABSENT")
|
|
||||||
{
|
|
||||||
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckOut ? $" (นอกสถานที่:{timeStamps.CheckOutLocationName})".Trim() : "");
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
}
|
|
||||||
else if (timeStamps.CheckInStatus == "ABSENT")
|
|
||||||
{
|
|
||||||
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
}
|
|
||||||
else if (timeStamps.CheckInStatus == "LATE")
|
|
||||||
{
|
|
||||||
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
status = "LATE";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
//lateTotal += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (timeStamps.CheckInStatus == "ABSENT")
|
|
||||||
{
|
|
||||||
status = "ABSENT";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
}
|
|
||||||
else if (timeStamps.CheckInStatus == "LATE")
|
|
||||||
{
|
|
||||||
status = "LATE";
|
|
||||||
stampType = "FULL_DAY";
|
|
||||||
stampAmount = 1;
|
|
||||||
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
|
||||||
//lateTotal += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var emp = new DateResultReport
|
|
||||||
{
|
|
||||||
profileId = p.Id.ToString(),
|
|
||||||
stampDate = dd.date,
|
|
||||||
stampType = stampType,
|
|
||||||
stampAmount = stampAmount,
|
|
||||||
remark = remarkStr,
|
|
||||||
status = status
|
|
||||||
};
|
|
||||||
|
|
||||||
employees.Add(emp);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write employees to JSON file
|
|
||||||
// var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
|
|
||||||
// var filePath = Path.Combine(_env.ContentRootPath, "Exports", fileName);
|
|
||||||
|
|
||||||
// // Ensure directory exists
|
|
||||||
// var directory = Path.GetDirectoryName(filePath);
|
|
||||||
// if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
|
|
||||||
// {
|
|
||||||
// Directory.CreateDirectory(directory);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var jsonOptions = new JsonSerializerOptions
|
|
||||||
// {
|
|
||||||
// WriteIndented = true,
|
|
||||||
// Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
|
||||||
// };
|
|
||||||
|
|
||||||
// var jsonContent = JsonSerializer.Serialize(employees, jsonOptions);
|
|
||||||
// Console.WriteLine($"Writing file to: {filePath}");
|
|
||||||
// await File.WriteAllTextAsync(filePath, jsonContent);
|
|
||||||
// Console.WriteLine($"File written successfully: {fileName}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// call api
|
|
||||||
var apiPath = $"{_configuration["API"]}/org/unauthorize/profile-employee/absent-late/batch";
|
|
||||||
var apiKey = _configuration["API_KEY"];
|
|
||||||
var body = new
|
|
||||||
{
|
|
||||||
records = employees.Where(x => x.status == "ABSENT" || x.status == "LATE").ToList()
|
|
||||||
};
|
|
||||||
|
|
||||||
var apiResult = await PostExternalAPIAsync(apiPath, AccessToken ?? "", body, apiKey);
|
|
||||||
if(apiResult == "")
|
|
||||||
{
|
|
||||||
throw new Exception($"เรียก API {apiPath} ไม่สำเร็จ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task ProcessPendingJobsAsync()
|
|
||||||
{
|
|
||||||
var pendingJobs = await GetPendingJobsAsync();
|
|
||||||
Console.WriteLine($"พบงานที่ค้างอยู่ในสถานะ PENDING จำนวน {pendingJobs.Count} งาน");
|
|
||||||
|
|
||||||
foreach (var job in pendingJobs)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// อัปเดตสถานะเป็น Processing
|
|
||||||
await UpdateToProcessingAsync(job.Id);
|
|
||||||
|
|
||||||
// ทำงานที่ต้องการที่นี่ (เช่น เรียก API, ประมวลผลข้อมูล ฯลฯ)
|
|
||||||
await ProcessTaskAsync(job.RootDnaId,job.StartDate, job.EndDate);
|
|
||||||
await ProcessEmpTaskAsync(job.RootDnaId,job.StartDate, job.EndDate);
|
|
||||||
|
|
||||||
// อัปเดตสถานะเป็น Completed
|
|
||||||
await UpdateToCompletedAsync(job.Id);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// หากเกิดข้อผิดพลาด อัปเดตสถานะเป็น Failed พร้อมข้อความแสดงข้อผิดพลาด
|
|
||||||
await UpdateToFailedAsync(job.Id, ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
class LoopDate
|
|
||||||
{
|
|
||||||
public DateTime date { get; set; }
|
|
||||||
|
|
||||||
public bool isHoliday { get; set; }
|
|
||||||
|
|
||||||
public bool isWeekEnd { get; set; }
|
|
||||||
|
|
||||||
public string dateRemark { get; set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class DateResultReport
|
|
||||||
{
|
|
||||||
public string? profileId { get; set; }
|
|
||||||
public DateTime stampDate { get; set; }
|
|
||||||
public string stampType { get; set; }
|
|
||||||
public double stampAmount { get; set; }
|
|
||||||
public string remark { get; set; }
|
|
||||||
public string status { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -46,7 +46,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
@ -139,68 +139,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<ProcessUserTimeStamp>> GetTimestampByDateLateAsync(string type, string role, string nodeId, int? node, string nodeIdByReq, int? nodeByReq, DateTime StartDate, DateTime EndDate)
|
|
||||||
{
|
|
||||||
var data = new List<ProcessUserTimeStamp>();
|
|
||||||
data = await _dbContext.Set<ProcessUserTimeStamp>().AsQueryable()
|
|
||||||
.Where(x => x.CheckInStatus == "LATE")
|
|
||||||
.Where(u => u.CheckIn.Date >= StartDate && u.CheckIn.Date <= EndDate)
|
|
||||||
.Where(x => x.ProfileType == type.Trim().ToUpper()).ToListAsync();
|
|
||||||
// กรองตามสิทธิ์ admin ก่อน
|
|
||||||
if (role == "CHILD")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId) :
|
|
||||||
node == null ? true : true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
else if (role == "BROTHER")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 4 ? x.Child3DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 3 ? x.Child2DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 2 ? x.Child1DnaId == Guid.Parse(nodeId) :
|
|
||||||
node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId) :
|
|
||||||
node == null ? true : true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
else if (role == "ROOT")
|
|
||||||
{
|
|
||||||
data = data.Where(x => x.RootDnaId == Guid.Parse(nodeId)).ToList();
|
|
||||||
}
|
|
||||||
// else if (role == "PARENT")
|
|
||||||
// {
|
|
||||||
// data = data.Where(x => x.RootDnaId == Guid.Parse(nodeId) && x.Child1DnaId != null).ToList();
|
|
||||||
// }
|
|
||||||
else if (role == "NORMAL")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null :
|
|
||||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null :
|
|
||||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null :
|
|
||||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null :
|
|
||||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
|
|
||||||
true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
// กรองตามที่ fe ส่งมา
|
|
||||||
if (role == "ROOT" || role == "OWNER" || role == "CHILD" || role == "BROTHER" || role == "PARENT")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
nodeByReq == 4 ? x.Child4DnaId == Guid.Parse(nodeIdByReq) :
|
|
||||||
nodeByReq == 3 ? x.Child3DnaId == Guid.Parse(nodeIdByReq) :
|
|
||||||
nodeByReq == 2 ? x.Child2DnaId == Guid.Parse(nodeIdByReq) :
|
|
||||||
nodeByReq == 1 ? x.Child1DnaId == Guid.Parse(nodeIdByReq) :
|
|
||||||
nodeByReq == 0 ? x.RootDnaId == Guid.Parse(nodeIdByReq) : true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<ProcessUserTimeStamp?> GetLastRecord(Guid keycloakId)
|
public async Task<ProcessUserTimeStamp?> GetLastRecord(Guid keycloakId)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
||||||
|
|
@ -213,12 +151,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
|
|
||||||
public async Task<List<ProcessUserTimeStamp>> GetTimeStampHistoryAsync(Guid keycloakId, int year, int page = 1, int pageSize = 10, string keyword = "")
|
public async Task<List<ProcessUserTimeStamp>> GetTimeStampHistoryAsync(Guid keycloakId, int year, int page = 1, int pageSize = 10, string keyword = "")
|
||||||
{
|
{
|
||||||
var fiscalDateStart = new DateTime(year - 1, 10, 1);
|
|
||||||
var fiscalDateEnd = new DateTime(year, 9, 30);
|
|
||||||
|
|
||||||
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
||||||
.Where(u => u.KeycloakUserId == keycloakId)
|
.Where(u => u.KeycloakUserId == keycloakId)
|
||||||
.Where(u => u.CheckIn.Date >= fiscalDateStart && u.CheckIn.Date <= fiscalDateEnd)
|
.Where(u => u.CheckIn.Year == year)
|
||||||
.OrderByDescending(u => u.CheckIn.Date)
|
.OrderByDescending(u => u.CheckIn.Date)
|
||||||
.Skip((page - 1) * pageSize)
|
.Skip((page - 1) * pageSize)
|
||||||
.Take(pageSize)
|
.Take(pageSize)
|
||||||
|
|
@ -227,19 +162,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<ProcessUserTimeStamp>> GetTimeStampHistoryAsync2(Guid keycloakId, int year)
|
|
||||||
{
|
|
||||||
var fiscalDateStart = new DateTime(year - 1, 10, 1);
|
|
||||||
var fiscalDateEnd = new DateTime(year, 9, 30);
|
|
||||||
|
|
||||||
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
|
||||||
.Where(u => u.KeycloakUserId == keycloakId)
|
|
||||||
.Where(u => u.CheckIn.Date >= fiscalDateStart && u.CheckIn.Date <= fiscalDateEnd)
|
|
||||||
.OrderByDescending(u => u.CheckIn.Date)
|
|
||||||
.ToListAsync();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> GetTimeStampHistoryForAdminCountAsync(DateTime startDate, DateTime endDate)
|
public async Task<int> GetTimeStampHistoryForAdminCountAsync(DateTime startDate, DateTime endDate)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
||||||
|
|
@ -272,55 +194,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<ProcessUserTimeStamp>> GetTimeStampHistoryForAdminRoleAsync(DateTime startDate, DateTime endDate, string role, string nodeId, int? node)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
|
||||||
.Where(u => u.CheckIn.Date >= startDate.Date && u.CheckIn.Date <= endDate.Date)
|
|
||||||
.OrderBy(u => u.CheckIn)
|
|
||||||
|
|
||||||
.ToListAsync();
|
|
||||||
if (role == "OWNER")
|
|
||||||
{
|
|
||||||
node = null;
|
|
||||||
}
|
|
||||||
if (role == "OWNER" || role == "CHILD")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true))))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "BROTHER")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "ROOT")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => x.RootDnaId == Guid.Parse(nodeId!))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
// else if (role == "PARENT")
|
|
||||||
// {
|
|
||||||
// data = data
|
|
||||||
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null)
|
|
||||||
// .ToList();
|
|
||||||
// }
|
|
||||||
else if (role == "NORMAL")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null :
|
|
||||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null :
|
|
||||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null :
|
|
||||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null :
|
|
||||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
|
|
||||||
true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<ProcessUserTimeStamp?> GetTimeStampById(Guid id)
|
public async Task<ProcessUserTimeStamp?> GetTimeStampById(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
var data = await _dbContext.Set<ProcessUserTimeStamp>()
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
@ -62,7 +62,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
{
|
{
|
||||||
var data = _dbContext.Set<UserDutyTime>()
|
var data = _dbContext.Set<UserDutyTime>()
|
||||||
.Where(u => !u.IsProcess)
|
.Where(u => !u.IsProcess)
|
||||||
.Where(u => u.EffectiveDate.Value.Date <= DateTime.Now.AddHours(7).Date)
|
.Where(u => u.EffectiveDate.Value.Date <= DateTime.Now.Date)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
foreach (var d in data)
|
foreach (var d in data)
|
||||||
|
|
@ -101,17 +101,13 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<UserDutyTime?> GetLastEffectRound(Guid profileId, DateTime? effectiveDate = null, CancellationToken cancellationToken = default)
|
public async Task<UserDutyTime?> GetLastEffectRound(Guid profileId)
|
||||||
{
|
{
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
effectiveDate ??= DateTime.Now;
|
|
||||||
var data = await _dbContext.Set<UserDutyTime>()
|
var data = await _dbContext.Set<UserDutyTime>()
|
||||||
.Where(x => x.ProfileId == profileId)
|
.Where(x => x.ProfileId == profileId)
|
||||||
.Where(x => x.EffectiveDate.Value.Date <= effectiveDate.Value.Date)
|
.Where(x => x.IsProcess)
|
||||||
.OrderByDescending(x => x.EffectiveDate)
|
.OrderByDescending(x => x.EffectiveDate)
|
||||||
.FirstOrDefaultAsync(combinedCts.Token);
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (UserId != null || UserId != "")
|
if (UserId != null || UserId != "")
|
||||||
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!), AccessToken);
|
return _userProfileRepository.GetUserOCId(Guid.Parse(UserId!));
|
||||||
else
|
else
|
||||||
return Guid.Empty;
|
return Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
@ -74,16 +74,12 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<UserTimeStamp?> GetLastRecord(Guid keycloakId, CancellationToken cancellationToken = default)
|
public async Task<UserTimeStamp?> GetLastRecord(Guid keycloakId)
|
||||||
{
|
{
|
||||||
// กำหนด timeout เป็น 30 นาที
|
|
||||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
|
||||||
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
|
||||||
|
|
||||||
var data = await _dbContext.Set<UserTimeStamp>()
|
var data = await _dbContext.Set<UserTimeStamp>()
|
||||||
.Where(u => u.KeycloakUserId == keycloakId)
|
.Where(u => u.KeycloakUserId == keycloakId)
|
||||||
.OrderByDescending(u => u.CheckIn)
|
.OrderByDescending(u => u.CheckIn)
|
||||||
.FirstOrDefaultAsync(combinedCts.Token);
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
@ -111,55 +107,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<UserTimeStamp>> GetTimeStampHistoryForAdminRoleAsync(DateTime startDate, DateTime endDate, string role, string nodeId, int? node)
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<UserTimeStamp>()
|
|
||||||
.Where(u => u.CheckIn.Date >= startDate.Date && u.CheckIn.Date <= endDate.Date)
|
|
||||||
.OrderBy(u => u.CheckIn)
|
|
||||||
|
|
||||||
.ToListAsync();
|
|
||||||
if (role == "OWNER")
|
|
||||||
{
|
|
||||||
node = null;
|
|
||||||
}
|
|
||||||
if (role == "OWNER" || role == "CHILD")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true))))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "BROTHER")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => node == 4 ? x.Child3DnaId == Guid.Parse(nodeId!) : (node == 3 ? x.Child2DnaId == Guid.Parse(nodeId!) : (node == 2 ? x.Child1DnaId == Guid.Parse(nodeId!) : (node == 1 || node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) : (node == null ? true : true)))))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else if (role == "ROOT")
|
|
||||||
{
|
|
||||||
data = data
|
|
||||||
.Where(x => x.RootDnaId == Guid.Parse(nodeId!))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
// else if (role == "PARENT")
|
|
||||||
// {
|
|
||||||
// data = data
|
|
||||||
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null)
|
|
||||||
// .ToList();
|
|
||||||
// }
|
|
||||||
else if (role == "NORMAL")
|
|
||||||
{
|
|
||||||
data = data.Where(x =>
|
|
||||||
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null :
|
|
||||||
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null :
|
|
||||||
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null :
|
|
||||||
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null :
|
|
||||||
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
|
|
||||||
true
|
|
||||||
).ToList();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<UserTimeStamp?> GetTimeStampById(Guid id)
|
public async Task<UserTimeStamp?> GetTimeStampById(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<UserTimeStamp>()
|
var data = await _dbContext.Set<UserTimeStamp>()
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,7 @@ using BMA.EHR.Domain.Models.Notifications;
|
||||||
using BMA.EHR.Domain.Shared;
|
using BMA.EHR.Domain.Shared;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.MessageQueue
|
namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
@ -19,61 +17,38 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
||||||
private readonly IApplicationDBContext _dbContext;
|
private readonly IApplicationDBContext _dbContext;
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Constructor and Destuctor "
|
#region " Constructor and Destuctor "
|
||||||
|
|
||||||
public InboxRepository(IApplicationDBContext dbContext,
|
public InboxRepository(IApplicationDBContext dbContext,
|
||||||
IHttpContextAccessor httpContextAccessor,
|
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
IConfiguration configuration) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
public async Task<dynamic> GetMyInboxAsync(int page = 1, int pageSize = 25)
|
public async Task<List<InboxResponse>> GetMyInboxAsync()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// var profile = await _dbContext.Set<Profile>()
|
var profile = await _dbContext.Set<Profile>()
|
||||||
// .FirstOrDefaultAsync(p => p.KeycloakId == Guid.Parse(UserId!));
|
.FirstOrDefaultAsync(p => p.KeycloakId == Guid.Parse(UserId!));
|
||||||
|
|
||||||
// if (profile == null)
|
if (profile == null)
|
||||||
// {
|
|
||||||
// return new List<InboxResponse>();
|
|
||||||
// // throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
// }
|
|
||||||
|
|
||||||
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
|
|
||||||
var profileId = "";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
{
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var org = JsonConvert.DeserializeObject<OrgRequest>(_result);
|
|
||||||
|
|
||||||
if (org == null || org.result == null)
|
|
||||||
return new List<InboxResponse>();
|
|
||||||
profileId = org.result.profileId == null ? "" : org.result.profileId;
|
|
||||||
}
|
|
||||||
if (profileId == null || profileId == "")
|
|
||||||
return new List<InboxResponse>();
|
return new List<InboxResponse>();
|
||||||
|
// throw new Exception(GlobalMessages.DataNotFound);
|
||||||
|
}
|
||||||
|
|
||||||
var data_search = await _dbContext.Set<Inbox>()
|
var data = await _dbContext.Set<Inbox>()
|
||||||
.Where(x => x.ReceiverUserId == Guid.Parse(profileId))
|
.Where(x => x.ReceiverUserId == profile.Id)
|
||||||
.Where(x => x.DeleteDate == null)
|
.Where(x => x.IsOpen == false)
|
||||||
.OrderByDescending(x => x.ReceiveDate)
|
.OrderByDescending(x => x.ReceiveDate)
|
||||||
.Select(x => new InboxResponse
|
.Select(x => new InboxResponse
|
||||||
{
|
{
|
||||||
|
|
@ -86,15 +61,10 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
OpenDate = x.OpenDate,
|
OpenDate = x.OpenDate,
|
||||||
Payload = x.Payload == "" ? null : JsonConvert.DeserializeObject<CommandPayload>(Regex.Unescape(x.Payload))
|
Payload = x.Payload == "" ? null : JsonConvert.DeserializeObject<CommandPayload>(Regex.Unescape(x.Payload))
|
||||||
})
|
})
|
||||||
|
.Take(20)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var data = data_search
|
return data;
|
||||||
.Skip((page - 1) * pageSize)
|
|
||||||
.Take(pageSize)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
var _data = new { data, total = data_search.Count(), totalNoti = data_search.Where(x => x.IsOpen == false).Count() };
|
|
||||||
return _data;
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
@ -111,7 +81,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
||||||
if (inbox != null)
|
if (inbox != null)
|
||||||
{
|
{
|
||||||
inbox.DeleteDate = DateTime.Now;
|
inbox.IsOpen = true;
|
||||||
// _dbContext.Set<Inbox>().Remove(inbox);
|
// _dbContext.Set<Inbox>().Remove(inbox);
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
@ -131,7 +101,6 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
||||||
if (inbox != null)
|
if (inbox != null)
|
||||||
{
|
{
|
||||||
inbox.IsOpen = true;
|
|
||||||
inbox.OpenDate = DateTime.Now;
|
inbox.OpenDate = DateTime.Now;
|
||||||
// _dbContext.Set<Inbox>().Remove(inbox);
|
// _dbContext.Set<Inbox>().Remove(inbox);
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,7 @@ using BMA.EHR.Domain.Models.Notifications;
|
||||||
using BMA.EHR.Domain.Shared;
|
using BMA.EHR.Domain.Shared;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.MessageQueue
|
namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
@ -21,7 +19,6 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
private readonly IApplicationDBContext _dbContext;
|
private readonly IApplicationDBContext _dbContext;
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly EmailSenderService _emailSenderService;
|
private readonly EmailSenderService _emailSenderService;
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
@ -29,137 +26,49 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
||||||
public NotificationRepository(IApplicationDBContext dbContext,
|
public NotificationRepository(IApplicationDBContext dbContext,
|
||||||
EmailSenderService emailSenderService,
|
EmailSenderService emailSenderService,
|
||||||
IHttpContextAccessor httpContextAccessor,
|
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
IConfiguration configuration) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_emailSenderService = emailSenderService;
|
_emailSenderService = emailSenderService;
|
||||||
_configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
public async Task<dynamic> GetMyNotificationAsync(int page = 1, int pageSize = 25)
|
public async Task<List<NotificationResponse>> GetMyNotificationAsync()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// var profile = await _dbContext.Set<Profile>()
|
var profile = await _dbContext.Set<Profile>()
|
||||||
// .FirstOrDefaultAsync(p => p.KeycloakId == Guid.Parse(UserId!));
|
.FirstOrDefaultAsync(p => p.KeycloakId == Guid.Parse(UserId!));
|
||||||
|
|
||||||
// if (profile == null)
|
if (profile == null)
|
||||||
// {
|
|
||||||
// return new List<NotificationResponse>();
|
|
||||||
// // throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
// }
|
|
||||||
|
|
||||||
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
|
|
||||||
var profileId = "";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
{
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
return new List<NotificationResponse>();
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
// throw new Exception(GlobalMessages.DataNotFound);
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var org = JsonConvert.DeserializeObject<OrgRequest>(_result);
|
|
||||||
|
|
||||||
if (org == null || org.result == null)
|
|
||||||
return new List<InboxResponse>();
|
|
||||||
profileId = org.result.profileId == null ? "" : org.result.profileId;
|
|
||||||
}
|
}
|
||||||
if (profileId == null || profileId == "")
|
|
||||||
return new List<InboxResponse>();
|
|
||||||
|
|
||||||
var data_search = await _dbContext.Set<Notification>()
|
var data = await _dbContext.Set<Notification>()
|
||||||
.Where(x => x.ReceiverUserId == Guid.Parse(profileId))
|
.Where(x => x.ReceiverUserId == profile.Id)
|
||||||
.Where(x => x.DeleteDate == null)
|
|
||||||
.OrderByDescending(x => x.ReceiveDate)
|
|
||||||
.ToListAsync();
|
|
||||||
var totalNoti = data_search.Where(x => x.IsOpen == false).Count();
|
|
||||||
var data = data_search
|
|
||||||
.Skip((page - 1) * pageSize)
|
|
||||||
.Take(pageSize)
|
|
||||||
.Select(x => new NotificationResponse
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
Body = x.Body,
|
|
||||||
ReceiverUserId = x.ReceiverUserId,
|
|
||||||
KeycloakUserId = x.KeycloakUserId,
|
|
||||||
IsOpen = x.IsOpen,
|
|
||||||
Type = x.Type,
|
|
||||||
ReceiveDate = x.ReceiveDate,
|
|
||||||
OpenDate = x.OpenDate,
|
|
||||||
Payload = x.Payload
|
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
var data_opens = await _dbContext.Set<Notification>()
|
|
||||||
.Where(x => x.ReceiverUserId == Guid.Parse(profileId))
|
|
||||||
.Where(x => x.DeleteDate == null)
|
|
||||||
.OrderByDescending(x => x.ReceiveDate)
|
|
||||||
.Skip((page - 1) * pageSize)
|
|
||||||
.Take(pageSize)
|
|
||||||
// .Where(x => x.IsOpen == false)
|
|
||||||
.ToListAsync();
|
|
||||||
foreach (var data_open in data_opens)
|
|
||||||
{
|
|
||||||
data_open.IsOpen = true;
|
|
||||||
data_open.OpenDate = DateTime.Now;
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
|
|
||||||
var _data = new { data, total = data_search.Count(), totalNoti = totalNoti };
|
|
||||||
return _data;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<dynamic> GetMyNotificationAsyncNoread()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// var profile = await _dbContext.Set<Profile>()
|
|
||||||
// .FirstOrDefaultAsync(p => p.KeycloakId == Guid.Parse(UserId!));
|
|
||||||
|
|
||||||
// if (profile == null)
|
|
||||||
// {
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
|
|
||||||
var profileId = "";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var org = JsonConvert.DeserializeObject<OrgRequest>(_result);
|
|
||||||
|
|
||||||
if (org == null || org.result == null)
|
|
||||||
return 0;
|
|
||||||
profileId = org.result.profileId == null ? "" : org.result.profileId;
|
|
||||||
}
|
|
||||||
if (profileId == null || profileId == "")
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
var data_search = await _dbContext.Set<Notification>()
|
|
||||||
.Where(x => x.ReceiverUserId == Guid.Parse(profileId))
|
|
||||||
.Where(x => x.DeleteDate == null)
|
|
||||||
.Where(x => x.IsOpen == false)
|
.Where(x => x.IsOpen == false)
|
||||||
.OrderByDescending(x => x.ReceiveDate)
|
.OrderByDescending(x => x.ReceiveDate)
|
||||||
|
.Select(x => new NotificationResponse
|
||||||
|
{
|
||||||
|
Id = x.Id,
|
||||||
|
Body = x.Body,
|
||||||
|
ReceiverUserId = x.ReceiverUserId,
|
||||||
|
IsOpen = x.IsOpen,
|
||||||
|
Type = x.Type,
|
||||||
|
ReceiveDate = x.ReceiveDate,
|
||||||
|
OpenDate = x.OpenDate,
|
||||||
|
Payload = x.Payload == "" ? null : JsonConvert.DeserializeObject<CommandPayload>(Regex.Unescape(x.Payload))
|
||||||
|
})
|
||||||
|
.Take(20)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
return data_search.Count();
|
return data;
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
@ -176,7 +85,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
|
|
||||||
if (notification != null)
|
if (notification != null)
|
||||||
{
|
{
|
||||||
notification.DeleteDate = DateTime.Now;
|
notification.IsOpen = true;
|
||||||
// _dbContext.Set<Notification>().Remove(notification);
|
// _dbContext.Set<Notification>().Remove(notification);
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
@ -187,191 +96,19 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<string> GetMyProfileIdAsync()
|
public async Task PushNotificationAsync(Guid ReceiverUserId, string Subject, string Body, string Payload = "", bool IsSendInbox = false, bool IsSendMail = false)
|
||||||
{
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
|
|
||||||
var response = await GetExternalAPIAsync(apiUrl, AccessToken!, _configuration["API_KEY"]!);
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(response))
|
|
||||||
return string.Empty;
|
|
||||||
|
|
||||||
var org = JsonConvert.DeserializeObject<OrgRequest>(response);
|
|
||||||
if (org == null || org.result == null)
|
|
||||||
return string.Empty;
|
|
||||||
|
|
||||||
return org.result.profileId ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> DeleteAllMyNotificationsAsync()
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var profileId = await GetMyProfileIdAsync();
|
var profile = await _dbContext.Set<Profile>().FirstOrDefaultAsync(x => x.Id == ReceiverUserId);
|
||||||
if (string.IsNullOrEmpty(profileId))
|
if (profile != null)
|
||||||
return 0;
|
|
||||||
|
|
||||||
var notifications = await _dbContext.Set<Notification>()
|
|
||||||
.Where(x => x.ReceiverUserId == Guid.Parse(profileId))
|
|
||||||
.Where(x => x.DeleteDate == null)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
_dbContext.Set<Notification>().RemoveRange(notifications);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
return notifications.Count;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task PushNotificationAsync(Guid ReceiverUserId, string Subject, string Body, string Payload = "", string NotiLink = "", bool IsSendInbox = false, bool IsSendMail = false)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// var profile = await _dbContext.Set<Profile>().FirstOrDefaultAsync(x => x.Id == ReceiverUserId);
|
|
||||||
//if (profile != null)
|
|
||||||
//{
|
|
||||||
_dbContext.Set<Notification>().Add(new Notification
|
|
||||||
{
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = ReceiverUserId,
|
|
||||||
Type = "",
|
|
||||||
Payload = NotiLink,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
if (IsSendInbox == true)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Inbox>().Add(new Inbox
|
|
||||||
{
|
|
||||||
Subject = Subject,
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = ReceiverUserId,
|
|
||||||
Payload = Payload,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (IsSendMail == true)
|
|
||||||
{
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/email/{ReceiverUserId}";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var org = JsonConvert.DeserializeObject<ResultRequest>(_result);
|
|
||||||
if (org != null && org.result != null && org.result != "")
|
|
||||||
_emailSenderService.SendMail(Subject, Body, org.result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public async Task PushNotificationAsync2(Guid ReceiverUserId, string Subject, string Body, string Payload = "", string NotiLink = "", bool IsSendInbox = false, bool IsSendMail = false)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_dbContext.Set<Notification>().Add(new Notification
|
|
||||||
{
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = ReceiverUserId,
|
|
||||||
Type = "",
|
|
||||||
Payload = NotiLink,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
/* if (IsSendInbox == true)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Inbox>().Add(new Inbox
|
|
||||||
{
|
|
||||||
Subject = Subject,
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = ReceiverUserId,
|
|
||||||
Payload = Payload,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
}*/
|
|
||||||
if (IsSendMail == true)
|
|
||||||
{
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/email/{ReceiverUserId}";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var org = JsonConvert.DeserializeObject<ResultRequest>(_result);
|
|
||||||
if (org != null && org.result != null && org.result != "")
|
|
||||||
_emailSenderService.SendMail(Subject, Body, org.result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task PushEmailAsync(string Subject, string Body, string Email = "")
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_emailSenderService.SendMail(Subject, Body, Email);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task PushNotificationsAsync(Guid[] ReceiverUserIds, string Subject, string Body, string Payload = "", string NotiLink = "", bool IsSendInbox = false, bool IsSendMail = false)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
foreach (var ReceiverUserId in ReceiverUserIds)
|
|
||||||
{
|
{
|
||||||
_dbContext.Set<Notification>().Add(new Notification
|
_dbContext.Set<Notification>().Add(new Notification
|
||||||
{
|
{
|
||||||
Body = Body,
|
Body = Body,
|
||||||
ReceiverUserId = ReceiverUserId,
|
ReceiverUserId = ReceiverUserId,
|
||||||
Type = "",
|
Type = "",
|
||||||
Payload = NotiLink,
|
Payload = Payload,
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
CreatedFullName = FullName ?? "System Administrator",
|
||||||
CreatedUserId = UserId ?? "",
|
CreatedUserId = UserId ?? "",
|
||||||
CreatedAt = DateTime.Now,
|
CreatedAt = DateTime.Now,
|
||||||
|
|
@ -397,227 +134,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
|
||||||
}
|
}
|
||||||
if (IsSendMail == true)
|
if (IsSendMail == true)
|
||||||
{
|
{
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/email/{ReceiverUserId}";
|
_emailSenderService.SendMail(Subject, Body, "kittapath@frappet.com");
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var org = JsonConvert.DeserializeObject<ResultRequest>(_result);
|
|
||||||
if (org != null && org.result != null && org.result != "")
|
|
||||||
_emailSenderService.SendMail(Subject, Body, org.result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NotisLinkRequest
|
|
||||||
{
|
|
||||||
public Guid ReceiverUserId { get; set; }
|
|
||||||
public string NotiLink { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ResultRequest
|
|
||||||
{
|
|
||||||
public string result { get; set; }
|
|
||||||
}
|
|
||||||
public async Task PushNotificationsLinkAsync(NotisLinkRequest[] ReceiverUserIds, string Subject, string Body, string Payload = "", bool IsSendInbox = false, bool IsSendMail = false)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
foreach (var ReceiverUserId in ReceiverUserIds)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Notification>().Add(new Notification
|
|
||||||
{
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = ReceiverUserId.ReceiverUserId,
|
|
||||||
Type = "",
|
|
||||||
Payload = ReceiverUserId.NotiLink,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
if (IsSendInbox == true)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Inbox>().Add(new Inbox
|
|
||||||
{
|
|
||||||
Subject = Subject,
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = ReceiverUserId.ReceiverUserId,
|
|
||||||
Payload = Payload,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (IsSendMail == true)
|
|
||||||
{
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/email/{ReceiverUserId.ReceiverUserId}";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var org = JsonConvert.DeserializeObject<ResultRequest>(_result);
|
|
||||||
if (org != null && org.result != null && org.result != "")
|
|
||||||
_emailSenderService.SendMail(Subject, Body, org.result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NotisLinkSendRequest
|
|
||||||
{
|
|
||||||
public Guid ReceiverUserId { get; set; }
|
|
||||||
public string NotiLink { get; set; }
|
|
||||||
public bool IsSendMail { get; set; }
|
|
||||||
public bool IsSendInbox { get; set; }
|
|
||||||
}
|
|
||||||
public async Task PushNotificationsLinkSendAsync(NotisLinkSendRequest[] ReceiverUserIds, string Subject, string Body, string Payload = "")
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
foreach (var data in ReceiverUserIds)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Notification>().Add(new Notification
|
|
||||||
{
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = data.ReceiverUserId,
|
|
||||||
Type = "",
|
|
||||||
Payload = data.NotiLink,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
if (data.IsSendInbox == true)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Inbox>().Add(new Inbox
|
|
||||||
{
|
|
||||||
Subject = Subject,
|
|
||||||
Body = Body,
|
|
||||||
ReceiverUserId = data.ReceiverUserId,
|
|
||||||
Payload = Payload,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (data.IsSendMail == true)
|
|
||||||
{
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/email/{data.ReceiverUserId}";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var org = JsonConvert.DeserializeObject<ResultRequest>(_result);
|
|
||||||
if (org != null && org.result != null && org.result != "")
|
|
||||||
_emailSenderService.SendMail(Subject, Body, org.result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public async Task PushNotificationAsyncV2(string? ReceiverUserId, string Subject, string Body, string Payload = "", bool IsSendInbox = false, bool IsSendMail = false)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (ReceiverUserId != null)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Notification>().Add(new Notification
|
|
||||||
{
|
|
||||||
Body = Body,
|
|
||||||
KeycloakUserId = ReceiverUserId,
|
|
||||||
Type = "",
|
|
||||||
Payload = Payload,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
if (IsSendInbox == true)
|
|
||||||
{
|
|
||||||
_dbContext.Set<Inbox>().Add(new Inbox
|
|
||||||
{
|
|
||||||
Subject = Subject,
|
|
||||||
Body = Body,
|
|
||||||
KeycloakUserId = ReceiverUserId,
|
|
||||||
Payload = Payload,
|
|
||||||
CreatedFullName = FullName ?? "System Administrator",
|
|
||||||
CreatedUserId = UserId ?? "",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
LastUpdateFullName = FullName ?? "System Administrator",
|
|
||||||
LastUpdateUserId = UserId ?? "",
|
|
||||||
LastUpdatedAt = DateTime.Now,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (IsSendMail == true)
|
|
||||||
{
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/email/{ReceiverUserId}";
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
if (_res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
var org = JsonConvert.DeserializeObject<ResultRequest>(_result);
|
|
||||||
if (org != null && org.result != null && org.result != "")
|
|
||||||
_emailSenderService.SendMail(Subject, Body, org.result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,61 +26,21 @@ namespace BMA.EHR.Application.Repositories.MetaData
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
public async Task<string> GetHolidayAsync(DateTime date, string category = "NORMAL")
|
public async Task<int> GetHolidayCountAsync(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<Holiday>().AsQueryable()
|
|
||||||
.Where(x => x.Category == category)
|
|
||||||
.Where(x => x.HolidayDate.Date == date.Date)
|
|
||||||
.Select(x => x.Name)
|
|
||||||
.FirstOrDefaultAsync();
|
|
||||||
return data ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<DateTime>> GetHolidayAsync(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<Holiday>().AsQueryable()
|
var data = await _dbContext.Set<Holiday>().AsQueryable()
|
||||||
.Where(x => x.Category == category)
|
.Where(x => x.Category == category)
|
||||||
.Where(x => x.HolidayDate.Date >= startDate && x.HolidayDate.Date <= endDate)
|
.Where(x => x.HolidayDate.Date >= startDate && x.HolidayDate.Date <= endDate)
|
||||||
.Select(x => x.HolidayDate.Date)
|
.CountAsync();
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> GetHolidayCountAsync(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
|
||||||
{
|
|
||||||
var query = _dbContext.Set<Holiday>().AsQueryable()
|
|
||||||
.Where(x => x.Category == category)
|
|
||||||
.Where(x => x.HolidayDate.Date >= startDate && x.HolidayDate.Date <= endDate);
|
|
||||||
|
|
||||||
if (category == "NORMAL")
|
|
||||||
query = query.Where(x => x.HolidayDate.DayOfWeek != DayOfWeek.Saturday && x.HolidayDate.DayOfWeek != DayOfWeek.Sunday);
|
|
||||||
else
|
|
||||||
query = query.Where(x => x.HolidayDate.DayOfWeek != DayOfWeek.Sunday);
|
|
||||||
|
|
||||||
return await query.CountAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<DateTime> GetWeekEnd(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
|
||||||
{
|
|
||||||
var dates = new List<DateTime>();
|
|
||||||
|
|
||||||
for (DateTime i = startDate; i <= endDate; i = i.AddDays(1))
|
|
||||||
{
|
|
||||||
dates.Add(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (category == "NORMAL")
|
|
||||||
return dates.Where(d => d.DayOfWeek == DayOfWeek.Saturday || d.DayOfWeek == DayOfWeek.Sunday).ToList();
|
|
||||||
else
|
|
||||||
return dates.Where(d => d.DayOfWeek == DayOfWeek.Sunday).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetWeekEndCount(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
public int GetWeekEndCount(DateTime startDate, DateTime endDate, string category = "NORMAL")
|
||||||
{
|
{
|
||||||
var dates = new List<DateTime>();
|
var dates = new List<DateTime>();
|
||||||
|
|
||||||
for (DateTime i = startDate; i <= endDate; i = i.AddDays(1))
|
for (DateTime i = startDate; i < endDate; i = i.AddDays(1))
|
||||||
{
|
{
|
||||||
dates.Add(i);
|
dates.Add(i);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using Amazon.S3;
|
using Amazon.S3;
|
||||||
using Amazon.S3.Model;
|
using Amazon.S3.Model;
|
||||||
using BMA.EHR.Domain.Shared;
|
using BMA.EHR.Domain.Shared;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
|
@ -37,9 +37,7 @@ namespace BMA.EHR.Application.Repositories
|
||||||
var config = new AmazonS3Config
|
var config = new AmazonS3Config
|
||||||
{
|
{
|
||||||
ServiceURL = _configuration["MinIO:Endpoint"],
|
ServiceURL = _configuration["MinIO:Endpoint"],
|
||||||
ForcePathStyle = true,
|
ForcePathStyle = true
|
||||||
SignatureVersion = "V4", // รองรับ MinIO
|
|
||||||
AuthenticationRegion = "th-middle-rack-1" // บาง MinIO ใช้ region "us-east-1" โดย default
|
|
||||||
};
|
};
|
||||||
|
|
||||||
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using Amazon.S3;
|
using Amazon.S3;
|
||||||
using Amazon.S3.Model;
|
using Amazon.S3.Model;
|
||||||
using BMA.EHR.Domain.Models.Documents;
|
using BMA.EHR.Domain.Models.Documents;
|
||||||
using BMA.EHR.Domain.Shared;
|
using BMA.EHR.Domain.Shared;
|
||||||
|
|
@ -40,9 +40,7 @@ namespace BMA.EHR.Application.Repositories
|
||||||
var config = new AmazonS3Config
|
var config = new AmazonS3Config
|
||||||
{
|
{
|
||||||
ServiceURL = _configuration["MinIO:Endpoint"],
|
ServiceURL = _configuration["MinIO:Endpoint"],
|
||||||
ForcePathStyle = true,
|
ForcePathStyle = true
|
||||||
SignatureVersion = "V4", // รองรับ MinIO
|
|
||||||
AuthenticationRegion = "th-middle-rack-1" // บาง MinIO ใช้ region "us-east-1" โดย default
|
|
||||||
};
|
};
|
||||||
|
|
||||||
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
||||||
|
|
|
||||||
|
|
@ -43,9 +43,7 @@ namespace BMA.EHR.Application.Repositories
|
||||||
var config = new AmazonS3Config
|
var config = new AmazonS3Config
|
||||||
{
|
{
|
||||||
ServiceURL = _configuration["MinIO:Endpoint"],
|
ServiceURL = _configuration["MinIO:Endpoint"],
|
||||||
ForcePathStyle = true,
|
ForcePathStyle = true
|
||||||
SignatureVersion = "V4", // รองรับ MinIO
|
|
||||||
AuthenticationRegion = "th-middle-rack-1" // บาง MinIO ใช้ region "us-east-1" โดย default
|
|
||||||
};
|
};
|
||||||
|
|
||||||
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using Amazon.S3;
|
using Amazon.S3;
|
||||||
using Amazon.S3.Model;
|
using Amazon.S3.Model;
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
using BMA.EHR.Application.Common.Interfaces;
|
||||||
using BMA.EHR.Domain.Models.Documents;
|
using BMA.EHR.Domain.Models.Documents;
|
||||||
|
|
@ -39,9 +39,7 @@ namespace BMA.EHR.Application.Repositories
|
||||||
var config = new AmazonS3Config
|
var config = new AmazonS3Config
|
||||||
{
|
{
|
||||||
ServiceURL = _configuration["MinIO:Endpoint"],
|
ServiceURL = _configuration["MinIO:Endpoint"],
|
||||||
ForcePathStyle = true,
|
ForcePathStyle = true
|
||||||
SignatureVersion = "V4", // รองรับ MinIO
|
|
||||||
AuthenticationRegion = "th-middle-rack-1" // บาง MinIO ใช้ region "us-east-1" โดย default
|
|
||||||
};
|
};
|
||||||
|
|
||||||
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
||||||
|
|
@ -155,40 +153,6 @@ namespace BMA.EHR.Application.Repositories
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<FormFile> GetImageToFormFileAsync(string refId)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using var memoryStream = new MemoryStream();
|
|
||||||
var request = new GetObjectRequest
|
|
||||||
{
|
|
||||||
BucketName = _bucketName,
|
|
||||||
Key = refId
|
|
||||||
};
|
|
||||||
|
|
||||||
using var response = await _s3Client.GetObjectAsync(request);
|
|
||||||
using var responseStream = response.ResponseStream;
|
|
||||||
|
|
||||||
await responseStream.CopyToAsync(memoryStream);
|
|
||||||
|
|
||||||
var finalBytes = memoryStream.ToArray();
|
|
||||||
|
|
||||||
var finalStream = new MemoryStream(finalBytes);
|
|
||||||
var fileName = Path.GetFileName(refId);
|
|
||||||
var contentType = response.Headers.ContentType ?? "image/jpeg";
|
|
||||||
|
|
||||||
return new FormFile(finalStream, 0, finalStream.Length, "file", fileName)
|
|
||||||
{
|
|
||||||
Headers = new HeaderDictionary(),
|
|
||||||
ContentType = contentType
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task DeleteFileAsync(Guid fileId)
|
public async Task DeleteFileAsync(Guid fileId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
||||||
|
|
@ -1,169 +0,0 @@
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
|
||||||
using BMA.EHR.Application.Responses;
|
|
||||||
using BMA.EHR.Domain.Models.MetaData;
|
|
||||||
using BMA.EHR.Domain.Models.Organizations;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Net.Http.Json;
|
|
||||||
using BMA.EHR.Application.Responses.Leaves;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories
|
|
||||||
{
|
|
||||||
public class PermissionRepository
|
|
||||||
{
|
|
||||||
#region " Fields "
|
|
||||||
|
|
||||||
private readonly IApplicationDBContext _dbContext;
|
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Constructor and Destuctor "
|
|
||||||
|
|
||||||
public PermissionRepository(IApplicationDBContext dbContext,
|
|
||||||
IHttpContextAccessor httpContextAccessor,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
_dbContext = dbContext;
|
|
||||||
_httpContextAccessor = httpContextAccessor;
|
|
||||||
_configuration = configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Properties "
|
|
||||||
|
|
||||||
//protected string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
|
||||||
|
|
||||||
//protected string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value;
|
|
||||||
|
|
||||||
//protected bool? IsPlacementAdmin => _httpContextAccessor?.HttpContext?.User?.IsInRole("placement1");
|
|
||||||
|
|
||||||
protected string? AccessToken => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"];
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region " Methods "
|
|
||||||
|
|
||||||
public async Task<dynamic> GetPermissionAPIAsync(string action, string system)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var apiPath = $"{_configuration["API"]}/org/permission/dotnet/{action}/{system}";
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization =
|
|
||||||
new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var req = await client.GetAsync(apiPath);
|
|
||||||
if (!req.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
throw new Exception("Error calling permission API");
|
|
||||||
}
|
|
||||||
var res = await req.Content.ReadAsStringAsync();
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<GetPermissionWithActingResultDto?> GetPermissionWithActingAPIAsync(string action, string system)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var apiPath = $"{_configuration["API"]}/org/permission/dotnet-acting/{action}/{system}";
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization =
|
|
||||||
new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var req = await client.GetAsync(apiPath);
|
|
||||||
if (!req.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
throw new Exception("Error calling permission API");
|
|
||||||
}
|
|
||||||
var apiResult = await req.Content.ReadAsStringAsync();
|
|
||||||
//return res;
|
|
||||||
|
|
||||||
if (apiResult != null)
|
|
||||||
{
|
|
||||||
var raw = JsonConvert.DeserializeObject<GetPermissionWithActingResultDto>(apiResult);
|
|
||||||
return raw;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<dynamic> GetPermissionOrgAPIAsync(string action, string system, string profileId)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var apiPath = $"{_configuration["API"]}/org/permission/dotnet-org/{action}/{system}/{profileId}";
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var req = await client.GetAsync(apiPath);
|
|
||||||
var res = await req.Content.ReadAsStringAsync();
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<dynamic> GetPermissionAPIWorkflowAsync(string refId, string sysName)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var apiPath = $"{_configuration["API"]}/org/workflow/keycloak/isofficer";
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
var res = await client.PostAsJsonAsync(apiPath, new
|
|
||||||
{
|
|
||||||
data = new
|
|
||||||
{
|
|
||||||
refId = refId,
|
|
||||||
sysName = sysName,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
var result = await res.Content.ReadAsStringAsync();
|
|
||||||
if (res.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,40 +2,24 @@
|
||||||
using BMA.EHR.Domain.Models.Placement;
|
using BMA.EHR.Domain.Models.Placement;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories
|
namespace BMA.EHR.Application.Repositories
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Response model จาก Org API (check-isLeave)
|
|
||||||
/// </summary>
|
|
||||||
public class OrgProfileResult
|
|
||||||
{
|
|
||||||
public string citizenId { get; set; } = "";
|
|
||||||
public string? profileId { get; set; }
|
|
||||||
public bool isLeave { get; set; }
|
|
||||||
public bool isActive { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PlacementRepository : GenericRepository<Guid, Placement>
|
public class PlacementRepository : GenericRepository<Guid, Placement>
|
||||||
{
|
{
|
||||||
#region " Fields "
|
#region " Fields "
|
||||||
|
|
||||||
private readonly IApplicationDBContext _dbContext;
|
private readonly IApplicationDBContext _dbContext;
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Constructor and Destructor "
|
#region " Constructor and Destructor "
|
||||||
|
|
||||||
public PlacementRepository(IApplicationDBContext dbContext, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) : base(dbContext, httpContextAccessor)
|
public PlacementRepository(IApplicationDBContext dbContext, IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -92,148 +76,6 @@ namespace BMA.EHR.Application.Repositories
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Job อัพเดทสถานะผู้สอบผ่านที่ลาออกไปแล้วแต่ยังไม่ส่งไปออกคำสั่ง
|
|
||||||
/// และอัพเดทบุคคลภายนอกที่เข้ามาอยู่ในระบบแล้ว
|
|
||||||
/// ทำงานทุกวันเวลา 05:00 น.
|
|
||||||
/// </summary>
|
|
||||||
public async Task UpdateStatusPlacementProfiles()
|
|
||||||
{
|
|
||||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === STARTED ===");
|
|
||||||
|
|
||||||
// 1. Query ทั้ง 2 กรณี: ทุกคนที่ยังไม่ DONE
|
|
||||||
var allCitizenIds = await _dbContext.Set<PlacementProfile>()
|
|
||||||
.Where(p => !string.IsNullOrEmpty(p.CitizenId)
|
|
||||||
&& p.PlacementStatus != "DONE"
|
|
||||||
// && p.CitizenId == "2536721883131"
|
|
||||||
)
|
|
||||||
.Select(p => new { p.CitizenId, p.IsOfficer })
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
if (!allCitizenIds.Any())
|
|
||||||
{
|
|
||||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] No profiles to process");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var officerCount = allCitizenIds.Count(x => x.IsOfficer == true);
|
|
||||||
var notOfficerCount = allCitizenIds.Count(x => x.IsOfficer == false);
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] พบข้าราชการ {officerCount} คน, บุคคลภายนอก {notOfficerCount} คน");
|
|
||||||
|
|
||||||
// 2. ส่ง citizenIds ทั้งหมดไป Org API ครั้งเดียว
|
|
||||||
var citizenIds = allCitizenIds.Select(x => x.CitizenId).Distinct().ToList();
|
|
||||||
var apiUrl = $"{_configuration["API"]}/org/dotnet/check-isLeave";
|
|
||||||
|
|
||||||
List<OrgProfileResult> orgResults = new();
|
|
||||||
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
|
|
||||||
var payload = new { citizenIds };
|
|
||||||
var jsonPayload = JsonConvert.SerializeObject(payload);
|
|
||||||
var content = new StringContent(jsonPayload, System.Text.Encoding.UTF8, "application/json");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var response = await client.PostAsync(apiUrl, content);
|
|
||||||
var result = await response.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var responseObj = JsonConvert.DeserializeAnonymousType(result, new
|
|
||||||
{
|
|
||||||
status = 0,
|
|
||||||
message = "",
|
|
||||||
result = new List<OrgProfileResult>()
|
|
||||||
});
|
|
||||||
|
|
||||||
orgResults = responseObj?.result ?? new();
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] Org API ตอบกลับ {orgResults.Count} รายการ");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] Call API failed: {ex.Message}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!orgResults.Any())
|
|
||||||
{
|
|
||||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] ไม่มีรายการต้องอัปเดต");
|
|
||||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === COMPLETED ===");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. แยกข้อมูลตามเงื่อนไข
|
|
||||||
var leaveCitizenIds = orgResults.Where(x => x.isLeave).Select(x => x.citizenId).ToList();
|
|
||||||
var inSystemProfiles = orgResults.Where(x => x.isActive && !x.isLeave && !string.IsNullOrEmpty(x.profileId)).ToList();
|
|
||||||
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] ลาออก {leaveCitizenIds.Count} รายการ, อยู่ที่ทะเบียนประวัติ {inSystemProfiles.Count} รายการ");
|
|
||||||
|
|
||||||
// 4. Split Batch Update (500 รายการ/batch)
|
|
||||||
var batchSize = 500;
|
|
||||||
var totalUpdated = 0;
|
|
||||||
|
|
||||||
// 4.1 Update คนลาออก → IsOfficer = false
|
|
||||||
if (leaveCitizenIds.Any())
|
|
||||||
{
|
|
||||||
var totalBatches = (int)Math.Ceiling((double)leaveCitizenIds.Count / batchSize);
|
|
||||||
for (int i = 0; i < totalBatches; i++)
|
|
||||||
{
|
|
||||||
var batch = leaveCitizenIds.Skip(i * batchSize).Take(batchSize).ToList();
|
|
||||||
|
|
||||||
var profilesToUpdate = await _dbContext.Set<PlacementProfile>()
|
|
||||||
.Where(p => !string.IsNullOrEmpty(p.CitizenId)
|
|
||||||
&& batch.Contains(p.CitizenId)
|
|
||||||
&& p.IsOfficer == true)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
foreach (var profile in profilesToUpdate)
|
|
||||||
{
|
|
||||||
profile.profileId = null;
|
|
||||||
profile.IsOfficer = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
totalUpdated += profilesToUpdate.Count;
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] [ลาออก] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4.2 Update คนที่อยู่ในทะเบียนประวัติ → profileId + IsOfficer = true
|
|
||||||
if (inSystemProfiles.Any())
|
|
||||||
{
|
|
||||||
var totalBatches = (int)Math.Ceiling((double)inSystemProfiles.Count / batchSize);
|
|
||||||
for (int i = 0; i < totalBatches; i++)
|
|
||||||
{
|
|
||||||
var batch = inSystemProfiles.Skip(i * batchSize).Take(batchSize).ToList();
|
|
||||||
var batchCitizenIds = batch.Select(x => x.citizenId).ToList();
|
|
||||||
|
|
||||||
var profilesToUpdate = await _dbContext.Set<PlacementProfile>()
|
|
||||||
.Where(p => !string.IsNullOrEmpty(p.CitizenId)
|
|
||||||
&& batchCitizenIds.Contains(p.CitizenId)
|
|
||||||
&& p.IsOfficer == false)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
foreach (var profile in profilesToUpdate)
|
|
||||||
{
|
|
||||||
var orgProfile = batch.FirstOrDefault(x => x.citizenId == profile.CitizenId);
|
|
||||||
if (orgProfile != null)
|
|
||||||
{
|
|
||||||
profile.profileId = orgProfile.profileId;
|
|
||||||
profile.IsOfficer = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
totalUpdated += profilesToUpdate.Count;
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] [เข้าระบบ] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] อัปเดตรวมทั้งหมด {totalUpdated} รายการ");
|
|
||||||
Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === COMPLETED ===");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ using BMA.EHR.Domain.Shared;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using static BMA.EHR.Domain.Extensions.DateTimeExtension;
|
using static BMA.EHR.Domain.Extensions.DateTimeExtension;
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Reports
|
namespace BMA.EHR.Application.Repositories.Reports
|
||||||
|
|
@ -83,128 +82,76 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
sb.Append(monthDiff == 0 ? "" : $"{monthDiff} เดือน ");
|
sb.Append(monthDiff == 0 ? "" : $"{monthDiff} เดือน ");
|
||||||
sb.Append(dayDiff == 0 ? "" : $"{dayDiff} วัน ");
|
sb.Append(dayDiff == 0 ? "" : $"{dayDiff} วัน ");
|
||||||
}
|
}
|
||||||
var candidate = await _dbExamContext.Set<Candidate>()
|
var data = await _dbExamContext.Set<Candidate>().AsQueryable()
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.Include(p => p.PeriodExam)
|
.Select(p => new
|
||||||
.Include(p => p.Educations)
|
{
|
||||||
.Include(p => p.PositionExam)
|
p.Id,
|
||||||
.Include(p => p.ProfileImg)
|
AvatarId = p.ProfileImg == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.ProfileImg.Id,
|
||||||
.FirstOrDefaultAsync();
|
ExamIdenNumber = p.ExamIdenNumber == null ? "-" : p.ExamIdenNumber,
|
||||||
|
PositionName = p.PositionExam == null ? "-" : p.PositionExam.PositionName,
|
||||||
|
PositionLevelName = p.PositionExam == null ? "-" : p.PositionExam.PositionLevelName,
|
||||||
|
PeriodExamName = p.PeriodExam == null ? "-" : p.PeriodExam.Name,
|
||||||
|
PeriodExamRound = p.PeriodExam == null ? "-" : p.PeriodExam.Round.ToString(),
|
||||||
|
PeriodExamYear = p.PeriodExam == null ? "-" : (p.PeriodExam.Year + 543).ToString(),
|
||||||
|
|
||||||
if (candidate == null)
|
FullName = $"{p.PrefixName}{p.FirstName} {p.LastName}",
|
||||||
|
Religion = p.ReligionName == null ? "-" : p.ReligionName,
|
||||||
|
Nationality = p.Nationality == null ? "-" : p.Nationality,
|
||||||
|
DateOfBirth = p.DateOfBirth == null ? "-" : p.DateOfBirth.Value.ToThaiFullDate2(),
|
||||||
|
Age = p.DateOfBirth == null ? "-" : p.DateOfBirth.Value.CalculateAgeStrV2(0, 0),
|
||||||
|
CitizenId = p.CitizenId == null ? "-" : p.CitizenId,
|
||||||
|
|
||||||
|
EducationLevelExamName = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationLevelExamName,
|
||||||
|
EducationName = p.Educations.FirstOrDefault() == null ? null : (p.Educations.FirstOrDefault().EducationLevelExamName == "ปริญญาตรี" || p.Educations.FirstOrDefault().EducationLevelExamName == "ปริญญาโท" || p.Educations.FirstOrDefault().EducationLevelExamName == "ปริญญาเอก" ? p.Educations.FirstOrDefault().EducationName : null),
|
||||||
|
EducationMajor = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationMajor,
|
||||||
|
EducationLocation = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationLocation,
|
||||||
|
EducationEndDate = p.Educations.FirstOrDefault() == null || p.Educations.FirstOrDefault().EducationEndDate == null ? "-" : p.Educations.FirstOrDefault().EducationEndDate.Value.ToThaiFullDate2(),
|
||||||
|
EducationScores = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationScores,
|
||||||
|
EducationType = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationType,
|
||||||
|
EducationLevelHighName = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationLevelHighName,
|
||||||
|
|
||||||
|
OccupationPositionType = p.OccupationPositionType == "other" ? "ผู้ปฏิบัติงานอื่นในกรุงเทพมหานคร" : (p.OccupationPositionType == "temp" ? "ลูกจ้างชั่วคราว" : (p.OccupationPositionType == "prem" ? "ลูกจ้างประจำ" : "-")),
|
||||||
|
OccupationPosition = p.OccupationPosition == null ? "-" : p.OccupationPosition,
|
||||||
|
OccupationSalary = p.OccupationSalary == null ? "-" : p.OccupationSalary.ToString(),
|
||||||
|
OccupationGroup = p.OccupationGroup == null ? "-" : p.OccupationGroup,
|
||||||
|
OccupationPile = p.OccupationPile == null ? "-" : p.OccupationPile,
|
||||||
|
OccupationOrg = p.OccupationOrg == null ? "-" : p.OccupationOrg,
|
||||||
|
OccupationTelephone = p.OccupationTelephone == null ? "-" : p.OccupationTelephone,
|
||||||
|
|
||||||
|
CareersTotal = sb.ToString(),
|
||||||
|
// Careers = p.Careers.Select(y => new
|
||||||
|
// {
|
||||||
|
// Position = y.Position,
|
||||||
|
// Type = y.Type,
|
||||||
|
// DurationStart = y.DurationStart.ToThaiShortDate2(),
|
||||||
|
// DurationEnd = y.DurationEnd.ToThaiShortDate2(),
|
||||||
|
// RangeDate = y.RangeDate,
|
||||||
|
// }).ToList(),
|
||||||
|
|
||||||
|
RegistAddress = p.RegistAddress == null ? "-" : p.RegistAddress,
|
||||||
|
RegistProvinceName = p.RegistProvinceName == null ? "-" : p.RegistProvinceName,
|
||||||
|
RegistDistrictName = p.RegistDistrictName == null ? "-" : p.RegistDistrictName,
|
||||||
|
RegistSubDistrictName = p.RegistSubDistrictName == null ? "-" : p.RegistSubDistrictName,
|
||||||
|
RegistZipCode = p.RegistZipCode == null ? "-" : p.RegistZipCode,
|
||||||
|
CurrentAddress = p.CurrentAddress == null ? (p.RegistAddress == null ? "-" : p.RegistAddress) : p.CurrentAddress,
|
||||||
|
CurrentProvinceName = p.CurrentProvinceName == null ? (p.RegistProvinceName == null ? "-" : p.RegistProvinceName) : p.CurrentProvinceName,
|
||||||
|
CurrentDistrictName = p.CurrentDistrictName == null ? (p.RegistDistrictName == null ? "-" : p.RegistDistrictName) : p.CurrentDistrictName,
|
||||||
|
CurrentSubDistrictName = p.CurrentSubDistrictName == null ? (p.RegistSubDistrictName == null ? "-" : p.RegistSubDistrictName) : p.CurrentSubDistrictName,
|
||||||
|
CurrentZipCode = p.CurrentZipCode == null ? (p.RegistZipCode == null ? "-" : p.RegistZipCode) : p.CurrentZipCode,
|
||||||
|
Telephone = p.Telephone == null ? "-" : p.Telephone,
|
||||||
|
Email = p.Email == null ? "-" : p.Email,
|
||||||
|
|
||||||
|
ContactFullName = $"{p.ContactPrefixName}{p.ContactFirstname} {p.ContactLastname}",
|
||||||
|
ContactRelations = p.ContactRelations == null ? "-" : p.ContactRelations,
|
||||||
|
ContactTel = p.ContactTel == null ? "-" : p.ContactTel,
|
||||||
|
|
||||||
|
RegisterDate = p.RegisterDate == null ? "-" : p.RegisterDate.Value.ToThaiFullDate(),
|
||||||
|
})
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
if (data == null)
|
||||||
throw new Exception(GlobalMessages.CandidateNotFound);
|
throw new Exception(GlobalMessages.CandidateNotFound);
|
||||||
|
return data;
|
||||||
List<string> editorConfirmLists;
|
|
||||||
|
|
||||||
var textOnly = string.IsNullOrEmpty(candidate.PeriodExam?.EditorConfirm)
|
|
||||||
? null
|
|
||||||
: Regex.Replace(
|
|
||||||
candidate.PeriodExam.EditorConfirm,
|
|
||||||
"<[^>]+>",
|
|
||||||
string.Empty
|
|
||||||
)
|
|
||||||
.Replace(" ", " ")
|
|
||||||
.Trim();
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(textOnly))
|
|
||||||
{
|
|
||||||
// ลบข้อความทั้งหมดก่อน "1." เพื่อให้เริ่มต้นที่ข้อแรกเสมอ
|
|
||||||
var cleanedText = Regex.Replace(textOnly, @"^.*?1\.", "1.").Trim();
|
|
||||||
|
|
||||||
// ถ้าข้อ 3 จบด้วย "มาตรา 1374." แล้วเลข 4. ติดกับประโยค ให้แทรกขึ้นบรรทัดใหม่เป็นข้อ 4.
|
|
||||||
if (!cleanedText.Contains("\n4.") && Regex.IsMatch(cleanedText, @"1374\.\s*"))
|
|
||||||
{
|
|
||||||
cleanedText = Regex.Replace(cleanedText, @"1374\.\s*", "137\n4. ");
|
|
||||||
}
|
|
||||||
|
|
||||||
// แยกข้อความเป็นแต่ละข้อ โดย split เมื่อเจอ pattern "ตัวเลข. "
|
|
||||||
// ใช้ lookahead (?=...) เพื่อไม่กินตัวเลขทิ้ง และให้ตัวเลขยังอยู่ในผลลัพธ์
|
|
||||||
editorConfirmLists = Regex.Split(cleanedText, @"(?=\d+\. )")
|
|
||||||
.Where(s => !string.IsNullOrWhiteSpace(s))
|
|
||||||
.Select(s => s.Replace("\n", "").Replace("\r", "").Trim())
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
editorConfirmLists = new List<string> { "-" };
|
|
||||||
}
|
|
||||||
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
candidate.Id,
|
|
||||||
AvatarId = candidate.ProfileImg?.Id ?? Guid.Empty,
|
|
||||||
ExamIdenNumber = candidate.ExamIdenNumber ?? "-",
|
|
||||||
PositionName = candidate.PositionExam?.PositionName ?? "-",
|
|
||||||
PositionLevelName = candidate.PositionExam?.PositionLevelName ?? "-",
|
|
||||||
PeriodExamName = candidate.PeriodExam?.Name ?? "-",
|
|
||||||
PeriodExamRound = candidate.PeriodExam?.Round.ToString() ?? "-",
|
|
||||||
PeriodExamYear = candidate.PeriodExam != null ? (candidate.PeriodExam.Year + 543).ToString() : "-",
|
|
||||||
FullName = $"{candidate.PrefixName}{candidate.FirstName} {candidate.LastName}",
|
|
||||||
Religion = candidate.ReligionName ?? "-",
|
|
||||||
Nationality = candidate.Nationality ?? "-",
|
|
||||||
DateOfBirth = candidate.DateOfBirth?.ToThaiFullDate2() ?? "-",
|
|
||||||
Age = candidate.DateOfBirth?.CalculateAgeStrV2(0, 0) ?? "-",
|
|
||||||
CitizenId = candidate.CitizenId ?? "-",
|
|
||||||
|
|
||||||
EducationLevelExamName = candidate.Educations.FirstOrDefault()?.EducationLevelExamName ?? "-",
|
|
||||||
EducationName = (candidate.Educations.FirstOrDefault()?.EducationLevelExamName is "ปริญญาตรี" or "ปริญญาโท" or "ปริญญาเอก")
|
|
||||||
? candidate.Educations.FirstOrDefault()?.EducationName
|
|
||||||
: null,
|
|
||||||
EducationMajor = candidate.Educations.FirstOrDefault()?.EducationMajor ?? "-",
|
|
||||||
EducationLocation = candidate.Educations.FirstOrDefault()?.EducationLocation ?? "-",
|
|
||||||
EducationEndDate = candidate.Educations.FirstOrDefault()?.EducationEndDate?.ToThaiFullDate2() ?? "-",
|
|
||||||
EducationScores = candidate.Educations.FirstOrDefault()?.EducationScores ?? "-",
|
|
||||||
EducationType = candidate.Educations.FirstOrDefault()?.EducationType ?? "-",
|
|
||||||
EducationLevelHighName = candidate.Educations.FirstOrDefault()?.EducationLevelHighName ?? "-",
|
|
||||||
|
|
||||||
OccupationPositionType = candidate.OccupationPositionType == "other" ? "ผู้ปฏิบัติงานอื่นในกรุงเทพมหานคร" :
|
|
||||||
candidate.OccupationPositionType == "temp" ? "ลูกจ้างชั่วคราว" :
|
|
||||||
candidate.OccupationPositionType == "prem" ? "ลูกจ้างประจำ" : "-",
|
|
||||||
OccupationPosition = candidate.OccupationPosition ?? "-",
|
|
||||||
OccupationSalary = candidate.OccupationSalary.HasValue
|
|
||||||
? (candidate.OccupationSalary.Value % 1 == 0
|
|
||||||
? candidate.OccupationSalary.Value.ToString("N0")
|
|
||||||
: candidate.OccupationSalary.Value.ToString("N2"))
|
|
||||||
: "-",
|
|
||||||
OccupationGroup = candidate.OccupationGroup ?? "-",
|
|
||||||
OccupationPile = candidate.OccupationPile ?? "-",
|
|
||||||
OccupationOrg = candidate.OccupationOrg ?? "-",
|
|
||||||
OccupationTelephone = candidate.OccupationTelephone ?? "-",
|
|
||||||
|
|
||||||
CareersTotal = sb.ToString(),
|
|
||||||
|
|
||||||
RegistAddress = candidate.RegistAddress ?? "-",
|
|
||||||
RegistProvinceName = candidate.RegistProvinceName ?? "-",
|
|
||||||
RegistDistrictName = candidate.RegistDistrictName ?? "-",
|
|
||||||
RegistSubDistrictName = candidate.RegistSubDistrictName ?? "-",
|
|
||||||
RegistZipCode = candidate.RegistZipCode ?? "-",
|
|
||||||
CurrentAddress = candidate.CurrentAddress ?? candidate.RegistAddress ?? "-",
|
|
||||||
CurrentProvinceName = candidate.CurrentProvinceName ?? candidate.RegistProvinceName ?? "-",
|
|
||||||
CurrentDistrictName = candidate.CurrentDistrictName ?? candidate.RegistDistrictName ?? "-",
|
|
||||||
CurrentSubDistrictName = candidate.CurrentSubDistrictName ?? candidate.RegistSubDistrictName ?? "-",
|
|
||||||
CurrentZipCode = candidate.CurrentZipCode ?? candidate.RegistZipCode ?? "-",
|
|
||||||
Telephone = candidate.Telephone ?? "-",
|
|
||||||
Email = candidate.Email ?? "-",
|
|
||||||
|
|
||||||
ContactFullName = $"{candidate.ContactPrefixName}{candidate.ContactFirstname} {candidate.ContactLastname}",
|
|
||||||
ContactRelations = candidate.ContactRelations ?? "-",
|
|
||||||
ContactTel = candidate.ContactTel ?? "-",
|
|
||||||
|
|
||||||
RegisterDate = candidate.RegisterDate?.ToThaiFullDate() ?? "-",
|
|
||||||
|
|
||||||
IsBachelors = candidate.PositionExam != null && !string.IsNullOrEmpty(candidate.PositionExam.PositionLevelName) && candidate.PositionExam.PositionLevelName.Trim() == "ปฏิบัติการ"
|
|
||||||
? new List<object>
|
|
||||||
{
|
|
||||||
new { label = "ชื่อปริญญา", value = candidate.Educations.FirstOrDefault()?.EducationName ?? "-" },
|
|
||||||
new { label = "สาขาวิชา/วิชาเอก", value = candidate.Educations.FirstOrDefault()?.EducationMajor ?? "-" }
|
|
||||||
}
|
|
||||||
: new List<object>
|
|
||||||
{
|
|
||||||
new { label = "สาขาวิชา/วิชาเอก", value = candidate.Educations.FirstOrDefault()?.EducationMajor ?? "-" }
|
|
||||||
},
|
|
||||||
|
|
||||||
EditorConfirms = editorConfirmLists
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public async Task<dynamic> GetExamCareerCandidateAsync(Guid id)
|
public async Task<dynamic> GetExamCareerCandidateAsync(Guid id)
|
||||||
{
|
{
|
||||||
|
|
@ -232,7 +179,7 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
DurationStart = item.DurationStart,
|
DurationStart = item.DurationStart,
|
||||||
DurationEnd = item.DurationEnd,
|
DurationEnd = item.DurationEnd,
|
||||||
RangeDate = item.RangeDate,
|
RangeDate = item.RangeDate,
|
||||||
Index = retVal.ToString(),
|
Index = retVal,
|
||||||
};
|
};
|
||||||
data.Add(_data);
|
data.Add(_data);
|
||||||
retVal++;
|
retVal++;
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,5 +1,4 @@
|
||||||
using System.Net.Http.Headers;
|
using System.Reflection.Metadata;
|
||||||
using System.Reflection.Metadata;
|
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
using BMA.EHR.Application.Common.Interfaces;
|
||||||
using BMA.EHR.Application.Responses;
|
using BMA.EHR.Application.Responses;
|
||||||
using BMA.EHR.Domain.Extensions;
|
using BMA.EHR.Domain.Extensions;
|
||||||
|
|
@ -10,7 +9,6 @@ using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Reports
|
namespace BMA.EHR.Application.Repositories.Reports
|
||||||
|
|
@ -23,23 +21,20 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
private readonly IWebHostEnvironment _hostingEnvironment;
|
private readonly IWebHostEnvironment _hostingEnvironment;
|
||||||
private readonly MinIOService _documentService;
|
private readonly MinIOService _documentService;
|
||||||
private readonly OrganizationCommonRepository _organizationCommonRepository;
|
private readonly OrganizationCommonRepository _organizationCommonRepository;
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region " Constructor and Destructor "
|
#region " Constructor and Destructor "
|
||||||
|
|
||||||
public RetireReportRepository(IApplicationDBContext dbContext,
|
public RetireReportRepository(IApplicationDBContext dbContext,
|
||||||
MinIOService documentService,
|
MinIOService documentService,
|
||||||
OrganizationCommonRepository organizationCommonRepository,
|
OrganizationCommonRepository organizationCommonRepository,
|
||||||
IWebHostEnvironment hostEnvironment,
|
IWebHostEnvironment hostEnvironment)
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_hostingEnvironment = hostEnvironment;
|
_hostingEnvironment = hostEnvironment;
|
||||||
_organizationCommonRepository = organizationCommonRepository;
|
_organizationCommonRepository = organizationCommonRepository;
|
||||||
_documentService = documentService;
|
_documentService = documentService;
|
||||||
_configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -69,43 +64,12 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#region รายงานประกาศเกษียณ
|
#region รายงานประกาศเกษียณ
|
||||||
public async Task<dynamic> GetProfileRetirementdAsync(Guid retireId, string token)
|
public async Task<dynamic> GetProfileRetirementdAsync(Guid retireId)
|
||||||
{
|
{
|
||||||
var retire = await _dbContext.Set<RetirementPeriod>()
|
var retire = await _dbContext.Set<RetirementPeriod>()
|
||||||
.Include(x => x.RetirementProfiles)
|
.Include(x => x.RetirementProfiles)
|
||||||
.FirstOrDefaultAsync(x => x.Id == retireId);
|
.FirstOrDefaultAsync(x => x.Id == retireId);
|
||||||
// var retires = new List<dynamic>();
|
var retires = new List<dynamic>();
|
||||||
var apiUrl = $"{_configuration["API"]}/org/root/search/sort";
|
|
||||||
dynamic rootOrder = new List<string>();
|
|
||||||
dynamic child1Order = new List<string>();
|
|
||||||
dynamic child2Order = new List<string>();
|
|
||||||
dynamic child3Order = new List<string>();
|
|
||||||
dynamic child4Order = new List<string>();
|
|
||||||
dynamic posTypeNameOrder = new List<string>();
|
|
||||||
dynamic posLevelNameOrder = new List<string>();
|
|
||||||
dynamic hospital = new List<string>();
|
|
||||||
using (var client = new HttpClient())
|
|
||||||
{
|
|
||||||
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
|
|
||||||
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]);
|
|
||||||
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
|
|
||||||
var _res = await client.SendAsync(_req);
|
|
||||||
var _result = await _res.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
var org = JsonConvert.DeserializeObject<dynamic>(_result);
|
|
||||||
|
|
||||||
if (org != null && org.result != null)
|
|
||||||
{
|
|
||||||
rootOrder = org.result.root;
|
|
||||||
child1Order = org.result.child1;
|
|
||||||
child2Order = org.result.child2;
|
|
||||||
child3Order = org.result.child3;
|
|
||||||
child4Order = org.result.child4;
|
|
||||||
posTypeNameOrder = org.result.posTypeNameOrder;
|
|
||||||
posLevelNameOrder = org.result.posLevelNameOrder;
|
|
||||||
hospital = org.result.hospital;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (retire == null)
|
if (retire == null)
|
||||||
{
|
{
|
||||||
var retireHistorys = await _dbContext.Set<RetirementPeriodHistory>().AsQueryable()
|
var retireHistorys = await _dbContext.Set<RetirementPeriodHistory>().AsQueryable()
|
||||||
|
|
@ -156,49 +120,12 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
{
|
{
|
||||||
profiles = profiles.OrderBy(x => x.order).ToList();
|
profiles = profiles.OrderBy(x => x.order).ToList();
|
||||||
}
|
}
|
||||||
var mapProfiles = new List<ProfileRetireJsonRequest>();
|
return new { retireHistorys.Detail, retireHistorys.Id, retireHistorys.CreatedAt, Year = retireHistorys.Year.ToThaiYear().ToString().ToThaiNumber(), retireHistorys.Round, retireHistorys.Type, retireHistorys.TypeReport, Total = retireHistorys.Total.ToString().ToThaiNumber(), profile = profiles };
|
||||||
// string previousRoot = null;
|
|
||||||
// string previousPosTypeName = null;
|
|
||||||
// string previousPosLevelName = null;
|
|
||||||
if (profiles.Count > 0)
|
|
||||||
{
|
|
||||||
mapProfiles = profiles
|
|
||||||
// .OrderBy(x => rootOrder.ToObject<List<string>>().IndexOf(x.root))
|
|
||||||
// .ThenBy(x => posTypeNameOrder.ToObject<List<string>>().IndexOf(x.posTypeName ?? ""))
|
|
||||||
// .ThenBy(x => posLevelNameOrder.ToObject<List<string>>().IndexOf(x.posLevelName ?? ""))
|
|
||||||
.Select((profile, index) =>
|
|
||||||
{
|
|
||||||
// bool isDuplicateRoot = profile.root == previousRoot;
|
|
||||||
// previousRoot = profile.root;
|
|
||||||
// bool isDuplicatePosType = profile.posTypeName == previousPosTypeName;
|
|
||||||
// previousPosTypeName = profile.posTypeName;
|
|
||||||
// bool isDuplicatePosLevel = profile.posLevelName == previousPosLevelName;
|
|
||||||
// previousPosLevelName = profile.posLevelName;
|
|
||||||
return new ProfileRetireJsonRequest
|
|
||||||
{
|
|
||||||
order = retireHistorys.TypeReport == null ? (index + 1).ToString().ToThaiNumber() : $"{(index + 1).ToString().ToThaiNumber()}. ลำดับที่ {(profile.order).ToString().ToThaiNumber()}",
|
|
||||||
fullName = $"{profile.prefix}{profile.firstName} {profile.lastName}",
|
|
||||||
root = "",
|
|
||||||
child = (profile.posExecutiveName == null ? "" : profile.posExecutiveName + "\n") +
|
|
||||||
(profile.child4 == null ? "" : profile.child4 + "\n") +
|
|
||||||
(profile.child3 == null ? "" : profile.child3 + "\n") +
|
|
||||||
(profile.child2 == null ? "" : profile.child2 + "\n") +
|
|
||||||
(profile.child1 == null ? "" : profile.child1 + "\n") +
|
|
||||||
(profile.reason == null ? "" : profile.reason),
|
|
||||||
position = profile.position != "" && profile.position != null ? profile.position : "-",
|
|
||||||
posNo = profile.posNo != "" && profile.posNo != null ? profile.posNo?.ToThaiNumber() : "-",
|
|
||||||
reason = profile.reason != "" && profile.reason != null ? profile.reason : "-",
|
|
||||||
};
|
|
||||||
}).ToList();
|
|
||||||
}
|
|
||||||
string SignDate = retireHistorys.SignDate != null ? DateTime.Parse(retireHistorys.SignDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "-";
|
|
||||||
return new { SignDate, Detail = retireHistorys.Detail.ToThaiNumber(), retireHistorys.Id, retireHistorys.CreatedAt, Year = retireHistorys.Year.ToThaiYear().ToString().ToThaiNumber(), retireHistorys.Round, retireHistorys.Type, retireHistorys.TypeReport, Total = retireHistorys.Total.ToString().ToThaiNumber(), profiles = mapProfiles };
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var profile_retire = await _dbContext.Set<RetirementProfile>()
|
var profile_retire = await _dbContext.Set<RetirementProfile>()
|
||||||
.Include(x => x.RetirementPeriod)
|
|
||||||
.Where(x => x.RetirementPeriod == retire && (retire.TypeReport == null || retire.TypeReport == x.Remove))
|
.Where(x => x.RetirementPeriod == retire && (retire.TypeReport == null || retire.TypeReport == x.Remove))
|
||||||
.OrderBy(x => x.Order)
|
.OrderBy(x => x.Order)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
|
|
@ -207,126 +134,49 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
id = x.Id,
|
id = x.Id,
|
||||||
reason = x.Reason,
|
reason = x.Reason,
|
||||||
remove = x.Remove,
|
remove = x.Remove,
|
||||||
profileId = x.profileId,
|
profileId = x.Profile.Id,
|
||||||
prefix = x.prefix,
|
citizenId = x.Profile.CitizenId,
|
||||||
firstName = x.firstName,
|
prefix = x.Profile.Prefix == null ? "" : x.Profile.Prefix.Name,
|
||||||
lastName = x.lastName,
|
fullName = $"{(x.Profile.Prefix == null ? null : x.Profile.Prefix.Name)}{x.Profile.FirstName} {x.Profile.LastName}",
|
||||||
citizenId = x.citizenId,
|
organizationOrganization = x.Profile.OrganizationOrganization,
|
||||||
root = x.root,
|
ocId = x.Profile.OcId,
|
||||||
rootId = x.rootId,
|
position = x.Profile.Position == null ? "-" : x.Profile.Position.Name,
|
||||||
rootShortName = x.rootShortName,
|
positionType = x.Profile.PositionType == null ? "-" : x.Profile.PositionType.Name,
|
||||||
child1 = x.child1,
|
positionExecutive = x.Profile.PositionExecutive,
|
||||||
child1Id = x.child1Id,
|
posNo = x.Profile.PosNo == null ? "-" : x.Profile.PosNo.Name,
|
||||||
child1ShortName = x.child1ShortName,
|
positionEmployeePosition = x.Profile.PositionEmployeePosition == null ? "-" : x.Profile.PositionEmployeePosition.Name,
|
||||||
child2 = x.child2,
|
positionEmployeeLevel = x.Profile.PositionEmployeeLevel == null ? "-" : x.Profile.PositionEmployeeLevel.Name,
|
||||||
child2Id = x.child2Id,
|
positionEmployeeGroup = x.Profile.PositionEmployeeGroup == null ? "-" : x.Profile.PositionEmployeeGroup.Name,
|
||||||
child2ShortName = x.child2ShortName,
|
posNoEmployee = x.Profile.PosNoEmployee,
|
||||||
child3 = x.child3,
|
|
||||||
child3Id = x.child3Id,
|
|
||||||
child3ShortName = x.child3ShortName,
|
|
||||||
child4 = x.child4,
|
|
||||||
child4Id = x.child4Id,
|
|
||||||
child4ShortName = x.child4ShortName,
|
|
||||||
posMasterNo = x.posMasterNo,
|
|
||||||
position = x.position,
|
|
||||||
posTypeId = x.posTypeId,
|
|
||||||
posTypeName = x.posTypeName,
|
|
||||||
posTypeRank = x.posTypeRank,
|
|
||||||
posLevelId = x.posLevelId,
|
|
||||||
posLevelName = x.posLevelName,
|
|
||||||
posLevelRank = x.posLevelRank,
|
|
||||||
posExecutiveId = x.posExecutiveId,
|
|
||||||
posExecutiveName = x.posExecutiveName,
|
|
||||||
posNo = x.posNo,
|
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
// foreach (var r in profile_retire)
|
foreach (var r in profile_retire)
|
||||||
// {
|
|
||||||
// var data = new ProfileJsonRequest
|
|
||||||
// {
|
|
||||||
// order = r.order,
|
|
||||||
// id = r.id,
|
|
||||||
// reason = r.reason,
|
|
||||||
// remove = r.remove,
|
|
||||||
// profileId = r.profileId,
|
|
||||||
// citizenId = r.citizenId,
|
|
||||||
// prefix = r.prefix,
|
|
||||||
// fullName = r.fullName,
|
|
||||||
// organizationOrganization = r.organizationOrganization,
|
|
||||||
// oc = r.ocId == null ? null : _organizationCommonRepository.GetOrganizationNameFullPath(r.ocId.Value),
|
|
||||||
// position = r.position,
|
|
||||||
// positionType = r.positionType,
|
|
||||||
// positionExecutive = r.positionExecutive,
|
|
||||||
// posNo = r.posNo,
|
|
||||||
// positionEmployeePosition = r.positionEmployeePosition,
|
|
||||||
// positionEmployeeLevel = r.positionEmployeeLevel,
|
|
||||||
// positionEmployeeGroup = r.positionEmployeeGroup,
|
|
||||||
// posNoEmployee = r.posNoEmployee,
|
|
||||||
// };
|
|
||||||
// retires.Add(data);
|
|
||||||
// }
|
|
||||||
var mapProfiles = new List<ProfileRetireJsonRequest>();
|
|
||||||
string previousRoot = null;
|
|
||||||
string previousChild1 = null;
|
|
||||||
string previousPosTypeName = null;
|
|
||||||
string previousPosLevelName = null;
|
|
||||||
if (profile_retire.Count > 0)
|
|
||||||
{
|
{
|
||||||
if (retire.TypeReport == null)
|
var data = new ProfileJsonRequest
|
||||||
{
|
{
|
||||||
profile_retire = profile_retire
|
order = r.order,
|
||||||
.OrderBy(x => string.IsNullOrEmpty(x.root) ? int.MaxValue : rootOrder.ToObject<List<string>>().IndexOf(x.root))
|
id = r.id,
|
||||||
.ThenBy(x => child1Order.ToObject<List<string>>().IndexOf(x.child1 ?? ""))
|
reason = r.reason,
|
||||||
.ThenBy(x => child2Order.ToObject<List<string>>().IndexOf(x.child2 ?? ""))
|
remove = r.remove,
|
||||||
.ThenBy(x => child3Order.ToObject<List<string>>().IndexOf(x.child3 ?? ""))
|
profileId = r.profileId,
|
||||||
.ThenBy(x => child4Order.ToObject<List<string>>().IndexOf(x.child4 ?? ""))
|
citizenId = r.citizenId,
|
||||||
.ThenBy(x => posTypeNameOrder.ToObject<List<string>>().IndexOf(x.posTypeName ?? ""))
|
prefix = r.prefix,
|
||||||
.ThenBy(x => posLevelNameOrder.ToObject<List<string>>().IndexOf(x.posLevelName ?? ""))
|
fullName = r.fullName,
|
||||||
.ThenBy(x => x.posNo).ToList();
|
organizationOrganization = r.organizationOrganization,
|
||||||
}
|
oc = r.ocId == null ? null : _organizationCommonRepository.GetOrganizationNameFullPath(r.ocId.Value),
|
||||||
mapProfiles = profile_retire.Select((profile, index) =>
|
position = r.position,
|
||||||
{
|
positionType = r.positionType,
|
||||||
bool isDuplicateRoot = profile.root == previousRoot;
|
positionExecutive = r.positionExecutive,
|
||||||
previousRoot = profile.root;
|
posNo = r.posNo,
|
||||||
if (isDuplicateRoot == false)
|
positionEmployeePosition = r.positionEmployeePosition,
|
||||||
{
|
positionEmployeeLevel = r.positionEmployeeLevel,
|
||||||
previousChild1 = null;
|
positionEmployeeGroup = r.positionEmployeeGroup,
|
||||||
previousPosTypeName = null;
|
posNoEmployee = r.posNoEmployee,
|
||||||
previousPosLevelName = null;
|
};
|
||||||
}
|
retires.Add(data);
|
||||||
bool isDuplicateHospital = profile.child1 == previousChild1;
|
|
||||||
previousChild1 = profile.child1;
|
|
||||||
if (isDuplicateHospital == false)
|
|
||||||
{
|
|
||||||
previousPosTypeName = null;
|
|
||||||
previousPosLevelName = null;
|
|
||||||
}
|
|
||||||
bool isDuplicatePosType = profile.posTypeName == previousPosTypeName;
|
|
||||||
previousPosTypeName = profile.posTypeName;
|
|
||||||
bool isDuplicatePosLevel = profile.posLevelName == previousPosLevelName;
|
|
||||||
previousPosLevelName = profile.posLevelName;
|
|
||||||
return new ProfileRetireJsonRequest
|
|
||||||
{
|
|
||||||
order = retire.TypeReport == null ? (index + 1).ToString().ToThaiNumber() : $"{(index + 1).ToString().ToThaiNumber()}. ลำดับที่ {(profile.order).ToString().ToThaiNumber()}",
|
|
||||||
fullName = $"{profile.prefix}{profile.firstName} {profile.lastName}",
|
|
||||||
root = (isDuplicateRoot ? "" : profile.root + "\n") +
|
|
||||||
(isDuplicateHospital || !hospital.ToObject<List<string>>().Contains(profile.child1) ? "" : profile.child1 + "\n") +
|
|
||||||
(isDuplicatePosType ? "" : $"ตำแหน่งประเภท{profile.posTypeName}" + "\n") +
|
|
||||||
(isDuplicatePosLevel ? "" : $"ระดับ{profile.posLevelName}").ToThaiNumber(),
|
|
||||||
child = (profile.posExecutiveName == null ? "" : profile.posExecutiveName + "\n") +
|
|
||||||
(profile.child4 == null ? "" : profile.child4 + "\n") +
|
|
||||||
(profile.child3 == null ? "" : profile.child3 + "\n") +
|
|
||||||
(profile.child2 == null ? "" : profile.child2 + "\n") +
|
|
||||||
(profile.child1 == null || hospital.ToObject<List<string>>().Contains(profile.child1) ? "" : profile.child1 + "\n") +
|
|
||||||
(profile.reason == null ? "" : profile.reason),
|
|
||||||
position = profile.position != "" && profile.position != null ? profile.position : "-",
|
|
||||||
posNo = profile.posNo != "" && profile.posNo != null ? profile.posNo?.ToThaiNumber() : "-",
|
|
||||||
reason = profile.reason != "" && profile.reason != null ? profile.reason : "-",
|
|
||||||
};
|
|
||||||
}).ToList();
|
|
||||||
}
|
}
|
||||||
string SignDate = retire.SignDate != null ? DateTime.Parse(retire.SignDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "-";
|
|
||||||
return new { SignDate, Detail = retire.Detail.ToThaiNumber(), retire.Id, retire.CreatedAt, Year = retire.Year.ToThaiYear().ToString().ToThaiNumber(), retire.Round, retire.Type, retire.TypeReport, Total = profile_retire.Count.ToString().ToThaiNumber(), profiles = mapProfiles };
|
return new { retire.Detail, retire.Id, retire.CreatedAt, Year = retire.Year.ToThaiYear().ToString().ToThaiNumber(), retire.Round, retire.Type, retire.TypeReport, Total = profile_retire.Count.ToString().ToThaiNumber(), profile = retires };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -339,24 +189,23 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
.Select(p => new
|
.Select(p => new
|
||||||
{
|
{
|
||||||
p.Id,
|
p.Id,
|
||||||
p.prefix,
|
ProfileId = p.Profile.Id,
|
||||||
p.profileId,
|
Prefix = p.Profile.Prefix == null ? null : p.Profile.Prefix.Name,
|
||||||
p.firstName,
|
PrefixId = p.Profile.Prefix == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.Prefix.Id,
|
||||||
p.lastName,
|
p.Profile.FirstName,
|
||||||
p.root,
|
p.Profile.LastName,
|
||||||
p.rootShortName,
|
Position = p.Profile.Position == null ? null : p.Profile.Position.Name,
|
||||||
p.child1,
|
PositionId = p.Profile.Position == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.Position.Id,
|
||||||
p.child1ShortName,
|
PositionType = p.Profile.PositionType == null ? null : p.Profile.PositionType.Name,
|
||||||
p.child2,
|
PositionTypeId = p.Profile.PositionType == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.PositionType.Id,
|
||||||
p.child2ShortName,
|
p.Profile.PositionLine,
|
||||||
p.child3,
|
p.Profile.PositionLineId,
|
||||||
p.child3ShortName,
|
PositionLevel = p.Profile.PositionLevel == null ? null : p.Profile.PositionLevel.Name,
|
||||||
p.child4,
|
PositionLevelId = p.Profile.PositionLevel == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.PositionLevel.Id,
|
||||||
p.child4ShortName,
|
p.Profile.PositionExecutive,
|
||||||
p.posMasterNo,
|
p.Profile.PositionExecutiveId,
|
||||||
p.posLevelName,
|
Organization = p.Profile.Oc,
|
||||||
p.posTypeName,
|
OrganizationId = p.Profile.OcId,
|
||||||
p.position,
|
|
||||||
p.Number,
|
p.Number,
|
||||||
p.Date,
|
p.Date,
|
||||||
p.Location,
|
p.Location,
|
||||||
|
|
@ -367,38 +216,32 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
if (data == null)
|
if (data == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// string Prefix = string.IsNullOrEmpty(data.Prefix.ToString()) ? string.Empty : data.Prefix.ToString();
|
string Prefix = string.IsNullOrEmpty(data.Prefix.ToString()) ? string.Empty : data.Prefix.ToString();
|
||||||
// string FirstName = string.IsNullOrEmpty(data.FirstName.ToString()) ? string.Empty : data.FirstName.ToString();
|
string FirstName = string.IsNullOrEmpty(data.FirstName.ToString()) ? string.Empty : data.FirstName.ToString();
|
||||||
// string LastName = string.IsNullOrEmpty(data.LastName.ToString()) ? string.Empty : data.LastName.ToString();
|
string LastName = string.IsNullOrEmpty(data.LastName.ToString()) ? string.Empty : data.LastName.ToString();
|
||||||
// string FullName = $"{Prefix} {FirstName} {LastName}";
|
string FullName = $"{Prefix} {FirstName} {LastName}";
|
||||||
string Date = string.IsNullOrEmpty(data.Date.ToString()) ? "-" : DateTime.Parse(data.Date.ToString()).ToThaiFullDate().ToString().ToThaiNumber();
|
string Date = string.IsNullOrEmpty(data.Date.ToString()) ? "วันที่ - เดือน - พ.ศ. -" : DateTime.Parse(data.Date.ToString()).ToThaiFullDate().ToString().ToThaiNumber();
|
||||||
string CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate().ToString().ToThaiNumber();
|
string CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate().ToString().ToThaiNumber();
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
FullName = $"{data.prefix} {data.firstName} {data.lastName}",
|
FullName,
|
||||||
Date,
|
Date,
|
||||||
CurrentDate,
|
CurrentDate,
|
||||||
data.profileId,
|
data.Position,
|
||||||
data.prefix,
|
data.PositionExecutive,
|
||||||
data.firstName,
|
data.PositionType,
|
||||||
data.lastName,
|
data.PositionLine,
|
||||||
data.root,
|
data.PositionLevel,
|
||||||
data.rootShortName,
|
data.Organization,
|
||||||
data.child1,
|
data.PositionId,
|
||||||
data.child1ShortName,
|
data.PositionExecutiveId,
|
||||||
data.child2,
|
data.PositionTypeId,
|
||||||
data.child2ShortName,
|
data.PositionLineId,
|
||||||
data.child3,
|
data.PositionLevelId,
|
||||||
data.child3ShortName,
|
data.OrganizationId,
|
||||||
data.child4,
|
data.Number,
|
||||||
data.child4ShortName,
|
data.Location,
|
||||||
data.posMasterNo,
|
|
||||||
data.posLevelName,
|
|
||||||
data.posTypeName,
|
|
||||||
Number = data.Number != null ? data.Number.ToThaiNumber() : "-",
|
|
||||||
Location = data.Location != null ? data.Location.ToThaiNumber() : "-",
|
|
||||||
data.Reason,
|
data.Reason,
|
||||||
Position = data.position,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -407,7 +250,7 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetHeadRetirementDeceasedAsync(Guid id)
|
public async Task<dynamic> GetHeadRetirementDeceasedAsync(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<RetirementDeceased>().AsQueryable()
|
var data = await _dbContext.Set<RetirementDeceased>().AsQueryable()
|
||||||
// .Include(x => x.Profile)
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
var oc = "";
|
var oc = "";
|
||||||
|
|
@ -421,34 +264,34 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
Send = "หัวหน้าสำนักงาน ก.ก.",
|
Send = "หัวหน้าสำนักงาน ก.ก.",
|
||||||
};
|
};
|
||||||
|
|
||||||
// if (data.Profile.OcId != null)
|
if (data.Profile.OcId != null)
|
||||||
// {
|
{
|
||||||
// var organization = await _dbContext.Set<OrganizationEntity>().AsQueryable()
|
var organization = await _dbContext.Set<OrganizationEntity>().AsQueryable()
|
||||||
// .Where(x => x.Id == data.Profile.OcId)
|
.Where(x => x.Id == data.Profile.OcId)
|
||||||
// .FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
// if (organization != null)
|
if (organization != null)
|
||||||
// {
|
{
|
||||||
// var organizationAgency = await _dbContext.Set<OrganizationEntity>().AsQueryable()
|
var organizationAgency = await _dbContext.Set<OrganizationEntity>().AsQueryable()
|
||||||
// .Where(x => x.Id == organization.OrganizationAgencyId)
|
.Where(x => x.Id == organization.OrganizationAgencyId)
|
||||||
// .FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
// if (organizationAgency != null)
|
if (organizationAgency != null)
|
||||||
// {
|
{
|
||||||
// var agency = await _dbContext.Set<OrganizationEntity>().AsQueryable()
|
var agency = await _dbContext.Set<OrganizationEntity>().AsQueryable()
|
||||||
// .Where(x => x.Id == organizationAgency.Id)
|
.Where(x => x.Id == organizationAgency.Id)
|
||||||
// .FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
// if (agency != null)
|
if (agency != null)
|
||||||
// {
|
{
|
||||||
// oc = agency.OrganizationOrganization?.Name;
|
oc = agency.OrganizationOrganization?.Name;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
Oc = oc,
|
Oc = oc,
|
||||||
Number = $"กท /{(data.CreatedAt.Year.ToThaiYear()).ToString().ToThaiNumber()}",
|
Number = $"กท /{data.CreatedAt.Year.ToThaiYear()}",
|
||||||
Date = data.CreatedAt.ToThaiFullDate2().ToString().ToThaiNumber(),
|
Date = data.CreatedAt.ToThaiFullDate().ToString().ToThaiNumber(),
|
||||||
Subject = "ข้าราชการถึงแก่กรรม",
|
Subject = "ข้าราชการถึงแก่กรรม",
|
||||||
Send = "หัวหน้าสำนักงาน ก.ก.",
|
Send = "หัวหน้าสำนักงาน ก.ก.",
|
||||||
};
|
};
|
||||||
|
|
@ -459,7 +302,7 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task UploadFileRetirementDeceasedAsync(Guid id, Domain.Models.Documents.Document file)
|
public async Task UploadFileRetirementDeceasedAsync(Guid id, Domain.Models.Documents.Document file)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<RetirementDeceased>().AsQueryable()
|
var data = await _dbContext.Set<RetirementDeceased>().AsQueryable()
|
||||||
// .Include(x => x.Profile)
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
if (data != null)
|
if (data != null)
|
||||||
|
|
@ -476,16 +319,15 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
.Select(p => new
|
.Select(p => new
|
||||||
{
|
{
|
||||||
p.Id,
|
p.Id,
|
||||||
p.prefix,
|
Prefix = p.Profile.Prefix == null ? null : p.Profile.Prefix.Name,
|
||||||
p.firstName,
|
PrefixId = p.Profile.Prefix == null ? Guid.Parse("00000000-0000-0000-0000-000000000000") : p.Profile.Prefix.Id,
|
||||||
p.lastName,
|
p.Profile.FirstName,
|
||||||
p.profileId,
|
p.Profile.LastName,
|
||||||
|
ProfileId = p.Profile.Id,
|
||||||
p.Location,
|
p.Location,
|
||||||
p.SendDate,
|
p.SendDate,
|
||||||
p.ActiveDate,
|
p.ActiveDate,
|
||||||
p.Reason,
|
p.Reason,
|
||||||
p.ReasonResign,
|
|
||||||
p.Remark,
|
|
||||||
p.Status,
|
p.Status,
|
||||||
salary = p.AmountOld,
|
salary = p.AmountOld,
|
||||||
p.ApproveReason,
|
p.ApproveReason,
|
||||||
|
|
@ -505,183 +347,23 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
p.CommanderRejectReason,
|
p.CommanderRejectReason,
|
||||||
p.CommanderRejectDate,
|
p.CommanderRejectDate,
|
||||||
p.RemarkHorizontal,
|
p.RemarkHorizontal,
|
||||||
Type = "OFFICER"
|
|
||||||
})
|
|
||||||
.FirstOrDefaultAsync();
|
|
||||||
if (data == null)
|
|
||||||
data = await _dbContext.Set<RetirementResignEmployee>().AsQueryable()
|
|
||||||
.Where(x => x.Id == id)
|
|
||||||
.Select(p => new
|
|
||||||
{
|
|
||||||
p.Id,
|
|
||||||
p.prefix,
|
|
||||||
p.firstName,
|
|
||||||
p.lastName,
|
|
||||||
p.profileId,
|
|
||||||
p.Location,
|
|
||||||
p.SendDate,
|
|
||||||
p.ActiveDate,
|
|
||||||
p.Reason,
|
|
||||||
p.ReasonResign,
|
|
||||||
p.Remark,
|
|
||||||
p.Status,
|
|
||||||
salary = p.AmountOld,
|
|
||||||
p.ApproveReason,
|
|
||||||
p.RejectReason,
|
|
||||||
p.IsActive,
|
|
||||||
p.CreatedAt,
|
|
||||||
p.PositionTypeOld,
|
|
||||||
p.PositionLevelOld,
|
|
||||||
p.PositionNumberOld,
|
|
||||||
p.OrganizationPositionOld,
|
|
||||||
p.OligarchReject,
|
|
||||||
p.OligarchApproveReason,
|
|
||||||
p.OligarchRejectReason,
|
|
||||||
p.OligarchRejectDate,
|
|
||||||
p.CommanderReject,
|
|
||||||
p.CommanderApproveReason,
|
|
||||||
p.CommanderRejectReason,
|
|
||||||
p.CommanderRejectDate,
|
|
||||||
p.RemarkHorizontal,
|
|
||||||
Type = "EMPLOYEE",
|
|
||||||
})
|
})
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
if (data == null)
|
if (data == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var approverPositionExecutiveName = "...............";
|
|
||||||
var approverStatus = "☐ อนุญาต";
|
|
||||||
var approverRejectStatus = "☐ ยับยั้งการลาออกไว้จนถึงวันที่...................";
|
|
||||||
var approver = "...................";
|
|
||||||
var approverPosition = "...................";
|
|
||||||
|
|
||||||
var diffDate = "☐ ไม่น้อยกว่า ๓๐ วัน ☐ น้อยกว่า ๓๐ วัน";
|
|
||||||
if (data.SendDate.HasValue && data.ActiveDate.HasValue)
|
|
||||||
{
|
|
||||||
var time = data.ActiveDate.Value - data.SendDate.Value;
|
|
||||||
var day = time.TotalDays;
|
|
||||||
if (day < 30)
|
|
||||||
{
|
|
||||||
diffDate = "☐ ไม่น้อยกว่า ๓๐ วัน ☑ น้อยกว่า ๓๐ วัน";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
diffDate = "☑ ไม่น้อยกว่า ๓๐ วัน ☐ น้อยกว่า ๓๐ วัน";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var commanderDateUpdate = "วันที่...................";
|
|
||||||
var commanderStatus = "☐ อนุญาต ตั้งแต่วันที่...................";
|
|
||||||
var commanderCommentApprove = "...................";
|
|
||||||
var commanderRejectStatus = "☐ ยับยั้งการลาออกไว้จนถึงวันที่...................";
|
|
||||||
var commanderCommentReject = "...................";
|
|
||||||
var commander = "...................";
|
|
||||||
var commanderPosition = "...................";
|
|
||||||
|
|
||||||
if (data.Type == "OFFICER")
|
|
||||||
{
|
|
||||||
var Approver = _dbContext.Set<RetirementResignApprover>()
|
|
||||||
.Where(x => x.RetirementResign.Id == data.Id && x.ApproveType == "APPROVER")
|
|
||||||
.ToList();
|
|
||||||
var Commander = _dbContext.Set<RetirementResignApprover>()
|
|
||||||
.Where(x => x.RetirementResign.Id == data.Id && x.ApproveType == "COMMANDER")
|
|
||||||
.OrderByDescending(x => x.Seq)
|
|
||||||
.ToList();
|
|
||||||
if (Approver.Count > 0)
|
|
||||||
{
|
|
||||||
approverPositionExecutiveName = Approver[0].PositionExecutiveName;
|
|
||||||
approverStatus = Approver[0].ApproveStatus == "APPROVE" ? "☑ อนุญาต" : approverStatus;
|
|
||||||
approverRejectStatus = Approver[0].ApproveStatus == "REJECT"
|
|
||||||
? $"☑ ยับยั้งการลาออกไว้จนถึง{(Approver[0].RejectDate != null ? DateTime.Parse(Approver[0].RejectDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "วันที่...................")}"
|
|
||||||
: approverRejectStatus;
|
|
||||||
approver = $"{Approver[0].Prefix}{Approver[0].FirstName} {Approver[0].LastName}";
|
|
||||||
approverPosition = Approver[0].PositionName;
|
|
||||||
}
|
|
||||||
if (Commander.Count > 0)
|
|
||||||
{
|
|
||||||
commanderDateUpdate = Commander.Count > 1
|
|
||||||
? Commander[1].LastUpdatedAt != null
|
|
||||||
? DateTime.Parse(Commander[1].LastUpdatedAt.ToString()).ToThaiFullDate().ToString().ToThaiNumber()
|
|
||||||
: commanderDateUpdate
|
|
||||||
: Commander[0].LastUpdatedAt != null
|
|
||||||
? DateTime.Parse(Commander[0].LastUpdatedAt.ToString()).ToThaiFullDate().ToString().ToThaiNumber()
|
|
||||||
: commanderDateUpdate;
|
|
||||||
commanderStatus = Commander[0].ApproveStatus == "APPROVE"
|
|
||||||
? $"☑ อนุญาต ตั้งแต่{(Commander[0].LastUpdatedAt != null ? DateTime.Parse(Commander[0].LastUpdatedAt.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "วันที่...................")}"
|
|
||||||
: commanderStatus;
|
|
||||||
commanderCommentApprove = Commander[0].ApproveStatus == "APPROVE"
|
|
||||||
? !string.IsNullOrWhiteSpace(Commander[0].Comment) ? Commander[0].Comment : commanderCommentApprove
|
|
||||||
: commanderCommentApprove;
|
|
||||||
commanderRejectStatus = Commander[0].ApproveStatus == "REJECT"
|
|
||||||
? $"☑ ยับยั้งการลาออกไว้จนถึง{(Commander[0].RejectDate != null ? DateTime.Parse(Commander[0].RejectDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "วันที่...................")}"
|
|
||||||
: approverRejectStatus;
|
|
||||||
commanderCommentReject = Commander[0].ApproveStatus == "REJECT"
|
|
||||||
? !string.IsNullOrWhiteSpace(Commander[0].Comment) ? Commander[0].Comment : commanderCommentReject
|
|
||||||
: commanderCommentReject;
|
|
||||||
commander = $"{Commander[0].Prefix}{Commander[0].FirstName} {Commander[0].LastName}";
|
|
||||||
commanderPosition = Commander[0].PositionName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var EmpApproves = _dbContext.Set<RetirementResignEmployeeApprover>()
|
|
||||||
.Where(x => x.RetirementResignEmployee.Id == data.Id && x.ApproveType == "APPROVER")
|
|
||||||
.ToList();
|
|
||||||
var EmpCommander = _dbContext.Set<RetirementResignEmployeeApprover>()
|
|
||||||
.Where(x => x.RetirementResignEmployee.Id == data.Id && x.ApproveType == "COMMANDER")
|
|
||||||
.OrderByDescending(x => x.Seq)
|
|
||||||
.ToList();
|
|
||||||
if (EmpApproves.Count > 0)
|
|
||||||
{
|
|
||||||
approverPositionExecutiveName = EmpApproves[0].PositionExecutiveName;
|
|
||||||
approverStatus = EmpApproves[0].ApproveStatus == "APPROVE" ? "☑ อนุญาต" : approverStatus;
|
|
||||||
approverRejectStatus = EmpApproves[0].ApproveStatus == "REJECT"
|
|
||||||
? $"☑ ยับยั้งการลาออกไว้จนถึง{(EmpApproves[0].RejectDate != null ? DateTime.Parse(EmpApproves[0].RejectDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "วันที่...................")}"
|
|
||||||
: approverRejectStatus;
|
|
||||||
approver = $"{EmpApproves[0].Prefix}{EmpApproves[0].FirstName} {EmpApproves[0].LastName}";
|
|
||||||
approverPosition = EmpApproves[0].PositionName;
|
|
||||||
}
|
|
||||||
if (EmpCommander.Count > 0)
|
|
||||||
{
|
|
||||||
commanderDateUpdate = EmpCommander.Count > 1
|
|
||||||
? EmpCommander[1].LastUpdatedAt != null
|
|
||||||
? DateTime.Parse(EmpCommander[1].LastUpdatedAt.ToString()).ToThaiFullDate().ToString().ToThaiNumber()
|
|
||||||
: commanderDateUpdate
|
|
||||||
: EmpCommander[0].LastUpdatedAt != null
|
|
||||||
? DateTime.Parse(EmpCommander[0].LastUpdatedAt.ToString()).ToThaiFullDate().ToString().ToThaiNumber()
|
|
||||||
: commanderDateUpdate;
|
|
||||||
commanderStatus = EmpCommander[0].ApproveStatus == "APPROVE"
|
|
||||||
? $"☑ อนุญาต ตั้งแต่{(EmpCommander[0].LastUpdatedAt != null ? DateTime.Parse(EmpCommander[0].LastUpdatedAt.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "วันที่...................")}"
|
|
||||||
: commanderStatus;
|
|
||||||
commanderCommentApprove = EmpCommander[0].ApproveStatus == "APPROVE"
|
|
||||||
? !string.IsNullOrWhiteSpace(EmpCommander[0].Comment) ? EmpCommander[0].Comment : commanderCommentApprove
|
|
||||||
: commanderCommentApprove;
|
|
||||||
commanderRejectStatus = EmpCommander[0].ApproveStatus == "REJECT"
|
|
||||||
? $"☑ ยับยั้งการลาออกไว้จนถึง{(EmpCommander[0].RejectDate != null ? DateTime.Parse(EmpCommander[0].RejectDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "วันที่...................")}"
|
|
||||||
: approverRejectStatus;
|
|
||||||
commanderCommentReject = EmpCommander[0].ApproveStatus == "REJECT"
|
|
||||||
? !string.IsNullOrWhiteSpace(EmpCommander[0].Comment) ? EmpCommander[0].Comment : commanderCommentReject
|
|
||||||
: commanderCommentReject;
|
|
||||||
commander = $"{EmpCommander[0].Prefix}{EmpCommander[0].FirstName} {EmpCommander[0].LastName}";
|
|
||||||
commanderPosition = EmpCommander[0].PositionName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var _data = new
|
var _data = new
|
||||||
{
|
{
|
||||||
data.Id,
|
data.Id,
|
||||||
data.profileId,
|
data.ProfileId,
|
||||||
data.prefix,
|
data.Prefix,
|
||||||
data.firstName,
|
data.FirstName,
|
||||||
data.lastName,
|
data.LastName,
|
||||||
Location = string.IsNullOrEmpty(data.Location) ? string.Empty : data.Location.ToThaiNumber(),
|
data.Location,
|
||||||
FullName = $"{data.prefix}{data.firstName} {data.lastName}",
|
FullName = $"{data.Prefix}{data.FirstName} {data.LastName}",
|
||||||
SendDate = string.IsNullOrEmpty(data.SendDate.ToString()) ? string.Empty : DateTime.Parse(data.SendDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber(),
|
SendDate = string.IsNullOrEmpty(data.SendDate.ToString())? string.Empty : DateTime.Parse(data.SendDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber(),
|
||||||
ActiveDate = string.IsNullOrEmpty(data.ActiveDate.ToString()) ? string.Empty : DateTime.Parse(data.ActiveDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber(),
|
ActiveDate = string.IsNullOrEmpty(data.ActiveDate.ToString())? string.Empty : DateTime.Parse(data.ActiveDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber(),
|
||||||
data.Reason,
|
data.Reason,
|
||||||
data.ReasonResign,
|
|
||||||
data.Remark,
|
|
||||||
ReasonRemark = data.Reason == "OTHER" ? string.IsNullOrEmpty(data.Remark) ? data.ReasonResign : $"{data.ReasonResign}({data.Remark})" : data.ReasonResign,
|
|
||||||
data.Status,
|
data.Status,
|
||||||
data.salary,
|
data.salary,
|
||||||
data.PositionTypeOld,
|
data.PositionTypeOld,
|
||||||
|
|
@ -701,19 +383,6 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
data.CommanderRejectReason,
|
data.CommanderRejectReason,
|
||||||
CommanderRejectDate = string.IsNullOrEmpty(data.CommanderRejectDate.ToString()) ? string.Empty : DateTime.Parse(data.CommanderRejectDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber(),
|
CommanderRejectDate = string.IsNullOrEmpty(data.CommanderRejectDate.ToString()) ? string.Empty : DateTime.Parse(data.CommanderRejectDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber(),
|
||||||
data.RemarkHorizontal,
|
data.RemarkHorizontal,
|
||||||
dear = approverPositionExecutiveName,
|
|
||||||
approverStatus,
|
|
||||||
approverRejectStatus,
|
|
||||||
approver,
|
|
||||||
approverPosition,
|
|
||||||
diffDate,
|
|
||||||
commanderDateUpdate,
|
|
||||||
commanderStatus,
|
|
||||||
commanderCommentApprove,
|
|
||||||
commanderRejectStatus,
|
|
||||||
commanderCommentReject,
|
|
||||||
commander,
|
|
||||||
commanderPosition
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return _data;
|
return _data;
|
||||||
|
|
|
||||||
|
|
@ -32,14 +32,19 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetData1Transfer(Guid id)
|
public async Task<dynamic> GetData1Transfer(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
||||||
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var profile = await _dbContext.Set<Profile>().AsQueryable()
|
||||||
|
.Include(x => x.Prefix)
|
||||||
|
.Where(x => x.Id == data.Profile.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var prefix = string.IsNullOrEmpty(profile.Prefix.Name) ? string.Empty : profile.Prefix.Name;
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
//CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
||||||
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate2().ToString().ToThaiNumber(),
|
Name = $"{prefix}{data.Profile.FirstName} {data.Profile.LastName}",
|
||||||
Name = $"{data.prefix}{data.firstName} {data.lastName}",
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -48,14 +53,20 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetData2Transfer(Guid id)
|
public async Task<dynamic> GetData2Transfer(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
||||||
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var profile = await _dbContext.Set<Profile>().AsQueryable()
|
||||||
|
.Include(x => x.Prefix)
|
||||||
|
.Where(x => x.Id == data.Profile.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var prefix = string.IsNullOrEmpty(profile.Prefix.Name) ? string.Empty : profile.Prefix.Name;
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate2().ToString().ToThaiNumber(),
|
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
||||||
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
||||||
Name = $"{data.prefix}{data.firstName} {data.lastName}",
|
Name = $"{prefix}{data.Profile.FirstName} {data.Profile.LastName}",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -64,14 +75,20 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetData3Transfer(Guid id)
|
public async Task<dynamic> GetData3Transfer(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
||||||
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
|
var profile = await _dbContext.Set<Profile>().AsQueryable()
|
||||||
|
|
||||||
|
.Include(x => x.Prefix)
|
||||||
|
.Where(x => x.Id == data.Profile.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var prefix = string.IsNullOrEmpty(profile.Prefix.Name) ? string.Empty : profile.Prefix.Name;
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate2().ToString().ToThaiNumber(),
|
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
||||||
Subject = $"ข้าราชการขอโอน",
|
Subject = $"ข้าราชการขอโอน",
|
||||||
Name = $"{data.prefix}{data.firstName} {data.lastName}",
|
Name = $"{prefix}{data.Profile.FirstName} {data.Profile.LastName}",
|
||||||
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร ๑๗๓ ถนนดินสอ กทม. ๑๐๒๐๐",
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -80,19 +97,25 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetData4Transfer(Guid id)
|
public async Task<dynamic> GetData4Transfer(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
||||||
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var profile = await _dbContext.Set<Profile>().AsQueryable()
|
||||||
|
.Include(x => x.Prefix)
|
||||||
|
.Where(x => x.Id == data.Profile.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var prefix = string.IsNullOrEmpty(profile.Prefix.Name) ? string.Empty : profile.Prefix.Name;
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate2().ToString().ToThaiNumber(),
|
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
||||||
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
||||||
Subject2 = $"ตรวจสอบหนี้สิน และภาระผูกพันกับกรุงเทพมหานครของข้าราชการ",
|
Subject2 = $"ตรวจสอบหนี้สิน และภาระผูกพันกับกรุงเทพมหานครของข้าราชการ",
|
||||||
Subject3 = $"ตรวจสอบหนี้สินและภาระผูกพันของข้าราชการ",
|
Subject3 = $"ตรวจสอบหนี้สินและภาระผูกพันของข้าราชการ",
|
||||||
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร ๑๗๓ ถนนดินสอ กทม. ๑๐๒๐๐",
|
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร 173 ถนนดินสอ กทม. 10200",
|
||||||
Name = $"{data.prefix}{data.firstName} {data.lastName}",
|
Name = $"{prefix}{data.Profile.FirstName} {data.Profile.LastName}",
|
||||||
Position = $"{data.PositionOld}",
|
Position = $"{data.Profile.Position}",
|
||||||
OrganizationOrganization = $"{data.Organization}",
|
OrganizationOrganization = $"{data.Profile.OrganizationOrganization}",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -101,19 +124,25 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetData5Transfer(Guid id)
|
public async Task<dynamic> GetData5Transfer(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
||||||
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var profile = await _dbContext.Set<Profile>().AsQueryable()
|
||||||
|
.Include(x => x.Prefix)
|
||||||
|
.Where(x => x.Id == data.Profile.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var prefix = string.IsNullOrEmpty(profile.Prefix.Name) ? string.Empty : profile.Prefix.Name;
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate2().ToString().ToThaiNumber(),
|
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
||||||
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
||||||
Subject2 = $"ตรวจสอบพฤติการณ์ทางวินัย และภาระหนี้สิน (เงินกู้สวัสดิการข้าราชการ) ของข้าราชการ",
|
Subject2 = $"ตรวจสอบพฤติการณ์ทางวินัย และภาระหนี้สิน (เงินกู้สวัสดิการข้าราชการ) ของข้าราชการ",
|
||||||
Subject3 = $"ตรวจสอบภาระผูกพันกับกรุงเทพมหานครเกี่ยวกับการลาศึกษา อบรม ของข้าราชการ",
|
Subject3 = $"ตรวจสอบภาระผูกพันกับกรุงเทพมหานครเกี่ยวกับการลาศึกษา อบรม ของข้าราชการ",
|
||||||
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร ๑๗๓ ถนนดินสอ กทม. ๑๐๒๐๐",
|
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร 173 ถนนดินสอ กทม. 10200",
|
||||||
Name = $"{data.prefix}{data.firstName} {data.lastName}",
|
Name = $"{prefix}{data.Profile.FirstName} {data.Profile.LastName}",
|
||||||
Position = $"{data.PositionOld}",
|
Position = $"{data.Profile.Position}",
|
||||||
OrganizationOrganization = $"{data.Organization}",
|
OrganizationOrganization = $"{data.Profile.OrganizationOrganization}",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -122,21 +151,27 @@ namespace BMA.EHR.Application.Repositories.Reports
|
||||||
public async Task<dynamic> GetData6Transfer(Guid id)
|
public async Task<dynamic> GetData6Transfer(Guid id)
|
||||||
{
|
{
|
||||||
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
var data = await _dbContext.Set<PlacementTransfer>().AsQueryable()
|
||||||
|
.Include(x => x.Profile)
|
||||||
.Where(x => x.Id == id)
|
.Where(x => x.Id == id)
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var profile = await _dbContext.Set<Profile>().AsQueryable()
|
||||||
|
.Include(x => x.Prefix)
|
||||||
|
.Where(x => x.Id == data.Profile.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
var prefix = string.IsNullOrEmpty(profile.Prefix.Name) ? string.Empty : profile.Prefix.Name;
|
||||||
return new
|
return new
|
||||||
{
|
{
|
||||||
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate2().ToString().ToThaiNumber(),
|
CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM")).ToThaiFullDate().ToString().ToThaiNumber().Remove(0, 15),
|
||||||
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
Subject = $"ข้าราชการกรุงเทพมหานครสามัญขอโอน",
|
||||||
Subject2 = $"ตรวจสอบพฤติการณ์ทางวินัย และภาระหนี้สิน (เงินกู้สวัสดิการข้าราชการ) ของข้าราชการ",
|
Subject2 = $"ตรวจสอบพฤติการณ์ทางวินัย และภาระหนี้สิน (เงินกู้สวัสดิการข้าราชการ) ของข้าราชการ",
|
||||||
Subject3 = $"ตรวจสอบภาระผูกพันกับกรุงเทพมหานครเกี่ยวกับการลาศึกษา อบรม ของข้าราชการ",
|
Subject3 = $"ตรวจสอบภาระผูกพันกับกรุงเทพมหานครเกี่ยวกับการลาศึกษา อบรม ของข้าราชการ",
|
||||||
Subject4 = $"ตรวจสอบหนี้สิน และภาระผูกพันกับกรุงเทพมหานครของข้าราชการ",
|
Subject4 = $"ตรวจสอบหนี้สิน และภาระผูกพันกับกรุงเทพมหานครของข้าราชการ",
|
||||||
Subject5 = $"ตรวจสอบหนี้สินและภาระผูกพันของข้าราชการ",
|
Subject5 = $"ตรวจสอบหนี้สินและภาระผูกพันของข้าราชการ",
|
||||||
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร ๑๗๓ ถนนดินสอ กทม. ๑๐๒๐๐",
|
Location = $"สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร 173 ถนนดินสอ กทม. 10200",
|
||||||
Name = $"{data.prefix}{data.firstName} {data.lastName}",
|
Name = $"{prefix}{data.Profile.FirstName} {data.Profile.LastName}",
|
||||||
Position = $"{data.PositionOld}",
|
Position = $"{data.Profile.Position}",
|
||||||
OrganizationOrganization = $"{data.Organization}",
|
OrganizationOrganization = $"{data.Profile.OrganizationOrganization}",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,16 +1,8 @@
|
||||||
using BMA.EHR.Application.Common.Interfaces;
|
using BMA.EHR.Application.Common.Interfaces;
|
||||||
using BMA.EHR.Application.Repositories.MessageQueue;
|
using BMA.EHR.Application.Repositories.MessageQueue;
|
||||||
using BMA.EHR.Domain.Models.Notifications;
|
|
||||||
using BMA.EHR.Domain.Models.Retirement;
|
using BMA.EHR.Domain.Models.Retirement;
|
||||||
using BMA.EHR.Domain.Shared;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System.Net.Http.Headers;
|
|
||||||
using System.Net.Http.Json;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories
|
namespace BMA.EHR.Application.Repositories
|
||||||
{
|
{
|
||||||
|
|
@ -19,28 +11,15 @@ namespace BMA.EHR.Application.Repositories
|
||||||
private readonly IApplicationDBContext _dbContext;
|
private readonly IApplicationDBContext _dbContext;
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly NotificationRepository _repositoryNoti;
|
private readonly NotificationRepository _repositoryNoti;
|
||||||
private readonly IConfiguration _configuration;
|
|
||||||
private readonly string URL = string.Empty;
|
|
||||||
public RetirementRepository(IApplicationDBContext dbContext,
|
public RetirementRepository(IApplicationDBContext dbContext,
|
||||||
NotificationRepository repositoryNoti,
|
NotificationRepository repositoryNoti,
|
||||||
IHttpContextAccessor httpContextAccessor,
|
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
UserProfileRepository userProfileRepository,
|
|
||||||
IConfiguration configuration) : base(dbContext, httpContextAccessor)
|
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_repositoryNoti = repositoryNoti;
|
_repositoryNoti = repositoryNoti;
|
||||||
_configuration = configuration;
|
|
||||||
URL = _configuration["VITE_URL_MGT"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region " Properties "
|
|
||||||
private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
|
||||||
private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value;
|
|
||||||
private string? token => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"];
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
//ปลดออก
|
//ปลดออก
|
||||||
public async Task NotifyDischarge()
|
public async Task NotifyDischarge()
|
||||||
{
|
{
|
||||||
|
|
@ -55,6 +34,11 @@ namespace BMA.EHR.Application.Repositories
|
||||||
cronjobNoti.Profile.IsLeave = true;
|
cronjobNoti.Profile.IsLeave = true;
|
||||||
cronjobNoti.Profile.LeaveReason = "DISCHARGE";
|
cronjobNoti.Profile.LeaveReason = "DISCHARGE";
|
||||||
cronjobNoti.Profile.LeaveDate = DateTime.Now;
|
cronjobNoti.Profile.LeaveDate = DateTime.Now;
|
||||||
|
// await _repositoryNoti.PushNotificationAsync(
|
||||||
|
// Guid.Parse("08db721d-ada0-4e64-89d3-7584a893d8b8"),
|
||||||
|
// $"แจ้งเตือนการปลดออกของ {cronjobNoti.Profile.Prefix?.Name}{cronjobNoti.Profile.FirstName} {cronjobNoti.Profile.LastName}",
|
||||||
|
// $"แจ้งเตือนการปลดออกของ {cronjobNoti.Profile.Prefix?.Name}{cronjobNoti.Profile.FirstName} {cronjobNoti.Profile.LastName}"
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
@ -73,6 +57,11 @@ namespace BMA.EHR.Application.Repositories
|
||||||
cronjobNoti.Profile.IsLeave = true;
|
cronjobNoti.Profile.IsLeave = true;
|
||||||
cronjobNoti.Profile.LeaveReason = "DISMISS";
|
cronjobNoti.Profile.LeaveReason = "DISMISS";
|
||||||
cronjobNoti.Profile.LeaveDate = DateTime.Now;
|
cronjobNoti.Profile.LeaveDate = DateTime.Now;
|
||||||
|
// await _repositoryNoti.PushNotificationAsync(
|
||||||
|
// Guid.Parse("08db721d-ada0-4e64-89d3-7584a893d8b8"),
|
||||||
|
// $"แจ้งเตือนการปลดออกของ {cronjobNoti.Profile.Prefix?.Name}{cronjobNoti.Profile.FirstName} {cronjobNoti.Profile.LastName}",
|
||||||
|
// $"แจ้งเตือนการปลดออกของ {cronjobNoti.Profile.Prefix?.Name}{cronjobNoti.Profile.FirstName} {cronjobNoti.Profile.LastName}"
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
@ -81,844 +70,23 @@ namespace BMA.EHR.Application.Repositories
|
||||||
public async Task NotifyOut()
|
public async Task NotifyOut()
|
||||||
{
|
{
|
||||||
var cronjobNotis = await _dbContext.Set<RetirementOut>()
|
var cronjobNotis = await _dbContext.Set<RetirementOut>()
|
||||||
//.Include(x => x.Profile)
|
.Include(x => x.Profile)
|
||||||
//.ThenInclude(x => x.Prefix)
|
.ThenInclude(x => x.Prefix)
|
||||||
.Where(x => x.Date != null && x.Date.Value.Date == DateTime.Now.Date)
|
.Where(x => x.Date != null && x.Date.Value.Date == DateTime.Now.Date)
|
||||||
.AsQueryable()
|
.AsQueryable()
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
foreach (var cronjobNoti in cronjobNotis)
|
||||||
|
{
|
||||||
|
cronjobNoti.Profile.IsLeave = true;
|
||||||
|
cronjobNoti.Profile.LeaveReason = "LAYOFF";
|
||||||
|
cronjobNoti.Profile.LeaveDate = DateTime.Now;
|
||||||
|
// await _repositoryNoti.PushNotificationAsync(
|
||||||
|
// Guid.Parse("08db721d-ada0-4e64-89d3-7584a893d8b8"),
|
||||||
|
// $"แจ้งเตือนการปลดออกของ {cronjobNoti.Profile.Prefix?.Name}{cronjobNoti.Profile.FirstName} {cronjobNoti.Profile.LastName}",
|
||||||
|
// $"แจ้งเตือนการปลดออกของ {cronjobNoti.Profile.Prefix?.Name}{cronjobNoti.Profile.FirstName} {cronjobNoti.Profile.LastName}"
|
||||||
|
// );
|
||||||
|
}
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TestMethod()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
public async Task<RetirementResign?> GetByIdAsync(Guid id)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<RetirementResign>().AsQueryable()
|
|
||||||
.Include(x => x.Approvers)
|
|
||||||
.FirstOrDefaultAsync(x => x.Id == id);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
public async Task OfficerApproveRetirementResign(Guid id)
|
|
||||||
{
|
|
||||||
var rawData = await GetByIdAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
if (rawData.ApproveStep == "st1")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st2";
|
|
||||||
}
|
|
||||||
else if (rawData.ApproveStep == "st3")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st4";
|
|
||||||
// TODO: Send notification to 1st Approver
|
|
||||||
var _firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
// Send Notification
|
|
||||||
var _noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = _firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail/{id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(_noti1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Send notification to 1st Commander
|
|
||||||
var firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "COMMANDER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
// Send Notification
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail/{id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task CommanderApproveRetirementResign(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
|
|
||||||
var rawData = await GetByIdAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st2")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "APPROVE";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail/{id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
rawData.ApproveStep = "st3";
|
|
||||||
|
|
||||||
if (rawData.Group == "1.1")
|
|
||||||
{
|
|
||||||
// TODO: Send notification to 1st Approver
|
|
||||||
var firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
|
|
||||||
// Send Notification
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail/{id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task CommanderRejectRetirementResign(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
|
|
||||||
var rawData = await GetByIdAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st2")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check commander approve
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "REJECT";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail/{id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
// rawData.LeaveComment = reason;
|
|
||||||
// if (rawData.Group != "1.1")
|
|
||||||
// {
|
|
||||||
rawData.ApproveStep = "st3";
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (rawData.Group == "1.1")
|
|
||||||
{
|
|
||||||
// TODO: Send notification to 1st Approver
|
|
||||||
var firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
// Send Notification
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail/{id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ApproveRetirementResign(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
var rawData = await GetByIdAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st3")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check commander approve
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "APPROVE";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
// Send Noti
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "APPROVE";
|
|
||||||
// rawData.LeaveDirectorComment = reason;
|
|
||||||
if (rawData.Group != "1.1")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st5";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st4";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rawData.profileId != null)
|
|
||||||
{
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณได้รับการอนุมัติ",
|
|
||||||
ReceiverUserId = Guid.Parse(rawData.profileId),
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task RejectRetirementResign(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
var rawData = await GetByIdAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st3")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check commander approve
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "REJECT";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
// Send Noti
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "REJECT";
|
|
||||||
if (rawData.Group != "1.1")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st5";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st4";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอลาออกของคุณไม่ได้รับการอนุมัติ \r\nเนื่องจาก{reason}",
|
|
||||||
ReceiverUserId = Guid.Parse(rawData.profileId),
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<RetirementResignCancel?> GetByIdCancelAsync(Guid id)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var data = await _dbContext.Set<RetirementResignCancel>().AsQueryable()
|
|
||||||
.Include(x => x.Approvers)
|
|
||||||
.FirstOrDefaultAsync(x => x.Id == id);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
public async Task OfficerApproveRetirementResignCancel(Guid id)
|
|
||||||
{
|
|
||||||
var rawData = await GetByIdCancelAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
if (rawData.ApproveStep == "st1")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st2";
|
|
||||||
}
|
|
||||||
else if (rawData.ApproveStep == "st3")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st4";
|
|
||||||
// TODO: Send notification to 1st Approver
|
|
||||||
var _firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
// Send Notification
|
|
||||||
var _noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = _firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(_noti1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Send notification to 1st Commander
|
|
||||||
var firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "COMMANDER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
// Send Notification
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task CommanderApproveRetirementResignCancel(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
|
|
||||||
var rawData = await GetByIdCancelAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st2")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "APPROVE";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
rawData.ApproveStep = "st3";
|
|
||||||
|
|
||||||
if (rawData.Group == "1.1")
|
|
||||||
{
|
|
||||||
// TODO: Send notification to 1st Approver
|
|
||||||
var firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
|
|
||||||
// Send Notification
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task CommanderRejectRetirementResignCancel(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
|
|
||||||
var rawData = await GetByIdCancelAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st2")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check commander approve
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "COMMANDER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "REJECT";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "PENDING";
|
|
||||||
// rawData.LeaveComment = reason;
|
|
||||||
// if (rawData.Group != "1.1")
|
|
||||||
// {
|
|
||||||
rawData.ApproveStep = "st3";
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (rawData.Group == "1.1")
|
|
||||||
{
|
|
||||||
// TODO: Send notification to 1st Approver
|
|
||||||
var firstCommander = rawData.Approvers
|
|
||||||
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
|
|
||||||
.OrderBy(x => x.Seq)
|
|
||||||
.FirstOrDefault();
|
|
||||||
// Send Notification
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = firstCommander!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = $"{URL}/retirement/resign-detail-reject/{rawData.Id}",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ApproveRetirementResignCancel(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
var rawData = await GetByIdCancelAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st3")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check commander approve
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "APPROVE";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
// Send Noti
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "APPROVE";
|
|
||||||
// rawData.LeaveDirectorComment = reason;
|
|
||||||
if (rawData.Group != "1.1")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st5";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st4";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rawData.profileId != null)
|
|
||||||
{
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณได้รับการอนุมัติ",
|
|
||||||
ReceiverUserId = Guid.Parse(rawData.profileId),
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
}
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task RejectRetirementResignCancel(Guid id, string reason, DateTime? date)
|
|
||||||
{
|
|
||||||
// Get UserId from token
|
|
||||||
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
|
|
||||||
|
|
||||||
var rawData = await GetByIdCancelAsync(id);
|
|
||||||
if (rawData == null)
|
|
||||||
{
|
|
||||||
throw new Exception(GlobalMessages.DataNotFound);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (rawData.ApproveStep != "st3")
|
|
||||||
// {
|
|
||||||
// throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check commander approve
|
|
||||||
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
|
|
||||||
|
|
||||||
var approver = approvers.FirstOrDefault(x => x.KeycloakId == userId);
|
|
||||||
if (approver == null)
|
|
||||||
{
|
|
||||||
throw new Exception("คุณไม่มีสิทธิ์อนุมัติการลาออกในขั้นตอนนี้");
|
|
||||||
}
|
|
||||||
|
|
||||||
// check prev approver มี action แล้วหรือไม่?
|
|
||||||
var prevApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq - 1);
|
|
||||||
|
|
||||||
if (prevApprover != null)
|
|
||||||
{
|
|
||||||
if (prevApprover.ApproveStatus == "PENDING")
|
|
||||||
{
|
|
||||||
throw new Exception("ไม่สามารถทำการอนุมัติได้ เนื่องจากยังอยู่ระหว่างการพิจารณาโดยผู้บังคับบัญชารายก่อนหน้า");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var maxSeq = approvers.Max(x => x.Seq);
|
|
||||||
|
|
||||||
approver.ApproveStatus = "REJECT";
|
|
||||||
approver.Comment = reason;
|
|
||||||
approver.RejectDate = date;
|
|
||||||
|
|
||||||
if (approver.Seq != maxSeq)
|
|
||||||
{
|
|
||||||
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
|
|
||||||
// Send Noti
|
|
||||||
var noti1 = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณ {rawData.firstName} {rawData.lastName} รอรับการอนุมัติจากคุณ",
|
|
||||||
ReceiverUserId = nextApprover!.ProfileId,
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti1);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.Status = "REJECT";
|
|
||||||
if (rawData.Group != "1.1")
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st5";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rawData.ApproveStep = "st4";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Noti
|
|
||||||
var noti = new Notification
|
|
||||||
{
|
|
||||||
Body = $"การขอยกเลิกลาออกของคุณไม่ได้รับการอนุมัติ \r\nเนื่องจาก{reason}",
|
|
||||||
ReceiverUserId = Guid.Parse(rawData.profileId),
|
|
||||||
Type = "",
|
|
||||||
Payload = "",
|
|
||||||
};
|
|
||||||
_dbContext.Set<Notification>().Add(noti);
|
|
||||||
await _dbContext.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,13 +0,0 @@
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Requests
|
|
||||||
{
|
|
||||||
public class DirectorRequest
|
|
||||||
{
|
|
||||||
public DirectorRequestData[] result { get; set; }
|
|
||||||
}
|
|
||||||
public class DirectorRequestData
|
|
||||||
{
|
|
||||||
public string id { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -9,18 +9,4 @@ namespace BMA.EHR.Application.Requests
|
||||||
public Guid? BorrowOrganizationId { get; set; }
|
public Guid? BorrowOrganizationId { get; set; }
|
||||||
public Guid InsigniaNoteProfileId { get; set; }
|
public Guid InsigniaNoteProfileId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InsigniaReclaimRequest
|
|
||||||
{
|
|
||||||
public DateTime ReclaimDate { get; set; }
|
|
||||||
public Guid InsigniaNoteProfileId { get; set; }
|
|
||||||
|
|
||||||
public string? ReclaimNote { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UpdateInsigniaReclaimRequest
|
|
||||||
{
|
|
||||||
public DateTime ReclaimDate { get; set; }
|
|
||||||
public string? ReclaimNote { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ namespace BMA.EHR.Application.Requests
|
||||||
public int Amount { get; set; }
|
public int Amount { get; set; }
|
||||||
|
|
||||||
public int Round { get; set; }
|
public int Round { get; set; }
|
||||||
public string[] EmpPosId { get; set; }
|
|
||||||
public FormFile? File { get; set; }
|
public FormFile? File { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@
|
||||||
public bool? MarkDiscipline { get; set; }
|
public bool? MarkDiscipline { get; set; }
|
||||||
public bool? MarkLeave { get; set; }
|
public bool? MarkLeave { get; set; }
|
||||||
public bool? MarkRate { get; set; }
|
public bool? MarkRate { get; set; }
|
||||||
public bool? MarkInsignia { get; set; }
|
|
||||||
public List<InsigniaRequestDoc>? Docs { get; set; }
|
public List<InsigniaRequestDoc>? Docs { get; set; }
|
||||||
|
|
||||||
public List<MatchingCondition> MatchingConditions { get; set; } = new List<MatchingCondition>();
|
public List<MatchingCondition> MatchingConditions { get; set; } = new List<MatchingCondition>();
|
||||||
|
|
|
||||||
|
|
@ -6,76 +6,30 @@ namespace BMA.EHR.Application.Requests
|
||||||
{
|
{
|
||||||
public Guid ProfileId { get; set; }
|
public Guid ProfileId { get; set; }
|
||||||
|
|
||||||
public string CitizenId { get; set; } = String.Empty;
|
public string Prefix { get; set; }
|
||||||
|
|
||||||
public string Prefix { get; set; } = String.Empty;
|
public string FullName { get; set; }
|
||||||
|
|
||||||
public string FirstName { get; set; } = String.Empty;
|
public string Position { get; set; }
|
||||||
|
|
||||||
public string LastName { get; set; } = String.Empty;
|
public string Rank { get; set; }
|
||||||
|
|
||||||
public DateTime? BirthDate { get; set; }
|
public string GovAge { get; set; }
|
||||||
|
|
||||||
public DateTime? DateAppoint { get; set; }
|
|
||||||
|
|
||||||
public string? ProfileType { get; set; }
|
|
||||||
|
|
||||||
public string? PosTypeName { get; set; }
|
|
||||||
|
|
||||||
public string? PosLevelName { get; set; }
|
|
||||||
|
|
||||||
public string FullName { get; set; } = String.Empty;
|
|
||||||
|
|
||||||
public string Position { get; set; } = String.Empty;
|
|
||||||
|
|
||||||
public string Rank { get; set; } = String.Empty;
|
|
||||||
|
|
||||||
public string GovAge { get; set; } = String.Empty;
|
|
||||||
|
|
||||||
public double? Salary { get; set; }
|
public double? Salary { get; set; }
|
||||||
|
|
||||||
public double? PositionSalary { get; set; }
|
public string LastInsignia { get; set; }
|
||||||
|
|
||||||
public string LastInsignia { get; set; } = String.Empty;
|
|
||||||
public Guid? LastInsigniaId { get; set; }
|
public Guid? LastInsigniaId { get; set; }
|
||||||
|
|
||||||
//public Guid PosNo { get; set; }
|
public Guid PosNo { get; set; }
|
||||||
|
|
||||||
public string PosNo { get; set; } = String.Empty;
|
public InsigniaItem RequestInsignia { get; set; }
|
||||||
|
|
||||||
public InsigniaItem RequestInsignia { get; set; } = new();
|
public string Gender { get; set; }
|
||||||
|
|
||||||
public string Gender { get; set; } = String.Empty;
|
|
||||||
|
|
||||||
public int Seq { get; set; }
|
public int Seq { get; set; }
|
||||||
|
|
||||||
public double? Amount { get; set; }
|
|
||||||
public double? PositionSalaryAmount { get; set; }
|
|
||||||
public Guid? RootId { get; set; }
|
|
||||||
public Guid? RootDnaId { get; set; }
|
|
||||||
public string? Root { get; set; }
|
|
||||||
public Guid? Child1Id { get; set; }
|
|
||||||
public Guid? Child1DnaId { get; set; }
|
|
||||||
public string? Child1 { get; set; }
|
|
||||||
public Guid? Child2Id { get; set; }
|
|
||||||
public Guid? Child2DnaId { get; set; }
|
|
||||||
public string? Child2 { get; set; }
|
|
||||||
public Guid? Child3Id { get; set; }
|
|
||||||
public Guid? Child3DnaId { get; set; }
|
|
||||||
public string? Child3 { get; set; }
|
|
||||||
public Guid? Child4Id { get; set; }
|
|
||||||
public Guid? Child4DnaId { get; set; }
|
|
||||||
public string? Child4 { get; set; }
|
|
||||||
|
|
||||||
public List<MatchingCondition> MatchingConditions { get; set; } = new List<MatchingCondition>();
|
public List<MatchingCondition> MatchingConditions { get; set; } = new List<MatchingCondition>();
|
||||||
|
|
||||||
public bool? MarkDiscipline { get; set; } = false;
|
|
||||||
|
|
||||||
public bool? MarkLeave { get; set; } = false;
|
|
||||||
|
|
||||||
public bool? MarkRate { get; set; } = false;
|
|
||||||
|
|
||||||
public bool? MarkInsignia { get; set; } = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MatchingCondition
|
public class MatchingCondition
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ namespace BMA.EHR.Application.Requests
|
||||||
public string InsigniaName { get; set; }
|
public string InsigniaName { get; set; }
|
||||||
public string InsigniaPage { get; set; }
|
public string InsigniaPage { get; set; }
|
||||||
public string InsigniaNo { get; set; }
|
public string InsigniaNo { get; set; }
|
||||||
public Guid Kp7InsigniaId { get; set; }
|
public int? Kp7InsigniaId { get; set; }
|
||||||
}
|
}
|
||||||
public class DocReceive
|
public class DocReceive
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,5 @@
|
||||||
public string name { get; set; }
|
public string name { get; set; }
|
||||||
|
|
||||||
public string url { get; set; }
|
public string url { get; set; }
|
||||||
|
|
||||||
public bool? isReport { get; set; }
|
|
||||||
|
|
||||||
public bool? isTemplate { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ namespace BMA.EHR.Application.Responses
|
||||||
public class EvaluateAssignResponse
|
public class EvaluateAssignResponse
|
||||||
{
|
{
|
||||||
public bool successful { get; set; }
|
public bool successful { get; set; }
|
||||||
public Data result { get; set; }
|
public Data data { get; set; }
|
||||||
|
|
||||||
public class Data
|
public class Data
|
||||||
{
|
{
|
||||||
|
|
@ -26,8 +26,6 @@ namespace BMA.EHR.Application.Responses
|
||||||
public string Position { get; set; } = string.Empty;
|
public string Position { get; set; } = string.Empty;
|
||||||
public string Department { get; set; } = string.Empty;
|
public string Department { get; set; } = string.Empty;
|
||||||
public string Oc { get; set; } = string.Empty;
|
public string Oc { get; set; } = string.Empty;
|
||||||
public string PositionLevelName { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Commander
|
public class Commander
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ namespace BMA.EHR.Application.Responses
|
||||||
public class EvaluateChairmanAssignResponse
|
public class EvaluateChairmanAssignResponse
|
||||||
{
|
{
|
||||||
public bool successful { get; set; }
|
public bool successful { get; set; }
|
||||||
public Data result { get; set; }
|
public Data data { get; set; }
|
||||||
|
|
||||||
public class Data
|
public class Data
|
||||||
{
|
{
|
||||||
|
|
@ -26,7 +26,6 @@ namespace BMA.EHR.Application.Responses
|
||||||
public string PositionLineId { get; set; } = string.Empty;
|
public string PositionLineId { get; set; } = string.Empty;
|
||||||
public string OrganizationOrganization { get; set; } = string.Empty;
|
public string OrganizationOrganization { get; set; } = string.Empty;
|
||||||
public string Position { get; set; } = string.Empty;
|
public string Position { get; set; } = string.Empty;
|
||||||
public string PositionLevelName { get; set; } = string.Empty;
|
|
||||||
public string Department { get; set; } = string.Empty;
|
public string Department { get; set; } = string.Empty;
|
||||||
public string Oc { get; set; } = string.Empty;
|
public string Oc { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ namespace BMA.EHR.Application.Responses
|
||||||
public class EvaluateRecordAssignResponse
|
public class EvaluateRecordAssignResponse
|
||||||
{
|
{
|
||||||
public bool successful { get; set; }
|
public bool successful { get; set; }
|
||||||
public Data result { get; set; }
|
public Data data { get; set; }
|
||||||
|
|
||||||
public class Data
|
public class Data
|
||||||
{
|
{
|
||||||
|
|
@ -26,7 +26,6 @@ namespace BMA.EHR.Application.Responses
|
||||||
public string Department { get; set; }
|
public string Department { get; set; }
|
||||||
public string OrganizationOrganization { get; set; }
|
public string OrganizationOrganization { get; set; }
|
||||||
public string Oc { get; set; }
|
public string Oc { get; set; }
|
||||||
public string PositionLevelName { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Director
|
public class Director
|
||||||
|
|
@ -90,20 +89,19 @@ namespace BMA.EHR.Application.Responses
|
||||||
public string role { get; set; }
|
public string role { get; set; }
|
||||||
public DateTime createdAt { get; set; }
|
public DateTime createdAt { get; set; }
|
||||||
public DateTime updatedAt { get; set; }
|
public DateTime updatedAt { get; set; }
|
||||||
public Achievement achievements { get; set; }
|
public List<Achievement> achievements { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Achievement
|
public class Achievement
|
||||||
{
|
{
|
||||||
// public string evaluate_expect_desc { get; set; }
|
public string evaluate_expect_desc { get; set; }
|
||||||
public List<EvaluateExpectLevel> evaluate_expect_level { get; set; }
|
public EvaluateExpectLevel evaluate_expect_level { get; set; }
|
||||||
// public string evaluate_output_desc { get; set; }
|
public string evaluate_output_desc { get; set; }
|
||||||
public List<EvaluateOutputLevel> evaluate_output_level { get; set; }
|
public EvaluateOutputLevel evaluate_output_level { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EvaluateExpectLevel
|
public class EvaluateExpectLevel
|
||||||
{
|
{
|
||||||
public string? title { get; set; }
|
|
||||||
public string col1 { get; set; }
|
public string col1 { get; set; }
|
||||||
public string col2 { get; set; }
|
public string col2 { get; set; }
|
||||||
public string col3 { get; set; }
|
public string col3 { get; set; }
|
||||||
|
|
@ -113,7 +111,6 @@ namespace BMA.EHR.Application.Responses
|
||||||
|
|
||||||
public class EvaluateOutputLevel
|
public class EvaluateOutputLevel
|
||||||
{
|
{
|
||||||
public string? title { get; set; }
|
|
||||||
public string col1 { get; set; }
|
public string col1 { get; set; }
|
||||||
public string col2 { get; set; }
|
public string col2 { get; set; }
|
||||||
public string col3 { get; set; }
|
public string col3 { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ namespace BMA.EHR.Application.Responses
|
||||||
public class EvaluateResultAssignResponse
|
public class EvaluateResultAssignResponse
|
||||||
{
|
{
|
||||||
public bool successful { get; set; }
|
public bool successful { get; set; }
|
||||||
public Data result { get; set; }
|
public Data data { get; set; }
|
||||||
|
|
||||||
public class Data
|
public class Data
|
||||||
{
|
{
|
||||||
|
|
@ -19,19 +19,15 @@ namespace BMA.EHR.Application.Responses
|
||||||
|
|
||||||
public class Commander
|
public class Commander
|
||||||
{
|
{
|
||||||
// public string personal_id { get; set; }
|
public string personal_id { get; set; }
|
||||||
public string name { get; set; }
|
public string name { get; set; }
|
||||||
// public string PositionId { get; set; }
|
public string PositionId { get; set; }
|
||||||
// public string PositionLevelId { get; set; }
|
public string PositionLevelId { get; set; }
|
||||||
// public string PositionLineId { get; set; }
|
public string PositionLineId { get; set; }
|
||||||
public string position { get; set; }
|
public string Position { get; set; }
|
||||||
// public string Department { get; set; }
|
public string Department { get; set; }
|
||||||
// public string OrganizationOrganization { get; set; }
|
public string OrganizationOrganization { get; set; }
|
||||||
// public string Oc { get; set; }
|
public string Oc { get; set; }
|
||||||
public DateTime? dated { get; set; }
|
|
||||||
public string posLevel { get; set; }
|
|
||||||
public string posType { get; set; }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Chairman
|
public class Chairman
|
||||||
|
|
@ -68,7 +64,6 @@ namespace BMA.EHR.Application.Responses
|
||||||
public string PositionLevelId { get; set; }
|
public string PositionLevelId { get; set; }
|
||||||
public string PositionLineId { get; set; }
|
public string PositionLineId { get; set; }
|
||||||
public string Position { get; set; }
|
public string Position { get; set; }
|
||||||
public string PositionLevelName { get; set; }
|
|
||||||
public string Department { get; set; }
|
public string Department { get; set; }
|
||||||
public string OrganizationOrganization { get; set; }
|
public string OrganizationOrganization { get; set; }
|
||||||
public string Oc { get; set; }
|
public string Oc { get; set; }
|
||||||
|
|
@ -104,9 +99,9 @@ namespace BMA.EHR.Application.Responses
|
||||||
public int pass_result { get; set; }
|
public int pass_result { get; set; }
|
||||||
public int expand_month { get; set; }
|
public int expand_month { get; set; }
|
||||||
public string reson { get; set; }
|
public string reson { get; set; }
|
||||||
public DateTime? chairman_dated { get; set; }
|
public DateTime chairman_dated { get; set; }
|
||||||
public DateTime? director1_dated { get; set; }
|
public DateTime director1_dated { get; set; }
|
||||||
public DateTime? director2_dated { get; set; }
|
public DateTime director2_dated { get; set; }
|
||||||
public string createdAt { get; set; }
|
public string createdAt { get; set; }
|
||||||
public string updatedAt { get; set; }
|
public string updatedAt { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Insignias
|
|
||||||
{
|
|
||||||
public class PostProfileEmpInsigniaDto
|
|
||||||
{
|
|
||||||
public Guid profileEmployeeId { get; set; }
|
|
||||||
|
|
||||||
public int year { get; set; } = 0;
|
|
||||||
|
|
||||||
public string no { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string volume { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string section { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string page { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public DateTime receiveDate { get; set; } = DateTime.MinValue;
|
|
||||||
|
|
||||||
public Guid insigniaId { get; set; }
|
|
||||||
|
|
||||||
public DateTime dateAnnounce { get; set; } = DateTime.MinValue;
|
|
||||||
|
|
||||||
public string issue { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string volumeNo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public DateTime? refCommandDate { get; set; }
|
|
||||||
|
|
||||||
public string refCommandNo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string note { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Insignias
|
|
||||||
{
|
|
||||||
public class PostProfileInsigniaDto
|
|
||||||
{
|
|
||||||
public Guid profileId { get; set; }
|
|
||||||
|
|
||||||
public int year { get; set; } = 0;
|
|
||||||
|
|
||||||
public string no { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string volume { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string section { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string page { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public DateTime receiveDate { get; set; } = DateTime.MinValue;
|
|
||||||
|
|
||||||
public Guid insigniaId { get; set; }
|
|
||||||
|
|
||||||
public DateTime dateAnnounce { get; set; } = DateTime.MinValue;
|
|
||||||
|
|
||||||
public string issue { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string volumeNo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public DateTime? refCommandDate { get; set; }
|
|
||||||
|
|
||||||
public string refCommandNo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public string note { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
{
|
{
|
||||||
public class KeyValueItemResponse
|
public class KeyValueItemResponse
|
||||||
{
|
{
|
||||||
public Guid? Id { get; set; } = Guid.Empty;
|
public Guid Id { get; set; } = Guid.Empty;
|
||||||
|
|
||||||
public string? Name { get; set; } = string.Empty;
|
public string Name { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Leaves
|
|
||||||
{
|
|
||||||
public class GetCountApproveLeaveByTypeDto
|
|
||||||
{
|
|
||||||
public Guid KeycloakUserId { get; set; }
|
|
||||||
|
|
||||||
public Guid LeaveTypeId { get; set; }
|
|
||||||
|
|
||||||
public string LeaveTypeCode { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public int CountLeave { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using BMA.EHR.Domain.Shared;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Responses.Leaves
|
|
||||||
{
|
|
||||||
public class GetPermissionWithActingDto
|
|
||||||
{
|
|
||||||
public string privilege {get; set;} = string.Empty;
|
|
||||||
public bool isAct {get; set;} = false;
|
|
||||||
public List<ActingPermission> posMasterActs {get; set;} = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ActingPermission
|
|
||||||
{
|
|
||||||
public string posNo {get; set;} = string.Empty;
|
|
||||||
//public string? privilege {get; set;} = "PARENT";
|
|
||||||
[JsonConverter(typeof(PrivilegeConverter))]
|
|
||||||
public string privilege {get; set;} = "CHILD";
|
|
||||||
|
|
||||||
public Guid? rootDnaId {get; set;}
|
|
||||||
public Guid? child1DnaId {get; set;}
|
|
||||||
public Guid? child2DnaId {get; set;}
|
|
||||||
public Guid? child3DnaId {get; set;}
|
|
||||||
public Guid? child4DnaId {get; set;}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GetPermissionWithActingResultDto
|
|
||||||
{
|
|
||||||
public int status {get; set;} = 0;
|
|
||||||
public string message {get; set;} = string.Empty;
|
|
||||||
public GetPermissionWithActingDto result {get; set;} = new();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Leaves
|
|
||||||
{
|
|
||||||
public class GetProfileLeaveByKeycloakDto
|
|
||||||
{
|
|
||||||
public string ProfileType { get; set; }
|
|
||||||
public string Prefix { get; set; }
|
|
||||||
public string FirstName { get; set; }
|
|
||||||
public string LastName { get; set; }
|
|
||||||
public string CitizenId { get; set; }
|
|
||||||
public DateTime BirthDate { get; set; }
|
|
||||||
public DateTime RetireDate { get; set; }
|
|
||||||
public string GovAge { get; set; } = string.Empty;
|
|
||||||
public string Age { get; set; } = string.Empty;
|
|
||||||
public DateTime DateAppoint { get; set; }
|
|
||||||
public DateTime DateCurrent { get; set; }
|
|
||||||
public int? Amount { get; set; } = 0;
|
|
||||||
public string? TelephoneNumber { get; set; } = string.Empty;
|
|
||||||
public string Position { get; set; } = string.Empty;
|
|
||||||
public string PosLevel { get; set; } = string.Empty;
|
|
||||||
public string PosType { get; set; } = string.Empty;
|
|
||||||
public string? PositionLeaveName { get; set; }
|
|
||||||
public string? PosExecutiveName { get; set; }
|
|
||||||
public string CurrentAddress { get; set; } = string.Empty;
|
|
||||||
public string Oc { get; set; } = string.Empty;
|
|
||||||
public bool isCommission { get; set; } = false;
|
|
||||||
public string Root { get; set; } = string.Empty;
|
|
||||||
public string? Child1 { get; set; }
|
|
||||||
public string? Child2 { get; set; }
|
|
||||||
public string? Child3 { get; set; }
|
|
||||||
public string? Child4 { get; set; }
|
|
||||||
public List<ProfileLeavePosition> Positions { get; set; } = new();
|
|
||||||
public List<ProfileLeaveEducation> Educations { get; set; } = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProfileLeavePosition
|
|
||||||
{
|
|
||||||
public string? PositionName { get; set; } = string.Empty;
|
|
||||||
public DateTime DateStart { get; set; }
|
|
||||||
public DateTime DateEnd { get; set; }
|
|
||||||
public string? PositionType { get; set; } = string.Empty;
|
|
||||||
public string? PositionLevel { get; set; } = string.Empty;
|
|
||||||
public string? OrgRoot { get; set; } = string.Empty;
|
|
||||||
public string? OrgChild1 { get; set; } = string.Empty;
|
|
||||||
public string? OrgChild2 { get; set; } = string.Empty;
|
|
||||||
public string? OrgChild3 { get; set; } = string.Empty;
|
|
||||||
public string? OrgChild4 { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProfileLeaveEducation
|
|
||||||
{
|
|
||||||
public string EducationLevel { get; set; } = string.Empty;
|
|
||||||
public string Institute { get; set; } = string.Empty;
|
|
||||||
public string? Country { get; set; } = string.Empty;
|
|
||||||
public DateTime? FinishDate { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Leaves
|
|
||||||
{
|
|
||||||
public class GetProfileLeaveByKeycloakResultDto
|
|
||||||
{
|
|
||||||
public string Message { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public int Status { get; set; } = -1;
|
|
||||||
|
|
||||||
public GetProfileLeaveByKeycloakDto? Result { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Leaves
|
|
||||||
{
|
|
||||||
public class GetSumApproveLeaveByRootDto
|
|
||||||
{
|
|
||||||
public string Root { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public double SumLeaveDay { get; set; }
|
|
||||||
|
|
||||||
public double sickDayCountMale { get; set; }
|
|
||||||
public double maternityDayCountMale { get; set; }
|
|
||||||
public double wifeDayCountMale { get; set; }
|
|
||||||
public double personalDayCountMale { get; set; }
|
|
||||||
public double restDayCountMale { get; set; }
|
|
||||||
public double ordainDayCountMale { get; set; }
|
|
||||||
public double absentDayCountMale { get; set; }
|
|
||||||
public double studyDayCountMale { get; set; }
|
|
||||||
public double agencyDayCountMale { get; set; }
|
|
||||||
public double coupleDayCountMale { get; set; }
|
|
||||||
public double therapyDayCountMale { get; set; }
|
|
||||||
public double sickDayCountFemale { get; set; }
|
|
||||||
public double maternityDayCountFemale { get; set; }
|
|
||||||
public double wifeDayCountFemale { get; set; }
|
|
||||||
public double personalDayCountFemale { get; set; }
|
|
||||||
public double restDayCountFemale { get; set; }
|
|
||||||
public double ordainDayCountFemale { get; set; }
|
|
||||||
public double absentDayCountFemale { get; set; }
|
|
||||||
public double studyDayCountFemale { get; set; }
|
|
||||||
public double agencyDayCountFemale { get; set; }
|
|
||||||
public double coupleDayCountFemale { get; set; }
|
|
||||||
public double therapyDayCountFemale { get; set; }
|
|
||||||
public double sickDayCountNo { get; set; }
|
|
||||||
public double maternityDayCountNo { get; set; }
|
|
||||||
public double wifeDayCountNo { get; set; }
|
|
||||||
public double personalDayCountNo { get; set; }
|
|
||||||
public double restDayCountNo { get; set; }
|
|
||||||
public double ordainDayCountNo { get; set; }
|
|
||||||
public double absentDayCountNo { get; set; }
|
|
||||||
public double studyDayCountNo { get; set; }
|
|
||||||
public double agencyDayCountNo { get; set; }
|
|
||||||
public double coupleDayCountNo { get; set; }
|
|
||||||
public double therapyDayCountNo { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Leaves
|
|
||||||
{
|
|
||||||
public class GetSumApproveLeaveByTypeDto
|
|
||||||
{
|
|
||||||
public Guid KeycloakUserId { get; set; }
|
|
||||||
|
|
||||||
public Guid LeaveTypeId { get; set; }
|
|
||||||
|
|
||||||
public string LeaveTypeCode { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public double SumLeaveDay { get; set; } = 0.0;
|
|
||||||
|
|
||||||
public int CountLeaveDay { get; set; } = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -7,11 +7,9 @@
|
||||||
|
|
||||||
public Guid ReceiverUserId { get; set; } = Guid.Empty;
|
public Guid ReceiverUserId { get; set; } = Guid.Empty;
|
||||||
|
|
||||||
public string? KeycloakUserId { get; set; }
|
|
||||||
|
|
||||||
public string Type { get; set; } = "TEXT";
|
public string Type { get; set; } = "TEXT";
|
||||||
|
|
||||||
public string Payload { get; set; } = string.Empty;
|
public CommandPayload Payload { get; set; } = new();
|
||||||
|
|
||||||
public bool IsOpen { get; set; } = false;
|
public bool IsOpen { get; set; } = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
using BMA.EHR.Domain.Models.MetaData;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Responses
|
|
||||||
{
|
|
||||||
public class OrgRequest
|
|
||||||
{
|
|
||||||
public OrgRequestData result { get; set; } = new();
|
|
||||||
}
|
|
||||||
public class OrgRequestData
|
|
||||||
{
|
|
||||||
public string? profileId { get; set; }
|
|
||||||
public string? prefix { get; set; }
|
|
||||||
public string? firstName { get; set; }
|
|
||||||
public string? lastName { get; set; }
|
|
||||||
public string? citizenId { get; set; }
|
|
||||||
public string? root { get; set; }
|
|
||||||
public string? rootId { get; set; }
|
|
||||||
public string? rootShortName { get; set; }
|
|
||||||
public string? child1 { get; set; }
|
|
||||||
public string? child1Id { get; set; }
|
|
||||||
public string? child1ShortName { get; set; }
|
|
||||||
public string? child2 { get; set; }
|
|
||||||
public string? child2Id { get; set; }
|
|
||||||
public string? child2ShortName { get; set; }
|
|
||||||
public string? child3 { get; set; }
|
|
||||||
public string? child3Id { get; set; }
|
|
||||||
public string? child3ShortName { get; set; }
|
|
||||||
public string? child4 { get; set; }
|
|
||||||
public string? child4Id { get; set; }
|
|
||||||
public string? child4ShortName { get; set; }
|
|
||||||
public string? node { get; set; }
|
|
||||||
public string? nodeId { get; set; }
|
|
||||||
public string? nodeShortName { get; set; }
|
|
||||||
public int? posMasterNo { get; set; }
|
|
||||||
public string? position { get; set; }
|
|
||||||
public string? posTypeId { get; set; }
|
|
||||||
public string? posTypeName { get; set; }
|
|
||||||
public int? posTypeRank { get; set; }
|
|
||||||
public string? posLevelId { get; set; }
|
|
||||||
public string? posLevelName { get; set; }
|
|
||||||
public int? posLevelRank { get; set; }
|
|
||||||
public string? posExecutiveId { get; set; }
|
|
||||||
public string? posExecutiveName { get; set; }
|
|
||||||
public string? posNo { get; set; }
|
|
||||||
public string? organization { get; set; }
|
|
||||||
public double? salary { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Organizations
|
|
||||||
{
|
|
||||||
public class GetActiveRootDto
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public DateTime CreatedAt { get; set; }
|
|
||||||
public Guid CreatedUserId { get; set; }
|
|
||||||
public DateTime LastUpdatedAt { get; set; }
|
|
||||||
public Guid LastUpdateUserId { get; set; }
|
|
||||||
public string CreatedFullName { get; set; } = string.Empty;
|
|
||||||
public string LastUpdateFullName { get; set; } = string.Empty;
|
|
||||||
public string OrgRootName { get; set; } = string.Empty;
|
|
||||||
public string OrgRevisionId { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Organizations
|
|
||||||
{
|
|
||||||
public class GetActiveRootResultDto
|
|
||||||
{
|
|
||||||
public string Message { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public int Status { get; set; } = -1;
|
|
||||||
|
|
||||||
public List<GetActiveRootDto> Result { get; set; } = new();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Organizations
|
|
||||||
{
|
|
||||||
public class GetIsOfficerDto
|
|
||||||
{
|
|
||||||
public bool isOfficer { get; set; }
|
|
||||||
public bool isStaff { get; set; }
|
|
||||||
public bool isDirector { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
namespace BMA.EHR.Application.Responses.Organizations
|
|
||||||
{
|
|
||||||
public class GetIsOfficerResultDto
|
|
||||||
{
|
|
||||||
public string Message { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
public int Status { get; set; } = -1;
|
|
||||||
|
|
||||||
public GetIsOfficerDto Result { get; set; } = new();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue