duson-print-rules

songyoungsoo's avatarfrom songyoungsoo

두손기획 인쇄 시스템의 비즈니스 규칙. 수량 표기, 가격 계산, 제품별 단위, 규격/옵션 표기 등 프로젝트 전반에 적용되는 규칙을 정의합니다. 두손기획 프로젝트 작업 시 항상 이 규칙을 따라야 합니다. Keywords: 두손기획, 수량, 연, 매수, 단위, 전단지, 명함, 가격, 주문, 규격, 옵션

0stars🔀0forks📁View on GitHub🕐Updated Jan 10, 2026

When & Why to Use This Skill

This Claude skill serves as a comprehensive business logic and technical standard guide for the Duson Print management system. It defines precise rules for printing quantity notations, product-specific units, and UI display formats to ensure consistency across the entire order lifecycle, from shopping carts to administrative reports and PDF quotes.

Use Cases

  • Standardizing complex printing quantity displays (e.g., converting 'Yeon' to 'Mesu') across web interfaces to ensure customer clarity and order accuracy.
  • Implementing product-specific business logic, such as automatically restricting coating options based on paper weight (e.g., 150g threshold) during the ordering process.
  • Enforcing system-wide UI/UX consistency by applying standardized multi-line specification formats and prohibiting emoji usage in professional business communications and documents.
  • Providing developers with reusable PHP code patterns and database mapping rules for consistent data handling in cart, order, and quote modules.
nameduson-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매)"
1.5연 6,000매 "1.5연 (6,000매)"
2연 8,000매 "2연 (8,000매)"

핵심 원칙:

  • 연수는 소수점 허용 (0.5, 1.5 등)
  • 매수는 천 단위 콤마 표시
  • 매수는 계산하지 않고 DB에서 가져옴 (quantityTwo 또는 mesu 필드)
  • number_format() 사용 시 정수/소수 구분 필수:
    // [O] 올바른 코드
    floor($quantity) == $quantity
        ? number_format($quantity)      // 정수: 1 -> "1"
        : number_format($quantity, 1)   // 소수: 0.5 -> "0.5"
    
    // [X] 잘못된 코드 - 0.5가 1로 반올림됨
    number_format($quantity)  // 0.5 -> "1"
    

규칙 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줄]
[옵션 1줄] (있는 경우)
[옵션 2줄] (있는 경우)

규칙 2-2: 품목별 옵션 유무

품목 옵션 옵션 종류
전단지(리플렛) O 코팅(150g 이상만), 접지, 오시
명함 O 박, 넘버링, 미싱, 귀돌이, 오시
봉투 O 테이프
스티커 O 도무송
자석스티커 X -
상품권 O 박, 넘버링, 미싱, 귀돌이, 오시 (명함과 동일)
포스터 O 코팅, 접지
카다록 O 제본방식, 코팅
양식지 X -

규칙 2-3: 표기 예시

전단지 예시 (옵션 있음):

90g아트지(합판인쇄)
A4 (210x297mm)
단면컬러인쇄
유광코팅

명함 예시 (옵션 있음):

명함_소량
스노우화이트 250g
양면컬러인쇄
귀돌이

포스터 예시 (옵션 있음):

포스터 A2
150g스노우지
단면컬러인쇄
유광코팅

규칙 2-4: 적용 위치

  • 장바구니 상품 목록
  • 주문 페이지 상품 정보
  • 주문 완료 페이지 상세
  • 관리자 주문서
  • 이메일 본문
  • 견적서 상품 설명

[핵심 규칙 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.php
  • mlangorder_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매" 정수 형식

[구현 패턴]

전단지/리플렛 수량 표시 함수

/**
 * 전단지/리플렛 수량 표시
 * @param float $yeon 연수 (0.5, 1, 1.5 등)
 * @param int $mesu 매수 (DB에서 가져온 값)
 * @return string "0.5연 (2,000매)" 형식
 */
function formatFlyerQuantity($yeon, $mesu) {
    // 연수: 정수/소수 구분
    $yeon_display = floor($yeon) == $yeon
        ? number_format($yeon)
        : number_format($yeon, 1);

    // 매수: 천 단위 콤마
    $mesu_display = number_format(intval($mesu));

    return $yeon_display . '연 (' . $mesu_display . '매)';
}

일반 제품 수량 표시 함수

/**
 * 일반 제품 수량 표시
 * @param int $quantity 수량
 * @param string $unit 단위 (매, 부, 권 등)
 * @return string "500매" 형식
 */
function formatProductQuantity($quantity, $unit) {
    return number_format(intval($quantity)) . $unit;
}

제품별 분기 처리

/**
 * 제품 유형에 따른 수량 표시
 */
function displayQuantity($product_type, $quantity, $unit, $mesu = null) {
    // 전단지/리플렛: 연 + 매수
    if (in_array($product_type, ['inserted', 'leaflet'])) {
        if ($mesu && $mesu > 0) {
            return formatFlyerQuantity($quantity, $mesu);
        }
        // mesu 없으면 연수만 표시
        $yeon_display = floor($quantity) == $quantity
            ? number_format($quantity)
            : number_format($quantity, 1);
        return $yeon_display . '연';
    }

    // 기타 제품: 정수 + 단위
    return formatProductQuantity($quantity, $unit);
}

[제품별 단위 매핑]

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'] 사용

[검증 체크리스트]

수량 표기 관련 코드 수정 시 다음을 확인:

  • 전단지/리플렛은 "X연 (Y매)" 형식인가?
  • 기타 제품은 정수 + 단위 형식인가?
  • number_format() 소수점 처리가 올바른가?
  • mesu는 DB에서 가져오고 있는가? (계산 아님)
  • 규격은 2줄, 옵션은 2줄로 표기되는가?
  • 이모지가 사용되지 않았는가?
  • 모든 적용 위치에서 일관된 형식인가?
    • 장바구니
    • 주문 페이지
    • 주문 완료 페이지
    • 관리자 페이지
    • 이메일
    • 견적서

[관련 문서]

  • CLAUDE.md - 프로젝트 전체 규칙
  • CLAUDE_DOCS/03_PRODUCTS/FLYER_QUANTITY_SYSTEM.md - 전단지 연/매수 상세
  • 업로드다운로드251118.md - 파일 업로드 시스템

Last Updated: 2025-12-29 적용 범위: 두손기획 인쇄 시스템 전체