diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 9081a896541a..b043c55501cf 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -22,11 +22,11 @@ class CompanySettings extends BaseSettings public $timezone_id = ''; public $date_format_id = ''; - public $datetime_format_id = ''; public $military_time = false; public $language_id = ''; public $show_currency_code = false; + public $currency_id = '1'; public $payment_terms = 1; @@ -180,6 +180,7 @@ class CompanySettings extends BaseSettings 'phone' => 'string', 'email' => 'string', 'country_id' => 'string', + 'currency_id' => 'string', 'vat_number' => 'string', 'id_number' => 'string', 'tax_name1' => 'string', @@ -194,7 +195,6 @@ class CompanySettings extends BaseSettings 'show_accept_invoice_terms' => 'bool', 'timezone_id' => 'string', 'date_format_id' => 'string', - 'datetime_format_id' => 'string', 'military_time' => 'bool', 'language_id' => 'string', 'show_currency_code' => 'bool', @@ -300,10 +300,10 @@ class CompanySettings extends BaseSettings unset($data->protected_fields); $data->timezone_id = (string)config('ninja.i18n.timezone_id'); + $data->currency_id = (string)config('ninja.i18n.currency_id'); $data->language_id = (string)config('ninja.i18n.language_id'); $data->payment_terms = (int)config('ninja.i18n.payment_terms'); - $data->datetime_format_id = (string)config('ninja.i18n.datetime_format_id'); - $data->military_time = (bool )config('ninja.i18n.military_time'); + $data->military_time = (bool)config('ninja.i18n.military_time'); $data->date_format_id = (string)config('ninja.i18n.date_format_id'); $data->country_id = (string)config('ninja.i18n.country_id'); $data->translations = (object) []; diff --git a/app/Factory/ClientFactory.php b/app/Factory/ClientFactory.php index 82c5abae6d60..ba29f0729c46 100644 --- a/app/Factory/ClientFactory.php +++ b/app/Factory/ClientFactory.php @@ -30,7 +30,6 @@ class ClientFactory $client->country_id = 4; $client->is_deleted = 0; $client->client_hash = Str::random(40); - $client->currency_id = config('ninja.i18n.currency_id'); $client->settings = ClientSettings::defaults(); $client_contact = ClientContactFactory::create($company_id, $user_id); diff --git a/app/Helpers/Invoice/InvoiceItemCalc.php b/app/Helpers/Invoice/InvoiceItemCalc.php index d88356bb088a..02fe7c0afa15 100644 --- a/app/Helpers/Invoice/InvoiceItemCalc.php +++ b/app/Helpers/Invoice/InvoiceItemCalc.php @@ -50,7 +50,7 @@ class InvoiceItemCalc public function process() { - $this->line_total = $this->formatValue($this->item->cost, $this->invoice->client->currency->precision) * $this->formatValue($this->item->quantity, $this->invoice->client->currency->precision); + $this->line_total = $this->formatValue($this->item->cost, $this->invoice->client->currency()->precision) * $this->formatValue($this->item->quantity, $this->invoice->client->currency()->precision); $this->setDiscount() ->calcTaxes(); @@ -65,7 +65,7 @@ class InvoiceItemCalc if($this->item->is_amount_discount) { - $discount = $this->formatValue($this->item->discount, $this->invoice->client->currency->precision); + $discount = $this->formatValue($this->item->discount, $this->invoice->client->currency()->precision); $this->line_total -= $discount; @@ -73,7 +73,7 @@ class InvoiceItemCalc } else { - $discount = $this->formatValue(($this->line_total * $this->item->discount / 100), $this->invoice->client->currency->precision); + $discount = $this->formatValue(($this->line_total * $this->item->discount / 100), $this->invoice->client->currency()->precision); $this->line_total -= $discount; @@ -91,12 +91,12 @@ class InvoiceItemCalc if(isset($this->item->tax_rate1) && $this->item->tax_rate1 > 0) { - $tax_rate1 = $this->formatValue($this->item->tax_rate1, $this->invoice->client->currency->precision); + $tax_rate1 = $this->formatValue($this->item->tax_rate1, $this->invoice->client->currency()->precision); if($this->settings->inclusive_taxes) - $item_tax_rate1_total = $this->formatValue(($this->line_total - ($this->line_total / (1+$tax_rate1/100))) , $this->invoice->client->currency->precision); + $item_tax_rate1_total = $this->formatValue(($this->line_total - ($this->line_total / (1+$tax_rate1/100))) , $this->invoice->client->currency()->precision); else - $item_tax_rate1_total = $this->formatValue(($this->line_total * $tax_rate1/100), $this->invoice->client->currency->precision); + $item_tax_rate1_total = $this->formatValue(($this->line_total * $tax_rate1/100), $this->invoice->client->currency()->precision); $item_tax += $item_tax_rate1_total; @@ -105,12 +105,12 @@ class InvoiceItemCalc if(isset($this->item->tax_rate2) && $this->item->tax_rate2 > 0) { - $tax_rate2 = $this->formatValue($this->item->tax_rate2, $this->invoice->client->currency->precision); + $tax_rate2 = $this->formatValue($this->item->tax_rate2, $this->invoice->client->currency()->precision); if($this->settings->inclusive_taxes) - $item_tax_rate2_total = $this->formatValue(($this->line_total - ($this->line_total / (1+$tax_rate2/100))) , $this->invoice->client->currency->precision); + $item_tax_rate2_total = $this->formatValue(($this->line_total - ($this->line_total / (1+$tax_rate2/100))) , $this->invoice->client->currency()->precision); else - $item_tax_rate2_total = $this->formatValue(($this->line_total * $tax_rate2/100), $this->invoice->client->currency->precision); + $item_tax_rate2_total = $this->formatValue(($this->line_total * $tax_rate2/100), $this->invoice->client->currency()->precision); $item_tax += $item_tax_rate2_total; diff --git a/app/Http/Controllers/OpenAPI/ClientSchema.php b/app/Http/Controllers/OpenAPI/ClientSchema.php index a12031b392df..da4f5fa051ad 100644 --- a/app/Http/Controllers/OpenAPI/ClientSchema.php +++ b/app/Http/Controllers/OpenAPI/ClientSchema.php @@ -21,7 +21,6 @@ * @OA\Property(property="client_hash", type="string", example="", description="________"), * @OA\Property(property="industry_id", type="string", example="", description="________"), * @OA\Property(property="size_id", type="string", example="", description="________"), - * @OA\Property(property="currency_id", type="string", example="", description="________"), * @OA\Property(property="address1", type="string", example="", description="________"), * @OA\Property(property="address2", type="string", example="", description="________"), * @OA\Property(property="city", type="string", example="", description="________"), diff --git a/app/Http/Controllers/OpenAPI/CompanySettingsSchema.php b/app/Http/Controllers/OpenAPI/CompanySettingsSchema.php index 169e852d74dd..c6ee86bee21c 100644 --- a/app/Http/Controllers/OpenAPI/CompanySettingsSchema.php +++ b/app/Http/Controllers/OpenAPI/CompanySettingsSchema.php @@ -5,7 +5,6 @@ * type="object", * @OA\Property(property="timezone_id", type="string", example="15", description="The timezone id"), * @OA\Property(property="date_format_id", type="string", example="15", description="____________"), - * @OA\Property(property="datetime_format_id", type="string", example="15", description="____________"), * @OA\Property(property="financial_year_start", type="string", example="2000-01-01", description="____________"), * @OA\Property(property="language_id", type="string", example="1", description="____________"), * @OA\Property(property="company_logo_url", type="string", example="https://example.com/logo.png", description="The URL to the company Logo"), diff --git a/app/Http/Requests/Client/UpdateClientRequest.php b/app/Http/Requests/Client/UpdateClientRequest.php index ba4482f7f144..c7df402a8de9 100644 --- a/app/Http/Requests/Client/UpdateClientRequest.php +++ b/app/Http/Requests/Client/UpdateClientRequest.php @@ -35,7 +35,7 @@ class UpdateClientRequest extends Request $rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000'; $rules['industry_id'] = 'integer|nullable'; $rules['size_id'] = 'integer|nullable'; - $rules['currency_id'] = 'integer|nullable'; + //$rules['currency_id'] = 'integer|nullable'; $rules['country_id'] = 'integer|nullable'; $rules['shipping_country_id'] = 'integer|nullable'; //$rules['id_number'] = 'unique:clients,id_number,,id,company_id,' . auth()->user()->company()->id; diff --git a/app/Listeners/Invoice/CreateInvoicePdf.php b/app/Listeners/Invoice/CreateInvoicePdf.php index 893a671f5513..14d44e754ef0 100644 --- a/app/Listeners/Invoice/CreateInvoicePdf.php +++ b/app/Listeners/Invoice/CreateInvoicePdf.php @@ -43,7 +43,7 @@ class CreateInvoicePdf implements ShouldQueue $invoice = $event->invoice; - $invoice->load('client', 'client.currency'); + $invoice->load('client'); $path = 'public/' . $invoice->client->client_hash . '/invoices/'; $file_path = $path . $invoice->invoice_number . '.pdf'; diff --git a/app/Models/Client.php b/app/Models/Client.php index 8940eb9f1e6c..7ef86434774a 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -63,7 +63,7 @@ class Client extends BaseModel 'private_notes', 'industry_id', 'size_id', - 'currency_id', +// 'currency_id', 'address1', 'address2', 'city', @@ -167,14 +167,10 @@ class Client extends BaseModel return DateFormat::find($this->getSetting('date_format_id'))->format; } - public function datetime_format() - { - return DatetimeFormat::find($this->getSetting('datetime_format_id'))->format; - } - public function currency() { - return $this->belongsTo(Currency::class); + return Currency::find($this->getSetting('currency_id')); + //return $this->belongsTo(Currency::class); } /** @@ -226,6 +222,8 @@ class Client extends BaseModel } /*Company Settings*/ + // \Log::error($setting); + // \Log::error(print_r($this->company->settings,1)); if((property_exists($this->company->settings, $setting) != false ) && (isset($this->company->settings->{$setting}) !== false) ){ return $this->company->settings->{$setting}; } @@ -296,8 +294,8 @@ class Client extends BaseModel public function getCurrencyCode() { - if ($this->currency) { - return $this->currency->code; + if ($this->currency()) { + return $this->currency()->code; } return 'USD'; diff --git a/app/PaymentDrivers/StripePaymentDriver.php b/app/PaymentDrivers/StripePaymentDriver.php index c65a1316bf2a..8ec9b5b48d58 100644 --- a/app/PaymentDrivers/StripePaymentDriver.php +++ b/app/PaymentDrivers/StripePaymentDriver.php @@ -215,8 +215,8 @@ class StripePaymentDriver extends BasePaymentDriver public function processPaymentView(array $data) { $payment_intent_data = [ - 'amount' => $this->convertToStripeAmount($data['amount_with_fee'], $this->client->currency->precision), - 'currency' => $this->client->getCurrencyCode(), + 'amount' => $this->convertToStripeAmount($data['amount_with_fee'], $this->client->currency()->precision), + '->currency()' => $this->client->getCurrencyCode(), 'customer' => $this->findOrCreateCustomer(), 'description' => $data['invoices']->pluck('id'), //todo more meaningful description here: ]; @@ -252,7 +252,7 @@ class StripePaymentDriver extends BasePaymentDriver +"client_secret": "pi_1FMR7JKmol8YQE9DuC4zMeN3_secret_J3yseWJG6uV0MmsrAT1FlUklV" +"confirmation_method": "automatic" +"created": 1569381877 - +"currency": "usd" + +"->currency()": "usd" +"description": "[3]" +"last_payment_error": null +"livemode": false @@ -391,7 +391,7 @@ class StripePaymentDriver extends BasePaymentDriver $client_contact = $this->getContact(); $client_contact_id = $client_contact ? $client_contact->id : null; - $payment->amount = $this->convertFromStripeAmount($data['amount'], $this->client->currency->precision); + $payment->amount = $this->convertFromStripeAmount($data['amount'], $this->client->currency()->precision); $payment->payment_type_id = $data['payment_type']; $payment->transaction_reference = $data['payment_method']; $payment->client_contact_id = $client_contact_id; diff --git a/app/Transformers/ClientTransformer.php b/app/Transformers/ClientTransformer.php index c1343f1a0521..f80e2d81b0cf 100644 --- a/app/Transformers/ClientTransformer.php +++ b/app/Transformers/ClientTransformer.php @@ -59,7 +59,7 @@ class ClientTransformer extends EntityTransformer 'website' => $client->website ?: '', 'private_notes' => $client->private_notes ?: '', 'balance' => (float) $client->balance, - 'currency_id' => (string)$client->currency_id ?: '', +// 'currency_id' => (string)$client->currency_id ?: '', 'group_settings_id' => (string)$client->group_settings_id ?: '', 'paid_to_date' => (float) $client->paid_to_date, 'last_login' => (int)$client->last_login, diff --git a/app/Utils/Number.php b/app/Utils/Number.php index 4f9ba7f68cdb..06ac5e41bada 100644 --- a/app/Utils/Number.php +++ b/app/Utils/Number.php @@ -63,10 +63,10 @@ class Number public static function formatMoney($value, $client) :string { - $thousand = $client->currency->thousand_separator; - $decimal = $client->currency->decimal_separator; - $precision = $client->currency->precision; - $code = $client->currency->code; + $thousand = $client->currency()->thousand_separator; + $decimal = $client->currency()->decimal_separator; + $precision = $client->currency()->precision; + $code = $client->currency()->code; $swapSymbol = $client->country->swap_currency_symbol; /* Country settings override client settings */ @@ -77,7 +77,7 @@ class Number $decimal = $client->country->decimal_separator; $value = number_format($value, $precision, $decimal, $thousand); - $symbol = $client->currency->symbol; + $symbol = $client->currency()->symbol; if ($client->getSetting('show_currency_code') === true) { return "{$value} {$code}"; @@ -86,7 +86,7 @@ class Number } elseif ($client->getSetting('show_currency_code') === false) { return "{$symbol}{$value}"; } else { - return self::formatValue($value, $client->currency); + return self::formatValue($value, $client->currency()); } } } diff --git a/app/Utils/Traits/MakesInvoiceValues.php b/app/Utils/Traits/MakesInvoiceValues.php index 0ee6e9a65b96..f068f4c6f65e 100644 --- a/app/Utils/Traits/MakesInvoiceValues.php +++ b/app/Utils/Traits/MakesInvoiceValues.php @@ -154,7 +154,7 @@ trait MakesInvoiceValues */ public function makeValues() :array { - if(!$this->client->currency || !$this->client){ + if(!$this->client->currency() || !$this->client){ throw new Exception(debug_backtrace()[1]['function'], 1); exit; } diff --git a/database/factories/ClientFactory.php b/database/factories/ClientFactory.php index 4abdcfd9bb10..9870850059ef 100644 --- a/database/factories/ClientFactory.php +++ b/database/factories/ClientFactory.php @@ -22,7 +22,6 @@ $factory->define(App\Models\Client::class, function (Faker $faker) { 'city' => $faker->city, 'state' => $faker->state, 'postal_code' => $faker->postcode, - 'currency_id' => 1, 'country_id' => 4, 'shipping_address1' => $faker->buildingNumber, 'shipping_address2' => $faker->streetAddress, @@ -30,7 +29,7 @@ $factory->define(App\Models\Client::class, function (Faker $faker) { 'shipping_state' => $faker->state, 'shipping_postal_code' => $faker->postcode, 'shipping_country_id' => 4, - 'settings' => new ClientSettings(ClientSettings::defaults()), + 'settings' => ClientSettings::defaults(), 'client_hash' => \Illuminate\Support\Str::random(40), ]; }); diff --git a/database/migrations/2014_10_13_000000_create_users_table.php b/database/migrations/2014_10_13_000000_create_users_table.php index 72829d471985..c9ec9ca87ed6 100644 --- a/database/migrations/2014_10_13_000000_create_users_table.php +++ b/database/migrations/2014_10_13_000000_create_users_table.php @@ -272,7 +272,7 @@ class CreateUsersTable extends Migration $table->timestamp('last_login')->nullable(); $table->unsignedInteger('industry_id')->nullable(); $table->unsignedInteger('size_id')->nullable(); - $table->unsignedInteger('currency_id')->nullable(); +// $table->unsignedInteger('currency_id')->nullable(); $table->string('address1')->nullable(); $table->string('address2')->nullable(); @@ -304,7 +304,7 @@ class CreateUsersTable extends Migration $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); $table->foreign('industry_id')->references('id')->on('industries'); $table->foreign('size_id')->references('id')->on('sizes'); - $table->foreign('currency_id')->references('id')->on('currencies'); +// $table->foreign('currency_id')->references('id')->on('currencies'); }); diff --git a/public/mix-manifest.json b/public/mix-manifest.json index a577a76b0082..98325197b478 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -9,9 +9,9 @@ "/vendors/js/perfect-scrollbar.min.js": "/vendors/js/perfect-scrollbar.min.js?id=4a10bcfa0a9c9fa9d503", "/vendors/js/jSignature.min.js": "/vendors/js/jSignature.min.js?id=4dc38fc88461b30ab711", "/vendors/js/flashcanvas.min.js": "/vendors/js/flashcanvas.min.js?id=50f6e0a09e8a939c1da9", - "/vendors/js/flashcanvas.swf": "/vendors/js/flashcanvas.swf?id=ed2a06bb83b57f2639b1", - "/vendors/css/select2.min.css": "/vendors/css/select2.min.css?id=8e44c39add2364bdb469", - "/vendors/js/select2.min.js": "/vendors/js/select2.min.js?id=0a96cf2d3a193019a91b", + "/vendors/js/flashcanvas.swf": "/vendors/js/flashcanvas.swf?id=d1a52ac12da100808048", + "/vendors/css/select2.min.css": "/vendors/css/select2.min.css?id=9f54e6414f87e0d14b9e", + "/vendors/js/select2.min.js": "/vendors/js/select2.min.js?id=708724c21c5073e9e228", "/vendors/css/select2-bootstrap4.css": "/vendors/css/select2-bootstrap4.css?id=85167d868d2bf2dc5603", "/vendors/css/dropzone.min.css": "/vendors/css/dropzone.min.css?id=2f735dbf472afcd77604", "/vendors/css/dropzone-basic.min.css": "/vendors/css/dropzone-basic.min.css?id=960bcd6d5cb8351ac0d0", diff --git a/tests/Feature/InvoiceTest.php b/tests/Feature/InvoiceTest.php index e63a73cdb0d9..0916720863f1 100644 --- a/tests/Feature/InvoiceTest.php +++ b/tests/Feature/InvoiceTest.php @@ -14,6 +14,7 @@ use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; use Tests\TestCase; /** @@ -26,6 +27,7 @@ class InvoiceTest extends TestCase use MakesHash; use DatabaseTransactions; + use MockAccountData; public function setUp() :void { @@ -38,6 +40,7 @@ class InvoiceTest extends TestCase Model::reguard(); + $this->makeTestData(); } @@ -107,96 +110,40 @@ class InvoiceTest extends TestCase public function testInvoiceRESTEndPoints() { - $data = [ - 'first_name' => $this->faker->firstName, - 'last_name' => $this->faker->lastName, - 'name' => $this->faker->company, - 'email' => $this->faker->unique()->safeEmail, - 'password' => 'ALongAndBrilliantPassword123', - '_token' => csrf_token(), - 'privacy_policy' => 1, - 'terms_of_service' => 1 - ]; - - - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - ])->post('/api/v1/signup', $data); - - $acc = $response->json(); - - $account = Account::find($this->decodePrimaryKey($acc['data'][0]['account']['id'])); - - $company_token = $account->default_company->tokens()->first(); - $token = $company_token->token; - $company = $company_token->company; - - $user = $company_token->user; - - $this->assertNotNull($company_token); - $this->assertNotNull($token); - $this->assertNotNull($user); - $this->assertNotNull($company); - //$this->assertNotNull($user->token->company); - - factory(\App\Models\Client::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id, 'currency_id' => 1])->each(function ($c) use ($user, $company){ - - factory(\App\Models\ClientContact::class,1)->create([ - 'user_id' => $user->id, - 'client_id' => $c->id, - 'company_id' => $company->id, - 'is_primary' => 1 - ]); - - factory(\App\Models\ClientContact::class,1)->create([ - 'user_id' => $user->id, - 'client_id' => $c->id, - 'company_id' => $company->id - ]); - - }); - $client = Client::all()->first(); - - factory(\App\Models\Invoice::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]); - - $invoice = Invoice::where('user_id',$user->id)->first(); - $invoice->settings = $client->getMergedSettings(); - $invoice->save(); - $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $token, - ])->get('/api/v1/invoices/'.$this->encodePrimaryKey($invoice->id)); + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/invoices/'.$this->encodePrimaryKey($this->invoice->id)); $response->assertStatus(200); $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $token, - ])->get('/api/v1/invoices/'.$this->encodePrimaryKey($invoice->id).'/edit'); + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/invoices/'.$this->encodePrimaryKey($this->invoice->id).'/edit'); $response->assertStatus(200); $invoice_update = [ - 'status_id' => Invoice::STATUS_PAID + 'tax_name1' => 'dippy', ]; - $this->assertNotNull($invoice); - $this->assertNotNull($invoice->settings); + $this->assertNotNull($this->invoice); + $this->assertNotNull($this->invoice->settings); - $this->assertTrue(property_exists($invoice->settings, 'custom_invoice_taxes1')); + $this->assertTrue(property_exists($this->invoice->settings, 'custom_invoice_taxes1')); $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $token, - ])->put('/api/v1/invoices/'.$this->encodePrimaryKey($invoice->id), $invoice_update) + 'X-API-TOKEN' => $this->token, + ])->put('/api/v1/invoices/'.$this->encodePrimaryKey($this->invoice->id), $invoice_update) ->assertStatus(200); $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $token, - ])->delete('/api/v1/invoices/'.$this->encodePrimaryKey($invoice->id)); + 'X-API-TOKEN' => $this->token, + ])->delete('/api/v1/invoices/'.$this->encodePrimaryKey($this->invoice->id)); $response->assertStatus(200);