mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 08:57:34 -04:00 
			
		
		
		
	Fixes for N+1 queries in Client Statements
This commit is contained in:
		
							parent
							
								
									e8f79e54f5
								
							
						
					
					
						commit
						af8c56a1f1
					
				| @ -51,6 +51,6 @@ class CreateStatementRequest extends Request | |||||||
| 
 | 
 | ||||||
|     public function client(): ?Client |     public function client(): ?Client | ||||||
|     { |     { | ||||||
|         return Client::where('id', $this->client_id)->first(); |         return Client::with('company')->where('id', $this->client_id)->withTrashed()->first(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -73,7 +73,7 @@ class Statement | |||||||
| 
 | 
 | ||||||
|         $state = [ |         $state = [ | ||||||
|             'template' => $template->elements([ |             'template' => $template->elements([ | ||||||
|                 'client' => $this->entity->client, |                 'client' => $this->client, | ||||||
|                 'entity' => $this->entity, |                 'entity' => $this->entity, | ||||||
|                 'pdf_variables' => (array)$this->entity->company->settings->pdf_variables, |                 'pdf_variables' => (array)$this->entity->company->settings->pdf_variables, | ||||||
|                 '$product' => $this->getDesign()->design->product, |                 '$product' => $this->getDesign()->design->product, | ||||||
| @ -219,7 +219,7 @@ class Statement | |||||||
|      */ |      */ | ||||||
|     protected function getInvoices(): Collection |     protected function getInvoices(): Collection | ||||||
|     { |     { | ||||||
|         return Invoice::where('company_id', $this->client->company->id) |         return Invoice::where('company_id', $this->client->company_id) | ||||||
|             ->where('client_id', $this->client->id) |             ->where('client_id', $this->client->id) | ||||||
|             ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL, Invoice::STATUS_PAID]) |             ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL, Invoice::STATUS_PAID]) | ||||||
|             ->whereBetween('date', [$this->options['start_date'], $this->options['end_date']]) |             ->whereBetween('date', [$this->options['start_date'], $this->options['end_date']]) | ||||||
| @ -234,7 +234,8 @@ class Statement | |||||||
|      */ |      */ | ||||||
|     protected function getPayments(): Collection |     protected function getPayments(): Collection | ||||||
|     { |     { | ||||||
|         return Payment::where('company_id', $this->client->company->id) |         return Payment::with('client.country','invoices') | ||||||
|  |             ->where('company_id', $this->client->company_id) | ||||||
|             ->where('client_id', $this->client->id) |             ->where('client_id', $this->client->id) | ||||||
|             ->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED]) |             ->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED]) | ||||||
|             ->whereBetween('date', [$this->options['start_date'], $this->options['end_date']]) |             ->whereBetween('date', [$this->options['start_date'], $this->options['end_date']]) | ||||||
| @ -285,10 +286,7 @@ class Statement | |||||||
|         $from = $ranges[0]; |         $from = $ranges[0]; | ||||||
|         $to = $ranges[1]; |         $to = $ranges[1]; | ||||||
| 
 | 
 | ||||||
|         $client = Client::where('id', $this->client->id)->first(); |         $amount = Invoice::where('client_id', $this->client->id) | ||||||
| 
 |  | ||||||
|         $amount = Invoice::where('company_id', $this->client->company->id) |  | ||||||
|             ->where('client_id', $client->id) |  | ||||||
|             ->where('company_id', $this->client->company_id) |             ->where('company_id', $this->client->company_id) | ||||||
|             ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) |             ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) | ||||||
|             ->where('balance', '>', 0) |             ->where('balance', '>', 0) | ||||||
| @ -296,7 +294,7 @@ class Statement | |||||||
|             ->whereBetween('date', [$to, $from]) |             ->whereBetween('date', [$to, $from]) | ||||||
|             ->sum('balance'); |             ->sum('balance'); | ||||||
| 
 | 
 | ||||||
|         return Number::formatMoney($amount, $client); |         return Number::formatMoney($amount, $this->client); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -195,15 +195,15 @@ class Design extends BaseDesign | |||||||
|         if ($this->type == self::DELIVERY_NOTE) { |         if ($this->type == self::DELIVERY_NOTE) { | ||||||
|             $elements = [ |             $elements = [ | ||||||
|                 ['element' => 'p', 'content' => ctrans('texts.delivery_note'), 'properties' => ['data-ref' => 'delivery_note-label', 'style' => 'font-weight: bold; text-transform: uppercase']], |                 ['element' => 'p', 'content' => ctrans('texts.delivery_note'), 'properties' => ['data-ref' => 'delivery_note-label', 'style' => 'font-weight: bold; text-transform: uppercase']], | ||||||
|                 ['element' => 'p', 'content' => $this->entity->client->name, 'show_empty' => false, 'properties' => ['data-ref' => 'delivery_note-client.name']], |                 ['element' => 'p', 'content' => $this->client->name, 'show_empty' => false, 'properties' => ['data-ref' => 'delivery_note-client.name']], | ||||||
|                 ['element' => 'p', 'content' => $this->entity->client->shipping_address1, 'show_empty' => false, 'properties' => ['data-ref' => 'delivery_note-client.shipping_address1']], |                 ['element' => 'p', 'content' => $this->client->shipping_address1, 'show_empty' => false, 'properties' => ['data-ref' => 'delivery_note-client.shipping_address1']], | ||||||
|                 ['element' => 'p', 'content' => $this->entity->client->shipping_address2, 'show_empty' => false, 'properties' => ['data-ref' => 'delivery_note-client.shipping_address2']], |                 ['element' => 'p', 'content' => $this->client->shipping_address2, 'show_empty' => false, 'properties' => ['data-ref' => 'delivery_note-client.shipping_address2']], | ||||||
|                 ['element' => 'p', 'show_empty' => false, 'elements' => [ |                 ['element' => 'p', 'show_empty' => false, 'elements' => [ | ||||||
|                     ['element' => 'span', 'content' => "{$this->entity->client->shipping_city} ", 'properties' => ['ref' => 'delivery_note-client.shipping_city']], |                     ['element' => 'span', 'content' => "{$this->client->shipping_city} ", 'properties' => ['ref' => 'delivery_note-client.shipping_city']], | ||||||
|                     ['element' => 'span', 'content' => "{$this->entity->client->shipping_state} ", 'properties' => ['ref' => 'delivery_note-client.shipping_state']], |                     ['element' => 'span', 'content' => "{$this->client->shipping_state} ", 'properties' => ['ref' => 'delivery_note-client.shipping_state']], | ||||||
|                     ['element' => 'span', 'content' => "{$this->entity->client->shipping_postal_code} ", 'properties' => ['ref' => 'delivery_note-client.shipping_postal_code']], |                     ['element' => 'span', 'content' => "{$this->client->shipping_postal_code} ", 'properties' => ['ref' => 'delivery_note-client.shipping_postal_code']], | ||||||
|                 ]], |                 ]], | ||||||
|                 ['element' => 'p', 'content' => optional($this->entity->client->shipping_country)->name, 'show_empty' => false], |                 ['element' => 'p', 'content' => optional($this->client->shipping_country)->name, 'show_empty' => false], | ||||||
|             ]; |             ]; | ||||||
| 
 | 
 | ||||||
|             if (!is_null($this->context['contact'])) { |             if (!is_null($this->context['contact'])) { | ||||||
| @ -232,7 +232,7 @@ class Design extends BaseDesign | |||||||
|                 ]], |                 ]], | ||||||
|                 ['element' => 'tr', 'properties' => [], 'elements' => [ |                 ['element' => 'tr', 'properties' => [], 'elements' => [ | ||||||
|                     ['element' => 'th', 'properties' => [], 'content' => '$balance_due_label'], |                     ['element' => 'th', 'properties' => [], 'content' => '$balance_due_label'], | ||||||
|                     ['element' => 'th', 'properties' => [], 'content' => Number::formatMoney($this->invoices->sum('balance'), $this->entity->client)], |                     ['element' => 'th', 'properties' => [], 'content' => Number::formatMoney($this->invoices->sum('balance'), $this->client)], | ||||||
|                 ]], |                 ]], | ||||||
|             ]; |             ]; | ||||||
|         } |         } | ||||||
| @ -363,10 +363,10 @@ class Design extends BaseDesign | |||||||
|             $element = ['element' => 'tr', 'elements' => []]; |             $element = ['element' => 'tr', 'elements' => []]; | ||||||
| 
 | 
 | ||||||
|             $element['elements'][] = ['element' => 'td', 'content' => $invoice->number]; |             $element['elements'][] = ['element' => 'td', 'content' => $invoice->number]; | ||||||
|             $element['elements'][] = ['element' => 'td', 'content' => $this->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()) ?: ' ']; |             $element['elements'][] = ['element' => 'td', 'content' => $this->translateDate($invoice->date, $this->client->date_format(), $this->client->locale()) ?: ' ']; | ||||||
|             $element['elements'][] = ['element' => 'td', 'content' => $this->translateDate($invoice->due_date, $invoice->client->date_format(), $invoice->client->locale()) ?: ' ']; |             $element['elements'][] = ['element' => 'td', 'content' => $this->translateDate($invoice->due_date, $this->client->date_format(), $this->client->locale()) ?: ' ']; | ||||||
|             $element['elements'][] = ['element' => 'td', 'content' => Number::formatMoney($invoice->amount, $invoice->client) ?: ' ']; |             $element['elements'][] = ['element' => 'td', 'content' => Number::formatMoney($invoice->amount, $this->client) ?: ' ']; | ||||||
|             $element['elements'][] = ['element' => 'td', 'content' => Number::formatMoney($invoice->balance, $invoice->client) ?: ' ']; |             $element['elements'][] = ['element' => 'td', 'content' => Number::formatMoney($invoice->balance, $this->client) ?: ' ']; | ||||||
| 
 | 
 | ||||||
|             $tbody[] = $element; |             $tbody[] = $element; | ||||||
|         } |         } | ||||||
| @ -386,7 +386,7 @@ class Design extends BaseDesign | |||||||
|         $outstanding = $this->invoices->sum('balance'); |         $outstanding = $this->invoices->sum('balance'); | ||||||
| 
 | 
 | ||||||
|         return [ |         return [ | ||||||
|             ['element' => 'p', 'content' => '$outstanding_label: ' . Number::formatMoney($outstanding, $this->entity->client)], |             ['element' => 'p', 'content' => '$outstanding_label: ' . Number::formatMoney($outstanding, $this->client)], | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -412,9 +412,9 @@ class Design extends BaseDesign | |||||||
|                 $element = ['element' => 'tr', 'elements' => []]; |                 $element = ['element' => 'tr', 'elements' => []]; | ||||||
| 
 | 
 | ||||||
|                 $element['elements'][] = ['element' => 'td', 'content' => $invoice->number]; |                 $element['elements'][] = ['element' => 'td', 'content' => $invoice->number]; | ||||||
|                 $element['elements'][] = ['element' => 'td', 'content' => $this->translateDate($payment->date, $payment->client->date_format(), $payment->client->locale()) ?: ' ']; |                 $element['elements'][] = ['element' => 'td', 'content' => $this->translateDate($payment->date, $this->client->date_format(), $this->client->locale()) ?: ' ']; | ||||||
|                 $element['elements'][] = ['element' => 'td', 'content' => $payment->type ? $payment->type->name : ctrans('texts.manual_entry')]; |                 $element['elements'][] = ['element' => 'td', 'content' => $payment->type ? $payment->type->name : ctrans('texts.manual_entry')]; | ||||||
|                 $element['elements'][] = ['element' => 'td', 'content' => Number::formatMoney($payment->amount, $payment->client) ?: ' ']; |                 $element['elements'][] = ['element' => 'td', 'content' => Number::formatMoney($payment->amount, $this->client) ?: ' ']; | ||||||
| 
 | 
 | ||||||
|                 $tbody[] = $element; |                 $tbody[] = $element; | ||||||
|             } |             } | ||||||
| @ -439,7 +439,7 @@ class Design extends BaseDesign | |||||||
|         $payment = $this->payments->first(); |         $payment = $this->payments->first(); | ||||||
| 
 | 
 | ||||||
|         return [ |         return [ | ||||||
|             ['element' => 'p', 'content' => \sprintf('%s: %s', ctrans('texts.amount_paid'), Number::formatMoney($this->payments->sum('amount'), $payment->client))], |             ['element' => 'p', 'content' => \sprintf('%s: %s', ctrans('texts.amount_paid'), Number::formatMoney($this->payments->sum('amount'), $this->client))], | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user