# 기타



# 바코드 프린트 사용방법

> ## 바코드 라이브러리 적용방법

1\. 라라벨 패키지 정보

- name: milon/barcode
- version: v10.0.1
- <div>url: [https://github.com/milon/barcode.git](https://github.com/milon/barcode.git)</div>
- php: ^7.3 ~ ^8.0

<div id="bkmrk-%22dns1d%22%3A-%22milon%5C%5Cbar"><div>"DNS1D": "Milon\\Barcode\\Facades\\DNS1DFacade",</div><div> "DNS2D": "Milon\\Barcode\\Facades\\DNS2DFacade"</div></div>1. 바코드 print 사용방법

controller : db에서 데이터 불러옴 -&gt;

view : 불러온 데이터를 가져와서 DNS1D 클래스를 통해 바코드와 연동

padding, margin 등을 적용하여 바코드의 출력위치를 지정

# 크리스탈 레포트 사용방법

**MacOS에서 크리스탈 레포트 사용 및 윈도우 서버 접근 방법**

### **1. 크리스탈 레포트 개요**

크리스탈 레포트(Crystal Reports)는 데이터를 자동으로 가져와 **PDF, Excel, Word 등의 보고서를 생성 및 배포**하는 역할을 합니다 일반적으로 **기업용 ERP, 회계 시스템, CRM 등과 연동**하여 사용되며, 이러한 이유로 **윈도우 서버 환경에서 운영**됩니다

### **2. MacOS에서 윈도우 서버 접근 방법**

MacOS에서 윈도우 서버에서 실행 중인 크리스탈 레포트에 접근하려면 **원격 데스크톱 연결**을 사용해야 합니다

#### **2.1 Microsoft 원격 데스크톱 앱 설치**

MacOS에서는 RDP(Remote Desktop Protocol) 파일을 실행하여 원격 서버에 접속할 수 있으며, 이를 위해 **Microsoft의 원격 데스크톱 앱**이 필요합니다

- **앱 다운로드 경로:**  
    [Microsoft Remote Desktop (App Store) ](https://apps.apple.com/kr/app/windows-app/id1295203466?mt=12)

####  **2.2 원격 데스크톱 연결 방법**

1. **Microsoft Remote Desktop 앱을 실행**합니다.
2. **'Import from RDP File'** 또는 \*\*'새 연결 추가'\*\*를 선택합니다.
3. 제공받은 **RDP 파일을 불러오거나 수동으로 서버 정보를 입력**합니다.
4. **Username(사용자명)과 Password(비밀번호)를 입력하여 로그인**합니다.
5. 원격 데스크톱을 통해 **윈도우 서버에 접속**하면 크리스탈 레포트를 사용할 수 있습니다.

[![스크린샷 2025-02-14 오전 11.19.35.png](https://manual.dabory.com/uploads/images/gallery/2025-02/scaled-1680-/ajF2025-02-14-11-19-35.png)](https://manual.dabory.com/uploads/images/gallery/2025-02/ajF2025-02-14-11-19-35.png)

<div id="bkmrk--1">---

</div>### **3. 크리스탈 레포트 실행** 

다음은 윈도우 서버 접속 후 `.rpt` 파일을 열어 크리스탈 리포트에서 보고서를 편집할 때, 자주 사용하는 기능들 입니다

[![스크린샷(19).png](https://manual.dabory.com/uploads/images/gallery/2025-02/scaled-1680-/19.png)](https://manual.dabory.com/uploads/images/gallery/2025-02/19.png)

#### 🔹 **1. 텍스트 상자 (Text Box)**

📌 **역할:**

- 고정된 텍스트(라벨)를 추가할 때 사용합니다
- 예: `"사업자등록번호"`, `"전화번호"`, `"고객명"` 같은 문구

#### 🔹 **2. 라인(Line) 생성 도구**

📌 **역할:**

- 보고서에서 표(테이블)와 같은 구조를 만들 때 가로, 세로 선(Line)을 추가하는 기능입니다
- 예: 표의 구분선을 추가하여 가독성을 높일 때 사용합니다

#### 🔹 **3. DB 필드 (Database Fields) - 동적 데이터 바인딩**

📌 **역할:**

- DB에서 가져온 데이터를 자동으로 보고서에 반영하는 역할입니다
- 예: `{c1}` → `"사업자등록번호"`, `{c2}` → `"전화번호"` 등의 값을 동적으로 불러옴

### **4. 크리스탈 리포트에서 합계 자동 정렬 방법**

📌 **목표: ex) 연말정산에서 데이터 한줄 한줄 추가 될때 합계가 맨 아래에 위치하는 방법**

- **DB에서 불러온 데이터(Details)가 동적으로 추가될 때, 맨 아래의 "합계"가 자동으로 내려가도록 설정**
- **Header, Details, Footer에서 같은 변수 이름을 사용할 때, `position` 값을 이용해 구분**
- **`Section Expert`의 `Suppress` 기능을 활용하여 필요한 섹션만 표시되도록 설정**

---

### **1. 동적 로우 추가 시 Footer(합계) 자동 위치 조정**

📌 **원리:**

- **Details(바디)에서 데이터가 많아질수록 Report Footer(합계) 섹션이 자동으로 아래로 내려감**
- **Report Footer를 사용**

[![스크린샷(20).png](https://manual.dabory.com/uploads/images/gallery/2025-02/scaled-1680-/20.png)](https://manual.dabory.com/uploads/images/gallery/2025-02/20.png)

📌 **설정 방법:**  
1️⃣ **"Section Expert"에서 Report Footer 설정 조정**

- Report Footer를 우클릭 → `"Section Expert"` 클릭
- `"Print at Bottom of Page"` **체크 해제!**
- `"Keep Together"` **체크!** (이렇게 하면 데이터와 합계가 붙어서 나옴)

2️⃣ **Suppress 조건 추가하여 Report Footer가 마지막에만 나오도록 설정**

- Report Footer 섹션에서 `"Suppress"` 옆의 `X-2` 클릭
- 아래 조건을 입력 <div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"><div class="sticky top-9 md:top-[5.75rem]">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`NOT ONLASTRECORD`</div></div>
- **이렇게 하면 마지막 행에서만 "합계"가 표시됨!**

📌 **예상 결과:**

<table data-end="927" data-start="639" id="bkmrk-no-%EB%B0%A9%EB%AC%B8%EC%9D%BC-%ED%98%84%EA%B8%88-%EC%B9%B4%EB%93%9C-%EC%99%B8%EC%83%81%EA%B8%88%EC%95%A1-%ED%95%A9%EA%B3%84"><thead data-end="673" data-start="639"><tr data-end="673" data-start="639"><th data-end="644" data-start="639">No</th><th data-end="650" data-start="644">방문일</th><th data-end="655" data-start="650">현금</th><th data-end="660" data-start="655">카드</th><th data-end="667" data-start="660">외상금액</th><th data-end="673" data-start="667">합계</th></tr></thead><tbody data-end="927" data-start="712"><tr data-end="762" data-start="712"><td>1</td><td>2024-11-10</td><td>10,000</td><td>50,000</td><td>0</td><td>60,000</td></tr><tr data-end="812" data-start="763"><td>2</td><td>2024-11-11</td><td>5,000</td><td>40,000</td><td>0</td><td>45,000</td></tr><tr data-end="862" data-start="813"><td>3</td><td>2024-11-12</td><td>8,000</td><td>35,000</td><td>0</td><td>43,000</td></tr><tr data-end="927" data-start="863"><td> </td><td>**합계**</td><td>**23,000**</td><td>**125,000**</td><td>0</td><td>**148,000**</td></tr></tbody></table>

✔ **데이터가 많아질수록 합계가 자동으로 맨 아래로 정렬됨**

####  

#### **<span data-end="54" data-start="6">5. </span>크리스탈 리포트에서 Database Fields를 연동하여 데이터 치환하는 방법**

📌 **목표:**  
➡ **오른쪽 `Database Fields`에서 불러온 데이터를 원하는 위치에 배치하여 동적으로 치환하기**

---

#### **1. `Database Fields`에서 필요한 데이터 가져오기**

📌 **설정 방법:**  
1️⃣ **오른쪽 `Field Explorer` 창에서 `"Database Fields"` 선택**  
2️⃣ **필요한 데이터 필드를 찾음** (예: `{c1}`, `{c2}`, `{c3}` 등)  
3️⃣ **각 필드를 드래그하여 보고서(Report) 디자인의 적절한 위치에 배치**

---

#### **2. 데이터 필드를 Header, Details, Footer에 적절히 배치하기**

📌 **배치 방법:**  
✔ **Header(헤더) 섹션:**

- `{position} = "head-foot"` 데이터를 사용하여 회사명, 고객정보 등 배치  
    ✔ **Details(바디) 섹션:**
- `{position} = "body"` 데이터를 사용하여 반복되는 상세 데이터 배치  
    ✔ **Footer(합계) 섹션:**
- `{position} = "head-foot"` 데이터를 사용하여 총합 표시

---

#### **3. 예제: Database Fields 배치하기**

#### 📝 **Report 디자인에서 데이터 배치 예시**

<table data-end="1120" data-start="760" id="bkmrk-%EC%9C%84%EC%B9%98-database-fields-%28"><thead data-end="794" data-start="760"><tr data-end="794" data-start="760"><th data-end="765" data-start="760">위치</th><th data-end="788" data-start="765">Database Fields (예제)</th><th data-end="794" data-start="788">설명</th></tr></thead><tbody data-end="1120" data-start="830"><tr data-end="870" data-start="830"><td>Header</td><td>`{c1}` (사업자번호)</td><td>보고서 상단에 고정</td></tr><tr data-end="910" data-start="871"><td>Header</td><td>`{c2}` (전화번호)</td><td>보고서 상단에 고정</td></tr><tr data-end="953" data-start="911"><td>Details</td><td>`{c3}` (방문일)</td><td>데이터가 동적으로 반복됨</td></tr><tr data-end="995" data-start="954"><td>Details</td><td>`{c4}` (현금)</td><td>데이터가 동적으로 반복됨</td></tr><tr data-end="1037" data-start="996"><td>Details</td><td>`{c5}` (카드)</td><td>데이터가 동적으로 반복됨</td></tr><tr data-end="1079" data-start="1038"><td>Details</td><td>`{c6}` (합계)</td><td>데이터가 동적으로 반복됨</td></tr><tr data-end="1120" data-start="1080"><td>Footer</td><td>`{c7}` (총합계)</td><td>마지막 행 아래에 위치</td></tr></tbody></table>

✔ **이제 데이터가 동적으로 추가될 때, 각 위치에 맞는 값이 자동으로 채워짐**  
✔ **합계도 마지막 행 아래에 자동으로 정렬됨**

---

##  

# 프론트에서 크리스탈레포트 연동방법

> ## Crystal Report + Front 연동방법

1\. 아래와 같이 이미 작업된 양식의 rpt파일이 존재한다면 해당 rpt파일에서 필요한 필드들을 확인합니다.

[![image.png](https://manual.dabory.com/uploads/images/gallery/2025-02/scaled-1680-/K2Kimage.png)](https://manual.dabory.com/uploads/images/gallery/2025-02/K2Kimage.png)

1-1 위와 같이 작성된 rpt 파일이 존재하지 않는다면 C:\\ReCrystallizeServer\\Reports\\standard 경로로 이동후 필요한 양식과 가장 흡사한 양식을 찾아 복사해줍니다.

2\. 확인한 필드를 토대로 쿼리를 작성합니다.

```sql
-- opticalpos::federated/crystal/adjustment/subqry/insert1.sql

SELECT
    UNIX_TIMESTAMP() as created_on,
    2 as list_token,
    'head-foot' as position,
    -- 발행매장
    tax_no as c1,             -- 사업자등록번호
    tel_no as c2,             -- 전화번호
    branch_name as c3,        -- 상호명
    branch_manager as c4,     -- 대표자
    -- 고객정보
    company_no as c5,         -- 고객번호
    company_name as c6,       -- 고객명


    0 as d1,  -- dummy
    0 as d2,  -- dummy
    0 as d3,  -- dummy
    0 as d4,  -- dummy
    0 as d5,  -- dummy
    0 as d6,  -- dummy
    0 as d7,  -- dummy
    0 as d8,  -- dummy
    0 as d9,  -- dummy
    0 as d10  -- dummy


from dbr_company as mx
inner join dbr_sorder on mx.id = dbr_sorder.buyer_id
inner join dbr_branch on dbr_sorder.branch_id = dbr_branch.id


-- @where
group by mx.id
-- @order



-- opticalpos::federated/crystal/adjustment/subqry/insert2.sql

SELECT
    UNIX_TIMESTAMP() as created_on,
	2 as list_token,
	'body' as position,
	sorder_date as c1,                      -- 주문일자
    ccard_amt as c2,                        -- 카드 사용금액
    cash_amt as c3,                         -- 현금 사용금액
    coupon_amt as c4,                       -- 쿠폰 사용금액
    reward_use_amt as c5,                   -- 적립금 사용금액
    discount_amt as c6,                     -- 할인금 사용금액
    sum(sorder_sum) - ccard_amt - cash_amt - coupon_amt - reward_use_amt as c7, -- 외상 금액
    sum(ccard_amt) as c8,                   -- 해당일의 총 카드 사용금액
    sum(cash_amt) as c9,                    -- 해당일의 총 현금 사용금액
    sum(sorder_sum) as c10,                  -- 해당일의 총 사용금액
    sum(sum(sorder_sum)) OVER () as c11,     -- 해당고객의 토탈 사용금액
	0 as d1,  -- dummy
    0 as d2,  -- dummy
    0 as d3,  -- dummy
    0 as d4,  -- dummy
    0 as d5,  -- dummy
    0 as d6,  -- dummy
    0 as d7,  -- dummy
    0 as d8,  -- dummy
    0 as d9,  -- dummy
    0 as d10  -- dummy

from
	dbr_sorder
	inner join
		( select
	    buyer_id, dbr_company.id as id
    from
	    dbr_company
	    inner join dbr_sorder on dbr_company.id = dbr_sorder.buyer_id
    group by buyer_id
	 ) as mx
	on mx.buyer_id = dbr_sorder.buyer_id

inner join dbr_sorder_bd on dbr_sorder.id = dbr_sorder_bd.sorder_id

-- @where
group by sorder_no
-- HAVING SUM(sorder_sum) - ccard_amt - cash_amt - coupon_amt - reward_use_amt <> SUM(sorder_sum)
-- @order

```

<div id="bkmrk-list-token-%3A-positio"><div>list-token :</div><div>position : rpt 파일에서 사용할 데이터필드의 섹션을 명시합니다.</div><div>c1 ~ c6 : head-foot section에 치환될 데이터들을 차례대로 작성합니다.</div><div>d1~d10 : 필요하다면 d1~d10까지 사용하여 데이터 필드를 채워줍니다.</div></div><div id="bkmrk--2">  
</div><div id="bkmrk--3">  
</div><div id="bkmrk-3.-crystal-report%EB%A5%BC-%EC%82%AC">3. crystal report를 사용하는 메뉴의 파라메터에 PrintVars를 추가합니다.  
</div><div id="bkmrk--4">  
</div>```json
"PrintVars": {
        "QueryName": "opticalpos::federated/crystal/adjustment",
        "ReportPath": "standard/adjustment/adjustment.rpt",
        "ExportFmt": "PDF",
        "ServerPrinter": "",
        "CustomCode": "adjustment"
    },
```

QueryName : 위에서 작성했던 query를 입력해줍니다.

ReportPath : winodw server에서 rpt 파일을 저장했던 위치입니다.

ExportFmt : 레포트 출력시 파일의 형식입니다.

ServerPrinter : ""

CustomCode : 해당 커스텀을 구분할 수 있는 code입니다.

4\. env(설정파일)에 REPORT\_SERVER\_URL 변수를 확인합니다.