Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0b0f493b4f |
@ -1,41 +0,0 @@
|
||||
### 2024-08-23
|
||||
|
||||
#### 약관에 대한 생각
|
||||
|
||||
##### [AM]
|
||||
|
||||
1. PBP-CS는 기본적으로 포트폴리오 기준
|
||||
2. 현재 오픈되어 있는 페이지 <Br>1) HOME <Br>2) Market(마켓) <Br>3) My Asset(내자산) <Br>4) ETC(더보기)
|
||||
3. Market 내부에 [전략 마켓], [포트폴리오 마켓]이 있지만 현재는 [전략 마켓]만 오픈되어 있음 ([포트폴리오 마켓]은 display:none 처리 되어 있음)
|
||||
4. 콴텍의 APP은 전략이 기준임
|
||||
5. 콴텍 APP과 콴텍 PBP-CS의 데이터 구조 및 프로세스는 상품의 기준이 포트폴리오인지 전략인지에 따라 달라진다. 포트폴리오를 기준으로 하면 포트폴리오 관리에 초점을 맞추고, 전략을 기준으로 하면 투자 전략에 따라 데이터 구조와 프로세스가 구성된다.
|
||||
6. 요번 약관 변경에 서도 이 갭에 대한 차이가 나타났다.
|
||||
|
||||
<br><br>
|
||||
|
||||
#### [오후 회의 말할 내용]
|
||||
|
||||
> ----
|
||||
>
|
||||
> ### to 기획
|
||||
>
|
||||
> 1. 현재 PBP-CS는 각 금융사 MTS에 thirdparty로 들어가는 서비스가 맞는지? 아니면 독립적으로도 사용하는 서비스가 되어야 하는지?
|
||||
> 2. MTS의 thirdparty로 접근되는 서비스라면 내가 알고 있는 선에서는 약관 동의 및 절차를 줄이기 위해서 입점한것으로 알고 있다. 입점 이유에 반대되는 프로세스가 되는 것이 아닌지?
|
||||
> 3. 독립적으로 사용하는 서비스가 되어야 한다면 APP과 유사하게 가는게 맞다.
|
||||
> 4. "둘다" 라는 상황이라면 위 2개를 적용하여 분기 처리 하는게 맞다.
|
||||
> 5. 앱의 전략 기준과 다르게 포트폴리오 기준이기 때문에 약관 리스트에서 약관 상세를 들어가면 또 collapse 형식으로 펼침 메뉴가 있다는점. (물론 이것은 상세에 들어갈때 펼침 메뉴가 1개라면 강제로 열어놓게 할 수 있음.)
|
||||
> 6. 로그인 이후 화면에 들어갈때 변경된 약관에 대해서 동의를 재요청 하는 과정이 전략을 기준으로 가야 하는지 아니면 포트폴리오로 가야하는지 이야기 해볼 필요가 있다.
|
||||
>
|
||||
> ---
|
||||
|
||||
> ---
|
||||
>
|
||||
> ### to 컴플
|
||||
>
|
||||
> 1. 약관 내용이 콴텍 앱과 다른 점이 있을것임.
|
||||
> 2. 이 내용은 문서로 이춘선 부장님에게 전달하였고 전달 받았을 것으로 생각됨.
|
||||
> 3. 약관 내용중 하나증권이 요청하여 추가된 부분이 있음.
|
||||
> 4. 위 부분과 콴텍이 제공하는 약관과 차이가 있음 이것을 확인해야 함.
|
||||
> 5. 그리고 현재 PBP-CS에서 지금 보내준 약관을 제공하는게 맞는지. 기존 하나증권이 요청한 부분과 충돌이 나는 부분이 없는지?
|
||||
>
|
||||
> ---
|
@ -1,116 +0,0 @@
|
||||
**투자자산진단**
|
||||
|
||||
진입시 케이스가 2개로 나누어짐
|
||||
|
||||
## 1. 고객ID로 보유종목 조회하는 경우
|
||||
>
|
||||
> 위의 경우는 하나증권의 하나플러스에서 4408 업무코드로 고객의 데이터를 가지고 진입했을때 사용한다. 이의 API는 <br>[GET] `/counsel/asset/hold`를 사용하고 있다.
|
||||
|
||||
```javascript
|
||||
|
||||
//해당 api의 파라미터
|
||||
export interface IAssetListInputParam {
|
||||
customerId?: string;
|
||||
}
|
||||
|
||||
//해당 api의 결과
|
||||
export interface IGetAssetList {
|
||||
customerName: string;
|
||||
stockList: IStockList[];
|
||||
}
|
||||
```
|
||||
|
||||
## 2. ODS 접근 방식으로 보유종목 조회
|
||||
>
|
||||
> 위의 방법은 하나증권 태블릿 업무 단말인 ODS로 진입했을때 사용하는 경우이다.
|
||||
이 방법은 내부에서 /demo 페이지에서 종목코드, 비중을 입력하고 진입하는 경우와 같다.
|
||||
API는 <br> [GET] `/counsel/asset/hold/url`를 사용하고 있다.
|
||||
|
||||
```markdown
|
||||
https://1qdevpb.quantec.co.kr/odsrelay?data={"accesstoken":"123qweeyyyyddsd","corp_uid":"987654321","sccofnstcd":"270","access":"hanaplus","branchno":"0094","gbn":"ra","accountinfo":{"foto":["AAPL","TXN","A396300","A353200","A009410","A040160","A298020"],"rate":["20","15","10","20","10","15","10"]}}
|
||||
```
|
||||
|
||||
url 파라미터에 담아 화면에 진입할때 foto를 해당 api itemCd만을 사용함
|
||||
|
||||
```javascript
|
||||
//해당 api의 파라미터
|
||||
export interface IAssetListOdsParam {
|
||||
itemCd: string;
|
||||
}
|
||||
|
||||
|
||||
// 해당 api의 결과
|
||||
export interface IGetAssetOdsList {
|
||||
customerName: string;
|
||||
stockList: IStockOdsList[];
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
|
||||
{
|
||||
"itemCd": "AAPL,TXN,A396300,A353200,A009410,A040160,A298020"
|
||||
}
|
||||
|
||||
{
|
||||
"customerName": null,
|
||||
"stockList": [
|
||||
{
|
||||
"shortStockCode": "AAPL",
|
||||
"stockName": "애플",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "US0378331005",
|
||||
"inputStockCode": "AAPL"
|
||||
},
|
||||
{
|
||||
"shortStockCode": "TXN",
|
||||
"stockName": "텍사스인스트루먼트",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "US8825081040",
|
||||
"inputStockCode": "TXN"
|
||||
},
|
||||
{
|
||||
"shortStockCode": "396300",
|
||||
"stockName": "세아메카닉스",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "KR7396300006",
|
||||
"inputStockCode": "A396300"
|
||||
},
|
||||
{
|
||||
"shortStockCode": "353200",
|
||||
"stockName": "대덕전자",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "KR7353200009",
|
||||
"inputStockCode": "A353200"
|
||||
},
|
||||
{
|
||||
"shortStockCode": "009410",
|
||||
"stockName": "태영건설",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "KR7009410002",
|
||||
"inputStockCode": "A009410"
|
||||
},
|
||||
{
|
||||
"shortStockCode": "040160",
|
||||
"stockName": "누리플렉스",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "KR7040160004",
|
||||
"inputStockCode": "A040160"
|
||||
},
|
||||
{
|
||||
"shortStockCode": "298020",
|
||||
"stockName": "효성티앤씨",
|
||||
"evaluationAmount": null,
|
||||
"holdingWeight": null,
|
||||
"isinCode": "KR7298020009",
|
||||
"inputStockCode": "A298020"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
@ -1,663 +0,0 @@
|
||||
**PBP-CS 약관 처리**
|
||||
|
||||
24.05 변경약관 정리
|
||||
|
||||
!!! info
|
||||
계좌개설 "로보어드바이저 투자일임계약(비대면) 약관" 변경되고
|
||||
동의 내용은 투자일임계약 약관 동의 + 투자일임계약서 + 성과수수료 동의서
|
||||
약관파일명 : (콴텍투자일임주식회사)+비대면+투자일임계약+약관+개정(시행_20240808)_수정요청사항반영최종(배포용)_240624
|
||||
전자서명 필요하고 필수임.
|
||||
|
||||
!!! info
|
||||
전략투자에 3개 변경 및 추가 사항이 있음
|
||||
|
||||
**1. 로보어드바이저 투자일임계약(비대면) 약관**
|
||||
> 1. 동의 내용은 투자일임계약 약관 동의 + 투자일임계약서 + 성과수수료 동의서
|
||||
> 2. 약관파일명 : (콴텍투자일임주식회사)+비대면+투자일임계약+약관+개정(시행_20240808)_수정요청사항반영최종(배포용)_240624
|
||||
|
||||
> 3. 전자서명 필요하고 필수임 이건 변경 사항임
|
||||
|
||||
|
||||
<br />
|
||||
|
||||
**2. 성과수수료 합의서**
|
||||
> 1. 동의 내용은 성과수수료 합의서
|
||||
|
||||
> 2. 파일명 : 성과수수료 합의서_240624
|
||||
|
||||
> 3. 전자서명 필요하고 필수이며 이건 추가 사항임
|
||||
|
||||
<br />
|
||||
|
||||
**3. 계좌 입·출고 제한 동의서**
|
||||
> 1. 동의 내용은 2개 있음.
|
||||
<br /> 계좌 입출고 제한 동의, 복수의 로보어드바이저 투자 비중 유지 사전 동의
|
||||
|
||||
> 2. 계좌 입고 및 출고 제한 동의서, 복수의 로보어드바이저 투자 비중 유지 사전 동의서_240624
|
||||
|
||||
> 3. 동의여부 필요하고 둘다 필수임 추가 사항임
|
||||
|
||||
!!!
|
||||
**scenario**
|
||||
cs에 로그인해서 들어갔을때 약관에 대해서 조회를 하고
|
||||
약관에 대한 추가동의를 받는다.
|
||||
$$ 왕호's Say : 동의 미동의를 사용자가 바꿀 수 있는가? 지금은 안되니까 안보여준다. $$
|
||||
|
||||
> 1. 로그인해서 들어갔을때의 시점?
|
||||
|
||||
### process1
|
||||
|
||||
1. master로 부터 terms-and-conditions 브랜치 생성
|
||||
2. /login?sccoFntd=270로 접속하여 회원가입
|
||||
3. api오류 `/terms/member` --> 일치하는 약관내역이 없습니다.
|
||||
|
||||
> 엥? 왜 일치하는 약관이 없지???? 뭐지? `/terms/member`는 따로 받는 파라미터가 없다!
|
||||
|
||||
그런데 왜?
|
||||
<kbd><http://localhost:3200/login?ref=/&sccofnstcd=270>
|
||||
간단하게 sccofnstcd 파라미터코드를 잘못알았던 것이었다.
|
||||
</kbd>
|
||||
|
||||
CS 로그인 정보
|
||||
|
||||
```json
|
||||
{
|
||||
"origin": "http://localhost:3200",
|
||||
"op": "reg",
|
||||
"keyid": "3a300e5e28964d26bb669327329ec6c1",
|
||||
"uid": "U2FsdGVkX184/CBWsVk4tA9Z3cVgGt/LKJEKTGjN7TY=",
|
||||
"fp": "a445b86d7eda92af54e050bcc1b9b06a",
|
||||
"alg": "rsa",
|
||||
"pub": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsxSUBdoxZrWEodFSRLZp0hlVYKKkKhmuX/6X5RvLvej1SUetflKP6faNb+h2fHv7q7nX/t04yobRXbkz9jeGEo256VGmG8c1qyumzeXJMsPm+Xia2pur/a1BWP+xsvaOwluKb+PNF1S/pAjyX2lKFh4M5E8l1Onkdj9UglgUjiR1AU/7iUQI2Fh5y//lUO3odsxbU4/GcTR6TEIhLUeUasOUbDQX8Wja4RFMStJb2H7DpOc1hGLjT0BmqiG019WMflmNhax/VYmsSY/UuZhJQ5AYkNLi9t8Rh6MqVtIKj5zyVvcFNS8F8Suj0s4hbSKW5nh6zIv86m9EIFFMERMMRwIDAQAB"
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
keyValue: {"keyid":"3a300e5e28964d26bb669327329ec6c1","alg":"rsa","prikey":{"ciphertext":"XRTu8OASrC1tV1ODSOEB6t8xF9ppvc3c2jeAXl9Z95sosPRBQ2kwAhUj7g2c9ODRDlrZ/lz0xrziwtNHBC5NNaRlAnjgXNgZRauqD6FrzDND94zDnQoiCQJAnhaoSLEs4vu3jcz/Y2XikiBZ+eC21hfn0m+sED1w6+PaSSV49EvKvT1K1fE3MjOZWDHch5qqSj80U0cqQROXULjkr8sVmKVw3+QwTSTbH6sD0MDPiHmzp2vtqGxiLTO8g5LJU3GENJ+yI3FHJHo6Cjy2nVzG6yLZu0VOBEIHq8dsXZFygCwTS1QF0hhdlqhPrWcGXkzFHX6AM4ymk9EZOUgViAm6zWV0Q1Mh2OtKUy5z/pp8md3xiWWOI/U1ZuVASJ9A3nw9BrdZjIizF9R7AhOMrSU5GHdJKRynBssD7gathNZxJqvYz7rbF3aJxfwoOkoSnj0y41ndd7qLZ48SJoF2F68qf7Ub9bQe9yAgQy/OBGluOJockdaurXKPC4pgLWIa57i4/yRbe/4BOEofHjmNbJhacIYHe3P942si2dO3RogAvMe466M+3wl70QIi+IG+1ZKUG7JegkgDIY6PNFE2S+uQ9kl16gZz7XP+fY1hLDgO7Tw7LafB9HvJaimHLB15+w60FOZ4hGvftkzg3Qyc3ptRL/7RYVjv19oSzfMsnG7Co9V/NdFg4QvFpNbzt5S4POTTSAHdqeXSf61XN7ZTekKCDjmwg4B9KLEEPpzuGo4yOfLFFCWfHr+vwV0kml4dYvXhsfNWQUzmBxa9VSFH6gHt+2oUC+GBMDfUrYp3EIW9uZ6fT/Z+hf7NXVc3LX2AAxK+LQ0i7MrWV9rXpu+dtcnCSwIcDv/SGjBp6E3HMUPp+hCP410NXYt6Uy28oFIiEkTJpNhQJL5zZ1bycDzJjbfoKBhEI0fbQF0naZqxSwtsHyApW2o/ghWuj9Z8WgNy/L03qYY4CEd7TgL1ZP4kZ3eZS9jHbgHgKJlt5121Cmc/J/6NhBivWAaYTXCK5zCUAJh6/RHLO4FbDKq6wOmcm7Si62lH+TTbsCv065ytFCAg6CtvoUKILq5gAqUaMAxJjc4VtI07A109BoHndlLqBz5SZr1d0UMXSvT0bvUU+/PBBSheFsfaHXRcYC3i9+36/rpejBF8YxW61ra2eNz8UnjzWUXG2qWY0aHoIgxh2AFvO6wLBjgNnUm9ZvDb6Sytru87h+UPA4p7q7L2dpA3NFETIqMIqyE3RtDhGed1w8JQ2ViLTsY9fpSLMW9DVKmwjryXVlqeZeDLLU0wj9ewrmdR3BRMZ4k7ZBqGCCnzvy5HpHVNamep0y18K4gAGaBrocqxcW5WCcdYMQP5acpriP1H38ejBerP6JZYctQmYp64ValjFnNDh0VITPg25LkqNUw+Cfwa5xaib+etBROL7DvID8yTHb52fYY7q3lwTUEThxWAPqSkaescVCnOkJThyjNcqLVlHIBQz+e2NSl/9lH1KEwZ2lLLK7HwboN2Tn8IPrbaawnSUp/2yaR8/l23+qr9YcU/7AjaOEYIl6Mx/dzee3kBvGoQVrPMtslkmOPfWiSjgSlu7OIvW/fah+5qUh0zpGkPzFlHqm/faKFaGzNio8TBms4I2NmqiG9Vp4EXog6MLg1HDF+QKHWLXYfcqSIx+VS7pzAxzdIly3nfUDoblkLawaP8CZF+hNJwC2WNFLhJZxqokW7RlXYsaO5Ok6swRWCzkW02EeorSYPQ3EdDeMRFcVzKYiktNLX1DFOP6k4JvcR0kp/daIqXIGVKzAwDnTlIYrq7rtSw88gvrhrz62lp6NR7W0GRMz+TNRg8nkfWHa9khxGMBPQPIrfJLMv/ryuExDCnumarOSaFcvLcJRkorU4TvmJakv+1czNia7LiXgC0BtE7YBEQqXILMCt3bWu2g7Dxf2oAVs09HV5cE65j4qCbZqaMMfGnRph3ucIQmQtS6vtHYYjvyPWeDeuCIJpef02pxCHzfUeH4y1+GIufRIi+nMzvqxVuQkcOLB8s15belVvKpS3RcgzX5Ygi59Ntq1hmmSLh37gQdZfKc1yyhPlnkGxOyPMr9SI6BhJTbd2Zqhc2+GPbefrt+jmZ0PR1btzJK1ByvY9bj7cS4Pt8K/B+Mp0hPC5efSJzupb843ctdUbpMKAc87eH0DEP10ypTSUEjs4kzBV0TNP8EIVsQsZMBrUAspvcEhBAJZRa7idFZaSCPikxLD4outcOOnILCxCM8aXQr2ouVgtqZn15wyw3Il2ye/xMALdjeZ+spJvk8jF/UAvPd7iA+UqmcUhhm3VfuhFAqirAzD9PyA==","salt":"twYKNXa3+zCfVq69y7pKRA=="},"fp":"a445b86d7eda92af54e050bcc1b9b06a","multi":"y","type":"pin"}
|
||||
11:27:17.059
|
||||
```
|
||||
|
||||
### process2
|
||||
|
||||
1. 로그인 하고 메인으로 갔을때 API오류... `/account/stats` 외부 통신과의 오류 발생임, '종합계좌대체번호필수 입력' 이건 운영 아니면 오류 나는건 당연함...
|
||||
|
||||
> 개발계와 local에서 오류 안나게 처리 해야할듯.
|
||||
|
||||
### process3
|
||||
|
||||
1. 마켓 > 전략 마켓 > 전략 클릭 > 전략 상세 > 가입하기
|
||||
2. `/account/info` 이것도 하나증권 오류... 대체번호...
|
||||
3. 개발을 위해서 이 부분을 pass 시키는 과정 필요하겠음.
|
||||
4. <kbd>StrategyDetail.tsx</kbd> --> <kbd>InvestProcess.tsx</kbd> --> <kbd>PreInvestTask.tsx</kbd> --> <kbd>SelectBankAccount.tsx</kbd>
|
||||
|
||||
<kbd>PreInvestTask.tsx</kbd> 이곳에서 index값을 기준으로 <kbd>SelectBankAccount.tsx</kbd> or <kbd>DivideInvestAmount.tsx</kbd> 이동함
|
||||
|
||||
index = 1 ---> <kbd>SelectBankAccount.tsx</kbd><br />
|
||||
index = 2 ---> <kbd>DivideInvestAmount.tsx</kbd>
|
||||
|
||||
<kbd>SelectBankAccount.tsx</kbd> 에서 계좌가 없으면
|
||||
|
||||

|
||||
|
||||
위와 같은 화면 나옴...
|
||||
|
||||
5. <kbd>src/sample/sample.ts</kbd> 생성하여 아래와 같은 샘플 정보 만듬
|
||||
|
||||
```javascript
|
||||
export const sampleAccountInfo: IAccountInfo[] = [
|
||||
{
|
||||
userId: 'user123', // required
|
||||
typeDiv: '01', // required account/info API에서 필수값
|
||||
customerId: 'cust12345',
|
||||
sccoFnstCd: '1001', // required account/info API에서 필수값
|
||||
ci: 'ci_value_123456',
|
||||
role: 'admin',
|
||||
sccoFnstName: 'Sample Bank', // required
|
||||
accountNo: '1234567890', // required
|
||||
balance: 100000.5, // required
|
||||
accountTypeCode: '02', // required
|
||||
partner: 1,
|
||||
rate: 2.5,
|
||||
date: '2024-08-20',
|
||||
investableAmount: 5000000000,
|
||||
type: 1,
|
||||
nickName: 'My Investment Account',
|
||||
requestStatus: 'Pending',
|
||||
jntlAmt: '100000',
|
||||
jnAmt: '50000',
|
||||
newjndy: '2024-08-01',
|
||||
cprtyacNo: 'CP123456789',
|
||||
cprtyacNm: 'Counterparty Name',
|
||||
cprtyognNm: 'Counterparty Organization',
|
||||
cnclrsnclsfcdNm: 'Cancellation Reason',
|
||||
tyrpymtAmt: '20000',
|
||||
rmdrAmt: '30000',
|
||||
lmtAmt: '1000000',
|
||||
rmdrlmtAmt: '700000',
|
||||
tllmtAmt: '500000',
|
||||
requestDate: '2024-08-19',
|
||||
joinDvsn: '02',
|
||||
pbUid: 'PB12345',
|
||||
withAgree: 'Y' // 출금이체동의여부 (Y 동의, N 미동의)
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
```
|
||||
|
||||
위의 코드를 <kbd>SelectBankAccount.tsx</kbd>에서
|
||||
|
||||
**원본**
|
||||
|
||||
```javascript
|
||||
const getAccountList = () => {
|
||||
setIsLoading(true);
|
||||
// 마켓에서 넘어온 경우 account 미존재
|
||||
// 파라미터로 넘어온 계좌정보 account가 없으면, API 조회하여 accountInfoList 세팅
|
||||
getAccountInfo({
|
||||
customerId: recoilUserInfo?.userId,
|
||||
sccoFnstCd: companyCode || '',
|
||||
typeDiv: '1'
|
||||
}).then((info) => {
|
||||
setIsLoading(false);
|
||||
if (info.length === undefined) return;
|
||||
setAccountInfoList(info as unknown as IAccountInfo[]);
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
<br><br>
|
||||
|
||||
**변경**
|
||||
|
||||
```javascript
|
||||
const getAccountList = () => {
|
||||
setIsLoading(true);
|
||||
// 마켓에서 넘어온 경우 account 미존재
|
||||
// 파라미터로 넘어온 계좌정보 account가 없으면, API 조회하여 accountInfoList 세팅
|
||||
// 24-08-20 로컬 개발&테스트용 샘플데이터
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
setIsLoading(false);
|
||||
setAccountInfoList(sampleAccountInfo as unknown as IAccountInfo[]);
|
||||
} else {
|
||||
getAccountInfo({
|
||||
customerId: recoilUserInfo?.userId,
|
||||
sccoFnstCd: companyCode || '',
|
||||
typeDiv: '1'
|
||||
}).then((info) => {
|
||||
setIsLoading(false);
|
||||
if (info.length === undefined) return;
|
||||
setAccountInfoList(info as unknown as IAccountInfo[]);
|
||||
});
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
위와 같이 변경함.
|
||||
그러면 이후 프로세스를 통과 시킬 수 있음.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
<br><br><br><br>
|
||||
|
||||
### 위와 같은 정상 프로세스로 나옴
|
||||
|
||||
<br><br>
|
||||
|
||||

|
||||
|
||||
<font color="red">최종적으로 투자 설명서 및 계약서 확인이 가능한 부분까지 나옴
|
||||
</font>
|
||||
|
||||
처음 로그인 시 [내 자산]으로 넘어가는데 위 부분을 처리하기 위해 또! 샘플데이터를 만듬. 위치는 <kbd>sample.ts</kbd>
|
||||
|
||||
```javascript
|
||||
export const IBankAccountSample: IBankAccount = {
|
||||
profitAndLoss: 1500.75,
|
||||
profitAndLossRate: 7.5,
|
||||
investableAmount: 10000.0,
|
||||
recomPortfolioJoinYn: 'Y',
|
||||
accountList: [
|
||||
{
|
||||
accountNo: '1234567890',
|
||||
accountName: 'My Savings Account',
|
||||
sccoFnstCd: 'SC001',
|
||||
securitiesName: 'ABC Securities',
|
||||
accountType: 'Savings',
|
||||
accountTypeNm: 'Savings Account',
|
||||
accountInvestableAmount: 5000.5,
|
||||
accountJoinDate: '2022-01-15',
|
||||
pbId: 'PB1234',
|
||||
withAgree: 'Y',
|
||||
accountJourneyStatus: 'Active'
|
||||
},
|
||||
{
|
||||
accountNo: '0987654321',
|
||||
accountName: 'Investment Account',
|
||||
sccoFnstCd: 'SC002',
|
||||
securitiesName: 'XYZ Securities',
|
||||
accountType: 'Investment',
|
||||
accountTypeNm: 'Investment Account',
|
||||
accountInvestableAmount: 3000.0,
|
||||
accountJoinDate: '2023-03-10',
|
||||
accountJourneyStatus: 'Pending'
|
||||
},
|
||||
{
|
||||
accountNo: '1122334455',
|
||||
accountName: 'Retirement Account',
|
||||
sccoFnstCd: 'SC003',
|
||||
securitiesName: 'QRS Securities',
|
||||
accountType: 'Retirement',
|
||||
accountTypeNm: 'Retirement Account',
|
||||
accountInvestableAmount: 2000.0,
|
||||
accountJoinDate: '2021-07-20',
|
||||
withAgree: 'N',
|
||||
accountJourneyStatus: 'Closed'
|
||||
}
|
||||
]
|
||||
};
|
||||
```
|
||||
|
||||
위의 샘플데이터를 <kbd>useBankAccount.ts</kbd>에 넣음
|
||||
코드는 아래와 같음
|
||||
|
||||
변경전
|
||||
|
||||
```javascript
|
||||
|
||||
const getList = useCallback(() => {
|
||||
if (userInfo) {
|
||||
getAccountList({
|
||||
customerId: userInfo.userId, // ! 이거 나중에 recoil로 빼서 와주세요.
|
||||
sccoFnstCd: getCompanyInfo().companyCode || '' // ! 얘도 마찬가지로 아마 api호출할 때 env꺼 쓸 겁니다.
|
||||
}).then((result) => {
|
||||
if (result.accountList === undefined) {
|
||||
setIsLoading(false);
|
||||
return;
|
||||
}
|
||||
setInvestmentStatus(result);
|
||||
});
|
||||
}
|
||||
}, [userInfo]);
|
||||
|
||||
```
|
||||
|
||||
<br><br>
|
||||
|
||||
변경후
|
||||
|
||||
```javascript
|
||||
const getList = useCallback(() => {
|
||||
if (userInfo) {
|
||||
// 24-08-20 로컬 개발&테스트용 샘플데이터
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
setInvestmentStatus(IBankAccountSample);
|
||||
} else {
|
||||
getAccountList({
|
||||
customerId: userInfo.userId, // ! 이거 나중에 recoil로 빼서 와주세요.
|
||||
sccoFnstCd: getCompanyInfo().companyCode || '' // ! 얘도 마찬가지로 아마 api호출할 때 env꺼 쓸 겁니다.
|
||||
}).then((result) => {
|
||||
if (result.accountList === undefined) {
|
||||
setIsLoading(false);
|
||||
return;
|
||||
}
|
||||
setInvestmentStatus(result);
|
||||
});
|
||||
}
|
||||
}
|
||||
}, [userInfo]);
|
||||
|
||||
```
|
||||
|
||||
로그인하고 내자산에서 가입한 포트폴리오등을 출력하기 위해서 샘플데이터 또 만듬!
|
||||
위치는 역시 <kbd>sample.ts</kbd>
|
||||
|
||||
```javascript
|
||||
export const IBankAccountSample: IBankAccount = {
|
||||
profitAndLoss: 1500.75,
|
||||
profitAndLossRate: 7.5,
|
||||
investableAmount: 10000.0,
|
||||
recomPortfolioJoinYn: 'Y',
|
||||
accountList: [
|
||||
{
|
||||
accountNo: '1234567890',
|
||||
accountName: 'My Savings Account',
|
||||
sccoFnstCd: 'SC001',
|
||||
securitiesName: 'ABC Securities',
|
||||
accountType: 'Savings',
|
||||
accountTypeNm: 'Savings Account',
|
||||
accountInvestableAmount: 5000.5,
|
||||
accountJoinDate: '2022-01-15',
|
||||
pbId: 'PB1234',
|
||||
withAgree: 'Y',
|
||||
accountJourneyStatus: 'Active'
|
||||
},
|
||||
{
|
||||
accountNo: '0987654321',
|
||||
accountName: 'Investment Account',
|
||||
sccoFnstCd: 'SC002',
|
||||
securitiesName: 'XYZ Securities',
|
||||
accountType: 'Investment',
|
||||
accountTypeNm: 'Investment Account',
|
||||
accountInvestableAmount: 3000.0,
|
||||
accountJoinDate: '2023-03-10',
|
||||
accountJourneyStatus: 'Pending'
|
||||
},
|
||||
{
|
||||
accountNo: '1122334455',
|
||||
accountName: 'Retirement Account',
|
||||
sccoFnstCd: 'SC003',
|
||||
securitiesName: 'QRS Securities',
|
||||
accountType: 'Retirement',
|
||||
accountTypeNm: 'Retirement Account',
|
||||
accountInvestableAmount: 2000.0,
|
||||
accountJoinDate: '2021-07-20',
|
||||
withAgree: 'N',
|
||||
accountJourneyStatus: 'Closed'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
export const assetsByAccountSample: IAssetsAccount = {
|
||||
investableAmount: 15000.0,
|
||||
accountLinkedYn: 'Y',
|
||||
investingYn: 'Y',
|
||||
terminatedYn: 'N',
|
||||
investAmount: 10000.0,
|
||||
profitAndLoassAmount: 500.75,
|
||||
valuationAmount: 15500.75,
|
||||
befDtCompPl: 400.5,
|
||||
befDtCompRate: 2.75,
|
||||
dayProfitRateChart: [
|
||||
{x: '2024-08-01', y: 1.25},
|
||||
{x: '2024-08-02', y: 1.5},
|
||||
{x: '2024-08-03', y: 1.75},
|
||||
{x: '2024-08-04', y: 1.6},
|
||||
{x: '2024-08-05', y: 2.0}
|
||||
],
|
||||
portfolioList: [
|
||||
{
|
||||
portfolioId: 'PF001',
|
||||
portfolioName: 'Growth Strategy',
|
||||
title: 'High Growth Portfolio',
|
||||
strategyCount: 3,
|
||||
valuationAmount: 8000.0,
|
||||
profitRate: 5.5,
|
||||
investType: 'Equity',
|
||||
status: 'Active',
|
||||
weight: 60
|
||||
},
|
||||
{
|
||||
portfolioId: 'PF002',
|
||||
portfolioName: 'Balanced Strategy',
|
||||
title: 'Balanced Risk Portfolio',
|
||||
strategyCount: 2,
|
||||
valuationAmount: 5500.75,
|
||||
profitRate: 3.25,
|
||||
investType: 'Mixed',
|
||||
status: 'Active',
|
||||
weight: 30
|
||||
},
|
||||
{
|
||||
portfolioId: 'PF003',
|
||||
portfolioName: 'Conservative Strategy',
|
||||
title: 'Low Risk Portfolio',
|
||||
strategyCount: 1,
|
||||
valuationAmount: 2000.0,
|
||||
profitRate: 1.75,
|
||||
investType: 'Bonds',
|
||||
status: 'Pending',
|
||||
weight: 10
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
|
||||
```
|
||||
|
||||
<br><br>
|
||||
|
||||
변경전
|
||||
|
||||
```javascript
|
||||
|
||||
// 선택된 계좌 투자 정보 조회 api 함수
|
||||
const getAccount = useCallback(() => {
|
||||
if (selectedAcccount) {
|
||||
const tempAccount: IAssetsAccountPrams = {
|
||||
accountNo: selectedAcccount.accountNo
|
||||
};
|
||||
|
||||
getAccountByAssets(tempAccount).then((account) => {
|
||||
setIsLoading(false);
|
||||
if (account.investableAmount === undefined) return;
|
||||
setAccount(account);
|
||||
});
|
||||
}
|
||||
}, [selectedAcccount, setIsLoading]);
|
||||
|
||||
```
|
||||
|
||||
<br><br>
|
||||
|
||||
변경후
|
||||
|
||||
```javascript
|
||||
// 선택된 계좌 투자 정보 조회 api 함수
|
||||
// 24-08-20 로컬 개발&테스트용 샘플데이터
|
||||
const getAccount = useCallback(() => {
|
||||
if (selectedAcccount) {
|
||||
const tempAccount: IAssetsAccountPrams = {
|
||||
accountNo: selectedAcccount.accountNo
|
||||
};
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
setAccount(assetsByAccountSample);
|
||||
} else {
|
||||
getAccountByAssets(tempAccount).then((account) => {
|
||||
setIsLoading(false);
|
||||
if (account.investableAmount === undefined) return;
|
||||
setAccount(account);
|
||||
});
|
||||
}
|
||||
}
|
||||
}, [selectedAcccount, setIsLoading]);
|
||||
|
||||
```
|
||||
|
||||
6. ## 여기부터 필요한 내용
|
||||
|
||||
투자 설명서 및 계약서 페이지는 <kbd>ContractDocTask.tsx</kbd> --> <kbd>ContractDocList.tsx</kbd> 이며
|
||||
<kbd>ContractDocTask.tsx</kbd>에서 `getDescriptionTerm (/terms/product/description)` // `getContractTerm (/terms/product/contract)`를 호출 함
|
||||
|
||||
<br><br><br>
|
||||
|
||||
`getDescriptionTerm (/terms/product/description)`<br>
|
||||
|
||||
```javascript
|
||||
// 투자권유설명서 조회 파람
|
||||
export interface IDescriptionTermParams {
|
||||
portfolioId?: number;
|
||||
strategyId?: string;
|
||||
}
|
||||
|
||||
// 투자권유설명서/투자일임계약서 조회 결과
|
||||
export interface IDescriptionTerm extends ITerms {
|
||||
termsList: IStrategyTerms[];
|
||||
}
|
||||
|
||||
export interface IPersonalTerm extends ITerms {
|
||||
termsList: ITerms[];
|
||||
}
|
||||
|
||||
export interface ITerms extends ITermsProps {
|
||||
securityCompanyCode: string; // 증권 사 코드
|
||||
termsDivisionCode: string;
|
||||
sequence: number; // 증권사, 약관 시퀀스
|
||||
sortOrder: number; // 정렬 순서
|
||||
title: string; // 제목
|
||||
applyDate: string; // 적용일자
|
||||
termsUrl?: string; // 약관url
|
||||
termsContent: string; // 약관내용
|
||||
}
|
||||
|
||||
export interface IStrategyTerms {
|
||||
strategyId: string;
|
||||
strategyName: string;
|
||||
description: string;
|
||||
termsContent: string;
|
||||
}
|
||||
```
|
||||
|
||||
<br><br><br>
|
||||
|
||||
`getContractTerm (/terms/product/contract)`<br>
|
||||
|
||||
```javascript
|
||||
// 투자일임계약서 조회 파람
|
||||
export interface IContractTermParams extends IDescriptionTermParams {
|
||||
account: string;
|
||||
buyDate: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
// 투자권유설명서/투자일임계약서 조회 결과
|
||||
export interface IDescriptionTerm extends ITerms {
|
||||
termsList: IStrategyTerms[];
|
||||
}
|
||||
|
||||
export interface IPersonalTerm extends ITerms {
|
||||
termsList: ITerms[];
|
||||
}
|
||||
|
||||
export interface ITerms extends ITermsProps {
|
||||
securityCompanyCode: string; // 증권 사 코드
|
||||
termsDivisionCode: string;
|
||||
sequence: number; // 증권사, 약관 시퀀스
|
||||
sortOrder: number; // 정렬 순서
|
||||
title: string; // 제목
|
||||
applyDate: string; // 적용일자
|
||||
termsUrl?: string; // 약관url
|
||||
termsContent: string; // 약관내용
|
||||
}
|
||||
|
||||
export interface IStrategyTerms {
|
||||
strategyId: string;
|
||||
strategyName: string;
|
||||
description: string;
|
||||
termsContent: string;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
[<img title="" src="투자설명서%20및%20계약서%20목록.jpg" alt="투자설명서 및 계약서 목록.jpg" style="zoom:100%;">](투자설명서%20및%20계약서%20목록.jpg)
|
||||
|
||||
### 별내 각종 계약, 약관, 페이지 URL
|
||||
|
||||
<https://qm.quantec.co.kr:9100/policy/policy.html>
|
||||
<https://qm.quantec.co.kr:9100/agreement/agreement.html>
|
||||
<https://qm.quantec.co.kr:9100/privacy/privacy_01.html>
|
||||
<https://qm.quantec.co.kr:9100/privacy/privacy_02.html>
|
||||
<https://qm.quantec.co.kr:9100/marketing/marketing.html>
|
||||
<https://qm.quantec.co.kr:9100/agreement/agreement.html>
|
||||
<https://qm.quantec.co.kr:9100/policy/policy.html>
|
||||
<https://qm.quantec.co.kr:9100/privacy/privacy_03.html>
|
||||
<https://qm.quantec.co.kr:9100/marketing/marketing.html>
|
||||
|
||||
로보어드바이저 투자일임계약(비대면) 약관
|
||||
<https://qm.quantec.co.kr:9100/productContract>
|
||||
|
||||
<https://qm.quantec.co.kr:9100/security/common_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/skt_01_220101.html>
|
||||
<https://qm.quantec.co.kr:9100/security/skt_02_220101.html>
|
||||
<https://qm.quantec.co.kr:9100/security/skt_03_220101.html>
|
||||
<https://qm.quantec.co.kr:9100/security/common_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/kt_01_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/kt_02_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/kt_03_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/common_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/lg_01_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/lg_02_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/lg_03_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/common_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/skt_01_220101.html>
|
||||
<https://qm.quantec.co.kr:9100/security/skt_02_220101.html>
|
||||
<https://qm.quantec.co.kr:9100/security/skt_03_220101.html>
|
||||
<https://qm.quantec.co.kr:9100/security/mvno_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/common_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/kt_01_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/kt_02_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/kt_03_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/mvno_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/common_201117.html>
|
||||
<https://qm.quantec.co.kr:9100/security/lg_01_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/lg_02_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/lg_03_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/security/mvno_211130.html>
|
||||
<https://qm.quantec.co.kr:9100/agreement/agreement.html>
|
||||
<https://qm.quantec.co.kr:9100/policy/policy.html>
|
||||
<https://qm.quantec.co.kr:9100/privacy/privacy_03.html>
|
||||
<https://qm.quantec.co.kr:9100/marketing/marketing.html>
|
||||
|
||||
## 참조
|
||||
|
||||
<https://github.com/kumard3/react-grapesJS-example>
|
||||
|
||||
gapsesjs로 만들어진 html을 사용하여 변경할것이다.
|
||||
|
||||
기존의 git 소스는 React Typescript로 되어 있음.
|
||||
이걸 NextJS Typescript로 전환시킬 것임.
|
||||
|
||||
이에 따라서 세팅할 부분이 추가 됨
|
||||
|
||||
1. Next.js 설치
|
||||
`npm install next react react-dom`
|
||||
|
||||
2. 프로젝트 구조 변경
|
||||
|
||||
Next.js는 기본적으로 pages 폴더를 사용하여 페이지 라우팅을 처리. 현재의 src 폴더 구조를 다음과 같이 변경하는 것이 좋음:
|
||||
|
||||
src/pages: 각 페이지에 해당하는 컴포넌트를 이 폴더에 넣습니다.
|
||||
|
||||
src/components: 공통으로 사용할 컴포넌트를 이 폴더에 넣습니다.
|
||||
|
||||
src/public: 정적 파일(이미지, 폰트 등)을 이 폴더에 넣습니다.
|
||||
|
||||
src/styles: 글로벌 스타일 파일을 이 폴더에 넣습니다.
|
||||
|
||||
example
|
||||
|
||||
```console
|
||||
/src
|
||||
/components
|
||||
/pages
|
||||
/api
|
||||
index.tsx
|
||||
/public
|
||||
/styles
|
||||
...
|
||||
```
|
||||
|
||||
3. next.config.js 추가
|
||||
|
||||
```javascript
|
||||
// next.config.js
|
||||
module.exports = {
|
||||
reactStrictMode: true,
|
||||
};
|
||||
```
|
||||
|
||||
4. 스크립트 수정
|
||||
|
||||
```json
|
||||
// package.json
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
}
|
||||
```
|
||||
|
||||
6. 기존 react-scripts 제거 `npm uninstall react-scripts`
|
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 374 KiB |
@ -1,438 +0,0 @@
|
||||
**2024-08-12**
|
||||
|
||||
수익률 광고 api (`market/strategy/promotion`)추가로 인하여 `market/strategy/detail` api가 사용되지 않게됨. <br />
|
||||
리포트 strategy/detail 사용하는 부분strategy/promotion으로 대체.
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
|
||||
`market/strategy/detail`의 response 구조
|
||||
|
||||
```json
|
||||
{
|
||||
"strategyPlan": {
|
||||
"strategyId": "KP0092",
|
||||
"raCode": "RA113143",
|
||||
"portType": "2",
|
||||
"strategyName": "노후 보장 치트키, 연금 추종 전략",
|
||||
"subStrategyName": "콴텍 Q-Shield 국내 EMP4호",
|
||||
"comdType": "KP",
|
||||
"code": "0092",
|
||||
"investTypeCode": "3",
|
||||
"investTypeName": "위험중립형",
|
||||
"strategyDescript": "콴텍으로 노후대비, 참 잘했다 싶어요! 일본 연금기관의 운용 방식처럼 보수적이고 탄탄한 자산배분을 통해 장기적으로 우상향하는 투자 성과를 추구하는 EMP 포트폴리오 전략이에요.",
|
||||
"hashTags": "#연금추종 #자산배분 #장기투자",
|
||||
"investTarket": null,
|
||||
"baseFeeRate": null,
|
||||
"performanceFeeRate": null,
|
||||
"feePaymentMethod": null,
|
||||
"joinTerm": null,
|
||||
"activeYn": null,
|
||||
"referenceInfo": [
|
||||
{
|
||||
"addDesc1": "가입자의 평균 연령은",
|
||||
"addDesc2": "47 세",
|
||||
"emoji": "1F469"
|
||||
},
|
||||
{
|
||||
"addDesc1": "최고령자는",
|
||||
"addDesc2": "57 세",
|
||||
"emoji": "1F474"
|
||||
},
|
||||
{
|
||||
"addDesc1": "평균 투자금액은",
|
||||
"addDesc2": "500 만원",
|
||||
"emoji": "1F4B0"
|
||||
},
|
||||
{
|
||||
"addDesc1": "최고 투자금액은",
|
||||
"addDesc2": "800 만원",
|
||||
"emoji": "1F4B0"
|
||||
}
|
||||
],
|
||||
"strategyDefaultInfo": {
|
||||
"strategyId": "KP0092",
|
||||
"raCode": "RA113143",
|
||||
"portType": "2",
|
||||
"strategyName": "노후 보장 치트키, 연금 추종 전략",
|
||||
"subStrategyName": "콴텍 Q-Shield 국내 EMP4호",
|
||||
"groupTypeCode": "S",
|
||||
"minInvestAmount": "2,000,000원",
|
||||
"maxInvestAmount": "2,000,000원",
|
||||
"defaultFee": "0%",
|
||||
"performanceFee": "15%",
|
||||
"maximumManagement": "규모 제한 없음",
|
||||
"rebalancingTerm": "정기 및 수시 리밸런싱",
|
||||
"investTarket": "한국거래소 상장 ETF 및 기타 예수금",
|
||||
"serviceStartDate": "2022년 9월 19일~",
|
||||
"joinTerm": "계약 체결일로부터 1년|(1년 단위 자동 연장)",
|
||||
"paymentMethod": "원화 (KRW) 현금",
|
||||
"managementPlan1": "한국 상장 ETF로 유니버스 구성",
|
||||
"managementPlan2": "보수적인 관점의 자산배분 전략 활용",
|
||||
"managementPlan3": "콴텍 Q-엔진을 통한 시장 판단 및 위험관리 기능 강화",
|
||||
"managementAlgorithmName": "<b>콴텍 Q-Shield 국내 EMP 4호</b>",
|
||||
"managementAlgorithmRate": "100%",
|
||||
"managementAlgorithmUniverse": "주식 및 채권 ETF(한국 상장)",
|
||||
"managementAlgorithmBenchmark": "MSCI 글로벌 주식+글로벌 채권",
|
||||
"managementAlgorithmCoreFector": "노후보장 치트키&연금추종전략",
|
||||
"managementAlgorithmStyle": "자산배분 블렌드(blend)",
|
||||
"managementAlgorithmRiskManagement": "Q-X 모듈 단계별 현금 비중 조절",
|
||||
"fileUrl": ""
|
||||
}
|
||||
},
|
||||
"strategyInvestTypeInfo": [
|
||||
{
|
||||
"strategyId": "KP0092",
|
||||
"raCode": "RA113143",
|
||||
"portType": "2",
|
||||
"strategyName": "노후 보장 치트키, 연금 추종 전략",
|
||||
"investTypeCode": "2",
|
||||
"investTypeName": "위험중립형",
|
||||
"assetRate": [
|
||||
{
|
||||
"assetsCode": "S",
|
||||
"assetsName": "주식형",
|
||||
"assetsRate": 0.75,
|
||||
"assetsOrder": 1
|
||||
},
|
||||
{
|
||||
"assetsCode": "B",
|
||||
"assetsName": "채권형",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 2
|
||||
},
|
||||
{
|
||||
"assetsCode": "G",
|
||||
"assetsName": "실물형",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 3
|
||||
},
|
||||
{
|
||||
"assetsCode": "W",
|
||||
"assetsName": "현금(KRW)",
|
||||
"assetsRate": 0.25,
|
||||
"assetsOrder": 4
|
||||
},
|
||||
{
|
||||
"assetsCode": "E",
|
||||
"assetsName": "ETF",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 5
|
||||
},
|
||||
{
|
||||
"assetsCode": "F",
|
||||
"assetsName": "펀드",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 6
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"strategyId": "KP0093",
|
||||
"raCode": "RA113142",
|
||||
"portType": "2",
|
||||
"strategyName": "노후 보장 치트키, 연금 추종 전략",
|
||||
"investTypeCode": "3",
|
||||
"investTypeName": "안정추구형",
|
||||
"assetRate": [
|
||||
{
|
||||
"assetsCode": "S",
|
||||
"assetsName": "주식형",
|
||||
"assetsRate": 0.5,
|
||||
"assetsOrder": 1
|
||||
},
|
||||
{
|
||||
"assetsCode": "B",
|
||||
"assetsName": "채권형",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 2
|
||||
},
|
||||
{
|
||||
"assetsCode": "G",
|
||||
"assetsName": "실물형",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 3
|
||||
},
|
||||
{
|
||||
"assetsCode": "W",
|
||||
"assetsName": "현금(KRW)",
|
||||
"assetsRate": 0.5,
|
||||
"assetsOrder": 4
|
||||
},
|
||||
{
|
||||
"assetsCode": "E",
|
||||
"assetsName": "ETF",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 5
|
||||
},
|
||||
{
|
||||
"assetsCode": "F",
|
||||
"assetsName": "펀드",
|
||||
"assetsRate": 0,
|
||||
"assetsOrder": 6
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
|
||||
`market/strategy/promotion` 의 response 구조
|
||||
|
||||
```json
|
||||
{
|
||||
"topInfo": {
|
||||
"strategyId": "KP0011",
|
||||
"strategyName": "파이어족 꿈꾸기",
|
||||
"globalType": "1",
|
||||
"portType": "1",
|
||||
"comdKind": "1",
|
||||
"hashTag": [
|
||||
"#한국중소형",
|
||||
"#실적주",
|
||||
"#시장나침반"
|
||||
],
|
||||
"pubStartDate": "20190211",
|
||||
"baseDate": "20240809",
|
||||
"pubYears": "5.4",
|
||||
"referenceInfo": [
|
||||
{
|
||||
"investType": "2",
|
||||
"title": "누적 수익률",
|
||||
"content": "293.86"
|
||||
},
|
||||
{
|
||||
"investType": "",
|
||||
"title": "알고리즘|공시시작일",
|
||||
"content": "2019.02.11"
|
||||
},
|
||||
{
|
||||
"investType": "",
|
||||
"title": "평균투자금액",
|
||||
"content": "414 만원"
|
||||
},
|
||||
{
|
||||
"investType": "",
|
||||
"title": "최고투자금액",
|
||||
"content": "7,007 만원"
|
||||
}
|
||||
]
|
||||
},
|
||||
"strategyInfo": {
|
||||
"industryInfoList": [
|
||||
{
|
||||
"industryId": "005",
|
||||
"industryName": "식품,음료,담배",
|
||||
"industryImageURL": "https://apidev.quantec.co.kr:8000/v1/img/app/grouping_a_5.png"
|
||||
},
|
||||
{
|
||||
"industryId": "007",
|
||||
"industryName": "자본재",
|
||||
"industryImageURL": "https://apidev.quantec.co.kr:8000/v1/img/app/grouping_a_7.png"
|
||||
},
|
||||
{
|
||||
"industryId": "024",
|
||||
"industryName": "소프트웨어와 서비스",
|
||||
"industryImageURL": "https://apidev.quantec.co.kr:8000/v1/img/app/grouping_a_24.png"
|
||||
}
|
||||
],
|
||||
"testbedName": "콴텍 가치투자 주식형2호",
|
||||
"strategyDescription": "한국 강소기업 중에서 현금을 많이 보유하고 있고, 현금 흐름 개선으로 성장 잠재력이 높은 기업을 위주로 구성한 포트폴리오에요. 투자 위험 대비 높은 기대 수익을 추구하여, 단기 목돈 마련을 원하는 분에게 적합해요.",
|
||||
"recommendedInvestAmount": 3000000,
|
||||
"minInvestAmount": 1500000,
|
||||
"defaultFee": 0,
|
||||
"performanceFee": 15,
|
||||
"maximumManagement": "규모 제한 없음",
|
||||
"rebalancingTerm": "정기 및 수시 리밸런싱",
|
||||
"investTarget": "한국거래소 상장 및 등록 기업의 주권, 기타 예수금",
|
||||
"serviceStartDate": "2022년 4월 1일~",
|
||||
"joinTerm": "계약 체결일로부터 1년|(1년 단위 자동 연장)",
|
||||
"paymentMethod": "원화(KRW)현금",
|
||||
"strategyIndexInfo": {
|
||||
"pubStartDate": "20190211",
|
||||
"baseDate": "20240809",
|
||||
"pubYears": "5.4",
|
||||
"indexInfo": [
|
||||
{
|
||||
"strategyId": "KP0013",
|
||||
"investType": "4",
|
||||
"operationAmount": 3263049,
|
||||
"oneWeekProfitRate": -1.67,
|
||||
"oneMonthProfitRate": -3.16,
|
||||
"threeMonthProfitRate": -4.56,
|
||||
"sixMonthProfitRate": -4.61,
|
||||
"oneYearProfitRate": -2.76,
|
||||
"twoYearProfitRate": 4.57,
|
||||
"threeYearProfitRate": 0.81,
|
||||
"yearExchangeProfitIndex": 9.77,
|
||||
"fullProfitRate": 67.61,
|
||||
"standardDeviation": 0.09,
|
||||
"beta": 0.29,
|
||||
"sharpeRatio": 0.82,
|
||||
"alpha": 0.07,
|
||||
"infoRate": 0.35,
|
||||
"trackError": 0.16,
|
||||
"rewardRate": 3.58,
|
||||
"mdd": -13.6
|
||||
},
|
||||
{
|
||||
"strategyId": "KP0012",
|
||||
"investType": "3",
|
||||
"operationAmount": 4378076,
|
||||
"oneWeekProfitRate": -2.94,
|
||||
"oneMonthProfitRate": -5.64,
|
||||
"threeMonthProfitRate": -8.3,
|
||||
"sixMonthProfitRate": -8.47,
|
||||
"oneYearProfitRate": -6.83,
|
||||
"twoYearProfitRate": 3.58,
|
||||
"threeYearProfitRate": -1.97,
|
||||
"yearExchangeProfitIndex": 14.86,
|
||||
"fullProfitRate": 122.25,
|
||||
"standardDeviation": 0.15,
|
||||
"beta": 0.48,
|
||||
"sharpeRatio": 0.83,
|
||||
"alpha": 0.12,
|
||||
"infoRate": 0.67,
|
||||
"trackError": 0.16,
|
||||
"rewardRate": 2.98,
|
||||
"mdd": -23.73
|
||||
},
|
||||
{
|
||||
"strategyId": "KP0011",
|
||||
"investType": "2",
|
||||
"operationAmount": 2588359,
|
||||
"oneWeekProfitRate": -6.14,
|
||||
"oneMonthProfitRate": -11.54,
|
||||
"threeMonthProfitRate": -16.8,
|
||||
"sixMonthProfitRate": -17.62,
|
||||
"oneYearProfitRate": -16.56,
|
||||
"twoYearProfitRate": -1.86,
|
||||
"threeYearProfitRate": -12.89,
|
||||
"yearExchangeProfitIndex": 25.18,
|
||||
"fullProfitRate": 293.86,
|
||||
"standardDeviation": 0.31,
|
||||
"beta": 0.98,
|
||||
"sharpeRatio": 0.75,
|
||||
"alpha": 0.21,
|
||||
"infoRate": 0.87,
|
||||
"trackError": 0.24,
|
||||
"rewardRate": 1.86,
|
||||
"mdd": -46.8
|
||||
}
|
||||
]
|
||||
},
|
||||
"addDepositPartlyWithdraw": [
|
||||
"납입기간 중 추가입금 가능 (상품별 최소 추가입금 단위 부여)",
|
||||
"일임 운용의 효율을 제고하기 위해 일부 출금|(부분 출금)은 불가하나 중도해지 후 출금 가능",
|
||||
"운용의 효율을 제고하기 위해 일부(부분) 출금은 불가하나 전액 중도해지 후 일부 출금 가능합니다"
|
||||
],
|
||||
"exchangRateHedge": [
|
||||
"국내 원화자산의 환율 변동 위험 없음"
|
||||
],
|
||||
"lawScreeningNo": ""
|
||||
},
|
||||
"managementInfo": {
|
||||
"strategyAssetInfo": [
|
||||
{
|
||||
"strategyId": "KP0011",
|
||||
"investType": "2",
|
||||
"assetInfo": [
|
||||
{
|
||||
"skind": "S",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"strategyId": "KP0012",
|
||||
"investType": "3",
|
||||
"assetInfo": [
|
||||
{
|
||||
"skind": "S",
|
||||
"weight": 0.5
|
||||
},
|
||||
{
|
||||
"skind": "W",
|
||||
"weight": 0.5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"strategyId": "KP0013",
|
||||
"investType": "4",
|
||||
"assetInfo": [
|
||||
{
|
||||
"skind": "S",
|
||||
"weight": 0.3
|
||||
},
|
||||
{
|
||||
"skind": "W",
|
||||
"weight": 0.7
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"managementPlan": [
|
||||
"한국 중소형주 위주로 유니버스 구성",
|
||||
"기업의 유동성 중심의 종목 픽업과 자산배분 알고리즘 활용",
|
||||
"콴텍 Q-엔진을 통한 시장 판단 및 위험관리 기능 강화"
|
||||
],
|
||||
"managementAlgorithmName": [
|
||||
{
|
||||
"title": "<b>콴텍 가치투자 주식형 2호</b>",
|
||||
"content": "100%"
|
||||
}
|
||||
],
|
||||
"managementAlgorithm": [
|
||||
{
|
||||
"title": "<b>유니버스</b>",
|
||||
"content": "한국 중소형주(mid-small cap)"
|
||||
},
|
||||
{
|
||||
"title": "<b>벤치마크</b>",
|
||||
"content": "코스피 종합지수(KOSPI)"
|
||||
},
|
||||
{
|
||||
"title": "<b>코어팩터</b>",
|
||||
"content": "FCF&Quality 팩터"
|
||||
},
|
||||
{
|
||||
"title": "<b>스타일</b>",
|
||||
"content": "중소형 가치주(value)"
|
||||
},
|
||||
{
|
||||
"title": "<b>위험관리</b>",
|
||||
"content": "Q-X 모듈 단계별 현금 비중 조절"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
|
||||
|
||||
|
||||
## 피드백 상황 2024-08-21
|
||||
|
||||
- 홍광진이사
|
||||
|
||||
1. 최근 1개월과 6개월은 하단의 기간이 이상하고, 1개월, 6개월, 1년 수익률 그래프가 모두 동일합니다.
|
||||
|
||||

|
||||
|
||||
2. 미흡 및 주요 지표 설명은 아래 화면처럼 주의/미흡인 종목들 아래에 확장된 형태로 붙어서 나오는거고 종목도 우수~주의 순서로 정렬되어야 하지 않나요?
|
||||
|
||||

|
||||
|
||||
3. 차트 위의 텍스트 위치 조정도 필요합니다.
|
||||
|
||||

|
||||

|
Before Width: | Height: | Size: 120 KiB |
Before Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 88 KiB |