diff --git a/app/Classes/General/Interfaces/Packable.php b/app/Classes/General/Interfaces/Packable.php index e46e5341..b2e60a10 100644 --- a/app/Classes/General/Interfaces/Packable.php +++ b/app/Classes/General/Interfaces/Packable.php @@ -7,7 +7,6 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; interface Packable { - public function packingLists(): morphMany; } \ No newline at end of file diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/CreateDeliverPackingListLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/CreateDeliverPackingListLogic.php new file mode 100644 index 00000000..0e24c9ed --- /dev/null +++ b/app/Classes/Modules/PackingLists/ControllersLogic/CreateDeliverPackingListLogic.php @@ -0,0 +1,88 @@ + 'Created Deliver PackingList', + 'message' => 'You have successfully created a new Deliver PackingList' + ]; + } + + /** @var CreatePackingListProcessor */ + private $createPackingListProcessor; + + /** @var FetchesCompanyModule */ + private $fetchesCompanyModule; + + /** @var GeneratesPackingListReferenceNumber */ + private $generatesPackingListReferenceNumber; + + /** @var FetchesPackingList */ + private $fetchesPackingList; + + /** + * CreateDeliverPackingListLogic constructor. + * @param CreatePackingListProcessor $createPackingListProcessor + * @param FetchesCompanyModule $fetchesCompanyModule + */ + public function __construct(CreatePackingListProcessor $createPackingListProcessor, FetchesCompanyModule $fetchesCompanyModule, GeneratesPackingListReferenceNumber $generatesPackingListReferenceNumber, FetchesPackingList $fetchesPackingList) + { + $this->createPackingListProcessor = $createPackingListProcessor; + $this->fetchesCompanyModule = $fetchesCompanyModule; + $this->generatesPackingListReferenceNumber = $generatesPackingListReferenceNumber; + $this->fetchesPackingList = $fetchesPackingList; + } + + /** + * @param Request $request + * @return JsonResponse + */ + public function logic(Request $request) : JsonResponse + { + $company_module = $this->fetchesCompanyModule->execute(['id' => $request->input('company_module_id')]); + $packing_list_id = $request->input('packing_list_id'); + + $reference_number = $this->generatesPackingListReferenceNumber->execute(); + + $packingListObject = new PackingListObject( + $reference_number, + null, + PackingListType::DELIVERY_PACKING_LIST, + ApprovalStatus::PENDING_SUBMISSION + ); + + $deliverPackingList = $this->createPackingListProcessor->execute($packingListObject, $company_module); + + foreach ($packing_list_id as $key => $row) { + $this->fetchesPackingList->execute(['id' => $row]); + } + + $deliverPackingList->packing_list_owner()->sync($packing_list_id); + + return $this->resourceResponse(new DeliverPackingListResource($deliverPackingList)); + } + +} diff --git a/app/Classes/Modules/PackingLists/DataTransferObjects/PackingListObject.php b/app/Classes/Modules/PackingLists/DataTransferObjects/PackingListObject.php index c6e1cbd0..92259878 100644 --- a/app/Classes/Modules/PackingLists/DataTransferObjects/PackingListObject.php +++ b/app/Classes/Modules/PackingLists/DataTransferObjects/PackingListObject.php @@ -30,7 +30,7 @@ class PackingListObject implements DataTransferObject * @param int $status * @param null|string $contractReference */ - public function __construct(string $reference, int $claimantId, int $type, int $status, ?string $contractReference = null) + public function __construct(string $reference, ?int $claimantId, int $type, int $status, ?string $contractReference = null) { $this->reference = $reference; $this->claimantId = $claimantId; @@ -50,7 +50,7 @@ class PackingListObject implements DataTransferObject /** * @return int */ - public function getClaimantId(): int + public function getClaimantId(): ?int { return $this->claimantId; } diff --git a/app/Http/Controllers/PackingLists/CreateDeliverPackingListController.php b/app/Http/Controllers/PackingLists/CreateDeliverPackingListController.php new file mode 100644 index 00000000..0b3751e1 --- /dev/null +++ b/app/Http/Controllers/PackingLists/CreateDeliverPackingListController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Resources/DeliverPackingListResource.php b/app/Http/Resources/DeliverPackingListResource.php new file mode 100644 index 00000000..7dd7e658 --- /dev/null +++ b/app/Http/Resources/DeliverPackingListResource.php @@ -0,0 +1,27 @@ + $this->id, + 'claimant_id' => $this->claimant_id, + 'reference' => $this->reference, + 'status' => $this->status, + 'transport' => new TransportResource($this->transports()->first()), + 'packing_list' => PackingListResource::collection($this->packing_list_owner), + 'company' => New CompanyModuleResource($this->owner) + ]; + } +} diff --git a/app/Models/CompanyModule.php b/app/Models/CompanyModule.php index eecc0118..b0058389 100644 --- a/app/Models/CompanyModule.php +++ b/app/Models/CompanyModule.php @@ -6,6 +6,8 @@ use App\Classes\General\Interfaces\Addressable; use App\Classes\General\Interfaces\Contactable; use App\Classes\General\Interfaces\ContainerOwner; use App\Classes\General\Interfaces\Documentable; +use App\Classes\General\Interfaces\Packable; + use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\BusinessType; use Illuminate\Database\Eloquent\Builder; @@ -28,7 +30,7 @@ use PhpParser\Node\Expr\AssignOp\Mod; * @property integer type * @property integer status */ -class CompanyModule extends AbstractModel implements Addressable, Documentable, Contactable, ContainerOwner +class CompanyModule extends AbstractModel implements Addressable, Documentable, Contactable, ContainerOwner, Packable { use SoftDeletes; @@ -60,6 +62,14 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, return $this->morphMany(Address::class, 'owner'); } + /** + * @return MorphMany + */ + public function packingLists(): morphMany + { + return $this->morphMany(PackingList::class, 'owner'); + } + /** * @return belongsToMany */ diff --git a/app/Models/PackingList.php b/app/Models/PackingList.php index 1bbfa6ac..550d5f6f 100644 --- a/app/Models/PackingList.php +++ b/app/Models/PackingList.php @@ -56,4 +56,11 @@ class PackingList extends AbstractModel implements Transportable, Steppable return $this->morphMany(Transport::class, 'owner'); } + /** + * @return belongsToMany + */ + public function packing_list_owner() + { + return $this->BelongsToMany(PackingList::class, 'packing_list_owner', 'owner_packing_list_id', 'packing_list_id'); + } } diff --git a/app/Models/PackingListOwner.php b/app/Models/PackingListOwner.php new file mode 100644 index 00000000..2e64c5f0 --- /dev/null +++ b/app/Models/PackingListOwner.php @@ -0,0 +1,11 @@ +foreignId('owner_packing_list_id'); + $table->foreignId('packing_list_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('packing_list_owners'); + } +} diff --git a/routes/packing_list.php b/routes/packing_list.php index cf5062cf..7ee3a3ca 100644 --- a/routes/packing_list.php +++ b/routes/packing_list.php @@ -6,6 +6,8 @@ Route::group(['namespace' => 'PackingLists', 'as' => 'packing_list.', 'prefix' = Route::get('/{id}/show', 'FetchPackingListController@fetch')->name('show'); Route::get('/list', 'ListPackingListsController@list')->name('list'); Route::post('/create', 'CreatePackingListController@create')->name('create'); + Route::post('/create/deliver', 'CreateDeliverPackingListController@create')->name('create.deliver'); + Route::put('/update/{id}', 'UpdatePackingListController@update')->name('update'); Route::put('/status/{id}/update/{status}', 'UpdatePackingListStatusController@update')->name('status.update'); Route::delete('/delete/{id}', 'DeletePackingListController@delete')->name('delete');