From f44497e50ca02dfd2a123b286edba78415e5d7cb Mon Sep 17 00:00:00 2001 From: edmondlang Date: Mon, 14 Oct 2024 14:16:33 +0800 Subject: [PATCH] address extra fields --- .../ControllersLogic/UpdateAddressLogic.php | 24 +++++ .../DataTransferObjects/RemarkObject.php | 14 ++- .../Remarks/Services/CreatesRemark.php | 1 + .../ValueObjects/Constants/RemarkTypes.php | 4 +- app/Http/Resources/AddressResource.php | 13 ++- app/Http/Resources/OrderResource.php | 3 +- app/Http/Resources/RemarkResource.php | 1 + app/Models/Address.php | 11 +- .../addresses/forms/AddressFormComponent.vue | 102 ++++++++++++++---- .../validation/addressFormValidation.js | 9 +- 10 files changed, 151 insertions(+), 31 deletions(-) diff --git a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php index 94d960f6..4b127aa8 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php @@ -15,10 +15,13 @@ use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\RemarkTypes; use App\Http\Resources\AddressResource; use App\Models\Address; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Carbon\Carbon; +use Illuminate\Support\Facades\Log; class UpdateAddressLogic extends AbstractControllerLogic { @@ -102,6 +105,27 @@ class UpdateAddressLogic extends AbstractControllerLogic $this->createRemarkProcessor->execute($address, $remarkObject); } + if ($request->input('pickup_time_to') <= $request->input('pickup_time_from')) { + $pickupTimeFrom = Carbon::parse($request->input('pickup_time_from')); + $request->merge([ + 'pickup_time_to' => $pickupTimeFrom->addHour()->format('H:i') // Format to hh:mm + ]); + } + + $addressExtraFields = [ + 'property_type' => $request->input('property_type'), + 'additional_request' => $request->input('additional_request'), + 'receive_goods_working_hours' => $request->input('receive_goods_working_hours'), + 'receive_goods_after_hours' => $request->input('receive_goods_after_hours'), + 'receive_goods_on_saturday' => $request->input('receive_goods_on_saturday'), + ]; + + $address->addressExtraFields()->delete(); + $addressExtraFieldsObject = new RemarkObject(json_encode($addressExtraFields), Auth()->user()->id, RemarkTypes::ADDRESS_EXTRA_COLUMNS); + $remark = $this->createRemarkProcessor->execute($address, $addressExtraFieldsObject); + + Log::info($remark); + return $this->resourceResponse(new AddressResource($address)); } diff --git a/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php b/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php index 44a9507f..5a07c508 100644 --- a/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php +++ b/app/Classes/Modules/Remarks/DataTransferObjects/RemarkObject.php @@ -13,10 +13,14 @@ class RemarkObject implements DataTransferObject /** @var string*/ private $content; - public function __construct(string $content, int $commenterID) + /** @var int|null */ + private $type; + + public function __construct(string $content, int $commenterID, int $type = null) { $this->commenterID = $commenterID; $this->content = $content; + $this->type = $type; } /** @@ -35,4 +39,12 @@ class RemarkObject implements DataTransferObject return $this->content; } + /** + * @return int|null + */ + public function getType(): ?int + { + return $this->type; + } + } diff --git a/app/Classes/Modules/Remarks/Services/CreatesRemark.php b/app/Classes/Modules/Remarks/Services/CreatesRemark.php index ac0d57a3..b7bcf388 100644 --- a/app/Classes/Modules/Remarks/Services/CreatesRemark.php +++ b/app/Classes/Modules/Remarks/Services/CreatesRemark.php @@ -24,6 +24,7 @@ class CreatesRemark extends AbstractUpdateRelationshipRecord $model->commenter_id = $object->getCommenterId(); $model->content = $object->getContent(); + $model->type = $object->getType(); return $this->handler($remarkable->remarks(), $model); diff --git a/app/Classes/ValueObjects/Constants/RemarkTypes.php b/app/Classes/ValueObjects/Constants/RemarkTypes.php index 9629e89a..7c233594 100644 --- a/app/Classes/ValueObjects/Constants/RemarkTypes.php +++ b/app/Classes/ValueObjects/Constants/RemarkTypes.php @@ -10,4 +10,6 @@ final class RemarkTypes public const EXTERNAL = 1; -} \ No newline at end of file + public const ADDRESS_EXTRA_COLUMNS = 2; + +} diff --git a/app/Http/Resources/AddressResource.php b/app/Http/Resources/AddressResource.php index 70461cd6..aac7ee64 100644 --- a/app/Http/Resources/AddressResource.php +++ b/app/Http/Resources/AddressResource.php @@ -27,7 +27,11 @@ class AddressResource extends JsonResource $outstationPostcodeConstant = $outstationPostcodeConstantObject->isEmpty() ? [] : (array)$outstationPostcodeConstantObject->first()->value; in_array((String)$this->postcode, $outstationPostcodeConstant) ? $postcodeArea = 'OUTSTATION_POSTCODE' : null; - return [ + // Handle extra fields + $extrafields = $this->addressExtraFields->first(); + $extrafields = $extrafields ? json_decode($extrafields->content, true) : []; + + $returnArray = [ 'id' => $this->id, 'reference' => $this->reference, 'street_one' => $this->street_one, @@ -52,5 +56,12 @@ class AddressResource extends JsonResource ]) ]; + + // Merge extra fields into the return array + if ($extrafields) { + $returnArray = array_merge($returnArray, $extrafields); + } + + return $returnArray; } } diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php index 8b72130a..748e0c97 100644 --- a/app/Http/Resources/OrderResource.php +++ b/app/Http/Resources/OrderResource.php @@ -5,6 +5,7 @@ namespace App\Http\Resources; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\OrderRoleTypes; use App\Classes\ValueObjects\Constants\PackingListType; +use App\Classes\ValueObjects\Constants\RemarkTypes; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\TransportType; use App\Models\Transaction; @@ -53,7 +54,7 @@ class OrderResource extends JsonResource 'invoices' => $this->whenLoaded('packingLists', function() use ($orderId) { return TransactionResource::collection($this->transactions()->whereNotIn('transactions.status', [0, 1])->where('transactions.type', TransactionType::SHIPPING_INVOICE)->get()); }), - 'remarks' => RemarkResource::collection($this->remarks), + 'remark' => new RemarkResource($this->remarks->first()), 'created_at' => $this->created_at->format('d-m-Y') ]; diff --git a/app/Http/Resources/RemarkResource.php b/app/Http/Resources/RemarkResource.php index 24081934..c3eafb14 100644 --- a/app/Http/Resources/RemarkResource.php +++ b/app/Http/Resources/RemarkResource.php @@ -18,6 +18,7 @@ class RemarkResource extends JsonResource 'id' => $this->id, 'commenter' => new UserResource($this->commenter), 'owner_id' => $this->owner_id, + 'type' => $this->type, 'content' => $this->content, 'created_at' => $this->created_at->format('d-m-Y H:i'), 'long_ago' => $this->created_at->diffForHumans() diff --git a/app/Models/Address.php b/app/Models/Address.php index 8357940f..d8cddc64 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Contactable; use App\Classes\General\Interfaces\Remarkable; +use App\Classes\ValueObjects\Constants\RemarkTypes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasOne; @@ -87,6 +88,14 @@ class Address extends AbstractModel implements Contactable, Remarkable */ public function remarks(): morphMany { - return $this->morphMany(Remark::class, 'owner'); + return $this->morphMany(Remark::class, 'owner')->whereNull('type'); + } + + /** + * @return MorphMany + */ + public function addressExtraFields(): MorphMany + { + return $this->morphMany(Remark::class, 'owner')->where('type', RemarkTypes::ADDRESS_EXTRA_COLUMNS); } } diff --git a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue index 3dc9325c..be04b733 100644 --- a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue +++ b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue @@ -3,14 +3,6 @@
-
-
- - - - -
-
@@ -41,6 +33,14 @@
+
+
+ + + + +
+
@@ -59,14 +59,6 @@
-
-
- - - - -
-
@@ -125,16 +117,70 @@
-
-
- - - - +
+
+
+
+ + + + +
+
+
+
+ + + + +
+
+
+
+
+ +
+
+
+
+ +

Working Hours (9am-6pm)

+
+
+
+
+
+
+ +

After Working Hours

+
+
+
+
+
+
+ +

On Saturday

+
+
+
+
+
+ + + + +
+
+
+
+
**kindly reply within 2 hours while warehouse contact to arrange for delivery, otherwise, reschedule of delivery date will apply
+
+
@@ -154,7 +200,7 @@ props: { id: { type: Number, - required: true + // required: true }, type: { type: Number, @@ -174,6 +220,11 @@ remark: '', phone: '', person_in_charge: '', + property_type: '', + additional_request: '', + receive_goods_working_hours: false, + receive_goods_after_hours: false, + receive_goods_on_saturday: false, } } @@ -189,6 +240,11 @@ 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 : ''; + this.parameters.property_type = this.data.property_type ? this.data.property_type : ''; + this.parameters.additional_request = this.data.additional_request ? this.data.additional_request : ''; + this.parameters.receive_goods_working_hours = this.data.receive_goods_working_hours ? this.data.receive_goods_working_hours : false; + this.parameters.receive_goods_after_hours = this.data.receive_goods_after_hours ? this.data.receive_goods_after_hours : false; + this.parameters.receive_goods_on_saturday = this.data.receive_goods_on_saturday ? this.data.receive_goods_on_saturday : false; } }, watch: { diff --git a/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js b/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js index 4552a9d5..c2778a26 100644 --- a/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js +++ b/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js @@ -10,15 +10,18 @@ export default { }, street_one: { required }, street_two: { - required: requiredIf(function(){ - return [7,8].includes(this.$store.getters.getCompanyModuleType); - }) + required + // required: requiredIf(function(){ + // return [7,8].includes(this.$store.getters.getCompanyModuleType); + // }) }, district_id: { required }, post_code: { required }, remark: {}, phone: {required, numeric}, person_in_charge: { required }, + property_type: { required }, + additional_request: { }, } }, mixins: [addressFormHandler]