validate($request, [ 'type' => 'required|integer|min:0|not_in:0', 'id_wallet_agent' => 'required_without:id_wallet_user|integer|min:0|not_in:0', 'id_wallet_user' => 'required_without:id_wallet_agent|integer|min:0|not_in:0', 'password' => 'required', 'montant' => 'required|numeric|min:0|not_in:0', ]); $type = TypeIlinkTransaction::findOrFail($request->type); if (isset($request->id_wallet_agent)) { $walletAgent = Wallet::findOrFail($request->get('id_wallet_agent')); $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent); $transaction->init_country = $init_country = $network_agent->network->country->id; // 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); } elseif (isset($request->id_wallet_user)) { $walletUser = WalletsUser::findOrFail($request->id_wallet_user); $transaction->init_country = $init_country = $walletUser->user->network->country->id; $result = ConfigWallet::join('networks', 'networks.id', '=', 'configWallet.id_network') ->where('networks.country_id', $init_country)->where('configWallet.type', 'ilink') ->select('configWallet.id')->first(); if ($result) { $config = ConfigWallet::findOrFail($result->id); } else { return $this->errorResponse(trans('errors.no_ilink_network')); } $hyperviseur = AgentPlus::where('category', 'hyper')->where('network_id', $config->id_network)->firstOrFail(); $wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail(); $walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id); } $transaction->network_emetteur = $config->id_network; $taxesNationales = array_values(array_filter($config->taxes->all(), function ($tax) { return $tax->destination == 'national' && $tax->categorie == 'wallet'; })); $taxesInternationales = array_values(array_filter($config->taxes->all(), function ($tax) { return $tax->destination == 'international' && $tax->categorie == 'wallet'; })); $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 $this->validate($request, $transaction->send_wallet_wallet_rules()); $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { if ($init_country != $request->final_country) { $rep = $this->checkUserIdentification($user->id); // dd($rep); if ($rep instanceof JsonResponse) return $rep; } if ($request->montant > $walletUser->balance) { return $this->errorResponse(trans('errors.insufficient_balance')); } else { //Verification des limites reglementaires $rep = $this->checkReguationsLimits($walletUser->id, $init_country, $request->final_country, $transaction->montant); if ($rep instanceof JsonResponse) return $rep; $transaction->frais = $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_wallet, $request->montant) : $this->calculateFees($plr_user_wallet_wallet_national, $request->montant); $transaction->taxe = $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $transaction->montant_net = $montantDepot = $transaction->montant - $frais - $taxe; $transaction->montant_net_final_country = $this->toMoneyAmount($montantDepot, $init_country, $request->final_country); $configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail(); $reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->first(); if (isset($reseauPayeur)) { $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; $transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; } else { $transaction->part_reseau_payeur = 0; $transaction->part_reseau_payeur_final_country = 0; $transaction->part_reseau_emetteur = $frais; } $transaction->commission_hyp = $transaction->part_reseau_emetteur; $transaction->id_transaction = $this->getTransactionID(); if ($configPayeur->type == 'ilink') { $destinataire = User::where('user_code', $request->id_destinataire)->first(); if ($destinataire) { // Si c'est un wallet ilink if ($destinataire->network->country->id == $request->final_country) { $walletDestinataire = WalletsUser::where('idUser', $destinataire->id)->firstOrFail(); $walletDestinataire->balance += $this->toMoneyAmount($montantDepot, $init_country, $request->final_country); $walletDestinataire->save(); } else { $country = Country::findOrFail($request->final_country); return $this->errorResponse(trans('errors.wallet_country_not_match', ['country' => $country->name])); } } else { return $this->errorResponse(trans('errors.wallet_not_defined')); } //Mise a jour des comissions et compensation $reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country; $reseauPayeur->balance_compensation += $transaction->montant_net_final_country; //Hyperviseur payeur $hyperviseurPayeur = AgentPlus::where('category', 'hyper')->where('network_id', $request->network_destinataire)->firstOrFail(); if ($hyperviseurPayeur->id == $hyperviseur->id) { //Si c'est le reseau payeur est aussi emetteur $transaction->id_wallet_hyp_payeur = $walletHyperviseur->id; } else { $wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail(); $walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id); $walletHyperviseurPayeur->balance_com += $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); $transaction->id_wallet_hyp_payeur = $walletHyperviseurPayeur->id; $walletHyperviseurPayeur->save(); } } else { //Emettre requete SSL vers wallet extene correspondant pour recharger le compte du destinataire // La mise à jour des comissions de compensation se fera lors du traitement de la transaction $transaction->status_reseau_payeur = 'EN_COURS'; $result = $this->sendFrame($this->PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL, $transaction); if ($result->getStatusCode() != 200) return $this->errorResponse(trans('errors.unexpected_error')); } $walletHyperviseur->balance_com += $transaction->part_reseau_emetteur; $walletUser->balance -= $transaction->montant; $transaction->id_wallet_hyp = $walletHyperviseur->id; $walletHyperviseur->save(); $walletUser->save(); if (isset($reseauPayeur)) $reseauPayeur->save(); $transaction->save(); $message = trans('messages.successful_user_send_to_wallet', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country), 'net_final' => $this->toMoneyWithCurrency($montantDepot, $init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'init_country' => $this->getCountryName($init_country), 'final_country' => $this->getCountryName($request->final_country), 'sender_code' => $user->user_code, 'receiver_code' => $transaction->id_destinataire, 'network' => $this->getNetworkName($transaction->network_destinataire)]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 2: //User - Envoi de wallet à carte $this->validate($request, $transaction->user_card_rules()); $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { if ($request->montant > $walletUser->balance) { return $this->errorResponse(trans('errors.insufficient_balance')); } else { if (!(isset($user->numero_carte) && isset($user->expiration_date))) return $this->errorResponse(trans('errors.no_bank_card_attached')); $transaction->expiration_date = $user->expiration_date; $transaction->numero_carte = $user->numero_carte; $frais = $request->montant * $config->taux_com_user_wallet_carte / 100; $transaction->montant_net = $montantDepot = $transaction->montant - $frais; // $body['amount'] = $this->toUSDAmount($montantDepot, $init_country); $body['card_number'] = $user->numero_carte; $body['cvv'] = $request->cvv; // $body['expiry_date'] = $user->expiration_date->format('Y-m'); $body['expiry_date'] = $user->expiration_date->format('m/y'); $body['amount'] = $montantDepot; $identification = Identification::where('id_user', $user->id)->first(); $body['cardholder_name'] = $identification ? $identification->lastname . ' ' . $identification->firstname : $user->lastname . ' ' . $user->firstname; //"John Smith" ; $body['currency'] = $this->getCurrency($init_country); $body['ref'] = date("Y-m-d H:i:s.u"); $response = $client->post($this->PAYOUT_URL, ['json' => $body, 'http_errors' => false]); $code = $response->getStatusCode(); if ($code == 200) { $response = json_decode($response->getBody()->getContents(), true)["response"]; $transaction->pspReference = $response["pspReference"]; $walletUser->balance -= $transaction->montant; //Emettre une trame SSL pour recharger le compte de la banque partenaire du montant de sa commission $transaction->commission_banque = $frais * $config->taux_com_banque_envoi_wallet_carte_ilink / 100; $transaction->commission_hyp = $frais * $config->taux_com_hyp_envoi_wallet_carte_ilink / 100; $walletHyperviseur->balance_com += $transaction->commission_hyp; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->frais = $frais; $transaction->date = new \DateTime(); $walletHyperviseur->save(); $walletUser->save(); $transaction->id_transaction = $this->getTransactionID(); $transaction->save(); $message = trans('messages.successful_user_send_to_cart', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net' => $this->toMoney($montantDepot, $init_country), 'fees' => $this->toMoney($frais, $init_country), 'sender_code' => $user->user_code, 'cart_number' => wordwrap($transaction->numero_carte, 4, ' ', true)]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('errors.visa_api_failed')); } } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 3: //User - Envoi de wallet à cash $this->validate($request, $transaction->send_wallet_cash_rules()); $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { if ($init_country != $request->final_country) { $rep = $this->checkUserIdentification($user->id); if ($rep instanceof JsonResponse) return $rep; } if ($request->montant > $walletUser->balance) { return $this->errorResponse(trans('errors.insufficient_balance')); } else { //Verification des limites reglementaires $rep = $this->checkReguationsLimits($walletUser->id, $init_country, $request->final_country, $transaction->montant); if ($rep instanceof JsonResponse) return $rep; $transaction->frais = $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_cash, $request->montant) : $this->calculateFees($plr_user_wallet_cash_national, $request->montant); $transaction->taxe = $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $transaction->montant_net = $montantRetrait = $transaction->montant - $frais - $taxe; $transaction->montant_net_final_country = $this->toMoneyAmount($montantRetrait, $init_country, $request->final_country); $configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail(); $reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->first(); if (isset($reseauPayeur)) { $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; $transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; } else { $transaction->part_reseau_payeur = 0; $transaction->part_reseau_payeur_final_country = 0; $transaction->part_reseau_emetteur = $frais; } $transaction->commission_hyp = $transaction->part_reseau_emetteur; $transaction->commission_hyp_final_country = $this->toMoneyAmount($transaction->commission_hyp, $init_country, $request->final_country); $transaction->id_transaction = $this->getTransactionID(); if ($configPayeur->type == 'ilink') { //Mise a jour des comissions et compensation $reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country; $reseauPayeur->balance_compensation += $transaction->montant_net_final_country; //Hyperviseur payeur $hyperviseurPayeur = AgentPlus::where('category', 'hyper')->where('network_id', $request->network_destinataire)->firstOrFail(); if ($hyperviseurPayeur->id == $hyperviseur->id) { //Si c'est le reseau payeur est aussi emetteur $transaction->id_wallet_hyp_payeur = $walletHyperviseur->id; } else { $wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail(); $walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id); $walletHyperviseurPayeur->balance_com += $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); $transaction->id_wallet_hyp_payeur = $walletHyperviseurPayeur->id; $walletHyperviseurPayeur->save(); } } else { //Emettre requete SSL vers wallet extene correspondant pour recharger le compte du destinataire // La mise à jour des comissions de compensation se fera lors du traitement de la transaction $transaction->status_reseau_payeur = 'EN_COURS'; $result = $this->sendFrame($this->PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL, $transaction); if ($result->getStatusCode() != 200) return $this->errorResponse(trans('errors.unexpected_error')); } $walletUser->balance -= $transaction->montant; $walletHyperviseur->balance_com += $transaction->commission_hyp; $code_retrait = $this->random_string(); $hash = $this->hashSSHA($code_retrait); $transaction->encrypted_code_retrait = $hash['encrypted']; $transaction->code_retrait_salt = $hash['salt']; $transaction->id_wallet_hyp = $walletHyperviseur->id; if (isset($reseauPayeur)) $reseauPayeur->save(); $walletHyperviseur->save(); $walletUser->save(); $transaction->date = new \DateTime(); $transaction->status_retrait = 0; $transaction->save(); $message = trans('messages.successful_user_send_to_cash', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantRetrait, $init_country), 'net_final' => $this->toMoneyWithCurrency($montantRetrait, $init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'init_country' => $this->getCountryName($init_country), 'final_country' => $this->getCountryName($request->final_country), 'code' => wordwrap($code_retrait, 4, ' ', true), 'sender_code' => $user->user_code, 'receiver_code' => $transaction->id_destinataire, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire, 'sender_name' => $user->lastname . ' ' . $user->firstname, 'network' => $this->getNetworkName($transaction->network_destinataire)]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 4: //User - Envoi de wallet à banque $this->validate($request, [ 'iban' => 'required', 'id_wallet_network' => 'required|integer|min:0|not_in:0', 'id_bank' => 'required|integer|min:0|not_in:0', ]); $user = $walletUser->user; if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt)) return $this->errorResponse(trans('messages.incorrect_user_password')); if ($request->montant > $walletUser->balance) return $this->errorResponse(trans('errors.insufficient_balance')); // $rep = $this->checkUserIdentification($user->id); // if ($rep instanceof JsonResponse) // return $rep; //Verifier si la banque est associée au reseau $network_bank = NetworksBank::where('id_network', $request->id_wallet_network)->where('id_bank_country', $request->id_bank)->first(); if (!$network_bank) return $this->errorResponse(trans('errors.bank_not_associated_with_network')); //Verifier le code IBAN $country_code = $network_bank->network->country->code_country; $bank_code = $network_bank->banks_country->code_banque; switch ($this->checkIBAN($request->iban, $country_code, $bank_code)) { case 0: return $this->errorResponse(trans('errors.invalid_iban')); case 1: return $this->errorResponse(trans('errors.country_not_match_iban')); case 2: return $this->errorResponse(trans('errors.bank_not_match_iban')); } $transaction->frais = $frais = 0; $transaction->taxe = $taxe = 0; // $walletUser->balance -= $transaction->montant; //Emettre une trame SSL pour recharger le compte bancaire du montant de la transaction $transaction->commission_banque = 0; $transaction->commission_hyp = 0; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->frais = $frais; $transaction->date = new \DateTime(); $transaction->bank = $network_bank->banks_country->bank->nom; $transaction->country = $network_bank->network->country->name; $transaction->id_bank = $request->id_bank; $transaction->iban = $request->iban; // $walletUser->save(); $transaction->id_transaction = $this->getTransactionID(); // $transaction->save(); Log::info('-------------------------- User - Envoi de wallet à banque ------------------------------------'); Log::info($transaction->toArray()); Log::info('------------------------------------------------------------------------------------------------'); $message = trans('messages.successful_user_send_to_bank', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net' => $this->toMoney($transaction->montant, $init_country), 'iban' => $request->iban, 'fees' => $this->toMoney($frais, $init_country), 'sender_code' => $user->user_code]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); 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 $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { if ($request->montant > $walletUser->balance) { return $this->errorResponse(trans('errors.insufficient_balance')); } else { $rep = $this->checkUserIdentification($user->id); if ($rep instanceof JsonResponse) return $rep; $transaction->final_country = $init_country; $transaction->frais = $frais = $this->calculateFees($plr_user_wallet_cash_national, $request->montant); $transaction->taxe = $taxe = $this->calculateTax($taxesNationales, $frais); $transaction->montant_net_final_country = $transaction->montant_net = $montantRetrait = $transaction->montant - $frais - $taxe; $transaction->commission_hyp_final_country = $transaction->commission_hyp = $frais; $walletUser->balance -= $transaction->montant; $walletHyperviseur->balance_com += $transaction->commission_hyp; $code_retrait = $this->random_string(); $hash = $this->hashSSHA($code_retrait); $transaction->encrypted_code_retrait = $hash['encrypted']; $transaction->code_retrait_salt = $hash['salt']; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->id_transaction = $this->getTransactionID(); $walletHyperviseur->save(); $walletUser->save(); $transaction->date = new \DateTime(); $transaction->status_retrait = 0; $transaction->save(); $message = trans('messages.successful_user_remove_from_wallet_to_cash', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net' => $this->toMoney($montantRetrait, $init_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'code' => wordwrap($code_retrait, 4, ' ', true), 'sender_code' => $user->user_code, 'init_country' => $this->getCountryName($init_country),]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 10: //User - Retrait de carte vers wallet $this->validate($request, $transaction->user_card_rules()); $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { if (!(isset($user->numero_carte) && isset($user->expiration_date))) return $this->errorResponse(trans('errors.no_bank_card_attached')); $transaction->expiration_date = $user->expiration_date; $transaction->numero_carte = $user->numero_carte; $frais = $request->montant * $config->taux_com_user_carte_wallet / 100; $transaction->montant_net = $montantRetrait = $transaction->montant + $frais; // $body['amount'] = $this->toUSDAmount($montantRetrait, $init_country); $body['card_number'] = $user->numero_carte; $body['cvv'] = $request->cvv; // $body['expiry_date'] = $user->expiration_date->format('Y-m'); $body['expiry_date'] = $user->expiration_date->format('m/y'); $body['amount'] = $montantRetrait; $identification = Identification::where('id_user', $user->id)->first(); $body['cardholder_name'] = $identification ? $identification->lastname . ' ' . $identification->firstname : $user->lastname . ' ' . $user->firstname; //"John Smith" ; $body['currency'] = $this->getCurrency($init_country); $body['ref'] = date("Y-m-d H:i:s.u"); // dd($body); $response = $client->post($this->PAYMENT_URL, ['json' => $body, 'http_errors' => false]); $code = $response->getStatusCode(); if ($code == 200) { $response = json_decode($response->getBody()->getContents(), true)["response"]; $transaction->pspReference = $response["pspReference"]; $transaction->commission_banque = $commissionBanque = $frais * $config->taux_com_banque_retrait_carte_cash_ilink / 100; //Emettre une trame SSL pour recharger le compte de la banque partenaire du montant de sa commission $walletUser->balance += $transaction->montant; $transaction->commission_hyp = $frais * $config->taux_com_hyp_retrait_carte_cash_ilink / 100; $walletHyperviseur->balance_com += $transaction->commission_hyp; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->frais = $frais; $transaction->date = new \DateTime(); $walletHyperviseur->save(); $walletUser->save(); $transaction->id_transaction = $this->getTransactionID(); $transaction->save(); $message = trans('messages.successful_user_remove_from_cart_to_wallet', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'total' => $this->toMoney($montantRetrait, $init_country), 'fees' => $this->toMoney($frais, $init_country), 'sender_code' => $user->user_code, 'cart_number' => wordwrap($transaction->numero_carte, 4, ' ', true)]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('errors.visa_api_failed')); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 11: // User - Retrait de carte vers cash $this->validate($request, $transaction->user_card_rules()); $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { $rep = $this->checkUserIdentification($user->id); if ($rep instanceof JsonResponse) return $rep; if (!(isset($user->numero_carte) && isset($user->expiration_date))) return $this->errorResponse(trans('errors.no_bank_card_attached')); $transaction->expiration_date = $user->expiration_date; $transaction->numero_carte = $user->numero_carte; $transaction->final_country = $init_country; $frais = $request->montant * $config->taux_com_user_carte_cash / 100; $transaction->montant_net = $montantRetrait = $transaction->montant + $frais; $transaction->montant_net_final_country = $transaction->montant; // $body['amount'] = $this->toUSDAmount($montantRetrait, $init_country); $body['card_number'] = $user->numero_carte; $body['cvv'] = $request->cvv; // $body['expiry_date'] = $user->expiration_date->format('Y-m'); $body['expiry_date'] = $user->expiration_date->format('m/y'); $body['amount'] = $montantRetrait; $identification = Identification::where('id_user', $user->id)->first(); $body['cardholder_name'] = $identification ? $identification->lastname . ' ' . $identification->firstname : $user->lastname . ' ' . $user->firstname; //"John Smith" ; $body['currency'] = $this->getCurrency($init_country); $body['ref'] = date("Y-m-d H:i:s.u"); $response = $client->post($this->PAYMENT_URL, ['json' => $body, 'http_errors' => false]); $code = $response->getStatusCode(); if ($code == 200) { $response = json_decode($response->getBody()->getContents(), true)["response"]; $transaction->pspReference = $response["pspReference"]; $transaction->commission_banque = $commissionBanque = $frais * $config->taux_com_banque_retrait_carte_cash_ilink / 100; //Emettre une trame SSL pour recharger le compte de la banque partenaire du montant de sa commission $code_retrait = $this->random_string(); $hash = $this->hashSSHA($code_retrait); $transaction->encrypted_code_retrait = $hash['encrypted']; $transaction->code_retrait_salt = $hash['salt']; $transaction->commission_hyp = $frais * $config->taux_com_hyp_retrait_carte_cash_ilink / 100; $walletHyperviseur->balance_com += $transaction->commission_hyp; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->frais = $frais; $transaction->date = new \DateTime(); $transaction->status_retrait = 0; $walletHyperviseur->save(); $transaction->id_transaction = $this->getTransactionID(); $transaction->save(); $message = trans('messages.successful_user_remove_from_cart_to_cash', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'final_country' => $this->getCountryName($init_country), 'init_country' => $this->getCountryName($init_country), 'total' => $this->toMoney($transaction->montant, $init_country), 'fees' => $this->toMoney($frais, $init_country), 'code' => wordwrap($code_retrait, 4, ' ', true), 'sender_code' => $user->user_code, 'cart_number' => wordwrap($transaction->numero_carte, 4, ' ', true)]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('errors.visa_api_failed')); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } 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::where('id_transaction', $request->id_transaction)->first(); if ($transaction) { //Verifier si l'agent qui a effectué l'envoi de cash à cash ne puisse pas retirer l'argent if ($transaction->type == 17) if ($transaction->id_wallet_ag == $walletAgent->id) return $this->errorResponse(trans('errors.agent_unauthorized')); //Verifier que le reseau payeur est de type iLink if (in_array($transaction->type, [3, 17])) { $configPayeur = ConfigWallet::where('id_network', $transaction->network_destinataire)->firstOrFail(); if ($configPayeur->type != 'ilink') return $this->errorResponse(trans('errors.withdrawal_network_unauthorized', ['network' => $this->getNetworkName($transaction->network_destinataire), 'country' => $this->getCountryName($transaction->final_country)])); } if ($transaction->status_retrait == 0) { //Verifier que le pays de destinatation correspond au pays de retrait if ($init_country != $transaction->final_country) return $this->errorResponse(trans('errors.operation_cannot_performed_in_country')); if ($this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt)) { $montantNet = $transaction->type == 11 ? $transaction->montant_net : $transaction->montant_net_final_country; if (in_array($transaction->type, [3, 17])) { $commissionHyp = ($transaction->network_emetteur != $transaction->network_destinataire) ? $transaction->part_reseau_payeur_final_country : $transaction->commission_hyp_final_country; } else { $commissionHyp = $transaction->type == 11 ? $transaction->commission_hyp : $transaction->commission_hyp_final_country; } if ($montantNet == $request->montant) { $transactionRetrait = $transaction->replicate(); $transactionRetrait->id = null; $transactionRetrait->type = $request->type; $transactionRetrait->id_transaction = $this->getTransactionID(); $transactionRetrait->montant = $montantNet; $emailEmetteur = $transaction->wallet_user ? $transaction->wallet_user->user->email : $transaction->email_emetteur; $emetteur = $transaction->wallet_user ? $transaction->wallet_user->user->lastname . ' ' . $transaction->wallet_user->user->firstname : $transaction->prenom_emetteur . ' ' . $transaction->nom_emetteur; $destinataire = in_array($transaction->type, [9, 11]) ? $emetteur : $transaction->prenom_destinataire . ' ' . $transaction->nom_destinataire; $transactionRetrait->commission_ag = floatval($commissionHyp * $config->taux_com_ag_retrait_cash / 100); $transactionRetrait->commission_sup = floatval($commissionHyp * $config->taux_com_sup_retrait_cash / 100); $transactionRetrait->commission_hyp = $commissionHyp - $transactionRetrait->commission_ag - $transactionRetrait->commission_sup; $walletAgent->balance_princ += $montantNet; $walletAgent->balance_com += $transactionRetrait->commission_ag; $walletSuperviseur->balance_com += $transactionRetrait->commission_sup; $walletHyperviseur->balance_com -= ($transactionRetrait->commission_ag + $transactionRetrait->commission_sup); $transactionRetrait->id_wallet_ag = $walletAgent->id; $transactionRetrait->id_wallet_sup = $walletSuperviseur->id; $transactionRetrait->id_wallet_hyp = $walletHyperviseur->id; $transactionRetrait->status_retrait = $transactionRetrait->commission_banque = $transactionRetrait->code_retrait_salt = $transactionRetrait->encrypted_code_retrait = null; $transactionRetrait->frais = $transactionRetrait->taxe = 0; $transaction->status_retrait = 1; $transaction->date_retrait = new \DateTime(); $transactionRetrait->date = new \DateTime(); //Si la transaction provient du reseau emetteur if ($transaction->from_network_emetteur) { $transaction->status_reseau_payeur = 'TRAITEE'; } $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->save(); $transactionRetrait->save(); $message = trans('messages.successful_agent_remove_cash', ['id_transaction' => $transactionRetrait->id_transaction, 'amount' => $this->toMoney($request->montant, $init_country), 'init_country' => $this->getCountryName($transaction->init_country), 'code' => wordwrap($request->code_retrait, 4, ' ', true), 'final_country' => $this->getCountryName($transaction->final_country), 'sender_name' => $emetteur, 'receiver_name' => $destinataire, 'id_transaction_retrait' => $transaction->id_transaction]); $this->sendMail($emailEmetteur, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('errors.incorrect_withdrawal_amount')); } } else { return $this->errorResponse(trans('errors.invalid_withdrawal_code')); } } else { return $this->errorResponse(trans('errors.withdrawal_already_made')); } } else { return $this->errorResponse(trans('errors.transaction_not_exist'), Response::HTTP_NOT_FOUND); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 13: // Agent - Retrait de la carte vers cash $this->validate($request, $transaction->card_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; $transaction->final_country = $init_country; $frais = floatval($request->montant * $config->taux_com_wallet_ag_carte_cash / 100); $montantRetrait = $transaction->montant + $frais; $transaction->montant_net = $montantRetrait; // $body['amount'] = $this->toUSDAmount($montantRetrait, $init_country); $body['card_number'] = $request->numero_carte; $body['cvv'] = $request->cvv; // $body['expiry_date'] = $expiration_date->format('Y-m'); $body['expiry_date'] = $expiration_date->format('m/y'); $body['amount'] = $montantRetrait; $body['cardholder_name'] = $request->lastname ? $request->lastname . ' ' . $request->firstname : "John Smith"; $body['currency'] = $this->getCurrency($init_country); $body['ref'] = date("Y-m-d H:i:s.u"); $response = $client->post($this->PAYMENT_URL, ['json' => $body, 'http_errors' => false]); $code = $response->getStatusCode(); if ($code == 200) { $response = json_decode($response->getBody()->getContents(), true)["response"]; $transaction->pspReference = $response["pspReference"]; $banqueCommission = floatval($frais * $config->taux_com_banque_retrait_carte_cash / 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ôt qui 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_retrait_carte_cash / 100); $superviseurCommission = floatval($frais * $config->taux_com_sup_retrait_carte_cash / 100); $hyperviseurCommission = floatval($frais * $config->taux_com_hyp_retrait_carte_cash / 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->id_transaction = $this->getTransactionID(); $transaction->save(); return $this->successResponse(trans('messages.successful_transaction')); } else { return $this->errorResponse(trans('errors.visa_api_failed')); } } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } 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)->first(); if (!$user) return $this->errorResponse(trans('errors.wallet_not_defined')); $transaction->id_destinataire = $request->user_code; $walletUser = WalletsUser::where('idUser', $user->id)->firstOrFail(); $transaction->final_country = $final_country = $user->network->country->id; //Verification des limites reglementaires $rep = $this->checkReguationsLimits($walletUser->id, $init_country, $final_country, $transaction->montant); if ($rep instanceof JsonResponse) return $rep; $frais = ($init_country != $final_country) ? $this->calculateFees($plr_agent_depot_wallet_ilink, $request->montant) : $this->calculateFees($plr_agent_depot_wallet_ilink_national, $request->montant); $taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $montantDepot = $request->montant - $frais - $taxe; $transaction->montant_net = $montantDepot; $transaction->montant_net_final_country = $this->toMoneyAmount($montantDepot, $init_country, $final_country); $walletUser->balance += $transaction->montant_net_final_country; $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_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->id_transaction = $this->getTransactionID(); $transaction->save(); $message = trans('messages.successful_agent_deposit_wallet_ilink', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country), 'net_final' => $this->toMoneyWithCurrency($montantDepot, $init_country, $final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'init_country' => $this->getCountryName($init_country), 'final_country' => $this->getCountryName($final_country), 'user_code' => $request->user_code]); $this->sendMail($user->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 15: // Agent - Envoi de cash vers autre wallet $this->validate($request, array_merge($transaction->cash_cash_rules(), [ 'id_destinataire' => 'required' ])); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { if ($request->montant > $walletAgent->balance_princ) return $this->errorResponse(trans('errors.insufficient_balance')); //Verification des limites reglementaires $rep = $this->checkReguationsLimits($request->id_document_emetteur, $init_country, $request->final_country, $transaction->montant, true); if ($rep instanceof JsonResponse) return $rep; $frais = ($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 = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $montantDepot = $request->montant - $frais - $taxe; $transaction->montant_net = $montantDepot; $transaction->montant_net_final_country = $this->toMoneyAmount($montantDepot, $init_country, $request->final_country); $reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->firstOrFail(); $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; $transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); if (isset($reseauPayeur)) $reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country; //Emettre une trame securise pour crediter le wallet utilisateur // $walletUser->balance += $transaction->montant_net_final_country; // $transaction->id_destinataire = r $commisionAgent = floatval($transaction->part_reseau_emetteur * $config->taux_com_ag_envoi_cash / 100); $commisionSuper = floatval($transaction->part_reseau_emetteur * $config->taux_com_sup_envoi_cash / 100); $commisionHyper = floatval($transaction->part_reseau_emetteur * $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(); if (isset($reseauPayeur)) $reseauPayeur->save(); $transaction->id_wallet_ag = $walletAgent->id; $transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->id_transaction = $this->getTransactionID(); $transaction->save(); $message = trans('messages.successful_agent_deposit_other_wallet', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country), 'net_final' => $this->toMoneyWithCurrency($montantDepot, $init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'init_country' => $this->getCountryName($init_country), 'final_country' => $this->getCountryName($request->final_country), 'receiver_code' => $request->id_destinataire, 'network' => $this->getNetworkName($transaction->network_destinataire), 'sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire,]); $this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 16: // Agent - Envoi de cash vers une carte visa $this->validate($request, $transaction->card_rules()); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { if ($request->montant > $walletAgent->balance_princ) return $this->errorResponse(trans('errors.insufficient_balance')); $expiration_date = \DateTime::createFromFormat('m/y', $request->expiration_date); if (!$expiration_date) $expiration_date = new \DateTime(); $transaction->expiration_date = $expiration_date; $transaction->final_country = $init_country; $frais = $request->montant * $config->taux_com_wallet_ag_envoi_cash_carte / 100; $montantDepot = $transaction->montant - $frais; $transaction->montant_net = $montantDepot; // $body['amount'] = $this->toUSDAmount($montantDepot, $init_country);; $body['card_number'] = $request->numero_carte; $body['cvv'] = $request->cvv; // $body['expiry_date'] = $expiration_date->format('Y-m'); $body['expiry_date'] = $expiration_date->format('m/y'); $body['amount'] = $montantDepot; $body['cardholder_name'] = $request->lastname ? $request->lastname . ' ' . $request->firstname : "John Smith"; $body['currency'] = $this->getCurrency($init_country); $body['ref'] = date("Y-m-d H:i:s.u"); $response = $client->post($this->PAYOUT_URL, ['json' => $body, 'http_errors' => false]); $code = $response->getStatusCode(); if ($code == 200) { $response = json_decode($response->getBody()->getContents(), true)["response"]; $transaction->pspReference = $response["pspReference"]; $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->id_transaction = $this->getTransactionID(); $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, $transaction->cash_cash_rules()); $agent = AgentPlus::findOrFail($network_agent->agent_id); if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) { if ($request->montant > $walletAgent->balance_princ) return $this->errorResponse(trans('errors.insufficient_balance')); //Verification des limites reglementaires $rep = $this->checkReguationsLimits($request->id_document_emetteur, $init_country, $request->final_country, $transaction->montant, true); if ($rep instanceof JsonResponse) return $rep; $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_agent_cash_cash, $request->montant) : $this->calculateFees($plr_agent_cash_cash_national, $request->montant); $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $montantRetrait = $request->montant - $frais - $taxe; $transaction->montant_net = $montantRetrait; $transaction->montant_net_final_country = $this->toMoneyAmount($transaction->montant_net, $init_country, $request->final_country); $configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail(); $reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->first(); if (isset($reseauPayeur)) { $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; $transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; } else { $transaction->part_reseau_payeur = 0; $transaction->part_reseau_payeur_final_country = 0; $transaction->part_reseau_emetteur = $frais; } $commisionAgent = floatval($transaction->part_reseau_emetteur * $config->taux_com_ag_envoi_cash / 100); $commisionSuper = floatval($transaction->part_reseau_emetteur * $config->taux_com_sup_envoi_cash / 100); $commisionHyper = floatval($transaction->part_reseau_emetteur * $config->taux_com_hyp_envoi_cash / 100); $transaction->id_transaction = $this->getTransactionID(); if ($configPayeur->type == 'ilink') { //Mise a jour des comissions et compensation $reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country; $reseauPayeur->balance_compensation += $transaction->montant_net_final_country; //Hyperviseur payeur $hyperviseurPayeur = AgentPlus::where('category', 'hyper')->where('network_id', $request->network_destinataire)->firstOrFail(); if ($hyperviseurPayeur->id == $hyperviseur->id) { //Si c'est le reseau payeur est aussi emetteur $transaction->id_wallet_hyp_payeur = $walletHyperviseur->id; } else { $wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail(); $walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id); $walletHyperviseurPayeur->balance_com += $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country); $transaction->id_wallet_hyp_payeur = $walletHyperviseurPayeur->id; $walletHyperviseurPayeur->save(); } } else { //Emettre requete SSL vers wallet extene correspondant pour recharger le compte du destinataire // La mise à jour des comissions de compensation se fera lors du traitement de la transaction $transaction->status_reseau_payeur = 'EN_COURS'; $result = $this->sendFrame($this->PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL, $transaction); if ($result->getStatusCode() != 200) return $this->errorResponse(trans('errors.unexpected_error')); } $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->commission_hyp_final_country = $this->toMoneyAmount($transaction->commission_hyp, $init_country, $request->final_country); $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; if (isset($reseauPayeur)) $reseauPayeur->save(); $walletAgent->save(); $walletSuperviseur->save(); $walletHyperviseur->save(); $transaction->save(); $message = trans('messages.successful_agent_send_cash', ['sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire, 'id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantRetrait, $init_country), 'net_final' => $this->toMoneyWithCurrency($montantRetrait, $init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'init_country' => $this->getCountryName($init_country), 'final_country' => $this->getCountryName($request->final_country), 'code' => wordwrap($code_retrait, 4, ' ', true), 'network' => $this->getNetworkName($transaction->network_destinataire)]); $this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 18: // Agent - Envoi de cash vers banque $this->validate($request, [ 'iban' => 'required', 'id_wallet_network' => 'required|integer|min:0|not_in:0', 'id_bank' => 'required|integer|min:0|not_in:0', ]); $agent = AgentPlus::findOrFail($network_agent->agent_id); if (!$this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) return $this->errorResponse(trans('messages.incorrect_user_password')); if ($request->montant > $walletAgent->balance_princ) return $this->errorResponse(trans('errors.insufficient_balance')); //Verifier si la banque est associée au reseau $network_bank = NetworksBank::where('id_network', $request->id_wallet_network)->where('id_bank_country', $request->id_bank)->first(); if (!$network_bank) return $this->errorResponse(trans('errors.bank_not_associated_with_network')); //Verifier le code IBAN $country_code = $network_bank->network->country->code_country; $bank_code = $network_bank->banks_country->code_banque; switch ($this->checkIBAN($request->iban, $country_code, $bank_code)) { case 0: return $this->errorResponse(trans('errors.invalid_iban')); case 1: return $this->errorResponse(trans('errors.country_not_match_iban')); case 2: return $this->errorResponse(trans('errors.bank_not_match_iban')); } $transaction->frais = $frais = 0; $transaction->taxe = $taxe = 0; // $walletUser->balance -= $transaction->montant; //Emettre une trame SSL pour recharger le compte bancaire du montant de la transaction $transaction->commission_banque = 0; $transaction->commission_hyp = 0; $transaction->id_wallet_hyp = $walletHyperviseur->id; $transaction->id_wallet_ag = $walletAgent->id; $transaction->id_wallet_sup = $walletSuperviseur->id; $transaction->frais = $frais; $transaction->date = new \DateTime(); $transaction->bank = $network_bank->banks_country->bank->nom; $transaction->country = $network_bank->network->country->name; $transaction->id_bank = $request->id_bank; $transaction->iban = $request->iban; // $walletUser->save(); $transaction->id_transaction = $this->getTransactionID(); // $transaction->save(); Log::info('-------------------------- Agent - Envoi de cash vers banque ------------------------------------'); Log::info($transaction->toArray()); Log::info('------------------------------------------------------------------------------------------------'); $message = trans('messages.successful_user_send_to_bank', ['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net' => $this->toMoney($transaction->montant, $init_country), 'iban' => $request->iban, 'fees' => $this->toMoney($frais, $init_country), 'sender_code' => $codeGenerer->code_membre]); $this->sendMail($agent->email, trans('messages.successful_transaction'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } } public function lastUserTransactions($id_user) { $user = User::findOrFail($id_user); $wallet_user = WalletsUser::where('idUser', $user->id)->firstOrFail(); $transactions = DB::select('SELECT id_wallet_user , operation_fr , operation_en, id_transaction ,network_destinataire, init_country , final_country, date , id , montant , frais , taxe , pays_init , pays_final, destinataire_phone , destinataire_name , nom_destinataire, prenom_destinataire, montant_net ,montant_net_final_country FROM infos_ilink_transaction WHERE id_wallet_user = :id_wallet AND type <> 12 AND type <> 14 ORDER BY date DESC LIMIT 10;', ['id_wallet' => $wallet_user->id]); foreach ($transactions as $data) { $data->operation = app()->isLocale('en') ? $data->operation_en : $data->operation_fr; $date = $data->date; unset($data->date); $user_destinataire = isset($data->id_destinataire) ? User::where('user_code', $data->id_destinataire)->first() : null; // $emetteur = $wallet_user ? $wallet_user->user->lastname.' '.$wallet_user->user->firstname : $data->prenom_emetteur . ' ' . $data->nom_emetteur; $emetteur = 'Moi'; if ($data->destinataire_phone) { $destinataire = $data->destinataire_name; } else { $destinataire = $data->prenom_destinataire ? $data->prenom_destinataire . ' ' . $data->nom_destinataire : $emetteur; } // $destinataire = in_array($data->type,[12,16]) ? $emetteur : ( $user_destinataire ? $user_destinataire->lastname.' '.$user_destinataire->firstname : // $data->prenom_destinataire . ' ' . $data->nom_destinataire); $data->emetteur = $emetteur; $data->destinataire = $destinataire; $data->frais = $this->toMoney($data->frais + $data->taxe, $data->init_country); $data->montant_net_init = $this->toMoney($data->montant_net, $data->init_country); $data->montant_net_final = $data->montant_net_final_country ? $this->toMoney($data->montant_net_final_country, $data->final_country) : $data->montant_net_init; $data->montant = $this->toMoney($data->montant, $data->init_country); $data->init_country = $data->pays_init; $data->final_country = $data->pays_final; $data->reseau_payeur = isset($data->network_destinataire) ? $this->getNetworkName($data->network_destinataire) . ' ' . $data->final_country : null; $data->date = $date; unset($data->type, $data->destinataire_name, $data->id_wallet_user, $data->network_destinataire, $data->nom_destinataire, $data->prenom_destinataire, $data->taxe, $data->numero_carte, $data->montant_net_final_country, $data->montant_net, $data->pays_init, $data->pays_final, $data->id_destinataire, $data->destinataire_phone, $data->operation_fr, $data->operation_en); } return $this->successResponse($transactions); } public function lastAgentTransactions($id_wallet_agent) { $transactions = DB::select('SELECT wit.id_transaction, tit.nom as operation_fr , tit.name as operation_en, wit.montant ,wit.nom_emetteur, wit.prenom_emetteur, wit.id_wallet_user,wit.frais,wit.taxe,wit.id_destinataire, wit.nom_destinataire, wit.prenom_destinataire, wit.type , wit.id_wallet_user, wit.init_country, wit.final_country , wit.network_destinataire , wit.montant_net_final_country , wit.date , wit.id , wit.numero_carte, wit.montant_net FROM wallet_ilink_transaction wit INNER JOIN type_ilink_transaction tit ON wit.type = tit.id WHERE wit.id_wallet_ag = :id_wallet ORDER BY wit.date DESC LIMIT 10;', ['id_wallet' => $id_wallet_agent]); foreach ($transactions as $data) { $data->operation = app()->isLocale('en') ? $data->operation_en : $data->operation_fr; $date = $data->date; unset($data->date); $wallet_user = isset($data->id_wallet_user) ? WalletsUser::findOrFail($data->id_wallet_user) : null; $user_destinataire = isset($data->id_destinataire) ? User::where('user_code', $data->id_destinataire)->first() : null; $emetteur = $wallet_user ? $wallet_user->user->lastname . ' ' . $wallet_user->user->firstname : $data->prenom_emetteur . ' ' . $data->nom_emetteur; if (!$wallet_user && !$data->nom_emetteur) $emetteur = $data->numero_carte; $destinataire = in_array($data->type, [12, 16]) ? $emetteur : ($user_destinataire ? $user_destinataire->lastname . ' ' . $user_destinataire->firstname : $data->prenom_destinataire . ' ' . $data->nom_destinataire); $data->emetteur = $emetteur; $data->destinataire = $destinataire; $data->frais = $this->toMoney($data->frais + $data->taxe, $data->init_country); $data->montant_net_init = $this->toMoney($data->montant_net, $data->init_country); $data->montant_net_final = $data->montant_net_final_country ? $this->toMoney($data->montant_net_final_country, $data->final_country) : $data->montant_net_init; $data->montant = $this->toMoney($data->montant, $data->init_country); $data->init_country = $this->getCountryName($data->init_country); $data->final_country = $data->montant_net_final_country ? $this->getCountryName($data->final_country) : ''; $data->reseau_payeur = isset($data->network_destinataire) ? $this->getNetworkName($data->network_destinataire) . ' ' . $data->final_country : null; $data->date = $date; unset($data->type, $data->id_wallet_user, $data->network_destinataire, $data->nom_destinataire, $data->prenom_destinataire, $data->taxe, $data->numero_carte, $data->montant_net_final_country, $data->montant_net, $data->nom_emetteur, $data->prenom_emetteur, $data->id_destinataire, $data->operation_fr, $data->operation_en); } return $this->successResponse($transactions); } public function calculateCommission(Request $request) { $rules = [ 'type' => 'required|integer|min:0|not_in:0', 'id_wallet_agent' => 'required_without:id_wallet_user|integer|min:0|not_in:0', 'id_wallet_user' => 'required_without:id_wallet_agent|integer|min:0|not_in:0', 'montant' => 'required|numeric|min:0|not_in:0', ]; $this->validate($request, $rules); if (isset($request->id_wallet_agent)) { $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(); $init_country = $network_agent->network->country->id; } else { $walletUser = WalletsUser::findOrFail($request->id_wallet_user); $init_country = $walletUser->user->network->country->id; $result = ConfigWallet::join('networks', 'networks.id', '=', 'configWallet.id_network') ->where('networks.country_id', $init_country)->where('configWallet.type', 'ilink') ->select('configWallet.id')->first(); if ($result) { $config = ConfigWallet::findOrFail($result->id); } else { return $this->errorResponse(trans('errors.no_ilink_network')); } } $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"); switch ($request->type) { case 1: //User - Envoi wallet à wallet $this->validate($request, [ 'final_country' => 'required|integer|min:0|not_in:0', 'id_destinataire' => 'required_without:phone_destinataire', 'network_destinataire' => 'required|integer|min:0|not_in:0', ]); $configNetworkDestinataire = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail(); $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_wallet, $request->montant) : $this->calculateFees($plr_user_wallet_wallet_national, $request->montant); $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); //Verifier si c'est pas un reseau ilink if ($configNetworkDestinataire->type != 'ilink') { $data['destinataire'] = $request->id_destinataire; } else { $destinataire = User::where('user_code', $request->id_destinataire)->first(); $data['destinataire'] = $destinataire ? $destinataire->lastname . ' ' . $destinataire->firstname : $request->id_destinataire; } $data['frais'] = round($frais + $taxe, 2); $data['montant_net_init'] = round($request->montant - $data['frais'], 2); $data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country); break; case 2: //User - Envoi de wallet à carte $frais = $request->montant * $config->taux_com_user_wallet_carte / 100; $data['frais'] = round($frais, 2); $data['montant_net'] = round($request->montant - $data['frais'], 2); break; case 3: // User - Envoi wallet à cash $this->validate($request, [ 'final_country' => 'required|integer|min:0|not_in:0', ]); $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_cash, $request->montant) : $this->calculateFees($plr_user_wallet_cash_national, $request->montant); $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $data['frais'] = round($frais + $taxe, 2); $data['montant_net_init'] = round($request->montant - $data['frais'], 2); $data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country); break; case 9: // User - Retrait de wallet en cash $frais = $this->calculateFees($plr_user_wallet_cash_national, $request->montant); $taxe = $this->calculateTax($taxesNationales, $frais); $data['frais'] = round($frais + $taxe, 2); $data['montant_net'] = round($request->montant - $data['frais'], 2); break; case 10: //User - Retrait de carte vers wallet $frais = $request->montant * $config->taux_com_user_carte_wallet / 100;; $data['frais'] = round($frais, 2); $data['montant_net'] = round($request->montant + $data['frais'], 2); break; case 11: // User - Retrait de carte vers cash $frais = $request->montant * $config->taux_com_user_carte_cash / 100; $data['frais'] = round($frais, 2); $data['montant_net'] = round($request->montant + $data['frais'], 2); break; case 13: // Agent - Retrait de la carte vers cash $frais = $request->montant * $config->taux_com_wallet_ag_carte_cash / 100; $data['frais'] = round($frais, 2); $data['montant_net'] = round($request->montant + $data['frais'], 2); break; case 14: // Agent - Envoi de cash vers wallet iLink $this->validate($request, [ 'user_code' => 'required', ]); $user = User::where('user_code', $request->user_code)->first(); if (!$user) return $this->errorResponse(trans('errors.wallet_not_defined')); $final_country = $user->network->country->id; $frais = ($init_country != $final_country) ? $this->calculateFees($plr_agent_depot_wallet_ilink, $request->montant) : $this->calculateFees($plr_agent_depot_wallet_ilink_national, $request->montant); $taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $data['frais'] = round($frais + $taxe, 2); $data['montant_net_init'] = round($request->montant - $data['frais'], 2); $data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $final_country); break; case 15: // Agent - Envoi de cash vers autre wallet $this->validate($request, [ 'final_country' => 'required|integer|min:0|not_in:0', ]); $frais = ($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 = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $data['frais'] = round($frais + $taxe, 2); $data['montant_net_init'] = round($request->montant - $data['frais'], 2); $data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country); break; case 16: // Agent - Envoi de cash vers une carte visa $frais = $request->montant * $config->taux_com_wallet_ag_envoi_cash_carte / 100; $data['frais'] = round($frais, 2); $data['montant_net'] = round($request->montant - $data['frais'], 2); break; case 17: // Agent - Envoi de cash vers cash $this->validate($request, [ 'final_country' => 'required|integer|min:0|not_in:0', ]); $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_agent_cash_cash, $request->montant) : $this->calculateFees($plr_agent_cash_cash_national, $request->montant); $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); $data['frais'] = round($frais + $taxe, 2); $data['montant_net_init'] = round($request->montant - $data['frais'], 2); $data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country); break; } $net = isset($data['montant_net']) ? $data['montant_net'] : $data['montant_net_init']; if (isset($net)) if ($net < 0) return $this->errorResponse(trans('errors.incorrect_net_amount')); return $this->successResponse($data); } public function getTransactionRetrait(Request $request) { $this->validate($request, [ 'id_transaction' => 'required', 'id_wallet_agent' => 'required|integer|min:0|not_in:0', 'code_retrait' => 'required', ]); $transaction = WalletIlinkTransaction::select('nom_destinataire', 'prenom_destinataire', 'type_document_destinataire', 'id_document_destinataire', 'type', 'encrypted_code_retrait', 'code_retrait_salt', 'id_wallet_user', 'init_country', 'final_country', 'network_destinataire', 'id_transaction', 'montant_net_final_country', 'montant_net')->where('id_transaction', $request->id_transaction)->first(); if (!$transaction) return $this->errorResponse(trans('errors.transaction_not_exist'), Response::HTTP_NOT_FOUND); if (!$this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt)) return $this->errorResponse(trans('errors.invalid_withdrawal_code')); //Verifier que le reseau payeur est de type iLink if (in_array($transaction->type, [3, 17])) { $configPayeur = ConfigWallet::where('id_network', $transaction->network_destinataire)->firstOrFail(); if ($configPayeur->type != 'ilink') return $this->errorResponse(trans('errors.withdrawal_network_unauthorized')); } if ($transaction->status_retrait != 0) return $this->errorResponse(trans('errors.withdrawal_already_made')); $walletAgent = Wallet::findOrFail($request->get('id_wallet_agent')); $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent); $agent_country = $network_agent->network->country->id; if ($agent_country != $transaction->final_country) return $this->errorResponse(trans('errors.operation_cannot_performed_in_country')); $data = $transaction->replicate(); if (in_array($transaction->type, [9, 11])) { $identification = $identification = Identification::where('id_user', $transaction->wallet_user->user->id)->first(); if (!$identification) return $this->errorResponse(trans('errors.user_identification_required')); if ($identification->status != 1) return $this->errorResponse(trans('errors.validation_user_identification_required')); $data->nom_destinataire = $transaction->wallet_user->user->lastname; $data->prenom_destinataire = $transaction->wallet_user->user->firstname; $data->type_document_destinataire = $identification->identity_document; $data->id_document_destinataire = $identification->id_identity_document; // $data->user_code = $transaction->wallet_user->user->user_code; } $data->montant = $transaction->type == 11 ? $transaction->montant_net : $transaction->montant_net_final_country; unset($data->type, $data->init_country, $data->final_country, $data->id_wallet_user, $data->network_destinataire, $data->code_retrait_salt, $data->encrypted_code_retrait, $data->montant_net_final_country, $data->montant_net); 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); if ($size > 0) { $min = $paliers[0]->min; $max = $paliers[$size - 1]->max; $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; } } return 0; } 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); } 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; } private function checkUserIdentification($id_user) { $identification = Identification::where('id_user', $id_user)->first(); if (isset($identification)) { if ($identification->status == 0) return $this->errorResponse(trans('errors.validation_user_identification_required')); } else { return $this->errorResponse(trans('errors.user_identification_required')); } } // public function index(Request $request){ // // $notices = DB::select('select notices.id,notices.title,notices.body,notices.created_at,notices.updated_at, //users.name,departments.department_name //FROM notices //INNER JOIN users ON notices.user_id = users.id //INNER JOIN departments on users.dpt_id = departments.id //ORDER BY users.id DESC'); // // $notices = $this->arrayPaginator($notices, $request); // // return view('welcome')->with('allNotices', $notices); // // } public function cancel($id_transaction) { $transaction = WalletIlinkTransaction::where('id_transaction', $id_transaction)->firstOrFail(); $transactionInverse = $transaction->replicate(); $transactionInverse->date = new \DateTime(); $transactionInverse->montant = -$transaction->montant; $transactionInverse->montant_net = -$transaction->montant_net; $transactionInverse->montant_net_final_country = -$transaction->montant_net_final_country; $transactionInverse->taxe = -$transaction->taxe; $transactionInverse->frais = -$transaction->frais; $transactionInverse->commission_ag = -$transaction->commission_ag; $transactionInverse->commission_sup = -$transaction->commission_sup; $transactionInverse->commission_hyp = -$transaction->commission_hyp; $transactionInverse->commission_hyp_final_country = -$transaction->commission_hyp_final_country; $transactionInverse->commission_banque = -$transaction->commission_banque; $transactionInverse->id = null; $transactionInverse->id_transaction = $this->getTransactionID(); // $walletAgent = $transaction->wallet; // $walletSuperviseur = $transaction->wallet_sup; // $walletHyperviseur = $transaction->wallet_hyp; // // if ($transaction->type == 'credit'){ // //Depot // $walletAgent->balance_princ += $transaction->montant; // }elseif ($transaction->type == 'debit'){ // //Retrait // $walletAgent->balance_princ -= $transaction->montant; // } // // $walletAgent->balance_com -= $transaction->commission_ag; // $walletSuperviseur->balance_com -= $transaction->commission_sup; // $walletHyperviseur->balance_com -= $transaction->commission_hyp; $transaction->canceled = 1; // $walletAgent->save(); // $walletSuperviseur->save(); // $walletHyperviseur->save(); $transaction->save(); $transactionInverse->save(); return $this->successResponse(trans('messages.canceled_transaction')); } //Verfier les limites reglementaires public function checkReguationsLimits($identifiant, $init_country, $final_country, $montant_transaction, $is_id_document_emetteur = false) { $regulation = Regulation::where('id_country', $init_country)->first(); if (!$regulation) return; // Total montants journalier if ($is_id_document_emetteur) $daily_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->where('final_country', $final_country)->whereDate('date', Carbon::today())->sum('montant'); else $daily_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->where('final_country', $final_country)->whereDate('date', Carbon::today())->sum('montant'); $max_jour = ($init_country == $final_country) ? $regulation->montant_max_jour_national : $regulation->montant_max_jour_international; $amount_admitted = $max_jour - $daily_sum; if (($daily_sum + $montant_transaction) > $max_jour) return $this->errorResponse(($init_country == $final_country) ? trans('errors.national_daily_regulations_limits_reached') : trans('errors.international_daily_regulations_limits_reached') . ' ' . ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : '')); // Total montants hebdomadaire if ($is_id_document_emetteur) $weekly_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(7), Carbon::today()])->sum('montant'); else $weekly_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(7), Carbon::today()])->sum('montant'); $max_hebdo = ($init_country == $final_country) ? $regulation->montant_max_hebdo_national : $regulation->montant_max_hebdo_international; $amount_admitted = $max_hebdo - $weekly_sum; if (($weekly_sum + $montant_transaction) > $max_hebdo) return $this->errorResponse(($init_country == $final_country) ? trans('errors.national_weekly_regulations_limits_reached') : trans('errors.international_weekly_regulations_limits_reached') . ' ' . ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : '')); // Total montants mensuel if ($is_id_document_emetteur) $monthly_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(30), Carbon::today()])->sum('montant'); else $monthly_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(30), Carbon::today()])->sum('montant'); $max_mensuel = ($init_country == $final_country) ? $regulation->montant_max_mensuel_national : $regulation->montant_max_mensuel_international; $amount_admitted = $max_mensuel - $monthly_sum; if (($monthly_sum + $montant_transaction) > $max_mensuel) return $this->errorResponse(($init_country == $final_country) ? trans('errors.national_monthly_regulations_limits_reached') : trans('errors.international_monthly_regulations_limits_reached') . ' ' . ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : '')); } // Recevoir le traitement d'une transaction venant d'un reseau payeur public function receiveRequestProcessingResult(Request $request) { $this->validate($request, [ 'id_transaction' => 'required', 'status' => 'required|in:NON_TRAITEE,TRAITEE' ]); $transaction = WalletIlinkTransaction::where('id_transaction', $request->id_transaction)->firstOrFail(); if (!in_array($transaction->type, [1, 3, 17])) return $this->errorResponse(trans('errors.forbidden')); if ($transaction->status_reseau_payeur != 'EN_COURS') return $this->errorResponse(trans('errors.request_already_processed')); // modifier l'etat et mettre les comptes comissions et compensatios du reseau payeur $transaction->status_reseau_payeur = $request->status; if ($request->status == 'TRAITEE') { //Mise a jour des comissions et compensation $config = ConfigWallet::where('id_network', $transaction->network_emetteur)->firstOrFail(); $reseauPayeur = PayingNetwork::where('id_network', $transaction->network_destinataire)->where('id_configWallet', $config->id)->firstOrFail(); $reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country; $reseauPayeur->balance_compensation += $transaction->montant_net_final_country; $reseauPayeur->save(); } $transaction->save(); return $this->successResponse(trans('messages.success_treated_demand')); } }