From 42c1f537bcf83ce42c4b9db7045ab1f303f83b3c Mon Sep 17 00:00:00 2001 From: Joshua Dwire Date: Sat, 23 Apr 2016 22:10:51 -0400 Subject: [PATCH] Store/display credit card type, expiration and last 4 digits --- app/Http/Controllers/PaymentController.php | 69 +++++++++++++++++- .../Controllers/PublicClientController.php | 9 ++- app/Http/routes.php | 14 ++++ app/Models/CardType.php | 8 ++ app/Models/Payment.php | 5 ++ app/Ninja/Repositories/PaymentRepository.php | 12 ++- app/Services/BaseService.php | 4 +- app/Services/DatatableService.php | 10 ++- app/Services/PaymentService.php | 37 ++++++++-- composer.json | 2 +- composer.lock | 18 ++--- .../2016_04_23_182223_payments_changes.php | 22 ++++++ database/seeds/CardTypesSeeder.php | 44 +++++++++++ database/seeds/DatabaseSeeder.php | 1 + database/seeds/UpdateSeeder.php | 1 + public/images/credit_cards/amex.png | Bin 0 -> 6415 bytes public/images/credit_cards/carteblanche.png | Bin 0 -> 1776 bytes public/images/credit_cards/diners.png | Bin 0 -> 2813 bytes public/images/credit_cards/discover.png | Bin 0 -> 3516 bytes public/images/credit_cards/jcb.png | Bin 0 -> 2812 bytes public/images/credit_cards/laser.png | Bin 0 -> 2366 bytes public/images/credit_cards/maestro.png | Bin 0 -> 4429 bytes public/images/credit_cards/mastercard.png | Bin 0 -> 4154 bytes public/images/credit_cards/paypa.png | Bin 0 -> 2985 bytes public/images/credit_cards/solo.png | Bin 0 -> 3964 bytes public/images/credit_cards/switch.png | Bin 0 -> 938 bytes public/images/credit_cards/unionpay.png | Bin 0 -> 3695 bytes public/images/credit_cards/unknown.png | Bin 0 -> 1776 bytes public/images/credit_cards/visa.png | Bin 0 -> 3182 bytes resources/lang/en/texts.php | 16 +++- resources/views/clients/show.blade.php | 4 +- 31 files changed, 245 insertions(+), 31 deletions(-) create mode 100644 app/Models/CardType.php create mode 100644 database/seeds/CardTypesSeeder.php create mode 100644 public/images/credit_cards/amex.png create mode 100644 public/images/credit_cards/carteblanche.png create mode 100644 public/images/credit_cards/diners.png create mode 100644 public/images/credit_cards/discover.png create mode 100644 public/images/credit_cards/jcb.png create mode 100644 public/images/credit_cards/laser.png create mode 100644 public/images/credit_cards/maestro.png create mode 100644 public/images/credit_cards/mastercard.png create mode 100644 public/images/credit_cards/paypa.png create mode 100644 public/images/credit_cards/solo.png create mode 100644 public/images/credit_cards/switch.png create mode 100644 public/images/credit_cards/unionpay.png create mode 100644 public/images/credit_cards/unknown.png create mode 100644 public/images/credit_cards/visa.png diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index f5ecc89f8e8e..b23f0cb7b7ab 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -55,6 +55,7 @@ class PaymentController extends BaseController 'client', 'transaction_reference', 'method', + 'source', 'payment_amount', 'payment_date', 'status', @@ -439,10 +440,12 @@ class PaymentController extends BaseController if ($useToken) { $details['customerReference'] = $client->getGatewayToken(); + unset($details['token']); } elseif ($account->token_billing_type_id == TOKEN_BILLING_ALWAYS || Input::get('token_billing')) { - $token = $this->paymentService->createToken($gateway, $details, $accountGateway, $client, $invitation->contact_id); + $token = $this->paymentService->createToken($gateway, $details, $accountGateway, $client, $invitation->contact_id, $customerReference); if ($token) { - $details['customerReference'] = $token; + $details['token'] = $token; + $details['customerReference'] = $customerReference; } else { $this->error('Token-No-Ref', $this->paymentService->lastError, $accountGateway); return Redirect::to('payment/'.$invitationKey)->withInput(Request::except('cvv')); @@ -479,7 +482,49 @@ class PaymentController extends BaseController } if ($response->isSuccessful()) { - $payment = $this->paymentService->createPayment($invitation, $accountGateway, $ref); + $last4 = null; + $expiration = null; + $card_type_id = null; + + if (!empty($details['card'])) { + $card = $details['card']; + $last4 = substr($card->number, -4); + $year = $card->expiryYear; + if (strlen($year) == 2) { + $year = '20' . $year; + } + + $expiration = $year . '-' . $card->expiryMonth . '-00'; + $card_type_id = $this->detectCardType($card->number); + } + + if ($accountGateway->gateway_id == GATEWAY_STRIPE) { + $card = $response->getSource(); + if (!$card) { + $card = $response->getCard(); + } + + if ($card) { + $last4 = $card['last4']; + $expiration = $card['exp_year'] . '-' . $card['exp_month'] . '-00'; + $stripe_card_types = array( + 'Visa' => CARD_VISA, + 'American Express' => CARD_AMERICAN_EXPRESS, + 'MasterCard' => CARD_MASTERCARD, + 'Discover' => CARD_DISCOVER, + 'JCB' => CARD_JCB, + 'Diners Club' => CARD_DINERS_CLUB + ); + + if (!empty($stripe_card_types[$card['brand']])) { + $card_type_id = $stripe_card_types[$card['brand']]; + } else { + $card_type_id = CARD_UNKNOWN; + } + } + } + + $payment = $this->paymentService->createPayment($invitation, $accountGateway, $ref, null, $last4, $expiration, $card_type_id); Session::flash('message', trans('texts.applied_payment')); if ($account->account_key == NINJA_ACCOUNT_KEY) { @@ -512,6 +557,24 @@ class PaymentController extends BaseController } } } + + private function detectCardType($number) + { + if (preg_match('/^3[47][0-9]{13}$/',$number)) { + return CARD_AMERICAN_EXPRESS; + } elseif (preg_match('/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',$number)) { + return CARD_DINERS_CLUB; + } elseif (preg_match('/^6(?:011|5[0-9][0-9])[0-9]{12}$/',$number)) { + return CARD_DISCOVER; + } elseif (preg_match('/^(?:2131|1800|35\d{3})\d{11}$/',$number)) { + return CARD_JCB; + } elseif (preg_match('/^5[1-5][0-9]{14}$/',$number)) { + return CARD_MASTERCARD; + } elseif (preg_match('/^4[0-9]{12}(?:[0-9]{3})?$/',$number)) { + return CARD_VISA; + } + return CARD_UNKNOWN; + } public function offsite_payment() { diff --git a/app/Http/Controllers/PublicClientController.php b/app/Http/Controllers/PublicClientController.php index d756bd7eaaa0..085098827e1b 100644 --- a/app/Http/Controllers/PublicClientController.php +++ b/app/Http/Controllers/PublicClientController.php @@ -324,7 +324,7 @@ class PublicClientController extends BaseController 'clientFontUrl' => $account->getFontsUrl(), 'entityType' => ENTITY_PAYMENT, 'title' => trans('texts.payments'), - 'columns' => Utils::trans(['invoice', 'transaction_reference', 'method', 'payment_amount', 'payment_date', 'status']) + 'columns' => Utils::trans(['invoice', 'transaction_reference', 'method', 'source', 'payment_amount', 'payment_date', 'status']) ]; return response()->view('public_list', $data); @@ -341,9 +341,16 @@ class PublicClientController extends BaseController ->addColumn('invoice_number', function ($model) { return $model->invitation_key ? link_to('/view/'.$model->invitation_key, $model->invoice_number)->toHtml() : $model->invoice_number; }) ->addColumn('transaction_reference', function ($model) { return $model->transaction_reference ? $model->transaction_reference : 'Manual entry'; }) ->addColumn('payment_type', function ($model) { return $model->payment_type ? $model->payment_type : ($model->account_gateway_id ? 'Online payment' : ''); }) + ->addColumn('payment_source', function ($model) { + if (!$model->card_type_code) return ''; + $card_type = trans("texts.card_" . $model->card_type_code); + $expiration = trans('texts.card_expiration', array('expires'=>Utils::fromSqlDate($model->expiration, false)->format('m/d'))); + return ''.htmlentities($card_type).'  •••'.$model->last4.' '.$expiration; + }) ->addColumn('amount', function ($model) { return Utils::formatMoney($model->amount, $model->currency_id, $model->country_id); }) ->addColumn('payment_date', function ($model) { return Utils::dateToString($model->payment_date); }) ->addColumn('status', function ($model) { return $this->getPaymentStatusLabel($model); }) + ->orderColumns( 'invoice_number', 'transaction_reference', 'payment_type', 'amount', 'payment_date') ->make(); } diff --git a/app/Http/routes.php b/app/Http/routes.php index 25041048f102..9903b3caee0f 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -481,6 +481,20 @@ if (!defined('CONTACT_EMAIL')) { define('PAYMENT_STATUS_COMPLETED', 3); define('PAYMENT_STATUS_PARTIALLY_REFUNDED', 4); define('PAYMENT_STATUS_REFUNDED', 5); + + define('CARD_UNKNOWN', 0); + define('CARD_AMERICAN_EXPRESS', 1); + define('CARD_CARTE_BLANCHE', 2); + define('CARD_UNIONPAY', 3); + define('CARD_DINERS_CLUB', 4); + define('CARD_DISCOVER', 5); + define('CARD_JCB', 6); + define('CARD_LASER', 7); + define('CARD_MAISTRO', 8); + define('CARD_MASTERCARD', 9); + define('CARD_SOLO', 10); + define('CARD_SWITCH', 11); + define('CARD_VISA', 12); define('PAYMENT_TYPE_CREDIT', 1); define('CUSTOM_DESIGN', 11); diff --git a/app/Models/CardType.php b/app/Models/CardType.php new file mode 100644 index 000000000000..6eee490c1260 --- /dev/null +++ b/app/Models/CardType.php @@ -0,0 +1,8 @@ +belongsTo('App\Models\PaymentStatus'); + } + + public function card_type() + { + return $this->belongsTo('App\Models\CardTypes'); } public function getRoute() diff --git a/app/Ninja/Repositories/PaymentRepository.php b/app/Ninja/Repositories/PaymentRepository.php index 668b5b85d9ee..be2a9104b576 100644 --- a/app/Ninja/Repositories/PaymentRepository.php +++ b/app/Ninja/Repositories/PaymentRepository.php @@ -23,6 +23,7 @@ class PaymentRepository extends BaseRepository ->join('invoices', 'invoices.id', '=', 'payments.invoice_id') ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->join('payment_statuses', 'payment_statuses.id', '=', 'payments.payment_status_id') + ->join('card_types', 'card_types.id', '=', 'payments.card_type_id') ->leftJoin('payment_types', 'payment_types.id', '=', 'payments.payment_type_id') ->leftJoin('account_gateways', 'account_gateways.id', '=', 'payments.account_gateway_id') ->leftJoin('gateways', 'gateways.id', '=', 'account_gateways.gateway_id') @@ -54,10 +55,13 @@ class PaymentRepository extends BaseRepository 'payments.is_deleted', 'payments.user_id', 'payments.refunded', + 'payments.expiration', + 'payments.last4', 'invoices.is_deleted as invoice_is_deleted', 'gateways.name as gateway_name', 'gateways.id as gateway_id', - 'payment_statuses.name as payment_status_name' + 'payment_statuses.name as payment_status_name', + 'card_types.code as card_type_code' ); if (!\Session::get('show_trash:payment')) { @@ -85,6 +89,7 @@ class PaymentRepository extends BaseRepository ->join('invoices', 'invoices.id', '=', 'payments.invoice_id') ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->join('payment_statuses', 'payment_statuses.id', '=', 'payments.payment_status_id') + ->join('card_types', 'card_types.id', '=', 'payments.card_type_id') ->leftJoin('invitations', function ($join) { $join->on('invitations.invoice_id', '=', 'invoices.id') ->on('invitations.contact_id', '=', 'contacts.id'); @@ -113,8 +118,11 @@ class PaymentRepository extends BaseRepository 'payment_types.name as payment_type', 'payments.account_gateway_id', 'payments.refunded', + 'payments.expiration', + 'payments.last4', 'payments.payment_status_id', - 'payment_statuses.name as payment_status_name' + 'payment_statuses.name as payment_status_name', + 'card_types.code as card_type_code' ); if ($filter) { diff --git a/app/Services/BaseService.php b/app/Services/BaseService.php index b68b06482a04..4cd0c615c024 100644 --- a/app/Services/BaseService.php +++ b/app/Services/BaseService.php @@ -29,12 +29,12 @@ class BaseService return count($entities); } - public function createDatatable($entityType, $query, $showCheckbox = true, $hideClient = false) + public function createDatatable($entityType, $query, $showCheckbox = true, $hideClient = false, $orderColumns = []) { $columns = $this->getDatatableColumns($entityType, !$showCheckbox); $actions = $this->getDatatableActions($entityType); - return $this->datatableService->createDatatable($entityType, $query, $columns, $actions, $showCheckbox); + return $this->datatableService->createDatatable($entityType, $query, $columns, $actions, $showCheckbox, $orderColumns); } protected function getDatatableColumns($entityType, $hideClient) diff --git a/app/Services/DatatableService.php b/app/Services/DatatableService.php index 2f9af2856cf3..3d9001a095b7 100644 --- a/app/Services/DatatableService.php +++ b/app/Services/DatatableService.php @@ -7,11 +7,11 @@ use Auth; class DatatableService { - public function createDatatable($entityType, $query, $columns, $actions = null, $showCheckbox = true) + public function createDatatable($entityType, $query, $columns, $actions = null, $showCheckbox = true, $orderColumns = []) { $table = Datatable::query($query); - $orderColumns = []; - + $calculateOrderColumns = empty($orderColumns); + if ($actions && $showCheckbox) { $table->addColumn('checkbox', function ($model) { $can_edit = Auth::user()->hasPermission('edit_all') || (isset($model->user_id) && Auth::user()->id == $model->user_id); @@ -31,7 +31,9 @@ class DatatableService if ($visible) { $table->addColumn($field, $value); - $orderColumns[] = $field; + if ($calculateOrderColumns) { + $orderColumns[] = $field; + } } } diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php index 8e24370bd930..7756071348ca 100644 --- a/app/Services/PaymentService.php +++ b/app/Services/PaymentService.php @@ -75,7 +75,7 @@ class PaymentService extends BaseService $data = $this->createDataForClient($invitation); } - $card = new CreditCard($data); + $card = !empty($data['number']) ? new CreditCard($data) : null; $data = [ 'amount' => $invoice->getRequestedAmount(), 'card' => $card, @@ -155,12 +155,21 @@ class PaymentService extends BaseService ]; } - public function createToken($gateway, $details, $accountGateway, $client, $contactId) + public function createToken($gateway, $details, $accountGateway, $client, $contactId, &$customerReference = null) { $tokenResponse = $gateway->createCard($details)->send(); - $cardReference = $tokenResponse->getCustomerReference(); + $cardReference = $tokenResponse->getCardReference(); + $customerReference = $tokenResponse->getCustomerReference(); + + if ($customerReference == $cardReference) { + // This customer was just created; find the card + $data = $tokenResponse->getData(); + if(!empty($data['default_source'])) { + $cardReference = $data['default_source']; + } + } - if ($cardReference) { + if ($customerReference) { $token = AccountGatewayToken::where('client_id', '=', $client->id) ->where('account_gateway_id', '=', $accountGateway->id)->first(); @@ -172,7 +181,7 @@ class PaymentService extends BaseService $token->client_id = $client->id; } - $token->token = $cardReference; + $token->token = $customerReference; $token->save(); } else { $this->lastError = $tokenResponse->getMessage(); @@ -205,7 +214,7 @@ class PaymentService extends BaseService return $token; } - public function createPayment($invitation, $accountGateway, $ref, $payerId = null) + public function createPayment($invitation, $accountGateway, $ref, $payerId = null, $last4 = null, $expiration = null, $card_type_id = null, $routing_number = null) { $invoice = $invitation->invoice; @@ -218,6 +227,10 @@ class PaymentService extends BaseService $payment->contact_id = $invitation->contact_id; $payment->transaction_reference = $ref; $payment->payment_date = date_create()->format('Y-m-d'); + $payment->last4 = $last4; + $payment->expiration = $expiration; + $payment->card_type_id = $card_type_id; + $payment->routing_number = $routing_number; if ($payerId) { $payment->payer_id = $payerId; @@ -329,7 +342,8 @@ class PaymentService extends BaseService $query->where('payments.user_id', '=', Auth::user()->id); } - return $this->createDatatable(ENTITY_PAYMENT, $query, !$clientPublicId); + return $this->createDatatable(ENTITY_PAYMENT, $query, !$clientPublicId, false, + ['invoice_number', 'transaction_reference', 'payment_type', 'amount', 'payment_date']); } protected function getDatatableColumns($entityType, $hideClient) @@ -368,6 +382,15 @@ class PaymentService extends BaseService return $model->payment_type ? $model->payment_type : ($model->account_gateway_id ? $model->gateway_name : ''); } ], + [ + 'source', + function ($model) { + if (!$model->card_type_code) return ''; + $card_type = trans("texts.card_" . $model->card_type_code); + $expiration = trans('texts.card_expiration', array('expires'=>Utils::fromSqlDate($model->expiration, false)->format('m/d'))); + return ''.htmlentities($card_type).'  •••'.$model->last4.' '.$expiration; + } + ], [ 'amount', function ($model) { diff --git a/composer.json b/composer.json index 9bb49326b1f8..b481c5963014 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "omnipay/mollie": "dev-master#22956c1a62a9662afa5f5d119723b413770ac525", "omnipay/2checkout": "dev-master#e9c079c2dde0d7ba461903b3b7bd5caf6dee1248", "omnipay/gocardless": "dev-master", - "omnipay/stripe": "2.3.0", + "omnipay/stripe": "2.3.2", "laravel/framework": "5.2.*", "laravelcollective/html": "5.2.*", "laravelcollective/bus": "5.2.*", diff --git a/composer.lock b/composer.lock index 606338333d7c..d6f9646f7c2f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "cf82d2ddb25cb1a7d6b4867bcc8692b8", - "content-hash": "481a95753b873249aebceb99e7426421", + "hash": "607b25b09aee82ac769bd942fac91ba6", + "content-hash": "122f3f59beb2286159145d219dbcbc90", "packages": [ { "name": "agmscode/omnipay-agms", @@ -127,7 +127,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/formers/former/zipball/78ae8c65b1f8134e2db1c9491c251c03638823ca", + "url": "https://api.github.com/repos/formers/former/zipball/37f6876a5d211427b5c445cd64f0eb637f42f685", "reference": "d97f907741323b390f43954a90a227921ecc6b96", "shasum": "" }, @@ -699,7 +699,7 @@ "laravel" ], "abandoned": "OpenSkill/Datatable", - "time": "2015-04-29 07:00:36" + "time": "2015-11-23 21:33:41" }, { "name": "classpreloader/classpreloader", @@ -5661,16 +5661,16 @@ }, { "name": "omnipay/stripe", - "version": "v2.3.0", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/thephpleague/omnipay-stripe.git", - "reference": "54b816a5e95e34c988d71fb805b0232cfd7c1ce5" + "reference": "fe05ddd73d9ae38ca026dbc270ca98aaf3f99da4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/omnipay-stripe/zipball/54b816a5e95e34c988d71fb805b0232cfd7c1ce5", - "reference": "54b816a5e95e34c988d71fb805b0232cfd7c1ce5", + "url": "https://api.github.com/repos/thephpleague/omnipay-stripe/zipball/fe05ddd73d9ae38ca026dbc270ca98aaf3f99da4", + "reference": "fe05ddd73d9ae38ca026dbc270ca98aaf3f99da4", "shasum": "" }, "require": { @@ -5714,7 +5714,7 @@ "payment", "stripe" ], - "time": "2015-11-10 16:17:35" + "time": "2016-03-19 08:35:06" }, { "name": "omnipay/targetpay", diff --git a/database/migrations/2016_04_23_182223_payments_changes.php b/database/migrations/2016_04_23_182223_payments_changes.php index 641ec06e2c2d..fc887b3bb88f 100644 --- a/database/migrations/2016_04_23_182223_payments_changes.php +++ b/database/migrations/2016_04_23_182223_payments_changes.php @@ -13,6 +13,7 @@ class PaymentsChanges extends Migration public function up() { Schema::dropIfExists('payment_statuses'); + Schema::dropIfExists('card_types'); Schema::create('payment_statuses', function($table) { @@ -20,13 +21,27 @@ class PaymentsChanges extends Migration $table->string('name'); }); + Schema::create('card_types', function($table) + { + $table->increments('id'); + $table->string('name'); + $table->string('code'); + }); + (new \PaymentStatusSeeder())->run(); + (new \CardTypesSeeder())->run(); Schema::table('payments', function($table) { $table->decimal('refunded', 13, 2); $table->unsignedInteger('payment_status_id')->default(3); $table->foreign('payment_status_id')->references('id')->on('payment_statuses'); + + $table->unsignedInteger('routing_number')->nullable(); + $table->smallInteger('last4')->unsigned()->nullable(); + $table->date('expiration')->nullable(); + $table->unsignedInteger('card_type_id')->nullable(); + $table->foreign('card_type_id')->references('id')->on('card_types'); }); } @@ -42,8 +57,15 @@ class PaymentsChanges extends Migration $table->dropColumn('refunded'); $table->dropForeign('payments_payment_status_id_foreign'); $table->dropColumn('payment_status_id'); + + $table->dropColumn('routing_number'); + $table->dropColumn('last4'); + $table->dropColumn('expiration'); + $table->dropForeign('card_type_id_foreign'); + $table->dropColumn('card_type_id'); }); Schema::dropIfExists('payment_statuses'); + Schema::dropIfExists('card_types'); } } diff --git a/database/seeds/CardTypesSeeder.php b/database/seeds/CardTypesSeeder.php new file mode 100644 index 000000000000..e5d70b9ed585 --- /dev/null +++ b/database/seeds/CardTypesSeeder.php @@ -0,0 +1,44 @@ +createPaymentSourceTypes(); + + Eloquent::reguard(); + } + + private function createPaymentSourceTypes() + { + $statuses = [ + ['id' => '0', 'name' => 'Unknown', 'code'=>'unknown'] + ['id' => '1', 'name' => 'American Express', 'code'=>'amex'], + ['id' => '2', 'name' => 'Carte Blanche', 'code'=>'carteblanche'], + ['id' => '3', 'name' => 'China UnionPay', 'code'=>'unionpay'], + ['id' => '4', 'name' => 'Diners Club', 'code'=>'diners'], + ['id' => '5', 'name' => 'Discover', 'code'=>'discover'], + ['id' => '6', 'name' => 'JCB', 'code'=>'jcb'], + ['id' => '7', 'name' => 'Laser', 'code'=>'laser'], + ['id' => '8', 'name' => 'Maestro', 'code'=>'maestro'], + ['id' => '9', 'name' => 'MasterCard', 'code'=>'mastercard'], + ['id' => '10', 'name' => 'Solo', 'code'=>'solo'], + ['id' => '11', 'name' => 'Switch', 'code'=>'switch'], + ['id' => '12', 'name' => 'Visa', 'code'=>'visa'], + ]; + + foreach ($statuses as $status) { + $record = CardType::find($status['id']); + if ($record) { + $record->name = $status['name']; + $record->save(); + } else { + CardType::create($status); + } + } + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 753a1ce54e30..20bdbe7f0cc1 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -20,6 +20,7 @@ class DatabaseSeeder extends Seeder $this->call('BanksSeeder'); $this->call('InvoiceStatusSeeder'); $this->call('PaymentStatusSeeder'); + $this->call('CardTypesSeeder'); $this->call('CurrenciesSeeder'); $this->call('DateFormatsSeeder'); $this->call('InvoiceDesignsSeeder'); diff --git a/database/seeds/UpdateSeeder.php b/database/seeds/UpdateSeeder.php index e5335e311b42..dffb2dbe26b7 100644 --- a/database/seeds/UpdateSeeder.php +++ b/database/seeds/UpdateSeeder.php @@ -16,6 +16,7 @@ class UpdateSeeder extends Seeder $this->call('BanksSeeder'); $this->call('InvoiceStatusSeeder'); $this->call('PaymentStatusSeeder'); + $this->call('CardTypesSeeder'); $this->call('CurrenciesSeeder'); $this->call('DateFormatsSeeder'); $this->call('InvoiceDesignsSeeder'); diff --git a/public/images/credit_cards/amex.png b/public/images/credit_cards/amex.png new file mode 100644 index 0000000000000000000000000000000000000000..492d40aff6aa9e4f0af35b38f6548c0ac1e79d9f GIT binary patch literal 6415 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 literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/diners.png b/public/images/credit_cards/diners.png new file mode 100644 index 0000000000000000000000000000000000000000..72e1808fb1f9dcfa16e0d3a5df2ea777efa288c5 GIT binary patch literal 2813 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 literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/jcb.png b/public/images/credit_cards/jcb.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb0cbafdc0ee76fd9df7a56e8a5a10acba0978c GIT binary patch literal 2812 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 T7BeXS`oRI$GtsToc8>TTD?`Gw literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/mastercard.png b/public/images/credit_cards/mastercard.png new file mode 100644 index 0000000000000000000000000000000000000000..af9b1d701c9651437c6110fd29d2299ab6851185 GIT binary patch literal 4154 zcmaJ^XH-*Lw++2l0|*F)Do72T&>?gJp-E^$2mvA_!6ZmfKsr)|C`F1Cxl*J_5m8i{ z2+|S6OYaDZ6vcu9FWm2X-}~|1cg8tq@4d#HbFH=48hf0R1h+NkU=?Bo001187ElN3 zXi0tKnHi~XS*t8{>L5rmMUWivexy(&0Sz$n#rvQ^mRO`e+5wI94ZGZj)&&6QBr#41 z5&~ueLE*8A$PMx0|2@P-iOBX_&pO}@zL4QF=fqLTq z2?_y&gG}%QG)P@hRRN_827@#-6v1lh8X91Ekcu)`MM;@@Ybb!#AnFm49zY@mLzI+4LqioqRTc3Be$zw!Q8VWLx5Fj~n0O~i)~P}IWtNu0O}hL{l0ND`jlgvST{-bHu-o`fd` z;DbRXjv62t7!rlSofu^QV!&V!OB|7e#G%lZP(5*~h9U;z3(-_lGf~wrGli;XYJ$P0 zU~OeBbt5AaO)X<}HK;0B`8OAeM}=U~IMQ#f?+MpL)67g6to5(llV-pMQ$0h`1k4q* zuNeW41^tyY1oQ8)nEb2W-(27S7R!I~fc`62i5iU3NooI2sehZO{c|$?r*Wx^e_9`n zqxL(2+St&xa%}*Bz1k9Lu28A>h=YLY;TR8>YgeDgAq@nn|TXqf9u|?JCq5oj%cXFl83yn)tyy_hSxLH0LGd zcCr=y+!0_e=O-wqh>_Mv=x&dIOm5XL8N<`r^caHvKnt)vylY>r?`YCGaEh(wV1C5S z8sH^T2>*FQIMdLIj%Z6K9HNR?Dzo0kkE3R42K5uWc=j_cIiC78{DS>Dl85G$vLW&# z?YGHPf6z#oT#wk=qO-Dq{QIM+2zs|a`$vRQhGn1aEMN3i3D;F*^qe&Ab)}PBf$9}K zdZZyKE#=+?Qa9zGw1pbza@EGVO_wpj_>-`EEWC(pzLu`9DQ9CsB577f8W)qyPlvbu zVXw<8t;d-C@H=mm+Q4~FRy-SSj&}Iwq~HSu7CrWm_8(Dmboe&5z8|tSjyjzS^+qfF zF`T#E_O$4|BoITJ0nfGy%*GgJvl<-87Yr^v&TcPNHnjq+-|&7|m|>lJ6zas9e#295 zS0KPSzckNF^IWqU=j+*~Y`>;qH`R0NHJxI@-1cL!g;tGwh~Kd<1EQ9kP6~RPI#(t}f~(4>nl4|FMSHgY5utI zoDO^_t-|K$E2o73SGG=b|EfMs=>^F(=toFfc@vn=vzec^Z>yi){j*=C=__EMvAVvN zLK1~|kw^cyov3;zvhsVe<>dr)?;MTY1z_)aKEAy2m;;QE(ueD}vSpknMuhT4wTMD0 zMTZR^@NhqAZ$$Je430brASBcFu(@tvGS+P3ynnJ< z!2oVdC1qowlqB(jwA!sw3tQti-3!A!V!pE+{ZQ6*3P;5pBYJ)cX8^2eQoLQ>uP@=b z2&gi8Vh6~2?!^A$$P^JM`&#`v1C-tYh)E(erLr6KME9M_P}k=wW^pcWUGR7gl*M$F zTqulhUT{O?%rHAUFNS^4t9bgg1L_05GBg3-6oz|D-q5zIHQ9-u9BKU|`0m0i-G@}n zd-*Ba<7@fI=Xh=OdEU(x+uLcwuL@)zJPe!{JEP+okA7nuyfQ~q<^iirX4>qV3`xmu zz(*uwlFJ4|IYju-8lSy^R#ZLh$8x9qy*W_;f zpQqbGmAZx~_Z}Y&?pIu@O#E_-uUDifMZvvA!r&Th_ZnTWh$~HrY8+kB{VszejLd}o zKrZ-ft(K<5M;wAKb4gVRpzNAfjw{gt#jD(|L|)g)V=J4x`YGwB z+0Oilg2SSmLdf2pj{#^VPGc#>hBNw%Uk4ZwN3L-wo#fH1j3^0W9eDf)arj>3#$mm` zU#Gis?2^|J=jLl2vB>9iX!^3mcCJi@o^#R*1JS%e5h#hCbgKl!QwCQ{nt_27(<|X@ zKIb*s$A7U5Ic1kR!pu_gDs|=`;Gd=Cf~^Ux;U;ONgWRRdl=JM;8Om)DeDOZ;cGfW5U?2FiCSk39|0{T-@&zUsa;>Met zJifJXXsKrd#9LAg2<$BMRff3LA9GIf1sZ(&Rr?c`bOI7fE4pgkFOdi(3nsm$h-^g-;_yTijUIL2=^C41QhOE=JM z|LxPev`(pSOTn(%WfO9l(Du?w26eFCq1bt^t0GTp6%98Oz7;3UXr|{lzLp!^*zf4N z=W$@nd>K>mcF(@(NRIp=v~=m-wS`Y#B!D|UHvF=iJ$gVB-I3)gEW3~SkXhtK#RbK4 zqnjl&K4i%!C3U%}-M?fC(nT2F#Oap7$M^WQ^Y-7s=e3! zYzmY)nQpu*oKC5aoc`I{H`qCf)#2V7eND;N?iDgP3OeUk=bn;vt)+BfP+;LsZk<8y zyOFpgFPGw-v!>87VswmWK>s0~m6esZF!*eW=mB#rkZER1^j#tSlW*+CpX%(}j)57U zxt9cj;%5CyEnL~wB*pE{oHhOQ7O_R-?&EZVUxMLuL$@Wm`6R$?OmMKOOupTyrf z=TkYIHp}N+;nf5POH3-TP`4n`UIa;C3FYLW*E_ zIy?1O*DHIQ;vs3d!q!#m8>+rR1vv9ce`$|ep2v#K^!dqwJURLTibVApQ5Hpaxl6w! z91|e%{bx{*YvX-)usku9|k!!T-h4J{nYcAZo7ih#x@AaEf zyi`O6xup*D92a&Oc>+te(OFt)akbh!OKmW^;dvR_meCkuM%kPjIV#SKi+Yj?#(0S; z8y1h?KRUX8;UTj>oUT4tCzc6JN+>MOzoI;*r;&4voM}$%pzzWWErvtW*wA^ow<51g z?LPF1n!N;GVH&n_LWLjQL3O^mZ4tM3uT&@{pb@d(bkm2nCW5=OLW-1k*U_=men!5u zpvOa*>%Qw7?kOU7Uga^c3}1VHe@H8pt>UNVEn3aMXK$0cRjT_fYw{mcG}<@R)35BV zZt2?<$=lYa=1c6{o+E#GRAxc(knZ|AelMWtkPfBo8Ye~3zj>+=Za7e5!({Fi1X0nM zznt`FM|3Q3&h3>f?F`S{r86>S_7+jZW?!(syid`w0!#)t3+??(>s7IHy-aN9PQplJ zLv@@r+`k_niM!-r(PQ+t`o*dl3fN@ z&fOO9NF6e+g<_!!T8n<_eYkP6eW{wXOG?iD0q^%JFUe6HJ(S7 zAFB{zaYlb?io=1BmpKoeCa=PoQjQ8C9IIr(l`%p<4Yuc-q}oe+36QN26IjQ3{?l7+ zldY!;o$RHnsJ_T&4L81?qJJy6CyFOe-e|ACNyAI%qur3n;|PA7VmfVeIUulhi^YK< z8ro`Cu{?&o_jzLCK^%p~!_IL@t~%wc_D9aCmkPIUzI>1tUU0Ftd|%M|rPQ_Z4xk-q zg4+UBowHrTd$<_8D8wmT7PBesWBc)txV{>Wws>zclj_-%k2x+!dFpm-mA~&%{vtjZ z|ArUFB3r0?PNcKqCdsiwBCe;Mw^lrUld literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/paypa.png b/public/images/credit_cards/paypa.png new file mode 100644 index 0000000000000000000000000000000000000000..4fad9d864c6b301776bc346cdd798d210121cd8b GIT binary patch literal 2985 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 S8>`syeb~ap23`mAz4|}TzUI^b literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/switch.png b/public/images/credit_cards/switch.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff522c6c14bf453af61a242c94629b09bf30f89 GIT binary patch literal 938 zcmV;b16BNqP)PaK@>bnVCSdj8UG1W@cspnPvcUOh7 zf&-c!Wj)U$uuoq&{U1o_&blHUBAIMYIsyy2eWWzh58rS~v#0^f47|)h8JiY&MF&=+ z+in8Bq@B=%WqI2*Vd%E&L9RJdke>{b_N+y!2mA7yS zQoJ0?W8f;yk&`jY!1NT+H{uTr8fpxz%i|q_zJ}CL6OeQmf z?*Oh~;}&9RS%QuJt<*=%oEadpLHhPaiw_p@n!jEW!5a z07W|27O}JVWAZp%F^jE!Q3BRSBp9acyyK%gf=%!-%2^aazFHY)JW5rYmLRsSS~uff zTQi971(c7PdkSZQX8b+|chN{KsG5NdxN8Q!hCZX&9RRoy7;sPE7q8WPYA~{#`v3p{ M07*qoM6N<$f(inx(EtDd literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/unionpay.png b/public/images/credit_cards/unionpay.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa7031c20f27459de844eac0f9f1c4f36223c21 GIT binary patch literal 3695 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 N002ovPDHLkV1jCfBMbll literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/unknown.png b/public/images/credit_cards/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8f49aa7e5b8750e0fee802391a004c867dcca9 GIT binary patch literal 1776 zcmaJ?c~BE)6kiI8M^U8Kf({S@MSG;C?|pCH@AuAcHzzP)qs6kd z%K!kd5DEFg*eb#v!ji?<+r_`w16yoRfdmafV$o!&1_C&8BnHBXl+x``FeH_yB(_3c z0AT6_he}Y1coQf?lq9LqhNM%fF*E>p`RLSASv-W|VxaA?ijDvMQWG8r%h~u(Jj4{S zng=OhVX6iSNeu{&PxYk1WE{%;&jRcl@`>o@iV+2CL7gcJZ{DWjc4QE z1SJs%;&_M#!g-L~i82b6ieoTHRJsR)K_%d56e^8O!EOeTN(Vg{AdQKez3`YfjXV|% z=KIb1!gg%D0!7sznVg)QOiFeqA)4)EDvQN3a?of*%z~&*QK3>DQKfa9W8gztnFdy) zFrva48Kp5u63WJ7k-kYmsh+1*X=lrX6^yKts>xIm#hB8Zp;-L?rb^|!wH6JA{*Cvo z#M;mlHAD`Ev`CUhhBYqM(dbGI@-&bXMKqxZk}y}rKm~##S_PuU@j@854PvPbRv8s8 zGYGL56sfeRR3(E%d^R5AAi=O4<&Z4B6P)|Fn8eh0TvqoF80lGe7!}3Y&KgHrU#UN(=0~#EAHuP~F4fgLebg z2Ccr?b|)iPu+*ZVF6YLz8&CanrbuYkB?ckQBz~94;g~)crrRnIg(*@Sz z;l-k*nOhdcroKLJ2U?ysO}bvOn>(1kaw55nttI95d9H}uwk`X3XWYxd!PtA}lv!z{ z4tixvOAFExJ=!xms{SzJ%GA_UZ`Dd0Tl|&*vo1UKD z*Whe5o!@}B&U0rlV#{3ZbvhlTC}(NeAaUc_trmW(0h_9hbUhq3DvD%P84TK8wl+3Z zdVToqCkC^_N7L4QnU~km*;!oQPkZc8|AZRYHZZ1(nBcIs{ZMl9LR)jQuVWrHkqv^? zWo0((6~}sHH7o!8W8%4G!77Ez=#d1*M+SodO-uWB{mtf*l9CODtxvt2bIG})uWk2u z*Y>}x)%W&3D9o^Sa?bqDdgTiVaHdDE?|5-LI}T9vM^U;9JHo@mi#9pGxSWzUj){hM zKeLaCRG#hX9DHB<1@ZXiyO$}M_;{hLn%Hh_uI%p0&C^`z zNnl>?b@=L(<+v6#4X&l$OFM zT0|m~_ui}N_M$uKrX>VFt0bmR3-SBvtgNgi{fVfP%WX=#z03-HQ>DUZ*WBb08iT^O zK^cDQ!s9`Q{otogE%K@8hQwxzy&avlRZeL9e59czN%p@>hc)zdDK~NKP@W6rl za1oI}c%@G?T@p%I<6-T~vjI3847-*9xKmF1&Neo72x}^&lip^{AJ+r#9OtCUWLaGg z9>6;Mi}><+XFcmlMPdJ%>!L-K4WhbZ4A4LXXWyjy-bhF#EuKe?oah$mIDW zVZR174)x~m>90RgpO*HTH9asiBpfFuO;*Est&?G{htju(O#|LH`j;1Ric{Xp;m5cl unbr2al)fH$SV^R7@iNy*-dOG5YodWYO;?j%3H>9C{~(bdfM3sz&in^+OUS+e literal 0 HcmV?d00001 diff --git a/public/images/credit_cards/visa.png b/public/images/credit_cards/visa.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd17c5a280af87c03886a2e3fcbda7ab79aa859 GIT binary patch literal 3182 zcmaJ^c|6nqAD<)PXX(yW%}CqVvBL~=F56g4Ii|x=vwg7G=9o6htsLoM5}}-lTG2($ zP&$xBNk~PJzDOl=_M5)d@At>A-{+yO%U)S@WchXKrTd<;!A=P!vea?h=Qa9+5mn` zyYOJZCEU@K9_~*!Wk9VgA?AFXgn$KbX%IdufE|M4TR?yC;w1YeGXe_v;llN|fc}%z zZpu!G4JR0Y7#SGq(~&3?1dBC5VT`a?lpX|)M4=H#$&1xTVQ@xR9NHN2^MOjD1v7kb z&IHoWSdxkRxS-~UM*;u;nRAe?~^PG~S)GB_WtrBH!5n_z&(m26aU?(LEl}%i;ODxrMrciFsjud=u^39zIK5Rdwb}K1{Xp__>FSZLqa!6}@9- zGgDz+gUKMcic;Os^qg^T09J*<@w&Rft!xUQQvKIP?mF5(u9?vE26G{awdrI_&N$bn zWd3p%#b;}y9L(ih^AWN9DThD(xr#H|K+F0`E=ie1rXxn&Mn3a1@v!8;AQ zrFNZY$j+8~k-SRrgiPi%)b$pb@dY(_^49cVo3i_bmwGCjCI_GSZfYn&BxZH5XbN!3 zJAw%a`?^W6&O?`^F`?4%s$hdtRIz$aT*0*x9oJUJCN2A8lg-J_uyXs?Q+L+i;DNPT zSBRz>2dRNC^pZq{nSt=^TG`?*kCGD_u(saly!u9sibmceWuq%9cl)TQ!OgSJEXCCc zG1l@YQUhw(a^G@l;%|SuEe&5^Rj`?JIjgV5@G2(%o3+_Wr4Pe_<@B`J>#SPwwIbym zLcOHS@BK}~_vUu2g+>=J&H@n_sbw@!O?pJoZ%X zPF0<1vv_f1R@khaHhG~ff}Tx^X zk!Pwl#{2^Syv1LoZq&B7NOPw7Ugc-=i}UWO!yPf|V7uv_ijVTo7i%0Vh=UWcU-c(> z-eZqtyfo&;+1XJC&wy_#$zO82F3acg9lo{r?vp-?32JMzkIOk1KepP-vQ9Auf7|0V z?~n&>WiHB`>KW6;pjKG3y^ti#XnVHC=qlFj^6#&2g)#X3y<46An3iJ7)T7u|@Ur zfY;S(wfJed@`c*8*?HONo&?TnFit@R1zbUnJKs8}e|_oP!WV_iJU|;B@2kuw zkeVL(4v1RZTStnX!x-ZTE3xa2HI>EZ#;JG0j3*UWsS6>g&h4U(mkFrNE^G2!3McUzaKAncUGeWO6M!&+=Fj&8#JKDx4cPGo#zJ@nU~+3r}MuM`_u+Q|YH;uU^Tt zo&Q?m`)0w)$kTeCwh4w;<>X{idwY8I$xH9twJ*f$dc2oP7IrD1G7@nqqyaA~$;~fK z`EF=W!M`dJ!&{>ieS6-$w2hCHH)D#UUS1s`t9UvtP93K)pKat1&+Tgld?upi=9oU8 zQi|iW#DgbGojj>Xrht#V9%ddk`HYl_7z-F_D0rM)oPkWZDBw&brC0h(dAAdbdib+R zb6+R8MZrE#ds^dcI}#d^~!lWq|P5~vS=+q zUm{Fk@i*UOrihep?45^)lBJxLNRM23_7`9ao7Y!8 zQ=qvD+&g1?kCL7ECEe+1DcFZl7wt!- 'Refunded', 'refunded_payment' => 'Refunded Payment', 'activity_39' => ':user refunded :adjustment of a :payment_amount payment (:payment)', - + 'card_expiration' => 'Exp: :expires', + + 'card_unknown' => 'Unknown', + 'card_amex' => 'American Express', + 'card_carteblanche' => 'Carte Blanche', + 'card_unionpay' => 'UnionPay', + 'card_diners' => 'Diners Club', + 'card_discover' => 'Discover', + 'card_jcb' => 'JCB', + 'card_laser' => 'Laser', + 'card_maestro' => 'Maestro', + 'card_mastercard' => 'MasterCard', + 'card_solo' => 'Solo', + 'card_switch' => 'Switch', + 'card_visa' => 'Visa', ); return $LANG; diff --git a/resources/views/clients/show.blade.php b/resources/views/clients/show.blade.php index 0e434b3d07d4..db49da710efe 100644 --- a/resources/views/clients/show.blade.php +++ b/resources/views/clients/show.blade.php @@ -290,8 +290,10 @@ trans('texts.invoice'), trans('texts.transaction_reference'), trans('texts.method'), + trans('texts.source'), trans('texts.payment_amount'), - trans('texts.payment_date')) + trans('texts.payment_date'), + trans('texts.status')) ->setUrl(url('api/payments/' . $client->public_id)) ->setCustomValues('entityType', 'payments') ->setOptions('sPaginationType', 'bootstrap')