mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-08 05:14:30 -04:00
Merge pull request #4186 from turbo124/v5-develop
Fixes for Expenses and Vendors
This commit is contained in:
commit
bc382cc4b4
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@ -40,8 +40,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Cleanup Builds
|
- name: Cleanup Builds
|
||||||
run: |
|
run: |
|
||||||
#sudo rm -rf nodule_modules/
|
|
||||||
sudo rm -rf bootstrap/cache/*
|
sudo rm -rf bootstrap/cache/*
|
||||||
|
sudo rm public/index.html
|
||||||
|
|
||||||
- name: Build project # This would actually build your project, using zip for an example artifact
|
- name: Build project # This would actually build your project, using zip for an example artifact
|
||||||
run: |
|
run: |
|
||||||
|
@ -1 +1 @@
|
|||||||
5.0.19
|
5.0.20
|
||||||
|
@ -105,6 +105,9 @@ class CompanySettings extends BaseSettings
|
|||||||
public $payment_number_pattern = '';
|
public $payment_number_pattern = '';
|
||||||
public $payment_number_counter = 1;
|
public $payment_number_counter = 1;
|
||||||
|
|
||||||
|
public $project_number_pattern = '';
|
||||||
|
public $project_number_counter = 1;
|
||||||
|
|
||||||
public $shared_invoice_quote_counter = false;
|
public $shared_invoice_quote_counter = false;
|
||||||
public $recurring_number_prefix = 'R';
|
public $recurring_number_prefix = 'R';
|
||||||
public $reset_counter_frequency_id = '0';
|
public $reset_counter_frequency_id = '0';
|
||||||
@ -313,6 +316,8 @@ class CompanySettings extends BaseSettings
|
|||||||
'embed_documents' => 'bool',
|
'embed_documents' => 'bool',
|
||||||
'all_pages_header' => 'bool',
|
'all_pages_header' => 'bool',
|
||||||
'all_pages_footer' => 'bool',
|
'all_pages_footer' => 'bool',
|
||||||
|
'project_number_pattern' => 'string',
|
||||||
|
'project_number_counter' => 'int',
|
||||||
'task_number_pattern' => 'string',
|
'task_number_pattern' => 'string',
|
||||||
'task_number_counter' => 'int',
|
'task_number_counter' => 'int',
|
||||||
'expense_number_pattern' => 'string',
|
'expense_number_pattern' => 'string',
|
||||||
|
@ -198,50 +198,47 @@ class EmailTemplateDefaults
|
|||||||
|
|
||||||
public static function emailReminder1Template()
|
public static function emailReminder1Template()
|
||||||
{
|
{
|
||||||
// return Parsedown::instance()->line('First Email Reminder Text');
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailReminder2Subject()
|
public static function emailReminder2Subject()
|
||||||
{
|
{
|
||||||
return ctrans('texts.reminder_subject', ['invoice'=>'$invoice.number', 'account'=>'$company.name']);
|
return ctrans('texts.reminder_subject', ['invoice'=>'$invoice.number', 'account'=>'$company.name']);
|
||||||
// return Parsedown::instance()->line(self::transformText('reminder_subject'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailReminder2Template()
|
public static function emailReminder2Template()
|
||||||
{
|
{
|
||||||
// return Parsedown::instance()->line('Second Email Reminder Text');
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailReminder3Subject()
|
public static function emailReminder3Subject()
|
||||||
{
|
{
|
||||||
return ctrans('texts.reminder_subject', ['invoice'=>'$invoice.number', 'account'=>'$company.name']);
|
return ctrans('texts.reminder_subject', ['invoice'=>'$invoice.number', 'account'=>'$company.name']);
|
||||||
// return Parsedown::instance()->line(self::transformText('reminder_subject'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailReminder3Template()
|
public static function emailReminder3Template()
|
||||||
{
|
{
|
||||||
// return Parsedown::instance()->line('Third Email Reminder Text');
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailReminderEndlessSubject()
|
public static function emailReminderEndlessSubject()
|
||||||
{
|
{
|
||||||
return ctrans('texts.reminder_subject', ['invoice'=>'$invoice.number', 'account'=>'$company.name']);
|
return ctrans('texts.reminder_subject', ['invoice'=>'$invoice.number', 'account'=>'$company.name']);
|
||||||
// return Parsedown::instance()->line(self::transformText('reminder_subject'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailReminderEndlessTemplate()
|
public static function emailReminderEndlessTemplate()
|
||||||
{
|
{
|
||||||
return ctrans('Endless Email Reminder Text');
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailStatementSubject()
|
public static function emailStatementSubject()
|
||||||
{
|
{
|
||||||
return ctrans('Statement Subject needs texts record!');
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function emailStatementTemplate()
|
public static function emailStatementTemplate()
|
||||||
{
|
{
|
||||||
return ctrans('Statement Templates needs texts record!');
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function transformText($string)
|
private static function transformText($string)
|
||||||
|
@ -33,6 +33,15 @@ class ExpenseFactory
|
|||||||
$expense->tax_rate3 = 0;
|
$expense->tax_rate3 = 0;
|
||||||
$expense->date = null;
|
$expense->date = null;
|
||||||
$expense->payment_date = null;
|
$expense->payment_date = null;
|
||||||
|
$expense->amount = 0;
|
||||||
|
$expense->foreign_amount = 0;
|
||||||
|
$expense->private_notes = '';
|
||||||
|
$expense->public_notes = '';
|
||||||
|
$expense->transaction_reference = '';
|
||||||
|
$expense->custom_value1 = '';
|
||||||
|
$expense->custom_value2 = '';
|
||||||
|
$expense->custom_value3 = '';
|
||||||
|
$expense->custom_value4 = '';
|
||||||
|
|
||||||
return $expense;
|
return $expense;
|
||||||
}
|
}
|
||||||
|
@ -60,10 +60,9 @@ class BaseController extends Controller
|
|||||||
|
|
||||||
private $first_load = [
|
private $first_load = [
|
||||||
'account',
|
'account',
|
||||||
'user.company_user',
|
|
||||||
'token.company_user',
|
'token.company_user',
|
||||||
'company.activities',
|
'company.activities',
|
||||||
'company.users.company_user',
|
'company.users.company_users',
|
||||||
'company.tax_rates',
|
'company.tax_rates',
|
||||||
'company.groups',
|
'company.groups',
|
||||||
'company.company_gateways.gateway',
|
'company.company_gateways.gateway',
|
||||||
@ -203,60 +202,60 @@ class BaseController extends Controller
|
|||||||
$updated_at = date('Y-m-d H:i:s', $updated_at);
|
$updated_at = date('Y-m-d H:i:s', $updated_at);
|
||||||
|
|
||||||
$query->with(
|
$query->with(
|
||||||
[
|
[ 'user.company_users',
|
||||||
'company' => function ($query) use ($updated_at) {
|
'company' => function ($query) use ($updated_at) {
|
||||||
$query->whereNotNull('updated_at')->with('documents');
|
$query->whereNotNull('updated_at')->with('documents');
|
||||||
},
|
},
|
||||||
'company.clients' => function ($query) use ($updated_at) {
|
'company.clients' => function ($query) use ($updated_at) {
|
||||||
$query->where('clients.updated_at', '>=', $updated_at)->with('contacts', 'gateway_tokens','documents');
|
$query->where('clients.updated_at', '>=', $updated_at)->with('contacts.company', 'gateway_tokens','documents','company');
|
||||||
},
|
|
||||||
'company.tax_rates' => function ($query) use ($updated_at) {
|
|
||||||
$query->where('updated_at', '>=', $updated_at);
|
|
||||||
},
|
|
||||||
'company.groups' => function ($query) use ($updated_at) {
|
|
||||||
$query->where('updated_at', '>=', $updated_at);
|
|
||||||
},
|
},
|
||||||
'company.company_gateways' => function ($query) {
|
'company.company_gateways' => function ($query) {
|
||||||
$query->whereNotNull('updated_at');
|
$query->whereNotNull('updated_at');
|
||||||
},
|
},
|
||||||
'company.products' => function ($query) use ($updated_at) {
|
'company.credits'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('documents');
|
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'documents',);
|
||||||
},
|
},
|
||||||
'company.recurring_invoices'=> function ($query) use ($updated_at) {
|
'company.designs'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('company');
|
$query->where('updated_at', '>=', $updated_at)->with('company');
|
||||||
},
|
},
|
||||||
'company.invoices'=> function ($query) use ($updated_at) {
|
'company.documents'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'company', 'documents');
|
$query->where('updated_at', '>=', $updated_at);
|
||||||
},
|
},
|
||||||
'company.recurring_invoices'=> function ($query) use ($updated_at) {
|
'company.expenses'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'company', 'documents');
|
$query->where('updated_at', '>=', $updated_at)->with('documents' );
|
||||||
|
},
|
||||||
|
'company.groups' => function ($query) use ($updated_at) {
|
||||||
|
$query->where('updated_at', '>=', $updated_at);
|
||||||
|
},
|
||||||
|
'company.invoices'=> function ($query) use ($updated_at) {
|
||||||
|
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'documents');
|
||||||
},
|
},
|
||||||
'company.payments'=> function ($query) use ($updated_at) {
|
'company.payments'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('paymentables','documents');
|
$query->where('updated_at', '>=', $updated_at)->with('paymentables','documents', );
|
||||||
},
|
|
||||||
'company.quotes'=> function ($query) use ($updated_at) {
|
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'documents');
|
|
||||||
},
|
|
||||||
'company.credits'=> function ($query) use ($updated_at) {
|
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'documents');
|
|
||||||
},
|
},
|
||||||
'company.payment_terms'=> function ($query) use ($updated_at) {
|
'company.payment_terms'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at);
|
$query->where('updated_at', '>=', $updated_at);
|
||||||
},
|
},
|
||||||
'company.vendors'=> function ($query) use ($updated_at) {
|
'company.products' => function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('contacts');
|
$query->where('updated_at', '>=', $updated_at)->with('documents');
|
||||||
},
|
|
||||||
'company.expenses'=> function ($query) use ($updated_at) {
|
|
||||||
$query->where('updated_at', '>=', $updated_at);
|
|
||||||
},
|
|
||||||
'company.tasks'=> function ($query) use ($updated_at) {
|
|
||||||
$query->where('updated_at', '>=', $updated_at);
|
|
||||||
},
|
},
|
||||||
'company.projects'=> function ($query) use ($updated_at) {
|
'company.projects'=> function ($query) use ($updated_at) {
|
||||||
|
$query->where('updated_at', '>=', $updated_at)->with('documents' );
|
||||||
|
},
|
||||||
|
'company.quotes'=> function ($query) use ($updated_at) {
|
||||||
|
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'documents',);
|
||||||
|
},
|
||||||
|
'company.recurring_invoices'=> function ($query) use ($updated_at) {
|
||||||
|
$query->where('updated_at', '>=', $updated_at)->with('invitations', 'documents');
|
||||||
|
},
|
||||||
|
'company.tasks'=> function ($query) use ($updated_at) {
|
||||||
|
$query->where('updated_at', '>=', $updated_at)->with('documents' );
|
||||||
|
},
|
||||||
|
'company.tax_rates' => function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at);
|
$query->where('updated_at', '>=', $updated_at);
|
||||||
},
|
},
|
||||||
'company.designs'=> function ($query) use ($updated_at) {
|
'company.vendors'=> function ($query) use ($updated_at) {
|
||||||
$query->where('updated_at', '>=', $updated_at)->with('company');
|
$query->where('updated_at', '>=', $updated_at)->with('contacts','documents' );
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -37,23 +37,13 @@ class StoreExpenseRequest extends Request
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Ensure we have a client name, and that all emails are unique*/
|
|
||||||
//$rules['name'] = 'required|min:1';
|
|
||||||
$rules['id_number'] = 'unique:expenses,id_number,'.$this->id.',id,company_id,'.$this->company_id;
|
$rules['id_number'] = 'unique:expenses,id_number,'.$this->id.',id,company_id,'.$this->company_id;
|
||||||
//$rules['settings'] = new ValidExpenseGroupSettingsRule();
|
|
||||||
$rules['contacts.*.email'] = 'nullable|distinct';
|
$rules['contacts.*.email'] = 'nullable|distinct';
|
||||||
|
|
||||||
$rules['number'] = new UniqueExpenseNumberRule($this->all());
|
$rules['number'] = new UniqueExpenseNumberRule($this->all());
|
||||||
|
|
||||||
// $contacts = request('contacts');
|
|
||||||
|
|
||||||
// if (is_array($contacts)) {
|
|
||||||
// for ($i = 0; $i < count($contacts); $i++) {
|
|
||||||
|
|
||||||
// //$rules['contacts.' . $i . '.email'] = 'nullable|email|distinct';
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,15 +55,27 @@ class UniqueExpenseNumberRule implements Rule
|
|||||||
*/
|
*/
|
||||||
private function checkIfExpenseNumberUnique() : bool
|
private function checkIfExpenseNumberUnique() : bool
|
||||||
{
|
{
|
||||||
$expense = Expense::where('client_id', $this->input['client_id'])
|
if(empty($this->input['number']))
|
||||||
->where('number', $this->input['number'])
|
|
||||||
->withTrashed()
|
|
||||||
->exists();
|
|
||||||
|
|
||||||
if ($expense) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
$expense = Expense::query()
|
||||||
|
->where('number', $this->input['number'])
|
||||||
|
->withTrashed();
|
||||||
|
|
||||||
|
// if(isset($this->input['client_id']))
|
||||||
|
// $expense->where('client_id', $this->input['client_id']);
|
||||||
|
|
||||||
|
return $expense->exists();
|
||||||
|
|
||||||
|
// $expense = Expense::where('client_id', $this->input['client_id'])
|
||||||
|
// ->where('number', $this->input['number'])
|
||||||
|
// ->withTrashed()
|
||||||
|
// ->exists();
|
||||||
|
|
||||||
|
// if ($expense) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,9 @@ class ValidProjectForClient implements Rule
|
|||||||
*/
|
*/
|
||||||
public function passes($attribute, $value)
|
public function passes($attribute, $value)
|
||||||
{
|
{
|
||||||
|
if(empty($this->input['project_id']))
|
||||||
|
return true;
|
||||||
|
|
||||||
if(is_string($this->input['project_id']))
|
if(is_string($this->input['project_id']))
|
||||||
$this->input['project_id'] = $this->decodePrimaryKey($this->input['project_id']);
|
$this->input['project_id'] = $this->decodePrimaryKey($this->input['project_id']);
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ use App\Models\ClientContact;
|
|||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyToken;
|
use App\Models\CompanyToken;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class MultiDB.
|
* Class MultiDB.
|
||||||
@ -237,7 +238,7 @@ class MultiDB
|
|||||||
|
|
||||||
public static function findAndSetDbByInvitation($entity, $invitation_key)
|
public static function findAndSetDbByInvitation($entity, $invitation_key)
|
||||||
{
|
{
|
||||||
$class = 'App\Models\\'.ucfirst($entity).'Invitation';
|
$class = 'App\Models\\'.ucfirst(Str::camel($entity)).'Invitation';
|
||||||
|
|
||||||
foreach (self::$dbs as $db) {
|
foreach (self::$dbs as $db) {
|
||||||
if ($invite = $class::on($db)->whereRaw('BINARY `key`= ?', [$invitation_key])->first()) {
|
if ($invite = $class::on($db)->whereRaw('BINARY `key`= ?', [$invitation_key])->first()) {
|
||||||
|
@ -28,7 +28,6 @@ class InvoiceInvitation extends BaseModel
|
|||||||
use Inviteable;
|
use Inviteable;
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
//'key',
|
|
||||||
'client_contact_id',
|
'client_contact_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ class CompanyPresenter extends EntityPresenter
|
|||||||
$settings = $this->entity->settings;
|
$settings = $this->entity->settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
$country = Country::find($settings->country_id)->first();
|
$country = Country::find($settings->country_id);
|
||||||
|
|
||||||
$swap = $country && $country->swap_postal_code;
|
$swap = $country && $country->swap_postal_code;
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@ namespace App\Models\Presenters;
|
|||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
use Hashids\Hashids;
|
use Hashids\Hashids;
|
||||||
use Laracasts\Presenter\Presenter;
|
use Laracasts\Presenter\Presenter;
|
||||||
use stdClass;
|
|
||||||
use URL;
|
use URL;
|
||||||
use Utils;
|
use Utils;
|
||||||
|
|
||||||
|
160
app/Models/Presenters/VendorPresenter.php
Normal file
160
app/Models/Presenters/VendorPresenter.php
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://opensource.org/licenses/AAL
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Models\Presenters;
|
||||||
|
|
||||||
|
use App\Models\Country;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class VendorPresenter.
|
||||||
|
*/
|
||||||
|
class VendorPresenter extends EntityPresenter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function name()
|
||||||
|
{
|
||||||
|
if ($this->entity->name) {
|
||||||
|
return $this->entity->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
$contact = $this->entity->primary_contact->first();
|
||||||
|
|
||||||
|
$contact_name = 'No Contact Set';
|
||||||
|
|
||||||
|
if ($contact && (strlen($contact->first_name) >= 1 || strlen($contact->last_name) >= 1)) {
|
||||||
|
$contact_name = $contact->first_name.' '.$contact->last_name;
|
||||||
|
} elseif ($contact && (strlen($contact->email))) {
|
||||||
|
$contact_name = $contact->email;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $contact_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function primary_contact_name()
|
||||||
|
{
|
||||||
|
return $this->entity->primary_contact->first() !== null ? $this->entity->primary_contact->first()->first_name.' '.$this->entity->primary_contact->first()->last_name : 'No primary contact set';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function email()
|
||||||
|
{
|
||||||
|
return $this->entity->primary_contact->first() !== null ? $this->entity->primary_contact->first()->email : 'No Email Set';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function address()
|
||||||
|
{
|
||||||
|
$str = '';
|
||||||
|
$vendor = $this->entity;
|
||||||
|
|
||||||
|
if ($address1 = $vendor->address1) {
|
||||||
|
$str .= e($address1).'<br/>';
|
||||||
|
}
|
||||||
|
if ($address2 = $vendor->address2) {
|
||||||
|
$str .= e($address2).'<br/>';
|
||||||
|
}
|
||||||
|
if ($cityState = $this->getCityState()) {
|
||||||
|
$str .= e($cityState).'<br/>';
|
||||||
|
}
|
||||||
|
if ($country = $vendor->country) {
|
||||||
|
$str .= e($country->name).'<br/>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function shipping_address()
|
||||||
|
{
|
||||||
|
$str = '';
|
||||||
|
$vendor = $this->entity;
|
||||||
|
|
||||||
|
if ($address1 = $vendor->shipping_address1) {
|
||||||
|
$str .= e($address1).'<br/>';
|
||||||
|
}
|
||||||
|
if ($address2 = $vendor->shipping_address2) {
|
||||||
|
$str .= e($address2).'<br/>';
|
||||||
|
}
|
||||||
|
if ($cityState = $this->getCityState()) {
|
||||||
|
$str .= e($cityState).'<br/>';
|
||||||
|
}
|
||||||
|
if ($country = $vendor->country) {
|
||||||
|
$str .= e($country->name).'<br/>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function phone()
|
||||||
|
{
|
||||||
|
return $this->entity->phone ?: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function website()
|
||||||
|
{
|
||||||
|
return $this->entity->website ?: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculated company data fields
|
||||||
|
* using settings.
|
||||||
|
*/
|
||||||
|
public function company_name()
|
||||||
|
{
|
||||||
|
$settings = $this->entity->company->settings;;
|
||||||
|
|
||||||
|
return $settings->name ?: ctrans('texts.untitled_account');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function company_address()
|
||||||
|
{
|
||||||
|
$settings = $this->entity->company->settings;;
|
||||||
|
|
||||||
|
$str = '';
|
||||||
|
|
||||||
|
if ($settings->address1) {
|
||||||
|
$str .= e($settings->address1).'<br/>';
|
||||||
|
}
|
||||||
|
if ($settings->address2) {
|
||||||
|
$str .= e($settings->address2).'<br/>';
|
||||||
|
}
|
||||||
|
if ($cityState = $this->getCityState()) {
|
||||||
|
$str .= e($cityState).'<br/>';
|
||||||
|
}
|
||||||
|
if ($country = Country::find($settings->country_id)) {
|
||||||
|
$str .= e($country->name).'<br/>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCityState()
|
||||||
|
{
|
||||||
|
$settings = $this->entity->company->settings;;
|
||||||
|
|
||||||
|
$country = false;
|
||||||
|
|
||||||
|
if ($settings->country_id) {
|
||||||
|
$country = Country::find($settings->country_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
$swap = $country && $country->swap_postal_code;
|
||||||
|
|
||||||
|
$city = e($settings->city ?: '');
|
||||||
|
$state = e($settings->state ?: '');
|
||||||
|
$postalCode = e($settings->postal_code ?: '');
|
||||||
|
|
||||||
|
if ($city || $state || $postalCode) {
|
||||||
|
return $this->cityStateZip($city, $state, $postalCode, $swap);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -69,5 +69,16 @@ class RecurringInvoiceInvitation extends BaseModel
|
|||||||
return $this->belongsTo(Company::class);
|
return $this->belongsTo(Company::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function markViewed()
|
||||||
|
{
|
||||||
|
$this->viewed_date = Carbon::now();
|
||||||
|
$this->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function markOpened()
|
||||||
|
{
|
||||||
|
$this->opened_date = Carbon::now();
|
||||||
|
$this->save();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,14 @@ use App\Utils\Traits\GeneratesCounter;
|
|||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Laracasts\Presenter\PresentableTrait;
|
||||||
|
|
||||||
class Vendor extends BaseModel
|
class Vendor extends BaseModel
|
||||||
{
|
{
|
||||||
use SoftDeletes;
|
use SoftDeletes;
|
||||||
use Filterable;
|
use Filterable;
|
||||||
use GeneratesCounter;
|
use GeneratesCounter;
|
||||||
|
use PresentableTrait;
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name',
|
'name',
|
||||||
|
@ -23,6 +23,7 @@ class ExpenseTransformer extends EntityTransformer
|
|||||||
{
|
{
|
||||||
use MakesHash;
|
use MakesHash;
|
||||||
use SoftDeletes;
|
use SoftDeletes;
|
||||||
|
|
||||||
protected $defaultIncludes = [
|
protected $defaultIncludes = [
|
||||||
'documents',
|
'documents',
|
||||||
];
|
];
|
||||||
|
@ -427,7 +427,7 @@ class HtmlEngine
|
|||||||
|
|
||||||
private function getCountryName() :string
|
private function getCountryName() :string
|
||||||
{
|
{
|
||||||
$country = Country::find($this->settings->country_id)->first();
|
$country = Country::find($this->settings->country_id);
|
||||||
|
|
||||||
if ($country) {
|
if ($country) {
|
||||||
return $country->name;
|
return $country->name;
|
||||||
|
@ -12,7 +12,7 @@ return [
|
|||||||
'require_https' => env('REQUIRE_HTTPS', true),
|
'require_https' => env('REQUIRE_HTTPS', true),
|
||||||
'app_url' => rtrim(env('APP_URL', ''), '/').'/',
|
'app_url' => rtrim(env('APP_URL', ''), '/').'/',
|
||||||
'app_domain' => env('APP_DOMAIN', ''),
|
'app_domain' => env('APP_DOMAIN', ''),
|
||||||
'app_version' => '5.0.19',
|
'app_version' => '5.0.20',
|
||||||
'minimum_client_version' => '5.0.16',
|
'minimum_client_version' => '5.0.16',
|
||||||
'terms_version' => '1.0.1',
|
'terms_version' => '1.0.1',
|
||||||
'api_secret' => env('API_SECRET', ''),
|
'api_secret' => env('API_SECRET', ''),
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class ProjectNameUniqueRemoval extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
|
||||||
|
Schema::table('projects', function (Blueprint $table) {
|
||||||
|
$table->dropUnique('projects_company_id_name_unique');
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('expenses', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('invoice_currency_id')->nullable()->change();
|
||||||
|
$table->unsignedInteger('expense_currency_id')->nullable()->change();
|
||||||
|
$table->text('private_notes')->nullable()->change();
|
||||||
|
$table->text('public_notes')->nullable()->change();
|
||||||
|
$table->text('transaction_reference')->nullable()->change();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('companies', function (Blueprint $table) {
|
||||||
|
$table->boolean('invoice_expense_documents')->default(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user