mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Merge pull request #6592 from turbo124/recurring_expenses
Recurring expenses
This commit is contained in:
commit
6200f572e6
@ -84,6 +84,7 @@ class BaseController extends Controller
|
||||
'company.payments.documents',
|
||||
'company.payment_terms.company',
|
||||
'company.projects.documents',
|
||||
'company.recurring_expenses',
|
||||
'company.recurring_invoices',
|
||||
'company.recurring_invoices.invitations.contact',
|
||||
'company.recurring_invoices.invitations.company',
|
||||
@ -304,6 +305,13 @@ class BaseController extends Controller
|
||||
if(!$user->hasPermission('view_recurring_invoice'))
|
||||
$query->where('recurring_invoices.user_id', $user->id)->orWhere('recurring_invoices.assigned_user_id', $user->id);
|
||||
|
||||
},
|
||||
'company.recurring_expenses'=> function ($query) use ($updated_at, $user) {
|
||||
$query->where('updated_at', '>=', $updated_at)->with('documents');
|
||||
|
||||
if(!$user->hasPermission('view_recurring_expense'))
|
||||
$query->where('recurring_expenses.user_id', $user->id)->orWhere('recurring_expenses.assigned_user_id', $user->id);
|
||||
|
||||
},
|
||||
'company.tasks'=> function ($query) use ($updated_at, $user) {
|
||||
$query->where('updated_at', '>=', $updated_at)->with('documents');
|
||||
|
@ -59,6 +59,7 @@ use App\Models\PaymentTerm;
|
||||
use App\Models\Product;
|
||||
use App\Models\Project;
|
||||
use App\Models\Quote;
|
||||
use App\Models\RecurringExpense;
|
||||
use App\Models\RecurringInvoice;
|
||||
use App\Models\Task;
|
||||
use App\Models\TaskStatus;
|
||||
@ -132,13 +133,14 @@ class Import implements ShouldQueue
|
||||
'projects',
|
||||
'products',
|
||||
'credits',
|
||||
'invoices',
|
||||
'recurring_invoices',
|
||||
'invoices',
|
||||
'quotes',
|
||||
'payments',
|
||||
'expense_categories',
|
||||
'task_statuses',
|
||||
'expenses',
|
||||
'recurring_expenses',
|
||||
'tasks',
|
||||
'documents',
|
||||
];
|
||||
@ -814,6 +816,68 @@ class Import implements ShouldQueue
|
||||
$product_repository = null;
|
||||
}
|
||||
|
||||
private function processRecurringExpenses(array $data) :void
|
||||
{
|
||||
RecurringExpense::unguard();
|
||||
|
||||
$rules = [
|
||||
'*.amount' => ['numeric'],
|
||||
];
|
||||
|
||||
$validator = Validator::make($data, $rules);
|
||||
|
||||
if ($validator->fails()) {
|
||||
throw new MigrationValidatorFailed(json_encode($validator->errors()));
|
||||
}
|
||||
|
||||
foreach ($data as $resource) {
|
||||
$modified = $resource;
|
||||
|
||||
unset($modified['id']);
|
||||
|
||||
$modified['company_id'] = $this->company->id;
|
||||
$modified['user_id'] = $this->processUserId($resource);
|
||||
|
||||
if (isset($resource['client_id'])) {
|
||||
$modified['client_id'] = $this->transformId('clients', $resource['client_id']);
|
||||
}
|
||||
|
||||
if (isset($resource['category_id'])) {
|
||||
$modified['category_id'] = $this->transformId('expense_categories', $resource['category_id']);
|
||||
}
|
||||
|
||||
if (isset($resource['vendor_id'])) {
|
||||
$modified['vendor_id'] = $this->transformId('vendors', $resource['vendor_id']);
|
||||
}
|
||||
|
||||
$expense = RecurringExpense::create($modified);
|
||||
|
||||
if(array_key_exists('created_at', $modified))
|
||||
$expense->created_at = Carbon::parse($modified['created_at']);
|
||||
|
||||
if(array_key_exists('updated_at', $modified))
|
||||
$expense->updated_at = Carbon::parse($modified['updated_at']);
|
||||
|
||||
$expense->save(['timestamps' => false]);
|
||||
|
||||
$old_user_key = array_key_exists('user_id', $resource) ?? $this->user->id;
|
||||
|
||||
$key = "recurring_expenses_{$resource['id']}";
|
||||
|
||||
$this->ids['recurring_expenses'][$key] = [
|
||||
'old' => $resource['id'],
|
||||
'new' => $expense->id,
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
|
||||
RecurringExpense::reguard();
|
||||
|
||||
/*Improve memory handling by setting everything to null when we have finished*/
|
||||
$data = null;
|
||||
}
|
||||
|
||||
private function processRecurringInvoices(array $data) :void
|
||||
{
|
||||
RecurringInvoice::unguard();
|
||||
@ -910,6 +974,10 @@ class Import implements ShouldQueue
|
||||
}
|
||||
|
||||
$modified['client_id'] = $this->transformId('clients', $resource['client_id']);
|
||||
|
||||
if(array_key_exists('recurring_id', $resource) && !is_null($resource['recurring_id']))
|
||||
$modified['recurring_id'] = $this->transformId('recurring_invoices', (string)$resource['recurring_id']);
|
||||
|
||||
$modified['user_id'] = $this->processUserId($resource);
|
||||
$modified['company_id'] = $this->company->id;
|
||||
$modified['line_items'] = $this->cleanItems($modified['line_items']);
|
||||
|
@ -17,7 +17,7 @@ use App\Repositories\ActivityRepository;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use stdClass;
|
||||
|
||||
class RecurringExpenseArchivedActivity implements ShouldQueue
|
||||
class CreatedRecurringExpenseActivity implements ShouldQueue
|
||||
{
|
||||
protected $activity_repo;
|
||||
|
||||
@ -50,7 +50,7 @@ class RecurringExpenseArchivedActivity implements ShouldQueue
|
||||
$fields->recurring_expense_id = $recurring_expense->id;
|
||||
$fields->user_id = $user_id;
|
||||
$fields->company_id = $recurring_expense->company_id;
|
||||
$fields->activity_type_id = Activity::ARCHIVE_RECURRING_EXPENSE;
|
||||
$fields->activity_type_id = Activity::CREATE_RECURRING_EXPENSE;
|
||||
|
||||
$this->activity_repo->save($fields, $recurring_expense, $event->event_vars);
|
||||
}
|
||||
|
@ -259,6 +259,14 @@ class Company extends BaseModel
|
||||
return $this->hasMany(RecurringInvoice::class)->withTrashed();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return HasMany
|
||||
*/
|
||||
public function recurring_expenses()
|
||||
{
|
||||
return $this->hasMany(RecurringExpense::class)->withTrashed();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return HasMany
|
||||
*/
|
||||
|
@ -57,7 +57,6 @@ class RecurringExpense extends BaseModel
|
||||
'uses_inclusive_taxes',
|
||||
'calculate_tax_by_amount',
|
||||
'frequency_id',
|
||||
'start_date',
|
||||
'last_sent_date',
|
||||
'next_send_date',
|
||||
'remaining_cycles',
|
||||
|
@ -179,6 +179,7 @@ use App\Listeners\Quote\QuoteEmailedNotification;
|
||||
use App\Listeners\Quote\QuoteRestoredActivity;
|
||||
use App\Listeners\Quote\QuoteViewedActivity;
|
||||
use App\Listeners\Quote\ReachWorkflowSettings;
|
||||
use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity;
|
||||
use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity;
|
||||
use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity;
|
||||
use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity;
|
||||
|
@ -13,7 +13,6 @@ namespace App\Transformers;
|
||||
|
||||
use App\Models\Account;
|
||||
use App\Models\Activity;
|
||||
use App\Models\Subscription;
|
||||
use App\Models\Client;
|
||||
use App\Models\Company;
|
||||
use App\Models\CompanyGateway;
|
||||
@ -31,13 +30,16 @@ use App\Models\PaymentTerm;
|
||||
use App\Models\Product;
|
||||
use App\Models\Project;
|
||||
use App\Models\Quote;
|
||||
use App\Models\RecurringExpense;
|
||||
use App\Models\RecurringInvoice;
|
||||
use App\Models\Subscription;
|
||||
use App\Models\SystemLog;
|
||||
use App\Models\Task;
|
||||
use App\Models\TaskStatus;
|
||||
use App\Models\TaxRate;
|
||||
use App\Models\User;
|
||||
use App\Models\Webhook;
|
||||
use App\Transformers\RecurringExpenseTransformer;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use stdClass;
|
||||
|
||||
@ -92,6 +94,7 @@ class CompanyTransformer extends EntityTransformer
|
||||
'expense_categories',
|
||||
'task_statuses',
|
||||
'subscriptions',
|
||||
'recurring_expenses',
|
||||
];
|
||||
|
||||
/**
|
||||
@ -295,6 +298,13 @@ class CompanyTransformer extends EntityTransformer
|
||||
return $this->includeCollection($company->recurring_invoices, $transformer, RecurringInvoice::class);
|
||||
}
|
||||
|
||||
public function includeRecurringExpenses(Company $company)
|
||||
{
|
||||
$transformer = new RecurringExpenseTransformer($this->serializer);
|
||||
|
||||
return $this->includeCollection($company->recurring_expenses, $transformer, RecurringExpense::class);
|
||||
}
|
||||
|
||||
public function includeQuotes(Company $company)
|
||||
{
|
||||
$transformer = new QuoteTransformer($this->serializer);
|
||||
|
@ -96,6 +96,7 @@ class ExpenseTransformer extends EntityTransformer
|
||||
'tax_amount3' => (float) $expense->tax_amount3,
|
||||
'uses_inclusive_taxes' => (bool) $expense->uses_inclusive_taxes,
|
||||
'calculate_tax_by_amount' => (bool) $expense->calculate_tax_by_amount,
|
||||
'entity_type' => 'expense',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +80,6 @@ class RecurringExpenseTransformer extends EntityTransformer
|
||||
'transaction_reference' => (string) $recurring_expense->transaction_reference ?: '',
|
||||
'transaction_id' => (string) $recurring_expense->transaction_id ?: '',
|
||||
'date' => $recurring_expense->date ?: '',
|
||||
//'recurring_expense_date' => $recurring_expense->date ?: '',
|
||||
'number' => (string)$recurring_expense->number ?: '',
|
||||
'payment_date' => $recurring_expense->payment_date ?: '',
|
||||
'custom_value1' => $recurring_expense->custom_value1 ?: '',
|
||||
@ -96,6 +95,11 @@ class RecurringExpenseTransformer extends EntityTransformer
|
||||
'tax_amount3' => (float) $recurring_expense->tax_amount3,
|
||||
'uses_inclusive_taxes' => (bool) $recurring_expense->uses_inclusive_taxes,
|
||||
'calculate_tax_by_amount' => (bool) $recurring_expense->calculate_tax_by_amount,
|
||||
'entity_type' => 'recurringExpense',
|
||||
'frequency_id' => (string) $recurring_expense->frequency_id,
|
||||
'remaining_cycles' => (int) $recurring_expense->remaining_cycles,
|
||||
'last_sent_date' => $recurring_expense->last_sent_date ?: '',
|
||||
'next_send_date' => $recurring_expense->next_send_date ?: '',
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
@ -64,7 +64,6 @@ class RecurringExpensesSchema extends Migration
|
||||
$table->text('transaction_reference')->nullable();
|
||||
|
||||
$table->unsignedInteger('frequency_id');
|
||||
$table->datetime('start_date')->nullable();
|
||||
$table->datetime('last_sent_date')->nullable();
|
||||
$table->datetime('next_send_date')->nullable();
|
||||
$table->unsignedInteger('remaining_cycles')->nullable();
|
||||
|
Loading…
x
Reference in New Issue
Block a user