diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index ce561f31bf0c..f8ff6118490f 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -156,6 +156,7 @@ class CompanyGateway extends BaseModel '80af24a6a691230bbec33e930ab40666' => 323, 'vpyfbmdrkqcicpkjqdusgjfluebftuva' => 324, //BTPay '91be24c7b792230bced33e930ac61676' => 325, + 'b67581d804dbad1743b61c57285142ad' => 326, //Powerboard ]; protected $touches = []; diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 1bbfe1b95fae..51537dc1901f 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -235,6 +235,10 @@ class Gateway extends StaticModel ], GatewayType::ACSS => ['refund' => false, 'token_billing' => true, 'webhooks' => []] ]; // Rotessa + case 64: //b67581d804dbad1743b61c57285142ad - powerboard + return [ + + ] default: return []; } diff --git a/app/Models/SystemLog.php b/app/Models/SystemLog.php index 10eb1f2629a8..6632acce6fe3 100644 --- a/app/Models/SystemLog.php +++ b/app/Models/SystemLog.php @@ -154,6 +154,8 @@ class SystemLog extends Model public const TYPE_ROTESSA = 325; + public const TYPE_POWERBOARD = 326; + public const TYPE_QUOTA_EXCEEDED = 400; public const TYPE_UPSTREAM_FAILURE = 401; diff --git a/app/PaymentDrivers/CBAPowerBoard/CreditCard.php b/app/PaymentDrivers/CBAPowerBoard/CreditCard.php new file mode 100644 index 000000000000..75b3e923907c --- /dev/null +++ b/app/PaymentDrivers/CBAPowerBoard/CreditCard.php @@ -0,0 +1,215 @@ +stripe->getSetupIntent(); + + return render('gateways.powerboard.credit_card.authorize', array_merge($data, $intent)); + } + + public function authorizeResponse($request) + { + $this->stripe->init(); + + // $stripe_response = json_decode($request->input('gateway_response')); + + $customer = $this->powerboard->findOrCreateCustomer(); + + // $this->stripe->attach($stripe_response->payment_method, $customer); + + // $stripe_method = $this->stripe->getStripePaymentMethod($stripe_response->payment_method); + + // $this->storePaymentMethod($stripe_method, $request->payment_method_id, $customer); + + return redirect()->route('client.payment_methods.index'); + } + + public function paymentData(array $data): array + { + // $description = $this->stripe->getDescription(false); + + // $payment_intent_data = [ + // 'amount' => $this->stripe->convertToStripeAmount($data['total']['amount_with_fee'], $this->stripe->client->currency()->precision, $this->stripe->client->currency()), + // 'currency' => $this->stripe->client->getCurrencyCode(), + // 'customer' => $this->stripe->findOrCreateCustomer(), + // 'description' => $description, + // 'metadata' => [ + // 'payment_hash' => $this->stripe->payment_hash->hash, + // 'gateway_type_id' => GatewayType::CREDIT_CARD, + // ], + // 'setup_future_usage' => 'off_session', + // 'payment_method_types' => ['card'], + // ]; + + // $data['intent'] = $this->stripe->createPaymentIntent($payment_intent_data); + // $data['gateway'] = $this->stripe; + + // return $data; + } + + public function paymentView(array $data) + { + $data = $this->paymentData($data); + + return render('gateways.stripe.credit_card.pay', $data); + } + + public function livewirePaymentView(array $data): string + { + return 'gateways.powerboard.credit_card.pay_livewire'; + } + + public function paymentResponse(PaymentResponseRequest $request) + { + // $this->stripe->init(); + + // $state = [ + // 'server_response' => json_decode($request->gateway_response), + // 'payment_hash' => $request->payment_hash, + // ]; + + // $state = array_merge($state, $request->all()); + // $state['store_card'] = boolval($state['store_card']); + + // if ($request->has('token') && ! is_null($request->token)) { + // $state['store_card'] = false; + // } + + // $state['payment_intent'] = PaymentIntent::retrieve($state['server_response']->id, array_merge($this->stripe->stripe_connect_auth, ['idempotency_key' => uniqid("st", true)])); + // $state['customer'] = $state['payment_intent']->customer; + + // $this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, $state); + // $this->stripe->payment_hash->save(); + + // $server_response = $this->stripe->payment_hash->data->server_response; + + // if ($server_response->status == 'succeeded') { + // $this->stripe->logSuccessfulGatewayResponse(['response' => json_decode($request->gateway_response), 'data' => $this->stripe->payment_hash], SystemLog::TYPE_STRIPE); + + // return $this->processSuccessfulPayment(); + // } + + // return $this->processUnsuccessfulPayment($server_response); + } + + public function processSuccessfulPayment() + { + // UpdateCustomer::dispatch($this->stripe->company_gateway->company->company_key, $this->stripe->company_gateway->id, $this->stripe->client->id); + + // $stripe_method = $this->stripe->getStripePaymentMethod($this->stripe->payment_hash->data->server_response->payment_method); + + // $data = [ + // 'payment_method' => $this->stripe->payment_hash->data->server_response->payment_method, + // 'payment_type' => PaymentType::parseCardType(strtolower($stripe_method->card->brand)) ?: PaymentType::CREDIT_CARD_OTHER, + // 'amount' => $this->stripe->convertFromStripeAmount($this->stripe->payment_hash->data->server_response->amount, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), + // 'transaction_reference' => isset($this->stripe->payment_hash->data->payment_intent->latest_charge) ? $this->stripe->payment_hash->data->payment_intent->latest_charge : optional($this->stripe->payment_hash->data->payment_intent->charges->data[0])->id, + // 'gateway_type_id' => GatewayType::CREDIT_CARD, + // ]; + + // $this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, ['amount' => $data['amount']]); + // $this->stripe->payment_hash->save(); + + // if ($this->stripe->payment_hash->data->store_card) { + // $customer = new \stdClass(); + // $customer->id = $this->stripe->payment_hash->data->customer; + + // $this->stripe->attach($this->stripe->payment_hash->data->server_response->payment_method, $customer); + + // $stripe_method = $this->stripe->getStripePaymentMethod($this->stripe->payment_hash->data->server_response->payment_method); + + // $this->storePaymentMethod($stripe_method, $this->stripe->payment_hash->data->payment_method_id, $customer); + // } + + // $payment = $this->stripe->createPayment($data, Payment::STATUS_COMPLETED); + + // SystemLogger::dispatch( + // ['response' => $this->stripe->payment_hash->data->server_response, 'data' => $data], + // SystemLog::CATEGORY_GATEWAY_RESPONSE, + // SystemLog::EVENT_GATEWAY_SUCCESS, + // SystemLog::TYPE_STRIPE, + // $this->stripe->client, + // $this->stripe->client->company, + // ); + + // if ($payment->invoices()->whereHas('subscription')->exists()) { + // $subscription = $payment->invoices()->first()->subscription; + + // if ($subscription && array_key_exists('return_url', $subscription->webhook_configuration) && strlen($subscription->webhook_configuration['return_url']) >= 1) { + // return redirect($subscription->webhook_configuration['return_url']); + // } + // } + + // return redirect()->route('client.payments.show', ['payment' => $payment->hashed_id]); + } + + public function processUnsuccessfulPayment($server_response) + { + // $this->stripe->sendFailureMail($server_response->cancellation_reason); + + // $message = [ + // 'server_response' => $server_response, + // 'data' => $this->stripe->payment_hash->data, + // ]; + + // SystemLogger::dispatch( + // $message, + // SystemLog::CATEGORY_GATEWAY_RESPONSE, + // SystemLog::EVENT_GATEWAY_FAILURE, + // SystemLog::TYPE_STRIPE, + // $this->stripe->client, + // $this->stripe->client->company, + // ); + + // throw new PaymentFailed('Failed to process the payment.', 500); + } + + private function storePaymentMethod($method, $payment_method_id, $customer) + { + // try { + // $payment_meta = new \stdClass(); + // $payment_meta->exp_month = (string) $method->card->exp_month; + // $payment_meta->exp_year = (string) $method->card->exp_year; + // $payment_meta->brand = (string) $method->card->brand; + // $payment_meta->last4 = (string) $method->card->last4; + // $payment_meta->type = GatewayType::CREDIT_CARD; + + // $data = [ + // 'payment_meta' => $payment_meta, + // 'token' => $method->id, + // 'payment_method_id' => $payment_method_id, + // ]; + + // $this->stripe->storeGatewayToken($data, ['gateway_customer_reference' => $customer->id]); + // } catch (\Exception $e) { + // return $this->stripe->processInternallyFailedPayment($this->stripe, $e); + // } + } +} diff --git a/app/PaymentDrivers/CBAPowerBoardPaymentDriver.php b/app/PaymentDrivers/CBAPowerBoardPaymentDriver.php new file mode 100644 index 000000000000..b0fa1ddd7c22 --- /dev/null +++ b/app/PaymentDrivers/CBAPowerBoardPaymentDriver.php @@ -0,0 +1,134 @@ +company_gateway->getConfigField('account_id') + + return $this; + } + + public function setPaymentMethod($payment_method_id) + { + $this->payment_method = $payment_method_id; + + return $this; + } + + /** + * View for displaying custom content of the driver. + * + * @param array $data + * @return mixed + */ + public function processPaymentView($data) + { + return $this->payment_method->paymentView($data); + } + + /** + * Processing method for payment. Should never be reached with this driver. + * + * @return mixed + */ + public function processPaymentResponse($request) + { + return $this->payment_method->paymentResponse($request); + } + + /** + * Detach payment method from custom payment driver. + * + * @param ClientGatewayToken $token + * @return void + */ + public function detach(ClientGatewayToken $token) + { + // Driver doesn't support this feature. + } + + public function refund(Payment $payment, $amount, $return_client_response = false) + { + + } + + public function processWebhookRequest($request) + { + } + + public function getClientRequiredFields(): array + { + return []; + } + + public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) + { + return (new Charge($this))->tokenBilling($cgt, $payment_hash); + } + + public function importCustomers() + { + } + + public function auth(): bool + { + $this->init(); + + // try { + // $this->verifyConnect(); + // return true; + // } catch(\Exception $e) { + + // } + + // return false; + + } +} diff --git a/database/migrations/2024_09_06_042040_cba_powerboard.php b/database/migrations/2024_09_06_042040_cba_powerboard.php new file mode 100644 index 000000000000..b48c0de579ba --- /dev/null +++ b/database/migrations/2024_09_06_042040_cba_powerboard.php @@ -0,0 +1,45 @@ +accessToken = ''; + // $fields->applicationId = ''; + // $fields->locationId = ''; + $fields->testMode = false; + + $powerboard = new Gateway(); + $powerboard->id = 64; + $powerboard->name = 'CBA PowerBoard'; + $powerboard->provider = 'CBAPowerBoard'; + $powerboard->key = 'b67581d804dbad1743b61c57285142ad'; + $powerboard->sort_order = 4543; + $powerboard->is_offsite = false; + $powerboard->visible = true; + $powerboard->fields = json_encode($fields); + $powerboard->save(); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/seeders/PaymentLibrariesSeeder.php b/database/seeders/PaymentLibrariesSeeder.php index 49c49e87b44e..50911bb3b7e3 100644 --- a/database/seeders/PaymentLibrariesSeeder.php +++ b/database/seeders/PaymentLibrariesSeeder.php @@ -88,7 +88,8 @@ class PaymentLibrariesSeeder extends Seeder ['id' => 60, 'name' => 'PayPal REST', 'provider' => 'PayPal_Rest', 'key' => '80af24a6a691230bbec33e930ab40665', 'fields' => '{"clientId":"","secret":"","signature":"","testMode":false}'], ['id' => 61, 'name' => 'PayPal Platform', 'provider' => 'PayPal_PPCP', 'key' => '80af24a6a691230bbec33e930ab40666', 'fields' => '{"testMode":false}'], ['id' => 62, 'name' => 'BTCPay', 'provider' => 'BTCPay', 'key' => 'vpyfbmdrkqcicpkjqdusgjfluebftuva', 'fields' => '{"btcpayUrl":"", "apiKey":"", "storeId":"", "webhookSecret":""}'], - ['id' => 63, 'name' => 'Rotessa', 'is_offsite' => false, 'sort_order' => 22, 'provider' => 'Rotessa', 'key' => '91be24c7b792230bced33e930ac61676', 'fields' => '{"apiKey":"", "testMode":""}'], + ['id' => 63, 'name' => 'Rotessa', 'is_offsite' => false, 'sort_order' => 22, 'provider' => 'Rotessa', 'key' => '91be24c7b792230bced33e930ac61676', 'fields' => '{"apiKey":"", "testMode":false}'], + ['id' => 64, 'name' => 'CBA PowerBoard', 'is_offsite' => false, 'sort_order' => 26, 'provider' => 'CBAPowerBoard', 'key' => 'b67581d804dbad1743b61c57285142ad', 'fields' => '{"accessToken":"", "testMode":false}'], ]; foreach ($gateways as $gateway) {