영업관리 통합 로그인 명칭수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
aweso
2026-01-06 14:06:32 +09:00
parent 933b00b6e6
commit 8f121484d5
10 changed files with 164 additions and 23 deletions

View File

@@ -0,0 +1,8 @@
{
"permissions": {
"allow": [
"Bash(echo:*)",
"Bash(cat:*)"
]
}
}

View File

@@ -193,7 +193,7 @@ mysqldump -h 127.0.0.1 -u root -p chandj > /tmp/chandj_backup.sql
### 로컬로 다운로드 (PowerShell)
```powershell
scp pro@114.203.209.83:/tmp/chandj_backup.sql .\chandj_backup.sql
scp pro@114.203.209.83:/chandj_backup.sql .\chandj_backup.sql
```
### 로컬 Docker에 적용

81
GIT_AUTO_GUIDE.md Normal file
View File

@@ -0,0 +1,81 @@
# Git 자동화 가이드
## 개요
`g` 명령어를 사용하여 Git 작업(`git add .`, `git commit`, `git push`)을 한 번에 자동화할 수 있습니다.
## 사용 방법
```powershell
g "커밋 메시지"
```
### 예시
```powershell
g "sales 로컬파일 로그인 수정"
```
이 명령어는 다음을 자동으로 실행합니다:
1. `git add .` - 모든 변경사항 스테이징
2. `git commit -m "sales 로컬파일 로그인 수정"` - 커밋 생성
3. `git push` - 원격 저장소에 푸시
## 설정 완료 확인
새로운 PowerShell 창을 열거나 다음 명령어로 함수를 로드하세요:
```powershell
. $PROFILE
```
함수가 제대로 로드되었는지 확인:
```powershell
Get-Command g
```
## 문제 해결
### 함수가 인식되지 않는 경우
1. **프로필 파일 다시 로드**:
```powershell
. $PROFILE
```
2. **새 PowerShell 창 열기**:
- 현재 창을 닫고 새 PowerShell 창을 엽니다.
3. **프로필 파일 위치 확인**:
```powershell
$PROFILE
```
4. **프로필 파일 내용 확인**:
```powershell
Get-Content $PROFILE
```
### 실행 정책 오류가 발생하는 경우
```powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
```
## 추가 기능
현재 함수는 다음을 포함합니다:
- ✅ 각 단계별 진행 상황 표시
- ✅ 에러 발생 시 중단 및 메시지 표시
- ✅ 색상으로 구분된 출력
## 파일 위치
- **프로필 파일**: `$PROFILE` (일반적으로 `C:\Users\사용자명\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1`)
- **스크립트 파일**: `git-auto.ps1` (프로젝트 루트)
---
**마지막 업데이트**: 2025-01-06

52
git-auto.ps1 Normal file
View File

@@ -0,0 +1,52 @@
# Git 자동화 스크립트
# 사용법: g "커밋 메시지"
function g {
param(
[Parameter(Mandatory=$true)]
[string]$message
)
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Git 자동화 시작" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
# 1. git add .
Write-Host "▶ git add . 실행 중..." -ForegroundColor Yellow
git add .
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ git add 실패" -ForegroundColor Red
return
}
Write-Host "✅ git add 완료" -ForegroundColor Green
Write-Host ""
# 2. git commit
Write-Host "▶ git commit 실행 중..." -ForegroundColor Yellow
Write-Host " 메시지: $message" -ForegroundColor Gray
git commit -m "$message"
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ git commit 실패" -ForegroundColor Red
Write-Host " (변경사항이 없거나 이미 커밋된 상태일 수 있습니다)" -ForegroundColor Yellow
return
}
Write-Host "✅ git commit 완료" -ForegroundColor Green
Write-Host ""
# 3. git push
Write-Host "▶ git push 실행 중..." -ForegroundColor Yellow
git push
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ git push 실패" -ForegroundColor Red
Write-Host " (원격 저장소 설정을 확인하세요)" -ForegroundColor Yellow
return
}
Write-Host "✅ git push 완료" -ForegroundColor Green
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "✅ 모든 작업 완료!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Cyan
}

View File

@@ -1,9 +1,9 @@
# 영업관리자 프로세스 및 테넌트 등록 관리 계획
# 영업파트너 프로세스 및 테넌트 등록 관리 계획
본 문서는 영업관리자가 자신이 관리하는 테넌트를 등록하고, 상품 계약을 통해 발생하는 수익을 체계적으로 관리하며, 영업 프로세스(시나리오)를 기록하기 위한 구현 계획을 담고 있습니다.
본 문서는 영업파트너가 자신이 관리하는 테넌트를 등록하고, 상품 계약을 통해 발생하는 수익을 체계적으로 관리하며, 영업 프로세스(시나리오)를 기록하기 위한 구현 계획을 담고 있습니다.
## 1. 개요
영업관리자는 자신의 활동 결과인 테넌트와 계약 정보를 시스템에 기록합니다. 이 데이터는 영업관리자**수익(Commission)** 근거가 되며, **운영팀(Operator)**은 이를 확인하고 승인함으로써 최종 정산이 이루어집니다.
영업파트너는 자신의 활동 결과인 테넌트와 계약 정보를 시스템에 기록합니다. 이 데이터는 영업파트너**수익(Commission)** 근거가 되며, **운영팀(Operator)**은 이를 확인하고 승인함으로써 최종 정산이 이루어집니다.
---
@@ -11,7 +11,7 @@
제공된 SQL 파일을 실행하면 다음과 같은 구조가 생성됩니다.
### 2.1 sales_tenants (테넌트 관리)
- 영업관리자와 1:N 관계로 매칭되는 고객사 정보.
- 영업파트너와 1:N 관계로 매칭되는 고객사 정보.
- 상태(status) 변화를 통해 리드(Lead)에서 계약(Active)까지의 단계 관리.
### 2.2 sales_tenant_products (계약 및 수익 관리)
@@ -23,11 +23,11 @@
## 3. 영업 프로세스 기록 관리 계획 (C:\Users\light\sam\sales\sales_scenario)
영업관리자의 프로세스를 `C:\Users\aweso\sam\sales\sales_scenario`에 기록하고 활용하는 상세 계획입니다.
영업파트너의 프로세스를 `C:\Users\aweso\sam\sales\sales_scenario`에 기록하고 활용하는 상세 계획입니다.
### 3.1 시나리오 기반 체크리스트 통합
- 신규 테넌트 등록 시, `sales_scenario_checklist` 테이블에 해당 테넌트용 체크리스트를 자동 생성합니다.
- 영업관리자는 7단계(또는 설정된 단계)의 영업 프로세스를 진행하며 각 체크포인트를 달성할 때마다 체크합니다.
- 영업파트너는 7단계(또는 설정된 단계)의 영업 프로세스를 진행하며 각 체크포인트를 달성할 때마다 체크합니다.
### 3.2 활동 로그 (sales_scenario_logs)
- 체크리스트 이외의 구체적인 상담 내역이나 영업 전략을 텍스트로 기록합니다.
@@ -42,7 +42,7 @@
- 테넌트 목록에서 '상품/계약 추가' 기능 구현.
### Step 2: 수익 대시보드 구축
- 영업관리자가 자신의 누적 수익(승인됨/대기중)을 한눈에 볼 수 있는 통계 카드 UI 구현.
- 영업파트너가 자신의 누적 수익(승인됨/대기중)을 한눈에 볼 수 있는 통계 카드 UI 구현.
- `sales_tenant_products` 테이블의 금액 합산 연동.
### Step 3: 운영팀 승인 프로세스

View File

@@ -187,7 +187,7 @@ $roleData = [
],
'current_user' => [
"id" => "user_sales_admin",
"name" => "영업관리자",
"name" => "영업파트너",
"role" => "영업관리",
"sub_managers" => [
[

View File

@@ -53,16 +53,16 @@ try {
$stmt->execute();
}
// 기본 영업관리자 계정 생성
// 기본 영업파트너 계정 생성
$check = $pdo->prepare("SELECT id FROM sales_member WHERE member_id = 'sales'");
$check->execute();
if (!$check->fetch()) {
$stmt = $pdo->prepare("INSERT INTO sales_member (member_id, password, name, role) VALUES ('sales', 'sales', '영업관리자', 'sales_admin')");
$stmt = $pdo->prepare("INSERT INTO sales_member (member_id, password, name, role) VALUES ('sales', 'sales', '영업파트너', 'sales_admin')");
$stmt->execute();
}
$sales_id = $pdo->lastInsertId() ?: 2;
// 기본 매니저 계정 생성 (영업관리자 하위)
// 기본 매니저 계정 생성 (영업파트너 하위)
$check = $pdo->prepare("SELECT id FROM sales_member WHERE member_id = 'manager'");
$check->execute();
if (!$check->fetch()) {
@@ -77,7 +77,7 @@ try {
if (!$check->fetch()) {
$stmt = $pdo->prepare("INSERT INTO sales_record (member_id, customer_name, contract_date, amount) VALUES (?, ?, ?, ?)");
// 영업관리자(sales) 직접 실적
// 영업파트너(sales) 직접 실적
$stmt->execute([$sales_id, '스타트업 A', '2024-12-01', 25000000]);
$stmt->execute([$sales_id, '벤처기업 B', '2024-12-10', 30000000]);

View File

@@ -85,7 +85,7 @@ try {
return;
}
if ($member_id === 'sales' && $password === 'sales') {
$pdo->prepare("INSERT IGNORE INTO sales_member (member_id, password, name, role) VALUES ('sales', 'sales', '영업관리자', 'sales_admin')")->execute();
$pdo->prepare("INSERT IGNORE INTO sales_member (member_id, password, name, role) VALUES ('sales', 'sales', '영업파트너', 'sales_admin')")->execute();
$stmt = $pdo->prepare("SELECT * FROM sales_member WHERE member_id = 'sales'");
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);

View File

@@ -33,7 +33,7 @@ function checkTenantPermission($pdo, $tenant_id, $currentUser) {
return $tenant['sales_manager_id'] == $currentUser['id'];
}
// 영업관리자는 본인이 등록했거나, 본인이 담당 매니저인 경우 가능
// 영업파트너는 본인이 등록했거나, 본인이 담당 매니저인 경우 가능
return ($tenant['manager_id'] == $currentUser['id'] || $tenant['sales_manager_id'] == $currentUser['id']);
}
@@ -41,8 +41,8 @@ function checkTenantPermission($pdo, $tenant_id, $currentUser) {
$pdo->exec("
CREATE TABLE IF NOT EXISTS `sales_tenants` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`manager_id` int(11) NOT NULL COMMENT '영업한 영업관리자 ID',
`sales_manager_id` int(11) DEFAULT NULL COMMENT '매칭된 매니저 ID (영업관리자 본인 또는 별도 매니저)',
`manager_id` int(11) NOT NULL COMMENT '영업한 영업파트너 ID',
`sales_manager_id` int(11) DEFAULT NULL COMMENT '매칭된 매니저 ID (영업파트너 본인 또는 별도 매니저)',
`tenant_name` varchar(200) NOT NULL,
`representative` varchar(100) DEFAULT NULL,
`business_no` varchar(20) DEFAULT NULL,
@@ -180,7 +180,7 @@ try {
switch ($method) {
case 'GET':
if ($action === 'list_tenants') {
// 운영자는 모든 테넌트, 영업관리/매니저는 본인 소속 테넌트만
// 운영자는 모든 테넌트, 영업파트너/매니저는 본인 소속 테넌트만
if ($currentUser['role'] === 'operator') {
$stmt = $pdo->prepare("
SELECT t.*, m.name as register_name, m.role as register_role, m2.name as manager_name, m2.role as manager_role
@@ -203,7 +203,7 @@ try {
");
$stmt->execute([$currentUser['id']]);
} else {
// 영업관리자는 본인이 영업했거나, 본인이 매니저로 배정된 테넌트 조회
// 영업파트너는 본인이 영업했거나, 본인이 매니저로 배정된 테넌트 조회
$stmt = $pdo->prepare("
SELECT t.*, m.name as register_name, m.role as register_role, m2.name as manager_name, m2.role as manager_role
FROM sales_tenants t
@@ -365,7 +365,7 @@ try {
$manager_id = $row['manager_id'];
$amount = $row['contract_amount'];
// 영업관리자 계층 확인
// 영업파트너 계층 확인
// 1. 등록자 본인이 sales_admin인지 확인
// 2. 상위(parent)가 sales_admin인지 확인
$sales_admin_count = 0;
@@ -600,7 +600,7 @@ try {
if (!$tenant_id) throw new Exception("테넌트 ID가 누락되었습니다.");
// 권한 확인: 배지 지정은 운영자 또는 해당 테넌트를 등록한 영업관리자만 가능
// 권한 확인: 배지 지정은 운영자 또는 해당 테넌트를 등록한 영업파트너만 가능
$stmt = $pdo->prepare("SELECT manager_id FROM sales_tenants WHERE id = ?");
$stmt->execute([$tenant_id]);
$t = $stmt->fetch(PDO::FETCH_ASSOC);

View File

@@ -805,7 +805,7 @@
</div>
{detailModalUser.name} ({detailModalUser.member_id}) 하위 멤버
</h3>
<p className="text-slate-500 mt-1"> 영업관리자에게 소속된 모든 매니저 목록입니다.</p>
<p className="text-slate-500 mt-1"> 영업파트너에게 소속된 모든 매니저 목록입니다.</p>
</div>
<button onClick={() => setDetailModalUser(null)} className="p-2 hover:bg-slate-200 rounded-full transition-colors text-slate-400">
<LucideIcon name="x" className="w-6 h-6" />
@@ -1654,7 +1654,7 @@
<div className="w-16 h-16 bg-blue-600 rounded-full flex items-center justify-center mx-auto mb-4 text-white shadow-lg shadow-blue-100">
<LucideIcon name="lock" className="w-8 h-8" />
</div>
<h2 className="text-3xl font-black text-slate-900 tracking-tight">영업관리 통합 로그인</h2>
<h2 className="text-3xl font-black text-slate-900 tracking-tight">SAM 로그인</h2>
<p className="text-slate-500 mt-2 font-medium">서비스 이용을 위해 로그인해주세요.</p>
</div>