B 개발자(하지혁) 변경 이력
ha 브랜치 작업 기록. 최종 업데이트: 2026-03-31
인보이스 발행 시 USD 대신 AED(디르함)로 변환. 고정 환율 1 USD = 3.6725 AED.
변경 파일
InvoiceController.cs— AED 체크박스 파라미터 추가, 업체 GUID로 자동 감지MailContentMaker.cs— AED 인보이스 템플릿, 환율 표시, Amount 변환SngDocUploadPanel.razor— UseAed 체크박스 UIOrderList.razor / .razor.cs— AED 바인딩 + GenerateInvoice 파라미터
인보이스 하단 Payment Instructions에 우리은행(기본) 대신 IBK(기업은행) 계좌 표시.
변경 파일
InvoiceController.cs— UseIbkBank 파라미터, 업체 GUID 매칭MailContentMaker.cs— IBK 계좌 정보 (054-160034-56-00011, IBKOKRSEXXX)SngDocUploadPanel.razor— UseIbkBank 체크박스 UI
인쿼리 텍스트를 붙여넣으면 선박명, 항구, 유종, 수량, 가격, 결제조건을 자동 추출하여 바이어/셀러 주문 생성.
신규 파일
InquiryTextParser.cs— 텍스트 파싱 엔진 (Regex 기반)InquiryParseController.cs— Parse/Match/CreateOrders APIDddCalculator.cs— DDD 결제기한 계산 (Nager.Date API + 24시간 캐시 + fallback)
주요 기능
- 유종 자동 인식: VLSFO, HSFO, LSMGO, MGO, MDO + ISO 8217 규격 자동 변환
- 수량: 고정(100MT) / 범위(55~100MT) 지원
- 가격: 단일/복수(/구분) + 추가비용(+500) 지원
- 업체 약칭 매핑: 홍콩이마린, 금진, 동림, 프라임, 로인스, 글로벌오프쇼어, 코모션, 파노코, 옥주, 포우처, 페트라 (11개)
- 에이전트: AGENT NAME 키워드 지원 (MR/MS 제거)
- 테스트: 180+ 유닛/통합 테스트
인보이스 발행 시 선박명을 제거하는 체크박스. "Vessel /Ship To" 라벨과 값 모두 비워짐.
변경 파일
InvoiceController.cs— removeShipName 파라미터, ShipName = "" 처리MailContentMaker.cs— Vessel /Ship To 라벨 조건부 표시, MV 라벨 조건부SngDocUploadPanel.razor— RemoveShipName 체크박스 UI
주문에 ETA(선박 도착 예정일) 필드 추가. ETA/공급예정일/공급확정일 변경 시 지급기한 자동 재계산.
DB 변경
ALTER TABLE OrderInfo ADD Eta datetime NULL
변경 파일 (백엔드)
OrderInfo.cs— Eta 프로퍼티 추가OrderInfoService.cs— GET/PUT 매핑 + 자동 계산 조건 확장EtcService.cs— CalcPayDate에 eta/estSupplyStartDate 파라미터 + 우선순위 로직EtcController.cs— CalcPayDate에 eta/estSupplyStartDate 파라미터ReqModAdminOrder.cs / RespSearchOrderDetailForAdmin.cs— Eta 필드
변경 파일 (프론트)
EditOrder.cs— Eta + PropertyChanged (Eta/EstSupplyStartDate/SupplyCompleteDate)OrderList.razor— ETA DatePicker UIOrderList.razor.cs— Order_PropertyChanged + ReCalcPayDueDate에 eta/estSupplyStartDate
DDD 우선순위
공급확정일 > 공급예정일 > ETA > 공급요청일
주문 수정 시 변경 내역 자동 기록. EF Core ChangeTracker로 모든 필드 변경 자동 감지.
DB 변경
ALTER TABLE OrderInfo ADD ModUserID INT NULLALTER TABLE OrderLog ALTER COLUMN Contents NVARCHAR(MAX)
신규 파일
SeanergyPartnerContext.ChangeTracker.cs— SaveChanges 오버라이드, 변경 자동 감지, 한글 매핑 50+ 필드
변경 파일
OrderInfo.cs / UserAccount.cs— ModUserId + ModUser FKOrderInfoService.cs— EnableChangeTracking/FlushChanges, 주문생성 로그OrderController.cs— Logs 조회 API, 주문생성 로그InvoiceController.cs / ConfirmationMailController.cs / NominationMailController.cs / MailController.cs— 발송 로그OrderList.razor— "변경 이력" 버튼 OnClick + 팝업 모달, 수정자 이름 표시OrderList.razor.cs— ShowOrderLogs, OrderLogItem, IsOpenOrderLogs
추적 항목
상태, ETA, 공급일, 항구, 주문유형, 거래유형, 요청사항, 에이전트, 선사 담당자, 결제유형, 지급기한, 유종 수량/단가, 판매사, 바지선, 출하일, BDR 발행자 + 인보이스/노미네이션/확인서/메일 발송 로그
BDR, 인보이스 등 서류에서 특정 내용을 지워서 수정본 생성. Canvas 기반 브러시/사각형/색상지정 편집.
신규 파일
bdr-editor.js— Canvas 편집기 (브러시/사각형/색상지정/Undo/멀티페이지PDF)ImageEditController.cs— 편집 저장 API (PNG → PDF 변환)
변경 파일
SngDocUploadPanel.razor— 편집 아이콘 추가OrderList.razor / .razor.cs— 편집 모달 UI + 로직 + 파일 자동 로드SalesOrderList.razor.cs— 동일 편집 로직 + 파일 자동 로드index.html— pdf.js CDN + bdr-editor.js 등록
지우기 알고리즘
자동 모드: 주변 배경 픽셀 30개 평균 / 고정색 모드: 사용자 지정 색상. 파일명: 원본E.pdf (중복 시 E2, E3)
외부 시스템에서 인쿼리 텍스트를 API로 전송하면 바이어+셀러 주문 자동 생성. 웹 인쿼리 파싱과 100% 동일한 내부 API 흐름.
신규 파일
ApiKeyAuthAttribute.cs— X-Api-Key 헤더 인증 필터ExternalInquiryController.cs— POST /api/ExternalInquiry/Create
동작 흐름
- Step 1: POST /api/order/OrderForAdmin (바이어 주문 생성)
- Step 2: GET /api/order/OrderForAdmin (생성된 주문 조회)
- Step 3: PUT /api/order/OrderForAdmin (셀러 업체 + 추가비용 + 지급기한 수정)
- Step 4: POST /api/InquiryParse/UpdateSellerPayDueDate (셀러 지급기한)
기술 구현
- SemaphoreSlim(1,1) — 동시 1건 순차 처리 (주문번호 정합성)
- 내부 JWT 토큰 자동 생성 — 서비스 유저로 기존 API 호출
- 환경별 URL 설정 — appsettings.json의 InternalApiUrl
- 선박 미등록 시 자동 생성
DB 변경
ExternalApi테이블에 EXTERNAL_INQUIRY 행 INSERT (API Key + 서비스 유저 GUID)
페이지 초기 로딩 + 주문 상세 열기 속도 개선.
개선 내용
| 항목 | 이전 | 이후 |
|---|---|---|
| 페이지 초기 로딩 | 9개 API 순차 호출 | JWT 먼저 세팅 → 9개 전부 병렬 (Task.WhenAll) |
| 주문 상세 열기 | 유종별 매니저 순차 조회 (fire-and-forget) | Task.WhenAll로 병렬 + await 정상화 |
| 주문 상세 패널 | API 끝날 때까지 대기 후 열림 | 패널 즉시 열림 → 데이터 나중에 채움 |
| 백엔드 AddPay 조회 | N+1 쿼리 (생성자마다 개별 DB 조회) | 1번 일괄 조회 |
변경 파일
OrderList.razor.cs— OnInitializedAsync 병렬화, OpenOrderDetail 패널 즉시 열기, 매니저 병렬 조회SalesOrderList.razor.cs— OnInitializedAsync 병렬화OrderInfoService.cs— AddPay N+1 → 일괄 조회
기존: DB DayOff 테이블 (한국만 28개). 변경: Nager.Date API (100개국 자동 반영 + 24시간 캐시 + fallback).
변경 파일
EtcService.cs— GetDayOffFromOneMonth → DddCalculator.GetHolidaysByCountryCode3 교체DddCalculator.cs— GetHolidaysByCountryCode3 public 메서드 추가
/SeanergyImg/ 정적 파일에 Access-Control-Allow-Origin: * 추가. 편집기에서 PDF/이미지 자동 로드 시 CORS 에러 해결.
변경 파일
Program.cs— StaticFileOptions.OnPrepareResponse에 CORS 헤더
개발/본서버 환경에 따라 자동으로 다른 설정 적용.
변경 파일
appsettings.json— InternalApiUrl: https://api.seanergyp.com (본서버)appsettings.Development.json— InternalApiUrl: http://localhost:5105 (개발) + DB를 DEV DB로 변경Program.cs— AddControllersAsServices() 추가
| 테이블 | 변경 | 관련 기능 |
|---|---|---|
| OrderInfo | ADD Eta datetime NULL | NEW-013 |
| OrderInfo | ADD ModUserID INT NULL | NEW-015 |
| OrderLog | ALTER Contents NVARCHAR(MAX) | NEW-015 |
| ExternalApi | INSERT EXTERNAL_INQUIRY 행 | 외부 API |
자세한 SQL은 배포 가이드를 참고하세요.