@yolo-croket-dev/entity-v2 0.3.16 → 0.3.17-sj

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md ADDED
@@ -0,0 +1,50 @@
1
+ # ENTITY-V2 KNOWLEDGE BASE
2
+
3
+ ## OVERVIEW
4
+
5
+ Mongo 영속 모델과 서비스 contract가 공유하는 최신 entity interface 중심 패키지다. 신규 entity의 우선 위치지만 legacy `entity`와 양방향 호환 import가 남아 있어 일괄 분리하지 않는다.
6
+
7
+ ## STRUCTURE
8
+
9
+ ```text
10
+ entity-v2/
11
+ ├── index.ts # 약 80개 domain public export
12
+ ├── <domain>/index.ts
13
+ ├── <domain>/*.entity.ts
14
+ └── <domain>.modules/ # 세부 bounded context
15
+ ```
16
+
17
+ 대형 호환 surface는 `store-item/store-item.entity.ts`, `purchased-info/purchased-info.entity.ts`; 수정 전 `@deprecated` 필드와 legacy import를 먼저 확인한다.
18
+
19
+ ## WHERE TO LOOK
20
+
21
+ | 작업 | 위치 | 확인 |
22
+ |---|---|---|
23
+ | 신규 Mongo entity | `<domain>/*.entity.ts` | 실제 schema field/type/nullability |
24
+ | Public export | `<domain>/index.ts`, root `index.ts` | named/type export 호환성 |
25
+ | Legacy 결합 | `packages/entity`, v2의 legacy imports | 양방향 dependency 확대 여부 |
26
+ | 대형 commerce 모델 | `store-item`, `purchased-info`, `refund`, `cart` | deprecated 대체 필드 |
27
+
28
+ ## CONVENTIONS
29
+
30
+ - 실제 DB 문서를 표현하는 서비스의 Mongoose `@Schema` class는 이 패키지의 대응 interface를 `implements`해야 한다.
31
+ - `_id`, `ObjectId|string`, optional, `null`, array element type을 실제 저장 shape와 정확히 맞춘다.
32
+ - 신규 domain은 local `index.ts`와 root barrel을 함께 갱신하되 기존 namespace/named export를 깨지 않는다.
33
+ - 기존 v2→legacy import는 호환성 경계로 취급한다. 신규 reverse dependency는 소비 영향 근거 없이 추가하지 않는다.
34
+ - 제거 예정 필드는 `@deprecated`와 대체 필드 설명을 유지한다.
35
+
36
+ ## ANTI-PATTERNS
37
+
38
+ - DTO/response 전용 임시 shape를 영속 entity로 추가하지 않는다.
39
+ - Deprecated 필드를 신규 feature의 정식 모델로 사용하지 않는다.
40
+ - Legacy field를 소비자와 migration 확인 없이 삭제하거나 type을 축소하지 않는다.
41
+ - `dist`, `.d.ts`, 생성 JS를 source 대신 수정하지 않는다.
42
+
43
+ ## VERIFY
44
+
45
+ ```bash
46
+ yarn workspace @yolo-croket-dev/entity-v2 build
47
+ yarn workspace @yolo-croket-dev/entity-v2 lint
48
+ ```
49
+
50
+ Entity 변경은 `entity`, `dto-v2`, AMQP contract와 실제 Mongoose schema 소비 서비스까지 의존 순서대로 검증한다.
@@ -19,6 +19,11 @@ export interface PInfoOfBundle {
19
19
  itemType?: StoreItemTypeEnum;
20
20
  /** 분할 배송 여부 (PurchasedInfo.isSplitDelivery의 비정규화 필드, BundlePInfo Atlas Search 필터용) */
21
21
  isSplitDelivery?: boolean;
22
+ /** 셀러 이관 거래 모아보기용 비정규화 여부 */
23
+ isTransferred?: boolean;
24
+ /** 셀러 이관 거래 우선 정렬·노출용 최신 이관 일시 */
25
+ latestTransferDate?: Date;
26
+ transferPriority?: 0 | 1;
22
27
  }
23
28
  export interface PastIsPrepay {
24
29
  PInfoId: Types.ObjectId;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yolo-croket-dev/entity-v2",
3
- "version": "0.3.16",
3
+ "version": "0.3.17-sj",
4
4
  "main": "index.js",
5
5
  "author": "Yolo Co., Ltd.",
6
6
  "description": "크로켓 nest 용 entity-v3",
@@ -23,4 +23,4 @@
23
23
  },
24
24
  "license": "UNLICENSED",
25
25
  "dependencies": {}
26
- }
26
+ }
@@ -1,6 +1,6 @@
1
1
  import { Types } from 'mongoose';
2
- import { PurchasedInfoEntity } from '@yolo-croket-dev/entity/src/purchased-info/purchased-info.entity';
3
2
  import { StoreItemKeyword } from '@yolo-croket-dev/entity/src/store-item';
3
+ import { PurchasedInfoEntity } from './purchased-info.entity';
4
4
  import { CustomPurchasedInfo } from './custom-purchased-info.entity';
5
5
  import { StoreItemTypeEnum } from '../store-item/store-item.entity';
6
6
  import { UserEntity } from '../user/user.entity';
@@ -12,13 +12,15 @@ export default interface PurchasedInfoForSeller {
12
12
  }
13
13
  export type RefundInfoPickedForSeller = Pick<RefundEntity, '_id' | 'reg_date' | 'acceptInfo' | 'process' | '_authorType' | 'openInfo' | 'refundVersion' | 'returnInfo' | 'rejectInfo' | 'PInfoLastProcess'>;
14
14
  export type UserInfoPickedForSeller = Pick<UserEntity, '_id' | 'username' | 'phoneCountry' | 'phoneNumber' | 'photos' | 'subContactList'>;
15
- export type PInfoPickedForSeller = Pick<PurchasedInfoEntity, '_id' | 'publicId' | 'process' | 'pOptionInfo' | 'proceedsInfo' | 'itemId' | 'pastName' | 'pastImg' | 'pastPrice' | 'deliveryMethod' | 'deliveryData' | 'paymentDate' | 'pastSellingInfo' | 'PCCCInfo' | 'cancelInfo' | 'requirement' | 'originPrice' | 'buyerInfo' | 'lastPartialRefundProcess' | 'lastPartialRefundId' | 'waitingReceiveInfo' | 'cancelledDate' | 'process_v2' | 'isPOptionChanged' | 'pInfoType' | 'isSplitDelivery' | 'splitDeliveryDataList' | 'remainingShipQuantity'> & {
15
+ export type PInfoPickedForSeller = Pick<PurchasedInfoEntity, '_id' | 'publicId' | 'process' | 'pOptionInfo' | 'proceedsInfo' | 'itemId' | 'pastName' | 'pastImg' | 'pastPrice' | 'deliveryMethod' | 'deliveryData' | 'paymentDate' | 'pastSellingInfo' | 'PCCCInfo' | 'cancelInfo' | 'requirement' | 'originPrice' | 'buyerInfo' | 'lastPartialRefundProcess' | 'lastPartialRefundId' | 'waitingReceiveInfo' | 'cancelledDate' | 'process_v2' | 'isPOptionChanged' | 'pInfoType' | 'isSplitDelivery' | 'splitDeliveryDataList' | 'remainingShipQuantity' | 'refundWaitingInfo' | 'transferSellerInfo'> & {
16
16
  /** 주문 당시 상품 키워드 스냅샷 */
17
17
  itemKeywords?: StoreItemKeyword[];
18
18
  isPcccDeferred?: boolean;
19
19
  isReceiveInfoChangedInBeforeDelivery?: boolean;
20
20
  /** 구매 당시 상품 타입 */
21
21
  itemType?: StoreItemTypeEnum;
22
+ /** 목록 응답에서는 용량이 큰 이관 이력을 제외하고 최신 이관 정보만 제공한다. */
23
+ transferSellerInfo?: Omit<NonNullable<PurchasedInfoEntity['transferSellerInfo']>, 'history'>;
22
24
  };
23
25
  export type PurchasedInfoForSellerDetail = {
24
26
  pInfo: PInfoPickedForSeller;
@@ -81,6 +81,91 @@ export declare enum PurchasedProcessV2Enum {
81
81
  /** 예약 취소 요청으로 취소됨 */
82
82
  cancelledByReserveCancelAsk = "cancelledByReserveCancelAsk"
83
83
  }
84
+ /** @description 셀러 귀책 환불 대기 워크플로 상태 */
85
+ export declare enum RefundWaitingStatusEnum {
86
+ /** 구매자 응답 또는 관리자 이관 판단 대기. 3일 자동 환불 대상 */
87
+ PENDING = "PENDING",
88
+ /** 구매자가 타 셀러 이관을 기다리기로 선택한 상태 */
89
+ WAITING_FOR_ITEM = "WAITING_FOR_ITEM",
90
+ /** 관리자 이관 불가 확정 후 실제 환불을 시작하기 전 상태 */
91
+ UNAVAILABLE = "UNAVAILABLE",
92
+ /** 이관 성공으로 환불 대기 워크플로가 종료된 상태 */
93
+ TRANSFERRED = "TRANSFERRED",
94
+ /** 실제 Refund 생성 작업을 선점한 내부 상태 */
95
+ REFUND_REQUESTED = "REFUND_REQUESTED"
96
+ }
97
+ /** @description 셀러 귀책 환불 대기 사유 코드 */
98
+ export declare enum RefundWaitingReasonCode {
99
+ /** 셀러의 현지 품절로 대체 셀러 이관 또는 환불 판단이 필요한 경우 */
100
+ SOLD_OUT = "SOLD_OUT",
101
+ /** 셀러의 현지 가격 또는 재고 변동으로 기존 주문 이행이 어려운 경우 */
102
+ PRICE_OR_STOCK_CHANGED = "PRICE_OR_STOCK_CHANGED",
103
+ /** 셀러 귀책 배송 지연으로 구매자 선택이 필요한 경우 */
104
+ DELIVERY_DELAY = "DELIVERY_DELAY"
105
+ }
106
+ /** @description 구매자의 환불 대기 선택 */
107
+ export declare enum RefundWaitingBuyerActionTypeEnum {
108
+ /** 구매자가 환불 대신 관리자에게 다른 셀러 이관을 요청함 */
109
+ WAIT_FOR_ITEM = "WAIT_FOR_ITEM",
110
+ /** 구매자가 대기 중단 후 기존 환불 절차 진행을 선택함 */
111
+ REQUEST_REFUND = "REQUEST_REFUND"
112
+ }
113
+ /** @description 셀러 귀책 환불 대기 정보 */
114
+ export interface RefundWaitingInfo {
115
+ /** 환불 대기 워크플로 상태 */
116
+ status: RefundWaitingStatusEnum;
117
+ /** 환불 대기로 전환한 시각. SLA와 대기 리드타임의 기준점이다. */
118
+ startDate: Date;
119
+ /** 자동 환불 대상 시각. 진입 시점에 startDate + 3일을 확정 저장해 정책 변경의 영향을 받지 않는다. */
120
+ autoRefundDueDate: Date;
121
+ /** 셀러 귀책 사유의 코드와 당시 구매자 화면에 노출한 문구 스냅샷 */
122
+ refundReason: {
123
+ /** 분기, 통계, 정책 적용에 사용하는 정규화된 사유 코드 */
124
+ code: RefundWaitingReasonCode;
125
+ /** 사유 코드의 당시 표시명. 사유 마스터 변경 후에도 이력을 보존한다. */
126
+ name: string;
127
+ /** 구매자/셀러가 입력한 보조 사유. 입력이 있을 때만 저장한다. */
128
+ detail?: string;
129
+ };
130
+ /** 환불 대기 진입을 유발한 셀러 ID. 이후 이관되더라도 최초 귀책 셀러를 추적한다. */
131
+ requestedSellerId: Types.ObjectId | string;
132
+ /** 구매자가 마지막으로 환불 대기 관련 액션을 선택한 시각 */
133
+ buyerActionDate?: Date;
134
+ /** 구매자의 마지막 액션. WAIT_FOR_ITEM 또는 REQUEST_REFUND만 저장한다. */
135
+ buyerActionType?: RefundWaitingBuyerActionTypeEnum;
136
+ /** 실제 환불 생성을 선점하기 전의 상태. 실패 시 재시도 가능한 상태로 복구하는 데 사용한다. */
137
+ refundRequestPreviousStatus?: RefundWaitingStatusEnum;
138
+ /** 구매자가 실제 환불 생성을 마지막으로 시도한 시각 */
139
+ refundRequestAttemptedDate?: Date;
140
+ /** 구매자 환불 생성 시도 횟수 */
141
+ refundRequestAttemptCount?: number;
142
+ /** 마지막 구매자 환불 생성 실패의 운영 분류 코드 */
143
+ refundRequestLastErrorCode?: string;
144
+ /** 관리자가 이관 불가를 확정한 시각. UNAVAILABLE 상태의 감사 이력이다. */
145
+ unavailableDate?: Date;
146
+ /** 이관 불가 처리를 수행한 관리자 ID */
147
+ unavailableManagerId?: Types.ObjectId | string;
148
+ /** 이관 불가 후 환불 생성을 마지막으로 시도한 시각 */
149
+ unavailableRefundAttemptedDate?: Date;
150
+ /** 이관 불가 후 환불 생성 시도 횟수 */
151
+ unavailableRefundAttemptCount?: number;
152
+ /** 마지막 이관 불가 환불 생성 실패 코드 */
153
+ unavailableRefundLastErrorCode?: string;
154
+ /** 스케줄러가 자동 환불 작업을 마지막으로 선점한 시각. 중복 실행 방지에 사용한다. */
155
+ autoRefundAttemptedDate?: Date;
156
+ /** 자동 환불 실행 시도 횟수. 재시도 한도와 운영 모니터링에 사용한다. */
157
+ autoRefundAttemptCount?: number;
158
+ /** 마지막 자동 환불 실패 코드. 원문 오류 대신 운영 분류용 코드만 저장한다. */
159
+ autoRefundLastErrorCode?: string;
160
+ /** 구매자 응답 만기 전 알림 발송 작업을 선점한 시각 */
161
+ buyerResponseReminderClaimedDate?: Date;
162
+ /** 구매자 응답 만기 전 알림 발송 완료 시각 */
163
+ buyerResponseReminderSentDate?: Date;
164
+ /** 구매자 응답 만기 전 알림 발송 시도 횟수 */
165
+ buyerResponseReminderAttemptCount?: number;
166
+ /** 마지막 구매자 응답 만기 전 알림 발송 실패 코드 */
167
+ buyerResponseReminderLastErrorCode?: string;
168
+ }
84
169
  export interface PastSellingInfoShippingTermsInfo {
85
170
  /** 조건 배송 종류 <shippingFeeBySection, > */
86
171
  shippingTermsType: string;
@@ -1248,12 +1333,17 @@ export default interface PurchasedInfoEntity {
1248
1333
  priceCompareAffiliateInfo?: PriceCompareAffiliateInfo;
1249
1334
  pInfoType?: PInfoTypeEnum;
1250
1335
  reservationInfo?: PurchasedReservationInfo;
1336
+ /** @description 셀러 귀책 환불 대기 워크플로 정보 */
1337
+ refundWaitingInfo?: RefundWaitingInfo;
1251
1338
  /** @description 셀러 변경 이력 (관리자 셀러 이전 기능) */
1252
1339
  transferSellerInfo?: {
1253
1340
  /** 셀러 변경 여부 (DB 필터링용) */
1254
1341
  isTransferred: boolean;
1255
1342
  /** 셀러 변경 횟수 */
1256
1343
  transferCount: number;
1344
+ /** 셀러 거래내역 목록 정렬·노출을 위한 가장 최근 이관 완료 시각 */
1345
+ latestTransferDate?: Date;
1346
+ transferPriority?: 0 | 1;
1257
1347
  /** 변경 이력 목록 */
1258
1348
  history: Array<{
1259
1349
  transferDate: Date;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PriceCompareAffiliateSettleStatusEnum = exports.PriceCompareAffiliateTypeEnum = exports.InsuranceProcessTypeEnum = exports.ShippingForwarderProviderEnum = exports.CrawlerProxyOrderForeignCurrencyEnum = exports.CrawlerProxyForwardingStatusEnum = exports.CrawlerProxyPurchaseStatusEnum = exports.PastSelectionFrameDataInfo = exports.PurchasedProcessV2Enum = exports.PurchasedProcessEnum = exports.UserTypeEnum = exports.TaxInvoiceIssueProcessEnum = exports.POptionTypeEnum = exports.PInfoTypeEnum = exports.ReservationCancelReasonEnum = exports.CardQuotaEnum = void 0;
3
+ exports.PriceCompareAffiliateSettleStatusEnum = exports.PriceCompareAffiliateTypeEnum = exports.InsuranceProcessTypeEnum = exports.ShippingForwarderProviderEnum = exports.CrawlerProxyOrderForeignCurrencyEnum = exports.CrawlerProxyForwardingStatusEnum = exports.CrawlerProxyPurchaseStatusEnum = exports.PastSelectionFrameDataInfo = exports.RefundWaitingBuyerActionTypeEnum = exports.RefundWaitingReasonCode = exports.RefundWaitingStatusEnum = exports.PurchasedProcessV2Enum = exports.PurchasedProcessEnum = exports.UserTypeEnum = exports.TaxInvoiceIssueProcessEnum = exports.POptionTypeEnum = exports.PInfoTypeEnum = exports.ReservationCancelReasonEnum = exports.CardQuotaEnum = void 0;
4
4
  var CardQuotaEnum;
5
5
  (function (CardQuotaEnum) {
6
6
  CardQuotaEnum["\uC77C\uC2DC\uBD88"] = "00";
@@ -82,6 +82,38 @@ var PurchasedProcessV2Enum;
82
82
  /** 예약 취소 요청으로 취소됨 */
83
83
  PurchasedProcessV2Enum["cancelledByReserveCancelAsk"] = "cancelledByReserveCancelAsk";
84
84
  })(PurchasedProcessV2Enum || (exports.PurchasedProcessV2Enum = PurchasedProcessV2Enum = {}));
85
+ /** @description 셀러 귀책 환불 대기 워크플로 상태 */
86
+ var RefundWaitingStatusEnum;
87
+ (function (RefundWaitingStatusEnum) {
88
+ /** 구매자 응답 또는 관리자 이관 판단 대기. 3일 자동 환불 대상 */
89
+ RefundWaitingStatusEnum["PENDING"] = "PENDING";
90
+ /** 구매자가 타 셀러 이관을 기다리기로 선택한 상태 */
91
+ RefundWaitingStatusEnum["WAITING_FOR_ITEM"] = "WAITING_FOR_ITEM";
92
+ /** 관리자 이관 불가 확정 후 실제 환불을 시작하기 전 상태 */
93
+ RefundWaitingStatusEnum["UNAVAILABLE"] = "UNAVAILABLE";
94
+ /** 이관 성공으로 환불 대기 워크플로가 종료된 상태 */
95
+ RefundWaitingStatusEnum["TRANSFERRED"] = "TRANSFERRED";
96
+ /** 실제 Refund 생성 작업을 선점한 내부 상태 */
97
+ RefundWaitingStatusEnum["REFUND_REQUESTED"] = "REFUND_REQUESTED";
98
+ })(RefundWaitingStatusEnum || (exports.RefundWaitingStatusEnum = RefundWaitingStatusEnum = {}));
99
+ /** @description 셀러 귀책 환불 대기 사유 코드 */
100
+ var RefundWaitingReasonCode;
101
+ (function (RefundWaitingReasonCode) {
102
+ /** 셀러의 현지 품절로 대체 셀러 이관 또는 환불 판단이 필요한 경우 */
103
+ RefundWaitingReasonCode["SOLD_OUT"] = "SOLD_OUT";
104
+ /** 셀러의 현지 가격 또는 재고 변동으로 기존 주문 이행이 어려운 경우 */
105
+ RefundWaitingReasonCode["PRICE_OR_STOCK_CHANGED"] = "PRICE_OR_STOCK_CHANGED";
106
+ /** 셀러 귀책 배송 지연으로 구매자 선택이 필요한 경우 */
107
+ RefundWaitingReasonCode["DELIVERY_DELAY"] = "DELIVERY_DELAY";
108
+ })(RefundWaitingReasonCode || (exports.RefundWaitingReasonCode = RefundWaitingReasonCode = {}));
109
+ /** @description 구매자의 환불 대기 선택 */
110
+ var RefundWaitingBuyerActionTypeEnum;
111
+ (function (RefundWaitingBuyerActionTypeEnum) {
112
+ /** 구매자가 환불 대신 관리자에게 다른 셀러 이관을 요청함 */
113
+ RefundWaitingBuyerActionTypeEnum["WAIT_FOR_ITEM"] = "WAIT_FOR_ITEM";
114
+ /** 구매자가 대기 중단 후 기존 환불 절차 진행을 선택함 */
115
+ RefundWaitingBuyerActionTypeEnum["REQUEST_REFUND"] = "REQUEST_REFUND";
116
+ })(RefundWaitingBuyerActionTypeEnum || (exports.RefundWaitingBuyerActionTypeEnum = RefundWaitingBuyerActionTypeEnum = {}));
85
117
  // 당시 셀렉션 프레임 데이터 정보
86
118
  class PastSelectionFrameDataInfo {
87
119
  }