new: add classes required to create company along with new user registration. #1

This commit is contained in:
weichien00
2021-06-25 03:44:29 +08:00
parent 718a7bbf43
commit 55a2527506
7 changed files with 297 additions and 0 deletions
@@ -0,0 +1,86 @@
<?php
namespace App\Classes\Modules\Companies\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\BusinessType;
class CompanyObject implements DataTransferObject
{
/** @var string */
private $name;
/** @var string */
private $reference;
/** @var int|null */
private $businessType;
/** @var int|null */
private $type;
/** @var int|null */
private $status;
/**
* CompanyObject constructor.
* @param string $name
* @param string $reference
* @param int|null $businessType
* @param int|null $type
* @param int|null $status
*/
public function __construct(string $name, string $reference, ?int $businessType = BusinessType::IMPORTER, ?int $type = BusinessType::IMPORTER, ?int $status = ApprovalStatus::PENDING_SUBMISSION)
{
$this->name = $name;
$this->reference = $reference;
$this->businessType = $businessType;
$this->type = $type;
$this->status = $status;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getReference(): string
{
return $this->reference;
}
/**
* @return int
*/
public function getBusinessType(): int
{
return $this->businessType;
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return int
*/
public function getStatus(): int
{
return $this->status;
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Companies\Processors;
use App\Classes\General\Services\GeneratesInitials;
use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject;
use App\Classes\Modules\Companies\Services\CreatesCompany;
use App\Classes\Modules\Companies\Standards\Rules\CanCreateCompany;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\BusinessType;
use App\Classes\ValueObjects\Constants\CompanyType;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Model;
class CreateCompanyProcessor
{
/** @var CanCreateCompany */
private $canCreateCompany;
/** @var CreatesCompany */
private $createsCompany;
/**
* CreateUserProcessor constructor.
* @param CanCreateCompany $canCreateCompany
* @param CreatesCompany $createsCompany
*/
public function __construct(CanCreateCompany $canCreateCompany, CreatesCompany $createsCompany)
{
$this->canCreateCompany = $canCreateCompany;
$this->createsCompany = $createsCompany;
}
/**
* @param Request $request
* @param int $businessType
* @param int|null $companyType
* @param int|null $status
* @return Model
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function execute(Request $request, int $businessType = BusinessType::IMPORTER, ?int $companyType = CompanyType::COMPANY_BUSINESS, ?int $status = ApprovalStatus::PENDING_SUBMISSION): Model {
$companyName = $companyType === CompanyType::COMPANY_BUSINESS ? $request->input('company_name') : $request->input('name');
$company_object = new CompanyObject(
$companyName,
mt_rand(1000, 9999).(new GeneratesInitials())->name($companyName)->length(3)->generate(),
$businessType, $companyType, $status);
$this->canCreateCompany->passes($company_object);
return $this->createsCompany->execute($company_object);
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Classes\Modules\Companies\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject;
use App\Models\Company;
class CreatesCompany extends AbstractUpdateRecord
{
/**
* @param CompanyObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CompanyObject $object)
{
$model = new Company();
$model->name = $object->getName();
$model->reference = $object->getReference();
$model->type = $object->getType();
$model->business_type = $object->getBusinessType();
return $this->handler($model);
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Companies\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject;
use App\Classes\Modules\Companies\Standards\Validators\CompanyValidation;
class CanCreateCompany extends AbstractRule
{
/** @var CompanyValidation */
private $companyValidation;
/**
* CanCreateCompany constructor.
* @param CompanyValidation $companyValidation
*/
public function __construct(CompanyValidation $companyValidation)
{
$this->companyValidation = $companyValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param CompanyObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->companyValidation->validate($object);
}
/**
* @param CompanyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Classes\Modules\Companies\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject;
class CompanyValidation extends AbstractValidation
{
/**
* @param CompanyObject $object
* @return array
*/
protected function data($object): array
{
return [
'company_name' => $object->getName(),
'company_reference' => $object->getReference(),
'type' => $object->getBusinessType()
];
}
/**
* @param string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array
{
if ($type == 'POST') {
return [
'company_name' => 'required',
'company_reference' => '',
'type' => ''
];
} elseif ($type == 'PUT') {
return [
'type' => 'required'
];
}
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,13 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class BusinessType {
public const FREIGHT_FORWARDER = 1;
public const IMPORTER = 2;
public const CURRENCY_VENDOR = 3;
}
@@ -0,0 +1,11 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class CompanyType {
public const PERSONAL_BUSINESS = 0;
public const COMPANY_BUSINESS = 1;
}