From 15ce58618b5d1a9dfeb60520748f966d9b2ad230 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 28 May 2021 19:39:22 +1000 Subject: [PATCH 01/12] Skip user tests in Github Actions --- tests/Feature/UserTest.php | 78 ++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index 843e819f11..02dd137db1 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -54,6 +54,10 @@ class UserTest extends TestCase ThrottleRequests::class, PasswordProtection::class ); + + if (config('ninja.testvars.travis') !== false) { + $this->markTestSkipped('Skip test for Travis'); + } } public function testUserList() @@ -95,54 +99,54 @@ class UserTest extends TestCase $this->assertNotNull($arr['data']['company_user']); } - // public function testUserAttachAndDetach() - // { - // $this->withoutMiddleware(PasswordProtection::class); + public function testUserAttachAndDetach() + { + $this->withoutMiddleware(PasswordProtection::class); - // $user = UserFactory::create($this->account->id); - // $user->first_name = 'Test'; - // $user->last_name = 'Palloni'; - // $user->email = $this->default_email; - // $user->save(); + $user = UserFactory::create($this->account->id); + $user->first_name = 'Test'; + $user->last_name = 'Palloni'; + $user->email = $this->default_email; + $user->save(); - // $data = $user->toArray(); + $data = $user->toArray(); - // $response = false; + $response = false; - // try { - // $response = $this->withHeaders([ - // 'X-API-SECRET' => config('ninja.api_secret'), - // 'X-API-TOKEN' => $this->token, - // 'X-API-PASSWORD' => 'ALongAndBriliantPassword', - // ])->post('/api/v1/users?include=company_user', $data); + try { + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + 'X-API-PASSWORD' => 'ALongAndBriliantPassword', + ])->post('/api/v1/users?include=company_user', $data); - // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - // nlog($message); - // var_dump($message); - // $this->assertNotNull($message); - // } + } catch (ValidationException $e) { + $message = json_decode($e->validator->getMessageBag(), 1); + nlog($message); + var_dump($message); + $this->assertNotNull($message); + } - // $response->assertStatus(200); + $response->assertStatus(200); - // // $this->assertNotNull($user->company_user); - // // $this->assertEquals($user->company_user->company_id, $this->company->id); + // $this->assertNotNull($user->company_user); + // $this->assertEquals($user->company_user->company_id, $this->company->id); - // $response = $this->withHeaders([ - // 'X-API-SECRET' => config('ninja.api_secret'), - // 'X-API-TOKEN' => $this->token, - // 'X-API-PASSWORD' => 'ALongAndBriliantPassword', - // ])->delete('/api/v1/users/'.$this->encodePrimaryKey($user->id).'/detach_from_company?include=company_user'); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + 'X-API-PASSWORD' => 'ALongAndBriliantPassword', + ])->delete('/api/v1/users/'.$this->encodePrimaryKey($user->id).'/detach_from_company?include=company_user'); - // $response->assertStatus(200); + $response->assertStatus(200); - // $cu = CompanyUser::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); - // $ct = CompanyToken::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); + $cu = CompanyUser::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); + $ct = CompanyToken::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); - // $this->assertNull($cu); - // $this->assertNull($ct); - // $this->assertNotNull($user); - // } + $this->assertNull($cu); + $this->assertNull($ct); + $this->assertNotNull($user); + } public function testAttachUserToMultipleCompanies() { From f3b52b0a22924b4e6cf54521741b588a7a60bda6 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 28 May 2021 19:57:56 +1000 Subject: [PATCH 02/12] Fixes for tests --- app/Jobs/Company/CompanyExport.php | 2 +- tests/Feature/Import/ImportCompanyTest.php | 3 ++- tests/Feature/Import/backup.zip | Bin 12888 -> 12890 bytes tests/Unit/SystemHealthTest.php | 8 ++++---- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 8fa94893d5..4404ed18a5 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -330,7 +330,7 @@ class CompanyExport implements ShouldQueue $quote = $this->transformArrayOfKeys($quote, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); - return $quote; + return $quote->makeVisible(['id']); })->all(); diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index ce60bcb08c..dd1b6fb687 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -531,8 +531,9 @@ class ImportCompanyTest extends TestCase $this->assertEquals(2, count($this->backup_json_object->recurring_invoice_invitations)); nlog($this->backup_json_object->recurring_invoice_invitations); +nlog($this->ids); $this->genericImport(RecurringInvoiceInvitation::class, - ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id'], + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'recurring_invoice_id'], [ ['users' => 'user_id'], ['recurring_invoices' => 'recurring_invoice_id'], diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index fec0e85ceba85bd3a0605dd32d02f525344ac5dd..636003960c9a72081f842ab691d037bc807a3720 100644 GIT binary patch delta 2247 zcmV;&2sroHWZGm5P)h>@6aWAK003K_kqjOR{=BeY1--Cf0=<*bF%uO71QY-W00;m< zki1d=000000001Tkz5`MdZVyl2)(di{=Bh-=_r2?D|z*>dn})6)Sw~U0=7Sw+nEQB z(qGb13O-Tri7u&6w3On{DE)AsXnd_i1cufh%2OJuSX{r*9xu+IjEj$|jA7SuxfKQ| zV^GGRj6oUyIAxrLNPptWSlUtwm2vS-ID)R)!o1H7&QmwEL?>4<+|laonn#zPk2h+r z*KmK@pFj65z4xEC?VXe6aNGN|bz3~X>{m*k3Wbr?9ohEP`_YkCI?KDK&C`nBGR|^O zc1LSI3-Dogw8Xo;xm{LzY>}5jk?Ws#+NEPFf4l#_)6Z{Ju4gk`F#KL#`dN4`N;LWt!{t$#6SLdB9BeKie}{3^~!pY7?bz!1M^Kh z58DTX!#rdJ>{7r@&ak1pJi;8aZyRV;DJsb zq@Hew?1qtc#EQ@Hn~=PT#Y}SbrrdvYZ49h7Z83Hal4>3M=$AL-)o)`{`lLWr&X9!A zCSC%`Ks3oRr8jNC@zIBO*{Z!X;K&6>?ozZZ96wo7?=JXpf1)2(t(VK>0h}j!(B!8a zA2oi71_KBiPX) z((e1po84ip@MXJtUfKM5qQ7}t8EhXN`%YlIx%LWYU$1ZWx3AIZ*3jGbil4ge&3B#K z-q?P#IlSIHBR9c4(GA#CYff!!Fzk|mHce=!gr({FI{iO&h>-V*>HG5ICf$Q2m!hjwPEEb#OX+`;Dktj^ND&~I z>VBEFIQpd*GNC@<`}v{mu3m&>ta={pEW}c2cHUPf^neForMrSy( zZ?BH6tt~&l`RU~Bbkl#@xw7rvR?swpov#P`gG)1~90YTkw@<)vsB-Z93`bsyWTi`8 z_=y_lw08QXeSOu{o$c-B+3pScRP224-@WNHgZ4)8_^9eyO|NI;Mu0E${58OcyS4= zU|czGOkXDSY>Q~Ih^0QZ0_tq`W@Jj}nvs!(`_=%faLlRgvQokqKiK1EQDNV4RNQlV z>?IK1K-kEw_o;t&@lkq!hmGWV7X=;HQb%A<_J&YvDX8IEW0vS{+C_HZ2kw>04X4mJ$Q0@tsH0wi(fQ&sY_KFgDMVgJ1879O0O7hAp z>Fz3AO*9Nc%Xz`DuM*pxz9mQ=xwHH9O}o5NStE}}<=KCWb}Hn3N{bd%dg_k9-TFgu z)5)y^X&s-2+))P5<%{cC@mfSRy&Ea_p&9D?&>mqKAWaP7E4XT(0siy`y&ioJk4!Fh z7u8uu_~#$SJXTG{N>mTy+qc~0-o+#cU40qXi!l%Sp8hN9bYxg&1^U9%H^*{gE zT6%wx54p%qkbHtsIa+vaPq6(p)&f_v+$UUPV~!fX?`e4Cw&`2IPq)T}IcmH`-lcuI zRV_{#&e4U?*iX6Eyr`53 zXaCcN$bMz5G!y%Ybw1l5^QYYqUQBU^6qW9fhf?d4YrU}Q+r$CHp9harC;yJMCf&%1 z`*G|l5MPB3yYrwIcw$lfZRm`>3%vIBZS^i6U)|y~iS0tsQ^YF6E0#PG`3SZF-wfps z-x`1A+Rpjq{s5IX-LkQDgUNxVZ|ms)>@iEd8=!i{NCJ#0wXk-6By8RDEMEfT$J z4uVcRh(#h+(?i>m0@|+Ic2M1DnROpwA;o(_%_iy-3D7-2!nQ9MswN&grYC>#7ndcH zZ{NnF6wfdttb*9Y!XN#PWGg&(8#VUsbV+4|Kv&-p#SzkZ+RdB6YoJg?8^@7IJc$ye$UL_}0h=+{&xXGy6V zaPn(z@_uIXXTriIg@i@vB0@rc*FWe^p`Ai6lJQsmzWG_cS?;R8efdfMT5$5;KVWD9 zu{roiJUAC)bhqbse_>uxFSAobhM~teDCVzaYV~w<-;E1FzS%L2hDI%pht66q$;=;; zcGj&@%io8-J3Ui+*NcR9540D)p;&kPw%1VmX$MJvuc6{bgimkkRTMIl3vmqSFK_3{m~ zZHVT?gwEv*uvvH3>Rw_~F<(%Wj)K8;Bnhm$Y7A%X1A!a5Atl|ML31YYeNHO{m}1bd zI;ZJ!qZYC`$8iek4p(htY2qkTx~fs%qgsAM`0$9|qvj&1F4!nwM(xL`tgdoT z8$HSIU0scdAk=A?|XUEBZLd5|@DRoM{ka?w;6Rhdi6&I@)#bv-7dfbFJ zIZh7^pu>=zj+BiB+yD#?Z6&LCz>BhQQ$=)f=$rbA^_f%sKBezJmO7P=cS$579ZJ78 zgSi(3xEV%_0JR#%Tj;Yq0mm($q~#DdDDoX>p^M-P?8m7% z$H3Oy$FTc9R5OiBuVybjv<06#nMF_hzFtn^)%LCotAxZBh=xRIPi{!$%`)7?u8T)N z_4RVj3lwv?&Gv)Oi6674ZW#~}Vozdrc(oHlqYDMaC#}0v2p$Zx6+BG(oTRgQL8jNVV!vx&P2>8+4N^Jw<3H-LQe5c*)o+uN;Sl+5W4EhFj za=Df2Esbv!bva)3+@u`7C$hn&?i%5WnwxN#G1AcBNN9g|cYAa|th4FDDB`;Iw6far z2TVoHim49E47{-+0Y3np8{=KY0h?Ojj~(ZNn^WS`1754w*hX4a)XRiV)U<5nAt{dZ?Ti|!Obzi>id+4l5D=N* zkC zT#I|@DQ@yGFHxB9vnl{eEau#`we*#HDW?TVI?isxntrHunI+Kl?6htg{&HVEPZ<+2 zKlJWLI;h3(6Y>v=oiLXN|l(Pk>fmGm!ghL#52oCE0{M&@~dS0LZQc+1Gh@R};n9$CuIW zz8+UUKfwIBW98dg>r#-!C!8#XWp0hIMD@xWt&%U?@3wl)>8ba)#(~WU&B(;tzCi(9 zH&B6d1imRk{_)D0L`uYvs0;SMTR51@EuOaejMs;9N0Rd4$*Y?htmWQY&MTt(v z!XL5GfoZ`2jJ6#N#D0DjNG3H|`tzta>$uZjUrj7BVNw=y*!vQmsTB9mSq?`pV^W0& zB^OvNo$0sGRI}!AZ08O_FsndyQV>8cQnTROCrfiZO~pd8+;(|-%|rQnDS4EZgt3Bk zaPVtM@FQ!+BZqBqv$a*}EPpJNOgv0ISPcPn0M=Nv@bo96*Q&;^mb=}d(^5eW*$PS2 z6B3r1s)R#(-ZDyH=Y?V8F!PGQy1u52n#>t+iJvSdNtCX7z-w}^l(THc{t;B`rgHBe zJy`hc7eGj28G0n``w26F+bzVmy)4p`8Y>3hgH)XOc zm}J}ptu+36CG06lp!m{pA0+>+W<#oQTQg!b5y1s6K_qs1_?2zZkN@assertTrue((bool) $results['system_health']); - $this->assertTrue($results['extensions'][0]['mysqli']); - $this->assertTrue($results['extensions'][1]['gd']); - $this->assertTrue($results['extensions'][2]['curl']); - $this->assertTrue($results['extensions'][3]['zip']); + // $this->assertTrue($results['extensions'][0]['mysqli']); + $this->assertTrue($results['extensions'][0]['gd']); + $this->assertTrue($results['extensions'][1]['curl']); + $this->assertTrue($results['extensions'][2]['zip']); } } From 77f6bc0e0b16a2746a2724ff60531f5c6dd9238a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 29 May 2021 08:09:47 +1000 Subject: [PATCH 03/12] Fixes for tests --- app/Jobs/Company/CompanyExport.php | 4 ++-- tests/Feature/Import/backup.zip | Bin 12890 -> 12872 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 4404ed18a5..64fcbeccd8 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -335,7 +335,7 @@ class CompanyExport implements ShouldQueue })->all(); - $this->export_data['recurring_invoices'] = $this->company->recurring_invoices->map(function ($ri){ + $this->export_data['recurring_invoices'] = $this->company->recurring_invoices->makeVisible(['id'])->map(function ($ri){ $ri = $this->transformBasicEntities($ri); $ri = $this->transformArrayOfKeys($ri, ['client_id', 'vendor_id', 'project_id', 'design_id', 'subscription_id']); @@ -441,7 +441,7 @@ class CompanyExport implements ShouldQueue private function transformBasicEntities($model) { - return $this->transformArrayOfKeys($model, ['id', 'user_id', 'assigned_user_id', 'company_id']); + return $this->transformArrayOfKeys($model, ['user_id', 'assigned_user_id', 'company_id']); } diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index 636003960c9a72081f842ab691d037bc807a3720..5260bd4b4f6df3986fb80a129f27d370fa54640f 100644 GIT binary patch literal 12872 zcmb7r18^l>+ifth&&0NE+qTV#ZA~Va*yhBxZBLSkZQItJ%)B4&t-4kJ-=}(?y`Nss zT5F^FRCS*%F9rGu8R+AH6lhocQ~9TW0Kx|{G%&Jswxd%~h693_G_Tfw`F%e8KAqiQ zfPg<8fC2&iDdhi`O#ePVc>f>1Q*Rj0 zY0j&AwadM9S3mDB_UWDzey&nl(D|;K(CJsk8R`-%oc2{2c@%P;&w6TF4m-@|n&JjE zoIOJQ4!hJIBIJE}?ds%Ld_cU#<`e&R zYOgjvdkW{>7!s=pveP74g|&!Op&=c5a>4k?NM5cMJzfAM1dbu^^2M}Wu*+(xfh^=qm>zMbc3%Mvl$gs+VifrN2{P<_69MTs!x1|C0xtQzv&o&S(Vcq_41C?}7^;bzn#nD#RTq9uj1g1I_cN^eVE6TU=D-XnSmgy-fDd~DxhS`E(33FM*1q2jz5+mF) z=`@Imr_})yD4p{getlQO6mlum$Yd8eOLVcuwjmr`ar; zs_<&n4AwaxHow)Vpq~`ToggD$-zx z)6#~DHSe2q!Ujl2ghrKlHQJseQXHvMJqk_p!RCIm%K7p0VIjW+q#Z*f7%0xPq%jh8 z4|QqUD<>S`THQGgm;x}f_wq}mM-B-47Hf#9k7Z|W4FzpC+^>ziPH2(H$H%o#9J*_0c&!rst4dM$$gVlN@GmS7&|KJ<>Gk#}6g3pG_seaqk4G*6> z)7ubQxoPfA5;lpjdL_F0!o+L`cRegb>(G6^p9Ae2jry;bJG4JprUPuSw_o~w-;Bz*T=;T^Q~-ihZ!30M z0}FWQ!e5etuy~*%a4mA^`(90FA0~Y5Tr+j^`GgOfkU-L9wFVQvR~W}^O`r_+Q>KMy zv-r zj>9=gxbSKyQV`oqxZ6i^SkCw|cJL@Le@FT}1#N)rS~Q!giH0O?X;FcClMTlg z8hnrdslj5@hddGffRLGSin2pssN3Pylgn&1amF$k%EV8Vxyrv5SNRmAPP|X1x64YT zP-#OPjy@NVHUEDGGW#J(>`MH)Ovf5PgL1_7J8& z$wobWqW5a@1)P0*1)G`ZWsMu;SAkk|VNr1ylgqICvIVG0#PE3AzSTe*d6B5;~B zAz#g`foxeJ3hQXo!i;lOpz*d!J(DANsHiH}LwaIVzB*5=u=<|4btUC5lqtx{x7sE!w)!2lMUqa&IS+;J!w=?fi`vsGI-ymJVNLC13{zBP z+D;>x1DpM3%YZPmqEy7t#o3E?trkXFn0L1Qrr2k_F3Bkw%^<&Ze!S9mJX&X+WnWt1r{ufa!*lX9nUC zxAdfy9k?$bX?K-TCiAWaGmDtS=aQPX%yhX$ zA60J8=?S;10wze3!vaNbMF#u_`3#!bpVO|CEXzS!B04W2aTn+BIaF9!j=|EUEg0IF zxAD9D19^jW6_lcxkys!vmMEo>XOc4ntAKYYDqn9wh<+?%>Q__2WTG@+Roz=s8-YZq zNfULjfJtl(FRTS=q+i&P5A)nA_Ch5x=HTEgx^^oIcV~}0H)zH9QLJL)nae`XHe7%` zm&-=Rv*9dh)t|ySpo=LgR(;)3&b+%rDKy!Htg)F8#2Ud*QJhWDC{wkF=Aed7o2toD zIg#89KZo=QWnww`^tOa!$C)L@V{)mxot*QU(S+}kg@fLWdub*W;;yZ>U?=5jrl%~h z>6uIcr2;0_B{EVuvUO;;+-98V(<92dn0F9x6V`JSKLlg@c1E&lWNx)hv5j1O?D9QA zQyk>x_)l5sH@#T*J+Jt9Sy_9oE;90s6701ofC@cn!T&Oo_MX39fyiS zrRN2`E%rj<3B-sk)i%kPhvsk@=ntNT8nFB9_qhOuFGD+3F(3~ttJcXZM#m9R)Ta>_ z{+lVpDEh8ZgR;w6;vy)6`6^l594LcElN>1wLZ9&^ZwmF=xUs70Q80UoH~UX^)SB3P z>-lcY)QXzzEd++iV6STJEI$~Iv{t5V1VV0;yJR%wR_aVY6pA=44u!xsN*uYzuqOqw z)x4ers=4WuP@YI}6-6s^`dmfL%+Ir5(I$rA!-3~c`$CzmayLbhyDy_!xU3Pc$&v9e zJ@-pDgWAbrCK2StXTs`=H`yTiN;@pL#^(^mL}zT<$CUi*jRJnM8_aSC!AfbFF!8p&5Qo(wcUson?d0@ z7jKq5*ERP&b)xOf)vRmdZ9KZtyT>DduHB;vK(?UndABMQLi5rp!a@ng@VQThB%y3OMzqN?Rb6i2w}?GP*@{WSUrkjSw8wmxjGOD#oVdfiqiRxj6{WzJcl z(o+VlZOIa0c^f((VVgLOVDo(qqyojR{HrCH_OVw!=->Km5`2?tSN*@Qlmh>|IT~VF z4>S+`@AjX>O7PfEF+7|x!2hD6+Rz047bxKcXx<{v=L7gB+~U+UM{!OlJ6JE7tm0=` zo^M~i-9ACS-~g|S_lE%dpJbX=Y@9#Bj0FEU$)F_r$5o06J>Ua2@*m#+%TqM*hNgh= zzcv4_YkzJ03B3h1sY2CK+LgOA!C6^*vUo0tEI$$eX#p=-09B!UEeEoitr^`!0SK0)}R)itiQIpV9t362Rj0Z?MefJS9Azc zsT;wn%ZjDXf{jg@$=Ma=SZfJI;$Y8^dPf*>whkwYw-q)>e@sRNn5F}kPF5r^RzZw2 zvLsNZIhhhwBw>pb_#;3pkmYkbNj@P7-yH~pe?%Cukmz&2Vu1Z5*B1q5f=*WG3I{P& zegif|{u@51F%YFHz-5v=m}bZYU^5Sd?@cF9j+_-RaoX(gbwYgP!F}ZX#%sE8TmgNg znFxOR%g3oA`wutMs6O!rEdCYfx5}hRPdKduDCK`?{?6~@0Qzg}uZw>i{Kr^{2zmM+ zp%2c38hue1jO584>tqEecuXVFa%NMfeWm`65|)8p!Vh8#pue5?J@PRSe{6jI6aOv$ zd*uHb{4??&uoH;?5>?^NllYf95F#GR|Hf9VzGx}NeYmP^yP5Jg|AFL5K};qOckhF6 zsyl@Z&<`o_e|r6US-Jy#sQzA-f1Q3T%fCbUu`EAeznA4lUo+@)+f>bG$oIYBqYF|e zAA9I#!d_7OB4v#o#cqm*#JZzwJ`LIDrU2(T;NC+LMAYK^Xz9UC5$>HOHL0N$+&7Fb zYzC9$G_s-eQNF24vCora)g(S#O^rBaTH=4wX;0CJs{tvZ;@1H_f|j3O2e3gAdO8t; zengr%VAR#RT0rJdsw%!ZgOyR~>i{29z5^XY{|!4IR#oi6mRUZsmX&@oim0yWXP&F~ zbT-%X73JC^_yAh~{muP74@jT?Q2d^U-*IU5`QP*Km+;R#e85g1K4@w2=A2`+6hAQk zrMbH&xjo>EozkMcsI@TO*ny+^`Zm$4@vkbH(PN~mt6`5Az zvG=wcee`J-=&yW=AIv(uWyh61m8D~0^dV7sR1c~oS_JVH>q{C7uZ);OMrK&0d;^}pnR@ODxyyWUt5ki`_GYYRf%cJ63j7zTGD`bh z4(NkNI`|)^!V##ytd^!2;h#QWHFzKVEnZ#odatqnudWEx@364(zis?u;g2&CKA;ZF z;y>Ac!n7C{^@fS{U22k9@Lmb@j3WPv{0B#@xh4Atx#y<1b-j6A8mPwiZo5IaQEwWb6`!1N ze?OgwN=(^fcz+yPtWNhoeUsZ%pyb_S;Ijw4WVh|)6BS#|1#_cLyx|5s(db|1JtT`! zjcqqB4K3oZ(8BZ4bQw`p{zqK=T77Y1+4J~L!xc#*iE+UBaL%3v#rGP;43LBWv;4JJ z48b6g6GUU@-;eF~ryTt0OX7HNv1_8l+3<^?1vvUS3=}*4BZ#_Nq%0B|DNB= ze?_0bioTH?g@`+$fe*s8HtY|3(sSUd;sJ=8M@v(Qmi?$q&HGExRei>&%MvV%gYG<& zyDMaz#50P(0$&qMiyb@;P{BR@PZ507ADi${G>^CC^3V2_n3oV_E7td~+smB`AI?_M zQ@HTvCMpJYQx}Uf6J5AWTf?P-ITu9pPJ13~4Cd(NGS^)^v+)fx!oC4%y@rE{-kb`| z6vq`L#!3n2bD-la;|t9z0Q84{@FKB0e~l4^ve()EMKBlc_oPx7S%Dnk?yo2eLJ$>* zI#&(sZzs{r5;vNxs%Z0EVxWaP_6Fqir*of#&!=xJzFM4#MAfYCwp@0~*EQWmlw>{)Al_Hc9k|}d@OZlgOld7)ErIOr{=mw1Q7nYQs~*@OiDd}*{#-&)*hGkRZmrbj`N;$aQuu}EDa+Ul%bGvC9W-Mgs1R!s2c|5KdPDn`m&uadY6nM9VCFw zyq!FB@YDo$xf3ud+ryA>?+GOm5JEHqxk_&S(uD(^GURc37 z%W9xUn|;k)9m`aEyX$b8#BKNFxp9@{{c*+hoWVtETNbTT#ct%jVc(}>rKbd=ZqsJ>ua8LKeWuOL7u1| zmm4P%yuK37u#I?JrWvf3%@j^2N%Pf3`0HB29iM&N!bO?m@b%3lhI9NpIBve5Ky zw2mAsn!`oQH3-1U!_r|BUA za}*Y!jGmu^yC`iZ-shpO#A8M>LmPRDq}g2(PxUP`K}s5Jh(XgAqW;7$i7?1NXnQ*n z-SsS9(eQJie<5n83Lb$|F}Rcc#A);o21(IR9QjdXC$w4+q$GU=79r{TO`#Ikn*`?^ zUQe<6&fgA-mz&I22>{7AZXKk((uhJ^XEyZ?_5^JRcDx6;mg(|XB-LPreIw;DJaOUJ z*xWss9W*9LmCHwNM@L-c?EF6$3|BvIYGeyR+QY_>5xPUR2U;sPhE-g0XUHEkeTm6E zRuDXC$qXYSEhAm2n9+Bs_jI@$T z9Yn7;dRd;kgv!VgXyRajd0)(kzOiXqk>r;^yGQW+w5;q7GfyP@=N_Y5`$`dDdrhzR zIB94$s`dAsz*XsiJpwmfqS7BX3~?dUj!K5Z8Wdhs!wHBSPr`bW#j1Jyn`sQ>3Txg#kGWp=cETP&~c?Xtx;Qb+2!|XHpl7SS% zAnzb7OtHlVj9~54XRQ&7U!=KD# zg*RaOv>6*7n&l~lI76`(zJ{rE(3jHFqPI>&#akUcG|b!)*_$U?OEK7WC)(i7@WpM>FI@v9rANbkCZk;bSQ_do zBxDi-jx!uZrx;w~NdZnjLmaJ#gqsBN9Vfc9%1NOpi6BE)8~n#MGkn?(Ieco72zHJE zD^9^SYh8?JM^CHizC50Zrp9E~*GEK1hW%?2qOOmCP^ zOY3;KeLdS`N3k^-YMwO-YTmwLoDrq8o-2#oK<7;25vP!as5d_W6}~w)Zlnsf#!#Sx zK|zq!;jonhTpEt>oVod-+^=$24*_ZAbSaCf+FQum3B*y9Y)*g99cN)FG3uf|Ug*>> zggk|snihU^Kg@GU%8MqS?In>kHW;O4&?hozEK>*$?+=hl78tLfuv&lhYTV&vw( zzNq$xAjW)KTM7Vu$OxBAWe?Zs5ANlx=uPsvYXHo*X6msAb|@8+ zUxpjKjyUgc-Jc>62il$FAf@^`;>Pijl$0;;x?%Sp)2|=mjVMFeh3DUt@$7 zPNY~9jR>h;OY6j=1EeGz^o&2{6U%-UxsLV*csP%b4Zz|dsvcX_nl;UQvLDXd%`->nW1U1 z|NMM-2yf!qjfUd~sz@9DuL0$)nQEjh7YLn24|xaTBw1PG;G__*Vt`~R!k+Vw7FeyE zNp&ZjS*VCWfQQR@D_iX5v1r@79aFJY1$0Y-#Tk4d_WE^! zhGB8MI5wsW#x}jiXWD!yv5P#uK=gO#GkBPO#zEi4>J<2!0rf8gU^RN!{Om%m;}Ec2HLrBjbH z=;bd!7SjZW{2ZfT!h&(Xz9m)ItHOe6jrpGzIbppv#3!OXAH|+N8zV$(497x5z^eF1 zF%;-Rlrr3B>+OKVC6#9X$)~}SIM3Y=4+O<{_b5qw%Rd|epQ+Lu`{!WM18M{ysb?k+ z`9$>Oq70uwf~$m#Z8K=y3FWyul*I=|InpK54jX`jPItbb;O&qWFF>2kAiH?MByNfE ztpu;)<}A95OXL7*KbgkVD44Fy!SEIJGnvi}b-+r^b!%t^XVL*{a_~WIpR(7mvk-oN z7FmA@M;P*L4@KG&6&Qs#?cgdlclmyNBT0|t+j>`Bi)!pX$*-GNdoT%j&bd|ZvBw5`+Sa%eDT?CTK zDZ;Cfmc)_=uF+$Gx;bg7N@|9~RrUBx3etQI0ewDY{e*D$Dn@JE_zFrezcD&`%NP@T z5~Bc>f{3bhHGOmDwHzaBq_o@;-#Y&(f$t)z6;HKbi41ck(*sNAq*c#Iam_>N>Z8$0 zr?|WEEw8x54Z(esrUP2kdps>{J211p5|!CKr?8_YmcV{8oD{cjq67HwlkD=g`wTjSZh*JHF}jxuw(X?r zbiY}LEeG5v^Tlr;Ms%dSd`F_PGnOxI7qBcRgUWa5IzmPkS0XSyvb< zVgMQwV&VTdn5Wz8ifYyIg5qRSoRAeffu`$lzYX~%2WT^3#ZO1&z(jW_}AR>k;#r-99uj!=-A}7V{gmHuZ?NPt+}eUw$C!Oy3c2i^G#!?*J$}F({4``S?{9@&Yu2M+a;P6NnsP= zw?6AaW<{545q5ckCiU{HnH|2KHI2_J7b{Z6R=Iom?>`p~KKYO`2I8)+Jfo>Ez8Sy{@#of)5S257268JCGXNyrb+j81il>{R(dKqw;}p3~ zMdNEz4^%~k6yP4g*12PLY_EJORAtOw+EhFv1MtFj=X+S_dSr(WBR)50sM1I60sjT1 zmINWMe8}Db8vM-fF8dtiow(7WrkbWZd_KRpQJGl^tYu+pSmeYePJ(7}THH&@sm-pE zF9rICbwUFTO4!_M-Kkp6Zkp3ztP!P2RN~%{|D9F9PD?Ci+INyMnlvQE*3wIA?>0eB zT>=z22XIPY(7n(UCwA^Wkc#gWgbf+w6IgNMa<_jT6beT0 zW$No@z9ni#sYp8HQ5_>k-5u!9VQMgj`v{cV_^IkyjDc$6)Ny`s{&mEsRjS5R*D^=Z zk*BHSQbrmbv_lxs&zkJi$Zouf7kO>wc!5tHCAu4?+OZ&e?3T_>^tJ@?C3laAdeU?Q|fCj>Bi%-!0dxW_wj|M_86x*PfMx zW2OIV2sxw|FAoV>+)#&6b8^8*yNO_9ZDwwCus?%{=8CNJg8j3FO!8#>4c6-`0#k}B z0)@SlxYxGzW`>46AGS*rZPYLO>KO}GEUY9vm(kU`dT;M1n-k@EK996x(3>~>&Q{;c zr;XE#(WLJ2q$`R3l_DO)kO`LWE0ujpLRl#zPfXK>6Kx?F*3W)!)1e5<&F3DQo>aEr zL(^Q-Qu(lhG}-GdyGTT6TChjvdGtHFn z);dX#2|LqUrt`8?%SkqSj3^IK`Q9@fNg`I>ZsM#;;#+CoT3XII_qAyV!>L>nZ?VKZ z)PRMpAt}vx5^@=eZ3!aFA))>riK z`?GMIC5hooU2}Ay@}(h^uaxe>c0NYD{iQ$x!-*zsV-JuC>WDb3vt~6ACWT~xDB_7yWeeUx5Jn?!5Y;KA_EpTKZ&5aZc<9&eK z$98q6U@RZOV5=r!yEx_p9ynFFE|l)@Oct(YIFJ;%KO@i{u;13)COt~Fsay~?I_hLm z6PHX&LpObOpqxxgZGX?c+-&iH=HlrTZP?P*C#|R2T4c*|H^42BhV*mP(jTr)ng5F}0Wz?7I@oZvf< z!@LV3&x&uxVW!T?l*vIz7hUkQ7(e}_tz63=yT{`l?cPGrfF(LWK*c*~D+o=B%5*rJ z<}zK+V7FA)zrZ8j;(X%2eic3686k5R2Qtecq$rr?24&2upV-t56B)JEIjVY|4=hH@ z?vRvYz4*3lR_5As@$)jDH6k&rq)t{8_^`Yoi3L7uM%NcVTP{;M!D%pSUHwPN2Him4r>lLtied!60e@ha7aHWi*yD=!XKz0P9T z2KXpJx*A*=yg=NyDPkMIxV$A+!8P?lXb4r_<_RN(lIu!$J^CJ zr6t9*88tz82LFmbleBoQz629Gli~U?UgMrxIY;n ziX`XGbW2bot)zAJr) zbk9oepyRWd;#oj>9lmmq>D-k%jH5JLB8q0@r=NaxSl&8F(j9{I?zz7XJgv|Rkk+_e ziDHs-MBRdTxHX+WnFHnA=dblQ)f;I58-q`M^deRpH$;z5bY)>>D1J?BlK(bK*CIO^nX(X*5ZyLmoIY<$l&dHuo7 z%cEw~O0UJnmdQeM@-FGMy*n^t8vYx{*s|CL`wWMhPY@BEP>m$r4w*$;+|uy=UE^rQ zp|v%OoNL9eLBoCThdbv&jQaU7vF|GD=HO$;Kw!4L$8f&2+Z~Ho0kXudD@L@ z3)xN;0`>T7C?GPp3AjIfQ$#nVbtjXCQ)F2RctacrSigM)m1o>l#p0F2OSu)>ne8RL z;(k-FlF+N_!kmgk4iv_PCF+xJ`)pdH);m>4ZfC8Mz!1s=84FPFZgS{O?vO@rf}b>G zkn*+yn^`;=8;bu`Z$t!hUka_5;<9BgHg@W!QA_D=D%^ZSar#x26Q$7; z9siyle*&xa*bzW}|4BOamO!QpS)9^SB&3aSY+x8R&S0cp20WBzRVT1CB#5vsJqh-i zvU>GU>s#~rK1ZW(rWV)4ZutnMJ2$0oX6xinQ`KzMUpn}d2j&bh?%q(x(T!J2obpdb zMW7sq(UY}doSvIOo!QSqm&b=R*!@|tfj_3ef0^Xru@9%p7n+ubdmd81wmTtIVJne- zd1NtcKL_^(_t%Z$)fXpqZwxysBYL?;Fv3lPocsN^?Ya5N=3$<^;a;F8sYy~jj@|N7 z=93IMM(?&&(rw{y`KzP4XEt$Xcys=D2(SJjo!ale@K`I6>lRXW&+y*+5=wa3$V}sU z{O=NHl%j9&KT8o=FOcnn>n)E-MG2Dnyj^ymyyf7sDyHGTwjGEd)bp{4>Rnxak+AR# zKi#NCdJNj;+rrdxoO#fh=pt&ASvU4+W1;=2uq|^HeX(6`!O&Ww_u2O0=W*hURi#D? z%IzI?zMN|4@7wS9IAhc}+j*J#oDDV0!xe;QjQLTtddAHYU+tvD%CbaLL%v;G1FVEi zYqokcrWHkza;>9|nWvppEoJX8_N@n|)9Rz0^^mzdEDH%fS#8!UrnMX{1P=v#w0^wn z%$o1af)T%F&l?=*KxN~W8WMP1${5=W4|9tV^sz2v%-?{jRVu8rbWY&p-FxY@($o%| z=+MJm*3a?OwAxp1yPvn_#y4u~<3`yvkMk^8`&GJO_H5?+)2~z5{OH!KtAVQ1TV1*u z476+zLz9*zstxhNmFUr$_qVLI$LD+}6IM?>ztsPJ=b+Z|OGrH4ri?^xh)M4l5zJ;( zg+^v8AEsr7QQFxP6CVg9&toCl!N{>Xkg1PDL6h2J9alKR7;#j%tl)b^?x#BM&eQCc z*_va59zn^wy;PYQGQbbd>VQ*uMrCVmmlOWiEjm4_ykG6Iq7<11qUvDPA%T3^xTC5b zF6vf5^lBXuvaXGhbC!jB^d|_7jjUyR`+}}KooDr}^M$sSS@19})eS0!&+);$^yS7C zSqlZQkY_yk9Y53FLFJ_&AZJ9u>=)>PfIfCd$V&l(AcOw@w_p5gJI1TPN9}*S8RIYM pzqVuix8TQijDH;sej@)N{aiupH*^BDvf+P_Kua4}hbbg=);=apA!2>Z(Q zi}!!<9r?g}&+wk#Xq@e2xPS3k+~B^+f;>s8$B;g$#o*o^;;o8nblv#w7FWpsbnLfc zD-(4{AqP(@>xTSe$}T^aJ#R{3`X&Q(G9NN{Vb_qXGm$uVZnLdyPiesk>1_$adH(U> z<r>$8#_<`Fk-raL3Jt7w;VBykHdRrA;ZBk>J=Wdo| zC<2j{CY;;27YN+@bdOdi>(XhM`b3f#p_jhk{zwzc@4T$YMRu8y5FmcLJjok<(A79m z+=n+_F!Ax?;CTUAk*i^qm5{h>%gg>l8nydp@kLyFk|Ur)DtI;fw6?aS*(X%56$Iyl zyK1AY@H%CX<`AOh<6EyE`Z*~-55SqI@6TZnJN7_6CE7&RNcTw@jn%Tn!mQU5T=i%Pq_Y*cl}G$jsQMBNKFHq1Y0Cy8 z8EfOQ;9}OL!200!u`d#HHiztv1Yfv7*N3)-(e{*b-&Ecw=2Il!{16|2IHxPJ{C2*) zxUUhXG1X`1>raQ@AVXat9M%d)QZW#xVTJ06sj{W^n7MsLqis`IpplkhO>10g7Aj>e zkFtP_sYz)@1T-BB`1xeNSsG~X?oCqZ4Lho7s--K1Ym^8?y?%g`-8ca6UnJv{r~_gV z<^&+YW9VI3z%!Tu)oS_|PpB$GP~+PNGc;vlRgS>7DcA)iZIu9OE_L1k)5Oxo-LmI4 zUWk@UWwb6&*A_o`u~781ea2L^`t8Tn=WwTqh3Hg+0E=Jd_tb=}QCHDndt$ z`7S6k0bwOz#%WTr%GZL+X*3MRviXOJs!28#rnC|&%G_u-a4d|KX{8D0)-0&Jp;k;R zQdE5+;k13z^a8~NH+Gcs%;_2d??sAHt@VqC^COsiG8kpLtB;}dsL3whM6n6>4;-R> z**Lu9AbgQ5EL`hCjqi)s7qb+P6O%#_%iNp>sZPo^wuIq85+`VSl1dqaIA@ke87ajr@o z9(#@D(R0Ag=E1i1-6y%hikD-O8Ly`X;t0Zg(A>9hf+y<8ob|QlpUq#cGks##_N~`y zS_--J?V6(w%540$!o_Qp?qwo2$blLREXraPJF(;BD|(j;f_UW|Nvy;<{fUIY`bu@} ztCq%Hq%8G$jvDNRLX-6O)xFNm$48|HYqFva-a88pX-H^fGu(_dHhi0|c0E0yGRu<~ zHqkFD>>BLET=eEkH9AA=?LOgiPUsr*=w&@QMQQC0ac0vR^FmlR(Hc z&WVAOVHK8cGWac!k+4V7H31gwb0TtE4~=U;tCu_E<8hGMJvjp*mw(6%?ZJZcWF(F9 zW0N&V(=48)w!BJP-lkQsGBRM`rZfm*#_dt61o+0DxZ%6@kVx)lNEdYAM$}S2B~LLX ztPuGU94|NEJ?Kke;Z-Gk7Idj&|dfkTF zDn4ajk?b0UK8U^(ll+EDPUT_V>vwu+TTTXpdT~C>MpR(LYhD3RF9X+h9ev}R<)gyY zOU5JkKvj>MTDn9u_g0-fIfwPmpxWM#Ib3^I0_z~c&k%nZk3C?v)0R7Q{stMI=Ne@l zH%YVE8HJ?;S8TtyFU>y${SHV@WRo6oxopr(ckuzaNe`N;!8u$=#whltLyzljj<* z6sW#KN>)Ql?k9cbVmT9yi<24wG^7n9XT`RPY-RWcdbr0po+q3^R!=8fN-Yp$n=zY} z3eB3kCQ3altWiLWWnQ!5|3*F%G3=E878;q5UnwYnbgg6R(|lE#s7}$4)sFNiQ$WdH zb*Y;JZlxBrBcuw^POq1?SxrQwoF2T6B$d9J4x0sum1$GJgw-8R+$_0dpjp=U>uLx& zj1{VQ3$^INq69BsRfm>M#dMMmW#s9-V7QKBDrJZKySuvjRd`<6{)vlsJ83(|DuJ=u zy_Z?Nk`-0XO0?d1A=ugWG7MQcw!)I;8a=LsE@rw|&ko~Gl-GjMiTP>lI1fbD>p?_} z<>O)Y>vib$Y0hgH*223JQtevRwOtx9UJq;7@Ajt8Ii9F>+~P{MuGW$SOl1_zd)Diy zqdo&Fq#}7-UE~CbRJ8W&-?VM7KQ6Un2901}jcz{q-vo;|VmEJnY5;s}NOJ%N2;`S}RQ!a3u-*xqx;cCo{K0QCxDeD^tu`Hvj{-MyYEq^U9HrTVSQTm$)=ILK3~9@^zHk9LU1UHB7$ry5c}9r~9S z5Hf5lRD?4_XwwkKe<*BJw-Qt9y3a~I3Hz=xrv)!r5!nX<6ZqE!hZHfX<(#nOMwPk) z=@=`hf2!1HV~(v}vZb}|AqY#AmZ)a36QF!59#68~+2e~%v+F6#VS4VBy1nt6iUdUR zh!(2NA~216O*@mAO`B+IV38{fAc8;F1*=K8bL__016~ReI(Tz}auHdReCer1W5>Yg zE4>(!4913c-+14s)U&JG^3An1;yzP;n#OMa|#$szs zZWJ?@q5_))9vLIO&#B`v*x_2t|C0R0& zd1K?q<*Ev-7t^;r@RQ{o!;wkFyF(l|`4z(Jv}i!)xFcSrl|b}y1uXcPrC>ABrBH^d z?ghOIDwok2#2TcZiv&=|22*MDv|4@bD%GyEFyBml&v30U@hONlgIQxVM?H5e%j{q> zg#tc@-@-+e?e=o$pWA45i-S;j?1?oZ-LMGqZ0eodJwYOQyjoRf9D0MFG{pj1CY^x} z;dkZJQsH5V@7{}SQa{REg5`53dE^yHPW;@sfI;MB3`{zakRQbIWo=?E2#iCz%P8Or z0dc_i{%|{Z?zC~Mj8J-SEMxxDH&p;FzF&mZiXSaLD8#h-R8kg;IBsaeg=(fcPNH}3 zu*aysDkiDbVG(O?+9i~3U7H4O3re&7wgv(k#xq&k7#mxUT1;Fp-2N6_5*GnI;j zcexem0VwSHG3a`~Zr8K$_{ai{i+izVL6_VBE;!3a$EInu9(2g>C;#?@aRX!t8dSj~ zby^hf;#`9BVDoj5qcF%j_9ilk*Q{CmrcuG}!zyw9@KWd0}SWy-V+5e-S!x*0&PglIXW> z@QCUDbKr2`#RM~tNN^wBu9=%7NSC!L1Tjp%O&mxCHF5{{Hq*g>ZOH1qZj$ooj+jEE z^+annE&e>6p}L5!4F|x+HLM}hrf1)KCa2-E4YV%(4{h*yUW2{A<=Fzra!kjve|bv5 z|EV50Z)hWS)@Y~EpSkAGj*K4c$ z?Xwo5Q&}BFxohhSwCB>?db-IkkQ(G4Ii;q_dE{WfFjS&{$x@vm{`k_g-;n>-bO`ew zk^c7M6#*vos!;UJ|JC;|VbHn<4xu)f%-=}MIVz~Xl-U)TBehsk3ql#vgXwU9)k9Qb zelC-CVAWf^o}stw(8cEKJ0qxh(^6$EaEI65AMUT&4&8?!bPvv;GTB zJapay|HUvI2>S=mt|I@}r!rzl@ryCx3G6k%lv#HKlQSgU-*A6Jb?|_pie7JtzWG=1 z|J2kOF)SvT@h_>n)rR8mv?){F?4!kCFpg!a#1fb~*Ce}IY=;EDau7QaX7uWV;j zw4#3rZKg<>vK|)5n=QGCfODLLWz&{47O$|620HceU+exts6zf3=GUwwNB%A2H7oy| zg4eA4JGw#NV>#EaO|ymX@K zLql`0l9T~RVaYsOm|~_X2`VMOGO1KxNX|!=;ThR4apNiJ5yXhz3!~i1wD^>9m%d~D zSGaa0SLLgtz_(i9-!Z?IgSkQ%A2G6l>cY3_CCq99_2AbdQX=ZYkq5JQ!U>TpZJEeYS?teS}a&UAu|IUy<5}|guiEy*ATBW$ZNENb8rK{D;fR&4Ebuupae7U zLyZOhrQm;xN_+&nEv5X8{;jpyv~xa8Ume1LRsjE&&QP2DhYjW1Pp)gW9QF2iQB?w% zw~P4PQE3u+#XGT+HJ%t@(H=l5&qqaM^ipWwRdHBm}7$#2SHcLk)xCL$ZQK70HhN1I+Ci6MFzF;sKahUzsifLEBb6C ze_0BxlJGgG=Gv!^r#D(d_mRwh~l!JUlOzhp=6CDKEOFRS)UK3$y%%cB~NIW zuk=ZGp2j7VBahl|wj_^U$Yk{^RP2XA@|-(Y+fEW)WqZA!tc8ggwhv@B-fQ+ZqlQ1k zv@Ye=sK2UbY$%vKTIj#b2zq;KwYFZ#pGVE|ygNZCm(UpN5x?8nx+v-?8}A#5UTVmj zQOWbsvrS3d`0B^{zO9YQ*)04pXAeQ~Jsujwlp-oToiU4vC?@>A2?J%@2QNlDBGTKRyRYnvgubk9YbPh_$Ynjp`Xh|k4I!9T5&P(nsxK?z7FH`XLwWI* zI7YV5jq7Tx-@`goIekY@r!DaH|MlEamCtz@YyhU$tGW@5w4W-3KtU8z{Gmtu2E_+N zLe8{rj4P55QPlfmtAKjor->vJ!7SW|-i%G&ecig&ZYhu-z5ZAC3@6JB1i5G%CD<*UCOmrdV=k; z4KmkO30#jdk;gIvR%)!hPwz^r+dQA0PL7nKM)mbXNv)N&O4(Ay>O3X);`8JPz=T6E z-+aLT$<8_eG-O4{{favvDm_2I7)nj8>qZb&(z*uEOeRZ^6YK!vwCQ~v)9Je_ZY7Gr zsgSp0#6jYkPv5_@dinzx)KpAFaAJ3raefstZRUOXJT|!^@Dw_HGIn#F!e1?1-<2ED z_ho=oBle4&ob41OQ^@K3L}Ce5$mf-s)6UC&;bbZwc~y4Xv=Qp|&8a92Jf-PQjI;={ z{QR?_^)lh(XqIocge_~-ot+d1LtrLkA4+8<6Ra_nFlWPSQj3eC{lP+h*q>*L9EAFO zKQYif+(aOF*&y5ZgqjQW8gnd(I%1M~+aNn2;jz&rU0{G*6M4^ioKJv?mqg&Z4Li-a zE$g~?t7ap!e6dBQ{D$3JnI%fZL5CYCrUz3>tHL4BD(^|qcVxh;#e z52OA?y^lC~pw4ZQ{oYN7I9jPpfay&S7?&hhqg_PvX1ees=qUnlLKQ=)lIvxaVaX9rNsoQ(+y)oT_^Ir#zRZ=2$o1|{gr4nguS$xPz3^` zrtWo$&5$ynrij@Yu-$u$KT;>4rPDC**EN>i!{*TQd=2-u4}pqQ;wKwq@!>ae2k|m9 zk;28wZ1GE|MWiDmdk$>OBy(4wODe4N%Gn?*!AeK(*szWY=PEp|l&Le(1>S&pJ_ zqS58`)*Ffgmw7?#QbS$cL;T@+yq@=^3ye&Mzt zJJptO`!jw*mEA_m*qQ?&*~7)CNNOq|)nWOhp?QS>^OCUfq6qoXAe9CY55ZnecNO51 zGn^T34nthHvPqn33I!%E?O}_kv5Uu~{WRA=ZPPBp7}<0x=F*HuT<)_16;75(@^adw zc&=pNdH1AH^x`L_4rS3)Jflgr2UFC5kmIXPL=TFRHD_K24Lpo-FaFRoc@fQ!P-#|g7^VVeVIvgUy$}^eOj~XosHx{ zPTeA;{OZIv+FPhaeK&$b`Hl_uPYU`AE2g$Y{y#aY;iR+JQU_U+QDsJ@H*}<#f5=o$NGC)O+$x81uB^Rg0$s(a^T~>*UO`VzqP)4DQS2~yY|pgZy{K)qZxgf6NY1=Hr{X=l0{-Dbth=z28QGZejyvR0~SJ% zhV=w@5UGellQNEK5tVecW-9meJoXI*6)DAF0F`f(iLY<)n^y-1vQ4cmk~DBE2fqYk zXvRRoSF3koc``5nbeFdf#l!(JjB<+Z=vJSo+iD60VoeoeLSALIQ zx7DWR4ZrMSg5zacPqyK!E{`Yc9mkk^x<}GF3xWq^NNyf*%UZLi8za~{&q^-UgcksFLb-;|kq6L@x&wgbBAH3|+3< zfziq5RZ2zWeg$ZYlERtC8`0V4aZ9`PGzTWhzo(xZgkvy;o^u-bSbU(@l~R2OP$Xxo zjlnIYdtbHJC1;NnjQ!-|ovE|w?2zlD0+MHt1W7YUjuns%h^90jJ7-1s^#izX#=2miID(M=ZBmXWa!k`hj zk8lv9fr^M(MS}h?Xp;-L%&?{@fo}g?7>U)8D|{kB+cQYYETR#3whXFH!i}?!&dLd6 zAW#0Gl>VJJ8jFF!eEtw|myBJ&d{;$57YxPQaes6z6J77fg$3=-HmJf;seie!X>dxG zBV;#ZtgpPQI2?Ws`37mbR7_x9+r}D(1|@{Ihq;Wha1Kx8eAZ0%&{#FX z4RE3974pU0tAHg($mDYHySgxRQX@DoJ9MNU$*j^=xy)|ZDgkzXrNpnq!H-Z|Q_$;SM0oz?bQT2}1Ulpw=NbGFF@r9vK6uR$N z&PxQHQHuXWW|}7IENpA{uuL+7|EsZ=ucCVXx@*uaZuTe2(W%+yL0nRx5qzehwIu6( zreXLr|0>vJ-X;>iU=)+1(Ax~?`xDVSru0aYH{Iwi6kk%NdiOXm|J?km=0(C@F++- zeTh4=1U^2Ln{W-3;w&F-VBh9%MgR0^O(IYXC(}luF_CuKUx2M@2`IM|kmQNep{8c- z9T9C;JqwzJx!_gQ3uc@$Byb}Hy^Rdo;4{A{jrzG5b)Y{BLo|Ot@Y(2E)`DO`F5BUH zYe#rRO*+U!B>-W)*B1svMeZZJJlZ*O>br8dlz_$SPyIyOdt33*J%yNQQ}PXaCV}*Q z!PdLCE0+Fr^G)HwMAwK7a4u7O{sV$6x>Y`XH+_L%JmmXQU$rVlOc=;Jq9kbT;7Y97 z1>RCv7YQ+aRJS`4h0Jh6oUuYG-osT7WVbP4&@MC@44h9nmbf+Q;Gk!CH8-NFv1R5kz9xj z{B;=ZvNuI?BmeksEc}r;YdpZ3NNnUn}Kr`GAr-r(bhsG zX5zec_XQdyT3I=`F1JpkiC_vUE1B!9{^iqe9W4iX+X43y!lE2FIPk5j0n4bjAA{R#6@j2yue<_iMu(y`oSh{I1VLDk!_FN8G zLB%k9kbb*fS=xYT_A;;Ff4>-CpeOTRi}By>8Kf03pbmp)mPk<^ zuyi7194-mWE#mLb75wTg(yI8Be2FK$JYK2GiG`v$XCptthRIZrLJ@hrU_9(G3D=uI z`(KOjbKY7cg)o>Z;JxheDfx$fjT}mvy(xoUpd$_R8FF|DaWuIwt1q*vJDYAKg-yK_ zsTjzNg%LMTMDnty-BZf^vJl1LM1F@ri1d)5JThgkcw>m<(hjnEdI~L(A z)4p*JE6MHrcjeXYgx9EoaEuYa*GDDtL%u3P@t^7sd6wTrbihB*|6qCQcMqGwjyk5g zCNy@DekR&YaJ=xp`k`E9mWJ44o1oOi45tpM7CtN9uFHsRiSAtz2yiRv_ z-3lpWnrkl&0!$cACYRijWNjFOi$RRpf84!#skh2ksO&j>`CiQaf~>(g7JgE$^Zg!F zs0PGV`t8!0GE{|vqX?hdJW{b)Dz)DaKv1mn!8cDN_O;{3v(%un$m3%on98pZOzPhoJeBUZ3i$$9 z&zbyn`duuOslE-oA!EZsH<91f{{-K?b+8q~R5o;ues%{ZcUVMV%^a(O)2ZQ%ORij5 zM&3AtV4~z-InFB0gTv%rJuirx5W-g{XW_x>j6c7#vkq|g`7xKa*vja$ zybR)9uxqcuA9qx}>R4r$FKx+w0B8AfOP0Di?5rC09<2a=l&0X&hB>F& zpDRb%<=9hb-Q2LV-sI<|xWMP8(;{(v=C*y?=_v0ePZyLI?ch)*V)N3fvvSd)E_j$a zc47Xqa@5sQ7TKost)b(B)4tT_2FqRHV#CZzZa&Lz{O8N`_2KFd@s^ULgY6A?ySz2` zNgnG@m5>A_idysubw7z$GmlToETepaY6-u$IvZG~6HfGfoE=GPFRZ`}hxQp8#9x%C z3BqnM60T#H4#v|_*n^i8;ZLW&G~;)u1^95w7-V6;CFshxigB5Fn?BhXNksyiSlNy8 z{wZtEVC;2ekq(KK-FS^ehRtV;TIPb_oAYigs*Pk>sMLFmSe$%XY$Mw59(f7j2()^^ zW#MIVc>7gUNI;xsP7X`556QbcCX*jH$DTxN;Ze2Gn4u(UOYg;RR4a${qD@fA*4|O@ zEx&I$$C#4Su-4O}ISjjkmF4Se?q8WDyt?hDd1fwS5*pl!AFLYk6+Gdms+IR4ldlV$ zc|T4-DMgu_u0=(V#9jt+sRCVkbLi{@vK4?FGg<~Y(A;gGh&~3P@n$l?Ze-!zl5#r? zccFj_bkV9bc#)sFL9Eg-emIhlbxv0t^<{EEuSxmK!w(;7DIw4!GauWK5=q^ zpTXXKDgtFuFUq2L6Ep4%4&dR>rU-|_tTCG3v(7SSCeXTTwglK{W!Za7Kz5RC6k-d2 z2X*xw8cu`lHEy`5I`I}Z4(joxO!r^}M~rTpV0EiKs?M+mlgOeS3=O5ogGBHnV-j-| zMrISjMZZZyzF$--943+CNcip_ryZ>-{VAXR2qXG@_iL?g<6+Kqa{sQ)d+pYzTI_R(keS@KESVU4N~sb(3GtZqU!A3+5Crz3evch!mS zIF&3~T3uBS5a4$PAD!>E^&A&GKSq{EybHN|{jFLpSE(LN`-I^0WU4!^$c;&jx z)BD=jR*maDj}AWMB{NBeAn^(xs})&P{0T_va}GpGADAsgbo zBR6Wfbk)sOc3YYGP>$W+aPIb*ppLCgRoZD8?fyGsG;Gs?v0`*d+haTCf?>NswP#7W z_^_L$R2w0$HwRiS{24)9i<)bh?696TWt|0g-F=C>`dHm=dSiq{J9x3tb$K8vex@PX zga%q>!lSvK3-G*^8o8H3LgqY*p^p(Zwl5aD)^_9yMa#T&G#24t+XA0>kvy31~zl~wdMP;}|r!#qO|MJD|)(OOM6|P!QY7LgH8>Y6K?E0h3_}3(PsCCuhZ$H$K&V~z$oh1Za&pu4WYVeM<6phVYAv(B>lJ+VB#V~o2s7WBzZ&+6#fiT;fxM98 zM_z&n?BO@%mDG&{Q2U<>6Z1l!MYcj>SgM+gE~&-oxYc9}%@-up8|47c|pK)4VHUkVa<$vx0O^`WS2`u$@YN4q=s>ZDyO~q$Jh$axEi)pqBCp)2)+VF0n>g^2io=2DRtpRuKU) zhc93=&%Z+6NZa2H=BT~b4t|lame2Ag5UZjXc{}0Tun3RBhZYHJ$CpZ#{4?@}DbnfV zhvD=Uqq0-87B79!qgQT+rw*#@`T z>s2?9>o|SEnbwv0!I8bMNrhRWTUcJJ(@rKaU)f{R(z7Q-_OdS{>eBJE0EwM=3C%ow zv{$hU*%b2Co?O+9S@K#Q&kh*J+nrnG`XglKftd!lYJ~FzV|}{#M;3+?@ANF5f-kfk z)28`Ha1>8a-GK#r_q3RUub z1^FS5+0!JS3yyarZ+OM98nM01_srzQPmHxzx#H@=JZ;+F?7K}6rXF1&i(7D4J5)rK zl`#r--0f{0y38y#RUfUYPqO=GR=_+2$gmX=Kz&SWQ0R0jc0PSXkkAh^Es)W>1>pUx zb-OR{@tK{?JUZF|9V6bW9)3DqYujTFxE4RVE#B9btMEJ^J<0TI*|T>&Y~UjfsBnPv z{%KlSkz{*+S?F82yC=iB{uP}%aNvVtaB!;J>f87L(@4%7L1B~bqvl6F>R8s<;E5Rt z^A*(BnFv4-B8UZ?!DgroW`~p_jdkyYokGrjnFg5{N@@Q96#|EG`tUrQ-U1DEc^qU7 zs4i{8EvrHc-q%Cy+g_WSO7Et{#s)pifqiovEjg-I?#32e*tAeGT60oe{^)f`iL&}( zVX*9`#O+MU>vKrtmKQcO;k>ehp~7{rq77~Fy0%HuuKl8z+xliy*wWdwx!UMaJV&^*lJh0lDPdz z+|REr*DtM#yt&k{ytUd#0juYOJHK_1*6LaioQbq~zuhbchqkJCoWtbaAa#ulc|Wl6 zB;qsJq^xMnnbhL;o#3Tx@- zrv@|v0O?nm(v%+YNM{2v9JVr}i_RFRR`=5^`(g|V;J1tx6q@E*ixb{jyvzg-`kIxo zqdx##-!G9|6s@4>%Q}T%Bp%0vC?CYzv{mje^@8_i!$hl6zeLqhtqcMloDS(w41$na zF1})W7%M&6?MAf0w_ab{T`>_GtZc9Yj)bRFdg*%Tllal@VC%ux5Vn!m@U|Dn@3x=8 z61i5Yt6T%duiLsTPkOqf>SmXga6Zx4pCGm4v@|7;!fM3VvvwIW5x0Eh^A(PV*yXLsKvQ*<F<41jC^$b0;VVf1Dmx_xxLQ}2KH;egrW>M1P0{)dqc)Q8#JDT yewF^$+cW-<{`k; From 0fe357cda60ace623f4262c3f5dab627a18e96fc Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 29 May 2021 08:27:06 +1000 Subject: [PATCH 04/12] Import Company Test --- app/Jobs/Company/CompanyExport.php | 6 ++++- tests/Feature/Import/ImportCompanyTest.php | 27 +++++++++++++++++++-- tests/Feature/Import/backup.zip | Bin 12872 -> 12860 bytes 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 64fcbeccd8..f79f4c2f7b 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -260,7 +260,11 @@ class CompanyExport implements ShouldQueue $invoice = $this->transformBasicEntities($invoice); $invoice = $this->transformArrayOfKeys($invoice, ['recurring_id','client_id', 'vendor_id', 'project_id', 'design_id', 'subscription_id']); - return $invoice->makeVisible(['id']); + return $invoice->makeVisible(['id', + 'private_notes', + 'user_id', + 'client_id', + 'company_id',]); })->all(); diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index dd1b6fb687..c87e90140f 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -530,8 +530,7 @@ class ImportCompanyTest extends TestCase // Recurring Invoice Invitations $this->assertEquals(2, count($this->backup_json_object->recurring_invoice_invitations)); -nlog($this->backup_json_object->recurring_invoice_invitations); -nlog($this->ids); + $this->genericImport(RecurringInvoiceInvitation::class, ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'recurring_invoice_id'], [ @@ -546,6 +545,30 @@ nlog($this->ids); // Recurring Invoice Invitations + + $this->assertEquals(2, count($this->backup_json_object->invoices)); + + $this->genericImport(Invoice::class, + ['user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'recurring_id','status'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['recurring_invoices' => 'recurring_id'], + ['clients' => 'client_id'], + ['subscriptions' => 'subscription_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'invoices', + 'number'); + + $this->assertEquals(2, Invoice::count()); + +// Invoices + + + +// Invoices } private function genericNewClassImport($class, $unset, $transforms, $object_property) diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index 5260bd4b4f6df3986fb80a129f27d370fa54640f..ca7d1808bc206dea162d0b842a09888f16f2bd1a 100644 GIT binary patch literal 12860 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 XAmg(P1mrsg*zZrn?_Woj_tF0Wb)A+8 literal 12872 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 pzqVuix8TQijDH;sej@)N{a Date: Sun, 30 May 2021 06:50:55 +1000 Subject: [PATCH 05/12] Remove delivery not from try/catch block --- app/Http/Controllers/InvoiceController.php | 8 +- app/Jobs/Company/CompanyExport.php | 6 +- app/Jobs/Company/CompanyImport.php | 4 +- app/Models/Quote.php | 4 - tests/Feature/Import/ImportCompanyTest.php | 225 ++++++++++++++++++++- tests/Feature/Import/backup.zip | Bin 12860 -> 13456 bytes tests/Feature/UserTest.php | 44 ++-- 7 files changed, 252 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index b2ea9da7ca..263fa992f5 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -845,13 +845,11 @@ class InvoiceController extends BaseController */ public function deliveryNote(ShowInvoiceRequest $request, Invoice $invoice) { + $file = $invoice->service()->getInvoiceDeliveryNote($invoice, $invoice->invitations->first()->contact); - try { - return response()->download($file, basename($file), ['Cache-Control:' => 'no-cache'])->deleteFileAfterSend(true); - } catch (\Exception $e) { - return response(['message' => 'Oops, something went wrong. Make sure you have symlink to storage/ in public/ directory.'], 500); - } + return response()->download($file, basename($file), ['Cache-Control:' => 'no-cache'])->deleteFileAfterSend(true); + } /** diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index f79f4c2f7b..2a91fc01ec 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -212,7 +212,7 @@ class CompanyExport implements ShouldQueue $this->export_data['credit_invitations'] = CreditInvitation::where('company_id', $this->company->id)->withTrashed()->cursor()->map(function ($credit){ - $credit = $this->transformArrayOfKeys($credit, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); + $credit = $this->transformArrayOfKeys($credit, ['company_id', 'user_id', 'client_contact_id', 'credit_id']); return $credit->makeVisible(['id']); @@ -271,7 +271,7 @@ class CompanyExport implements ShouldQueue $this->export_data['invoice_invitations'] = InvoiceInvitation::where('company_id', $this->company->id)->withTrashed()->cursor()->map(function ($invoice){ - $invoice = $this->transformArrayOfKeys($invoice, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); + $invoice = $this->transformArrayOfKeys($invoice, ['company_id', 'user_id', 'client_contact_id', 'invoice_id']); return $invoice->makeVisible(['id']); @@ -332,7 +332,7 @@ class CompanyExport implements ShouldQueue $this->export_data['quote_invitations'] = QuoteInvitation::where('company_id', $this->company->id)->withTrashed()->cursor()->map(function ($quote){ - $quote = $this->transformArrayOfKeys($quote, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); + $quote = $this->transformArrayOfKeys($quote, ['company_id', 'user_id', 'client_contact_id', 'quote_id']); return $quote->makeVisible(['id']); diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index 3a718e5790..ed6a456408 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -80,13 +80,13 @@ class CompanyImport implements ShouldQueue // 'recurring_invoices', // 'quotes', // 'payments', + // 'paymentables', + // 'subscriptions', // 'expenses', // 'tasks', // 'documents', - // 'subscriptions', // 'webhooks', // 'system_logs', - // 'paymentables', // 'company_ledger', // 'backups', ]; diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 87f70d4a75..c7d3118dc7 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -71,10 +71,6 @@ class Quote extends BaseModel 'custom_surcharge2', 'custom_surcharge3', 'custom_surcharge4', - // 'custom_surcharge_tax1', - // 'custom_surcharge_tax2', - // 'custom_surcharge_tax3', - // 'custom_surcharge_tax4', 'design_id', 'assigned_user_id', 'exchange_rate', diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index c87e90140f..f096745820 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -19,17 +19,24 @@ use App\Models\Company; use App\Models\CompanyGateway; use App\Models\CompanyToken; use App\Models\CompanyUser; +use App\Models\Credit; +use App\Models\CreditInvitation; use App\Models\Expense; use App\Models\ExpenseCategory; use App\Models\GroupSetting; use App\Models\Invoice; +use App\Models\InvoiceInvitation; use App\Models\Payment; use App\Models\PaymentTerm; +use App\Models\Paymentable; use App\Models\Product; use App\Models\Project; +use App\Models\Quote; +use App\Models\QuoteInvitation; use App\Models\RecurringInvoice; use App\Models\RecurringInvoiceInvitation; use App\Models\Subscription; +use App\Models\Task; use App\Models\TaskStatus; use App\Models\TaxRate; use App\Models\User; @@ -545,7 +552,7 @@ class ImportCompanyTest extends TestCase // Recurring Invoice Invitations - +// Invoices $this->assertEquals(2, count($this->backup_json_object->invoices)); $this->genericImport(Invoice::class, @@ -564,13 +571,223 @@ class ImportCompanyTest extends TestCase $this->assertEquals(2, Invoice::count()); -// Invoices - - // Invoices + +// Invoice Invitations + + $this->assertEquals(2, count($this->backup_json_object->invoice_invitations)); + + $this->genericImport(InvoiceInvitation::class, + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'invoice_id'], + [ + ['users' => 'user_id'], + ['invoices' => 'invoice_id'], + ['client_contacts' => 'client_contact_id'], + ], + 'invoice_invitations', + 'key'); + + $this->assertEquals(2, InvoiceInvitation::count()); + +// Invoice Invitations + + +// Quotes + $this->assertEquals(2, count($this->backup_json_object->quotes)); + + $this->genericImport(Quote::class, + ['user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'recurring_id','status'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['recurring_invoices' => 'recurring_id'], + ['clients' => 'client_id'], + ['subscriptions' => 'subscription_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'quotes', + 'number'); + + $this->assertEquals(2, Quote::count()); + + +// Quotes + +// Quotes Invitations + + $this->assertEquals(2, count($this->backup_json_object->quote_invitations)); + + $this->genericImport(QuoteInvitation::class, + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'quote_id'], + [ + ['users' => 'user_id'], + ['quotes' => 'quote_id'], + ['client_contacts' => 'client_contact_id'], + ], + 'quote_invitations', + 'key'); + + $this->assertEquals(2, QuoteInvitation::count()); + +// Quotes Invitations + +// Credits + $this->assertEquals(2, count($this->backup_json_object->credits)); + + $this->genericImport(Credit::class, + ['user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'recurring_id','status'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['recurring_invoices' => 'recurring_id'], + ['clients' => 'client_id'], + ['subscriptions' => 'subscription_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'quotes', + 'number'); + + $this->assertEquals(2, Credit::count()); + + +// Credits + +// Credits Invitations + + $this->assertEquals(2, count($this->backup_json_object->credit_invitations)); + + $this->genericImport(CreditInvitation::class, + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'credit_id'], + [ + ['users' => 'user_id'], + ['quotes' => 'credit_id'], + ['client_contacts' => 'client_contact_id'], + ], + 'credit_invitations', + 'key'); + + $this->assertEquals(2, CreditInvitation::count()); + +// Credits Invitations + + +// Expenses + + $this->assertEquals(2, count($this->backup_json_object->expenses)); + + $this->genericImport(Expense::class, + ['assigned_user_id', 'user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'project_id','vendor_id'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['clients' => 'client_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'expenses', + 'number'); + + $this->assertEquals(2, Expense::count()); + +// Expenses + + + +// Tasks + + $this->assertEquals(3, count($this->backup_json_object->tasks)); + + $this->genericImport(Task::class, + ['assigned_user_id', 'user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'invoice_id','project_id'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['clients' => 'client_id'], + ['projects' => 'project_id'], + ['invoices' => 'invoice_id'], + ], + 'tasks', + 'number'); + + $this->assertEquals(3, Task::count()); + +// Tasks + + +// Payments + + $this->assertEquals(2, count($this->backup_json_object->payments)); + + $this->genericImport(Payment::class, + ['assigned_user_id', 'user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'client_contact_id','invitation_id','vendor_id','paymentables'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['clients' => 'client_id'], + ['client_contacts' => 'client_contact_id'], + ['vendors' => 'vendor_id'], + ['invoice_invitations' => 'invitation_id'], + ['company_gateways' => 'company_gateway_id'], + ], + 'payments', + 'number'); + + $this->assertEquals(2, Payment::count()); + +// Payments + + +// Paymentables + + // $this->assertEquals(2, count($this->backup_json_object->paymentables)); + + // $this->paymentablesImport(); + + // $this->assertEquals(2, Paymentable::count()); + + +// Paymentables } + private function paymentablesImport() + { + + foreach($this->backup_json_object->paymentables as $paymentable) + { + $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]); + + } + } + + private function convertPaymentableId($type, $id) + { + switch ($type) { + case 'invoices': + return $this->transformId('invoices', $id); + break; + case Credit::class: + return $this->transformId('credits', $id); + break; + default: + # code... + break; + } + } + + private function genericNewClassImport($class, $unset, $transforms, $object_property) { diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index ca7d1808bc206dea162d0b842a09888f16f2bd1a..24c1145e7a487bef03ef1cdf8064575d29f8683c 100644 GIT binary patch literal 13456 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 VA)($mz<$5#et-7;9t;S`{{cV|-2eap literal 12860 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 XAmg(P1mrsg*zZrn?_Woj_tF0Wb)A+8 diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index 02dd137db1..07db7e2034 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -55,9 +55,9 @@ class UserTest extends TestCase PasswordProtection::class ); - if (config('ninja.testvars.travis') !== false) { - $this->markTestSkipped('Skip test for Travis'); - } + // if (config('ninja.testvars.travis') !== false) { + // $this->markTestSkipped('Skip test for Travis'); + // } } public function testUserList() @@ -101,15 +101,14 @@ class UserTest extends TestCase public function testUserAttachAndDetach() { + $this->withoutMiddleware(PasswordProtection::class); - $user = UserFactory::create($this->account->id); - $user->first_name = 'Test'; - $user->last_name = 'Palloni'; - $user->email = $this->default_email; - $user->save(); - - $data = $user->toArray(); + $data = [ + 'first_name' => 'Test', + 'last_name' => 'Palloni', + 'email' => $this->default_email, + ]; $response = false; @@ -129,6 +128,8 @@ class UserTest extends TestCase $response->assertStatus(200); + $arr = $response->json(); + // $this->assertNotNull($user->company_user); // $this->assertEquals($user->company_user->company_id, $this->company->id); @@ -136,13 +137,16 @@ class UserTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, 'X-API-PASSWORD' => 'ALongAndBriliantPassword', - ])->delete('/api/v1/users/'.$this->encodePrimaryKey($user->id).'/detach_from_company?include=company_user'); + ])->delete('/api/v1/users/'.$arr['data']['id'].'/detach_from_company?include=company_user'); $response->assertStatus(200); - $cu = CompanyUser::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); - $ct = CompanyToken::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); + $user_id = $this->decodePrimaryKey($arr['data']['id']); + $cu = CompanyUser::whereUserId($user_id)->whereCompanyId($this->company->id)->first(); + $ct = CompanyToken::whereUserId($user_id)->whereCompanyId($this->company->id)->first(); + $user = User::find($user_id); + $this->assertNull($cu); $this->assertNull($ct); $this->assertNotNull($user); @@ -172,14 +176,12 @@ class UserTest extends TestCase $cu->save(); /*Create New Blank User and Attach to Company 2*/ - $new_user = UserFactory::create($this->account->id); - $new_user->first_name = 'Test'; - $new_user->last_name = 'Palloni'; - $new_user->email = $this->default_email; - $new_user->save(); - - $data = $new_user->toArray(); - + $data = [ + 'first_name' => 'Test', + 'last_name' => 'Palloni', + 'email' => $this->default_email, + ]; + $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $company_token->token, From e86286ee9ade034d54b8808b96d6012acd8ca37b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 18:03:31 +1000 Subject: [PATCH 06/12] 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 2a91fc01ec..3794be9dd6 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 ed6a456408..7ff1ccc2a6 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 77bb733383..7ebe6d890e 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 f096745820..25b4ddfb6b 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 From 088fefbb34c4b04e40eb6be5e6b6308604928b53 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 18:11:59 +1000 Subject: [PATCH 07/12] Importing Company Ledger --- tests/Feature/Import/ImportCompanyTest.php | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index 25b4ddfb6b..7bdfe001ea 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -19,6 +19,7 @@ use App\Models\ClientContact; use App\Models\ClientGatewayToken; use App\Models\Company; use App\Models\CompanyGateway; +use App\Models\CompanyLedger; use App\Models\CompanyToken; use App\Models\CompanyUser; use App\Models\Credit; @@ -823,8 +824,19 @@ class ImportCompanyTest extends TestCase // Backup // Company Ledger + $this->assertEquals(3, count($this->backup_json_object->company_ledger)); + $this->genericImport(CompanyLedger::class, + ['company_id', 'user_id', 'client_id', 'activity_id', 'id','account_id'], + [ + ['users' => 'user_id'], + ['clients' => 'client_id'], + ['activities' => 'activity_id'], + ], + 'company_ledger', + 'created_at'); + $this->assertEquals(3, CompanyLedger::count()); // Company Ledger } @@ -966,7 +978,11 @@ class ImportCompanyTest extends TestCase $new_obj->save(['timestamps' => false]); - $this->ids["{$object_property}"]["{$obj->hashed_id}"] = $new_obj->id; + if($new_obj instanceof CompanyLedger){ + + } + else + $this->ids["{$object_property}"]["{$obj->hashed_id}"] = $new_obj->id; } @@ -1010,7 +1026,10 @@ class ImportCompanyTest extends TestCase $new_obj->save(['timestamps' => false]); - $this->ids["{$object_property}"]["{$obj->hashed_id}"] = $new_obj->id; + if($new_obj instanceof CompanyLedger){ + } + else + $this->ids["{$object_property}"]["{$obj->hashed_id}"] = $new_obj->id; } From 9b5a6f3468e5a4fe5ccdf4da92d5fd04729ff3b0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 19:26:56 +1000 Subject: [PATCH 08/12] Company Ledger import --- tests/Feature/Import/ImportCompanyTest.php | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index 7bdfe001ea..f9addafd91 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -24,6 +24,8 @@ use App\Models\CompanyToken; use App\Models\CompanyUser; use App\Models\Credit; use App\Models\CreditInvitation; +use App\Models\Design; +use App\Models\Document; use App\Models\Expense; use App\Models\ExpenseCategory; use App\Models\GroupSetting; @@ -839,6 +841,101 @@ class ImportCompanyTest extends TestCase $this->assertEquals(3, CompanyLedger::count()); // Company Ledger + +// Designs + + $this->genericImport(Design::class, + ['company_id', 'user_id'], + [ + ['users' => 'user_id'], + ], + 'designs', + 'name'); + +// Designs + +// Documents + $this->documentsImport(); +// Documents + } + + private function documentsImport() + { + + foreach($this->backup_json_object->documents as $document) + { + + $new_document = new Document(); + $new_document->user_id = $this->transformId('users', $document->user_id); + $new_document->assigned_user_id = $this->transformId('users', $document->assigned_user_id); + $new_document->company_id = $this->company->id; + $new_document->project_id = $this->transformId('projects', $document->project_id); + $new_document->vendor_id = $this->transformId('vendors', $document->vendor_id); + $new_document->url = $document->url; + $new_document->preview = $document->preview; + $new_document->name = $document->name; + $new_document->type = $document->type; + $new_document->disk = $document->disk; + $new_document->hash = $document->hash; + $new_document->size = $document->size; + $new_document->width = $document->width; + $new_document->height = $document->height; + $new_document->is_default = $document->is_default; + $new_document->custom_value1 = $document->custom_value1; + $new_document->custom_value2 = $document->custom_value2; + $new_document->custom_value3 = $document->custom_value3; + $new_document->custom_value4 = $document->custom_value4; + $new_document->deleted_at = $document->deleted_at; + $new_document->documentable_id = $this->transformDocumentId($document->documentable_id, $document->documentable_type); + $new_document->documentable_type = $document->documentable_type; + + $new_document->save(['timestamps' => false]); + + } + } + + private function transformDocumentId($id, $type) + { + switch ($type) { + case Company::class: + return $this->company->id; + break; + case Client::class: + return $this->transformId('clients', $id); + break; + case ClientContact::class: + return $this->transformId('client_contacts', $id); + break; + case Credit::class: + return $this->transformId('credits', $id); + break; + case Expense::class: + return $this->transformId('expenses', $id); + break; + case Invoice::class: + return $this->transformId('invoices', $id); + break; + case Payment::class: + return $this->transformId('payments', $id); + break; + case Product::class: + return $this->transformId('products', $id); + break; + case Quote::class: + return $this->transformId('quotes', $id); + break; + case RecurringInvoice::class: + return $this->transformId('recurring_invoices', $id); + break; + case Company::class: + return $this->transformId('clients', $id); + break; + + + default: + # code... + break; + } } private function paymentablesImport() From b72217d74c7c593f448c969dbde74ca040c0f47f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 21:26:43 +1000 Subject: [PATCH 09/12] Fixes for import company tests --- app/Http/Controllers/ImportJsonController.php | 64 ++++++++++++++++++ app/Jobs/Company/CompanyExport.php | 7 +- app/Models/Company.php | 5 ++ ..._make_documents_assigned_user_nullable.php | 41 +++++++++++ routes/api.php | 1 + tests/Feature/Import/ImportCompanyTest.php | 7 +- tests/Feature/Import/backup.zip | Bin 13809 -> 14067 bytes 7 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/ImportJsonController.php create mode 100644 database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php diff --git a/app/Http/Controllers/ImportJsonController.php b/app/Http/Controllers/ImportJsonController.php new file mode 100644 index 0000000000..5a95fa23a8 --- /dev/null +++ b/app/Http/Controllers/ImportJsonController.php @@ -0,0 +1,64 @@ +user()->getCompany(), auth()->user()); + + return response()->json(['message' => 'Processing'], 200); + + } +} diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 3794be9dd6..fd26f3a33c 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -220,9 +220,10 @@ class CompanyExport implements ShouldQueue $this->export_data['designs'] = $this->company->user_designs->makeHidden(['id'])->all(); - $this->export_data['documents'] = $this->company->documents->map(function ($document){ + $this->export_data['documents'] = $this->company->all_documents->map(function ($document){ - $document = $this->transformArrayOfKeys($document, ['user_id', 'assigned_user_id', 'company_id', 'project_id', 'vendor_id']); + $document = $this->transformArrayOfKeys($document, ['user_id', 'assigned_user_id', 'company_id', 'project_id', 'vendor_id','documentable_id']); + $document->hashed_id = $this->encodePrimaryKey($document->id); return $document->makeVisible(['id']); @@ -431,7 +432,7 @@ class CompanyExport implements ShouldQueue })->makeHidden(['id'])->all(); //write to tmp and email to owner(); - + $this->zipAndSend(); return true; diff --git a/app/Models/Company.php b/app/Models/Company.php index e197b6de4d..50096c00ab 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -131,6 +131,11 @@ class Company extends BaseModel return $this->morphMany(Document::class, 'documentable'); } + public function all_documents() + { + return $this->HasMany(Document::class); + } + public function getEntityType() { return self::class; diff --git a/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php b/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php new file mode 100644 index 0000000000..6b4f3b3ea5 --- /dev/null +++ b/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php @@ -0,0 +1,41 @@ +unsignedInteger('assigned_user_id')->nullable()->change(); + }); + + Document::where('assigned_user_id', 0)->update(['assigned_user_id' => null]); + + if(config('ninja.db.multi_db_enabled')){ + Document::on('db-ninja-01')->where('assigned_user_id', 0)->update(['assigned_user_id' => null]); + Document::on('db-ninja-02')->where('assigned_user_id', 0)->update(['assigned_user_id' => null]); + } + else{ + Document::where('assigned_user_id', 0)->update(['assigned_user_id' => null]); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/routes/api.php b/routes/api.php index ea1477edd5..1ce7f9bc8c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -84,6 +84,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a Route::post('group_settings/bulk', 'GroupSettingController@bulk'); Route::post('import', 'ImportController@import')->name('import.import'); + Route::post('import_json', 'ImportJsonController@import')->name('import.import_json'); Route::post('preimport', 'ImportController@preimport')->name('import.preimport'); Route::resource('invoices', 'InvoiceController'); // name = (invoices. index / create / show / update / destroy / edit diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index f9addafd91..d4918b3a11 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -855,7 +855,12 @@ class ImportCompanyTest extends TestCase // Designs // Documents + $this->assertEquals(2, count($this->backup_json_object->documents)); + $this->documentsImport(); + + $this->assertEquals(2, Document::count()); + // Documents } @@ -912,7 +917,7 @@ class ImportCompanyTest extends TestCase case Expense::class: return $this->transformId('expenses', $id); break; - case Invoice::class: + case 'invoices': return $this->transformId('invoices', $id); break; case Payment::class: diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index 33cbe23c9ab01a58a883ad8e859bf20a155f216b..66f5bfdc7e50b70d2d30313a90b3354cdc899735 100644 GIT binary patch literal 14067 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 literal 13809 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 P0rLK-e?OBleO&!7z^dU; From d837ca97e946ae17d0ca49aa23a4c16f230ff30c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 21:37:34 +1000 Subject: [PATCH 10/12] Fixes for tests --- ...1_05_30_100933_make_documents_assigned_user_nullable.php | 6 ++++-- tests/Feature/Import/ImportCompanyTest.php | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php b/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php index 6b4f3b3ea5..3135b0d5fc 100644 --- a/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php +++ b/database/migrations/2021_05_30_100933_make_documents_assigned_user_nullable.php @@ -1,5 +1,6 @@ update(['assigned_user_id' => null]); if(config('ninja.db.multi_db_enabled')){ - Document::on('db-ninja-01')->where('assigned_user_id', 0)->update(['assigned_user_id' => null]); - Document::on('db-ninja-02')->where('assigned_user_id', 0)->update(['assigned_user_id' => null]); + foreach (MultiDB::$dbs as $db) { + Document::on($db)->where('assigned_user_id', 0)->update(['assigned_user_id' => null]); + } } else{ Document::where('assigned_user_id', 0)->update(['assigned_user_id' => null]); diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index d4918b3a11..c0360ab9e8 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -48,6 +48,7 @@ use App\Models\User; use App\Models\Vendor; use App\Models\VendorContact; use App\Utils\Traits\MakesHash; +use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Str; @@ -63,7 +64,8 @@ use Tests\TestCase; class ImportCompanyTest extends TestCase { use MakesHash; - + use DatabaseTransactions; + public $account; public $company; public $backup_json_object; From d429880c1e2040209d9212ef8fa998bd7d9c8161 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 21:39:54 +1000 Subject: [PATCH 11/12] v5.1.66 --- VERSION.txt | 2 +- config/ninja.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 69dd5a4045..248ea8b885 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.1.65 \ No newline at end of file +5.1.66 \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index 68a57bab86..1c31e50de6 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -14,8 +14,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => '5.1.65', - 'app_tag' => '5.1.65-release', + 'app_version' => '5.1.66', + 'app_tag' => '5.1.66-release', 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''), From 57b62a988ab36c513ae24593336c5ed2c775096c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 21:46:30 +1000 Subject: [PATCH 12/12] Fixes for tests --- tests/Feature/Import/ImportCompanyTest.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index c0360ab9e8..ae3b5d3ce7 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -65,7 +65,7 @@ class ImportCompanyTest extends TestCase { use MakesHash; use DatabaseTransactions; - + public $account; public $company; public $backup_json_object; @@ -101,6 +101,13 @@ class ImportCompanyTest extends TestCase $this->backup_json_object = json_decode(file_get_contents($backup_json_file)); + Credit::all()->each(function($credit){ + $credit->forceDelete(); + }); + + CreditInvitation::all()->each(function($credit){ + $credit->forceDelete(); + }); } public function testBackupJsonRead() @@ -671,7 +678,7 @@ class ImportCompanyTest extends TestCase ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'credit_id'], [ ['users' => 'user_id'], - ['quotes' => 'credit_id'], + ['credits' => 'credit_id'], ['client_contacts' => 'client_contact_id'], ], 'credit_invitations',