123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- <?php
-
- namespace Database\Factories\Common;
-
- use App\Enums\Accounting\AccountCategory;
- use App\Enums\Accounting\AccountType;
- use App\Enums\Accounting\AdjustmentType;
- use App\Enums\Common\OfferingType;
- use App\Models\Accounting\Account;
- use App\Models\Accounting\Adjustment;
- use App\Models\Common\Offering;
- use Illuminate\Database\Eloquent\Factories\Factory;
-
- /**
- * @extends Factory<Offering>
- */
- class OfferingFactory extends Factory
- {
- /**
- * The name of the factory's corresponding model.
- */
- protected $model = Offering::class;
-
- /**
- * Define the model's default state.
- *
- * @return array<string, mixed>
- */
- public function definition(): array
- {
- return [
- 'company_id' => 1,
- 'name' => $this->faker->words(3, true),
- 'description' => $this->faker->sentence,
- 'type' => $this->faker->randomElement(OfferingType::cases()),
- 'price' => $this->faker->numberBetween(5, 1000),
- 'sellable' => false,
- 'purchasable' => false,
- 'income_account_id' => null,
- 'expense_account_id' => null,
- 'created_by' => 1,
- 'updated_by' => 1,
- ];
- }
-
- public function withSalesAdjustments(): self
- {
- return $this->afterCreating(function (Offering $offering) {
- $incomeAccount = Account::query()
- ->where('company_id', $offering->company_id)
- ->where('category', AccountCategory::Revenue)
- ->where('type', AccountType::OperatingRevenue)
- ->inRandomOrder()
- ->firstOrFail();
-
- $offering->updateQuietly([
- 'sellable' => true,
- 'income_account_id' => $incomeAccount->id,
- ]);
-
- $adjustments = $offering->company?->adjustments()
- ->where('type', AdjustmentType::Sales)
- ->pluck('id');
-
- $adjustmentsToAttach = $adjustments->isNotEmpty()
- ? $adjustments->random(min(2, $adjustments->count()))
- : Adjustment::factory()->salesTax()->count(2)->create()->pluck('id');
-
- $offering->salesAdjustments()->attach($adjustmentsToAttach);
- });
- }
-
- public function withPurchaseAdjustments(): self
- {
- return $this->afterCreating(function (Offering $offering) {
- $expenseAccount = Account::query()
- ->where('company_id', $offering->company_id)
- ->where('category', AccountCategory::Expense)
- ->where('type', AccountType::OperatingExpense)
- ->inRandomOrder()
- ->firstOrFail();
-
- $offering->updateQuietly([
- 'purchasable' => true,
- 'expense_account_id' => $expenseAccount->id,
- ]);
-
- $adjustments = $offering->company?->adjustments()
- ->where('type', AdjustmentType::Purchase)
- ->pluck('id');
-
- $adjustmentsToAttach = $adjustments->isNotEmpty()
- ? $adjustments->random(min(2, $adjustments->count()))
- : Adjustment::factory()->purchaseTax()->count(2)->create()->pluck('id');
-
- $offering->purchaseAdjustments()->attach($adjustmentsToAttach);
- });
- }
- }
|