55use Illuminate \Contracts \Events \Dispatcher ;
66use Kaninstein \MultiAcquirerCheckout \Application \DTOs \CheckoutResult ;
77use Kaninstein \MultiAcquirerCheckout \Application \DTOs \PaymentRequest ;
8- use Kaninstein \MultiAcquirerCheckout \Domain \Fee \Services \ FeeCalculator ;
8+ use Kaninstein \MultiAcquirerCheckout \Domain \Fee \Contracts \ FeeCalculatorInterface ;
99use Kaninstein \MultiAcquirerCheckout \Domain \Payment \Entities \Payment ;
10+ use Kaninstein \MultiAcquirerCheckout \Domain \Validation \ValidationContexts ;
11+ use Kaninstein \MultiAcquirerCheckout \Domain \Validation \ValidationManager ;
1012use Kaninstein \MultiAcquirerCheckout \Infrastructure \Repositories \Contracts \PaymentRepositoryInterface ;
13+ use Kaninstein \MultiAcquirerCheckout \Support \Hooks \HookManager ;
14+ use Kaninstein \MultiAcquirerCheckout \Support \Hooks \HookPoints ;
1115use Kaninstein \MultiAcquirerCheckout \Support \Pipelines \GatewayPipeline ;
1216
1317class CheckoutService
1418{
1519 public function __construct (
1620 private readonly GatewayPipeline $ pipeline ,
17- private readonly FeeCalculator $ feeCalculator ,
21+ private readonly FeeCalculatorInterface $ feeCalculator ,
1822 private readonly PaymentRepositoryInterface $ payments ,
1923 private readonly Dispatcher $ events ,
24+ private readonly HookManager $ hooks ,
25+ private readonly ValidationManager $ validator ,
2026 ) {}
2127
2228 public function process (PaymentRequest $ request ): CheckoutResult
2329 {
30+ // Hook: Before payment
31+ $ request = $ this ->hooks ->execute (HookPoints::BEFORE_PAYMENT , $ request );
32+
33+ // Validation: Payment request
34+ if (config ('multi-acquirer.validation.enabled ' , true )) {
35+ $ validationResult = $ this ->validator ->validate (ValidationContexts::PAYMENT_REQUEST , $ request );
36+
37+ if (!$ validationResult ->isValid ) {
38+ throw new \InvalidArgumentException (
39+ 'Payment validation failed: ' . implode (', ' , $ validationResult ->getAllErrors ())
40+ );
41+ }
42+ }
43+
44+ // Hook: Before validation
45+ $ request = $ this ->hooks ->execute (HookPoints::BEFORE_VALIDATION , $ request );
46+
47+ // Hook: After validation
48+ $ request = $ this ->hooks ->execute (HookPoints::AFTER_VALIDATION , $ request );
49+
2450 $ payment = Payment::create (
2551 amount: $ request ->amount ,
2652 method: $ request ->paymentMethod ,
@@ -30,19 +56,32 @@ public function process(PaymentRequest $request): CheckoutResult
3056
3157 $ platformRate = $ request ->platformFeeRate ?? (float ) config ('multi-acquirer.fees.platform.default_rate ' , 0.06 );
3258
59+ // Hook: Before fee calculation
60+ $ feeContext = ['request ' => $ request , 'platformRate ' => $ platformRate ];
61+ $ feeContext = $ this ->hooks ->execute (HookPoints::BEFORE_FEE_CALCULATION , $ feeContext );
62+
3363 // Fee calculation is based on the product/base price.
3464 $ fees = $ this ->feeCalculator ->calculate (
3565 productPriceCents: $ request ->amount ->amountInCents ,
3666 installments: $ request ->installments ,
37- platformFeeRate: $ platformRate ,
67+ platformFeeRate: $ feeContext [ ' platformRate ' ] ?? $ platformRate ,
3868 merchantAbsorbsFinancing: $ request ->merchantAbsorbsFinancing ,
3969 paymentMethod: $ request ->paymentMethod ->value ,
4070 gatewayName: $ request ->preferredGateway !== '' ? $ request ->preferredGateway : 'pagarme ' ,
4171 feeResponsibility: $ request ->feeResponsibility ,
4272 );
4373
74+ // Hook: After fee calculation
75+ $ fees = $ this ->hooks ->execute (HookPoints::AFTER_FEE_CALCULATION , $ fees );
76+
77+ // Hook: Before gateway processing
78+ $ request = $ this ->hooks ->execute (HookPoints::BEFORE_GATEWAY , $ request );
79+
4480 $ gatewayResponse = $ this ->pipeline ->process ($ request );
4581
82+ // Hook: After gateway processing
83+ $ gatewayResponse = $ this ->hooks ->execute (HookPoints::AFTER_GATEWAY , $ gatewayResponse );
84+
4685 if ($ gatewayResponse ->isSuccessful ()) {
4786 if ($ gatewayResponse ->id ) {
4887 $ payment ->authorize ($ gatewayResponse ->id );
@@ -51,8 +90,16 @@ public function process(PaymentRequest $request): CheckoutResult
5190 if ($ gatewayResponse ->status === 'paid ' ) {
5291 $ payment ->markPaid ();
5392 }
93+
94+ // Hook: Payment success
95+ $ successContext = ['payment ' => $ payment , 'response ' => $ gatewayResponse ];
96+ $ this ->hooks ->execute (HookPoints::ON_PAYMENT_SUCCESS , $ successContext );
5497 } else {
5598 $ payment ->fail ($ gatewayResponse ->errorMessage ?? 'Unknown error ' );
99+
100+ // Hook: Payment failure
101+ $ failureContext = ['payment ' => $ payment , 'response ' => $ gatewayResponse ];
102+ $ this ->hooks ->execute (HookPoints::ON_PAYMENT_FAILURE , $ failureContext );
56103 }
57104
58105 $ this ->payments ->save ($ payment );
@@ -63,11 +110,16 @@ public function process(PaymentRequest $request): CheckoutResult
63110 }
64111 }
65112
66- return new CheckoutResult (
113+ // Hook: After payment
114+ $ result = new CheckoutResult (
67115 success: $ gatewayResponse ->isSuccessful (),
68116 payment: $ payment ,
69117 fees: $ fees ,
70118 gatewayResponse: $ gatewayResponse ,
71119 );
120+
121+ $ result = $ this ->hooks ->execute (HookPoints::AFTER_PAYMENT , $ result );
122+
123+ return $ result ;
72124 }
73125}
0 commit comments