# 포인트 관리 프로그램 - POS 터미널 등록/하트비트 에이전트 # (기존 concrab_agent.ps1을 대체하는 경량 버전. 결제/조회 로직은 아직 포함하지 않음 - # 매장 대시보드에 "이 POS가 지금 켜져있다"는 것만 알리는 최소 기능.) # # 사용법: # 1) 매장 관리자가 웹(/store/terminals)에서 "등록 코드 발급"으로 6자리 코드를 받음 # 2) 이 스크립트를 처음 실행하면 코드와 터미널 이름(예: "카운터1")을 물어보고 등록 # 3) 이후로는 그냥 실행만 하면 1분마다 하트비트를 보내며 대기(트레이/백그라운드용) # # 설정: 아래 $BaseUrl 을 실제 서버 주소로 맞춰서 배포 (코드에 박지 않고 설정파일로 분리해도 됨) param( [string]$BaseUrl = "https://concrab.com", [string]$ConfigPath = "$PSScriptRoot\terminal-config.json" ) $ErrorActionPreference = "Stop" function Load-Config { if (Test-Path $ConfigPath) { return Get-Content $ConfigPath -Raw | ConvertFrom-Json } return $null } function Save-Config($cfg) { $cfg | ConvertTo-Json | Out-File -Encoding UTF8 $ConfigPath } function Register-Terminal { $code = Read-Host "매장 대시보드(POS 터미널 등록)에서 발급한 6자리 코드를 입력하세요" $name = Read-Host "이 단말의 이름을 입력하세요 (예: 카운터1)" $body = @{ code = $code; terminalName = $name } | ConvertTo-Json try { $res = Invoke-RestMethod -Method Post -Uri "$BaseUrl/api/v1/pos/terminals/register" ` -ContentType "application/json" -Body $body } catch { Write-Host "등록 실패: $_" -ForegroundColor Red exit 1 } $cfg = @{ terminalId = $res.terminalId; apiKey = $res.apiKey; name = $name; baseUrl = $BaseUrl } Save-Config $cfg Write-Host "등록 완료 — 이제부터 이 단말이 매장 대시보드에 '가동중'으로 표시됩니다." -ForegroundColor Green return $cfg } function Send-Heartbeat($cfg) { try { Invoke-RestMethod -Method Post -Uri "$($cfg.baseUrl)/api/v1/pos/terminals/heartbeat" ` -Headers @{ Authorization = "Bearer $($cfg.apiKey)" } | Out-Null return $true } catch { Write-Host "$(Get-Date -Format 'HH:mm:ss') 하트비트 실패: $_" -ForegroundColor Yellow return $false } } $cfg = Load-Config if (-not $cfg) { $cfg = Register-Terminal } Write-Host "터미널 '$($cfg.name)' 하트비트 시작 (1분 간격, 종료: Ctrl+C)" while ($true) { $ok = Send-Heartbeat $cfg if ($ok) { Write-Host "$(Get-Date -Format 'HH:mm:ss') 하트비트 전송 완료" } Start-Sleep -Seconds 60 }