myDocument/quantec/cs/quantecContract
2024-12-02 10:48:30 +09:00
..
README.md 업데이트 2024-12-02 10:48:30 +09:00
계좌 입고 및 출고 제한 동의서, 복수의 로보어드바이저 투자 비중 유지 사전 동의서_240624.docx 업로드 2024-08-26 16:10:18 +09:00
로보어드바이저 투자일임계약.docx 업로드 2024-08-26 16:10:18 +09:00
변경약관 정리_240624.xlsx 업로드 2024-08-26 16:10:18 +09:00
비대면 투자일임계약서.docx 업로드 2024-08-26 16:10:18 +09:00
성과수수료 합의서_240624.docx 업로드 2024-08-26 16:10:18 +09:00
스크린샷 2024-08-20 130351.png 업로드 2024-08-26 16:10:18 +09:00
스크린샷 2024-08-20 135312.png 업로드 2024-08-26 16:10:18 +09:00
스크린샷 2024-08-20 135444.png 업로드 2024-08-26 16:10:18 +09:00
스크린샷 2024-08-20 135557.png 업로드 2024-08-26 16:10:18 +09:00
스크린샷 2024-08-20 135720.png 업로드 2024-08-26 16:10:18 +09:00
투자설명서 및 계약서 목록.jpg 업로드 2024-08-26 16:10:18 +09:00
핵심설명서.docx 업로드 2024-08-26 16:10:18 +09:00

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는 따로 받는 파라미터가 없다!

그런데 왜? http://localhost:3200/login?ref=/&sccofnstcd=270 간단하게 sccofnstcd 파라미터코드를 잘못알았던 것이었다.

CS 로그인 정보

USERID_INDEX_20231118

정치영팀장 U2FsdGVkX19+ppz/We/H+2mKzTSmj3vA2PwN3pOVjYQ=

{
    "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"
}
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

위와 같은 화면 나옴...

  1. src/sample/sample.ts 생성하여 아래와 같은 샘플 정보 만듬
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에서

원본

  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[]);
    });
  };



변경

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

SelectBankAccount.tsx

스크린샷 2024-08-20 135444.png

InputDepositPopup.tsx

스크린샷 2024-08-20 135557.png

DivideInvestAmount.tsx





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



스크린샷 2024-08-20 135720.png

최종적으로 투자 설명서 및 계약서 확인이 가능한 부분까지 나옴

처음 로그인 시 [내 자산]으로 넘어가는데 위 부분을 처리하기 위해 또! 샘플데이터를 만듬. 위치는 sample.ts

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에 넣음 코드는 아래와 같음

변경전


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]);



변경후

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

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
    }
  ]
};




변경전


 // 선택된 계좌 투자 정보 조회 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]);



변경후

 // 선택된 계좌 투자 정보 조회 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]);

  1. 여기부터 필요한 내용

투자 설명서 및 계약서 페이지는 ContractDocTask.tsx --> ContractDocList.tsx 이며 ContractDocTask.tsx에서 getDescriptionTerm (/terms/product/description) // getContractTerm (/terms/product/contract)를 호출 함




getDescriptionTerm (/terms/product/description)

// 투자권유설명서 조회 파람
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)

// 투자일임계약서 조회 파람
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

별내 각종 계약, 약관, 페이지 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

약관 변경 사항 참조 파일 24-08-23

  1. 계좌 입고 및 출고 제한 동의서, 복수의 로보어드바이저 투자 비중 유지 사전 동의서_240624.docx
  2. 로보어드바이저 투자일임계약.docx
  3. 변경약관 정리_240624.xlsx
  4. 비대면 투자일임계약서.docx
  5. 성과수수료 합의서_240624.docx


업무1

참조

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

/src
  /components
  /pages
    /api
    index.tsx
  /public
  /styles
  ...
  1. next.config.js 추가
// next.config.js
module.exports = {
  reactStrictMode: true,
};
  1. 스크립트 수정
// package.json
"scripts": {
  "dev": "next dev",
  "build": "next build",
  "start": "next start",
  "lint": "next lint"
}
  1. 기존 react-scripts 제거 npm uninstall react-scripts

2024-08-23

변경약관동의 (2024-05)

[AM]

2024-05 기획 초안 --> 2024-06-28 기획 완료 --> 2024-08-06 내가 받음


단어 정리
  1. 약관: "약관"이란 그 명칭이나 형태 또는 범위에 상관없이 계약의 한쪽 다사자가 여러명의 상대방과 계약을 체결하기 위하여 일정한 형식으로 미리 마련한 계약의 내용. 다수인을 상대로 동종의 거래를 반복하는 경우에 그 거래를 위하여 미리 작성해 놓은 정형적인 계약조건, 사업자 측에서 다수의 소비자들과 같은 계약을 반복하는 경우 약관을 통한 상행위의 편의성을 가지고자 하는 계약 방식
  2. 계약서: 계약한다는 법적 증거와 구체적인 계약 내용을 남기기 위해 작성하며 계약을 맺는 양자가 동의한다는 뜻에서 [사인, 도장, 지장] 등이 들어간다. 그리고 계약서는 반드시 계약에 참여하는 자의 수 만큼 직접 작성해 분쟁 발생시 계약의 증거로 활용함.



1. PBP-CS는 기본적으로 포트폴리오 기준 2. 현재 오픈되어 있는 페이지
1) HOME
2) Market(마켓)
3) My Asset(내자산)
4) ETC(더보기) 3. Market 내부에 [전략 마켓], [포트폴리오 마켓]이 있지만 현재는 [전략 마켓]만 오픈되어 있음 ([포트폴리오 마켓]은 display:none 처리 되어 있음) 4. 콴텍의 APP은 전략이 기준임 5. 콴텍 APP과 콴텍 PBP-CS의 데이터 구조 및 프로세스는 상품의 기준이 포트폴리오인지 전략인지에 따라 달라진다. 포트폴리오를 기준으로 하면 포트폴리오 관리에 초점을 맞추고, 전략을 기준으로 하면 투자 전략에 따라 데이터 구조와 프로세스가 구성된다. 6. 요번 약관 변경에 서도 이 갭에 대한 차이가 나타났다.



[오후 2시 회의 말할 내용]


  • 회의의 목적은 PBP-CS와 콴텍 앱의 차이에 따른 내용 정리를 위함임. 그리고 PBP-CS 작업자인 내가 회의 참여 및 설명을 듣지 못해서 이해도가 낮은 상황인것에 대해서 양해를 구하는 바임


기획 내용 분석

  1. 05-03) 신규계약인 경우 전체 약관 모두 필수 동의 할 수 밖에 없음, 계약갱신인 경우에도 해당 약관 및 계약서로 진행 -- 전략별로 각각 동의의자 관리되어야함. ==> 이 부분은 PBP-CS가 포트폴리오가 기준어도 계약은 각각의 전략으로 관리되기 때문에 괜찮을지도?
  2. 05-14) 로보어드바이저 투자일임계약서(비대면)이것에 대해서 로보어드바이저 투자일임계약서라는것이 너무 많아서 내가 혼동이옴 설명이 필요함.
  3. 05-14) "투자문서"메뉴 추가라는 부분은 기존 히스토리 관리인것인지? 이것은 이미 PBP-CS에 있음. 앱은 안되어 있었는지?
  4. 05-28) [문자]계약서 등 변경 안내 -- SMS 추가 이 부분은 PBP-CS에서 안되는걸로 알고 있음. 왜냐? PBP-CS가 각 금융사 MTS에 입점되어 있는 경우 고객 정보를 받아 올 수 없기 때문임.


개발팀 리뷰 후 수정 기획 내용 분석 (06-27)

  1. CTA 버튼 [동의함]으로 수정이라는 것은? CTA는 Click to Action일것인데 이것은 그러면 페이지 아래로 내려가는게 아닌 그냥 동의하기로 해서 넘기겠다는 뜻? 전에 이춘선부장님이 이야기했던 그 내용? 맞쥬?
  2. 서비스 진입 시 약관동의 팝업 추가 ==> 이건 하면 될꺼 같고...
  3. [다음] 버튼 설명 수정이란?
  • 약관목록 전체 체크 후 [다음] 버튼 활성화에 대해서
  • 이제는 목록에서 고객이 직접 체크할 수 있게 만들어야함. (상세내요확인하지 않아도 체크가 가능하다.)
  • 각 설명서 및 약관 큐버튼 Tap하여 상세로 이동하여 직접 [동의함] 버튼 Tap시 목록에 체크되어 있음? 상세로 이동하여 [동의함] 버튼 클릭하면 목록에 체크되는건 오케이... 그런데? 큐버튼이란?
  • 기존 체크되어 있는 설명서 및 약관은 해제도 가능하다? 그러면 [다음] 버튼이 활성화 되지 않는다. 이것은?
  • "투자일임계약서" --> 로보어드바이저 투자일임 계약서(비대면)"으로 약관명 변경된다.
  1. 포트폴리오 가입 시 전자서명에 대해서 휴대폰 본인인증으로 한다.
  2. 계약서, 합의서, 약관
  3. 증권사에 들어가는 것이기 때문에 목록에서 체크 할 수 없다. 그리고 CTA 방식으로 할 수 없다. 무조건 다 읽고 넘어가야 한다.


to 기획

  1. 현재 PBP-CS는 각 금융사 MTS에 thirdparty로 들어가는 서비스가 맞는지? 아니면 독립적으로도 사용하는 서비스가 되어야 하는지?
  2. MTS의 thirdparty로 접근되는 서비스라면 내가 알고 있는 선에서는 약관 동의 및 절차를 줄이기 위해서 입점한것으로 알고 있다. 입점 이유에 반대되는 프로세스가 되는 것이 아닌지?
  3. 독립적으로 사용하는 서비스가 되어야 한다면 APP과 유사하게 가는게 맞다.
  4. "둘다" 라는 상황이라면 위 2개를 적용하여 분기 처리 하는게 맞다.
  5. 앱의 전략 기준과 다르게 포트폴리오 기준이기 때문에 약관 리스트에서 약관 상세를 들어가면 또 collapse 형식으로 펼침 메뉴가 있다는점. (물론 이것은 상세에 들어갈때 펼침 메뉴가 1개라면 강제로 열어놓게 할 수 있음.)
  6. 로그인 이후 화면에 들어갈때 변경된 약관에 대해서 동의를 재요청 하는 과정이 전략을 기준으로 가야 하는지 아니면 포트폴리오로 가야하는지 이야기 해볼 필요가 있다.
  7. 약관의 변경으로 인한 이라는 것은 약관의 내용 변경이 변경 되었을때 적용해야 하는것인지
  8. 포트폴리오 구조상 포트폴리오를 가입하면 포트폴리오에 포함된 전략의 갯수만큼 설명서, 계약서, 약관, 합의서, 동의서가 나오게 된다. 즉 포트폴리오에 있는 전략이 3개라면 15개의 문서를 열람해야하는 문제 발생


to 컴플

  1. 약관 내용이 콴텍 앱과 다른 점이 있을것임.
  2. 이 내용은 문서로 이춘선 부장님에게 전달하였고 전달 받았을 것으로 생각됨.
  3. 약관 내용중 하나증권이 요청하여 추가된 부분이 있음.
  4. 위 부분과 콴텍이 제공하는 약관과 차이가 있음 이것을 확인해야 함.
  5. 그리고 현재 PBP-CS에서 지금 보내준 약관을 제공하는게 맞는지. 기존 하나증권이 요청한 부분과 충돌이 나는 부분이 없는지?
  6. 최종적으로 지금 계약서 및 약관에 대해서 내가 이해도가 떨어져서 설명을 요구하는것임



약관 변경 사항 (24-08-23 11:30)

정BJ: 로그인시 팝업으로 뜨는 변경약관 동의는 이제 "필수"이다 이걸 동의하지 않는다면 서비스를 사용할 수 없다.

HAZELCAST 캐시화된 DB 캐시 Clear

클네임:hazelcast-cluster-dev

210.179.172.127:5050

업무 2024-08-27

/terms/product/roboadvisor API는 [GET] [POST] 사용이 필요 없어짐

로보어드바이저 투자일임계약 약관 등록은 투자 일음 계약서에 포함되어 있기 때문에 따로 필요 없음 기존의 일임계약서를 대체함

가입시 /goods/portfolio/investPortfolio오류..

"해당 계좌는 사용할 수 없는 계좌입니다."

이건 InvestTask.tsx의 investResult의 변수값을 저 위의 api에 던짐

getUserId /user/id

{
    "value": "5000003080",
    "success": true
}

{
    "investDivType": "",
    "inputDivType": "02",
    "account": "39784625010",
    "portfolioId": null,
    "portfolioName": "김익희님의 포트폴리오 20240827-1619",
    "referencePortfolioId": null,
    "counselSeq": null,
    "strategyId": "",
    "totalInvestAmount": 20000000,
    "totalUsdInvestAmount": 0,
    "strategyList": [
        {
            "strategyId": "KP014NaN",
            "investAmount": 20000000,
            "investmentWeight": 1
        }
    ],
    "descriptionAgreeSeq": 630,
    "investmentTypeDvsn": "01",
    "contractAgreeSeq": 631
}

api_mpot에서

TC_USER_ACCOUNT의

UID = 5000003080

REQUEST_STATUS_CODE 01 ---> 03

QTDB에서 TC5002MT 테이블에

270 39784625010 Y 20240826184739 100159 2024-02-01 15:48:54.000

이거 생성함

가입이 완료되면 포트폴리오는 TP0010MT에 정보 생성함

하지만 그 생성하는 과정에서 하나증권 api를 타기 때문에 실패!




업무 2024-08-27

assetMain에서 모든 계좌에 가입되어 있는 포트폴리오가지고 포트폴리오를 조회해서 포트폴리오의 투자 문서를 가져올꺼임

portfolioDetail에서 onClickInvestmentDocs를 보면 setInvestmentDocsData에


  ptflId: portfolio.portfolioId,
  buyDate: portfolioDetail?.accountPortfolioDetailInfo[0].firstDate || '',
  type: '3', // 보고서 타입 [1:보고서리스트,2:보고서상세]
  year: '',
  quarter: '',
  account: portfolio.accountNo

이런식으로 데이터 만들어서 InvestmentDocsTask에 값을 보내고 있음

그리고 각각 InvestmentDoc, StrategyDoc, DiscretionaryContractDoc, OperationaryReportDoc로 보내서 가입시 동의 또는 운영시 작성된 약관, 리포트 리스트를 보여줌

/**
 * Get 전략 설명서
 * @returns
 * @param params
 */
export const getInvestmentStrategyReport = async (
  params: IInvestmentStrategyCommonParam
): Promise<IInvestmentStrategyContractDoc> => {
  return api.get<IInvestmentStrategyContractDoc>('/doc/strategy', params);
};

/**
 * Get 운용 보고서
 * @returns
 * @param params
 */
export const getInvestmentOperationReport = async (
  params: IOperationParams
): Promise<IInvestmentOperationaryContractDoc[]> => {
  return api.get<IInvestmentOperationaryContractDoc[]>('/doc/report/operation', params);
};

/**
 * Get 일임 계약서
 * @returns
 * @param params
 */
export const getInvestmentContractReport = async (
  params: IInvestmentDiscretionaryDocParams
): Promise<IInvestmentStrategyContractDoc> => {
  return api.get<IInvestmentStrategyContractDoc>('/doc/discretion', params);
};

위의 api로 문서 호출

// PortfolioDetailData 
{
    "portfolioName": "정치영님의 포트폴리오 20240807-1603",
    "portfolioDesc": null,
    "chartDataModelList": [
        {
            "x": "20240807",
            "y": 0,
            "marker": []
        }
    ],
    "strategyCount": 1,
    "accountPortfolioStrategyOperationInfo": {
        "investAmount": 2000000,
        "totalProfitAndLossAmount": 0,
        "valueAmount": 2000000,
        "rate": 0
    },
    "accountPortfolioDetailInfo": [
        {
            "portfolioId": 360,
            "portfolioName": "정치영님의 포트폴리오 20240807-1603",
            "strategyId": "KP0132",
            "strategyName": "멀티팩터의 교향곡을 만드는 종목",
            "firstDate": "20240807",
            "investmentPropensityCode": "3",
            "investmentPropensity": "위험중립형",
            "strategyTitle": "콴텍 Q-Growth 국내 주식",
            "globalType": "1",
            "weight": 100,
            "itype": "1",
            "strategyStatusCode": "A",
            "strategyStatusName": "활성화",
            "reservationOrderTypeCode": null,
            "reservationOrderTypeName": "해지",
            "reservationStatusCode": null,
            "reservationStatusName": "주문실패",
            "weightRate": 1,
            "minimumInvestmentAmount": 1500000,
            "firstInvestAmount": 2000000,
            "addInvestAmount": 0,
            "investAmount": 2000000,
            "valueAmount": 2000000,
            "rate": 0,
            "activeStatusCode": "4",
            "activeStatusName": "운용중"
        }
    ],
    "strategyAssetsRateResultList": null,
    "accountStrategyFirstDateCalEtcInfo": null,
    "managementPlan": null,
    "managementAlgorithmName": null,
    "managementAlgorithmRate": null,
    "managementAlgorithmUniverse": null,
    "managementAlgorithmBenchmark": null,
    "managementAlgorithmCoreFector": null,
    "managementAlgorithmStyle": null,
    "managementAlgorithmRiskManagement": null
}

이렇게 조회했을때 firstDate가 있으니까 이 부분을 이용해서

firstDate가 있으니까 이것을 기준으로 TP0015MT의 LAST_WRK_DTM이 앞서면

firstDate < LAST_WRK_DTM 되어 있다면 DB에 있는 약관이 가입한 포트폴리오보다 최신이라는 뜻이 되니까 변경된 약관 동의를 출력

pbp-cs 변경약관동의 변경 사항 (24-08-23 11:30)

정치영팀장: 로그인시 팝업으로 뜨는 변경약관 동의는 이제 "필수"이다 이걸 동의하지 않는다면 서비스를 사용할 수 없다. (출처는 기획인듯?)

정치영팀장: MTS입점 먼저 들어가면 현재 변경약관동의는 branch hotfix로 넣을것

pbp-cs 변경약관동의 변경 사항 (24-08-26 10:10)

정치영팀장: PBP에서 추천링크 생성할때 investTypeList 추가 유무 물어봄

업무 2024-09-30

로그인시 변경약관동의 팝업 뜨는것 투자 일임 계약서 추가됨

이것을 위해서 백엔드 TP0015MT와 TP5010MT에서 applydate와 regdate를 비교해서 applydate가 클경우 팝업을 띄우기로 하였음

백엔드에서 api추가 하였고 공통을 변경하여서 이것에 대해서 부작용 나는 부분 유심히 관찰해야 함

todo

약관 프로세스 정리

db 테이블 구조 정리

api 구조 정리

프론트 테스크 프로세스 정리 필요함



2024-09-04 변경약관 현재까지 정리

  1. "성과수수료합의서" 추가됨 DB TP0015MT DOC_DVSN_CD 09번으로 생성
  2. "계좌입출고제한동의서" 추가됨 DB TP0015MT DOC_DVSN_DC 10번으로 생성
  3. "로보어드바이저 투자일임계약(비대면)약관" DB TP0015MT DOC_DVSN_DC 08번으로 생성, 이 내용이 PBP-CS에서 "투자일임계약서"에 포함된다고 함(기획, 컴플 미팅시 확인) 현재 사용하지 않음.
  4. "투자일임계약서" 내용 변경건으로 DB TP0015MT DOC_DVSN_DC 02번으로 DOC_SEQ 추가 생성
  5. !!이슈!! 8월 29일 배포하였던 프론트 코드에 문제점을 발견. 로그인 이후 변경약관동의 팝업에서 동의후 확인시 성과수수료합의서, 계좌입출고제한동의서, 투자일임계약서, 설명서 4개의 문서를 모두 POST로 전달.
  6. 8월 29일 배포에서는 변경약관팝업에서 성과수수료합의서, 계좌입출고제한동의서 2개만 동의를 구하여 2개만 POST해야함. (기존 코드 재활용으로 나온 문제)
  7. 9월 3일 투자일임계약서를 동의 받으려함. 8월 29일 동의한 사용자 변경약관팝업이 출력안되는 현상. (이미 TP5010MT에 동의 내역이 있기 때문)
  8. 운영계에서 테스트한 내부 계정들 모두 위의 이슈 확인.
  9. 운영 프로세스상으로는 문제 없음, 고객 증가 했을때 DB 지저분해질 문제있음. PBP-CS의 ContractDocTask를 변경약관에도 사용할 수 있도록 수정할 계획.

A. 9월 3일 오전 정치영부장님이 박상수차장에게 물어본 로보어드바이저 투자일임계약(비대면)약관은 위의 3번과 같은 이유로 나올 수 없음. 현재 프로세스상에서는 DOC_DVSN_DC 02번인 투자일임계약서의 동의를 확인해야함 운영DB에서 동의 확인함. 현재는 로그인 후 변경약관동의가 안떠야 하는게 맞음.

2024-09-09 TODO

[get] /customer api를 불러올때 사용자의 포트폴리오를 불러오고 포트폴리오의 상태, 동의여부를 불러오기 위함입니다.

/customer api는 [내 자산]으로 들어가기전에 호출하여 cookieinfo에 담아 recoil로 사용하고 있으므로 /customer api에 가입되어 있는 포트폴리오 정보를 담는다면 어떤 페이지에 도달하였던지 변경약관 팝업을 띄울 수 있게 됩니다.

로그인 성공 후 CookieInfo.tsx에 getUserInfoApi를 통해서 사용자 정보를 저장해서 recoil로 끌어다 사용하는 중.

여기에 portfolio리스트와 동의 여부를 체크해야 함. 사용자가 가입된 portfolio 목록의 DB 테이블은 TP0010MT, TP0010DT임

[get] /customer api의 쿼리는 아래와 같다

SELECT 
    M.SCCO_CD                     AS sccoFnstCd,              /* 증권사금융기관코드 */
    PTN.CP_NAME                   AS securitiesName,          /* 증권사명 */
    M.CST_ID                      AS userId,                  /* 고객ID */
    U.USER_NAME                   AS userName,                /* 고객명 */
    U.HP_NUMBER                   AS mobileNumber,            /* 휴대폰번호 */
    U.BIRTH                       AS birth,                   /* 생일 */
    U.GENDER                      AS gender,                  /* 성별코드 */
    U.EMAIL                       AS email,                   /* 전자메일 */
    M.SCCO_CST_IDNTF_ID           AS sccoCustomerIdentifyId,  /* 증권사 고객식별 ID */
    M.RMKS                        AS remarks,                 /* 비고 */
    M.CST_STTS_CD                 AS statusCode,              /* 상태코드 [1.정상, 9.탈퇴] */
    U.PASSWORD_ERROR_COUNT        AS passwordErrorCount,      /* 암호오류횟수 */
    U.PASSWORD_DATE               AS passwordDate,            /* 패스워드 등록일자 */
    U.ACTIVE_STEP                 AS activeStep,              /* 활성단계 */
    UAI.PUSH_STATUS               AS pushStatus,              /* 혜택, 마케팅 푸시알람: 01.등록, 02.해제 */
    DATE_FORMAT(UAI.PUSH_STATUS_DATE, '%Y-%m-%d %H:%i:%s') AS pushStatusDate /* 푸시알람 변경날짜 */
FROM 
    TP0007MT M
    INNER JOIN api_mpot.TC_USER U       /* 사용자정보 */
        ON U.UID = M.CST_ID
    LEFT JOIN TC1500MT PTN              /* 회원사 정보 */
        ON M.SCCO_CD = PTN.CP_CODE
    LEFT JOIN TC5001MT UAI              /* 푸시알림 상태 */
        ON U.UID = UAI.UID
WHERE 
    M.SCCO_CD = 270
    AND M.CST_ID = 5000001008
    AND U.ROLES = 1;    


위의 쿼리에 2개의 테이블을 left join 한다.


SELECT 
    M.SCCO_CD                     AS sccoFnstCd,              /* 증권사금융기관코드 */
    PTN.CP_NAME                   AS securitiesName,          /* 증권사명 */
    M.CST_ID                      AS userId,                  /* 고객ID */
    U.USER_NAME                   AS userName,                /* 고객명 */
    U.HP_NUMBER                   AS mobileNumber,            /* 휴대폰번호 */
    U.BIRTH                       AS birth,                   /* 생일 */
    U.GENDER                      AS gender,                  /* 성별코드 */
    U.EMAIL                       AS email,                   /* 전자메일 */
    M.SCCO_CST_IDNTF_ID           AS sccoCustomerIdentifyId,  /* 증권사 고객식별 ID */
    M.RMKS                        AS remarks,                 /* 비고 */
    M.CST_STTS_CD                 AS statusCode,              /* 상태코드 [1.정상, 9.탈퇴] */
    U.PASSWORD_ERROR_COUNT        AS passwordErrorCount,      /* 암호오류횟수 */
    U.PASSWORD_DATE               AS passwordDate,            /* 패스워드 등록일자 */
    U.ACTIVE_STEP                 AS activeStep,              /* 활성단계 */
    UAI.PUSH_STATUS               AS pushStatus,              /* 혜택, 마케팅 푸시알람: 01.등록, 02.해제 */
    PORT.PTFL_NM                  AS portFolioName,           /* 포트폴리오 이름 */
    PORT.PTFL_ID                  AS portFolioID,             /* 포트폴리오 아이디 */
    PORTSTAT.STATUS      AS portFolioStatus,   /* 포트폴리오 상태 */
    DATE_FORMAT(UAI.PUSH_STATUS_DATE, '%Y-%m-%d %H:%i:%s') AS pushStatusDate /* 푸시알람 변경날짜 */
FROM 
    TP0007MT M
    INNER JOIN api_mpot.TC_USER U       /* 사용자정보 */
        ON U.UID = M.CST_ID
    LEFT JOIN TC1500MT PTN              /* 회원사 정보 */
        ON M.SCCO_CD = PTN.CP_CODE
    LEFT JOIN TC5001MT UAI              /* 푸시알림 상태 */
        ON U.UID = UAI.UID
    LEFT JOIN QTDB.TP0010MT PORT        /* 포트폴리오 정보 */
        ON M.CST_ID = PORT.WRTR_ID
    LEFT JOIN QTDB.TC5009MT PORTSTAT        /* 포트폴리오 상태 */
  ON PORT.PTFL_ID = PORTSTAT.PTFL_ID
WHERE 
    M.SCCO_CD = 270
    AND M.CST_ID = 5000001008
    AND U.ROLES = 1;    


  PORT.PTFL_NM                  AS portFolioName,           /* 포트폴리오 이름 */
    PORT.PTFL_ID                  AS portFolioID,             /* 포트폴리오 아이디 */

LEFT JOIN QTDB.TP0010MT PORT        /* 포트폴리오 정보 */
        ON M.CST_ID = PORT.WRTR_ID
    LEFT JOIN QTDB.TC5009MT PORTSTAT        /* 포트폴리오 상태 */
  ON PORT.PTFL_ID = PORTSTAT.PTFL_ID

위와 같이 2개를 추가 하여 로그인시 현재 활성화되어 있는 포트폴리오

2024-11-08 투자일임보고서?


flowchart TB
  node_1[("0015MT")]
  node_2[("0016MT")]
  node_3[["운용보고서조회 (API)"]]
  node_4[("0010MT")]
  node_5[("5632HS")]

  node_1 --> node_3
  node_4 --> node_3
  node_5 --> node_3
  node_3 --> node_2

  1. 0015MT의 TTL이 투자일임보고서 DOC_CN의 HTML템플릿을 가져옴 해당 HTML은 백엔드의 데이터 바인딩이 같이 있음

  2. 0010MT에서 API에서 호출 하는 포트폴리오 PTFL_ID를 가져옴

  3. 5632HS에서 포트폴리오의 기초자료 세부 내역 데이터를 가져옴

  4. 운영보고서조회(API)는 계좌번호, 포트폴리오ID, 연도, 분기를 가지고 3의 데이터를 호출 하여 API호출 즉시 0016MT에 저장한다.