feat(admin): stabilize blog and admin patterns
TaxBaik CI/CD / build-and-deploy (push) Has been cancelled
TaxBaik CI/CD / build-and-deploy (push) Has been cancelled
This commit is contained in:
@@ -5,10 +5,10 @@ CREATE TABLE IF NOT EXISTS clients (
|
||||
company_name VARCHAR(200),
|
||||
phone VARCHAR(30),
|
||||
email VARCHAR(200),
|
||||
service_type VARCHAR(50), -- 기장, 부동산, 증여·상속, 종합소득세, 기타
|
||||
tax_type VARCHAR(30), -- 개인, 법인, 면세사업자
|
||||
service_type VARCHAR(50), -- 기장, 부동산, 증여상속, 종합소득세, 기타
|
||||
tax_type VARCHAR(30), -- 개인사업자, 법인사업자, 면세사업자
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active', -- active, inactive
|
||||
source VARCHAR(50), -- 홈페이지문의, 소개, 직접방문, 기타
|
||||
source VARCHAR(50), -- 홈페이지문의, 소개, 직접방문, 카카오채널, 블로그, 기타
|
||||
memo TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
|
||||
@@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS faqs (
|
||||
id SERIAL PRIMARY KEY,
|
||||
question VARCHAR(300) NOT NULL,
|
||||
answer TEXT NOT NULL,
|
||||
category VARCHAR(50), -- 기장·세금신고, 부동산, 증여·상속, 기타
|
||||
category VARCHAR(50), -- 기장세금신고, 부동산, 증여상속, 기타
|
||||
sort_order INT NOT NULL DEFAULT 0,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
@@ -17,20 +17,20 @@ INSERT INTO faqs (question, answer, category, sort_order, is_active) VALUES
|
||||
(
|
||||
'기장료가 얼마인지 미리 알 수 있나요?',
|
||||
'업종과 매출 규모에 따라 다르지만, 무료 상담 후 정확한 견적을 안내드립니다. 일반적으로 소규모 사업자는 월 10만 원대부터 시작하며, 부가가치세·소득세 신고 시기에는 별도 수수료 없이 포함 처리합니다. 먼저 상담해 보시면 구체적인 금액을 바로 말씀드릴 수 있습니다.',
|
||||
'기장·세금신고', 10, TRUE
|
||||
'기장세금신고', 10, TRUE
|
||||
),
|
||||
(
|
||||
'양도세 상담은 어떻게 진행되나요?',
|
||||
'등기부등본, 취득·양도 계약서, 보유 기간 확인 서류 등을 카카오 채널 또는 문의폼으로 전달해 주시면 예상 세액과 절세 방법을 검토해 드립니다. 매도 전에 상담하시면 취득세·비과세 요건 등을 사전에 확인할 수 있어 훨씬 유리합니다.',
|
||||
'등기부등본, 취득·양도 계약서, 보유 기간 확인 서류 등을 카카오채널 또는 문의폼으로 전달해 주시면 예상 세액과 절세 방법을 검토해 드립니다. 매도 전에 상담하시면 취득세·비과세 요건 등을 사전에 확인할 수 있어 훨씬 유리합니다.',
|
||||
'부동산', 20, TRUE
|
||||
),
|
||||
(
|
||||
'무료 상담도 가능한가요?',
|
||||
'네, 초기 현황 파악과 방향성 검토까지는 무료로 진행합니다. 카카오 채널 또는 문의폼으로 연락 주시면 빠르게 확인해 드립니다. 실질적인 세무 처리·신고 대행이 시작되는 시점부터 수수료가 발생합니다.',
|
||||
'네, 초기 현황 파악과 방향성 검토까지는 무료로 진행합니다. 카카오채널 또는 문의폼으로 연락 주시면 빠르게 확인해 드립니다. 실질적인 세무 처리·신고 대행이 시작되는 시점부터 수수료가 발생합니다.',
|
||||
'기타', 30, TRUE
|
||||
),
|
||||
(
|
||||
'처음 상담 시 어떤 자료를 준비해야 하나요?',
|
||||
'상담 목적에 따라 다르지만 아래 자료가 있으면 더 정확한 안내가 가능합니다. 사업자 세무: 사업자등록증, 최근 3개월 매출·매입 자료 / 부동산: 등기부등본, 취득·매도 계약서, 보유 기간 확인 자료 / 증여·상속: 재산 목록, 증여 예정 자산 내역. 자료가 없어도 상담은 가능합니다. 먼저 연락 주세요.',
|
||||
'기타', 40, TRUE
|
||||
'상담 목적에 따라 다르지만 아래 자료가 있으면 더 정확한 안내가 가능합니다. 사업자 세무: 사업자등록증, 최근 3개월 매출·매입 자료 / 부동산: 등기부등본, 취득·매도 계약서, 보유 기간 확인 자료 / 증여상속: 재산 목록, 증여 예정 자산 내역. 자료가 없어도 상담은 가능합니다. 먼저 연락 주세요.',
|
||||
'증여상속', 40, TRUE
|
||||
);
|
||||
|
||||
@@ -35,13 +35,13 @@ INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||
('FILING_TYPE', '법인세', '법인세', 30),
|
||||
('FILING_TYPE', '원천세', '원천세', 40),
|
||||
('FILING_TYPE', '양도소득세', '양도소득세', 50),
|
||||
('FILING_TYPE', '상속/증여세', '상속/증여세', 60)
|
||||
('FILING_TYPE', '상속증여세', '상속·증여세', 60)
|
||||
ON CONFLICT (code_group, code_value) DO NOTHING;
|
||||
|
||||
-- Seed data for SERVICE_TYPE
|
||||
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||
('SERVICE_TYPE', '개인 기장대리', '개인 기장대리', 10),
|
||||
('SERVICE_TYPE', '법인 기장대리', '법인 기장대리', 20),
|
||||
('SERVICE_TYPE', '개인기장대리', '개인 기장대리', 10),
|
||||
('SERVICE_TYPE', '법인기장대리', '법인 기장대리', 20),
|
||||
('SERVICE_TYPE', '세무조정', '세무조정', 30),
|
||||
('SERVICE_TYPE', '세무컨설팅', '세무컨설팅', 40),
|
||||
('SERVICE_TYPE', '불복청구', '불복청구', 50)
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
-- V019: Fix blog posts migration (V018 had quote escaping issues)
|
||||
-- Complete rewrite using $$ quote style to avoid escaping problems
|
||||
|
||||
-- Delete posts 6-12 added in V018 (if they exist)
|
||||
DELETE FROM blog_posts WHERE id >= 6;
|
||||
|
||||
-- Re-insert all 12 posts with proper formatting
|
||||
|
||||
-- 6. 스마트스토어 판매자를 위한 첫 세무 기장
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
-- Layer 2: Details + Tax law changes (impossible to track alone)
|
||||
-- Layer 3: Professional value (tax accountants needed)
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||
VALUES (
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
-- Remove absolute claims, replace with past-tense examples
|
||||
-- Replace guarantee language with possibility statements
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||
VALUES (
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
-- Add tax law citations, 2025 standards, data sources
|
||||
-- Remove speculation, assumptions, opinions
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||
VALUES (
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
-- Remove internal jargon (Layer 1-3, "3층 구조", etc.)
|
||||
-- Replace with customer perspective: "할 수 있어요" → "복잡하네" → "세무사가 필요하네"
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||
VALUES (
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
-- Simplify emojis (remove section headers like 📊, 🧮)
|
||||
-- Keep customer-friendly language (1️⃣ 2️⃣ 3️⃣)
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||
VALUES (
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
-- V025: Add 9 new blog posts with correct SQL structure
|
||||
-- All posts follow BLOG_TEMPLATE.md guidelines: 3-step structure, accuracy principle, list format
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 4;
|
||||
|
||||
INSERT INTO blog_posts (title, content, slug, category_id, is_published, seo_title, seo_description, tags, created_at, updated_at) VALUES
|
||||
|
||||
-- 1. 프리랜서가 놓친 경비 5가지
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
-- Each post: 1,500-2,500 words, law citations, 3-step structure
|
||||
-- 2025 tax year basis, accuracy principle
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
-- 1. 프리랜서가 놓친 경비 5가지
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, seo_title, seo_description, tags, created_at, updated_at)
|
||||
VALUES (
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
-- cat 4 (부가가치세): 부가세 신고, 부가세 기한, 사업자 등록
|
||||
-- cat 5 (가족자산): 연말정산 환급
|
||||
|
||||
DELETE FROM blog_posts WHERE id >= 1;
|
||||
|
||||
INSERT INTO blog_posts (title, slug, content, category_id, is_published, seo_title, seo_description, tags, created_at, updated_at) VALUES
|
||||
|
||||
-- 기초 3개 포스트 (V022, V024)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
ALTER TABLE blog_posts
|
||||
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
|
||||
|
||||
DROP INDEX IF EXISTS idx_blog_slug;
|
||||
DROP INDEX IF EXISTS blog_posts_slug_key;
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS ux_blog_posts_slug_active
|
||||
ON blog_posts (slug)
|
||||
WHERE deleted_at IS NULL;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_blog_slug_active
|
||||
ON blog_posts (slug)
|
||||
WHERE deleted_at IS NULL;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_blog_published_active
|
||||
ON blog_posts (is_published, published_at DESC)
|
||||
WHERE deleted_at IS NULL;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_blog_category_active
|
||||
ON blog_posts (category_id)
|
||||
WHERE deleted_at IS NULL;
|
||||
@@ -0,0 +1,131 @@
|
||||
-- Seed and normalize admin common codes.
|
||||
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||
('INQUIRY_SERVICE_TYPE', '사업자세무', '사업자세무', 10),
|
||||
('INQUIRY_SERVICE_TYPE', '부동산세금', '부동산세금', 20),
|
||||
('INQUIRY_SERVICE_TYPE', '가족자산', '가족자산', 30),
|
||||
('INQUIRY_SERVICE_TYPE', '기타', '기타', 40),
|
||||
|
||||
('INQUIRY_STATUS', 'new', '신규', 10),
|
||||
('INQUIRY_STATUS', 'consulting', '상담중', 20),
|
||||
('INQUIRY_STATUS', 'contracted', '계약완료', 30),
|
||||
('INQUIRY_STATUS', 'rejected', '거절', 40),
|
||||
('INQUIRY_STATUS', 'closed', '종결', 50),
|
||||
|
||||
('CLIENT_STATUS', 'active', '활성', 10),
|
||||
('CLIENT_STATUS', 'inactive', '비활성', 20),
|
||||
|
||||
('CLIENT_SERVICE_TYPE', '기장', '기장', 10),
|
||||
('CLIENT_SERVICE_TYPE', '부동산', '부동산', 20),
|
||||
('CLIENT_SERVICE_TYPE', '증여상속', '증여·상속', 30),
|
||||
('CLIENT_SERVICE_TYPE', '종합소득세', '종합소득세', 40),
|
||||
('CLIENT_SERVICE_TYPE', '법인세', '법인세', 50),
|
||||
('CLIENT_SERVICE_TYPE', '부가가치세', '부가가치세', 60),
|
||||
('CLIENT_SERVICE_TYPE', '기타', '기타', 70),
|
||||
|
||||
('CLIENT_TAX_TYPE', '개인사업자', '개인사업자', 10),
|
||||
('CLIENT_TAX_TYPE', '법인사업자', '법인사업자', 20),
|
||||
('CLIENT_TAX_TYPE', '면세사업자', '면세사업자', 30),
|
||||
('CLIENT_TAX_TYPE', '근로소득자', '근로소득자', 40),
|
||||
('CLIENT_TAX_TYPE', '기타', '기타', 50),
|
||||
|
||||
('CLIENT_SOURCE', '홈페이지문의', '홈페이지 문의', 10),
|
||||
('CLIENT_SOURCE', '소개', '소개', 20),
|
||||
('CLIENT_SOURCE', '직접방문', '직접 방문', 30),
|
||||
('CLIENT_SOURCE', '카카오채널', '카카오 채널', 40),
|
||||
('CLIENT_SOURCE', '블로그', '블로그', 50),
|
||||
('CLIENT_SOURCE', '기타', '기타', 60),
|
||||
|
||||
('CONTRACT_SERVICE_TYPE', '개인기장대리', '개인 기장대리', 10),
|
||||
('CONTRACT_SERVICE_TYPE', '법인기장대리', '법인 기장대리', 20),
|
||||
('CONTRACT_SERVICE_TYPE', '세무조정', '세무조정', 30),
|
||||
('CONTRACT_SERVICE_TYPE', '세무컨설팅', '세무컨설팅', 40),
|
||||
('CONTRACT_SERVICE_TYPE', '불복청구', '불복청구', 50),
|
||||
|
||||
('REVENUE_SERVICE_TYPE', '기장수수료', '기장 수수료', 10),
|
||||
('REVENUE_SERVICE_TYPE', '세무조정료', '세무조정료', 20),
|
||||
('REVENUE_SERVICE_TYPE', '세무상담료', '세무상담료', 30),
|
||||
('REVENUE_SERVICE_TYPE', '신고대행료', '신고 대행료', 40),
|
||||
('REVENUE_SERVICE_TYPE', '자문수수료', '자문 수수료', 50),
|
||||
|
||||
('FILING_TYPE', '종합소득세', '종합소득세', 10),
|
||||
('FILING_TYPE', '부가가치세', '부가가치세', 20),
|
||||
('FILING_TYPE', '법인세', '법인세', 30),
|
||||
('FILING_TYPE', '원천세', '원천세', 40),
|
||||
('FILING_TYPE', '양도소득세', '양도소득세', 50),
|
||||
('FILING_TYPE', '상속증여세', '상속·증여세', 60),
|
||||
('FILING_TYPE', '세무조정', '세무조정', 70),
|
||||
|
||||
('TAX_RISK_LEVEL', 'low', '낮음', 10),
|
||||
('TAX_RISK_LEVEL', 'normal', '보통', 20),
|
||||
('TAX_RISK_LEVEL', 'high', '높음', 30)
|
||||
ON CONFLICT (code_group, code_value) DO UPDATE
|
||||
SET code_name = EXCLUDED.code_name,
|
||||
sort_order = EXCLUDED.sort_order,
|
||||
is_active = TRUE;
|
||||
|
||||
-- Normalize storage keys and migrate existing rows.
|
||||
UPDATE common_codes
|
||||
SET code_value = CASE
|
||||
WHEN code_group = 'CLIENT_SERVICE_TYPE' AND code_value = '증여·상속' THEN '증여상속'
|
||||
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '홈페이지 문의' THEN '홈페이지문의'
|
||||
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '직접 방문' THEN '직접방문'
|
||||
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '카카오 채널' THEN '카카오채널'
|
||||
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '개인 기장대리' THEN '개인기장대리'
|
||||
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '법인 기장대리' THEN '법인기장대리'
|
||||
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '기장 수수료' THEN '기장수수료'
|
||||
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '신고 대행료' THEN '신고대행료'
|
||||
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '자문 수수료' THEN '자문수수료'
|
||||
WHEN code_group = 'FILING_TYPE' AND code_value = '상속·증여세' THEN '상속증여세'
|
||||
ELSE code_value
|
||||
END,
|
||||
code_name = CASE
|
||||
WHEN code_group = 'CLIENT_SERVICE_TYPE' AND code_value = '증여·상속' THEN '증여·상속'
|
||||
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '홈페이지 문의' THEN '홈페이지 문의'
|
||||
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '직접 방문' THEN '직접 방문'
|
||||
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '카카오 채널' THEN '카카오 채널'
|
||||
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '개인 기장대리' THEN '개인 기장대리'
|
||||
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '법인 기장대리' THEN '법인 기장대리'
|
||||
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '기장 수수료' THEN '기장 수수료'
|
||||
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '신고 대행료' THEN '신고 대행료'
|
||||
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '자문 수수료' THEN '자문 수수료'
|
||||
WHEN code_group = 'FILING_TYPE' AND code_value = '상속·증여세' THEN '상속·증여세'
|
||||
ELSE code_name
|
||||
END
|
||||
WHERE (code_group, code_value) IN (
|
||||
('CLIENT_SERVICE_TYPE', '증여·상속'),
|
||||
('CLIENT_SOURCE', '홈페이지 문의'),
|
||||
('CLIENT_SOURCE', '직접 방문'),
|
||||
('CLIENT_SOURCE', '카카오 채널'),
|
||||
('CONTRACT_SERVICE_TYPE', '개인 기장대리'),
|
||||
('CONTRACT_SERVICE_TYPE', '법인 기장대리'),
|
||||
('REVENUE_SERVICE_TYPE', '기장 수수료'),
|
||||
('REVENUE_SERVICE_TYPE', '신고 대행료'),
|
||||
('REVENUE_SERVICE_TYPE', '자문 수수료'),
|
||||
('FILING_TYPE', '상속·증여세')
|
||||
);
|
||||
|
||||
UPDATE clients
|
||||
SET
|
||||
service_type = CASE WHEN service_type = '증여·상속' THEN '증여상속' ELSE service_type END,
|
||||
source = CASE
|
||||
WHEN source = '홈페이지 문의' THEN '홈페이지문의'
|
||||
WHEN source = '직접 방문' THEN '직접방문'
|
||||
WHEN source = '카카오 채널' THEN '카카오채널'
|
||||
ELSE source
|
||||
END;
|
||||
|
||||
UPDATE contracts
|
||||
SET service_type = REPLACE(REPLACE(service_type, ' ', ''), '·', '')
|
||||
WHERE service_type IS NOT NULL;
|
||||
|
||||
UPDATE revenue_tracking
|
||||
SET service_type = REPLACE(REPLACE(service_type, ' ', ''), '·', '')
|
||||
WHERE service_type IS NOT NULL;
|
||||
|
||||
UPDATE tax_filings
|
||||
SET filing_type = '상속증여세'
|
||||
WHERE filing_type = '상속·증여세';
|
||||
|
||||
UPDATE tax_filing_schedules
|
||||
SET filing_type = '상속증여세'
|
||||
WHERE filing_type = '상속·증여세';
|
||||
@@ -0,0 +1,22 @@
|
||||
-- Allow Korean code values and future growth without truncation risk.
|
||||
ALTER TABLE common_codes
|
||||
ALTER COLUMN code_group TYPE VARCHAR(80),
|
||||
ALTER COLUMN code_value TYPE VARCHAR(120),
|
||||
ALTER COLUMN code_name TYPE VARCHAR(200);
|
||||
|
||||
ALTER TABLE clients
|
||||
ALTER COLUMN service_type TYPE VARCHAR(100),
|
||||
ALTER COLUMN tax_type TYPE VARCHAR(60),
|
||||
ALTER COLUMN source TYPE VARCHAR(100);
|
||||
|
||||
ALTER TABLE contracts
|
||||
ALTER COLUMN service_type TYPE VARCHAR(120);
|
||||
|
||||
ALTER TABLE revenue_tracking
|
||||
ALTER COLUMN service_type TYPE VARCHAR(120);
|
||||
|
||||
ALTER TABLE tax_filings
|
||||
ALTER COLUMN filing_type TYPE VARCHAR(120);
|
||||
|
||||
ALTER TABLE tax_filing_schedules
|
||||
ALTER COLUMN filing_type TYPE VARCHAR(120);
|
||||
Reference in New Issue
Block a user