Ttn.php 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  5. use Illuminate\Support\Facades\DB;
  6. class Ttn extends Model
  7. {
  8. protected $fillable = [
  9. 'year',
  10. 'ttn_number',
  11. 'ttn_number_suffix',
  12. 'order_number',
  13. 'order_date',
  14. 'departure_date',
  15. 'order_sum',
  16. 'skus',
  17. 'file_id',
  18. ];
  19. public function file(): BelongsTo
  20. {
  21. return $this->belongsTo(File::class);
  22. }
  23. public static function getNextTtnNumber(): int
  24. {
  25. return Setting::getInt(Setting::KEY_TTN_NEXT_NUMBER, static::detectNextTtnNumber()) ?? 1;
  26. }
  27. public static function reserveNextTtnNumber(): int
  28. {
  29. return DB::transaction(static function (): int {
  30. $setting = Setting::query()
  31. ->lockForUpdate()
  32. ->firstOrNew(['key' => Setting::KEY_TTN_NEXT_NUMBER]);
  33. $nextNumber = (int) ($setting->value ?: static::detectNextTtnNumber());
  34. $setting->value = (string) ($nextNumber + 1);
  35. $setting->save();
  36. return $nextNumber;
  37. });
  38. }
  39. private static function detectNextTtnNumber(): int
  40. {
  41. return (int) static::query()
  42. ->where('year', now()->year)
  43. ->max('ttn_number') + 1;
  44. }
  45. }