| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | <?php
namespace App\Factories;
use App\Models\Company;
use Illuminate\Support\Carbon;
class ReportDateFactory
{
    public Carbon $fiscalYearStartDate;
    public Carbon $fiscalYearEndDate;
    public string $defaultDateRange;
    public Carbon $defaultStartDate;
    public Carbon $defaultEndDate;
    public Carbon $earliestTransactionDate;
    protected Company $company;
    public function __construct(Company $company)
    {
        $this->company = $company;
        $this->buildReportDates();
    }
    protected function buildReportDates(): void
    {
        $fiscalYearStartDate = Carbon::parse($this->company->locale->fiscalYearStartDate())->startOfDay();
        $fiscalYearEndDate = Carbon::parse($this->company->locale->fiscalYearEndDate())->endOfDay();
        $defaultDateRange = 'FY-' . now()->year;
        $defaultStartDate = $fiscalYearStartDate->startOfDay();
        $defaultEndDate = $fiscalYearEndDate->isFuture() ? now()->endOfDay() : $fiscalYearEndDate->endOfDay();
        // Calculate the earliest transaction date based on the company's transactions
        $earliestTransactionDate = $this->company->transactions()->min('posted_at')
            ? Carbon::parse($this->company->transactions()->min('posted_at'))->startOfDay()
            : $defaultStartDate;
        // Assign values to properties
        $this->fiscalYearStartDate = $fiscalYearStartDate;
        $this->fiscalYearEndDate = $fiscalYearEndDate;
        $this->defaultDateRange = $defaultDateRange;
        $this->defaultStartDate = $defaultStartDate;
        $this->defaultEndDate = $defaultEndDate;
        $this->earliestTransactionDate = $earliestTransactionDate;
    }
    public function refresh(): self
    {
        $this->buildReportDates();
        return $this;
    }
    public static function create(Company $company): self
    {
        return new static($company);
    }
}
 |