Skip to content

12 08 전체 가계부팀 MMS회의

dbstjrwnekd edited this page Dec 8, 2020 · 2 revisions

12/08 전체 가계부팀 MMS회의

1. 사용자화가 가능한 카테고리, 결제수단을 어떻게 매핑해줄 것인지?

  • MMS에서 온 거래내역은 "미분류"로 묶는게 현실적이다!

2. 공통 요구 정보

  • 카드사 <- 결제수단 ( 특정 카드사를 대상으로 파싱 )

    • 대부분 처음에 나오는것 같다.
    • 특정 단어가 여러개 나온다면 첫 번째 나온 것을 파싱(롯데카드, 롯데마트)
  • 금액 ( 뒤에 "원" 이 붙은 가장 처음 나온 단어를 기준으로 파싱)

  • 날짜,시간

  • 입금 | 출금 여부 정보 축출(이체)

  • 결제 "취소" | "승인" | "거절" 같은 예외 케이스를 분류

    • 특별한 키워드 x => 승인
function smsParser(input) {
    const tokens = string.replace(/\[web발신\]/i,'').trim().split(/[\s\n\r]/g)| 정규식 -> 👏👏👏

    let paymentList = ['신한','KB','농협','BC','현대','우리'];

    tokens.forEach((el) => {
        숫자+'원' -> 금액 (,도 포함됩니다)
        숫자/숫자 -> 날짜
        숫자:숫자 -> 시간
        초반부의 문자에서 찾기 -> 카드사(uppercase)
        결제 여부 -> 승인(default),취소,거절
    });
}

3. 카드 문자 샘플

KG 이니시스

[WEB발신]
[kg이니시스]
464,000원 익월
합산요금청구

KB 국민카드

[WEB발신]
KB국민카드 김영근님 06/07
09:22 5000원
결제 승인

농협 카드

[Web발신]
NH카드7*9*승인
박*용
12,350원 체크
12/06 20:37
세븐일레븐 고대안암고 
잔액222,210원

현대 카드

현대 ZERO 승인
2,500원 일시불
04/10 13:15
코레일유통서울지사
누적 560,852원
0.7%할인

롯데 카드

롯데3121 승인
5,200원 일시불
09/15 18:31
월드크리닝 롯데마트

신한체크

[Web발신]
[신한체크승인] 최*희(7062) 
02/10 13:10 
(금액)1,000원 PAYCO

우리카드

[Web발신]
우리(4575)승인
임*봉님
4562원 일시불
12/07 20:29
네이버페이
누적123,456원

우리체크

[Web발신]
우리(8804) 체크승인
윤*우님
10,000원
11/03 10:03
스타벅스코리아

국민체크

[Web발신]
KB국민체크
윤*우님
06/08 08:57
28,440원
11PAY 인증
승인취소

4. 입금/출금 문자 예시

신한은행 출금

[Web발신]
[신한은행] 09/26
21:31:30.27
[110-***-123456]
지급 20,000원
(최창희)

농협 입금

[Web발신]
농협 입금 200원
06/11 22:29 123-1234-4567-12
잔액 200000원

농협 출금

농협 출금 5000원
08/31 19:01 123-1234-1234-12
잔액 200000원
// type ParsedSMS = {
//   cardname:string,
//   amount:number
//   date:string
//   time: string;
//   transactionType: string;
//   cardType: string;
//   isDeposit: Boolean;
// };

// 팀에서 서비스에 맞게 추가. 현재는 각 서비스에 있는 결제 수단을 모두 넣은  것.
const paymentList = [
  '신한',
  '국민',
  'KB',
  '농협',
  'BC',
  '현대',
  '우리',
  'KG',
  'NH',
];

// 위에 것이랑 둘 중 하나만 써도 됨. 매핑시키기 위한 것.
const cardObj = {
  신한: '신한카드',
  국민: '국민카드',
  KB: '국민카드',
  NH: '농협카드',
  농협: '농협카드',
  BC: 'BC카드',
  현대: '현대카드',
  우리: '우리카드',
  KG: 'KG이니시스',
};

const solution = (sms) => {
  const newData = {};

  // 승인, 취소, 거절을 구분하는 변수
  const transactionTypeToken = sms.match('취소|거절');
  newData.transactionType = transactionTypeToken
    ? transactionTypeToken[0]
    : '승인';

  if (newData.transactionType === '거절') {
    return newData;
  }

  const isDepositToken = sms.match('입금');
  newData.isDeposit = !!(isDepositToken || newData.transactionType === '취소');

  // 카드타입! 얘를 어떻게 처리하면 좋을지?
  const cardTypeToken = sms.match('체크');
  newData.cardType = cardTypeToken ? cardTypeToken[0] : '신용';

  const parsedSMSDatas = parseSMS(sms);
  parsedSMSDatas.forEach((data, i) => {
    if (i === 0) {
      const cardName = data
        .replace(/[\[\]]/gi, '')
        .substring(0, 2)
        .toUpperCase();
      newData.cardname = cardName;
    }
    if (data.includes('원') && !newData.amount) {
      newData.amount = Number(
        data.match(/[0-9]+(,?[0-9]+)+/)[0].replace(',', ''),
      );
      return;
    }
    if (data.includes(':')) {
      newData.time = data.match(/[0-9]{2}:[0-9]{2}/)[0];
    }
    if (data.includes('/')) {
      newData.date = data.match(/[0-9]{2}\/[0-9]{2}/)[0];
    }
  });
  return newData;
};

const parseSMS = (string) => {
  return string
    .replace(/\[web발신\]/i, '')
    .trim()
    .split(/[\s\n\r]/g)
    .filter((e) => e);
};

test('solution', () => {
  const result = solution(`[WEB발신]
  [kg이니시스]
  04/12 21:13
  464,000원 익월
  합산요금청구`);
  console.log(result);
  expect(
    solution(`[WEB발신]
    [kg이니시스]
    04/12 21:13
    464,000원 익월
    합산요금청구`),
  ).toEqual({
    cardname: 'KG',
    amount: 464000,
    date: '04/12',
    time: '21:13',
    transactionType: '승인',
    cardType: '신용',
    isDeposit: false,
  });

  expect(
    solution(`[WEB발신]
      KB국민카드 김영근님 06/07
      09:22 5000원
      결제 승인`),
  ).toEqual({
    cardname: 'KB',
    amount: 5000,
    date: '06/07',
    time: '09:22',
    transactionType: '승인',
    cardType: '신용',
    isDeposit: false,
  });

  expect(
    solution(`[Web발신]
      농협 입금 200원
      06/11 22:29 123-1234-4567-12
      잔액 200000원`),
  ).toEqual({
    cardname: '농협',
    amount: 200,
    date: '06/11',
    time: '22:29',
    transactionType: '승인',
    cardType: '신용',
    isDeposit: true,
  });

  expect(
    solution(`농협 출금 5000원
      08/31 19:01 123-1234-1234-12
      잔액 200000원`),
  ).toEqual({
    cardname: '농협',
    amount: 5000,
    date: '08/31',
    time: '19:01',
    transactionType: '승인',
    cardType: '신용',
    isDeposit: false,
  });

  expect(
    solution(`현대 ZERO 승인
    2,500원 일시불
    04/10 13:15
    코레일유통서울지사
    누적 560,852원
    0.7%할인`),
  ).toEqual({
    cardname: '현대',
    amount: 2500,
    date: '04/10',
    time: '13:15',
    transactionType: '승인',
    cardType: '신용',
    isDeposit: false,
  });

  expect(
    solution(`[Web발신]
      [신한체크승인] 최*희(7062)
      02/10 13:10
      (금액)1,000원 PAYCO`),
  ).toEqual({
    cardname: '신한',
    amount: 1000,
    date: '02/10',
    time: '13:10',
    transactionType: '승인',
    cardType: '체크',
    isDeposit: false,
  });

  expect(
    solution(`롯데3121 승인
    5,200원 일시불
    09/15 18:31
    월드크리닝 롯데마트`),
  ).toEqual({
    cardname: '롯데',
    amount: 5200,
    date: '09/15',
    time: '18:31',
    transactionType: '승인',
    cardType: '신용',
    isDeposit: false,
  });

  expect(
    solution(`[Web발신]
    우리(4575)승인취소
    임*봉님
    4562원 일시불 
    12/07 20:29
    네이버페이
    누적123,456원`),
  ).toEqual({
    cardname: '우리',
    amount: 4562,
    date: '12/07',
    time: '20:29',
    transactionType: '취소',
    cardType: '신용',
    isDeposit: true,
  });

  expect(
    solution(`[Web발신]
    우리(8804) 체크승인
    윤*우님
    10,000원
    11/03 10:03
    스타벅스코리아`),
  ).toEqual({
    cardname: '우리',
    amount: 10000,
    date: '11/03',
    time: '10:03',
    transactionType: '승인',
    cardType: '체크',
    isDeposit: false,
  });

  expect(
    solution(`[Web발신]
    KB국민체크
    윤*우님
    06/08 08:57
    28,440원
    11PAY 인증
    승인취소
    `),
  ).toEqual({
    cardname: 'KB',
    amount: 28440,
    date: '06/08',
    time: '08:57',
    transactionType: '취소',
    cardType: '체크',
    isDeposit: true,
  });
});
Clone this wiki locally