summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.env.development23
-rw-r--r--.env.production21
-rw-r--r--instrumentation.ts26
-rw-r--r--lib/knox-sync/master-sync-service.ts72
4 files changed, 95 insertions, 47 deletions
diff --git a/.env.development b/.env.development
index bed62306..56db2ae4 100644
--- a/.env.development
+++ b/.env.development
@@ -15,18 +15,19 @@ NEXT_PUBLIC_URL=http://43.203.251.114:3000
NEXT_PUBLIC_BASE_URL=http://43.203.251.114:3001
NEXTAUTH_URL=http://43.203.251.114:3000
-
+# === 상용 소프트웨어 키 ===
# PDFTRON KEYS
NEXT_PUBLIC_PDFTRON_WEBVIEW_KEY=demo:1739264618684:616161d7030000000091db1c97c6f386d41d3506ab5b507381ef2ee2bd
NEXT_PUBLIC_PDFTRON_SERVER_KEY=demo:1740034881027:6175a0fc0300000000f155d153480e5ba091f17922a109cbd7cf6e40b3
-
-
+# 메시어스 SPREAD JS
NEXT_PUBLIC_SPREADJS_KEY=evcp.dtsolution.io,261619561743613#B14MNE5Nx3kZ8ITTwgXawIWRPNHb64ER8YmZ9NzbtxESHJUd6RTUntmUj3GZXFVQTtUZ7x6S9ADbGl7YygnN9k6UqdnR6ZjZygVZI9UbJdDUQFEbaBDUp3WVYNXMrJ5YwI4NxVzV0VjRK9kau5EZ0t4UGxGdBtmMwZjc4hnRIxUb9skca3iQjNGOuFTNCNmUDBjQ0ZncJBjcNJUTKljMShXVsNkSmVjMrckQRVnNz9kSEJHNu3GZP5mTItGbQBTazh6ZzQVcXZUOyFFVFxUblVTV4lUeIFzZSZVQtZjQS3UUxYlZIJGNu9ES9xkMyk6MOx6YMZFcYF4VFhnerF6b5YDZ4RVW8RDc6UXWh9GdStmTzNUR7R7RiojITJCLiEkRCZkRFN4MiojIIJCL6kjMzIzN6czN0IicfJye=#Qf35VfigUSKJkI0IyQiwiI8EjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsICOxATN4ADIzIjNwUjMwIjI0ICdyNkIsICNycDM5IDMyIiOiAHeFJCLi2Wau86bpRXds36c4RmLwNmdlJiOiMXbEJCLigZhsj0orTphsD1itTJlrLiOiEmTDJCLiMTM6MDN7EjN5kTM6EjNyIiOiQWSiwSfdJCdlVGaTRncvBXZSJCLiQnchh6QhRXYEJCLiUGbiFGV43mdpBlIsICdlVGaTRHduF6RislOicGbmJCLlNHbhZmOiI7ckJye0ICbuFkI1pjIEJCLi4TPB5WbohUMaNHZUlkWHxUVS94axBXQNpFNEV6TPNlWw5Gb9kUO696MjJ6MhN4aSlHdxFnNxcDd4gWNMJVdxd2WMA
-
-# SPREAD JS 내부망 eVCP 개발
+NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
+NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
+# SPREAD JS 내부망 eVCP 개발 (개발 배포시 이 키로 대체)
# NEXT_PUBLIC_SPREADJS_KEY="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh"
# NEXT_PUBLIC_SPREAD_LICENSE="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh"
+
# 기간계 시스템 연동 설정
ERP_API_URL=https://erp.example.com/api/vendors
ERP_API_KEY=your-erp-api-key
@@ -98,9 +99,6 @@ SAML_IDP_CERT="MIID2zCCAsOgAwIBAgIJAIt4QxV2bA3qMA0GCSqGSIb3DQEBCwUAMIGDMQswCQYDV
# === [끝] SSO 설정 ===
-NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
-NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
-
# Bizppurio API 설정
BIZPPURIO_ACCOUNT=shinonsap_evcp
BIZPPURIO_PASSWORD=shi_2025
@@ -133,13 +131,8 @@ KNOX_API_BEARER="5a84ab62-d523-3602-ad3d-e3421893ae0c" # 운영
KNOX_API_FORCE_LIMIT=false # 주간대량호출 강제 제한 여부
KNOX_API_HOURLY_LIMIT=90 # 시간당 API 호출횟수 제한
# KNOX_API_CALL_DELAY_MS # API 배치 처리간 딜레이 수동 설정이며, 자동 산출값보다 높아야 적용
-KNOX_TITLE_SYNC_CRON="0 3 * * *" # 매일 새벽 3시
-KNOX_TITLE_SYNC_FIRST_RUN=true
-KNOX_ORGANIZATION_SYNC_CRON="30 3 * * *" # 매일 새벽 3시 30분
-KNOX_ORGANIZATION_SYNC_FIRST_RUN=true
-KNOX_EMPLOYEE_SYNC_CRON="0 4 * * *" # 매일 새벽 4시
-KNOX_EMPLOYEE_SYNC_FIRST_RUN=true # 양이 많으므로 시작시 갱신 X
-# BASEURL: https://openapi.stage.samsung.net
+KNOX_MASTER_SYNC_CRON="0 2 * * *" # cron 스케줄, 새벽 2시에 적용되며, 직급-조직도-임직원 순으로 적용.
+KNOX_MASTER_SYNC_FIRST_RUN="false" # 앱 시작시 동기화 시작 여부
KNOX_API_BASE_URL="https://openapi.samsung.net"
MESSENGER_ACCESS_TOKEN=""
MESSENGER_DEVICE_ID=""
diff --git a/.env.production b/.env.production
index c0a2b8dc..2eeb9096 100644
--- a/.env.production
+++ b/.env.production
@@ -15,16 +15,19 @@ NEXT_PUBLIC_MUI_KEY=da30586e1f20b93856a9783012fc9258Tz04ODI0MyxFPTE3NDQ0NTM2Nzgw
NEXT_PUBLIC_BASE_URL=https://evcp.dtsolution.io
NEXTAUTH_URL=https://evcp.dtsolution.io
+# === 상용 소프트웨어 키 ===
# PDFTRON KEYS
NEXT_PUBLIC_PDFTRON_WEBVIEW_KEY=demo:1739264618684:616161d7030000000091db1c97c6f386d41d3506ab5b507381ef2ee2bd
NEXT_PUBLIC_PDFTRON_SERVER_KEY=demo:1740034881027:6175a0fc0300000000f155d153480e5ba091f17922a109cbd7cf6e40b3
-
+# 메시어스 SPREAD JS
NEXT_PUBLIC_SPREADJS_KEY=evcp.dtsolution.io,261619561743613#B14MNE5Nx3kZ8ITTwgXawIWRPNHb64ER8YmZ9NzbtxESHJUd6RTUntmUj3GZXFVQTtUZ7x6S9ADbGl7YygnN9k6UqdnR6ZjZygVZI9UbJdDUQFEbaBDUp3WVYNXMrJ5YwI4NxVzV0VjRK9kau5EZ0t4UGxGdBtmMwZjc4hnRIxUb9skca3iQjNGOuFTNCNmUDBjQ0ZncJBjcNJUTKljMShXVsNkSmVjMrckQRVnNz9kSEJHNu3GZP5mTItGbQBTazh6ZzQVcXZUOyFFVFxUblVTV4lUeIFzZSZVQtZjQS3UUxYlZIJGNu9ES9xkMyk6MOx6YMZFcYF4VFhnerF6b5YDZ4RVW8RDc6UXWh9GdStmTzNUR7R7RiojITJCLiEkRCZkRFN4MiojIIJCL6kjMzIzN6czN0IicfJye=#Qf35VfigUSKJkI0IyQiwiI8EjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsICOxATN4ADIzIjNwUjMwIjI0ICdyNkIsICNycDM5IDMyIiOiAHeFJCLi2Wau86bpRXds36c4RmLwNmdlJiOiMXbEJCLigZhsj0orTphsD1itTJlrLiOiEmTDJCLiMTM6MDN7EjN5kTM6EjNyIiOiQWSiwSfdJCdlVGaTRncvBXZSJCLiQnchh6QhRXYEJCLiUGbiFGV43mdpBlIsICdlVGaTRHduF6RislOicGbmJCLlNHbhZmOiI7ckJye0ICbuFkI1pjIEJCLi4TPB5WbohUMaNHZUlkWHxUVS94axBXQNpFNEV6TPNlWw5Gb9kUO696MjJ6MhN4aSlHdxFnNxcDd4gWNMJVdxd2WMA
-
-# SPREAD JS 내부망 eVCP 개발
+NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
+NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
+# SPREAD JS 내부망 eVCP 개발 (개발 배포시 이 키로 대체)
# NEXT_PUBLIC_SPREADJS_KEY="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh"
# NEXT_PUBLIC_SPREAD_LICENSE="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh"
+
# 기간계 시스템 연동 설정
ERP_API_URL=https://erp.example.com/api/vendors
ERP_API_KEY=your-erp-api-key
@@ -103,9 +106,6 @@ SAML_IDP_CERT="MIID2zCCAsOgAwIBAgIJAIt4QxV2bA3qMA0GCSqGSIb3DQEBCwUAMIGDMQswCQYDV
# === [끝] SSO 설정 ===
-NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
-NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh"
-
# Bizppurio API 설정
BIZPPURIO_ACCOUNT=shinonsap_evcp
BIZPPURIO_PASSWORD=shi_2025
@@ -132,13 +132,8 @@ KNOX_API_BEARER="5a84ab62-d523-3602-ad3d-e3421893ae0c" # 운영
KNOX_API_FORCE_LIMIT=false # 주간대량호출 강제 제한 여부
KNOX_API_HOURLY_LIMIT=90 # 시간당 API 호출횟수 제한
# KNOX_API_CALL_DELAY_MS # API 배치 처리간 딜레이 수동 설정이며, 자동 산출값보다 높아야 적용
-KNOX_TITLE_SYNC_CRON="0 3 * * *" # 매일 새벽 3시
-KNOX_TITLE_SYNC_FIRST_RUN=true
-KNOX_ORGANIZATION_SYNC_CRON="30 3 * * *" # 매일 새벽 3시 30분
-KNOX_ORGANIZATION_SYNC_FIRST_RUN=true
-KNOX_EMPLOYEE_SYNC_CRON="0 4 * * *" # 매일 새벽 4시
-KNOX_EMPLOYEE_SYNC_FIRST_RUN=true # 양이 많으므로 시작시 갱신 X
-# BASEURL: https://openapi.stage.samsung.net
+KNOX_MASTER_SYNC_CRON="0 2 * * *" # cron 스케줄, 새벽 2시에 적용되며, 직급-조직도-임직원 순으로 적용.
+KNOX_MASTER_SYNC_FIRST_RUN="false" # 앱 시작시 동기화 시작 여부
KNOX_API_BASE_URL="https://openapi.samsung.net"
MESSENGER_ACCESS_TOKEN=""
MESSENGER_DEVICE_ID=""
diff --git a/instrumentation.ts b/instrumentation.ts
index 415214ce..97aa6143 100644
--- a/instrumentation.ts
+++ b/instrumentation.ts
@@ -12,32 +12,20 @@ export async function register() {
// const { startEnhancedSyncScheduler } = await import('./lib/nonsap-sync/enhanced-sync-service');
// startEnhancedSyncScheduler();
- } catch (error) {
+ } catch {
console.error('Failed to start Enhanced NONSAP sync scheduler.');
// 스케줄러 실패해도 애플리케이션은 계속 실행
}
try {
- // Knox 직급 동기화 스케줄러 시작
- const { startKnoxTitleSyncScheduler } = await import(
- './lib/knox-sync/title-sync-service'
+ // Knox 통합 동기화 스케줄러 시작 (직급 → 조직 → 임직원 순차 실행)
+ const { startKnoxMasterSyncScheduler } = await import(
+ './lib/knox-sync/master-sync-service'
);
- startKnoxTitleSyncScheduler();
+ await startKnoxMasterSyncScheduler();
- // Knox 조직 동기화 스케줄러 시작
- const { startKnoxOrganizationSyncScheduler } = await import(
- './lib/knox-sync/organization-sync-service'
- );
- startKnoxOrganizationSyncScheduler();
-
- // Knox 임직원 동기화 스케줄러 시작
- const { startKnoxEmployeeSyncScheduler } = await import(
- './lib/knox-sync/employee-sync-service'
- );
- startKnoxEmployeeSyncScheduler();
- }
- catch (error) {
- console.error('Failed to start Knox employee/organization/title sync scheduler.');
+ } catch {
+ console.error('Failed to start Knox master sync scheduler.');
// 스케줄러 실패해도 애플리케이션은 계속 실행
}
}
diff --git a/lib/knox-sync/master-sync-service.ts b/lib/knox-sync/master-sync-service.ts
new file mode 100644
index 00000000..5cabe9ed
--- /dev/null
+++ b/lib/knox-sync/master-sync-service.ts
@@ -0,0 +1,72 @@
+'use server';
+
+import * as cron from 'node-cron';
+import { syncKnoxTitles } from './title-sync-service';
+import { syncKnoxOrganizations } from './organization-sync-service';
+import { syncKnoxEmployees } from './employee-sync-service';
+import {
+ checkTimeRestriction,
+ logSchedulerInfo,
+} from './common';
+
+// 통합 CRON 스케줄 (기본: 매일 04:00)
+const CRON_STRING = process.env.KNOX_MASTER_SYNC_CRON || '0 4 * * *';
+
+// 애플리케이션 기동 시 최초 한 번 실행 여부
+const DO_FIRST_RUN = process.env.KNOX_MASTER_SYNC_FIRST_RUN === 'true';
+
+/**
+ * Knox 동기화 마스터 함수 - 직급 → 조직 → 임직원 순차 실행
+ */
+export async function syncAllKnoxData(): Promise<void> {
+ console.log('[KNOX-SYNC] 🚀 Knox 통합 동기화 시작 (순차 실행)');
+ const overallStartTime = Date.now();
+
+ try {
+ // 1단계: 직급 동기화
+ console.log('[KNOX-SYNC] 1/3: 직급 동기화 시작');
+ await syncKnoxTitles();
+ console.log('[KNOX-SYNC] 1/3: 직급 동기화 완료 ✅');
+
+ // 2단계: 조직 동기화 (직급 완료 후)
+ console.log('[KNOX-SYNC] 2/3: 조직 동기화 시작');
+ await syncKnoxOrganizations();
+ console.log('[KNOX-SYNC] 2/3: 조직 동기화 완료 ✅');
+
+ // 3단계: 임직원 동기화 (조직 완료 후)
+ console.log('[KNOX-SYNC] 3/3: 임직원 동기화 시작');
+ await syncKnoxEmployees();
+ console.log('[KNOX-SYNC] 3/3: 임직원 동기화 완료 ✅');
+
+ const overallDuration = Math.round((Date.now() - overallStartTime) / 1000);
+ console.log(`[KNOX-SYNC] 🎉 Knox 통합 동기화 완료 - 총 ${overallDuration}초 소요`);
+
+ } catch (error) {
+ console.error('[KNOX-SYNC] ❌ Knox 통합 동기화 중 오류 발생:', error);
+ throw error;
+ }
+}
+
+/**
+ * Knox 마스터 동기화 스케줄러 시작
+ */
+export async function startKnoxMasterSyncScheduler() {
+ // 환경 변수에 따라 실행시 즉시 실행 여부 결정
+ if (DO_FIRST_RUN) {
+ if (!checkTimeRestriction()) {
+ return;
+ }
+
+ console.log('[KNOX-SYNC] 첫 실행: Knox 통합 동기화 즉시 시작');
+ syncAllKnoxData().catch(console.error);
+ }
+
+ // 통합 CRON JOB 등록 (기존 개별 스케줄 대신)
+ cron.schedule(CRON_STRING, () => {
+ console.log('[KNOX-SYNC] CRON 실행: Knox 통합 동기화 시작');
+ syncAllKnoxData().catch(console.error);
+ });
+
+ logSchedulerInfo('통합(직급→조직→임직원)', CRON_STRING);
+ console.log('[KNOX-SYNC] 💡 순차 실행으로 의존성 문제 해결 (직급 완료 → 조직 완료 → 임직원 완료)');
+} \ No newline at end of file