From 9151384ac25965b866b63c62c5c73ddd30850ce6 Mon Sep 17 00:00:00 2001 From: Florian Bender Date: Tue, 14 Jul 2026 08:55:53 +0200 Subject: [PATCH] feat: support captureDelay --- README.md | 6 ++++++ cmd/payments.go | 26 +++++++++++++++++++------- skills/mollie-cli/SKILL.md | 8 ++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 890e77d..51c9fde 100644 --- a/README.md +++ b/README.md @@ -327,6 +327,12 @@ mollie payments create ... \ mollie payments create ... --metadata '{"order_id": "42", "source": "cli"}' ``` +`--capture-delay` delays the automatic capture of an authorized payment. Only `"... hours"` and `"... days"` are accepted (max 7 days), and it requires `--capture-mode automatic`: + +```bash +mollie payments create ... --capture-mode automatic --capture-delay "8 hours" +``` + ### `refunds` — refunds ``` diff --git a/cmd/payments.go b/cmd/payments.go index 20c4151..0e0643a 100644 --- a/cmd/payments.go +++ b/cmd/payments.go @@ -54,6 +54,9 @@ var ( // terminal ID flag payCreateTerminalID string + // capture delay flag + payCreateCaptureDelay string + // --with-lines flags payCreateWithLines bool payCreateWithDiscount bool @@ -108,7 +111,11 @@ var paymentsCreateCmd = &cobra.Command{ Add --with-discount to append a ~10% discount line; requires --with-lines. ---with-billing / --with-shipping attach a Dutch test address; override fields with --billing-* / --shipping-*.`, +--with-billing / --with-shipping attach a Dutch test address; override fields with --billing-* / --shipping-*. + +--capture-delay delays the automatic capture of an authorized payment by the given +duration, e.g. --capture-delay "8 hours" or --capture-delay "2 days". Only "... hours" +and "... days" are accepted (max 7 days); requires --capture-mode automatic.`, RunE: runPaymentsCreate, Annotations: map[string]string{"usesDefaults": "true"}, } @@ -154,6 +161,7 @@ func init() { paymentsCreateCmd.Flags().StringVar(&payCreateCaptureMode, "capture-mode", "", "Capture mode: automatic or manual") paymentsCreateCmd.Flags().StringVar(&payCreateLocale, "locale", "", "Locale for the payment, e.g. en_US, nl_NL (determines checkout language)") paymentsCreateCmd.Flags().StringVar(&payCreateTerminalID, "terminal-id", "", "Terminal ID for point-of-sale payments") + paymentsCreateCmd.Flags().StringVar(&payCreateCaptureDelay, "capture-delay", "", "Delay before auto-capturing an authorized payment, e.g. \"8 hours\", \"2 days\" (max 7 days; requires --capture-mode automatic)") // --with-lines flags paymentsCreateCmd.Flags().BoolVar(&payCreateWithLines, "with-lines", false, "Auto-generate order lines summing to --amount (always 2 item lines + 1 shipping line)") @@ -256,6 +264,9 @@ func runPaymentsCreate(cmd *cobra.Command, _ []string) error { if v, ok := input.Str(jsonInput, "terminalId"); ok && !cmd.Flags().Changed("terminal-id") { payCreateTerminalID = v } + if v, ok := input.Str(jsonInput, "captureDelay"); ok && !cmd.Flags().Changed("capture-delay") { + payCreateCaptureDelay = v + } if v, ok := input.RawJSON(jsonInput, "metadata"); ok && !cmd.Flags().Changed("metadata") { payCreateMetadata = v } @@ -323,6 +334,7 @@ func runPaymentsCreate(cmd *cobra.Command, _ []string) error { req.Locale = nil req.Metadata = nil req.TerminalID = nil + req.CaptureDelay = nil if payCreateWebhookURL != "" { req.WebhookURL = &payCreateWebhookURL @@ -350,6 +362,9 @@ func runPaymentsCreate(cmd *cobra.Command, _ []string) error { if payCreateTerminalID != "" { req.TerminalID = &payCreateTerminalID } + if payCreateCaptureDelay != "" { + req.CaptureDelay = &payCreateCaptureDelay + } if payCreateMetadata != "" { meta, err := parseMetadata(payCreateMetadata) if err != nil { @@ -946,9 +961,9 @@ func parseMetadata(raw string) (components.Metadata, error) { // from being forwarded. // // Fields that have a direct CLI flag (amount, currency, description, -// redirectUrl, webhookUrl, method, sequenceType, captureMode, locale, -// metadata, customerId) are applied separately by the caller and are not -// touched here. +// redirectUrl, webhookUrl, method, sequenceType, captureMode, captureDelay, +// locale, metadata, customerId, terminalId) are applied separately by the +// caller and are not touched here. func seedPassThroughFields(req *components.PaymentRequest, m map[string]json.RawMessage) { // ── Addresses ──────────────────────────────────────────────────────────── if raw, ok := m["billingAddress"]; ok { @@ -993,9 +1008,6 @@ func seedPassThroughFields(req *components.PaymentRequest, m map[string]json.Raw if raw, ok := m["restrictPaymentMethodsToCountry"]; ok { strField(raw, &req.RestrictPaymentMethodsToCountry) } - if raw, ok := m["captureDelay"]; ok { - strField(raw, &req.CaptureDelay) - } if raw, ok := m["mandateId"]; ok { strField(raw, &req.MandateID) } diff --git a/skills/mollie-cli/SKILL.md b/skills/mollie-cli/SKILL.md index b6f7e45..e2d77bf 100644 --- a/skills/mollie-cli/SKILL.md +++ b/skills/mollie-cli/SKILL.md @@ -82,6 +82,14 @@ mollie payments create --amount 25.00 --currency EUR \ Optional line tuning flags: `--lines-vat-rate 21.00` (default), `--lines-shipping-amount 4.99` (default) +### Create a payment with delayed capture +```bash +# --capture-delay requires --capture-mode automatic; only "... hours" / "... days" (max 7 days) +mollie payments create --amount 25.00 --currency EUR \ + --description "Order" --redirect-url https://example.com/return \ + --capture-mode automatic --capture-delay "8 hours" +``` + ### Refund a payment ```bash # Full refund (payment-id is a positional argument):