Changeset 3305853
- Timestamp:
- 06/03/2025 02:34:27 PM (10 months ago)
- Location:
- bayarcash-wc
- Files:
-
- 378 added
- 3 edited
-
tags/4.3.9 (added)
-
tags/4.3.9/bayarcash-wc.php (added)
-
tags/4.3.9/includes (added)
-
tags/4.3.9/includes/admin (added)
-
tags/4.3.9/includes/admin/bayarcash-wc-checkout.js (added)
-
tags/4.3.9/includes/admin/bayarcash-wc-script.js (added)
-
tags/4.3.9/includes/admin/bayarcash-wc-style.css (added)
-
tags/4.3.9/includes/admin/checkout-fields.php (added)
-
tags/4.3.9/includes/admin/checkout.css (added)
-
tags/4.3.9/includes/admin/compatibility.php (added)
-
tags/4.3.9/includes/admin/img (added)
-
tags/4.3.9/includes/admin/img/boost (added)
-
tags/4.3.9/includes/admin/img/boost/boost-payflex.png (added)
-
tags/4.3.9/includes/admin/img/boost/index.html (added)
-
tags/4.3.9/includes/admin/img/directdebit (added)
-
tags/4.3.9/includes/admin/img/directdebit/direct-debit.png (added)
-
tags/4.3.9/includes/admin/img/directdebit/index.html (added)
-
tags/4.3.9/includes/admin/img/dobw (added)
-
tags/4.3.9/includes/admin/img/dobw/dobw.png (added)
-
tags/4.3.9/includes/admin/img/dobw/index.html (added)
-
tags/4.3.9/includes/admin/img/duitnowqr (added)
-
tags/4.3.9/includes/admin/img/duitnowqr/duitnow-qr.png (added)
-
tags/4.3.9/includes/admin/img/duitnowqr/index.html (added)
-
tags/4.3.9/includes/admin/img/fpx (added)
-
tags/4.3.9/includes/admin/img/fpx/fpx-all.png (added)
-
tags/4.3.9/includes/admin/img/fpx/fpx-online-banking.png (added)
-
tags/4.3.9/includes/admin/img/fpx/index.html (added)
-
tags/4.3.9/includes/admin/img/index.html (added)
-
tags/4.3.9/includes/admin/img/linecredit (added)
-
tags/4.3.9/includes/admin/img/linecredit/index.html (added)
-
tags/4.3.9/includes/admin/img/linecredit/visa-mastercard.png (added)
-
tags/4.3.9/includes/admin/img/nets (added)
-
tags/4.3.9/includes/admin/img/nets/index.html (added)
-
tags/4.3.9/includes/admin/img/nets/nets.png (added)
-
tags/4.3.9/includes/admin/img/qris (added)
-
tags/4.3.9/includes/admin/img/qris/index.html (added)
-
tags/4.3.9/includes/admin/img/qris/qris-ewallet.png (added)
-
tags/4.3.9/includes/admin/img/qris/qris-online-banking.png (added)
-
tags/4.3.9/includes/admin/img/spaylater (added)
-
tags/4.3.9/includes/admin/img/spaylater/index.html (added)
-
tags/4.3.9/includes/admin/img/spaylater/spaylater.png (added)
-
tags/4.3.9/includes/admin/index.html (added)
-
tags/4.3.9/includes/admin/js (added)
-
tags/4.3.9/includes/admin/js/axios.min.js (added)
-
tags/4.3.9/includes/admin/js/blocks (added)
-
tags/4.3.9/includes/admin/js/blocks/checkout-fees.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnow.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnowboost.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnownets.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnowqr.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnowqris.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnowqriswallet.js (added)
-
tags/4.3.9/includes/admin/js/blocks/duitnowshopee.js (added)
-
tags/4.3.9/includes/admin/js/blocks/fpx.js (added)
-
tags/4.3.9/includes/admin/js/blocks/index.html (added)
-
tags/4.3.9/includes/admin/js/blocks/linecredit.js (added)
-
tags/4.3.9/includes/admin/js/index.html (added)
-
tags/4.3.9/includes/admin/js/lodash.min.js (added)
-
tags/4.3.9/includes/admin/js/vuejs.js (added)
-
tags/4.3.9/includes/helpers.php (added)
-
tags/4.3.9/includes/index.html (added)
-
tags/4.3.9/includes/load.php (added)
-
tags/4.3.9/includes/src (added)
-
tags/4.3.9/includes/src/AdditionalTab.php (added)
-
tags/4.3.9/includes/src/AdminFormFields.php (added)
-
tags/4.3.9/includes/src/Bayarcash.php (added)
-
tags/4.3.9/includes/src/BayarcashCheckoutFee.php (added)
-
tags/4.3.9/includes/src/CronEvent.php (added)
-
tags/4.3.9/includes/src/CustomFieldFunnelKit.php (added)
-
tags/4.3.9/includes/src/CustomProductText.php (added)
-
tags/4.3.9/includes/src/DataRequest.php (added)
-
tags/4.3.9/includes/src/DataStore.php (added)
-
tags/4.3.9/includes/src/DependencyChecker.php (added)
-
tags/4.3.9/includes/src/Gateway (added)
-
tags/4.3.9/includes/src/Gateway.php (added)
-
tags/4.3.9/includes/src/Gateway/DirectDebitGateway.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowBoostPayFlex.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowGateway.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowNETS.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowQR.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowQRIS.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowQRISWALLET.php (added)
-
tags/4.3.9/includes/src/Gateway/DuitNowSPayLater.php (added)
-
tags/4.3.9/includes/src/Gateway/DynamicDuitNowGateway.php (added)
-
tags/4.3.9/includes/src/Gateway/DynamicFpxGateway.php (added)
-
tags/4.3.9/includes/src/Gateway/FpxGateway.php (added)
-
tags/4.3.9/includes/src/Gateway/LineCreditGateway.php (added)
-
tags/4.3.9/includes/src/Gateway/index.html (added)
-
tags/4.3.9/includes/src/OrderCancellationPrevention.php (added)
-
tags/4.3.9/includes/src/blocks (added)
-
tags/4.3.9/includes/src/blocks/class-checkout-fees-blocks-integration.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnow-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnowboost-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnownets-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnowqr-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnowqris-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnowqriswallet-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-duitnowshopee-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-fpx-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/class-wc-gateway-linecredit-blocks.php (added)
-
tags/4.3.9/includes/src/blocks/index.html (added)
-
tags/4.3.9/includes/src/index.html (added)
-
tags/4.3.9/includes/vendor (added)
-
tags/4.3.9/includes/vendor/autoload.php (added)
-
tags/4.3.9/includes/vendor/composer (added)
-
tags/4.3.9/includes/vendor/composer/ClassLoader.php (added)
-
tags/4.3.9/includes/vendor/composer/InstalledVersions.php (added)
-
tags/4.3.9/includes/vendor/composer/LICENSE (added)
-
tags/4.3.9/includes/vendor/composer/autoload_classmap.php (added)
-
tags/4.3.9/includes/vendor/composer/autoload_files.php (added)
-
tags/4.3.9/includes/vendor/composer/autoload_namespaces.php (added)
-
tags/4.3.9/includes/vendor/composer/autoload_psr4.php (added)
-
tags/4.3.9/includes/vendor/composer/autoload_real.php (added)
-
tags/4.3.9/includes/vendor/composer/autoload_static.php (added)
-
tags/4.3.9/includes/vendor/composer/index.html (added)
-
tags/4.3.9/includes/vendor/composer/installed.json (added)
-
tags/4.3.9/includes/vendor/composer/installed.php (added)
-
tags/4.3.9/includes/vendor/composer/platform_check.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/LICENSE (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/README.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/UPGRADING.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/composer.json (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/BodySummarizer.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Client.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/ClientInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/ClientTrait.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Cookie/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Exception/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Handler/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/HandlerStack.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/MessageFormatter.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Middleware.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Pool.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/RequestOptions.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/TransferStats.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/Utils.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/functions.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/functions_include.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/guzzle/src/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/LICENSE (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/README.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/composer.json (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/AggregateException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/CancellationException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/Coroutine.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/Create.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/Each.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/EachPromise.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/FulfilledPromise.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/Is.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/Promise.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/PromiseInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/PromisorInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/RejectedPromise.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/RejectionException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/TaskQueue.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/TaskQueueInterface.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/Utils.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/promises/src/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7 (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/LICENSE (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/README.md (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/composer.json (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/AppendStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/BufferStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/CachingStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/DroppingStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Exception (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Exception/index.html (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/FnStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Header.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/HttpFactory.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/InflateStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/LazyOpenStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/LimitStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Message.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/MessageTrait.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/MimeType.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/MultipartStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/NoSeekStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/PumpStream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Query.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Request.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Response.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Rfc7230.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/ServerRequest.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Stream.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/StreamWrapper.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/UploadedFile.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Uri.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/UriComparator.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/UriNormalizer.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/UriResolver.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/Utils.php (added)
-
tags/4.3.9/includes/vendor/guzzlehttp/psr7/src/index.html (added)
-
tags/4.3.9/includes/vendor/index.html (added)
-
tags/4.3.9/includes/vendor/nawawi (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption/LICENSE (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption/composer.json (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption/index.html (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption/src (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption/src/Base64Encryption.php (added)
-
tags/4.3.9/includes/vendor/nawawi/base64-encryption/src/index.html (added)
-
tags/4.3.9/includes/vendor/nawawi/index.html (added)
-
tags/4.3.9/includes/vendor/psr (added)
-
tags/4.3.9/includes/vendor/psr/http-client (added)
-
tags/4.3.9/includes/vendor/psr/http-client/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/psr/http-client/LICENSE (added)
-
tags/4.3.9/includes/vendor/psr/http-client/README.md (added)
-
tags/4.3.9/includes/vendor/psr/http-client/composer.json (added)
-
tags/4.3.9/includes/vendor/psr/http-client/index.html (added)
-
tags/4.3.9/includes/vendor/psr/http-client/src (added)
-
tags/4.3.9/includes/vendor/psr/http-client/src/ClientExceptionInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-client/src/ClientInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-client/src/NetworkExceptionInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-client/src/RequestExceptionInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-client/src/index.html (added)
-
tags/4.3.9/includes/vendor/psr/http-factory (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/LICENSE (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/README.md (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/composer.json (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/index.html (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/RequestFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/ResponseFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/StreamFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/UriFactoryInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-factory/src/index.html (added)
-
tags/4.3.9/includes/vendor/psr/http-message (added)
-
tags/4.3.9/includes/vendor/psr/http-message/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/psr/http-message/LICENSE (added)
-
tags/4.3.9/includes/vendor/psr/http-message/README.md (added)
-
tags/4.3.9/includes/vendor/psr/http-message/composer.json (added)
-
tags/4.3.9/includes/vendor/psr/http-message/docs (added)
-
tags/4.3.9/includes/vendor/psr/http-message/docs/PSR7-Interfaces.md (added)
-
tags/4.3.9/includes/vendor/psr/http-message/docs/PSR7-Usage.md (added)
-
tags/4.3.9/includes/vendor/psr/http-message/docs/index.html (added)
-
tags/4.3.9/includes/vendor/psr/http-message/index.html (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/MessageInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/RequestInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/ResponseInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/ServerRequestInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/StreamInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/UploadedFileInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/UriInterface.php (added)
-
tags/4.3.9/includes/vendor/psr/http-message/src/index.html (added)
-
tags/4.3.9/includes/vendor/psr/index.html (added)
-
tags/4.3.9/includes/vendor/ralouphie (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/LICENSE (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/README.md (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/composer.json (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/index.html (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/src (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/src/getallheaders.php (added)
-
tags/4.3.9/includes/vendor/ralouphie/getallheaders/src/index.html (added)
-
tags/4.3.9/includes/vendor/ralouphie/index.html (added)
-
tags/4.3.9/includes/vendor/symfony (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts/LICENSE (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts/README.md (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts/composer.json (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts/function.php (added)
-
tags/4.3.9/includes/vendor/symfony/deprecation-contracts/index.html (added)
-
tags/4.3.9/includes/vendor/symfony/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.gitignore (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/blade.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/codeception.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/laravel-idea-personal.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/laravel-idea.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/material_theme_project_new.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/phpspec.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/.idea/phpunit.xml (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/CHANGELOG.md (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/LICENSE (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/README.md (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/composer.json (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/composer.lock (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/config (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/config/bayarcash_sdk.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/config/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Actions (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Actions/CallbackVerifications.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Actions/ChecksumGenerator.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Actions/FpxDirectDebitPaymentIntent.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Actions/ManualBankTransfer.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Actions/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Bayarcash.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/BayarcashSdkServiceProvider.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/DuitNow (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/DuitNow/Dobw.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/DuitNow/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions/FailedActionException.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions/NotFoundException.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions/RateLimitExceededException.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions/TimeoutException.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions/ValidationException.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Exceptions/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Facades (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Facades/Bayarcash.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Facades/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Fpx.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/FpxDirectDebit.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/MakesHttpRequests.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/FpxBankResource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/FpxDirectDebitApplicationResource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/FpxDirectDebitResource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/PaymentIntentResource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/PortalResource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/Resource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/TransactionResource.php (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/Resources/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/bayarcash-php-sdk/src/index.html (added)
-
tags/4.3.9/includes/vendor/webimpian/index.html (added)
-
tags/4.3.9/index.html (added)
-
tags/4.3.9/languages (added)
-
tags/4.3.9/languages/bayarcash-wc.pot (added)
-
tags/4.3.9/languages/index.html (added)
-
tags/4.3.9/readme.txt (added)
-
trunk/bayarcash-wc.php (modified) (1 diff)
-
trunk/includes/src/Gateway/DirectDebitGateway.php (modified) (59 diffs)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
bayarcash-wc/trunk/bayarcash-wc.php
r3295064 r3305853 13 13 * Plugin Name: Bayarcash WC 14 14 * Plugin URI: https://bayarcash.com/ 15 * Version: 4.3. 815 * Version: 4.3.9 16 16 * Description: Accept payment from Malaysia. Bayarcash support FPX, Direct Debit, DuitNow OBW & DuitNow QR payment channels. 17 17 * Author: Web Impian -
bayarcash-wc/trunk/includes/src/Gateway/DirectDebitGateway.php
r3251032 r3305853 6 6 use JetBrains\PhpStorm\NoReturn; 7 7 use WC_Abstract_Order; 8 use WC_Data_Exception; 8 9 use WC_Order; 9 10 use WC_Order_Refund; … … 29 30 } 30 31 31 protected function get_payment_descriptions(): array {32 return [33 'description' => 'Recurring payment via online banking Maybank2u, CIMB Clicks, Bank Islam GO and more banks from Malaysia.',34 'method_description' => 'Allow customers to pay with Direct Debit.',35 ];36 }32 protected function get_payment_descriptions(): array { 33 return [ 34 'description' => 'Recurring payment via online banking Maybank2u, CIMB Clicks, Bank Islam GO and more banks from Malaysia.', 35 'method_description' => 'Allow customers to pay with Direct Debit.', 36 ]; 37 } 37 38 38 39 public function is_available(): bool … … 104 105 105 106 public function add_identification_fields($checkout): void { 106 // Check if subscriptions feature exists107 107 if (!$this->has_subscriptions()) { 108 108 return; 109 109 } 110 110 111 // Get DirectDebit settings and check if enabled112 111 $directdebit_settings = get_option('woocommerce_directdebit-wc_settings', []); 113 112 if (empty($directdebit_settings['enabled']) || $directdebit_settings['enabled'] !== 'yes') { … … 115 114 } 116 115 117 // Check if FunnelKit or FunnelKit Pro is active118 116 if (class_exists('WFFN_Core') || class_exists('WFFN_Pro_Core')) { 119 return; // Exit if either FunnelKit or FunnelKit Pro is active 120 } 121 122 // Register AJAX handlers 117 return; 118 } 119 123 120 add_action('wp_ajax_update_directdebit_fields', [$this, 'handle_directdebit_fields_update']); 124 121 add_action('wp_ajax_nopriv_update_directdebit_fields', [$this, 'handle_directdebit_fields_update']); 125 122 126 // Add JavaScript for payment method handling127 123 add_action('wp_footer', [$this, 'add_payment_method_script']); 128 124 … … 148 144 if (!is_checkout()) return; 149 145 ?> 150 <script type="text/javascript">146 <script type="text/javascript"> 151 147 jQuery(function($) { 152 // Function to toggle identification fields153 148 function toggleIdentificationFields(show) { 154 149 const fields = $('#bayarcash_identification_type, #bayarcash_identification_id').closest('.form-row'); … … 162 157 } 163 158 164 // Initial state check165 159 const initialPaymentMethod = $('input[name="payment_method"]:checked').val(); 166 160 toggleIdentificationFields(initialPaymentMethod === 'directdebit-wc'); 167 161 168 // Listen for payment method changes169 162 $('form.checkout').on('change', 'input[name="payment_method"]', function(e) { 170 163 const selectedMethod = $(this).val(); … … 191 184 }); 192 185 193 // Handle updated_checkout event194 186 $(document.body).on('updated_checkout', function() { 195 187 const currentMethod = $('input[name="payment_method"]:checked').val(); … … 198 190 }); 199 191 }); 200 </script>192 </script> 201 193 <?php 202 194 } … … 295 287 $settings = $this->get_payment_settings($this->id); 296 288 297 // Validate subscription period and interval298 289 $this->validate_subscription_period($order); 299 290 $this->validate_subscription_interval($order); 300 291 301 // Initialize the Bayarcash SDK302 292 $this->initialize_bayarcash_sdk($settings); 303 293 … … 318 308 $this->log('Detailed Validation Errors: ' . print_r($errors, true)); 319 309 320 // Properly extract error messages from the nested array structure321 310 $error_messages = []; 322 311 if (is_array($errors)) { … … 332 321 } 333 322 334 // If we successfully extracted error messages, use them; otherwise, use the general message335 323 if (!empty($error_messages)) { 336 324 $detailed_error = implode('. ', $error_messages); … … 348 336 wc_add_notice(__('Only weekly and monthly subscriptions are supported.', 'bayarcash-wc'), 'error'); 349 337 } else if (str_contains($e->getMessage(), 'Current billing schedule:')) { 350 // Pass through the full error message with the billing schedule details351 338 wc_add_notice($e->getMessage(), 'error'); 352 339 } else { … … 359 346 } 360 347 361 /**362 * @throws Exception363 */364 348 private function validate_subscription_period(\WC_Abstract_Order $order): void { 365 349 foreach ($order->get_items() as $item) { … … 374 358 } 375 359 376 /**377 * @throws Exception378 */379 360 private function validate_subscription_interval(\WC_Abstract_Order $order): void { 380 361 foreach ($order->get_items() as $item) { … … 397 378 } 398 379 } 399 /** 400 * @throws Exception 401 */ 380 402 381 private function validate_request(): void 403 382 { … … 416 395 } 417 396 418 /**419 * @return bool|WC_Order|WC_Order_Refund420 * @throws Exception421 */422 397 private function get_and_validate_order() 423 398 { … … 448 423 $data_dec_arr = explode(',', $this->data_dec->data); 449 424 450 // Get expiry date from subscription product451 425 $expiry_date = $this->get_subscription_expiry_date($order); 452 426 … … 468 442 ]; 469 443 470 // Add expiry_date if it exists471 444 if ($expiry_date) { 472 445 $args['expiry_date'] = $expiry_date->format('Y-m-d'); … … 480 453 } 481 454 482 /**483 * Get the subscription expiry date based on product settings484 *485 * @param WC_Abstract_Order $order486 *487 * @return ?DateTime488 */489 455 private function get_subscription_expiry_date( WC_Abstract_Order $order ): ?DateTime 490 456 { … … 496 462 } 497 463 498 // Get subscription length and period499 464 $length = \WC_Subscriptions_Product::get_length($product); 500 465 $period = \WC_Subscriptions_Product::get_period($product); 501 466 502 // If no length specified or invalid period, subscription doesn't expire503 467 if (empty($length) || !in_array($period, ['week', 'month'])) { 504 468 return null; 505 469 } 506 470 507 // Create DateTime object for current time508 471 $expiry_date = new DateTime(); 509 472 510 // Add subscription length based on period511 473 switch ($period) { 512 474 case 'week': … … 533 495 $product = $item->get_product(); 534 496 if ($product && $this->is_subscription_product($product)) { 535 // Use the fully qualified class name536 497 return \WC_Subscriptions_Product::get_period($product); 537 498 } … … 562 523 } 563 524 564 /**565 * @throws Exception566 */567 525 private function create_fpx_direct_debit_enrollment(array $args, array $settings): object 568 526 { … … 586 544 587 545 public function process_callback(): void { 588 //$this->log('Starting Direct Debit callback processing');546 $this->log('Starting Direct Debit callback processing'); 589 547 590 548 $json_data = file_get_contents('php://input'); 591 549 $data = json_decode($json_data, true); 592 550 593 //$this->log('Decoded JSON data: ' . print_r($data, true));594 595 551 if (is_array($data)) { 596 552 $_POST = array_merge($_POST, $data); … … 599 555 $response_data = $_POST; 600 556 601 if (isset($response_data['record_type']) ) {557 if (isset($response_data['record_type']) && $response_data['record_type'] !== 'transaction_receipt') { 602 558 $this->log('Processing record type: ' . $response_data['record_type']); 603 // $this->log('Decoded JSON data: ' . print_r($response_data, true)); 604 } 605 606 // Handle bank_approval record type 559 } 560 607 561 if (isset($response_data['record_type']) && $response_data['record_type'] === 'bank_approval') { 608 562 $this->handle_bank_approval($response_data); … … 610 564 } 611 565 612 // Handle transaction record type (recurring subscription)613 566 if (isset($response_data['record_type']) && $response_data['record_type'] === 'transaction') { 614 567 $this->handle_return_callback($response_data); 568 return; 569 } 570 571 if (isset($response_data['record_type']) && $response_data['record_type'] === 'authorization') { 572 $this->handle_authorization_callback($response_data); 615 573 return; 616 574 } … … 656 614 } 657 615 658 /**659 * @throws Exception660 */661 616 private function handle_bank_approval($data): void { 662 617 $this->log('Processing bank approval callback'); … … 694 649 $this->log('Added order note: ' . $note); 695 650 696 // Handle subscription cancellation697 651 if (isset($data['application_type']) && $data['application_type'] === '03') { 698 652 $this->log('Handling subscription cancellation approval'); 699 653 $this->handle_subscription_cancellation_approval($order, $data); 700 654 } else { 701 if ($approval_status === 5) { // Approved655 if ($approval_status === 5) { 702 656 $this->log('Order approved, processing subscription activation'); 703 657 $this->process_subscription_activation($order, $data); 704 } elseif ($approval_status === 6) { // Rejected658 } elseif ($approval_status === 6) { 705 659 $this->log('Order rejected, updating status to failed'); 706 660 $order->update_status('failed', 'Bank approval rejected.'); … … 709 663 } 710 664 711 // Store information for future reference712 665 $order->update_meta_data('bayarcash_mandate_id', $data['mandate_id']); 713 666 $order->update_meta_data('bayarcash_mandate_reference', $data['mandate_reference_number']); … … 724 677 foreach ($subscriptions as $subscription) { 725 678 try { 726 // Ensure the subscription can be activated727 679 if (!apply_filters('woocommerce_can_subscription_be_updated_to', true, $subscription, 'active')) { 728 680 throw new Exception('Subscription cannot be activated due to status restrictions.'); 729 681 } 730 682 731 // Update subscription status732 683 $subscription->update_status('active', 'Subscription activated after bank approval.'); 733 684 734 // Set payment method735 685 $subscription->set_payment_method($this); 736 686 737 // Set next payment date738 687 $next_payment = $subscription->calculate_date('next_payment'); 739 688 if ($next_payment) { … … 744 693 $subscription->save(); 745 694 746 // Trigger the activation action747 695 do_action('woocommerce_subscription_status_active', $subscription); 748 696 … … 754 702 } 755 703 756 // Complete the parent order 757 $order->update_status('completed', 'Order completed and subscription(s) activated after bank approval.'); 704 $order->update_status('completed', 'Order completed and subscription(s) activated after bank approval. Awaiting 1st deduction.'); 758 705 $order->payment_complete($data['mandate_reference_number']); 759 706 760 // Trigger the subscriptions created action761 707 do_action('subscriptions_created_for_order', $order); 762 708 } … … 790 736 } 791 737 738 private function handle_authorization_callback($data): void { 739 $this->log('Processing authorization callback'); 740 741 if (!isset($data['order_number'])) { 742 $this->log('Invalid authorization data: missing order_number'); 743 wp_send_json_error('Invalid authorization data: missing order_number', 400); 744 return; 745 } 746 747 $order_number = $data['order_number']; 748 $order = wc_get_order($order_number); 749 750 if (!$order) { 751 $this->log('Invalid order number in authorization: ' . $order_number); 752 wp_send_json_error('Invalid order number', 404); 753 return; 754 } 755 756 $status = isset($data['status']) ? intval($data['status']) : 0; 757 $status_description = $data['status_description'] ?? 'Unknown'; 758 759 $note = sprintf( 760 'Direct Debit Authorization received. Status: %s (%d). Transaction ID: %s, Amount: %s, Date: %s', 761 $status_description, 762 $status, 763 $data['transaction_id'] ?? 'N/A', 764 $data['amount'] ?? 'N/A', 765 $data['datetime'] ?? 'N/A' 766 ); 767 768 $order->add_order_note($note); 769 770 if ($status === 3) { 771 $this->log('Authorization approved for order: ' . $order_number); 772 } else { 773 $this->log('Authorization failed for order: ' . $order_number); 774 $order->update_status('failed', 'Direct Debit authorization failed.'); 775 } 776 777 $order->save(); 778 $this->log('Authorization callback processed successfully for Order No.: ' . $order_number); 779 780 wp_send_json_success('Authorization processed'); 781 } 782 792 783 private function handle_success_callback($order): void { 793 784 $this->log('Processing Direct Debit success callback'); … … 828 819 $this->log('Response data: ' . print_r($response_data, true)); 829 820 830 // Update only the parent order status 831 $order->update_status('on-hold', 'Direct Debit enrollment successful, awaiting first payment.'); 832 833 // If this is a subscription, add a note to the subscription 821 $order->update_status('on-hold', 'Direct Debit enrollment successful, Awaiting bank approval for mandate.'); 822 834 823 $subscriptions = wcs_get_subscriptions_for_order($order); 835 824 foreach ($subscriptions as $subscription) { … … 868 857 private function handle_return_callback($data): void { 869 858 $this->log('Processing Direct Debit return callback'); 870 //$this->log('Callback Return data: ' . print_r($data, true));871 859 872 860 if (!isset($data['record_type'])) { … … 888 876 private function handle_transaction_callback($data): void { 889 877 $this->log('Processing transaction callback'); 890 //$this->log('Transaction data: ' . print_r($data, true));891 878 892 879 $required_fields = ['mandate_reference_number', 'status', 'amount', 'transaction_id', 'datetime', 'cycle']; … … 900 887 901 888 $parent_order_id = $data['mandate_reference_number']; 902 $this->log('Parent order ID: ' . $parent_order_id); 889 $cycle = $data['cycle']; 890 $this->log('Parent order ID: ' . $parent_order_id . ', Cycle: ' . $cycle); 903 891 904 892 $parent_order = wc_get_order($parent_order_id); … … 927 915 if ($data['cycle'] == '1') { 928 916 $this->process_first_payment($subscription, $parent_order, $data); 917 918 $parent_order->update_meta_data('bayarcash_cycle_' . $cycle, $data['transaction_id']); 919 $parent_order->save(); 920 $this->log('Added cycle meta to parent order: bayarcash_cycle_' . $cycle); 929 921 } else { 930 922 $renewal_order = $this->get_or_create_renewal_order($subscription, $data); 931 923 $this->log('Using renewal order: ' . $renewal_order->get_id()); 932 924 925 if (in_array($renewal_order->get_status(), ['completed', 'failed'])) { 926 $this->log('Order already processed with status: ' . $renewal_order->get_status() . '. Skipping renewal process.'); 927 continue; 928 } 929 930 $renewal_order->update_meta_data('bayarcash_cycle', $cycle); 931 $renewal_order->update_meta_data('bayarcash_cycle_' . $cycle, $data['transaction_id']); 932 $renewal_order->save(); 933 $this->log('Added cycle meta to renewal order: bayarcash_cycle_' . $cycle); 934 933 935 if ($data['amount'] != $subscription->get_total()) { 934 936 $this->log('Amount mismatch. Expected: ' . $subscription->get_total() . ', Received: ' . $data['amount']); 935 // Decide how to handle this situation (e.g., partial payment, overpayment)936 937 } 937 938 938 if ($data['status'] == '3') { // Successful transaction939 if ($data['status'] == '3') { 939 940 $this->log('Processing successful renewal'); 940 941 $this->process_successful_renewal($subscription, $renewal_order, $data); … … 969 970 970 971 $order->add_order_note($note); 971 //$this->log('Added note to order ' . $order->get_id() . ': ' . $note);972 972 } 973 973 … … 975 975 $this->log('Processing first payment for subscription: ' . $subscription->get_id()); 976 976 977 // Set parent order details978 977 $parent_order->set_payment_method($this); 979 978 $parent_order->set_transaction_id($data['transaction_id']); … … 982 981 $this->add_transaction_note($parent_order, $data, true); 983 982 984 if ($data['status'] == '3') { // Successful transaction 985 // Complete the parent order and mark as 'completed' 983 if ($data['status'] == '3') { 986 984 $parent_order->payment_complete(); 987 985 $parent_order->update_status('completed'); … … 989 987 $this->log('Parent order payment completed, marked as completed, and saved. Order ID: ' . $parent_order->get_id()); 990 988 991 // Activate the subscription992 989 $subscription->update_status('active'); 993 990 $subscription->save(); … … 997 994 $this->log('Successful first payment processed for subscription: ' . $subscription->get_id()); 998 995 } else { 999 // Mark the parent order as failed1000 996 $parent_order->update_status('failed'); 1001 997 $parent_order->save(); 1002 998 $this->log('Parent order marked as failed. Order ID: ' . $parent_order->get_id()); 1003 999 1004 // Update subscription1005 1000 WC_Subscriptions_Manager::process_subscription_payment_failure_on_order($parent_order); 1006 1001 … … 1009 1004 } 1010 1005 1011 /**1012 * @throws \WC_Data_Exception1013 */1014 1006 private function get_or_create_renewal_order($subscription, $data) 1015 1007 { 1016 1008 $parent_order_id = $subscription->get_parent_id(); 1017 $this->log("Searching for renewal order. Subscription ID: {$subscription->get_id()}, Parent Order ID: {$parent_order_id}"); 1018 1019 $existing_orders = wc_get_orders(array( 1020 'type' => 'shop_order', 1021 'status' => array('pending'), 1022 'limit' => 1, 1023 'orderby' => 'date', 1024 'order' => 'DESC', 1025 'meta_query' => array( 1026 'relation' => 'AND', 1027 array( 1028 'key' => '_subscription_renewal', 1029 'value' => $parent_order_id, 1030 'compare' => '=', 1009 $subscription_id = $subscription->get_id(); 1010 1011 $cycle = $data['cycle']; 1012 $this->log("Searching for renewal order. Subscription ID: {$subscription->get_id()}, Parent Order ID: {$parent_order_id}, Cycle: {$cycle}"); 1013 1014 $hpos_enabled = $this->is_hpos_enabled(); 1015 1016 if ($hpos_enabled) { 1017 $existing_orders = wc_get_orders(array( 1018 'type' => 'shop_order', 1019 'status' => array('pending', 'processing', 'completed', 'failed'), 1020 'limit' => 1, 1021 'orderby' => 'date', 1022 'order' => 'DESC', 1023 'meta_query' => array( 1024 'relation' => 'AND', 1025 array( 1026 'key' => '_subscription_renewal', 1027 'value' => $subscription_id, 1028 'compare' => '=', 1029 ), 1030 array( 1031 'key' => 'bayarcash_cycle', 1032 'value' => $cycle, 1033 'compare' => '=', 1034 ), 1031 1035 ), 1032 array( 1033 'key' => '_subscription_renewal_subscription_id', 1034 'value' => $subscription->get_id(), 1035 'compare' => '=', 1036 )); 1037 } else { 1038 $posts = get_posts(array( 1039 'post_type' => 'shop_order', 1040 'post_status' => array('wc-pending', 'wc-processing', 'wc-completed', 'wc-failed'), 1041 'numberposts' => 1, 1042 'orderby' => 'date', 1043 'order' => 'DESC', 1044 'meta_query' => array( 1045 'relation' => 'AND', 1046 array( 1047 'key' => '_subscription_renewal', 1048 'value' => $subscription_id, 1049 'compare' => '=', 1050 ), 1051 array( 1052 'key' => 'bayarcash_cycle', 1053 'value' => $cycle, 1054 'compare' => '=', 1055 ), 1036 1056 ), 1037 ), 1038 )); 1057 )); 1058 1059 $existing_orders = array(); 1060 if (!empty($posts)) { 1061 foreach ($posts as $post) { 1062 $order = wc_get_order($post->ID); 1063 if ($order) { 1064 $existing_orders[] = $order; 1065 } 1066 } 1067 } 1068 } 1039 1069 1040 1070 if (!empty($existing_orders)) { 1041 1071 $renewal_order = reset($existing_orders); 1042 $this->log('Using existing renewal order: ' . $renewal_order->get_id()); 1043 1044 // Check if the order total matches the expected amount 1045 if (abs($renewal_order->get_total() - $data['amount']) > 0.01) { 1046 $this->log("Updating existing order total from {$renewal_order->get_total()} to {$data['amount']}"); 1072 $this->log('Found existing order for cycle ' . $cycle . ': ' . $renewal_order->get_id() . ' (Status: ' . $renewal_order->get_status() . ')'); 1073 1074 $renewal_meta = $renewal_order->get_meta('_subscription_renewal'); 1075 $order_cycle = $renewal_order->get_meta('bayarcash_cycle'); 1076 1077 if ($renewal_meta != $subscription_id || $order_cycle != $cycle) { 1078 $this->log('Found order is not a valid renewal order for this cycle, creating new one'); 1079 $renewal_order = wcs_create_renewal_order($subscription); 1080 $this->log('Created new renewal order: ' . $renewal_order->get_id()); 1081 1047 1082 $renewal_order->set_total($data['amount']); 1083 $renewal_order->update_meta_data('bayarcash_cycle', $cycle); 1048 1084 $renewal_order->save(); 1085 } else { 1086 if (abs($renewal_order->get_total() - $data['amount']) > 0.01) { 1087 $this->log("Updating existing order total from {$renewal_order->get_total()} to {$data['amount']}"); 1088 $renewal_order->set_total($data['amount']); 1089 $renewal_order->save(); 1090 } 1091 1092 if (in_array($renewal_order->get_status(), ['completed', 'failed'])) { 1093 $this->log('Order for cycle ' . $cycle . ' already processed with status: ' . $renewal_order->get_status()); 1094 return $renewal_order; 1095 } 1049 1096 } 1050 1097 } else { … … 1052 1099 $this->log('Created new renewal order: ' . $renewal_order->get_id()); 1053 1100 1054 // Set the order total1055 1101 $renewal_order->set_total($data['amount']); 1102 $renewal_order->update_meta_data('bayarcash_cycle', $cycle); 1056 1103 $renewal_order->save(); 1057 1104 } 1058 1105 1059 1106 return $renewal_order; 1107 } 1108 1109 private function is_hpos_enabled(): bool 1110 { 1111 if (class_exists('\Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController')) { 1112 try { 1113 return wc_get_container() 1114 ->get(\Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController::class) 1115 ->custom_orders_table_usage_is_enabled(); 1116 } catch (Exception $e) { 1117 $this->log('Error checking HPOS status: ' . $e->getMessage()); 1118 } 1119 } 1120 1121 return false; 1060 1122 } 1061 1123 … … 1063 1125 $this->log('Processing successful renewal for subscription: ' . $subscription->get_id()); 1064 1126 1065 // Set renewal order details1066 1127 $renewal_order->set_payment_method($this); 1067 1128 $renewal_order->set_transaction_id($data['transaction_id']); … … 1070 1131 $this->add_transaction_note($renewal_order, $data); 1071 1132 1072 // Complete the renewal order and mark as 'completed'1073 1133 $renewal_order->payment_complete(); 1074 1134 $renewal_order->update_status('completed'); … … 1076 1136 $this->log('Renewal order payment completed, marked as completed, and saved. Order ID: ' . $renewal_order->get_id()); 1077 1137 1078 // Use WC_Subscriptions_Manager to process the payment1079 1138 WC_Subscriptions_Manager::process_subscription_payments_on_order($renewal_order); 1080 1139 … … 1085 1144 $this->log('Processing failed renewal for subscription: ' . $subscription->get_id()); 1086 1145 1087 // Set renewal order details1088 1146 $renewal_order->set_payment_method($this); 1089 1147 $renewal_order->set_transaction_id($data['transaction_id']); … … 1091 1149 $this->add_transaction_note($renewal_order, $data); 1092 1150 1093 // Use WC_Subscriptions_Manager to process the failed payment1094 1151 WC_Subscriptions_Manager::process_subscription_payment_failure_on_order($renewal_order); 1095 1152 … … 1149 1206 } 1150 1207 1151 // Get the parent order1152 1208 $parent_order_id = $subscription->get_parent_id(); 1153 1209 $parent_order = wc_get_order($parent_order_id); … … 1157 1213 } 1158 1214 1159 // Get the mandate ID from the parent order's metadata1160 1215 $mandate_id = $parent_order->get_meta('bayarcash_mandate_id'); 1161 1216 … … 1174 1229 $this->log('Cancellation request successful. Redirect URL: ' . $response->url); 1175 1230 1176 // Store cancellation details1177 1231 $cancellation_data = [ 1178 1232 'order_number' => $parent_order_id, … … 1186 1240 ]; 1187 1241 1188 // Store cancellation data in subscription meta1189 1242 $subscription->update_meta_data('bayarcash_cancellation_data', $cancellation_data); 1190 1243 $subscription->save(); 1191 1244 1192 // Determine if the current user is an admin1193 1245 $is_admin = current_user_can('manage_options'); 1194 1246 1195 // Check if we're on the subscriptions or view-subscription page1196 1247 $current_url = home_url(add_query_arg(array(), $GLOBALS['wp']->request)); 1197 1248 $is_subscriptions_page = ( str_contains( $current_url, '/my-account/subscriptions' ) ); 1198 1249 $is_view_subscription_page = ( str_contains( $current_url, '/my-account/view-subscription' ) ); 1199 1250 1200 // Treat admin as normal user if on subscriptions or view-subscription page1201 1251 $treat_as_user = !$is_admin || $is_subscriptions_page || $is_view_subscription_page; 1202 1252 1203 // Handle AJAX requests or treat as AJAX for specific pages1204 1253 if (wp_doing_ajax() || $treat_as_user) { 1205 1254 wp_send_json_success(['redirect_url' => $response->url]); 1206 1255 } 1207 // Handle non-AJAX requests for admin1208 1256 else { 1209 // For admin users, set a transient to show an admin notice1210 1257 set_transient('bayarcash_admin_notice', 'Cancellation request sent successfully.', 45); 1211 1258 wp_safe_redirect(wp_get_referer() ?: admin_url()); … … 1221 1268 wp_send_json_error(['message' => $error_message]); 1222 1269 } else { 1223 // For admin users, set a transient to show an admin notice1224 1270 set_transient('bayarcash_admin_notice', $error_message, 45); 1225 1271 wp_safe_redirect(wp_get_referer() ?: admin_url()); … … 1236 1282 } 1237 1283 } 1238 /** 1239 * @throws Exception 1240 */ 1284 1241 1285 private function handle_subscription_cancellation_approval($order, $data): void { 1242 1286 $this->log('Handling subscription cancellation approval for Order No.: ' . $order->get_id()); 1243 1287 1244 // Find the related subscription1245 1288 $subscriptions = wcs_get_subscriptions_for_order($order, array('order_type' => 'any')); 1246 1289 … … 1253 1296 $this->log('Processing cancellation for Subscription ID: ' . $subscription->get_id()); 1254 1297 1255 // Check if the subscription is already cancelled1256 1298 if ($subscription->get_status() === 'cancelled') { 1257 1299 $this->log('Subscription ' . $subscription->get_id() . ' is already cancelled.'); … … 1259 1301 } 1260 1302 1261 // Prepare the cancellation note1262 1303 $note = sprintf( 1263 1304 'Subscription cancelled. Bank approval received. Mandate ID: %s, Reference: %s, Date: %s', … … 1267 1308 ); 1268 1309 1269 // Add the note to the subscription1270 1310 $subscription->add_order_note($note); 1271 1311 1272 // Update subscription status1273 1312 $subscription->update_status('cancelled', 'Subscription cancelled due to bank approval of cancellation request.'); 1274 1313 1275 // Remove scheduled actions for this subscription1276 1314 WC_Subscriptions_Manager::remove_all_subscription_scheduled_actions($subscription->get_id()); 1277 1315 1278 // Trigger the cancellation action1279 1316 do_action('woocommerce_subscription_status_cancelled', $subscription); 1280 1317 1281 // Force save the subscription to ensure notes are persisted1282 1318 $subscription->save(); 1283 1319 … … 1285 1321 } 1286 1322 1287 // Update the parent order status if necessary1288 1323 if ($order->get_status() !== 'cancelled') { 1289 1324 $order->update_status('cancelled', 'Order cancelled due to subscription cancellation approval.'); -
bayarcash-wc/trunk/readme.txt
r3295064 r3305853 5 5 Tested up to: 6.8 6 6 Requires PHP: 7.4 7 Stable tag: 4.3. 87 Stable tag: 4.3.9 8 8 License: GPLv3 9 9 License URI: https://www.gnu.org/licenses/gpl-3.0.txt … … 89 89 == Changelog == 90 90 91 = 4.3.9 = 92 * Fixed Direct Debit not detecting 2nd, 3rd, and subsequent deductions 93 * Improved duplicate processing prevention for renewal orders 94 91 95 = 4.3.8 = 92 96 * Fixed Vue.js compatibility issues with certain themes and plugins
Note: See TracChangeset
for help on using the changeset viewer.