From b960a2120150e7800c262ab8f44ce5ec14a11984 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 24 Jul 2023 18:57:02 +1000 Subject: [PATCH] Fixes for profit loss --- app/Models/BaseModel.php | 28 +++++---- app/Models/Client.php | 57 +------------------ app/Models/CompanyToken.php | 1 - app/Models/StaticModel.php | 14 ++--- app/Models/User.php | 8 +-- app/Services/Report/ProfitLoss.php | 4 +- .../Export/ProfitAndLossReportTest.php | 30 +++++++++- 7 files changed, 55 insertions(+), 87 deletions(-) diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index f5d58460bb37..ac6d73168a69 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -31,25 +31,29 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property-read mixed $hashed_id * @property string $number * @property int $company_id + * @property int $id * @property \App\Models\Company $company * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\BelongsTo|\Awobaz\Compoships\Database\Eloquent\Relations\BelongsTo|\App\Models\Company company() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\HasMany|BaseModel orderBy() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel with() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel query() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel with($value) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newModelQuery($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel query($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude(array $excludeable) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel find() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel where() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel find($value) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel where($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel count() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel create() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel insert() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel create($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel insert($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel service() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereHas() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel withTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel orderBy($column, $direction) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel invitations() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel createInvitations() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereHas($query) * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read int|null $invitations_count * diff --git a/app/Models/Client.php b/app/Models/Client.php index 6ed484be3231..c0cf9345dade 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -66,6 +66,7 @@ use Illuminate\Contracts\Translation\HasLocalePreference; * @property string|null $shipping_postal_code * @property int|null $shipping_country_id * @property object|null $settings + * @property object|null $group_settings * @property bool $is_deleted * @property int|null $group_settings_id * @property string|null $vat_number @@ -115,68 +116,12 @@ use Illuminate\Contracts\Translation\HasLocalePreference; * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices * @property-read int|null $tasks_count * @property-read \App\Models\User $user - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|Client exclude($columns) * @method static \Database\Factories\ClientFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Client filter(\App\Filters\QueryFilters $filters) - * @method static \Illuminate\Database\Eloquent\Builder|Client newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Client newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Client onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Client query() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Client whereAddress1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereAddress2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCity($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereClientHash($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCountryId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCreditBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereGroupSettingsId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereIdNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereIndustryId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereLastLogin($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereLogo($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client wherePaidToDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client wherePhone($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client wherePostalCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client wherePrivateNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client wherePublicNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereSettings($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereShippingAddress1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereShippingAddress2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereShippingCity($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereShippingCountryId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereShippingPostalCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereShippingState($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereSizeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereState($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereVatNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereWebsite($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Client withoutTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Client with() - * @method static \Illuminate\Database\Eloquent\Builder|Client where() * @property string $payment_balance - * @method static \Illuminate\Database\Eloquent\Builder|Client wherePaymentBalance($value) * @property mixed $tax_data - * @method static \Illuminate\Database\Eloquent\Builder|Client whereTaxData($value) * @property int $is_tax_exempt - * @method static \Illuminate\Database\Eloquent\Builder|Client whereIsTaxExempt($value) - * @property int $has_valid_vat_number * @mixin \Eloquent */ diff --git a/app/Models/CompanyToken.php b/app/Models/CompanyToken.php index b3564f1e7b3b..d4b879a9eb23 100644 --- a/app/Models/CompanyToken.php +++ b/app/Models/CompanyToken.php @@ -53,7 +53,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|CompanyToken whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|CompanyToken withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyToken withoutTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|CompanyToken with() * @mixin \Eloquent */ class CompanyToken extends BaseModel diff --git a/app/Models/StaticModel.php b/app/Models/StaticModel.php index bc3cf3ea0c61..f5be46c52558 100644 --- a/app/Models/StaticModel.php +++ b/app/Models/StaticModel.php @@ -22,13 +22,13 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property-read mixed $id * @method static \Illuminate\Database\Eloquent\Builder|StaticModel company() * @method static \Illuminate\Database\Eloquent\Builder|StaticModel exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel query() - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel find() - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel with() - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel findOrFail() + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newModelQuery($value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newQuery($value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel query($value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel find($value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel with($value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel withTrashed($value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel findOrFail($value) * @mixin \Eloquent */ class StaticModel extends Model diff --git a/app/Models/User.php b/app/Models/User.php index da37482dbb94..9ceb5f9ad2f3 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -98,6 +98,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; * @method static \Illuminate\Database\Eloquent\Builder|User newQuery() * @method static \Illuminate\Database\Eloquent\Builder|User onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|User query() + * @method static \Illuminate\Database\Eloquent\Builder|User where($column, $value) * @method static \Illuminate\Database\Eloquent\Builder|User whereAcceptedTermsVersion($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereAccountId($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereAvatar($value) @@ -336,13 +337,6 @@ class User extends Authenticatable implements MustVerifyEmail return $this->getCompany(); } - // private function setCompanyByGuard() - // { - // if (Auth::guard('contact')->check()) { - // $this->setCompany(auth()->user()->client->company); - // } - // } - public function company_users() { return $this->hasMany(CompanyUser::class)->withTrashed(); diff --git a/app/Services/Report/ProfitLoss.php b/app/Services/Report/ProfitLoss.php index 26d4f188ab7f..d070b7636614 100644 --- a/app/Services/Report/ProfitLoss.php +++ b/app/Services/Report/ProfitLoss.php @@ -366,7 +366,7 @@ class ProfitLoss $csv->insertOne(['--------------------']); - $csv->insertOne([ctrans('texts.total_revenue'), Number::formatMoney($this->income, $this->company)]); + $csv->insertOne([ctrans('texts.total_revenue'), Number::formatMoney($this->income - $this->income_taxes, $this->company)]); //total taxes @@ -386,7 +386,7 @@ class ProfitLoss $csv->insertOne([ctrans('texts.total_taxes'), Number::formatMoney(array_sum(array_column($this->expense_break_down, 'tax')), $this->company)]); $csv->insertOne(['--------------------']); - $csv->insertOne([ctrans('texts.total_profit'), Number::formatMoney($this->income - array_sum(array_column($this->expense_break_down, 'total')), $this->company)]); + $csv->insertOne([ctrans('texts.total_profit'), Number::formatMoney($this->income - $this->income_taxes - array_sum(array_column($this->expense_break_down, 'total'))- array_sum(array_column($this->expense_break_down, 'tax')), $this->company)]); //net profit diff --git a/tests/Feature/Export/ProfitAndLossReportTest.php b/tests/Feature/Export/ProfitAndLossReportTest.php index 890848151f40..56d634e1beb4 100644 --- a/tests/Feature/Export/ProfitAndLossReportTest.php +++ b/tests/Feature/Export/ProfitAndLossReportTest.php @@ -120,6 +120,34 @@ class ProfitAndLossReportTest extends TestCase $this->account->delete(); } + public function testExpenseResolution() + { + $this->buildData(); + + Expense::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'amount' => 121, + 'date' => now()->format('Y-m-d'), + 'uses_inclusive_taxes' => true, + 'tax_rate1' => 21, + 'tax_name1' => 'VAT', + 'calculate_tax_by_amount' => false, + 'exchange_rate' => 1, + ]); + + $pl = new ProfitLoss($this->company, $this->payload); + $pl->build(); + + $expense_breakdown = $pl->getExpenseBreakDown(); + + $this->assertEquals(100, array_sum(array_column($expense_breakdown, 'total'))); + $this->assertEquals(21, array_sum(array_column($expense_breakdown, 'tax'))); + + $this->account->delete(); + + } + public function testMultiCurrencyInvoiceIncome() { $this->buildData(); @@ -141,7 +169,6 @@ class ProfitAndLossReportTest extends TestCase 'is_deleted' => 0, ]); - Invoice::factory()->create([ 'client_id' => $client->id, 'user_id' => $this->user->id, @@ -163,7 +190,6 @@ class ProfitAndLossReportTest extends TestCase 'exchange_rate' => 2 ]); - Invoice::factory()->create([ 'client_id' => $client2->id, 'user_id' => $this->user->id,