1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-20 08:21:34 +02:00

Start and Stop Recurring Expenses

This commit is contained in:
David Bomba 2021-09-07 09:02:23 +10:00
parent 6200f572e6
commit 65bc26ab79
9 changed files with 108 additions and 10 deletions

View File

@ -12,12 +12,14 @@
namespace App\Factory;
use App\Models\RecurringExpense;
use App\Models\RecurringInvoice;
class RecurringExpenseFactory
{
public static function create(int $company_id, int $user_id) :RecurringExpense
{
$recurring_expense = new RecurringExpense();
$recurring_expense->status_id = RecurringInvoice::STATUS_DRAFT;
$recurring_expense->user_id = $user_id;
$recurring_expense->company_id = $company_id;
$recurring_expense->is_deleted = false;

View File

@ -495,21 +495,59 @@ class RecurringExpenseController extends BaseController
$recurring_expenses->each(function ($recurring_expense, $key) use ($action) {
if (auth()->user()->can('edit', $recurring_expense)) {
$this->recurring_expense_repo->{$action}($recurring_expense);
$this->performAction($recurring_expense, $action, true);
}
});
return $this->listResponse(RecurringExpense::withTrashed()->whereIn('id', $this->transformKeys($ids)));
}
/**
* Returns a client statement.
*
* @return void [type] [description]
*/
public function statement()
private function performAction(RecurringExpense $recurring_expense, string $action, $bulk = false)
{
//todo
switch ($action) {
case 'archive':
$this->recurring_expense_repo->archive($recurring_expense);
if (! $bulk) {
return $this->listResponse($recurring_expense);
}
break;
case 'restore':
$this->recurring_expense_repo->restore($recurring_expense);
if (! $bulk) {
return $this->listResponse($recurring_expense);
}
break;
case 'delete':
$this->recurring_expense_repo->delete($recurring_expense);
if (! $bulk) {
return $this->listResponse($recurring_expense);
}
break;
case 'email':
//dispatch email to queue
break;
case 'start':
$recurring_expense = $recurring_expense->service()->start()->save();
if (! $bulk) {
$this->itemResponse($recurring_expense);
}
break;
case 'stop':
$recurring_expense = $recurring_expense->service()->stop()->save();
if (! $bulk) {
$this->itemResponse($recurring_expense);
}
break;
default:
// code...
break;
}
}
/**

View File

@ -31,7 +31,6 @@ use App\Utils\Ninja;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SavesDocuments;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;

View File

@ -11,6 +11,7 @@
namespace App\Models;
use App\Services\Recurring\RecurringService;
use Illuminate\Database\Eloquent\SoftDeletes;
class RecurringExpense extends BaseModel
@ -105,4 +106,12 @@ class RecurringExpense extends BaseModel
{
return $this->belongsTo(Client::class);
}
/**
* Service entry points.
*/
public function service() :RecurringService
{
return new RecurringService($this);
}
}

View File

@ -180,6 +180,10 @@ use App\Listeners\Quote\QuoteRestoredActivity;
use App\Listeners\Quote\QuoteViewedActivity;
use App\Listeners\Quote\ReachWorkflowSettings;
use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity;
use App\Listeners\RecurringExpense\RecurringExpenseArchivedActivity;
use App\Listeners\RecurringExpense\RecurringExpenseDeletedActivity;
use App\Listeners\RecurringExpense\RecurringExpenseRestoredActivity;
use App\Listeners\RecurringExpense\RecurringExpenseUpdatedActivity;
use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity;
use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity;
use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity;

View File

@ -53,6 +53,7 @@ class RecurringExpenseTransformer extends EntityTransformer
'id' => $this->encodePrimaryKey($recurring_expense->id),
'user_id' => $this->encodePrimaryKey($recurring_expense->user_id),
'assigned_user_id' => $this->encodePrimaryKey($recurring_expense->assigned_user_id),
'status_id' => (string) ($recurring_expense->status_id ?: 1),
'vendor_id' => $this->encodePrimaryKey($recurring_expense->vendor_id),
'invoice_id' => $this->encodePrimaryKey($recurring_expense->invoice_id),
'client_id' => $this->encodePrimaryKey($recurring_expense->client_id),

View File

@ -22,6 +22,7 @@ class RecurringExpensesSchema extends Migration
$table->unsignedInteger('company_id')->index();
$table->unsignedInteger('vendor_id')->nullable();
$table->unsignedInteger('user_id');
$table->unsignedInteger('status_id');
$table->unsignedInteger('invoice_id')->nullable();
$table->unsignedInteger('client_id')->nullable();

View File

@ -10,13 +10,14 @@
*/
namespace Tests\Feature;
use App\Models\RecurringInvoice;
use App\Utils\Traits\MakesHash;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Session;
use Illuminate\Validation\ValidationException;
use Tests\MockAccountData;
use Tests\TestCase;
use Illuminate\Validation\ValidationException;
/**
* @test
@ -67,6 +68,7 @@ class RecurringExpenseApiTest extends TestCase
'amount' => 10,
'client_id' => $this->client->hashed_id,
'number' => '123321',
'frequency_id' => 5,
];
$response = $this->withHeaders([
@ -170,4 +172,44 @@ class RecurringExpenseApiTest extends TestCase
$this->assertTrue($arr['data'][0]['is_deleted']);
}
public function testRecurringExpenseStart()
{
$data = [
'ids' => [$this->encodePrimaryKey($this->recurring_expense->id)],
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->post('/api/v1/recurring_expenses/bulk?action=start', $data);
$arr = $response->json();
nlog($arr);
$this->assertEquals(RecurringInvoice::STATUS_ACTIVE, $arr['data'][0]['status_id']);
}
public function testRecurringExpensePaused()
{
$data = [
'ids' => [$this->encodePrimaryKey($this->recurring_expense->id)],
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->post('/api/v1/recurring_expenses/bulk?action=start', $data);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->post('/api/v1/recurring_expenses/bulk?action=stop', $data);
$arr = $response->json();
nlog($arr);
$this->assertEquals(RecurringInvoice::STATUS_PAUSED, $arr['data'][0]['status_id']);
}
}

View File

@ -301,6 +301,8 @@ trait MockAccountData
$this->recurring_expense = RecurringExpense::factory()->create([
'user_id' => $user_id,
'company_id' => $this->company->id,
'frequency_id' => 5,
'remaining_cycles' => 5,
]);
$this->recurring_quote = RecurringQuote::factory()->create([