diff --git a/app/Http/Requests/Project/StoreProjectRequest.php b/app/Http/Requests/Project/StoreProjectRequest.php index a1c3d0bcf570..7b9c41990ef6 100644 --- a/app/Http/Requests/Project/StoreProjectRequest.php +++ b/app/Http/Requests/Project/StoreProjectRequest.php @@ -37,7 +37,7 @@ class StoreProjectRequest extends Request $rules['name'] = 'required'; $rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id; - return $rules; + return $this->globalRules($rules); } protected function prepareForValidation() diff --git a/app/Http/Requests/Project/UpdateProjectRequest.php b/app/Http/Requests/Project/UpdateProjectRequest.php index 3c4c3892f1ad..7a8dd7e04543 100644 --- a/app/Http/Requests/Project/UpdateProjectRequest.php +++ b/app/Http/Requests/Project/UpdateProjectRequest.php @@ -31,7 +31,9 @@ class UpdateProjectRequest extends Request public function rules() { - return []; + $rules = []; + + return $this->globalRules($rules); } protected function prepareForValidation() diff --git a/app/Jobs/Mail/EntityPaidMailer.php b/app/Jobs/Mail/EntityPaidMailer.php index f476f1ec6120..ffb5f525d838 100644 --- a/app/Jobs/Mail/EntityPaidMailer.php +++ b/app/Jobs/Mail/EntityPaidMailer.php @@ -53,11 +53,11 @@ class EntityPaidMailer extends BaseMailerJob implements ShouldQueue * @param $user * @param $company */ - public function __construct($payment, $user, $company) + public function __construct($payment, $company) { $this->company = $company; - $this->user = $user; + $this->user = $payment->user; $this->payment = $payment; @@ -82,16 +82,25 @@ class EntityPaidMailer extends BaseMailerJob implements ShouldQueue //if we need to set an email driver do it now $this->setMailDriver(); - $mail_obj = (new EntityPaidObject($this->payment))->build(); - $mail_obj->from = [$this->payment->user->email, $this->payment->user->present()->name()]; + try { - //send email - Mail::to($this->user->email) - ->send(new EntityNotificationMailer($mail_obj)); + $mail_obj = (new EntityPaidObject($this->payment))->build(); + $mail_obj->from = [$this->payment->user->email, $this->payment->user->present()->name()]; - //catch errors - if (count(Mail::failures()) > 0) { - return $this->logMailError(Mail::failures(), $this->payment->client); + //send email + Mail::to($this->user->email) + ->send(new EntityNotificationMailer($mail_obj)); + + } catch (Swift_TransportException $e) { + $this->failed($e->getMessage()); + //$this->entityEmailFailed($e->getMessage()); } + + if (count(Mail::failures()) > 0) { + $this->logMailError(Mail::failures(), $this->entity->client); + } else { + // $this->entityEmailSucceeded(); + } + } } diff --git a/app/Listeners/Payment/PaymentNotification.php b/app/Listeners/Payment/PaymentNotification.php index d5cedad39aae..8bf809f35f71 100644 --- a/app/Listeners/Payment/PaymentNotification.php +++ b/app/Listeners/Payment/PaymentNotification.php @@ -62,11 +62,8 @@ class PaymentNotification implements ShouldQueue if (($key = array_search('mail', $methods)) !== false) { unset($methods[$key]); - //Fire mail notification here!!! - //This allows us better control of how we - //handle the mailer + EntityPaidMailer::dispatch($payment, $payment->company); - EntityPaidMailer::dispatch($payment, $user, $payment->company); } $notification = new NewPaymentNotification($payment, $payment->company); @@ -84,7 +81,6 @@ class PaymentNotification implements ShouldQueue } /*Google Analytics Track Revenue*/ - if (isset($payment->company->google_analytics_key)) { $this->trackRevenue($event); } diff --git a/app/Models/Company.php b/app/Models/Company.php index c815e7cdcaa7..7295fcc4666b 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -74,6 +74,8 @@ class Company extends BaseModel protected $presenter = CompanyPresenter::class; protected $fillable = [ + 'invoice_expense_documents', + 'invoice_task_documents', 'show_tasks_table', 'mark_expenses_invoiceable', 'mark_expenses_paid', diff --git a/app/Models/Project.php b/app/Models/Project.php index 19fda5261909..4ca4eeade66c 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -37,6 +37,7 @@ class Project extends BaseModel 'custom_value2', 'custom_value3', 'custom_value4', + 'assigned_user_id', ]; public function getEntityType() diff --git a/app/Models/Task.php b/app/Models/Task.php index 373ae4f548f3..11f32f6a23a8 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -15,6 +15,7 @@ use App\Models\Filterable; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Carbon; class Task extends BaseModel { @@ -37,6 +38,7 @@ class Task extends BaseModel 'status_id', 'status_sort_order', 'invoice_documents', + 'rate', ]; protected $touches = []; @@ -80,4 +82,69 @@ class Task extends BaseModel { return $this->belongsTo(Project::class); } + + + + + + + + + + + public function calcStartTime() + { + $parts = json_decode($this->time_log) ?: []; + + if (count($parts)) { + return Carbon::createFromTimeStamp($parts[0][0]); + } else { + return ''; + } + } + + public function getLastStartTime() + { + $parts = json_decode($this->time_log) ?: []; + + if (count($parts)) { + $index = count($parts) - 1; + + return $parts[$index][0]; + } else { + return ''; + } + + } + + public function calcDuration($start_time_cutoff = 0, $end_time_cutoff = 0) + { + $duration = 0; + $parts = json_decode($this->time_log) ?: []; + + foreach ($parts as $part) { + $start_time = $part[0]; + if (count($part) == 1 || ! $part[1]) { + $end_time = time(); + } else { + $end_time = $part[1]; + } + + if ($start_time_cutoff) { + $start_time = max($start_time, $start_time_cutoff); + } + if ($end_time_cutoff) { + $end_time = min($end_time, $end_time_cutoff); + } + + $duration += max($end_time - $start_time, 0); + } + + return round($duration); + } + + + + + } diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index 87e1a206319f..8fe542e71ab8 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -32,7 +32,7 @@ class Vendor extends BaseModel 'assigned_user_id', 'id_number', 'vat_number', - 'work_phone', + 'phone', 'address1', 'address2', 'city', diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index d55d3495459d..cf3ea2df3802 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -50,6 +50,11 @@ class TaskRepository extends BaseRepository { $task->fill($data); + + if(!$task->start_time) + $task->start_time = $task->calcStartTime(); + + $task->duration = $task->calcDuration(); $task->save(); if (array_key_exists('documents', $data)) { diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 4ec63141df4c..da1393e21409 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -113,6 +113,9 @@ class InvoiceService { $this->invoice = (new UpdateBalance($this->invoice, $balance_adjustment))->run(); + if((int)$this->invoice->balance == 0) + $this->invoice->next_send_date = null; + return $this; } diff --git a/app/Transformers/CompanyTransformer.php b/app/Transformers/CompanyTransformer.php index 258b4dac9e36..20c35e05621b 100644 --- a/app/Transformers/CompanyTransformer.php +++ b/app/Transformers/CompanyTransformer.php @@ -155,6 +155,7 @@ class CompanyTransformer extends EntityTransformer 'invoice_task_timelog' => (bool) $company->invoice_task_timelog, 'auto_start_tasks' => (bool) $company->auto_start_tasks, 'invoice_task_documents' => (bool) $company->invoice_task_documents, + 'show_tasks_table' => (bool) $company->show_tasks_table, 'use_credits_payment' => 'always', //todo remove ]; } diff --git a/app/Transformers/ExpenseTransformer.php b/app/Transformers/ExpenseTransformer.php index e3278bd2b8ca..3dba3db520a9 100644 --- a/app/Transformers/ExpenseTransformer.php +++ b/app/Transformers/ExpenseTransformer.php @@ -78,8 +78,8 @@ class ExpenseTransformer extends EntityTransformer 'public_notes' => (string) $expense->public_notes ?: '', 'transaction_reference' => (string) $expense->transaction_reference ?: '', 'transaction_id' => (string) $expense->transaction_id ?: '', - //'date' => $expense->date ?: '', - 'expense_date' => $expense->date ?: '', + 'date' => $expense->date ?: '', + //'expense_date' => $expense->date ?: '', 'number' => (string)$expense->number ?: '', 'payment_date' => $expense->payment_date ?: '', 'custom_value1' => $expense->custom_value1 ?: '', diff --git a/database/migrations/2020_10_29_001541_vendors_phone_column.php b/database/migrations/2020_10_29_001541_vendors_phone_column.php new file mode 100644 index 000000000000..f1cec4e9a616 --- /dev/null +++ b/database/migrations/2020_10_29_001541_vendors_phone_column.php @@ -0,0 +1,30 @@ +renameColumn('work_phone', 'phone'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +}