Compare commits

...

3 Commits

Author SHA1 Message Date
68d544b9c3 online payment 2025-10-30 21:15:58 +05:00
b0038d3e94 add online payment module 2025-10-29 18:42:45 +05:00
64dc80e069 ok 2025-10-29 18:12:00 +05:00
9 changed files with 337 additions and 51 deletions

View File

@@ -4,8 +4,22 @@ namespace App\Filament\Clusters\Cards\CardOrders\Pages;
use App\Filament\Clusters\Cards\CardOrders\CardOrderResource;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\URL;
class CreateCardOrder extends CreateRecord
{
protected static string $resource = CardOrderResource::class;
protected function getRedirectUrl(): string
{
$defaultUrl = $this->getResource()::getUrl('index');
return $defaultUrl;
// $payment = (new OnlinePaymentRepo)->payCardOrder($resource);
// $payment['status'] === 'success'
// ? URL::remote($payment['url'])
// : $defaultUrl;
}
}

View File

@@ -2,6 +2,8 @@
namespace App\Filament\Clusters\Cards\CardOrders\Tables;
use App\Modules\OrderStatus\Repositories\OrderStatusRepository;
use App\Modules\Region\Repositories\RegionRepository;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
@@ -19,64 +21,58 @@ class CardOrdersTable
return $table
->columns([
TextColumn::make('unique_id')
->label(__('ID'))
->searchable(),
TextColumn::make('cardState.name')
->label(__('Reason'))
->searchable(),
TextColumn::make('cardType.name')
->label(__('Card type'))
->searchable(),
TextColumn::make('region')
->searchable(),
TextColumn::make('branch.name')
->searchable(),
TextColumn::make('customer_name')
->searchable(),
TextColumn::make('customer_surname')
->searchable(),
TextColumn::make('customer_patronic_name')
->searchable(),
TextColumn::make('born_at')
->date()
->sortable(),
TextColumn::make('old_surname')
->searchable(),
TextColumn::make('citizenship')
->searchable(),
TextColumn::make('passport_serie')
->searchable(),
TextColumn::make('passport_id')
->searchable(),
TextColumn::make('passport_given_at')
->date()
->sortable(),
TextColumn::make('passport_given_by')
->searchable(),
TextColumn::make('born_place')
->searchable(),
TextColumn::make('job_location')
->searchable(),
TextColumn::make('passport_address')
->searchable(),
TextColumn::make('real_address')
->searchable(),
TextColumn::make('phone')
->searchable(),
TextColumn::make('phone_additional')
->searchable(),
TextColumn::make('status')
->searchable(),
TextColumn::make('user.name')
->searchable(),
IconColumn::make('paid')
->boolean(),
TextColumn::make('created_at')
->label(__('Created At'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
->sortable(),
TextColumn::make('region')
->label(__('Region'))
->formatStateUsing(fn (string $state): string => RegionRepository::label($state))
->searchable(),
TextColumn::make('branch.name')
->label(__('Branch'))
->searchable(),
TextColumn::make('customer_name')
->label(__('Name'))
->searchable(),
TextColumn::make('customer_surname')
->label(__('Surname'))
->searchable(),
IconColumn::make('paid')
->label(__('Paid'))
->boolean(),
TextColumn::make('phone')
->label(__('Phone'))
->searchable(),
TextColumn::make('status')
->formatStateUsing(fn (string $state) => OrderStatusRepository::statusFormatted($state))
->searchable(),
TextColumn::make('updated_at')
->label(__('Updated At'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('deleted_at')
->label(__('Deleted At'))
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),

View File

@@ -2,13 +2,13 @@
namespace App\Filament\Clusters\Cards\Cards;
use App\Filament\Clusters\Cards\CardsCluster;
use App\Filament\Clusters\Cards\Cards\Pages\ManageCards;
use App\Filament\Clusters\Cards\CardsCluster;
use App\Modules\AppHelpers\Repositories\DateHelper;
use App\Modules\Card\Models\Card;
use App\Modules\CardBalance\Repositories\CardBalanceRepository;
use App\Modules\CardRequisite\Repositories\CardRequisiteRepository;
use App\Modules\CardTransaction\Repositories\CardTransactionRepository;
use App\Modules\Card\Models\Card;
use BackedEnum;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;

View File

@@ -43,7 +43,7 @@ class UserProfileFields extends Component implements HasForms
->description(__('Fill your account profile information'))
->schema([
TextInput::make('first_name')
->label(__('First name'))
->label(__('Name'))
->string()
->maxLength(255)
->default(user()->first_name)
@@ -51,7 +51,7 @@ class UserProfileFields extends Component implements HasForms
->required(),
TextInput::make('last_name')
->label(__('Last name'))
->label(__('Surname'))
->string()
->maxLength(255)
->default(user()->last_name)
@@ -89,6 +89,7 @@ class UserProfileFields extends Component implements HasForms
->label(__('Email'))
->email()
->default(user()->email)
->unique(ignoreRecord: false)
->columnSpan(2),
Fieldset::make(__('Passport'))

View File

@@ -0,0 +1,52 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('online_payments', function (Blueprint $table) {
$table->string('refunded_amount')->nullable();
$table->string('booking_number')->nullable()->index();
$table->string('amount')->nullable();
$table->string('depositedAmount')->nullable();
$table->string('orderNumber')->nullable()->index();
$table->string('description')->nullable();
$table->string('orderId')->nullable()->index();
$table->string('cardholderName')->nullable()->index();
$table->string('pan')->nullable()->index();
$table->string('expiration')->nullable();
$table->string('formUrl')->nullable();
$table->string('successUrl')->nullable();
$table->string('errorUrl')->nullable();
$table->string('paymentStatus')->nullable()->index();
$table->string('callbackStatus')->nullable();
$table->string('username')->nullable()->index();
$table->string('approvalCode')->nullable();
$table->unsignedBigInteger('online_paymantable_id')->index()->nullable();
$table->string('online_paymantable_type')->index()->nullable();
$table->string('api_client')->nullable()->index();
$table->json('api_response')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('online_payments');
}
};

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Modules\OnlinePayment\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @property int $id
* @property string $refunded_amount
* @property string $booking_number
* @property string $amount
* @property string $depositedAmount
* @property string $orderNumber
* @property string $description
* @property string $orderId
* @property string $cardholderName
* @property string $pan
* @property string $approvalCode
* @property string $expiration
* @property string $formUrl
* @property string $successUrl
* @property string $errorUrl
* @property string $api_client
* @property string $paymentStatus
* @property string $callbackStatus
* @property string $username
* @property int $online_paymantable_id
* @property string $online_paymantable_type
* @property ?array $api_response
* @property \Illuminate\Support\Carbon $created_at
* @property \Illuminate\Support\Carbon $updated_at
*/
class OnlinePayment extends Model
{
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'api_response' => 'array',
];
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace App\Modules\OnlinePayment;
use App\Modules\Makeable;
use App\Modules\ModuleContract;
class OnlinePaymentModule implements ModuleContract
{
use Makeable;
/**
* Module is enabled
*/
protected bool $enabled = true;
/**
* Check if is module enabled
*/
public function isEnabled(): bool
{
return $this->enabled;
}
/**
* Disable module
*/
public function disable(): void
{
$this->enabled = false;
}
/**
* Enable module
*/
public function enable(): void
{
$this->enabled = true;
}
/**
* Check if module has a filament resource
*/
public function hasFilamentResource(): bool
{
return false;
}
/**
* Get module composer requirements
*/
public function getComposerRequirements(): array
{
return [];
}
/**
* Get module composer suggestions
*/
public function getComposerSuggestions(): array
{
return [];
}
}

View File

@@ -0,0 +1,114 @@
<?php
namespace App\Modules\OnlinePayment\Repositories;
use App\Modules\CardOrder\Models\CardOrder;
use App\Modules\OnlinePayment\Models\OnlinePayment;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class OnlinePaymentRepository
{
/**
* Pending online payments
*/
public const PENDING = 'pending';
/**
* Failed online payments
*/
public const FAILED = 'failed';
/**
* Paid online payments
*/
public const PAID = 'paid';
/**
* Status Values
*
* @return array<null|string, string>
*/
public static function statusValues(): array
{
return [
null => '-',
self::PENDING => __('Pending'),
self::PAID => __('Paid'),
self::FAILED => __('Cancelled'),
];
}
/**
* Set price
*/
public function getPrice(int|float|string $price): string
{
return number_format(floatval($price), 2, '', '');
}
/**
* Pay card order
*
* @param mixed $resource
* @return array<string, string>
*/
public function payCardOrder()
{
$orderNumber = $this->generateOrderNumber();
// $paymentResponse = Http::get('https://mpi.gov.tm/payment/rest/register.do', [
// 'orderNumber' => $orderNumber,
// 'amount' => $this->getPrice($resource->priceAmount()),
// 'currency' => 934,
// 'language' => 'ru',
// 'userName' => $resource->branch->billing_username,
// 'password' => $resource->branch->billing_password,
// 'returnUrl' => route('online-payment-store'),
// 'pageView' => 'DESKTOP',
// 'description' => 'Kart tölegi',
// ])->onError(function ($response) {
// Log::channel('halkbank_payment_error')
// ->error('Payment error', [
// 'response' => [
// 'body' => $response->body(),
// ],
// ]);
// });
// if ($paymentResponse->failed()) {
// return [
// 'status' => 'failed',
// 'url' => '',
// ];
// }
// $onlinePaymentHistory = new OnlinePayment;
// $onlinePaymentHistory->online_paymantable_id = $resource->really();
// $onlinePaymentHistory->online_paymantable_type = CardOrder::class;
// $onlinePaymentHistory->amount = $resource->priceAmount();
// $onlinePaymentHistory->orderNumber = $orderNumber;
// $onlinePaymentHistory->description = 'Kart tölegi';
// $onlinePaymentHistory->orderId = $paymentResponse['orderId'];
// $onlinePaymentHistory->formUrl = $paymentResponse['formUrl'];
// $onlinePaymentHistory->successUrl = route('online-payment-store');
// $onlinePaymentHistory->errorUrl = route('online-payment-store');
// $onlinePaymentHistory->api_client = 'billing_username';
// $onlinePaymentHistory->username = $resource->branch->billing_username;
// $onlinePaymentHistory->paymentStatus = self::PENDING;
// $onlinePaymentHistory->save();
// return [
// 'status' => 'success',
// 'url' => $paymentResponse['formUrl'],
// ];
}
/**
* Generate order number for payment
*/
public function generateOrderNumber(): string
{
return date('dmyHis');
}
}

View File

@@ -85,7 +85,6 @@ class WorkPanelProvider extends PanelProvider
])
->spa()
->databaseTransactions()
->breadcrumbs(false)
->colors([
'danger' => Color::Rose,
'gray' => Color::Gray,