Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Prepaid: move drawdown maths out of TimeProApiClient; MCP reports a drawdown for non-prepaid invoices

Đang mở
#93 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức phù hợp với người mới
45/100
Loại issue
Tái cấu trúc
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
csharp

Hướng nghiên cứu

Start by reading TimeProApiClient and the WeekCoverageService, CheckEvaluator, and WeekCheckResult pattern. Trace PrepaidStatusService, PrepaidCalculator, PrepaidStatusResult, and both prepaid CLI and MCP surfaces, then run the existing WireMock coverage and add the zero-rate unit test. Done means the prepaid golden remains byte-identical, both surfaces share the result and fetch, and the contract decision for non-prepaid MCP output is resolved.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Priority: P1 Type: Bug Type: Refactor

Why

Prepaid is the one place where finance rules live in the HTTP client. TimeProApiClient.GetPrepaidStatusSummaryAsync / BuildPrepaidStatusSummary hold the BPP filter, tax-rate normalisation, 3-dp rounding and the credit-note apportioning. Both surfaces call it, but the logic around it has already drifted:

  • prepaid summary refuses a non-prepaid invoice (isPrepaid:false); the MCP GetPrepaidStatus tool has no such gate and returns a full drawdown for an ordinary invoice. An agent asked about unspent prepaid credit reports credit that does not exist.
  • An explicit SalesTaxPct = 0 on a drawdown row is treated as "missing" and replaced with the invoice's rate, so a zero-rated row with SellTotal = 100 gains $10 GST. The fallback tests the normalised value against zero instead of testing for null.
  • The maths can only be tested through WireMock.

Migrate

  • Features/Prepaid/PrepaidStatusService for orchestration (invoice, allocated timesheets, credit notes) and a pure PrepaidCalculator for the maths.
  • One PrepaidStatusResult { found, isPrepaid, invoiceId, summary? } used by prepaid summary --json and GetPrepaidStatus.
  • prepaid status and GetPrepaidStatusPdf share the fetch; the adapters only choose file vs base64.
  • Fix the zero-rate fallback (null means missing, zero means zero) with a unit test.
  • Remove the prepaid members from ITimeProApiClient except the raw endpoint calls.

How

Follow WeekCoverageService (fetch) + CheckEvaluator (pure, unit-tested rules) + WeekCheckResult (one document for both surfaces).

Contract

The populated golden (a prepaid invoice) should stay byte-identical. The non-prepaid MCP answer changes shape; ship the gate in a patch only if the old shape can be kept, otherwise hold it for 0.4.0.

Part of #38.

Ngôn ngữ chính
C#
Star
3
Fork
0
Merge trung bình
11 phút
Pull request đã merge (30 ngày)
4

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

  • Không có Dockerfile hay tệp Docker Compose
  • Không có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của SSWConsulting/TimePro.Tools

Tất cả issue của SSWConsulting/TimePro.Tools

Issue tương tự

Thêm issue về C#

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.