Merge pull request #6592 from turbo124/recurring_expenses

Recurring expenses
This commit is contained in:
David Bomba 2021-09-07 07:23:48 +10:00 committed by GitHub
commit 6200f572e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 106 additions and 8 deletions

View File

@ -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');

View File

@ -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']);

View File

@ -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);
}

View File

@ -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
*/

View File

@ -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',

View File

@ -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;

View File

@ -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);

View File

@ -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',
];
}
}

View File

@ -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 ?: '',
];
}
}
}

View File

@ -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();