From e86286ee9ade034d54b8808b96d6012acd8ca37b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 18:03:31 +1000 Subject: [PATCH] Fixes for tests --- app/Jobs/Company/CompanyExport.php | 27 ++- app/Jobs/Company/CompanyImport.php | 1 - app/Models/Activity.php | 9 + tests/Feature/Import/ImportCompanyTest.php | 202 ++++++++++++++++++--- tests/Feature/Import/backup.zip | Bin 13456 -> 13809 bytes 5 files changed, 203 insertions(+), 36 deletions(-) diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 2a91fc01ec13..3794be9dd6c6 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -285,19 +285,14 @@ class CompanyExport implements ShouldQueue })->makeHidden(['id'])->all(); - $this->export_data['paymentables'] = $this->company->payments()->with('paymentables')->cursor()->map(function ($paymentable){ - - $paymentable = $this->transformArrayOfKeys($paymentable, ['payment_id','paymentable_id']); - - return $paymentable; - - })->all(); $this->export_data['payments'] = $this->company->payments->map(function ($payment){ $payment = $this->transformBasicEntities($payment); $payment = $this->transformArrayOfKeys($payment, ['client_id','project_id', 'vendor_id', 'client_contact_id', 'invitation_id', 'company_gateway_id']); + $payment->paymentables = $this->transformPaymentable($payment); + return $payment->makeVisible(['id']); })->all(); @@ -460,6 +455,24 @@ class CompanyExport implements ShouldQueue } + private function transformPaymentable($payment) + { + + $new_arr = []; + + foreach($payment->paymentables as $paymentable) + { + + $paymentable->payment_id = $this->encodePrimaryKey($paymentable->payment_id); + $paymentable->paymentable_id = $this->encodePrimaryKey($paymentable->paymentable_id); + + $new_arr[] = $paymentable; + } + + return $new_arr; + + } + private function zipAndSend() { diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index ed6a456408ca..7ff1ccc2a627 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -80,7 +80,6 @@ class CompanyImport implements ShouldQueue // 'recurring_invoices', // 'quotes', // 'payments', - // 'paymentables', // 'subscriptions', // 'expenses', // 'tasks', diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 77bb73338326..7ebe6d890e90 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -103,6 +103,15 @@ class Activity extends StaticModel 'deleted_at' => 'timestamp', ]; + protected $appends = [ + 'hashed_id', + ]; + + public function getHashedIdAttribute() + { + return $this->encodePrimaryKey($this->id); + } + public function getEntityType() { return self::class; diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index f096745820ea..25b4ddfb6b1b 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -12,6 +12,8 @@ namespace Tests\Feature\Import; use App\Jobs\Import\CSVImport; use App\Models\Account; +use App\Models\Activity; +use App\Models\Backup; use App\Models\Client; use App\Models\ClientContact; use App\Models\ClientGatewayToken; @@ -553,6 +555,7 @@ class ImportCompanyTest extends TestCase // Recurring Invoice Invitations // Invoices + $this->assertEquals(2, count($this->backup_json_object->invoices)); $this->genericImport(Invoice::class, @@ -647,7 +650,7 @@ class ImportCompanyTest extends TestCase ['projects' => 'project_id'], ['vendors' => 'vendor_id'], ], - 'quotes', + 'credits', 'number'); $this->assertEquals(2, Credit::count()); @@ -694,8 +697,6 @@ class ImportCompanyTest extends TestCase // Expenses - - // Tasks $this->assertEquals(3, count($this->backup_json_object->tasks)); @@ -716,7 +717,6 @@ class ImportCompanyTest extends TestCase // Tasks - // Payments $this->assertEquals(2, count($this->backup_json_object->payments)); @@ -739,36 +739,117 @@ class ImportCompanyTest extends TestCase // Payments +// Paymentables + + $this->paymentablesImport(); + + $this->assertEquals(1, Paymentable::count()); + // Paymentables - // $this->assertEquals(2, count($this->backup_json_object->paymentables)); - // $this->paymentablesImport(); +// Activities + $activities = []; - // $this->assertEquals(2, Paymentable::count()); + foreach($this->backup_json_object->activities as $activity) + { + $activity->account_id = $this->company->account_id; + $activities[] = $activity; + } + + $this->assertEquals(25, count($this->backup_json_object->activities)); + + $this->backup_json_object->activities = $activities; + + $this->genericImport(Activity::class, + [ + 'user_id', + 'company_id', + 'client_id', + 'client_contact_id', + 'project_id', + 'vendor_id', + 'payment_id', + 'invoice_id', + 'credit_id', + 'invitation_id', + 'task_id', + 'expense_id', + 'token_id', + 'quote_id', + 'subscription_id', + 'recurring_invoice_id', + 'hashed_id', + 'company_id', + ], + [ + ['users' => 'user_id'], + ['clients' => 'client_id'], + ['client_contacts' => 'client_contact_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ['payments' => 'payment_id'], + ['invoices' => 'invoice_id'], + ['credits' => 'credit_id'], + ['tasks' => 'task_id'], + ['expenses' => 'expense_id'], + ['quotes' => 'quote_id'], + ['subscriptions' => 'subscription_id'], + ['recurring_invoices' => 'recurring_invoice_id'], + ['invitations' => 'invitation_id'], + ], + 'activities', + 'created_at'); + + $this->assertEquals(25, Activity::count()); + +// Activities + +// Backup + + $this->assertEquals(25, count($this->backup_json_object->backups)); + + $this->genericImportWithoutCompany(Backup::class, + ['activity_id','hashed_id'], + [ + ['activities' => 'activity_id'], + ], + 'backups', + 'created_at'); + + $this->assertEquals(25, Backup::count()); + +// Backup + +// Company Ledger -// Paymentables + +// Company Ledger } private function paymentablesImport() { - foreach($this->backup_json_object->paymentables as $paymentable) + foreach($this->backup_json_object->payments as $payment) { - $paymentable = new Paymentable(); - $paymentable->payment_id = $this->transformId('payments', $paymentable->payment_id); - $paymentable->paymentable_type = $paymentable->paymentable_type; - $paymentable->amount = $paymentable->amount; - $paymentable->refunded = $paymentable->refunded; - $paymentable->created_at = $paymentable->created_at; - $paymentable->deleted_at = $paymentable->deleted_at; - $paymentable->updated_at = $paymentable->updated_at; - $paymentable->paymentable_id = $this->convertPaymentableId($paymentable->paymentable_type, $paymentable->paymentable_id); - $paymentable->paymentable_type = $paymentable->paymentable_type; - $paymentable->save(['timestamps' => false]); + foreach($payment->paymentables as $paymentable_obj) + { + + $paymentable = new Paymentable(); + $paymentable->payment_id = $this->transformId('payments', $paymentable_obj->payment_id); + $paymentable->paymentable_type = $paymentable_obj->paymentable_type; + $paymentable->amount = $paymentable_obj->amount; + $paymentable->refunded = $paymentable_obj->refunded; + $paymentable->created_at = $paymentable_obj->created_at; + $paymentable->deleted_at = $paymentable_obj->deleted_at; + $paymentable->updated_at = $paymentable_obj->updated_at; + $paymentable->paymentable_id = $this->convertPaymentableId($paymentable_obj->paymentable_type, $paymentable_obj->paymentable_id); + $paymentable->paymentable_type = $paymentable_obj->paymentable_type; + $paymentable->save(['timestamps' => false]); + } } } @@ -780,7 +861,9 @@ class ImportCompanyTest extends TestCase break; case Credit::class: return $this->transformId('credits', $id); - break; + break; + case Payment::class: + return $this->transformId('payments', $id); default: # code... break; @@ -793,6 +876,66 @@ class ImportCompanyTest extends TestCase $class::unguard(); + foreach($this->backup_json_object->{$object_property} as $obj) + { + /* Remove unwanted keys*/ + $obj_array = (array)$obj; + foreach($unset as $un){ + unset($obj_array[$un]); + } + + $activity_invitation_key = false; + + if($class instanceof Activity){ + + if(isset($obj->invitation_id)){ + + if(isset($obj->invoice_id)) + $activity_invitation_key = 'invoice_invitations'; + elseif(isset($obj->quote_id)) + $activity_invitation_key = 'quote_invitations'; + elseif($isset($obj->credit_id)) + $activity_invitation_key = 'credit_invitations'; + } + + } + + /* Transform old keys to new keys */ + foreach($transforms as $transform) + { + foreach($transform as $key => $value) + { + if($class instanceof Activity && $activity_invitation_key) + $key = $activity_invitation_key; + + $obj_array["{$value}"] = $this->transformId($key, $obj->{$value}); + } + } + + if($class instanceof CompanyGateway) { + $obj_array['config'] = encrypt($obj_array['config']); + } + + $new_obj = new $class(); + $new_obj->company_id = $this->company->id; + $new_obj->fill($obj_array); + + $new_obj->save(['timestamps' => false]); + + $this->ids["{$object_property}"]["{$obj->hashed_id}"] = $new_obj->id; + + } + + $class::reguard(); + + + } + + private function genericImportWithoutCompany($class, $unset, $transforms, $object_property, $match_key) + { + + $class::unguard(); + foreach($this->backup_json_object->{$object_property} as $obj) { /* Remove unwanted keys*/ @@ -810,13 +953,16 @@ class ImportCompanyTest extends TestCase } } - if($class instanceof CompanyGateway) { - $obj_array['config'] = encrypt($obj_array['config']); + /* New to convert product ids from old hashes to new hashes*/ + if($class instanceof Subscription){ + $obj_array['product_ids'] = $this->recordProductIds($obj_array['product_ids']); + $obj_array['recurring_product_ids'] = $this->recordProductIds($obj_array['recurring_product_ids']); } - $new_obj = new $class(); - $new_obj->company_id = $this->company->id; - $new_obj->fill($obj_array); + $new_obj = $class::firstOrNew( + [$match_key => $obj->{$match_key}], + $obj_array, + ); $new_obj->save(['timestamps' => false]); @@ -826,9 +972,9 @@ class ImportCompanyTest extends TestCase $class::reguard(); - } + private function genericImport($class, $unset, $transforms, $object_property, $match_key) { @@ -897,7 +1043,7 @@ class ImportCompanyTest extends TestCase } if (! array_key_exists("{$old}", $this->ids[$resource])) { - throw new \Exception("Missing resource key: {$old}"); + throw new \Exception("Missing {$resource} key: {$old}"); } return $this->ids[$resource]["{$old}"]; diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index 24c1145e7a487bef03ef1cdf8064575d29f8683c..33cbe23c9ab01a58a883ad8e859bf20a155f216b 100644 GIT binary patch literal 13809 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 P0rLK-e?OBleO&!7z^dU; literal 13456 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 VA)($mz<$5#et-7;9t;S`{{cV|-2eap