영업관리 통합 로그인 명칭수정
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
8
.claude/settings.local.json
Normal file
8
.claude/settings.local.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(echo:*)",
|
||||
"Bash(cat:*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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
81
GIT_AUTO_GUIDE.md
Normal 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
52
git-auto.ps1
Normal 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
|
||||
}
|
||||
|
||||
@@ -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: 운영팀 승인 프로세스
|
||||
|
||||
@@ -187,7 +187,7 @@ $roleData = [
|
||||
],
|
||||
'current_user' => [
|
||||
"id" => "user_sales_admin",
|
||||
"name" => "영업관리자",
|
||||
"name" => "영업파트너",
|
||||
"role" => "영업관리",
|
||||
"sub_managers" => [
|
||||
[
|
||||
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user