From cf572a4b25c6ba767552241a6cf333124038f226 Mon Sep 17 00:00:00 2001 From: Raul Perusquia Date: Fri, 31 May 2024 21:30:37 +0200 Subject: [PATCH] =?UTF-8?q?#86=20Migrate=20Aurora=20Barcodes=20?= =?UTF-8?q?=F0=9F=8D=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Actions/Helpers/Barcode/StoreBarcode.php | 47 +++++++++++++-- app/Actions/Helpers/Barcode/UpdateBarcode.php | 45 ++++++++++----- .../HumanResources/Clocking/StoreClocking.php | 6 +- .../Aurora/FetchAuroraBarcodes.php | 57 +++++++++++++++++++ app/Actions/Studio/Media/SaveModelImage.php | 2 +- .../Helpers/Barcode/BarcodeStatusEnum.php | 20 +++++++ app/Enums/Helpers/Barcode/BarcodeTypeEnum.php | 18 ++++++ app/Models/CRM/Customer.php | 1 + app/Models/Catalogue/Product.php | 2 +- app/Models/Goods/TradeUnit.php | 9 ++- app/Models/Helpers/Barcode.php | 17 +++++- app/Models/Ordering/Order.php | 2 + app/Models/Procurement/PurchaseOrder.php | 2 + app/Models/Procurement/StockDelivery.php | 2 + app/Models/SupplyChain/Stock.php | 3 +- app/Models/SupplyChain/Supplier.php | 1 + app/Models/SysAdmin/Group.php | 7 +++ app/Models/Traits/InGroup.php | 20 +++++++ .../Aurora/FetchAuroraBarcode.php | 42 ++++++++++++++ .../AuroraOrganisationService.php | 6 ++ .../SourceOrganisationService.php | 2 + .../WowsbarOrganisationService.php | 5 ++ ...023_04_17_071248_create_barcodes_table.php | 15 +++-- ...071917_create_model_has_barcode_table.php} | 8 ++- get_aurora_db.sh | 2 +- 25 files changed, 304 insertions(+), 37 deletions(-) create mode 100644 app/Actions/SourceFetch/Aurora/FetchAuroraBarcodes.php create mode 100644 app/Enums/Helpers/Barcode/BarcodeStatusEnum.php create mode 100644 app/Enums/Helpers/Barcode/BarcodeTypeEnum.php create mode 100644 app/Models/Traits/InGroup.php create mode 100644 app/Services/Organisation/Aurora/FetchAuroraBarcode.php rename database/migrations/{2023_04_17_071917_create_barcodeable_table.php => 2023_04_17_071917_create_model_has_barcode_table.php} (68%) diff --git a/app/Actions/Helpers/Barcode/StoreBarcode.php b/app/Actions/Helpers/Barcode/StoreBarcode.php index 2f872f8f23..9bd5f4bd9a 100644 --- a/app/Actions/Helpers/Barcode/StoreBarcode.php +++ b/app/Actions/Helpers/Barcode/StoreBarcode.php @@ -7,15 +7,52 @@ namespace App\Actions\Helpers\Barcode; +use App\Actions\GrpAction; +use App\Enums\Helpers\Barcode\BarcodeStatusEnum; +use App\Enums\Helpers\Barcode\BarcodeTypeEnum; use App\Models\Helpers\Barcode; -use Lorisleiva\Actions\Concerns\AsAction; +use App\Models\SysAdmin\Group; +use Illuminate\Validation\Rule; +use Lorisleiva\Actions\ActionRequest; -class StoreBarcode +class StoreBarcode extends GrpAction { - use AsAction; + public function handle(Group $group, $modelData): Barcode + { + /** @var Barcode $barcode */ + $barcode = $group->barcodes()->create($modelData); + + return $barcode; + } + + public function authorize(ActionRequest $request): bool + { + if ($this->asAction) { + return true; + } + + return $request->user()->hasPermissionTo("goods.edit"); + } + + public function rules(): array + { + return [ + 'number' => ['required', 'numeric'], + 'note' => ['sometimes', 'nullable', 'string', 'max:1000'], + 'data' => ['sometimes', 'nullable', 'array'], + 'status' => ['required', Rule::enum(BarcodeStatusEnum::class)], + 'type' => ['required', Rule::enum(BarcodeTypeEnum::class)], + 'source_id' => ['sometimes', 'required', 'string', 'max:255'], + 'assigned_at' => ['sometimes', 'nullable', 'date'], - public function handle(Barcode $barcode, $modelData): Barcode + ]; + } + + public function action(Group $group, array $modelData): Barcode { - return $barcode->create($modelData); + $this->asAction = true; + $this->initialisation($group, $modelData); + + return $this->handle($group, $this->validatedData); } } diff --git a/app/Actions/Helpers/Barcode/UpdateBarcode.php b/app/Actions/Helpers/Barcode/UpdateBarcode.php index 3d77d37c0f..f0791a57f9 100644 --- a/app/Actions/Helpers/Barcode/UpdateBarcode.php +++ b/app/Actions/Helpers/Barcode/UpdateBarcode.php @@ -7,44 +7,61 @@ namespace App\Actions\Helpers\Barcode; +use App\Actions\GrpAction; use App\Actions\Traits\WithActionUpdate; +use App\Enums\Helpers\Barcode\BarcodeStatusEnum; use App\Http\Resources\Helpers\BarcodeResource; use App\Models\Helpers\Barcode; +use Illuminate\Validation\Rule; use Lorisleiva\Actions\ActionRequest; -class UpdateBarcode +class UpdateBarcode extends GrpAction { use WithActionUpdate; + private Barcode $barcode; + public function handle(Barcode $barcode, array $modelData): Barcode { return $this->update($barcode, $modelData, ['data']); } - // public function authorize(ActionRequest $request): bool - // { - // return $request->user()->hasPermissionTo("inventory.warehouses.edit"); - // } + public function authorize(ActionRequest $request): bool + { + if ($this->asAction) { + return true; + } + + return $request->user()->hasPermissionTo("goods.edit"); + } public function rules(): array { return [ - 'slug' => ['sometimes', 'required'], - 'type' => ['sometimes', 'required'], - 'status' => ['sometimes', 'required'], - 'number' => ['sometimes', 'required'], - 'assigned_at' => ['sometimes', 'required'], - 'data' => ['sometimes', 'required'], + 'number' => ['sometimes', 'required', 'numeric'], + 'note' => ['sometimes', 'nullable', 'string', 'max:1000'], + 'data' => ['sometimes', 'nullable', 'array'], + 'status' => ['sometimes', 'required', Rule::enum(BarcodeStatusEnum::class)], + + ]; } - public function asController(Barcode $barcode, ActionRequest $request): Barcode { - $request->validate(); - return $this->handle($barcode, $request->all()); + $this->initialisation(app('group'), $request); + + return $this->handle($barcode, $request->validated()); } + public function action(Barcode $barcode, array $modelData): Barcode + { + $this->asAction = true; + $this->barcode = $barcode; + $this->initialisation($barcode->group, $modelData); + + return $this->handle($barcode, $this->validatedData); + } public function jsonResponse(Barcode $barcode): BarcodeResource { diff --git a/app/Actions/HumanResources/Clocking/StoreClocking.php b/app/Actions/HumanResources/Clocking/StoreClocking.php index 09415e5b04..8ec02ff1cc 100644 --- a/app/Actions/HumanResources/Clocking/StoreClocking.php +++ b/app/Actions/HumanResources/Clocking/StoreClocking.php @@ -185,9 +185,7 @@ public function prepareForValidation(): void public function action(Organisation|User|Employee|Guest $generator, ClockingMachine|Workplace $parent, Employee|Guest $subject, array $modelData): Clocking { $this->asAction = true; - $this->setRawAttributes($modelData); - $validatedData = $this->validateAttributes(); - - return $this->handle($generator, $parent, $subject, $validatedData); + $this->initialisation($parent->organisation, $modelData); + return $this->handle($generator, $parent, $subject, $this->validatedData); } } diff --git a/app/Actions/SourceFetch/Aurora/FetchAuroraBarcodes.php b/app/Actions/SourceFetch/Aurora/FetchAuroraBarcodes.php new file mode 100644 index 0000000000..23b1609026 --- /dev/null +++ b/app/Actions/SourceFetch/Aurora/FetchAuroraBarcodes.php @@ -0,0 +1,57 @@ + + * Created: Fri, 31 May 2024 17:14:23 Central European Summer Time, Mijas Costa, Spain + * Copyright (c) 2024, Raul A Perusquia Flores + */ + +namespace App\Actions\SourceFetch\Aurora; + +use App\Actions\Helpers\Barcode\StoreBarcode; +use App\Actions\Helpers\Barcode\UpdateBarcode; +use App\Models\Helpers\Barcode; +use App\Services\Organisation\SourceOrganisationService; +use Illuminate\Database\Query\Builder; +use Illuminate\Support\Facades\DB; + +class FetchAuroraBarcodes extends FetchAuroraAction +{ + public string $commandSignature = 'fetch:barcodes {organisations?*} {--s|source_id=} {--d|db_suffix=}'; + + public function handle(SourceOrganisationService $organisationSource, int $organisationSourceId): ?Barcode + { + if ($barcodeData = $organisationSource->fetchBarcode($organisationSourceId)) { + + if ($barcode = Barcode::where('source_id', $barcodeData['barcode']['source_id'])->first()) { + $barcode = UpdateBarcode::make()->action( + barcode: $barcode, + modelData: $barcodeData['barcode'] + ); + } else { + $barcode = StoreBarcode::make()->action( + group: $organisationSource->getOrganisation()->group, + modelData: $barcodeData['barcode'], + ); + } + + return $barcode; + } + + return null; + } + + public function getModelsQuery(): Builder + { + return DB::connection('aurora') + ->table('Barcode Dimension') + ->select('Barcode Key as source_id') + ->orderBy('source_id'); + } + + public function count(): ?int + { + return DB::connection('aurora')->table('Barcode Dimension')->count(); + } + + +} diff --git a/app/Actions/Studio/Media/SaveModelImage.php b/app/Actions/Studio/Media/SaveModelImage.php index 54f295019e..74fa12345f 100644 --- a/app/Actions/Studio/Media/SaveModelImage.php +++ b/app/Actions/Studio/Media/SaveModelImage.php @@ -32,7 +32,7 @@ public function handle( $checksum = md5_file($imageData['path']); - if ($oldImage && $oldImage->checksum == $checksum ) { + if ($oldImage && $oldImage->checksum == $checksum) { return $model; } diff --git a/app/Enums/Helpers/Barcode/BarcodeStatusEnum.php b/app/Enums/Helpers/Barcode/BarcodeStatusEnum.php new file mode 100644 index 0000000000..d920b11c08 --- /dev/null +++ b/app/Enums/Helpers/Barcode/BarcodeStatusEnum.php @@ -0,0 +1,20 @@ + + * Created: Fri, 31 May 2024 20:15:32 Central European Summer Time, Mijas Costa, Spain + * Copyright (c) 2024, Raul A Perusquia Flores + */ + +namespace App\Enums\Helpers\Barcode; + +use App\Enums\EnumHelperTrait; + +enum BarcodeStatusEnum: string +{ + use EnumHelperTrait; + + case AVAILABLE = 'available'; + case USED = 'used'; + case RESERVED = 'reserved'; + +} diff --git a/app/Enums/Helpers/Barcode/BarcodeTypeEnum.php b/app/Enums/Helpers/Barcode/BarcodeTypeEnum.php new file mode 100644 index 0000000000..b4cf8a8f71 --- /dev/null +++ b/app/Enums/Helpers/Barcode/BarcodeTypeEnum.php @@ -0,0 +1,18 @@ + + * Created: Fri, 31 May 2024 20:15:32 Central European Summer Time, Mijas Costa, Spain + * Copyright (c) 2024, Raul A Perusquia Flores + */ + +namespace App\Enums\Helpers\Barcode; + +use App\Enums\EnumHelperTrait; + +enum BarcodeTypeEnum: string +{ + use EnumHelperTrait; + + case EAN = 'ean'; + +} diff --git a/app/Models/CRM/Customer.php b/app/Models/CRM/Customer.php index 2bb0d5e11f..87d98577ab 100644 --- a/app/Models/CRM/Customer.php +++ b/app/Models/CRM/Customer.php @@ -92,6 +92,7 @@ * @property-read Address|null $address * @property-read Collection $addresses * @property-read Collection $appointments + * @property-read MediaCollection $attachments * @property-read Collection $audits * @property-read Collection $clients * @property-read Address|null $deliveryAddress diff --git a/app/Models/Catalogue/Product.php b/app/Models/Catalogue/Product.php index 90ab9ea111..2f05c6bccc 100644 --- a/app/Models/Catalogue/Product.php +++ b/app/Models/Catalogue/Product.php @@ -174,7 +174,7 @@ public function stats(): HasOne public function barcode(): MorphToMany { - return $this->morphToMany(Barcode::class, 'barcodeable'); + return $this->morphToMany(Barcode::class, 'model', 'model_has_barcode')->withTimestamps(); } public function outers(): HasMany diff --git a/app/Models/Goods/TradeUnit.php b/app/Models/Goods/TradeUnit.php index 8f13093d8d..145463e13d 100644 --- a/app/Models/Goods/TradeUnit.php +++ b/app/Models/Goods/TradeUnit.php @@ -8,6 +8,7 @@ namespace App\Models\Goods; use App\Models\Catalogue\Product; +use App\Models\Helpers\Barcode; use App\Models\SupplyChain\Stock; use App\Models\SysAdmin\Group; use App\Models\Traits\HasImage; @@ -18,6 +19,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; use Spatie\MediaLibrary\HasMedia; @@ -34,7 +36,7 @@ * @property string $code * @property string|null $name * @property string|null $description - * @property string|null $barcode + * @property Collection $barcode * @property float|null $gross_weight in kilograms include packing * @property float|null $net_weight in kilograms * @property array|null $dimensions @@ -103,4 +105,9 @@ public function products(): BelongsToMany { return $this->belongsToMany(Product::class); } + + public function barcode(): MorphToMany + { + return $this->morphToMany(Barcode::class, 'mode', 'model_has_barcode')->withTimestamps(); + } } diff --git a/app/Models/Helpers/Barcode.php b/app/Models/Helpers/Barcode.php index bb624de6df..08058cbcde 100644 --- a/app/Models/Helpers/Barcode.php +++ b/app/Models/Helpers/Barcode.php @@ -8,7 +8,9 @@ namespace App\Models\Helpers; use App\Models\Catalogue\Product; +use App\Models\Goods\TradeUnit; use App\Models\SupplyChain\Stock; +use App\Models\Traits\InGroup; use Eloquent; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -22,17 +24,22 @@ * App\Models\Helpers\Barcode * * @property int $id + * @property int $group_id * @property string $slug * @property string $type * @property string $status * @property string $number + * @property string|null $note * @property string|null $assigned_at * @property array $data + * @property string|null $source_id * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $deleted_at + * @property-read \App\Models\SysAdmin\Group $group * @property-read Collection $product * @property-read Collection $stock + * @property-read Collection $tradeUnit * @method static Builder|Barcode newModelQuery() * @method static Builder|Barcode newQuery() * @method static Builder|Barcode onlyTrashed() @@ -45,6 +52,7 @@ class Barcode extends Model { use SoftDeletes; use HasSlug; + use InGroup; protected $casts = [ 'data' => 'array', @@ -71,11 +79,16 @@ public function getRouteKeyName(): string public function stock(): MorphToMany { - return $this->morphedByMany(Stock::class, 'barcodeable'); + return $this->morphedByMany(Stock::class, 'model', 'model_has_barcode'); + } + + public function tradeUnit(): MorphToMany + { + return $this->morphedByMany(TradeUnit::class, 'model', 'model_has_barcode'); } public function product(): MorphToMany { - return $this->morphedByMany(Product::class, 'barcodeable'); + return $this->morphedByMany(Product::class, 'model', 'model_has_barcode'); } } diff --git a/app/Models/Ordering/Order.php b/app/Models/Ordering/Order.php index 655f7887d2..412934dc4a 100644 --- a/app/Models/Ordering/Order.php +++ b/app/Models/Ordering/Order.php @@ -89,6 +89,7 @@ * @property Carbon|null $deleted_at * @property string|null $source_id * @property-read Collection $addresses + * @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection $attachments * @property-read Address|null $billingAddress * @property-read Address|null $collectionAddress * @property-read \App\Models\CRM\Customer $customer @@ -98,6 +99,7 @@ * @property-read Collection $fixedAddresses * @property-read Group $group * @property-read Collection $invoices + * @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection $media * @property-read Organisation $organisation * @property-read Collection $payments * @property-read Shop $shop diff --git a/app/Models/Procurement/PurchaseOrder.php b/app/Models/Procurement/PurchaseOrder.php index fb76e21998..92720b2390 100644 --- a/app/Models/Procurement/PurchaseOrder.php +++ b/app/Models/Procurement/PurchaseOrder.php @@ -76,10 +76,12 @@ * @property string|null $source_id * @property-read Address|null $address * @property-read Collection $addresses + * @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection $attachments * @property-read Collection $audits * @property-read Currency $currency * @property-read \App\Models\SysAdmin\Group $group * @property-read Collection $items + * @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection $media * @property-read Organisation $organisation * @property-read Model|\Eloquent $parent * @method static \Database\Factories\Procurement\PurchaseOrderFactory factory($count = null, $state = []) diff --git a/app/Models/Procurement/StockDelivery.php b/app/Models/Procurement/StockDelivery.php index 857ed5b250..6248be3855 100644 --- a/app/Models/Procurement/StockDelivery.php +++ b/app/Models/Procurement/StockDelivery.php @@ -68,8 +68,10 @@ * @property string|null $source_id * @property-read Address|null $address * @property-read Collection $addresses + * @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection $attachments * @property-read \App\Models\SysAdmin\Group $group * @property-read Collection $items + * @property-read \Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection $media * @property-read Organisation $organisation * @property-read Model|\Eloquent $parent * @property-read Collection $purchaseOrders diff --git a/app/Models/SupplyChain/Stock.php b/app/Models/SupplyChain/Stock.php index d3d8812e85..b3336a6586 100644 --- a/app/Models/SupplyChain/Stock.php +++ b/app/Models/SupplyChain/Stock.php @@ -66,6 +66,7 @@ * @property Carbon|null $deleted_at * @property string|null $source_slug * @property string|null $source_id + * @property-read MediaCollection $attachments * @property-read Group $group * @property-read Media|null $image * @property-read MediaCollection $images @@ -175,6 +176,6 @@ public function images(): BelongsToMany public function barcode(): MorphToMany { - return $this->morphToMany(Barcode::class, 'barcodeable'); + return $this->morphToMany(Barcode::class, 'mode', 'model_has_barcode')->withTimestamps(); } } diff --git a/app/Models/SupplyChain/Supplier.php b/app/Models/SupplyChain/Supplier.php index 8b96c9a63d..9e1e8cd08f 100644 --- a/app/Models/SupplyChain/Supplier.php +++ b/app/Models/SupplyChain/Supplier.php @@ -68,6 +68,7 @@ * @property-read \App\Models\Helpers\Address|null $address * @property-read Collection $addresses * @property-read \App\Models\SupplyChain\Agent|null $agent + * @property-read MediaCollection $attachments * @property-read Collection $audits * @property-read Currency $currency * @property-read Group $group diff --git a/app/Models/SysAdmin/Group.php b/app/Models/SysAdmin/Group.php index ca1f8ebaed..ff91e5970d 100644 --- a/app/Models/SysAdmin/Group.php +++ b/app/Models/SysAdmin/Group.php @@ -16,6 +16,7 @@ use App\Models\CRM\WebUser; use App\Models\Fulfilment\RecurringBill; use App\Models\Goods\TradeUnit; +use App\Models\Helpers\Barcode; use App\Models\HumanResources\ClockingMachine; use App\Models\HumanResources\Employee; use App\Models\HumanResources\JobPosition; @@ -73,6 +74,7 @@ * @property-read \App\Models\SysAdmin\GroupAccountingStats|null $accountingStats * @property-read \Illuminate\Database\Eloquent\Collection $agents * @property-read \Illuminate\Database\Eloquent\Collection $artefacts + * @property-read \Illuminate\Database\Eloquent\Collection $barcodes * @property-read \Illuminate\Database\Eloquent\Collection $clockingMachines * @property-read \Illuminate\Database\Eloquent\Collection $collectionCategories * @property-read \Illuminate\Database\Eloquent\Collection $collections @@ -396,4 +398,9 @@ public function clockingMachines(): HasMany return $this->hasMany(ClockingMachine::class); } + public function barcodes(): HasMany + { + return $this->hasMany(Barcode::class); + } + } diff --git a/app/Models/Traits/InGroup.php b/app/Models/Traits/InGroup.php new file mode 100644 index 0000000000..cfa7e8e8f4 --- /dev/null +++ b/app/Models/Traits/InGroup.php @@ -0,0 +1,20 @@ + + * Created: Fri, 31 May 2024 21:28:43 Central European Summer Time, Mijas Costa, Spain + * Copyright (c) 2024, Raul A Perusquia Flores + */ + +namespace App\Models\Traits; + +use App\Models\SysAdmin\Group; +use Illuminate\Database\Eloquent\Relations\BelongsTo; + +trait InGroup +{ + public function group(): BelongsTo + { + return $this->belongsTo(Group::class); + } + +} diff --git a/app/Services/Organisation/Aurora/FetchAuroraBarcode.php b/app/Services/Organisation/Aurora/FetchAuroraBarcode.php new file mode 100644 index 0000000000..caea89971f --- /dev/null +++ b/app/Services/Organisation/Aurora/FetchAuroraBarcode.php @@ -0,0 +1,42 @@ + + * Created: Fri, 31 May 2024 17:13:33 Central European Summer Time, Mijas Costa, Spain + * Copyright (c) 2024, Raul A Perusquia Flores + */ + +namespace App\Services\Organisation\Aurora; + +use App\Enums\Helpers\Barcode\BarcodeStatusEnum; +use App\Enums\Helpers\Barcode\BarcodeTypeEnum; +use Illuminate\Support\Facades\DB; + +class FetchAuroraBarcode extends FetchAurora +{ + protected function parseModel(): void + { + $status = match ($this->auroraModelData->{'Barcode Status'}) { + 'Used' => BarcodeStatusEnum::USED, + 'Reserved' => BarcodeStatusEnum::RESERVED, + default => BarcodeStatusEnum::AVAILABLE + }; + + $this->parsedData['barcode'] = [ + 'number' => $this->auroraModelData->{'Barcode Number'}, + 'source_id' => $this->organisation->id.':'.$this->auroraModelData->{'Barcode Key'}, + 'type' => BarcodeTypeEnum::EAN, + 'status' => $status, + 'note' => $this->auroraModelData->{'Barcode Sticky Note'}, + 'assigned_at' => $this->auroraModelData->{'Barcode Used From'} ? $this->parseDatetime($this->auroraModelData->{'Barcode Used From'}) : null + ]; + + } + + + protected function fetchData($id): object|null + { + return DB::connection('aurora') + ->table('Barcode Dimension') + ->where('Barcode Key', $id)->first(); + } +} diff --git a/app/Services/Organisation/AuroraOrganisationService.php b/app/Services/Organisation/AuroraOrganisationService.php index 4f03950a88..c8973e29d2 100644 --- a/app/Services/Organisation/AuroraOrganisationService.php +++ b/app/Services/Organisation/AuroraOrganisationService.php @@ -13,6 +13,7 @@ use App\Models\SysAdmin\Organisation; use App\Services\Organisation\Aurora\FetchAuroraAgent; use App\Services\Organisation\Aurora\FetchAuroraArtefact; +use App\Services\Organisation\Aurora\FetchAuroraBarcode; use App\Services\Organisation\Aurora\FetchAuroraClockingMachine; use App\Services\Organisation\Aurora\FetchAuroraCustomer; use App\Services\Organisation\Aurora\FetchAuroraCustomerClient; @@ -365,4 +366,9 @@ public function fetchArtefact($id): array return (new FetchAuroraArtefact($this))->fetch($id); } + public function fetchBarcode($id): array + { + return (new FetchAuroraBarcode($this))->fetch($id); + } + } diff --git a/app/Services/Organisation/SourceOrganisationService.php b/app/Services/Organisation/SourceOrganisationService.php index e14f759fda..58f18b96e7 100644 --- a/app/Services/Organisation/SourceOrganisationService.php +++ b/app/Services/Organisation/SourceOrganisationService.php @@ -125,4 +125,6 @@ public function fetchTimesheet($id); public function fetchClockingMachine($id); + public function fetchBarcode($id); + } diff --git a/app/Services/Organisation/WowsbarOrganisationService.php b/app/Services/Organisation/WowsbarOrganisationService.php index caf37844ef..087aab627b 100644 --- a/app/Services/Organisation/WowsbarOrganisationService.php +++ b/app/Services/Organisation/WowsbarOrganisationService.php @@ -318,4 +318,9 @@ public function fetchArtefact($id): ?array return null; } + public function fetchBarcode($id): ?array + { + return null; + } + } diff --git a/database/migrations/2023_04_17_071248_create_barcodes_table.php b/database/migrations/2023_04_17_071248_create_barcodes_table.php index 08c7a8e667..2c6cd0a265 100644 --- a/database/migrations/2023_04_17_071248_create_barcodes_table.php +++ b/database/migrations/2023_04_17_071248_create_barcodes_table.php @@ -5,6 +5,8 @@ * Copyright (c) 2023, Raul A Perusquia Flores */ +use App\Enums\Helpers\Barcode\BarcodeStatusEnum; +use App\Enums\Helpers\Barcode\BarcodeTypeEnum; use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; @@ -13,15 +15,20 @@ public function up(): void { Schema::create('barcodes', function (Blueprint $table) { - $table->id(); + $table->increments('id'); + $table->unsignedSmallInteger('group_id')->index(); + $table->foreign('group_id')->references('id')->on('groups')->onUpdate('cascade')->onDelete('cascade'); $table->string('slug')->unique()->collation('und_ns'); - $table->string('type'); - $table->string('status'); - $table->string('number'); + $table->string('type')->default(BarcodeTypeEnum::EAN->value)->index(); + $table->string('status')->default(BarcodeStatusEnum::AVAILABLE->value)->index(); + $table->string('number')->index(); + $table->string('note')->nullable(); $table->dateTimeTz('assigned_at')->nullable(); $table->jsonb('data'); + $table->string('source_id')->nullable()->unique(); $table->timestampsTz(); $table->softDeletesTz(); + $table->unique(['group_id', 'number']); }); } diff --git a/database/migrations/2023_04_17_071917_create_barcodeable_table.php b/database/migrations/2023_04_17_071917_create_model_has_barcode_table.php similarity index 68% rename from database/migrations/2023_04_17_071917_create_barcodeable_table.php rename to database/migrations/2023_04_17_071917_create_model_has_barcode_table.php index 1fece2111a..07d8b70d32 100644 --- a/database/migrations/2023_04_17_071917_create_barcodeable_table.php +++ b/database/migrations/2023_04_17_071917_create_model_has_barcode_table.php @@ -12,17 +12,19 @@ return new class () extends Migration { public function up(): void { - Schema::create('barcodeable', function (Blueprint $table) { + Schema::create('model_has_barcode', function (Blueprint $table) { $table->id(); $table->unsignedInteger('barcode_id')->index(); - $table->morphs('barcodeable'); + $table->string('model_type'); + $table->unsignedInteger('model_id'); $table->timestampsTz(); + $table->index(['model_type','model_id']); }); } public function down(): void { - Schema::dropIfExists('barcodeable'); + Schema::dropIfExists('model_has_barcode'); } }; diff --git a/get_aurora_db.sh b/get_aurora_db.sh index ebc30443fa..01058a208c 100755 --- a/get_aurora_db.sh +++ b/get_aurora_db.sh @@ -19,7 +19,7 @@ DB="$instance"_base DUMP_FILE="$DB".sql echo "🏁 $instance" echo " dumping 🥟" -mysqldump --no-tablespaces "$instance" 'Email Campaign Type Dimension' 'Email Campaign Dimension' 'Email Template Dimension' 'Email Blueprint Dimension' 'Published Email Template Dimension' 'Order Payment Bridge' 'Raw Material Dimension' 'Production Part Raw Material Bridge' 'Production Part Dimension' 'User Right Scope Bridge' 'Clocking Machine Dimension' 'Clocking Machine History Bridge' 'Timesheet Dimension' 'Timesheet Record Dimension' 'Customer History Bridge' 'Credit Transaction Fact' 'Deal Dimension' 'Deal Target Bridge' 'Deal History Bridge' 'Deal Campaign Dimension' 'Deal Component Dimension' 'Deal Campaign History Bridge' 'Deal Component History Bridge' 'Deal Component Customer Preference Bridge' 'Inventory Transaction Fact' 'Order Transaction Fact' 'Order No Product Transaction Fact' 'Product Dimension' 'Product History Dimension' 'Product Part Bridge' 'Invoice Dimension' 'Order Dimension' 'Delivery Note Dimension' 'Webpage Type Dimension' 'Customer Client Dimension' 'Attachment Bridge' 'Attachment Dimension' 'Page Store Dimension' 'Shipping Zone Schema Dimension' 'Shipping Zone Dimension' 'Charge Dimension' 'Customer Fulfilment Dimension' 'Fulfilment Delivery Dimension' 'Fulfilment Rent Transaction Fact' 'Fulfilment Transaction Fact' 'Fulfilment Asset Dimension' 'Customer Dimension' 'Customer Deleted Dimension' 'Prospect Dimension' 'Website User Dimension' 'User Group User Bridge' 'Picking Pipeline Dimension' 'Location Picking Pipeline Bridge' 'Product Category Dimension' 'Shipper Dimension' 'Purchase Order Deleted Dimension' 'Purchase Order Transaction Fact' 'Part Location Dimension' 'Part Category Dimension' 'Category Dimension' 'Category Bridge' 'Part Deleted Dimension' 'Supplier Deleted Dimension' 'Supplier Part Deleted Dimension' 'Warehouse Dimension' 'Warehouse Area Dimension' 'Location Dimension' 'Location Deleted Dimension' 'Agent Supplier Bridge' 'Supplier Dimension' 'Payment Account Store Bridge' 'Payment Dimension' 'Payment Account Dimension' 'Payment Service Provider Dimension' 'Website Dimension' 'Store Dimension' 'Staff Deleted Dimension' 'Image Dimension' 'Image Subject Bridge' 'Staff Role Bridge' 'Account Dimension' 'Account Data' 'Staff Dimension' 'User Dimension' 'Agent Dimension' 'Supplier Data' 'Supplier Part Dimension' 'Purchase Order Dimension' 'Supplier Delivery Dimension' 'Part Dimension' 'pika_fetch' 'pika_fetch_error' >"$DUMP_FILE" +mysqldump --no-tablespaces "$instance" 'Barcode Dimension' 'Barcode Asset Bridge' 'Email Campaign Type Dimension' 'Email Campaign Dimension' 'Email Template Dimension' 'Email Blueprint Dimension' 'Published Email Template Dimension' 'Order Payment Bridge' 'Raw Material Dimension' 'Production Part Raw Material Bridge' 'Production Part Dimension' 'User Right Scope Bridge' 'Clocking Machine Dimension' 'Clocking Machine History Bridge' 'Timesheet Dimension' 'Timesheet Record Dimension' 'Customer History Bridge' 'Credit Transaction Fact' 'Deal Dimension' 'Deal Target Bridge' 'Deal History Bridge' 'Deal Campaign Dimension' 'Deal Component Dimension' 'Deal Campaign History Bridge' 'Deal Component History Bridge' 'Deal Component Customer Preference Bridge' 'Inventory Transaction Fact' 'Order Transaction Fact' 'Order No Product Transaction Fact' 'Product Dimension' 'Product History Dimension' 'Product Part Bridge' 'Invoice Dimension' 'Order Dimension' 'Delivery Note Dimension' 'Webpage Type Dimension' 'Customer Client Dimension' 'Attachment Bridge' 'Attachment Dimension' 'Page Store Dimension' 'Shipping Zone Schema Dimension' 'Shipping Zone Dimension' 'Charge Dimension' 'Customer Fulfilment Dimension' 'Fulfilment Delivery Dimension' 'Fulfilment Rent Transaction Fact' 'Fulfilment Transaction Fact' 'Fulfilment Asset Dimension' 'Customer Dimension' 'Customer Deleted Dimension' 'Prospect Dimension' 'Website User Dimension' 'User Group User Bridge' 'Picking Pipeline Dimension' 'Location Picking Pipeline Bridge' 'Product Category Dimension' 'Shipper Dimension' 'Purchase Order Deleted Dimension' 'Purchase Order Transaction Fact' 'Part Location Dimension' 'Part Category Dimension' 'Category Dimension' 'Category Bridge' 'Part Deleted Dimension' 'Supplier Deleted Dimension' 'Supplier Part Deleted Dimension' 'Warehouse Dimension' 'Warehouse Area Dimension' 'Location Dimension' 'Location Deleted Dimension' 'Agent Supplier Bridge' 'Supplier Dimension' 'Payment Account Store Bridge' 'Payment Dimension' 'Payment Account Dimension' 'Payment Service Provider Dimension' 'Website Dimension' 'Store Dimension' 'Staff Deleted Dimension' 'Image Dimension' 'Image Subject Bridge' 'Staff Role Bridge' 'Account Dimension' 'Account Data' 'Staff Dimension' 'User Dimension' 'Agent Dimension' 'Supplier Data' 'Supplier Part Dimension' 'Purchase Order Dimension' 'Supplier Delivery Dimension' 'Part Dimension' 'pika_fetch' 'pika_fetch_error' >"$DUMP_FILE" echo " loading 🚡" mysql "$DB" < "$DUMP_FILE" echo " compressing 🗜️"