Tests for adding language ID for vendors

This commit is contained in:
David Bomba 2023-08-10 10:04:16 +10:00
parent 79c4d49896
commit 92336b7f05
9 changed files with 240 additions and 18 deletions

View File

@ -0,0 +1,111 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Helpers\Bank\Yodlee\DTO;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Attributes\MapOutputName;
use Illuminate\Support\Collection;
/**
* {#2983
"account": [
{#2979
"CONTAINER": "bank",
"providerAccountId": 10058190,
"accountName": "Business Trans Acct",
"accountStatus": "ACTIVE",
"accountNumber": "1011 4402",
"aggregationSource": "USER",
"isAsset": true,
"balance": {#2978
"currency": "AUD",
"amount": 308544.98,
},
"id": 10139315,
"includeInNetWorth": true,
"providerId": "3857",
"providerName": "Commonwealth Bank",
"isManual": false,
"availableBalance": {#2966
"currency": "AUD",
"amount": 309044.98,
},
"currentBalance": {#2982
"currency": "AUD",
"amount": 308544.98,
},
"accountType": "CHECKING",
"displayedName": "after David",
"createdDate": "2023-01-10T08:29:07Z",
"classification": "SMALL_BUSINESS",
"lastUpdated": "2023-08-01T23:50:13Z",
"nickname": "Business Trans Acct",
"bankTransferCode": [
{#2976
"id": "062020",
"type": "BSB",
},
],
"dataset": [
{#2971
"name": "BASIC_AGG_DATA",
"additionalStatus": "AVAILABLE_DATA_RETRIEVED",
"updateEligibility": "ALLOW_UPDATE",
"lastUpdated": "2023-08-01T23:49:53Z",
"lastUpdateAttempt": "2023-08-01T23:49:53Z",
"nextUpdateScheduled": "2023-08-03T14:45:14Z",
},
],
},
],
}
*/
class AccountSummary extends Data
{
public ?int $id;
#[MapInputName('CONTAINER')]
public ?string $account_type;
#[MapInputName('accountName')]
public ?string $account_name;
#[MapInputName('accountStatus')]
public ?string $account_status;
#[MapInputName('accountNumber')]
public ?string $account_number;
#[MapInputName('providerAccountId')]
public int $provider_account_id;
#[MapInputName('providerId')]
public ?string $provider_id;
#[MapInputName('providerName')]
public ?string $provider_name;
public ?string $nickname;
public ?float $current_balance;
public ?string $account_currency;
public static function prepareForPipeline(Collection $properties) : Collection
{
$properties->put('current_balance', (array)$properties['currentBalance']['amount'] ?? '');
$properties->put('account_currency', (array)$properties['currentBalance']['currency'] ?? '');
return $properties;
}
}

View File

@ -26,17 +26,23 @@ class StoreVendorRequest extends Request
*/ */
public function authorize() : bool 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() public function rules()
{ {
/** @var \App\Models\User $user */
$user = auth()->user();
$rules = []; $rules = [];
$rules['contacts.*.email'] = 'bail|nullable|distinct|sometimes|email'; $rules['contacts.*.email'] = 'bail|nullable|distinct|sometimes|email';
if (isset($this->number)) { 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'; $rules['currency_id'] = 'bail|required|exists:currencies,id';
@ -53,15 +59,20 @@ class StoreVendorRequest extends Request
$rules['file'] = $this->file_validation; $rules['file'] = $this->file_validation;
} }
$rules['language_id'] = 'bail|nullable|sometimes|exists:languages,id';
return $rules; return $rules;
} }
public function prepareForValidation() public function prepareForValidation()
{ {
/** @var \App\Models\User $user */
$user = auth()->user();
$input = $this->all(); $input = $this->all();
if (!array_key_exists('currency_id', $input) || empty($input['currency_id'])) { 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); $input = $this->decodePrimaryKeys($input);

View File

@ -28,17 +28,21 @@ class UpdateVendorRequest extends Request
*/ */
public function authorize() : bool 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() 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'; $rules['country_id'] = 'integer';
if ($this->number) { 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'; $rules['contacts.*.email'] = 'nullable|distinct';
@ -56,6 +60,8 @@ class UpdateVendorRequest extends Request
$rules['file'] = $this->file_validation; $rules['file'] = $this->file_validation;
} }
$rules['language_id'] = 'bail|nullable|sometimes|exists:languages,id';
return $rules; return $rules;
} }

View File

@ -51,6 +51,8 @@ use Laracasts\Presenter\PresentableTrait;
* @property string|null $vendor_hash * @property string|null $vendor_hash
* @property string|null $public_notes * @property string|null $public_notes
* @property string|null $id_number * @property string|null $id_number
* @property string|null $language_id
* @property int|null $last_login
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read int|null $activities_count * @property-read int|null $activities_count
* @property-read \App\Models\User|null $assigned_user * @property-read \App\Models\User|null $assigned_user
@ -140,6 +142,7 @@ class Vendor extends BaseModel
'custom_value3', 'custom_value3',
'custom_value4', 'custom_value4',
'number', 'number',
'language_id',
]; ];
protected $casts = [ protected $casts = [

View File

@ -103,6 +103,7 @@ class VendorTransformer extends EntityTransformer
'archived_at' => (int) $vendor->deleted_at, 'archived_at' => (int) $vendor->deleted_at,
'created_at' => (int) $vendor->created_at, 'created_at' => (int) $vendor->created_at,
'number' => (string) $vendor->number ?: '', 'number' => (string) $vendor->number ?: '',
'language_id' => (string) $vendor->language_id ?: '',
]; ];
} }
} }

View File

@ -5147,6 +5147,15 @@ $LANG = array(
'intracommunity_tax_info' => 'Tax-free intra-community delivery', 'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge', 'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
'currency_nicaraguan_cordoba' => 'Nicaraguan Córdoba', '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; return $LANG;

View File

@ -2189,7 +2189,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'credit_total' => 'Total du crédit', 'credit_total' => 'Total du crédit',
'mark_billable' => 'Marquer comme facturable', 'mark_billable' => 'Marquer comme facturable',
'billed' => 'Facturé', 'billed' => 'Facturé',
'company_variables' => 'Variables de la compagnie', 'company_variables' => 'Variables de l\'entreprise',
'client_variables' => 'Variables du client', 'client_variables' => 'Variables du client',
'invoice_variables' => 'Variables de facture', 'invoice_variables' => 'Variables de facture',
'navigation_variables' => 'Variables de navigation', '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_cuban_peso' => 'Cuban Peso',
'currency_bz_dollar' => 'Dollar bélizien', '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.<br/>Un commentaire de votre part serait grandement apprécié!', 'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.<br/>Un commentaire de votre part serait grandement apprécié!',
'writing_a_review' => 'rédiger un commentaire', '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', 'contact_custom_value4' => 'Valeur personnalisée du contact 4',
'assigned_to_id' => 'Assigné à ID', 'assigned_to_id' => 'Assigné à ID',
'created_by_id' => 'Créé par ID', 'created_by_id' => 'Créé par ID',
'add_column' => 'Ajouter colonne', 'add_column' => 'Ajouter une colonne',
'edit_columns' => 'Éditer colonne', 'edit_columns' => 'Éditer les colonnes',
'to_learn_about_gogle_fonts' => 'en savoir plus sur Google Fonts', 'to_learn_about_gogle_fonts' => 'en savoir plus sur Google Fonts',
'refund_date' => 'Date de remboursement', 'refund_date' => 'Date de remboursement',
'multiselect' => 'Sélection multiple', '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', 'item_tax_rates' => 'Taux de taxe par article',
'configure_rates' => 'Configuration des taux', 'configure_rates' => 'Configuration des taux',
'tax_settings_rates' => 'Taux de taxe', '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', 'comma_sparated_list' => 'Liste séparée par virgule',
'single_line_text' => 'Ligne de texte simple', 'single_line_text' => 'Ligne de texte simple',
'multi_line_text' => 'Zone de texte multilignes', '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', 'quote_details' => 'Informations de la soumission',
'credit_details' => 'Informations de crédit', 'credit_details' => 'Informations de crédit',
'product_columns' => 'Colonnes produit', 'product_columns' => 'Colonnes produit',
'task_columns' => 'Colonnes tâches', 'task_columns' => 'Colonnes tâche',
'add_field' => 'Ajouter un champ', 'add_field' => 'Ajouter un champ',
'all_events' => 'Ajouter un événement', 'all_events' => 'Ajouter un événement',
'owned' => 'Propriétaire', 'owned' => 'Propriétaire',
@ -4209,7 +4212,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'copyright' => 'Droits d\'auteur', 'copyright' => 'Droits d\'auteur',
'user_created_user' => ':user a créé :created_user à :time', 'user_created_user' => ':user a créé :created_user à :time',
'company_deleted' => 'Entreprise supprimée', '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', 'back_to' => 'Retour à :url',
'stripe_connect_migration_title' => 'Connectez votre compte Stripe', '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.<br><br>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é !', '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.<br><br>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', 'id' => 'Id',
'convert_to' => 'Convertir en', 'convert_to' => 'Convertir en',
'client_currency' => 'Devise du client', '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', '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', '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', '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', 'sync_from' => 'Sync de',
'gateway_payment_text' => 'Factures: :invoices pour :amount pour :client', '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', '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 à', 'ship_to' => 'Livrer à',
'stripe_direct_debit_details' => 'Veuillez transférer dans le compte bancaire indiqué ci-dessus.', 'stripe_direct_debit_details' => 'Veuillez transférer dans le compte bancaire indiqué ci-dessus.',
'branch_name' => 'Nom de succursale', '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_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', 'activity_10_manual' => ':user a saisi un paiement :payment pour la facture :invoice pour :client',
'default_payment_type' => 'Type de paiement par défaut', '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; return $LANG;
?> ?>

View File

@ -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::resource('clients', ClientController::class); // name = (clients. index / create / show / update / destroy / edit
Route::put('clients/{client}/upload', [ClientController::class, 'upload'])->name('clients.upload'); 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}/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/{client}/{mergeable_client}/merge', [ClientController::class, 'merge'])->name('clients.merge')->middleware('password_protected');
Route::post('clients/bulk', [ClientController::class, 'bulk'])->name('clients.bulk'); Route::post('clients/bulk', [ClientController::class, 'bulk'])->name('clients.bulk');

View File

@ -29,6 +29,8 @@ class VendorApiTest extends TestCase
use DatabaseTransactions; use DatabaseTransactions;
use MockAccountData; use MockAccountData;
public $faker;
protected function setUp() :void protected function setUp() :void
{ {
parent::setUp(); parent::setUp();
@ -40,6 +42,9 @@ class VendorApiTest extends TestCase
$this->faker = \Faker\Factory::create(); $this->faker = \Faker\Factory::create();
Model::reguard(); Model::reguard();
// $this->withoutExceptionHandling();
} }
public function testVendorGetFilter() public function testVendorGetFilter()
@ -52,10 +57,79 @@ class VendorApiTest extends TestCase
$response->assertStatus(200); $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() public function testAddVendorToInvoice()
{ {
$data = [ $data = [
'name' => $this->faker->firstName(), 'name' => $this->faker->firstName(),
'language_id' => '',
]; ];
$response = $this->withHeaders([ $response = $this->withHeaders([