diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index ad25c6fabe46..6eb345259cff 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -23,8 +23,9 @@ use App\Http\Requests\PurchaseOrder\EditPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\ShowPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\StorePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UpdatePurchaseOrderRequest; -use App\Jobs\Invoice\PurchaseOrderEmail; use App\Jobs\Invoice\ZipInvoices; +use App\Jobs\PurchaseOrder\PurchaseOrderEmail; +use App\Jobs\PurchaseOrder\ZipPurchaseOrders; use App\Models\Client; use App\Models\PurchaseOrder; use App\Repositories\PurchaseOrderRepository; @@ -495,7 +496,7 @@ class PurchaseOrderController extends BaseController } }); - ZipInvoices::dispatch($purchase_orders, $purchase_orders->first()->company, auth()->user()); + ZipPurchaseOrders::dispatch($purchase_orders, $purchase_orders->first()->company, auth()->user()); return response()->json(['message' => ctrans('texts.sent_message')], 200); } @@ -631,6 +632,11 @@ class PurchaseOrderController extends BaseController //check query parameter for email_type and set the template else use calculateTemplate PurchaseOrderEmail::dispatch($purchase_order, $purchase_order->company); + + if (! $bulk) { + return response()->json(['message' => 'email sent'], 200); + } + default: return response()->json(['message' => ctrans('texts.action_unavailable', ['action' => $action])], 400); break; diff --git a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php index ef97d446ad58..5b63416e468e 100644 --- a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php +++ b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php @@ -38,7 +38,7 @@ class StorePurchaseOrderRequest extends Request { $rules = []; - $rules['vendor_id'] = 'required'; + $rules['vendor_id'] = 'bail|required|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; $rules['number'] = ['nullable', Rule::unique('purchase_orders')->where('company_id', auth()->user()->company()->id)]; $rules['discount'] = 'sometimes|numeric'; diff --git a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php new file mode 100644 index 000000000000..34d926c0eed9 --- /dev/null +++ b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php @@ -0,0 +1,125 @@ +purchase_orders = $purchase_orders; + + $this->company = $company; + + $this->user = $user; + + $this->settings = $company->settings; + } + + /** + * Execute the job. + * + * @return void + * @throws \ZipStream\Exception\FileNotFoundException + * @throws \ZipStream\Exception\FileNotReadableException + * @throws \ZipStream\Exception\OverflowException + */ + + public function handle() + { + MultiDB::setDb($this->company->db); + + # create new zip object + $zipFile = new \PhpZip\ZipFile(); + $file_name = date('Y-m-d').'_'.str_replace(' ', '_', trans('texts.invoices')).'.zip'; + $invitation = $this->purchase_orders->first()->invitations->first(); + $path = $this->purchase_orders->first()->vendor->purchase_order_filepath($invitation); + + $this->purchase_orders->each(function ($purchase_order){ + + CreatePurchaseOrderPdf::dispatchNow($purchase_order->invitations()->first()); + + }); + + try{ + + foreach ($this->purchase_orders as $purchase_order) { + + $file = $purchase_order->service()->getPurchaseOrderPdf(); + $zip_file_name = basename($file); + $zipFile->addFromString($zip_file_name, Storage::get($file)); + + } + + Storage::put($path.$file_name, $zipFile->outputAsString()); + + $nmo = new NinjaMailerObject; + $nmo->mailable = new DownloadInvoices(Storage::url($path.$file_name), $this->company); + $nmo->to_user = $this->user; + $nmo->settings = $this->settings; + $nmo->company = $this->company; + + NinjaMailerJob::dispatch($nmo); + + UnlinkFile::dispatch(config('filesystems.default'), $path.$file_name)->delay(now()->addHours(1)); + + + } + catch(\PhpZip\Exception\ZipException $e){ + nlog("could not make zip => ". $e->getMessage()); + } + finally{ + $zipFile->close(); + } + + + } + +} diff --git a/app/Models/PurchaseOrderInvitation.php b/app/Models/PurchaseOrderInvitation.php index beff77059650..dfeaeefbe7a2 100644 --- a/app/Models/PurchaseOrderInvitation.php +++ b/app/Models/PurchaseOrderInvitation.php @@ -1,4 +1,13 @@ entityType())); + + if(Ninja::isHosted()){ + $domain = $this->company->domain(); + } + else + $domain = config('ninja.app_url'); + + switch ($this->company->portal_mode) { + case 'subdomain': + return $domain.'/vendor/'.$entity_type.'/'.$this->key; + break; + case 'iframe': + return $domain.'/vendor/'.$entity_type.'/'.$this->key; + break; + case 'domain': + return $domain.'/vendor/'.$entity_type.'/'.$this->key; + break; + + default: + return ''; + break; + } + } + + public function getAdminLink() :string + { + return $this->getLink().'?silent=true'; + } + + } diff --git a/tests/Feature/CompanyTest.php b/tests/Feature/CompanyTest.php index ecf2c61fbba4..2afc847ac512 100644 --- a/tests/Feature/CompanyTest.php +++ b/tests/Feature/CompanyTest.php @@ -50,8 +50,8 @@ class CompanyTest extends TestCase { $this->withoutMiddleware(PasswordProtection::class); - $cc = Company::first(); - $cc->delete(); + // $cc = Company::first(); + // $cc->delete(); $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'),