Exchange valt buiten deze API/CLI-release. Eventuele historische Exchange-voorbeelden in deze gids zijn niet beschikbaar; dit zegt niets over bestaande portaalfuncties. Zie het [actuele releasebereik](/developers/guides/release-scope?lang=nl).

# Standaardmarges en catalogusprijzen beoordelen

Portal, API en CLI gebruiken hetzelfde prijsbeleid voor **Domains, Exchange, Spam, Hosting en SSL**. Een actuele interne menselijke beheerder met recente passkeyverificatie is vereist. Een serviceverbinding kan dit beleid niet wijzigen. De API vraagt `admin:read` of `admin:write`; de geselecteerde administratiecontext is het eigen goedgekeurde beheerbedrijf.

Deze handeling wijzigt alleen het standaardbeleid en de expliciet geselecteerde toekomstige catalogusprijzen. Bestaande abonnementen, facturen en afzonderlijke resellerprijzen blijven behouden. Er wordt niets bij een leverancier gewijzigd. Hosting-packagebeheer blijft zijn eigen API; SSL krijgt hiermee uitsluitend een prijsbeleid, geen nieuwe product- of bestel-API.

## Invloed kiezen

| `apply_to` | Invloed |
| --- | --- |
| `none` | Alleen de nieuwe standaardmarge en eventuele beleidsopties opslaan |
| `following` | Alleen producten die zowel de servergelezen oude standaardmarge als de berekende oude verkoopprijs volgen |
| `all` | Alle niet-vastgezette catalogusprijzen opnieuw berekenen, inclusief handmatige afwijkingen |

Een vast prijsproduct (`fixedPrice:Y`) blijft in alle vijf modules behouden, ook met `all`. Bij `following` blijven afwijkende marges en handmatig ingestelde verkoopprijzen behouden. De client levert nooit een vertrouwde oude marge aan: de server leest en vergrendelt het huidige beleid en de producten zelf.

De compatibiliteitsoptie `apply_to_all:false` betekent `none`; `true` betekent `all`. Combineer deze optie nooit met `apply_to`. Zonder beide opties verandert alleen het beleid. De native pagina vraagt steeds een expliciete keuze.

## Portal

Open `/products/pricing-policy/domains` (of `exchange`, `spam`, `hosting`, `ssl`) via de margeknop in de module. Lees eerst het huidige beleid en verifieer je passkey. Kies marge, invloed en afronding en gebruik **Invloed eerst beoordelen**. Controleer het totale aantal producten, de te wijzigen producten en de behouden vaste en handmatige prijzen. Bevestig daarna zelf de wijziging.

Een gewijzigde invoer maakt de beoordeling ongeldig. Een verlopen verificatie vraagt opnieuw beoordelen. Een onzekere response blokkeert automatisch opnieuw opslaan; herlaad en lees het huidige beleid voordat je een afzonderlijke nieuwe wijziging goedkeurt. De oude versieloze `currentDefaultMargin`/`newDefaultMargin`-POST wordt geweigerd.

## API

Paden beginnen met `/api/v1/accounts/{administratiecontext}`:

- `GET /admin/{area}/pricing-policy` leest het huidige beleid, `product_count`, `version` en dezelfde ETag.
- `PUT /admin/{area}/pricing-policy` vereist de huidige `If-Match` en een expliciete JSON-body. Een echte wijziging vereist daarnaast een duurzame `Idempotency-Key`; een dry-run maakt geen intentiesleutel aan.

```json
{"margin":"25.0000","apply_to":"following","rounding":"cents"}
```

`margin` is niet-negatief en heeft maximaal vier decimalen, tot `9999.9999`. `rounding` is `none`, `cents`, `whole` of `charm`; de opgeslagen catalogusverkoopprijs heeft steeds twee decimalen. De berekening gebruikt vaste gehele eenheden voor vier kost- en margedecimalen, zonder binaire floatberekening.

De optionele booleans `auto_update_sell_price`, `auto_create_products` en `auto_enable_products` wijzigen uitsluitend de opgeslagen bestaande synchronisatievoorkeuren. Weggelaten opties blijven behouden. Deze aanvraag voert zelf geen leverancierssynchronisatie uit.

`dry_run:true` controleert dezelfde huidige bevoegdheden en versie, maar bewaart geen wijziging, audit, operatie of leveranciersactie. `data.plan.reviewed_version` is de oorspronkelijke beoordeelde versie; `product_count` is het totale aantal producten. `updated_products`, `fixed_products_preserved` en `manual_products_preserved` beschrijven de invloed. De echte response bevat dezelfde beoordelingsbinding plus de nieuwe actuele `version`.

Een gewijzigde versie geeft 412; een ontbrekende versie 428. Lees bij een versieconflict opnieuw en beoordeel de nieuwe aantallen. Maak bij een onzekere response geen nieuwe idempotentiesleutel om dezelfde oorspronkelijke wijziging blind opnieuw uit te voeren. Onderzoek het huidige beleid en de oorspronkelijke operatie.

## CLI en AI-agents

```sh
binadit admin hosting pricing-policy get --account 1
binadit admin hosting pricing-policy update --account 1 --version '<version uit get>' \
  --set margin=25 --set apply_to=following --dry-run
binadit admin hosting pricing-policy update --account 1 --version '<dezelfde beoordeelde version>' \
  --set margin=25 --set apply_to=following --yes
```

Vervang `hosting` door `domains`, `exchange`, `spam` of `ssl`. Een JSON-bestand kan via `--from-file beleid.json` of stdin (`-`) worden aangeleverd. De CLI toont uitsluitend het vaste beleid en de gevalideerde aantallen; onbekende leveranciersvelden worden niet afgedrukt. Een onzekere of tegenstrijdige response behoudt de lokale oorspronkelijke intentiesleutel.

Een agent toont module, oude en nieuwe marge, invloed, afronding en aantallen vóór bevestiging. `all` is een bewuste keuze om handmatige catalogusprijzen te vervangen en mag niet uit `following` worden afgeleid. `--yes` vervangt uitsluitend de lokale interactieve bevestiging, nooit serverrechten, passkeyverificatie of een actuele versie.

## Grenzen en concurrentie

Een beoordeling ondersteunt maximaal 5.000 producten per module. Productmetadata is beperkt tot 64 KiB per details-/beschrijvingsveld en samen 8 MiB. Een grotere of beschadigde catalogus vraagt expliciet onderzoek; er wordt geen niet-bestaande batchroute beloofd. Huidige productie heeft 2.060 domeinproducten en past binnen deze grens.

Actuele SQL-vergrendelingen beschermen dezelfde regel en productselectie die de versie vormen. Een lopende Hosting-pakketrevisie blokkeert een prijsherberekening totdat die is afgerond of gereconcilieerd. De laatste bevoegdheids- en klokcontrole volgt na alle prijs-, audit- en operatie-updates: een verlopen goedkeuring publiceert geen halve wijziging.
