diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index f008681254b7..9415cfd8aa1a 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -11,12 +11,16 @@ namespace App\Http\Controllers; +use App\Http\Requests\Activity\DownloadHistoricalInvoiceRequest; use App\Models\Activity; use App\Transformers\ActivityTransformer; +use App\Utils\Traits\Pdf\PdfMaker; use Illuminate\Http\Request; class ActivityController extends BaseController { + use PdfMaker; + protected $entity_type = Activity::class; protected $entity_transformer = ActivityTransformer::class; @@ -78,7 +82,26 @@ class ActivityController extends BaseController $activities = Activity::orderBy('created_at', 'DESC')->company() ->take($default_activities); - return $this->listResponse($activities); } + + public function downloadHistoricalInvoice(DownloadHistoricalInvoiceRequest $request, Activity $activity) + { + + $pdf = $this->makePdf(null, null, $activity->backup->html_backup); + + if(isset($activity->invoice_id)) + $filename = $activity->invoice->number . ".pdf"; + elseif(isset($activity->quote_id)) + $filename = $activity->quote->number . ".pdf"; + elseif(isset($activity->credit_id)) + $filename = $activity->credit->number . ".pdf"; + else + $filename = "backup.pdf"; + + return response()->streamDownload(function () use($pdf) { + echo $pdf; + }, $filename); + } + } diff --git a/app/Http/Requests/Activity/DownloadHistoricalInvoiceRequest.php b/app/Http/Requests/Activity/DownloadHistoricalInvoiceRequest.php new file mode 100644 index 000000000000..6c3e2a8e6661 --- /dev/null +++ b/app/Http/Requests/Activity/DownloadHistoricalInvoiceRequest.php @@ -0,0 +1,29 @@ +user()->can('view', $this->activity); + } +} diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 8c56b8d41561..36831aebb94f 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -11,10 +11,14 @@ namespace App\Models; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; class Activity extends StaticModel { + + use MakesHash; + const CREATE_CLIENT=1; // const ARCHIVE_CLIENT=2; // const DELETE_CLIENT=3; // @@ -144,4 +148,16 @@ class Activity extends StaticModel { return $this->belongsTo(Company::class); } + + + public function resolveRouteBinding($value) + { + if (is_numeric($value)) { + throw new ModelNotFoundException("Record with value {$value} not found"); + } + + return $this + //->withTrashed() + ->where('id', $this->decodePrimaryKey($value))->firstOrFail(); + } } diff --git a/routes/api.php b/routes/api.php index f6640a31b5c1..c96572768728 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,7 +26,9 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a Route::get('ping', 'PingController@index')->name('ping'); Route::get('health_check', 'PingController@health')->name('health_check'); - Route::resource('activities', 'ActivityController');// name = (clients. index / create / show / update / destroy / edit + Route::get('activities', 'ActivityController@index'); + + Route::get('activities/download_invoice/{activity}', 'ActivityController@downloadHistoricalInvoice'); Route::resource('clients', 'ClientController');// name = (clients. index / create / show / update / destroy / edit diff --git a/tests/Integration/DownloadHistoricalInvoiceTest.php b/tests/Integration/DownloadHistoricalInvoiceTest.php new file mode 100644 index 000000000000..795c05be3581 --- /dev/null +++ b/tests/Integration/DownloadHistoricalInvoiceTest.php @@ -0,0 +1,71 @@ +makeTestData(); + } + + private function mockActivity() + { + $activity_repo = new ActivityRepository(); + + $obj = new \stdClass; + $obj->invoice_id = $this->invoice->id; + $obj->user_id = $this->invoice->user_id; + $obj->company_id = $this->company->id; + + $activity_repo->save($obj, $this->invoice, Ninja::eventVars()); + + } + public function testActivityAccessible() + { + $this->mockActivity(); + + $this->assertNotNull($this->invoice->activities); + } + + public function testBackupExists() + { + $this->mockActivity(); + + $this->assertNotNull($this->invoice->activities->first()->backup->html_backup); + } + + + public function testBackupDownload() + { + $this->mockActivity(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token + ])->get('/api/v1/activities/download_invoice/'.$this->encodePrimaryKey($this->invoice->activities->first()->id)); + + $response->assertStatus(200); + } +}