from->diffInDays($this->to) + 1; // If it's a full month range (e.g. 1st to end of month), shift by months if ($this->isFullMonthRange()) { $months = $this->from->diffInMonths($this->to->copy()->addDay()); $previousFrom = $this->from->copy()->subMonths($months); $previousTo = $previousFrom->copy()->endOfMonth(); return new self($previousFrom, $previousTo); } return new self( $this->from->copy()->subDays($days), $this->from->copy()->subDay() ); } private function isFullMonthRange(): bool { return $this->from->day === 1 && $this->to->isLastOfMonth(); } public static function fromRequest(array $validated): self { return new self( Carbon::parse($validated['from']), Carbon::parse($validated['to']) ); } }