diff --git a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php index 67f74657..abacaa67 100644 --- a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php +++ b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php @@ -115,6 +115,21 @@ class AddressObject implements DataTransferObject return $this->country; } + /** + * @return int + */ + public function getDefault(): int + { + return $this->default; + } + + /** + * @return int + */ + public function getBilling(): int + { + return $this->billing; + } } \ No newline at end of file diff --git a/app/Classes/Modules/Orders/Services/ChecksIfOrderNumberExists.php b/app/Classes/Modules/Orders/Services/ChecksIfOrderNumberExists.php new file mode 100644 index 00000000..afa65706 --- /dev/null +++ b/app/Classes/Modules/Orders/Services/ChecksIfOrderNumberExists.php @@ -0,0 +1,27 @@ +repository = $repository; + } + + + public function execute(int $accountNumber): bool { + return $this->repository->where('order_number', $accountNumber)->exists(); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/Services/GeneratesUniqueOrderNumber.php b/app/Classes/Modules/Orders/Services/GeneratesUniqueOrderNumber.php new file mode 100644 index 00000000..4077e7d4 --- /dev/null +++ b/app/Classes/Modules/Orders/Services/GeneratesUniqueOrderNumber.php @@ -0,0 +1,32 @@ +checksIfOrderNumberExists = $checksIfOrderNumberExists; + } + + + /** + * @return int + */ + public function execute(): int { + + $number = mt_rand(100000001, 999999999); + return !$this->checksIfOrderNumberExists->execute($number) ? $number : self::execute(); + + } + +} \ No newline at end of file diff --git a/app/Classes/ValueObjects/Constants/ModuleTypes.php b/app/Classes/ValueObjects/Constants/ModuleTypes.php index 0baaa53b..937a2951 100644 --- a/app/Classes/ValueObjects/Constants/ModuleTypes.php +++ b/app/Classes/ValueObjects/Constants/ModuleTypes.php @@ -10,4 +10,6 @@ final class ModuleTypes public const FORWARDER = 1; + public const WAREHOUSE= 2; + } \ No newline at end of file diff --git a/app/Classes/ValueObjects/Constants/OrderWarehouseType.php b/app/Classes/ValueObjects/Constants/OrderWarehouseType.php new file mode 100644 index 00000000..d0352e80 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/OrderWarehouseType.php @@ -0,0 +1,13 @@ +company_id = $request->company_id; + public function create(Request $request, GeneratesUniqueOrderNumber $generatesUniqueOrderNumber){ + + try { + + /** @var Company $company */ + $company = Company::findOrFail($request->company_id); + + $order = new Order(); + $order->company_id = $company->id; + $order->order_number = $generatesUniqueOrderNumber->execute(); + $order->forwarder_id = 1; + $order->address_id = $company->addresses()->first()->id; + $order->contact_id = $company->contacts()->first()->id; + $order->current_step = 'MS_WAREHOUSE_RECEIVING'; + $order->multiple_batch = false; + $order->complete = false; + + $order->save(); + + $order->warehouses()->attach($request->warehouse_id === 1 ? 3 : 2); + + return (new ApiResponseObject('New Order', + 'Order has been placed successfully', + HttpStatus::OK_WITH_MESSAGE, []))->handler(); + + } catch (\Exception $exception){ + return (new ApiResponseObject('New Order', + $exception->getMessage(), + $exception->getCode(), []))->handler(); + + } + + } + + + public function list(String $companyId){ + + $orders = Order::where('company_id', $companyId)->orderBy('created_at', 'DESC') + ->paginate(10); + return (new ApiResponseObject('', + '', + HttpStatus::OK_WITH_MESSAGE, json_decode(OrderResource::collection($orders)->response()->getContent(), true)))->handler(); + } + + public function download(String $orderId){ + /** @var Order $order */ + $order = order::findOrFail($orderId); + /** @var Company $warehouse */ + $warehouse = $order->warehouses()->first(); + $warehouseAddress = $warehouse->addresses()->first(); + $warehouseContact = $warehouse->contacts()->get(); + + $data = [ + 'order' => $order, + 'company' => $order->importer(), + 'delivery_address' => $order->address(), + 'warehouse_address' => $warehouseAddress, + 'warehouse_contact' => $warehouseContact + ]; + +// return view('pages.pdf.qr', $data); + + return $this->pdf->loadView('pages.pdf.qr', $data)->stream(); } } \ No newline at end of file diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php new file mode 100644 index 00000000..aa56e6b0 --- /dev/null +++ b/app/Http/Resources/OrderResource.php @@ -0,0 +1,30 @@ + $this->id, + 'marking' => $this->order_number, + 'company' => Company::where('id', $this->company_id)->first(), + 'warehouse_id' => $this->warehouse_id, + 'address' => new AddressResource(Address::where('id', $this->address_id)->first()), + 'complete' => (int)$this->complete, + 'date' => $this->created_at->format('d/m/Y') + ]; + } + +} diff --git a/app/Models/Company.php b/app/Models/Company.php index 5d912650..a0237d3d 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -35,6 +35,14 @@ class Company extends AbstractModel return $this->hasMany(Address::class, 'company_id', 'id'); } + /** + * @return HasMany + */ + public function contacts(): hasMany + { + return $this->hasMany(Contact::class, 'company_id', 'id'); + } + /** * @return HasOne */ diff --git a/app/Models/Contact.php b/app/Models/Contact.php index b05a6e8b..60c42a2f 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -11,7 +11,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @package App\Models * @version August 5, 2020, 10:46 pm * - * @property \App\Models\Company company + * @property \App\Models\Contact contact * @property string name * @property string designation * @property string email @@ -36,7 +36,7 @@ class Contact extends AbstractModel */ public function company(): HasOne { - return $this->hasOne(\App\Models\Company::class, 'company_id', 'id'); + return $this->hasOne(Company::class, 'company_id', 'id'); } } diff --git a/app/Models/Order.php b/app/Models/Order.php index c437fcd2..d7843334 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -2,6 +2,9 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\SoftDeletes; @@ -27,4 +30,31 @@ class Order extends AbstractModel protected $dates = ['deleted_at']; + /** + * @return belongsToMany + */ + public function warehouses(): belongsToMany + { + return $this->belongsToMany(Company::class, (new OrderWarehouse())->getTable(), 'warehouse_id','order_id'); + } + + /** + * @return belongsTo + */ + public function importer(): belongsTo + { + return $this->belongsTo(Company::class, 'company_id','id'); + } + + /** + * @return belongsTo + */ + public function address(): belongsTo + { + return $this->belongsTo(Address::class, 'address_id','id'); + } + + + + } diff --git a/app/Models/OrderWarehouse.php b/app/Models/OrderWarehouse.php new file mode 100644 index 00000000..882ae7ec --- /dev/null +++ b/app/Models/OrderWarehouse.php @@ -0,0 +1,31 @@ +id(); $table->foreignId('module_one'); $table->foreignId('module_two'); + $table->text('marking'); $table->integer('status')->default(RelationStatus::PENDING); $table->foreignId('instigator')->comment('entity that is responsible for current status'); $table->timestamps(); diff --git a/database/migrations/2020_08_06_035655_create_order_warehouses_table.php b/database/migrations/2020_08_06_035655_create_order_warehouses_table.php index e7209c87..86e9af1d 100644 --- a/database/migrations/2020_08_06_035655_create_order_warehouses_table.php +++ b/database/migrations/2020_08_06_035655_create_order_warehouses_table.php @@ -1,5 +1,6 @@ id(); $table->foreignId('order_id'); $table->foreignId('warehouse_id'); + $table->integer('type')->default(OrderWarehouseType::ORIGIN); $table->timestamps(); $table->foreign('order_id')->references('id')->on('orders'); diff --git a/database/seeds/CompaniesTableSeeder.php b/database/seeds/CompaniesTableSeeder.php index 5b22ffc4..1ce44d30 100644 --- a/database/seeds/CompaniesTableSeeder.php +++ b/database/seeds/CompaniesTableSeeder.php @@ -25,8 +25,54 @@ class CompaniesTableSeeder extends Seeder $company->modules()->create(['module_type' => ModuleTypes::FORWARDER]); + $company = new Company(); + $company->reference_no = 1000000001; + $company->name = 'YW-V01 浙江义乌仓库'; + $company->type = CompanyTypes::COMPANY_BUSINESS; + $company->status = AccountStatus::ACTIVE; + $company->save(); -// if (app()->environment('local')) -// factory(App\Models\Company::class, 30)->create(); + $company->addresses()->create([ + 'street_one' => '浙江省义乌市诚信大道义乌港A区2楼194号', + 'post_code' => 322000, + 'city' => '', + 'state' => '', + 'country' => 'China', + 'default' => 1, + 'billing' => 1 + ]); + + $company->contacts()->create([ + 'name' => '小叶(叶兴)', + 'phone' => '13757951501', + ]); + + $company->modules()->create(['module_type' => ModuleTypes::WAREHOUSE]); + + + $company = new Company(); + $company->reference_no = 1000000002; + $company->name = 'GZ-BY-V02 广州白云江高仓库'; + $company->type = CompanyTypes::COMPANY_BUSINESS; + $company->status = AccountStatus::ACTIVE; + $company->save(); + + $company->addresses()->create([ + 'street_one' => '广东省,广州市,白云区,大朗南路 白云湖大道自编13号 7号仓库', + 'street_two' => ' 高德地图导航:广州市世通行', + 'post_code' => 510450, + 'city' => '', + 'state' => '', + 'country' => 'China', + 'default' => 1, + 'billing' => 1 + ]); + + $company->contacts()->create([ + 'name' => '杨维民', + 'phone' => '13600055019', + ]); + + $company->modules()->create(['module_type' => ModuleTypes::WAREHOUSE]); } } diff --git a/resources/assets/vue/components/address/forms/AddressFormComponent.vue b/resources/assets/vue/components/address/forms/AddressFormComponent.vue index ad0c091f..d35dcbec 100644 --- a/resources/assets/vue/components/address/forms/AddressFormComponent.vue +++ b/resources/assets/vue/components/address/forms/AddressFormComponent.vue @@ -85,7 +85,9 @@ city: '', state: '', post_code: '', - country: '' + country: '', + default: 1, + billing: 1 } } diff --git a/resources/assets/vue/components/importer/sections/ImporterDashboardComponent.vue b/resources/assets/vue/components/importer/sections/ImporterDashboardComponent.vue index a7449203..944c4837 100644 --- a/resources/assets/vue/components/importer/sections/ImporterDashboardComponent.vue +++ b/resources/assets/vue/components/importer/sections/ImporterDashboardComponent.vue @@ -1,6 +1,6 @@ \ No newline at end of file + + \ No newline at end of file diff --git a/resources/assets/vue/components/order/forms/OrderFormComponent.vue b/resources/assets/vue/components/order/forms/OrderFormComponent.vue index 14a0b9c2..7e9aaee7 100644 --- a/resources/assets/vue/components/order/forms/OrderFormComponent.vue +++ b/resources/assets/vue/components/order/forms/OrderFormComponent.vue @@ -42,7 +42,7 @@
-
+
@@ -55,7 +55,7 @@
- Place order + Place order
@@ -86,7 +86,7 @@ data() { return { parameters : { - company_id: '', + company_id: this.id, warehouse_id: '' } diff --git a/resources/views/layouts/base_portal.blade.php b/resources/views/layouts/base_portal.blade.php index b9a36604..71125146 100644 --- a/resources/views/layouts/base_portal.blade.php +++ b/resources/views/layouts/base_portal.blade.php @@ -4,7 +4,7 @@ @include('partials.header')
-
+
@yield('inner_content')
diff --git a/resources/views/pages/pdf/qr.blade.php b/resources/views/pages/pdf/qr.blade.php new file mode 100644 index 00000000..2ae2eddc --- /dev/null +++ b/resources/views/pages/pdf/qr.blade.php @@ -0,0 +1,73 @@ + + + + order-qr-{{$order->marking}} + + + + + + @for ($i = 0; $i < 4; $i++) + + + + + @endfor + +
+ + + + + + + + + +
+ id.'}') }}" /> +
+
#{{$order->marking}}
+
+
+ + + + + + {{----}} + {{----}} + {{----}} + + + + +
+

@if(strtolower($delivery_address->state) === 'sabah') SB/ @elseif(strtolower($delivery_address->state) === 'sarawak') SRW/ @endif{{$company->marking}}/{{$order->marking}}

+
--}} + {{--
{{$delivery_address->street_one.' '.$delivery_address->street_two.' '.$delivery_address->city.' '.$delivery_address->post_code.' '.$delivery_address->state}}
--}} + {{--
+

仓库地址:

+

{{$warehouse_address->street_one.' '.$warehouse_address->street_two.' '.$warehouse_address->city.' '.$warehouse_address->state.' 邮编:'.$warehouse_address->post_code}}

+

联系:{{$warehouse_contact[0]->contact.' '.$warehouse_contact[0]->name}} @if(array_key_exists(1, $warehouse_contact)) / {{$warehouse_contact[1]->contact.' '.$warehouse_contact[1]->name}} @endif

+
+
+ + + diff --git a/resources/views/partials/header.blade.php b/resources/views/partials/header.blade.php index 1aca0200..aa643c54 100644 --- a/resources/views/partials/header.blade.php +++ b/resources/views/partials/header.blade.php @@ -1,8 +1,8 @@ -