Merge branch 'development' of https://gitlab.com/CIEFWorldwideSdnBhd/shipping-portal into development

# Conflicts:
#	app/Classes/Modules/Orders/Services/FetchesDataFromYDPortal.php
#	app/Classes/Modules/PackingLists/Processors/FetchOrderListsFromYdPortalProcessor.php
#	app/Console/Commands/CurlYdOrderListCommand.php
This commit is contained in:
glovetleong
2021-12-28 15:31:01 +08:00
75 changed files with 2004 additions and 104 deletions
+2
View File
@@ -53,3 +53,5 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
UNITY_APP_URL="https://unity.izyim.com"
EXCHANGE_URL=https://dev.exchange.cief-malaysia.com/
MIX_EXCHANGE_URL="${EXCHANGE_URL}"
YD_API_CODE=''
+38
View File
@@ -0,0 +1,38 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Modules\PackingLists\Processors\FetchOrderListsFromYdPortalProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class CurlYdOrderListJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Execute the job.
*
* @return void
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function handle()
{
(App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute();
}
}
@@ -27,7 +27,6 @@ class LogoutUserLogic extends AbstractControllerLogic
*/
public function __construct(InvalidatesAuthenticationToken $invalidatesAuthenticationToken)
{
logger("logout user logic");
$this->invalidatesAuthenticationToken = $invalidatesAuthenticationToken;
}
@@ -89,15 +89,13 @@ class CreateAddressLogic extends AbstractControllerLogic
/** @var Address $address */
$address = $this->createsAddress->execute($this->fetchesCompanyModule->execute(['id' => $request->input('company_module_id')]), $object);
$contactObject = new ContactObject($request->input('pic'), $request->input('phone'), '', '');
if($contactObject->getPhone()){
if($request->input('phone')){
$contactObject = new ContactObject($request->input('person_in_charge'), $request->input('phone'), '', '');
$this->createContactProcessor->execute($contactObject, $address);
}
$remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id);
if($remarkObject->getContent()){
if($request->input('remark')){
$remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id);
$this->createRemarkProcessor->execute($address, $remarkObject);
}
@@ -90,15 +90,13 @@ class UpdateAddressLogic extends AbstractControllerLogic
$address->contacts()->delete(); $address->remarks()->delete();
$contactObject = new ContactObject($request->input('pic'), $request->input('phone'), '', '');
if($contactObject->getPhone()){
if($request->input('phone')){
$contactObject = new ContactObject($request->input('person_in_charge'), $request->input('phone'), '', '');
$this->createContactProcessor->execute($contactObject, $address);
}
$remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id);
if($remarkObject->getContent()){
if($request->input('remark')){
$remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id);
$this->createRemarkProcessor->execute($address, $remarkObject);
}
@@ -0,0 +1,61 @@
<?php
namespace App\Classes\Modules\Announcements\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Announcements\Services\FetchesAnnouncement;
use App\Classes\Modules\Announcements\Processors\AssignAnnouncementToSegmentProcessor;
use App\Http\Resources\AnnouncementResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AssignAnnouncementToSegmentLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Assign Announcement To Segment',
'message' => 'You have successfully assigned Announcement to segment'
];
}
/** @var FetchesAnnouncement */
private $fetchesAnnouncement;
/** @var AssignAnnouncementToSegmentProcessor */
private $assignAnnouncementToSegmentProcessor;
/**
* AssignAnnouncementToSegmentLogic constructor.
* @param FetchesAnnouncement $fetchesAnnouncement
* @param AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor
*/
public function __construct(FetchesAnnouncement $fetchesAnnouncement, AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor)
{
$this->fetchesAnnouncement = $fetchesAnnouncement;
$this->assignAnnouncementToSegmentProcessor = $assignAnnouncementToSegmentProcessor;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse
{
$announcement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]);
$this->assignAnnouncementToSegmentProcessor->execute($announcement, $request->input('segment_id'));
return $this->resourceResponse(new AnnouncementResource($announcement));
}
}
@@ -0,0 +1,82 @@
<?php
namespace App\Classes\Modules\Announcements\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
use App\Classes\Modules\Announcements\Standards\Rules\CanCreateAnnouncement;
use App\Classes\Modules\Announcements\Services\CreatesAnnouncement;
use App\Classes\Modules\Announcements\Processors\AssignAnnouncementToSegmentProcessor;
use App\Http\Resources\AnnouncementResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateAnnouncementLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Created Annoucement',
'message' => 'You have successfully created a new Annoucements'
];
}
/** @var CanCreateAnnouncement */
private $canCreateAnnouncement;
/** @var CreatesAnnoucement */
private $createsAnnoucement;
/** @var AssignAnnouncementToSegmentProcessor */
private $assignAnnouncementToSegmentProcessor;
/**
* CreateAnnouncementLogic constructor.
* @param CanCreateAnnoucement $canCreateAnnoucement
* @param CreatesAnnoucement $createsAnnoucement
* @param AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor
*/
public function __construct(
CanCreateAnnouncement $canCreateAnnouncement,
CreatesAnnouncement $createsAnnoucement,
AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor
) {
$this->canCreateAnnouncement = $canCreateAnnouncement;
$this->createsAnnoucement = $createsAnnoucement;
$this->assignAnnouncementToSegmentProcessor = $assignAnnouncementToSegmentProcessor;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse
{
$annoucement_object = new AnnouncementObject(
$request->input('title'),
$request->input('description'),
$request->input('starting_on'),
$request->input('ending_on')
);
$this->canCreateAnnouncement->passes($annoucement_object);
$announcement = $this->createsAnnoucement->execute($annoucement_object);
$this->assignAnnouncementToSegmentProcessor->execute($announcement);
return $this->resourceResponse(new AnnouncementResource($announcement));
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Classes\Modules\Announcements\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Announcements\Standards\Rules\CanDeleteAnnouncement;
use App\Classes\Modules\Announcements\Services\FetchesAnnouncement;
use App\Classes\Modules\Announcements\Services\DeletesAnnouncement;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DeleteAnnouncementLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Delete Announcement',
'message' => 'You have successfully deleted the Announcement'
];
}
/** @var CanDeleteAnnouncement */
private $canDeleteAnnouncement;
/** @var FetchesAnnouncement */
private $fetchesAnnouncement;
/** @var DeletesAnnouncement */
private $deletesAnnouncement;
/**
* DeleteAnnouncementLogic constructor.
* @param CanDeleteAnnouncement $canDeleteAnnouncement
* @param FetchesAnnouncement $fetchesAnnouncement
* @param DeletesAnnouncement $deletesAnnouncement
*/
public function __construct(
CanDeleteAnnouncement $canDeleteAnnoucement,
FetchesAnnouncement $fetchesAnnoucement,
DeletesAnnouncement $deletesAnnoucement
) {
$this->canDeleteAnnoucement = $canDeleteAnnoucement;
$this->fetchesAnnoucement = $fetchesAnnoucement;
$this->deletesAnnoucement = $deletesAnnoucement;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse
{
$this->canDeleteAnnoucement->passes();
$annoucement = $this->fetchesAnnoucement->execute(['id' => $request->route('id')]);
$this->deletesAnnoucement->execute($annoucement);
return $this->response([]);
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Announcements\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Announcements\Services\ListsAnnouncements;
use App\Classes\Modules\Announcements\Standards\Rules\CanListAnnouncements;
use App\Http\Resources\AnnouncementResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListAnnouncementsLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Retrieve Announcements',
'message' => 'You have successfully retrieved a list of Announcements'
];
}
/** @var CanListAnnouncements */
private $canListAnnouncements;
/** @var ListsAnnouncements */
private $listsAnnouncements;
/**
* ListAnnouncementsLogic constructor.
* @param CanListAnnouncements $canListAnnouncements
* @param ListsAnnouncements $listsAnnouncements
*/
public function __construct(CanListAnnouncements $canListAnnouncements, ListsAnnouncements $listsAnnouncements)
{
$this->canListAnnouncements = $canListAnnouncements;
$this->listsAnnouncements = $listsAnnouncements;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse
{
$this->canListAnnouncements->passes();
$annoucements = $this->listsAnnouncements->execute($this->listsAnnouncements->deserializeFilters($request->input('filters')));
return $this->collectionResponse(AnnouncementResource::collection($annoucements));
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Classes\Modules\Announcements\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Announcements\Services\FetchesAnnouncement;
use App\Classes\Modules\Segments\Services\FetchesSegment;
use App\Classes\Modules\Announcements\Services\RemovesAnnouncementFromSegment;
use App\Http\Resources\AnnouncementResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RemoveSegmentFromAnnouncementLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Detach Announcement From Segment',
'message' => 'You have successfully detached Announcement from segment'
];
}
/** @var FetchesAnnouncement */
private $fetchesAnnnouncement;
/** @var FetchesSegment */
private $fetchesSegment;
/** @var RemovesAnnouncementFromSegment */
private $removesAnnouncementFromSegment;
/**
* RemoveSegmentFromAnnouncementLogic constructor.
* @param FetchesAnnouncement $fetchesAnnnouncement
* @param FetchesSegment $fetchesSegment
* @param RemovesAnnouncementFromSegment $removesAnnouncementFromSegment
*/
public function __construct(FetchesAnnouncement $fetchesAnnnouncement, FetchesSegment $fetchesSegment, RemovesAnnouncementFromSegment $removesAnnouncementFromSegment)
{
$this->fetchesAnnnouncement = $fetchesAnnnouncement;
$this->fetchesSegment = $fetchesSegment;
$this->removesAnnouncementFromSegment = $removesAnnouncementFromSegment;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function logic(Request $request): JsonResponse
{
$announcement = $this->fetchesAnnnouncement->execute(['id' => $request->route('id')]);
$segment = $this->fetchesSegment->execute(['id' => $request->route('segment_id')]);
$this->removesAnnouncementFromSegment->execute($announcement, $segment);
return $this->resourceResponse(new AnnouncementResource($announcement));
}
}
@@ -0,0 +1,83 @@
<?php
namespace App\Classes\Modules\Announcements\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
use App\Classes\Modules\Announcements\Standards\Rules\CanUpdateAnnouncement;
use App\Classes\Modules\Announcements\Services\FetchesAnnouncement;
use App\Classes\Modules\Announcements\Services\UpdatesAnnouncement;
use App\Http\Resources\AnnouncementResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateAnnouncementLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Update Announcement',
'message' => 'You have successfully updated the Announcement'
];
}
/** @var CanUpdateAnnouncement */
private $canUpdateAnnouncement;
/** @var FetchesAnnouncement */
private $fetchesAnnouncement;
/** @var UpdatesAnnouncement */
private $updatesAnnouncement;
/**
* UpdateAnnouncementLogic constructor.
* @param CanUpdateAnnouncement $canUpdateAnnouncement
* @param FetchesAnnouncement $fetchesAnnouncement
* @param UpdatesAnnouncement $updatesAnnouncement
*/
public function __construct(
CanUpdateAnnouncement $canUpdateAnnouncement,
FetchesAnnouncement $fetchesAnnouncement,
UpdatesAnnouncement $updatesAnnouncement
) {
$this->canUpdateAnnouncement = $canUpdateAnnouncement;
$this->fetchesAnnouncement = $fetchesAnnouncement;
$this->updatesAnnouncement = $updatesAnnouncement;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse
{
$annoucement_object = new AnnouncementObject(
$request->input('title'),
$request->input('description'),
$request->input('starting_on'),
$request->input('ending_on')
);
$this->canUpdateAnnouncement->passes($annoucement_object);
$annoucement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]);
$announcement_query = $this->updatesAnnouncement->execute($annoucement, $annoucement_object);
//$announcement_query->segments()->sync($request->input('segment_id'));
return $this->resourceResponse(new AnnouncementResource($announcement_query));
}
}
@@ -0,0 +1,73 @@
<?php
namespace App\Classes\Modules\Announcements\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use Carbon\Carbon;
class AnnouncementObject implements DataTransferObject
{
/** @var string */
private $title;
/** @var string */
private $description;
/** @var string */
private $starting_on;
/** @var string */
private $ending_on;
/**
* AnnouncementObject constructor.
* @param string $title
* @param string $description
* @param string $start_date
* @param string $end_date
*/
public function __construct(string $title, string $description, string $starting_on, string $ending_on)
{
$this->title = $title;
$this->description = $description;
$this->starting_on = $starting_on;
$this->ending_on = $ending_on;
}
/**
* @return string
*/
public function getTitle(): string
{
return $this->title;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @return Carbon
*/
public function getStartingOn(): Carbon
{
// return $this->starting_on;
return Carbon::parse($this->starting_on);
}
/**
* @return Carbon
*/
public function getEndingOn(): Carbon
{
// return $this->ending_on;
return Carbon::parse($this->ending_on);
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Classes\Modules\Announcements\Processors;
use App\Classes\Modules\Announcements\Services\AssignsAnnouncementToSegment;
use App\Classes\Modules\Announcements\Standards\Rules\CanAssignSegment;
use App\Classes\Modules\Segments\Services\FetchesSegment;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use App\Models\Announcement;
use Illuminate\Database\Eloquent\Model;
class AssignAnnouncementToSegmentProcessor
{
/** @var CanAssignSegment */
private $canAssignSegment;
/** @var FetchesSegment */
private $fetchesSegment;
/** @var AssignAnnouncementToSegment */
private $assignsAnnouncementToSegment;
/**
* AssignAnnouncementToSegmentProcessor constructor.
* @param CanAssignSegment $canAssignSegment
* @param AssignAnnouncementToSegment $assignsAnnouncementToSegment
* @param FetchesSegment $fetchesSegment
*/
public function __construct(CanAssignSegment $canAssignSegment, FetchesSegment $fetchesSegment, AssignsAnnouncementToSegment $assignsAnnouncementToSegment)
{
$this->canAssignSegment = $canAssignSegment;
$this->assignsAnnouncementToSegment = $assignsAnnouncementToSegment;
$this->fetchesSegment = $fetchesSegment;
}
/**
* @param Announcement $announcement
* @param int|null $segmentId
* @return Model
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function execute(Announcement $announcement, ?int $segmentId = SegmentConstants::STANDARD_SEGMENT): Model
{
$this->canAssignSegment->passes();
$segment = $this->fetchesSegment->execute(['id' => $segmentId]);
return $this->assignsAnnouncementToSegment->execute($announcement, $segment);
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Announcement;
use App\Models\Segment;
use Illuminate\Database\QueryException;
class AssignsAnnouncementToSegment extends AbstractUpdateRecord
{
/**
* @param Announcement $announcement
* @param Segment $segment
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(Announcement $announcement, Segment $segment)
{
try {
$announcement->segments()->attach($segment);
return $announcement;
} catch (QueryException $exception){
throw new MalformedRequestException($exception);
}
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
use App\Models\Announcement;
class CreatesAnnouncement extends AbstractUpdateRecord
{
/**
* @param AnnouncementObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(AnnouncementObject $object)
{
$model = new Announcement();
$model->title = $object->getTitle();
$model->description = $object->getDescription();
$model->starting_on = $object->getStartingOn();
$model->ending_on = $object->getEndingOn();
return $this->handler($model);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\General\Eloquent\AbstractDeleteRecord;
use App\Models\Announcement;
class DeletesAnnouncement extends AbstractDeleteRecord
{
/**
* @param Announcement $model
* @return mixed
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Announcement $model) {
return $this->handler($model);
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\Announcement;
class FetchesAnnouncement extends AbstractFetchRecord
{
/** @var Announcement */
private $repository;
/**
* FetchesAnnouncement constructor.
* @param Announcement $repository
*/
public function __construct(Announcement $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\General\Eloquent\AbstractListRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\Announcement;
class ListsAnnouncements extends AbstractListRecord
{
/** @var Announcement */
private $repository;
/**
* ListsAnnouncement constructor.
* @param Announcement $repository
*/
public function __construct(Announcement $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Announcement;
use App\Models\Segment;
use Illuminate\Database\QueryException;
class RemovesAnnouncementFromSegment extends AbstractUpdateRecord
{
/**
* @param Announcement $announcement
* @param Segment $segment
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(Announcement $announcement, Segment $segment)
{
try {
$announcement->segments()->detach($segment);
return $announcement;
} catch (QueryException $exception){
throw new MalformedRequestException($exception);
}
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Classes\Modules\Announcements\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
use App\Models\Announcement;
class UpdatesAnnouncement extends AbstractUpdateRecord
{
/**
* @param Announcement $model
* @param AnnouncementObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Announcement $model, AnnouncementObject $object)
{
$model->title = $object->getTitle();
$model->description = $object->getDescription();
$model->starting_on = $object->getStartingOn();
$model->ending_on = $object->getEndingOn();
return $this->handler($model);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Announcements\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\SegmentConstants\DataTransferObjects\SegmentConstantObject;
use App\Classes\Modules\Segments\DataTransferObjects\ConstantObject;
class CanAssignSegment extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param ConstantObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param ConstantObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\Announcements\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Announcements\Standards\Validators\AnnouncementValidation;
use App\Classes\Modules\Companies\DataTransferObjects\AnnouncementObject;
class CanCreateAnnouncement extends AbstractRule
{
/** @var AnnouncementValidation */
private $AnnouncementValidation;
/**
* CanCreateAnnouncement constructor.
* @param AnnouncementValidation $AnnouncementValidation
*/
public function __construct(AnnouncementValidation $AnnouncementValidation)
{
$this->AnnouncementValidation = $AnnouncementValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
return true;
}
/**
* @param AnnouncementObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->AnnouncementValidation->validate($object);
}
/**
* @param AnnouncementObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Announcements\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Announcement\DataTransferObjects\AnnouncementObject;
class CanDeleteAnnouncement extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param AnnouncementObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param AnnouncementObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Classes\Modules\Announcements\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
class CanListAnnouncements extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
return true;
}
/**
* @param AnnouncementObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param AnnouncementObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,54 @@
<?php
namespace App\Classes\Modules\Announcements\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
use App\Classes\Modules\Announcements\Standards\Validators\AnnouncementValidation;
class CanUpdateAnnouncement extends AbstractRule
{
/** @var AnnouncementValidation */
private $AnnouncementValidation;
/**
* CanUpdateAnnouncement constructor.
* @param AnnouncementValidation $AnnouncementValidation
*/
public function __construct(AnnouncementValidation $AnnouncementValidation)
{
$this->AnnouncementValidation = $AnnouncementValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param AnnouncementObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->AnnouncementValidation->validate($object);
}
/**
* @param AnnouncementObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Announcements\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Announcements\DataTransferObjects\AnnouncementObject;
class AnnouncementValidation extends AbstractValidation
{
/**
* @param AnnouncementObject $object
* @return array
*/
protected function data($object): array
{
return [
'title' => $object->getTitle(),
'description' => $object->getDescription(),
'starting_on' => $object->getStartingOn(),
'ending_on' => $object->getEndingOn()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'title' => 'required',
'description' => 'required',
'starting_on' => 'required',
'ending_on' => 'required'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -58,12 +58,13 @@ class CreateOrderLogic extends AbstractControllerLogic
public function logic(Request $request) : JsonResponse {
$company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]);
$address = $this->fetchesAddress->execute(['id' => $request->input('address_id')]);
$originWarehouse = $this->fetchesCompanyModule->execute(['id' => $request->input('warehouse_id')]);
if($originWarehouse->reference === WarehouseReferences::VT_GUANG_ZHOU){
$marking = $company->companyModules()->importers()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference;
if(in_array($marking, ['2192KAA', '2353GFE', '6866DTR', '1905JYW', '1291NSC', '8288MIB'])){
@@ -19,6 +19,7 @@ use App\Classes\ValueObjects\Constants\PackingListType;
use App\Classes\ValueObjects\Constants\TransportType;
use App\Http\Resources\PackingListResource;
use App\Models\PackingList;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Carbon\Carbon;
@@ -80,6 +81,9 @@ class CreateShippingPackingListLogic extends AbstractControllerLogic
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
@@ -93,6 +97,8 @@ class CreateShippingPackingListLogic extends AbstractControllerLogic
PackingListType::SHIPPING_PACKING_LIST,
ApprovalStatus::PENDING_SUBMISSION
);
/** @var PackingList $packingList */
$packingList = $this->createPackingListProcessor->execute($packingListObject, $order);
$packages = $request->input('packages');
@@ -6,6 +6,7 @@ use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Orders\Standards\Rules\CanApproveChangeOrderAddress;
use App\Classes\Modules\Orders\Services\UpdatesOrdersAddress;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\Modules\Orders\Processors\UpdateDoFromVTPortalProcessor;
use Illuminate\Http\Request;
@@ -26,11 +27,12 @@ class ApproveChangeOrderAddressProcessor
* @param FetchesAddress $fetchesAddress
* @param UpdatesOrdersAddress $updatesOrdersAddress
*/
public function __construct(CanApproveChangeOrderAddress $canApproveChangeOrderAddress, FetchesAddress $fetchesAddress, UpdatesOrdersAddress $updatesOrdersAddress)
public function __construct(CanApproveChangeOrderAddress $canApproveChangeOrderAddress, FetchesAddress $fetchesAddress, UpdatesOrdersAddress $updatesOrdersAddress, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor)
{
$this->canApproveChangeOrderAddress = $canApproveChangeOrderAddress;
$this->fetchesAddress = $fetchesAddress;
$this->updatesOrdersAddress = $updatesOrdersAddress;
$this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor;
}
@@ -38,12 +40,13 @@ class ApproveChangeOrderAddressProcessor
* @param Request $request
* @return mixed
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\InternalServerErrorException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function execute(Request $request)
{
$status = (int) $request->route('status');
$this->canApproveChangeOrderAddress->passes();
@@ -52,9 +55,10 @@ class ApproveChangeOrderAddressProcessor
if($status === ApprovalStatus::APPROVED){
$address->owner->addresses()->update(['status' => ApprovalStatus::EXPIRED]);
$this->updateDoFromVTPortalProcessor->execute($address);
}
$this->updatesOrdersAddress->execute($address, $status);
$address = $this->updatesOrdersAddress->execute($address, $status);
return $address;
}
@@ -8,6 +8,11 @@ use App\Classes\Modules\Addresses\Services\CreatesAddress;
use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject;
use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject;
use App\Classes\Modules\Contacts\Processors\CreateContactProcessor;
use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor;
use App\Classes\Modules\Orders\Services\CreatesOrder;
use App\Classes\Modules\Orders\Services\GeneratesOrderNumber;
use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder;
@@ -33,6 +38,12 @@ class CreateOrderProcessor
/** @var CreateOrderRolesProcessor */
private $createOrderRolesProcessor;
/** @var CreateContactProcessor */
private $createContactProcessor;
/** @var CreateRemarkProcessor */
private $createRemarkProcessor;
/**
* CreateOrderProcessor constructor.
* @param CanCreateOrder $canCreateOrder
@@ -40,12 +51,14 @@ class CreateOrderProcessor
* @param CreatesAddress $createAddress
* @param CreateOrderRolesProcessor $createOrderRolesProcessor
*/
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreatesAddress $createAddress, CreateOrderRolesProcessor $createOrderRolesProcessor)
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreatesAddress $createAddress, CreateOrderRolesProcessor $createOrderRolesProcessor, CreateContactProcessor $createContactProcessor, CreateRemarkProcessor $createRemarkProcessor)
{
$this->canCreateOrder = $canCreateOrder;
$this->createsOrder = $createsOrder;
$this->createAddress = $createAddress;
$this->createOrderRolesProcessor = $createOrderRolesProcessor;
$this->createContactProcessor = $createContactProcessor;
$this->createRemarkProcessor = $createRemarkProcessor;
}
@@ -73,7 +86,30 @@ class CreateOrderProcessor
$addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode,$address->reference);
$this->createAddress->execute($order, $addressObject);
$order_address = $this->createAddress->execute($order, $addressObject);
$contact = $address->contacts()->first();
$contactObject = new ContactObject(
$contact->reference,
$contact->phone,
'',
''
);
if($contactObject->getPhone()){
$order_remark = $this->createContactProcessor->execute($contactObject, $order_address);
}
$remark = $address->remarks()->first();
$remarkObject = new RemarkObject(
$remark->content,
Auth()->user()->id
);
if($remarkObject->getContent()){
$this->createRemarkProcessor->execute($order_address, $remarkObject);
}
$this->createOrderRolesProcessor->execute($originWarehouse, $order);
@@ -9,6 +9,10 @@ use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Addresses\Services\DeletesAddress;
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject;
use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject;
use App\Classes\Modules\Contacts\Processors\CreateContactProcessor;
use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor;
use Illuminate\Http\Request;
@@ -29,6 +33,12 @@ class RequestChangeOrderAddressProcessor
/** @var DeletesAddress */
private $deletesAddress;
/** @var CreateContactProcessor */
private $createContactProcessor;
/** @var CreateRemarkProcessor */
private $createRemarkProcessor;
/**
* ChangeOrderAddressProcessor constructor.
* @param FetchesOrder $fetchesOrder
@@ -36,7 +46,7 @@ class RequestChangeOrderAddressProcessor
* @param FetchesAddress $fetchesAddress
* @param DeletesAddress $deletesAddress
*/
public function __construct(CanChangeOrderAddress $canChangeOrderAddress, FetchesOrder $fetchesOrder, CreatesAddress $createsAddress, FetchesAddress $fetchesAddress, DeletesAddress $deletesAddress)
public function __construct(CanChangeOrderAddress $canChangeOrderAddress, FetchesOrder $fetchesOrder, CreatesAddress $createsAddress, FetchesAddress $fetchesAddress, DeletesAddress $deletesAddress, CreateContactProcessor $createContactProcessor, CreateRemarkProcessor $createRemarkProcessor)
{
$this->canChangeOrderAddress = $canChangeOrderAddress;
@@ -44,12 +54,20 @@ class RequestChangeOrderAddressProcessor
$this->createsAddress = $createsAddress;
$this->fetchesAddress = $fetchesAddress;
$this->deletesAddress = $deletesAddress;
$this->createContactProcessor = $createContactProcessor;
$this->createRemarkProcessor = $createRemarkProcessor;
}
/**
* @param Request $request
* @return mixed
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function execute(Request $request)
{
$this->canChangeOrderAddress->passes();
$order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]);
@@ -59,7 +77,32 @@ class RequestChangeOrderAddressProcessor
$address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]);
$addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->reference, ApprovalStatus::PENDING_VERIFICATION);
$this->createsAddress->execute($order, $addressObject);
$order_address = $this->createsAddress->execute($order, $addressObject);
$contact = $address->contacts()->first();
if($contact){
$contactObject = new ContactObject(
$contact->reference,
$contact->phone,
'',
''
);
$this->createContactProcessor->execute($contactObject, $order_address);
}
$remark = $address->remarks()->first();
if($remark){
$remarkObject = new RemarkObject(
$remark->content,
Auth()->user()->id
);
$this->createRemarkProcessor->execute($order_address, $remarkObject);
}
return $order;
}
@@ -0,0 +1,145 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\Services\FetchesDataFromVTPortal;
use App\Classes\Modules\Addresses\Services\FetchesAddress;
use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject;
use App\Classes\Modules\Schedules\Services\CreatesSchedule;
use App\Classes\Modules\Transports\DataTransferObjects\TransportObject;
use App\Classes\Modules\Transports\Services\CreatesTransport;
use App\Classes\Modules\Unity\Services\UpdatesContractObligation;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\OrderRoleTypes;
use App\Classes\ValueObjects\Constants\PackingListType;
use App\Classes\ValueObjects\Constants\TransportType;
use App\Models\PackingList;
use App\Models\Transport;
use Carbon\Carbon;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
class UpdateDoFromVTPortalProcessor
{
/** @var FetchesDataFromVTPortal */
private $fetchesDataFRomVTPortal;
/** @var FetchesAddress */
private $fetchesAddress;
/**
* FetchDeliveryListFromVTPortalProcessor constructor.
* @param FetchesDataFromVTPortal $fetchesDataFRomVTPortal
* @param FetchesAddress $fetchesAddress
*/
public function __construct(FetchesDataFromVTPortal $fetchesDataFRomVTPortal, FetchesAddress $fetchesAddress)
{
$this->fetchesDataFRomVTPortal = $fetchesDataFRomVTPortal;
$this->fetchesAddress = $fetchesAddress;
}
/**
* @param $address
* @return array
* @throws GuzzleException
* @throws InternalServerErrorException
*/
public function execute($address) {
try {
$order = $address->owner()->orderBy('id', 'desc')->first();
$packing_list = $order->packingLists()->orderBy('id', 'desc')->first();
if ($packing_list) {
$contact = $address->contacts()->first();
$remark = $address->remarks()->first();
$remark = $remark ? $remark->content : 'URGENT!!! PLEASE CALL BEFORE ONE DAY DELIVERY.';
$phone = $contact ? $contact->phone : null;
$reference = $contact ? $contact->reference : null;
$status = 'On Hold';
if (in_array($packing_list->status, [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])) {
$status = 'Release';
}
$vt_do = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"Do","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"Filter": ["FullMarking:$contains$%js%\"' . $order->reference . '\"\u0000"]}}'), '');
$vt_do = $this->fetchesDataFRomVTPortal->getResponseBody($vt_do);
if ($vt_do) {
foreach ($vt_do->Rows as $key => $row) {
$vt_do_update = $this->fetchesDataFRomVTPortal->clientRequest(
'http://portal.vtnation.com.my/Services/DataControllerService.asmx/Execute',
'POST',
json_decode('{
"controller": "Do",
"view": "editForm1",
"args": {
"CommandName": "Update",
"CommandArgument": "Save",
"Path": "ag2/a4",
"LastCommandName": "Edit",
"Values": [
{
"Name": "ShippingAddress",
"NewValue": "' . $address->street_one . ' ' . $address->street_two . ' '. $address->district->name.' '. $address->post_code.' '.$address->state->name.' '.$address->country->name.'",
"Modified": true,
"ReadOnly": false,
"Error": null
},
{
"Name": "Attn",
"NewValue": "'.$reference.'",
"Modified": true,
"ReadOnly": false,
"Error": null
},
{
"Name": "Tel",
"NewValue": "'.$phone.'",
"Modified": true,
"ReadOnly": false,
"Error": null
},
{
"Name": "Status",
"NewValue": "' . $status . '",
"Modified": true,
"ReadOnly": false,
"Error": null
},
{
"Name": "Doremarks",
"NewValue": "'. $remark .'",
"Modified": true,
"ReadOnly": false,
"Error": null
},
{
"Name": "DoID",
"OldValue": '.$row[0].',
"NewValue": '.$row[0].',
"Modified": false,
"ReadOnly": true,
"Error": null
}
],
"Controller": "Do"
}
}'), '');
}
}
}
} catch (\Exception $exception){
throw new InternalServerErrorException('failed to approve address due to an error related to VT portal');
}
}
}
@@ -9,6 +9,7 @@ use App\Classes\Modules\PackingLists\Services\FetchesPackingList;
use App\Classes\Modules\PackingLists\Services\UpdatesPackingListStatus;
use App\Classes\Modules\PackingLists\Standards\Rules\CanUpdatePackingList;
use App\Classes\Modules\PackingLists\DataTransferObjects\PackingListObject;
use App\Classes\Modules\Orders\Processors\UpdateDoFromVTPortalProcessor;
use App\Http\Resources\PackingListResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
@@ -34,29 +35,38 @@ class UpdatePackingListStatusLogic extends AbstractControllerLogic
/** @var UpdatesPackingListStatus */
private $updatesPackingListStatus;
/** @var UpdateDoFromVTPortalProcessor */
private $updateDoFromVTPortalProcessor;
/**
* UpdatePackingListStatusLogic constructor.
* @param FetchesPackingList $fetchesPackingList
* @param UpdatesPackingListStatus $updatesPackingListStatus
*/
public function __construct(FetchesPackingList $fetchesPackingList, UpdatesPackingListStatus $updatesPackingListStatus)
public function __construct(FetchesPackingList $fetchesPackingList, UpdatesPackingListStatus $updatesPackingListStatus, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor)
{
$this->fetchesPackingList = $fetchesPackingList;
$this->updatesPackingListStatus = $updatesPackingListStatus;
$this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\InternalServerErrorException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function logic(Request $request) : JsonResponse
{
$packingList = $this->fetchesPackingList->execute(['id' => $request->route('id')]);
$query = $this->updatesPackingListStatus->execute($packingList, $request->route('status'));
$packing_list = $this->updatesPackingListStatus->execute($packingList, $request->route('status'));
$address = $packing_list->owner()->first()->addresses()->first();
return $this->resourceResponse(new PackingListResource($query));
$this->updateDoFromVTPortalProcessor->execute($address);
return $this->resourceResponse(new PackingListResource($packing_list));
}
}
@@ -80,6 +80,9 @@ class FetchContainersStatusUpdateFromVTPortalProcessor
$containerDetails = $this->fetchesDataFRomVTPortal->getResponseBody($containerDetailsRequest);
if(!$containerDetails->Rows){
continue;
}
$containerDetails = $containerDetails->Rows[0];
if(!$eta = $containerDetails[3]){
@@ -66,6 +66,10 @@ class FetchDeliveryListFromVTPortalProcessor
$shippingPackingLists = $this->fetchesDataFRomVTPortal->getResponseBody($shippingPackingListsRequest);
if(!array_key_exists(0, $shippingPackingLists->Rows)){
continue;
}
$shippingPackingList = $shippingPackingLists->Rows[0];
if(!$shippingPackingList[9] && !$shippingPackingList[10]) {
@@ -87,6 +91,7 @@ class FetchDeliveryListFromVTPortalProcessor
$deliveryStep->update(['status' => ApprovalStatus::COMPLETED]);
} catch (GuzzleException $exception) {
dd($exception);
continue;
}
@@ -21,6 +21,7 @@ use App\Classes\Modules\Unity\Services\CreatesContract;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\ContainerTypes;
use App\Classes\ValueObjects\Constants\OrderRoleTypes;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Classes\ValueObjects\Constants\PackingListType;
use App\Models\Order;
use App\Models\PackingList;
@@ -212,6 +213,10 @@ class FetchLoadedContainersFromVTPortalProcessor
$this->createsStep->execute($packingList, $stepObject);
}
//Duplicate a copy for internal reference
$packingListObject = new PackingListObject($packingListReference.'_01', $order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->id, PackingListType::SHIPPING_PACKING_LIST_REPLICA, ApprovalStatus::PENDING_SUBMISSION);
$this->createPackingListProcessor->execute($packingListObject, $packingList);
}
@@ -63,6 +63,9 @@ class FetchPackingListFromVTPortalProcessor
$packingList->packages()->delete();
$replica = $packingList->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST_REPLICA)->first();
if($replica) $replica->packages()->delete();
foreach($shippingPackingLists->Rows as $shippingPackingList){
if(!$shippingPackingList[22]) {
continue;
@@ -70,6 +73,12 @@ class FetchPackingListFromVTPortalProcessor
$packageObject = new PackageObject(PackageType::CARTON, $shippingPackingList[19], $shippingPackingList[31], $shippingPackingList[30], $shippingPackingList[29], 0, $shippingPackingList[22], ApprovalStatus::APPROVED);
$this->createPackageProcessor->execute($packageObject, $packingList);
if($replica) {
$modificationValue = 1;
$packageObject = new PackageObject(PackageType::CARTON, $shippingPackingList[19], $shippingPackingList[31] + $modificationValue, $shippingPackingList[30] + $modificationValue, $shippingPackingList[29] + $modificationValue, 0, $shippingPackingList[22], ApprovalStatus::APPROVED);
$this->createPackageProcessor->execute($packageObject, $replica);
}
}
DB::commit();
@@ -207,6 +207,9 @@ class FetchWarehouseReceiveListFromVTPortalProcessor
if(!$packingList) {
$packingList = $this->createPackingListProcessor->execute($packingListObject, $order);
$packingListObject = new PackingListObject($packingListReference.'_01', $order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->id, PackingListType::WAREHOUSE_RECEIVE_LIST_REPLICA, ApprovalStatus::APPROVED);
$this->createPackingListProcessor->execute($packingListObject, $packingList);
$transportObject = new TransportObject(TransportType::LAND, null, $tracking, Carbon::parse($receiveDate), Carbon::parse($receiveDate), ApprovalStatus::APPROVED);
@@ -220,15 +223,27 @@ class FetchWarehouseReceiveListFromVTPortalProcessor
$this->createsSchedule->execute($transport, new ScheduleObject(Carbon::parse($receiveDate), Carbon::parse($receiveDate), ApprovalStatus::APPROVED));
/** @var PackingList $replica */
$replica = $packingList->packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST_REPLICA)->first();
$packingList->packages()->delete();
$packageObject = new PackageObject(PackageType::CARTON, $description, $measurement, $measurement, $measurement, 0, $quantity, ApprovalStatus::APPROVED);
$this->createPackageProcessor->execute($packageObject, $packingList);
if($replica){
$replica->packages()->delete();
$modificationValue = 1;
$packageObject = new PackageObject(PackageType::CARTON, $description, $measurement + $modificationValue, $measurement + $modificationValue, $measurement + $modificationValue, 0, $quantity, ApprovalStatus::APPROVED);
$this->createPackageProcessor->execute($packageObject, $replica);
}
}
} catch (\Exception $exception){
dd($exception);
Log::error($exception->getMessage());
}
@@ -23,6 +23,7 @@ class CreatesPackingList extends AbstractUpdateRelationshipRecord
$model->claimant_id = $object->getClaimantId();
$model->type = $object->getType();
$model->status = $object->getStatus();
$model->reference_contract = $object->getContractReference();
return $this->handler($packable->packingLists(), $model);
}
@@ -22,7 +22,7 @@ class UpdatesContractObligation
$accessToken=$this->getAccessToken->execute();
$this->updateContractStatusEndpoint = str_replace('{hash}',$obligation_hash_id,$this->updateContractStatusEndpoint);
$this->updateContractStatusEndpoint = str_replace('{hash}', $obligation_hash_id, $this->updateContractStatusEndpoint);
$response = Http::withToken($accessToken)->put($this->updateContractStatusEndpoint,['entity_signature_id'=>$contract_entity_signature])->object();
@@ -14,5 +14,10 @@ final class PackingListType {
public const DELIVERY_PACKING_LIST = 4;
public const WAREHOUSE_RECEIVE_LIST_REPLICA = 5;
public const SHIPPING_PACKING_LIST_REPLICA = 6;
}
@@ -32,7 +32,7 @@ final class WarehouseReferences {
11 => self::VT_KLANG,
12 => self::VT_KLANG,
13 => self::VT_SABAH,
14 => self::VT_KLANG,
14 => self::VT_SARAWAK,
15 => self::VT_KLANG,
16 => self::VT_KLANG,
];
+7 -2
View File
@@ -28,12 +28,17 @@ class Kernel extends ConsoleKernel
protected function schedule(Schedule $schedule)
{
$schedule->command('command:curlVTCommand')
->dailyAt('15:00')
->dailyAt('11:00')
->withoutOverlapping()
->appendOutputTo (storage_path().'/logs/curlvt.log');
$schedule->command('command:curlVTCommand')
->dailyAt('21:00')
->dailyAt('14:00')
->withoutOverlapping()
->appendOutputTo (storage_path().'/logs/curlvt.log');
$schedule->command('command:curlVTCommand')
->dailyAt('17:00')
->withoutOverlapping()
->appendOutputTo (storage_path().'/logs/curlvt.log');
}
@@ -15,7 +15,6 @@ class UserAuthenticationLogoutController
* @return JsonResponse
*/
public function logout(Request $request, LogoutUserLogic $logic): JsonResponse {
logger("logout controller");
return $logic->execute($request);
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Announcements;
use App\Classes\Modules\Announcements\ControllersLogic\AssignAnnouncementToSegmentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AssignAnnouncementToSegmentController
{
/**
* @param Request $request
* @param AssignCompanyToSegmentLogic $logic
* @return JsonResponse
*/
public function assign(Request $request, AssignAnnouncementToSegmentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Announcements;
use App\Classes\Modules\Announcements\ControllersLogic\CreateAnnouncementLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateAnnouncementController
{
/**
* @param Request $request
* @param CreateAnnouncementLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateAnnouncementLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Announcements;
use App\Classes\Modules\Announcements\ControllersLogic\DeleteAnnouncementLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DeleteAnnouncementController
{
/**
* @param Request $request
* @param DeleteAnnouncementLogic $logic
* @return JsonResponse
*/
public function delete(Request $request, DeleteAnnouncementLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Announcements;
use App\Classes\Modules\Announcements\ControllersLogic\ListAnnouncementsLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListAnnouncementsController
{
/**
* @param Request $request
* @param ListAnnouncementsLogic $logic
* @return JsonResponse
*/
public function list(Request $request, ListAnnouncementsLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Announcements;
use App\Classes\Modules\Announcements\ControllersLogic\RemoveSegmentFromAnnouncementLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RemoveSegmentFromAnnouncementController
{
/**
* @param Request $request
* @param RemoveCompanyFromSegmentLogic $logic
* @return JsonResponse
*/
public function detach(Request $request, RemoveSegmentFromAnnouncementLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Announcements;
use App\Classes\Modules\Announcements\ControllersLogic\UpdateAnnouncementLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateAnnouncementController
{
/**
* @param Request $request
* @param UpdateAnnouncementLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdateAnnouncementLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
@@ -0,0 +1,28 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use Carbon\Carbon;
class AnnouncementResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'description' => $this->description,
'segments' => $this->segments,
'starting_on' => Carbon::parse($this->starting_on)->format('Y-m-d'),
'ending_on' => Carbon::parse($this->ending_on)->format('Y-m-d'),
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'),
];
}
}
+2 -2
View File
@@ -31,7 +31,7 @@ class OrderResource extends JsonResource
'address_change_request' => new AddressResource($this->addressesPendingVerification()->first()),
'parcels' => $this->whenLoaded('packingLists', function() {
return [
'origin_warehouse_packages' => PackageResource::collection(
'origin_warehouse_packages' => PackingListResource::collection(
$this->originWarehousePackages()->get()
),
'in_transit_packages' => PackageResource::collection(
@@ -43,7 +43,7 @@ class OrderResource extends JsonResource
'delivered_packages' => PackageResource::collection(
$this->deliveredPackages()->get()
),
'received_packages' => PackageResource::collection($this->parcels()->warehouseReceiveList()->get()),
'received_packages' => PackingListResource::collection($this->packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->get()),
];
}),
'remarks' => RemarkResource::collection($this->remarks),
+4 -3
View File
@@ -2,6 +2,7 @@
namespace App\Http\Resources;
use App\Models\Order;
use Illuminate\Http\Resources\Json\JsonResource;
class PackageResource extends JsonResource
@@ -26,9 +27,9 @@ class PackageResource extends JsonResource
'quantity' => $this->quantity,
'cbm' => (($this->width / 100) * ($this->height / 100) * ($this->length / 100)) * $this->quantity,
'status' => $this->status,
'order' => new OrderResource($this->packingList->owner),
'container' => new ContainerResource($this->container),
'transport' => new TransportResource($this->transport)
'order' => New OrderResource($this->packingList->owner instanceof Order ? $this->packingList->owner : $this->packingList->owner->owner),
'container' => new ContainerResource($this->packingList->owner instanceof Order ? $this->container : $this->packingList->owner->containers()->first()),
'transport' => new TransportResource($this->packingList->owner instanceof Order ? $this->transport : $this->packingList->owner->transports()->first())
];
}
}
+9 -2
View File
@@ -2,6 +2,8 @@
namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Models\Order;
use Illuminate\Http\Resources\Json\JsonResource;
class PackingListResource extends JsonResource
@@ -14,14 +16,19 @@ class PackingListResource extends JsonResource
*/
public function toArray($request)
{
$replica = $this->packingLists()->first();
return [
'id' => $this->id,
'claimant_id' => $this->claimant_id,
'reference' => $this->reference,
'status' => $this->status,
'transport' => new TransportResource($this->transports()->first()),
'packages' => PackageResource::collection($this->packages),
'order' => New OrderResource($this->owner)
'type' => $this->type,
'packages' => PackageResource::collection(Auth()->user()->role === RoleTypes::SUPER_ADMIN ? $this->packages : $replica ? $replica->packages : $this->packages),
'packing_list' => new PackingListResource($replica),
$this->mergeWhen($this->owner instanceof Order, [
'order' => New OrderResource($this->owner)
])
];
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* Class Announcement
* @package App\Models
*
*/
class Announcement extends AbstractModel
{
use SoftDeletes;
protected $table = 'announcements';
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
**/
public function segments(): BelongsToMany
{
return $this->BelongsToMany(Segment::class);
}
}
+7 -6
View File
@@ -6,6 +6,7 @@ use App\Classes\General\Interfaces\Addressable;
use App\Classes\General\Interfaces\Contactable;
use App\Classes\General\Interfaces\Packable;
use App\Classes\General\Interfaces\Remarkable;
use App\Classes\ValueObjects\Constants\PackingListType;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Scopes\CustomerOrdersScope;
@@ -100,7 +101,7 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable
public function originWarehousePackages()
{
return $this->parcels()->shippingList()
return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)
->whereDoesntHave('shippingSchedules',
function($schedule) {
return $schedule->dispatched()
@@ -111,14 +112,14 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable
public function inTransitPackages()
{
return $this->parcels()->shippingList()->Shipping()
return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)->Shipping()
->whereHas('shippingSchedules',
function($schedule) {
return $schedule->dispatched()
->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
}
)
->whereDoesntHave('container', function($container) {
->whereDoesntHave('containers', function($container) {
return $container->where('containers.status', ApprovalStatus::COMPLETED);
}
);
@@ -126,8 +127,8 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable
public function destinationWarehousePackages()
{
return $this->parcels()->shippingList()
->whereHas('container',
return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)
->whereHas('containers',
function($container) {
return $container->where('containers.status', ApprovalStatus::COMPLETED);
}
@@ -141,7 +142,7 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable
public function deliveredPackages()
{
return $this->parcels()->shippingList()
return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)
->whereHas('deliverySchedules',
function($schedule) {
return $schedule->dispatched()->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
+2 -2
View File
@@ -142,9 +142,9 @@ class Package extends AbstractModel
protected static function booted()
{
if (auth()->user()->type === RoleTypes::USER) {
// if (auth()->user()->type === RoleTypes::USER) {
// static::addGlobalScope(new CustomerPackagesScope());
}
// }
}
}
+53 -1
View File
@@ -4,15 +4,22 @@ namespace App\Models;
use App\Classes\General\Interfaces\Steppable;
use App\Classes\General\Interfaces\Transportable;
use App\Classes\General\Interfaces\Packable;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Staudenmeir\EloquentHasManyDeep\HasManyDeep;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;
class PackingList extends AbstractModel implements Transportable, Steppable
class PackingList extends AbstractModel implements Transportable, Steppable, Packable
{
use HasRelationships;
use SoftDeletes;
protected $table = 'packing_lists';
@@ -71,4 +78,49 @@ class PackingList extends AbstractModel implements Transportable, Steppable
{
return $this->BelongsToMany(PackingList::class, 'packing_list_owner', 'owner_packing_list_id', 'packing_list_id');
}
/**
* @return MorphMany
*/
public function packingLists(): morphMany
{
return $this->morphMany(PackingList::class, 'owner');
}
/**
* @return hasManyDeep
*/
public function shippingTransports(): hasManyDeep
{
return $this->hasManyDeep(Transport::class, [ContainerPackingList::class, Container::class], ['packing_list_id', 'id', ['owner_type', 'owner_id']], ['id', 'container_id', null]);
}
/**
* @return hasManyDeep
*/
public function shippingSchedules(): hasManyDeep
{
return $this->hasManyDeep(Schedule::class, [ContainerPackingList::class, Container::class, Transport::class], ['packing_list_id', 'id', ['owner_type', 'owner_id'], ['owner_type', 'owner_id']], ['id', 'container_id', null, null]);
}
/**
* @return hasManyDeep
*/
public function deliverySchedules(): hasManyDeep
{
return $this->hasManyDeep(Schedule::class, [Transport::class], [['owner_type', 'owner_id'], ['owner_type', 'owner_id']], [null, null]);
}
/**
* @param $query
* @return mixed
*/
public function scopeShipping($query){
return $query->whereHas('shippingSchedules', function($schedule){
return $schedule->where('etd', '<', Carbon::now())->where('schedules.status', ApprovalStatus::APPROVED);
})->whereDoesntHave('shippingTransports', function($transport){
return $transport->where('transport_arrangements.status', ApprovalStatus::COMPLETED);
});
}
}
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAnnouncementsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('announcements', function (Blueprint $table) {
$table->id();
$table->string('title', 50);
$table->longText('description');
$table->timestamp('starting_on')->nullable();
$table->timestamp('ending_on')->nullable();
$table->boolean('is_all_day')->default(false);
$table->integer('duration')->default(0);
$table->boolean('is_recurring')->default(false);
$table->string('recurrence_pattern')->nullable();
$table->softDeletes();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('announcements');
}
}
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAnnouncementSegmentTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('announcement_segment', function (Blueprint $table) {
$table->primary(['announcement_id', 'segment_id']);
$table->bigInteger('announcement_id')->unsigned();
$table->bigInteger('segment_id')->unsigned();
$table->timestamps();
$table->foreign('announcement_id')
->references('id')
->on('announcements')->onDelete('cascade');
$table->foreign('segment_id')
->references('id')
->on('segments')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('announcement_segment');
}
}
+1 -1
View File
@@ -23,7 +23,7 @@ class DatabaseSeeder extends Seeder
$this->call(CountriesTableSeeder::class);
$this->call(CurrenciesTableSeeder::class);
// $this->call(CompaniesTableSeeder::class);
$this->call(CompaniesTableSeeder::class);
// $this->call(OrdersTableSeeder::class);
}
}
@@ -47,9 +47,9 @@
<div class="col">
<div class="row m-b-15">
<div class="col-12 col-md pr-md-1 pb-3 pb-md-0">
<validation-wrapper-component :validator="$v.parameters.pic">
<validation-wrapper-component :validator="$v.parameters.person_in_charge">
<label>Person In Charge</label>
<input class="form-control" name="pic" v-model="parameters.pic">
<input class="form-control" name="person_in_charge" v-model="parameters.person_in_charge">
</validation-wrapper-component>
</div>
<div class="col-12 col-md pl-md-1">
@@ -106,7 +106,7 @@
post_code: '',
remark: '',
phone: '',
pic: '',
person_in_charge: '',
}
}
@@ -118,9 +118,9 @@
this.parameters.street_two = this.data.street_two;
this.parameters.district_id = this.data.district.id;
this.parameters.post_code = this.data.post_code;
this.parameters.phone = this.data.contact.phone;
this.parameters.pic = this.data.contact.reference;
this.parameters.remark = this.data.remark.content;
this.parameters.phone = this.data.contact ? this.data.contact.phone : '';
this.parameters.person_in_charge = this.data.contact ? this.data.contact.reference : '';
this.parameters.remark = this.data.remark ? this.data.remark.content : '';
}
},
watch: {
@@ -11,6 +11,30 @@
<on-boarding-section-component v-if="!company.last_order"></on-boarding-section-component>
<div class="row" v-if="company.last_order">
<div class="col">
<div class="row m-b-20">
<div class="col no-padding">
<div class="alert alert-warning" role="alert">
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<p class="fs-18 p-t-15"><i class="fa fa-exclamation-triangle m-r-5"></i> !!!! 海运费涨价通知 NOTICE OF PRICE INCREMENT !!! <i class="fa fa-exclamation-triangle m-l-5"></i></p>
</div>
</div>
<div class="row">
<div class="col">
<p>由于近期海运费非常不稳定运费每个星期都会调整请发货入仓之前按以下按键确认最新运费价格</p>
<p>Due to the recent unstable shipping rates, shipping costs are adjusted weekly, please confirm the latest shipping prices before shipping into the warehouse by following the button below.</p>
<a href="https://www.cief-malaysia.com/services-sea-shipping/" target="_blank"><div class="btn btn-complete">Sea Shipping Price List</div></a>
</div>
</div>
</div>
</div>
</div>
<chinese-new-year-memo-component></chinese-new-year-memo-component>
</div>
</div>
<div class="row m-b-30 relative">
<div class="col">
<div class="row">
@@ -0,0 +1,136 @@
<template>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<div class="text-white p-t-25 p-l-25 p-r-25" style="background-image: radial-gradient(rgb(182, 3, 17), rgb(118, 0, 12));">
<div class="row" style="max-width: 650px; margin: 0px auto;">
<div class="col">
<div class="row m-b-25">
<div class="col text-center">
<h4 class="text-warning no-margin">2022年农历新春前夕仓库运作通知</h4>
<h4 class="text-warning no-margin">Chinese New Year Shipping Memo 2022</h4>
</div>
</div>
<div class="row">
<div class="col">
<p class="no-margin">尊敬的顾客,</p>
<p class="m-b-15">Dear Valued Customers,</p>
<p class="no-margin">为确保您的货物在华人农历新年前收到 务必提前通知您的供应商安排在以下日期前把货物送到仓库:</p>
<p>To ensure your goods received before the Chinese New Year Holidays, we advised the customer to inform their suppliers to arrange their goods earlier beforehand to the schedule below:</p>
</div>
</div>
<div class="row m-t-10">
<div class="col">
<div class="tg-wrap"><table class="tg">
<thead>
<tr>
<th class="tg-2bkf" colspan="2">仓库 WAREHOUSE</th>
<th class="tg-2bkf">入仓日期 RECEIVED DATE</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-2bkf" rowspan="2">广州<br>GUANGHZOU<br></td>
<td class="tg-2bkf">西马<br>WEST MALAYSIA</td>
<td class="tg-2bkf">25/12/2021</td>
</tr>
<tr>
<td class="tg-2bkf">东马<br>EAST MALAYSIA</td>
<td class="tg-2bkf">11/12/2021</td>
</tr>
<tr v-if="expanded">
<td class="tg-2bkf" rowspan="2">义乌<br>YIWU</td>
<td class="tg-2bkf">西马<br>WEST MALAYSIA</td>
<td class="tg-2bkf">18/12/2021</td>
</tr>
<tr v-if="expanded">
<td class="tg-2bkf">东马<br>EAST MALAYSIA</td>
<td class="tg-2bkf">04/12/2021</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="row m-t-15" v-if="expanded">
<div class="col">
<div class="row m-b-20">
<div class="col">
<p class="no-margin">我们建议客户尽早安排送货到中国仓库以确保货物在恶劣天气运输延误海关检查等情况下准时到达目的地</p>
<p>Customers are advised to arrange delivery to China warehouse as soon as possible to ensure goods reach their destination on time due to the events of Bad weather, Shipping delay, Custom inspection and etc.</p>
</div>
</div>
<div class="row">
<div class="col">
<h6 class="text-warning no-margin bold">仓库运营日期</h6>
<h6 class="text-warning no-margin bold">Warehouse Operation Date</h6>
</div>
</div>
<div class="row m-t-15 m-b-15">
<div class="col">
<div class="tg-wrap"><table class="tg">
<thead>
<tr>
<th class="tg-2bkf">仓库<br>WAREHOUSE</th>
<th class="tg-2bkf">仓库截止收货日期<br>LAST DAY RECEIVE GOODS</th>
<th class="tg-2bkf">仓库復工日期<br>RESUME OPERATION DATE</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-2bkf" rowspan="2">义乌<br>YIWU</td>
<td class="tg-2bkf">18/01/2022<br>西马 WEST MALAYSIA</td>
<td class="tg-2bkf" rowspan="2">16/02/2022</td>
</tr>
<tr>
<td class="tg-2bkf">25/12/2021<br>东马 EAST MALAYSIA</td>
</tr>
<tr>
<td class="tg-2bkf" rowspan="2">广州<br>GUANGHZOU</td>
<td class="tg-2bkf">18/01/2022<br>西马 WEST MALAYSIA</td>
<td class="tg-2bkf" rowspan="2">12/02/2022</td>
</tr>
<tr>
<td class="tg-2bkf">08/01/2022<br>东马 EAST MALAYSIA</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row" style="margin-top: -1px;">
<div class="col text-center">
<div class="btn btn-block btn-danger bg-danger-darker no-border p-t-10 p-b-10" @click="expanded = !expanded"><i class="fa m-r-10" :class="[{'fa-angle-double-down': !expanded}, {'fa-angle-double-up': expanded}]"></i> Click To view {{expanded ? 'less' : 'more'}} details <i class="fa m-l-10" :class="[{'fa-angle-double-down': !expanded}, {'fa-angle-double-up': expanded}]"></i></div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data(){
return {
expanded: false
}
}
}
</script>
<style scoped>
.tg {border-collapse:collapse;border-spacing:0; width: 650px; margin: 0px auto; }
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
overflow:hidden;padding:8px 20px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
font-weight:normal;overflow:hidden;padding:8px 20px;word-break:normal;}
.tg .tg-2bkf{background-color:#76000c;border-color:#ffffff;color:#ffffff;text-align:center;vertical-align:middle}
@media screen and (max-width: 767px) {.tg {width: auto !important;}.tg col {width: auto !important;}.tg-wrap {overflow-x: auto;-webkit-overflow-scrolling: touch;margin: auto 0px;}}
</style>
@@ -60,7 +60,7 @@
<div class="row">
<div class="col-auto">
<small class="fs-10 all-caps muted">Warehouse</small>
<h6 class="no-margin small">{{item.order.warehouse.id === 3 ? 'Guang Zhou' : 'Yiwu'}}</h6>
<h6 class="no-margin small">{{item.order.warehouse.name}}</h6>
</div>
<div class="col-auto">
<small class="fs-10 all-caps muted">Delivery Address</small>
@@ -10,7 +10,7 @@
</div>
<div class="row">
<div class="col">
<p class="no-margin bold">{{item.last_order.warehouse.id === 3 ? 'Guang Zhou': 'Yiwu'}}</p>
<p class="no-margin bold">{{item.last_order.warehouse.name}}</p>
</div>
</div>
</div>
@@ -293,7 +293,7 @@
</div>
<div class="row">
<div class="col">
<parcel-component v-for="parcel in order.parcels.received_packages" :data="parcel" :key="parcel.id"></parcel-component>
<parcel-component v-for="parcel in order.parcels.received_packages.flatMap(packing_list => packing_list.packages)" :data="parcel" :key="parcel.id"></parcel-component>
</div>
</div>
</div>
@@ -310,10 +310,10 @@
</modal-component>
</div>
<div class="col">
<div class="row" v-if="order.parcels.origin_warehouse_packages.length">
<div class="row" v-if="order.parcels.origin_warehouse_packages.flatMap(packing_list => packing_list.packages).length">
<div class="col">
<div class="row" v-for="group in Math.ceil(order.parcels.origin_warehouse_packages.length / 2)">
<div class="col-12 p-r-0" :class="'col-md-'+(12/2)" v-for="item in order.parcels.origin_warehouse_packages.slice((group - 1) * 2, group * 2)" v-bind:key="item.id" :data="item">
<div class="row" v-for="group in Math.ceil(order.parcels.origin_warehouse_packages.flatMap(packing_list => packing_list.packages).length / 2)">
<div class="col-12 p-r-0" :class="'col-md-'+(12/2)" v-for="item in order.parcels.origin_warehouse_packages.flatMap(packing_list => packing_list.packages).slice((group - 1) * 2, group * 2)" v-bind:key="item.id" :data="item">
<package-component :data="item" status="Ready To Ship"></package-component>
</div>
</div>
@@ -343,10 +343,10 @@
<div class="col">
<div class="row">
<div class="col">
<div class="row" v-if="order.parcels.in_transit_packages.length">
<div class="row" v-if="order.parcels.in_transit_packages.flatMap(packing_list => packing_list.packages).length">
<div class="col">
<div class="row" v-for="group in Math.ceil(order.parcels.in_transit_packages.length / 3)">
<div class="col-12" :class="'col-md-'+(12/3)" v-for="item in order.parcels.in_transit_packages.slice((group - 1) * 3, group * 3)" v-bind:key="item.id" :data="item">
<div class="row" v-for="group in Math.ceil(order.parcels.in_transit_packages.flatMap(packing_list => packing_list.packages).length / 3)">
<div class="col-12" :class="'col-md-'+(12/3)" v-for="item in order.parcels.in_transit_packages.flatMap(packing_list => packing_list.packages).slice((group - 1) * 3, group * 3)" v-bind:key="item.id" :data="item">
<package-component :data="item" status="Shipping"></package-component>
</div>
</div>
@@ -376,10 +376,10 @@
<div class="col">
<div class="row">
<div class="col">
<div class="row" v-if="order.parcels.destination_warehouse_packages.length">
<div class="row" v-if="order.parcels.destination_warehouse_packages.flatMap(packing_list => packing_list.packages).length">
<div class="col">
<div class="row" v-for="group in Math.ceil(order.parcels.destination_warehouse_packages.length / 3)">
<div class="col-12" :class="'col-md-'+(12/3)" v-for="item in order.parcels.destination_warehouse_packages.slice((group - 1) * 3, group * 3)" v-bind:key="item.id" :data="item">
<div class="row" v-for="group in Math.ceil(order.parcels.destination_warehouse_packages.flatMap(packing_list => packing_list.packages).length / 3)">
<div class="col-12" :class="'col-md-'+(12/3)" v-for="item in order.parcels.destination_warehouse_packages.flatMap(packing_list => packing_list.packages).slice((group - 1) * 3, group * 3)" v-bind:key="item.id" :data="item">
<package-component :data="item" status="Preparing Delivery"></package-component>
</div>
</div>
@@ -409,16 +409,16 @@
<div class="col">
<div class="row">
<div class="col">
<div class="row" v-if="order.parcels.delivered_packages.length">
<div class="row" v-if="order.parcels.delivered_packages.flatMap(packing_list => packing_list.packages).length">
<div class="col">
<div class="row" v-for="group in Math.ceil(order.parcels.delivered_packages.length / 3)">
<div class="col-12" :class="'col-md-'+(12/3)" v-for="item in order.parcels.delivered_packages.slice((group - 1) * 3, group * 3)" v-bind:key="item.id" :data="item">
<div class="row" v-for="group in Math.ceil(order.parcels.delivered_packages.flatMap(packing_list => packing_list.packages).length / 3)">
<div class="col-12" :class="'col-md-'+(12/3)" v-for="item in order.parcels.delivered_packages.flatMap(packing_list => packing_list.packages).slice((group - 1) * 3, group * 3)" v-bind:key="item.id" :data="item">
<package-component :data="item" status="Delivered"></package-component>
</div>
</div>
</div>
</div>
<div class="row align-items-center justify-content-center p-t-50 p-b-50" v-if="!order.parcels.delivered_packages.length">
<div class="row align-items-center justify-content-center p-t-50 p-b-50" v-if="!order.parcels.delivered_packages.flatMap(packing_list => packing_list.packages).length">
<div class="col-10">
<div class="row align-items-center justify-content-center hint-text">
<div class="col-4 hint-text"><img src="/images/not-found-illustration.png" class="w-100 hint-text"/></div>
@@ -0,0 +1,47 @@
<template>
<div class="row">
<div class="col">
<div class="row m-b-20 flex-sm-row flex-column-reverse" v-if="$store.getters.isAdmin">
<div class="col-12 col-md">
<div class="row mt-3 mt-md-0">
<div class="col">
<div class="input-group form-group no-margin form-group-default">
<input class="form-control p-t-10" placeholder="Search Order No.">
<button type="button" class="btn btn-primary" @click="search">
<i class="fa fa-search"></i>
</button>
<button type="button" class="btn btn-default bg-master-light m-l-5" @click="$store.dispatch('toggleSection', {name: 'searchOrderSection', status: false})">
Reset
</button>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-auto text-right">
<a :href="route('orders.refresh')"><div class="btn btn-sm btn-warning all-caps b-rad-none pointer"><i class="fa fa-refresh m-r-10"></i>Refresh Orders</div></a>
</div>
</div>
<list-component section="searchOrderListSection" :endpoint="route('api.order.list')" :options="{reference_like:query, with_packing_lists: true}" :columns=3 v-show="$store.getters.isShowing('searchOrderSection')">
<template slot="list" slot-scope="{data}">
<order-component :data="data"></order-component>
</template>
</list-component>
</div>
</div>
</template>
<script>
export default {
data() {
return {
query: ''
}
},
methods: {
search() {
this.$store.dispatch('toggleSection', {name: 'searchOrderSection', status: true});
this.$store.dispatch('updateListQueue', {name: 'searchOrderListSection', filters: {reference_like:query, with_packing_lists: true}});
}
}
}
</script>
@@ -1,6 +1,15 @@
<template>
<div class="row tabsContainer">
<div class="col no-padding">
<div class="row">
<div class="col">
<!-- <list-component v-show="!$store.getters.isShowing('createOrderForm')" section="activeOrderListSection" :endpoint="route('api.order.list')" :options="item ? {per_page: 12, order_by: {column: 'created_at', DESC: false}, status_in: [2], company_module_id: item.company_module.id, with_packing_lists: true} : {per_page: 30, order_by: {column: 'created_at', DESC: true}, status_in: [2], with_packing_lists: true}" :columns=3>
<template slot="list" slot-scope="{data}">
<order-component :data="data"></order-component>
</template>
</list-component> -->
</div>
</div>
<div class="row m-l-0 m-r-0">
<div class="col col-md-2 m-r-5">
<div class="row justify-content-end">
@@ -10,7 +10,7 @@ export default {
post_code: { required },
remark: {},
phone: {numeric},
pic: {},
person_in_charge: {},
}
},
mixins: [addressFormHandler]
@@ -1,32 +1,5 @@
<div class="row d-none" :class="[{'d-flex': !$store.getters.isAdmin}]" v-if="!$store.getters.isAdmin">
<div class="col">
<div class="row">
<div class="col no-padding">
<div class="alert alert-warning" role="alert">
<div class="row">
<div class="col p-b-15">
<div class="row">
<div class="col">
<p class="fs-18 p-t-15"><i class="fa fa-exclamation-triangle m-r-5"></i> !!!! 海运费涨价通知 NOTICE OF PRICE INCREMENT !!! <i class="fa fa-exclamation-triangle m-l-5"></i></p>
</div>
</div>
<div class="row">
<div class="col">
<p class="no-margin">由于最近船公司正缩减仓位, 导致持续推高海运费。</p>
<p>所以从 10/11/2021 开始入仓广州仓库的货物会有所调整。</p>
<p>广州 - 西马运费+RM50/立方</p>
<p class="m-b-20">有造成不便之处,敬请见谅!谢谢合作</p>
<p>Shortage of container is getting terrible in the whole worldwide due to Shipping liner company consolidating their ship</p>
<p>Therefore, the shipping fee from Guangzhou to West Malaysia will be adjusted start from good entering warehouse by 10/11/2021</p>
<p >Guangzhou - West Malaysia +RM50/CBM</p>
<p class="m-b-0">We apologize that any inconvenience caused! Thanks for your cooperation.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<customer-profile-section-component :company_id="$store.getters.getCompanyId"></customer-profile-section-component>
</div>
</div>
+2 -1
View File
@@ -6,5 +6,6 @@
<a :href="route('orders.refresh')"><div class="btn btn-sm btn-warning all-caps b-rad-none pointer"><i class="fa fa-refresh m-r-10"></i>Refresh Orders</div></a>
</div>
</div>
<order-section-component></order-section-component>
<order-search-section-component v-show="!$store.getters.isShowing('createOrderForm')"></order-search-section-component>
<order-section-component v-show="!$store.getters.isShowing('searchOrderSection')"></order-section-component>
@endsection
+16
View File
@@ -0,0 +1,16 @@
<?php
use Illuminate\Support\Facades\Route;
Route::group(['prefix' => 'announcement', 'as' => 'announcement.', 'namespace' => 'Announcements'], function () {
Route::get('/list', 'ListAnnouncementsController@list')->name('list');
Route::post('/create', 'CreateAnnouncementController@create')->name('create');
Route::put('/update/{id}', 'UpdateAnnouncementController@update')->name('update');
Route::delete('/delete/{id}', 'DeleteAnnouncementController@delete')->name('delete');
Route::group(['prefix' => '/{id}/segment', 'as' => 'segment.'], function () {
Route::post('/assign', 'AssignAnnouncementToSegmentController@assign')->name('assign');
Route::delete('/detach/{segment_id}', 'RemoveSegmentFromAnnouncementController@detach')->name('detach');
});
});
+2
View File
@@ -59,4 +59,6 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::get('/report/service', 'Reports\MonthlyReportController@serviceReport')->name('report.service');
});
require __DIR__ . '/announcement.php';
});
+31 -4
View File
@@ -5,6 +5,7 @@ use App\Classes\Jobs\FetchDeliveryListFromVTPortalJob;
use App\Classes\Jobs\FetchLoadedContainersFromVTPortalJob;
use App\Classes\Jobs\FetchPackingListFromVTPortalJob;
use App\Classes\Jobs\FetchWarehouseReceiveListFromVTPortalJob;
use App\Classes\Modules\PackingLists\Processors\FetchOrderListsFromYdPortalProcessor;
use App\Models\CompanyConnection;
use Illuminate\Support\Facades\Crypt;
use App\Models\Container;
@@ -60,10 +61,6 @@ Route::get('/orders', function () {
return view('pages.orders.index');
})->name('orders');
Route::get('/packages', function () {
return view('pages.orders.packages');
})->name('packages');
Route::get('/order/show/{order_number}', function ($orderNumber) {
return view('pages.orders.profile', ['id' => $orderNumber]);
})->name('order.show');
@@ -106,6 +103,7 @@ Route::get('/orders/refresh', function(){
Route::get('/containers/refresh', function(){
// FetchLoadedContainersFromVTPortalJob::dispatch();
FetchContainersStatusUpdateFromVTPortalJob::dispatch();
return redirect('orders');
@@ -136,6 +134,31 @@ Route::group(['prefix' => 'template', 'as' => 'template.'], function () {
})->name('shipping-queue');
});
Route::get('/yiwu', function () {
$orders = \App\Models\Order::whereHas('OrderRoles', function($query){
return $query->where('role_id', \App\Classes\ValueObjects\Constants\OrderRoleTypes::ORIGIN_WAREHOUSE)->where('company_module_id', 4);
})->whereHas('addresses', function($query){
return $query->where('status', \App\Classes\ValueObjects\Constants\ApprovalStatus::APPROVED)->whereIn('state_id', [5, 13, 14]);
})->get();
foreach ($orders as $order){
echo '<a target="_blank" href="'.route('order.show', $order->reference).'">'. $order->reference.' - '.$order->created_at.'</a><br>';
}
});
Route::get('/guangzhou', function () {
$orders = \App\Models\Order::whereHas('OrderRoles', function($query){
return $query->where('role_id', \App\Classes\ValueObjects\Constants\OrderRoleTypes::ORIGIN_WAREHOUSE)->where('company_module_id', 3);
})->whereHas('addresses', function($query){
return $query->where('status', \App\Classes\ValueObjects\Constants\ApprovalStatus::APPROVED)->whereIn('state_id', [5, 13, 14]);
})->get();
foreach ($orders as $order){
echo '<a target="_blank" href="'.route('order.show', $order->reference).'">'. $order->reference.' - '.$order->created_at.'</a><br>';
}
});
Route::get('/debug', function (){
$orders = \App\Models\Order::all();
@@ -155,3 +178,7 @@ Route::get('/debug', function (){
dd($issues);
});
Route::get('/yd', function (){
(App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute();;
});