Merge pull request #730 from nabeelio/729-Multi-Expenses
All airports' expenses being applied to PIREP #729
This commit is contained in:
@@ -24,13 +24,14 @@ class ExpenseRepository extends Repository implements CacheableInterface
|
|||||||
* Get all of the expenses for a given type, and also
|
* Get all of the expenses for a given type, and also
|
||||||
* include expenses for a given airline ID
|
* include expenses for a given airline ID
|
||||||
*
|
*
|
||||||
* @param $type
|
* @param $type
|
||||||
* @param null $airline_id
|
* @param int $airline_id
|
||||||
* @param null $ref_model
|
* @param string $ref_model
|
||||||
|
* @param mixed $ref_model_id
|
||||||
*
|
*
|
||||||
* @return Collection
|
* @return Collection
|
||||||
*/
|
*/
|
||||||
public function getAllForType($type, $airline_id = null, $ref_model = null)
|
public function getAllForType($type, $airline_id = null, $ref_model = null, $ref_model_id = null)
|
||||||
{
|
{
|
||||||
$where = [
|
$where = [
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
@@ -47,6 +48,10 @@ class ExpenseRepository extends Repository implements CacheableInterface
|
|||||||
if ($ref_model) {
|
if ($ref_model) {
|
||||||
$where['ref_model'] = $ref_model_type;
|
$where['ref_model'] = $ref_model_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($ref_model_id) {
|
||||||
|
$where['ref_model_id'] = $ref_model_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$expenses = $this->findWhere($where);
|
$expenses = $this->findWhere($where);
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ class PirepFinanceService extends Service
|
|||||||
$this->payFaresForPirep($pirep);
|
$this->payFaresForPirep($pirep);
|
||||||
$this->payExpensesForSubfleet($pirep);
|
$this->payExpensesForSubfleet($pirep);
|
||||||
$this->payExpensesForPirep($pirep);
|
$this->payExpensesForPirep($pirep);
|
||||||
|
$this->payAirportExpensesForPirep($pirep);
|
||||||
$this->payExpensesEventsForPirep($pirep);
|
$this->payExpensesEventsForPirep($pirep);
|
||||||
$this->payGroundHandlingForPirep($pirep);
|
$this->payGroundHandlingForPirep($pirep);
|
||||||
$this->payPilotForPirep($pirep);
|
$this->payPilotForPirep($pirep);
|
||||||
@@ -228,7 +229,12 @@ class PirepFinanceService extends Service
|
|||||||
/*
|
/*
|
||||||
* Go through the expenses and apply a mulitplier if present
|
* Go through the expenses and apply a mulitplier if present
|
||||||
*/
|
*/
|
||||||
$expenses->map(function (/** @var \App\Models\Expense */ $expense, $i) use ($pirep) {
|
$expenses->map(function (Expense $expense, $i) use ($pirep) {
|
||||||
|
// Airport expenses are paid out separately
|
||||||
|
if ($expense->ref_model === Airport::class) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Log::info('Finance: PIREP: '.$pirep->id.', expense:', $expense->toArray());
|
Log::info('Finance: PIREP: '.$pirep->id.', expense:', $expense->toArray());
|
||||||
|
|
||||||
// Check to see if there is a certain fleet or flight type set on this expense
|
// Check to see if there is a certain fleet or flight type set on this expense
|
||||||
@@ -251,13 +257,14 @@ class PirepFinanceService extends Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Form the memo, with some specific ones depending on the group
|
// Form the memo, with some specific ones depending on the group
|
||||||
if ($expense->ref_model === Airport::class) {
|
if ($expense->ref_model === Subfleet::class
|
||||||
$memo = "Airport Expense: {$expense->name} ({$expense->ref_model_id})";
|
&& $expense->ref_model_id === $pirep->aircraft->subfleet->id
|
||||||
$transaction_group = "Airport: {$expense->ref_model_id}";
|
) {
|
||||||
} elseif ($expense->ref_model === Subfleet::class) {
|
|
||||||
$memo = "Subfleet Expense: {$expense->name} ({$pirep->aircraft->subfleet->name})";
|
$memo = "Subfleet Expense: {$expense->name} ({$pirep->aircraft->subfleet->name})";
|
||||||
$transaction_group = "Subfleet: {$expense->name} ({$pirep->aircraft->subfleet->name})";
|
$transaction_group = "Subfleet: {$expense->name} ({$pirep->aircraft->subfleet->name})";
|
||||||
} elseif ($expense->ref_model === Aircraft::class) {
|
} elseif ($expense->ref_model === Aircraft::class
|
||||||
|
&& $expense->ref_model_id === $pirep->aircraft->id
|
||||||
|
) {
|
||||||
$memo = "Aircraft Expense: {$expense->name} ({$pirep->aircraft->name})";
|
$memo = "Aircraft Expense: {$expense->name} ({$pirep->aircraft->name})";
|
||||||
$transaction_group = "Aircraft: {$expense->name} "
|
$transaction_group = "Aircraft: {$expense->name} "
|
||||||
."({$pirep->aircraft->name}-{$pirep->aircraft->registration})";
|
."({$pirep->aircraft->name}-{$pirep->aircraft->registration})";
|
||||||
@@ -286,6 +293,44 @@ class PirepFinanceService extends Service
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pay the airport-specific expenses for a PIREP
|
||||||
|
*
|
||||||
|
* @param \App\Models\Pirep $pirep
|
||||||
|
*/
|
||||||
|
public function payAirportExpensesForPirep(Pirep $pirep): void
|
||||||
|
{
|
||||||
|
$expenses = $this->expenseRepo->getAllForType(
|
||||||
|
ExpenseType::FLIGHT,
|
||||||
|
$pirep->airline_id,
|
||||||
|
Airport::class,
|
||||||
|
$pirep->arr_airport_id,
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go through the expenses and apply a mulitplier if present
|
||||||
|
*/
|
||||||
|
$expenses->map(function (Expense $expense, $i) use ($pirep) {
|
||||||
|
Log::info('Finance: PIREP: '.$pirep->id.', airport expense:', $expense->toArray());
|
||||||
|
|
||||||
|
$memo = "Airport Expense: {$expense->name} ({$expense->ref_model_id})";
|
||||||
|
$transaction_group = "Airport: {$expense->ref_model_id}";
|
||||||
|
|
||||||
|
$debit = Money::createFromAmount($expense->amount);
|
||||||
|
|
||||||
|
// Charge to the airlines journal
|
||||||
|
$journal = $pirep->airline->journal;
|
||||||
|
$this->financeSvc->debitFromJournal(
|
||||||
|
$journal,
|
||||||
|
$debit,
|
||||||
|
$pirep,
|
||||||
|
$memo,
|
||||||
|
$transaction_group,
|
||||||
|
'airport'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collect all of the expenses from the listeners and apply those to the journal
|
* Collect all of the expenses from the listeners and apply those to the journal
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -26,10 +26,19 @@ use Exception;
|
|||||||
|
|
||||||
class FinanceTest extends TestCase
|
class FinanceTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/** @var \App\Repositories\ExpenseRepository */
|
||||||
private $expenseRepo;
|
private $expenseRepo;
|
||||||
|
|
||||||
|
/** @var \App\Services\FareService */
|
||||||
private $fareSvc;
|
private $fareSvc;
|
||||||
|
|
||||||
|
/** @var \App\Services\FinanceService */
|
||||||
private $financeSvc;
|
private $financeSvc;
|
||||||
|
|
||||||
|
/** @var FleetService */
|
||||||
private $fleetSvc;
|
private $fleetSvc;
|
||||||
|
|
||||||
|
/** @var PirepService */
|
||||||
private $pirepSvc;
|
private $pirepSvc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -137,6 +146,19 @@ class FinanceTest extends TestCase
|
|||||||
'amount' => 200,
|
'amount' => 200,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Add expenses for airports
|
||||||
|
factory(Expense::class)->create([
|
||||||
|
'ref_model' => Airport::class,
|
||||||
|
'ref_model_id' => $dpt_apt->id,
|
||||||
|
'amount' => 50,
|
||||||
|
]);
|
||||||
|
|
||||||
|
factory(Expense::class)->create([
|
||||||
|
'ref_model' => Airport::class,
|
||||||
|
'ref_model_id' => $arr_apt->id,
|
||||||
|
'amount' => 100,
|
||||||
|
]);
|
||||||
|
|
||||||
$pirep = $this->pirepSvc->create($pirep, []);
|
$pirep = $this->pirepSvc->create($pirep, []);
|
||||||
|
|
||||||
return [$user, $pirep, $fares];
|
return [$user, $pirep, $fares];
|
||||||
@@ -694,6 +716,39 @@ class FinanceTest extends TestCase
|
|||||||
$this->assertEquals($obj->id, $expense->ref_model_id);
|
$this->assertEquals($obj->id, $expense->ref_model_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAirportExpenses()
|
||||||
|
{
|
||||||
|
$apt1 = factory(Airport::class)->create();
|
||||||
|
$apt2 = factory(Airport::class)->create();
|
||||||
|
$apt3 = factory(Airport::class)->create();
|
||||||
|
|
||||||
|
factory(Expense::class)->create([
|
||||||
|
'airline_id' => null,
|
||||||
|
'ref_model' => Airport::class,
|
||||||
|
'ref_model_id' => $apt1->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
factory(Expense::class)->create([
|
||||||
|
'airline_id' => null,
|
||||||
|
'ref_model' => Airport::class,
|
||||||
|
'ref_model_id' => $apt2->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
factory(Expense::class)->create([
|
||||||
|
'airline_id' => null,
|
||||||
|
'ref_model' => Airport::class,
|
||||||
|
'ref_model_id' => $apt3->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$expenses = $this->expenseRepo->getAllForType(
|
||||||
|
ExpenseType::FLIGHT,
|
||||||
|
null,
|
||||||
|
Airport::class
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertCount(3, $expenses);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
@@ -721,14 +776,15 @@ class FinanceTest extends TestCase
|
|||||||
|
|
||||||
$transactions = $journalRepo->getAllForObject($pirep);
|
$transactions = $journalRepo->getAllForObject($pirep);
|
||||||
|
|
||||||
// $this->assertCount(9, $transactions['transactions']);
|
// $this->assertCount(9, $transactions['transactions']);
|
||||||
$this->assertEquals(3020, $transactions['credits']->getValue());
|
$this->assertEquals(3020, $transactions['credits']->getValue());
|
||||||
$this->assertEquals(1960, $transactions['debits']->getValue());
|
$this->assertEquals(2060, $transactions['debits']->getValue());
|
||||||
|
|
||||||
// Check that all the different transaction types are there
|
// Check that all the different transaction types are there
|
||||||
// test by the different groups that exist
|
// test by the different groups that exist
|
||||||
$transaction_tags = [
|
$transaction_tags = [
|
||||||
'fuel' => 1,
|
'fuel' => 1,
|
||||||
|
'airport' => 1,
|
||||||
'expense' => 1,
|
'expense' => 1,
|
||||||
'subfleet' => 2,
|
'subfleet' => 2,
|
||||||
'fare' => 3,
|
'fare' => 3,
|
||||||
@@ -778,12 +834,13 @@ class FinanceTest extends TestCase
|
|||||||
|
|
||||||
// $this->assertCount(9, $transactions['transactions']);
|
// $this->assertCount(9, $transactions['transactions']);
|
||||||
$this->assertEquals(3020, $transactions['credits']->getValue());
|
$this->assertEquals(3020, $transactions['credits']->getValue());
|
||||||
$this->assertEquals(1960, $transactions['debits']->getValue());
|
$this->assertEquals(2060, $transactions['debits']->getValue());
|
||||||
|
|
||||||
// Check that all the different transaction types are there
|
// Check that all the different transaction types are there
|
||||||
// test by the different groups that exist
|
// test by the different groups that exist
|
||||||
$transaction_tags = [
|
$transaction_tags = [
|
||||||
'fuel' => 1,
|
'fuel' => 1,
|
||||||
|
'airport' => 1,
|
||||||
'expense' => 1,
|
'expense' => 1,
|
||||||
'subfleet' => 2,
|
'subfleet' => 2,
|
||||||
'fare' => 3,
|
'fare' => 3,
|
||||||
@@ -816,12 +873,13 @@ class FinanceTest extends TestCase
|
|||||||
|
|
||||||
$transactions = $journalRepo->getAllForObject($pirep2);
|
$transactions = $journalRepo->getAllForObject($pirep2);
|
||||||
$this->assertEquals(3020, $transactions['credits']->getValue());
|
$this->assertEquals(3020, $transactions['credits']->getValue());
|
||||||
$this->assertEquals(2060, $transactions['debits']->getValue());
|
$this->assertEquals(2160, $transactions['debits']->getValue());
|
||||||
|
|
||||||
// Check that all the different transaction types are there
|
// Check that all the different transaction types are there
|
||||||
// test by the different groups that exist
|
// test by the different groups that exist
|
||||||
$transaction_tags = [
|
$transaction_tags = [
|
||||||
'fuel' => 1,
|
'fuel' => 1,
|
||||||
|
'airport' => 1,
|
||||||
'expense' => 2,
|
'expense' => 2,
|
||||||
'subfleet' => 2,
|
'subfleet' => 2,
|
||||||
'fare' => 3,
|
'fare' => 3,
|
||||||
|
|||||||
Reference in New Issue
Block a user