Set tags on transactions #130

This commit is contained in:
Nabeel Shahzad
2018-03-06 06:40:49 -06:00
parent 453ca5b180
commit dad923489b
4 changed files with 187 additions and 159 deletions
+141 -129
View File
@@ -444,153 +444,165 @@ pirep_comments:
updated_at: now updated_at: now
journals: journals:
- id: '1' -
id: 1
ledger_id: null ledger_id: null
type: 0 type: 0
balance: '15840000' balance: 23710000
currency: USD currency: USD
morphed_type: App\Models\Airline morphed_type: App\Models\Airline
morphed_id: '1' morphed_id: 1
created_at: now created_at: '2018-03-06 12:33:45'
updated_at: now updated_at: '2018-03-06 12:34:15'
- id: '2' -
id: 2
ledger_id: null ledger_id: null
type: 1 type: 1
balance: '30000' balance: 45000
currency: USD currency: USD
morphed_type: App\Models\User morphed_type: App\Models\User
morphed_id: '1' morphed_id: 1
created_at: now created_at: '2018-03-06 12:33:45'
updated_at: now updated_at: '2018-03-06 12:34:15'
journal_transactions: journal_transactions:
- id: 81e9d86c-fede-467d-befd-887e046d9c48 -
transaction_group: Fares id: 2cbb5990-c70c-40a8-8381-05b6402a96b4
journal_id: '1' transaction_group: 'Pilot Pay'
credit: '6000000' journal_id: 2
debit: '0' credit: 15000
currency: USD
memo: 'Fares Y300; price:200, cost: 0'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: b12a81a9-1273-4413-a46a-96b2925cfefb
transaction_group: Fares
journal_id: '1'
credit: '1100000'
debit: '0'
currency: USD
memo: 'Fares B10; price:1100, cost: 0'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: 8688ff40-aed4-4d60-90b7-0c5a88c12fbc
transaction_group: Fares
journal_id: '1'
credit: '1000000'
debit: '0'
currency: USD
memo: 'Fares F10; price:1000, cost: 0'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: d34a9d1e-0d54-4191-bf9f-0043062c04c9
transaction_group: Expenses
journal_id: '1'
credit: null
debit: '10000'
currency: USD
memo: 'Expense: Per-Flight (no muliplier)'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: bdc9d50d-ac3d-4334-997c-8f13b8328ab8
transaction_group: Expenses
journal_id: '1'
credit: null
debit: '10000'
currency: USD
memo: 'Expense: Per-Flight (multiplier)'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: b5c45ad5-af73-4d7c-9352-3dfb8de292a0
transaction_group: Expenses
journal_id: '1'
credit: null
debit: '20000'
currency: USD
memo: 'Expense: Per-Flight (multiplier, on airline)'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: e65083f9-23c3-4e98-8d63-cd7f35732f7b
transaction_group: Ground Handling
journal_id: '1'
credit: null
debit: '75000'
currency: USD
memo: 'Ground Handling'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: 9825a96e-58b5-465f-8fb8-4c8e1e5567eb
transaction_group: Pilot Pay
journal_id: '1'
credit: null
debit: '15000'
currency: USD
memo: 'Pilot Payment @ 50'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: now
updated_at: now
post_date: now
deleted_at: null
- id: 2e3118b3-c98f-41d1-b2b6-ccb4f34e86b0
transaction_group: Pilot Pay
journal_id: '2'
credit: '15000'
debit: null debit: null
currency: USD currency: USD
memo: 'Pilot Payment @ 50' memo: 'Pilot Payment @ 50'
tags: '"pilot_pay"'
ref_class: App\Models\Pirep ref_class: App\Models\Pirep
ref_class_id: pirepid_1 ref_class_id: pirepid_1
created_at: now created_at: '2018-03-06 12:34:15'
updated_at: now updated_at: '2018-03-06 12:34:15'
post_date: now post_date: '2018-03-06 12:34:15'
deleted_at: null -
- id: b98a837a-aa59-4630-a547-5a9d90b5b541 id: 3471fb16-0afd-4815-8b0c-f92771274063
transaction_group: Subfleet Expense transaction_group: 'Expense: Per-Flight (no muliplier)'
journal_id: 1
credit: null
debit: 10000
currency: USD
memo: 'Expense: Per-Flight (no muliplier)'
tags: '"expense"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 37f21468-ebad-4850-8557-db310ca45eb4
transaction_group: Fares
journal_id: 1
credit: 6000000
debit: 0
currency: USD
memo: 'Fares Y300; price: 200, cost: 0'
tags: '"fare"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 3e933972-07ef-4bb2-b1e1-90ef7e8871c6
transaction_group: 'Expense: Per-Flight (multiplier, on airline)'
journal_id: 1
credit: null
debit: 20000
currency: USD
memo: 'Expense: Per-Flight (multiplier, on airline)'
tags: '"expense"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: 522d8032-4ca0-4d6d-b7af-613be4bf281c
transaction_group: 'Expense: Per-Flight (multiplier)'
journal_id: 1
credit: null
debit: 10000
currency: USD
memo: 'Expense: Per-Flight (multiplier)'
tags: '"expense"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: a9bca611-c251-4fde-9f28-206d4debeb01
transaction_group: 'Subfleet: Catering (747-43X RB211-524G)'
journal_id: 1 journal_id: 1
credit: null credit: null
debit: 100000 debit: 100000
currency: USD currency: USD
memo: 'Subfleet Expense: Catering' memo: 'Subfleet Expense: Catering (747-43X RB211-524G)'
tags: '"subfleet"'
ref_class: App\Models\Pirep ref_class: App\Models\Pirep
ref_class_id: pirepid_1 ref_class_id: pirepid_1
created_at: now created_at: '2018-03-06 12:34:15'
updated_at: now updated_at: '2018-03-06 12:34:15'
post_date: now post_date: '2018-03-06 12:34:15'
deleted_at: null -
id: c3ff6a6d-03d0-4744-8678-e27329462dcb
transaction_group: Fares
journal_id: 1
credit: 1000000
debit: 0
currency: USD
memo: 'Fares F10; price: 1000, cost: 0'
tags: '"fare"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: c4e05ec1-530f-4897-92e8-787bdec8a0a1
transaction_group: 'Pilot Pay'
journal_id: 1
credit: null
debit: 15000
currency: USD
memo: 'Pilot Payment @ 50'
tags: '"pilot_pay"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: ed516367-eeb9-4a09-bfb7-531ec4be2f93
transaction_group: Fares
journal_id: 1
credit: 1100000
debit: 0
currency: USD
memo: 'Fares B10; price: 1100, cost: 0'
tags: '"fare"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
-
id: f3f8585e-894c-4491-b19b-d07b6ad20208
transaction_group: 'Ground Handling'
journal_id: 1
credit: null
debit: 75000
currency: USD
memo: 'Ground Handling'
tags: '"ground_handling"'
ref_class: App\Models\Pirep
ref_class_id: pirepid_1
created_at: '2018-03-06 12:34:15'
updated_at: '2018-03-06 12:34:15'
post_date: '2018-03-06 12:34:15'
+16 -10
View File
@@ -32,16 +32,15 @@ class JournalRepository extends BaseRepository implements CacheableInterface
* on the transaction itself. A cron will run to reconcile the journal * on the transaction itself. A cron will run to reconcile the journal
* balance nightly, since they're not atomic operations * balance nightly, since they're not atomic operations
* *
* @param Journal $journal * @param Journal $journal
* @param Money|null $credit Amount to credit * @param Money|null $credit Amount to credit
* @param Money|null $debit Amount to debit * @param Money|null $debit Amount to debit
* @param Model|null $reference The object this is a reference to * @param Model|null $reference The object this is a reference to
* @param string|null $memo Memo for this transaction * @param string|null $memo Memo for this transaction
* @param string|null $post_date Date of the posting * @param string|null $post_date Date of the posting
* @param string|null $transaction_group * @param string|null $transaction_group
* @param array|string|null $tags
* @return mixed * @return mixed
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
* @throws ValidatorException * @throws ValidatorException
*/ */
public function post( public function post(
@@ -51,9 +50,15 @@ class JournalRepository extends BaseRepository implements CacheableInterface
$reference = null, $reference = null,
$memo = null, $memo = null,
$post_date = null, $post_date = null,
$transaction_group = null $transaction_group = null,
$tags = null
) { ) {
# tags can be passed in a list
if($tags && \is_array($tags)) {
$tags = implode(',', $tags);
}
$attrs = [ $attrs = [
'journal_id' => $journal->id, 'journal_id' => $journal->id,
'credit' => $credit ? $credit->getAmount():null, 'credit' => $credit ? $credit->getAmount():null,
@@ -62,6 +67,7 @@ class JournalRepository extends BaseRepository implements CacheableInterface
'memo' => $memo, 'memo' => $memo,
'post_date' => $post_date ?? Carbon::now(), 'post_date' => $post_date ?? Carbon::now(),
'transaction_group' => $transaction_group, 'transaction_group' => $transaction_group,
'tags' => $tags
]; ];
if($reference !== null) { if($reference !== null) {
+22 -10
View File
@@ -118,7 +118,8 @@ class PirepFinanceService extends BaseService
'Fares ' . $fare->code . $fare->count 'Fares ' . $fare->code . $fare->count
.'; price: '.$fare->price.', cost: '.$fare->cost, .'; price: '.$fare->price.', cost: '.$fare->cost,
null, null,
'Fares' 'Fares',
'fare'
); );
} }
} }
@@ -150,18 +151,24 @@ class PirepFinanceService extends BaseService
# Get the transaction group name from the ref_class name # Get the transaction group name from the ref_class name
# This way it can be more dynamic and don't have to add special # This way it can be more dynamic and don't have to add special
# tables or specific expense calls to accomodate all of these # tables or specific expense calls to accomodate all of these
$transaction_group = 'Expense'; $klass = 'Expense';
if($expense->ref_class) { if($expense->ref_class) {
$ref = explode('\\', $expense->ref_class); $ref = explode('\\', $expense->ref_class);
$transaction_group = end($ref); $klass = end($ref);
} }
# Form the memo, with some specific ones depending on the group # Form the memo, with some specific ones depending on the group
if($transaction_group === 'Airport') { if ($klass === 'Airport') {
$memo = "Airport Expense: {$expense->name} ({$expense->ref_class_id})"; $memo = "Airport Expense: {$expense->name} ({$expense->ref_class_id})";
$transaction_group = "Airport: {$expense->ref_class_id}"; $transaction_group = "Airport: {$expense->ref_class_id}";
} elseif ($klass === 'Subfleet') {
$memo = "Subfleet Expense: {$expense->name} ({$pirep->aircraft->subfleet->name})";
$transaction_group = "Subfleet: {$expense->name} ({$pirep->aircraft->subfleet->name})";
} elseif ($klass === 'Aircraft') {
$memo = "Aircraft Expense: {$expense->name} ({$pirep->aircraft->name})";
$transaction_group = "Aircraft: {$expense->name} ({$pirep->aircraft->name})";
} else { } else {
$memo = 'Expense: ' . $expense->name; $memo = "Expense: {$expense->name}";
$transaction_group = "Expense: {$expense->name}"; $transaction_group = "Expense: {$expense->name}";
} }
@@ -173,7 +180,8 @@ class PirepFinanceService extends BaseService
$pirep, $pirep,
$memo, $memo,
null, null,
$transaction_group $transaction_group,
strtolower($klass)
); );
}); });
} }
@@ -220,7 +228,8 @@ class PirepFinanceService extends BaseService
$pirep, $pirep,
'Expense: ' . $expense->name, 'Expense: ' . $expense->name,
null, null,
$expense->transaction_group ?? 'Expenses' $expense->transaction_group ?? 'Expenses',
'expense'
); );
} }
} }
@@ -244,7 +253,8 @@ class PirepFinanceService extends BaseService
$pirep, $pirep,
'Ground Handling', 'Ground Handling',
null, null,
'Ground Handling' 'Ground Handling',
'ground_handling'
); );
} }
@@ -272,7 +282,8 @@ class PirepFinanceService extends BaseService
$pirep, $pirep,
$memo, $memo,
null, null,
'Pilot Pay' 'Pilot Pay',
'pilot_pay'
); );
$this->journalRepo->post( $this->journalRepo->post(
@@ -282,7 +293,8 @@ class PirepFinanceService extends BaseService
$pirep, $pirep,
$memo, $memo,
null, null,
'Pilot Pay' 'Pilot Pay',
'pilot_pay'
); );
} }
+8 -10
View File
@@ -651,18 +651,16 @@ class FinanceTest extends TestCase
# 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_types = [ $transaction_tags = [
'Expense' => 1, 'expense' => 1,
'Subfleet' => 1, 'subfleet' => 1,
'Fares' => 3, 'fare' => 3,
'Ground Handling' => 1, 'ground_handling' => 1,
'Pilot Pay' => 2, # debit on the airline, credit to the pilot 'pilot_pay' => 2, # debit on the airline, credit to the pilot
]; ];
foreach($transaction_types as $type => $count) { foreach($transaction_tags as $type => $count) {
$find = $transactions['transactions'] $find = $transactions['transactions']->where('tags', $type);
->where('transaction_group', $type);
$this->assertEquals($count, $find->count()); $this->assertEquals($count, $find->count());
} }
} }