validate($request, [ 'type' => 'required|integer|min:0|not_in:0', 'id_wallet_agent' => 'integer|min:0|not_in:0', 'id_wallet_user' => 'integer|min:0|not_in:0', 'password' => 'required' ]); $type = TypeIlinkTransaction::findOrFail($request->type); $walletAgent = Wallet::findOrFail($request->get('id_wallet_agent')); $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent); // Configuratrion du wallet $config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail(); // Recuperation des wallets hyperviseur et superviseur $codeGenerer = CodeGenerer::findOrFail($network_agent->codeGenerer_id); $superviseur = AgentPlus::where('code_membre', $codeGenerer->code_parrain)->firstOrFail(); $hyperviseur = AgentPlus::where('code_membre', $superviseur->code_parrain)->firstOrFail(); $wallet_agent_sup = WalletAgent::where('agent_id', $superviseur->id)->firstOrFail(); $wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail(); $walletSuperviseur = Wallet::findOrFail($wallet_agent_sup->wallet_id); $walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id); $taxesNationales = array_values(array_filter($config->taxes->all(), function ($tax) { return $tax->destination == 'national'; })); $taxesInternationales = array_values(array_filter($config->taxes->all(), function ($tax) { return $tax->destination == 'international'; })); $plr_user_wallet_wallet = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_wallet_international"); $plr_user_wallet_cash = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_cash_international"); $plr_agent_depot_wallet_ilink = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_wallet_ilink_international"); $plr_agent_depot_autre_wallet = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_autre_wallet_international"); $plr_agent_cash_cash = $this->getPaliers($config->paliers_config_wallets->all(), "agent_cash_cash_international"); $plr_user_wallet_wallet_national = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_wallet_national"); $plr_user_wallet_cash_national = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_cash_national"); $plr_agent_depot_wallet_ilink_national = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_wallet_ilink_national"); $plr_agent_depot_autre_wallet_national = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_autre_wallet_national"); $plr_agent_cash_cash_national = $this->getPaliers($config->paliers_config_wallets->all(), "agent_cash_cash_national"); $data = $request->all(); if (isset($request->cvv) && !is_numeric($request->cvv)) return $this->errorResponse('errors.invalid_cvv'); $transaction->fill($data); // Client API $client = new \GuzzleHttp\Client([ 'base_uri' => env('VISA_API_URL'), 'auth' => [env('VISA_API_USERNAME'), env('VISA_API_PASSWORD')] ]); switch ($type->id) { case 1: //User - Envoi wallet à wallet break; case 2: //User - Envoi de wallet à carte break; case 3: //User - Envoi de wallet à cash break; case 4: //User - Envoi de wallet à banque // Non disponible //Pas de taxes break; // case 5: //User - Envoi de carte à wallet // $frais =$montant * $config->taux_com_user_carte_wallet / 100; //// $taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales , $frais) : $this->calculateTax($taxesNationales ,$frais); // break; // case 6: //User - Envoi de carte à cash // $frais =$montant * $config->taux_com_user_carte_cash / 100; //// $taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales , $frais) : $this->calculateTax($taxesNationales ,$frais); // break; case 9: // User - Retrait de wallet en cash break; case 10: //User - Retrait de carte vers wallet break; case 11: // User - Retrait de carte vers cash break; case 12: // Agent - Retrait en cash $this->validate($request, $transaction->remove_cash_rules()); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { $transaction = WalletIlinkTransaction::find($request->id_transaction); if($transaction){ if($transaction->status_retrait == 0){ if($this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt)){ $part_ag = floatval($transaction->frais * $config->taux_com_ag_retrait_cash/ 100) ; $part_sup = floatval($transaction->frais * $config->taux_com_sup_retrait_cash/ 100); $walletAgent->balance_princ -= $transaction->montant_retrait; $walletAgent->balance_com += $part_ag; $walletSuperviseur->balance_com += $part_sup ; $walletHyperviseur->balance_com -= ($part_ag + $part_sup); $transaction->status_retrait = 1; $transaction->date_retrait = new \DateTime(); $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->save(); return $this->successResponse(trans('messages.successful_transaction')); }else{ return $this->errorResponse('Code de retrait invalide'); } }else{ return $this->errorResponse('Retrait déjà éffectuée'); } }else{ return $this->errorResponse('Cette transaction n\'existe pas',Response::HTTP_NOT_FOUND); } }else{ return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 13: // Agent - Retrait de la carte vers cash break; case 14: // Agent - Envoi de cash vers wallet iLink $this->validate($request, $transaction->cash_wallet_rules()); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { $user = User::where('user_code', $request->user_code)->firstOrFail(); $walletUser = WalletsUser::where('idUser', $user->id)->firstOrFail(); $frais = ($request->init_country != $request->final_country) ? $this->calculateFees($plr_agent_depot_wallet_ilink, $request->montant) : $this->calculateFees($plr_agent_depot_wallet_ilink_national, $request->montant); $taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $montantDepot = $request->montant - $frais - $taxe; $transaction->montant_depot = $montantDepot; $walletUser->balance += $montantDepot; $commisionAgent = floatval($frais * $config->taux_com_ag_envoi_cash / 100); $commisionSuper = floatval($frais * $config->taux_com_sup_envoi_cash / 100); $commisionHyper = floatval($frais * $config->taux_com_hyp_envoi_cash / 100); $walletAgent->balance_princ -= $transaction->montant; $walletAgent->balance_com += $commisionAgent; $transaction->commission_ag = $commisionAgent; $walletSuperviseur->balance_com += $commisionSuper; $transaction->commission_sup = $commisionSuper; $walletHyperviseur->balance_com += $commisionHyper; $transaction->commission_hyp = $commisionHyper; $transaction->taxe = $taxe; $transaction->frais = $frais; $transaction->date = new \DateTime(); $walletUser->save(); $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->id_wallet_user = $walletUser->id; $transaction->id_wallet_ag = $walletAgent->id; $transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->save(); $this->sendMail($user->email, trans('messages.successful_transaction'), trans('messages.successful_deposit_ilink', ['id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant,$request->init_country), 'net_init' =>$this->toMoney($montantDepot,$request->init_country) , 'net_final' =>$this->convertMoney($montantDepot,$request->init_country,$request->final_country) ,'fees' => $this->toMoney($frais,$request->init_country) ,'tax' => $this->toMoney($taxe,$request->init_country), 'user_code' => $request->user_code])); return $this->successResponse(trans('messages.successful_transaction')); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 15: // Agent - Envoi de cash vers autre wallet $this->validate($request, $transaction->cash_cash_rules()); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { $frais = ($request->init_country != $request->final_country) ? $this->calculateFees($plr_agent_depot_autre_wallet, $request->montant) : $this->calculateFees($plr_agent_depot_autre_wallet_national, $request->montant); $taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $montantDepot = $request->montant - $frais - $taxe; $transaction->montant_depot = $montantDepot; //Emettre une trame securise pour crediter le wallet utilisateur // $walletUser->balance += $montantDepot; // $transaction->id_destinataire = r $commisionAgent = floatval($frais * $config->taux_com_ag_envoi_cash / 100); $commisionSuper = floatval($frais * $config->taux_com_sup_envoi_cash / 100); $commisionHyper = floatval($frais * $config->taux_com_hyp_envoi_cash / 100); $walletAgent->balance_princ -= $transaction->montant; $walletAgent->balance_com += $commisionAgent; $transaction->commission_ag = $commisionAgent; $walletSuperviseur->balance_com += $commisionSuper; $transaction->commission_sup = $commisionSuper; $walletHyperviseur->balance_com += $commisionHyper; $transaction->commission_hyp = $commisionHyper; $transaction->taxe = $taxe; $transaction->frais = $frais; $transaction->date = new \DateTime(); $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->id_wallet_ag = $walletAgent->id; $transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->save(); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 16: // Agent - Envoi de cash vers une carte visa $this->validate($request, $transaction->cash_cash_rules()); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { $expiration_date = \DateTime::createFromFormat('m/y', $request->expiration_date); if (!$expiration_date) $expiration_date = new \DateTime(); $transaction->expiration_date = $expiration_date; $frais = $request->montant * $config->taux_com_wallet_ag_envoi_cash_carte / 100; $montantDepot = $transaction->montant - $frais; $transaction->montant_depot = $montantDepot; $body['amount'] = $montantDepot; $body['card_number'] = $request->numero_carte; $body['cvv'] = $request->cvv; $body['expiry_date'] = $expiration_date->format('Y-m'); $response = $client->post('fund-transfer-api/v1/transaction/push', ['json' => $body]); $code = $response->getStatusCode(); if ($code == 200) { $banqueCommission = floatval($frais * $config->taux_com_banque_depot_cash_carte / 100); $transaction->commission_banque = $banqueCommission; // 2---> Emmètre via API sécurisé SSL une requête de débit de notre //compte marchand du (Part de la banque partenaire en % //pour le dépôtqui s’applique sur les frais minimum) et créditer //le compte des opérations défini avec notre banque //partenaire $walletAgent->balance_princ -= $transaction->montant; $agentCommission = floatval($frais * $config->taux_com_ag_depot_cash_carte / 100); $superviseurCommission = floatval($frais * $config->taux_com_sup_depot_cash_carte / 100); $hyperviseurCommission = floatval($frais * $config->taux_com_hyp_depot_cash_carte / 100); $walletAgent->balance_com += $agentCommission; $transaction->commission_ag = $agentCommission; $walletSuperviseur->balance_com += $superviseurCommission; $transaction->commission_sup = $superviseurCommission; $walletHyperviseur->balance_com += $hyperviseurCommission; $transaction->commission_hyp = $hyperviseurCommission; $transaction->id_wallet_ag = $walletAgent->id; $transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->frais = $frais; $transaction->date = new \DateTime(); $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->save(); return $this->successResponse(trans('messages.successful_transaction')); } else { return $this->errorResponse(trans('errors.visa_api_failed'), Response::HTTP_INTERNAL_SERVER_ERROR); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 17: // Agent - Envoi de cash vers cash $this->validate($request, array_merge($transaction->cash_cash_rules(), [ 'email_emetteur' => 'required', ])); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { $frais = ($request->init_country != $request->final_country) ? $this->calculateFees($plr_agent_cash_cash, $request->montant) : $this->calculateFees($plr_agent_cash_cash_national, $request->montant); $taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $montantRetrait = $request->montant - $frais - $taxe; $commisionAgent = floatval($frais * $config->taux_com_ag_envoi_cash / 100); $commisionSuper = floatval($frais * $config->taux_com_sup_envoi_cash / 100); $commisionHyper = floatval($frais * $config->taux_com_hyp_envoi_cash / 100); $transaction->montant_retrait = $montantRetrait; $walletAgent->balance_com += $commisionAgent; $transaction->commission_ag = $commisionAgent; $walletSuperviseur->balance_com += $commisionSuper; $transaction->commission_sup = $commisionSuper; $walletHyperviseur->balance_com += $commisionHyper; $transaction->commission_hyp = $commisionHyper; $transaction->id_wallet_ag = $walletAgent->id; $transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->id_wallet_hyp = $walletHyperviseur->id; $code_retrait = $this->random_string(); $hash = $this->hashSSHA($code_retrait); $transaction->encrypted_code_retrait = $hash['encrypted']; $transaction->code_retrait_salt = $hash['salt']; $walletAgent->balance_princ -= $transaction->montant; $transaction->frais = $frais; $transaction->taxe = $taxe; $transaction->date = new \DateTime(); $transaction->status_retrait = 0; $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->save(); $this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), trans('messages.successful_send_cash', ['sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->prenom_destinataire, 'id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant,$request->init_country), 'net_init' =>$this->toMoney($montantRetrait,$request->init_country) , 'net_final' =>$this->convertMoney($montantRetrait,$request->init_country,$request->final_country) ,'fees' => $this->toMoney($frais,$request->init_country) ,'tax' => $this->toMoney($taxe,$request->init_country), 'code' => wordwrap($code_retrait , 4 , ' ' , true )])); return $this->successResponse(trans('messages.successful_transaction')); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 18: // Agent - Envoi de cash vers banque // Indisponible break; } } public function lastTransactions($id_wallet) { $transactions = WalletTransaction::where('id_wallet', $id_wallet)->orderBy('date', 'desc')->limit(10) ->get(['type', DB::raw('\'wallet\' as source'), 'montant', 'numCarte AS destinataire', 'date', 'id']); return $this->successResponse($transactions); } public function calculateCommission(Request $request) { $rules = [ 'id_wallet' => 'required|integer|min:1', 'montant' => 'required|numeric|min:0|not_in:0', 'type' => 'required|in:credit,debit', ]; $this->validate($request, $rules); $walletAgent = Wallet::findOrFail($request->get('id_wallet')); $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent); // Configuratrion du wallet $config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail(); $commission = null; if ($request->type == 'credit') { //Depot $commission = ($request->montant * $config->taux_com_client_depot / 100) + $config->frais_min_banque_depot; $data['montant_calcule'] = $request->montant - $commission; } elseif ($request->type == 'debit') { // Retrait $commission = $request->montant * $config->taux_com_client_retrait / 100; $data['montant_calcule'] = $request->montant + $commission; } $data['commission'] = $commission; return $this->successResponse($data); } private function getPaliers(array $paliers, $type) { return array_values(array_filter($paliers, function ($palier) use ($type) { return $palier->type == $type; })); } //Calcul des frais internationaux private function calculateFees(array $paliers, $montant) { $size = sizeof($paliers); $min = $paliers[0]->min; $max = $size > 0 ? $paliers[$size - 1]->max : 0; $palier = null; foreach ($paliers as $p) { if ($montant >= $p->min && $montant <= $p->max) { $palier = $p; break; } } if ($palier) { return (($palier->min + $palier->max) / 2 * $palier->taux / 100); } else { if ($montant < $min) return $min * $paliers[0]->taux / 100; else if ($montant > $max) return $max * $paliers[$size - 1]->taux / 100; } } //Calcul des taxes private function calculateTax(array $taxes, $frais) { $sommeTaux = 0; $sommeFixe = 0; foreach ($taxes as $tax) { if ($tax->type == '%') $sommeTaux += $tax->valeur; if ($tax->type == 'fixe') $sommeFixe += $tax->valeur; } return ($frais * $sommeTaux / 100) + $sommeFixe; } private function random_string() { $character_set_array = array(); $character_set_array[] = array('count' => 12, 'characters' => 'ABCDEFGHJKMNPQRSTUVWXYZ'); $character_set_array[] = array('count' => 4, 'characters' => '23456789'); $temp_array = array(); foreach ($character_set_array as $character_set) { for ($i = 0; $i < $character_set['count']; $i++) { $temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)]; } } shuffle($temp_array); return implode('', $temp_array); } }