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ệm | Nghĩa |
|---|---|
| Nghĩa vụ thực hiện | Việ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ểm | Tiền mặt | Doanh thu ghi nhận | Doanh thu chờ |
|---|---|---|---|
| 1/1 | +1.200.000 | 0 | 1.200.000 |
| 31/1 | 0 | 100.000 | 1.100.000 |
| 28/2 | 0 | 100.000 | 1.000.000 |
| 31/12 | 0 | 100.000 | 0 |
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.
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.
Tổng hợp đồng = 240.000 + 1.200.000 = 1.440.000
Doanh thu tháng = 1.440.000 / 12 = 120.000Cù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ờ
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
- Lập bảng phân bổ 12 tháng cho hợp đồng 1.200.000.
- Tính doanh thu tháng 1 cho hợp đồng bắt đầu 16/1.
- Phân bổ hợp đồng có phí triển khai 240.000 theo cả hai cách.
- Viết truy vấn kiểm tra tổng phân bổ bằng giá trị hợp đồng.
- Tính số dư doanh thu chờ cuối kỳ.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Tháng đầu lãi đột biến | Ghi toàn bộ hợp đồng | Phân bổ theo kỳ |
| Doanh thu chờ không giảm | Hợp đồng huỷ chưa xử lý | Kiểm tra trạng thái hợp đồng |
| Tổng phân bổ lệch | Mất ngày cuối | Kiểm tra generate_series |
| Tháng 1 cao gấp đôi | Chia đều thay vì theo ngày | Phân bổ theo ngày |
| Phí triển khai gây đột biến | Ghi ngay | Xác định nghĩa vụ riêng biệt |
| Báo cáo khác sổ cái | Khô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.
Dùng ← → để chuyển bài