Compare commits

..

No commits in common. "dev" and "command-1.0.26" have entirely different histories.

236 changed files with 4785 additions and 149231 deletions

View file

@ -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 }}

View file

@ -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 }}

View file

@ -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 }}

View file

@ -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 }}

View file

@ -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 }}

View file

@ -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 }}

View file

@ -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 }}"
}]
}'

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -1,9 +1,9 @@
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]+" - "retirement-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

View file

@ -1,9 +1,9 @@
name: release-dev name: release-dev
run-name: release-dev ${{ github.actor }} run-name: release-dev ${{ github.actor }}
on: on:
# push: push:
# tags: tags:
# - "consumer-[0-9]+.[0-9]+.[0-9]+" - "consumer-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

View file

@ -1,9 +1,9 @@
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]+" - "command-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

View file

@ -1,9 +1,9 @@
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]+" - "discipline-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

View file

@ -1,9 +1,9 @@
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]+" - "insignia-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

View file

@ -1,9 +1,9 @@
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]+" - "leave-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com
@ -57,7 +57,7 @@ jobs:
push: true push: true
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
- name: Remote Deployment - name: Remote Deployment
uses: appleboy/ssh-action@v1 uses: appleboy/ssh-action@v0.1.8
with: with:
host: ${{env.DEPLOY_HOST}} host: ${{env.DEPLOY_HOST}}
username: frappet username: frappet

View file

@ -1,9 +1,9 @@
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]+" - "placement-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

View file

@ -1,9 +1,9 @@
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]+" - "reportv2-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch: workflow_dispatch:
env: env:
REGISTRY: docker.frappet.com REGISTRY: docker.frappet.com

6
.gitignore vendored
View file

@ -374,9 +374,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/

29
.vscode/launch.json vendored
View file

@ -10,34 +10,9 @@
"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,
// 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"
}
},
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
"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, "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": {

View file

@ -53,7 +53,6 @@ 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>();
@ -61,8 +60,6 @@ namespace BMA.EHR.Application
services.AddTransient<MinIOLeaveService>(); services.AddTransient<MinIOLeaveService>();
services.AddTransient<LeaveProcessJobStatusRepository>();
return services; return services;
} }

View file

@ -919,7 +919,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -934,7 +934,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -986,7 +986,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1001,7 +1001,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -1423,7 +1423,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1440,7 +1440,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -1534,7 +1534,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1550,7 +1550,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -1603,7 +1603,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1832,7 +1832,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1849,7 +1849,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -1905,7 +1905,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1922,7 +1922,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -1978,7 +1978,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -1995,7 +1995,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -2051,7 +2051,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2068,7 +2068,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -2124,7 +2124,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2141,7 +2141,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -2197,7 +2197,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2214,7 +2214,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -2270,7 +2270,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2287,7 +2287,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -2340,7 +2340,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2355,7 +2355,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -2409,7 +2409,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2462,7 +2462,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2515,7 +2515,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2568,7 +2568,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2621,7 +2621,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2673,7 +2673,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2725,7 +2725,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -2994,7 +2994,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -3046,7 +3046,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
foreach (var edu in placementProfile.PlacementEducations) foreach (var edu in placementProfile.PlacementEducations)
{ {
var _res = await client.PostAsJsonAsync(apiUrlEdu, new var _res = await client.PostAsJsonAsync(apiUrlEdu, new
@ -3083,7 +3083,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
foreach (var cer in placementProfile.PlacementCertificates) foreach (var cer in placementProfile.PlacementCertificates)
{ {
var _res = await client.PostAsJsonAsync(apiUrlCer, new var _res = await client.PostAsJsonAsync(apiUrlCer, new
@ -3104,7 +3104,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
profileId = profileId, profileId = profileId,
@ -3135,7 +3135,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -3287,7 +3287,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -3319,7 +3319,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -3468,7 +3468,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -3500,7 +3500,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -3649,7 +3649,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -3681,7 +3681,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -3832,7 +3832,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -3864,7 +3864,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -4017,7 +4017,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -4049,7 +4049,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -4199,7 +4199,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -4231,7 +4231,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -4382,7 +4382,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -4409,7 +4409,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlLeave); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlLeave);
string? _null = null; string? _null = null;
var _res = await client.PostAsJsonAsync(apiUrlLeave, new var _res = await client.PostAsJsonAsync(apiUrlLeave, new
@ -4560,7 +4560,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -4587,7 +4587,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlLeave); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlLeave);
string? _null = null; string? _null = null;
var _res = await client.PostAsJsonAsync(apiUrlLeave, new var _res = await client.PostAsJsonAsync(apiUrlLeave, new
@ -4928,7 +4928,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -5085,7 +5085,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -5262,7 +5262,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -5440,7 +5440,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -5472,7 +5472,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -5626,7 +5626,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -5805,7 +5805,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -5986,7 +5986,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -6001,7 +6001,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -6182,7 +6182,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -6197,7 +6197,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -6371,7 +6371,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -6452,7 +6452,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, _apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, _apiUrl);
var res = await client.PostAsJsonAsync(_apiUrl, new { result = dataSend }); var res = await client.PostAsJsonAsync(_apiUrl, new { result = dataSend });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -6549,7 +6549,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
{ {
@ -6630,7 +6630,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, _apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, _apiUrl);
var res = await client.PostAsJsonAsync(_apiUrl, new { result = dataSend }); var res = await client.PostAsJsonAsync(_apiUrl, new { result = dataSend });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -6719,7 +6719,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -6877,7 +6877,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -6906,7 +6906,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -7062,7 +7062,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Put, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Put, apiUrl);
var _res = await client.PutAsJsonAsync(apiUrl, new var _res = await client.PutAsJsonAsync(apiUrl, new
{ {
@ -7215,7 +7215,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -7244,7 +7244,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlOrg);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
@ -7385,7 +7385,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -7411,7 +7411,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -7544,7 +7544,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -7570,7 +7570,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -7704,7 +7704,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -7730,7 +7730,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -7864,7 +7864,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -7890,7 +7890,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -8024,7 +8024,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -8050,7 +8050,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -8184,7 +8184,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -8210,7 +8210,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -8344,7 +8344,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -8370,7 +8370,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -8504,7 +8504,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -8530,7 +8530,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl2);
var _res = await client.PostAsJsonAsync(apiUrl2, new var _res = await client.PostAsJsonAsync(apiUrl2, new
{ {
@ -8663,7 +8663,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -8806,7 +8806,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -8949,7 +8949,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -9091,7 +9091,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -9234,7 +9234,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
var res = await client.PostAsJsonAsync(apiUrl, new { result = data }); var res = await client.PostAsJsonAsync(apiUrl, new { result = data });
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -9612,7 +9612,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrl);
string? _null = null; string? _null = null;
var _res = await client.PostAsJsonAsync(apiUrl, new var _res = await client.PostAsJsonAsync(apiUrl, new
@ -9628,7 +9628,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary); var _req = new HttpRequestMessage(HttpMethod.Post, apiUrlSalary);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
@ -11388,7 +11388,7 @@ namespace BMA.EHR.Application.Repositories.Commands
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
foreach (var insignia in Insignias) foreach (var insignia in Insignias)
{ {
var _res = await client.PostAsJsonAsync(apiUrlInsig, new var _res = await client.PostAsJsonAsync(apiUrlInsig, new

View file

@ -49,7 +49,7 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = cronjobNoti.DisciplineComplaint_Profiles.Select(x => x.PersonId), refId = cronjobNoti.DisciplineComplaint_Profiles.Select(x => x.PersonId),
@ -91,7 +91,7 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = cronjobNoti.DisciplineInvestigate_ProfileComplaints.Select(x => x.PersonId), refId = cronjobNoti.DisciplineInvestigate_ProfileComplaints.Select(x => x.PersonId),
@ -132,7 +132,7 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = cronjobNoti.DisciplineDisciplinary_ProfileComplaintInvestigates.Select(x => x.PersonId), refId = cronjobNoti.DisciplineDisciplinary_ProfileComplaintInvestigates.Select(x => x.PersonId),

View file

@ -53,18 +53,15 @@ namespace BMA.EHR.Application.Repositories
#region " For Call External API " #region " For Call External API "
protected async Task<string> GetExternalAPIAsync(string apiPath, string accessToken, string apiKey, CancellationToken cancellationToken = default) protected async Task<string> GetExternalAPIAsync(string apiPath, string accessToken, string apiKey)
{ {
try try
{ {
// กำหนด timeout เป็น 30 นาที
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", apiKey); client.DefaultRequestHeaders.Add("api_key", apiKey);
var _res = await client.GetAsync(apiPath,cancellationToken: combinedCts.Token); var _res = await client.GetAsync(apiPath);
if (_res.IsSuccessStatusCode) if (_res.IsSuccessStatusCode)
{ {
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -80,13 +77,10 @@ namespace BMA.EHR.Application.Repositories
} }
} }
protected async Task<string> SendExternalAPIAsync(HttpMethod method, string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default) protected async Task<string> SendExternalAPIAsync(HttpMethod method, string apiPath, string accessToken, object? body, string apiKey)
{ {
try try
{ {
// กำหนด timeout เป็น 30 นาที
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
// สร้าง request message // สร้าง request message
var request = new HttpRequestMessage(method, apiPath); var request = new HttpRequestMessage(method, apiPath);
@ -97,8 +91,8 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", apiKey); client.DefaultRequestHeaders.Add("api_key", apiKey);
var _res = await client.SendAsync(request, combinedCts.Token); var _res = await client.SendAsync(request);
if (_res.IsSuccessStatusCode) if (_res.IsSuccessStatusCode)
{ {
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -115,13 +109,10 @@ namespace BMA.EHR.Application.Repositories
} }
public async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default) protected async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey)
{ {
try 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 json = JsonConvert.SerializeObject(body);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json"); var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
//stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); //stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
@ -129,8 +120,8 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", apiKey); client.DefaultRequestHeaders.Add("api_key", apiKey);
var _res = await client.PostAsync(apiPath, stringContent, combinedCts.Token); var _res = await client.PostAsync(apiPath, stringContent);
if (_res.IsSuccessStatusCode) if (_res.IsSuccessStatusCode)
{ {
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -146,13 +137,10 @@ namespace BMA.EHR.Application.Repositories
} }
} }
protected async Task<bool> PostExternalAPIBooleanAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default) protected async Task<bool> PostExternalAPIBooleanAsync(string apiPath, string accessToken, object? body, string apiKey)
{ {
try 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 json = JsonConvert.SerializeObject(body);
var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json"); var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
@ -160,8 +148,8 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", apiKey); client.DefaultRequestHeaders.Add("api_key", apiKey);
var _res = await client.PostAsync(apiPath, stringContent, combinedCts.Token); var _res = await client.PostAsync(apiPath, stringContent);
return _res.IsSuccessStatusCode; return _res.IsSuccessStatusCode;
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -2,11 +2,8 @@
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.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
{ {
@ -46,38 +43,6 @@ namespace BMA.EHR.Application.Repositories.Leaves
#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 +68,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)

View file

@ -1,7 +1,6 @@
using Amazon.S3.Model; using Amazon.S3.Model;
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.Responses.Profiles;
using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Extensions;
using BMA.EHR.Domain.Models.Leave.Commons; using BMA.EHR.Domain.Models.Leave.Commons;
using BMA.EHR.Domain.Models.Leave.Requests; using BMA.EHR.Domain.Models.Leave.Requests;
@ -9,7 +8,6 @@ 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 System.Collections.Concurrent;
namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
{ {
@ -24,12 +22,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly EmailSenderService _emailSenderService; 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 #endregion
#region " Constructor and Destuctor " #region " Constructor and Destuctor "
@ -86,8 +78,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
public async Task UpdateLeaveUsageAsync(int year, Guid typeId, Guid userId, double day) public async Task UpdateLeaveUsageAsync(int year, Guid typeId, Guid userId, double day)
{ {
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken); var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
if (pf == null) if (pf == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -97,7 +88,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Include(x => x.LeaveType) .Include(x => x.LeaveType)
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id); .FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id);
if (data == null) if(data == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
} }
@ -106,408 +97,23 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await _dbContext.SaveChangesAsync(); await _dbContext.SaveChangesAsync();
} }
public async Task UpdateLeaveCountAsync(int year, Guid typeId, Guid userId, int count)
public async Task<LeaveBeginning?> GetByYearAndTypeIdForUserAsync(int year, Guid typeId, Guid userId)
{ {
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken); var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
if (pf == null) if (pf == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); 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 data = await _dbContext.Set<LeaveBeginning>() var data = await _dbContext.Set<LeaveBeginning>()
.Include(x => x.LeaveType) .Include(x => x.LeaveType)
.FirstOrDefaultAsync(x => x.LeaveYear == year && x.LeaveTypeId == typeId && x.ProfileId == pf.Id); .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) if (data == null)
{ {
var limit = 0.0; var limit = 0.0;
@ -519,7 +125,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
var prevRemain = 0.0; var prevRemain = 0.0;
if (prev != null) if (prev != null)
{ {
prevRemain = prev.LeaveDays - (prev.LeaveDaysUsed ?? 0.0); prevRemain = prev.LeaveDays - prev.LeaveDaysUsed;
} }
if (govAge >= 180) if (govAge >= 180)
@ -549,39 +155,15 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
FirstName = pf.FirstName, FirstName = pf.FirstName,
LastName = pf.LastName, LastName = pf.LastName,
LeaveDaysUsed = 0, LeaveDaysUsed = 0,
LeaveDays = leaveType?.Code == "LV-005" ? limit : 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); _dbContext.Set<LeaveBeginning>().Add(data);
}
result.Add(data);
}
if (!updateList.Any())
{
await _dbContext.Set<LeaveBeginning>().AddRangeAsync(updateList);
await _dbContext.SaveChangesAsync(); await _dbContext.SaveChangesAsync();
} }
return result;
} return data;
} }
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;
} }
} }

View file

@ -8,11 +8,8 @@ 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 System.IO.Compression;
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Net.Http.Json; using System.Net.Http.Json;
using BMA.EHR.Application.Repositories.Leaves.TimeAttendants;
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
{ {
@ -31,7 +28,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
private readonly MinIOLeaveService _minIOService; private readonly MinIOLeaveService _minIOService;
private readonly LeaveBeginningRepository _leaveBeginningRepository; private readonly LeaveBeginningRepository _leaveBeginningRepository;
private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository;
private readonly string URL = string.Empty; private readonly string URL = string.Empty;
@ -47,8 +43,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
EmailSenderService emailSenderService, EmailSenderService emailSenderService,
IApplicationDBContext appDbContext, IApplicationDBContext appDbContext,
MinIOLeaveService minIOService, MinIOLeaveService minIOService,
LeaveBeginningRepository leaveBeginningRepository, LeaveBeginningRepository leaveBeginningRepository) : base(dbContext, httpContextAccessor)
ProcessUserTimeStampRepository processUserTimeStampRepository) : base(dbContext, httpContextAccessor)
{ {
_dbContext = dbContext; _dbContext = dbContext;
_httpContextAccessor = httpContextAccessor; _httpContextAccessor = httpContextAccessor;
@ -62,7 +57,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
Console.WriteLine($"URL : {URL}"); Console.WriteLine($"URL : {URL}");
_minIOService = minIOService; _minIOService = minIOService;
_leaveBeginningRepository = leaveBeginningRepository; _leaveBeginningRepository = leaveBeginningRepository;
_processUserTimeStampRepository = processUserTimeStampRepository;
} }
#endregion #endregion
@ -258,8 +252,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
public async Task<List<LeaveRequest>> GetLeaveRequestByYearAsync(int year, Guid userId) public async Task<List<LeaveRequest>> GetLeaveRequestByYearAsync(int year, Guid userId)
{ {
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken);
if (profile == null) if (profile == null)
{ {
@ -280,57 +273,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
return data; return data;
} }
public async Task<List<LeaveRequest>> GetLeaveRequestByYearForAdminAsync(int year, string role, string? nodeId, int? node)
{
var rawData = _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.LeaveStatus != "REJECT" && x.LeaveStatus != "DELETE");
//.ToListAsync();
if (year != 0)
{
var startFiscalDate = new DateTime(year - 1, 10, 1);
var endFiscalDate = new DateTime(year, 9, 30);
rawData = rawData.Where(x => x.LeaveStartDate.Date >= startFiscalDate && x.LeaveStartDate.Date <= endFiscalDate);
}
if (role == "OWNER")
{
node = null;
}
if (role == "OWNER" || role == "CHILD")
{
rawData = rawData
.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))))));
}
else if (role == "BROTHER")
{
rawData = rawData
.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)))));
}
else if (role == "ROOT")
{
rawData = rawData
.Where(x => x.RootDnaId == Guid.Parse(nodeId!));
}
// else if (role == "PARENT")
// {
// rawData = rawData
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null);
// }
else if (role == "NORMAL")
{
rawData = rawData
.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);
}
return await rawData.ToListAsync();
}
public async Task<List<LeaveRequest>> GetLeaveRequestByUserIdAsync(Guid keycloakUserId, int year, Guid type, string status) public async Task<List<LeaveRequest>> GetLeaveRequestByUserIdAsync(Guid keycloakUserId, int year, Guid type, string status)
{ {
var rawData = _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking() var rawData = _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
@ -338,12 +280,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Where(x => x.KeycloakUserId == keycloakUserId); .Where(x => x.KeycloakUserId == keycloakUserId);
if (year != 0) if (year != 0)
{ rawData = rawData.Where(x => x.LeaveStartDate.Year == year);
var startFiscalDate = new DateTime(year - 1, 10, 1);
var endFiscalDate = new DateTime(year, 9, 30);
rawData = rawData.Where(x => x.LeaveStartDate.Date >= startFiscalDate && x.LeaveStartDate.Date <= endFiscalDate);
}
//rawData = rawData.Where(x => x.LeaveStartDate.Year == year);
if (type != Guid.Empty) if (type != Guid.Empty)
rawData = rawData.Where(x => x.Type.Id == type); rawData = rawData.Where(x => x.Type.Id == type);
@ -359,7 +296,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
var rawData = _dbContext.Set<LeaveRequest>().AsNoTracking() var rawData = _dbContext.Set<LeaveRequest>().AsNoTracking()
.Include(x => x.Type) .Include(x => x.Type)
.Where(x => x.LeaveStatus != "DRAFT") .Where(x => x.LeaveStatus != "DRAFT")
.OrderByDescending(x => (x.DateSendLeave ?? x.CreatedAt)) .OrderByDescending(x => x.CreatedAt)
.AsQueryable(); .AsQueryable();
if (year != 0) if (year != 0)
@ -385,15 +322,11 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
var rawData = _dbContext.Set<LeaveRequest>().AsNoTracking() var rawData = _dbContext.Set<LeaveRequest>().AsNoTracking()
.Include(x => x.Type) .Include(x => x.Type)
.Where(x => x.LeaveStatus != "DRAFT") .Where(x => x.LeaveStatus != "DRAFT")
.OrderByDescending(x => (x.DateSendLeave ?? x.CreatedAt)) .OrderByDescending(x => x.CreatedAt)
.AsQueryable(); .AsQueryable();
// fix issue : 1830
if (year != 0) if (year != 0)
{ rawData = rawData.Where(x => x.LeaveStartDate.Year == year);
var startFiscalDate = new DateTime(year - 1, 10, 1);
var endFiscalDate = new DateTime(year, 9, 30);
rawData = rawData.Where(x => x.LeaveStartDate >= startFiscalDate && x.LeaveStartDate <= endFiscalDate);
}
if (type != Guid.Empty) if (type != Guid.Empty)
rawData = rawData.Where(x => x.Type.Id == type); rawData = rawData.Where(x => x.Type.Id == type);
@ -416,30 +349,15 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
rawData = rawData rawData = rawData
.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)))))); .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))))));
} }
else if (role == "BROTHER")
{
rawData = rawData
.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)))));
}
else if (role == "ROOT") else if (role == "ROOT")
{ {
rawData = rawData rawData = rawData
.Where(x => x.RootDnaId == Guid.Parse(nodeId!)); .Where(x => x.RootDnaId == Guid.Parse(nodeId!));
} }
// else if (role == "PARENT")
// {
// rawData = rawData
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null);
// }
else if (role == "NORMAL") else if (role == "NORMAL")
{ {
rawData = rawData rawData = rawData
.Where(x => .Where(x => node == 0 ? x.Child1DnaId == null : (node == 1 ? x.Child2DnaId == null : (node == 2 ? x.Child3DnaId == null : (node == 3 ? x.Child4DnaId == null : true))));
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);
} }
@ -452,7 +370,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Include(x => x.Type) .Include(x => x.Type)
.Where(x => keycloakIdList.Contains(x.KeycloakUserId)) .Where(x => keycloakIdList.Contains(x.KeycloakUserId))
.Where(x => x.LeaveStatus != "DRAFT") .Where(x => x.LeaveStatus != "DRAFT")
.OrderByDescending(x =>(x.DateSendLeave ?? x.CreatedAt)) .OrderByDescending(x => x.CreatedAt)
.AsQueryable(); .AsQueryable();
if (year != 0) if (year != 0)
@ -501,8 +419,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
public async Task<double> GetSumLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year) public async Task<double> GetSumLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year)
{ {
// var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(keycloakUserId, AccessToken); var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(keycloakUserId, AccessToken);
var pf = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(keycloakUserId, AccessToken);
if (pf == null) if (pf == null)
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -527,7 +444,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
//.Where(x => x.LeaveStatus != "REJECT" && x.LeaveStatus != "DELETE") //.Where(x => x.LeaveStatus != "REJECT" && x.LeaveStatus != "DELETE")
.ToListAsync(); .ToListAsync();
return data.Sum(x => x.LeaveTotal) + (beginningLeave == null ? 0 : (beginningLeave.LeaveDaysUsed ?? 0.0)); return data.Sum(x => x.LeaveTotal) + (beginningLeave == null ? 0 : beginningLeave.LeaveDaysUsed);
} }
//public async Task<double> GetSumApproveLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year) //public async Task<double> GetSumApproveLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year)
@ -558,12 +475,11 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
return data; return data;
} }
public async Task<LeaveRequest?> GetLastLeaveRequestByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, DateTime beforeDate) public async Task<LeaveRequest?> GetLastLeaveRequestByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId,DateTime beforeDate)
{ {
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking() var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type) .Include(x => x.Type)
.Where(x => x.LeaveStartDate.Date < beforeDate.Date) .Where(x => x.LeaveStartDate.Date < beforeDate.Date)
//.Where(x => x.CreatedAt < beforeDate)
.Where(x => x.KeycloakUserId == keycloakUserId) .Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId) .Where(x => x.Type.Id == leaveTypeId)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING") .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
@ -574,22 +490,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
return data; return data;
} }
public async Task<LeaveRequest?> GetLastLeaveRequestByTypeForUserAsync2(Guid keycloakUserId, Guid leaveTypeId, DateTime beforeDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
//.Where(x => x.LeaveStartDate.Date < beforeDate.Date)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < beforeDate)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
//.Where(x => x.LeaveStatus != "REJECT" && x.LeaveStatus != "DELETE")
.OrderByDescending(x => (x.DateSendLeave ?? x.CreatedAt))
.FirstOrDefaultAsync();
return data;
}
public async Task<List<LeaveRequest>> GetCancelLeaveRequestForAdminAsync(int year, Guid type, string status, string role, string? nodeId, int? node) public async Task<List<LeaveRequest>> GetCancelLeaveRequestForAdminAsync(int year, Guid type, string status, string role, string? nodeId, int? node)
{ {
var rawData = _dbContext.Set<LeaveRequest>().AsNoTracking() var rawData = _dbContext.Set<LeaveRequest>().AsNoTracking()
@ -597,14 +497,8 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Where(x => x.LeaveStatus == "DELETE" || x.LeaveStatus == "DELETING") .Where(x => x.LeaveStatus == "DELETE" || x.LeaveStatus == "DELETING")
.AsQueryable(); .AsQueryable();
// if (year != 0)
// rawData = rawData.Where(x => x.LeaveStartDate.Year == year);
if (year != 0) if (year != 0)
{ rawData = rawData.Where(x => x.LeaveStartDate.Year == year);
var startFiscalDate = new DateTime(year - 1, 10, 1);
var endFiscalDate = new DateTime(year, 9, 30);
rawData = rawData.Where(x => x.LeaveStartDate.Date >= startFiscalDate && x.LeaveStartDate.Date <= endFiscalDate);
}
if (type != Guid.Empty) if (type != Guid.Empty)
rawData = rawData.Where(x => x.Type.Id == type); rawData = rawData.Where(x => x.Type.Id == type);
@ -622,30 +516,15 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
rawData = rawData rawData = rawData
.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)))))); .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))))));
} }
else if (role == "BROTHER")
{
rawData = rawData
.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)))));
}
else if (role == "ROOT") else if (role == "ROOT")
{ {
rawData = rawData rawData = rawData
.Where(x => x.RootDnaId == Guid.Parse(nodeId!)); .Where(x => x.RootDnaId == Guid.Parse(nodeId!));
} }
// else if (role == "PARENT")
// {
// rawData = rawData
// .Where(x => x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId != null);
// }
else if (role == "NORMAL") else if (role == "NORMAL")
{ {
rawData = rawData rawData = rawData
.Where(x => .Where(x => node == 0 ? x.Child1DnaId == null : (node == 1 ? x.Child2DnaId == null : (node == 2 ? x.Child3DnaId == null : (node == 3 ? x.Child4DnaId == null : true))));
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);
} }
return await rawData.ToListAsync(); return await rawData.ToListAsync();
@ -655,8 +534,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
{ {
try try
{ {
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken ?? ""); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken ?? "");
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(data.KeycloakUserId, AccessToken ?? "");
if (profile == null) if (profile == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -673,24 +551,14 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
// TODO : Update ไปตาราง beginning // TODO : Update ไปตาราง beginning
if (data.ApproveStep == "st4") // ถ้ามีการอนุมัติจากผู้มีอำนาจแล้ว if (data.ApproveStep == "st4") // ถ้ามีการอนุมัติจากผู้มีอำนาจแล้ว
{ {
await _leaveBeginningRepository.UpdateLeaveUsageAsync(data.LeaveStartDate.Year, data.Type.Id, data.KeycloakUserId, -1 * data.LeaveTotal);
var toDay = data.LeaveStartDate.Date;
var thisYear = data.LeaveStartDate.Year;
if (toDay >= new DateTime(thisYear, 10, 1) && toDay <= new DateTime(thisYear, 12, 31))
{
thisYear = thisYear + 1;
}
await _leaveBeginningRepository.UpdateLeaveUsageAsync(thisYear, data.Type.Id, data.KeycloakUserId, -1 * data.LeaveTotal);
// update leave count ลดลง 1 ครั้ง
await _leaveBeginningRepository.UpdateLeaveCountAsync(thisYear, data.Type.Id, data.KeycloakUserId, -1);
var _baseAPI = _configuration["API"]; var _baseAPI = _configuration["API"];
var apiUrlSalary = $"{_baseAPI}/org/profile/leave/cancel/{data.Id}"; var apiUrlSalary = $"{_baseAPI}/org/profile/leave/cancel/{data.Id}";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var request = new HttpRequestMessage(HttpMethod.Patch, apiUrlSalary); var request = new HttpRequestMessage(HttpMethod.Patch, apiUrlSalary);
@ -732,8 +600,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
} }
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken ?? ""); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken ?? "");
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(rawData.KeycloakUserId, AccessToken ?? "");
if (profile == null) if (profile == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -749,24 +616,14 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
// TODO : Update ไปตาราง beginning // TODO : Update ไปตาราง beginning
if (rawData.ApproveStep == "st4") // ถ้ามีการอนุมัติจากผู้มีอำนาจแล้ว if (rawData.ApproveStep == "st4") // ถ้ามีการอนุมัติจากผู้มีอำนาจแล้ว
{ {
await _leaveBeginningRepository.UpdateLeaveUsageAsync(rawData.LeaveStartDate.Year, rawData.Type.Id, rawData.KeycloakUserId, -1 * rawData.LeaveTotal);
var toDay = rawData.LeaveStartDate.Date;
var thisYear = rawData.LeaveStartDate.Year;
if (toDay >= new DateTime(thisYear, 10, 1) && toDay <= new DateTime(thisYear, 12, 31))
{
thisYear = thisYear + 1;
}
await _leaveBeginningRepository.UpdateLeaveUsageAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId, -1 * rawData.LeaveTotal);
// update leave count ลดลง 1 ครั้ง
await _leaveBeginningRepository.UpdateLeaveCountAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId, -1);
var _baseAPI = _configuration["API"]; var _baseAPI = _configuration["API"];
var apiUrlSalary = $"{_baseAPI}/org/profile/leave/cancel/{rawData.Id}"; var apiUrlSalary = $"{_baseAPI}/org/profile/leave/cancel/{rawData.Id}";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var request = new HttpRequestMessage(HttpMethod.Patch, apiUrlSalary); var request = new HttpRequestMessage(HttpMethod.Patch, apiUrlSalary);
@ -795,7 +652,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.OrderBy(x => x.Seq) .OrderBy(x => x.Seq)
.ToList(); .ToList();
foreach (var commander in commanders) foreach(var commander in commanders)
{ {
var noti1 = new Notification var noti1 = new Notification
{ {
@ -821,8 +678,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
} }
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken ?? ""); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken ?? "");
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(rawData.KeycloakUserId, AccessToken ?? "");
if (profile == null) if (profile == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -909,7 +765,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
rawData.LeaveStatus = "NEW"; rawData.LeaveStatus = "NEW";
rawData.DateSendLeave = DateTime.Now; // Update วันที่ยื่นลาเป็นวันที่ปัจจุบัน
//rawData.ApproveStep = "st2"; //rawData.ApproveStep = "st2";
await UpdateAsync(rawData); await UpdateAsync(rawData);
@ -933,10 +788,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Where(x => x.ApproveType!.ToUpper() == "COMMANDER") .Where(x => x.ApproveType!.ToUpper() == "COMMANDER")
.OrderBy(x => x.Seq) .OrderBy(x => x.Seq)
.FirstOrDefault(); .FirstOrDefault();
// fix: If no commander, skip notification
if (firstCommander != null)
{
// Send Notification // Send Notification
var noti1 = new Notification var noti1 = new Notification
{ {
@ -946,27 +797,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
Payload = $"{URL}/leave/detail/{id}", Payload = $"{URL}/leave/detail/{id}",
}; };
_appDbContext.Set<Notification>().Add(noti1); _appDbContext.Set<Notification>().Add(noti1);
}
else
{
// มีแต่ approver อย่างเดียว
var firstApprover = rawData.Approvers
.Where(x => x.ApproveType!.ToUpper() == "APPROVER")
.OrderBy(x => x.Seq)
.FirstOrDefault();
if(firstApprover != null)
{
// Send Notification
var noti2 = new Notification
{
Body = $"การขอลาของคุณ {rawData.FirstName} {rawData.LastName} รอรับการอนุมัติจากคุณ",
ReceiverUserId = firstApprover!.ProfileId,
Type = "",
Payload = $"{URL}/leave/detail/{id}",
};
_appDbContext.Set<Notification>().Add(noti2);
}
}
await _appDbContext.SaveChangesAsync(); await _appDbContext.SaveChangesAsync();
} }
@ -1036,9 +866,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
approver.ApproveStatus = "APPROVE"; approver.ApproveStatus = "APPROVE";
approver.Comment = reason; approver.Comment = reason;
approver.LastUpdateFullName = FullName ?? "";
approver.LastUpdateUserId = userId.ToString("D");
approver.LastUpdatedAt = DateTime.Now;
//await _dbContext.SaveChangesAsync(); //await _dbContext.SaveChangesAsync();
if (approver.Seq != maxSeq) if (approver.Seq != maxSeq)
@ -1128,9 +956,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
approver.ApproveStatus = "REJECT"; approver.ApproveStatus = "REJECT";
approver.Comment = reason; approver.Comment = reason;
approver.LastUpdateFullName = FullName ?? "";
approver.LastUpdateUserId = userId.ToString("D");
approver.LastUpdatedAt = DateTime.Now;
if (approver.Seq != maxSeq) if (approver.Seq != maxSeq)
{ {
@ -1188,18 +1014,10 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
} }
// ถ้าไม่มี commander ข้ามไปเช็ค approver ได้เลย
var commanders = rawData.Approvers
.Where(x => x.ApproveType!.ToUpper() == "COMMANDER")
.OrderBy(x => x.Seq)
.ToList();
if (commanders.Count > 0 && commanders != null)
{
if (rawData.ApproveStep != "st3") if (rawData.ApproveStep != "st3")
{ {
throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
} }
}
// check commander approve // check commander approve
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList(); var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
@ -1226,9 +1044,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
approver.ApproveStatus = "APPROVE"; approver.ApproveStatus = "APPROVE";
approver.Comment = reason; approver.Comment = reason;
approver.LastUpdateFullName = FullName ?? "";
approver.LastUpdateUserId = userId.ToString("D");
approver.LastUpdatedAt = DateTime.Now;
if (approver.Seq != maxSeq) if (approver.Seq != maxSeq)
{ {
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
@ -1247,8 +1063,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
} }
else else
{ {
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken);
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(rawData.KeycloakUserId, AccessToken);
if (profile == null) if (profile == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -1260,17 +1075,8 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await UpdateWithTrackingAsync(rawData); await UpdateWithTrackingAsync(rawData);
var toDay = rawData.LeaveStartDate.Date;
var thisYear = rawData.LeaveStartDate.Year;
if (toDay >= new DateTime(thisYear, 10, 1) && toDay <= new DateTime(thisYear, 12, 31))
{
thisYear = thisYear + 1;
}
// TODO : Update ไปตาราง beginning // TODO : Update ไปตาราง beginning
await _leaveBeginningRepository.UpdateLeaveUsageAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId, rawData.LeaveTotal); await _leaveBeginningRepository.UpdateLeaveUsageAsync(rawData.LeaveStartDate.Year, rawData.Type.Id, rawData.KeycloakUserId, rawData.LeaveTotal);
// update leave count เพิ่มขึ้น 1 ครั้ง
await _leaveBeginningRepository.UpdateLeaveCountAsync(thisYear, rawData.Type.Id, rawData.KeycloakUserId, 1);
var _baseAPI = _configuration["API"]; var _baseAPI = _configuration["API"];
@ -1281,7 +1087,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
profileId = profile.Id, profileId = profile.Id,
@ -1294,8 +1100,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
status = "approve", status = "approve",
reason = rawData.LeaveDetail, reason = rawData.LeaveDetail,
leaveId = rawData.Id, leaveId = rawData.Id,
leaveSubTypeName = rawData.LeaveSubTypeName,
coupleDayLevelCountry = rawData.CoupleDayLevelCountry,
}); });
// var _result = await _res.Content.ReadAsStringAsync(); // var _result = await _res.Content.ReadAsStringAsync();
} }
@ -1306,7 +1110,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlSalary, new var _res = await client.PostAsJsonAsync(apiUrlSalary, new
{ {
profileEmployeeId = profile.Id, profileEmployeeId = profile.Id,
@ -1319,8 +1123,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
status = "approve", status = "approve",
reason = rawData.LeaveDetail, reason = rawData.LeaveDetail,
leaveId = rawData.Id, leaveId = rawData.Id,
leaveSubTypeName = rawData.LeaveSubTypeName,
coupleDayLevelCountry = rawData.CoupleDayLevelCountry,
}); });
} }
} }
@ -1330,68 +1132,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
} }
await _appDbContext.SaveChangesAsync(); await _appDbContext.SaveChangesAsync();
// ปรับสถานะการลงเวลา // insert to process timestamp
if (rawData.LeaveStartDate.Date == rawData.LeaveEndDate.Date)
{
var processCheckIn = await _dbContext.Set<ProcessUserTimeStamp>()
.Where(x => x.KeycloakUserId == rawData.KeycloakUserId)
.Where(x => x.CheckIn.Date == rawData.LeaveStartDate.Date)
.FirstOrDefaultAsync();
if (processCheckIn is not null)
{
switch (rawData.LeaveRange.Trim().ToUpper())
{
case "MORNING":
processCheckIn.CheckInStatus = "NORMAL";
break;
case "AFTERNOON":
processCheckIn.CheckOutStatus = "NORMAL";
break;
case "ALL":
processCheckIn.CheckInStatus = "NORMAL";
processCheckIn.CheckOutStatus = "NORMAL";
break;
default:
break;
}
}
await _dbContext.SaveChangesAsync();
}
else
{
var from = rawData.LeaveStartDate.Date;
var to = rawData.LeaveEndDate.Date;
for (var day = from.Date; day <= to.Date; day = day.AddDays(1))
{
var processCheckIn = await _dbContext.Set<ProcessUserTimeStamp>()
.Where(x => x.KeycloakUserId == rawData.KeycloakUserId)
.Where(x => x.CheckIn.Date == day.Date)
.FirstOrDefaultAsync();
if (processCheckIn is not null)
{
switch (rawData.LeaveRange.Trim().ToUpper())
{
case "MORNING":
processCheckIn.CheckInStatus = "NORMAL";
break;
case "AFTERNOON":
processCheckIn.CheckOutStatus = "NORMAL";
break;
case "ALL":
processCheckIn.CheckInStatus = "NORMAL";
processCheckIn.CheckOutStatus = "NORMAL";
break;
default:
break;
}
}
}
await _dbContext.SaveChangesAsync();
}
// Send Noti // Send Noti
var noti = new Notification var noti = new Notification
{ {
@ -1417,18 +1160,10 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
} }
// ถ้าไม่มี commander ข้ามไปเช็ค approver ได้เลย
var commanders = rawData.Approvers
.Where(x => x.ApproveType!.ToUpper() == "COMMANDER")
.OrderBy(x => x.Seq)
.ToList();
if (commanders.Count > 0 && commanders != null)
{
if (rawData.ApproveStep != "st3") if (rawData.ApproveStep != "st3")
{ {
throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้"); throw new Exception("คำขอนี้ยังไม่ได้อยู่ในขั้นตอนที่สามารถอนุมัติได้ ไม่สามารถทำรายการได้");
} }
}
// check commander approve // check commander approve
var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList(); var approvers = rawData.Approvers.Where(x => x.ApproveType!.ToUpper() == "APPROVER").OrderBy(x => x.Seq).ToList();
@ -1455,9 +1190,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
approver.ApproveStatus = "REJECT"; approver.ApproveStatus = "REJECT";
approver.Comment = reason; approver.Comment = reason;
approver.LastUpdateFullName = FullName ?? "";
approver.LastUpdateUserId = userId.ToString("D");
approver.LastUpdatedAt = DateTime.Now;
if (approver.Seq != maxSeq) if (approver.Seq != maxSeq)
{ {
var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1); var nextApprover = approvers.FirstOrDefault(x => x.Seq == approver.Seq + 1);
@ -1476,8 +1209,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
} }
else else
{ {
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(rawData.KeycloakUserId, AccessToken);
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(rawData.KeycloakUserId, AccessToken);
if (profile == null) if (profile == null)
{ {
throw new Exception(GlobalMessages.DataNotFound); throw new Exception(GlobalMessages.DataNotFound);
@ -1550,7 +1282,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
KeycloakUserId = pf.Keycloak == null ? Guid.Empty : pf.Keycloak.Value, KeycloakUserId = pf.Keycloak == null ? Guid.Empty : pf.Keycloak.Value,
LeaveTypeId = b.LeaveTypeId, LeaveTypeId = b.LeaveTypeId,
LeaveTypeCode = b.LeaveType!.Code, LeaveTypeCode = b.LeaveType!.Code,
SumLeaveDay = b.LeaveDaysUsed ?? 0.0 SumLeaveDay = b.LeaveDaysUsed
}); });
} }
} }
@ -1722,24 +1454,47 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
KeycloakUserId = grp.Key.KeycloakUserId, KeycloakUserId = grp.Key.KeycloakUserId,
LeaveTypeId = grp.Key.LeaveTypeId, LeaveTypeId = grp.Key.LeaveTypeId,
LeaveTypeCode = grp.Key.LeaveTypeCode, LeaveTypeCode = grp.Key.LeaveTypeCode,
SumLeaveDay = grp.Sum(x => x.LeaveTotal), SumLeaveDay = grp.Sum(x => x.LeaveTotal)
CountLeaveDay = grp.Count()
}) })
.ToList(); .ToList();
return res; return res;
} }
public async Task<List<GetSumApproveLeaveByRootDto>> GetSumApproveLeaveByRootAndRange(DateTime startDate, DateTime endDate, string type, string role, string? nodeId, int? node, string? nodeIdByReq, int? nodeByReq) public async Task<List<GetSumApproveLeaveByRootDto>> GetSumApproveLeaveByRootAndRange(DateTime startDate, DateTime endDate, string type, string role, string? nodeId, int? node)
{ {
// var _nodeId = Guid.Parse(nodeId);
var data = new List<LeaveRequest>(); var data = new List<LeaveRequest>();
//if (role == "OWNER" || role == "CHILD")
//{
// data = await _dbContext.Set<LeaveRequest>().AsQueryable()
// .Include(x => x.Type)
// .Where(x => x.ProfileType == type.Trim().ToUpper())
// .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
// .Where(x => node == 4 ? x.Child4Id == Guid.Parse(nodeId) : (node == 3 ? x.Child3Id == Guid.Parse(nodeId) : (node == 2 ? x.Child2Id == Guid.Parse(nodeId) : (node == 1 ? x.Child1Id == Guid.Parse(nodeId) : (node == 0 ? x.RootId == Guid.Parse(nodeId) : (node == null ? true : true))))))
// .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING").ToListAsync();
//}
//else
//{
// data = await _dbContext.Set<LeaveRequest>().AsQueryable()
// .Include(x => x.Type)
// .Where(x => x.ProfileType == type.Trim().ToUpper())
// .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
// .Where(x => node == 4 ? x.Child4Id == Guid.Parse(nodeId) : (node == 3 ? x.Child3Id == Guid.Parse(nodeId) : (node == 2 ? x.Child2Id == Guid.Parse(nodeId) : (node == 1 ? x.Child1Id == Guid.Parse(nodeId) : (node == 0 ? x.RootId == Guid.Parse(nodeId) : (node == null ? true : true))))))
// .Where(x => node == 0 ? x.Child1Id == null : (node == 1 ? x.Child2Id == null : (node == 2 ? x.Child3Id == null : (node == 3 ? x.Child4Id == null : true))))
// .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING").ToListAsync();
//}
data = await _dbContext.Set<LeaveRequest>().AsQueryable() data = await _dbContext.Set<LeaveRequest>().AsQueryable()
.Include(x => x.Type) .Include(x => x.Type)
.Where(x => x.ProfileType == type.Trim().ToUpper()) .Where(x => x.ProfileType == type.Trim().ToUpper())
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date) .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING").ToListAsync(); .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING").ToListAsync();
// กรองตามสิทธิ์ admin ก่อน
if (role == "CHILD") if (role == "OWNER")
{
node = null;
}
if (role == "OWNER" || role == "CHILD")
{ {
data = data.Where(x => data = data.Where(x =>
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId) : node == 4 ? x.Child4DnaId == Guid.Parse(nodeId) :
@ -1750,70 +1505,32 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
node == null ? true : true node == null ? true : true
).ToList(); ).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") else if (role == "ROOT")
{ {
data = data.Where(x => x.RootDnaId == Guid.Parse(nodeId)).ToList(); 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") else if (role == "NORMAL")
{ {
data = data.Where(x => data = data.Where(x =>
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null : node == 0 ? x.Child1DnaId == null :
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null : node == 1 ? x.Child2DnaId == null :
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null : node == 2 ? x.Child3DnaId == null :
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null : node == 3 ? x.Child4DnaId == null :
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
true true
).ToList(); ).ToList();
} }
// กรองตามที่ fe ส่งมา
if (role == "ROOT" || role == "OWNER" || role == "CHILD" || role == "BROTHER" || role == "PARENT") var res = (from d in data
{
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();
}
// รายงานการลางานจำแนกตามเพศฯ Template ให้หน่วยงานแสดงก่อนส่วนราชการ
var org = _userProfileRepository.GetOc(Guid.Parse(nodeIdByReq), nodeByReq ?? 0, AccessToken);
var organizationName = $"{org.Root ?? ""}{(!string.IsNullOrEmpty(org.Child1) ? "/" + org.Child1 : "")}{(!string.IsNullOrEmpty(org.Child2) ? "/" + org.Child2 : "")}{(!string.IsNullOrEmpty(org.Child3) ? "/" + org.Child3 : "")}{(!string.IsNullOrEmpty(org.Child4) ? "/" + org.Child4 : "")}";
if (data.Count > 0)
{
var grouped = data.GroupBy(d => nodeByReq switch
{
0 => d.Root,
1 => d.Child1,
2 => d.Child2,
3 => d.Child3,
4 => d.Child4,
_ => d.Root
});
var res = (/*from d in data
group d by new { d.Root, d.Child1, d.Child2, d.Child3, d.Child4 } into grp group d by new { d.Root, d.Child1, d.Child2, d.Child3, d.Child4 } into grp
orderby grp.Key.Root, grp.Key.Child1, grp.Key.Child2, grp.Key.Child3, grp.Key.Child4*/ orderby grp.Key.Root, grp.Key.Child1, grp.Key.Child2, grp.Key.Child3, grp.Key.Child4
from grp in grouped
orderby grp.Key
select new GetSumApproveLeaveByRootDto select new GetSumApproveLeaveByRootDto
{ {
//Root = $"{grp.Key.Root}{(!string.IsNullOrEmpty(grp.Key.Child1) ? "/" + grp.Key.Child1 : "")}{(!string.IsNullOrEmpty(grp.Key.Child2) ? "/" + grp.Key.Child2 : "")}{(!string.IsNullOrEmpty(grp.Key.Child3) ? "/" + grp.Key.Child3 : "")}{(!string.IsNullOrEmpty(grp.Key.Child4) ? "/" + grp.Key.Child4 : "")}", Root = $"{grp.Key.Root}{(!string.IsNullOrEmpty(grp.Key.Child1) ? "/" + grp.Key.Child1 : "")}{(!string.IsNullOrEmpty(grp.Key.Child2) ? "/" + grp.Key.Child2 : "")}{(!string.IsNullOrEmpty(grp.Key.Child3) ? "/" + grp.Key.Child3 : "")}{(!string.IsNullOrEmpty(grp.Key.Child4) ? "/" + grp.Key.Child4 : "")}",
Root = organizationName,
SumLeaveDay = grp.Sum(x => x.LeaveTotal), SumLeaveDay = grp.Sum(x => x.LeaveTotal),
sickDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-001").Sum(x => x.LeaveTotal), sickDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-001").Sum(x => x.LeaveTotal),
personalDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-002").Sum(x => x.LeaveTotal), maternityDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-002").Sum(x => x.LeaveTotal),
maternityDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-003").Sum(x => x.LeaveTotal), wifeDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-003").Sum(x => x.LeaveTotal),
wifeDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-004").Sum(x => x.LeaveTotal), personalDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-004").Sum(x => x.LeaveTotal),
restDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-005").Sum(x => x.LeaveTotal), restDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-005").Sum(x => x.LeaveTotal),
ordainDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-006").Sum(x => x.LeaveTotal), ordainDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-006").Sum(x => x.LeaveTotal),
absentDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-007").Sum(x => x.LeaveTotal), absentDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-007").Sum(x => x.LeaveTotal),
@ -1823,9 +1540,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
therapyDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-011").Sum(x => x.LeaveTotal), therapyDayCountMale = grp.Where(x => x.Gender == "ชาย" && x.LeaveTypeCode == "LV-011").Sum(x => x.LeaveTotal),
sickDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-001").Sum(x => x.LeaveTotal), sickDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-001").Sum(x => x.LeaveTotal),
personalDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-002").Sum(x => x.LeaveTotal), maternityDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-002").Sum(x => x.LeaveTotal),
maternityDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-003").Sum(x => x.LeaveTotal), wifeDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-003").Sum(x => x.LeaveTotal),
wifeDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-004").Sum(x => x.LeaveTotal), personalDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-004").Sum(x => x.LeaveTotal),
restDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-005").Sum(x => x.LeaveTotal), restDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-005").Sum(x => x.LeaveTotal),
ordainDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-006").Sum(x => x.LeaveTotal), ordainDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-006").Sum(x => x.LeaveTotal),
absentDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-007").Sum(x => x.LeaveTotal), absentDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-007").Sum(x => x.LeaveTotal),
@ -1835,9 +1552,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
therapyDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-011").Sum(x => x.LeaveTotal), therapyDayCountFemale = grp.Where(x => x.Gender == "หญิง" && x.LeaveTypeCode == "LV-011").Sum(x => x.LeaveTotal),
sickDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-001").Sum(x => x.LeaveTotal), sickDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-001").Sum(x => x.LeaveTotal),
personalDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-002").Sum(x => x.LeaveTotal), maternityDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-002").Sum(x => x.LeaveTotal),
maternityDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-003").Sum(x => x.LeaveTotal), wifeDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-003").Sum(x => x.LeaveTotal),
wifeDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-004").Sum(x => x.LeaveTotal), personalDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-004").Sum(x => x.LeaveTotal),
restDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-005").Sum(x => x.LeaveTotal), restDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-005").Sum(x => x.LeaveTotal),
ordainDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-006").Sum(x => x.LeaveTotal), ordainDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-006").Sum(x => x.LeaveTotal),
absentDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-007").Sum(x => x.LeaveTotal), absentDayCountNo = grp.Where(x => x.Gender != "ชาย" && x.Gender != "หญิง" && x.LeaveTypeCode == "LV-007").Sum(x => x.LeaveTotal),
@ -1850,51 +1567,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
return res; return res;
} }
else
{
return new List<GetSumApproveLeaveByRootDto>
{
new GetSumApproveLeaveByRootDto
{
Root = organizationName,
SumLeaveDay = 0,
sickDayCountMale = 0,
maternityDayCountMale = 0,
wifeDayCountMale = 0,
personalDayCountMale = 0,
restDayCountMale = 0,
ordainDayCountMale = 0,
absentDayCountMale = 0,
studyDayCountMale = 0,
agencyDayCountMale = 0,
coupleDayCountMale = 0,
therapyDayCountMale = 0,
sickDayCountFemale = 0,
maternityDayCountFemale = 0,
wifeDayCountFemale = 0,
personalDayCountFemale = 0,
restDayCountFemale = 0,
ordainDayCountFemale = 0,
absentDayCountFemale = 0,
studyDayCountFemale = 0,
agencyDayCountFemale = 0,
coupleDayCountFemale = 0,
therapyDayCountFemale = 0,
sickDayCountNo = 0,
maternityDayCountNo = 0,
wifeDayCountNo = 0,
personalDayCountNo = 0,
restDayCountNo = 0,
ordainDayCountNo = 0,
absentDayCountNo = 0,
studyDayCountNo = 0,
agencyDayCountNo = 0,
coupleDayCountNo = 0,
therapyDayCountNo = 0
}
};
}
}
public async Task<List<GetCountApproveLeaveByTypeDto>> GetCountApproveLeaveByTypeAndRange(DateTime startDate, DateTime endDate) public async Task<List<GetCountApproveLeaveByTypeDto>> GetCountApproveLeaveByTypeAndRange(DateTime startDate, DateTime endDate)
{ {
@ -1924,7 +1596,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Include(x => x.Type) .Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId) .Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId) .Where(x => x.Type.Id == leaveTypeId)
//.Where(x => x.CreatedAt >= startDate && x.CreatedAt <= endDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date) .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING") .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync(); .ToListAsync();
@ -1935,139 +1606,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
return 0; return 0;
} }
public async Task<double> GetSumApproveLeaveTotalByTypeAndRangeForUser2(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate, DateTime sendLeaveDate)
{
// startDate/endDate คือขอบเขตปีงบประมาณ (fiscalStart/fiscalEnd) ที่ caller ส่งมา
// ใช้ LeaveStartDate เป็นหลักในการ filter เพื่อให้กรณียื่นลาล่วงหน้าข้ามปีงบประมาณ
// ถูกนับในปีงบประมาณของวันลาจริง (ไม่ใช้วันที่ยื่นลา)
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync();
if (data.Count > 0)
return data.Sum(x => x.LeaveTotal);
else
return 0;
}
public async Task<double> GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate,DateTime sendLeaveDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync();
if (data.Count > 0)
return data.Sum(x => x.LeaveTotal);
else
return 0;
}
public async Task<double> GetSumApproveLeaveTotalByTypeAndRangeForUserByProfile(Guid profileId, Guid leaveTypeId, DateTime startDate, DateTime endDate,DateTime sendLeaveDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.ProfileId == profileId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync();
if (data.Count > 0)
return data.Sum(x => x.LeaveTotal);
else
return 0;
}
public async Task<int> GetSumApproveLeaveCountByTypeAndRangeForUserByProfile(Guid profileId, Guid leaveTypeId, DateTime startDate, DateTime endDate, DateTime sendLeaveDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.ProfileId == profileId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync();
return data.Count;
}
public async Task<int> GetSumApproveLeaveCountByTypeAndRangeForUser2(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate, DateTime sendLeaveDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync();
return data.Count;
}
/// <summary>
/// วันลาที่สร้างแบบร่างยังไม่ได้ยื่น
/// </summary>
/// <param name="keycloakUserId"></param>
/// <param name="leaveTypeId"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <param name="sendLeaveDate"></param>
/// <returns></returns>
public async Task<double> GetSumDraftLeaveTotalByTypeAndRangeForUser2(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate, DateTime sendLeaveDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "DRAFT")
.ToListAsync();
if (data.Count > 0)
return data.Sum(x => x.LeaveTotal);
else
return 0;
}
/// <summary>
/// วันลาที่ยื่นแล้วรอพิจารณา
/// </summary>
/// <param name="keycloakUserId"></param>
/// <param name="leaveTypeId"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public async Task<double> GetSumNewLeaveTotalByTypeAndRangeForUser2(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate,DateTime sendLeaveDate)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => (x.DateSendLeave ?? x.CreatedAt) < sendLeaveDate)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => (x.LeaveStatus == "NEW" || x.LeaveStatus == "PENDING"))
.ToListAsync();
if (data.Count > 0)
return data.Sum(x => x.LeaveTotal);
else
return 0;
}
public async Task<int> GetCountApproveLeaveByTypeAndRangeForUser(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate) public async Task<int> GetCountApproveLeaveByTypeAndRangeForUser(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate)
{ {
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking() var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
@ -2075,7 +1613,6 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Where(x => x.KeycloakUserId == keycloakUserId) .Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId) .Where(x => x.Type.Id == leaveTypeId)
.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date) .Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
//.Where(x => x.CreatedAt >= startDate && x.CreatedAt <= endDate)
.Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING") .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING")
.ToListAsync(); .ToListAsync();

View file

@ -9,8 +9,6 @@ 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
{ {
@ -74,8 +72,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
await base.AddAsync(entity); await base.AddAsync(entity);
var userId = UserId != null ? Guid.Parse(UserId) : Guid.Empty; var userId = UserId != null ? Guid.Parse(UserId) : Guid.Empty;
// var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken ?? ""); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken ?? "");
var profile = await _userProfileRepository.GetProfileByKeycloakIdNew2Async(userId, AccessToken ?? "");
// fix issue : SIT ระบบบันทึกเวลาปฏิบัติงาน>>ลงเวลากรณีพิเศษ (ไม่มีแจ้งเตือนไปยังผู้บังคับบัญชา) #969 // fix issue : SIT ระบบบันทึกเวลาปฏิบัติงาน>>ลงเวลากรณีพิเศษ (ไม่มีแจ้งเตือนไปยังผู้บังคับบัญชา) #969
// send noti + inbox + mail // send noti + inbox + mail
@ -145,147 +142,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
} }
} }

View file

@ -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
}
}

View file

@ -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

View file

@ -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; }
}
}

View file

@ -139,15 +139,39 @@ 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) public async Task<List<ProcessUserTimeStamp>> GetTimestampByDateLateAsync(string type, string role, string nodeId, int? node, DateTime StartDate, DateTime EndDate)
{ {
var _nodeId = Guid.Parse(nodeId);
var data = new List<ProcessUserTimeStamp>(); var data = new List<ProcessUserTimeStamp>();
//if (role == "OWNER" || role == "CHILD")
//{
// 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())
// .Where(x => node == 4 ? x.Child4Id == _nodeId : (node == 3 ? x.Child3Id == _nodeId : (node == 2 ? x.Child2Id == _nodeId : (node == 1 ? x.Child1Id == _nodeId : (node == 0 ? x.RootId == _nodeId : true)))))
// .ToListAsync();
//}
//else
//{
// 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())
// .Where(x => node == 4 ? x.Child4Id == _nodeId : (node == 3 ? x.Child3Id == _nodeId : (node == 2 ? x.Child2Id == _nodeId : (node == 1 ? x.Child1Id == _nodeId : (node == 0 ? x.RootId == _nodeId : true)))))
// .Where(x => node == 0 ? x.Child1Id == null : (node == 1 ? x.Child2Id == null : (node == 2 ? x.Child3Id == null : (node == 3 ? x.Child4Id == null : true))))
// .ToListAsync();
//}
data = await _dbContext.Set<ProcessUserTimeStamp>().AsQueryable() data = await _dbContext.Set<ProcessUserTimeStamp>().AsQueryable()
.Where(x => x.CheckInStatus == "LATE") .Where(x => x.CheckInStatus == "LATE")
.Where(u => u.CheckIn.Date >= StartDate && u.CheckIn.Date <= EndDate) .Where(u => u.CheckIn.Date >= StartDate && u.CheckIn.Date <= EndDate)
.Where(x => x.ProfileType == type.Trim().ToUpper()).ToListAsync(); .Where(x => x.ProfileType == type.Trim().ToUpper()).ToListAsync();
// กรองตามสิทธิ์ admin ก่อน
if (role == "CHILD") if (role == "OWNER")
{
node = null;
}
if (role == "OWNER" || role == "CHILD")
{ {
data = data.Where(x => data = data.Where(x =>
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId) : node == 4 ? x.Child4DnaId == Guid.Parse(nodeId) :
@ -158,46 +182,20 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
node == null ? true : true node == null ? true : true
).ToList(); ).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") else if (role == "ROOT")
{ {
data = data.Where(x => x.RootDnaId == Guid.Parse(nodeId)).ToList(); 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") else if (role == "NORMAL")
{ {
data = data.Where(x => data = data.Where(x =>
node == 0 ? x.RootDnaId == Guid.Parse(nodeId!) && x.Child1DnaId == null : node == 0 ? x.Child1DnaId == null :
node == 1 ? x.Child1DnaId == Guid.Parse(nodeId!) && x.Child2DnaId == null : node == 1 ? x.Child2DnaId == null :
node == 2 ? x.Child2DnaId == Guid.Parse(nodeId!) && x.Child3DnaId == null : node == 2 ? x.Child3DnaId == null :
node == 3 ? x.Child3DnaId == Guid.Parse(nodeId!) && x.Child4DnaId == null : node == 3 ? x.Child4DnaId == null :
node == 4 ? x.Child4DnaId == Guid.Parse(nodeId!) :
true true
).ToList(); ).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; return data;
} }
@ -213,12 +211,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 +222,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 +254,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>()

View file

@ -101,17 +101,14 @@ 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)
.Where(x => x.EffectiveDate.Value.Date <= DateTime.Now.Date)
.OrderByDescending(x => x.EffectiveDate) .OrderByDescending(x => x.EffectiveDate)
.FirstOrDefaultAsync(combinedCts.Token); .FirstOrDefaultAsync();
return data; return data;
} }

View file

@ -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>()

View file

@ -51,13 +51,12 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
// // throw new Exception(GlobalMessages.DataNotFound); // // throw new Exception(GlobalMessages.DataNotFound);
// } // }
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position"; var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
var profileId = ""; var profileId = "";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();

View file

@ -55,13 +55,12 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
// // throw new Exception(GlobalMessages.DataNotFound); // // throw new Exception(GlobalMessages.DataNotFound);
// } // }
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position"; var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
var profileId = ""; var profileId = "";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -132,13 +131,12 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
// { // {
// return 0; // return 0;
// } // }
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position"; var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
var profileId = ""; var profileId = "";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -187,44 +185,6 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
} }
} }
private async Task<string> GetMyProfileIdAsync()
{
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
{
var profileId = await GetMyProfileIdAsync();
if (string.IsNullOrEmpty(profileId))
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) public async Task PushNotificationAsync(Guid ReceiverUserId, string Subject, string Body, string Payload = "", string NotiLink = "", bool IsSendInbox = false, bool IsSendMail = false)
{ {
try try
@ -267,7 +227,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -327,7 +287,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -401,7 +361,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -474,7 +434,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -544,7 +504,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -606,7 +566,7 @@ namespace BMA.EHR.Application.Repositories.MessageQueue
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();

View file

@ -49,16 +49,12 @@ namespace BMA.EHR.Application.Repositories.MetaData
public async Task<int> GetHolidayCountAsync(DateTime startDate, DateTime endDate, string category = "NORMAL") public async Task<int> GetHolidayCountAsync(DateTime startDate, DateTime endDate, string category = "NORMAL")
{ {
var query = _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)
.CountAsync();
if (category == "NORMAL") return data;
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") public List<DateTime> GetWeekEnd(DateTime startDate, DateTime endDate, string category = "NORMAL")

View file

@ -155,40 +155,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

View file

@ -10,7 +10,6 @@ using System.Net.Http.Headers;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using System.Security.Claims; using System.Security.Claims;
using System.Net.Http.Json; using System.Net.Http.Json;
using BMA.EHR.Application.Responses.Leaves;
namespace BMA.EHR.Application.Repositories namespace BMA.EHR.Application.Repositories
{ {
@ -61,12 +60,8 @@ namespace BMA.EHR.Application.Repositories
{ {
client.DefaultRequestHeaders.Authorization = client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = await client.GetAsync(apiPath); var req = await client.GetAsync(apiPath);
if (!req.IsSuccessStatusCode)
{
throw new Exception("Error calling permission API");
}
var res = await req.Content.ReadAsStringAsync(); var res = await req.Content.ReadAsStringAsync();
return res; return res;
} }
@ -77,39 +72,6 @@ namespace BMA.EHR.Application.Repositories
} }
} }
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) public async Task<dynamic> GetPermissionOrgAPIAsync(string action, string system, string profileId)
{ {
try try
@ -119,7 +81,7 @@ namespace BMA.EHR.Application.Repositories
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = await client.GetAsync(apiPath); var req = await client.GetAsync(apiPath);
var res = await req.Content.ReadAsStringAsync(); var res = await req.Content.ReadAsStringAsync();
return res; return res;

View file

@ -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
} }
} }

View file

@ -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,
ExamIdenNumber = p.ExamIdenNumber == null ? "-" : p.ExamIdenNumber.ToThaiNumber(),
PositionName = p.PositionExam == null ? "-" : p.PositionExam.PositionName.ToThaiNumber(),
PositionLevelName = p.PositionExam == null ? "-" : p.PositionExam.PositionLevelName.ToThaiNumber(),
PeriodExamName = p.PeriodExam == null ? "-" : p.PeriodExam.Name.ToThaiNumber(),
PeriodExamRound = p.PeriodExam == null ? "-" : p.PeriodExam.Round.ToString().ToThaiNumber(),
PeriodExamYear = p.PeriodExam == null ? "-" : (p.PeriodExam.Year + 543).ToString().ToThaiNumber(),
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().ToThaiNumber(),
Age = p.DateOfBirth == null ? "-" : p.DateOfBirth.Value.CalculateAgeStrV2(0, 0).ToThaiNumber(),
CitizenId = p.CitizenId == null ? "-" : p.CitizenId.ToThaiNumber(),
EducationLevelExamName = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationLevelExamName.ToThaiNumber(),
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.ToThaiNumber(),
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().ToThaiNumber(),
EducationScores = p.Educations.FirstOrDefault() == null ? "-" : p.Educations.FirstOrDefault().EducationScores.ToThaiNumber(),
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.Value.ToString("N0").ToThaiNumber(),
OccupationGroup = p.OccupationGroup == null ? "-" : p.OccupationGroup,
OccupationPile = p.OccupationPile == null ? "-" : p.OccupationPile,
OccupationOrg = p.OccupationOrg == null ? "-" : p.OccupationOrg,
OccupationTelephone = p.OccupationTelephone == null ? "-" : p.OccupationTelephone.ToThaiNumber(),
CareersTotal = sb.ToString().ToThaiNumber(),
// 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.ToThaiNumber(),
RegistProvinceName = p.RegistProvinceName == null ? "-" : p.RegistProvinceName,
RegistDistrictName = p.RegistDistrictName == null ? "-" : p.RegistDistrictName,
RegistSubDistrictName = p.RegistSubDistrictName == null ? "-" : p.RegistSubDistrictName,
RegistZipCode = p.RegistZipCode == null ? "-" : p.RegistZipCode.ToThaiNumber(),
CurrentAddress = p.CurrentAddress == null ? (p.RegistAddress == null ? "-" : p.RegistAddress.ToThaiNumber()) : p.CurrentAddress.ToThaiNumber(),
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.ToThaiNumber()) : p.CurrentZipCode.ToThaiNumber(),
Telephone = p.Telephone == null ? "-" : p.Telephone.ToThaiNumber(),
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.ToThaiNumber(),
RegisterDate = p.RegisterDate == null ? "-" : p.RegisterDate.Value.ToThaiFullDate().ToThaiNumber(),
})
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (data == null)
if (candidate == 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("&nbsp;", " ")
.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)
{ {
@ -229,10 +176,10 @@ namespace BMA.EHR.Application.Repositories.Reports
{ {
Position = item.Position, Position = item.Position,
Type = item.Type, Type = item.Type,
DurationStart = item.DurationStart, DurationStart = item.DurationStart.ToThaiNumber(),
DurationEnd = item.DurationEnd, DurationEnd = item.DurationEnd.ToThaiNumber(),
RangeDate = item.RangeDate, RangeDate = item.RangeDate.ToThaiNumber(),
Index = retVal.ToString(), Index = retVal.ToString().ToThaiNumber(),
}; };
data.Add(_data); data.Add(_data);
retVal++; retVal++;

View file

@ -18,7 +18,6 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System.Globalization;
using System.Net; using System.Net;
using System.Net.Http.Headers; using System.Net.Http.Headers;
@ -845,16 +844,13 @@ namespace BMA.EHR.Application.Repositories.Reports
OcId = x.Request.OrganizationId // Organization ID OcId = x.Request.OrganizationId // Organization ID
}) })
.ToListAsync(); .ToListAsync();
var org = _userProfileRepository.GetOc(nodeId, node, AccessToken);
var organizationName = $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}";
var insignia = (from r in data var insignia = (from r in data
group r by new { OcId = r.OcId, InsigniaInitial = r.InsigniaInitial } into g group r by new { OcId = r.OcId, InsigniaInitial = r.InsigniaInitial } into g
select new select new
{ {
RowNo = 1, RowNo = 1,
DepartmentName = organizationName, DepartmentName = _userProfileRepository.GetOc(g.Key.OcId, 0, AccessToken).Root, //_organizationCommonRepository.GetOrganizationNameFullPath(g.Key.OcId, false, false),
//_userProfileRepository.GetOc(g.Key.OcId, 0, AccessToken).Root,
//_organizationCommonRepository.GetOrganizationNameFullPath(g.Key.OcId, false, false),
InsigniaInitial = g.Key.InsigniaInitial, InsigniaInitial = g.Key.InsigniaInitial,
G1Male = g.Sum(x => x.Gendor == "ชาย" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0).ToString().ToThaiNumber(), G1Male = g.Sum(x => x.Gendor == "ชาย" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0).ToString().ToThaiNumber(),
G1Female = g.Sum(x => x.Gendor == "หญิง" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0).ToString().ToThaiNumber(), G1Female = g.Sum(x => x.Gendor == "หญิง" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0).ToString().ToThaiNumber(),
@ -893,7 +889,7 @@ namespace BMA.EHR.Application.Repositories.Reports
select new select new
{ {
RowNo = 1, RowNo = 1,
DepartmentName = _userProfileRepository.GetOc(g.Key.OcId, 0, AccessToken)?.Root ?? "-", //_organizationCommonRepository.GetOrganizationNameFullPath(g.Key.OcId, false, false), DepartmentName = _userProfileRepository.GetOc(g.Key.OcId, 0, AccessToken).Root, //_organizationCommonRepository.GetOrganizationNameFullPath(g.Key.OcId, false, false),
G1Male = g.Sum(x => x.Gendor == "ชาย" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0), G1Male = g.Sum(x => x.Gendor == "ชาย" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0),
G1Female = g.Sum(x => x.Gendor == "หญิง" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0), G1Female = g.Sum(x => x.Gendor == "หญิง" && x.RequestInsigniaName == "เหรียญจักรพรรดิมาลา" ? 1 : 0),
G2Male = g.Sum(x => x.Gendor == "ชาย" ? 1 : 0), G2Male = g.Sum(x => x.Gendor == "ชาย" ? 1 : 0),
@ -1115,60 +1111,6 @@ namespace BMA.EHR.Application.Repositories.Reports
return s_data; return s_data;
} }
public async Task<dynamic> GeInsigniaRequestProfiles(Guid id)
{
var profile = await _dbContext.Set<InsigniaRequestProfile>()
.Where(x => x.Id == id)
.Select(x => new
{
Fullname = $"{x.Prefix}{x.FirstName} {x.LastName}",
Position = x.Position ?? "",
Oc = (x.Child4 == null ? "" : x.Child4 + " ") +
(x.Child3 == null ? "" : x.Child3 + " ") +
(x.Child2 == null ? "" : x.Child2 + " ") +
(x.Child1 == null ? "" : x.Child1 + " ") +
(x.Root == null ? "" : x.Root),
BirthDate = x.BirthDate == null ? "" : x.BirthDate.Value.ToThaiShortDate().ToString().ToThaiNumber(),
DateAppoint = x.DateAppoint == null ? "" : x.DateAppoint.Value.ToThaiShortDate().ToString().ToThaiNumber(),
ProfileId = x.ProfileId
})
.FirstOrDefaultAsync();
if (profile == null)
throw new Exception(GlobalMessages.DataNotFound);
var profileSalarys = await _userProfileRepository.GetProfileSalaryById(profile.ProfileId, AccessToken);
var salarys = profileSalarys.Select(x => new
{
DateAffect = x.DateAffect == null ? "" : x.DateAffect.ToThaiShortDate().ToString().ToThaiNumber(),
Position = x.Position ?? "",
Root = x.Root,
Child1 = x.Child1,
Child2 = x.Child2,
Child3 = x.Child3,
Child4 = x.Child4,
Oc = (x.Child4 == null ? "" : x.Child4 + " ") +
(x.Child3 == null ? "" : x.Child3 + " ") +
(x.Child2 == null ? "" : x.Child2 + " ") +
(x.Child1 == null ? "" : x.Child1 + " ") +
(x.Root == null ? "" : x.Root),
Age = x.Age == null ? "" : x.Age.ToString().ToThaiNumber(),
Amount = x.Amount == null ? "" : x.Amount.ToString("N0", new CultureInfo("th-TH")).ToThaiNumber(),
Remark = x.Remark == null ? "" : x.Remark.ToThaiNumber(),
}).ToList();
var result = new
{
profile.Fullname,
profile.Position,
profile.Oc,
profile.BirthDate,
profile.DateAppoint,
Salarys = salarys
};
return result;
}
//47-บัญชีระดับผลการประเมินผลการปฏิบัติราชการในรอบ 5 ปี //47-บัญชีระดับผลการประเมินผลการปฏิบัติราชการในรอบ 5 ปี
public async Task<dynamic> GetEvaluationResultReport(Guid id, string type = null, int node = -1, Guid nodeId = default) public async Task<dynamic> GetEvaluationResultReport(Guid id, string type = null, int node = -1, Guid nodeId = default)
{ {
@ -1236,7 +1178,7 @@ namespace BMA.EHR.Application.Repositories.Reports
var _apiUrl = $"{_baseAPI}/org/unauthorize/calculateEvaluation/{type}"; var _apiUrl = $"{_baseAPI}/org/unauthorize/calculateEvaluation/{type}";
using (var _client = new HttpClient()) using (var _client = new HttpClient())
{ {
_client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); _client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await _client.SendAsync(_req); var _res = await _client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -1575,11 +1517,6 @@ namespace BMA.EHR.Application.Repositories.Reports
} }
} }
public void CalculateInsigniaRequestBkkByType(string type = "officer")
{
CalInsigniaRequestBkkByType(type).GetAwaiter().GetResult();
}
//คำนวนผู้ได้รับเครื่องราชฯ //คำนวนผู้ได้รับเครื่องราชฯ
public async Task CalInsigniaRequestBkkByType(string type = "officer") public async Task CalInsigniaRequestBkkByType(string type = "officer")
{ {
@ -1588,10 +1525,12 @@ namespace BMA.EHR.Application.Repositories.Reports
.AsQueryable() .AsQueryable()
.ToListAsync(); .ToListAsync();
insigniaPeriods = insigniaPeriods insigniaPeriods = insigniaPeriods
.Where(x => x.StartDate <= DateTime.Now.Date && x.InsigniaRequests.Where(x => x.ProfileType!.ToLower().Trim() == type.Trim().ToLower()).Count() == 0).ToList(); .Where(x => x.StartDate < DateTime.Now.Date || x.InsigniaRequests.Count == 0).ToList();
foreach (var insigniaPeriod in insigniaPeriods) foreach (var insigniaPeriod in insigniaPeriods)
{ {
if (insigniaPeriod.StartDate >= DateTime.Now.Date || insigniaPeriod.InsigniaRequests.Count > 0)
continue;
var organizations = await _userProfileRepository.GetActiveRootLatestAsync(AccessToken); var organizations = await _userProfileRepository.GetActiveRootLatestAsync(AccessToken);
if (organizations == null) if (organizations == null)
continue; continue;
@ -1794,7 +1733,6 @@ namespace BMA.EHR.Application.Repositories.Reports
RequestInsigniaName = x.RequestInsignia.Name, RequestInsigniaName = x.RequestInsignia.Name,
IsApprove = x.IsApprove, IsApprove = x.IsApprove,
InsigniaInitial = $"{x.RequestInsignia.Name}({x.RequestInsignia.ShortName})", // Insignia's full name and short name InsigniaInitial = $"{x.RequestInsignia.Name}({x.RequestInsignia.ShortName})", // Insignia's full name and short name
DatePayment = x.DatePayment,
OcId = x.Root OcId = x.Root
}).ToListAsync(); }).ToListAsync();
var insignia = (from r in data var insignia = (from r in data
@ -1805,10 +1743,8 @@ namespace BMA.EHR.Application.Repositories.Reports
DepartmentName = g.Key.OcId, DepartmentName = g.Key.OcId,
InsigniaTypeName = g.Key.InsigniaTypeName, InsigniaTypeName = g.Key.InsigniaTypeName,
RequestInsigniaName = g.Key.RequestInsigniaName, RequestInsigniaName = g.Key.RequestInsigniaName,
/* Pending = g.Sum(x => x.IsApprove == false ? 1 : 0), Pending = g.Sum(x => x.IsApprove == false ? 1 : 0),
Done = g.Sum(x => x.IsApprove == true ? 1 : 0),*/ Done = g.Sum(x => x.IsApprove == true ? 1 : 0),
Pending = g.Sum(x => x.DatePayment == null ? 1 : 0),
Done = g.Sum(x => x.DatePayment != null ? 1 : 0),
Remark = "", Remark = "",
}).ToList(); }).ToList();
@ -1867,7 +1803,7 @@ namespace BMA.EHR.Application.Repositories.Reports
{ {
CitizenId = x.CitizenId, CitizenId = x.CitizenId,
Prefix = x.Prefix, Prefix = x.Prefix,
FullName = $"{x.FirstName} {x.LastName}", FullName = $"{x.Prefix}{x.FirstName} {x.LastName}",
PosTypeName = x.PosTypeName, PosTypeName = x.PosTypeName,
PosLevelName = x.PosLevelName, PosLevelName = x.PosLevelName,
Position = x.Position, Position = x.Position,

View file

@ -51,7 +51,7 @@ namespace BMA.EHR.Application.Repositories.Reports
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, api_url); var req = new HttpRequestMessage(HttpMethod.Get, api_url);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -161,7 +161,7 @@ namespace BMA.EHR.Application.Repositories.Reports
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, api_url); var req = new HttpRequestMessage(HttpMethod.Get, api_url);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -433,7 +433,7 @@ namespace BMA.EHR.Application.Repositories.Reports
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, api_url); var req = new HttpRequestMessage(HttpMethod.Get, api_url);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -642,7 +642,7 @@ namespace BMA.EHR.Application.Repositories.Reports
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, api_url); var req = new HttpRequestMessage(HttpMethod.Get, api_url);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();
@ -894,7 +894,7 @@ namespace BMA.EHR.Application.Repositories.Reports
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var req = new HttpRequestMessage(HttpMethod.Get, api_url); var req = new HttpRequestMessage(HttpMethod.Get, api_url);
var res = await client.SendAsync(req); var res = await client.SendAsync(req);
var result = await res.Content.ReadAsStringAsync(); var result = await res.Content.ReadAsStringAsync();

View file

@ -87,7 +87,7 @@ namespace BMA.EHR.Application.Repositories.Reports
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -192,7 +192,7 @@ namespace BMA.EHR.Application.Repositories.Reports
}).ToList(); }).ToList();
} }
string SignDate = retireHistorys.SignDate != null ? DateTime.Parse(retireHistorys.SignDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "-"; 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 }; return new { SignDate, retireHistorys.Detail, 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
@ -312,7 +312,7 @@ namespace BMA.EHR.Application.Repositories.Reports
root = (isDuplicateRoot ? "" : profile.root + "\n") + root = (isDuplicateRoot ? "" : profile.root + "\n") +
(isDuplicateHospital || !hospital.ToObject<List<string>>().Contains(profile.child1) ? "" : profile.child1 + "\n") + (isDuplicateHospital || !hospital.ToObject<List<string>>().Contains(profile.child1) ? "" : profile.child1 + "\n") +
(isDuplicatePosType ? "" : $"ตำแหน่งประเภท{profile.posTypeName}" + "\n") + (isDuplicatePosType ? "" : $"ตำแหน่งประเภท{profile.posTypeName}" + "\n") +
(isDuplicatePosLevel ? "" : $"ระดับ{profile.posLevelName}").ToThaiNumber(), (isDuplicatePosLevel ? "" : $"ระดับ{profile.posLevelName}"),
child = (profile.posExecutiveName == null ? "" : profile.posExecutiveName + "\n") + child = (profile.posExecutiveName == null ? "" : profile.posExecutiveName + "\n") +
(profile.child4 == null ? "" : profile.child4 + "\n") + (profile.child4 == null ? "" : profile.child4 + "\n") +
(profile.child3 == null ? "" : profile.child3 + "\n") + (profile.child3 == null ? "" : profile.child3 + "\n") +
@ -326,7 +326,7 @@ namespace BMA.EHR.Application.Repositories.Reports
}).ToList(); }).ToList();
} }
string SignDate = retire.SignDate != null ? DateTime.Parse(retire.SignDate.ToString()).ToThaiFullDate().ToString().ToThaiNumber() : "-"; 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 { SignDate, retire.Detail, retire.Id, retire.CreatedAt, Year = retire.Year.ToThaiYear().ToString().ToThaiNumber(), retire.Round, retire.Type, retire.TypeReport, Total = profile_retire.Count.ToString().ToThaiNumber(), profiles = mapProfiles };
} }
} }
#endregion #endregion
@ -505,7 +505,6 @@ namespace BMA.EHR.Application.Repositories.Reports
p.CommanderRejectReason, p.CommanderRejectReason,
p.CommanderRejectDate, p.CommanderRejectDate,
p.RemarkHorizontal, p.RemarkHorizontal,
Type = "OFFICER"
}) })
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (data == null) if (data == null)
@ -543,130 +542,10 @@ namespace BMA.EHR.Application.Repositories.Reports
p.CommanderRejectReason, p.CommanderRejectReason,
p.CommanderRejectDate, p.CommanderRejectDate,
p.RemarkHorizontal, 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,
@ -701,19 +580,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;

View file

@ -116,7 +116,7 @@ namespace BMA.EHR.Application.Repositories
// using (var client = new HttpClient()) // using (var client = new HttpClient())
// { // {
// client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
// client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); // client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
// var jsonBody = JsonConvert.SerializeObject(body); // var jsonBody = JsonConvert.SerializeObject(body);
// var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); // var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

View file

@ -10,6 +10,9 @@ using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Reflection.Emit;
using System.Security.Cryptography;
using System.Text;
namespace BMA.EHR.Application.Repositories namespace BMA.EHR.Application.Repositories
{ {
@ -66,7 +69,7 @@ namespace BMA.EHR.Application.Repositories
{ {
try try
{ {
var apiPath = $"{_configuration["API"]}/org/unauthorize/root/officer/{rootId}"; var apiPath = $"{_configuration["API"]}/org/dotnet/root/officer/{rootId}";
var apiKey = _configuration["API_KEY"]; var apiKey = _configuration["API_KEY"];
@ -132,7 +135,7 @@ namespace BMA.EHR.Application.Repositories
{ {
try try
{ {
var apiPath = $"{_configuration["API"]}/org/unauthorize/find/employee/position"; var apiPath = $"{_configuration["API"]}/org/dotnet/find/employee/position";
var apiKey = _configuration["API_KEY"]; var apiKey = _configuration["API_KEY"];
var body = new var body = new
@ -146,7 +149,7 @@ namespace BMA.EHR.Application.Repositories
// สร้าง HTTP content // สร้าง HTTP content
//var body = new StringContent(bodyJson, Encoding.UTF8, "application/json"); //var body = new StringContent(bodyJson, Encoding.UTF8, "application/json");
var apiResult = await PostExternalAPIAsync(apiPath, accessToken ?? "", body, apiKey); var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null) if (apiResult != null)
{ {
@ -157,7 +160,7 @@ namespace BMA.EHR.Application.Repositories
return null; return null;
} }
catch (Exception ex) catch
{ {
throw; throw;
} }
@ -186,78 +189,6 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<GetProfileByKeycloakIdDto?> GetProfileByKeycloakIdNewAsync(Guid keycloakId, string? accessToken,CancellationToken cancellationToken = default)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/by-keycloak/{keycloakId}";
var apiKey = _configuration["API_KEY"];
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey, cancellationToken);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetProfileByKeycloakIdResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<GetProfileByKeycloakIdDto?> GetProfileByKeycloakIdNew2Async(Guid keycloakId, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/by-keycloak2/{keycloakId}";
var apiKey = _configuration["API_KEY"];
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetProfileByKeycloakIdResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<GetProfileByKeycloakIdDto?> GetProfileByCheckInAsync(Guid keycloakId, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/check-keycloak/{keycloakId}";
var apiKey = _configuration["API_KEY"];
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetProfileByKeycloakIdResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<GetProfileLeaveByKeycloakDto?> GetProfileLeaveByKeycloakIdAsync(Guid keycloakId, string? accessToken) public async Task<GetProfileLeaveByKeycloakDto?> GetProfileLeaveByKeycloakIdAsync(Guid keycloakId, string? accessToken)
{ {
try try
@ -281,66 +212,6 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<List<GetOcStaff>?> GetOCStaffAsync(Guid profileId, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/find-staff";
var apiKey = _configuration["API_KEY"];
var body = new
{
assignId = "SYS_LEAVE_LIST",
profileId = profileId
};
//var profiles = new List<GetOcStaff>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken ?? "", body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetOcStaffResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<GetProfileLeaveByKeycloakDto?> GetProfileLeaveReportByKeycloakIdAsync(Guid keycloakId, string? accessToken, string? report)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/profile-leave/keycloak";
var apiKey = _configuration["API_KEY"];
var body = new
{
keycloakId = keycloakId,
report = report
};
//var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetProfileLeaveByKeycloakResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<GetProfileByKeycloakIdDto?> GetProfileByProfileIdAsync(Guid profileId, string? accessToken) public async Task<GetProfileByKeycloakIdDto?> GetProfileByProfileIdAsync(Guid profileId, string? accessToken)
{ {
try try
@ -364,31 +235,6 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<GetProfileByKeycloakIdDto?> GetProfileByProfileIdNoAuthAsync(Guid profileId, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/unauthorize/profile/{profileId}";
var apiKey = _configuration["API_KEY"];
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetProfileByKeycloakIdResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<bool> UpdateDutyTimeAsync(Guid profileId, Guid roundId, DateTime effectiveDate, string? accessToken) public async Task<bool> UpdateDutyTimeAsync(Guid profileId, Guid roundId, DateTime effectiveDate, string? accessToken)
{ {
try try
@ -677,7 +523,7 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileByAdminRole(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate) public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileByAdminRole(string? accessToken, int? node, string? nodeId, string role, string? revisionId)
{ {
try try
{ {
@ -689,10 +535,6 @@ namespace BMA.EHR.Application.Repositories
nodeId = nodeId, nodeId = nodeId,
role = role, role = role,
revisionId = revisionId, revisionId = revisionId,
reqNode = reqNode,
reqNodeId = reqNodeId,
//startDate = startDate,
//endDate = endDate
}; };
var profiles = new List<SearchProfileDto>(); var profiles = new List<SearchProfileDto>();
@ -713,187 +555,6 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileByAdminRolev2(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/officer-by-admin-rolev2";
var apiKey = _configuration["API_KEY"];
var body = new
{
node = node,
nodeId = nodeId,
role = role,
// revisionId = revisionId,
reqNode = reqNode,
reqNodeId = reqNodeId,
// startDate = startDate,
// endDate = endDate
date = endDate
};
Console.WriteLine(body);
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return new List<GetProfileByKeycloakIdRootDto>();
}
catch
{
throw;
}
}
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileByAdminRolev3(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/officer-by-admin-rolev3";
var apiKey = _configuration["API_KEY"];
var body = new
{
node = node,
nodeId = nodeId,
role = role,
// revisionId = revisionId,
reqNode = reqNode,
reqNodeId = reqNodeId,
startDate = startDate,
endDate = endDate
};
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<List<GetProfileByKeycloakIdRootDto>> GetAllOfficerByRootDnaId(string? rootDnaId, DateTime date)
{
try
{
var apiPath = $"{_configuration["API"]}/org/unauthorize/officer-list";
var apiKey = _configuration["API_KEY"];
var body = new
{
reqNode = 0,
reqNodeId = rootDnaId,
date = date
};
//Console.WriteLine(body);
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, "", body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
else
return new List<GetProfileByKeycloakIdRootDto>();
}
else
return new List<GetProfileByKeycloakIdRootDto>();
}
catch
{
throw;
}
}
public async Task<List<GetProfileByKeycloakIdRootDto>> GetAllEmployeeByRootDnaId(string? rootDnaId, DateTime date)
{
try
{
var apiPath = $"{_configuration["API"]}/org/unauthorize/employee-list";
var apiKey = _configuration["API_KEY"];
var body = new
{
reqNode = 0,
reqNodeId = rootDnaId,
startDate = date,
endDate = date
};
//Console.WriteLine(body);
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, "", body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
else
return new List<GetProfileByKeycloakIdRootDto>();
}
else
return new List<GetProfileByKeycloakIdRootDto>();
}
catch
{
throw;
}
}
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileByAdminRolev4(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/officer-by-admin-rolev4";
var apiKey = _configuration["API_KEY"];
var body = new
{
node = node,
nodeId = nodeId,
role = role,
// revisionId = revisionId,
reqNode = reqNode,
reqNodeId = reqNodeId,
// startDate = startDate,
// endDate = endDate
date = endDate
};
Console.WriteLine(body);
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return new List<GetProfileByKeycloakIdRootDto>();
}
catch
{
throw;
}
}
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileWithKeycloakAllOfficerRetireFilterAndRevision(string? accessToken, int? node, string? nodeId, bool isAll, bool? isRetirement, string? revisionId) public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileWithKeycloakAllOfficerRetireFilterAndRevision(string? accessToken, int? node, string? nodeId, bool isAll, bool? isRetirement, string? revisionId)
{ {
try try
@ -927,41 +588,6 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileWithKeycloakAllOfficerRetireFilterAndRevisionAndDate(string? accessToken, int? node, string? nodeId, bool isAll, bool? isRetirement, string? revisionId, DateTime? startDate, DateTime? endDate)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/keycloak-all-officer/date";
var apiKey = _configuration["API_KEY"];
var body = new
{
node = node,
nodeId = nodeId,
isAll = isAll,
isRetirement = isRetirement,
revisionId = revisionId,
startDate = startDate,
endDate = endDate,
};
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileWithKeycloakAllEmployeeAndRevision(string? accessToken, int? node, string? nodeId, bool isAll, string? revisionId) public async Task<List<GetProfileByKeycloakIdRootDto>> GetProfileWithKeycloakAllEmployeeAndRevision(string? accessToken, int? node, string? nodeId, bool isAll, string? revisionId)
{ {
try try
@ -1026,7 +652,7 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<List<GetProfileByKeycloakIdRootDto>> GetEmployeeByAdminRole(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate) public async Task<List<GetProfileByKeycloakIdRootDto>> GetEmployeeByAdminRole(string? accessToken, int? node, string? nodeId, string role, string? revisionId)
{ {
try try
{ {
@ -1038,10 +664,6 @@ namespace BMA.EHR.Application.Repositories
nodeId = nodeId, nodeId = nodeId,
role = role, role = role,
revisionId = revisionId, revisionId = revisionId,
reqNode = reqNode,
reqNodeId = reqNodeId,
startDate = startDate,
endDate = endDate
}; };
var profiles = new List<SearchProfileDto>(); var profiles = new List<SearchProfileDto>();
@ -1062,43 +684,7 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<List<GetProfileByKeycloakIdRootDto>> GetEmployeeByAdminRolev2(string? accessToken, int? node, string? nodeId, string role, string? revisionId, int? reqNode, string? reqNodeId, DateTime? startDate, DateTime? endDate) public async Task<List<SearchProfileDto>> SearchProfile(string? citizenId, string? firstName, string? lastName, string accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/dotnet/employee-by-admin-rolev2";
var apiKey = _configuration["API_KEY"];
var body = new
{
node = node,
nodeId = nodeId,
role = role,
// isRetirement
reqNode = reqNode,
reqNodeId = reqNodeId,
date = endDate
};
Console.WriteLine(body);
var profiles = new List<SearchProfileDto>();
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return new List<GetProfileByKeycloakIdRootDto>();
}
catch
{
throw;
}
}
public async Task<GetProfileByKeycloakIdRootAddTotalDto> SearchProfile(string? citizenId, string? firstName, string? lastName, string accessToken, int page, int pageSize, string? role, string? nodeId, int? node,string? selectedNodeId,int? selectedNode )
{ {
try try
{ {
@ -1108,31 +694,42 @@ namespace BMA.EHR.Application.Repositories
{ {
citizenId = citizenId, citizenId = citizenId,
firstName = firstName, firstName = firstName,
lastName = lastName, lastName = lastName
role = role,
nodeId = nodeId,
node = node,
page = page,
pageSize = pageSize,
selectedNodeId = selectedNodeId,
selectedNode = selectedNode
}; };
var profiles = new List<GetProfileByKeycloakIdRootDto>(); var profiles = new List<SearchProfileDto>();
var total = 0;
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey); var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null) if (apiResult != null)
{ {
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultAddTotalDto>(apiResult); var raw = JsonConvert.DeserializeObject<SearchProfileResultDto>(apiResult);
if (raw != null && raw.Result != null) if (raw != null && raw.Result != null)
{ {
profiles = raw.Result.Data; profiles.AddRange(raw.Result);
total = raw.Result.Total;
} }
} }
return new GetProfileByKeycloakIdRootAddTotalDto { Data = profiles, Total = total }; return profiles;
//var data = _dbContext.Set<Profile>().AsQueryable()
// .Where(x => x.ProfileType == "officer");
//if (citizenId != null)
// data = data.Where(x => x.CitizenId!.Contains(citizenId));
//if (firstName != null)
// data = data.Where(x => x.FirstName!.Contains(firstName));
//if (lastName != null)
// data = data.Where(x => x.LastName!.Contains(lastName));
//data = data.Include(x => x.Prefix)
// .Include(x => x.Position)
// .Include(x => x.PositionLevel)
// .Include(x => x.PosNo);
//return await data.ToListAsync();
} }
catch catch
{ {
@ -1140,7 +737,7 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public async Task<GetProfileByKeycloakIdRootAddTotalDto> SearchProfileEmployee(string? citizenId, string? firstName, string? lastName, string accessToken, int page, int pageSize, string? role, string? nodeId, int? node) public async Task<List<SearchProfileDto>> SearchProfileEmployee(string? citizenId, string? firstName, string? lastName, string accessToken)
{ {
try try
{ {
@ -1150,29 +747,42 @@ namespace BMA.EHR.Application.Repositories
{ {
citizenId = citizenId, citizenId = citizenId,
firstName = firstName, firstName = firstName,
lastName = lastName, lastName = lastName
role = role,
nodeId = nodeId,
node = node,
page = page,
pageSize = pageSize,
}; };
var profiles = new List<GetProfileByKeycloakIdRootDto>(); var profiles = new List<SearchProfileDto>();
var total = 0;
var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey); var apiResult = await PostExternalAPIAsync(apiPath, accessToken, body, apiKey);
if (apiResult != null) if (apiResult != null)
{ {
var raw = JsonConvert.DeserializeObject<GetListProfileByKeycloakIdRootResultAddTotalDto>(apiResult); var raw = JsonConvert.DeserializeObject<SearchProfileResultDto>(apiResult);
if (raw != null && raw.Result != null) if (raw != null && raw.Result != null)
{ {
profiles.AddRange(raw.Result.Data); profiles.AddRange(raw.Result);
total = raw.Result.Total;
} }
} }
return new GetProfileByKeycloakIdRootAddTotalDto { Data = profiles, Total = total }; return profiles;
//var data = _dbContext.Set<Profile>().AsQueryable()
// .Where(x => x.ProfileType == "employee");
//if (citizenId != null)
// data = data.Where(x => x.CitizenId!.Contains(citizenId));
//if (firstName != null)
// data = data.Where(x => x.FirstName!.Contains(firstName));
//if (lastName != null)
// data = data.Where(x => x.LastName!.Contains(lastName));
//data = data.Include(x => x.Prefix);
////.Include(x => x.PosNoEmployee);
//return await data.ToListAsync();
} }
catch catch
{ {
@ -1318,43 +928,11 @@ namespace BMA.EHR.Application.Repositories
} }
} }
public GetOrganizationResponseDTO? GetOcByNodeId(Guid ocId, int level, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/find/all";
var apiKey = _configuration["API_KEY"];
var body = new
{
nodeId = ocId,
node = level
};
var apiResult = PostExternalAPIAsync(apiPath, accessToken ?? "", body, apiKey).Result;
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetOrganizationResponseResultDTO>(apiResult);
if (raw != null && raw.Result != null)
{
return raw.Result;
}
}
return null;
}
catch
{
throw;
}
}
public GetOrganizationResponseDTO? GetOc(Guid ocId, int level, string? accessToken) public GetOrganizationResponseDTO? GetOc(Guid ocId, int level, string? accessToken)
{ {
try try
{ {
var apiPath = $"{_configuration["API"]}/org/find/allv2"; var apiPath = $"{_configuration["API"]}/org/find/all";
var apiKey = _configuration["API_KEY"]; var apiKey = _configuration["API_KEY"];
var body = new var body = new
{ {
@ -1500,7 +1078,7 @@ namespace BMA.EHR.Application.Repositories
{ {
try try
{ {
var apiPath = $"{_configuration["API"]}/org/unauthorize/active/root/all"; var apiPath = $"{_configuration["API"]}/org/active/root/all";
var apiKey = _configuration["API_KEY"]; var apiKey = _configuration["API_KEY"];
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey); var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
@ -1538,29 +1116,6 @@ namespace BMA.EHR.Application.Repositories
} }
public async Task PostInsigniaMessageToSocket(string message, string userId, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/through-socket/notify";
var apiKey = _configuration["API_KEY"];
var body = new
{
message = message,
userId = userId
};
var apiResult = await PostExternalAPIBooleanAsync(apiPath, accessToken ?? "", body, apiKey);
}
catch
{
throw;
}
}
public async Task PostProfileEmpInsigniaAsync(PostProfileEmpInsigniaDto body, string? accessToken) public async Task PostProfileEmpInsigniaAsync(PostProfileEmpInsigniaDto body, string? accessToken)
{ {
try try
@ -1630,54 +1185,6 @@ namespace BMA.EHR.Application.Repositories
throw; throw;
} }
} }
public GetOrgProfileByProfileIdDto GetOrgProfileByProfileId(Guid id, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/profile/org-user/{id}";
var apiKey = _configuration["API_KEY"];
var apiResult = GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
if (apiResult.Result != null)
{
var raw = JsonConvert.DeserializeObject<GetOrgProfileByProfileIdResultDto>(apiResult.Result);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
public async Task<List<GetProfileSalaryDto>> GetProfileSalaryById(Guid profileId, string? accessToken)
{
try
{
var apiPath = $"{_configuration["API"]}/org/profile/insignia/position";
var apiKey = _configuration["API_KEY"];
var body = new
{
profileId = profileId.ToString(),
};
var apiResult = await PostExternalAPIAsync(apiPath, accessToken ?? "", body, apiKey);
if (apiResult != null)
{
var raw = JsonConvert.DeserializeObject<GetProfileSalaryResultDto>(apiResult);
if (raw != null)
return raw.Result;
}
return null;
}
catch
{
throw;
}
}
#endregion #endregion
} }
} }

View file

@ -13,6 +13,5 @@
public bool? isReport { get; set; } public bool? isReport { get; set; }
public bool? isTemplate { get; set; }
} }
} }

View file

@ -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();
}
}

View file

@ -2,27 +2,19 @@
{ {
public class GetProfileLeaveByKeycloakDto 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 BirthDate { get; set; }
public DateTime RetireDate { get; set; } public DateTime RetireDate { get; set; }
public string GovAge { get; set; } = string.Empty; public string GovAge { get; set; } = string.Empty;
public string Age { get; set; } = string.Empty; public string Age { get; set; } = string.Empty;
public DateTime DateAppoint { get; set; } public DateTime DateAppoint { get; set; }
public DateTime DateCurrent { get; set; } public DateTime DateCurrent { get; set; }
public int? Amount { get; set; } = 0; public int Amount { get; set; }
public string? TelephoneNumber { get; set; } = string.Empty; public string? TelephoneNumber { get; set; } = string.Empty;
public string Position { get; set; } = string.Empty; public string PositionName { get; set; } = string.Empty;
public string PosLevel { get; set; } = string.Empty; public string PosLevel { get; set; } = string.Empty;
public string PosType { 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 CurrentAddress { get; set; } = string.Empty;
public string Oc { 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 Root { get; set; } = string.Empty;
public string? Child1 { get; set; } public string? Child1 { get; set; }
public string? Child2 { get; set; } public string? Child2 { get; set; }

View file

@ -8,8 +8,6 @@
public string LeaveTypeCode { get; set; } = string.Empty; public string LeaveTypeCode { get; set; } = string.Empty;
public double SumLeaveDay { get; set; } = 0.0; public double SumLeaveDay { get; set; }
public int CountLeaveDay { get; set; } = 0;
} }
} }

View file

@ -37,11 +37,5 @@ namespace BMA.EHR.Application.Responses.Organizations
public string? Child4 { get; set; } public string? Child4 { get; set; }
public string? Child4ShortName { get; set; } public string? Child4ShortName { get; set; }
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; }
} }
} }

View file

@ -8,12 +8,4 @@
public List<GetProfileByKeycloakIdRootDto> Result { get; set; } = new(); public List<GetProfileByKeycloakIdRootDto> Result { get; set; } = new();
} }
public class GetListProfileByKeycloakIdRootResultAddTotalDto
{
public string Message { get; set; } = string.Empty;
public int Status { get; set; } = -1;
public GetProfileByKeycloakIdRootAddTotalDto Result { get; set; } = new();
}
} }

View file

@ -1,35 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace BMA.EHR.Application.Responses.Profiles
{
public class GetOcStaff
{
public Guid ProfileId { get; set; }
public Guid Keycloak { get; set; }
public string FullName { get; set; } = null!;
public Guid? RootId { get; set; }
public Guid? OrgChild1Id { get; set; }
public Guid? OrgChild2Id { get; set; }
public Guid? OrgChild3Id { get; set; }
public Guid? OrgChild4Id { get; set; }
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 GetOcStaffResultDto
{
public string Message { get; set; } = string.Empty;
public int Status { get; set; } = -1;
public List<GetOcStaff> Result { get; set; } = new();
}
}

View file

@ -1,11 +0,0 @@
namespace BMA.EHR.Application.Responses.Profiles
{
public class GetOrgProfileByProfileIdDto
{
public string? Root { get; set; }
public string? Child1 { get; set; }
public string? Child2 { get; set; }
public string? Child3 { get; set; }
public string? Child4 { get; set; }
}
}

View file

@ -1,11 +0,0 @@
namespace BMA.EHR.Application.Responses.Profiles
{
public class GetOrgProfileByProfileIdResultDto
{
public string Message { get; set; } = string.Empty;
public int Status { get; set; } = -1;
public GetOrgProfileByProfileIdDto? Result { get; set; }
}
}

View file

@ -44,8 +44,6 @@ namespace BMA.EHR.Application.Responses.Profiles
public string? ProfileType { get; set; } public string? ProfileType { get; set; }
public bool? IsLeave { get; set; } public bool? IsLeave { get; set; }
public bool? IsProbation { get; set; }
public string? Root { get; set; } public string? Root { get; set; }
public string? Child1 { get; set; } public string? Child1 { get; set; }
public string? Child2 { get; set; } public string? Child2 { get; set; }
@ -83,8 +81,6 @@ namespace BMA.EHR.Application.Responses.Profiles
public string? PositionLeaveName { get; set; } public string? PositionLeaveName { get; set; }
public string? PosExecutiveName { get; set; }
public string? CommanderPositionName { get; set; } = string.Empty; public string? CommanderPositionName { get; set; } = string.Empty;
} }

View file

@ -16,27 +16,5 @@ namespace BMA.EHR.Application.Responses.Profiles
public string? PositionLevel { get; set; } public string? PositionLevel { get; set; }
public string? PositionType { get; set; } public string? PositionType { get; set; }
public string? Oc { get; set; } public string? Oc { get; set; }
public string? OrgRootId { get; set; }
public string? OrgChild1Id { get; set; }
public string? OrgChild2Id { get; set; }
public string? OrgChild3Id { get; set; }
public string? OrgChild4Id { get; set; }
public DateTime? DateStart { get; set; }
public DateTime? DateAppoint { get; set; }
public string? RootDnaId { get; set; }
public string? Child1DnaId { get; set; }
public string? Child2DnaId { get; set; }
public string? Child3DnaId { get; set; }
public string? Child4DnaId { get; set; }
}
public class GetProfileByKeycloakIdRootAddTotalDto
{
public List<GetProfileByKeycloakIdRootDto> Data { get; set; } = new();
public int Total { get; set; }
} }
} }

View file

@ -1,16 +0,0 @@
namespace BMA.EHR.Application.Responses.Profiles
{
public class GetProfileSalaryDto
{
public DateTime DateAffect { get; set; }
public string Position { get; set; } = string.Empty;
public string Root { get; set; } = string.Empty;
public string Child1 { get; set; } = string.Empty;
public string Child2 { get; set; } = string.Empty;
public string Child3 { get; set; } = string.Empty;
public string Child4 { get; set; } = string.Empty;
public int Age { get; set; } = 0;
public int Amount { get; set; } = 0;
public string Remark { get; set; } = string.Empty;
}
}

View file

@ -1,11 +0,0 @@
namespace BMA.EHR.Application.Responses.Profiles
{
public class GetProfileSalaryResultDto
{
public string Message { get; set; } = string.Empty;
public int Status { get; set; } = -1;
public List<GetProfileSalaryDto> Result { get; set; } = new();
}
}

View file

@ -1,24 +0,0 @@
# Build artifacts
bin/
obj/
# IDE / tooling
Properties/
.vs/
.vscode/
.idea/
# Source control
.git/
.gitignore
# Documentation
*.md
# Docker
Dockerfile
.dockerignore
# OS files
.DS_Store
Thumbs.db

View file

@ -1,83 +0,0 @@
# สรุปการปรับปรุงระบบลงเวลา (CheckInConsumer)
วันที่แก้ไข: 23 มิถุนายน 2026
---
## ปัญหาเดิม
ตอนที่พนักงานลงเวลาพร้อมกันจำนวนมาก (ประมาณ 2,000 รายการ) ระบบประมวลผลทีละรายการ ทำให้ต้องรอคิวนานถึง **22 นาที** กว่าจะประมวลผลเสร็จทั้งหมด
เปรียบเทียบเหมือน **โต๊ะบัญชี 1 คน รับคิวทีละคน** ทั้งที่มีคนรอ 2,000 คน → คิวยาวมาก
---
## วิธีที่แก้ (เข้าใจง่าย ๆ)
### 1. เพิ่มคนช่วยประมวลผลพร้อมกัน (Concurrency)
- **ก่อน:** ประมวลผลทีละรายการ (เหมือนมีโต๊ะบัญชี 1 โต๊ะ)
- **หลัง:** ประมวลผลพร้อมกันได้สูงสุด **5 รายการ** (เหมือนเปิดโต๊ะบัญชี 5 โต๊ะ)
> ผลที่ได้: เวลารอคิวลดลงจาก **22 นาที → ประมาณ 45 นาที**
### 2. จัดคิวล่วงหน้าให้ RabbitMQ (Prefetch)
- **ก่อน:** ระบบดึงข้อมูลมาทีละชิ้น ทำให้เสียเวลารอส่งต่อ
- **หลัง:** ระบบดึงข้อมูลมาเป็นชุด ๆ ละ 20 ชิ้นไว้เตรียมพร้อม → ลดเวลารอระหว่างรายการ
### 3. ลดเวลารอเมื่อ API มีปัญหา (Timeout)
- **ก่อน:** ถ้า API ค้าง ระบบจะรอนานถึง **5 นาที** ต่อรายการ
- **หลัง:** ลดเหลือ **1 นาที** → รายการที่มีปัญหาจะถูกปฏิเสธเร็วขึ้น ไม่ทำให้คิวค้าง
### 4. ปรับปรุงการเชื่อมต่อ HTTP
- เปลี่ยนระบบเชื่อมต่อให้รองรับการส่งคำขอหลายรายการพร้อมกันโดยไม่สะดุด
---
## ตัวเลขเปรียบเทียบ
| รายการ | ก่อนแก้ | หลังแก้ |
|---|---|---|
| จำนวนรายการที่ประมวลผลพร้อมกัน | 1 | 5 |
| เวลารอคิวสูงสุด (2,000 รายการ) | ~22 นาที | ~45 นาที |
| เวลารอเมื่อ API มีปัญหา | 5 นาที | 1 นาที |
---
## ไฟล์ที่แก้ไข
1. **`Program.cs`** — โค้ดหลักของตัวประมวลผลคิว
2. **`appsettings.json`** — ไฟล์ตั้งค่าระบบ
---
## วิธีปรับความเร็วเพิ่มเติม (ไม่ต้องเขียนโค้ดใหม่)
ถ้าหลังทดสอบแล้วเห็นว่าระบบรับได้ และอยากให้เร็วขึ้นอีก ให้แก้ไขไฟล์ `appsettings.json` แล้ว restart โปรแกรมได้เลย:
```json
{
"MaxConcurrency": 10, ← เพิ่มจาก 5 เป็น 10 (ประมวลผลพร้อมกัน 10 รายการ)
"PrefetchCount": 50, ← ควรตั้งเป็น ประมาณ MaxConcurrency × 2 ขึ้นไป
"HttpTimeoutSeconds": 60 ← เวลารอ API วินาที
}
```
**ค่าที่ใช้และผลที่คาดการณ์:**
- `MaxConcurrency = 5` → ใช้เวลา ~45 นาที (ค่าเริ่มต้นปลอดภัย)
- `MaxConcurrency = 10` → ใช้เวลา ~23 นาที
- `MaxConcurrency = 20` → ใช้เวลา ~12 นาที (ต้องตรวจสอบว่าระบบหลังบ้านรับไหวก่อน)
---
## ข้อควรระวัง / คำแนะนำ
1. **ควรทดสอบในระบบทดสอบก่อน** โดยดูว่า
- ไม่มี error ในระบบหลัก (API)
- ฐานข้อมูลไม่ช้าผิดปกติ
- ไม่พบปัญหาลงเวลาซ้ำซ้อน
2. ถ้าพบปัญหา เช่น
- มี error ใน API → **ลด** `MaxConcurrency` เหลือ 2 หรือ 3
- ลงเวลาซ้ำ → แจ้งทีมเทคนิคเพื่อแก้ฝั่ง API เพิ่มเติม
3. **ค่า `MaxConcurrency = 5` เป็นค่าปลอดภัย** เพราะระบบ API ด้านหลังยังมีข้อจำกัดอยู่บางส่วน หากต้องการเพิ่มให้สูงกว่านี้ (เช่น 2050) ควรปรึกษาทีมเทคนิคเพื่อปรับปรุงฝั่ง API ก่อน

View file

@ -1,4 +1,4 @@
## See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. ## See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# #
## This stage is used when running from VS in fast mode (Default for Debug configuration) ## This stage is used when running from VS in fast mode (Default for Debug configuration)
#FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base #FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
@ -21,7 +21,6 @@
#ARG BUILD_CONFIGURATION=Release #ARG BUILD_CONFIGURATION=Release
#RUN dotnet publish "BMA.EHR.CheckInConsumer.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false #RUN dotnet publish "BMA.EHR.CheckInConsumer.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# #
## This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration) ## This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
#FROM base AS final #FROM base AS final
#WORKDIR /app #WORKDIR /app
@ -30,25 +29,30 @@
# ใช้ official .NET SDK image สำหรับการ build # ใช้ official .NET SDK image สำหรับการ build
# Note: Build context = repository root (ตามที่ GitHub Actions ใช้)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
# กำหนด working directory ภายใน container
WORKDIR /src WORKDIR /src
# copy เฉพาะ .csproj ก่อน เพื่อใช้ layer caching (restore เร็ว เก็บ cache นาน) # คัดลอกไฟล์ .csproj และ restore dependencies
COPY BMA.EHR.CheckInConsumer/BMA.EHR.CheckInConsumer.csproj ./BMA.EHR.CheckInConsumer/ # COPY *.csproj ./
WORKDIR /src/BMA.EHR.CheckInConsumer COPY . ./
RUN dotnet restore "BMA.EHR.CheckInConsumer.csproj" RUN dotnet restore
# คัดลอก source ที่เหลือแล้ว publish # คัดลอกไฟล์ทั้งหมดและ build
COPY BMA.EHR.CheckInConsumer/ ./ COPY . ./
RUN dotnet publish "BMA.EHR.CheckInConsumer.csproj" -c Release -o /app/publish /p:UseAppHost=false RUN dotnet build -c Release -o /app/build
# WORKDIR "/src/BMA.EHR.CheckInConsumer"
# RUN dotnet build "BMA.EHR.CheckInConsumer.csproj" -c Release -o /app/build
# ใช้ stage ใหม่สำหรับ runtime (image เล็กลง) # ใช้ stage ใหม่สำหรับการ runtime
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
# กำหนด working directory สำหรับ runtime
WORKDIR /app WORKDIR /app
COPY --from=build /app/publish . # คัดลอกไฟล์จาก build stage มายัง runtime stage
COPY --from=build /app/build .
# ระบุ entry point ของแอปพลิเคชัน
ENTRYPOINT ["dotnet", "BMA.EHR.CheckInConsumer.dll"] ENTRYPOINT ["dotnet", "BMA.EHR.CheckInConsumer.dll"]

View file

@ -1,4 +1,4 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using RabbitMQ.Client; using RabbitMQ.Client;
using RabbitMQ.Client.Events; using RabbitMQ.Client.Events;
using System.Text; using System.Text;
@ -18,101 +18,66 @@ var user = configuration["Rabbit:User"] ?? "";
var pass = configuration["Rabbit:Password"] ?? ""; var pass = configuration["Rabbit:Password"] ?? "";
var queue = configuration["Rabbit:Queue"] ?? "basic-queue"; var queue = configuration["Rabbit:Queue"] ?? "basic-queue";
// Concurrency & prefetch (configurable via appsettings.json)
var maxConcurrency = int.TryParse(configuration["MaxConcurrency"], out var c) && c > 0 ? c : 5;
var prefetchCount = ushort.TryParse(configuration["PrefetchCount"], out var p) && p > 0 ? p : (ushort)20;
var httpTimeoutSec = int.TryParse(configuration["HttpTimeoutSeconds"], out var t) && t > 0 ? t : 60;
WriteToConsole($"Config -> MaxConcurrency: {maxConcurrency}, PrefetchCount: {prefetchCount}, HttpTimeout: {httpTimeoutSec}s");
// create connection // create connection
var factory = new ConnectionFactory() var factory = new ConnectionFactory()
{ {
HostName = host, //Uri = new Uri("amqp://admin:P@ssw0rd@192.168.4.11:5672")
UserName = user, HostName = host,// หรือ hostname ของ RabbitMQ Server ที่คุณใช้
Password = pass, UserName = user, // ใส่ชื่อผู้ใช้ของคุณ
DispatchConsumersAsync = true Password = pass // ใส่รหัสผ่านของคุณ
}; };
using var connection = factory.CreateConnection(); using var connection = factory.CreateConnection();
using var channel = connection.CreateModel(); using var channel = connection.CreateModel();
//channel.QueueDeclare(queue: "bma-checkin-queue", durable: true, exclusive: false, autoDelete: false, arguments: null);
channel.QueueDeclare(queue: queue, durable: true, exclusive: false, autoDelete: false, arguments: null); channel.QueueDeclare(queue: queue, durable: true, exclusive: false, autoDelete: false, arguments: null);
// Prefetch: RabbitMQ จะส่ง message หลายตัวมาที่ consumer พร้อมกัน (ลด network round-trip) var consumer = new EventingBasicConsumer(channel);
channel.BasicQos(prefetchSize: 0, prefetchCount: prefetchCount, global: false);
// HttpClient แบบ SocketsHttpHandler พร้อม connection pooling รองรับ concurrent requests consumer.Received += async (model, ea) =>
var socketsHandler = new SocketsHttpHandler
{ {
MaxConnectionsPerServer = maxConcurrency * 2,
PooledConnectionLifetime = TimeSpan.FromMinutes(2),
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(30)
};
using var httpClient = new HttpClient(socketsHandler);
httpClient.Timeout = TimeSpan.FromSeconds(httpTimeoutSec);
// SemaphoreSlim คุมจำนวน message ที่ประมวลผลพร้อมกัน (เนื่องจาก API มีข้อจำกัดเรื่อง concurrency)
using var semaphore = new SemaphoreSlim(maxConcurrency, maxConcurrency);
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
// รอ semaphore ก่อนเริ่มประมวลผล
semaphore.WaitAsync().ContinueWith(async _ =>
{
try
{
var body = ea.Body.ToArray(); var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body); var message = Encoding.UTF8.GetString(body);
await CallRestApi(message);
WriteToConsole($"Received message: {message}"); // convert string into object
//var request = JsonConvert.DeserializeObject<CheckInRequest>(message);
//using (var db = new ApplicationDbContext())
//{
// var item = new AttendantItem
// {
// Name = request.Name,
// CheckInDateTime = request.CheckInDateTime,
// };
// db.AttendantItems.Add(item);
// db.SaveChanges();
var success = await CallRestApi(message, httpClient, configuration); // WriteToConsole($"ได้รับคำขอจาก Queue: {message}");
// WriteToConsole($"ตอบกลับจาก REST API: {JsonConvert.SerializeObject(item)}");
//}
if (success) WriteToConsole($"ได้รับคำขอจาก Queue: {message}");
{ //WriteToConsole($"ตอบกลับจาก REST API: {JsonConvert.SerializeObject(item)}");
channel.BasicAck(ea.DeliveryTag, multiple: false);
WriteToConsole("Message processed successfully");
}
else
{
channel.BasicNack(ea.DeliveryTag, multiple: false, requeue: false);
WriteToConsole("Message processing failed - message rejected");
}
}
catch (Exception ex)
{
WriteToConsole($"Error processing message: {ex.Message}");
channel.BasicNack(ea.DeliveryTag, multiple: false, requeue: false);
}
finally
{
semaphore.Release();
}
}, TaskScheduler.Default).ConfigureAwait(false);
return Task.CompletedTask;
}; };
channel.BasicConsume(queue: queue, autoAck: false, consumer: consumer); //channel.BasicConsume(queue: "bma-checkin-queue", autoAck: true, consumer: consumer);
channel.BasicConsume(queue: queue, autoAck: true, consumer: consumer);
WriteToConsole("Consumer started. Waiting for messages..."); //Console.WriteLine("\nPress 'Enter' to exit the process...");
// Keep the application running
await Task.Delay(-1); await Task.Delay(-1);
static void WriteToConsole(string message) static void WriteToConsole(string message)
{ {
Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} : {message}"); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} : {message}");
} }
static async Task<bool> CallRestApi(string requestData, HttpClient client, IConfiguration configuration) async Task CallRestApi(string requestData)
{ {
try using var client = new HttpClient();
{
var apiPath = $"{configuration["API"]}/leave/process-check-in"; var apiPath = $"{configuration["API"]}/leave/process-check-in";
var content = new StringContent(requestData, Encoding.UTF8, "application/json"); var content = new StringContent(requestData, Encoding.UTF8, "application/json");
var response = await client.PostAsync(apiPath, content); var response = await client.PostAsync(apiPath, content);
@ -120,34 +85,17 @@ static async Task<bool> CallRestApi(string requestData, HttpClient client, IConf
if (response.IsSuccessStatusCode) if (response.IsSuccessStatusCode)
{ {
var responseContent = await response.Content.ReadAsStringAsync(); var responseContent = await response.Content.ReadAsStringAsync();
WriteToConsole($"API Success: {responseContent}"); WriteToConsole(responseContent);
return true;
} }
else else
{ {
var errorMessage = await response.Content.ReadAsStringAsync(); var errorMessage = await response.Content.ReadAsStringAsync();
var res = JsonSerializer.Deserialize<ResponseObject>(errorMessage); var res = JsonSerializer.Deserialize<ResponseObject>(errorMessage);
WriteToConsole($"API Error ({response.StatusCode}): {res?.Message ?? errorMessage}"); WriteToConsole($"Error: {res.Message}");
return false;
}
}
catch (HttpRequestException ex)
{
WriteToConsole($"HTTP Error: {ex.Message}");
return false;
}
catch (TaskCanceledException ex)
{
WriteToConsole($"Timeout: {ex.Message}");
return false;
}
catch (Exception ex)
{
WriteToConsole($"Unexpected Error: {ex.Message}");
return false;
} }
} }
public class ResponseObject public class ResponseObject
{ {
[JsonPropertyName("status")] [JsonPropertyName("status")]
@ -163,14 +111,28 @@ public class ResponseObject
public class CheckTimeDtoRB public class CheckTimeDtoRB
{ {
public Guid? CheckInId { get; set; } public Guid? CheckInId { get; set; }
public double Lat { get; set; } = 0; public double Lat { get; set; } = 0;
public double Lon { get; set; } = 0; public double Lon { get; set; } = 0;
public string POI { get; set; } = string.Empty; public string POI { get; set; } = string.Empty;
public bool IsLocation { get; set; } = true; public bool IsLocation { get; set; } = true;
public string? LocationName { get; set; } = string.Empty; public string? LocationName { get; set; } = string.Empty;
public string? Remark { get; set; } = string.Empty; public string? Remark { get; set; } = string.Empty;
public Guid? UserId { get; set; } public Guid? UserId { get; set; }
public DateTime? CurrentDate { get; set; } public DateTime? CurrentDate { get; set; }
public string? CheckInFileName { get; set; } public string? CheckInFileName { get; set; }
public byte[]? CheckInFileBytes { get; set; } public byte[]? CheckInFileBytes { get; set; }
} }

View file

@ -1,12 +1,9 @@
{ {
"Rabbit": { "Rabbit": {
"Host": "192.168.1.63", "Host": "192.168.1.40",
"User": "admin", "User": "admin",
"Password": "12345678", "Password": "Test123456",
"Queue": "hrms-checkin-queue-dev" "Queue": "bma-checkin-queue"
}, },
"API": "https://localhost:7283/api/v1", "API": "https://localhost:7283/api/v1"
"MaxConcurrency": 5,
"PrefetchCount": 20,
"HttpTimeoutSeconds": 60
} }

View file

@ -8,15 +8,14 @@ using BMA.EHR.Infrastructure.Persistence;
// using BMA.EHR.Placement.Service.Requests; // using BMA.EHR.Placement.Service.Requests;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Annotations;
using System.Linq;
using System.Net.Http.Headers;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Security.Claims; using System.Security.Claims;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Net.Http.Headers;
namespace BMA.EHR.DisciplineComplaint.Service.Controllers namespace BMA.EHR.DisciplineComplaint.Service.Controllers
{ {
@ -107,152 +106,6 @@ namespace BMA.EHR.DisciplineComplaint.Service.Controllers
return Success(new { data, total = data_search.Count() }); return Success(new { data, total = data_search.Count() });
} }
/// <summary>
/// list รายการวินัยเรื่องร้องเรียน (ค้นหาขั้นสูง)
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("advance-search")]
public async Task<ActionResult<ResponseObject>> GetAdvanceSearchDisciplineComplaint([FromBody] DisciplineComplaintAdvanceSearcRequest req)
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_COMPLAIN");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var page = req.page <= 0 ? 1 : req.page;
var pageSize = req.pageSize <= 0 ? 25 : req.pageSize;
var keyword = string.IsNullOrEmpty(req.keyword) ? string.Empty : req.keyword;
var status = string.IsNullOrEmpty(req.status) ? string.Empty : req.status;
var data_search = (from x in _context.DisciplineComplaints
where x.Title.Contains(keyword) ||
(x.Appellant == null ? false : x.Appellant.Contains(keyword))
select x).ToList();
if (status.Trim().ToUpper() != "ALL")
data_search = data_search.Where(x => x.Status.Contains(status.Trim().ToUpper())).ToList();
if (
(req.dateReceivedStart.HasValue && req.dateReceivedEnd.HasValue) ||
(req.dateConsiderationStart.HasValue && req.dateConsiderationEnd.HasValue) ||
(!string.IsNullOrEmpty(req.respondentType)) ||
(!string.IsNullOrEmpty(req.offenseDetails)) ||
(!string.IsNullOrEmpty(req.levelConsideration))
)
{
data_search = data_search
.Where(x =>
(!req.dateReceivedStart.HasValue || !req.dateReceivedEnd.HasValue ||
(x.DateReceived.HasValue &&
x.DateReceived.Value.Date <= req.dateReceivedStart.Value.Date &&
x.DateReceived.Value.Date >= req.dateReceivedEnd.Value.Date))
&&
(!req.dateConsiderationStart.HasValue || !req.dateConsiderationEnd.HasValue ||
(x.DateConsideration.HasValue &&
x.DateConsideration.Value.Date <= req.dateConsiderationStart.Value.Date &&
x.DateConsideration.Value.Date >= req.dateConsiderationEnd.Value.Date))
&&
(string.IsNullOrEmpty(req.respondentType) || x.RespondentType == req.respondentType)
&&
(string.IsNullOrEmpty(req.offenseDetails) || x.OffenseDetails == req.offenseDetails)
&&
(string.IsNullOrEmpty(req.levelConsideration) || x.LevelConsideration == req.levelConsideration)
)
.ToList();
}
var query = data_search
.Select(x => new
{
Id = x.Id,//id ข้อมูลเรื่องร้องเรียน
Title = x.Title,//ชื่อเรื่อง
RespondentType = x.RespondentType,
Appellant = x.Appellant,//ผู้ถูกร้องเรียน
OffenseDetails = x.OffenseDetails,//ลักษณะความผิด
CreatedAt = x.CreatedAt,//วันที่สร้างเรื่องร้องเรียน
LevelConsideration = x.LevelConsideration,//ระดับการพิจารณา
DateConsideration = x.DateConsideration,//วันที่กำหนดพิจารณา
DateReceived = x.DateReceived,//วันที่รับเรื่อง
Status = x.Status,//สถานะเรื่องร้องเรียน มีดังนี้ ใหม่ (NEW), ยุติเรื่อง (STOP), มีมูลส่งไปสืบสวนแล้ว (SEND_INVESTIGATE)
Result = x.Result,
});
bool desc = req.descending ?? false;
if (!string.IsNullOrEmpty(req.sortBy))
{
switch (req.sortBy)
{
case "title":
query = desc ? query.OrderByDescending(x => x.Title)
: query.OrderBy(x => x.Title);
break;
case "respondentType":
query = desc ? query.OrderByDescending(x => x.RespondentType)
: query.OrderBy(x => x.RespondentType);
break;
case "appellant":
query = desc ? query.OrderByDescending(x => x.Appellant)
: query.OrderBy(x => x.Appellant);
break;
case "offenseDetails":
query = desc ? query.OrderByDescending(x => x.OffenseDetails)
: query.OrderBy(x => x.OffenseDetails);
break;
case "createdAt":
query = desc ? query.OrderByDescending(x => x.CreatedAt)
: query.OrderBy(x => x.CreatedAt);
break;
case "levelConsideration":
query = desc ? query.OrderByDescending(x => x.LevelConsideration)
: query.OrderBy(x => x.LevelConsideration);
break;
case "dateConsideration":
query = desc ? query.OrderByDescending(x => x.DateConsideration)
: query.OrderBy(x => x.DateConsideration);
break;
case "dateReceived":
query = desc ? query.OrderByDescending(x => x.DateReceived)
: query.OrderBy(x => x.DateReceived);
break;
case "status":
query = desc ? query.OrderByDescending(x => x.Status)
: query.OrderBy(x => x.Status);
break;
case "result":
query = desc ? query.OrderByDescending(x => x.Result)
: query.OrderBy(x => x.Result);
break;
default:
query = query.OrderByDescending(x => x.DateConsideration);
break;
}
}
var data = query
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
return Success(new { data, total = data_search.Count() });
}
/// <summary> /// <summary>
/// list รายการวินัยเรื่องร้องเรียนในหน้าออกคำสั่ง /// list รายการวินัยเรื่องร้องเรียนในหน้าออกคำสั่ง
/// </summary> /// </summary>
@ -837,7 +690,7 @@ namespace BMA.EHR.DisciplineComplaint.Service.Controllers
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = persons.Select(x => x.PersonId), refId = persons.Select(x => x.PersonId),

View file

@ -90,15 +90,14 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
/// <response code="401">ไม่ได้ Login เข้าระบบ</response> /// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response> /// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpGet("user")] [HttpGet("user")]
public async Task<ActionResult<ResponseObject>> GetDisciplineUser(string status = "ALL", string type = "ALL", int year = 0, int page = 1, int pageSize = 25, string keyword = "", string? sortBy = null, bool descending = false) public async Task<ActionResult<ResponseObject>> GetDisciplineUser(string status = "ALL", string type = "ALL", int year = 0, int page = 1, int pageSize = 25, string keyword = "")
{ {
var id = ""; var id = "";
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position"; var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -126,7 +125,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
data_search = data_search.Where(x => x.Type == type).ToList(); data_search = data_search.Where(x => x.Type == type).ToList();
if (year != 0) if (year != 0)
data_search = data_search.Where(x => x.Year == year).ToList(); data_search = data_search.Where(x => x.Year == year).ToList();
var query = data_search var data = data_search
.Select(x => new .Select(x => new
{ {
Id = x.Id, Id = x.Id,
@ -142,42 +141,8 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
ProfileId = x.ProfileId, ProfileId = x.ProfileId,
LastUpdatedAt = x.LastUpdatedAt, LastUpdatedAt = x.LastUpdatedAt,
CreatedAt = x.CreatedAt CreatedAt = x.CreatedAt
}); })
if (!string.IsNullOrEmpty(sortBy)) .OrderByDescending(x => x.CreatedAt)
{
{
if (sortBy == "title")
query = descending ? query.OrderByDescending(x => x.Title) : query.OrderBy(x => x.Title);
else if (sortBy == "year")
query = descending ? query.OrderByDescending(x => x.Year) : query.OrderBy(x => x.Year);
else if (sortBy == "status")
query = descending ? query.OrderByDescending(x => x.Status) : query.OrderBy(x => x.Status);
else if (sortBy == "description")
query = descending ? query.OrderByDescending(x => x.Description) : query.OrderBy(x => x.Description);
else if (sortBy == "type")
query = descending ? query.OrderByDescending(x => x.Type) : query.OrderBy(x => x.Type);
else if (sortBy == "caseType")
query = descending ? query.OrderByDescending(x => x.CaseType) : query.OrderBy(x => x.CaseType);
else if (sortBy == "caseNumber")
query = descending ? query.OrderByDescending(x => x.CaseNumber) : query.OrderBy(x => x.CaseNumber);
else if (sortBy == "fullname")
query = descending ? query.OrderByDescending(x => x.Fullname) : query.OrderBy(x => x.Fullname);
else if (sortBy == "citizenId")
query = descending ? query.OrderByDescending(x => x.CitizenId) : query.OrderBy(x => x.CitizenId);
else if (sortBy == "lastUpdatedAt")
query = descending ? query.OrderByDescending(x => x.LastUpdatedAt) : query.OrderBy(x => x.LastUpdatedAt);
else if (sortBy == "createdAt")
query = descending ? query.OrderByDescending(x => x.CreatedAt) : query.OrderBy(x => x.CreatedAt);
else
query = query.OrderByDescending(x => x.CreatedAt); // default
}
}
else
{
query = query.OrderByDescending(x => x.CreatedAt);
}
var data = query
.Skip((page - 1) * pageSize) .Skip((page - 1) * pageSize)
.Take(pageSize) .Take(pageSize)
.ToList(); .ToList();
@ -358,15 +323,14 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
[HttpPost()] [HttpPost()]
public async Task<ActionResult<ResponseObject>> CreateDiscipline([FromForm] DisciplineComplaint_AppealRequest req) public async Task<ActionResult<ResponseObject>> CreateDiscipline([FromForm] DisciplineComplaint_AppealRequest req)
{ {
//var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position"; var apiUrl = $"{_configuration["API"]}/org/profile/keycloak/position";
var apiUrl = $"{_configuration["API"]}/org/dotnet/get-profileId";
var id = ""; var id = "";
var type = ""; var type = "";
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync(); var _result = await _res.Content.ReadAsStringAsync();
@ -387,7 +351,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
Description = req.Description, Description = req.Description,
Status = "NEW", Status = "NEW",
Type = req.Type.Trim().ToUpper(), Type = req.Type.Trim().ToUpper(),
Year = req.Year == null ? DateTime.Now.CalculateFisicalYear() : req.Year, Year = req.Year == null ? DateTime.Now.Year : req.Year,
CaseType = req.CaseType, CaseType = req.CaseType,
CaseNumber = req.CaseNumber, CaseNumber = req.CaseNumber,
Fullname = req.Fullname, Fullname = req.Fullname,
@ -406,7 +370,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _apiUrl = $"{_configuration["API"]}/org/profile/profileid/position/{id}"; var _apiUrl = $"{_configuration["API"]}/org/profile/profileid/position/{id}";
var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, _apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
@ -481,7 +445,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
{ {
client.DefaultRequestHeaders.Authorization = client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var __res = await client.PostAsJsonAsync(apiUrlOrg, new var __res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = new List<Guid> { Guid.Parse(id) }, refId = new List<Guid> { Guid.Parse(id) },
@ -545,7 +509,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var apiUrl = $"{_configuration["API"]}/org/profile/profileid/position/{req.ProfileId}"; var apiUrl = $"{_configuration["API"]}/org/profile/profileid/position/{req.ProfileId}";
var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req); var _res = await client.SendAsync(_req);
@ -619,7 +583,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var __res = await client.PostAsJsonAsync(apiUrlOrg, new var __res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = new List<Guid> { Guid.Parse(req.ProfileId) }, refId = new List<Guid> { Guid.Parse(req.ProfileId) },
@ -748,7 +712,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
/// <response code="401">ไม่ได้ Login เข้าระบบ</response> /// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response> /// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpGet("admin")] [HttpGet("admin")]
public async Task<ActionResult<ResponseObject>> GetDisciplineAdmin(string status = "ALL", string type = "ALL", int year = 0, int page = 1, int pageSize = 25, string keyword = "", string? sortBy = "", bool? descending = false) public async Task<ActionResult<ResponseObject>> GetDisciplineAdmin(string status = "ALL", string type = "ALL", int year = 0, int page = 1, int pageSize = 25, string keyword = "")
{ {
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_APPEAL"); var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_APPEAL");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission); var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -774,19 +738,7 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
? profileAdmin?.RootDnaId ? profileAdmin?.RootDnaId
: ""; : "";
} }
if (role == "BROTHER") else if (role == "ROOT")
{
nodeId = profileAdmin?.Node == 4
? profileAdmin?.Child3DnaId
: profileAdmin?.Node == 3
? profileAdmin?.Child2DnaId
: profileAdmin?.Node == 2
? profileAdmin?.Child1DnaId
: profileAdmin?.Node == 1 || profileAdmin?.Node == 0
? profileAdmin?.RootDnaId
: "";
}
else if (role == "ROOT" /*|| role == "PARENT"*/)
{ {
nodeId = profileAdmin?.RootDnaId; nodeId = profileAdmin?.RootDnaId;
} }
@ -816,33 +768,17 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
data_search = data_search data_search = data_search
.Where(x => node == 4 ? x.child4DnaId == nodeId : (node == 3 ? x.child3DnaId == nodeId : (node == 2 ? x.child2DnaId == nodeId : (node == 1 ? x.child1DnaId == nodeId : (node == 0 ? x.rootDnaId == nodeId : (node == null ? true : true)))))).ToList(); .Where(x => node == 4 ? x.child4DnaId == nodeId : (node == 3 ? x.child3DnaId == nodeId : (node == 2 ? x.child2DnaId == nodeId : (node == 1 ? x.child1DnaId == nodeId : (node == 0 ? x.rootDnaId == nodeId : (node == null ? true : true)))))).ToList();
} }
else if (role == "BROTHER")
{
data_search = data_search
.Where(x => node == 4 ? x.child3DnaId == nodeId : (node == 3 ? x.child2DnaId == nodeId : (node == 2 ? x.child1DnaId == nodeId : (node == 1 || node == 0 ? x.rootDnaId == nodeId : (node == null ? true : true))))).ToList();
}
else if (role == "ROOT") else if (role == "ROOT")
{ {
data_search = data_search data_search = data_search
.Where(x => x.rootDnaId == nodeId).ToList(); .Where(x => x.rootDnaId == nodeId).ToList();
} }
// else if (role == "PARENT")
// {
// data_search = data_search
// .Where(x => x.rootDnaId == nodeId && x.child1DnaId != null).ToList();
// }
else if (role == "NORMAL") else if (role == "NORMAL")
{ {
data_search = data_search.Where(x => data_search = data_search
node == 0 ? x.rootDnaId == nodeId && x.child1DnaId == null : .Where(x => node == 0 ? x.child1DnaId == null : (node == 1 ? x.child2DnaId == null : (node == 2 ? x.child3DnaId == null : (node == 3 ? x.child4DnaId == null : true)))).ToList();
node == 1 ? x.child1DnaId == nodeId && x.child2DnaId == null :
node == 2 ? x.child2DnaId == nodeId && x.child3DnaId == null :
node == 3 ? x.child3DnaId == nodeId && x.child4DnaId == null :
node == 4 ? x.child4DnaId == nodeId :
true
).ToList();
} }
var query = data_search var data = data_search
.Select(x => new .Select(x => new
{ {
Id = x.Id, Id = x.Id,
@ -858,76 +794,12 @@ namespace BMA.EHR.DisciplineComplaint_Appeal.Service.Controllers
ProfileId = x.ProfileId, ProfileId = x.ProfileId,
LastUpdatedAt = x.LastUpdatedAt, LastUpdatedAt = x.LastUpdatedAt,
profileType = x.profileType profileType = x.profileType
}); })
bool desc = descending ?? false;
if (!string.IsNullOrEmpty(sortBy))
{
switch (sortBy)
{
case "title":
query = desc ? query.OrderByDescending(x => x.Title)
: query.OrderBy(x => x.Title);
break;
case "description":
query = desc ? query.OrderByDescending(x => x.Description)
: query.OrderBy(x => x.Description);
break;
case "status":
query = desc ? query.OrderByDescending(x => x.Status)
: query.OrderBy(x => x.Status);
break;
case "type":
query = desc ? query.OrderByDescending(x => x.Type)
: query.OrderBy(x => x.Type);
break;
case "year":
query = desc ? query.OrderByDescending(x => x.Year)
: query.OrderBy(x => x.Year);
break;
case "caseType":
query = desc ? query.OrderByDescending(x => x.CaseType)
: query.OrderBy(x => x.CaseType);
break;
case "caseNumber":
query = desc ? query.OrderByDescending(x => x.CaseNumber)
: query.OrderBy(x => x.CaseNumber);
break;
case "fullname":
query = desc ? query.OrderByDescending(x => x.Fullname)
: query.OrderBy(x => x.Fullname);
break;
case "lastUpdatedAt":
query = desc ? query.OrderByDescending(x => x.LastUpdatedAt)
: query.OrderBy(x => x.LastUpdatedAt);
break;
case "profileType":
query = desc ? query.OrderByDescending(x => x.profileType)
: query.OrderBy(x => x.profileType);
break;
default:
query = query
.OrderByDescending(x => x.profileType) .OrderByDescending(x => x.profileType)
.ThenByDescending(x => x.LastUpdatedAt); .ThenByDescending(x => x.LastUpdatedAt)
break;
}
}
var data = query
.Skip((page - 1) * pageSize) .Skip((page - 1) * pageSize)
.Take(pageSize) .Take(pageSize)
.ToList(); .ToList();
return Success(new { data, total = data_search.Count() }); return Success(new { data, total = data_search.Count() });
} }

View file

@ -63,9 +63,8 @@ namespace BMA.EHR.DisciplineDirector.Service.Controllers
/// <response code="401">ไม่ได้ Login เข้าระบบ</response> /// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response> /// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpGet("{path}")] [HttpGet("{path}")]
public async Task<ActionResult<ResponseObject>> GetDiscipline(string path, int page = 1, int pageSize = 25, string keyword = "", string? sortBy = "", bool? descending = false) public async Task<ActionResult<ResponseObject>> GetDiscipline(string path, int page = 1, int pageSize = 25, string keyword = "")
{ {
// สิทธิ์การเข้าถึง
path = path.Trim().ToUpper(); path = path.Trim().ToUpper();
string getPermission; string getPermission;
if (path == "MAIN") if (path == "MAIN")
@ -85,27 +84,23 @@ namespace BMA.EHR.DisciplineDirector.Service.Controllers
getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_INFO"); getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_INFO");
} }
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission); var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200") if (jsonData["status"]?.ToString() != "200")
{ {
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
} }
var _permiss = jsonData["result"]?.ToString();
// สิทธิ์มองเห็นรายชื่อ
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var profile = await _userProfileRepository.GetUserOC(userId, token.Replace("Bearer ", ""));
if (profile == null)
return Error(GlobalMessages.DataNotFound);
var data_search = (from x in _context.DisciplineDirectors.Include(x => x.DisciplineInvestigate_Directors).Include(x => x.DisciplineDisciplinary_DirectorInvestigates) var data_search = (from x in _context.DisciplineDirectors.Include(x => x.DisciplineInvestigate_Directors).Include(x => x.DisciplineDisciplinary_DirectorInvestigates)
where (((x.Prefix ?? "") + (x.FirstName ?? "") + " " + (x.LastName ?? "")).Contains(keyword) || where /*x.Prefix.Contains(keyword) ||
x.FirstName.Contains(keyword) ||
x.LastName.Contains(keyword) ||*/
((x.Prefix ?? "") + (x.FirstName ?? "") + " " + (x.LastName ?? "")).Contains(keyword) ||
x.Position.Contains(keyword) || x.Position.Contains(keyword) ||
x.Email.Contains(keyword) || x.Email.Contains(keyword) ||
x.Phone.Contains(keyword) || x.Phone.Contains(keyword) ||
x.Qualification.Contains(keyword)) && x.Qualification.Contains(keyword)
(_permiss != "OWNER" && x.RootDnaId == profile.RootDnaId || _permiss == "OWNER" && true)
select x).ToList(); select x).ToList();
var query = data_search var data = data_search
.Select(x => new .Select(x => new
{ {
Id = x.Id, Id = x.Id,
@ -118,66 +113,7 @@ namespace BMA.EHR.DisciplineDirector.Service.Controllers
Qualification = x.Qualification, Qualification = x.Qualification,
TotalInvestigate = x.DisciplineInvestigate_Directors.Count(), TotalInvestigate = x.DisciplineInvestigate_Directors.Count(),
TotalDisciplinary = x.DisciplineDisciplinary_DirectorInvestigates.Count(), TotalDisciplinary = x.DisciplineDisciplinary_DirectorInvestigates.Count(),
}); })
bool desc = descending ?? false;
if (!string.IsNullOrEmpty(sortBy))
{
if (sortBy == "position")
{
query = desc ? query.OrderByDescending(x => x.Position)
: query.OrderBy(x => x.Position);
}
else if (sortBy == "prefix" || sortBy == "firstName" || sortBy == "lastName")
{
query = desc ?
query
//.OrderByDescending(x => x.Prefix)
.OrderByDescending(x => x.FirstName)
.ThenByDescending(x => x.LastName) :
query
//.OrderBy(x => x.Prefix)
.OrderBy(x => x.FirstName)
.ThenBy(x => x.LastName);
}
else if (sortBy == "email")
{
{
query = desc ? query.OrderByDescending(x => x.Email)
: query.OrderBy(x => x.Email);
}
}
else if (sortBy == "phone")
{
{
query = desc ? query.OrderByDescending(x => x.Phone)
: query.OrderBy(x => x.Phone);
}
}
else if (sortBy == "qualification")
{
{
query = desc ? query.OrderByDescending(x => x.Qualification)
: query.OrderBy(x => x.Qualification);
}
}
else if (sortBy == "totalInvestigate")
{
{
query = desc ? query.OrderByDescending(x => x.TotalInvestigate)
: query.OrderBy(x => x.TotalInvestigate);
}
}
else if (sortBy == "totalDisciplinary")
{
{
query = desc ? query.OrderByDescending(x => x.TotalDisciplinary)
: query.OrderBy(x => x.TotalDisciplinary);
}
}
}
var data = query
.Skip((page - 1) * pageSize) .Skip((page - 1) * pageSize)
.Take(pageSize) .Take(pageSize)
.ToList(); .ToList();
@ -256,7 +192,6 @@ namespace BMA.EHR.DisciplineDirector.Service.Controllers
Email = req.email, Email = req.email,
Phone = req.phone, Phone = req.phone,
Qualification = req.qualification, Qualification = req.qualification,
RootDnaId = req.rootDnaId,
CreatedFullName = FullName ?? "System Administrator", CreatedFullName = FullName ?? "System Administrator",
CreatedUserId = UserId ?? "", CreatedUserId = UserId ?? "",
CreatedAt = DateTime.Now, CreatedAt = DateTime.Now,
@ -392,7 +327,7 @@ namespace BMA.EHR.DisciplineDirector.Service.Controllers
return Error(new Exception(GlobalMessages.DataNotFound), StatusCodes.Status404NotFound); return Error(new Exception(GlobalMessages.DataNotFound), StatusCodes.Status404NotFound);
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId); var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var profile = await _userProfileRepository.GetProfileByKeycloakIdNewAsync(userId, token.Replace("Bearer ", "")); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, token.Replace("Bearer ", ""));
if (profile == null) if (profile == null)
return Error(GlobalMessages.DataNotFound); return Error(GlobalMessages.DataNotFound);

View file

@ -100,157 +100,6 @@ namespace BMA.EHR.DisciplineDisciplinary.Service.Controllers
return Success(new { data, total = data_search.Count() }); return Success(new { data, total = data_search.Count() });
} }
/// <summary>
/// list รายการวินัยเรื่องสอบสวน (ค้นหาขั้นสูง)
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("advance-search")]
public async Task<ActionResult<ResponseObject>> GetAdvanceSearcDisciplineDisciplinary([FromBody] DisciplineDisciplinaryAdvanceSearcRequest req)
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_INTERROGATE");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var page = req.page <= 0 ? 1 : req.page;
var pageSize = req.pageSize <= 0 ? 25 : req.pageSize;
var keyword = string.IsNullOrEmpty(req.keyword) ? string.Empty : req.keyword;
var status = string.IsNullOrEmpty(req.status) ? string.Empty : req.status;
var data_search = (from x in _context.DisciplineDisciplinarys
where x.Title.Contains(keyword) ||
x.DisciplinaryFaultLevel.Contains(keyword) ||
x.DisciplinaryCaseFault.Contains(keyword)
select x).ToList();
if (status.Trim().ToUpper() != "ALL")
data_search = data_search.Where(x => x.Status.Contains(status.Trim().ToUpper())).ToList();
if (
(req.disciplinaryDateStart.HasValue && req.disciplinaryDateEnd.HasValue) ||
(req.dateReceivedStart.HasValue && req.dateReceivedEnd.HasValue) ||
(!string.IsNullOrEmpty(req.respondentType)) ||
(!string.IsNullOrEmpty(req.offenseDetails)) ||
(!string.IsNullOrEmpty(req.disciplinaryFaultLevel)) ||
(!string.IsNullOrEmpty(req.disciplinaryCaseFault))
)
{
data_search = data_search
.Where(x =>
//วันที่รับเรือง
(!req.dateReceivedStart.HasValue || !req.dateReceivedEnd.HasValue ||
(x.DateReceived.HasValue &&
x.DateReceived.Value.Date <= req.dateReceivedStart.Value.Date &&
x.DateReceived.Value.Date >= req.dateReceivedEnd.Value.Date))
&&
//วันที่สอบสวน
(!req.disciplinaryDateStart.HasValue || !req.disciplinaryDateEnd.HasValue ||
(x.DisciplinaryDateStart.HasValue && x.DisciplinaryDateEnd.HasValue &&
x.DisciplinaryDateStart.Value.Date <= req.disciplinaryDateStart.Value.Date &&
x.DisciplinaryDateEnd.Value.Date >= req.disciplinaryDateEnd.Value.Date))
&&
(string.IsNullOrEmpty(req.respondentType) || x.RespondentType == req.respondentType)
&&
(string.IsNullOrEmpty(req.offenseDetails) || x.OffenseDetails == req.offenseDetails)
&&
(string.IsNullOrEmpty(req.disciplinaryFaultLevel) || x.DisciplinaryFaultLevel == req.disciplinaryFaultLevel)
&&
(string.IsNullOrEmpty(req.disciplinaryCaseFault) || (x.DisciplinaryCaseFault?.Contains(req.disciplinaryCaseFault) ?? false))
)
.ToList();
}
var query = data_search
.Select(x => new
{
Id = x.Id,//id ข้อมูลเรื่องสอบสวน
Title = x.Title,//ชื่อเรื่อง
RespondentType = x.RespondentType,//ผู้ถูกสืบสวน
OffenseDetails = x.OffenseDetails,//ลักษณะความผิด
DisciplinaryFaultLevel = x.DisciplinaryFaultLevel,//ระดับโทษความผิด
DisciplinaryCaseFault = x.DisciplinaryCaseFault,//กรณีความผิด
Status = x.Status,//สถานะหรือผลการสอบสวน
DateReceived = x.DateReceived, //วันที่รับเรื่อง
CreatedAt = x.CreatedAt,//วันที่สร้างเรื่องสอบสวน
DisciplinaryDateStart = x.DisciplinaryDateStart, //วันที่เริ่มการสอบสวน
DisciplinaryDateEnd = x.DisciplinaryDateEnd, //วันที่สิ้นสุดการสอบสวน
});
bool desc = req.descending ?? false;
if (!string.IsNullOrEmpty(req.sortBy))
{
switch (req.sortBy)
{
case "title":
query = desc ? query.OrderByDescending(x => x.Title)
: query.OrderBy(x => x.Title);
break;
case "respondentType":
query = desc ? query.OrderByDescending(x => x.RespondentType)
: query.OrderBy(x => x.RespondentType);
break;
case "offenseDetails":
query = desc ? query.OrderByDescending(x => x.OffenseDetails)
: query.OrderBy(x => x.OffenseDetails);
break;
case "disciplinaryFaultLevel":
query = desc ? query.OrderByDescending(x => x.DisciplinaryFaultLevel)
: query.OrderBy(x => x.DisciplinaryFaultLevel);
break;
case "disciplinaryCaseFault":
query = desc ? query.OrderByDescending(x => x.DisciplinaryCaseFault)
: query.OrderBy(x => x.DisciplinaryCaseFault);
break;
case "status":
query = desc ? query.OrderByDescending(x => x.Status)
: query.OrderBy(x => x.Status);
break;
case "dateReceived":
query = desc ? query.OrderByDescending(x => x.DateReceived)
: query.OrderBy(x => x.DateReceived);
break;
case "createdAt":
query = desc ? query.OrderByDescending(x => x.CreatedAt)
: query.OrderBy(x => x.CreatedAt);
break;
case "disciplinaryDateStart":
query = desc ? query.OrderByDescending(x => x.DisciplinaryDateStart)
: query.OrderBy(x => x.DisciplinaryDateStart);
break;
case "disciplinaryDateEnd":
query = desc ? query.OrderByDescending(x => x.DisciplinaryDateEnd)
: query.OrderBy(x => x.DisciplinaryDateEnd);
break;
default:
query = query.OrderByDescending(x => x.DisciplinaryDateStart);
break;
}
}
var data = query
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
return Success(new { data, total = data_search.Count() });
}
/// <summary> /// <summary>
/// get รายการวินัยเรื่องสอบสวน /// get รายการวินัยเรื่องสอบสวน
/// </summary> /// </summary>

View file

@ -100,153 +100,6 @@ namespace BMA.EHR.DisciplineInvestigate.Service.Controllers
return Success(new { data, total = data_search.Count() }); return Success(new { data, total = data_search.Count() });
} }
/// <summary>
/// list รายการวินัยเรื่องสืบสวน (ค้นหาขั้นสูง)
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
/// <response code="400">ค่าตัวแปรที่ส่งมาไม่ถูกต้อง</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPost("advance-search")]
public async Task<ActionResult<ResponseObject>> GetAdvanceSearchDisciplineInvestigate([FromBody] DisciplineInvestigateAdvanceSearcRequest req)
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_INVESTIGATE");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
if (jsonData["status"]?.ToString() != "200")
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
var page = req.page <= 0 ? 1 : req.page;
var pageSize = req.pageSize <= 0 ? 25 : req.pageSize;
var keyword = string.IsNullOrEmpty(req.keyword) ? string.Empty : req.keyword;
var status = string.IsNullOrEmpty(req.status) ? string.Empty : req.status;
var data_search = (from x in _context.DisciplineInvestigates
where x.Title.Contains(keyword)
select x).ToList();
if (status.Trim().ToUpper() != "ALL")
data_search = data_search.Where(x => x.Status.Contains(status.Trim().ToUpper())).ToList();
if (
(req.investigationDateStart.HasValue && req.investigationDateEnd.HasValue) ||
(req.dateReceivedStart.HasValue && req.dateReceivedEnd.HasValue) ||
(!string.IsNullOrEmpty(req.respondentType)) ||
(!string.IsNullOrEmpty(req.offenseDetails)) ||
(!string.IsNullOrEmpty(req.investigationDetail)) ||
(!string.IsNullOrEmpty(req.investigationStatusResult))
)
{
data_search = data_search
.Where(x =>
(!req.dateReceivedStart.HasValue || !req.dateReceivedEnd.HasValue ||
(x.DateReceived.HasValue &&
x.DateReceived.Value.Date <= req.dateReceivedStart.Value.Date &&
x.DateReceived.Value.Date >= req.dateReceivedEnd.Value.Date))
&&
(!req.investigationDateStart.HasValue || !req.investigationDateEnd.HasValue ||
(x.InvestigationDateStart.HasValue && x.InvestigationDateEnd.HasValue &&
x.InvestigationDateStart.Value.Date <= req.investigationDateStart.Value.Date &&
x.InvestigationDateEnd.Value.Date >= req.investigationDateEnd.Value.Date))
&&
(string.IsNullOrEmpty(req.respondentType) || x.RespondentType == req.respondentType)
&&
(string.IsNullOrEmpty(req.offenseDetails) || x.OffenseDetails == req.offenseDetails)
&&
(string.IsNullOrEmpty(req.investigationDetail) || x.InvestigationDetail == req.investigationDetail)
&&
(string.IsNullOrEmpty(req.investigationStatusResult) || x.InvestigationStatusResult == req.investigationStatusResult)
)
.ToList();
}
var query = data_search
.Select(x => new
{
Id = x.Id,//id ข้อมูลเรื่องสืบสวน
Title = x.Title,//ชื่อเรื่อง
RespondentType = x.RespondentType,//ผู้ถูกสืบสวน
OffenseDetails = x.OffenseDetails,//ลักษณะความผิด
Status = x.Status,//สถานะหรือผลการสืบสวน
InvestigationDateStart = x.InvestigationDateStart, //วันที่เริ่มการสืบสวน
InvestigationDateEnd = x.InvestigationDateEnd, //วันที่สิ้นสุดการสืบสวน
DateReceived = x.DateReceived, //วันที่รับเรื่อง
CreatedAt = x.CreatedAt,//วันที่สร้างเรื่องสืบสวน
InvestigationDetail = x.InvestigationDetail,
InvestigationStatusResult = x.InvestigationStatusResult,
});
bool desc = req.descending ?? false;
if (!string.IsNullOrEmpty(req.sortBy))
{
switch (req.sortBy)
{
case "title":
query = desc ? query.OrderByDescending(x => x.Title)
: query.OrderBy(x => x.Title);
break;
case "respondentType":
query = desc ? query.OrderByDescending(x => x.RespondentType)
: query.OrderBy(x => x.RespondentType);
break;
case "offenseDetails":
query = desc ? query.OrderByDescending(x => x.OffenseDetails)
: query.OrderBy(x => x.OffenseDetails);
break;
case "status":
query = desc ? query.OrderByDescending(x => x.Status)
: query.OrderBy(x => x.Status);
break;
case "investigationDateStart":
query = desc ? query.OrderByDescending(x => x.InvestigationDateStart)
: query.OrderBy(x => x.InvestigationDateStart);
break;
case "investigationDateEnd":
query = desc ? query.OrderByDescending(x => x.InvestigationDateEnd)
: query.OrderBy(x => x.InvestigationDateEnd);
break;
case "dateReceived":
query = desc ? query.OrderByDescending(x => x.DateReceived)
: query.OrderBy(x => x.DateReceived);
break;
case "createdAt":
query = desc ? query.OrderByDescending(x => x.CreatedAt)
: query.OrderBy(x => x.CreatedAt);
break;
case "investigationDetail":
query = desc ? query.OrderByDescending(x => x.InvestigationDetail)
: query.OrderBy(x => x.InvestigationDetail);
break;
case "investigationStatusResult":
query = desc ? query.OrderByDescending(x => x.InvestigationStatusResult)
: query.OrderBy(x => x.InvestigationStatusResult);
break;
default:
query = query.OrderByDescending(x => x.InvestigationDateStart);
break;
}
}
var data = query
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
return Success(new { data, total = data_search.Count() });
}
// /// <summary> // /// <summary>
// /// get รายการวินัยเรื่องร้องเรียน // /// get รายการวินัยเรื่องร้องเรียน
// /// </summary> // /// </summary>
@ -967,7 +820,7 @@ namespace BMA.EHR.DisciplineInvestigate.Service.Controllers
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]);
var _res = await client.PostAsJsonAsync(apiUrlOrg, new var _res = await client.PostAsJsonAsync(apiUrlOrg, new
{ {
refId = persons.Select(x => x.PersonId), refId = persons.Select(x => x.PersonId),

View file

@ -74,6 +74,20 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
{ {
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
} }
//var profile = new List<GetProfileByKeycloakIdRootDto>();
//if (type.Trim().ToUpper() == "OFFICER")
//{
// profile = await _userProfileRepository.GetProfileWithKeycloakAllOfficer(AccessToken, req.node, req.nodeId, jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD");
//}
//else
//{
// profile = await _userProfileRepository.GetProfileWithKeycloakAllEmployee(AccessToken, req.node, req.nodeId, jsonData["result"] == "OWNER" || jsonData["result"] == "CHILD");
//}
//if (req.posLevel != null || req.posType != null)
//{
// profile = profile.Where(x => x.PositionType == req.posType || x.PositionLevel == req.posLevel).ToList();
//}
var data_search1 = await _context.DisciplineComplaints var data_search1 = await _context.DisciplineComplaints
.Include(x => x.DisciplineComplaint_Profiles) .Include(x => x.DisciplineComplaint_Profiles)

View file

@ -1,21 +1,17 @@
using BMA.EHR.Application.Repositories; using BMA.EHR.Application.Repositories;
using BMA.EHR.Application.Repositories.MessageQueue; using BMA.EHR.Application.Repositories.MessageQueue;
using BMA.EHR.Application.Responses.Profiles;
using BMA.EHR.Discipline.Service.Requests; using BMA.EHR.Discipline.Service.Requests;
using BMA.EHR.Domain.Common; using BMA.EHR.Domain.Common;
using BMA.EHR.Domain.Models.Discipline; using BMA.EHR.Domain.Models.Discipline;
using BMA.EHR.Domain.Shared; using BMA.EHR.Domain.Shared;
using BMA.EHR.Infrastructure.Persistence; using BMA.EHR.Infrastructure.Persistence;
using Elasticsearch.Net;
// using BMA.EHR.Placement.Service.Requests; // using BMA.EHR.Placement.Service.Requests;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Annotations;
using System.Linq;
using System.Security.Claims; using System.Security.Claims;
namespace BMA.EHR.DisciplineSuspend.Service.Controllers namespace BMA.EHR.DisciplineSuspend.Service.Controllers
@ -32,25 +28,24 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
private readonly MinIODisciplineService _documentService; private readonly MinIODisciplineService _documentService;
private readonly IHttpContextAccessor _httpContextAccessor; private readonly IHttpContextAccessor _httpContextAccessor;
private readonly PermissionRepository _permission; private readonly PermissionRepository _permission;
private readonly UserProfileRepository _userProfileRepository;
public DisciplineSuspendController(DisciplineDbContext context, public DisciplineSuspendController(DisciplineDbContext context,
MinIODisciplineService documentService, MinIODisciplineService documentService,
IHttpContextAccessor httpContextAccessor, IHttpContextAccessor httpContextAccessor,
PermissionRepository permission, PermissionRepository permission)
UserProfileRepository userProfileRepository)
{ {
// _repository = repository; // _repository = repository;
_context = context; _context = context;
_documentService = documentService; _documentService = documentService;
_httpContextAccessor = httpContextAccessor; _httpContextAccessor = httpContextAccessor;
_permission = permission; _permission = permission;
_userProfileRepository = userProfileRepository;
} }
#region " Properties " #region " Properties "
private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value; private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value;
private string? AccessToken => _httpContextAccessor?.HttpContext?.Request.Headers["Authorization"];
#endregion #endregion
@ -63,7 +58,7 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
/// <response code="401">ไม่ได้ Login เข้าระบบ</response> /// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response> /// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpGet()] [HttpGet()]
public async Task<ActionResult<ResponseObject>> GetDisciplineSuspend(DateTime? startDate, DateTime? endDate, int page = 1, int pageSize = 25, string keyword = "", string profileType = "", string? sortBy = "", bool? descending = false, string? status="") public async Task<ActionResult<ResponseObject>> GetDisciplineSuspend(DateTime? startDate, DateTime? endDate, int page = 1, int pageSize = 25, string keyword = "", string profileType = "")
{ {
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_SUSPENDED"); var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_DISCIPLINE_SUSPENDED");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission); var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -71,52 +66,10 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
{ {
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden); return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
} }
// ถ้า FE ส่ง status = PENDING กรอง start/end suspend not null
bool isPending =
!string.IsNullOrEmpty(profileType) &&
!string.IsNullOrEmpty(status) &&
status.Trim().ToUpper() == "PENDING";
// กรองสิทธิ์
string role = jsonData["result"]?.ToString() ?? "";
var nodeId = string.Empty;
var profileAdmin = new GetUserOCAllDto();
profileAdmin = await _userProfileRepository.GetUserOCAll(Guid.Parse(UserId!), AccessToken);
if (role == "NORMAL" || role == "CHILD")
{
nodeId = profileAdmin?.Node == 4
? profileAdmin?.Child4DnaId
: profileAdmin?.Node == 3
? profileAdmin?.Child3DnaId
: profileAdmin?.Node == 2
? profileAdmin?.Child2DnaId
: profileAdmin?.Node == 1
? profileAdmin?.Child1DnaId
: profileAdmin?.Node == 0
? profileAdmin?.RootDnaId
: "";
}
else if (role == "BROTHER")
{
nodeId = profileAdmin?.Node == 4
? profileAdmin?.Child3DnaId
: profileAdmin?.Node == 3
? profileAdmin?.Child2DnaId
: profileAdmin?.Node == 2
? profileAdmin?.Child1DnaId
: profileAdmin?.Node == 1 || profileAdmin?.Node == 0
? profileAdmin?.RootDnaId
: "";
}
else if (role == "ROOT" /*|| role == "PARENT"*/)
{
nodeId = profileAdmin?.RootDnaId;
}
var data_search = (from x in _context.DisciplineReport_Profiles.Include(x => x.DisciplineDisciplinary) var data_search = (from x in _context.DisciplineReport_Profiles.Include(x => x.DisciplineDisciplinary)
where where
( (
endDate != null && startDate != null ? endDate != null && startDate != null?
( (
(x.StartDateSuspend.Value.Date >= startDate.Value.Date && x.StartDateSuspend.Value.Date <= endDate.Value.Date) || (x.StartDateSuspend.Value.Date >= startDate.Value.Date && x.StartDateSuspend.Value.Date <= endDate.Value.Date) ||
(x.EndDateSuspend.Value.Date >= startDate.Value.Date && x.EndDateSuspend.Value.Date <= endDate.Value.Date) || (x.EndDateSuspend.Value.Date >= startDate.Value.Date && x.EndDateSuspend.Value.Date <= endDate.Value.Date) ||
@ -140,55 +93,8 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
(profileType.ToUpper() == "OFFICER" && x.profileType == "OFFICER") || (profileType.ToUpper() == "OFFICER" && x.profileType == "OFFICER") ||
(profileType.ToUpper() == "EMPLOYEE" && x.profileType == "EMPLOYEE") (profileType.ToUpper() == "EMPLOYEE" && x.profileType == "EMPLOYEE")
) )
&&
(
!string.IsNullOrEmpty(status) ? x.Status!.Trim().ToUpper() == status : true
)
// ถ้า FE ส่ง status = PENDING กรอง start/end suspend not null
&&
(
isPending
? x.StartDateSuspend != null && x.EndDateSuspend != null
: true
)
&&
(
role == "OWNER"
? true
: role == "ROOT"
? x.rootDnaId == nodeId
: role == "CHILD"
? (
profileAdmin.Node == 4 ? x.child4DnaId == nodeId :
profileAdmin.Node == 3 ? x.child3DnaId == nodeId :
profileAdmin.Node == 2 ? x.child2DnaId == nodeId :
profileAdmin.Node == 1 ? x.child1DnaId == nodeId :
profileAdmin.Node == 0 ? x.rootDnaId == nodeId :
true
)
: role == "BROTHER"
? (
profileAdmin.Node == 4 ? x.child3DnaId == nodeId :
profileAdmin.Node == 3 ? x.child2DnaId == nodeId :
profileAdmin.Node == 2 ? x.child1DnaId == nodeId :
(
profileAdmin.Node == 1 || profileAdmin.Node == 0
)
? x.rootDnaId == nodeId : true
)
: role == "NORMAL"
? (
profileAdmin.Node == 0 ? x.rootDnaId == nodeId && x.child1DnaId == null :
profileAdmin.Node == 1 ? x.child1DnaId == nodeId && x.child2DnaId == null :
profileAdmin.Node == 2 ? x.child2DnaId == nodeId && x.child3DnaId == null :
profileAdmin.Node == 3 ? x.child3DnaId == nodeId && x.child4DnaId == null :
profileAdmin.Node == 4 ? x.child4DnaId == nodeId :
true
)
: true
)
select x).ToList(); select x).ToList();
var query = data_search var data = data_search
.Select(x => new .Select(x => new
{ {
Id = x.Id, Id = x.Id,
@ -239,70 +145,13 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
DisciplinaryCaseFault = x.DisciplineDisciplinary.DisciplinaryCaseFault,//กรณีความผิด DisciplinaryCaseFault = x.DisciplineDisciplinary.DisciplinaryCaseFault,//กรณีความผิด
profileType = x.profileType, profileType = x.profileType,
CreatedAt = x.CreatedAt, CreatedAt = x.CreatedAt,
}); })
.OrderByDescending(x => x.profileType)
bool desc = descending ?? false;
if (!string.IsNullOrEmpty(sortBy))
{
if (sortBy == "title")
{
query = desc ? query.OrderByDescending(x => x.Title)
: query.OrderBy(x => x.Title);
}
else if (sortBy == "prefix" || sortBy == "firstName" || sortBy == "lastName")
{
query = desc ?
query.OrderByDescending(x => x.FirstName).ThenByDescending(x => x.LastName) :
query.OrderBy(x => x.FirstName).ThenBy(x => x.LastName);
}
else if (sortBy == "position")
{
query = desc ? query.OrderByDescending(x => x.Position)
: query.OrderBy(x => x.Position);
}
else if (sortBy == "positionType" || sortBy == "positionLevel")
{
query = desc ?
query
.OrderByDescending(x => x.PositionType)
.ThenByDescending(x => x.PositionLevel) :
query
.OrderBy(x => x.PositionType)
.ThenBy(x => x.PositionLevel);
}
else if (sortBy == "organization")
{
query = desc ? query.OrderByDescending(x => x.Organization)
: query.OrderBy(x => x.Organization);
}
else if (sortBy == "startDateSuspend")
{
query = desc ? query.OrderByDescending(x => x.StartDateSuspend)
: query.OrderBy(x => x.StartDateSuspend);
}
else if (sortBy == "endDateSuspend")
{
query = desc ? query.OrderByDescending(x => x.EndDateSuspend)
: query.OrderBy(x => x.EndDateSuspend);
}
else if (sortBy == "descriptionSuspend")
{
query = desc ? query.OrderByDescending(x => x.DescriptionSuspend)
: query.OrderBy(x => x.DescriptionSuspend);
}
else
{
query = query.OrderByDescending(x => x.profileType)
.ThenByDescending(x => x.CreatedAt) .ThenByDescending(x => x.CreatedAt)
.ThenByDescending(x => x.CitizenId); .ThenByDescending(x => x.CitizenId)
}
}
var data = query
.Skip((page - 1) * pageSize) .Skip((page - 1) * pageSize)
.Take(pageSize) .Take(pageSize)
.ToList(); .ToList();
return Success(new { data, total = data_search.Count() }); return Success(new { data, total = data_search.Count() });
} }
@ -331,7 +180,7 @@ namespace BMA.EHR.DisciplineSuspend.Service.Controllers
.Select(x => new .Select(x => new
{ {
Id = x.Id, Id = x.Id,
ProfileId = x.PersonId, PersonId = x.PersonId,
CitizenId = x.CitizenId, CitizenId = x.CitizenId,
Prefix = x.Prefix, Prefix = x.Prefix,
FirstName = x.FirstName, FirstName = x.FirstName,

View file

@ -63,21 +63,4 @@ namespace BMA.EHR.Discipline.Service.Requests
public string? posLevelName { get; set; } public string? posLevelName { get; set; }
public string? profileType { get; set; } public string? profileType { get; set; }
} }
public class DisciplineComplaintAdvanceSearcRequest
{
public int page { get; set; } = 1;
public int pageSize { get; set; } = 25;
public string keyword { get; set; } = string.Empty;
public string status { get; set; } = string.Empty;
public DateTime? dateReceivedStart { get; set; } // วันที่เริ่มต้นรับเรื่อง
public DateTime? dateReceivedEnd { get; set; } // วันที่สิ้นสุดรับเรื่อง
public string? respondentType { get; set; } // ผู้ถูกร้องเรียน
public string? offenseDetails { get; set; } // ลักษณะความผิด
public string? levelConsideration { get; set; } // ระดับการพิจารณา
public DateTime? dateConsiderationStart { get; set; } // วันที่เริ่มต้นการพิจารณา
public DateTime? dateConsiderationEnd { get; set; } // วันที่สิ้นสุดการพิจารณา
public string? sortBy { get; set; }
public bool? descending { get; set; }
}
} }

View file

@ -12,6 +12,5 @@ namespace BMA.EHR.Discipline.Service.Requests
public string? email { get; set; } public string? email { get; set; }
public string? phone { get; set; } public string? phone { get; set; }
public string? qualification { get; set; } public string? qualification { get; set; }
public Guid? rootDnaId { get; set; }
} }
} }

View file

@ -33,23 +33,4 @@ namespace BMA.EHR.Discipline.Service.Requests
public string respondentType { get; set; }// *ผู้ถูกร้องเรียน (PERSON คือ บุคคล, ORGANIZATION คือ หน่วยงาน, BANGKOK คือ กรุงเทพมหานคร) public string respondentType { get; set; }// *ผู้ถูกร้องเรียน (PERSON คือ บุคคล, ORGANIZATION คือ หน่วยงาน, BANGKOK คือ กรุงเทพมหานคร)
} }
public class DisciplineDisciplinaryAdvanceSearcRequest
{
public int page { get; set; } = 1;
public int pageSize { get; set; } = 25;
public string keyword { get; set; } = string.Empty;
public string status { get; set; } = string.Empty;
public string? respondentType { get; set; } // ผู้ถูกสืบสวน
public string? offenseDetails { get; set; } // ลักษณะความผิด
public string? disciplinaryFaultLevel { get; set; } // ระดับโทษความผิด
public string? disciplinaryCaseFault { get; set; } // กรณีความผิด
public DateTime? disciplinaryDateStart { get; set; } // วันที่สอบสวนเริ่มต้น
public DateTime? disciplinaryDateEnd { get; set; } // วันที่สิ้นสุดสอบสวน
public DateTime? dateReceivedStart { get; set; } // วันที่เริ่มต้นรับเรื่อง
public DateTime? dateReceivedEnd { get; set; } // วันที่สิ้นสุดรับเรื่อง
public string? sortBy { get; set; }
public bool? descending { get; set; }
}
} }

View file

@ -21,23 +21,4 @@ namespace BMA.EHR.Discipline.Service.Requests
public string respondentType { get; set; }// *ผู้ถูกร้องเรียน (PERSON คือ บุคคล, ORGANIZATION คือ หน่วยงาน, BANGKOK คือ กรุงเทพมหานคร) public string respondentType { get; set; }// *ผู้ถูกร้องเรียน (PERSON คือ บุคคล, ORGANIZATION คือ หน่วยงาน, BANGKOK คือ กรุงเทพมหานคร)
} }
public class DisciplineInvestigateAdvanceSearcRequest
{
public int page { get; set; } = 1;
public int pageSize { get; set; } = 25;
public string keyword { get; set; } = string.Empty;
public string status { get; set; } = string.Empty;
public string? respondentType { get; set; } // ผู้ถูกสืบสวน
public string? offenseDetails { get; set; } // ลักษณะความผิด
public string? investigationDetail { get; set; } // ลักษณะการสืบสวน
public DateTime? investigationDateStart { get; set; } // วันที่สืบสวนเริ่มต้น
public DateTime? investigationDateEnd { get; set; } // วันที่สิ้นสุดสืบสวน
public DateTime? dateReceivedStart { get; set; } // วันที่เริ่มต้นรับเรื่อง
public DateTime? dateReceivedEnd { get; set; } // วันที่สิ้นสุดรับเรื่อง
public string? investigationStatusResult { get; set; } // ผลการสืบสวน
public string? sortBy { get; set; }
public bool? descending { get; set; }
}
} }

View file

@ -10,26 +10,4 @@ namespace BMA.EHR.Discipline.Service.Requests
public string? titleType { get; set; }// public string? titleType { get; set; }//
public int? year { get; set; }// public int? year { get; set; }//
} }
public class DisciplineResultAdvanceSearcRequest
{
public int page { get; set; } = 1;
public int pageSize { get; set; } = 25;
public string keyword { get; set; } = string.Empty;
public string status { get; set; } = string.Empty;
public string? respondentType { get; set; } // ผู้ถูกสืบสวน
public string? offenseDetails { get; set; } // ลักษณะความผิด
public string? disciplinaryFaultLevel { get; set; } // ระดับโทษความผิด
public string? disciplinaryCaseFault { get; set; } // กรณีความผิด
public DateTime? disciplinaryDateStart { get; set; } // วันที่เริ่มต้นสอบสวน
public DateTime? disciplinaryDateEnd { get; set; } // วันที่สิ้นสุดสอบสวน
public string? resultDisciplineType { get; set; } // ประเภทวินัย
public string? resultTitleType { get; set; } // ประเภทของเรื่อง
public string? resultOc { get; set; } // หน่วยงาน/ส่วนราชการ
public int? resultYear { get; set; } // ปีงบประมาณ
public string? sortBy { get; set; }
public bool? descending { get; set; }
}
} }

View file

@ -8,12 +8,4 @@ namespace BMA.EHR.Discipline.Service.Requests
public string[] refIds { get; set; } public string[] refIds { get; set; }
public string? status { get; set; } public string? status { get; set; }
} }
public class ReportPersonAndCommandRequest
{
public string[] refIds { get; set; }
public string? status { get; set; }
public string? commandTypeId { get; set; }
public string? commandCode { get; set; }
}
} }

View file

@ -1,5 +1,4 @@
using BMA.EHR.Domain.Extensions; using BMA.EHR.Domain.Shared;
using BMA.EHR.Domain.Shared;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -82,23 +81,6 @@ namespace BMA.EHR.Domain.Common
} }
#endregion
#region " Properties "
protected string? EmpType => User.GetEmpType();
protected Guid? OrgChild1DnaId => User.GetOrgChild1DnaId();
protected Guid? OrgChild2DnaId => User.GetOrgChild2DnaId();
protected Guid? OrgChild3DnaId => User.GetOrgChild3DnaId();
protected Guid? OrgChild4DnaId => User.GetOrgChild4DnaId();
protected Guid? OrgRootDnaId => User.GetOrgRootDnaId();
protected Guid? ProfileId => User.GetProfileId();
protected string? Prefix => User.GetPrefix();
protected string? FullNameFromClaim => User.GetName();
protected string? FirstName => User.GetFirstName();
protected string? LastName => User.GetLastName();
#endregion #endregion
#endregion #endregion

View file

@ -1,39 +0,0 @@
namespace BMA.EHR.Domain.Common
{
public class TokenUserInfo
{
// Existing properties
public string KeycloakId { get; set; } = string.Empty;
public string? PreferredUsername { get; set; }
public string? GivenName { get; set; }
public string? FamilyName { get; set; }
// New properties to add
public string? EmpType { get; set; }
public Guid? OrgChild1DnaId { get; set; }
public Guid? OrgChild2DnaId { get; set; }
public Guid? OrgChild3DnaId { get; set; }
public Guid? OrgChild4DnaId { get; set; }
public Guid? OrgRootDnaId { get; set; }
public Guid? ProfileId { get; set; }
public string? Prefix { get; set; }
public string? Name { get; set; }
}
// Claim type constants
public static class BmaClaimTypes
{
public const string EmpType = "empType";
public const string OrgChild1DnaId = "orgChild1DnaId";
public const string OrgChild2DnaId = "orgChild2DnaId";
public const string OrgChild3DnaId = "orgChild3DnaId";
public const string OrgChild4DnaId = "orgChild4DnaId";
public const string OrgRootDnaId = "orgRootDnaId";
public const string ProfileId = "profileId";
public const string Prefix = "prefix";
public const string Name = "name";
public const string GivenName = "given_name";
public const string FamilyName = "family_name";
public const string PreferredUsername = "preferred_username";
}
}

View file

@ -1,32 +0,0 @@
using BMA.EHR.Domain.Common;
using System.Security.Claims;
namespace BMA.EHR.Domain.Extensions
{
public static class ClaimsPrincipalExtensions
{
public static string? GetClaimValue(this ClaimsPrincipal user, string claimType)
{
return user?.FindFirst(claimType)?.Value;
}
public static Guid? GetGuidClaim(this ClaimsPrincipal user, string claimType)
{
var value = user?.GetClaimValue(claimType);
return Guid.TryParse(value, out var guid) ? guid : null;
}
// Convenience methods for common claims
public static string? GetEmpType(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.EmpType);
public static Guid? GetOrgChild1DnaId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.OrgChild1DnaId);
public static Guid? GetOrgChild2DnaId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.OrgChild2DnaId);
public static Guid? GetOrgChild3DnaId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.OrgChild3DnaId);
public static Guid? GetOrgChild4DnaId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.OrgChild4DnaId);
public static Guid? GetOrgRootDnaId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.OrgRootDnaId);
public static Guid? GetProfileId(this ClaimsPrincipal user) => user.GetGuidClaim(BmaClaimTypes.ProfileId);
public static string? GetPrefix(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.Prefix);
public static string? GetName(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.Name);
public static string? GetFirstName(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.GivenName);
public static string? GetLastName(this ClaimsPrincipal user) => user.GetClaimValue(BmaClaimTypes.FamilyName);
}
}

View file

@ -174,29 +174,6 @@ namespace BMA.EHR.Domain.Extensions
} }
} }
public static (int Years, int Months, int Days) GetDifference(this DateTime from, DateTime to)
{
if (from > to) (from, to) = (to, from); // swap ถ้าลำดับสลับ
int years = to.Year - from.Year;
int months = to.Month - from.Month;
int days = to.Day - from.Day;
if (days < 0)
{
months--;
days += DateTime.DaysInMonth(to.Year, to.Month == 1 ? 12 : to.Month - 1);
}
if (months < 0)
{
years--;
months += 12;
}
return (years, months, days);
}
public static int CalculateAge(this DateTime date, int plusYear = 0, int subtractYear = 0) public static int CalculateAge(this DateTime date, int plusYear = 0, int subtractYear = 0)
{ {
try try
@ -447,18 +424,6 @@ namespace BMA.EHR.Domain.Extensions
}; };
} }
public static int CalculateFisicalYear(this DateTime value)
{
if (value.Month >= 10)
{
return value.Year + 1;
}
else
{
return value.Year;
}
}
#endregion #endregion
#endregion #endregion

View file

@ -18,14 +18,11 @@ namespace BMA.EHR.Domain.Middlewares
{ {
private readonly RequestDelegate _next; private readonly RequestDelegate _next;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private static ElasticClient? _elasticClient;
private static readonly object _lock = new object();
private static readonly Dictionary<string, (GetProfileByKeycloakIdLocal Profile, DateTime ExpiryTime)> _profileCache = new();
private static readonly TimeSpan _cacheExpiry = TimeSpan.FromMinutes(10);
private string Uri = ""; private string Uri = "";
private string IndexFormat = ""; private string IndexFormat = "";
private string SystemName = ""; private string SystemName = "";
private string APIKey = "";
public CombinedErrorHandlerAndLoggingMiddleware(RequestDelegate next, IConfiguration configuration) public CombinedErrorHandlerAndLoggingMiddleware(RequestDelegate next, IConfiguration configuration)
{ {
@ -35,34 +32,25 @@ namespace BMA.EHR.Domain.Middlewares
Uri = _configuration["ElasticConfiguration:Uri"] ?? "http://192.168.1.40:9200"; Uri = _configuration["ElasticConfiguration:Uri"] ?? "http://192.168.1.40:9200";
IndexFormat = _configuration["ElasticConfiguration:IndexFormat"] ?? "bma-ehr-log-index"; IndexFormat = _configuration["ElasticConfiguration:IndexFormat"] ?? "bma-ehr-log-index";
SystemName = _configuration["ElasticConfiguration:SystemName"] ?? "Unknown"; SystemName = _configuration["ElasticConfiguration:SystemName"] ?? "Unknown";
// สร้าง ElasticClient แค่ครั้งเดียว
if (_elasticClient == null)
{
lock (_lock)
{
if (_elasticClient == null)
{
var settings = new ConnectionSettings(new Uri(Uri))
.DefaultIndex(IndexFormat)
.DisableDirectStreaming() // เพิ่มประสิทธิภาพ
.RequestTimeout(TimeSpan.FromSeconds(5)); // กำหนด timeout
_elasticClient = new ElasticClient(settings);
}
}
}
} }
public async Task Invoke(HttpContext context) public async Task Invoke(HttpContext context)
{ {
Console.WriteLine("=== CombinedErrorHandlerAndLoggingMiddleware Start ===");
var settings = new ConnectionSettings(new Uri(Uri))
.DefaultIndex(IndexFormat);
var client = new ElasticClient(settings);
var startTime = DateTime.UtcNow; var startTime = DateTime.UtcNow;
var stopwatch = Stopwatch.StartNew(); var stopwatch = Stopwatch.StartNew();
string? responseBodyJson = null;
string? requestBodyJson = null; string? requestBodyJson = null;
Exception? caughtException = null; Exception? caughtException = null;
// อ่าน Request Body // อ่าน Request Body
string requestBody = await ReadRequestBodyAsync(context); string requestBody = await ReadRequestBodyAsync(context);
if (!string.IsNullOrEmpty(requestBody)) if (requestBody != "")
{ {
requestBodyJson = await FormatRequestBody(context, requestBody); requestBodyJson = await FormatRequestBody(context, requestBody);
} }
@ -74,44 +62,17 @@ namespace BMA.EHR.Domain.Middlewares
// เปลี่ยน stream ของ Response เพื่อให้สามารถอ่านได้ // เปลี่ยน stream ของ Response เพื่อให้สามารถอ่านได้
context.Response.Body = memoryStream; context.Response.Body = memoryStream;
string keycloakId = Guid.Empty.ToString("D"); var keycloakId = context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? Guid.Empty.ToString("D");
var token = context.Request.Headers["Authorization"]; var token = context.Request.Headers["Authorization"];
GetProfileByKeycloakIdLocal? pf = null; GetProfileByKeycloakIdLocal? pf = null;
var tokenUserInfo = await ExtractTokenUserInfoAsync(token);
// Store tokenUserInfo in HttpContext.Items for controllers to use try
context.Items["TokenUserInfo"] = tokenUserInfo;
// ดึง keycloakId จาก JWT token
keycloakId = tokenUserInfo.KeycloakId;
// ดึง profile จาก claims หรือ cache หรือ API
if (Guid.TryParse(keycloakId, out var parsedId) && parsedId != Guid.Empty)
{ {
// Build profile from token claims if available pf = await GetProfileByKeycloakIdAsync(Guid.Parse(keycloakId), token);
if (tokenUserInfo.OrgRootDnaId.HasValue && tokenUserInfo.ProfileId.HasValue)
{
pf = new GetProfileByKeycloakIdLocal
{
Id = tokenUserInfo.ProfileId.Value,
CitizenId = tokenUserInfo.PreferredUsername,
Prefix = tokenUserInfo.Prefix,
FirstName = tokenUserInfo.GivenName,
LastName = tokenUserInfo.FamilyName,
RootDnaId = tokenUserInfo.OrgRootDnaId,
Child1DnaId = tokenUserInfo.OrgChild1DnaId,
Child2DnaId = tokenUserInfo.OrgChild2DnaId,
Child3DnaId = tokenUserInfo.OrgChild3DnaId,
Child4DnaId = tokenUserInfo.OrgChild4DnaId,
};
Console.WriteLine($"[INFO] Using claims for profile - OrgRootDnaId: {pf.RootDnaId}, ProfileId: {pf.Id}");
} }
else catch (Exception ex)
{ {
// Fallback to API only if critical claims are missing Console.WriteLine($"Error getting profile: {ex.Message}");
Console.WriteLine("[WARN] Critical claims missing, falling back to API call");
pf = await GetProfileWithCacheAsync(parsedId, token);
}
} }
try try
@ -119,32 +80,8 @@ namespace BMA.EHR.Domain.Middlewares
await _next(context); await _next(context);
Console.WriteLine($"Request completed with status: {context.Response.StatusCode}"); Console.WriteLine($"Request completed with status: {context.Response.StatusCode}");
// หลังจาก Authentication middleware ทำงานแล้ว ลองดึง claims อีกครั้ง
if (context.User?.Identity?.IsAuthenticated == true)
{
var authenticatedKeycloakId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value
?? context.User.FindFirst("sub")?.Value;
if (!string.IsNullOrEmpty(authenticatedKeycloakId) && authenticatedKeycloakId != keycloakId)
{
keycloakId = authenticatedKeycloakId;
Console.WriteLine($"Updated keycloakId from authenticated user: {keycloakId}");
// อัพเดต profile ด้วย keycloakId ที่ถูกต้อง
// try
// {
// if (Guid.TryParse(keycloakId, out var parsedId))
// {
// //pf = await GetProfileByKeycloakIdAsync(parsedId, token);
// }
// }
// catch (Exception ex)
// {
// Console.WriteLine($"Error updating profile after authentication: {ex.Message}");
// }
}
}
// จัดการ response format หลังจาก request ผ่าน pipeline แล้ว // จัดการ response format หลังจาก request ผ่าน pipeline แล้ว
// รวมถึงการจัดการ 401/403 ที่มาจาก Authentication middleware
await FormatResponse(context, memoryStream); await FormatResponse(context, memoryStream);
} }
catch (ObjectDisposedException) catch (ObjectDisposedException)
@ -169,48 +106,14 @@ namespace BMA.EHR.Domain.Middlewares
finally finally
{ {
stopwatch.Stop(); stopwatch.Stop();
await LogRequest(context, client, startTime, stopwatch, pf, keycloakId, requestBodyJson, memoryStream, caughtException);
// อ่านข้อมูล response ก่อนที่ stream จะถูก dispose // เขียนข้อมูลกลับไปยัง original Response body
string? responseBodyForLogging = null;
if (memoryStream.Length > 0)
{
memoryStream.Seek(0, SeekOrigin.Begin);
using var reader = new StreamReader(memoryStream, leaveOpen: true);
responseBodyForLogging = await reader.ReadToEndAsync();
memoryStream.Seek(0, SeekOrigin.Begin);
}
// เก็บข้อมูลที่จำเป็นจาก HttpContext ก่อนที่มันจะถูก dispose
var logData = new
{
RemoteIpAddress = context.Connection.RemoteIpAddress?.ToString(),
HostValue = context.Request.Host.Value,
Method = context.Request.Method,
Path = context.Request.Path.ToString(),
QueryString = context.Request.QueryString.ToString(),
StatusCode = context.Response.StatusCode,
ContentType = context.Response.ContentType ?? ""
};
// เขียนข้อมูลกลับไปยัง original Response body ก่อน
if (memoryStream.Length > 0) if (memoryStream.Length > 0)
{ {
memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.Seek(0, SeekOrigin.Begin);
await memoryStream.CopyToAsync(originalBodyStream); await memoryStream.CopyToAsync(originalBodyStream);
} }
// ทำ logging แบบ await
Console.WriteLine("[DEBUG] Starting logging...");
try
{
await LogRequestAsync(_elasticClient!, startTime, stopwatch, pf, keycloakId, requestBodyJson, responseBodyForLogging, caughtException, logData);
Console.WriteLine("[DEBUG] Logging completed successfully");
}
catch (Exception ex)
{
Console.WriteLine($"[ERROR] Logging error: {ex.Message}");
Console.WriteLine($"[ERROR] Stack trace: {ex.StackTrace}");
}
} }
} }
@ -284,38 +187,6 @@ namespace BMA.EHR.Domain.Middlewares
var response = context.Response; var response = context.Response;
var statusCode = response.StatusCode; var statusCode = response.StatusCode;
string? message = null;
string? responseBodyJson = null;
if (memoryStream.Length > 0)
{
memoryStream.Seek(0, SeekOrigin.Begin);
var responseBody = new StreamReader(memoryStream).ReadToEnd();
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
};
responseBodyJson =
JsonSerializer.Serialize(JsonSerializer.Deserialize<object>(responseBody), jsonOptions);
var json = JsonSerializer.Deserialize<JsonElement>(responseBody);
if (json.ValueKind == JsonValueKind.Array)
{
message = "success";
}
else
{
if (json.TryGetProperty("message", out var messageElement))
{
message = messageElement.GetString();
}
}
}
Console.WriteLine($"FormatResponse: StatusCode={statusCode}, HasStarted={response.HasStarted}"); Console.WriteLine($"FormatResponse: StatusCode={statusCode}, HasStarted={response.HasStarted}");
// จัดการ response format แม้กับ status code จาก Authentication middleware // จัดการ response format แม้กับ status code จาก Authentication middleware
@ -323,7 +194,7 @@ namespace BMA.EHR.Domain.Middlewares
{ {
Console.WriteLine($"Formatting response for status: {statusCode}"); Console.WriteLine($"Formatting response for status: {statusCode}");
var responseModel = CreateResponseModel(statusCode, message); var responseModel = CreateResponseModel(statusCode);
// Clear memory stream และเขียน response ใหม่ // Clear memory stream และเขียน response ใหม่
memoryStream.SetLength(0); memoryStream.SetLength(0);
@ -339,10 +210,6 @@ namespace BMA.EHR.Domain.Middlewares
}; };
var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions); var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions);
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse); var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse);
// กำหนด Content-Length ให้ตรงกับขนาดจริง
response.ContentLength = bytes.Length;
await memoryStream.WriteAsync(bytes, 0, bytes.Length); await memoryStream.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine($"Response formatted successfully: {jsonResponse}"); Console.WriteLine($"Response formatted successfully: {jsonResponse}");
@ -352,7 +219,7 @@ namespace BMA.EHR.Domain.Middlewares
{ {
Console.WriteLine($"Creating response body for {statusCode} status"); Console.WriteLine($"Creating response body for {statusCode} status");
var responseModel = CreateResponseModel(statusCode, message); var responseModel = CreateResponseModel(statusCode);
response.ContentType = "application/json; charset=utf-8"; response.ContentType = "application/json; charset=utf-8";
var jsonOptions = new JsonSerializerOptions var jsonOptions = new JsonSerializerOptions
@ -362,10 +229,6 @@ namespace BMA.EHR.Domain.Middlewares
}; };
var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions); var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions);
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse); var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse);
// กำหนด Content-Length ให้ตรงกับขนาดจริง
response.ContentLength = bytes.Length;
await memoryStream.WriteAsync(bytes, 0, bytes.Length); await memoryStream.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine($"Response body created: {jsonResponse}"); Console.WriteLine($"Response body created: {jsonResponse}");
@ -405,8 +268,8 @@ namespace BMA.EHR.Domain.Middlewares
var responseModel = new ResponseObject var responseModel = new ResponseObject
{ {
Status = response.StatusCode, Status = response.StatusCode,
Message = GetErrorMessage(error), Message = GlobalMessages.ExceptionOccured,
Result = null Result = GetErrorMessage(error)
}; };
var jsonOptions = new JsonSerializerOptions var jsonOptions = new JsonSerializerOptions
@ -416,11 +279,6 @@ namespace BMA.EHR.Domain.Middlewares
}; };
var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions); var jsonResponse = JsonSerializer.Serialize(responseModel, jsonOptions);
var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse); var bytes = System.Text.Encoding.UTF8.GetBytes(jsonResponse);
// กำหนด Content-Length ให้ตรงกับขนาดจริง
response.ContentLength = bytes.Length;
await memoryStream.WriteAsync(bytes, 0, bytes.Length); await memoryStream.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine($"Exception response formatted: {jsonResponse}"); Console.WriteLine($"Exception response formatted: {jsonResponse}");
@ -440,16 +298,15 @@ namespace BMA.EHR.Domain.Middlewares
} }
} }
private async Task LogRequestAsync(ElasticClient client, DateTime startTime, Stopwatch stopwatch, private async Task LogRequest(HttpContext context, ElasticClient client, DateTime startTime, Stopwatch stopwatch,
GetProfileByKeycloakIdLocal? pf, string keycloakId, string? requestBodyJson, string? responseBodyForLogging, Exception? caughtException, dynamic contextData) GetProfileByKeycloakIdLocal? pf, string keycloakId, string? requestBodyJson, MemoryStream memoryStream, Exception? caughtException)
{ {
Console.WriteLine("[DEBUG] LogRequestAsync called");
try try
{ {
var processTime = stopwatch.ElapsedMilliseconds; var processTime = stopwatch.ElapsedMilliseconds;
var endTime = DateTime.UtcNow; var endTime = DateTime.UtcNow;
var statusCode = caughtException != null ? (int)HttpStatusCode.InternalServerError : (int)contextData.StatusCode; var statusCode = caughtException != null ? (int)HttpStatusCode.InternalServerError : context.Response.StatusCode;
var logType = caughtException != null ? "error" : statusCode switch var logType = caughtException != null ? "error" : statusCode switch
{ {
@ -461,14 +318,20 @@ namespace BMA.EHR.Domain.Middlewares
string? message = null; string? message = null;
string? responseBodyJson = null; string? responseBodyJson = null;
// ใช้ response body ที่ส่งมาจากการอ่านก่อนหน้า // อ่านข้อมูลจาก Response
if (!string.IsNullOrEmpty(responseBodyForLogging)) if (memoryStream.Length > 0)
{ {
var contentType = (string)contextData.ContentType; memoryStream.Seek(0, SeekOrigin.Begin);
var isFileResponse = !contentType.StartsWith("application/json") && !contentType.StartsWith("text/html") && ( var responseBody = new StreamReader(memoryStream).ReadToEnd();
if (responseBody != "")
{
var contentType = context.Response.ContentType;
var isFileResponse = !contentType.StartsWith("application/json") && (
contentType.StartsWith("application/") || contentType.StartsWith("application/") ||
contentType.StartsWith("image/") || contentType.StartsWith("image/") ||
contentType.StartsWith("audio/") contentType.StartsWith("audio/") ||
context.Response.Headers.ContainsKey("Content-Disposition")
); );
if (isFileResponse) if (isFileResponse)
@ -478,27 +341,38 @@ namespace BMA.EHR.Domain.Middlewares
} }
else else
{ {
// ใช้ response body ที่มีอยู่แล้วโดยไม่ serialize ซ้ำ
responseBodyJson = responseBodyForLogging;
try try
{ {
var json = JsonSerializer.Deserialize<JsonElement>(responseBodyForLogging); var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true,
Converters = { new DateTimeFixConverter() }
};
responseBodyJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<object>(responseBody), jsonOptions);
var json = JsonSerializer.Deserialize<JsonElement>(responseBody);
if (json.ValueKind == JsonValueKind.Array) if (json.ValueKind == JsonValueKind.Array)
{ {
message = "success"; message = "success";
} }
else if (json.TryGetProperty("message", out var messageElement)) else
{
if (json.TryGetProperty("message", out var messageElement))
{ {
message = messageElement.GetString(); message = messageElement.GetString();
} }
} }
}
catch catch
{ {
responseBodyJson = responseBody;
message = caughtException?.Message ?? "Unknown error"; message = caughtException?.Message ?? "Unknown error";
} }
} }
} }
}
if (caughtException != null) if (caughtException != null)
{ {
@ -508,16 +382,15 @@ namespace BMA.EHR.Domain.Middlewares
var logData = new var logData = new
{ {
logType = logType, logType = logType,
ip = (string)contextData.RemoteIpAddress, ip = context.Connection.RemoteIpAddress?.ToString(),
//rootId = pf?.RootId, rootId = pf?.RootId,
rootId = pf?.RootDnaId,
systemName = SystemName, systemName = SystemName,
startTimeStamp = startTime.ToString("o"), startTimeStamp = startTime.ToString("o"),
endTimeStamp = endTime.ToString("o"), endTimeStamp = endTime.ToString("o"),
processTime = processTime, processTime = processTime,
host = (string)contextData.HostValue, host = context.Request.Host.Value,
method = (string)contextData.Method, method = context.Request.Method,
endpoint = (string)contextData.Path + (string)contextData.QueryString, endpoint = context.Request.Path + context.Request.QueryString,
responseCode = statusCode == 304 ? "200" : statusCode.ToString(), responseCode = statusCode == 304 ? "200" : statusCode.ToString(),
responseDescription = message, responseDescription = message,
input = requestBodyJson, input = requestBodyJson,
@ -528,19 +401,11 @@ namespace BMA.EHR.Domain.Middlewares
exception = caughtException?.ToString() exception = caughtException?.ToString()
}; };
Console.WriteLine($"[DEBUG] Sending log to Elasticsearch: {logType} - {(string)contextData.Method} {(string)contextData.Path}"); client.IndexDocument(logData);
var response = await client.IndexDocumentAsync(logData);
Console.WriteLine($"[DEBUG] Elasticsearch response: IsValid={response.IsValid}, Index={response.Index}");
if (!response.IsValid)
{
Console.WriteLine($"[ERROR] Elasticsearch error: {response.OriginalException?.Message ?? response.ServerError?.ToString()}");
}
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"[ERROR] Error logging request: {ex.Message}"); Console.WriteLine($"Error logging request: {ex.Message}");
Console.WriteLine($"[ERROR] Stack trace: {ex.StackTrace}");
} }
} }
@ -555,7 +420,7 @@ namespace BMA.EHR.Domain.Middlewares
statusCode == (int)HttpStatusCode.InternalServerError; statusCode == (int)HttpStatusCode.InternalServerError;
} }
private static ResponseObject CreateResponseModel(int statusCode, string? error) private static ResponseObject CreateResponseModel(int statusCode)
{ {
var message = statusCode switch var message = statusCode switch
{ {
@ -572,7 +437,7 @@ namespace BMA.EHR.Domain.Middlewares
return new ResponseObject return new ResponseObject
{ {
Status = statusCode, Status = statusCode,
Message = error ?? message Message = message
}; };
} }
@ -588,183 +453,6 @@ namespace BMA.EHR.Domain.Middlewares
return msg; return msg;
} }
private async Task<string> ExtractKeycloakIdFromToken(string? authorizationHeader)
{
var tokenInfo = await ExtractTokenUserInfoAsync(authorizationHeader);
return tokenInfo.KeycloakId;
}
private async Task<TokenUserInfo> ExtractTokenUserInfoAsync(string? authorizationHeader)
{
var defaultResult = new TokenUserInfo { KeycloakId = Guid.Empty.ToString("D") };
try
{
if (string.IsNullOrEmpty(authorizationHeader) || !authorizationHeader.StartsWith("Bearer "))
{
return defaultResult;
}
var token = authorizationHeader.Replace("Bearer ", "");
// แยก JWT token เพื่อดึง payload (แบบง่าย โดยไม่ verify signature)
var parts = token.Split('.');
if (parts.Length != 3)
{
return defaultResult;
}
// Decode Base64Url payload (JWT uses Base64Url encoding, not standard Base64)
var payload = parts[1];
// แปลง Base64Url เป็น Base64 ก่อน
payload = payload.Replace('-', '+').Replace('_', '/');
// เพิ่ม padding ถ้าจำเป็น
var padLength = 4 - (payload.Length % 4);
if (padLength < 4)
{
payload += new string('=', padLength);
}
var payloadBytes = Convert.FromBase64String(payload);
var payloadJson = System.Text.Encoding.UTF8.GetString(payloadBytes);
Console.WriteLine($"JWT Payload: {payloadJson}");
// Parse JSON และดึง claims ต่างๆ
var jsonDoc = JsonDocument.Parse(payloadJson);
var result = new TokenUserInfo();
// ดึง keycloak ID
if (jsonDoc.RootElement.TryGetProperty("sub", out var subElement))
{
result.KeycloakId = subElement.GetString() ?? Guid.Empty.ToString("D");
}
else if (jsonDoc.RootElement.TryGetProperty("nameid", out var nameidElement))
{
result.KeycloakId = nameidElement.GetString() ?? Guid.Empty.ToString("D");
}
else if (jsonDoc.RootElement.TryGetProperty("user_id", out var userIdElement))
{
result.KeycloakId = userIdElement.GetString() ?? Guid.Empty.ToString("D");
}
else
{
result.KeycloakId = Guid.Empty.ToString("D");
}
// ดึง preferred_username
if (jsonDoc.RootElement.TryGetProperty("preferred_username", out var preferredUsernameElement))
{
result.PreferredUsername = preferredUsernameElement.GetString();
Console.WriteLine($"Extracted preferred_username: {result.PreferredUsername}");
}
// ดึง given_name
if (jsonDoc.RootElement.TryGetProperty("given_name", out var givenNameElement))
{
result.GivenName = givenNameElement.GetString();
Console.WriteLine($"Extracted given_name: {result.GivenName}");
}
// ดึง family_name
if (jsonDoc.RootElement.TryGetProperty("family_name", out var familyNameElement))
{
result.FamilyName = familyNameElement.GetString();
Console.WriteLine($"Extracted family_name: {result.FamilyName}");
}
// ดึง empType
if (jsonDoc.RootElement.TryGetProperty("empType", out var empTypeElement))
{
result.EmpType = empTypeElement.GetString();
Console.WriteLine($"Extracted empType: {result.EmpType}");
}
// ดึง orgChild1DnaId
if (jsonDoc.RootElement.TryGetProperty("orgChild1DnaId", out var orgChild1Element))
{
if (Guid.TryParse(orgChild1Element.GetString(), out var orgChild1Guid))
{
result.OrgChild1DnaId = orgChild1Guid;
Console.WriteLine($"Extracted orgChild1DnaId: {result.OrgChild1DnaId}");
}
}
// ดึง orgChild2DnaId
if (jsonDoc.RootElement.TryGetProperty("orgChild2DnaId", out var orgChild2Element))
{
if (Guid.TryParse(orgChild2Element.GetString(), out var orgChild2Guid))
{
result.OrgChild2DnaId = orgChild2Guid;
Console.WriteLine($"Extracted orgChild2DnaId: {result.OrgChild2DnaId}");
}
}
// ดึง orgChild3DnaId
if (jsonDoc.RootElement.TryGetProperty("orgChild3DnaId", out var orgChild3Element))
{
if (Guid.TryParse(orgChild3Element.GetString(), out var orgChild3Guid))
{
result.OrgChild3DnaId = orgChild3Guid;
Console.WriteLine($"Extracted orgChild3DnaId: {result.OrgChild3DnaId}");
}
}
// ดึง orgChild4DnaId
if (jsonDoc.RootElement.TryGetProperty("orgChild4DnaId", out var orgChild4Element))
{
if (Guid.TryParse(orgChild4Element.GetString(), out var orgChild4Guid))
{
result.OrgChild4DnaId = orgChild4Guid;
Console.WriteLine($"Extracted orgChild4DnaId: {result.OrgChild4DnaId}");
}
}
// ดึง orgRootDnaId
if (jsonDoc.RootElement.TryGetProperty("orgRootDnaId", out var orgRootElement))
{
if (Guid.TryParse(orgRootElement.GetString(), out var orgRootGuid))
{
result.OrgRootDnaId = orgRootGuid;
Console.WriteLine($"Extracted orgRootDnaId: {result.OrgRootDnaId}");
}
}
// ดึง profileId
if (jsonDoc.RootElement.TryGetProperty("profileId", out var profileIdElement))
{
if (Guid.TryParse(profileIdElement.GetString(), out var profileIdGuid))
{
result.ProfileId = profileIdGuid;
Console.WriteLine($"Extracted profileId: {result.ProfileId}");
}
}
// ดึง prefix
if (jsonDoc.RootElement.TryGetProperty("prefix", out var prefixElement))
{
result.Prefix = prefixElement.GetString();
Console.WriteLine($"Extracted prefix: {result.Prefix}");
}
// ดึง name
if (jsonDoc.RootElement.TryGetProperty("name", out var nameElement))
{
result.Name = nameElement.GetString();
Console.WriteLine($"Extracted name: {result.Name}");
}
return result;
}
catch (Exception ex)
{
Console.WriteLine($"Error extracting token user info: {ex.Message}");
return defaultResult;
}
}
protected async Task<string> GetExternalAPIAsync(string apiPath, string accessToken, string apiKey) protected async Task<string> GetExternalAPIAsync(string apiPath, string accessToken, string apiKey)
{ {
try try
@ -772,7 +460,7 @@ namespace BMA.EHR.Domain.Middlewares
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", apiKey); client.DefaultRequestHeaders.Add("api_key", apiKey);
var _res = await client.GetAsync(apiPath); var _res = await client.GetAsync(apiPath);
if (_res.IsSuccessStatusCode) if (_res.IsSuccessStatusCode)
{ {
@ -792,8 +480,7 @@ namespace BMA.EHR.Domain.Middlewares
{ {
try try
{ {
//var apiPath = $"{_configuration["API"]}/org/dotnet/by-keycloak/{keycloakId}"; var apiPath = $"{_configuration["API"]}/org/dotnet/keycloak/{keycloakId}";
var apiPath = $"{_configuration["API"]}/org/dotnet/user-logs/{keycloakId}";
var apiKey = _configuration["API_KEY"]; var apiKey = _configuration["API_KEY"];
var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey); var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
@ -808,58 +495,7 @@ namespace BMA.EHR.Domain.Middlewares
} }
catch catch
{ {
return null; throw;
}
}
private async Task<GetProfileByKeycloakIdLocal?> GetProfileWithCacheAsync(Guid keycloakId, string? accessToken)
{
var cacheKey = keycloakId.ToString();
// ตรวจสอบ cache
lock (_profileCache)
{
if (_profileCache.TryGetValue(cacheKey, out var cached))
{
if (cached.ExpiryTime > DateTime.UtcNow)
{
return cached.Profile;
}
// ลบ cache ที่หมดอายุ
_profileCache.Remove(cacheKey);
}
}
// ดึงข้อมูลจาก API
try
{
var profile = await GetProfileByKeycloakIdAsync(keycloakId, accessToken);
if (profile != null)
{
// เก็บใน cache
lock (_profileCache)
{
_profileCache[cacheKey] = (profile, DateTime.UtcNow.Add(_cacheExpiry));
// ลบ cache เก่าที่เกิน 1000 รายการ
if (_profileCache.Count > 1000)
{
var expiredKeys = _profileCache
.Where(x => x.Value.ExpiryTime < DateTime.UtcNow)
.Select(x => x.Key)
.ToList();
foreach (var key in expiredKeys)
{
_profileCache.Remove(key);
}
}
}
}
return profile;
}
catch
{
return null;
} }
} }
@ -873,7 +509,7 @@ namespace BMA.EHR.Domain.Middlewares
} }
} }
// Model classes // Model classes (ถ้ายังไม่มีใน namespace นี้)
public class GetProfileByKeycloakIdLocal public class GetProfileByKeycloakIdLocal
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
@ -910,4 +546,5 @@ namespace BMA.EHR.Domain.Middlewares
public GetProfileByKeycloakIdLocal? Result { get; set; } public GetProfileByKeycloakIdLocal? Result { get; set; }
} }
} }

View file

@ -38,7 +38,7 @@ namespace BMA.EHR.Domain.Middlewares
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", "")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
client.DefaultRequestHeaders.Add("api-key", apiKey); client.DefaultRequestHeaders.Add("api_key", apiKey);
var _res = await client.GetAsync(apiPath); var _res = await client.GetAsync(apiPath);
if (_res.IsSuccessStatusCode) if (_res.IsSuccessStatusCode)
{ {

View file

@ -27,9 +27,6 @@ namespace BMA.EHR.Domain.Models.Discipline
[Comment("คุณวุฒิ")] [Comment("คุณวุฒิ")]
public string? Qualification { get; set; } = string.Empty; public string? Qualification { get; set; } = string.Empty;
[Comment("RootDnaId")]
public Guid? RootDnaId { get; set; }
public virtual List<DisciplineInvestigate_Director> DisciplineInvestigate_Directors { get; set; } = new List<DisciplineInvestigate_Director>(); public virtual List<DisciplineInvestigate_Director> DisciplineInvestigate_Directors { get; set; } = new List<DisciplineInvestigate_Director>();
public virtual List<DisciplineDisciplinary_DirectorInvestigate> DisciplineDisciplinary_DirectorInvestigates { get; set; } = new List<DisciplineDisciplinary_DirectorInvestigate>(); public virtual List<DisciplineDisciplinary_DirectorInvestigate> DisciplineDisciplinary_DirectorInvestigates { get; set; } = new List<DisciplineDisciplinary_DirectorInvestigate>();
} }

View file

@ -15,7 +15,5 @@ namespace BMA.EHR.Domain.Models.Insignias
[Comment("Fk Table InsigniaManage")] [Comment("Fk Table InsigniaManage")]
public InsigniaManage InsigniaManage { get; set; } public InsigniaManage InsigniaManage { get; set; }
public virtual List<InsigniaManageProfile> InsigniaManageProfiles { get; set; } = new List<InsigniaManageProfile>(); public virtual List<InsigniaManageProfile> InsigniaManageProfiles { get; set; } = new List<InsigniaManageProfile>();
public Guid? RootDnaId { get; set; }
} }
} }

View file

@ -24,29 +24,10 @@ namespace BMA.EHR.Domain.Models.Leave.Requests
[Required, Comment("ปีงบประมาณ")] [Required, Comment("ปีงบประมาณ")]
public int LeaveYear { get; set; } = 0; public int LeaveYear { get; set; } = 0;
[Required, Comment("จำนวนวันลาทั้งหมด")] [Required, Comment("จำนวนวันลายกมา")]
public double LeaveDays { get; set; } = 0.0; public double LeaveDays { get; set; } = 0.0;
[Comment("จำนวนวันลาที่ใช้ไป")] [Required, Comment("จำนวนวันลาที่ใช้ไป")]
public double? LeaveDaysUsed { get; set; } = 0.0; public double LeaveDaysUsed { get; set; } = 0.0;
[Comment("จำนวนครั้งที่ลาสะสม")]
public int? LeaveCount { get; set; } = 0;
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; }
[Required, Comment("จำนวนวันลายกมา")]
public double BeginningLeaveDays { get; set; } = 0.0;
[Comment("จำนวนครั้งที่ลายกมา")]
public int BeginningLeaveCount { get; set; } = 0;
} }
} }

View file

@ -210,7 +210,5 @@ namespace BMA.EHR.Domain.Models.Leave.Requests
public Guid? Child4DnaId { get; set; } = Guid.Empty; public Guid? Child4DnaId { get; set; } = Guid.Empty;
public DateTime? DateSendLeave { get; set; }
} }
} }

View file

@ -1,5 +1,4 @@
using BMA.EHR.Domain.Models.Base; using BMA.EHR.Domain.Models.Base;
using Microsoft.EntityFrameworkCore;
namespace BMA.EHR.Domain.Models.Leave.Requests namespace BMA.EHR.Domain.Models.Leave.Requests
{ {
@ -17,18 +16,6 @@ namespace BMA.EHR.Domain.Models.Leave.Requests
public string PositionName { get; set; } = string.Empty; public string PositionName { get; set; } = string.Empty;
[Comment("ประเภทระดับตำแหน่ง")]
public string PositionLevelName { get; set; } = string.Empty;
[Comment("ตำแหน่งทางการบริหาร")]
public string PosExecutiveName { get; set; } = string.Empty;
[Comment("สังกัด")]
public string OrganizationName { get; set; } = string.Empty;
[Comment("ตำแหน่งใต้ลายเช็นต์")]
public string? PositionSign { get; set; } = string.Empty;
public Guid ProfileId { get; set; } = Guid.Empty; public Guid ProfileId { get; set; } = Guid.Empty;
public Guid KeycloakId { get; set; } = Guid.Empty; public Guid KeycloakId { get; set; } = Guid.Empty;
@ -38,10 +25,5 @@ namespace BMA.EHR.Domain.Models.Leave.Requests
public string Comment { get; set; } = string.Empty; public string Comment { get; set; } = string.Empty;
public string? ApproveType { get; set; } = string.Empty; // ผู้บังคับบัญชา = commander, ผู้มีอำนาจอนุมัติ = Approver public string? ApproveType { get; set; } = string.Empty; // ผู้บังคับบัญชา = commander, ผู้มีอำนาจอนุมัติ = Approver
public bool IsAct { get; set; } = false;
public string KeyId { get; set; } = string.Empty;
} }
} }

View file

@ -1,39 +0,0 @@
using BMA.EHR.Domain.Models.Base;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
namespace BMA.EHR.Domain.Models.Leave.TimeAttendants
{
public class CheckInJobStatus : EntityBase
{
[Required, Comment("Task ID สำหรับติดตามสถานะงาน")]
public Guid TaskId { get; set; } = Guid.Empty;
[Required, Comment("รหัส User ของ Keycloak")]
public Guid KeycloakUserId { get; set; } = Guid.Empty;
[Comment("วันเวลาที่สร้างงาน")]
public DateTime CreatedDate { get; set; } = DateTime.Now;
[Comment("วันเวลาที่เริ่มประมวลผล")]
public DateTime? ProcessingDate { get; set; }
[Comment("วันเวลาที่เสร็จสิ้นการประมวลผล")]
public DateTime? CompletedDate { get; set; }
[Required, Comment("สถานะงาน: PENDING, PROCESSING, COMPLETED, FAILED")]
public string Status { get; set; } = "PENDING";
[Comment("ประเภทการลงเวลา: CHECK_IN, CHECK_OUT")]
public string? CheckType { get; set; }
[Comment("CheckInId สำหรับ Check-Out")]
public Guid? CheckInId { get; set; }
[Comment("ข้อความแสดงข้อผิดพลาด")]
public string? ErrorMessage { get; set; }
[Comment("ข้อมูลเพิ่มเติม (JSON)")]
public string? AdditionalData { get; set; }
}
}

View file

@ -1,37 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using BMA.EHR.Domain.Models.Base;
using Microsoft.EntityFrameworkCore;
namespace BMA.EHR.Domain.Models.Leave.TimeAttendants
{
public class LeaveProcessJobStatus: EntityBase
{
[Required, Comment("วันเริ่มต้น")]
public DateTime StartDate { get; set; }
[Required, Comment("วันสิ้นสุด")]
public DateTime EndDate { get; set; }
[Required, Comment("รหัส Root DNA Id")]
public Guid RootDnaId { get; set; } = Guid.Empty;
[Comment("วันเวลาที่สร้างงาน")]
public DateTime CreatedDate { get; set; } = DateTime.Now;
[Comment("วันเวลาที่เริ่มประมวลผล")]
public DateTime? ProcessingDate { get; set; }
[Comment("วันเวลาที่เสร็จสิ้นการประมวลผล")]
public DateTime? CompletedDate { get; set; }
[Required, Comment("สถานะงาน: PENDING, PROCESSING, COMPLETED, FAILED")]
public string Status { get; set; } = "PENDING";
[Comment("ข้อความแสดงข้อผิดพลาด")]
public string? ErrorMessage { get; set; }
}
}

View file

@ -119,10 +119,6 @@ namespace BMA.EHR.Domain.Models.Placement
public string? position { get; set; } public string? position { get; set; }
[Comment("ตำแหน่งทางการบริหาร")] [Comment("ตำแหน่งทางการบริหาร")]
public string? PositionExecutive { get; set; } public string? PositionExecutive { get; set; }
[Comment("id ตำแหน่งทางการบริหาร")]
public string? posExecutiveId { get; set; }
[Comment("id ประเภทตำแหน่ง")] [Comment("id ประเภทตำแหน่ง")]
public string? posTypeId { get; set; } public string? posTypeId { get; set; }
[Comment("ชื่อประเภทตำแหน่ง")] [Comment("ชื่อประเภทตำแหน่ง")]

View file

@ -189,7 +189,7 @@ namespace BMA.EHR.Domain.Models.Placement
[Comment("ตำแหน่งปัจจุบัน กลุ่ม/ฝ่าย")] [Comment("ตำแหน่งปัจจุบัน กลุ่ม/ฝ่าย")]
public string? OccupationGroup { get; set; } public string? OccupationGroup { get; set; }
[Comment("ตำแหน่งปัจจุบัน เงินเดือน")] [Comment("ตำแหน่งปัจจุบัน เงินเดือน")]
public double? OccupationSalary { get; set; } public int? OccupationSalary { get; set; }
[Comment("ตำแหน่งปัจจุบัน สังกัด")] [Comment("ตำแหน่งปัจจุบัน สังกัด")]
public string? OccupationPosition { get; set; } public string? OccupationPosition { get; set; }
[Comment("ตำแหน่งปัจจุบัน ประเภทราชการ")] [Comment("ตำแหน่งปัจจุบัน ประเภทราชการ")]
@ -321,10 +321,6 @@ namespace BMA.EHR.Domain.Models.Placement
public string? positionName { get; set; } public string? positionName { get; set; }
[Comment("ตำแหน่งทางการบริหาร")] [Comment("ตำแหน่งทางการบริหาร")]
public string? PositionExecutive { get; set; } public string? PositionExecutive { get; set; }
[Comment("id ตำแหน่งทางการบริหาร")]
public string? posExecutiveId { get; set; }
[Comment("สายงาน")] [Comment("สายงาน")]
public string? positionField { get; set; } public string? positionField { get; set; }
[Comment("id ประเภทตำแหน่ง")] [Comment("id ประเภทตำแหน่ง")]

View file

@ -64,10 +64,6 @@ namespace BMA.EHR.Domain.Models.Placement
public string? profileId { get; set; } public string? profileId { get; set; }
[Comment("คำนำหน้า")] [Comment("คำนำหน้า")]
public string? prefix { get; set; } public string? prefix { get; set; }
[Comment("ยศ")]
public string? rank { get; set; }
[Comment("ชื่อ")] [Comment("ชื่อ")]
public string? firstName { get; set; } public string? firstName { get; set; }
[Comment("นามสกุล")] [Comment("นามสกุล")]
@ -132,10 +128,6 @@ namespace BMA.EHR.Domain.Models.Placement
public string? position { get; set; } public string? position { get; set; }
[Comment("ตำแหน่งทางการบริหาร")] [Comment("ตำแหน่งทางการบริหาร")]
public string? PositionExecutive { get; set; } public string? PositionExecutive { get; set; }
[Comment("id ตำแหน่งทางการบริหาร")]
public string? posExecutiveId { get; set; }
[Comment("id ประเภทตำแหน่ง")] [Comment("id ประเภทตำแหน่ง")]
public string? posTypeId { get; set; } public string? posTypeId { get; set; }
[Comment("ชื่อประเภทตำแหน่ง")] [Comment("ชื่อประเภทตำแหน่ง")]

Some files were not shown because too many files have changed in this diff Show more