diff --git a/src/Jobs/Industry/Corporation/Mining/ObserverDetails.php b/src/Jobs/Industry/Corporation/Mining/ObserverDetails.php index 862edaf3..a04f1b3f 100644 --- a/src/Jobs/Industry/Corporation/Mining/ObserverDetails.php +++ b/src/Jobs/Industry/Corporation/Mining/ObserverDetails.php @@ -23,6 +23,7 @@ namespace Seat\Eveapi\Jobs\Industry\Corporation\Mining; use Seat\Eveapi\Jobs\AbstractAuthCorporationJob; +use Seat\Eveapi\Models\Industry\CorporationIndustryMiningExtraction; use Seat\Eveapi\Models\Industry\CorporationIndustryMiningObserver; use Seat\Eveapi\Models\Industry\CorporationIndustryMiningObserverData; @@ -33,6 +34,8 @@ */ class ObserverDetails extends AbstractAuthCorporationJob { + const EXTRACTION_FIND_RANGE = 5; + /** * @var string */ @@ -92,8 +95,7 @@ public function handle() return; collect($detail)->each(function ($data) use ($observer) { - - CorporationIndustryMiningObserverData::firstOrNew([ + $entry = CorporationIndustryMiningObserverData::firstOrNew([ 'corporation_id' => $this->getCorporationId(), 'observer_id' => $observer->observer_id, 'recorded_corporation_id' => $data->recorded_corporation_id, @@ -102,8 +104,13 @@ public function handle() 'last_updated' => $data->last_updated, ])->fill([ 'quantity' => $data->quantity, - ])->save(); - + ]); + if (! $entry->id) { + $entry->fill([ + 'extraction_id' => $this->findExtraction($observer->observer_id, $data->last_updated), + ]); + } + $entry->save(); }); if (! $this->nextPage($detail->pages)) @@ -114,4 +121,27 @@ public function handle() $this->page = 1; }); } + + /** + * @param $observer_id + * @param $last_updated + * @return int + */ + private function findExtraction($observer_id, $last_updated) + { + $result = 0; + $minDate = carbon($last_updated)->subDays(self::EXTRACTION_FIND_RANGE); + $maxDate = carbon($last_updated)->addDays(1); + + $extraction = CorporationIndustryMiningExtraction::select() + ->where('structure_id', $observer_id) + ->whereBetween('chunk_arrival_time', [$minDate, $maxDate]) + ->get() + ->first(); + if ($extraction) { + $result = $extraction->id; + } + + return $result; + } } diff --git a/src/Models/Industry/CorporationIndustryMiningExtraction.php b/src/Models/Industry/CorporationIndustryMiningExtraction.php index 7536fa63..770fb778 100644 --- a/src/Models/Industry/CorporationIndustryMiningExtraction.php +++ b/src/Models/Industry/CorporationIndustryMiningExtraction.php @@ -145,4 +145,12 @@ public function extraction_length() { return carbon($this->chunk_arrival_time)->diffInSeconds($this->extraction_start_time) / 3600.0; } + + /** + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function entries() + { + return $this->hasMany(CorporationIndustryMiningObserverData::class, 'extraction_id', 'id'); + } } diff --git a/src/Models/Industry/CorporationIndustryMiningObserver.php b/src/Models/Industry/CorporationIndustryMiningObserver.php index f769d22a..2c20bf42 100644 --- a/src/Models/Industry/CorporationIndustryMiningObserver.php +++ b/src/Models/Industry/CorporationIndustryMiningObserver.php @@ -55,11 +55,15 @@ public function entries() } /** + * Returns all entries associated with athanor. + * Use CorporationIndustryMiningExtraction::entries instead + * as it is linked to single extraction. + * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function extraction() { - return $this->hasOne(CorporationIndustryMiningExtraction::class, 'observer_id', 'observer_id') + return $this->hasOne(CorporationIndustryMiningExtraction::class, 'structure_id', 'observer_id') ->withDefault(); } } diff --git a/src/Models/Industry/CorporationIndustryMiningObserverData.php b/src/Models/Industry/CorporationIndustryMiningObserverData.php index 7d08f023..c291b866 100644 --- a/src/Models/Industry/CorporationIndustryMiningObserverData.php +++ b/src/Models/Industry/CorporationIndustryMiningObserverData.php @@ -23,6 +23,9 @@ namespace Seat\Eveapi\Models\Industry; use Illuminate\Database\Eloquent\Model; +use Seat\Eveapi\Models\Character\CharacterInfo; +use Seat\Eveapi\Models\Sde\InvType; +use Seat\Eveapi\Models\Universe\UniverseName; /** * Class CorporationIndustryMiningObserverData. @@ -50,4 +53,39 @@ class CorporationIndustryMiningObserverData extends Model * @var bool */ public $incrementing = true; + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function extraction() + { + return $this->belongsTo(CorporationIndustryMiningExtraction::class, 'extraction_id', 'id'); + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function character() + { + return $this->belongsTo(CharacterInfo::class, 'character_id', 'character_id'); + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function universe_name() + { + return $this->belongsTo(UniverseName::class, 'character_id', 'entity_id'); + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\HasOne + */ + public function type() + { + return $this->hasOne(InvType::class, 'typeID', 'type_id') + ->withDefault([ + 'typeName' => trans('seat::web.unknown'), + ]); + } } diff --git a/src/database/migrations/2021_12_21_180100_add_extraction_id_to_corporation_industry_mining_observer_data.php b/src/database/migrations/2021_12_21_180100_add_extraction_id_to_corporation_industry_mining_observer_data.php new file mode 100644 index 00000000..bc0324c6 --- /dev/null +++ b/src/database/migrations/2021_12_21_180100_add_extraction_id_to_corporation_industry_mining_observer_data.php @@ -0,0 +1,45 @@ +integer('extraction_id')->default(0); + }); + } + + public function down() + { + Schema::table('corporation_industry_mining_observer_data', function (Blueprint $table) { + $table->dropColumn('extraction_id'); + }); + } +}