mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 03:17:35 -05:00 
			
		
		
		
	
						commit
						c77137bf2a
					
				@ -1 +1 @@
 | 
				
			|||||||
5.3.42
 | 
					5.3.43
 | 
				
			||||||
@ -256,7 +256,6 @@ class InvoiceItemSum
 | 
				
			|||||||
            //$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total));
 | 
					            //$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total));
 | 
				
			||||||
            $amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total)) : 0;
 | 
					            $amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total)) : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
            $item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount);
 | 
					            $item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $item_tax += $item_tax_rate1_total;
 | 
					            $item_tax += $item_tax_rate1_total;
 | 
				
			||||||
 | 
				
			|||||||
@ -231,13 +231,13 @@ class PostMarkController extends BaseController
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        $invitation = false;
 | 
					        $invitation = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if($invitation = InvoiceInvitation::whereRaw('BINARY `message_id`= ?', [$message_id])->first())
 | 
					        if($invitation = InvoiceInvitation::where('message_id', $message_id)->first())
 | 
				
			||||||
            return $invitation;
 | 
					            return $invitation;
 | 
				
			||||||
        elseif($invitation = QuoteInvitation::whereRaw('BINARY `message_id`= ?', [$message_id])->first())
 | 
					        elseif($invitation = QuoteInvitation::where('message_id', $message_id)->first())
 | 
				
			||||||
            return $invitation;
 | 
					            return $invitation;
 | 
				
			||||||
        elseif($invitation = RecurringInvoiceInvitation::whereRaw('BINARY `message_id`= ?', [$message_id])->first())
 | 
					        elseif($invitation = RecurringInvoiceInvitation::where('message_id', $message_id)->first())
 | 
				
			||||||
            return $invitation;
 | 
					            return $invitation;
 | 
				
			||||||
        elseif($invitation = CreditInvitation::whereRaw('BINARY `message_id`= ?', [$message_id])->first())
 | 
					        elseif($invitation = CreditInvitation::where('message_id', $message_id)->first())
 | 
				
			||||||
            return $invitation;
 | 
					            return $invitation;
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            return $invitation;
 | 
					            return $invitation;
 | 
				
			||||||
 | 
				
			|||||||
@ -27,8 +27,6 @@ class PaymentWebhookRequest extends Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public function authorize()
 | 
					    public function authorize()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        MultiDB::findAndSetDbByCompanyKey($this->company_key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -47,6 +45,8 @@ class PaymentWebhookRequest extends Request
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function getCompanyGateway()
 | 
					    public function getCompanyGateway()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        MultiDB::findAndSetDbByCompanyKey($this->company_key);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        return CompanyGateway::withTrashed()->findOrFail($this->decodePrimaryKey($this->company_gateway_id));
 | 
					        return CompanyGateway::withTrashed()->findOrFail($this->decodePrimaryKey($this->company_gateway_id));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -59,6 +59,9 @@ class PaymentWebhookRequest extends Request
 | 
				
			|||||||
    public function getPaymentHash()
 | 
					    public function getPaymentHash()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if ($this->query('hash')) {
 | 
					        if ($this->query('hash')) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            MultiDB::findAndSetDbByCompanyKey($this->company_key);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
            return PaymentHash::where('hash', $this->query('hash'))->firstOrFail();
 | 
					            return PaymentHash::where('hash', $this->query('hash'))->firstOrFail();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -72,6 +75,8 @@ class PaymentWebhookRequest extends Request
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function getCompany(): ?Company
 | 
					    public function getCompany(): ?Company
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        MultiDB::findAndSetDbByCompanyKey($this->company_key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return Company::where('company_key', $this->company_key)->firstOrFail();
 | 
					        return Company::where('company_key', $this->company_key)->firstOrFail();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -94,6 +94,9 @@ class SendRecurring implements ShouldQueue
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $invoice = $this->createRecurringInvitations($invoice);
 | 
					        $invoice = $this->createRecurringInvitations($invoice);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        /* 09-01-2022 ensure we create the PDFs at this point in time! */
 | 
				
			||||||
 | 
					        $invoice->service()->touchPdf();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        nlog("updating recurring invoice dates");
 | 
					        nlog("updating recurring invoice dates");
 | 
				
			||||||
        /* Set next date here to prevent a recurring loop forming */
 | 
					        /* Set next date here to prevent a recurring loop forming */
 | 
				
			||||||
        $this->recurring_invoice->next_send_date = $this->recurring_invoice->nextSendDate();
 | 
					        $this->recurring_invoice->next_send_date = $this->recurring_invoice->nextSendDate();
 | 
				
			||||||
 | 
				
			|||||||
@ -81,7 +81,7 @@ class ReminderJob implements ShouldQueue
 | 
				
			|||||||
                $invoice = $this->calcLateFee($invoice, $reminder_template);
 | 
					                $invoice = $this->calcLateFee($invoice, $reminder_template);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                //check if this reminder needs to be emailed
 | 
					                //check if this reminder needs to be emailed
 | 
				
			||||||
                if(in_array($reminder_template, ['reminder1','reminder2','reminder3']) && $invoice->client->getSetting("enable_".$reminder_template))
 | 
					                if(in_array($reminder_template, ['reminder1','reminder2','reminder3','reminder_endless']) && $invoice->client->getSetting("enable_".$reminder_template))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    $invoice->invitations->each(function ($invitation) use ($invoice, $reminder_template) {
 | 
					                    $invoice->invitations->each(function ($invitation) use ($invoice, $reminder_template) {
 | 
				
			||||||
                        EmailEntity::dispatch($invitation, $invitation->company, $reminder_template);
 | 
					                        EmailEntity::dispatch($invitation, $invitation->company, $reminder_template);
 | 
				
			||||||
 | 
				
			|||||||
@ -304,6 +304,8 @@ class MolliePaymentDriver extends BaseDriver
 | 
				
			|||||||
            'paid' => Payment::STATUS_COMPLETED,
 | 
					            'paid' => Payment::STATUS_COMPLETED,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        nlog($request->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            $payment = $this->gateway->payments->get($request->id);
 | 
					            $payment = $this->gateway->payments->get($request->id);
 | 
				
			||||||
            $record = Payment::withTrashed()->where('transaction_reference', $request->id)->first();
 | 
					            $record = Payment::withTrashed()->where('transaction_reference', $request->id)->first();
 | 
				
			||||||
 | 
				
			|||||||
@ -142,4 +142,61 @@ class Number
 | 
				
			|||||||
            return self::formatValue($value, $currency);
 | 
					            return self::formatValue($value, $currency);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					     * Formats a given value based on the clients currency AND country.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param floatval $value The number to be formatted
 | 
				
			||||||
 | 
					     * @param $entity
 | 
				
			||||||
 | 
					     * @return string           The formatted value
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static function formatMoneyNoRounding($value, $entity) :string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $currency = $entity->currency();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $thousand = $currency->thousand_separator;
 | 
				
			||||||
 | 
					        $decimal = $currency->decimal_separator;
 | 
				
			||||||
 | 
					        $precision = $currency->precision;
 | 
				
			||||||
 | 
					        $code = $currency->code;
 | 
				
			||||||
 | 
					        $swapSymbol = $currency->swap_currency_symbol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($entity instanceof Company) {
 | 
				
			||||||
 | 
					            $country = $entity->country();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            $country = $entity->country;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Country settings override client settings */
 | 
				
			||||||
 | 
					        if (isset($country->thousand_separator) && strlen($country->thousand_separator) >= 1) {
 | 
				
			||||||
 | 
					            $thousand = $country->thousand_separator;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isset($country->decimal_separator) && strlen($country->decimal_separator) >= 1) {
 | 
				
			||||||
 | 
					            $decimal = $country->decimal_separator;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isset($country->swap_currency_symbol) && strlen($country->swap_currency_symbol) >= 1) {
 | 
				
			||||||
 | 
					            $swapSymbol = $country->swap_currency_symbol;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 08-01-2022 allow increased precision for unit price*/
 | 
				
			||||||
 | 
					        $v = rtrim(sprintf('%f', $value),"0");
 | 
				
			||||||
 | 
					        $precision = strlen(substr(strrchr($v, $decimal), 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $value = number_format($v, $precision, $decimal, $thousand);
 | 
				
			||||||
 | 
					        $symbol = $currency->symbol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($entity->getSetting('show_currency_code') === true && $currency->code == 'CHF') {
 | 
				
			||||||
 | 
					            return "{$code} {$value}";
 | 
				
			||||||
 | 
					        } elseif ($entity->getSetting('show_currency_code') === true) {
 | 
				
			||||||
 | 
					            return "{$value} {$code}";
 | 
				
			||||||
 | 
					        } elseif ($swapSymbol) {
 | 
				
			||||||
 | 
					            return "{$value} ".trim($symbol);
 | 
				
			||||||
 | 
					        } elseif ($entity->getSetting('show_currency_code') === false) {
 | 
				
			||||||
 | 
					            return "{$symbol}{$value}";
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return self::formatValue($value, $currency);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -306,8 +306,8 @@ trait MakesInvoiceValues
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
            //change quantity from localized number, to decimal format with no trailing zeroes 06/09/21
 | 
					            //change quantity from localized number, to decimal format with no trailing zeroes 06/09/21
 | 
				
			||||||
            $data[$key][$table_type.'.quantity'] =  rtrim($item->quantity, $locale_info['decimal_point']);
 | 
					            $data[$key][$table_type.'.quantity'] =  rtrim($item->quantity, $locale_info['decimal_point']);
 | 
				
			||||||
            $data[$key][$table_type.'.unit_cost'] = Number::formatMoney($item->cost, $this->client);
 | 
					            $data[$key][$table_type.'.unit_cost'] = Number::formatMoneyNoRounding($item->cost, $this->client);
 | 
				
			||||||
            $data[$key][$table_type.'.cost'] = Number::formatMoney($item->cost, $this->client);
 | 
					            $data[$key][$table_type.'.cost'] = Number::formatMoneyNoRounding($item->cost, $this->client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $data[$key][$table_type.'.line_total'] = Number::formatMoney($item->line_total, $this->client);
 | 
					            $data[$key][$table_type.'.line_total'] = Number::formatMoney($item->line_total, $this->client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,11 @@ trait NumberFormatter
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    private function formatValue($value, $precision) : string
 | 
					    private function formatValue($value, $precision) : string
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return number_format($this->parseFloat($value), $precision, '.', '');
 | 
					        /* 08-01-2022 allow increased precision means we need to transform from scientific notation to a regular string */
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return number_format($this->parseFloat(rtrim(sprintf('%f', $value),"0")), $precision, '.', '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // return number_format($this->parseFloat($value), $precision, '.', '');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -14,8 +14,8 @@ return [
 | 
				
			|||||||
    'require_https' => env('REQUIRE_HTTPS', true),
 | 
					    'require_https' => env('REQUIRE_HTTPS', true),
 | 
				
			||||||
    'app_url' => rtrim(env('APP_URL', ''), '/'),
 | 
					    'app_url' => rtrim(env('APP_URL', ''), '/'),
 | 
				
			||||||
    'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
 | 
					    'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
 | 
				
			||||||
    'app_version' => '5.3.42',
 | 
					    'app_version' => '5.3.43',
 | 
				
			||||||
    'app_tag' => '5.3.42',
 | 
					    'app_tag' => '5.3.43',
 | 
				
			||||||
    'minimum_client_version' => '5.0.16',
 | 
					    'minimum_client_version' => '5.0.16',
 | 
				
			||||||
    'terms_version' => '1.0.1',
 | 
					    'terms_version' => '1.0.1',
 | 
				
			||||||
    'api_secret' => env('API_SECRET', ''),
 | 
					    'api_secret' => env('API_SECRET', ''),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user