mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-05 08:04:36 -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.payments.documents',
|
||||||
'company.payment_terms.company',
|
'company.payment_terms.company',
|
||||||
'company.projects.documents',
|
'company.projects.documents',
|
||||||
|
'company.recurring_expenses',
|
||||||
'company.recurring_invoices',
|
'company.recurring_invoices',
|
||||||
'company.recurring_invoices.invitations.contact',
|
'company.recurring_invoices.invitations.contact',
|
||||||
'company.recurring_invoices.invitations.company',
|
'company.recurring_invoices.invitations.company',
|
||||||
@ -304,6 +305,13 @@ class BaseController extends Controller
|
|||||||
if(!$user->hasPermission('view_recurring_invoice'))
|
if(!$user->hasPermission('view_recurring_invoice'))
|
||||||
$query->where('recurring_invoices.user_id', $user->id)->orWhere('recurring_invoices.assigned_user_id', $user->id);
|
$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) {
|
'company.tasks'=> function ($query) use ($updated_at, $user) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('documents');
|
$query->where('updated_at', '>=', $updated_at)->with('documents');
|
||||||
|
@ -59,6 +59,7 @@ use App\Models\PaymentTerm;
|
|||||||
use App\Models\Product;
|
use App\Models\Product;
|
||||||
use App\Models\Project;
|
use App\Models\Project;
|
||||||
use App\Models\Quote;
|
use App\Models\Quote;
|
||||||
|
use App\Models\RecurringExpense;
|
||||||
use App\Models\RecurringInvoice;
|
use App\Models\RecurringInvoice;
|
||||||
use App\Models\Task;
|
use App\Models\Task;
|
||||||
use App\Models\TaskStatus;
|
use App\Models\TaskStatus;
|
||||||
@ -132,13 +133,14 @@ class Import implements ShouldQueue
|
|||||||
'projects',
|
'projects',
|
||||||
'products',
|
'products',
|
||||||
'credits',
|
'credits',
|
||||||
'invoices',
|
|
||||||
'recurring_invoices',
|
'recurring_invoices',
|
||||||
|
'invoices',
|
||||||
'quotes',
|
'quotes',
|
||||||
'payments',
|
'payments',
|
||||||
'expense_categories',
|
'expense_categories',
|
||||||
'task_statuses',
|
'task_statuses',
|
||||||
'expenses',
|
'expenses',
|
||||||
|
'recurring_expenses',
|
||||||
'tasks',
|
'tasks',
|
||||||
'documents',
|
'documents',
|
||||||
];
|
];
|
||||||
@ -814,6 +816,68 @@ class Import implements ShouldQueue
|
|||||||
$product_repository = null;
|
$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
|
private function processRecurringInvoices(array $data) :void
|
||||||
{
|
{
|
||||||
RecurringInvoice::unguard();
|
RecurringInvoice::unguard();
|
||||||
@ -910,6 +974,10 @@ class Import implements ShouldQueue
|
|||||||
}
|
}
|
||||||
|
|
||||||
$modified['client_id'] = $this->transformId('clients', $resource['client_id']);
|
$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['user_id'] = $this->processUserId($resource);
|
||||||
$modified['company_id'] = $this->company->id;
|
$modified['company_id'] = $this->company->id;
|
||||||
$modified['line_items'] = $this->cleanItems($modified['line_items']);
|
$modified['line_items'] = $this->cleanItems($modified['line_items']);
|
||||||
|
@ -17,7 +17,7 @@ use App\Repositories\ActivityRepository;
|
|||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
|
|
||||||
class RecurringExpenseArchivedActivity implements ShouldQueue
|
class CreatedRecurringExpenseActivity implements ShouldQueue
|
||||||
{
|
{
|
||||||
protected $activity_repo;
|
protected $activity_repo;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ class RecurringExpenseArchivedActivity implements ShouldQueue
|
|||||||
$fields->recurring_expense_id = $recurring_expense->id;
|
$fields->recurring_expense_id = $recurring_expense->id;
|
||||||
$fields->user_id = $user_id;
|
$fields->user_id = $user_id;
|
||||||
$fields->company_id = $recurring_expense->company_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);
|
$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 $this->hasMany(RecurringInvoice::class)->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return HasMany
|
||||||
|
*/
|
||||||
|
public function recurring_expenses()
|
||||||
|
{
|
||||||
|
return $this->hasMany(RecurringExpense::class)->withTrashed();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return HasMany
|
* @return HasMany
|
||||||
*/
|
*/
|
||||||
|
@ -57,7 +57,6 @@ class RecurringExpense extends BaseModel
|
|||||||
'uses_inclusive_taxes',
|
'uses_inclusive_taxes',
|
||||||
'calculate_tax_by_amount',
|
'calculate_tax_by_amount',
|
||||||
'frequency_id',
|
'frequency_id',
|
||||||
'start_date',
|
|
||||||
'last_sent_date',
|
'last_sent_date',
|
||||||
'next_send_date',
|
'next_send_date',
|
||||||
'remaining_cycles',
|
'remaining_cycles',
|
||||||
|
@ -179,6 +179,7 @@ use App\Listeners\Quote\QuoteEmailedNotification;
|
|||||||
use App\Listeners\Quote\QuoteRestoredActivity;
|
use App\Listeners\Quote\QuoteRestoredActivity;
|
||||||
use App\Listeners\Quote\QuoteViewedActivity;
|
use App\Listeners\Quote\QuoteViewedActivity;
|
||||||
use App\Listeners\Quote\ReachWorkflowSettings;
|
use App\Listeners\Quote\ReachWorkflowSettings;
|
||||||
|
use App\Listeners\RecurringExpense\CreatedRecurringExpenseActivity;
|
||||||
use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity;
|
use App\Listeners\RecurringInvoice\CreateRecurringInvoiceActivity;
|
||||||
use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity;
|
use App\Listeners\RecurringInvoice\RecurringInvoiceArchivedActivity;
|
||||||
use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity;
|
use App\Listeners\RecurringInvoice\RecurringInvoiceDeletedActivity;
|
||||||
|
@ -13,7 +13,6 @@ namespace App\Transformers;
|
|||||||
|
|
||||||
use App\Models\Account;
|
use App\Models\Account;
|
||||||
use App\Models\Activity;
|
use App\Models\Activity;
|
||||||
use App\Models\Subscription;
|
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyGateway;
|
use App\Models\CompanyGateway;
|
||||||
@ -31,13 +30,16 @@ use App\Models\PaymentTerm;
|
|||||||
use App\Models\Product;
|
use App\Models\Product;
|
||||||
use App\Models\Project;
|
use App\Models\Project;
|
||||||
use App\Models\Quote;
|
use App\Models\Quote;
|
||||||
|
use App\Models\RecurringExpense;
|
||||||
use App\Models\RecurringInvoice;
|
use App\Models\RecurringInvoice;
|
||||||
|
use App\Models\Subscription;
|
||||||
use App\Models\SystemLog;
|
use App\Models\SystemLog;
|
||||||
use App\Models\Task;
|
use App\Models\Task;
|
||||||
use App\Models\TaskStatus;
|
use App\Models\TaskStatus;
|
||||||
use App\Models\TaxRate;
|
use App\Models\TaxRate;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Models\Webhook;
|
use App\Models\Webhook;
|
||||||
|
use App\Transformers\RecurringExpenseTransformer;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
|
|
||||||
@ -92,6 +94,7 @@ class CompanyTransformer extends EntityTransformer
|
|||||||
'expense_categories',
|
'expense_categories',
|
||||||
'task_statuses',
|
'task_statuses',
|
||||||
'subscriptions',
|
'subscriptions',
|
||||||
|
'recurring_expenses',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -295,6 +298,13 @@ class CompanyTransformer extends EntityTransformer
|
|||||||
return $this->includeCollection($company->recurring_invoices, $transformer, RecurringInvoice::class);
|
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)
|
public function includeQuotes(Company $company)
|
||||||
{
|
{
|
||||||
$transformer = new QuoteTransformer($this->serializer);
|
$transformer = new QuoteTransformer($this->serializer);
|
||||||
|
@ -96,6 +96,7 @@ class ExpenseTransformer extends EntityTransformer
|
|||||||
'tax_amount3' => (float) $expense->tax_amount3,
|
'tax_amount3' => (float) $expense->tax_amount3,
|
||||||
'uses_inclusive_taxes' => (bool) $expense->uses_inclusive_taxes,
|
'uses_inclusive_taxes' => (bool) $expense->uses_inclusive_taxes,
|
||||||
'calculate_tax_by_amount' => (bool) $expense->calculate_tax_by_amount,
|
'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_reference' => (string) $recurring_expense->transaction_reference ?: '',
|
||||||
'transaction_id' => (string) $recurring_expense->transaction_id ?: '',
|
'transaction_id' => (string) $recurring_expense->transaction_id ?: '',
|
||||||
'date' => $recurring_expense->date ?: '',
|
'date' => $recurring_expense->date ?: '',
|
||||||
//'recurring_expense_date' => $recurring_expense->date ?: '',
|
|
||||||
'number' => (string)$recurring_expense->number ?: '',
|
'number' => (string)$recurring_expense->number ?: '',
|
||||||
'payment_date' => $recurring_expense->payment_date ?: '',
|
'payment_date' => $recurring_expense->payment_date ?: '',
|
||||||
'custom_value1' => $recurring_expense->custom_value1 ?: '',
|
'custom_value1' => $recurring_expense->custom_value1 ?: '',
|
||||||
@ -96,6 +95,11 @@ class RecurringExpenseTransformer extends EntityTransformer
|
|||||||
'tax_amount3' => (float) $recurring_expense->tax_amount3,
|
'tax_amount3' => (float) $recurring_expense->tax_amount3,
|
||||||
'uses_inclusive_taxes' => (bool) $recurring_expense->uses_inclusive_taxes,
|
'uses_inclusive_taxes' => (bool) $recurring_expense->uses_inclusive_taxes,
|
||||||
'calculate_tax_by_amount' => (bool) $recurring_expense->calculate_tax_by_amount,
|
'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->text('transaction_reference')->nullable();
|
||||||
|
|
||||||
$table->unsignedInteger('frequency_id');
|
$table->unsignedInteger('frequency_id');
|
||||||
$table->datetime('start_date')->nullable();
|
|
||||||
$table->datetime('last_sent_date')->nullable();
|
$table->datetime('last_sent_date')->nullable();
|
||||||
$table->datetime('next_send_date')->nullable();
|
$table->datetime('next_send_date')->nullable();
|
||||||
$table->unsignedInteger('remaining_cycles')->nullable();
|
$table->unsignedInteger('remaining_cycles')->nullable();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user