mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-19 03:04:05 +00:00
Remove app/Space folder and extract model business logic into services
Relocate all 14 files from the catch-all app/Space namespace into proper locations: data providers to Support/Formatters, installation utilities to Services/Installation, PDF utils to Services/Pdf, module/update classes to Services/Module and Services/Update, SiteApi trait to Traits, and helpers to Support. Extract ~1,400 lines of business logic from 8 fat models (Invoice, Payment, Estimate, RecurringInvoice, Company, Customer, Expense, User) into 9 new service classes with constructor injection. Controllers now depend on services instead of calling static model methods. Shared item/tax creation logic consolidated into DocumentItemService.
This commit is contained in:
196
app/Support/helpers.php
Normal file
196
app/Support/helpers.php
Normal file
@@ -0,0 +1,196 @@
|
||||
<?php
|
||||
|
||||
use App\Models\CompanySetting;
|
||||
use App\Models\Currency;
|
||||
use App\Models\CustomField;
|
||||
use App\Models\Setting;
|
||||
use App\Services\Installation\InstallUtils;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Get company setting
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_company_setting($key, $company_id)
|
||||
{
|
||||
if (! InstallUtils::isDbCreated()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return CompanySetting::getSetting($key, $company_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get app setting
|
||||
*
|
||||
* @param $company_id
|
||||
* @return string
|
||||
*/
|
||||
function get_app_setting($key)
|
||||
{
|
||||
if (! InstallUtils::isDbCreated()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Setting::getSetting($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page title
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_page_title($company_id)
|
||||
{
|
||||
if (! InstallUtils::isDbCreated()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$routeName = Route::currentRouteName();
|
||||
|
||||
$defaultPageTitle = 'InvoiceShelf - Self Hosted Invoicing Platform';
|
||||
|
||||
if ($routeName === 'customer.dashboard') {
|
||||
$pageTitle = CompanySetting::getSetting('customer_portal_page_title', $company_id);
|
||||
|
||||
return $pageTitle ? $pageTitle : $defaultPageTitle;
|
||||
}
|
||||
|
||||
$pageTitle = Setting::getSetting('admin_page_title');
|
||||
|
||||
return $pageTitle ? $pageTitle : $defaultPageTitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Active Path
|
||||
*
|
||||
* @param string $active
|
||||
* @return string
|
||||
*/
|
||||
function set_active($path, $active = 'active')
|
||||
{
|
||||
return call_user_func_array('Request::is', (array) $path) ? $active : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
function is_url($path)
|
||||
{
|
||||
return call_user_func_array('Request::is', (array) $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function getCustomFieldValueKey(string $type)
|
||||
{
|
||||
switch ($type) {
|
||||
case 'Input':
|
||||
return 'string_answer';
|
||||
|
||||
case 'TextArea':
|
||||
return 'string_answer';
|
||||
|
||||
case 'Phone':
|
||||
return 'number_answer';
|
||||
|
||||
case 'Url':
|
||||
return 'string_answer';
|
||||
|
||||
case 'Number':
|
||||
return 'number_answer';
|
||||
|
||||
case 'Dropdown':
|
||||
return 'string_answer';
|
||||
|
||||
case 'Switch':
|
||||
return 'boolean_answer';
|
||||
|
||||
case 'Date':
|
||||
return 'date_answer';
|
||||
|
||||
case 'Time':
|
||||
return 'time_answer';
|
||||
|
||||
case 'DateTime':
|
||||
return 'date_time_answer';
|
||||
|
||||
default:
|
||||
return 'string_answer';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return formated_money
|
||||
*/
|
||||
function format_money_pdf($money, $currency = null)
|
||||
{
|
||||
$money = $money / 100;
|
||||
|
||||
if (! $currency) {
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', 1));
|
||||
}
|
||||
|
||||
$format_money = number_format(
|
||||
$money,
|
||||
$currency->precision,
|
||||
$currency->decimal_separator,
|
||||
$currency->thousand_separator
|
||||
);
|
||||
|
||||
$currency_with_symbol = '';
|
||||
if ($currency->swap_currency_symbol) {
|
||||
$currency_with_symbol = $format_money.'<span style="font-family: DejaVu Sans;">'.$currency->symbol.'</span>';
|
||||
} else {
|
||||
$currency_with_symbol = '<span style="font-family: DejaVu Sans;">'.$currency->symbol.'</span>'.$format_money;
|
||||
}
|
||||
|
||||
return $currency_with_symbol;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $string
|
||||
* @return string
|
||||
*/
|
||||
function clean_slug($model, $title, $id = 0)
|
||||
{
|
||||
// Normalize the title
|
||||
$slug = Str::upper('CUSTOM_'.$model.'_'.Str::slug($title, '_'));
|
||||
|
||||
// Get any that could possibly be related.
|
||||
// This cuts the queries down by doing it once.
|
||||
$allSlugs = getRelatedSlugs($model, $slug, $id);
|
||||
|
||||
// If we haven't used it before then we are all good.
|
||||
if (! $allSlugs->contains('slug', $slug)) {
|
||||
return $slug;
|
||||
}
|
||||
|
||||
// Just append numbers like a savage until we find not used.
|
||||
for ($i = 1; $i <= 10; $i++) {
|
||||
$newSlug = $slug.'_'.$i;
|
||||
if (! $allSlugs->contains('slug', $newSlug)) {
|
||||
return $newSlug;
|
||||
}
|
||||
}
|
||||
|
||||
throw new Exception('Can not create a unique slug');
|
||||
}
|
||||
|
||||
function getRelatedSlugs($type, $slug, $id = 0)
|
||||
{
|
||||
return CustomField::select('slug')->where('slug', 'like', $slug.'%')
|
||||
->where('model_type', $type)
|
||||
->where('id', '<>', $id)
|
||||
->get();
|
||||
}
|
||||
|
||||
function respondJson($error, $message)
|
||||
{
|
||||
return response()->json([
|
||||
'error' => $error,
|
||||
'message' => $message,
|
||||
], 422);
|
||||
}
|
||||
Reference in New Issue
Block a user