Merge pull request #8687 from turbo124/v5-develop

v5.6.25
This commit is contained in:
David Bomba 2023-08-03 13:41:21 +10:00 committed by GitHub
commit c22a3c2386
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 78 additions and 63 deletions

View File

@ -55,7 +55,7 @@ class RecurringExpenseToExpenseFactory
$expense->custom_value2 = $recurring_expense->custom_value2; $expense->custom_value2 = $recurring_expense->custom_value2;
$expense->custom_value3 = $recurring_expense->custom_value3; $expense->custom_value3 = $recurring_expense->custom_value3;
$expense->custom_value4 = $recurring_expense->custom_value4; $expense->custom_value4 = $recurring_expense->custom_value4;
$expense->transaction_id = $recurring_expense->transaction_id; $expense->transaction_id = null;
$expense->category_id = $recurring_expense->category_id; $expense->category_id = $recurring_expense->category_id;
$expense->payment_type_id = $recurring_expense->payment_type_id; $expense->payment_type_id = $recurring_expense->payment_type_id;
$expense->project_id = $recurring_expense->project_id; $expense->project_id = $recurring_expense->project_id;

View File

@ -289,7 +289,6 @@ abstract class QueryFilters
/** /**
* @return Builder * @return Builder
* @throws RuntimeException
*/ */
public function without_deleted_clients(): Builder public function without_deleted_clients(): Builder
{ {
@ -302,7 +301,6 @@ abstract class QueryFilters
/** /**
* @return Builder * @return Builder
* @throws RuntimeException
*/ */
public function without_deleted_vendors(): Builder public function without_deleted_vendors(): Builder
{ {

View File

@ -44,9 +44,9 @@ class UpdateBankTransactionRequest extends Request
$rules['vendor_id'] = 'bail|required|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; $rules['vendor_id'] = 'bail|required|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
} }
if (isset($this->expense_id)) { // if (isset($this->expense_id)) {
$rules['expense_id'] = 'bail|required|exists:expenses,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; // $rules['expense_id'] = 'bail|required|exists:expenses,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
} // }
$rules['bank_integration_id'] = 'bail|required|exists:bank_integrations,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; $rules['bank_integration_id'] = 'bail|required|exists:bank_integrations,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
@ -67,9 +67,9 @@ class UpdateBankTransactionRequest extends Request
$input['vendor_id'] = $this->decodePrimaryKey($input['vendor_id']); $input['vendor_id'] = $this->decodePrimaryKey($input['vendor_id']);
} }
if (array_key_exists('expense_id', $input) && strlen($input['expense_id']) > 1) { // if (array_key_exists('expense_id', $input) && strlen($input['expense_id']) > 1) {
$input['expense_id'] = $this->decodePrimaryKey($input['expense_id']); // $input['expense_id'] = $this->decodePrimaryKey($input['expense_id']);
} // }
if (array_key_exists('ninja_category_id', $input) && strlen($input['ninja_category_id']) > 1) { if (array_key_exists('ninja_category_id', $input) && strlen($input['ninja_category_id']) > 1) {
$input['ninja_category_id'] = $this->decodePrimaryKey($input['ninja_category_id']); $input['ninja_category_id'] = $this->decodePrimaryKey($input['ninja_category_id']);

View File

@ -148,7 +148,7 @@ class MatchBankTransactions implements ShouldQueue
private function linkExpense($input) private function linkExpense($input)
{ {
$this->bt = BankTransaction::find($input['id']); $this->bt = BankTransaction::withTrashed()->find($input['id']);
if (!$this->bt) { if (!$this->bt) {
return $this; return $this;
@ -243,7 +243,7 @@ class MatchBankTransactions implements ShouldQueue
private function matchExpense($input) :self private function matchExpense($input) :self
{ {
//if there is a category id, pull it from Yodlee and insert - or just reuse!! //if there is a category id, pull it from Yodlee and insert - or just reuse!!
$this->bt = BankTransaction::withTrashed()->find($input['id']); $this->bt = BankTransaction::find($input['id']);
if (!$this->bt || $this->bt->status_id == BankTransaction::STATUS_CONVERTED) { if (!$this->bt || $this->bt->status_id == BankTransaction::STATUS_CONVERTED) {
return $this; return $this;

View File

@ -111,7 +111,7 @@ class RecurringExpensesCron
$recurring_expense->next_send_date = $recurring_expense->nextSendDate(); $recurring_expense->next_send_date = $recurring_expense->nextSendDate();
$recurring_expense->next_send_date_client = $recurring_expense->next_send_date; $recurring_expense->next_send_date_client = $recurring_expense->next_send_date;
$recurring_expense->last_sent_date = now();
$recurring_expense->remaining_cycles = $recurring_expense->remainingCycles(); $recurring_expense->remaining_cycles = $recurring_expense->remainingCycles();
$recurring_expense->save(); $recurring_expense->save();
} }

View File

@ -274,7 +274,7 @@ class Activity extends StaticModel
]; ];
public function getHashedIdAttribute() public function getHashedIdAttribute(): string
{ {
return $this->encodePrimaryKey($this->id); return $this->encodePrimaryKey($this->id);
} }
@ -285,109 +285,95 @@ class Activity extends StaticModel
return self::class; return self::class;
} }
public function backup(): \Illuminate\Database\Eloquent\Relations\HasOne
public function backup()
{ {
return $this->hasOne(Backup::class); return $this->hasOne(Backup::class);
} }
public function history(): \Illuminate\Database\Eloquent\Relations\HasOne
public function history()
{ {
return $this->hasOne(Backup::class); return $this->hasOne(Backup::class);
} }
public function user() :BelongsTo public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(User::class)->withTrashed(); return $this->belongsTo(User::class)->withTrashed();
} }
public function contact(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function contact()
{ {
return $this->belongsTo(ClientContact::class, 'client_contact_id', 'id')->withTrashed(); return $this->belongsTo(ClientContact::class, 'client_contact_id', 'id')->withTrashed();
} }
public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function client()
{ {
return $this->belongsTo(Client::class)->withTrashed(); return $this->belongsTo(Client::class)->withTrashed();
} }
public function invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function invoice()
{ {
return $this->belongsTo(Invoice::class)->withTrashed(); return $this->belongsTo(Invoice::class)->withTrashed();
} }
public function vendor() public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(Vendor::class)->withTrashed(); return $this->belongsTo(Vendor::class)->withTrashed();
} }
public function recurring_invoice() public function recurring_invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(RecurringInvoice::class)->withTrashed(); return $this->belongsTo(RecurringInvoice::class)->withTrashed();
} }
public function credit(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function credit()
{ {
return $this->belongsTo(Credit::class)->withTrashed(); return $this->belongsTo(Credit::class)->withTrashed();
} }
public function quote(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function quote()
{ {
return $this->belongsTo(Quote::class)->withTrashed(); return $this->belongsTo(Quote::class)->withTrashed();
} }
public function subscription(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function subscription()
{ {
return $this->belongsTo(Subscription::class)->withTrashed(); return $this->belongsTo(Subscription::class)->withTrashed();
} }
public function payment(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function payment()
{ {
return $this->belongsTo(Payment::class)->withTrashed(); return $this->belongsTo(Payment::class)->withTrashed();
} }
public function expense(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function expense()
{ {
return $this->belongsTo(Expense::class)->withTrashed(); return $this->belongsTo(Expense::class)->withTrashed();
} }
public function recurring_expense() public function recurring_expense(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(RecurringExpense::class)->withTrashed(); return $this->belongsTo(RecurringExpense::class)->withTrashed();
} }
public function purchase_order(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function purchase_order()
{ {
return $this->belongsTo(PurchaseOrder::class)->withTrashed(); return $this->belongsTo(PurchaseOrder::class)->withTrashed();
} }
public function vendor_contact(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function vendor_contact()
{ {
return $this->belongsTo(VendorContact::class)->withTrashed(); return $this->belongsTo(VendorContact::class)->withTrashed();
} }
public function task(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function task()
{ {
return $this->belongsTo(Task::class)->withTrashed(); return $this->belongsTo(Task::class)->withTrashed();
} }
public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo
public function company()
{ {
return $this->belongsTo(Company::class); return $this->belongsTo(Company::class);
} }

View File

@ -59,7 +59,6 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|BankTransaction onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|BankTransaction query() * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction query()
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope()
* @method static \Illuminate\Database\Eloquent\Account withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|BankTransaction withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction withoutTrashed()
* @property-read \App\Models\Payment|null $payment * @property-read \App\Models\Payment|null $payment
* @mixin \Eloquent * @mixin \Eloquent
@ -137,12 +136,12 @@ class BankTransaction extends BaseModel
public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(Vendor::class); return $this->belongsTo(Vendor::class)->withTrashed();
} }
public function expense(): \Illuminate\Database\Eloquent\Relations\BelongsTo public function expense(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{ {
return $this->belongsTo(Expense::class); return $this->belongsTo(Expense::class)->withTrashed();
} }
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo

View File

@ -57,11 +57,11 @@ use Laracasts\Presenter\PresentableTrait;
* @property string|null $private_notes * @property string|null $private_notes
* @property string|null $terms * @property string|null $terms
* @property string|null $tax_name1 * @property string|null $tax_name1
* @property string $tax_rate1 * @property float $tax_rate1
* @property string|null $tax_name2 * @property string|null $tax_name2
* @property string $tax_rate2 * @property float $tax_rate2
* @property string|null $tax_name3 * @property string|null $tax_name3
* @property string $tax_rate3 * @property float $tax_rate3
* @property string $total_taxes * @property string $total_taxes
* @property int $uses_inclusive_taxes * @property int $uses_inclusive_taxes
* @property string|null $custom_value1 * @property string|null $custom_value1
@ -90,7 +90,7 @@ use Laracasts\Presenter\PresentableTrait;
* @property string|null $reminder2_sent * @property string|null $reminder2_sent
* @property string|null $reminder3_sent * @property string|null $reminder3_sent
* @property string|null $reminder_last_sent * @property string|null $reminder_last_sent
* @property string $paid_to_date * @property float $paid_to_date
* @property int|null $subscription_id * @property int|null $subscription_id
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read int|null $activities_count * @property-read int|null $activities_count

View File

@ -11,20 +11,23 @@
namespace App\Repositories; namespace App\Repositories;
use App\Jobs\Bank\MatchBankTransactions; use App\Models\Expense;
use App\Models\BankTransaction; use App\Models\BankTransaction;
use App\Jobs\Bank\MatchBankTransactions;
/** /**
* Class for bank transaction repository. * Class for bank transaction repository.
*/ */
class BankTransactionRepository extends BaseRepository class BankTransactionRepository extends BaseRepository
{ {
public function save($data, BankTransaction $bank_transaction) public function save($data, BankTransaction $bank_transaction)
{ {
if (array_key_exists('bank_integration_id', $data)) { if (array_key_exists('bank_integration_id', $data)) {
$bank_transaction->bank_integration_id = $data['bank_integration_id']; $bank_transaction->bank_integration_id = $data['bank_integration_id'];
} }
$bank_transaction->fill($data); $bank_transaction->fill($data);
$bank_transaction->save(); $bank_transaction->save();
@ -49,11 +52,16 @@ class BankTransactionRepository extends BaseRepository
$bt->payment_id = null; $bt->payment_id = null;
} }
if($bt->expense()->exists()) { $e = Expense::whereIn('id', $this->transformKeys(explode(",", $bt->expense_id)))
$bt->expense->transaction_id = null; ->cursor()
$bt->expense_id = null; ->each(function ($expense){
}
$expense->transaction_id = null;
$expense->saveQuietly();
});
$bt->expense_id = null;
$bt->vendor_id = null; $bt->vendor_id = null;
$bt->status_id = 1; $bt->status_id = 1;
$bt->invoice_ids = null; $bt->invoice_ids = null;

View File

@ -146,6 +146,8 @@ class PaymentMigrationRepository extends BaseRepository
} }
if (array_key_exists('credits', $data) && is_array($data['credits']) && count($data['credits']) > 0) { if (array_key_exists('credits', $data) && is_array($data['credits']) && count($data['credits']) > 0) {
/** @var float $credit_totals **/
$credit_totals = array_sum(array_column($data['credits'], 'amount')); $credit_totals = array_sum(array_column($data['credits'], 'amount'));
$credits = Credit::whereIn('id', array_column($data['credits'], 'credit_id'))->withTrashed()->get(); $credits = Credit::whereIn('id', array_column($data['credits'], 'credit_id'))->withTrashed()->get();
@ -154,7 +156,7 @@ class PaymentMigrationRepository extends BaseRepository
$payment->credits->each(function ($cre) use ($credit_totals) { $payment->credits->each(function ($cre) use ($credit_totals) {
$cre->pivot->amount = $credit_totals; $cre->pivot->amount = $credit_totals;
$cre->pivot->save(); $cre->pivot->save();
$cre->paid_to_date += $credit_totals; $cre->paid_to_date += $credit_totals;
$cre->balance -= $credit_totals; $cre->balance -= $credit_totals;

View File

@ -188,7 +188,7 @@ class PaymentRepository extends BaseRepository
$paymentable->save(); $paymentable->save();
$credit = $credit->service()->markSent()->save(); $credit = $credit->service()->markSent()->save();
(new ApplyCreditPayment($credit, $payment, $paid_credit['amount'], $credit->company))->handle(); (new ApplyCreditPayment($credit, $payment, $paid_credit['amount']))->handle();
} }
} }
} }

View File

@ -48,6 +48,7 @@ class SubscriptionRepository extends BaseRepository
DB::connection(config('database.default'))->beginTransaction(); DB::connection(config('database.default'))->beginTransaction();
$data = []; $data = [];
/** @var \App\Models\Client $client **/
$client = Client::factory()->create([ $client = Client::factory()->create([
'user_id' => $subscription->user_id, 'user_id' => $subscription->user_id,
'company_id' => $subscription->company_id, 'company_id' => $subscription->company_id,
@ -56,6 +57,7 @@ class SubscriptionRepository extends BaseRepository
'settings' => ClientSettings::defaults(), 'settings' => ClientSettings::defaults(),
]); ]);
/** @var \App\Models\ClientContact $contact **/
$contact = ClientContact::factory()->create([ $contact = ClientContact::factory()->create([
'user_id' => $subscription->user_id, 'user_id' => $subscription->user_id,
'company_id' => $subscription->company_id, 'company_id' => $subscription->company_id,

View File

@ -148,13 +148,16 @@ class TaskRepository extends BaseRepository
* Store tasks in bulk. * Store tasks in bulk.
* *
* @param array $task * @param array $task
* @return task|null * @return Task|null
*/ */
public function create($task): ?Task public function create($task): ?Task
{ {
/** @var \App\Models\User $user **/
$user = auth()->user();
return $this->save( return $this->save(
$task, $task,
TaskFactory::create(auth()->user()->company()->id, auth()->user()->id) TaskFactory::create($user->company()->id, $user->id)
); );
} }
@ -175,7 +178,7 @@ class TaskRepository extends BaseRepository
/** /**
* Sorts the task status order IF the old status has changed between requests * Sorts the task status order IF the old status has changed between requests
* *
* @param stdCLass $old_task The old task object * @param \stdCLass $old_task The old task object
* @param Task $new_task The new Task model * @param Task $new_task The new Task model
* @return void * @return void
*/ */

View File

@ -21,6 +21,7 @@ class TaskStatusRepository extends BaseRepository
{ {
public function delete($task_status) public function delete($task_status)
{ {
/** @var \App\Models\TaskStatus $ts **/
$ts = TaskStatus::where('company_id', $task_status->company_id) $ts = TaskStatus::where('company_id', $task_status->company_id)
->first(); ->first();

View File

@ -12,6 +12,7 @@
namespace Tests\Feature; namespace Tests\Feature;
use Tests\TestCase; use Tests\TestCase;
use App\Models\Expense;
use Tests\MockAccountData; use Tests\MockAccountData;
use App\Models\BankIntegration; use App\Models\BankIntegration;
use App\Models\BankTransaction; use App\Models\BankTransaction;
@ -122,19 +123,31 @@ class BankTransactionApiTest extends TestCase
'user_id' => $this->user->id, 'user_id' => $this->user->id,
]); ]);
$e = Expense::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
]);
$bank_transaction = BankTransaction::factory()->create([ $bank_transaction = BankTransaction::factory()->create([
'bank_integration_id' => $bi->id, 'bank_integration_id' => $bi->id,
'user_id' => $this->user->id, 'user_id' => $this->user->id,
'company_id' => $this->company->id, 'company_id' => $this->company->id,
'payment_id' => $this->payment->id, 'payment_id' => $this->payment->id,
'expense_id' => $this->expense->id, 'expense_id' => "{$this->expense->hashed_id},{$e->hashed_id}",
'invoice_ids' => $this->invoice->hashed_id, 'invoice_ids' => $this->invoice->hashed_id,
]); ]);
$e->transaction_id = $bank_transaction->id;
$e->save();
$this->expense->transaction_id = $bank_transaction->id;
$this->expense->save();
$data = [ $data = [
'ids' => [$this->encodePrimaryKey($bank_transaction->id)], 'ids' => [$this->encodePrimaryKey($bank_transaction->id)],
]; ];
nlog($bank_transaction->toArray());
$response = $this->withHeaders([ $response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'), 'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token, 'X-API-TOKEN' => $this->token,
@ -146,6 +159,9 @@ class BankTransactionApiTest extends TestCase
$this->assertEquals("", $arr['data'][0]['payment_id']); $this->assertEquals("", $arr['data'][0]['payment_id']);
$this->assertEquals("", $arr['data'][0]['invoice_ids']); $this->assertEquals("", $arr['data'][0]['invoice_ids']);
$this->assertEquals("", $arr['data'][0]['expense_id']); $this->assertEquals("", $arr['data'][0]['expense_id']);
$this->assertNull($e->fresh()->transaction_id);
$this->assertNull($this->expense->fresh()->transaction_id);
} }
} }