nikarayan and payment service

This commit is contained in:
2024-04-08 12:59:01 +03:30
parent 942a9737b6
commit 92c50280fc
8 changed files with 345 additions and 19 deletions

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Services\PaymentService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Province; use App\Models\Province;
use App\Models\City; use App\Models\City;
@@ -353,10 +354,10 @@ class ReceiptController extends Controller
}); });
} }
public function invoiceBill(Request $request, Accident $accident) public function invoiceBill(Request $request, Accident $accident, PaymentService $paymentService)
{ {
try { try {
DB::transaction(function () use ($request, $accident) { DB::transaction(function () use ($request, $accident, $paymentService) {
$final_amount = $accident->sum - ($accident->deposit_insurance_amount + $accident->deposit_daghi_amount); $final_amount = $accident->sum - ($accident->deposit_insurance_amount + $accident->deposit_daghi_amount);
@@ -366,7 +367,7 @@ class ReceiptController extends Controller
$accident->final_amount = $final_amount; $accident->final_amount = $final_amount;
$accident->bill_code = $this->invoiceBillApi($accident->driver_national_code, $final_amount); $accident->bill_code = $paymentService->invoiceBillApi($accident->driver_national_code, $final_amount);
$accident->invoiceBill(); $accident->invoiceBill();
@@ -396,13 +397,13 @@ class ReceiptController extends Controller
return $msg; return $msg;
} }
public function callPaymentStatus(Request $request, Accident $accident) public function callPaymentStatus(Request $request, Accident $accident, PaymentService $paymentService)
{ {
try { try {
DB::transaction(function () use ($request, $accident) { DB::transaction(function () use ($request, $accident, $paymentService) {
if ($accident->final_amount > 0) { if ($accident->final_amount > 0) {
$response = json_decode($this->callPaymentStatusBillApi(explode("/", $accident->bill_code)[0])); $response = json_decode($paymentService->callPaymentStatusBillApi(explode("/", $accident->bill_code)[0]));
if ($response->isPayed) { if ($response->isPayed) {
$accident->payBill(); $accident->payBill();

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers\V2\Dashboard; namespace App\Http\Controllers\V2\Dashboard;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Services\NikarayanService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Hekmatinasser\Verta\Verta; use Hekmatinasser\Verta\Verta;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@@ -425,7 +426,7 @@ class RoadObservationController extends Controller
], 200); ], 200);
} }
public function handle(Request $request, RoadObserved $roadObserved) public function handle(Request $request, RoadObserved $roadObserved, NikarayanService $nikarayanService)
{ {
if (! auth()->user()->hasAnyPermission(['show-fast-react-edarate-shahri', 'show-fast-react-province', 'show-fast-react'])) { if (! auth()->user()->hasAnyPermission(['show-fast-react-edarate-shahri', 'show-fast-react-province', 'show-fast-react'])) {
return response()->json([ return response()->json([
@@ -498,19 +499,9 @@ class RoadObservationController extends Controller
// if ($file_index > 0) { // if ($file_index > 0) {
// $roadObserved->files()->createMany($files_path); // $roadObserved->files()->createMany($files_path);
// } // }
$url = "https://riws.rmto.ir/WebServices/NRPTrafficStatus.asmx?wsdl"; // $url = "https://riws.rmto.ir/WebServices/NRPTrafficStatus.asmx?wsdl";
try { try {
$array = array('strUserName' => 'vaytelrop', $result = $nikarayanService->updateRoadObservedInfoByNikarayan($request, $roadObserved, $files);
'strPassword' => 'VaYtelROP*2024',
'strAutoID' => $roadObserved->fk_RegisteredEventMessage,
'strStateID' => ($request->input('rms-status') == 1) ? '2' : '3',
'strDescription' => $request->input('rms-description') ?? $roadObserved->rms_description,
'strPreviousImageLink' => "https://rms.rmto.ir/".$files,
'strNextImageLink' => "https://rms.rmto.ir/".$files,
'strRMSDateAndTime' => $roadObserved->updated_at
);
$soap_client = new SoapClient($url);
$result = $soap_client->UpdateInfo_RoadObservedProblems($array);
} catch (SoapFault $e) { } catch (SoapFault $e) {
$msg = "error in send to nikarayan at".date("Y-m-d H:i:s")."\n".'rms: error in get road observation webservice babe!!!!'."\n"; $msg = "error in send to nikarayan at".date("Y-m-d H:i:s")."\n".'rms: error in get road observation webservice babe!!!!'."\n";

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Providers;
use App\Services\NikarayanService;
use Illuminate\Support\ServiceProvider;
use SoapClient;
class NikarayanServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
//
}
/**
* Bootstrap services.
*/
public function boot(): void
{
$this->app->bind(NikarayanServiceProvider::class, function () {
$url = "https://riws.rmto.ir/WebServices/NRPTrafficStatus.asmx?wsdl";
$soapClient = new SoapClient($url);
return new NikarayanService($soapClient);
});
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Services;
use App\Models\RoadObserved;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use SoapClient;
class NikarayanService
{
protected SoapClient $soapClient;
public function __construct(SoapClient $soapClient)
{
$this->soapClient = $soapClient;
}
public function updateRoadObservedInfoByNikarayan(Request $request, RoadObserved $roadObserved, $files)
{
if (App::isProduction())
{
$array = array('strUserName' => 'vaytelrop',
'strPassword' => 'VaYtelROP*2024',
'strAutoID' => $roadObserved->fk_RegisteredEventMessage,
'strStateID' => ($request->input('rms-status') == 1) ? '2' : '3',
'strDescription' => $request->input('rms-description') ?? $roadObserved->rms_description,
'strPreviousImageLink' => "https://rms.rmto.ir/".$files,
'strNextImageLink' => "https://rms.rmto.ir/".$files,
'strRMSDateAndTime' => $roadObserved->updated_at
);
return $this->soapClient->UpdateInfo_RoadObservedProblems($array);
}
return 0;
}
}

View File

@@ -0,0 +1,72 @@
<?php
namespace App\Services;
use Illuminate\Support\Facades\App;
class PaymentService
{
public function invoiceBillApi($driver_national_code, $final_amount)
{
if (App::isProduction())
{
try {
$post = array(
'username' => env("PAYMENT_USERNAME"),
'password' => env("PAYMENT_PASSWORD"),
'amount' => $final_amount,
'serial' => "12345",
'type' => 1,
'instanceid' => 123,
'ownerid' => $driver_national_code,
'calculationBox' => "{\"rows\":[{\"amount\":" . $final_amount . ",\"code\":\"7070021060000015\"}]}"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://payment.rmto.ir/acc/rest/payid/gen");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
catch (\Throwable $th) {
abort(500);
}
}
return 0;
}
public function callPaymentStatusBillApi($bill_code)
{
if (App::isProduction())
{
try {
$post = array(
// 'username' => env("PAYMENT_USERNAME"),
// 'password' => env("PAYMENT_PASSWORD"),
// 'amount' => $final_amount,
// 'serial' => "12345",
// 'type' => 1,
// 'instanceid' => 123,
// 'ownerid' => $driver_national_code,
// 'calculationBox' => "{\"rows\":[{\"amount\":". $final_amount .",\"code\":\"7070021060000015\"}]}"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://payment.rmto.ir/acc/rest/payid/track2/" . env("PAYMENT_USERNAME") . "/" . env("PAYMENT_PASSWORD") . "/" . $bill_code);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
curl_close($ch);
return $response;
} catch (\Throwable $th) {
abort(500);
}
}
return 0;
}
}

View File

@@ -44,6 +44,7 @@
40 => 'App\\Providers\\RouteServiceProvider', 40 => 'App\\Providers\\RouteServiceProvider',
41 => 'App\\Providers\\TelescopeServiceProvider', 41 => 'App\\Providers\\TelescopeServiceProvider',
42 => 'Barryvdh\\Debugbar\\ServiceProvider', 42 => 'Barryvdh\\Debugbar\\ServiceProvider',
43 => 'App\\Providers\\NikarayanServiceProvider',
), ),
'eager' => 'eager' =>
array ( array (
@@ -76,6 +77,7 @@
26 => 'App\\Providers\\RouteServiceProvider', 26 => 'App\\Providers\\RouteServiceProvider',
27 => 'App\\Providers\\TelescopeServiceProvider', 27 => 'App\\Providers\\TelescopeServiceProvider',
28 => 'Barryvdh\\Debugbar\\ServiceProvider', 28 => 'Barryvdh\\Debugbar\\ServiceProvider',
29 => 'App\\Providers\\NikarayanServiceProvider',
), ),
'deferred' => 'deferred' =>
array ( array (

View File

@@ -181,6 +181,7 @@ return [
App\Providers\TelescopeServiceProvider::class, App\Providers\TelescopeServiceProvider::class,
Barryvdh\Debugbar\ServiceProvider::class, Barryvdh\Debugbar\ServiceProvider::class,
App\Providers\NikarayanServiceProvider::class,
], ],

View File

@@ -0,0 +1,192 @@
<?php
namespace Tests\Feature\V2\Dashboard\RoadObservation;
use App\Facades\Sms\Sms;
use App\Models\LogList;
use App\Models\Permission;
use App\Models\RoadObserved;
use App\Models\User;
use App\Services\NikarayanService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Mockery\MockInterface;
use Tests\TestCase;
class HandleTest extends TestCase
{
use RefreshDatabase, WithFaker;
/**
* A basic feature test example.
*/
public function test_user_should_have_right_permissions(): void
{
$user = User::factory()->create();
$roadObserved = RoadObserved::factory()->create();
$mock = $this->mock(NikarayanService::class, function (MockInterface $mock) {
$mock->shouldReceive('updateRoadObservedInfoByNikarayan')->andReturn(0);
});
$response = $this->actingAs($user)->postJson("/v2/road_observations/handle/{$roadObserved->id}");
$response->assertForbidden();
}
public function test_user_can_handle_road_observed_update_info(): void
{
$user = User::factory()
->has(Permission::factory([
'name' => 'show-fast-react-edarate-shahri'
]))
->create();
$roadObserved = RoadObserved::factory()->create();
$logList = LogList::factory()->create([
'log_unique_code' => 1142
]);
$mock = $this->mock(NikarayanService::class, function (MockInterface $mock) {
$mock->shouldReceive('updateRoadObservedInfoByNikarayan')->andReturn(0);
});
Sms::shouldReceive('sendSms');
Storage::fake('public');
$attributes = [
'image-before-1' => UploadedFile::fake()->image('file.jpg')->size('30'),
'image-after-1' => UploadedFile::fake()->image('file.jpg')->size('30'),
'rms-start-latlng' => '12,12',
'rms-end-latlng' => '13,13',
];
$response = $this->actingAs($user)->postJson("/v2/road_observations/handle/{$roadObserved->id}", $attributes);
$response->assertStatus(201)
->assertJsonStructure([
'status',
'message',
'data' => [
"AutoID",
"Description",
"EndDate",
"EndTime",
"EndTime_DateTime",
"EventTypeTitle",
"FeatureTypeTitle",
"MobileForSendEventSms",
"ProvinceName",
"StartDate",
"StartTime",
"StartTime_DateTime",
"StartTime_DateTime_fa",
"Title",
"TownName",
"WeatherName",
"XLAM",
"YLAM",
"city_fa",
"city_id",
"created_at",
"edarate_shahri_id",
"fk_Country",
"fk_EventType",
"fk_FeatureType",
"fk_Province",
"fk_RegisteredEventMessage",
"fk_Town",
"fk_Weather",
"handling_way_id",
"id",
"image_after",
"image_before",
"lat",
"lng",
"observed_way_id",
"province_fa",
"province_id",
"refer_description",
"restore_description",
"rms_city_id",
"rms_description",
"rms_end_latlng",
"rms_last_activity",
"rms_last_activity_fa",
"rms_province_id",
"rms_start_latlng",
"rms_status",
"status",
"status_fa",
"supervising_time",
"supervisor_description",
"supervisor_id",
"supervisor_name",
"updated_at",
"updated_at_fa"
],
'nikarayan_res'
]);
$this->assertDatabaseHas('road_observed_histories', [
'user_id' => $user->id,
'previous_rms_status' => 0,
'previous_rms_start_latlng' => $roadObserved->rms_start_latlng,
'previous_rms_end_latlng' => $roadObserved->rms_end_latlng,
'previous_rms_description' => $roadObserved->rms_description,
]);
$this->assertDatabaseHas('road_observeds', [
"AutoID" => $roadObserved->AutoID,
"Description" => $roadObserved->Description,
"EndDate" => $roadObserved->EndDate,
"EndTime" => $roadObserved->EndTime,
"EndTime_DateTime" => $roadObserved->EndTime_DateTime,
"EventTypeTitle" => $roadObserved->EventTypeTitle,
"FeatureTypeTitle" => $roadObserved->FeatureTypeTitle,
"MobileForSendEventSms" => $roadObserved->MobileForSendEventSms,
"ProvinceName" => $roadObserved->ProvinceName,
"StartDate" => $roadObserved->StartDate,
"StartTime" => $roadObserved->StartTime,
"StartTime_DateTime" => $roadObserved->StartTime_DateTime,
"StartTime_DateTime_fa" => $roadObserved->StartTime_DateTime_fa,
"Title" => $roadObserved->Title,
"TownName" => $roadObserved->TownName,
"WeatherName" => $roadObserved->WeatherName,
"XLAM" => $roadObserved->XLAM,
"YLAM" => $roadObserved->YLAM,
"city_fa" => $roadObserved->city_fa,
"city_id" => $roadObserved->city_id,
"edarate_shahri_id" => null,
"fk_Country" => $roadObserved->fk_Country,
"fk_EventType" => $roadObserved->fk_EventType,
"fk_FeatureType" => $roadObserved->fk_FeatureType,
"fk_Province" => $roadObserved->fk_Province,
"fk_RegisteredEventMessage" => $roadObserved->fk_RegisteredEventMessage,
"fk_Town" => $roadObserved->fk_Town,
"fk_Weather" => $roadObserved->fk_Weather,
"handling_way_id" => $roadObserved->handling_way_id,
"id" => $roadObserved->id,
"lat" => $roadObserved->lat,
"lng" => $roadObserved->lng,
"observed_way_id" => $roadObserved->observed_way_id,
"province_fa" => $roadObserved->province_fa,
"province_id" => $roadObserved->province_id,
"refer_description" => $roadObserved->refer_description,
"restore_description" => $roadObserved->restore_description,
"rms_city_id" => $roadObserved->rms_city_id,
'rms_description' => null,
"rms_province_id" => $roadObserved->rms_province_id,
"rms_status" => 0,
'status' => 0,
'status_fa' => 'در حال بررسی',
"supervising_time" => $roadObserved->supervising_time,
"supervisor_description" => $roadObserved->supervisor_description,
"supervisor_id" => $roadObserved->supervisor_id,
"supervisor_name" => $roadObserved->supervisor_name,
]);
}
}