diff --git a/app/commands/SendRecurringInvoices.php b/app/commands/SendRecurringInvoices.php index 93e4a3837195..926e89dda770 100755 --- a/app/commands/SendRecurringInvoices.php +++ b/app/commands/SendRecurringInvoices.php @@ -40,7 +40,8 @@ class SendRecurringInvoices extends Command { $invoice->client_id = $recurInvoice->client_id; $invoice->recurring_invoice_id = $recurInvoice->id; $invoice->invoice_number = $recurInvoice->account->getNextInvoiceNumber(); - $invoice->total = $recurInvoice->total; + $invoice->amount = $recurInvoice->amount; + $invoice->currency_id = $recurInvoice->currency_id; $invoice->invoice_date = new DateTime(); $invoice->due_date = new DateTime(); $invoice->save(); diff --git a/app/controllers/ActivityController.php b/app/controllers/ActivityController.php index fe006a653c18..712d929d80b3 100755 --- a/app/controllers/ActivityController.php +++ b/app/controllers/ActivityController.php @@ -4,12 +4,18 @@ class ActivityController extends \BaseController { public function getDatatable($clientPublicId) { - $clientId = Client::getPrivateId($clientPublicId); + $query = DB::table('activities') + ->join('clients', 'clients.id', '=', 'activities.client_id') + ->where('clients.public_id', '=', $clientPublicId) + ->where('activities.account_id', '=', Auth::user()->account_id) + ->select('activities.message', 'activities.created_at', 'activities.currency_id', 'activities.balance', 'activities.adjustment'); + - return Datatable::collection(Activity::scope()->where('client_id','=',$clientId)->get()) + return Datatable::query($query) ->addColumn('date', function($model) { return Utils::timestampToDateTimeString(strtotime($model->created_at)); }) ->addColumn('message', function($model) { return $model->message; }) - ->addColumn('balance', function($model) { return Utils::formatMoney($model->balance, $model->account->currency_id); }) + ->addColumn('balance', function($model) { return Utils::formatMoney($model->balance, $model->currency_id); }) + ->addColumn('adjustment', function($model) { return $model->adjustment != 0 ? Utils::formatMoney($model->adjustment, $model->currency_id) : ''; }) ->orderColumns('date') ->make(); } diff --git a/app/controllers/ClientController.php b/app/controllers/ClientController.php index a8c778226c47..8deb38eb2406 100755 --- a/app/controllers/ClientController.php +++ b/app/controllers/ClientController.php @@ -15,7 +15,7 @@ class ClientController extends \BaseController { return View::make('list', array( 'entityType'=>ENTITY_CLIENT, 'title' => '- Clients', - 'columns'=>['checkbox', 'Client', 'Contact', 'Date Created', 'Email', 'Phone', 'Last Login', 'Balance', 'Action'] + 'columns'=>['checkbox', 'Client', 'Contact', 'Email', 'Date Created', 'Phone', 'Last Login', 'Balance', 'Action'] )); } @@ -46,9 +46,9 @@ class ClientController extends \BaseController { return Datatable::query($query) ->addColumn('checkbox', function($model) { return ''; }) ->addColumn('name', function($model) { return link_to('clients/' . $model->public_id, $model->name); }) - ->addColumn('first_name', function($model) { return $model->first_name . ' ' . $model->last_name; }) + ->addColumn('first_name', function($model) { return link_to('clients/' . $model->public_id, $model->first_name . ' ' . $model->last_name); }) + ->addColumn('email', function($model) { return link_to('clients/' . $model->public_id, $model->email); }) ->addColumn('created_at', function($model) { return Utils::timestampToDateString(strtotime($model->created_at)); }) - ->addColumn('email', function($model) { return $model->email ? HTML::mailto($model->email, $model->email) : ''; }) ->addColumn('work_phone', function($model) { return Utils::formatPhoneNumber($model->work_phone); }) ->addColumn('last_login', function($model) { return Utils::timestampToDateString($model->last_login); }) ->addColumn('balance', function($model) { return Utils::formatMoney($model->balance, $model->currency_id); }) @@ -88,6 +88,7 @@ class ClientController extends \BaseController { 'title' => '- New Client', 'clientSizes' => ClientSize::orderBy('id')->get(), 'clientIndustries' => ClientIndustry::orderBy('name')->get(), + 'currencies' => Currency::orderBy('name')->get(), 'countries' => Country::orderBy('name')->get()); return View::make('clients.edit', $data); @@ -117,7 +118,7 @@ class ClientController extends \BaseController { $data = array( 'client' => $client, 'title' => '- ' . $client->name, - 'hasRecurringInvoices' => Invoice::scope()->where('frequency_id', '>', '0')->whereClientId($client->id)->count() > 0 + 'hasRecurringInvoices' => Invoice::scope()->where('is_recurring', '=', true)->whereClientId($client->id)->count() > 0 ); return View::make('clients.show', $data); @@ -158,7 +159,7 @@ class ClientController extends \BaseController { private function save($publicId = null) { $rules = array( - 'name' => 'required' + 'email' => 'required' ); $validator = Validator::make(Input::all(), $rules); @@ -182,7 +183,7 @@ class ClientController extends \BaseController { $client->state = trim(Input::get('state')); $client->postal_code = trim(Input::get('postal_code')); $client->country_id = Input::get('country_id') ? Input::get('country_id') : null; - $client->notes = trim(Input::get('notes')); + $client->private_notes = trim(Input::get('private_notes')); $client->client_size_id = Input::get('client_size_id') ? Input::get('client_size_id') : null; $client->client_industry_id = Input::get('client_industry_id') ? Input::get('client_industry_id') : null; $client->currency_id = Input::get('currency_id') ? Input::get('currency_id') : null; diff --git a/app/controllers/CreditController.php b/app/controllers/CreditController.php index 5c83cb4907ab..e435f606f746 100755 --- a/app/controllers/CreditController.php +++ b/app/controllers/CreditController.php @@ -20,10 +20,12 @@ class CreditController extends \BaseController { { $query = DB::table('credits') ->join('clients', 'clients.id', '=','credits.client_id') + ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->where('clients.account_id', '=', Auth::user()->account_id) ->where('clients.deleted_at', '=', null) ->where('credits.deleted_at', '=', null) - ->select('credits.public_id', 'clients.name as client_name', 'clients.public_id as client_public_id', 'credits.amount', 'credits.credit_date', 'credits.currency_id'); + ->where('contacts.is_primary', '=', true) + ->select('credits.public_id', 'clients.name as client_name', 'clients.public_id as client_public_id', 'credits.amount', 'credits.credit_date', 'credits.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email'); if ($clientPublicId) { $query->where('clients.public_id', '=', $clientPublicId); @@ -42,7 +44,7 @@ class CreditController extends \BaseController { if (!$clientPublicId) { $table->addColumn('checkbox', function($model) { return ''; }) - ->addColumn('client_name', function($model) { return link_to('clients/' . $model->client_public_id, $model->client_name); }); + ->addColumn('client_name', function($model) { return link_to('clients/' . $model->client_public_id, Utils::getClientDisplayName($model)); }); } return $table->addColumn('amount', function($model){ return Utils::formatMoney($model->amount, $model->currency_id); }) @@ -68,19 +70,14 @@ class CreditController extends \BaseController { public function create($clientPublicId = null) { - $client = null; - if ($clientPublicId) { - $client = Client::scope($clientPublicId)->firstOrFail(); - } - $data = array( - 'client' => $client, + 'clientPublicId' => $clientPublicId, 'credit' => null, 'method' => 'POST', 'url' => 'credits', 'title' => '- New Credit', 'currencies' => Currency::orderBy('name')->get(), - 'clients' => Client::scope()->orderBy('name')->get()); + 'clients' => Client::scope()->with('contacts')->orderBy('name')->get()); return View::make('credits.edit', $data); } @@ -95,7 +92,7 @@ class CreditController extends \BaseController { 'url' => 'credits/' . $publicId, 'title' => '- Edit Credit', 'currencies' => Currency::orderBy('name')->get(), - 'clients' => Client::scope()->orderBy('name')->get()); + 'clients' => Client::scope()->with('contacts')->orderBy('name')->get()); return View::make('credit.edit', $data); } diff --git a/app/controllers/InvoiceController.php b/app/controllers/InvoiceController.php index d0387a4cb034..b45e4b6cd97c 100755 --- a/app/controllers/InvoiceController.php +++ b/app/controllers/InvoiceController.php @@ -51,7 +51,7 @@ class InvoiceController extends \BaseController { $table->addColumn('invoice_number', function($model) { return link_to('invoices/' . $model->public_id . '/edit', $model->invoice_number); }); if (!$clientPublicId) { - $table->addColumn('client', function($model) { return link_to('clients/' . $model->client_public_id, $model->client_name); }); + $table->addColumn('client', function($model) { return link_to('clients/' . $model->client_public_id, Utils::getClientDisplayName($model)); }); } return $table->addColumn('invoice_date', function($model) { return Utils::fromSqlDate($model->invoice_date); }) @@ -89,7 +89,7 @@ class InvoiceController extends \BaseController { $table->addColumn('frequency', function($model) { return link_to('invoices/' . $model->public_id, $model->frequency); }); if (!$clientPublicId) { - $table->addColumn('client', function($model) { return link_to('clients/' . $model->client_public_id, $model->client_name); }); + $table->addColumn('client', function($model) { return link_to('clients/' . $model->client_public_id, Utils::getClientDisplayName($model)); }); } return $table->addColumn('start_date', function($model) { return Utils::fromSqlDate($model->start_date); }) @@ -220,7 +220,7 @@ class InvoiceController extends \BaseController { $payment = Payment::createNew(); $payment->invitation_id = $invitation->id; $payment->invoice_id = $invoice->id; - $payment->amount = $invoice->amount; + $payment->amount = $invoice->amount; $payment->client_id = $invoice->client_id; //$payment->contact_id = 0; // TODO_FIX $payment->transaction_reference = $ref; @@ -384,11 +384,9 @@ class InvoiceController extends \BaseController { return InvoiceController::bulk(); } - $input = json_decode(Input::get('data')); - $inputClient = $input->client; - $inputClient->name = trim($inputClient->name); + $input = json_decode(Input::get('data')); - if (!$inputClient->name) + if (!$input->client->contacts[0]->email) { return Redirect::to('invoices/create') ->withInput(); @@ -521,7 +519,7 @@ class InvoiceController extends \BaseController { $invoice = Invoice::with('invoice_items')->scope($publicId)->firstOrFail(); $clone = Invoice::createNew(); - foreach (['client_id', 'discount', 'invoice_date', 'due_date', 'is_recurring', 'frequency_id', 'start_date', 'end_date', 'notes'] as $field) + foreach (['client_id', 'discount', 'invoice_date', 'due_date', 'is_recurring', 'frequency_id', 'start_date', 'end_date', 'terms', 'currency_id'] as $field) { $clone->$field = $invoice->$field; } @@ -537,7 +535,7 @@ class InvoiceController extends \BaseController { { $cloneItem = InvoiceItem::createNew(); - foreach (['product_id', 'product_key', 'notes', 'cost', 'qty'] as $field) + foreach (['product_id', 'product_key', 'notes', 'cost', 'qty', 'tax_name', 'tax_rate'] as $field) { $cloneItem->$field = $item->$field; } diff --git a/app/controllers/PaymentController.php b/app/controllers/PaymentController.php index 51897acee42c..300419d9ae86 100755 --- a/app/controllers/PaymentController.php +++ b/app/controllers/PaymentController.php @@ -16,10 +16,12 @@ class PaymentController extends \BaseController $query = DB::table('payments') ->join('clients', 'clients.id', '=','payments.client_id') ->leftJoin('invoices', 'invoices.id', '=','payments.invoice_id') + ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->where('payments.account_id', '=', Auth::user()->account_id) ->where('payments.deleted_at', '=', null) ->where('clients.deleted_at', '=', null) - ->select('payments.public_id', 'payments.transaction_reference', 'clients.name as client_name', 'clients.public_id as client_public_id', 'payments.amount', 'payments.payment_date', 'invoices.public_id as invoice_public_id', 'invoices.invoice_number', 'payments.currency_id'); + ->where('contacts.is_primary', '=', true) + ->select('payments.public_id', 'payments.transaction_reference', 'clients.name as client_name', 'clients.public_id as client_public_id', 'payments.amount', 'payments.payment_date', 'invoices.public_id as invoice_public_id', 'invoices.invoice_number', 'payments.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email'); if ($clientPublicId) { $query->where('clients.public_id', '=', $clientPublicId); @@ -43,7 +45,7 @@ class PaymentController extends \BaseController $table->addColumn('transaction_reference', function($model) { return $model->transaction_reference ? $model->transaction_reference : 'Manual entry'; }); if (!$clientPublicId) { - $table->addColumn('client_name', function($model) { return link_to('clients/' . $model->client_public_id, $model->client_name); }); + $table->addColumn('client_name', function($model) { return link_to('clients/' . $model->client_public_id, Utils::getClientDisplayName($model)); }); } return $table->addColumn('invoice_number', function($model) { return $model->invoice_public_id ? link_to('invoices/' . $model->invoice_public_id . '/edit', $model->invoice_number) : ''; }) @@ -70,21 +72,16 @@ class PaymentController extends \BaseController public function create($clientPublicId = 0) { - $client = null; - if ($clientPublicId) { - $client = Client::scope($clientPublicId)->firstOrFail(); - } - $data = array( - 'client' => $client, + 'clientPublicId' => $clientPublicId, 'invoice' => null, - 'invoices' => Invoice::with('client')->scope()->orderBy('invoice_number')->get(), + 'invoices' => Invoice::scope()->with('client')->orderBy('invoice_number')->get(), 'payment' => null, 'method' => 'POST', 'url' => 'payments', 'title' => '- New Payment', 'currencies' => Currency::orderBy('name')->get(), - 'clients' => Client::scope()->orderBy('name')->get()); + 'clients' => Client::scope()->with('contacts')->orderBy('name')->get()); return View::make('payments.edit', $data); } @@ -95,13 +92,13 @@ class PaymentController extends \BaseController $data = array( 'client' => null, 'invoice' => null, - 'invoices' => Invoice::scope()->orderBy('invoice_number')->get(array('public_id','invoice_number')), + 'invoices' => Invoice::scope()->with('client')->orderBy('invoice_number')->get(array('public_id','invoice_number')), 'payment' => $payment, 'method' => 'PUT', 'url' => 'payments/' . $publicId, 'title' => '- Edit Payment', 'currencies' => Currency::orderBy('name')->get(), - 'clients' => Client::scope()->orderBy('name')->get()); + 'clients' => Client::scope()->with('contacts')->orderBy('name')->get()); return View::make('payments.edit', $data); } diff --git a/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php b/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php index d2e3e5c84a6e..b018da3b47d0 100755 --- a/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php +++ b/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php @@ -165,7 +165,7 @@ class ConfideSetupUsersTable extends Migration { $t->boolean('confirmed')->default(false); $t->integer('theme_id'); - $t->boolean('notify_sent')->default(false); + $t->boolean('notify_sent')->default(true); $t->boolean('notify_viewed')->default(false); $t->boolean('notify_paid')->default(true); @@ -212,7 +212,7 @@ class ConfideSetupUsersTable extends Migration { $t->string('postal_code'); $t->unsignedInteger('country_id')->nullable(); $t->string('work_phone'); - $t->text('notes'); + $t->text('private_notes'); $t->decimal('balance', 13, 4); $t->decimal('paid_to_date', 13, 4); $t->timestamp('last_login')->nullable(); @@ -285,6 +285,7 @@ class ConfideSetupUsersTable extends Migration { $t->date('invoice_date')->nullable(); $t->date('due_date')->nullable(); $t->text('terms'); + $t->text('public_notes'); $t->boolean('is_deleted'); $t->boolean('is_recurring'); $t->unsignedInteger('frequency_id'); diff --git a/app/libraries/utils.php b/app/libraries/utils.php index f541b40e6445..15620ac3f1e0 100755 --- a/app/libraries/utils.php +++ b/app/libraries/utils.php @@ -246,4 +246,20 @@ class Utils return ucwords(str_replace('_', ' ', $entityType)); } + public static function getClientDisplayName($model) + { + if ($model->client_name) + { + return $model->client_name; + } + else if ($model->first_name || $model->last_name) + { + return $model->first_name . ' ' . $model->last_name; + } + else + { + return $model->email; + } + } + } \ No newline at end of file diff --git a/app/models/Activity.php b/app/models/Activity.php index 82e52d96118b..4e6e37193f97 100755 --- a/app/models/Activity.php +++ b/app/models/Activity.php @@ -5,16 +5,17 @@ define("ACTIVITY_TYPE_CREATE_CLIENT", 1); define("ACTIVITY_TYPE_ARCHIVE_CLIENT", 2); define("ACTIVITY_TYPE_DELETE_CLIENT", 3); define("ACTIVITY_TYPE_CREATE_INVOICE", 4); -define("ACTIVITY_TYPE_EMAIL_INVOICE", 5); -define("ACTIVITY_TYPE_VIEW_INVOICE", 6); -define("ACTIVITY_TYPE_ARCHIVE_INVOICE", 7); -define("ACTIVITY_TYPE_DELETE_INVOICE", 8); -define("ACTIVITY_TYPE_CREATE_PAYMENT", 9); -define("ACTIVITY_TYPE_ARCHIVE_PAYMENT", 10); -define("ACTIVITY_TYPE_DELETE_PAYMENT", 11); -define("ACTIVITY_TYPE_CREATE_CREDIT", 12); -define("ACTIVITY_TYPE_ARCHIVE_CREDIT", 13); -define("ACTIVITY_TYPE_DELETE_CREDIT", 14); +define("ACTIVITY_TYPE_UPDATE_INVOICE", 5); +define("ACTIVITY_TYPE_EMAIL_INVOICE", 6); +define("ACTIVITY_TYPE_VIEW_INVOICE", 7); +define("ACTIVITY_TYPE_ARCHIVE_INVOICE", 8); +define("ACTIVITY_TYPE_DELETE_INVOICE", 9); +define("ACTIVITY_TYPE_CREATE_PAYMENT", 10); +define("ACTIVITY_TYPE_ARCHIVE_PAYMENT", 11); +define("ACTIVITY_TYPE_DELETE_PAYMENT", 12); +define("ACTIVITY_TYPE_CREATE_CREDIT", 13); +define("ACTIVITY_TYPE_ARCHIVE_CREDIT", 14); +define("ACTIVITY_TYPE_DELETE_CREDIT", 15); class Activity extends Eloquent @@ -55,7 +56,6 @@ class Activity extends Eloquent $activity->client_id = $client->id; $activity->activity_type_id = ACTIVITY_TYPE_CREATE_CLIENT; $activity->message = Auth::user()->getFullName() . ' created client ' . link_to('clients/'.$client->public_id, $client->name); - $activity->save(); } @@ -65,6 +65,7 @@ class Activity extends Eloquent $activity->client_id = $client->id; $activity->activity_type_id = ACTIVITY_TYPE_ARCHIVE_CLIENT; $activity->message = Auth::user()->getFullName() . ' archived client ' . $client->name; + $activity->balance = $client->balance; $activity->save(); } @@ -72,9 +73,12 @@ class Activity extends Eloquent { $userName = Auth::check() ? Auth::user()->getFullName() : 'System'; - if ($invoice->is_recurring) { + if ($invoice->is_recurring) + { $message = $userName . ' created ' . link_to('invoices/'.$invoice->public_id, 'recuring invoice'); - } else { + } + else + { $message = $userName . ' created invoice ' . link_to('invoices/'.$invoice->public_id, $invoice->invoice_number); } @@ -84,6 +88,7 @@ class Activity extends Eloquent $activity->currency_id = $invoice->currency_id; $activity->activity_type_id = ACTIVITY_TYPE_CREATE_INVOICE; $activity->message = $message; + $activity->balance = $invoice->client->balance; $activity->save(); } @@ -94,11 +99,22 @@ class Activity extends Eloquent $activity->client_id = $invoice->client_id; $activity->activity_type_id = ACTIVITY_TYPE_ARCHIVE_INVOICE; $activity->message = Auth::user()->getFullName() . ' archived invoice ' . $invoice->invoice_number; + $activity->balance = $invoice->client->balance; $activity->save(); } public static function emailInvoice($invitation) { + $adjustment = 0; + + if (!$invitation->invoice->isSent()) + { + $adjustment = $invitation->invoice->amount; + $client = $invitation->invoice->client; + $client->balance = $client->balance + $adjustment; + $client->save(); + } + $userName = Auth::check() ? Auth::user()->getFullName() : 'System'; $activity = Activity::getBlank($invitation); $activity->client_id = $invitation->invoice->client_id; @@ -106,11 +122,45 @@ class Activity extends Eloquent $activity->contact_id = $invitation->contact_id; $activity->activity_type_id = ACTIVITY_TYPE_EMAIL_INVOICE; $activity->message = $userName . ' emailed invoice ' . link_to('invoices/'.$invitation->invoice->public_id, $invitation->invoice->invoice_number) . ' to ' . $invitation->contact->getFullName(); + $activity->balance = $invitation->invoice->client->balance; + $activity->adjustment = $adjustment; $activity->save(); } - + + public static function updateInvoice($invoice) + { + if ($invoice->invoice_status_id < INVOICE_STATUS_SENT) + { + return; + } + + $diff = floatval($invoice->amount) - floatval($invoice->getOriginal('amount')); + + if ($diff == 0) + { + return; + } + + $client = $invoice->client; + $client->balance = $client->balance + $diff; + $client->save(); + + $activity = Activity::getBlank($invoice); + $activity->client_id = $invoice->client_id; + $activity->invoice_id = $invoice->id; + $activity->activity_type_id = ACTIVITY_TYPE_UPDATE_INVOICE; + $activity->message = Auth::user()->getFullName() . ' updated invoice ' . link_to('invoices/'.$invoice->public_id, $invoice->invoice_number); + $activity->balance = $client->balance; + $activity->adjustment = $diff; + $activity->save(); + } + public static function createPayment($payment) { + $client = $payment->client; + $client->balance = $client->balance - $payment->amount; + $client->save(); + if (Auth::check()) { $activity = Activity::getBlank(); @@ -130,23 +180,28 @@ class Activity extends Eloquent $activity->client_id = $payment->client_id; $activity->currency_id = $payment->currency_id; $activity->activity_type_id = ACTIVITY_TYPE_CREATE_PAYMENT; + $activity->balance = $client->balance; + $activity->adjustment = $payment->amount * -1; $activity->save(); } - public static function createCredit($credit) { + $client = $credit->client; + $client->balance = $client->balance - $credit->amount; + $client->save(); + $activity = Activity::getBlank(); $activity->message = Auth::user()->getFullName() . ' created credit'; $activity->credit_id = $credit->id; $activity->client_id = $credit->client_id; $activity->currency_id = $credit->currency_id; $activity->activity_type_id = ACTIVITY_TYPE_CREATE_CREDIT; + $activity->balance = $client->balance; + $activity->adjustment = $credit->amount * -1; $activity->save(); } - - public static function archivePayment($payment) { $activity = Activity::getBlank(); @@ -154,6 +209,7 @@ class Activity extends Eloquent $activity->client_id = $invoice->client_id; $activity->activity_type_id = ACTIVITY_TYPE_ARCHIVE_PAYMENT; $activity->message = Auth::user()->getFullName() . ' archived payment'; + $activity->balance = $payment->client->balance; $activity->save(); } @@ -168,6 +224,7 @@ class Activity extends Eloquent $activity->invoice_id = $invitation->invoice_id; $activity->activity_type_id = ACTIVITY_TYPE_VIEW_INVOICE; $activity->message = $invitation->contact->getFullName() . ' viewed invoice ' . link_to('invoices/'.$invitation->invoice->public_id, $invitation->invoice->invoice_number); + $activity->balance = $invitation->invoice->client->balance; $activity->save(); } } \ No newline at end of file diff --git a/app/models/Client.php b/app/models/Client.php index c1f308a92ca1..5372a7b5f112 100755 --- a/app/models/Client.php +++ b/app/models/Client.php @@ -2,7 +2,7 @@ class Client extends EntityModel { - protected $hidden = array('id', 'account_id', 'created_at', 'updated_at', 'deleted_at', 'notes', 'last_login'); + protected $hidden = array('id', 'account_id', 'created_at', 'updated_at', 'deleted_at', 'private_notes', 'last_login'); public static $fieldName = 'Client - Name'; public static $fieldPhone = 'Client - Phone'; diff --git a/app/models/Contact.php b/app/models/Contact.php index 9d417a0a092f..38760083da2c 100755 --- a/app/models/Contact.php +++ b/app/models/Contact.php @@ -35,6 +35,11 @@ class Contact extends EntityModel public function getFullName() { + if (!$this->first_name && !$this->last_name) + { + return $this->email; + } + $fullName = $this->first_name . ' ' . $this->last_name; if ($fullName == ' ') diff --git a/app/models/Invitation.php b/app/models/Invitation.php index 72f9196de7b7..b556b1c7ae60 100755 --- a/app/models/Invitation.php +++ b/app/models/Invitation.php @@ -18,9 +18,4 @@ class Invitation extends EntityModel { return $this->belongsTo('User'); } -} - -Invitation::created(function($invitation) -{ - Activity::emailInvoice($invitation); -}); \ No newline at end of file +} \ No newline at end of file diff --git a/app/models/Invoice.php b/app/models/Invoice.php index 274df9f0e5d9..5fc3d8d5674c 100755 --- a/app/models/Invoice.php +++ b/app/models/Invoice.php @@ -95,4 +95,9 @@ class Invoice extends EntityModel Invoice::created(function($invoice) { Activity::createInvoice($invoice); +}); + +Invoice::updating(function($invoice) +{ + Activity::updateInvoice($invoice); }); \ No newline at end of file diff --git a/app/ninja/mailers/ContactMailer.php b/app/ninja/mailers/ContactMailer.php index e7bfaf0866af..4e41c0ca0e8f 100755 --- a/app/ninja/mailers/ContactMailer.php +++ b/app/ninja/mailers/ContactMailer.php @@ -5,6 +5,7 @@ use Contact; use Invitation; use URL; use Auth; +use Activity; class ContactMailer extends Mailer { @@ -20,8 +21,10 @@ class ContactMailer extends Mailer { $invitation->save(); $this->sendTo($invitation->contact->email, $subject, $view, $data); - } + Activity::emailInvoice($invitation); + } + if (!$invoice->isSent()) { $invoice->invoice_status_id = INVOICE_STATUS_SENT; diff --git a/app/ninja/repositories/AccountRepository.php b/app/ninja/repositories/AccountRepository.php index 442296485498..fd22d39bf971 100755 --- a/app/ninja/repositories/AccountRepository.php +++ b/app/ninja/repositories/AccountRepository.php @@ -9,13 +9,14 @@ class AccountRepository { $clients = \DB::table('clients') ->where('clients.deleted_at', '=', null) + ->whereRaw("clients.name <> ''") ->select(\DB::raw("'Clients' as type, clients.public_id, clients.name, '' as token")); $contacts = \DB::table('clients') ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->where('clients.deleted_at', '=', null) - ->whereRaw("CONCAT(contacts.first_name, contacts.last_name) <> ''") - ->select(\DB::raw("'Contacts' as type, clients.public_id, CONCAT(contacts.first_name, ' ', contacts.last_name, ': ', clients.name) as name, '' as token")); + ->whereRaw("CONCAT(contacts.first_name, contacts.last_name, contacts.email) <> ''") + ->select(\DB::raw("'Contacts' as type, clients.public_id, CONCAT(contacts.first_name, ' ', contacts.last_name, ' ', contacts.email) as name, '' as token")); $invoices = \DB::table('clients') ->join('invoices', 'invoices.client_id', '=', 'clients.id') diff --git a/app/ninja/repositories/ClientRepository.php b/app/ninja/repositories/ClientRepository.php index 5511a33dc6fb..d3a62975d2c8 100755 --- a/app/ninja/repositories/ClientRepository.php +++ b/app/ninja/repositories/ClientRepository.php @@ -27,7 +27,7 @@ class ClientRepository $client->state = trim($data['state']); $client->postal_code = trim($data['postal_code']); $client->country_id = $data['country_id'] ? $data['country_id'] : null; - $client->notes = trim($data['notes']); + $client->private_notes = trim($data['private_notes']); $client->client_size_id = $data['client_size_id'] ? $data['client_size_id'] : null; $client->client_industry_id = $data['client_industry_id'] ? $data['client_industry_id'] : null; $client->currency_id = $data['currency_id'] ? $data['currency_id'] : null; diff --git a/app/ninja/repositories/InvoiceRepository.php b/app/ninja/repositories/InvoiceRepository.php index a7beba4d971d..8f1703c43b4d 100755 --- a/app/ninja/repositories/InvoiceRepository.php +++ b/app/ninja/repositories/InvoiceRepository.php @@ -13,11 +13,13 @@ class InvoiceRepository $query = \DB::table('invoices') ->join('clients', 'clients.id', '=','invoices.client_id') ->join('invoice_statuses', 'invoice_statuses.id', '=', 'invoices.invoice_status_id') + ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->where('invoices.account_id', '=', $accountId) ->where('invoices.deleted_at', '=', null) ->where('clients.deleted_at', '=', null) - ->where('invoices.is_recurring', '=', false) - ->select('clients.public_id as client_public_id', 'invoice_number', 'clients.name as client_name', 'invoices.public_id', 'amount', 'invoices.balance', 'invoice_date', 'due_date', 'invoice_statuses.name as invoice_status_name', 'invoices.currency_id'); + ->where('invoices.is_recurring', '=', false) + ->where('contacts.is_primary', '=', true) + ->select('clients.public_id as client_public_id', 'invoice_number', 'clients.name as client_name', 'invoices.public_id', 'amount', 'invoices.balance', 'invoice_date', 'due_date', 'invoice_statuses.name as invoice_status_name', 'invoices.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email'); if ($clientPublicId) { @@ -42,10 +44,12 @@ class InvoiceRepository $query = \DB::table('invoices') ->join('clients', 'clients.id', '=','invoices.client_id') ->join('frequencies', 'frequencies.id', '=', 'invoices.frequency_id') + ->join('contacts', 'contacts.client_id', '=', 'clients.id') ->where('invoices.account_id', '=', $accountId) ->where('invoices.deleted_at', '=', null) ->where('invoices.is_recurring', '=', true) - ->select('clients.public_id as client_public_id', 'clients.name as client_name', 'invoices.public_id', 'amount', 'frequencies.name as frequency', 'start_date', 'end_date', 'invoices.currency_id'); + ->where('contacts.is_primary', '=', true) + ->select('clients.public_id as client_public_id', 'clients.name as client_name', 'invoices.public_id', 'amount', 'frequencies.name as frequency', 'start_date', 'end_date', 'invoices.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email'); if ($clientPublicId) { @@ -87,6 +91,7 @@ class InvoiceRepository $invoice->start_date = Utils::toSqlDate($data['start_date']); $invoice->end_date = Utils::toSqlDate($data['end_date']); $invoice->terms = trim($data['terms']); + $invoice->public_notes = trim($data['public_notes']); $invoice->po_number = trim($data['po_number']); $invoice->currency_id = $data['currency_id']; @@ -108,6 +113,7 @@ class InvoiceRepository } $invoice->amount = $total; + $invoice->balance = $total; $invoice->save(); foreach ($data['invoice_items'] as $item) diff --git a/app/views/clients/edit.blade.php b/app/views/clients/edit.blade.php index 7ead5e69ed74..31444eb2c73a 100755 --- a/app/views/clients/edit.blade.php +++ b/app/views/clients/edit.blade.php @@ -2,7 +2,7 @@ @section('onReady') - $('input#name').focus(); + $('input#first_name').focus(); @stop @section('content') @@ -10,8 +10,7 @@ {{ Former::open($url)->addClass('col-md-10 col-md-offset-1 main_form')->method($method)->rules(array( - 'name' => 'required', - 'email' => 'email' + 'email' => 'email|required' )); }} @if ($client) @@ -20,25 +19,6 @@
-
- - {{ Former::legend('Organization') }} - {{ Former::text('name') }} - {{ Former::text('website') }} - {{ Former::text('work_phone')->label('Phone') }} - - - {{ Former::legend('Address') }} - {{ Former::text('address1')->label('Street') }} - {{ Former::text('address2')->label('Apt/Floor') }} - {{ Former::text('city') }} - {{ Former::text('state') }} - {{ Former::text('postal_code') }} - {{ Former::select('country_id')->addOption('','')->label('Country') - ->fromQuery($countries, 'name', 'id')->select($client ? $client->country_id : '') }} - - -
{{ Former::legend('Contacts') }} @@ -70,7 +50,28 @@ ->fromQuery($clientSizes, 'name', 'id')->select($client ? $client->client_size_id : '') }} {{ Former::select('client_industry_id')->addOption('','')->label('Industry') ->fromQuery($clientIndustries, 'name', 'id')->select($client ? $client->client_industry_id : '') }} - {{ Former::textarea('notes') }} + {{ Former::textarea('private_notes') }} + + +
+
+ + + {{ Former::legend('Organization') }} + {{ Former::text('name') }} + {{ Former::text('website') }} + {{ Former::text('work_phone')->label('Phone') }} + + + {{ Former::legend('Address') }} + {{ Former::text('address1')->label('Street') }} + {{ Former::text('address2')->label('Apt/Floor') }} + {{ Former::text('city') }} + {{ Former::text('state') }} + {{ Former::text('postal_code') }} + {{ Former::select('country_id')->addOption('','')->label('Country') + ->fromQuery($countries, 'name', 'id')->select($client ? $client->country_id : '') }} +
diff --git a/app/views/clients/show.blade.php b/app/views/clients/show.blade.php index bd9ce41c0625..d498c229a47b 100755 --- a/app/views/clients/show.blade.php +++ b/app/views/clients/show.blade.php @@ -62,8 +62,8 @@

Standing

-

$0.00 Paid to Date USD

-

$0.00 Balance USD

+

{{ Utils::formatMoney($client->paid_to_date, $client->currency_id); }} Paid to Date USD

+

{{ Utils::formatMoney($client->balance, $client->currency_id); }} Balance USD

@@ -81,7 +81,7 @@
{{ Datatable::table() - ->addColumn('Date', 'Message', 'Balance') + ->addColumn('Date', 'Message', 'Balance', 'Adjustment') ->setUrl(url('api/activities/'. $client->public_id)) ->setOptions('sPaginationType', 'bootstrap') ->setOptions('bFilter', false) diff --git a/app/views/credits/edit.blade.php b/app/views/credits/edit.blade.php index dd36b742e311..f92823a5e1b4 100755 --- a/app/views/credits/edit.blade.php +++ b/app/views/credits/edit.blade.php @@ -15,6 +15,8 @@ @if ($credit) {{ Former::populate($credit) }} + @else + {{ Former::populateField('credit_date', date('Y-m-d')) }} @endif @@ -27,11 +29,11 @@ {{ Former::legend('New Credit') }} @endif - {{ Former::select('client')->fromQuery($clients, 'name', 'public_id')->select($client ? $client->public_id : '')->addOption('', '')->addGroupClass('client-select') }} - {{ Former::select('currency_id')->addOption('','')->label('Currency') - ->fromQuery($currencies, 'name', 'id')->select(Session::get(SESSION_CURRENCY, DEFAULT_CURRENCY)) }} + {{ Former::select('client')->addOption('', '')->addGroupClass('client-select') }} {{ Former::text('amount') }} {{ Former::text('credit_date')->data_date_format(DEFAULT_DATE_PICKER_FORMAT) }} + {{ Former::select('currency_id')->addOption('','')->label('Currency') + ->fromQuery($currencies, 'name', 'id')->select(Session::get(SESSION_CURRENCY, DEFAULT_CURRENCY)) }}
@@ -48,10 +50,20 @@