
duson-print-rules
by songyoungsoo
construct
SKILL.md
name: duson-print-rules description: 두손기획 인쇄 시스템의 비즈니스 규칙. 수량 표기, 가격 계산, 제품별 단위, 규격/옵션 표기 등 프로젝트 전반에 적용되는 규칙을 정의합니다. 두손기획 프로젝트 작업 시 항상 이 규칙을 따라야 합니다. Keywords: 두손기획, 수량, 연, 매수, 단위, 전단지, 명함, 가격, 주문, 규격, 옵션
두손기획 인쇄 시스템 비즈니스 규칙
[핵심 규칙 1] 수량 표기
규칙 1-1: 전단지/리플렛 수량 표기
형식: X연 (Y매) 또는 X연 (Y,YYY매)
| 연수 | 매수 (A4 기준) | 표기 예시 |
|---|---|---|
| 0.5연 | 2,000매 | "0.5연 (2,000매)" |
| 1연 | 4,000매 | "1연 (4,000매)" |
| 2연 | 8,000매 | "2연 (8,000매)" |
핵심 원칙:
- 0.5연만 소수점 표시, 나머지는 정수 (전 품목 통틀어 0.5연만 소수점 사용)
- 매수는 천 단위 콤마 표시
- 매수는 계산하지 않고 DB에서 가져옴 (quantityTwo 또는 mesu 필드)
includes/quantity_formatter.php사용 권장:// [O] 권장 - 공통 함수 사용 include "includes/quantity_formatter.php"; echo formatQuantity($quantity, 'inserted'); // "0.5연" 또는 "1연" echo formatQuantityValue($quantity, 'inserted'); // "0.5" 또는 "1" (단위 제외) // [O] 직접 구현 시 - 0.5만 소수점 처리 $display = ($quantity == 0.5) ? '0.5' : number_format(intval($quantity));
규칙 1-2: 전단지/리플렛 외 제품 수량 표기
형식: 정수 + 단위
| 제품 | 단위 | 표기 예시 |
|---|---|---|
| 명함 | 매 | "500매", "1,000매" |
| 봉투 | 매 | "500매", "1,000매" |
| 스티커 | 매 | "1,000매", "3,000매" |
| 자석스티커 | 매 | "500매" |
| 상품권 | 매 | "1,000매" |
| 포스터 | 매 | "100매", "500매" |
| 카다록 | 부 | "500부", "1,000부" |
| 양식지 | 매/권 | "500매", "10권" |
핵심 원칙:
- 수량은 항상 정수 (소수점 없음)
number_format(intval($quantity))사용- 단위는 DB의
unit필드에서 가져옴
[핵심 규칙 2] 규격/옵션 표기
규칙 2-1: 표기 형식 (2줄 슬래시 방식)
형식: 2줄로 압축 표기, 각 항목은 /로 구분
[1줄: 규격] 종류 / 용지 / 규격 등
[2줄: 옵션] 인쇄면 / 수량 / 디자인 등
핵심 원칙:
- 라벨 없이 값만 표시 (종류: X → X)
- 각 항목은
/(공백-슬래시-공백)로 구분 - 빈 값은 제외
- 추가옵션(코팅, 접지 등)이 있으면 별도 행으로 표시
규칙 2-2: 품목별 2줄 구성
| 품목 | 1줄 (규격) | 2줄 (옵션) |
|---|---|---|
| 전단지(리플렛) | 종류 / 용지 / 규격 | 인쇄면 / 수량 / 디자인 |
| 명함 | 종류 / 용지 / 규격 | 인쇄면 / 수량 / 디자인 |
| 봉투 | 종류 / 규격 | 수량 / 디자인 |
| 스티커 | 종류 / 용지 / 규격 | 인쇄면 / 수량 / 디자인 |
| 자석스티커 | 종류 / 용지 / 규격 | 수량 / 디자인 |
| 상품권 | 종류 / 용지 | 수량 / 인쇄면 / 디자인 |
| 포스터 | 종류 / 용지 / 규격 | 인쇄면 / 수량 / 디자인 |
| 카다록 | 종류 / 용지 / 규격 | 인쇄면 / 수량 / 디자인 |
| 양식지 | 종류 / 용지 / 규격 | 수량 / 인쇄도수 |
| / 디자인 |
규칙 2-3: 품목별 추가옵션
| 품목 | 추가옵션 | 추가옵션 종류 |
|---|---|---|
| 전단지(리플렛) | O | 코팅(150g 이상만), 접지, 오시 |
| 명함 | O | 박, 넘버링, 미싱, 귀돌이, 오시 |
| 봉투 | O | 테이프 |
| 스티커 | O | 도무송 |
| 자석스티커 | X | - |
| 상품권 | O | 박, 넘버링, 미싱, 귀돌이, 오시 (명함과 동일) |
| 포스터 | O | 코팅, 접지 |
| 카다록 | O | 제본방식, 코팅 |
| 양식지 | X | - |
규칙 2-4: 표기 예시
전단지 예시:
90g아트지(합판인쇄) / A4 (210x297mm)
단면컬러인쇄 / 1연 (4,000매)
[추가옵션: 유광코팅]
명함 예시:
스노우화이트 250g / 90x50mm
양면컬러인쇄 / 500매 / 인쇄의뢰
[추가옵션: 귀돌이]
봉투 예시:
대봉투 / A4
1,000매 / 디자인+인쇄
포스터 예시:
포스터 A2 / 150g스노우지
단면컬러인쇄 / 100매
[추가옵션: 유광코팅]
카다록 예시:
카다록 A4 / 150g아트지 / 16페이지
양면컬러인쇄 / 500부
[추가옵션: 무선제본, 유광코팅]
규칙 2-5: ProductSpecFormatter 클래스 (권장)
파일: /includes/ProductSpecFormatter.php
// 사용법
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/ProductSpecFormatter.php';
// 인스턴스 생성 (DB 연결 필수)
$formatter = new ProductSpecFormatter($db);
// HTML 포맷 (2줄 <br> 형식)
echo $formatter->formatHtml($item);
// 출력: "종류 / 용지 / 규격<br>인쇄면 / 수량 / 디자인"
// 텍스트 포맷 (2줄 | 구분)
echo $formatter->formatText($item);
// 출력: "종류 / 용지 / 규격 | 인쇄면 / 수량 / 디자인"
// 한 줄 포맷
echo $formatter->formatSingleLine($item);
// 출력: "종류 / 용지 / 규격 / 인쇄면 / 수량"
헬퍼 메서드 (static):
// 제품 타입 한글명
ProductSpecFormatter::getProductTypeName('inserted'); // "전단지"
// 단위
ProductSpecFormatter::getUnit($item); // "연", "매", "부", "권"
// 수량 (숫자)
ProductSpecFormatter::getQuantity($item); // 0.5, 1000
// 수량 표시
ProductSpecFormatter::getQuantityDisplay($item); // "0.5연 (2,000매)", "1,000매"
// 가격 (VAT 포함)
ProductSpecFormatter::getPrice($item); // 156200
// 공급가액 (VAT 미포함)
ProductSpecFormatter::getSupplyPrice($item); // 142000
규칙 2-6: 적용 위치
- 장바구니 상품 목록 (
cart.php) - 주문 페이지 상품 정보 (
OnlineOrder_unified.php) - 주문 완료 페이지 상세 (
OrderComplete_universal.php) - 관리자 주문서 (
OrderFormOrderTree.php) - 주문서 출력 (
OrderFormPrint.php) - 이메일 본문 (
ProcessOrder_unified.php) - 견적서 상품 설명 (
quote/edit.php,quote/revise.php) - 마이페이지 주문내역 (
mypage/orders.php,mypage/order_detail.php)
[핵심 규칙 3] 이모지 사용 금지
모든 출력에서 이모지 사용 금지
// [X] 잘못된 표기
echo "✅ 주문이 완료되었습니다";
echo "📦 배송 준비중";
echo "🎉 감사합니다";
// [O] 올바른 표기
echo "주문이 완료되었습니다";
echo "배송 준비중";
echo "감사합니다";
적용 범위:
- 고객 화면 (장바구니, 주문, 주문완료)
- 관리자 화면
- 이메일 발송 본문
- 견적서/PDF
- 에러 메시지
- 시스템 알림
[수량 표기 적용 위치]
1. 장바구니 (cart.php)
파일: mlangprintauto/shop/cart.php
위치: 라인 556-574 (상품 목록 테이블)
// 전단지/리플렛
echo $yeon_display . '연 (' . number_format($mesu) . '매)';
// 기타 제품
echo number_format(intval($quantity)) . $unit;
2. 주문 페이지 (OnlineOrder_unified.php)
파일: mlangorder_printauto/OnlineOrder_unified.php
위치: 주문 상품 목록 섹션
// 전단지/리플렛: "0.5연 (2,000매)"
// 기타 제품: "500매"
3. 주문 완료 페이지
파일들:
mlangorder_printauto/OrderComplete_universal.phpmlangorder_printauto/OrderComplete_unified.php위치: 주문 상세 정보 섹션
// Type_1 JSON에서 MY_amount, mesu 추출
$my_amount = $json_data['MY_amount'] ?? $order['MY_amount'];
$mesu = $json_data['mesu'] ?? $order['mesu'];
4. 관리자 주문 상세 (OrderFormOrderTree.php)
파일: mlangorder_printauto/OrderFormOrderTree.php
위치: 라인 1059-1076 (수량/단위 컬럼)
// 전단지/리플렛: 수량 칸에 "X연 (Y매)" 통합, 단위 칸은 '-'
// 기타 제품: 수량/단위 분리 표시
5. 관리자 목록 (admin.php)
파일: admin/mlangprintauto/admin.php
위치: 주문 목록 테이블
// OrderView 모드에서 수량 표시
6. 이메일 발송
파일들:
mlangorder_printauto/ProcessOrder_unified.php(주문 확인 메일)- 기타 메일 발송 스크립트
// 메일 본문에 수량 표기 시 동일한 규칙 적용
7. 견적서 시스템
파일들:
mlangprintauto/quote/detail.php(관리자 상세)mlangprintauto/quote/public/view.php(고객용 공개)mlangprintauto/quote/api/generate_pdf.php(PDF 생성)mlangprintauto/quote/revise.php(견적 수정)mlangprintauto/quote/create.php(견적 생성)
// 전단지: "0.5연 (2,000매)" 한 줄 형식
// 기타: "500매" 정수 형식
[구현 패턴]
공통 함수 파일 사용 (권장)
파일: includes/quantity_formatter.php
// 파일 include
include "includes/quantity_formatter.php";
// 수량 + 단위 표시 (자동 단위 판단)
echo formatQuantity($quantity, $product_type);
// 전단지: "0.5연" 또는 "1연"
// 명함: "500매"
// 카다록: "500부"
// 수량만 표시 (단위 제외)
echo formatQuantityValue($quantity, $product_type);
// "0.5" 또는 "1" 또는 "500"
// 단위 지정
echo formatQuantity($quantity, $product_type, '권');
// "10권"
핵심 로직 (0.5만 소수점)
/**
* 수량 포맷팅 - 간소화 버전
* 0.5만 소수점 표시, 나머지는 정수
*/
function formatQuantity($quantity, $product_type = '', $unit = null) {
$qty = floatval($quantity);
// 단위 자동 판단
if ($unit === null) {
$unit = in_array($product_type, ['inserted', 'leaflet']) ? '연' : '매';
}
// 0.5만 소수점, 나머지 정수
if ($qty == 0.5) {
return '0.5' . $unit;
}
return number_format(intval($qty), 0) . $unit;
}
전단지 연 + 매수 통합 표시
/**
* 전단지: "0.5연 (2,000매)" 형식
*/
function formatFlyerWithMesu($yeon, $mesu) {
// 연수: 0.5만 소수점
$yeon_display = ($yeon == 0.5) ? '0.5' : number_format(intval($yeon));
// 매수: 천 단위 콤마
$mesu_display = number_format(intval($mesu));
return $yeon_display . '연 (' . $mesu_display . '매)';
}
[제품별 단위 매핑]
| product_type | 제품명 | unit 값 | 비고 |
|---|---|---|---|
| inserted | 전단지 | 연 | 매수는 별도 표시 |
| leaflet | 리플렛 | 연 | 매수는 별도 표시 |
| namecard | 명함 | 매 | 정수만 |
| envelope | 봉투 | 매 | 정수만 |
| sticker | 스티커 | 매 | 정수만 |
| msticker | 자석스티커 | 매 | 정수만 |
| merchandisebond | 상품권 | 매 | 정수만 |
| littleprint | 포스터 | 매 | 정수만 |
| cadarok | 카다록 | 부 | 정수만 |
| ncrflambeau | 양식지 | 매/권 | 정수만 |
[주의사항]
1. 전단지 코팅 옵션 제한
// 전단지(리플렛) 150g 미만 용지는 코팅 옵션 비활성화
// [X] 80g, 90g, 100g, 120g -> 코팅 선택 불가
// [O] 150g, 180g, 200g 이상 -> 코팅 선택 가능
if ($paper_weight < 150) {
// 코팅 체크박스 disabled 처리
echo '<input type="checkbox" disabled> 코팅';
} else {
echo '<input type="checkbox" name="coating"> 코팅';
}
2. 매수(mesu)는 계산하지 않음
// [X] 잘못된 방식 - 직접 계산
$mesu = $yeon * 4000; // 절대 금지!
// [O] 올바른 방식 - DB에서 가져옴
$mesu = $item['mesu']; // shop_temp.mesu
$mesu = $json_data['quantityTwo']; // Type_1 JSON
$mesu = $order['mesu']; // mlangorder_printauto.mesu
3. 전단지 0.5연 number_format() 주의
// 전단지만 0.5연이 있음 (다른 제품은 모두 정수)
// [X] 0.5가 1로 반올림됨
number_format(0.5) // 결과: "1"
// [O] 전단지 연수 표시 시 소수점 처리 필수
number_format(0.5, 1) // 결과: "0.5"
4. 데이터 흐름
[1] add_to_basket.php: MY_amountRight에서 mesu 추출 -> shop_temp.mesu 저장
[2] cart.php: shop_temp.mesu 읽어서 표시
[3] ProcessOrder_unified.php: mesu -> Type_1.quantityTwo로 복사
[4] OrderComplete*.php: Type_1 JSON에서 추출하여 표시
[5] OrderFormOrderTree.php: Type_1 JSON에서 추출하여 표시
[6] 견적서: sourceData['mesu'] 사용
5. 카다록 필드 매핑 (2025-12-29 수정)
// [X] 잘못된 필드 매핑 (버그)
$section_name = getCategoryName($connect, $item['PN_type']); // PN_type은 비어있음!
$style_name = getCategoryName($connect, $item['MY_Fsd']); // MY_Fsd도 비어있음!
// [O] 올바른 필드 매핑
$section_name = getCategoryName($connect, $item['Section']); // Section 필드 사용
// 카다록 shop_temp 필드 매핑:
// - MY_type: 종류 (예: 691 = "카다록,리플렛")
// - Section: 규격 (예: 692 = "24절(127*260)3단")
// - PN_type: 용지 (대부분 비어있음)
// - MY_Fsd: 미사용
// - POtype: 인쇄면 (1=단면, 2=양면)
관련 파일: mlangorder_printauto/ProcessOrder_unified.php (cadarok case)
6. 자석스티커 필드 매핑 (2025-12-30 수정)
// [X] 잘못된 필드 매핑 (버그)
$size_name = getCategoryName($connect, $item['PN_type']); // PN_type은 비어있음!
// [O] 올바른 필드 매핑
$section_name = getCategoryName($connect, $item['Section']); // Section 필드 사용
// 자석스티커 shop_temp 필드 매핑:
// - MY_type: 종류 (예: 742 = "자석스티커(종이자석)")
// - Section: 규격 (예: 743 = "90x50mm")
// - POtype: 인쇄면 (1=단면, 2=양면)
// - PN_type: 미사용
// - MY_amount: 수량
관련 파일: mlangorder_printauto/ProcessOrder_unified.php (msticker case)
7. 스티커 가로/세로 입력 필수 (2025-12-31 추가)
스티커는 사용자가 직접 가로/세로 크기를 입력해야 하는 유일한 제품입니다.
// 스티커는 고정 규격이 아닌 사용자 입력 방식
// - 가로(garo): 밀리미터 단위
// - 세로(sero): 밀리미터 단위
// 빈 값으로 주문 시도 시 경고창 표시 필수
검증 로직 (mlangprintauto/sticker_new/index.php):
function openUploadModal() {
// 가로/세로 입력 검증
const garoInput = document.getElementById('garo');
const seroInput = document.getElementById('sero');
const garo = parseInt(garoInput?.value) || 0;
const sero = parseInt(seroInput?.value) || 0;
if (garo <= 0 || sero <= 0) {
alert('가로와 세로 크기를 입력해주세요.');
if (garo <= 0 && garoInput) {
garoInput.focus();
} else if (sero <= 0 && seroInput) {
seroInput.focus();
}
return;
}
// ... 이후 파일 업로드 모달 열기
}
동작:
- "파일 업로드 및 주문하기" 버튼 클릭 시 검증 실행
- 가로 또는 세로가 0이거나 비어있으면 경고창 표시
- 비어있는 첫 번째 입력 필드로 자동 포커스 이동
관련 파일: mlangprintauto/sticker_new/index.php (openUploadModal 함수)
8. 스티커 Type_1 JSON 데이터 구조 (2026-01-13 추가)
스티커 주문의 Type_1 JSON은 두 가지 구조가 존재합니다:
레거시 구조 (중첩) - 과거 주문:
{
"product_type": "sticker",
"order_details": {
"jong": "jil 아트유광코팅",
"garo": 90,
"sero": 50,
"mesu": 1000,
"domusong": "정보없음",
"uhyung": 0
},
"formatted_display": "재질: jil 아트유광코팅\n크기: 90mm × 50mm..."
}
신규 구조 (flat) - 2026-01-13 이후 주문:
{
"product_type": "sticker",
"spec_type": "사각",
"spec_material": "아트유광코팅",
"spec_size": "90mm x 50mm",
"spec_design": "인쇄만",
"quantity_display": "1,000매",
"jong": "jil 아트유광코팅",
"garo": "90",
"sero": "50",
"mesu": "1000",
"domusong": "사각",
"data_version": 2
}
코드에서 처리 방법:
// order_details 중첩 구조 자동 풀기
if (isset($json_data['order_details']) && is_array($json_data['order_details'])) {
$json_data = array_merge($json_data, $json_data['order_details']);
}
// 이후 flat 구조로 접근 가능
$jong = $json_data['jong']; // "jil 아트유광코팅"
$garo = $json_data['garo']; // 90
$sero = $json_data['sero']; // 50
$mesu = $json_data['mesu']; // 1000
스티커 필드 매핑:
| 레거시 필드 | 표준 필드 | 설명 | 예시 |
|---|---|---|---|
| jong | spec_material | 재질 | "jil 아트유광코팅" → "아트유광코팅" |
| garo + sero | spec_size | 크기 | "90mm x 50mm" |
| domusong | spec_type | 모양 | "00000 사각" → "사각" |
| mesu | quantity_value | 수량 | 1000 |
| ordertype | spec_design | 디자인 | "print" → "인쇄만" |
관련 파일:
includes/ProductSpecFormatter.php- format(), formatSticker()mlangorder_printauto/OrderFormOrderTree.php- getOrderItemInfo()mlangorder_printauto/ProcessOrder_unified.php- Type_1 JSON 생성
[검증 체크리스트]
수량 표기 관련 코드 수정 시 다음을 확인:
- 전단지/리플렛은 "X연 (Y매)" 형식인가?
- 기타 제품은 정수 + 단위 형식인가?
- number_format() 소수점 처리가 올바른가?
- mesu는 DB에서 가져오고 있는가? (계산 아님)
- 규격/옵션이 2줄 슬래시 형식으로 표기되는가? (종류/용지 | 인쇄면/수량)
- 이모지가 사용되지 않았는가?
- 모든 적용 위치에서 일관된 형식인가?
- 장바구니
- 주문 페이지
- 주문 완료 페이지
- 관리자 페이지
- 이메일
- 견적서
[핵심 규칙 5] 마이페이지 레이아웃 표준
규칙 5-1: 컨테이너 및 콘텐츠 너비
| 요소 | 너비 | 적용 |
|---|---|---|
.mypage-container | max-width: 1200px | 전체 컨테이너 |
.mypage-content | max-width: 900px | 메인 콘텐츠 영역 |
| 사이드바 | 250px | grid-template-columns: 250px 1fr |
규칙 5-2: 페이지네이션 표준
형식: « ‹ ... (±5 range) ... › »
.pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 2px;
margin-top: 15px;
flex-wrap: nowrap;
}
.pagination a, .pagination span {
min-width: 26px;
height: 26px;
padding: 0 6px;
border-radius: 3px;
font-size: 12px;
}
페이지 정보 표시: "X / Y 페이지" (font-size: 12px, color: #888)
규칙 5-3: 적용 대상 파일
| 파일 | 설명 |
|---|---|
/mypage/index.php | 마이페이지 메인 |
/mypage/orders.php | 주문 내역 |
/mypage/transactions.php | 거래내역조회 |
/mypage/profile.php | 회원정보 |
/mypage/change_password.php | 비밀번호변경 |
/mypage/withdraw.php | 회원탈퇴 |
/mypage/business_certificate.php | 사업자등록증 |
/mypage/tax_invoices.php | 세금계산서 |
[관련 문서]
- CLAUDE.md - 프로젝트 전체 규칙
- CLAUDE_DOCS/03_PRODUCTS/FLYER_QUANTITY_SYSTEM.md - 전단지 연/매수 상세
- 업로드다운로드251118.md - 파일 업로드 시스템
/includes/ProductSpecFormatter.php- 규격/옵션 포맷터 클래스 (중앙 집중)
Last Updated: 2025-12-31 적용 범위: 두손기획 인쇄 시스템 전체
スコア
総合スコア
リポジトリの品質指標に基づく評価
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
レビュー
レビュー機能は近日公開予定です