원문 캡처 · dev.cordhq.app
원문 캡처 · dev.cordhq.app

Cord는 12개국에서 견적부터 결제, 송장 발행까지 처리한다. 회사는 결제보다 국가별 규정이 다른 송장 처리가 더 까다로웠다며, 실제 개발 과정에서 틀렸던 가정들을 소개했다.

송장 문서와 번호

멕시코의 송장은 PDF가 아니라 XML 파일이다. 판매자가 서명하고 세무 당국 SAT가 승인한 인증기관이 인증해야 한다. PDF는 이를 인쇄해 보여주는 문서일 뿐, 자체적인 법적 효력은 없다. 멕시코·아르헨티나·칠레·페루·콜롬비아·브라질에서는 세무 당국이나 당국이 승인한 기관이 접수해야 송장이 성립한다. 그전까지는 초안이다.

국가마다 송장 종류가 하나뿐인 것도 아니다. 브라질은 상품용 NF-e와 서비스용 NFS-e를 구분하며, NF-e는 주 정부별로 승인된다. 서비스 세율은 시가 정한다. 아르헨티나는 판매자와 구매자의 부가가치세(VAT) 상태에 따라 A·B·C 등급을 선택한다. 독일에서는 서비스 제공일을 기재해야 하며, 송장 발행일과 같다면 같다고 표시해야 한다. 스페인과 아르헨티나에서는 신원을 확인하지 않은 소비자에게도 송장을 발행할 수 있다. 아르헨티나는 정해진 금액 이하일 때만 허용한다.

송장 번호도 계정별로 정하는 것이 아니다. 칠레에서는 세무 당국이 허용한 번호 범위가 담긴 서명 파일을 내려받아 사용한다. 이 범위는 만료되며, 거부된 송장에 사용한 번호도 다시 쓸 수 없다. 번호는 계정이 아니라 세금 식별 번호와 시리즈별로 고유해야 한다. 같은 세금 식별 번호를 가진 두 계정이 시리즈를 공유하면 당국은 두 송장을 하나로 볼 수 있다.

max(number) + 1 방식은 두 요청이 동시에 번호를 발급할 때 안전하지 않다. Cord는 시퀀스마다 임대(lease)를 사용하고 고유 인덱스를 둔다고 설명한다. 회사가 사용하는 Postgres 드라이버는 HTTP를 통해 통신하기 때문에 한 문장에서 획득한 어드바이저리 잠금을 다음 문장까지 유지할 수 없다는 이유다.

세금과 금액 계산

세금 총액이 항목별 세금의 합과 항상 일치하는 것도 아니다. 칠레는 송장 순액을 기준으로 부가가치세를 계산한다. Cord는 항목별로 반올림했을 때 페소화 송장 금액이 맞지 않는 경우가 있었다고 밝혔다. 무작위 금액을 사용한 시험에서는 두 항목짜리 송장의 26%, 다섯 항목짜리 송장의 47%에서 차이가 났다.

모든 통화에 소수점 이하 단위가 있는 것도 아니다. 칠레 세금 문서의 금액은 정수 페소로 표시하며, 엔화에는 보조 단위가 없고 쿠웨이트 디나르는 소수점 세 자리까지 쓴다. 따라서 Math.round(amount * 100)을 적용하면 일본 고객에게 실제 가격의 100배를 청구하게 된다.

한 국가 안에서도 세금 종류와 세율은 지역에 따라 달라질 수 있다. 퀘벡은 연방 GST 5%에 QST 9.975%를 더한다. 스페인은 IVA를 부과하지만 카나리아 제도에서는 IGIC, 세우타와 멜리야에서는 IPSI를 적용한다. 미국에는 전국 단일 세율이 없다. 로스앤젤레스의 주 세율은 7.25%이며, 카운티·시·특별구 세금을 합친 실제 세율은 약 9.5%다.

유럽중앙은행(ECB)이 모든 통화의 환율을 제공하는 것도 아니다. ECB는 콜롬비아·칠레·아르헨티나 페소와 페루 솔의 환율을 발표하지 않는다. Cord는 환율 출처가 없으면 추측값이 법적 문서에 들어갈 수 있으므로 처리를 멈추고 이를 알린다고 설명한다.

발행 후 수정과 당국 제출

송장 발행 뒤 내용을 수정하거나 취소할 수 있다는 가정도 국가별 규정과 맞지 않는다. 스페인의 Verifactu에서는 각 송장 기록에 직전 기록의 SHA-256 해시가 들어간다. 정정은 기존 기록을 가리키는 새 기록으로 남긴다. Cord는 서명된 기록에 대한 UPDATE와 DELETE를 차단하는 Postgres 트리거를 사용해 자체 코드로도 기록 연결을 바꿀 수 없게 한다고 밝혔다.

아르헨티나에서는 당국이 승인한 송장을 무효화할 수 없고 대변표를 발행해야 한다. 멕시코에서는 취소에 법정 기한이 있으며, 고객의 동의가 필요한 경우가 많다. 결제가 끝났다고 후속 절차가 모두 끝나는 것도 아니다. 멕시코에서 결제 전에 송장을 발행했다면 각 결제 건마다 전자 영수증을 발행해야 하며, 다음 달 5일까지 제출해야 한다. 프랑스 개혁안에 따라 부가가치세 납부 시점이 결제 시점인 서비스는 결제 자체를 신고해야 한다.

세무 당국에 보낸 요청이 시간 초과됐다고 그대로 다시 보내면 법적 송장이 중복 발행될 수 있다. Cord는 응답을 받지 못했을 때 요청을 재전송하지 않고 당국에 기록을 조회한다고 설명한다. 아르헨티나에서는 당국이 마지막으로 승인한 번호를 확인한 뒤 해당 송장을 조회한다.

당국이 즉시 답하지 않을 수도 있다. 스페인의 AEAT는 다음 제출까지 기다려야 하는 시간을 안내한다. Cord는 송장 발행 시 기록을 연결하고 나중에 대기열에서 제출해, 당국의 서비스 중단이 송장 발행을 막지 않도록 한다고 밝혔다. 일괄 제출이 거부돼도 모든 송장이 잘못된 것은 아닐 수 있다. 회사는 거부된 묶음을 절반씩 나눠 문제 기록을 찾는다고 설명한다.

전자 송장 의무화가 중남미에만 해당하는 것도 아니다. 2026년 9월 1일부터 프랑스에 설립된 모든 회사는 승인된 플랫폼을 통해 전자 송장을 받을 수 있어야 하며, 소규모 기업은 2027년 9월부터 발행을 시작한다. 스페인의 Verifactu는 당초 2027년 시행 예정이었지만, 정부는 2026년 10월 이를 2028년 10월로 연기한다고 발표했다. 이는 네 번째 연기다.

Cord는 이런 국가별 처리를 사업자가 직접 하지 않도록 돕는다고 소개한다. 고객이 링크 하나에서 승인하고 결제한 견적을 바탕으로 한 번의 클릭으로 송장을 발행하는 방식이다. 멕시코의 CFDI는 운영 중이고 스페인의 Verifactu는 베타 단계이며, 다른 중남미 연동 기능은 개발됐지만 아직 운영 중은 아니다.