mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 02:34:31 -04:00
Fixes for is_quote
This commit is contained in:
parent
59d0a1cb80
commit
a9302d4d01
@ -29,9 +29,9 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
'tax_name1',
|
||||
'tax_rate1',
|
||||
'tax_name2',
|
||||
'tax_rate2',
|
||||
'tax_rate2',
|
||||
];
|
||||
|
||||
|
||||
protected $casts = [
|
||||
'is_recurring' => 'boolean',
|
||||
'has_tasks' => 'boolean',
|
||||
@ -243,6 +243,10 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
return $this->invoice_type_id == $typeId;
|
||||
}
|
||||
|
||||
public function isQuote() {
|
||||
return $this->isType(INVOICE_TYPE_QUOTE);
|
||||
}
|
||||
|
||||
public function markInvitationsSent($notify = false)
|
||||
{
|
||||
foreach ($this->invitations as $invitation) {
|
||||
@ -524,12 +528,12 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
'name',
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
foreach ($this->expenses as $expense) {
|
||||
$expense->setVisible([
|
||||
'documents',
|
||||
]);
|
||||
|
||||
|
||||
foreach ($expense->documents as $document) {
|
||||
$document->setVisible([
|
||||
'public_id',
|
||||
@ -588,12 +592,12 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
|
||||
return $schedule[1]->getStart();
|
||||
}
|
||||
|
||||
|
||||
public function getDueDate($invoice_date = null){
|
||||
if(!$this->is_recurring) {
|
||||
return $this->due_date ? $this->due_date : null;
|
||||
}
|
||||
else{
|
||||
else{
|
||||
$now = time();
|
||||
if($invoice_date) {
|
||||
// If $invoice_date is specified, all calculations are based on that date
|
||||
@ -607,7 +611,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
$now = $invoice_date->getTimestamp();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if($this->due_date && $this->due_date != '0000-00-00'){
|
||||
// This is a recurring invoice; we're using a custom format here.
|
||||
// The year is always 1998; January is 1st, 2nd, last day of the month.
|
||||
@ -616,7 +620,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
$monthVal = (int)date('n', $dueDateVal);
|
||||
$dayVal = (int)date('j', $dueDateVal);
|
||||
$dueDate = false;
|
||||
|
||||
|
||||
if($monthVal == 1) {// January; day of month
|
||||
$currentDay = (int)date('j', $now);
|
||||
$lastDayOfMonth = (int)date('t', $now);
|
||||
@ -643,7 +647,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
if($dueDay > $lastDayOfMonth){
|
||||
// No later than the end of the month
|
||||
$dueDay = $lastDayOfMonth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$dueDate = mktime(0, 0, 0, $dueMonth, $dueDay, $dueYear);
|
||||
@ -672,7 +676,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
return date('Y-m-d', strtotime('+'.$days.' day', $now));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Couldn't calculate one
|
||||
return null;
|
||||
}
|
||||
@ -690,11 +694,11 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
$dateStart = $date->getStart();
|
||||
$date = $this->account->formatDate($dateStart);
|
||||
$dueDate = $this->getDueDate($dateStart);
|
||||
|
||||
|
||||
if($dueDate) {
|
||||
$date .= ' <small>(' . trans('texts.due') . ' ' . $this->account->formatDate($dueDate) . ')</small>';
|
||||
}
|
||||
|
||||
|
||||
$dates[] = $date;
|
||||
}
|
||||
|
||||
@ -808,16 +812,16 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
$invitation = $this->invitations[0];
|
||||
$link = $invitation->getLink('view', true);
|
||||
$key = env('PHANTOMJS_CLOUD_KEY');
|
||||
|
||||
|
||||
if (Utils::isNinjaDev()) {
|
||||
$link = env('TEST_LINK');
|
||||
}
|
||||
|
||||
$url = "http://api.phantomjscloud.com/api/browser/v2/{$key}/?request=%7Burl:%22{$link}?phantomjs=true%22,renderType:%22html%22%7D";
|
||||
|
||||
|
||||
$pdfString = file_get_contents($url);
|
||||
$pdfString = strip_tags($pdfString);
|
||||
|
||||
|
||||
if ( ! $pdfString || strlen($pdfString) < 200) {
|
||||
Utils::logError("PhantomJSCloud - failed to create pdf: {$pdfString}");
|
||||
return false;
|
||||
@ -870,14 +874,14 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
return $total;
|
||||
}
|
||||
|
||||
// if $calculatePaid is true we'll loop through each payment to
|
||||
// if $calculatePaid is true we'll loop through each payment to
|
||||
// determine the sum, otherwise we'll use the cached paid_to_date amount
|
||||
public function getTaxes($calculatePaid = false)
|
||||
{
|
||||
$taxes = [];
|
||||
$taxable = $this->getTaxable();
|
||||
$paidAmount = $this->getAmountPaid($calculatePaid);
|
||||
|
||||
|
||||
if ($this->tax_name1) {
|
||||
$invoiceTaxAmount = round($taxable * ($this->tax_rate1 / 100), 2);
|
||||
$invoicePaidAmount = $this->amount && $invoiceTaxAmount ? ($paidAmount / $this->amount * $invoiceTaxAmount) : 0;
|
||||
@ -892,7 +896,7 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
|
||||
foreach ($this->invoice_items as $invoiceItem) {
|
||||
$itemTaxAmount = $this->getItemTaxable($invoiceItem, $taxable);
|
||||
|
||||
|
||||
if ($invoiceItem->tax_name1) {
|
||||
$itemTaxAmount = round($taxable * ($invoiceItem->tax_rate1 / 100), 2);
|
||||
$itemPaidAmount = $this->amount && $itemTaxAmount ? ($paidAmount / $this->amount * $itemTaxAmount) : 0;
|
||||
@ -905,20 +909,20 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
$this->calculateTax($taxes, $invoiceItem->tax_name2, $invoiceItem->tax_rate2, $itemTaxAmount, $itemPaidAmount);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $taxes;
|
||||
}
|
||||
|
||||
private function calculateTax(&$taxes, $name, $rate, $amount, $paid)
|
||||
{
|
||||
|
||||
private function calculateTax(&$taxes, $name, $rate, $amount, $paid)
|
||||
{
|
||||
if ( ! $amount) {
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$amount = round($amount, 2);
|
||||
$paid = round($paid, 2);
|
||||
$key = $rate . ' ' . $name;
|
||||
|
||||
|
||||
if ( ! isset($taxes[$key])) {
|
||||
$taxes[$key] = [
|
||||
'name' => $name,
|
||||
@ -929,14 +933,14 @@ class Invoice extends EntityModel implements BalanceAffecting
|
||||
}
|
||||
|
||||
$taxes[$key]['amount'] += $amount;
|
||||
$taxes[$key]['paid'] += $paid;
|
||||
$taxes[$key]['paid'] += $paid;
|
||||
}
|
||||
|
||||
|
||||
public function hasDocuments(){
|
||||
if(count($this->documents))return true;
|
||||
return $this->hasExpenseDocuments();
|
||||
}
|
||||
|
||||
|
||||
public function hasExpenseDocuments(){
|
||||
foreach($this->expenses as $expense){
|
||||
if(count($expense->documents))return true;
|
||||
|
@ -210,7 +210,7 @@ class InvoiceRepository extends BaseRepository
|
||||
->where('contacts.is_primary', '=', true)
|
||||
->where('invoices.is_recurring', '=', false)
|
||||
// This needs to be a setting to also hide the activity on the dashboard page
|
||||
//->where('invoices.invoice_status_id', '>=', INVOICE_STATUS_SENT)
|
||||
//->where('invoices.invoice_status_id', '>=', INVOICE_STATUS_SENT)
|
||||
->select(
|
||||
DB::raw('COALESCE(clients.currency_id, accounts.currency_id) currency_id'),
|
||||
DB::raw('COALESCE(clients.country_id, accounts.country_id) country_id'),
|
||||
@ -287,7 +287,7 @@ class InvoiceRepository extends BaseRepository
|
||||
$account->invoice_footer = trim($data['invoice_footer']);
|
||||
}
|
||||
$account->save();
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['invoice_number']) && !$invoice->is_recurring) {
|
||||
$invoice->invoice_number = trim($data['invoice_number']);
|
||||
@ -329,7 +329,7 @@ class InvoiceRepository extends BaseRepository
|
||||
if ($invoice->auto_bill < AUTO_BILL_OFF || $invoice->auto_bill > AUTO_BILL_ALWAYS ) {
|
||||
$invoice->auto_bill = AUTO_BILL_OFF;
|
||||
}
|
||||
|
||||
|
||||
if (isset($data['recurring_due_date'])) {
|
||||
$invoice->due_date = $data['recurring_due_date'];
|
||||
} elseif (isset($data['due_date'])) {
|
||||
@ -351,7 +351,7 @@ class InvoiceRepository extends BaseRepository
|
||||
} else {
|
||||
$invoice->terms = '';
|
||||
}
|
||||
|
||||
|
||||
$invoice->invoice_footer = (isset($data['invoice_footer']) && trim($data['invoice_footer'])) ? trim($data['invoice_footer']) : (!$publicId && $account->invoice_footer ? $account->invoice_footer : '');
|
||||
$invoice->public_notes = isset($data['public_notes']) ? trim($data['public_notes']) : null;
|
||||
|
||||
@ -370,8 +370,8 @@ class InvoiceRepository extends BaseRepository
|
||||
|
||||
// provide backwards compatability
|
||||
if (isset($data['tax_name']) && isset($data['tax_rate'])) {
|
||||
$data['tax_name1'] = $data['tax_name'];
|
||||
$data['tax_rate1'] = $data['tax_rate'];
|
||||
$data['tax_name1'] = $data['tax_name'];
|
||||
$data['tax_rate1'] = $data['tax_rate'];
|
||||
}
|
||||
|
||||
$total = 0;
|
||||
@ -405,11 +405,11 @@ class InvoiceRepository extends BaseRepository
|
||||
}
|
||||
|
||||
if (isset($item['tax_rate1']) && Utils::parseFloat($item['tax_rate1']) > 0) {
|
||||
$invoiceItemTaxRate = Utils::parseFloat($item['tax_rate1']);
|
||||
$invoiceItemTaxRate = Utils::parseFloat($item['tax_rate1']);
|
||||
$itemTax += round($lineTotal * $invoiceItemTaxRate / 100, 2);
|
||||
}
|
||||
if (isset($item['tax_rate2']) && Utils::parseFloat($item['tax_rate2']) > 0) {
|
||||
$invoiceItemTaxRate = Utils::parseFloat($item['tax_rate2']);
|
||||
$invoiceItemTaxRate = Utils::parseFloat($item['tax_rate2']);
|
||||
$itemTax += round($lineTotal * $invoiceItemTaxRate / 100, 2);
|
||||
}
|
||||
}
|
||||
@ -453,7 +453,7 @@ class InvoiceRepository extends BaseRepository
|
||||
|
||||
$taxAmount1 = round($total * $invoice->tax_rate1 / 100, 2);
|
||||
$taxAmount2 = round($total * $invoice->tax_rate2 / 100, 2);
|
||||
$total = round($total + $taxAmount1 + $taxAmount2, 2);
|
||||
$total = round($total + $taxAmount1 + $taxAmount2, 2);
|
||||
$total += $itemTax;
|
||||
|
||||
// custom fields not charged taxes
|
||||
@ -476,24 +476,24 @@ class InvoiceRepository extends BaseRepository
|
||||
if ($publicId) {
|
||||
$invoice->invoice_items()->forceDelete();
|
||||
}
|
||||
|
||||
|
||||
$document_ids = !empty($data['document_ids'])?array_map('intval', $data['document_ids']):array();;
|
||||
foreach ($document_ids as $document_id){
|
||||
$document = Document::scope($document_id)->first();
|
||||
if($document && Auth::user()->can('edit', $document)){
|
||||
|
||||
|
||||
if($document->invoice_id && $document->invoice_id != $invoice->id){
|
||||
// From a clone
|
||||
$document = $document->cloneDocument();
|
||||
$document_ids[] = $document->public_id;// Don't remove this document
|
||||
}
|
||||
|
||||
|
||||
$document->invoice_id = $invoice->id;
|
||||
$document->expense_id = null;
|
||||
$document->save();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!empty($data['documents']) && Auth::user()->can('create', ENTITY_DOCUMENT)){
|
||||
// Fallback upload
|
||||
$doc_errors = array();
|
||||
@ -512,7 +512,7 @@ class InvoiceRepository extends BaseRepository
|
||||
Session::flash('error', implode('<br>',array_map('htmlentities',$doc_errors)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
foreach ($invoice->documents as $document){
|
||||
if(!in_array($document->public_id, $document_ids)){
|
||||
// Removed
|
||||
@ -586,12 +586,12 @@ class InvoiceRepository extends BaseRepository
|
||||
|
||||
// provide backwards compatability
|
||||
if (isset($item['tax_name']) && isset($item['tax_rate'])) {
|
||||
$item['tax_name1'] = $item['tax_name'];
|
||||
$item['tax_rate1'] = $item['tax_rate'];
|
||||
$item['tax_name1'] = $item['tax_name'];
|
||||
$item['tax_rate1'] = $item['tax_rate'];
|
||||
}
|
||||
|
||||
$invoiceItem->fill($item);
|
||||
|
||||
|
||||
$invoice->invoice_items()->save($invoiceItem);
|
||||
}
|
||||
|
||||
@ -675,9 +675,9 @@ class InvoiceRepository extends BaseRepository
|
||||
'cost',
|
||||
'qty',
|
||||
'tax_name1',
|
||||
'tax_rate1',
|
||||
'tax_rate1',
|
||||
'tax_name2',
|
||||
'tax_rate2',
|
||||
'tax_rate2',
|
||||
] as $field) {
|
||||
$cloneItem->$field = $item->$field;
|
||||
}
|
||||
@ -686,7 +686,7 @@ class InvoiceRepository extends BaseRepository
|
||||
}
|
||||
|
||||
foreach ($invoice->documents as $document) {
|
||||
$cloneDocument = $document->cloneDocument();
|
||||
$cloneDocument = $document->cloneDocument();
|
||||
$invoice->documents()->save($cloneDocument);
|
||||
}
|
||||
|
||||
@ -731,8 +731,8 @@ class InvoiceRepository extends BaseRepository
|
||||
public function findOpenInvoices($clientId)
|
||||
{
|
||||
return Invoice::scope()
|
||||
->invoiceType(INVOICE_TYPE_STANDARD)
|
||||
->whereClientId($clientId)
|
||||
->whereIsQuote(false)
|
||||
->whereIsRecurring(false)
|
||||
->whereDeletedAt(null)
|
||||
->whereHasTasks(true)
|
||||
|
@ -4,15 +4,15 @@
|
||||
@parent
|
||||
|
||||
@include('money_script')
|
||||
|
||||
|
||||
@foreach ($invoice->client->account->getFontFolders() as $font)
|
||||
<script src="{{ asset('js/vfs_fonts/'.$font.'.js') }}" type="text/javascript"></script>
|
||||
@endforeach
|
||||
<script src="{{ asset('pdf.built.js') }}" type="text/javascript"></script>
|
||||
|
||||
|
||||
<style type="text/css">
|
||||
body {
|
||||
background-color: #f8f8f8;
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
.dropdown-menu li a{
|
||||
@ -70,7 +70,7 @@
|
||||
@include('partials.checkout_com_payment')
|
||||
@else
|
||||
<div class="pull-right" style="text-align:right">
|
||||
@if ($invoice->is_quote)
|
||||
@if ($invoice->isQuote())
|
||||
{!! Button::normal(trans('texts.download_pdf'))->withAttributes(['onclick' => 'onDownloadClick()'])->large() !!}
|
||||
@if ($showApprove)
|
||||
{!! Button::success(trans('texts.approve'))->asLinkTo(URL::to('/approve/' . $invitation->invitation_key))->large() !!}
|
||||
@ -81,7 +81,7 @@
|
||||
{!! DropdownButton::success(trans('texts.pay_now'))->withContents($paymentTypes)->large() !!}
|
||||
@else
|
||||
<a href='{!! $paymentURL !!}' class="btn btn-success btn-lg">{{ trans('texts.pay_now') }}</a>
|
||||
@endif
|
||||
@endif
|
||||
@else
|
||||
{!! Button::normal(trans('texts.download_pdf'))->withAttributes(['onclick' => 'onDownloadClick()'])->large() !!}
|
||||
@if ($account->isNinjaAccount())
|
||||
@ -112,7 +112,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
||||
@if ($account->hasFeature(FEATURE_DOCUMENTS) && $account->invoice_embed_documents)
|
||||
@foreach ($invoice->documents as $document)
|
||||
@if($document->isPDFEmbeddable())
|
||||
@ -135,7 +135,7 @@
|
||||
remove_created_by:{{ $invoice->client->account->hasFeature(FEATURE_REMOVE_CREATED_BY) ? 'true' : 'false' }},
|
||||
invoice_settings:{{ $invoice->client->account->hasFeature(FEATURE_INVOICE_SETTINGS) ? 'true' : 'false' }}
|
||||
};
|
||||
invoice.is_quote = {{ $invoice->is_quote ? 'true' : 'false' }};
|
||||
invoice.is_quote = {{ $invoice->isQuote() ? 'true' : 'false' }};
|
||||
invoice.contact = {!! $contact->toJson() !!};
|
||||
|
||||
function getPDFString(cb) {
|
||||
@ -152,16 +152,16 @@
|
||||
doc.getDataUrl(function(pdfString) {
|
||||
document.write(pdfString);
|
||||
document.close();
|
||||
|
||||
|
||||
if (window.hasOwnProperty('pjsc_meta')) {
|
||||
window['pjsc_meta'].remainingTasks--;
|
||||
}
|
||||
});
|
||||
@else
|
||||
@else
|
||||
refreshPDF();
|
||||
@endif
|
||||
});
|
||||
|
||||
|
||||
function onDownloadClick() {
|
||||
var doc = generatePDF(invoice, invoice.invoice_design.javascript, true);
|
||||
var fileName = invoice.is_quote ? invoiceLabels.quote : invoiceLabels.invoice;
|
||||
|
Loading…
x
Reference in New Issue
Block a user