diff --git a/quantec/README.md b/quantec/README.md deleted file mode 100644 index fc5cb03..0000000 --- a/quantec/README.md +++ /dev/null @@ -1,41 +0,0 @@ -### 2024-08-23 - -#### 약관에 대한 생각 - -##### [AM] - -1. PBP-CS는 기본적으로 포트폴리오 기준 -2. 현재 오픈되어 있는 페이지
1) HOME
2) Market(마켓)
3) My Asset(내자산)
4) ETC(더보기) -3. Market 내부에 [전략 마켓], [포트폴리오 마켓]이 있지만 현재는 [전략 마켓]만 오픈되어 있음 ([포트폴리오 마켓]은 display:none 처리 되어 있음) -4. 콴텍의 APP은 전략이 기준임 -5. 콴텍 APP과 콴텍 PBP-CS의 데이터 구조 및 프로세스는 상품의 기준이 포트폴리오인지 전략인지에 따라 달라진다. 포트폴리오를 기준으로 하면 포트폴리오 관리에 초점을 맞추고, 전략을 기준으로 하면 투자 전략에 따라 데이터 구조와 프로세스가 구성된다. -6. 요번 약관 변경에 서도 이 갭에 대한 차이가 나타났다. - -

- -#### [오후 회의 말할 내용] - -> ---- -> -> ### 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에서 지금 보내준 약관을 제공하는게 맞는지. 기존 하나증권이 요청한 부분과 충돌이 나는 부분이 없는지? -> -> --- diff --git a/quantec/quantecAssetAnalysis/README.md b/quantec/quantecAssetAnalysis/README.md deleted file mode 100644 index 014724e..0000000 --- a/quantec/quantecAssetAnalysis/README.md +++ /dev/null @@ -1,116 +0,0 @@ -**투자자산진단** - -진입시 케이스가 2개로 나누어짐 - -## 1. 고객ID로 보유종목 조회하는 경우 - > - > 위의 경우는 하나증권의 하나플러스에서 4408 업무코드로 고객의 데이터를 가지고 진입했을때 사용한다. 이의 API는
[GET] `/counsel/asset/hold`를 사용하고 있다. - -```javascript - -//해당 api의 파라미터 - export interface IAssetListInputParam { - customerId?: string; -} - -//해당 api의 결과 -export interface IGetAssetList { - customerName: string; - stockList: IStockList[]; -} -``` - -## 2. ODS 접근 방식으로 보유종목 조회 - > - > 위의 방법은 하나증권 태블릿 업무 단말인 ODS로 진입했을때 사용하는 경우이다. - 이 방법은 내부에서 /demo 페이지에서 종목코드, 비중을 입력하고 진입하는 경우와 같다. - API는
[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" - } - ] -} -``` diff --git a/quantec/quantecContract/README.md b/quantec/quantecContract/README.md deleted file mode 100644 index 92244d9..0000000 --- a/quantec/quantecContract/README.md +++ /dev/null @@ -1,663 +0,0 @@ -**PBP-CS 약관 처리** - -24.05 변경약관 정리 - -!!! info - 계좌개설 "로보어드바이저 투자일임계약(비대면) 약관" 변경되고 - 동의 내용은 투자일임계약 약관 동의 + 투자일임계약서 + 성과수수료 동의서 - 약관파일명 : (콴텍투자일임주식회사)+비대면+투자일임계약+약관+개정(시행_20240808)_수정요청사항반영최종(배포용)_240624 - 전자서명 필요하고 필수임. - -!!! info - 전략투자에 3개 변경 및 추가 사항이 있음 - - **1. 로보어드바이저 투자일임계약(비대면) 약관** - > 1. 동의 내용은 투자일임계약 약관 동의 + 투자일임계약서 + 성과수수료 동의서 - > 2. 약관파일명 : (콴텍투자일임주식회사)+비대면+투자일임계약+약관+개정(시행_20240808)_수정요청사항반영최종(배포용)_240624 - - > 3. 전자서명 필요하고 필수임 이건 변경 사항임 - - -
- - **2. 성과수수료 합의서** - > 1. 동의 내용은 성과수수료 합의서 - - > 2. 파일명 : 성과수수료 합의서_240624 - - > 3. 전자서명 필요하고 필수이며 이건 추가 사항임 - -
- - **3. 계좌 입·출고 제한 동의서** - > 1. 동의 내용은 2개 있음. -
계좌 입출고 제한 동의, 복수의 로보어드바이저 투자 비중 유지 사전 동의 - - > 2. 계좌 입고 및 출고 제한 동의서, 복수의 로보어드바이저 투자 비중 유지 사전 동의서_240624 - - > 3. 동의여부 필요하고 둘다 필수임 추가 사항임 - -!!! - **scenario** - cs에 로그인해서 들어갔을때 약관에 대해서 조회를 하고 - 약관에 대한 추가동의를 받는다. - $$ 왕호's Say : 동의 미동의를 사용자가 바꿀 수 있는가? 지금은 안되니까 안보여준다. $$ - - > 1. 로그인해서 들어갔을때의 시점? - -### process1 - -1. master로 부터 terms-and-conditions 브랜치 생성 -2. /login?sccoFntd=270로 접속하여 회원가입 -3. api오류 `/terms/member` --> 일치하는 약관내역이 없습니다. - -> 엥? 왜 일치하는 약관이 없지???? 뭐지? `/terms/member`는 따로 받는 파라미터가 없다! - -그런데 왜? - -간단하게 sccofnstcd 파라미터코드를 잘못알았던 것이었다. - - -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":"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","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. StrategyDetail.tsx --> InvestProcess.tsx --> PreInvestTask.tsx --> SelectBankAccount.tsx - -PreInvestTask.tsx 이곳에서 index값을 기준으로 SelectBankAccount.tsx or DivideInvestAmount.tsx 이동함 - -index = 1 ---> SelectBankAccount.tsx
-index = 2 ---> DivideInvestAmount.tsx - -SelectBankAccount.tsx 에서 계좌가 없으면 - -![스크린샷 2024-08-20 130351.png](스크린샷%202024-08-20%20130351.png) - -위와 같은 화면 나옴... - -5. src/sample/sample.ts 생성하여 아래와 같은 샘플 정보 만듬 - -```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 미동의) - } -]; - - -``` - -위의 코드를 SelectBankAccount.tsx에서 - -**원본** - -```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[]); - }); - }; -``` - -

- -**변경** - -```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[]); - }); - } - }; -``` - -위와 같이 변경함. -그러면 이후 프로세스를 통과 시킬 수 있음. - -![스크린샷 2024-08-20 135312.png](스크린샷%202024-08-20%20135312.png) -![스크린샷 2024-08-20 135444.png](스크린샷%202024-08-20%20135444.png) -![스크린샷 2024-08-20 135557.png](스크린샷%202024-08-20%20135557.png) - -



- -### 위와 같은 정상 프로세스로 나옴 - -

- -![스크린샷 2024-08-20 135720.png](스크린샷%202024-08-20%20135720.png) - -최종적으로 투자 설명서 및 계약서 확인이 가능한 부분까지 나옴 - - -처음 로그인 시 [내 자산]으로 넘어가는데 위 부분을 처리하기 위해 또! 샘플데이터를 만듬. 위치는 sample.ts - -```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' - } - ] -}; -``` - -위의 샘플데이터를 useBankAccount.ts에 넣음 -코드는 아래와 같음 - -변경전 - -```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]); - -``` - -

- -변경후 - -```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]); - -``` - -로그인하고 내자산에서 가입한 포트폴리오등을 출력하기 위해서 샘플데이터 또 만듬! -위치는 역시 sample.ts - -```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 - } - ] -}; - - -``` - -

- -변경전 - -```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]); - -``` - -

- -변경후 - -```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. ## 여기부터 필요한 내용 - -투자 설명서 및 계약서 페이지는 ContractDocTask.tsx --> ContractDocList.tsx 이며 -ContractDocTask.tsx에서 `getDescriptionTerm (/terms/product/description)` // `getContractTerm (/terms/product/contract)`를 호출 함 - -


- -`getDescriptionTerm (/terms/product/description)`
- -```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; -} -``` - -


- -`getContractTerm (/terms/product/contract)`
- -```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; -} - -``` - -[투자설명서 및 계약서 목록.jpg](투자설명서%20및%20계약서%20목록.jpg) - -### 별내 각종 계약, 약관, 페이지 URL - - - - - - - - - - - -로보어드바이저 투자일임계약(비대면) 약관 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## 참조 - - - -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` diff --git a/quantec/quantecContract/스크린샷 2024-08-20 130351.png b/quantec/quantecContract/스크린샷 2024-08-20 130351.png deleted file mode 100644 index d42c630..0000000 Binary files a/quantec/quantecContract/스크린샷 2024-08-20 130351.png and /dev/null differ diff --git a/quantec/quantecContract/스크린샷 2024-08-20 135312.png b/quantec/quantecContract/스크린샷 2024-08-20 135312.png deleted file mode 100644 index bca2db5..0000000 Binary files a/quantec/quantecContract/스크린샷 2024-08-20 135312.png and /dev/null differ diff --git a/quantec/quantecContract/스크린샷 2024-08-20 135444.png b/quantec/quantecContract/스크린샷 2024-08-20 135444.png deleted file mode 100644 index cc3f367..0000000 Binary files a/quantec/quantecContract/스크린샷 2024-08-20 135444.png and /dev/null differ diff --git a/quantec/quantecContract/스크린샷 2024-08-20 135557.png b/quantec/quantecContract/스크린샷 2024-08-20 135557.png deleted file mode 100644 index 618ce8f..0000000 Binary files a/quantec/quantecContract/스크린샷 2024-08-20 135557.png and /dev/null differ diff --git a/quantec/quantecContract/스크린샷 2024-08-20 135720.png b/quantec/quantecContract/스크린샷 2024-08-20 135720.png deleted file mode 100644 index 25744b8..0000000 Binary files a/quantec/quantecContract/스크린샷 2024-08-20 135720.png and /dev/null differ diff --git a/quantec/quantecContract/투자설명서 및 계약서 목록.jpg b/quantec/quantecContract/투자설명서 및 계약서 목록.jpg deleted file mode 100644 index 763b802..0000000 Binary files a/quantec/quantecContract/투자설명서 및 계약서 목록.jpg and /dev/null differ diff --git a/quantec/quantecReport/README.md b/quantec/quantecReport/README.md deleted file mode 100644 index 8961afc..0000000 --- a/quantec/quantecReport/README.md +++ /dev/null @@ -1,438 +0,0 @@ -**2024-08-12** - -수익률 광고 api (`market/strategy/promotion`)추가로 인하여 `market/strategy/detail` api가 사용되지 않게됨.
-리포트 strategy/detail 사용하는 부분strategy/promotion으로 대체. - -
-
-
- -`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": "콴텍 Q-Shield 국내 EMP 4호", - "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 - } - ] - } - ] -} -``` - -
-
-
- -`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": "콴텍 가치투자 주식형 2호", - "content": "100%" - } - ], - "managementAlgorithm": [ - { - "title": "유니버스", - "content": "한국 중소형주(mid-small cap)" - }, - { - "title": "벤치마크", - "content": "코스피 종합지수(KOSPI)" - }, - { - "title": "코어팩터", - "content": "FCF&Quality 팩터" - }, - { - "title": "스타일", - "content": "중소형 가치주(value)" - }, - { - "title": "위험관리", - "content": "Q-X 모듈 단계별 현금 비중 조절" - } - ] - } -} -``` - -
-
-
- - - -## 피드백 상황 2024-08-21 - -- 홍광진이사 - -1. 최근 1개월과 6개월은 하단의 기간이 이상하고, 1개월, 6개월, 1년 수익률 그래프가 모두 동일합니다. - -![alt text](image.png) - -2. 미흡 및 주요 지표 설명은 아래 화면처럼 주의/미흡인 종목들 아래에 확장된 형태로 붙어서 나오는거고 종목도 우수~주의 순서로 정렬되어야 하지 않나요? - -![alt text](image-1.png) - -3. 차트 위의 텍스트 위치 조정도 필요합니다. - -![alt text](image-2.png) -![alt text](image-3.png) diff --git a/quantec/quantecReport/image-1.png b/quantec/quantecReport/image-1.png deleted file mode 100644 index 27bbc82..0000000 Binary files a/quantec/quantecReport/image-1.png and /dev/null differ diff --git a/quantec/quantecReport/image-2.png b/quantec/quantecReport/image-2.png deleted file mode 100644 index 60768c6..0000000 Binary files a/quantec/quantecReport/image-2.png and /dev/null differ diff --git a/quantec/quantecReport/image-3.png b/quantec/quantecReport/image-3.png deleted file mode 100644 index fe4a582..0000000 Binary files a/quantec/quantecReport/image-3.png and /dev/null differ diff --git a/quantec/quantecReport/image.png b/quantec/quantecReport/image.png deleted file mode 100644 index ec73a6a..0000000 Binary files a/quantec/quantecReport/image.png and /dev/null differ