Set tags on transactions #130
This commit is contained in:
+141
-129
@@ -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'
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user