From 420fd1ef669fa66e3899d8317cee826c1bac0e85 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 17 Jul 2023 18:34:26 +1000 Subject: [PATCH] Calculate this and last financial years --- app/Export/CSV/ActivityExport.php | 3 +- app/Export/CSV/BaseExport.php | 16 ++- app/Export/CSV/ClientExport.php | 2 - app/Export/CSV/ContactExport.php | 1 - app/Export/CSV/CreditExport.php | 1 - app/Export/CSV/DocumentExport.php | 1 - app/Export/CSV/ExpenseExport.php | 1 - app/Export/CSV/InvoiceExport.php | 2 - app/Export/CSV/InvoiceItemExport.php | 1 - app/Export/CSV/PaymentExport.php | 2 - app/Export/CSV/ProductExport.php | 2 - app/Export/CSV/ProductSalesExport.php | 2 - app/Export/CSV/PurchaseOrderExport.php | 1 - app/Export/CSV/PurchaseOrderItemExport.php | 1 - app/Export/CSV/QuoteExport.php | 1 - app/Export/CSV/QuoteItemExport.php | 1 - app/Export/CSV/RecurringInvoiceExport.php | 1 - app/Export/CSV/TaskExport.php | 1 - app/Export/CSV/VendorExport.php | 1 - app/Utils/Traits/MakesDates.php | 26 +++- tests/Unit/DatesTest.php | 144 +++++++++++++++++++++ 21 files changed, 182 insertions(+), 29 deletions(-) diff --git a/app/Export/CSV/ActivityExport.php b/app/Export/CSV/ActivityExport.php index 09d555fc1954..21aa0ecb0979 100644 --- a/app/Export/CSV/ActivityExport.php +++ b/app/Export/CSV/ActivityExport.php @@ -24,8 +24,7 @@ use App\Transformers\ActivityTransformer; class ActivityExport extends BaseExport { - private Company $company; - + private $entity_transformer; public string $date_key = 'created_at'; diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 1c299790d1cf..fe876bf989ad 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -13,14 +13,13 @@ namespace App\Export\CSV; use App\Utils\Number; use App\Models\Client; +use App\Models\Company; use App\Models\Expense; use App\Models\Invoice; -use App\Models\GatewayType; use App\Models\Payment; use League\Fractal\Manager; use Illuminate\Support\Carbon; use App\Utils\Traits\MakesHash; -use App\Transformers\ClientTransformer; use App\Transformers\PaymentTransformer; use Illuminate\Database\Eloquent\Builder; use League\Fractal\Serializer\ArraySerializer; @@ -29,6 +28,8 @@ class BaseExport { use MakesHash; + public Company $company; + public array $input; public string $date_key = ''; @@ -726,8 +727,15 @@ class BaseExport $this->end_date = now()->startOfDay()->format('Y-m-d'); return $query->whereBetween($this->date_key, [now()->subDays(365), now()])->orderBy($this->date_key, 'ASC'); case 'this_year': - $this->start_date = now()->startOfYear()->format('Y-m-d'); - $this->end_date = now()->format('Y-m-d'); + + $first_month_of_year = $this->company->getSetting('first_month_of_year') ?? 1; + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + if(now()->lt($fin_year_start)) + $fin_year_start->subYearNoOverflow(); + + $this->start_date = $fin_year_start->format('Y-m-d'); + $this->end_date = $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d'); return $query->whereBetween($this->date_key, [now()->startOfYear(), now()])->orderBy($this->date_key, 'ASC'); case 'custom': $this->start_date = $custom_start_date->format('Y-m-d'); diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index 7d645c78b410..32f42ba807b7 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -22,8 +22,6 @@ use League\Csv\Writer; class ClientExport extends BaseExport { - private $company; - private $client_transformer; private $contact_transformer; diff --git a/app/Export/CSV/ContactExport.php b/app/Export/CSV/ContactExport.php index e960a572fa05..04ca04797d82 100644 --- a/app/Export/CSV/ContactExport.php +++ b/app/Export/CSV/ContactExport.php @@ -23,7 +23,6 @@ use League\Csv\Writer; class ContactExport extends BaseExport { - private Company $company; private ClientTransformer $client_transformer; diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index 67b259971003..1cadfea5b7dd 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class CreditExport extends BaseExport { - private Company $company; private CreditTransformer $credit_transformer; diff --git a/app/Export/CSV/DocumentExport.php b/app/Export/CSV/DocumentExport.php index 3b7d06ede415..b43a759b5254 100644 --- a/app/Export/CSV/DocumentExport.php +++ b/app/Export/CSV/DocumentExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class DocumentExport extends BaseExport { - private Company $company; private $entity_transformer; diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index 9f542fea2316..70bb8c841edb 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class ExpenseExport extends BaseExport { - private Company $company; private $expense_transformer; diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 98ed8498a6c3..853da158d23d 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -23,8 +23,6 @@ use App\Transformers\InvoiceTransformer; class InvoiceExport extends BaseExport { - private Company $company; - private $invoice_transformer; public string $date_key = 'date'; diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index 1f82c3407da8..943844bc125a 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -22,7 +22,6 @@ use League\Csv\Writer; class InvoiceItemExport extends BaseExport { - private Company $company; private $invoice_transformer; diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index e7aaf1abb9ed..dab8054c132f 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -21,8 +21,6 @@ use League\Csv\Writer; class PaymentExport extends BaseExport { - private Company $company; - private $entity_transformer; public string $date_key = 'date'; diff --git a/app/Export/CSV/ProductExport.php b/app/Export/CSV/ProductExport.php index de1b41e031fc..f1a24d49b48b 100644 --- a/app/Export/CSV/ProductExport.php +++ b/app/Export/CSV/ProductExport.php @@ -22,8 +22,6 @@ use League\Csv\Writer; class ProductExport extends BaseExport { - private Company $company; - private $entity_transformer; public string $date_key = 'created_at'; diff --git a/app/Export/CSV/ProductSalesExport.php b/app/Export/CSV/ProductSalesExport.php index a3228dfcdb2f..72017220d501 100644 --- a/app/Export/CSV/ProductSalesExport.php +++ b/app/Export/CSV/ProductSalesExport.php @@ -23,8 +23,6 @@ use League\Csv\Writer; class ProductSalesExport extends BaseExport { - private Company $company; - public string $date_key = 'created_at'; protected Collection $products; diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index 0b4202ce5af0..68ec10dc3219 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -22,7 +22,6 @@ use League\Csv\Writer; class PurchaseOrderExport extends BaseExport { - private Company $company; private $purchase_order_transformer; diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index 4847a162f9c0..0d83c93d388e 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class PurchaseOrderItemExport extends BaseExport { - private Company $company; private $purchase_order_transformer; diff --git a/app/Export/CSV/QuoteExport.php b/app/Export/CSV/QuoteExport.php index 5711e46067b5..2f7d5d736c44 100644 --- a/app/Export/CSV/QuoteExport.php +++ b/app/Export/CSV/QuoteExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class QuoteExport extends BaseExport { - private Company $company; private $quote_transformer; diff --git a/app/Export/CSV/QuoteItemExport.php b/app/Export/CSV/QuoteItemExport.php index ffa5bb5a96de..7d310d93eaa0 100644 --- a/app/Export/CSV/QuoteItemExport.php +++ b/app/Export/CSV/QuoteItemExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class QuoteItemExport extends BaseExport { - private Company $company; private $quote_transformer; diff --git a/app/Export/CSV/RecurringInvoiceExport.php b/app/Export/CSV/RecurringInvoiceExport.php index dfce445df17b..877fd04710fc 100644 --- a/app/Export/CSV/RecurringInvoiceExport.php +++ b/app/Export/CSV/RecurringInvoiceExport.php @@ -21,7 +21,6 @@ use League\Csv\Writer; class RecurringInvoiceExport extends BaseExport { - private Company $company; private $invoice_transformer; diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index 3f51da154851..fa60698e4792 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -24,7 +24,6 @@ use League\Csv\Writer; class TaskExport extends BaseExport { - private Company $company; private $entity_transformer; diff --git a/app/Export/CSV/VendorExport.php b/app/Export/CSV/VendorExport.php index e978c36e1432..dfc49f86daa5 100644 --- a/app/Export/CSV/VendorExport.php +++ b/app/Export/CSV/VendorExport.php @@ -22,7 +22,6 @@ use League\Csv\Writer; class VendorExport extends BaseExport { - private $company; private $vendor_transformer; diff --git a/app/Utils/Traits/MakesDates.php b/app/Utils/Traits/MakesDates.php index caea8e926d64..d08be2d47826 100644 --- a/app/Utils/Traits/MakesDates.php +++ b/app/Utils/Traits/MakesDates.php @@ -121,6 +121,30 @@ trait MakesDates */ public function calculateStartAndEndDates(array $data): array { + //override for financial years + if($data['date_range'] == 'this_year') { + $first_month_of_year = $this->company->getSetting('first_month_of_year') ?? 1; + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + if(now()->lt($fin_year_start)) + $fin_year_start->subYearNoOverflow(); + + } + + //override for financial years + if($data['date_range'] == 'last_year') { + $first_month_of_year = $this->company->getSetting('first_month_of_year') ?? 1; + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + $fin_year_start->subYearNoOverflow(); + + if(now()->subYear()->lt($fin_year_start)) { + $fin_year_start->subYearNoOverflow(); + } + + } + + return match ($data['date_range']) { EmailStatement::LAST7 => [now()->startOfDay()->subDays(7)->format('Y-m-d'), now()->startOfDay()->format('Y-m-d')], EmailStatement::LAST30 => [now()->startOfDay()->subDays(30)->format('Y-m-d'), now()->startOfDay()->format('Y-m-d')], @@ -129,7 +153,7 @@ trait MakesDates EmailStatement::LAST_MONTH => [now()->startOfDay()->subMonthNoOverflow()->firstOfMonth()->format('Y-m-d'), now()->startOfDay()->subMonthNoOverflow()->lastOfMonth()->format('Y-m-d')], EmailStatement::THIS_QUARTER => [now()->startOfDay()->firstOfQuarter()->format('Y-m-d'), now()->startOfDay()->lastOfQuarter()->format('Y-m-d')], EmailStatement::LAST_QUARTER => [now()->startOfDay()->subQuarterNoOverflow()->firstOfQuarter()->format('Y-m-d'), now()->startOfDay()->subQuarterNoOverflow()->lastOfQuarter()->format('Y-m-d')], - EmailStatement::THIS_YEAR => [now()->startOfDay()->firstOfYear()->format('Y-m-d'), now()->startOfDay()->lastOfYear()->format('Y-m-d')], + EmailStatement::THIS_YEAR => [$fin_year_start->format('Y-m-d'), $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d')], EmailStatement::LAST_YEAR => [now()->startOfDay()->subYearNoOverflow()->firstOfYear()->format('Y-m-d'), now()->startOfDay()->subYearNoOverflow()->lastOfYear()->format('Y-m-d')], EmailStatement::CUSTOM_RANGE => [$data['start_date'], $data['end_date']], default => [now()->startOfDay()->firstOfMonth()->format('Y-m-d'), now()->startOfDay()->lastOfMonth()->format('Y-m-d')], diff --git a/tests/Unit/DatesTest.php b/tests/Unit/DatesTest.php index 0fbaf15987d1..56cda7834226 100644 --- a/tests/Unit/DatesTest.php +++ b/tests/Unit/DatesTest.php @@ -31,6 +31,150 @@ class DatesTest extends TestCase // $this->makeTestData(); } + public function testLastFinancialYear3() + { + $this->travelTo(now()->createFromDate(2020, 6, 30)); + + //override for financial years + $first_month_of_year = 7; + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + $fin_year_start->subYearNoOverflow(); + + if(now()->subYear()->lt($fin_year_start)) { + $fin_year_start->subYearNoOverflow(); + } + + $this->assertEquals('2018-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2019-06-30', $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d')); + + $this->travelBack(); + + } + + public function testLastFinancialYear2() + { + $this->travelTo(now()->createFromDate(2020, 7, 1)); + + //override for financial years + $first_month_of_year = 7; + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + $fin_year_start->subYearNoOverflow(); + + if(now()->subYear()->lt($fin_year_start)) { + $fin_year_start->subYearNoOverflow(); + } + + $this->assertEquals('2019-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2020-06-30', $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d')); + + $this->travelBack(); + + } + + public function testLastFinancialYear() + { + $this->travelTo(now()->createFromDate(2020, 12, 1)); + + //override for financial years + $first_month_of_year = 7; + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + $fin_year_start->subYearNoOverflow(); + + if(now()->subYear()->lt($fin_year_start)) { + $fin_year_start->subYearNoOverflow(); + } + + $this->assertEquals('2019-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2020-06-30', $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d')); + + $this->travelBack(); + + } + + public function testFinancialYearDates4() + { + $this->travelTo(now()->createFromDate(2020, 12, 1)); + + $first_month_of_year = 7; + + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + if(now()->lt($fin_year_start)) + $fin_year_start->subYear(); + + $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); + + $this->assertEquals('2020-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2021-06-30', $fin_year_end->format('Y-m-d')); + + $this->travelBack(); + + } + + public function testFinancialYearDates3() + { + $this->travelTo(now()->createFromDate(2021, 12, 1)); + + $first_month_of_year = 7; + + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + if(now()->lt($fin_year_start)) + $fin_year_start->subYear(); + + $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); + + $this->assertEquals('2021-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2022-06-30', $fin_year_end->format('Y-m-d')); + + $this->travelBack(); + + } + + public function testFinancialYearDates2() + { + $this->travelTo(now()->createFromDate(2021, 8, 1)); + + $first_month_of_year = 7; + + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + if(now()->lt($fin_year_start)) + $fin_year_start->subYear(); + + $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); + + $this->assertEquals('2021-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2022-06-30', $fin_year_end->format('Y-m-d')); + + $this->travelBack(); + + } + + + public function testFinancialYearDates() + { + $this->travelTo(now()->createFromDate(2021, 1, 1)); + + $first_month_of_year = 7; + + $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); + + if(now()->lt($fin_year_start)) + $fin_year_start->subYear(); + + $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); + + $this->assertEquals('2020-07-01', $fin_year_start->format('Y-m-d')); + $this->assertEquals('2021-06-30', $fin_year_end->format('Y-m-d')); + + $this->travelBack(); + + } + public function testDaysDiff() { $string_date = '2021-06-01';