Skip to content

전자세금계산서 IA 계약

목적

전자세금계산서는 범용 전송 서비스가 아니라 매출 세금계산서를 작성·발행하고 매입 세금계산서를 수취·대사하는 전용 모듈이다. 고객 표면과 문서 계약은 특정 전송기관 이름에 의존하지 않는다.

정보 구조

그룹화면
발행 관리작성 중 문서, 단건 발행, 대량 발행, 수정발행
관련 업무판매의 매출 전송 현황, 구매의 매입 수취 현황
문서 전송이메일·문자·팩스 등 문서 전달
연동·설정조직 공통 외부 전송·자동수집 연동

수정발행은 메뉴에서 한 번만 노출하고 유형은 진입 후 선택한다. 기존 매입·위수탁 수정발행 라우트는 호환을 위해 유지한다. 다른 상품으로 이동하는 상태 화면과 외부 서비스 연동에는 related·destination 메타를 두고 메뉴에 이동 아이콘을 표시한다.

src/components/tax-invoice/taxInvoiceNavigation.js를 모바일 메뉴, 데스크톱 메뉴, 도크의 단일 원천으로 사용한다. 메뉴를 추가하거나 이름을 바꿀 때는 docs/manual/tax-invoice.md를 함께 갱신한다.

모바일 동작

  • AppAsideOrg 메뉴 클릭은 router.push() 완료 후 closeTarget이 가리키는 sheet를 닫는다.
  • 데스크톱은 closeTarget을 전달하지 않으므로 동일 컴포넌트를 재사용한다.

Wave 11 as-built 데이터 경계

electronic_document_issue_requestselectronic_document_issue_events가 발행 요청·상태·이력의 서버 정본이다.

  • electronicDocumentIssueRepo: request 목록, append-only event 목록, create/cancel RPC를 감싼다.
  • useTaxInvoiceIssuance: scope hydrate, 발행 create, cancel, 화면 상태와 이벤트 이력 projection을 소유한다.
  • create 결과가 adapter_pending|queued이면 화면은 전송대기로 표시한다. 발행 클릭이 즉시 전송완료를 만들지 않는다.
  • submitted|succeeded|failed는 서버 결과 event가 원장에 기록된 경우에만 전송중|전송완료|오류로 보인다.
  • 결과 번호와 전송시각은 succeeded event payload/occurred_at에서만 파생한다. 성공 event가 없으면 서버 결과 수신 전이다.
  • 상세 이력은 recordOf(id).events를 렌더링한다. 현재 status에서 가짜 history를 역산하지 않는다.

관리비 actual의 발행 후보 행은 아직 useAllocations.taxInvoicesByProfile()에서 산출한다. 다만 발행 요청이 만들어진 뒤의 snapshot·상태·이력은 전자문서 원장만 소비한다. 다른 billing line 일부 목록은 여전히 mock이므로 운영 결과로 표현하지 않는다.

재시도 경계

Wave 12에서 로그인 사용자용 request_electronic_document_delivery_retry 공개 RPC를 연결했다.

  • electronicDocumentIssueRepo.requestDeliveryRetry()companyId, issueRequestId, expectedRevision, requestKey를 RPC에 전달한다.
  • useTaxInvoiceIssuance.retryTransmit()failed projection만 허용하고 현재 revision을 보낸다. RPC 응답 전 queued로 낙관 변경하지 않는다.
  • 성공 응답을 받은 뒤 issue request와 append-only events를 다시 읽어 전송대기delivery_retry_queued를 반영한다.
  • 실패하면 원래 failed projection을 유지하고 lastErrorMessage에 로그인·권한·상품 신청·revision·상태·대기열 오류의 사용자 문구를 저장한다.
  • 같은 retry command exact replay와 payload conflict는 서버 command ledger가 판정한다.

상세 시트는 재시도 중 버튼을 disabled하고 요청 중…을 표시한다. 성공 시 queued 안내, 실패 시 매핑된 원인을 이력 아래에서 보여준다. 일괄 다이얼로그는 처리 중 닫히지 않으며 성공·실패 건수를 표시하고, 성공한 문서만 대상 목록에서 빠진다.

재시도 대기열 등록은 전송 성공이 아니다. succeeded|failed는 기존과 같이 서버 결과 event에서만 반영한다. backoff·최대 재시도 횟수와 운영자용 재처리 화면은 아직 후속이다.

상품 경계

  • 전자문서 repo는 회계 store를 import하거나 분개를 만들지 않는다.
  • 발행 snapshot은 원천 상품의 mutable 객체를 보관하지 않고 issuer/recipient/line/totals/source의 immutable copy만 저장한다.
  • 저장 snapshot에는 credential·token·password·secret·외부 연동 key를 포함하지 않는다.
  • 실제 외부 전송과 역발행 전체 과정은 서버 연동 완료 전까지 부분 구현으로 표시한다.

고객 표면 네이밍

  • 메뉴와 화면에는 전송기관 또는 연동 회사 이름을 표시하지 않는다.
  • 기능명인 외부 서비스 연동, 증빙 자동수집, 전송대기, 전송완료를 사용한다.
  • 고객 진입 경로는 /headquarters/integrations/external-service다. 과거 공급자 이름이 포함된 경로가 있더라도 redirect 호환 전용으로만 둔다.
  • 내부 adapter 식별자는 구현 계약에서만 사용할 수 있으며 template 문자열과 AI·도움말 응답에는 전달하지 않는다.
  • customerFacingProviderNaming.spec.js가 Vue template, 운영 설명서, AI·도움말 응답의 이름 회귀를 차단한다.