Prepaid: move drawdown maths out of TimeProApiClient; MCP reports a drawdown for non-prepaid invoices
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 45/100
- Tipo di issue
- Refactoring
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- csharp
- Ambito
- api, backend-api-design, cli, testing-qa
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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 summaryrefuses a non-prepaid invoice (isPrepaid:false); the MCPGetPrepaidStatustool 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 = 0on a drawdown row is treated as "missing" and replaced with the invoice's rate, so a zero-rated row withSellTotal = 100gains $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/PrepaidStatusServicefor orchestration (invoice, allocated timesheets, credit notes) and a purePrepaidCalculatorfor the maths. - One
PrepaidStatusResult { found, isPrepaid, invoiceId, summary? }used byprepaid summary --jsonandGetPrepaidStatus. -
prepaid statusandGetPrepaidStatusPdfshare 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
ITimeProApiClientexcept 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.
- Lingua principale
- C#
- Stelle
- 3
- Fork
- 0
- Merge medio
- 11m
- PR unite (30g)
- 4
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di SSWConsulting/TimePro.Tools
-
Priority: P3 Type: Refactor
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
SSWConsulting/TimePro.Tools#101 ·
-
Priority: P3 Type: Refactor
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
SSWConsulting/TimePro.Tools#100 ·
-
Accounting: share product, SKU, rate, unbilled and recurring reads (unbilled paging is a no-op)ApertaPriority: P3 Type: Refactor
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
-
Priority: P2 Type: Refactor
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
-
Priority: P2 Type: Bug Type: Refactor
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
Tutte le issue di SSWConsulting/TimePro.Tools
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
unoplatform/uno.check#591 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
weaviate/csharp-client#378 ·
-
agentic-workflows automated testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
Azure-Samples/Legacy-Modernization-Agents#194 ·
I maintainer di solito rispondono entro 1 giorno
-
area-encryption area-security p1-recommended technical-debt
Difficoltà 2/5 Meno di un'ora Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
bug flaky small
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
hexide-io/HexIDE#1906 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno