get("limit", 10)); return ["data" => $users]; } /** * @OA\Post( * path="/emitTransaction", * summary="Emettre une transaction vers le backend de iLink APP", * tags={"Transaction vers le backend de iLink App"}, * security={{"api_key":{}}}, * @OA\RequestBody( * description="Corps de la requete", * required=true, * @OA\MediaType( * mediaType="application/json", * @OA\Schema( * oneOf={ * @OA\Schema(ref="#/components/schemas/destination_channel_is_wallet"), * @OA\Schema(ref="#/components/schemas/destination_channel_is_cash"), * } * ), * examples = { * "destination_channel_is_wallet" : { * "summary" : "Transaction ayant pour canal de destination le wallet d'un utilisateur simple", * "value" : {"type":1,"id_transaction_network_emetteur":"T123456789","network_emetteur":61,"network_destinataire":101,"nom_emetteur":"Djery","prenom_emetteur":"Tom","email_emetteur":"ddietchi@ilink-app.com","type_document_emetteur":"passport","id_document_emetteur":"12345","id_emetteur":"KKKKKKK","id_destinataire":"s6LD9PmCJC","montant_commission":5000,"montant":50000,"frais":100,"taxe":50,"part_reseau_emetteur":2000,"part_reseau_payeur":1500} * }, * "destination_channel_is_cash" : { * "summary" : "Transaction ayant pour canal de destination l'argent en cash", * "value": {"type":17,"id_transaction_network_emetteur":"T123456789","network_emetteur":61,"network_destinataire":101,"nom_emetteur":"Djery","prenom_emetteur":"Tom","email_emetteur":"ddietchi@ilink-app.com","type_document_emetteur":"passport","id_document_emetteur":"12345","id_emetteur":"sBhk1kl25","nom_destinataire":"Manga NSONGO","prenom_destinataire":"Jacques","type_document_destinataire":"cni","id_document_destinataire":"12345697","email_destinataire":"Jmangansongo.cfao@yahoo.fr","montant_commission":5000,"montant":50000,"code_retrait":"A123B123C123D123","frais":100,"taxe":50,"part_reseau_emetteur":2000,"part_reseau_payeur":1500} * }, * } * ) * ), * @OA\Response( * response=200, * description="OK", * @OA\JsonContent( * ref="#/components/schemas/ApiResponse", * examples = { * "destination_channel_is_wallet" : { * "summary" : "Transaction ayant pour canal de destination le wallet d'un utilisateur simple", * "value" : { * "status" : 200, * "response" : "Demande traitée avec succès", * "error":null * } * }, * "destination_channel_is_cash" : { * "summary" : "Transaction ayant pour canal de destination l'argent en cash", * "value" : { * "status" : 200, * "response" : "Demande traitée avec succès", * "error":null * } * }, * } * ) * ) * ) */ // Perment aux reseaux emetteurs d'emettre des transactions vers le walletService interne public function emitPayment(Request $request) { $this->validate($request, [ 'type' => 'required|integer|in:1,17', // Les types de transactions possibles à recevoir [1,3,17] 'montant' => 'required|numeric|min:0|not_in:0', 'frais' => 'required|numeric|min:0|not_in:0', 'taxe' => 'required|numeric|min:0|not_in:0', 'part_reseau_emetteur' => 'required|numeric|min:0|not_in:0', 'part_reseau_payeur' => 'required|numeric|min:0|not_in:0', 'montant_commission' => 'required|numeric|min:0|not_in:0', 'network_emetteur' => 'required|numeric|min:0|not_in:0', 'network_destinataire' => 'required|numeric|min:0|not_in:0', 'id_transaction_network_emetteur' => 'required', ]); $configRecipient = ConfigWallet::where('id_network', $request->network_destinataire)->first(); $configTransmitter = ConfigWallet::where('id_network', $request->network_emetteur)->first(); if (!$configRecipient) return $this->errorResponse(trans('errors.recipient_network_not_configured')); if ($configRecipient->type != 'ilink') return $this->errorResponse(trans('errors.recipient_network_not_authorized')); if (!$configTransmitter) return $this->errorResponse(trans('errors.transmitter_network_not_configured')); if ($configTransmitter->type != 'autre') return $this->errorResponse(trans('errors.transmitter_network_not_authorized')); $transmittingNetwork = TransmittingNetwork::where('id_network', $request->network_emetteur)->where('id_configWallet', $configRecipient->id)->first(); if (!$transmittingNetwork) return $this->errorResponse(trans('errors.transmitter_network_not_recognized')); $transaction = new WalletIlinkTransaction(); $transaction->fill($request->all()); $transaction->id_transaction = $this->getTransactionID(); $transaction->from_network_emetteur = true; //Hyperviseur destinataire $hyperviseurDestinataire = WalletAgent::where('category', 'hyper')->where('network_id', $request->network_destinataire)->firstOrFail(); $walletHyper = Wallet::findOrFail($hyperviseurDestinataire->wallet_id); $transaction->id_wallet_hyp = $walletHyper->id; $finalNetwork = Network::findOrFail($request->network_destinataire); $transaction->final_country = $finalNetwork->country->id; $initNetwork = Network::findOrFail($request->network_emetteur); $transaction->init_country = $initNetwork->country->id; $transaction->montant_net = $transaction->montant_net_final_country = $request->montant; $transaction->part_reseau_payeur_final_country = $transaction->part_reseau_payeur; $transaction->status_reseau_payeur = 'EN_COURS'; switch ($request->type) { /** * @OA\Schema( * schema="destination_channel_is_wallet", * title="Transaction ayant pour canal de destination le wallet d'un utilisateur simple", * @OA\Property(property="type", * type="integer", * enum = {1}, * default = 1, * description="Type de la transaction : Cette valeur est statique" * ), * @OA\Property(property="id_transaction_network_emetteur", * type="string", * example="T123456789", * description="ID de la transaction chez le réseau émetteur" * ), * @OA\Property(property="network_emetteur", * type="integer", * example=61, * description="ID du reseau émetteur enregistré dans la base de données de iLink World" * ), * @OA\Property(property="network_destinataire", * type="integer", * example=101, * description="ID du reseau destinataire enregistré dans la base de données" * ), * @OA\Property(property="id_emetteur", * type="string", * description="ID de l'émetteur dans la base de données du réseau émetteur de iLink World" * ), * @OA\Property(property="nom_emetteur", * type="string", * description="Noms de l'émetteur" * ), * @OA\Property(property="prenom_emetteur", * type="string", * description="Prenoms de l'émetteur" * ), * @OA\Property(property="email_emetteur", * type="string", * description="Email de l'émetteur" * ), * @OA\Property(property="type_document_emetteur", * type="string", * description="Type de document que l'émetteur a fourni pour son identification" * ), * @OA\Property(property="id_document_emetteur", * type="string", * description="ID de l'émetteur sur le document qu'il a fourni pour son identification" * ), * @OA\Property(property="id_destinataire", * type="string", * description="ID du destinataire enregistré dans la base de données de iLink World" * ), * @OA\Property(property="montant", * type="number", * example = 10000, * description="Montant de la transaction" * ), * @OA\Property(property="montant_commission", * type="number", * example = 500, * description="Montant de la commission sur la transaction" * ), * @OA\Property(property="frais", * type="number", * example = 200, * description="Montant des frais sur la transaction" * ), * @OA\Property(property="taxe", * type="number", * example = 100, * description="Montant de la taxe sur la transaction" * ), * @OA\Property(property="part_reseau_emetteur", * type="number", * example = 700, * description="Montant de la part du réseau émétteur sur la transaction" * ), * @OA\Property(property="part_reseau_payeur", * type="number", * example = 500, * description="Montant de la part du réseau payeur sur la transaction" * ), * ) */ case 1: $this->validate($request, [ 'id_destinataire' => 'required', 'nom_emetteur' => 'required', 'prenom_emetteur' => 'required', 'email_emetteur' => 'required', 'type_document_emetteur' => 'required', 'id_document_emetteur' => 'required', 'id_emetteur' => 'required', ]); $destinataire = User::where('user_code', $request->id_destinataire)->first(); if ($destinataire) { // Si c'est un wallet ilink if ($destinataire->network->country->id == $finalNetwork->country->id) { $walletDestinataire = WalletsUser::where('idUser', $destinataire->id)->firstOrFail(); $walletDestinataire->balance += $request->montant; $transaction->id_wallet_user = $walletDestinataire->id; $walletDestinataire->save(); } else { return $this->errorResponse(trans('errors.wallet_country_not_match', ['country' => $finalNetwork->country->name])); } } else { return $this->errorResponse(trans('errors.wallet_not_defined')); } $walletHyper->balance_com += $request->montant_commission; $walletHyper->save(); $transmittingNetwork->balance_compensation += $request->montant; $transmittingNetwork->balance_com += $request->montant_commission; $transmittingNetwork->save(); $transaction->commission_hyp = $transaction->commission_hyp_final_country = $request->montant_commission; $transaction->status_reseau_payeur = 'TRAITEE'; $transaction->date = $this->getCurrentTimeByCountryCode($initNetwork->country->code_country); $transaction->save(); $message = trans('messages.wallet_incoming_payment_message', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoneyWithNetwork($request->montant, $request->id), 'sender_name' => $request->nom_emetteur . ' ' . $request->prenom_emetteur, 'init_country' => $initNetwork->country->name, 'sender_code' => $request->id_emetteur, 'final_country' => $finalNetwork->country->name, 'network' => $initNetwork->name, 'receiver_code' => $request->id_destinataire]); $this->sendMail($destinataire->email, trans('messages.wallet_incoming_payment'), $message); return $this->successResponse(trans('messages.success_treated_demand')); /** * @OA\Schema( * schema="destination_channel_is_cash", * title="Transaction ayant pour canal de destination l'argent en cash", * @OA\Property(property="type", * type="integer", * enum = {17}, * default = 17, * description="Type de la transaction : Cette valeur est statique" * ), * @OA\Property(property="id_transaction_network_emetteur", * type="string", * example="T123456789", * description="ID de la transaction chez le réseau émetteur" * ), * @OA\Property(property="network_emetteur", * type="integer", * example=61, * description="ID du reseau émetteur enregistré dans la base de données de iLink World" * ), * @OA\Property(property="network_destinataire", * type="integer", * example=101, * description="ID du reseau destinataire enregistré dans la base de données" * ), * @OA\Property(property="id_emetteur", * type="string", * description="ID de l'émetteur dans la base de données du réseau émetteur de iLink World" * ), * @OA\Property(property="nom_emetteur", * type="string", * description="Noms de l'émetteur" * ), * @OA\Property(property="prenom_emetteur", * type="string", * description="Prenoms de l'émetteur" * ), * @OA\Property(property="email_emetteur", * type="string", * description="Email de l'émetteur" * ), * @OA\Property(property="type_document_emetteur", * type="string", * description="Type de document que l'émetteur a fourni pour son identification" * ), * @OA\Property(property="id_document_emetteur", * type="string", * description="ID de l'émetteur sur le document qu'il a fourni pour son identification" * ), * @OA\Property(property="nom_destinataire", * type="string", * description="Noms du destinataire" * ), * @OA\Property(property="prenom_destinataire", * type="string", * description="Prenoms du destinataire" * ), * @OA\Property(property="email_destinataire", * type="string", * description="Email du destinataire" * ), * @OA\Property(property="type_document_destinataire", * type="string", * description="Type de document que le destinataire fournira pour son identification" * ), * @OA\Property(property="id_document_destinataire", * type="string", * description="ID du destinataire sur le document qu'il fournira pour son identification" * ), * @OA\Property(property="montant", * type="number", * example = 10000, * description="Montant de la transaction" * ), * @OA\Property(property="montant_commission", * type="number", * example = 500, * description="Montant de la commission sur la transaction" * ), * @OA\Property(property="code_retrait", * type="string", * example ="A123B123C123D123", * description="Code retrait (de 16 caracteres) qui sera utilisé lors du retrait de l'argent en cash" * ), * @OA\Property(property="frais", * type="number", * example = 200, * description="Montant des frais sur la transaction" * ), * @OA\Property(property="taxe", * type="number", * example = 100, * description="Montant de la taxe sur la transaction" * ), * @OA\Property(property="part_reseau_emetteur", * type="number", * example = 700, * description="Montant de la part du réseau émétteur sur la transaction" * ), * @OA\Property(property="part_reseau_payeur", * type="number", * example = 500, * description="Montant de la part du réseau payeur sur la transaction" * ), * ) */ case 17: $this->validate($request, [ 'id_emetteur' => 'required', 'nom_emetteur' => 'required', 'prenom_emetteur' => 'required', 'type_document_emetteur' => 'required', 'id_document_emetteur' => 'required', 'email_emetteur' => 'required', 'nom_destinataire' => 'required', 'prenom_destinataire' => 'required', 'type_document_destinataire' => 'required', 'id_document_destinataire' => 'required', 'email_destinataire' => 'required', 'code_retrait' => 'required|size:16' ]); $hash = $this->hashSSHA($request->code_retrait); $transaction->encrypted_code_retrait = $hash['encrypted']; $transaction->code_retrait_salt = $hash['salt']; $transaction->status_retrait = false; $transaction->commission_ag = floatval($request->montant_commission * $configRecipient->taux_com_ag_envoi_cash / 100); $transaction->commission_sup = floatval($request->montant_commission * $configRecipient->taux_com_sup_envoi_cash / 100); $transaction->commission_hyp = $transaction->commission_hyp_final_country = floatval($request->montant_commission * $configRecipient->taux_com_hyp_envoi_cash / 100); $transaction->date = $this->getCurrentTimeByCountryCode($initNetwork->country->code_country); $transaction->save(); $message = trans('messages.cash_incoming_payment_message', ['amount' => $this->toMoneyWithNetwork($request->montant, $request->id), 'id_transaction' => $transaction->id_transaction, 'sender_name' => $request->nom_emetteur . ' ' . $request->prenom_emetteur, 'receiver_name' => $request->nom_destinataire . ' ' . $request->prenom_destinataire, 'code' => wordwrap($request->code_retrait, 4, ' ', true), 'init_country' => $initNetwork->country->name, 'final_country' => $finalNetwork->country->name, 'network' => $initNetwork->name]); $this->sendMail($request->email_destinataire, trans('messages.cash_incoming_payment'), $message); return $this->successResponse(trans('messages.success_treated_demand')); break; case 18: return $this->successResponse(trans('messages.success_treated_demand')); break; } } private function getTransactionID() { do { $code = $this->generateTransactionCode(); $result = collect(DB::select('SELECT * FROM wallet_ilink_transaction WHERE id_transaction = :code', ['code' => $code])); $codeCorrect = sizeof($result) < 0; } while ($codeCorrect); return $code; } }