diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 033e44816e95..da284f23e370 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -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'); diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index 664c09afa9b1..a7dbc17f9265 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -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']); diff --git a/app/Listeners/RecurringExpense/CreatedRecurringExpenseActivity.php b/app/Listeners/RecurringExpense/CreatedRecurringExpenseActivity.php index 12608e17183e..b84c5baa48f8 100644 --- a/app/Listeners/RecurringExpense/CreatedRecurringExpenseActivity.php +++ b/app/Listeners/RecurringExpense/CreatedRecurringExpenseActivity.php @@ -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); } diff --git a/app/Models/Company.php b/app/Models/Company.php index 2d6e9badd87a..b4450370b0ce 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -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 */ diff --git a/app/Models/RecurringExpense.php b/app/Models/RecurringExpense.php index 87e8b6911243..8e766cc66bc1 100644 --- a/app/Models/RecurringExpense.php +++ b/app/Models/RecurringExpense.php @@ -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', diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index da39760ffa91..d993288a5fb8 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -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; diff --git a/app/Transformers/CompanyTransformer.php b/app/Transformers/CompanyTransformer.php index daf1f802941d..9183bbacf3aa 100644 --- a/app/Transformers/CompanyTransformer.php +++ b/app/Transformers/CompanyTransformer.php @@ -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); diff --git a/app/Transformers/ExpenseTransformer.php b/app/Transformers/ExpenseTransformer.php index 21908884ba5e..4937fbb4f4fd 100644 --- a/app/Transformers/ExpenseTransformer.php +++ b/app/Transformers/ExpenseTransformer.php @@ -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', ]; } } diff --git a/app/Transformers/RecurringExpenseTransformer.php b/app/Transformers/RecurringExpenseTransformer.php index f2da8f6a0831..1323421a3a97 100644 --- a/app/Transformers/RecurringExpenseTransformer.php +++ b/app/Transformers/RecurringExpenseTransformer.php @@ -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 ?: '', ]; } -} +} \ No newline at end of file diff --git a/database/migrations/2021_08_23_101529_recurring_expenses_schema.php b/database/migrations/2021_08_23_101529_recurring_expenses_schema.php index c57079f2e5a1..e93fbf01ebf1 100644 --- a/database/migrations/2021_08_23_101529_recurring_expenses_schema.php +++ b/database/migrations/2021_08_23_101529_recurring_expenses_schema.php @@ -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();