diff --git a/app/Database/migrations/2017_06_23_011011_create_subfleet_tables.php b/app/Database/migrations/2017_06_23_011011_create_subfleet_tables.php index 8959af7f..7baa7652 100644 --- a/app/Database/migrations/2017_06_23_011011_create_subfleet_tables.php +++ b/app/Database/migrations/2017_06_23_011011_create_subfleet_tables.php @@ -15,8 +15,8 @@ class CreateSubfleetTables extends Migration $table->unsignedInteger('airline_id')->nullable(); $table->string('type', 50)->unique(); $table->string('name', 50); - $table->unsignedDecimal('cost_block_hour'); - $table->unsignedDecimal('cost_delay_minute'); + $table->unsignedDecimal('cost_block_hour')->default(0)->nullable(); + $table->unsignedDecimal('cost_delay_minute')->default(0)->nullable(); $table->unsignedTinyInteger('fuel_type')->nullable(); $table->unsignedDecimal('ground_handling_multiplier')->nullable()->default(100); $table->unsignedDecimal('cargo_capacity')->nullable(); diff --git a/app/Models/Fare.php b/app/Models/Fare.php index 45302522..ae9baf03 100644 --- a/app/Models/Fare.php +++ b/app/Models/Fare.php @@ -9,6 +9,7 @@ use App\Interfaces\Model; * @property float cost * @property float price * @property mixed code + * @property mixed count Only when merged with pivot * @package App\Models */ class Fare extends Model diff --git a/app/Models/Pirep.php b/app/Models/Pirep.php index 3facba7b..6a47a477 100644 --- a/app/Models/Pirep.php +++ b/app/Models/Pirep.php @@ -14,7 +14,7 @@ use PhpUnitsOfMeasure\Exception\NonStringUnitName; /** * Class Pirep - * + * @property string id * @property string flight_number * @property string route_code * @property string route_leg diff --git a/app/Services/Finance/PirepFinanceService.php b/app/Services/Finance/PirepFinanceService.php index 4ea0ab65..c14cd742 100644 --- a/app/Services/Finance/PirepFinanceService.php +++ b/app/Services/Finance/PirepFinanceService.php @@ -14,7 +14,6 @@ use App\Services\FareService; use App\Services\PirepService; use App\Support\Math; use App\Support\Money; -use App\Support\Units\Time; use Log; /** @@ -72,6 +71,8 @@ class PirepFinanceService extends Service # Clean out the expenses first $this->deleteFinancesForPirep($pirep); + Log::info('Finance: Starting PIREP pay for '.$pirep->id); + # Now start and pay from scratch $this->payFaresForPirep($pirep); $this->payExpensesForSubfleet($pirep); @@ -93,7 +94,7 @@ class PirepFinanceService extends Service /** * @param Pirep $pirep */ - public function deleteFinancesForPirep(Pirep $pirep) + public function deleteFinancesForPirep(Pirep $pirep): void { $this->journalRepo->deleteAllForObject($pirep); } @@ -109,13 +110,16 @@ class PirepFinanceService extends Service public function payFaresForPirep($pirep): void { $fares = $this->getReconciledFaresForPirep($pirep); + /** @var \App\Models\Fare $fare */ foreach ($fares as $fare) { - Log::info('Finance: PIREP: '.$pirep->id.', fare:', $fare->toArray()); + Log::info('Finance: PIREP: '.$pirep->id.', Fare:', $fare->toArray()); $credit = Money::createFromAmount($fare->count * $fare->price); $debit = Money::createFromAmount($fare->count * $fare->cost); + Log::info('Finance: Calculate: C='.$credit->toAmount().', D='.$debit->toAmount()); + $this->journalRepo->post( $pirep->airline->journal, $credit, @@ -142,7 +146,6 @@ class PirepFinanceService extends Service { $sf = $pirep->aircraft->subfleet; - Log::info('subfleet: ', $sf->toArray()); # Haven't entered a cost if (!filled($sf->cost_block_hour)) { return; @@ -155,10 +158,12 @@ class PirepFinanceService extends Service # flight time if that hasn't been used $block_time = $pirep->block_time; if(!filled($block_time)) { + Log::info('Finance: No block time, using PIREP flight time'); $block_time = $pirep->flight_time; } $debit = Money::createFromAmount($cost_per_min * $block_time); + Log::info('Finance: Subfleet Block Hourly, D='.$debit->getAmount()); $this->journalRepo->post( $pirep->airline->journal, @@ -175,7 +180,6 @@ class PirepFinanceService extends Service /** * Collect all of the expenses and apply those to the journal * @param Pirep $pirep - * @throws \Prettus\Validator\Exceptions\ValidatorException * @throws \UnexpectedValueException * @throws \InvalidArgumentException */ @@ -271,8 +275,12 @@ class PirepFinanceService extends Service continue; } + Log::info('Finance: Expense from listener, N="' + .$expense->name.'", A='.$expense->amount); + # If an airline_id is filled, then see if it matches - if ($expense->airline_id !== $pirep->airline_id) { + if(filled($expense->airline_id) && $expense->airline_id !== $pirep->airline_id) { + Log::info('Finance: Expense has an airline ID and it doesn\'t match, skipping'); continue; } @@ -299,7 +307,7 @@ class PirepFinanceService extends Service * @throws \InvalidArgumentException * @throws \Prettus\Validator\Exceptions\ValidatorException */ - public function payGroundHandlingForPirep(Pirep $pirep) + public function payGroundHandlingForPirep(Pirep $pirep): void { $ground_handling_cost = $this->getGroundHandlingCost($pirep); Log::info('Finance: PIREP: '.$pirep->id.'; ground handling: '.$ground_handling_cost); @@ -323,7 +331,7 @@ class PirepFinanceService extends Service * @throws \InvalidArgumentException * @throws \Prettus\Validator\Exceptions\ValidatorException */ - public function payPilotForPirep(Pirep $pirep) + public function payPilotForPirep(Pirep $pirep): void { $pilot_pay = $this->getPilotPay($pirep); $pilot_pay_rate = $this->getPilotPayRateForPirep($pirep); diff --git a/tests/FinanceTest.php b/tests/FinanceTest.php index ce57adf3..c3d2d885 100644 --- a/tests/FinanceTest.php +++ b/tests/FinanceTest.php @@ -45,6 +45,9 @@ class FinanceTest extends TestCase * Setup tests */ $subfleet = $this->createSubfleetWithAircraft(2); + $subfleet['subfleet']->cost_block_hour = 10; + $subfleet['subfleet']->save(); + $rank = $this->createRank(10, [$subfleet['subfleet']->id]); $rank->acars_base_pay_rate = 10; $rank->save(); @@ -642,15 +645,15 @@ class FinanceTest extends TestCase $transactions = $journalRepo->getAllForObject($pirep); - $this->assertCount(8, $transactions['transactions']); + $this->assertCount(9, $transactions['transactions']); $this->assertEquals(3020, $transactions['credits']->getValue()); - $this->assertEquals(1840, $transactions['debits']->getValue()); + $this->assertEquals(1860, $transactions['debits']->getValue()); # Check that all the different transaction types are there # test by the different groups that exist $transaction_tags = [ 'expense' => 1, - 'subfleet' => 1, + 'subfleet' => 2, 'fare' => 3, 'ground_handling' => 1, 'pilot_pay' => 2, # debit on the airline, credit to the pilot