From 92336b7f0533d151a5c278de028bb3ad54de4084 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 10 Aug 2023 10:04:16 +1000 Subject: [PATCH] Tests for adding language ID for vendors --- .../Bank/Yodlee/DTO/AccountSummary.php | 111 ++++++++++++++++++ .../Requests/Vendor/StoreVendorRequest.php | 17 ++- .../Requests/Vendor/UpdateVendorRequest.php | 14 ++- app/Models/Vendor.php | 3 + app/Transformers/VendorTransformer.php | 1 + lang/en/texts.php | 9 ++ lang/fr_CA/texts.php | 27 +++-- routes/api.php | 2 +- tests/Feature/VendorApiTest.php | 74 ++++++++++++ 9 files changed, 240 insertions(+), 18 deletions(-) create mode 100644 app/Helpers/Bank/Yodlee/DTO/AccountSummary.php diff --git a/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php b/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php new file mode 100644 index 0000000000..f0771dde9f --- /dev/null +++ b/app/Helpers/Bank/Yodlee/DTO/AccountSummary.php @@ -0,0 +1,111 @@ +put('current_balance', (array)$properties['currentBalance']['amount'] ?? ''); + $properties->put('account_currency', (array)$properties['currentBalance']['currency'] ?? ''); + + return $properties; + } +} \ No newline at end of file diff --git a/app/Http/Requests/Vendor/StoreVendorRequest.php b/app/Http/Requests/Vendor/StoreVendorRequest.php index 777930dd70..2de5edeca0 100644 --- a/app/Http/Requests/Vendor/StoreVendorRequest.php +++ b/app/Http/Requests/Vendor/StoreVendorRequest.php @@ -26,17 +26,23 @@ class StoreVendorRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('create', Vendor::class); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('create', Vendor::class); } public function rules() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules = []; $rules['contacts.*.email'] = 'bail|nullable|distinct|sometimes|email'; if (isset($this->number)) { - $rules['number'] = Rule::unique('vendors')->where('company_id', auth()->user()->company()->id); + $rules['number'] = Rule::unique('vendors')->where('company_id', $user->company()->id); } $rules['currency_id'] = 'bail|required|exists:currencies,id'; @@ -53,15 +59,20 @@ class StoreVendorRequest extends Request $rules['file'] = $this->file_validation; } + $rules['language_id'] = 'bail|nullable|sometimes|exists:languages,id'; + return $rules; } public function prepareForValidation() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $input = $this->all(); if (!array_key_exists('currency_id', $input) || empty($input['currency_id'])) { - $input['currency_id'] = auth()->user()->company()->settings->currency_id; + $input['currency_id'] = $user->company()->settings->currency_id; } $input = $this->decodePrimaryKeys($input); diff --git a/app/Http/Requests/Vendor/UpdateVendorRequest.php b/app/Http/Requests/Vendor/UpdateVendorRequest.php index 2010b38d1d..867b4541c0 100644 --- a/app/Http/Requests/Vendor/UpdateVendorRequest.php +++ b/app/Http/Requests/Vendor/UpdateVendorRequest.php @@ -28,17 +28,21 @@ class UpdateVendorRequest extends Request */ public function authorize() : bool { - return auth()->user()->can('edit', $this->vendor); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->can('edit', $this->vendor); } public function rules() { - /* Ensure we have a client name, and that all emails are unique*/ - + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules['country_id'] = 'integer'; if ($this->number) { - $rules['number'] = Rule::unique('vendors')->where('company_id', auth()->user()->company()->id)->ignore($this->vendor->id); + $rules['number'] = Rule::unique('vendors')->where('company_id', $user->company()->id)->ignore($this->vendor->id); } $rules['contacts.*.email'] = 'nullable|distinct'; @@ -56,6 +60,8 @@ class UpdateVendorRequest extends Request $rules['file'] = $this->file_validation; } + $rules['language_id'] = 'bail|nullable|sometimes|exists:languages,id'; + return $rules; } diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index 43ed415da6..7dfbfa60e7 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -51,6 +51,8 @@ use Laracasts\Presenter\PresentableTrait; * @property string|null $vendor_hash * @property string|null $public_notes * @property string|null $id_number + * @property string|null $language_id + * @property int|null $last_login * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read int|null $activities_count * @property-read \App\Models\User|null $assigned_user @@ -140,6 +142,7 @@ class Vendor extends BaseModel 'custom_value3', 'custom_value4', 'number', + 'language_id', ]; protected $casts = [ diff --git a/app/Transformers/VendorTransformer.php b/app/Transformers/VendorTransformer.php index f2acf862af..bbf1bfcde7 100644 --- a/app/Transformers/VendorTransformer.php +++ b/app/Transformers/VendorTransformer.php @@ -103,6 +103,7 @@ class VendorTransformer extends EntityTransformer 'archived_at' => (int) $vendor->deleted_at, 'created_at' => (int) $vendor->created_at, 'number' => (string) $vendor->number ?: '', + 'language_id' => (string) $vendor->language_id ?: '', ]; } } diff --git a/lang/en/texts.php b/lang/en/texts.php index de744e9332..f9d8f3821a 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5147,6 +5147,15 @@ $LANG = array( 'intracommunity_tax_info' => 'Tax-free intra-community delivery', 'reverse_tax_info' => 'Please note that this supply is subject to reverse charge', 'currency_nicaraguan_cordoba' => 'Nicaraguan Córdoba', + 'public' => 'Public', + 'private' => 'Private', + 'image' => 'Image', + 'other' => 'Other', + 'linked_to' => 'Linked To', + 'file_saved_in_path' => 'The file has been saved in :path', + 'unlinked_transactions' => 'Successfully unlinked :count transactions', + 'unlinked_transaction' => 'Successfully unlinked transaction', + 'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', ); return $LANG; diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index 46bdc30e79..a349743843 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -2189,7 +2189,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'credit_total' => 'Total du crédit', 'mark_billable' => 'Marquer comme facturable', 'billed' => 'Facturé', - 'company_variables' => 'Variables de la compagnie', + 'company_variables' => 'Variables de l\'entreprise', 'client_variables' => 'Variables du client', 'invoice_variables' => 'Variables de facture', 'navigation_variables' => 'Variables de navigation', @@ -2396,6 +2396,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'currency_cuban_peso' => 'Cuban Peso', 'currency_bz_dollar' => 'Dollar bélizien', + 'currency_libyan_dinar' => 'Dinar libyen', + 'currency_silver_troy_ounce' => 'Once troy d\'argent', + 'currency_gold_troy_ounce' => 'Once troy d\'or', 'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.
Un commentaire de votre part serait grandement apprécié!', 'writing_a_review' => 'rédiger un commentaire', @@ -3264,8 +3267,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'contact_custom_value4' => 'Valeur personnalisée du contact 4', 'assigned_to_id' => 'Assigné à ID', 'created_by_id' => 'Créé par ID', - 'add_column' => 'Ajouter colonne', - 'edit_columns' => 'Éditer colonne', + 'add_column' => 'Ajouter une colonne', + 'edit_columns' => 'Éditer les colonnes', 'to_learn_about_gogle_fonts' => 'en savoir plus sur Google Fonts', 'refund_date' => 'Date de remboursement', 'multiselect' => 'Sélection multiple', @@ -3320,7 +3323,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'item_tax_rates' => 'Taux de taxe par article', 'configure_rates' => 'Configuration des taux', 'tax_settings_rates' => 'Taux de taxe', - 'accent_color' => 'Couleur de mise en évidence', + 'accent_color' => 'Couleur d\'accent', 'comma_sparated_list' => 'Liste séparée par virgule', 'single_line_text' => 'Ligne de texte simple', 'multi_line_text' => 'Zone de texte multilignes', @@ -3415,7 +3418,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'quote_details' => 'Informations de la soumission', 'credit_details' => 'Informations de crédit', 'product_columns' => 'Colonnes produit', - 'task_columns' => 'Colonnes tâches', + 'task_columns' => 'Colonnes tâche', 'add_field' => 'Ajouter un champ', 'all_events' => 'Ajouter un événement', 'owned' => 'Propriétaire', @@ -4209,7 +4212,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'copyright' => 'Droits d\'auteur', 'user_created_user' => ':user a créé :created_user à :time', 'company_deleted' => 'Entreprise supprimée', - 'company_deleted_body' => 'La compagnie [:company] a été supprimé par :user', + 'company_deleted_body' => 'L\'entreprise [:company] a été supprimé par :user', 'back_to' => 'Retour à :url', 'stripe_connect_migration_title' => 'Connectez votre compte Stripe', 'stripe_connect_migration_desc' => 'Invoice Ninja v5 utilise Stripe Connect pour lier votre compte Stripe à Invoice Ninja. Cela fournit une couche de sécurité supplémentaire pour votre compte. Maintenant que vos données ont migré, vous devez autoriser Stripe à accepter les paiements dans la v5.

Pour ce faire, accédez à Paramètres > Paiements en ligne > Configurer les passerelles. Cliquez sur Stripe Connect, puis sous Paramètres, cliquez sur Configurer la passerelle. Cela vous amènera à Stripe pour autoriser Invoice Ninja et à votre retour, votre compte sera lié !', @@ -4478,7 +4481,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'id' => 'Id', 'convert_to' => 'Convertir en', 'client_currency' => 'Devise du client', - 'company_currency' => 'Devise de la compagnie', + 'company_currency' => 'Devise de l\'entreprise', 'custom_emails_disabled_help' => 'Il est nécessaire de souscrire à un compte payant pour personnaliser les paramètres anti-pourriels', 'upgrade_to_add_company' => 'Augmenter votre plan pour ajouter des entreprises', 'file_saved_in_downloads_folder' => 'Le fichier a été sauvegardé dans le dossier Téléchargements', @@ -4944,7 +4947,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'sync_from' => 'Sync de', 'gateway_payment_text' => 'Factures: :invoices pour :amount pour :client', 'gateway_payment_text_no_invoice' => 'Paiement sans facture d\'un montant de :amount pour le client :client', - 'click_to_variables' => 'Cliquez ici pour voir toutes les variables', + 'click_to_variables' => 'Cliquez ici pour voir toutes les variables.', 'ship_to' => 'Livrer à', 'stripe_direct_debit_details' => 'Veuillez transférer dans le compte bancaire indiqué ci-dessus.', 'branch_name' => 'Nom de succursale', @@ -5127,9 +5130,13 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'activity_10_online' => ':contact a saisi un paiement :payment pour la facture :invoice pour :client', 'activity_10_manual' => ':user a saisi un paiement :payment pour la facture :invoice pour :client', 'default_payment_type' => 'Type de paiement par défaut', + 'number_precision' => 'Précision du nombre', + 'number_precision_help' => 'Contrôle le nombre de décimales supportées dans l\'interface', + 'is_tax_exempt' => 'Exonéré de taxe', + 'drop_files_here' => 'Déposez les fichiers ici', + 'upload_files' => 'Téléverser les fichiers', ); - return $LANG; -?> \ No newline at end of file +?> diff --git a/routes/api.php b/routes/api.php index 3210f8c92e..93a84ea8f6 100644 --- a/routes/api.php +++ b/routes/api.php @@ -157,7 +157,7 @@ Route::group(['middleware' => ['throttle:api', 'api_db', 'token_auth', 'locale'] Route::resource('clients', ClientController::class); // name = (clients. index / create / show / update / destroy / edit Route::put('clients/{client}/upload', [ClientController::class, 'upload'])->name('clients.upload'); Route::post('clients/{client}/purge', [ClientController::class, 'purge'])->name('clients.purge')->middleware('password_protected'); - Route::post('clients/{client}/updateTaxData', [ClientController::class, 'updateTaxData'])->name('clients.purge')->middleware('throttle:3,1'); + Route::post('clients/{client}/updateTaxData', [ClientController::class, 'updateTaxData'])->name('clients.update_tax_data')->middleware('throttle:3,1'); Route::post('clients/{client}/{mergeable_client}/merge', [ClientController::class, 'merge'])->name('clients.merge')->middleware('password_protected'); Route::post('clients/bulk', [ClientController::class, 'bulk'])->name('clients.bulk'); diff --git a/tests/Feature/VendorApiTest.php b/tests/Feature/VendorApiTest.php index 79a8800f0f..09383ea7e6 100644 --- a/tests/Feature/VendorApiTest.php +++ b/tests/Feature/VendorApiTest.php @@ -29,6 +29,8 @@ class VendorApiTest extends TestCase use DatabaseTransactions; use MockAccountData; + public $faker; + protected function setUp() :void { parent::setUp(); @@ -40,6 +42,9 @@ class VendorApiTest extends TestCase $this->faker = \Faker\Factory::create(); Model::reguard(); + + // $this->withoutExceptionHandling(); + } public function testVendorGetFilter() @@ -52,10 +57,79 @@ class VendorApiTest extends TestCase $response->assertStatus(200); } + + public function testAddVendorLanguage200() + { + $data = [ + 'name' => $this->faker->firstName(), + 'language_id' => 2, + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/vendors', $data)->assertStatus(200); + + $arr = $response->json(); + $this->assertEquals('2', $arr['data']['language_id']); + + $id = $arr['data']['id']; + + $data = [ + 'language_id' => 3, + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->putJson("/api/v1/vendors/{$id}", $data); + + $response->assertStatus(200); + + $arr = $response->json(); + $this->assertEquals('3', $arr['data']['language_id']); + + } + + public function testAddVendorLanguage422() + { + $data = [ + 'name' => $this->faker->firstName(), + 'language_id' => '4431', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/vendors', $data)->assertStatus(422); + + } + + + public function testAddVendorLanguage() + { + $data = [ + 'name' => $this->faker->firstName(), + 'language_id' => '1', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->post('/api/v1/vendors', $data); + + $response->assertStatus(200); + $arr = $response->json(); + + $this->assertEquals('1', $arr['data']['language_id']); + } + + public function testAddVendorToInvoice() { $data = [ 'name' => $this->faker->firstName(), + 'language_id' => '', ]; $response = $this->withHeaders([