로그인 카톡상담 054-286-3838
SIGN UP

회원가입

회원가입하고 정비이력 관리·예약 등 다양한 서비스를 누려보세요.

01
가입유형
02
약관동의
03
본인인증
04
정보입력
05
가입완료

가입 유형 선택

가입하실 회원 유형을 선택해 주세요.

약관 동의

서비스 이용을 위해 약관에 동의해 주세요.

이용약관 동의 [필수]
인동티에스 포항 서비스 이용약관에 동의합니다.
보기
개인정보 수집·이용 동의 [필수]
성함·연락처·차량정보 등의 수집·이용에 동의합니다.
보기
마케팅 정보 수신 동의 [선택]
캠페인·특가 등 혜택 정보를 받아봅니다.
선택

본인 인증

휴대폰 번호로 본인 인증을 진행합니다.

정보 입력

로그인에 사용할 정보와 차량 정보를 입력해 주세요.

소셜 계정으로 간편하게 가입할 수도 있어요
또는 이메일로 가입
차량 정보
아래 고객명·연락처·차량번호는 인동티에스 정비이력 확인에 사용됩니다. 정비 시 등록하신 정보와 동일하게 입력해주세요. 관리자 확인 후 가입이 승인됩니다.
차량을 여러 대 보유하신 경우, 가입 후 마이페이지에서 추가 등록하실 수 있습니다.

가입 신청이 완료되었습니다

으로 가입 신청되었습니다.
인동티에스에서 정비이력 확인 후 가입을 승인해 드립니다.
승인 완료 후 로그인하실 수 있습니다.

·줄바꿈 금지) window.__I18N__ = { next: "다음", submitBtn: "가입 신청 완료", processing: "처리중...", resend: "재발송", timerExpired: "시간만료", vehTitle: "차량 정보", vehTitleBiz: "사업자 · 차량 정보", errNamePhone: "이름과 휴대폰번호를 입력해주세요.", errPickType: "가입 유형을 선택해주세요.", errTerms: "필수 약관에 모두 동의해주세요.", errCodeSend: "인증번호를 발송하고 인증을 완료해주세요.", errCodeEnter: "인증번호를 입력해주세요.", missEmail: "이메일", missPw: "비밀번호", missPw2: "비밀번호 확인", missBizno: "사업자등록번호", missCustname: "고객명", missContact: "연락처", missPlate: "차량번호", errFieldsSuffix: " 항목을 입력해주세요.", errPwRule: "비밀번호는 영문·숫자·특수문자 포함 8자 이상이어야 합니다.", errPwMismatch: "비밀번호가 일치하지 않습니다.", signupFail: "회원가입에 실패했습니다.", signupError: "회원가입 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.", socNotReadyA: " 간편가입은 현재 준비 중입니다.", socNotReadyB: "이메일로 가입해주세요.", }; (function () { 'use strict'; var I = window.__I18N__ || {}; // ─── 상태 ─── var state = { step: 1, type: '', // personal | business terms: { t1: false, t2: false, t3: false }, codeSent: false, secs: 0, tick: null, submitting: false, }; // ─── 유틸 ─── function escapeHtml(s) { return String(s == null ? '' : s) .replace(/&/g, '&').replace(//g, '>') .replace(/"/g, '"').replace(/'/g, '''); } function $(id) { return document.getElementById(id); } function val(id) { var el = $(id); return el ? el.value.trim() : ''; } // 연락처 하이픈 자동 포맷 (010-1234-5678) window.formatPhone = function (el) { var d = el.value.replace(/\D/g, '').slice(0, 11); var out = d; if (d.length < 4) out = d; else if (d.length < 7) out = d.slice(0, 3) + '-' + d.slice(3); else if (d.length < 11) out = d.slice(0, 3) + '-' + d.slice(3, 6) + '-' + d.slice(6); else out = d.slice(0, 3) + '-' + d.slice(3, 7) + '-' + d.slice(7); el.value = out; }; // 사업자등록번호 하이픈 자동 포맷 (000-00-00000) window.formatBizNo = function (el) { var d = el.value.replace(/\D/g, '').slice(0, 10); var out = d; if (d.length < 4) out = d; else if (d.length < 6) out = d.slice(0, 3) + '-' + d.slice(3); else out = d.slice(0, 3) + '-' + d.slice(3, 5) + '-' + d.slice(5); el.value = out; }; // 소셜 준비중 안내 window.notReady = function (e, name) { e.preventDefault(); alert(name + I.socNotReadyA + '\n' + I.socNotReadyB); return false; }; // ─── 에러 ─── function showErr(msg) { var box = $('suErr'), m = $('suErrMsg'); if (!box || !m) return; m.textContent = msg; box.style.display = 'flex'; try { box.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } catch (e) {} } function clearErr() { var box = $('suErr'); if (box) box.style.display = 'none'; } window.suClearErr = clearErr; function scrollTop() { try { var el = document.scrollingElement || document.documentElement; el.scrollTo({ top: 0, behavior: 'smooth' }); } catch (e) { window.scrollTo(0, 0); } } // ─── 스텝 렌더 ─── function renderStep() { var st = state.step; // panes document.querySelectorAll('.su-pane').forEach(function (p) { p.classList.toggle('show', Number(p.dataset.pane) === st); }); // stepper document.querySelectorAll('.su-step').forEach(function (s) { var no = Number(s.dataset.step); s.classList.toggle('active', no === st); s.classList.toggle('done', no < st); }); // 차량 섹션 타이틀 / 사업자번호 $('suSecTitle').textContent = state.type === 'business' ? I.vehTitleBiz : I.vehTitle; $('suBizWrap').style.display = state.type === 'business' ? 'block' : 'none'; // 네비 버튼 var navRow = $('suNavRow'); var prevBtn = $('suPrevBtn'); var nextBtn = $('suNextBtn'); if (st >= 5) { navRow.style.display = 'none'; } else { navRow.style.display = 'block'; prevBtn.style.display = (st > 1) ? 'block' : 'none'; nextBtn.textContent = (st === 4) ? I.submitBtn : I.next; } clearErr(); } // ─── STEP 1: 유형 ─── window.suPickType = function (btn) { state.type = btn.dataset.type; document.querySelectorAll('.su-type-card').forEach(function (c) { c.classList.toggle('active', c === btn); }); clearErr(); }; // ─── STEP 2: 약관 ─── function syncTermsUI() { ['t1', 't2', 't3'].forEach(function (k) { var box = document.querySelector('.su-term-box[data-term="' + k + '"]'); if (!box) return; var on = !!state.terms[k]; box.classList.toggle('on', on); var svg = box.querySelector('svg'); if (svg) svg.style.display = on ? 'block' : 'none'; }); var allOn = state.terms.t1 && state.terms.t2 && state.terms.t3; var allBtn = $('suAllBtn'); allBtn.classList.toggle('on', allOn); $('suAllCheck').style.display = allOn ? 'block' : 'none'; } window.suToggleTerm = function (k) { state.terms[k] = !state.terms[k]; syncTermsUI(); clearErr(); }; window.suToggleAll = function () { var allOn = state.terms.t1 && state.terms.t2 && state.terms.t3; var v = !allOn; state.terms.t1 = v; state.terms.t2 = v; state.terms.t3 = v; syncTermsUI(); clearErr(); }; // ─── STEP 3: 인증 타이머 ─── function fmtTimer(secs) { if (secs <= 0) return I.timerExpired; var mm = Math.floor(secs / 60); var ss = String(secs % 60).padStart(2, '0'); return mm + ':' + ss; } window.suSendCode = function () { var name = val('suVName'), phone = val('suVPhone'); if (!name || !phone) { showErr(I.errNamePhone); return; } state.codeSent = true; state.secs = 180; $('suCodeWrap').style.display = 'block'; $('suSendBtn').textContent = I.resend; $('suTimer').textContent = fmtTimer(state.secs); clearErr(); if (state.tick) clearInterval(state.tick); state.tick = setInterval(function () { state.secs -= 1; if (state.secs <= 0) { state.secs = 0; clearInterval(state.tick); state.tick = null; } $('suTimer').textContent = fmtTimer(state.secs); }, 1000); }; // ─── 네비 ─── window.suPrev = function () { if (state.step <= 1) return; state.step -= 1; renderStep(); scrollTop(); }; window.suNext = function () { var st = state.step; if (st === 1) { if (!state.type) return showErr(I.errPickType); } if (st === 2) { if (!state.terms.t1 || !state.terms.t2) return showErr(I.errTerms); } if (st === 3) { var vn = val('suVName'), vp = val('suVPhone'), vc = val('suVCode'); if (!vn || !vp) return showErr(I.errNamePhone); if (!state.codeSent) return showErr(I.errCodeSend); if (!vc) return showErr(I.errCodeEnter); // 3→4 진입 시 본인인증 정보로 고객명·연락처 자동 채움 (비어 있을 때만) if (!val('suCustName')) $('suCustName').value = $('suVName').value; if (!val('suCustPhone')) $('suCustPhone').value = $('suVPhone').value; } if (st === 4) { submitSignup(); return; } state.step = Math.min(5, st + 1); renderStep(); scrollTop(); }; // ─── STEP 4 → 제출 (실제 백엔드 호출) ─── var PW_RE = /^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$/; function submitSignup() { if (state.submitting) return; var email = val('suEmail'); var pw = $('suPw').value; var pw2 = $('suPw2').value; var custName = val('suCustName'); var custPhone = val('suCustPhone'); var plate = val('suPlate'); var bizNo = val('suBizNo'); var miss = []; if (!email) miss.push(I.missEmail); if (!pw) miss.push(I.missPw); if (!pw2) miss.push(I.missPw2); if (state.type === 'business' && !bizNo) miss.push(I.missBizno); if (!custName) miss.push(I.missCustname); if (!custPhone) miss.push(I.missContact); if (!plate) miss.push(I.missPlate); if (miss.length) return showErr(miss.join(', ') + I.errFieldsSuffix); if (!PW_RE.test(pw)) return showErr(I.errPwRule); if (pw !== pw2) return showErr(I.errPwMismatch); var btn = $('suNextBtn'); var orig = btn.textContent; state.submitting = true; btn.disabled = true; btn.textContent = I.processing; clearErr(); // 백엔드 계약 보존: /api/customer/signup // (email, password, name, phone, vehicle_number, terms_agree, privacy_agree, marketing_consent) fetch('/api/customer/signup', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin', body: JSON.stringify({ email: email, password: pw, name: custName, phone: custPhone, vehicle_number: plate, terms_agree: state.terms.t1, privacy_agree: state.terms.t2, marketing_consent: state.terms.t3, }), }) .then(function (r) { return r.json(); }) .then(function (d) { if (d && d.success) { $('suDoneEmail').textContent = email; // textContent = XSS 안전 state.step = 5; renderStep(); scrollTop(); } else { showErr((d && d.message) || I.signupFail); state.submitting = false; btn.disabled = false; btn.textContent = orig; } }) .catch(function () { showErr(I.signupError); state.submitting = false; btn.disabled = false; btn.textContent = orig; }); } // 초기 렌더 renderStep(); syncTermsUI(); })();