diff --git a/app/DataMapper/BaseSettings.php b/app/DataMapper/BaseSettings.php index c5fd89dc0f92..0be23161cc05 100644 --- a/app/DataMapper/BaseSettings.php +++ b/app/DataMapper/BaseSettings.php @@ -20,8 +20,41 @@ class BaseSettings public function __construct($obj) { foreach($obj as $key => $value) - $this->{$key} = $value; + $obj->{$key} = $value; } + public static function setCasts($obj, $casts) + { + foreach ($casts as $key => $value) + $obj->{$key} = self::castAttribute($key, $obj->{$key}); + + return $obj; + } + + protected static function castAttribute($key, $value) + { + switch ($key) + { + case 'int': + case 'integer': + return (int) $value; + case 'real': + case 'float': + case 'double': + return (float) $value; + case 'string': + return is_null($value) ? '' : (string) $value; + case 'bool': + case 'boolean': + return (bool)($value); + case 'object': + return json_decode($value); + case 'array': + case 'json': + return json_decode($value, true); + default: + return $value; + } + } } \ No newline at end of file diff --git a/app/DataMapper/ClientSettings.php b/app/DataMapper/ClientSettings.php index 242579833338..bc2648bc7f45 100644 --- a/app/DataMapper/ClientSettings.php +++ b/app/DataMapper/ClientSettings.php @@ -29,58 +29,6 @@ use App\Utils\TranslationHelper; */ class ClientSettings extends BaseSettings { - /** - * Settings which also have a parent company setting - */ - public $timezone_id; - public $date_format; - public $datetime_format; - public $military_time; - public $start_of_week; - public $financial_year_start; - public $payment_terms; - - public $language_id; - public $precision; - public $default_task_rate; - public $send_reminders; - public $show_tasks_in_portal; - public $custom_message_dashboard; - public $custom_message_unpaid_invoice; - public $custom_message_paid_invoice; - public $custom_message_unapproved_quote; - public $show_currency_symbol; - public $show_currency_code; - public $inclusive_taxes; - - public $custom_invoice_taxes1; - public $custom_invoice_taxes2; - public $lock_sent_invoices; - public $auto_bill; - public $auto_archive_invoice; - - /** - * Counter Variables - * - * Currently we have only engineered counters to be implemented at the client level - * prefix/patterns and padding are not there yet. - */ - public $invoice_number_prefix; - public $invoice_number_pattern; - public $invoice_number_counter; - - public $quote_number_prefix; - public $quote_number_pattern; - public $quote_number_counter; - - public $credit_number_prefix; - public $credit_number_pattern; - public $credit_number_counter; - - public $shared_invoice_quote_counter; - public $recurring_invoice_number_prefix; - - public $counter_padding; /** * Settings which which are unique to client settings @@ -88,27 +36,71 @@ class ClientSettings extends BaseSettings public $industry_id; public $size_id; - public $design; - - public $company_gateways; - - - public $invoice_design_id; - public $quote_design_id; - public $email_footer; - public $email_subject_invoice; - public $email_subject_quote; - public $email_subject_payment; - public $email_template_invoice; - public $email_template_quote; - public $email_template_payment; - public $email_subject_reminder1; - public $email_subject_reminder2; - public $email_subject_reminder3; - public $email_template_reminder1; - public $email_template_reminder2; - public $email_template_reminder3; + public static $casts = [ + 'industry_id' => 'string', + 'size_id' => 'string', + ]; + /* + + public static $casts = [ + 'timezone_id' => 'string', + 'date_format' => 'string', + 'datetime_format' => 'string', + 'military_time' => 'bool', + 'start_of_week' => 'int', + 'financial_year_start' => 'int', + 'payment_terms' => 'int', + 'language_id' => 'string', + 'precision' => 'int', + 'default_task_rate' => 'float', + 'send_reminders' => 'bool', + 'show_tasks_in_portal' => 'bool', + 'custom_message_dashboard' => 'string', + 'custom_message_unpaid_invoice' => 'string', + 'custom_message_paid_invoice' => 'string', + 'custom_message_unapproved_quote' => 'string', + 'show_currency_symbol' => 'bool', + 'show_currency_code' => 'bool', + 'inclusive_taxes' => 'bool', + 'custom_invoice_taxes1' => 'bool', + 'custom_invoice_taxes2' => 'bool', + 'lock_sent_invoices' => 'bool', + 'auto_bill' => 'bool', + 'auto_archive_invoice' => 'bool', + 'invoice_number_prefix' => 'string', + 'invoice_number_pattern' => 'string', + 'invoice_number_counter' => 'int', + 'quote_number_prefix' => 'string', + 'quote_number_pattern' => 'string', + 'quote_number_counter' => 'int', + 'credit_number_prefix' => 'string', + 'credit_number_pattern' => 'string', + 'credit_number_counter' => 'int', + 'shared_invoice_quote_counter' => 'int', + 'recurring_invoice_number_prefix' => 'string', + 'counter_padding' => 'int', + 'industry_id' => 'string', + 'size_id' => 'string', + 'design' => 'string', + 'company_gateways' => 'string', + 'invoice_design_id' => 'string', + 'quote_design_id' => 'string', + 'email_footer' => 'string', + 'email_subject_invoice' => 'string', + 'email_subject_quote' => 'string', + 'email_subject_payment' => 'string', + 'email_template_invoice' => 'string', + 'email_template_quote' => 'string', + 'email_template_payment' => 'string', + 'email_subject_reminder1' => 'string', + 'email_subject_reminder2' => 'string', + 'email_subject_reminder3' => 'string', + 'email_template_reminder1' => 'string', + 'email_template_reminder2' => 'string', + 'email_template_reminder3' => 'string', + ]; +*/ /** * Cast object values and return entire class * prevents missing properties from not being returned @@ -131,12 +123,14 @@ class ClientSettings extends BaseSettings public static function defaults() : \stdClass { - return (object)[ - 'entity' => Client::class, - 'industry_id' => NULL, - 'size_id' => NULL, + $data = (object)[ + 'entity' => (string)Client::class, + 'industry_id' => '', + 'size_id' => '', ]; + return self::setCasts($data, self::$casts); + } @@ -151,10 +145,14 @@ class ClientSettings extends BaseSettings { - foreach($client_settings as $key => $value) + foreach($company_settings as $key => $value) { - - if(!isset($client_settings->{$key}) && property_exists($company_settings, $key)) { + /* pseudo code + if the property exists and is a string BUT has no length, treat it as TRUE + */ + if( ( (property_exists($client_settings, $key) && is_string($client_settings->{$key}) && (iconv_strlen($client_settings->{$key}) <1))) + || !isset($client_settings->{$key}) + && property_exists($company_settings, $key)) { $client_settings->{$key} = $company_settings->{$key}; } diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index bab321c50406..431a736af51c 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -11,6 +11,7 @@ namespace App\DataMapper; +use App\DataMapper\CompanySettings; use App\Models\Company; /** @@ -19,140 +20,217 @@ use App\Models\Company; class CompanySettings extends BaseSettings { - public $timezone_id; - public $date_format; - public $datetime_format; - public $military_time; - public $start_of_week; - public $financial_year_start; + public $timezone_id = ''; + public $date_format = ''; + public $datetime_format = ''; + public $military_time = false; + public $start_of_week = ''; + public $financial_year_start = ''; - public $language_id; + public $language_id = ''; - public $precision; - public $show_currency_symbol; - public $show_currency_code; + public $precision = 2; + public $show_currency_symbol = true; + public $show_currency_code = false; - public $payment_terms; //days + public $payment_terms; - public $custom_label1; - public $custom_value1; - public $custom_label2; - public $custom_value2; - public $custom_label3; - public $custom_value3; - public $custom_label4; - public $custom_value5; - public $custom_client_label1; - public $custom_client_label2; - public $custom_client_label3; - public $custom_client_label4; - public $custom_client_contact_label1; - public $custom_client_contact_label2; - public $custom_client_contact_label3; - public $custom_client_contact_label4; - public $custom_invoice_label1; - public $custom_invoice_label2; - public $custom_invoice_label3; - public $custom_invoice_label4; - public $custom_product_label1; - public $custom_product_label2; - public $custom_product_label3; - public $custom_product_label4; - public $custom_task_label1; - public $custom_task_label2; - public $custom_task_label3; - public $custom_task_label4; - public $custom_expense_label1; - public $custom_expense_label2; - public $custom_expense_label3; - public $custom_expense_label4; + public $custom_label1 = ''; + public $custom_value1 = ''; + public $custom_label2 = ''; + public $custom_value2 = ''; + public $custom_label3 = ''; + public $custom_value3 = ''; + public $custom_label4 = ''; + public $custom_value5 = ''; + public $custom_client_label1 = ''; + public $custom_client_label2 = ''; + public $custom_client_label3 = ''; + public $custom_client_label4 = ''; + public $custom_client_contact_label1 = ''; + public $custom_client_contact_label2 = ''; + public $custom_client_contact_label3 = ''; + public $custom_client_contact_label4 = ''; + public $custom_invoice_label1 = ''; + public $custom_invoice_label2 = ''; + public $custom_invoice_label3 = ''; + public $custom_invoice_label4 = ''; + public $custom_product_label1 = ''; + public $custom_product_label2 = ''; + public $custom_product_label3 = ''; + public $custom_product_label4 = ''; + public $custom_task_label1 = ''; + public $custom_task_label2 = ''; + public $custom_task_label3 = ''; + public $custom_task_label4 = ''; + public $custom_expense_label1 = ''; + public $custom_expense_label2 = ''; + public $custom_expense_label3 = ''; + public $custom_expense_label4 = ''; - public $custom_invoice_taxes1; - public $custom_invoice_taxes2; + public $custom_invoice_taxes1 = false; + public $custom_invoice_taxes2 = false; - public $default_task_rate; - public $send_reminders; - public $show_tasks_in_portal; + public $default_task_rate = 0; + public $send_reminders = false; + public $show_tasks_in_portal = false; - public $custom_message_dashboard; - public $custom_message_unpaid_invoice; - public $custom_message_paid_invoice; - public $custom_message_unapproved_quote; - public $lock_sent_invoices; - public $auto_archive_invoice; + public $custom_message_dashboard = ''; + public $custom_message_unpaid_invoice = ''; + public $custom_message_paid_invoice = ''; + public $custom_message_unapproved_quote = ''; + public $lock_sent_invoices = false; + public $auto_archive_invoice = false; - public $inclusive_taxes; + public $inclusive_taxes = false; public $translations; /** * Counter Variables */ - public $invoice_number_prefix; - public $invoice_number_pattern; - public $invoice_number_counter; + public $invoice_number_prefix = ''; + public $invoice_number_pattern = ''; + public $invoice_number_counter = 1; - public $quote_number_prefix; - public $quote_number_pattern; - public $quote_number_counter; + public $quote_number_prefix = ''; + public $quote_number_pattern = ''; + public $quote_number_counter = 1; - public $client_number_prefix; - public $client_number_pattern; - public $client_number_counter; + public $client_number_prefix = ''; + public $client_number_pattern = ''; + public $client_number_counter = 1; - public $credit_number_prefix; - public $credit_number_pattern; - public $credit_number_counter; + public $credit_number_prefix = ''; + public $credit_number_pattern = ''; + public $credit_number_counter = 1; - public $shared_invoice_quote_counter; + public $shared_invoice_quote_counter = false; - public $recurring_invoice_number_prefix; - public $reset_counter_frequency_id; - public $reset_counter_date; - public $counter_padding; + public $recurring_invoice_number_prefix = 'R'; + public $reset_counter_frequency_id = ''; + public $reset_counter_date = ''; + public $counter_padding = 0; - public $design; + public $design = 'views/pdf/design1.blade.php'; - public $company_gateways; + public $company_gateways = ''; - public $invoice_terms; - public $quote_terms; - public $invoice_taxes; - public $invoice_item_taxes; - public $invoice_design_id; - public $quote_design_id; - public $invoice_footer; - public $invoice_labels; - public $show_item_taxes; - public $fill_products; - public $tax_name1; - public $tax_rate1; - public $tax_name2; - public $tax_rate2; - public $enable_second_tax_rate; - public $enable_modules; - public $payment_type_id; - public $convert_products; - public $custom_fields; - public $invoice_fields; - public $email_footer; - public $email_subject_invoice; - public $email_subject_quote; - public $email_subject_payment; - public $email_template_invoice; - public $email_template_quote; - public $email_template_payment; - public $email_subject_reminder1; - public $email_subject_reminder2; - public $email_subject_reminder3; - public $email_template_reminder1; - public $email_template_reminder2; - public $email_template_reminder3; - public $has_custom_design1; - public $has_custom_design2; - public $has_custom_design3; - public $enable_portal_password; + public $invoice_terms = ''; + public $quote_terms = ''; + public $invoice_taxes = false; + public $invoice_item_taxes = false; + public $invoice_design_id = ''; + public $quote_design_id = ''; + public $invoice_footer = ''; + public $invoice_labels = ''; + public $show_item_taxes = false; + public $fill_products = false; + public $tax_name1 = ''; + public $tax_rate1 = ''; + public $tax_name2 = ''; + public $tax_rate2 = ''; + public $enable_second_tax_rate = false; + public $enable_modules = false; + public $payment_type_id = ''; + public $convert_products = false; + public $custom_fields = ''; + public $invoice_fields = ''; + public $email_footer = ''; + public $email_subject_invoice = ''; + public $email_subject_quote = ''; + public $email_subject_payment = ''; + public $email_template_invoice = ''; + public $email_template_quote = ''; + public $email_template_payment = ''; + public $email_subject_reminder1 = ''; + public $email_subject_reminder2 = ''; + public $email_subject_reminder3 = ''; + public $email_template_reminder1 = ''; + public $email_template_reminder2 = ''; + public $email_template_reminder3 = ''; + public $has_custom_design1 = ''; + public $has_custom_design2 = ''; + public $has_custom_design3 = ''; + public $enable_portal_password = false; + + public static $casts = [ + 'timezone_id' => 'string', + 'date_format' => 'string', + 'datetime_format' => 'string', + 'military_time' => 'bool', + 'start_of_week' => 'string', + 'financial_year_start' => 'string', + 'language_id' => 'string', + 'precision' => 'int', + 'show_currency_symbol' => 'bool', + 'show_currency_code' => 'bool', + 'payment_terms' => 'int', + 'custom_label1' => 'string', + 'custom_value1' => 'string', + 'custom_label2' => 'string', + 'custom_value2' => 'string', + 'custom_label3' => 'string', + 'custom_value3' => 'string', + 'custom_label4' => 'string', + 'custom_value5' => 'string', + 'custom_client_label1' => 'string', + 'custom_client_label2' => 'string', + 'custom_client_label3' => 'string', + 'custom_client_label4' => 'string', + 'custom_client_contact_label1' => 'string', + 'custom_client_contact_label2' => 'string', + 'custom_client_contact_label3' => 'string', + 'custom_client_contact_label4' => 'string', + 'custom_invoice_label1' => 'string', + 'custom_invoice_label2' => 'string', + 'custom_invoice_label3' => 'string', + 'custom_invoice_label4' => 'string', + 'custom_product_label1' => 'string', + 'custom_product_label2' => 'string', + 'custom_product_label3' => 'string', + 'custom_product_label4' => 'string', + 'custom_task_label1' => 'string', + 'custom_task_label2' => 'string', + 'custom_task_label3' => 'string', + 'custom_task_label4' => 'string', + 'custom_expense_label1' => 'string', + 'custom_expense_label2' => 'string', + 'custom_expense_label3' => 'string', + 'custom_expense_label4' => 'string', + 'custom_invoice_taxes1' => 'bool', + 'custom_invoice_taxes2' => 'bool', + 'default_task_rate' => 'float', + 'send_reminders' => 'bool', + 'show_tasks_in_portal' => 'bool', + 'custom_message_dashboard' => 'string', + 'custom_message_unpaid_invoice' => 'string', + 'custom_message_paid_invoice' => 'string', + 'custom_message_unapproved_quote' => 'string', + 'lock_sent_invoices' => 'bool', + 'auto_archive_invoice' => 'bool', + 'inclusive_taxes' => 'bool', + 'invoice_number_prefix' => 'string', + 'invoice_number_pattern' => 'string', + 'invoice_number_counter' => 'int', + 'quote_number_prefix' => 'string', + 'quote_number_pattern' => 'string', + 'quote_number_counter' => 'int', + 'client_number_prefix' => 'string', + 'client_number_pattern' => 'string', + 'client_number_counter' => 'int', + 'credit_number_prefix' => 'string', + 'credit_number_pattern' => 'string', + 'credit_number_counter' => 'int', + 'shared_invoice_quote_counter' => 'bool', + 'recurring_invoice_number_prefix' => 'string', + 'reset_counter_frequency_id' => 'int', + 'reset_counter_date' => 'string', + 'counter_padding' => 'int', + 'design' => 'string', + 'company_gateways' => 'string', + ]; /** * Cast object values and return entire class @@ -163,7 +241,7 @@ class CompanySettings extends BaseSettings */ public function __construct($obj) { - parent::__construct($obj); + // parent::__construct($obj); } /** @@ -173,43 +251,21 @@ class CompanySettings extends BaseSettings public static function defaults() : \stdClass { $config = json_decode(config('ninja.settings')); + + $data = (object)get_class_vars(CompanySettings::class); + unset($data->casts); - return (object) [ - 'entity' => Company::class, - 'timezone_id' => config('ninja.i18n.timezone_id'), - 'language_id' => config('ninja.i18n.language_id'), - 'precision' => 2, - 'payment_terms' => config('ninja.i18n.payment_terms'), - 'datetime_format' => config('ninja.i18n.datetime_format'), - 'military_time' => config('ninja.i18n.military_time'), - 'date_format' => config('ninja.i18n.date_format'), - 'start_of_week' => config('ninja.i18n.start_of_week'), - 'financial_year_start' => config('ninja.i18n.financial_year_start'), - 'default_task_rate' => 0, - 'send_reminders' => 'TRUE', - 'show_tasks_in_portal' => 'TRUE', - 'show_currency_symbol' => 'TRUE', - 'show_currency_code' => 'FALSE', - 'inclusive_taxes' => 'TRUE', - 'custom_invoice_taxes1' => 'FALSE', - 'custom_invoice_taxes2' => 'FALSE', - 'lock_sent_invoices' => 'TRUE', - 'shared_invoice_quote_counter' => 'FALSE', - 'invoice_number_counter' => 1, - 'quote_number_counter' => 1, - 'credit_number_counter' => 1, - 'client_number_counter' => 1, - 'counter_padding' => 0, - 'recurring_invoice_number_prefix' => 'R', - 'invoice_number_prefix' => '', - 'quote_number_prefix' => '', - 'credit_number_prefix' => '', - 'client_number_prefix' => '', - 'auto_archive_invoice' => 'FALSE', - 'design' => 'views/pdf/design1.blade.php', - - 'translations' => (object) [], - ]; + $data->timezone_id = (string)config('ninja.i18n.timezone_id'); + $data->language_id = (string)config('ninja.i18n.language_id'); + $data->payment_terms = (string)config('ninja.i18n.payment_terms'); + $data->datetime_format = (string)config('ninja.i18n.datetime_format'); + $data->military_time = (bool )config('ninja.i18n.military_time'); + $data->date_format = (string)config('ninja.i18n.date_format'); + $data->start_of_week = (int) config('ninja.i18n.start_of_week'); + $data->financial_year_start = (int)config('ninja.i18n.financial_year_start'); + $data->translations = (object) []; + + return self::setCasts($data, self::$casts); } } diff --git a/app/Factory/ClientFactory.php b/app/Factory/ClientFactory.php index 428ac427e836..22baaec66e16 100644 --- a/app/Factory/ClientFactory.php +++ b/app/Factory/ClientFactory.php @@ -30,7 +30,7 @@ class ClientFactory $client->is_deleted = 0; $client->client_hash = str_random(40); $client->currency_id = config('ninja.i18n.currency_id'); - $client->settings = new ClientSettings(ClientSettings::defaults()); + $client->settings = ClientSettings::defaults(); $client_contact = ClientContactFactory::create($company_id, $user_id); $client->contacts->add($client_contact); diff --git a/app/Factory/CompanyFactory.php b/app/Factory/CompanyFactory.php index 6790058e8141..3658f9ff1725 100644 --- a/app/Factory/CompanyFactory.php +++ b/app/Factory/CompanyFactory.php @@ -26,7 +26,7 @@ class CompanyFactory $company->name = ''; $company->account_id = $account_id; $company->company_key = $this->createHash(); - $company->settings = new CompanySettings(CompanySettings::defaults()); + $company->settings = CompanySettings::defaults(); $company->db = config('database.default'); $company->domain = ''; diff --git a/app/Factory/InvoiceFactory.php b/app/Factory/InvoiceFactory.php index 2a4c669ace54..5c5f0efd5786 100644 --- a/app/Factory/InvoiceFactory.php +++ b/app/Factory/InvoiceFactory.php @@ -35,7 +35,7 @@ class InvoiceFactory $invoice->partial_due_date = null; $invoice->is_deleted = false; $invoice->line_items = json_encode([]); - $invoice->settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); //todo need to embed the settings here + $invoice->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); //todo need to embed the settings here $invoice->backup = json_encode([]); $invoice->tax_name1 = ''; $invoice->tax_rate1 = 0; diff --git a/app/Factory/QuoteFactory.php b/app/Factory/QuoteFactory.php index d08852716264..0c52cf7205ef 100644 --- a/app/Factory/QuoteFactory.php +++ b/app/Factory/QuoteFactory.php @@ -35,7 +35,7 @@ class QuoteFactory $quote->partial_due_date = null; $quote->is_deleted = false; $quote->line_items = json_encode([]); - $quote->settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); //todo need to embed the settings here + $quote->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); //todo need to embed the settings here $quote->backup = json_encode([]); $quote->tax_name1 = ''; $quote->tax_rate1 = 0; diff --git a/app/Factory/RecurringInvoiceFactory.php b/app/Factory/RecurringInvoiceFactory.php index f66205f7c614..1324a26a7a05 100644 --- a/app/Factory/RecurringInvoiceFactory.php +++ b/app/Factory/RecurringInvoiceFactory.php @@ -34,7 +34,7 @@ class RecurringInvoiceFactory $invoice->partial_due_date = null; $invoice->is_deleted = false; $invoice->line_items = json_encode([]); - $invoice->settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); //todo need to embed the settings here + $invoice->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); //todo need to embed the settings here $invoice->backup = json_encode([]); $invoice->tax_name1 = ''; $invoice->tax_rate1 = 0; diff --git a/app/Factory/RecurringQuoteFactory.php b/app/Factory/RecurringQuoteFactory.php index 977d5bec2afa..70bd1de8c956 100644 --- a/app/Factory/RecurringQuoteFactory.php +++ b/app/Factory/RecurringQuoteFactory.php @@ -33,7 +33,7 @@ class RecurringQuoteFactory $quote->partial_due_date = null; $quote->is_deleted = false; $quote->line_items = json_encode([]); - $quote->settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); //todo need to embed the settings here + $quote->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); //todo need to embed the settings here $quote->backup = json_encode([]); $quote->tax_name1 = ''; $quote->tax_rate1 = 0; diff --git a/app/Helpers/Invoice/InvoiceCalc.php b/app/Helpers/Invoice/InvoiceCalc.php index a5d5df29c15f..8e8032ba14a4 100644 --- a/app/Helpers/Invoice/InvoiceCalc.php +++ b/app/Helpers/Invoice/InvoiceCalc.php @@ -70,7 +70,7 @@ class InvoiceCalc */ public function build() { - //Log::error(print_r($this->invoice,1)); + //\Log::error(var_dump($this->settings)); $this->calcLineItems() ->calcDiscount() diff --git a/app/Jobs/Company/CreateCompany.php b/app/Jobs/Company/CreateCompany.php index 67fc41512bab..1e5b24e5ed44 100644 --- a/app/Jobs/Company/CreateCompany.php +++ b/app/Jobs/Company/CreateCompany.php @@ -55,7 +55,7 @@ class CreateCompany $company->account_id = $this->account->id; $company->company_key = $this->createHash(); $company->ip = request()->ip(); - $company->settings = new CompanySettings(CompanySettings::defaults()); + $company->settings = CompanySettings::defaults(); $company->db = config('database.default'); $company->save(); diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 9e2516b7353f..57302ab69be8 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -106,7 +106,7 @@ class BaseModel extends Model return $this->getSettings()->{$key}; } else { - //Log::error(print_r(new CompanySettings($this->company->settings),1)); + Log::error(print_r(new CompanySettings($this->company->settings),1)); return (new CompanySettings($this->company->settings))->{$key}; } diff --git a/app/Models/Client.php b/app/Models/Client.php index 8cc4d0cb540f..e6770268aad7 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -179,13 +179,13 @@ class Client extends BaseModel if($this->group_settings !== null) { - $group_settings = ClientSettings::buildClientSettings(new ClientSettings($this->group_settings->settings), new ClientSettings($this->settings)); + $group_settings = ClientSettings::buildClientSettings($this->group_settings->settings, $this->settings); - return ClientSettings::buildClientSettings(new CompanySettings($this->company->settings), $group_settings); + return ClientSettings::buildClientSettings($this->company->settings, $group_settings); } - return ClientSettings::buildClientSettings(new CompanySettings($this->company->settings), new ClientSettings($this->settings)); + return ClientSettings::buildClientSettings($this->company->settings, $this->settings); } /** @@ -199,19 +199,30 @@ class Client extends BaseModel */ public function getSetting($setting) { - //check client level first - if($this->settings && isset($this->settings->{$setting}) && property_exists($this->settings, $setting)) - return $this->settings->{$setting}; + if($this->settings && (property_exists($this->settings, $setting) !== false) && (isset($this->settings->{$setting}) !== false) ){ + + /*need to catch empt string here*/ + if(is_string($this->settings->{$setting}) && (iconv_strlen($this->settings->{$setting}) >=1)){ + return $this->settings->{$setting}; + } + } //check group level (if a group is assigned) - if($this->group_settings && isset($this->group_settings->settings->{$setting}) && property_exists($this->group_settings->settings, $setting)) - return $this->group_settings->settings->{$setting}; - + if($this->group_settings && (property_exists($this->group_settings->settings, $setting) !== false) && (isset($this->group_settings->settings->{$setting}) !== false)){ + \Log::error('returning group '.$this->group_settings->{$setting}); + + return $this->group_settings->settings->{$setting}; + } //check company level - if(isset($this->company->settings->{$setting}) && property_exists($this->company->settings, $setting)) + if((property_exists($this->company->settings, $setting) != false ) && (isset($this->company->settings->{$setting}) !== false) ){ + \Log::error('returning company '.$this->company->{$setting}); + return $this->company->settings->{$setting}; + } + + throw new \Exception("Settings corrupted", 1); diff --git a/app/Utils/Traits/GeneratesCounter.php b/app/Utils/Traits/GeneratesCounter.php index 55c0c088c29c..02414e2280c5 100644 --- a/app/Utils/Traits/GeneratesCounter.php +++ b/app/Utils/Traits/GeneratesCounter.php @@ -16,6 +16,7 @@ use App\Models\Credit; use App\Models\Invoice; use App\Models\Quote; use App\Models\RecurringInvoice; +use App\Models\Timezone; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Log; @@ -151,9 +152,9 @@ trait GeneratesCounter //Reset counters if enabled $this->resetCounters($client); - $counter = $client->company->getSettingsByKey( 'client_number_counter' ); + $counter = $client->getSetting('client_number_counter' ); - $client_number = $this->checkEntityNumber(Client::class, $client, $counter, $client->company->settings->counter_padding, $client->company->settings->client_number_prefix, $client->company->settings->client_number_pattern); + $client_number = $this->checkEntityNumber(Client::class, $client, $counter, $client->getSetting('counter_padding'), $client->getSetting('client_number_prefix'), $client->getSetting('client_number_pattern')); $this->incrementCounter($client->company, 'client_number_counter'); @@ -266,11 +267,11 @@ trait GeneratesCounter private function resetCounters(Client $client) { - $timezone = $client->company->timezone()->name; + $timezone = Timezone::find($client->getSetting('timezone_id')); - $reset_date = Carbon::parse($client->company->settings->reset_counter_date, $timezone); + $reset_date = Carbon::parse($client->getSetting('reset_counter_date'), $timezone->name); - if (! $reset_date->isToday() || ! $client->company->settings->reset_counter_date) + if (! $reset_date->isToday() || ! $client->getSetting('reset_counter_date')) return false; switch ($client->company->reset_counter_frequency_id) { diff --git a/database/factories/CompanyFactory.php b/database/factories/CompanyFactory.php index fbbb1675846a..6297b6e698c1 100644 --- a/database/factories/CompanyFactory.php +++ b/database/factories/CompanyFactory.php @@ -9,7 +9,7 @@ $factory->define(App\Models\Company::class, function (Faker $faker) { 'company_key' => strtolower(str_random(config('ninja.key_length'))), 'ip' => $faker->ipv4, 'db' => config('database.default'), - 'settings' => new CompanySettings(CompanySettings::defaults()), + 'settings' => CompanySettings::defaults(), 'address1' => $faker->secondaryAddress, 'address2' => $faker->address, 'city' => $faker->city, diff --git a/database/seeds/RandomDataSeeder.php b/database/seeds/RandomDataSeeder.php index 351636085d57..7020223e0bca 100644 --- a/database/seeds/RandomDataSeeder.php +++ b/database/seeds/RandomDataSeeder.php @@ -125,7 +125,7 @@ class RandomDataSeeder extends Seeder GroupSetting::create([ 'company_id' => $company->id, 'user_id' => $user->id, - 'settings' => ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())), + 'settings' => ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()), 'name' => 'Default Client Settings', ]); diff --git a/tests/Feature/ClientTest.php b/tests/Feature/ClientTest.php index 2c696b1973d8..877f41c9d589 100644 --- a/tests/Feature/ClientTest.php +++ b/tests/Feature/ClientTest.php @@ -108,7 +108,7 @@ class ClientTest extends TestCase $token = $company_token->token; $company = $company_token->company; - + $user = $company_token->user; //$company_user = $company->company_users()->first(); diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index ff81952f78c6..6624b31283f3 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -73,7 +73,7 @@ trait MockAccountData $gs = new GroupSetting; $gs->name = 'Test'; $gs->company_id = $this->client->company_id; - $gs->settings = new ClientSettings(ClientSettings::defaults()); + $gs->settings = ClientSettings::buildClientSettings($this->company->settings, $this->client->settings); $gs->save(); $this->client->group_settings_id = $gs->id; @@ -86,7 +86,7 @@ trait MockAccountData $this->invoice->line_items = $this->buildLineItems(); - $this->settings = $this->client->settings; + $this->settings = $this->client->getMergedSettings(); $this->settings->custom_taxes1 = false; $this->settings->custom_taxes2 = false; @@ -168,7 +168,7 @@ trait MockAccountData $gs = new GroupSetting; $gs->company_id = $this->company->id; $gs->user_id = $this->user->id; - $gs->settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); + $gs->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); $gs->name = 'Default Client Settings'; $gs->save(); diff --git a/tests/Unit/BaseSettingsTest.php b/tests/Unit/BaseSettingsTest.php index 24923ccd5db6..9c93e1bec923 100644 --- a/tests/Unit/BaseSettingsTest.php +++ b/tests/Unit/BaseSettingsTest.php @@ -19,7 +19,7 @@ class BaseSettingsTest extends TestCase parent::setUp(); - $this->settings = new ClientSettings(ClientSettings::defaults()); + $this->settings = ClientSettings::defaults(); } @@ -29,7 +29,7 @@ class BaseSettingsTest extends TestCase $updated_object = $this->migrate($blank_object); - $this->assertTrue(property_exists($updated_object, 'language_id')); + $this->assertTrue(property_exists($updated_object, 'size_id')); } public function testPropertyNamesNotExist() diff --git a/tests/Unit/CompanySettingsTest.php b/tests/Unit/CompanySettingsTest.php index 5b4d7db369e9..80a67b5c53cd 100644 --- a/tests/Unit/CompanySettingsTest.php +++ b/tests/Unit/CompanySettingsTest.php @@ -35,10 +35,10 @@ class CompanySettingsTest extends TestCase } - public function testPropertyIsNotset() + public function testPropertyIssetOk() { - $this->assertFalse(isset($this->company_settings->custom_label1)); + $this->assertTrue(isset($this->company_settings->custom_label1)); } diff --git a/tests/Unit/CompareObjectTest.php b/tests/Unit/CompareObjectTest.php index 0627aba76577..c2d2eadb65ef 100644 --- a/tests/Unit/CompareObjectTest.php +++ b/tests/Unit/CompareObjectTest.php @@ -19,9 +19,9 @@ class CompareObjectTest extends TestCase parent::setUp(); - $this->client_settings = new ClientSettings(ClientSettings::defaults()); + $this->client_settings = ClientSettings::defaults(); - $this->company_settings = new CompanySettings(CompanySettings::defaults()); + $this->company_settings = CompanySettings::defaults(); } @@ -29,7 +29,7 @@ class CompareObjectTest extends TestCase public function buildClientSettings() { - foreach($this->client_settings as $key => $value) + foreach($this->company_settings as $key => $value) { if(!isset($this->client_settings->{$key}) && property_exists($this->company_settings, $key)) @@ -52,12 +52,12 @@ class CompareObjectTest extends TestCase public function testDirectClientSettingsBuild() { - $settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); + $settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); $this->assertEquals($settings->timezone_id, 15); $this->assertEquals($settings->language_id, 1); $this->assertEquals($settings->payment_terms, 1); - $this->assertEquals($settings->custom_invoice_taxes1, 'FALSE'); + $this->assertFalse($settings->custom_invoice_taxes1); } diff --git a/tests/Unit/GeneratesCounterTest.php b/tests/Unit/GeneratesCounterTest.php index ed4a82702426..620c7be10f03 100644 --- a/tests/Unit/GeneratesCounterTest.php +++ b/tests/Unit/GeneratesCounterTest.php @@ -224,10 +224,12 @@ class GeneratesCounterTest extends TestCase public function testClientNumberPattern() { $settings = $this->client->company->settings; - $settings->client_number_prefix = null; + $settings->client_number_prefix = ''; $settings->client_number_pattern = '{$year}-{$user_id}-{$counter}'; $this->client->company->settings = $settings; - $this->client->company->save(); + $this->client->company->save(); + $this->client->save(); + $this->client->fresh(); $client_number = $this->getNextClientNumber($this->client); diff --git a/tests/Unit/GroupSettingsTest.php b/tests/Unit/GroupSettingsTest.php index 1e0a422099f5..b51a5c510743 100644 --- a/tests/Unit/GroupSettingsTest.php +++ b/tests/Unit/GroupSettingsTest.php @@ -26,7 +26,7 @@ class GroupSettingsTest extends TestCase $this->makeTestData(); $this->company_settings = CompanySettings::defaults(); - $this->client->settings = new ClientSettings(ClientSettings::defaults()); + $this->client_settings = ClientSettings::buildClientSettings($this->company_settings, ClientSettings::defaults()); } @@ -36,39 +36,44 @@ class GroupSettingsTest extends TestCase { $this->company_settings->timezone_id = 'fluffy'; - $this->client->company->settings = $this->company_settings; + $this->company->settings = $this->company_settings; + $this->company->save(); - $this->assertEquals($this->client->company->settings->timezone_id, 'fluffy'); - $this->assertEquals($this->client->getSetting('timezone_id'), 'fluffy'); - $this->assertEquals($this->client->getMergedSettings()->timezone_id, 'fluffy'); + $this->client_settings->timezone_id = '1'; + $this->client->settings = $this->client_settings; + $this->client->save(); + + $this->assertEquals($this->client->settings->timezone_id, '1'); + $this->assertEquals($this->client->getSetting('timezone_id'), '1'); + $this->assertEquals($this->client->getMergedSettings()->timezone_id, '1'); + $this->assertEquals($this->company->settings->timezone_id, 'fluffy'); + } public function testGroupDefaults() { - $cs = $this->client->company->settings; - $cs->timezone_id = NULL; + $cs = $this->company->settings; + $cs->timezone_id = ''; - $this->client->company->settings = $cs; + $this->company->settings = $cs; $gs = $this->client->group_settings->settings; $gs->timezone_id = 'SPOCK'; $this->client->group_settings->settings = $gs; + $this->client->save(); $cls = $this->client->settings; - $cls->timezone_id = NULL; + $cls->timezone_id = ''; $cls->date_format = 'sharleen'; - $this->client->settings = $cls; - - $this->client->group_settings->save(); - $this->client->company->save(); $this->client->save(); - $this->client->fresh(); + $this->client->company->save(); + $this->client->save(); $this->assertEquals($this->client->group_settings->settings->timezone_id, 'SPOCK'); $this->assertEquals($this->client->getSetting('timezone_id'), 'SPOCK'); diff --git a/tests/Unit/GroupTest.php b/tests/Unit/GroupTest.php index d03632027fe2..bb6d8f3f3f52 100644 --- a/tests/Unit/GroupTest.php +++ b/tests/Unit/GroupTest.php @@ -18,7 +18,7 @@ class GroupTest extends TestCase parent::setUp(); - $this->settings = ClientSettings::buildClientSettings(new CompanySettings(CompanySettings::defaults()), new ClientSettings(ClientSettings::defaults())); + $this->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); } diff --git a/tests/Unit/InvoiceTest.php b/tests/Unit/InvoiceTest.php index e598315d80ee..8d3b4a7100f5 100644 --- a/tests/Unit/InvoiceTest.php +++ b/tests/Unit/InvoiceTest.php @@ -101,7 +101,6 @@ class InvoiceTest extends TestCase $this->invoice->tax_name1 = 'GST'; $this->invoice->tax_rate1 = 10; - $this->invoice_calc->build(); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);