DHDataHọc
TheoryLesson 4/85 min read+10 XP

Ghi nhận doanh thu

Bạn sẽ học được

  • Phân biệt kế toán tiền mặt và kế toán dồn tích.
  • Ghi nhận doanh thu thuê bao theo thời gian.
  • Tính doanh thu chờ và phân bổ theo ngày.
  • Xử lý hợp đồng bắt đầu giữa tháng.
  • Phân bổ phí triển khai ban đầu.

Khái niệm cốt lõi

Kế toán tiền mặt: ghi doanh thu khi nhận tiền. Kế toán dồn tích: ghi doanh thu khi nghĩa vụ được thực hiện, bất kể đã thu tiền hay chưa.

Báo cáo tài chính dùng dồn tích. Với dịch vụ thuê bao, khách trả một năm nhưng doanh thu phải chia đều cho mười hai tháng — vì nghĩa vụ phục vụ được thực hiện dần.

Ba khái niệm đi kèm:

Khái niệmNghĩa
Nghĩa vụ thực hiệnViệc công ty phải làm để được ghi doanh thu
Doanh thu chờTiền đã thu nhưng chưa được ghi doanh thu
Phân bổChia một khoản tiền cho nhiều kỳ

Ví dụ cơ bản

Khách trả trước 1.200.000 đồng cho gói 12 tháng, bắt đầu ngày 1/1.

Thời điểmTiền mặtDoanh thu ghi nhậnDoanh thu chờ
1/1+1.200.00001.200.000
31/10100.0001.100.000
28/20100.0001.000.000
31/120100.0000

Doanh thu mỗi tháng = 1.200.000 / 12 = 100.000.

Nếu ghi toàn bộ 1.200.000 vào tháng 1, báo cáo tháng 1 lãi giả tạo và mười một tháng sau lỗ giả tạo. Không ai ra quyết định đúng từ báo cáo đó.

Phân bổ theo ngày

Chia theo tháng chỉ đúng khi hợp đồng bắt đầu vào ngày đầu tháng. Thực tế phần lớn hợp đồng bắt đầu giữa tháng, nên phải phân bổ theo ngày.

code
WITH ky AS (
  SELECT
    c.id AS contract_id,
    c.total_amount,
    c.service_start,
    c.service_end,
    gs::date AS ngay
  FROM contracts c
  CROSS JOIN LATERAL generate_series(
    c.service_start,
    c.service_end,
    INTERVAL '1 day'
  ) AS gs
)
SELECT
  date_trunc('month', ngay)::date AS thang,
  SUM(total_amount / (service_end - service_start + 1)) AS doanh_thu
FROM ky
GROUP BY 1
ORDER BY 1;

service_end - service_start + 1 là số ngày phục vụ. Mỗi ngày nhận total / số ngày; cộng theo tháng cho doanh thu tháng đó.

Kiểm tra: cộng toàn bộ kết quả phải bằng total_amount của hợp đồng. Nếu lệch, thường do generate_series bỏ ngày cuối hoặc do kiểu dữ liệu.

Hợp đồng bắt đầu giữa tháng

Hợp đồng 1.200.000 đồng từ 16/1 đến 15/1 năm sau (365 ngày):

  • Doanh thu tháng 1 = 16 ngày × (1.200.000 / 365) ≈ 52.603 đồng.
  • Doanh thu tháng 2 = 28 ngày × 3.287,67 ≈ 92.055 đồng.

Nếu chia đều 100.000 mỗi tháng, tháng 1 bị ghi cao hơn thực tế gần gấp đôi. Với nhiều hợp đồng, sai số tích luỹ thành chênh lệch lớn giữa báo cáo và thực tế.

Phí triển khai

Hợp đồng có phí triển khai 240.000 đồng cộng thuê bao 1.200.000 đồng/năm.

Hai trường hợp:

Phí triển khai là nghĩa vụ riêng biệt (khách nhận được giá trị độc lập, có thể dùng mà không cần thuê bao): ghi doanh thu khi hoàn thành triển khai.

Phí triển khai không tách rời (chỉ là bước chuẩn bị để phục vụ): gộp vào tổng và phân bổ theo thời gian.

code
Tổng hợp đồng = 240.000 + 1.200.000 = 1.440.000
Doanh thu tháng = 1.440.000 / 12 = 120.000

Cùng một khoản tiền, hai cách ghi cho hai kết quả rất khác. Cách xác định phụ thuộc bản chất nghĩa vụ, và phải nhất quán giữa các hợp đồng tương tự.

Hoàn tiền và tín dụng

Khi khách huỷ giữa kỳ và được hoàn một phần:

  • Giảm doanh thu chờ tương ứng phần chưa phục vụ.
  • Ghi khoản hoàn tiền, không ghi chi phí.
  • Nếu đã ghi doanh thu cho phần bị hoàn, phải đảo doanh thu.

Đừng trừ thẳng vào doanh thu tháng sau mà không ghi nhận: sẽ làm tháng đó trông tệ hơn thực tế và mất dấu vết.

Truy vấn số dư doanh thu chờ

code
SELECT
  date_trunc('month', ngay)::date AS thang,
  SUM(total_amount / (service_end - service_start + 1))
    FILTER (WHERE ngay > CURRENT_DATE) AS doanh_thu_cho_cuoi_ky
FROM contracts c
CROSS JOIN LATERAL generate_series(c.service_start, c.service_end, INTERVAL '1 day') AS ngay
GROUP BY 1
ORDER BY 1;

Con số này phải khớp tài khoản doanh thu chờ trên bảng cân đối. Lệch nghĩa là có hợp đồng chưa được đưa vào hoặc bị tính hai lần.

Lỗi thường gặp

  • Ghi doanh thu khi xuất hóa đơn: dồn doanh thu vào tháng thu tiền.
  • Chia đều theo tháng cho hợp đồng giữa tháng: sai số lớn.
  • Bỏ sót hợp đồng huỷ: doanh thu chờ bị giữ mãi.
  • Ghi phí triển khai ngay: thổi phồng tháng đầu.
  • Không đối chiếu doanh thu chờ với bảng cân đối: sai lệch tích luỹ.
  • Trộn tiền mặt và dồn tích trong cùng báo cáo: số liệu không nhất quán.

Thực hành

  1. Lập bảng phân bổ 12 tháng cho hợp đồng 1.200.000.
  2. Tính doanh thu tháng 1 cho hợp đồng bắt đầu 16/1.
  3. Phân bổ hợp đồng có phí triển khai 240.000 theo cả hai cách.
  4. Viết truy vấn kiểm tra tổng phân bổ bằng giá trị hợp đồng.
  5. Tính số dư doanh thu chờ cuối kỳ.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Tháng đầu lãi đột biếnGhi toàn bộ hợp đồngPhân bổ theo kỳ
Doanh thu chờ không giảmHợp đồng huỷ chưa xử lýKiểm tra trạng thái hợp đồng
Tổng phân bổ lệchMất ngày cuốiKiểm tra generate_series
Tháng 1 cao gấp đôiChia đều thay vì theo ngàyPhân bổ theo ngày
Phí triển khai gây đột biếnGhi ngayXác định nghĩa vụ riêng biệt
Báo cáo khác sổ cáiKhông đối chiếu doanh thu chờĐối chiếu hằng tháng

Tóm tắt

  • Dồn tích ghi doanh thu theo nghĩa vụ, không theo tiền thu.
  • Thuê bao phải phân bổ theo kỳ; giữa tháng thì phân bổ theo ngày.
  • Doanh thu chờ = tiền đã thu chưa ghi doanh thu.
  • Phí triển khai ghi ngay hoặc phân bổ tuỳ bản chất nghĩa vụ.
  • Luôn đối chiếu doanh thu chờ với bảng cân đối.

Use ← → to move between lessons