Skip to content

Commit

Permalink
Merge pull request #14227 from snipe/fixes/bulk_update_by_audit_interval
Browse files Browse the repository at this point in the history
Switch to bulk updating to handle audit interval updates
  • Loading branch information
snipe committed Feb 6, 2024
2 parents a43183f + bf674a0 commit 1630e4b
Showing 1 changed file with 14 additions and 13 deletions.
27 changes: 14 additions & 13 deletions app/Http/Controllers/SettingsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Validator;
use Carbon\Carbon;

/**
* This controller handles all actions related to Settings for
Expand Down Expand Up @@ -636,21 +637,21 @@ public function postAlerts(Request $request)
// Check if the audit interval has changed - if it has, we want to update ALL of the assets audit dates
if ($request->input('audit_interval') != $setting->audit_interval) {

// Be careful - this could be a negative number
// This could be a negative number if the user is trying to set the audit interval to a lower number than it was before
$audit_diff_months = ((int)$request->input('audit_interval') - (int)($setting->audit_interval));

// Batch update the dates. We have to use this method to avoid time limit exceeded errors on very large datasets,
// but it DOES mean this change doesn't get logged in the action logs, since it skips the observer.
// @see https://stackoverflow.com/questions/54879160/laravel-observer-not-working-on-bulk-insert
$affected = Asset::whereNotNull('next_audit_date')
->whereNull('deleted_at')
->update(
['next_audit_date' => DB::raw('DATE_ADD(next_audit_date, INTERVAL '.$audit_diff_months.' MONTH)')]
);

\Log::debug($affected .' assets affected by audit interval update');


// Grab all assets that have an existing next_audit_date, chunking to handle very large datasets
Asset::whereNotNull('next_audit_date')->chunk(200, function ($assets) use ($audit_diff_months) {

// Update assets' next_audit_date values
foreach ($assets as $asset) {
if ($asset->next_audit_date != '') {
$old_next_audit = new \DateTime($asset->next_audit_date);
$asset->next_audit_date = $old_next_audit->modify($audit_diff_months . ' month')->format('Y-m-d');
$asset->forceSave();
}
}
});
}

$alert_email = rtrim($request->input('alert_email'), ',');
Expand Down

0 comments on commit 1630e4b

Please sign in to comment.