mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-09 20:52:56 +01:00
Cleaning up the templates
This commit is contained in:
parent
9053be4976
commit
616df18b06
@ -47,9 +47,9 @@ return array(
|
||||
|
|
||||
|
|
||||
*/
|
||||
'login_form' => 'login',
|
||||
'login_form' => 'users.login',
|
||||
'signup_form' => 'confide::signup',
|
||||
'forgot_password_form' => 'confide::forgot_password',
|
||||
'forgot_password_form' => 'users.forgot_password',
|
||||
'reset_password_form' => 'confide::reset_password',
|
||||
|
||||
/*
|
||||
|
@ -31,6 +31,8 @@ class AccountController extends \BaseController {
|
||||
$user = new User;
|
||||
$user->password = $random;
|
||||
$account->users()->save($user);
|
||||
|
||||
Session::forget(RECENTLY_VIEWED);
|
||||
}
|
||||
|
||||
Auth::login($user, true);
|
||||
@ -188,6 +190,7 @@ class AccountController extends \BaseController {
|
||||
foreach ($row as $index => $value)
|
||||
{
|
||||
$field = $map[$index];
|
||||
$value = trim($value);
|
||||
|
||||
if ($field == Client::$fieldName)
|
||||
{
|
||||
@ -387,7 +390,7 @@ class AccountController extends \BaseController {
|
||||
$config = new stdClass;
|
||||
foreach ($fields as $field => $details)
|
||||
{
|
||||
$config->$field = Input::get($gateway->id.'_'.$field);
|
||||
$config->$field = trim(Input::get($gateway->id.'_'.$field));
|
||||
}
|
||||
|
||||
$accountGateway->config = json_encode($config);
|
||||
@ -417,21 +420,21 @@ class AccountController extends \BaseController {
|
||||
else
|
||||
{
|
||||
$account = Account::findOrFail(Auth::user()->account_id);
|
||||
$account->name = Input::get('name');
|
||||
$account->address1 = Input::get('address1');
|
||||
$account->address2 = Input::get('address2');
|
||||
$account->city = Input::get('city');
|
||||
$account->state = Input::get('state');
|
||||
$account->postal_code = Input::get('postal_code');
|
||||
$account->name = trim(Input::get('name'));
|
||||
$account->address1 = trim(Input::get('address1'));
|
||||
$account->address2 = trim(Input::get('address2'));
|
||||
$account->city = trim(Input::get('city'));
|
||||
$account->state = trim(Input::get('state'));
|
||||
$account->postal_code = trim(Input::get('postal_code'));
|
||||
$account->country_id = Input::get('country_id') ? Input::get('country_id') : null;
|
||||
$account->timezone_id = Input::get('timezone_id') ? Input::get('timezone_id') : null;
|
||||
$account->save();
|
||||
|
||||
$user = $account->users()->first();
|
||||
$user->first_name = Input::get('first_name');
|
||||
$user->last_name = Input::get('last_name');
|
||||
$user->email = Input::get('email');
|
||||
$user->phone = Input::get('phone');
|
||||
$user->first_name = trim(Input::get('first_name'));
|
||||
$user->last_name = trim(Input::get('last_name'));
|
||||
$user->email = trim(Input::get('email'));
|
||||
$user->phone = trim(Input::get('phone'));
|
||||
$user->save();
|
||||
|
||||
if (Input::get('timezone_id')) {
|
||||
@ -480,10 +483,10 @@ class AccountController extends \BaseController {
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
$user->first_name = Input::get('first_name');
|
||||
$user->last_name = Input::get('last_name');
|
||||
$user->email = Input::get('email');
|
||||
$user->password = Input::get('password');
|
||||
$user->first_name = trim(Input::get('first_name'));
|
||||
$user->last_name = trim(Input::get('last_name'));
|
||||
$user->email = trim(Input::get('email'));
|
||||
$user->password = trim(Input::get('password'));
|
||||
$user->registered = true;
|
||||
$user->save();
|
||||
|
||||
|
@ -92,7 +92,7 @@ class ClientController extends \BaseController {
|
||||
public function show($publicId)
|
||||
{
|
||||
$client = Client::scope($publicId)->with('contacts')->firstOrFail();
|
||||
trackViewed($client->name);
|
||||
trackViewed($client->name, ENTITY_CLIENT);
|
||||
|
||||
$data = array(
|
||||
'client' => $client,
|
||||
@ -149,14 +149,14 @@ class ClientController extends \BaseController {
|
||||
$client = Client::createNew();
|
||||
}
|
||||
|
||||
$client->name = Input::get('name');
|
||||
$client->work_phone = Input::get('work_phone');
|
||||
$client->address1 = Input::get('address1');
|
||||
$client->address2 = Input::get('address2');
|
||||
$client->city = Input::get('city');
|
||||
$client->state = Input::get('state');
|
||||
$client->notes = Input::get('notes');
|
||||
$client->postal_code = Input::get('postal_code');
|
||||
$client->name = trim(Input::get('name'));
|
||||
$client->work_phone = trim(Input::get('work_phone'));
|
||||
$client->address1 = trim(Input::get('address1'));
|
||||
$client->address2 = trim(Input::get('address2'));
|
||||
$client->city = trim(Input::get('city'));
|
||||
$client->state = trim(Input::get('state'));
|
||||
$client->notes = trim(Input::get('notes'));
|
||||
$client->postal_code = trim(Input::get('postal_code'));
|
||||
if (Input::get('country_id')) {
|
||||
$client->country_id = Input::get('country_id');
|
||||
}
|
||||
@ -177,10 +177,10 @@ class ClientController extends \BaseController {
|
||||
$record = Contact::createNew();
|
||||
}
|
||||
|
||||
$record->email = $contact->email;
|
||||
$record->first_name = $contact->first_name;
|
||||
$record->last_name = $contact->last_name;
|
||||
$record->phone = $contact->phone;
|
||||
$record->email = trim($contact->email);
|
||||
$record->first_name = trim($contact->first_name);
|
||||
$record->last_name = trim($contact->last_name);
|
||||
$record->phone = trim($contact->phone);
|
||||
$record->is_primary = $isPrimary;
|
||||
$isPrimary = false;
|
||||
|
||||
|
@ -114,7 +114,7 @@ class CreditController extends \BaseController {
|
||||
|
||||
$credit->client_id = Input::get('client');
|
||||
$credit->credit_date = toSqlDate(Input::get('credit_date'));
|
||||
$credit->amount = Input::get('amount');
|
||||
$credit->amount = floatval(Input::get('amount'));
|
||||
$credit->save();
|
||||
|
||||
$message = $publicId ? 'Successfully updated credit' : 'Successfully created credit';
|
||||
|
@ -6,6 +6,6 @@ class HomeController extends BaseController {
|
||||
|
||||
public function showWelcome()
|
||||
{
|
||||
return View::make('home.index');
|
||||
return View::make('splash');
|
||||
}
|
||||
}
|
@ -73,6 +73,11 @@ class InvoiceController extends \BaseController {
|
||||
$user = $invitation->user;
|
||||
$invoice = $invitation->invoice;
|
||||
|
||||
if ($invoice->invoice_status_id < INVOICE_STATUS_VIEWED) {
|
||||
$invoice->invoice_status_id = INVOICE_STATUS_VIEWED;
|
||||
$invoice->save();
|
||||
}
|
||||
|
||||
$now = Carbon::now()->toDateTimeString();
|
||||
|
||||
$invitation->viewed_date = $now;
|
||||
@ -84,7 +89,12 @@ class InvoiceController extends \BaseController {
|
||||
|
||||
Activity::viewInvoice($invitation);
|
||||
|
||||
return View::make('invoices.view')->with('invoice', $invoice);
|
||||
$data = array(
|
||||
'invoice' => $invoice,
|
||||
'invitation' => $invitation
|
||||
);
|
||||
|
||||
return View::make('invoices.view', $data);
|
||||
}
|
||||
|
||||
private function createGateway($accountGateway)
|
||||
@ -119,9 +129,9 @@ class InvoiceController extends \BaseController {
|
||||
);
|
||||
|
||||
$card = new CreditCard($data);
|
||||
|
||||
|
||||
return [
|
||||
'amount' => $invoice->getTotal(),
|
||||
'amount' => $invoice->total,
|
||||
'card' => $card,
|
||||
'currency' => 'USD',
|
||||
'returnUrl' => URL::to('complete'),
|
||||
@ -131,13 +141,14 @@ class InvoiceController extends \BaseController {
|
||||
|
||||
public function show_payment($invitationKey)
|
||||
{
|
||||
$invoice = Invoice::with('invoice_items', 'client.account.account_gateways.gateway')->where('invitation_key', '=', $invitationKey)->firstOrFail();
|
||||
$invitation = Invitation::with('invoice.invoice_items', 'invoice.client.account.account_gateways.gateway')->where('invitation_key', '=', $invitationKey)->firstOrFail();
|
||||
$invoice = $invitation->invoice;
|
||||
$accountGateway = $invoice->client->account->account_gateways[0];
|
||||
$gateway = InvoiceController::createGateway($accountGateway);
|
||||
|
||||
try
|
||||
{
|
||||
$details = InvoiceController::getPaymentDetails($invoice);
|
||||
$details = InvoiceController::getPaymentDetails($invoice);
|
||||
$response = $gateway->purchase($details)->send();
|
||||
$ref = $response->getTransactionReference();
|
||||
|
||||
@ -147,13 +158,17 @@ class InvoiceController extends \BaseController {
|
||||
exit('Sorry, there was an error processing your payment. Please try again later.');
|
||||
}
|
||||
|
||||
$payment = new Payment;
|
||||
$payment = Payment::createNew();
|
||||
$payment->invitation_id = $invitation->id;
|
||||
$payment->invoice_id = $invoice->id;
|
||||
$payment->account_id = $invoice->account_id;
|
||||
$payment->contact_id = 0; // TODO_FIX
|
||||
$payment->amount = $invoice->total;
|
||||
$payment->client_id = $invoice->client_id;
|
||||
//$payment->contact_id = 0; // TODO_FIX
|
||||
$payment->transaction_reference = $ref;
|
||||
$payment->save();
|
||||
|
||||
$invoice->balance = floatval($invoice->total) - floatval($paymount->amount);
|
||||
|
||||
if ($response->isSuccessful())
|
||||
{
|
||||
|
||||
@ -180,7 +195,7 @@ class InvoiceController extends \BaseController {
|
||||
$payerId = Request::query('PayerID');
|
||||
$token = Request::query('token');
|
||||
|
||||
$payment = Payment::with('invoice.invoice_items')->where('transaction_reference','=',$token)->firstOrFail();
|
||||
$payment = Payment::with('invitation', 'invoice.invoice_items')->where('transaction_reference','=',$token)->firstOrFail();
|
||||
$invoice = Invoice::with('client.account.account_gateways.gateway')->where('id', '=', $payment->invoice_id)->firstOrFail();
|
||||
$accountGateway = $invoice->client->account->account_gateways[0];
|
||||
$gateway = InvoiceController::createGateway($accountGateway);
|
||||
@ -195,11 +210,17 @@ class InvoiceController extends \BaseController {
|
||||
{
|
||||
$payment->payer_id = $payerId;
|
||||
$payment->transaction_reference = $ref;
|
||||
$payment->amount = $payment->invoice->getTotal();
|
||||
$payment->save();
|
||||
|
||||
if ($payment->amount >= $invoice->amount) {
|
||||
$invoice->invoice_status_id = INVOICE_STATUS_PAID;
|
||||
} else {
|
||||
$invoice->invoice_status_id = INVOICE_STATUS_PARTIAL;
|
||||
}
|
||||
$invoice->save();
|
||||
|
||||
Session::flash('message', 'Successfully applied payment');
|
||||
return Redirect::to('view/' . $payment->invoice->key);
|
||||
return Redirect::to('view/' . $payment->invitation->invitation_key);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -216,7 +237,7 @@ class InvoiceController extends \BaseController {
|
||||
public function edit($publicId)
|
||||
{
|
||||
$invoice = Invoice::scope($publicId)->with('account.country', 'client', 'invoice_items')->firstOrFail();
|
||||
trackViewed($invoice->invoice_number . ' - ' . $invoice->client->name);
|
||||
trackViewed($invoice->invoice_number . ' - ' . $invoice->client->name, ENTITY_INVOICE);
|
||||
|
||||
$data = array(
|
||||
'account' => $invoice->account,
|
||||
@ -271,7 +292,7 @@ class InvoiceController extends \BaseController {
|
||||
private function save($publicId = null)
|
||||
{
|
||||
$action = Input::get('action');
|
||||
|
||||
|
||||
if ($action == 'archive' || $action == 'delete')
|
||||
{
|
||||
return InvoiceController::bulk();
|
||||
@ -295,13 +316,13 @@ class InvoiceController extends \BaseController {
|
||||
if ($clientPublicId == "-1")
|
||||
{
|
||||
$client = Client::createNew();
|
||||
$client->name = Input::get('name');
|
||||
$client->work_phone = Input::get('work_phone');
|
||||
$client->address1 = Input::get('address1');
|
||||
$client->address2 = Input::get('address2');
|
||||
$client->city = Input::get('city');
|
||||
$client->state = Input::get('state');
|
||||
$client->postal_code = Input::get('postal_code');
|
||||
$client->name = trim(Input::get('name'));
|
||||
$client->work_phone = trim(Input::get('work_phone'));
|
||||
$client->address1 = trim(Input::get('address1'));
|
||||
$client->address2 = trim(Input::get('address2'));
|
||||
$client->city = trim(Input::get('city'));
|
||||
$client->state = trim(Input::get('state'));
|
||||
$client->postal_code = trim(Input::get('postal_code'));
|
||||
if (Input::get('country_id')) {
|
||||
$client->country_id = Input::get('country_id');
|
||||
}
|
||||
@ -310,10 +331,10 @@ class InvoiceController extends \BaseController {
|
||||
|
||||
$contact = Contact::createNew();
|
||||
$contact->is_primary = true;
|
||||
$contact->first_name = Input::get('first_name');
|
||||
$contact->last_name = Input::get('last_name');
|
||||
$contact->phone = Input::get('phone');
|
||||
$contact->email = Input::get('email');
|
||||
$contact->first_name = trim(Input::get('first_name'));
|
||||
$contact->last_name = trim(Input::get('last_name'));
|
||||
$contact->phone = trim(Input::get('phone'));
|
||||
$contact->email = trim(Input::get('email'));
|
||||
$client->contacts()->save($contact);
|
||||
}
|
||||
else
|
||||
@ -329,14 +350,17 @@ class InvoiceController extends \BaseController {
|
||||
$invoice = Invoice::createNew();
|
||||
}
|
||||
|
||||
$invoice->invoice_number = Input::get('invoice_number');
|
||||
$invoice->invoice_number = trim(Input::get('invoice_number'));
|
||||
$invoice->discount = 0;
|
||||
$invoice->invoice_date = toSqlDate(Input::get('invoice_date'));
|
||||
$invoice->due_date = toSqlDate(Input::get('due_date'));
|
||||
$invoice->notes = Input::get('notes');
|
||||
|
||||
$client->invoices()->save($invoice);
|
||||
|
||||
$items = json_decode(Input::get('items'));
|
||||
$total = 0;
|
||||
|
||||
foreach ($items as $item)
|
||||
{
|
||||
if (!isset($item->cost)) {
|
||||
@ -346,6 +370,22 @@ class InvoiceController extends \BaseController {
|
||||
$item->qty = 0;
|
||||
}
|
||||
|
||||
$total += intval($item->qty) * floatval($item->cost);
|
||||
}
|
||||
|
||||
if ($action == 'email' && $invoice->invoice_status_id == INVOICE_STATUS_DRAFT)
|
||||
{
|
||||
$invoice->invoice_status_id = INVOICE_STATUS_SENT;
|
||||
|
||||
$client->balance = $invoice->client->balance + $invoice->total;
|
||||
$client->save();
|
||||
}
|
||||
|
||||
$invoice->total = $total;
|
||||
$invoice->save();
|
||||
|
||||
foreach ($items as $item)
|
||||
{
|
||||
if (!$item->cost && !$item->qty && !$item->product_key && !$item->notes)
|
||||
{
|
||||
continue;
|
||||
@ -353,12 +393,12 @@ class InvoiceController extends \BaseController {
|
||||
|
||||
if ($item->product_key)
|
||||
{
|
||||
$product = Product::findProductByKey($item->product_key);
|
||||
$product = Product::findProductByKey(trim($item->product_key));
|
||||
|
||||
if (!$product)
|
||||
{
|
||||
$product = Product::createNew();
|
||||
$product->product_key = $item->product_key;
|
||||
$product->product_key = trim($item->product_key);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -372,14 +412,17 @@ class InvoiceController extends \BaseController {
|
||||
|
||||
$invoiceItem = InvoiceItem::createNew();
|
||||
$invoiceItem->product_id = isset($product) ? $product->id : null;
|
||||
$invoiceItem->product_key = $item->product_key;
|
||||
$invoiceItem->notes = $item->notes;
|
||||
$invoiceItem->cost = $item->cost;
|
||||
$invoiceItem->qty = $item->qty;
|
||||
$invoiceItem->product_key = trim($item->product_key);
|
||||
$invoiceItem->notes = trim($item->notes);
|
||||
$invoiceItem->cost = floatval($item->cost);
|
||||
$invoiceItem->qty = intval($item->qty);
|
||||
|
||||
$invoice->invoice_items()->save($invoiceItem);
|
||||
}
|
||||
|
||||
/*
|
||||
*/
|
||||
|
||||
if ($action == 'email')
|
||||
{
|
||||
$data = array('link' => URL::to('view') . '/' . $invoice->invoice_key);
|
||||
|
@ -123,7 +123,7 @@ class PaymentController extends \BaseController
|
||||
$payment->client_id = Input::get('client');
|
||||
$payment->invoice_id = $invoiceId;
|
||||
$payment->payment_date = toSqlDate(Input::get('payment_date'));
|
||||
$payment->amount = Input::get('amount');
|
||||
$payment->amount = floatval(Input::get('amount'));
|
||||
$payment->save();
|
||||
|
||||
$message = $publicId ? 'Successfully updated payment' : 'Successfully created payment';
|
||||
|
@ -74,8 +74,6 @@ class UserController extends BaseController {
|
||||
{
|
||||
if( Confide::user() )
|
||||
{
|
||||
// If user is logged, redirect to internal
|
||||
// page, change it to '/admin', '/dashboard' or something
|
||||
return Redirect::to('/');
|
||||
}
|
||||
else
|
||||
@ -94,7 +92,7 @@ class UserController extends BaseController {
|
||||
'email' => Input::get( 'email' ), // May be the username too
|
||||
'username' => Input::get( 'email' ), // so we have to pass both
|
||||
'password' => Input::get( 'password' ),
|
||||
'remember' => Input::get( 'remember' ),
|
||||
'remember' => true,
|
||||
);
|
||||
|
||||
// If you wish to only allow login from confirmed users, call logAttempt
|
||||
@ -102,12 +100,16 @@ class UserController extends BaseController {
|
||||
// logAttempt will check if the 'email' perhaps is the username.
|
||||
// Get the value from the config file instead of changing the controller
|
||||
if ( Confide::logAttempt( $input, Config::get('confide::signup_confirm') ) )
|
||||
{
|
||||
{
|
||||
$account = Account::findOrFail(Auth::user()->account_id);
|
||||
$account->last_login = Carbon::now()->toDateTimeString();
|
||||
$account->save();
|
||||
|
||||
// Redirect the user to the URL they were trying to access before
|
||||
// caught by the authentication filter IE Redirect::guest('user/login').
|
||||
// Otherwise fallback to '/'
|
||||
// Fix pull #145
|
||||
return Redirect::intended('/'); // change it to '/admin', '/dashboard' or something
|
||||
return Redirect::intended('/clients'); // change it to '/admin', '/dashboard' or something
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -118,18 +120,20 @@ class UserController extends BaseController {
|
||||
{
|
||||
$err_msg = Lang::get('confide::confide.alerts.too_many_attempts');
|
||||
}
|
||||
/*
|
||||
elseif( $user->checkUserExists( $input ) and ! $user->isConfirmed( $input ) )
|
||||
{
|
||||
$err_msg = Lang::get('confide::confide.alerts.not_confirmed');
|
||||
}
|
||||
*/
|
||||
else
|
||||
{
|
||||
$err_msg = Lang::get('confide::confide.alerts.wrong_credentials');
|
||||
}
|
||||
|
||||
return Redirect::action('UserController@login')
|
||||
->withInput(Input::except('password'))
|
||||
->with( 'error', $err_msg );
|
||||
return Redirect::action('UserController@login')
|
||||
->withInput(Input::except('password'))
|
||||
->with( 'error', $err_msg );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,6 +293,7 @@ class ConfideSetupUsersTable extends Migration {
|
||||
$t->unsignedInteger('account_id');
|
||||
$t->unsignedInteger('client_id');
|
||||
$t->unsignedInteger('contact_id')->nullable();
|
||||
$t->unsignedInteger('invitation_id')->nullable();
|
||||
$t->unsignedInteger('user_id')->nullable();
|
||||
$t->timestamps();
|
||||
$t->softDeletes();
|
||||
|
@ -40,7 +40,7 @@ class Activity extends Eloquent
|
||||
$activity = Activity::getBlank();
|
||||
$activity->client_id = $client->id;
|
||||
$activity->activity_type_id = ACTIVITY_TYPE_CREATE_CLIENT;
|
||||
$activity->message = Auth::user()->getFullName() . ' created client ' . link_to('clients/'.$client->id, $client->name);
|
||||
$activity->message = Auth::user()->getFullName() . ' created client ' . link_to('clients/'.$client->public_id, $client->name);
|
||||
|
||||
$activity->save();
|
||||
}
|
||||
@ -60,7 +60,7 @@ class Activity extends Eloquent
|
||||
$activity->invoice_id = $invoice->id;
|
||||
$activity->client_id = $invoice->client_id;
|
||||
$activity->activity_type_id = ACTIVITY_TYPE_CREATE_INVOICE;
|
||||
$activity->message = Auth::user()->getFullName() . ' created invoice ' . link_to('invoices/'.$invoice->id, $invoice->invoice_number);
|
||||
$activity->message = Auth::user()->getFullName() . ' created invoice ' . link_to('invoices/'.$invoice->public_id, $invoice->invoice_number);
|
||||
$activity->save();
|
||||
}
|
||||
|
||||
@ -81,7 +81,7 @@ class Activity extends Eloquent
|
||||
$activity->invoice_id = $invitation->invoice_id;
|
||||
$activity->contact_id = $invitation->contact_id;
|
||||
$activity->activity_type_id = ACTIVITY_TYPE_EMAIL_INVOICE;
|
||||
//$activity->message = Auth::user()->getFullName() . ' emailed invoice ' . $invitation->invoice->number . ' to ' . $contact->getFullName();
|
||||
$activity->message = Auth::user()->getFullName() . ' emailed invoice ' . link_to('invoices/'.$invitation->invoice->public_id, $invitation->invoice->invoice_number) . ' to ' . $invitation->contact->getFullName();
|
||||
$activity->save();
|
||||
}
|
||||
|
||||
@ -127,7 +127,7 @@ class Activity extends Eloquent
|
||||
$activity->invoice_id = $invoice->id;
|
||||
$activity->client_id = $invoice->client_id;
|
||||
$activity->activity_type_id = ACTIVITY_TYPE_ARCHIVE_PAYMENT;
|
||||
$activity->message = Auth::user()->getFullName() . ' archived payment ' . $invoice->number;
|
||||
$activity->message = Auth::user()->getFullName() . ' archived payment';
|
||||
$activity->save();
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@ class Activity extends Eloquent
|
||||
$activity->contact_id = $invitation->contact_id;
|
||||
$activity->invoice_id = $invitation->invoice_id;
|
||||
$activity->activity_type_id = ACTIVITY_TYPE_VIEW_INVOICE;
|
||||
//$activity->message = $contact->getFullName() . ' viewed invoice ' . $invoice->number;
|
||||
$activity->message = $invitation->contact->getFullName() . ' viewed invoice ' . link_to('invoices/'.$invitation->invoice->public_id, $invitation->invoice->invoice_number);
|
||||
$activity->save();
|
||||
}
|
||||
}
|
@ -24,6 +24,11 @@ class Client extends EntityModel
|
||||
return $this->hasMany('Invoice');
|
||||
}
|
||||
|
||||
public function payments()
|
||||
{
|
||||
return $this->hasMany('Payment');
|
||||
}
|
||||
|
||||
public function contacts()
|
||||
{
|
||||
return $this->hasMany('Contact');
|
||||
|
@ -7,6 +7,11 @@ class Payment extends EntityModel
|
||||
return $this->belongsTo('Invoice');
|
||||
}
|
||||
|
||||
public function invitation()
|
||||
{
|
||||
return $this->belongsTo('Invitation');
|
||||
}
|
||||
|
||||
public function client()
|
||||
{
|
||||
return $this->belongsTo('Client');
|
||||
|
@ -84,4 +84,9 @@ class User extends ConfideUser implements UserInterface, RemindableInterface, iP
|
||||
return $fullName;
|
||||
}
|
||||
}
|
||||
|
||||
public function showGreyBackground()
|
||||
{
|
||||
return !$this->theme_id || in_array($this->theme_id, [2, 3, 5, 6, 7, 8, 10, 11, 12]);
|
||||
}
|
||||
}
|
@ -24,6 +24,17 @@ Route::get('complete', 'InvoiceController@do_payment');
|
||||
Route::post('signup/validate', 'AccountController@checkEmail');
|
||||
Route::post('signup/submit', 'AccountController@submitSignup');
|
||||
|
||||
// Confide routes
|
||||
Route::get('login', 'UserController@login');
|
||||
Route::post('login', 'UserController@do_login');
|
||||
//Route::get( 'user/confirm/{code}', 'UserController@confirm');
|
||||
Route::get('forgot_password', 'UserController@forgot_password');
|
||||
Route::post('forgot_password', 'UserController@do_forgot_password');
|
||||
//Route::get('user/reset_password/{token}', 'UserController@reset_password');
|
||||
//Route::post('user/reset_password', 'UserController@do_reset_password');
|
||||
Route::get('logout', 'UserController@logout');
|
||||
|
||||
|
||||
Route::filter('auth', function()
|
||||
{
|
||||
if (!Auth::check())
|
||||
@ -62,18 +73,6 @@ Route::group(array('before' => 'auth'), function()
|
||||
Route::get('reports', function() { return View::make('header'); });
|
||||
});
|
||||
|
||||
// Confide routes
|
||||
//Route::get( 'user/create', 'UserController@create');
|
||||
//Route::post('user', 'UserController@store');
|
||||
Route::get('login', 'UserController@login');
|
||||
Route::post('login', 'UserController@do_login');
|
||||
//Route::get( 'user/confirm/{code}', 'UserController@confirm');
|
||||
//Route::get( 'user/forgot_password', 'UserController@forgot_password');
|
||||
//Route::post('user/forgot_password', 'UserController@do_forgot_password');
|
||||
//Route::get( 'user/reset_password/{token}', 'UserController@reset_password');
|
||||
//Route::post('user/reset_password', 'UserController@do_reset_password');
|
||||
Route::get('logout', 'UserController@logout');
|
||||
|
||||
|
||||
|
||||
|
||||
@ -132,7 +131,8 @@ function timestampToDateTimeString($timestamp) {
|
||||
if ($date->year < 1900) {
|
||||
return '';
|
||||
}
|
||||
return $date->toFormattedDateTimeString();
|
||||
|
||||
return $date->format('l M jS, Y g:ia');
|
||||
}
|
||||
|
||||
function timestampToDateString($timestamp) {
|
||||
@ -206,7 +206,7 @@ function processedRequest($url)
|
||||
|
||||
|
||||
|
||||
function trackViewed($name)
|
||||
function trackViewed($name, $type)
|
||||
{
|
||||
$url = Request::url();
|
||||
$viewed = Session::get(RECENTLY_VIEWED);
|
||||
@ -218,7 +218,7 @@ function trackViewed($name)
|
||||
|
||||
$object = new stdClass;
|
||||
$object->url = $url;
|
||||
$object->name = $name;
|
||||
$object->name = ucwords($type) . ': ' . $name;
|
||||
|
||||
for ($i=0; $i<count($viewed); $i++)
|
||||
{
|
||||
@ -261,11 +261,18 @@ define("ACCOUNT_IMPORT", "import");
|
||||
define("ACCOUNT_MAP", "import_map");
|
||||
define("ACCOUNT_EXPORT", "export");
|
||||
|
||||
|
||||
define("DEFAULT_INVOICE_NUMBER", "0001");
|
||||
define("RECENTLY_VIEWED_LIMIT", 8);
|
||||
|
||||
|
||||
define('INVOICE_STATUS_DRAFT', 1);
|
||||
define('INVOICE_STATUS_SENT', 2);
|
||||
define('INVOICE_STATUS_VIEWED', 3);
|
||||
define('INVOICE_STATUS_PARTIAL', 4);
|
||||
define('INVOICE_STATUS_PAID', 5);
|
||||
|
||||
|
||||
|
||||
interface iPerson
|
||||
{
|
||||
//public function getFullName();
|
||||
|
@ -1,8 +1,8 @@
|
||||
@extends('accounts.nav')
|
||||
|
||||
@section('content')
|
||||
@parent
|
||||
|
||||
@parent
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
#logo {
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('header')
|
||||
|
||||
@section('content')
|
||||
|
||||
|
||||
<ul class="nav nav-tabs nav nav-justified">
|
||||
{{ HTML::nav_link('account/details', 'Details') }}
|
||||
{{ HTML::nav_link('account/settings', 'Settings') }}
|
||||
|
@ -1,6 +1,6 @@
|
||||
@extends('header')
|
||||
|
||||
@section('content')
|
||||
@section('content')
|
||||
|
||||
|
||||
<div class="pull-right">
|
||||
|
@ -1,40 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
||||
@extends('master')
|
||||
|
||||
<title>Invoice Ninja {{ isset($title) ? $title : '' }}</title>
|
||||
|
||||
|
||||
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
|
||||
@section('head')
|
||||
|
||||
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
||||
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
|
||||
|
||||
|
||||
<!--
|
||||
<script src="{{ asset('js/typeahead.js') }}" type="text/javascript"></script>
|
||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/typeahead.js-bootstrap.css') }}"/>
|
||||
-->
|
||||
@if (Auth::check() && Auth::user()->theme_id)
|
||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/themes/'.Auth::user()->theme->name.'.min.css') }}"/>
|
||||
@else
|
||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap.css') }}"/>
|
||||
@endif
|
||||
<script src="{{ asset('js/bootstrap.js') }}" type="text/javascript"></script>
|
||||
<!-- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap-theme.min.css"> -->
|
||||
|
||||
|
||||
{{-- Basset::show('bootstrapper.css') --}}
|
||||
{{-- Basset::show('bootstrapper.js') --}}
|
||||
|
||||
<script src="{{ asset('js/bootstrap.js') }}" type="text/javascript"></script>
|
||||
|
||||
<script src="{{ asset('js/bootstrap-combobox.js') }}" type="text/javascript"></script>
|
||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap-combobox.css') }}"/>
|
||||
@ -56,9 +33,14 @@
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
|
||||
@if (!Auth::check() || Auth::user()->showGreyBackground())
|
||||
body {
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
@endif
|
||||
|
||||
body > div.container {
|
||||
min-height: 600px;
|
||||
min-height: 600px;
|
||||
}
|
||||
|
||||
label.control-label {
|
||||
@ -188,10 +170,12 @@
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
/*
|
||||
table.invoice-table tbody tr:hover {
|
||||
background-color: #FFFFFF !important;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
.invoice-table td {
|
||||
padding: 2px !important;
|
||||
}
|
||||
@ -217,27 +201,14 @@
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@if (App::environment() != ENV_DEVELOPMENT)
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-46031341-1', 'sketch-out.com');
|
||||
ga('send', 'pageview');
|
||||
|
||||
</script>
|
||||
@endif
|
||||
@stop
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="container">
|
||||
<p/>
|
||||
<div>
|
||||
<span style="font-size:30px">Invoice Ninja</span>
|
||||
<a href="{{ URL::to('/') }}" style="font-size:30px;color:black">Invoice Ninja</a>
|
||||
<div style="float:right">
|
||||
@if (Auth::check() && Auth::user()->registered)
|
||||
{{ Auth::user()->email }}
|
||||
@ -521,4 +492,5 @@
|
||||
});
|
||||
|
||||
</script>
|
||||
</html>
|
||||
|
||||
@stop
|
@ -1,7 +1,7 @@
|
||||
@extends('header')
|
||||
|
||||
@section('content')
|
||||
|
||||
|
||||
<p> </p>
|
||||
|
||||
{{ Former::open($url)->method($method)->addClass('main_form')->rules(array(
|
||||
@ -24,7 +24,7 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{{ Former::select('client')->addOption('', '')->fromQuery($clients, 'name', 'public_id')->select($client ? $client->public_id : '')
|
||||
{{ Former::select('client')->addOption('', '')->fromQuery($clients, 'name', 'public_id')->select($client ? $client->public_id : '')->addGroupClass('client_select')
|
||||
->help('<a style="cursor:pointer" data-toggle="modal" id="modalLink" onclick="showCreateNew()">Create new client</a>') }}
|
||||
{{ Former::textarea('notes') }}
|
||||
</div>
|
||||
@ -77,7 +77,7 @@
|
||||
<input data-bind="value: tax, valueUpdate: 'afterkeydown'"/>
|
||||
</td>
|
||||
-->
|
||||
<td style="width:100px;background-color: #FFFFFF;text-align: right;padding-top:9px !important">
|
||||
<td style="width:100px;text-align: right;padding-top:9px !important">
|
||||
<span data-bind="text: total"></span>
|
||||
</td>
|
||||
<td style="width:20px; cursor:pointer" class="hide-border">
|
||||
@ -116,11 +116,14 @@
|
||||
<p> </p>
|
||||
<div class="form-actions">
|
||||
|
||||
@if ($invoice)
|
||||
<div style="display:none">
|
||||
{{ Former::text('action') }}
|
||||
<div style="display:none">
|
||||
{{ Former::text('action') }}
|
||||
@if ($invoice)
|
||||
{{ Former::text('id') }}
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if ($invoice)
|
||||
{{ DropdownButton::normal('Download PDF',
|
||||
Navigation::links(
|
||||
array(
|
||||
@ -174,7 +177,7 @@
|
||||
{{ Former::text('city') }}
|
||||
{{ Former::text('state') }}
|
||||
{{ Former::text('postal_code') }}
|
||||
{{ Former::select('country_id')->addOption('','')->label('Country')
|
||||
{{ Former::select('country_id')->addOption('','')->label('Country')->addGroupClass('country_select')
|
||||
->fromQuery($countries, 'name', 'id')->select($client ? $client->country_id : '') }}
|
||||
</div>
|
||||
</div>
|
||||
@ -242,17 +245,17 @@
|
||||
|
||||
var $input = $('select#client');
|
||||
$input.combobox();
|
||||
$('.combobox-container input.form-control').attr('name', 'client_combobox').on('change', function(e) {
|
||||
$('.client_select input.form-control').on('change', function(e) {
|
||||
refreshPDF();
|
||||
}).on('keydown', function() {
|
||||
$('#modalLink').text('Create new client');
|
||||
});
|
||||
enableHoverClick($('.combobox-container input.form-control'), $('.combobox-container input[name=client]'), '{{ URL::to('clients') }}');
|
||||
//enableHoverClick($('.combobox-container input.form-control'), $('.combobox-container input[name=client]'), '{{ URL::to('clients') }}');
|
||||
|
||||
@if ($client)
|
||||
$('input#invoice_number').focus();
|
||||
@else
|
||||
$('[name="client_combobox"]').focus();
|
||||
//$('[name="client_combobox"]').focus();
|
||||
@endif
|
||||
|
||||
/*
|
||||
@ -277,7 +280,8 @@
|
||||
});
|
||||
|
||||
function showCreateNew() {
|
||||
if ($('.combobox-container input[name=client]').val() != '-1') {
|
||||
console.log('showCreateNew: %s', $('input[name=client]').val());
|
||||
if ($('input[name=client]').val() != '-1') {
|
||||
$('#myModal input').val('');
|
||||
$('#myModal #country_id').val('');
|
||||
$('#nameError').css( "display", "none" );
|
||||
@ -327,9 +331,6 @@
|
||||
name: "{{ $account->country ? $account->country->name : '' }}"
|
||||
}
|
||||
},
|
||||
client: {
|
||||
name: $('[name="client_combobox"]').val()
|
||||
},
|
||||
@if (file_exists($account->getLogoPath()))
|
||||
image: "{{ HTML::image_data($account->getLogoPath()) }}",
|
||||
imageWidth: {{ $account->getLogoWidth() }},
|
||||
@ -338,6 +339,26 @@
|
||||
invoice_items: []
|
||||
};
|
||||
|
||||
var clientId = $('input[name=client]').val();
|
||||
console.log('clientId: %s', clientId);
|
||||
console.log('mapped: %s', clientMap[clientId]);
|
||||
if (clientId == '-1') {
|
||||
var client = {
|
||||
name: $('#name').val(),
|
||||
address1: $('#address1').val(),
|
||||
address2: $('#address2').val(),
|
||||
city: $('#city').val(),
|
||||
state: $('#state').val(),
|
||||
postal_code: $('#postal_code').val(),
|
||||
country: {
|
||||
name: $('.country_select input[type=text]').val()
|
||||
}
|
||||
};
|
||||
} else if (clientMap.hasOwnProperty(clientId)) {
|
||||
var client = clientMap[clientId];
|
||||
}
|
||||
invoice.client = client;
|
||||
|
||||
for(var i=0; i<model.items().length; i++) {
|
||||
var item = model.items()[i];
|
||||
invoice.invoice_items.push({
|
||||
@ -352,11 +373,17 @@
|
||||
}
|
||||
|
||||
function refreshPDF() {
|
||||
setTimeout(function() {
|
||||
_refreshPDF();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
function _refreshPDF() {
|
||||
var invoice = createInvoiceModel();
|
||||
var doc = generatePDF(invoice);
|
||||
var string = doc.output('datauristring');
|
||||
$('iframe').attr('src', string);
|
||||
}
|
||||
$('iframe').attr('src', string);
|
||||
}
|
||||
|
||||
function onDownloadClick() {
|
||||
var invoice = createInvoiceModel();
|
||||
@ -388,12 +415,11 @@
|
||||
if (!name) {
|
||||
if (!name) $('#nameError').css( "display", "inline" );
|
||||
} else {
|
||||
$('.combobox-container input[name=client]').val('-1');
|
||||
$('.combobox-container input.form-control').val(name);
|
||||
$('.combobox-container').addClass('combobox-selected');
|
||||
$('input[name=client]').val('-1');
|
||||
$('.client_select input.form-control').val(name);
|
||||
$('.client_select').addClass('combobox-selected');
|
||||
|
||||
$('#nameError').css( "display", "none" );
|
||||
//$('#client_name').val('');
|
||||
$('#modalLink').text('Edit client details');
|
||||
$('#myModal').modal('hide');
|
||||
$('input#invoice_number').focus();
|
||||
@ -571,6 +597,13 @@
|
||||
}
|
||||
|
||||
var products = {{ $products }};
|
||||
var clients = {{ $clients }};
|
||||
var clientMap = {};
|
||||
|
||||
for (var i=0; i<clients.length; i++) {
|
||||
var client = clients[i];
|
||||
clientMap[client.public_id] = client;
|
||||
}
|
||||
|
||||
window.model = new InvoiceModel();
|
||||
ko.applyBindings(model);
|
||||
|
@ -3,7 +3,7 @@
|
||||
@section('content')
|
||||
|
||||
@if ($invoice->client->account->isGatewayConfigured())
|
||||
{{ Button::primary_link(URL::to('payment/' . $invoice->invoice_key), 'Pay Now', array('class' => 'btn-lg pull-right')) }}
|
||||
{{ Button::primary_link(URL::to('payment/' . $invitation->invitation_key), 'Pay Now', array('class' => 'btn-lg pull-right')) }}
|
||||
<div class="clearfix"></div><p> </p>
|
||||
@endif
|
||||
|
||||
|
@ -1,20 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="shortcut icon" href="../../docs-assets/ico/favicon.png">
|
||||
@extends('master')
|
||||
|
||||
<title></title>
|
||||
|
||||
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
@section('content')
|
||||
|
||||
<style type="text/css">
|
||||
body {
|
||||
@ -59,18 +45,9 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
|
||||
|
||||
{{ Basset::show('bootstrapper.css') }}
|
||||
{{ Basset::show('bootstrapper.js') }}
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
{{ Form::open(array('url' => 'login', 'class' => 'form-signin')) }}
|
||||
{{ Form::open(array('url' => 'user/login', 'class' => 'form-signin')) }}
|
||||
<h2 class="form-signin-heading">Please sign in</h2>
|
||||
|
||||
<p>
|
||||
@ -85,6 +62,8 @@
|
||||
|
||||
<p>{{ Button::primary_submit('Sign In', array('class' => 'btn-lg'))->block() }}</p>
|
||||
|
||||
{{ link_to('user/forgot_password', 'Recover your password') }}
|
||||
|
||||
<!-- if there are login errors, show them here -->
|
||||
@if ( Session::get('error') )
|
||||
<div class="alert alert-error">{{{ Session::get('error') }}}</div>
|
||||
@ -99,8 +78,5 @@
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@stop
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Invoice Ninja</title>
|
||||
<title>Invoice Ninja {{ isset($title) ? $title : '' }}</title>
|
||||
|
||||
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
@ -15,9 +15,11 @@
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
|
||||
{{-- Basset::show('bootstrapper.css') --}}
|
||||
{{-- Basset::show('bootstrapper.js') --}}
|
||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap.css') }}"/>
|
||||
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap.css') }}"/>
|
||||
|
||||
|
||||
@yield('head')
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@ -34,99 +36,8 @@
|
||||
</script>
|
||||
@endif
|
||||
|
||||
<div class="navbar navbar-inverse navbar-fixed-top">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="#">Invoice Ninja</a>
|
||||
</div>
|
||||
<!--
|
||||
<div class="navbar-collapse collapse">
|
||||
{{ Form::open(array('url' => 'login', 'class' => 'navbar-form navbar-right')) }}
|
||||
<div class="form-group">
|
||||
{{ Form::text('email', Input::old('email'), array('placeholder' => 'Email')) }}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
{{ Form::password('password', array('placeholder' => 'Password')) }}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success">Sign in</button>
|
||||
{{ Form::close() }}
|
||||
-->
|
||||
</div><!--/.navbar-collapse -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main jumbotron for a primary marketing message or call to action -->
|
||||
<div class="jumbotron">
|
||||
<div class="container">
|
||||
<h1>Hello, world!</h1>
|
||||
<p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
|
||||
<p>
|
||||
{{ Form::open(array('url' => 'get_started')) }}
|
||||
{{ Form::hidden('guest_key') }}
|
||||
{{ Button::lg_primary_submit('Get Started »') }}
|
||||
{{ Form::close() }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<!-- Example row of columns -->
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2>Heading</h2>
|
||||
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
|
||||
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2>Heading</h2>
|
||||
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
|
||||
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2>Heading</h2>
|
||||
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
|
||||
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<footer>
|
||||
<p>© Company 2013</p>
|
||||
</footer>
|
||||
</div> <!-- /container -->
|
||||
@yield('body')
|
||||
|
||||
</body>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(function() {
|
||||
|
||||
function isStorageSupported() {
|
||||
try {
|
||||
return 'localStorage' in window && window['localStorage'] !== null;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (isStorageSupported()) {
|
||||
@if (Session::get('clearGuestKey'))
|
||||
localStorage.setItem('guest_key', '');
|
||||
@else
|
||||
$('[name="guest_key"]').val(localStorage.getItem('guest_key'));
|
||||
@endif
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</html>
|
||||
</html>
|
@ -109,7 +109,6 @@
|
||||
$input.combobox();
|
||||
|
||||
var $input = $('select#invoice').on('change', function(e) {
|
||||
console.log('invoice change');
|
||||
$clientCombobox = $('select#client');
|
||||
var invoiceId = $('input[name=invoice]').val();
|
||||
if (invoiceId) {
|
||||
|
95
app/views/splash.blade.php
Executable file
95
app/views/splash.blade.php
Executable file
@ -0,0 +1,95 @@
|
||||
@extends('master')
|
||||
|
||||
@section('body')
|
||||
<div class="navbar navbar-inverse navbar-fixed-top">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="#">Invoice Ninja</a>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
{{ Form::open(array('url' => 'login', 'class' => 'navbar-form navbar-right')) }}
|
||||
<div class="form-group">
|
||||
{{ Form::text('email', Input::old('email'), array('placeholder' => 'Email')) }}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
{{ Form::password('password', array('placeholder' => 'Password')) }}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success">Sign in</button>
|
||||
{{ Form::close() }}
|
||||
</div><!--/.navbar-collapse -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main jumbotron for a primary marketing message or call to action -->
|
||||
<div class="jumbotron">
|
||||
<div class="container">
|
||||
<h1>Hello, world!</h1>
|
||||
<p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
|
||||
<p>
|
||||
{{ Form::open(array('url' => 'get_started')) }}
|
||||
{{ Form::hidden('guest_key') }}
|
||||
{{ Button::lg_primary_submit('Get Started »') }}
|
||||
{{ Form::close() }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<!-- Example row of columns -->
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2>Heading</h2>
|
||||
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
|
||||
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2>Heading</h2>
|
||||
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
|
||||
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2>Heading</h2>
|
||||
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
|
||||
<p><a class="btn btn-default" href="#" role="button">View details »</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<footer>
|
||||
<p>© Company 2013</p>
|
||||
</footer>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(function() {
|
||||
|
||||
function isStorageSupported() {
|
||||
try {
|
||||
return 'localStorage' in window && window['localStorage'] !== null;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (isStorageSupported()) {
|
||||
@if (Session::get('clearGuestKey'))
|
||||
localStorage.setItem('guest_key', '');
|
||||
@else
|
||||
$('[name="guest_key"]').val(localStorage.getItem('guest_key'));
|
||||
@endif
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</div>
|
||||
|
||||
@stop
|
0
app/views/users/forgot_password.blade.php
Executable file
0
app/views/users/forgot_password.blade.php
Executable file
108
app/views/users/login.blade.php
Executable file
108
app/views/users/login.blade.php
Executable file
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<link rel="shortcut icon" href="../../docs-assets/ico/favicon.png">
|
||||
|
||||
<title></title>
|
||||
|
||||
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<style type="text/css">
|
||||
body {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
background-color: #eee !important;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.form-signin .form-signin-heading,
|
||||
.form-signin .checkbox {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.form-signin .checkbox {
|
||||
font-weight: normal;
|
||||
}
|
||||
.form-signin .form-control {
|
||||
position: relative;
|
||||
font-size: 16px;
|
||||
height: auto;
|
||||
padding: 10px;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.form-signin .form-control:focus {
|
||||
z-index: 2;
|
||||
}
|
||||
.form-signin input[type="text"] {
|
||||
margin-bottom: -1px;
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.form-signin input[type="password"] {
|
||||
margin-bottom: 10px;
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
|
||||
|
||||
{{ Basset::show('bootstrapper.css') }}
|
||||
{{ Basset::show('bootstrapper.js') }}
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
{{ Form::open(array('url' => 'login', 'class' => 'form-signin')) }}
|
||||
<h2 class="form-signin-heading">Please sign in</h2>
|
||||
|
||||
<p>
|
||||
{{ $errors->first('email') }}
|
||||
{{ $errors->first('password') }}
|
||||
</p>
|
||||
|
||||
<p>
|
||||
{{ Form::text('email', Input::old('email'), array('placeholder' => 'Email address')) }}
|
||||
{{ Form::password('password', array('placeholder' => 'Password')) }}
|
||||
</p>
|
||||
|
||||
<p>{{ Button::primary_submit('Sign In', array('class' => 'btn-lg'))->block() }}</p>
|
||||
|
||||
{{ link_to('user/forgot_password', 'Recover your password') }}
|
||||
|
||||
<!-- if there are login errors, show them here -->
|
||||
@if ( Session::get('error') )
|
||||
<div class="alert alert-error">{{{ Session::get('error') }}}</div>
|
||||
@endif
|
||||
|
||||
@if ( Session::get('notice') )
|
||||
<div class="alert">{{{ Session::get('notice') }}}</div>
|
||||
@endif
|
||||
|
||||
|
||||
{{ Form::close() }}
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,6 +1,5 @@
|
||||
function generatePDF(invoice) {
|
||||
|
||||
var clientName = invoice.client.name;
|
||||
var invoiceNumber = invoice.invoice_number;
|
||||
var issuedOn = invoice.invoice_date;
|
||||
var amount = '$0.00';
|
||||
@ -37,7 +36,25 @@ function generatePDF(invoice) {
|
||||
var issuedOnX = headerRight - (doc.getStringUnitWidth(issuedOn) * doc.internal.getFontSize());
|
||||
|
||||
doc.setFontType("normal");
|
||||
doc.text(marginLeft, headerTop, clientName);
|
||||
if (invoice.client) {
|
||||
var y = headerTop;
|
||||
doc.text(marginLeft, y, invoice.client.name);
|
||||
y += rowHeight;
|
||||
doc.text(marginLeft, y, invoice.client.address1);
|
||||
if (invoice.client.address2) {
|
||||
y += rowHeight;
|
||||
doc.text(marginLeft, y, invoice.client.address2);
|
||||
}
|
||||
if (invoice.client.city || invoice.client.state || invoice.client.postal_code) {
|
||||
y += rowHeight;
|
||||
doc.text(marginLeft, y, invoice.client.city + ', ' + invoice.client.state + ' ' + invoice.client.postal_code);
|
||||
}
|
||||
if (invoice.client.country) {
|
||||
y += rowHeight;
|
||||
doc.text(marginLeft, y, invoice.client.country.name);
|
||||
}
|
||||
}
|
||||
|
||||
doc.text(headerLeft, headerTop, 'Invoice #');
|
||||
doc.text(invoiceNumberX, headerTop, invoiceNumber);
|
||||
doc.text(headerLeft, headerTop + rowHeight, 'Invoice Date');
|
||||
@ -134,16 +151,20 @@ function generatePDF(invoice) {
|
||||
doc.text(tableLeft, y, invoice.account.country ? invoice.account.country.name : '');
|
||||
|
||||
|
||||
var clientX = headerRight - (doc.getStringUnitWidth(invoice.client.name) * doc.internal.getFontSize());
|
||||
if (invoice.client) {
|
||||
var clientX = headerRight - (doc.getStringUnitWidth(invoice.client.name) * doc.internal.getFontSize());
|
||||
}
|
||||
var numberX = headerRight - (doc.getStringUnitWidth(invoice.invoice_number) * doc.internal.getFontSize());
|
||||
var dateX = headerRight - (doc.getStringUnitWidth(issuedOn) * doc.internal.getFontSize());
|
||||
var totalX = headerRight - (doc.getStringUnitWidth(total) * doc.internal.getFontSize());
|
||||
|
||||
y = 720;
|
||||
doc.setFontType("bold");
|
||||
doc.text(headerLeft, y, 'Client');
|
||||
doc.setFontType("normal");
|
||||
doc.text(clientX, y, invoice.client.name);
|
||||
if (invoice.client) {
|
||||
doc.setFontType("bold");
|
||||
doc.text(headerLeft, y, 'Client');
|
||||
doc.setFontType("normal");
|
||||
doc.text(clientX, y, invoice.client.name);
|
||||
}
|
||||
|
||||
y += 16;
|
||||
doc.setFontType("bold");
|
||||
@ -189,9 +210,6 @@ function formatMoney(num) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Set the defaults for DataTables initialisation */
|
||||
$.extend( true, $.fn.dataTable.defaults, {
|
||||
"sDom": "t<'row-fluid'<'span6'i><'span6'p>>",
|
||||
|
Loading…
Reference in New Issue
Block a user