From cb43bc2e13a7c617204bef989f4c01fcfe919808 Mon Sep 17 00:00:00 2001 From: Djery-Tom Date: Mon, 24 Jan 2022 12:04:40 +0100 Subject: [PATCH] Implements Qrcode --- .gitignore | 1 + app/Http/Controllers/CommissionController.php | 4 - app/Http/Controllers/Controller.php | 4 + app/Http/Controllers/CreditController.php | 5 - app/Http/Controllers/HelperController.php | 47 ++- app/Http/Controllers/NanoCreditController.php | 5 - app/Http/Controllers/QRCodeController.php | 169 +++++++++++ .../Controllers/TransactionController.php | 4 - app/Http/Controllers/UserController.php | 4 - app/Http/Controllers/UserGroupController.php | 5 - app/Http/Controllers/WalletController.php | 5 - .../iLinkTransactionController.php | 4 - app/Models/Agent.php | 2 + app/Models/User.php | 2 + app/Traits/Helper.php | 27 ++ app/helpers.php | 267 ++++++++++++++++++ composer.json | 6 +- composer.lock | 170 ++++++++++- ..._19_121710_add_qr_code_to_agents_table.php | 32 +++ ...22_01_19_122056_update_agent_plus_view.php | 71 +++++ ...1_19_173614_add_qr_code_to_users_table.php | 32 +++ public/logo.png | Bin 0 -> 8001 bytes resources/views/emails/qr_code.blade.php | 182 ++++++++++++ routes/web.php | 8 + 24 files changed, 1013 insertions(+), 43 deletions(-) create mode 100755 app/Http/Controllers/QRCodeController.php create mode 100644 app/helpers.php create mode 100644 database/migrations/2022_01_19_121710_add_qr_code_to_agents_table.php create mode 100644 database/migrations/2022_01_19_122056_update_agent_plus_view.php create mode 100644 database/migrations/2022_01_19_173614_add_qr_code_to_users_table.php create mode 100644 public/logo.png create mode 100755 resources/views/emails/qr_code.blade.php diff --git a/.gitignore b/.gitignore index f11b352..b1e46fa 100755 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ Homestead.yaml /storage/api-docs /public/swagger-ui-assets /public/documents +/public/qrcodes diff --git a/app/Http/Controllers/CommissionController.php b/app/Http/Controllers/CommissionController.php index 8120149..1153edf 100755 --- a/app/Http/Controllers/CommissionController.php +++ b/app/Http/Controllers/CommissionController.php @@ -4,14 +4,10 @@ namespace App\Http\Controllers; use App\Models\TransfertCommissionTransaction; use App\Models\Wallet; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\Response; class CommissionController extends Controller { - use ApiResponser; - use Helper; /** * Create a new controller instance. * diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index b5ffe65..d79524a 100755 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use App\Traits\ApiResponser; +use App\Traits\Helper; use Laravel\Lumen\Routing\Controller as BaseController; /** @@ -19,4 +21,6 @@ use Laravel\Lumen\Routing\Controller as BaseController; class Controller extends BaseController { // + use ApiResponser; + use Helper; } diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 6b2fe48..973e351 100755 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -7,8 +7,6 @@ use App\Models\DemandeCredit; use App\Models\Network; use App\Models\Wallet; use App\Models\WalletAgent; -use App\Traits\ApiResponser; -use App\Traits\Helper; use App\Twilio; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -16,9 +14,6 @@ use Illuminate\Support\Facades\DB; class CreditController extends Controller { - use ApiResponser; - use Helper; - /** * Create a new controller instance. *a diff --git a/app/Http/Controllers/HelperController.php b/app/Http/Controllers/HelperController.php index 5c348fc..eb05a82 100755 --- a/app/Http/Controllers/HelperController.php +++ b/app/Http/Controllers/HelperController.php @@ -13,17 +13,14 @@ use App\Models\Wallet; use App\Models\WalletAgent; use App\Models\WalletsUser; use App\Models\WalletTransaction; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Mail; use Maatwebsite\Excel\Facades\Excel; class HelperController extends Controller { - use ApiResponser; - use Helper; - /** * Create a new controller instance. * @@ -220,4 +217,44 @@ class HelperController extends Controller // return $this->errorResponse(trans('errors.unexpected_error')); // } // } + public function notifyNewUser(Request $request) + { + // Notifier le nouvel agent inscrit + $this->validate($request, [ + 'subject' => 'required|string', + 'email' => 'required|string', + 'category' => 'required_if:user_type,agent|string', + 'message' => 'required|string', + 'user_id' => 'required|integer', + 'user_type' => 'required|in:user,agent' + ]); + + $subject = $request->input('subject'); + $email = $request->input('email'); + $message = $request->input('message'); + $category = $request->input('category'); + $user_id = $request->input('user_id'); + $user_type = $request->input('user_type'); + + try { + //Check if the directory already exists. + $qr_code_pdf = null; + if (empty($category) || $category == 'geolocated') { + $qr_code_pdf = $this->generateQRCode($user_id, $user_type); + } + + $recipients = [preg_replace("/\s+/", "", $email)]; // Supprimer les espaces dans le mail + Mail::mailer('smtp')->raw($message, function ($message) use ($recipients, $subject, $qr_code_pdf) { + $message->subject($subject) + ->to($recipients); + if (!empty($qr_code_pdf)) { + $message->attachData($qr_code_pdf->output(), 'qr_code.pdf'); + } + }); + + } catch (\Throwable $t) { + Log::error('-------- Mail not sent -----------'); + Log::error($t->getMessage() . " :\n" . $t->getTraceAsString()); + } + } } diff --git a/app/Http/Controllers/NanoCreditController.php b/app/Http/Controllers/NanoCreditController.php index e6a2c4b..adc0567 100755 --- a/app/Http/Controllers/NanoCreditController.php +++ b/app/Http/Controllers/NanoCreditController.php @@ -14,16 +14,11 @@ use App\Models\UsersGroupsDemandesValidation; use App\Models\Wallet; use App\Models\WalletAgent; use App\Models\WalletsUser; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class NanoCreditController extends Controller { - use ApiResponser; - use Helper; - /** * Create a new controller instance. * diff --git a/app/Http/Controllers/QRCodeController.php b/app/Http/Controllers/QRCodeController.php new file mode 100755 index 0000000..1381cef --- /dev/null +++ b/app/Http/Controllers/QRCodeController.php @@ -0,0 +1,169 @@ +validate($request, [ + 'user_id' => 'required|integer', + 'type' => 'required|in:user,agent' + ]); + $type = $request->input('type'); + $user_id = $request->input('user_id'); + try { + $qr_code_pdf = $this->generateQRCode($user_id, $type); +// $recipients = [preg_replace("/\s+/", "", $email)]; // Supprimer les espaces dans le mail +// Mail::mailer('smtp')->raw($messageText, function ($message) use ($recipients, $title, $pdf, $notice) { +// $message->subject($title) +// ->to($recipients) +// ->attachData($pdf->output(), $title . ' - ' . $notice->id_tax_notice . ".pdf"); +// }); + return $this->successResponse(trans('messages.successful_transaction')); + } catch (\Throwable $t) { + Log::error('-------- Mail not sent -----------'); + Log::error($t->getMessage()); + return $this->errorResponse(trans('errors.unexpected_error')); + } + } + + /** + * @OA\Get( + * path="/qrcode/read", + * summary="Lire les informations à partir de l'id de l'utilisateur obtenu en scanant le QRCode", + * tags={"QRCode"}, + * security={{"api_key":{}}}, + * @OA\Parameter( + * parameter="id_user", + * name="id_user", + * description="ID de l'utilisateur", + * @OA\Schema( + * type="integer" + * ), + * in="query", + * required=true + * ), + * @OA\Parameter( + * parameter="type", + * name="type", + * description="Type d'utilisateur", + * @OA\Schema( + * type="string", + * enum={"user","agent"} + * ), + * in="query", + * required=true + * ), + * @OA\Response( + * response=200, + * description="OK", + * @OA\JsonContent( + * ref="#/components/schemas/ApiResponse", + * example = { + * "status" : 200, + * "response" : {"id":349,"uid":"5fcb90ab7197f8.26608831", + * "firstname":null,"lastname":"Tom Di","phone":"+237690716648","email":"ddoubletom@gmail.com","user_code":"vdVtq7ym9S","numero_carte":null, + * "expiration_date":null,"adresse":"kotto","solde":0,"salt":"dbbaea33d9","validation_code":"xuty8dbq","active":1,"date_modified":"2020-12-05T14:52:43.000000Z", + * "date_created":"2020-12-05T14:52:43.000000Z","network_id":185,"group_id":null,"balance_credit":0,"balance_epargne":0,"balance_nano_health":11335000, + * "date_adhesion":null,"id_bank_country":null,"iban":null}, + * "error":null + * } + * ) + * ) + * ) + */ + //Lire les infos d'un utilisateur à partir de son id + public function read(Request $request) + { + $this->validate($request, [ + 'user_id' => 'required|integer', + 'type' => 'required|in:user,agent' + ]); + $type = $request->input('type'); + $user_id = $request->input('user_id'); + if ($type == 'user') { + $user = User::findOrFail($user_id); + } else { + $user = Agent::findOrFail($user_id); + } + return $this->successResponse($user); + } + + /** + * @OA\Get( + * path="/qrcode/image", + * summary="Generer l'image du QRCode d'un utilisateur à partir de son id", + * tags={"QRCode"}, + * security={{"api_key":{}}}, + * @OA\Parameter( + * parameter="id_user", + * name="id_user", + * description="ID de l'utilisateur", + * @OA\Schema( + * type="integer" + * ), + * in="query", + * required=true + * ), + * @OA\Parameter( + * parameter="type", + * name="type", + * description="Type d'utilisateur", + * @OA\Schema( + * type="string", + * enum={"user","agent"} + * ), + * in="query", + * required=true + * ), + * @OA\Response( + * response=200, + * description="OK", + * @OA\JsonContent( + * ref="#/components/schemas/ApiResponse", + * example = { + * "status" : 200, + * "response" : "image en base64", + * "error":null + * } + * ) + * ) + * ) + */ + //Generer l'image du QRCode d'un utilisateur à partir de son id + public function image(Request $request) + { + $this->validate($request, [ + 'user_id' => 'required|integer', + 'type' => 'required|in:user,agent' + ]); + $type = $request->input('type'); + $user_id = $request->input('user_id'); + if ($type == 'user') { + $user = User::findOrFail($user_id); + } else { + $user = Agent::findOrFail($user_id); + } + $data = 'type=' . $type . '&id=' . $user->id; + return $this->successResponse(base64_encode(\SimpleSoftwareIO\QrCode\Facades\QrCode::format('svg') + ->size(300)->errorCorrection('H') + ->generate($data))); + } +} diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 1484cc5..776b274 100755 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -9,15 +9,11 @@ use App\Models\NetworksAgent; use App\Models\Wallet; use App\Models\WalletAgent; use App\Models\WalletTransaction; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\Request; use Illuminate\Http\Response; class TransactionController extends Controller { - use ApiResponser; - use Helper; /** * Create a new controller instance. diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index d91c4bb..55a0968 100755 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -7,8 +7,6 @@ use App\Models\Agent; use App\Models\AgentPlus; use App\Models\Identification; use App\Models\User; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\File; @@ -16,8 +14,6 @@ use Illuminate\Support\Str; class UserController extends Controller { - use ApiResponser; - use Helper; /** * Create a new controller instance. diff --git a/app/Http/Controllers/UserGroupController.php b/app/Http/Controllers/UserGroupController.php index 9e46e46..5817ce8 100755 --- a/app/Http/Controllers/UserGroupController.php +++ b/app/Http/Controllers/UserGroupController.php @@ -11,17 +11,12 @@ use App\Models\UsersGroupsDemandesValidation; use App\Models\Wallet; use App\Models\WalletAgent; use App\Models\WalletsUser; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\DB; class UserGroupController extends Controller { - use ApiResponser; - use Helper; - /** * Create a new controller instance. * diff --git a/app/Http/Controllers/WalletController.php b/app/Http/Controllers/WalletController.php index df26e84..0b64f98 100755 --- a/app/Http/Controllers/WalletController.php +++ b/app/Http/Controllers/WalletController.php @@ -8,8 +8,6 @@ use App\Models\User; use App\Models\UsersBankingAccountVerification; use App\Models\WalletAgent; use App\Models\WalletsUser; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -18,9 +16,6 @@ use Illuminate\Support\Facades\Log; class WalletController extends Controller { - use ApiResponser; - use Helper; - /** * Create a new controller instance. * diff --git a/app/Http/Controllers/iLinkTransactionController.php b/app/Http/Controllers/iLinkTransactionController.php index 3c53f17..a097208 100755 --- a/app/Http/Controllers/iLinkTransactionController.php +++ b/app/Http/Controllers/iLinkTransactionController.php @@ -18,8 +18,6 @@ use App\Models\Wallet; use App\Models\WalletAgent; use App\Models\WalletIlinkTransaction; use App\Models\WalletsUser; -use App\Traits\ApiResponser; -use App\Traits\Helper; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -29,8 +27,6 @@ use Illuminate\Support\Facades\Log; class iLinkTransactionController extends Controller { - use ApiResponser; - use Helper; private $PAYMENT_URL = "/adyen-api/v1/transaction/payement"; private $PAYOUT_URL = "/adyen-api/v1/transaction/payout"; diff --git a/app/Models/Agent.php b/app/Models/Agent.php index 424615a..5fcdb23 100644 --- a/app/Models/Agent.php +++ b/app/Models/Agent.php @@ -24,6 +24,7 @@ use Illuminate\Database\Eloquent\Model; * @property string|null $encrypted_password * @property string|null $salt * @property int|null $active + * @property int $qr_code * @property Carbon|null $date_created * @property Carbon|null $open_hours * @property Carbon|null $close_hours @@ -72,6 +73,7 @@ class Agent extends Model 'encrypted_password', 'salt', 'active', + 'qr_code', 'date_created', 'open_hours', 'close_hours', diff --git a/app/Models/User.php b/app/Models/User.php index 9b53b10..fb2ffb3 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -28,6 +28,7 @@ use Illuminate\Database\Eloquent\Model; * @property string $salt * @property string $validation_code * @property int $active + * @property boolean $qr_code * @property Carbon $date_modified * @property Carbon $date_created * @property int $network_id @@ -84,6 +85,7 @@ class User extends Model 'salt', 'validation_code', 'active', + 'qr_code', 'date_modified', 'date_created', 'group_id', diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index bab1d64..10df6d9 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -4,6 +4,7 @@ namespace App\Traits; +use App\Models\Agent; use App\Models\AgentPlus; use App\Models\CodeGenerer; use App\Models\ConfigWallet; @@ -19,6 +20,7 @@ use App\Models\Wallet; use App\Models\WalletAgent; use App\Models\WalletIlinkTransaction; use App\Models\WalletsUser; +use Barryvdh\DomPDF\Facade as PDF; use Brick\Math\RoundingMode; use Brick\Money\Context\AutoContext; use Brick\Money\CurrencyConverter; @@ -30,6 +32,7 @@ use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; @@ -541,4 +544,28 @@ trait Helper } } + public function generateQRCode($user_id, $user_type) + { + if ($user_type == 'user') { + $user = User::findOrFail($user_id); + } else { + $user = Agent::findOrFail($user_id); + } + + //Check if the directory already exists. + $directoryName = '/qrcodes/' . $user_type . 's/'; + if (!is_dir(public_path() . $directoryName)) { + File::makeDirectory(public_path() . $directoryName, 0777, true); + } + + $path = $directoryName . $user->id . '.pdf'; + $pdf = PDF::loadView('emails.qr_code', ['lastname' => $user->lastname, 'data' => 'type=' . $user_type . '&user_id=' . $user->id]) + ->setPaper('a4', 'portrait')->setWarnings(false)->save(public_path($path)); + + $user->qr_code = config('app.url') . $path; + $user->save(); + + return $pdf; + } + } diff --git a/app/helpers.php b/app/helpers.php new file mode 100644 index 0000000..4292c64 --- /dev/null +++ b/app/helpers.php @@ -0,0 +1,267 @@ +asset($path, $secured); + } +} + +if (!function_exists('config_path')) { + /** + * Return the path to config files + * @param null $path + * @return string + */ + function config_path($path = null) + { + return app()->getConfigurationPath(rtrim($path, ".php")); + } +} + +if (!function_exists('public_path')) { + + /** + * Return the path to public dir + * @param null $path + * @return string + */ + function public_path($path = null) + { + return rtrim(app()->basePath('public/' . $path), '/'); + } +} + +if (!function_exists('storage_path')) { + + /** + * Return the path to storage dir + * @param null $path + * @return string + */ + function storage_path($path = null) + { + return app()->storagePath($path); + } +} + +if (!function_exists('database_path')) { + + /** + * Return the path to database dir + * @param null $path + * @return string + */ + function database_path($path = null) + { + return app()->databasePath($path); + } +} + +if (!function_exists('resource_path')) { + + /** + * Return the path to resource dir + * @param null $path + * @return string + */ + function resource_path($path = null) + { + return app()->resourcePath($path); + } +} + +//if (!function_exists('lang_path')) { +// +// /** +// * Return the path to lang dir +// * @param null $str +// * @return string +// */ +// function lang_path($path = null) +// { +// return app()->getLanguagePath($path); +// } +//} + +if (!function_exists('asset')) { + /** + * Generate an asset path for the application. + * + * @param string $path + * @param bool $secure + * @return string + */ + function asset($path, $secure = null) + { + return app('url')->asset($path, $secure); + } +} + +if (!function_exists('elixir')) { + /** + * Get the path to a versioned Elixir file. + * + * @param string $file + * @return string + */ + function elixir($file) + { + static $manifest = null; + if (is_null($manifest)) { + $manifest = json_decode(file_get_contents(public_path() . '/build/rev-manifest.json'), true); + } + if (isset($manifest[$file])) { + return '/build/' . $manifest[$file]; + } + throw new InvalidArgumentException("File {$file} not defined in asset manifest."); + } +} + +if (!function_exists('auth')) { + /** + * Get the available auth instance. + * + * @return \Illuminate\Contracts\Auth\Guard + */ + function auth() + { + return app('Illuminate\Contracts\Auth\Guard'); + } +} + +if (!function_exists('bcrypt')) { + /** + * Hash the given value. + * + * @param string $value + * @param array $options + * @return string + */ + function bcrypt($value, $options = array()) + { + return app('hash')->make($value, $options); + } +} + +if (!function_exists('redirect')) { + /** + * Get an instance of the redirector. + * + * @param string|null $to + * @param int $status + * @param array $headers + * @param bool $secure + * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + */ + function redirect($to = null, $status = 302, $headers = array(), $secure = null) + { + if (is_null($to)) return app('redirect'); + return app('redirect')->to($to, $status, $headers, $secure); + } +} + +if (!function_exists('response')) { + /** + * Return a new response from the application. + * + * @param string $content + * @param int $status + * @param array $headers + * @return \Symfony\Component\HttpFoundation\Response|\Illuminate\Contracts\Routing\ResponseFactory + */ + function response($content = '', $status = 200, array $headers = array()) + { + $factory = app('Illuminate\Contracts\Routing\ResponseFactory'); + if (func_num_args() === 0) { + return $factory; + } + return $factory->make($content, $status, $headers); + } +} + +if (!function_exists('secure_asset')) { + /** + * Generate an asset path for the application. + * + * @param string $path + * @return string + */ + function secure_asset($path) + { + return asset($path, true); + } +} + +if (!function_exists('secure_url')) { + /** + * Generate a HTTPS url for the application. + * + * @param string $path + * @param mixed $parameters + * @return string + */ + function secure_url($path, $parameters = array()) + { + return url($path, $parameters, true); + } +} + + +if (!function_exists('session')) { + /** + * Get / set the specified session value. + * + * If an array is passed as the key, we will assume you want to set an array of values. + * + * @param array|string $key + * @param mixed $default + * @return mixed + */ + function session($key = null, $default = null) + { + if (is_null($key)) return app('session'); + if (is_array($key)) return app('session')->put($key); + return app('session')->get($key, $default); + } +} + + +if (!function_exists('cookie')) { + /** + * Create a new cookie instance. + * + * @param string $name + * @param string $value + * @param int $minutes + * @param string $path + * @param string $domain + * @param bool $secure + * @param bool $httpOnly + * @return \Symfony\Component\HttpFoundation\Cookie + */ + function cookie($name = null, $value = null, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true) + { + $cookie = app('Illuminate\Contracts\Cookie\Factory'); + if (is_null($name)) { + return $cookie; + } + return $cookie->make($name, $value, $minutes, $path, $domain, $secure, $httpOnly); + } +} diff --git a/composer.json b/composer.json index 61073c0..7db0bbd 100755 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "laravel/legacy-factories": "^1.1", "laravel/lumen-framework": "^8.0", "maatwebsite/excel": "^3.1", + "simplesoftwareio/simple-qrcode": "^4.2", "twilio/sdk": "^6.28" }, "require-dev": { @@ -26,7 +27,10 @@ "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" - } + }, + "files": [ + "app/helpers.php" + ] }, "autoload-dev": { "classmap": [ diff --git a/composer.lock b/composer.lock index cd46b41..f4e0634 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,61 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4a09e7af16470c35d8f42e3ef2ce813a", + "content-hash": "634654b92540c00e468be0b92031e6cd", "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09", + "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^1.4", + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.4" + }, + "time": "2021-06-18T13:26:35+00:00" + }, { "name": "barryvdh/laravel-dompdf", "version": "v0.9.0", @@ -253,6 +306,53 @@ ], "time": "2020-09-25T10:41:43+00:00" }, + { + "name": "dasprid/enum", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.3" + }, + "time": "2020-10-02T16:03:48+00:00" + }, { "name": "dflydev/dot-access-data", "version": "v3.0.1", @@ -4799,6 +4899,74 @@ }, "time": "2020-06-01T09:10:00+00:00" }, + { + "name": "simplesoftwareio/simple-qrcode", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/SimpleSoftwareIO/simple-qrcode.git", + "reference": "916db7948ca6772d54bb617259c768c9cdc8d537" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SimpleSoftwareIO/simple-qrcode/zipball/916db7948ca6772d54bb617259c768c9cdc8d537", + "reference": "916db7948ca6772d54bb617259c768c9cdc8d537", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0", + "ext-gd": "*", + "php": ">=7.2|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1", + "phpunit/phpunit": "~9" + }, + "suggest": { + "ext-imagick": "Allows the generation of PNG QrCodes.", + "illuminate/support": "Allows for use within Laravel." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "SimpleSoftwareIO\\QrCode\\QrCodeServiceProvider" + ], + "aliases": { + "QrCode": "SimpleSoftwareIO\\QrCode\\Facades\\QrCode" + } + } + }, + "autoload": { + "psr-4": { + "SimpleSoftwareIO\\QrCode\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Simple Software LLC", + "email": "support@simplesoftware.io" + } + ], + "description": "Simple QrCode is a QR code generator made for Laravel.", + "homepage": "https://www.simplesoftware.io/#/docs/simple-qrcode", + "keywords": [ + "Simple", + "generator", + "laravel", + "qrcode", + "wrapper" + ], + "support": { + "issues": "https://github.com/SimpleSoftwareIO/simple-qrcode/issues", + "source": "https://github.com/SimpleSoftwareIO/simple-qrcode/tree/4.2.0" + }, + "time": "2021-02-08T20:43:55+00:00" + }, { "name": "swagger-api/swagger-ui", "version": "v3.52.3", diff --git a/database/migrations/2022_01_19_121710_add_qr_code_to_agents_table.php b/database/migrations/2022_01_19_121710_add_qr_code_to_agents_table.php new file mode 100644 index 0000000..cade772 --- /dev/null +++ b/database/migrations/2022_01_19_121710_add_qr_code_to_agents_table.php @@ -0,0 +1,32 @@ +string('qr_code')->nullable()->after('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('agents', function (Blueprint $table) { + $table->dropColumn(['qr_code']); + }); + } +} diff --git a/database/migrations/2022_01_19_122056_update_agent_plus_view.php b/database/migrations/2022_01_19_122056_update_agent_plus_view.php new file mode 100644 index 0000000..d0ad148 --- /dev/null +++ b/database/migrations/2022_01_19_122056_update_agent_plus_view.php @@ -0,0 +1,71 @@ +string('qr_code')->nullable()->after('active'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn(['qr_code']); + }); + } +} diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..14d412a32e7a7f0ebd19cdc4bd0d548ce682b7ce GIT binary patch literal 8001 zcmeHsS5Om7*lsX1r3)y6G!;;q(t8I%=|bookr0}MUP3@X1QqFs^iJr#7wJ-@1VZnf zV2E@H1Wvwld9KdInRE4D?Ci|W&bzzMzWs^P(^03o!+Zw-08qWsP<;ac5bY5L2{|cY zWk7@7jWFGQuVLy508rfhZxA7ug0BDow&Pc-N``*vm?et$7RIoF!`jyPws_aUnk4dd z$+KU#izju2X4m3wc^L3eYN=BRi03n)f6|r$MeV@Vj)p%&>ApSy_jyT!WEtYul6vc& zd{q}+92WSZU zx$oGGtlOiM;oAU!P1X}EVe)yDPXwr9;G_bC6p%Xs0Q_niK!D9NWo7_ClMV?0m_)~t z0)D;;7X<*4|7Yv}9|S;sEMZX8GHT&bxFlv7pE=q>8xTIul%Xil7;PH&t<{* z;JIa>vAa&|-Zo)_eJ0f~vA}=-2TB%j>Pd~St1qf`{pndsW58FoINJ2VkCnE9ARsWD z))%bs)>_wb!PeXgM_3t%pj|-0$pWMo8UnwHh$d`ar2a@}hC+*}n%$-!k$!bNExF+R==#x8f1Q{i_Q5Coi_-MXf#yNY{6xCw# z9r?09B<(Yl0W;0pxcZVpW^yQh**Ia*atM-jK`B3>ZKdD{9fnOECQRg_m->} z?C=07m*E;ID^a1?M(wcmDF?-?`P-u-vhYpgrToI#?S#V@e1zE#d0JT`t`I+v^u4G#y9Ezmqm9 z^LwZIRF6+o?d*L7tEFyu5}NEl(lbwhW^#2_pO&F20*`naUA)fyL(-e#T91^ zBn0rzf4Lcyip9eWDnmO8o1Ng%g&$7;P4$)F^PYpWwRE4Psp?Fj#}c%nJii)`q6%h4 z3hG8z?mU^cA_@JSL1Ub8F`#hq4zB+B zp~>{l+zY#sJ8S#}X!*J7gZTxt=Wg2!PEl>()r?6LV|$IA>BqV|a_qU& zxHzK(Gu3Hz-`{i5^b-&A4!qb}aR(p%o5Kc_QD&(m9Yr`}(d`TP%V)y9X99=WekOs~ z^jP7DcY3nr;H-pOuoYEe;4hyDL$ti4kX60IJKl-a=7Bg``qO=p&!lzs|JGErotOU> z<;?`GwMvVRPJds9nmr$H`+PpMppT*fI}YZV`Su zQ;}hBwV-;cYL7E2pZ1hR_^~#&P2U2a^ZbeRO;QmuO#yFTy|+QLd1G;2An$?cx~Z^) z_grpn+v7GI=451Ghe=e}xhzeTSkTZhP#L+53XFvK4>TNHz8SPvCn%d!&$)xt+kITI z^ea=k-Gqyd_e*(IG2QP>Vb1S`407l7;el zk-go5+`a{au&d(P?7~GV8Zizv8n8cyiS^LW=NAzK>uNR4JPkN#yHcxd@nU?VC$%b5?+_va84d8HNpliXPj zYQQ!6ap6CAk1oNcitMMicYy_L3gOIa0_^URuUrh3Sa%#iDry?`MBcR1D#zO#FULyb zQe`Ol+*}*IUznN@VeIZanN)IiG>8$0j}>@>bIMCD6dZ!H~tya+x( zgboO9v->WcQrVWN77q0vgd}G*vl8MinJmjd8Nu4vdIrO5J3|d^rm*cQt#u{zQw|dS z4$sJ)c2DTO%V@z~7QAtIX0VE-aUM5B7!E3ogq)dki|)n>A_~wVLkosbOKM$&O!iK@ zzO_DoyR=NA--7zqC)etCzki5PG>ndH&0ySS50^iB%bXWf;@91gGu{~%X=RqP1(xSz zScncvY(%2S(JHv*<#jtc`gg)`YP3V{wtTCum2L?(&%3~K=7hIV@61?kg&I@4M_dmY zh~=O~jyHFLb0~-Oy591dt2KN)wF|;+0;$0FCj;g}6R|iv5D(dZh3esBBBtq{ z&;9WlIv)Q4O69IzGc)~hZ_g{B3tNS*pV>+wf*tSa~iOr%f7n z20uwlEf2hyongtm{$pPFR-xWetWFft@2Kxo{^?Q1KXhY_T2d>yTEI3RH<3ScDz_^0TBIYb}gBt!Y)Z%bR_ni^B(DnLNyS=^rF@8umJL|gptKGlQv2;(j(&hJ{{vCv> zpa>s(V8ISGrz{T{7j)Uzpni~9zI@k&5cio9`*Jn<9_8my*l|YL?XEFgh~Dw8nkdRp zdoVuw2_%=FYpNu_zP9s{ktvzRZ%?9}_wIr}BIB12;6oJtbRt-WK%`44gb^ zmNb?r{WUGhNo6@zASOrrn97N9T)jT+F+sECikU$aonTH2oKTf_KMI?#AU+-zNJx>s zjAynazK$vimWGe8u(9d9t(^;sYPDSuxG<`t+(GQcM%bftBSbezoxDP@noc>zP}|aCn@QtLwf3bepZ$e)*lZNyO^%O zYHZVnBX>GHBGVsR?p(o7lO?v#1J9t&vcL9Ut6NU+Ml%~^!;S4RGUteYiE_%!EluXg zxT+V~cxvJQ&Q;o-%O#h;G&;GhN-hwj07DqM^~0{6JUPY*4lbNgXw{$h~)lsS&4G%ZTVrR?4Kzmff0J-@gsa*Q7q5fS;_)6-M$ zIGRpZq?0jp^8nX5V8wQUi=2+Ro@v}-UZNOUL9_(KmAJcQN(a{PuD6;5C?HL#eHuN#~g9?({lN)m)o>Pw9|3oNlI?$k0 zrAg1L_6g0{Wx>0h__JcatvyZ;4?n#x3ODJyH-k0@yD7bkF!qYU zj=!z1+DQbChQm6fZq6fk*yo;x`~5l&du>c@5LHI$RFGR}NB9Q1JH&N*&JGJ+%~}S< zf`~qdN$CPZ+3?z4ir_kNx2VIwNh|4=A4q%DckqQn0_A?QHHIaLDs*@OqcS9LXrPBB5ND9}2C}P?YgmfHrHP*i9j( zrr2YufX%uN_r8-O_6>sMH~=CybBvufT2=TQXfPP)BQ3Qz*F?_ZQ%|$C{f=h<7c)AP5LyNQCTuh5oz92; zfeaVrjfZ&4n{Z@jL|nK}2g953VIJ19%Z{nzA2?Z+5P{eJnos@Jg(T)Tm*>TrwQ(2` zgWF>zwwhe(-jyxe+G*UEaPiDkrptG#osq6~=HcMmkF3okwFq)!2x>B)f|C6GI%16o zBL)`Inv4!(d%JMoX-oZXcwcfGN`C*6^_51W56#2MS7TJ%@pfIpIkh5DVwqo4cB3sX zkH$`qbUV3={JhE9#~MaNO~O0AMaZYb>GRCgI7ivA~w3Obt zRR4Ir#Q7~ytEYnZa4grnGRNx%Jp?o7(MsvF;FJ~E zQ`6zdv%3mT6j5eQDl881Iq_;>eUX@QUh1qhpp29L>EHD?*LHO-QD{_S_sw%|*-a&e?3efMs1R-#n#5hHOPsgHzI| z$g-Nq;`eM9)@v0qr%N0^ulnD!oPd9rH*Wv-;;591E4~?CVVPlBmF)WrkKA9rnDCg3 z?(jkj%|%l~pN&K9e{h3w7BBl9tJ7=LHS*ptwoetIotHM6H;xo*nn?4$oAnj~CqC4- zs0ez?B-h}+7iGy7f-o)4GjH!6OrMN+b&Eu{(E4L`f6TOXq#D)TG=(#D@+iZmuUagI z?s0y7ZFpq12;rEM$867%#$WK$w`2#oG|78D39HfKa_^D#B!DoC%GhKqxjVSHV_f;0 zd)s{^YJS9JsJ1+7yYpZ7i}GC(Eo{Lau`sU@|4Rl@0-o>Y?ho(oxyZOMY24dE=HR-j z^eqR6>C_PmYY!B+uT(G_ANZ`)rn)5{7`9!V%2XDgZzq|lI{XL_wl3HD-)NCh5Z`>x zvL-&TK_Oxx6n$8U{pU8E8Z25#-|SX$7PkXn3X9zSNH0pef+E*XTd2{vIlbP zUG3jp2Oten;!_L$gt@2<@4wQeK3!4g3n0S3HOfp>ljc+Y8u%%Y`z4qlE-|F&?2k|# z!@8NYA-hXbr?8Plfm`Gn@uN;%`7l2_8mDGylhcxsC^V?~D!ba{rKo^7V<{nm(xbG^ zr>PXKwwTQ(C=ewH*Q|4_C|_0B=pti9wE3I*zeV&WT^7JWEzQW6mS&UYWuu8jlA24@ z27~6$y=jUmB4=%|KfF`93H3VEx{xP_s1DWigR;^|Wnj&|y zq2v8WxbCvSzqruj#J2ir2)`1zsjd()<*LaiU0ENvY7_8#(EtGvS~osQcJ`83K9NZ6 zg5y^M=5S{&A^!6AlIaO^ikd4W5!X#dYSQ^e)Mb*(y4(O7Z@}L=rpH#&Ue!j>bS0Br zV$OIzt0Wuuo{w|PakK_0{cn13J!uPPS%G_(8Brs>|11fS7Bh#NW46k^0H!l6t>h$BRB?fw}QP z`fx(qRX>X{t8DMv^kDGzbxd+bDWvooysiu>tO%~Kazpy{Tn!j#9jh zIeSEXIdWTID*o$`ZC0{Q*Tm$#+17VUi-*-I&JD$usSmH$j2%pFsx1&BN3g~>gq|=P z>OSn-Sk%JRmZqi)6GkW^kSlkQis4mKk~VNq**b27;PIOXdO0a?0_OlJwKWF!xCp1c z(%HOE$+#|fPr#IoG1naSGC1XRCV7SRGa>95iguIS|2*cg6A~LG)$+|C_hiBCsw02W9boj?m=Z_Y<(8CygN@P#I?b_bdkJupbbD$H_Ff z(J8wi#v4m2>n~6I$I5N`gaEWDD(@Xb@7p~iGTlAIdAgo0M!%uF!#OIr=5a)vJ?6Qu z>_{PJ?0inh$XFgLY5=RO-~&d@g=gYD!EVQq< z7bN1O;$V>PDv2y{V)0*K@iW%5J#fazw>QpON5zubyxj#_4&6N4xOL6^858KZ%A~hO zxL=ETWxz0~^V>as+Dz{fc+emL=P%&U{p-foB+XgUQoXFaJohNFl>)aNpANzs>=Zix zIAvi9guPR~^E!r%Gqc8*K5Ng()ssDKA~{jRZ;2v$tc(&=BAd>z13%?K&mHLRzca zU8Q5MP@0VaO%9zAk zi+Mx9+$?LuN#iYt=-8L0P?9Q<*&){6E$Nzz+s360V>>H#ZlR3fu^+uH9%r83doM*= zC89U9g!DdNy4wN>qCSsMNdcF1$l+C9{r&O{NnG@8 zJ3#S^@RPe>+qS+_Y_aB)j?)hg(h$awSfA>rUv!&Douq*ECM|aXM&B7(kY-tjqfFhi zmYJD1X$VaKK)o-rj#(R17rn7765P$$T^CIR&@>X_#PEW!UJ=m5JcMpjq0odeCBUSi zhSJFx5nxVVy>tSiOtdbsItf01Sw!Sb2S$`Kjzy!{3HH0KjVlh{mvz{Sw3s + + + + + + + + + + + + +
+ + {{--

--}} + {{-- REPUBLIQUE GABONAISE--}} + + {{-- ---------------------}} + + {{-- Union-Travail-Justice--}} + + iLink World Corporation

+ +

-------------------

+ +

Le numérique au service de l'inclusion financière

+ + +

QR CODE - {{$lastname}} +

+ +
+ +
+
+ + + diff --git a/routes/web.php b/routes/web.php index dd91cbf..b50b0e6 100755 --- a/routes/web.php +++ b/routes/web.php @@ -124,4 +124,12 @@ $router->group(['prefix' => '', 'middleware' => 'auth'], function () use ($route }); }); }); + + //Notifications + $router->post('notify-new-user', 'HelperController@notifyNewUser'); + + //QRCode for agents + $router->get('qrcode/generate', 'QRCodeController@generate'); + $router->get('qrcode/read', 'QRCodeController@read'); + $router->get('qrcode/image', 'QRCodeController@image'); });