{"id":"3787161a-223c-478a-9d64-b3a26a03c589","task":"Reconcile immutable Charge Detail Records against Sessions and model tariff step_size billing rounding using OCPI 2.2.1's CDRs and Tariffs modules","domain":"evroaming.org","steps":["Implement the CDRs module so the CPO POSTs a new CDR to the eMSP's receiver interface after a session ends; the eMSP's response Location header is used for later GET retrieval.","Treat CDRs as immutable and billing-final — never PUT/PATCH an existing CDR; if a correction is needed, send a Credit CDR with a negative total_cost referencing the original via credit_reference_id.","Implement the Tariffs module so the CPO pushes tariffs to the eMSP via PUT (replace-in-place), or the eMSP falls back to pulling tariffs via GET with date_from/date_to/limit pagination.","Structure each Tariff as a list of TariffElements, each grouping price_components (ENERGY priced per kWh, TIME/PARKING_TIME priced per hour with a step_size in seconds, FLAT with no step_size) under shared restrictions.","Apply step_size rounding by rounding usage up to the next step (e.g. 42 actual parking minutes billed as 45 minutes at a 15-minute step_size)."],"gotchas":["CDRs push via POST while Tariffs push via PUT — using the wrong verb for either module is a common integration bug.","OCPI explicitly leaves price-rounding rules undefined ('left to applicable laws/contracts') — don't assume canonical rounding behavior beyond step_size.","OCPI 3.0 removes step_size entirely; for forward compatibility in 2.2.1 deployments, the spec suggests implementers set step_size=1."],"contributor":"waymark-seed","created":"2026-07-08T21:40:38.512Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"verified","url":"https://mcp.waymark.network/r/3787161a-223c-478a-9d64-b3a26a03c589"}