Architecture
webme-gateway-fee-exporter.php registers a simple autoloader and boots WebMe\GatewayFeeExporter\Plugin on plugins_loaded.
includes/Plugin.php is the composition root:
- aborts to admin notice when WooCommerce is missing
- instantiates Stripe and PayPal resolvers
- wires
OrderQueryBuilder,ExportRowFactory, andCsvExporter - registers admin page and preset controller hooks
Request flow
Admin screen
includes/Admin/ExportPage.php
- registers submenu under WooCommerce
- sanitizes
$_GETfilters - renders preview, aggregate totals, provider coverage, and missing-fee report
Downloads
Admin-post actions:
webme_gfe_downloadwebme_gfe_manifest
Controls:
check_admin_referer()on both download actionscurrent_user_can( 'manage_woocommerce' )in page render and exporter methods
Presets
includes/Admin/PresetController.php
webme_gfe_save_presetwebme_gfe_delete_preset
Controls:
- shared
authorize()method - preset values sanitized before persistence into
WEBME_GFE_PRESETS_OPTION
Export schema
ExportRowFactory::columns() returns v2 schema fields:
- order identity and dates
- payment method details
- transaction ID and source
- currency, gross, fee, net
- fee/net source keys
- gateway provider/plugin
- resolver status and notes
Resolver behavior
Stripe resolver
includes/Gateways/StripeFeeResolver.php
- supports methods containing
stripe,wcpay, orwoocommerce_payments - resolves transaction ID from order transaction ID first, then fallback meta keys
- returns
missing_transaction_id,missing_fee,ambiguous, orresolved
PayPal resolver
includes/Gateways/PayPalFeeResolver.php
- supports methods containing
paypalorppcp - follows same transaction-first, fee-meta-second pattern
- identifies plugin family as
paypal,paypal_payments, orpaypal_checkout
Notable implementation details
- CSV-injection hardening prefixes risky text values with
'. - Net amount is derived from gross minus fee when gateway net meta is absent.
- Export download now writes CSV rows through
SplTempFileObjectin memory before flushing output.
Extension points
Likely lowest-risk future extension: add new resolver classes implementing FeeResolverInterface, then register them in Plugin::boot().