mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-11 21:52:35 +01:00
commit
b820a259c8
@ -1 +1 @@
|
|||||||
5.3.80
|
5.3.81
|
@ -596,7 +596,7 @@ class ClientController extends BaseController
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @OA\Put(
|
* @OA\Post(
|
||||||
* path="/api/v1/clients/{id}/purge",
|
* path="/api/v1/clients/{id}/purge",
|
||||||
* operationId="purgeClient",
|
* operationId="purgeClient",
|
||||||
* tags={"clients"},
|
* tags={"clients"},
|
||||||
|
@ -111,9 +111,6 @@ class SelfUpdateController extends BaseController
|
|||||||
|
|
||||||
copy($this->getDownloadUrl(), storage_path('app/invoiceninja.zip'));
|
copy($this->getDownloadUrl(), storage_path('app/invoiceninja.zip'));
|
||||||
|
|
||||||
// $contents = file_get_contents($this->getDownloadUrl());
|
|
||||||
// Storage::disk('local')->put('invoiceninja.zip', $contents);
|
|
||||||
|
|
||||||
$file = Storage::disk('local')->path('invoiceninja.zip');
|
$file = Storage::disk('local')->path('invoiceninja.zip');
|
||||||
|
|
||||||
$zipFile = new \PhpZip\ZipFile();
|
$zipFile = new \PhpZip\ZipFile();
|
||||||
|
@ -83,11 +83,17 @@ class InvoiceTransformer extends BaseTransformer {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//could be a generate invoices.csv file
|
//could be a generate invoices.csv file
|
||||||
|
|
||||||
|
$calculated_tax_rate = 0;
|
||||||
|
|
||||||
|
if($this->getFloat( $record, 'Invoice Tax Total' ) != 0 && $this->getFloat( $record, 'Invoice Total' ) != 0)
|
||||||
|
$calculated_tax_rate = round($this->getFloat( $record, 'Invoice Tax Total' ) / $this->getFloat( $record, 'Invoice Total' ) * 100,2);
|
||||||
|
|
||||||
$line_items[] = [
|
$line_items[] = [
|
||||||
'notes' => 'Imported Invoice',
|
'notes' => 'Imported Invoice',
|
||||||
'cost' => $this->getFloat( $record, 'Invoice Total' ),
|
'cost' => $this->getFloat( $record, 'Invoice Total' ),
|
||||||
'tax_name1' => 'Tax',
|
'tax_name1' => 'Tax',
|
||||||
'tax_rate1' => round($this->getFloat( $record, 'Invoice Tax Total' ) / $this->getFloat( $record, 'Invoice Total' ) * 100,2),
|
'tax_rate1' => $calculated_tax_rate,
|
||||||
'quantity' => 1,
|
'quantity' => 1,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -82,9 +82,18 @@ class ReminderJob implements ShouldQueue
|
|||||||
|
|
||||||
$invoice->service()->touchPdf();
|
$invoice->service()->touchPdf();
|
||||||
|
|
||||||
|
//20-04-2022 fixes for endless reminders - generic template naming was wrong
|
||||||
|
$enabled_reminder = "enable_".$reminder_template;
|
||||||
|
|
||||||
|
if($reminder_template == 'endless_reminder')
|
||||||
|
$enabled_reminder = 'enable_reminder_endless';
|
||||||
|
|
||||||
//check if this reminder needs to be emailed
|
//check if this reminder needs to be emailed
|
||||||
//15-01-2022 - insert addition if block if send_reminders is definitely set
|
//15-01-2022 - insert addition if block if send_reminders is definitely set
|
||||||
if(in_array($reminder_template, ['reminder1','reminder2','reminder3','reminder_endless']) && $invoice->client->getSetting("enable_".$reminder_template) && $invoice->client->getSetting("send_reminders") && $invoice->company->account->isPaidHostedClient())
|
if(in_array($reminder_template, ['reminder1','reminder2','reminder3','reminder_endless','endless_reminder']) &&
|
||||||
|
$invoice->client->getSetting($enabled_reminder) &&
|
||||||
|
$invoice->client->getSetting("send_reminders") &&
|
||||||
|
(Ninja::isSelfHost() || $invoice->company->account->isPaidHostedClient()))
|
||||||
{
|
{
|
||||||
$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);
|
||||||
|
@ -39,21 +39,21 @@ class CreateInvoicePdf implements ShouldQueue
|
|||||||
if(isset($event->invoice))
|
if(isset($event->invoice))
|
||||||
{
|
{
|
||||||
$event->invoice->invitations->each(function ($invitation) {
|
$event->invoice->invitations->each(function ($invitation) {
|
||||||
CreateEntityPdf::dispatch($invitation);
|
CreateEntityPdf::dispatch($invitation->load("invoice", "contact.client.company"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($event->quote))
|
if(isset($event->quote))
|
||||||
{
|
{
|
||||||
$event->quote->invitations->each(function ($invitation) {
|
$event->quote->invitations->each(function ($invitation) {
|
||||||
CreateEntityPdf::dispatch($invitation);
|
CreateEntityPdf::dispatch($invitation->load("quote", "contact.client.company"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($event->credit))
|
if(isset($event->credit))
|
||||||
{
|
{
|
||||||
$event->credit->invitations->each(function ($invitation) {
|
$event->credit->invitations->each(function ($invitation) {
|
||||||
CreateEntityPdf::dispatch($invitation);
|
CreateEntityPdf::dispatch($invitation->load("credit", "contact.client.company"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -466,6 +466,7 @@ class Invoice extends BaseModel
|
|||||||
{
|
{
|
||||||
$this->invitations->each(function ($invitation) {
|
$this->invitations->each(function ($invitation) {
|
||||||
if (! isset($invitation->sent_date)) {
|
if (! isset($invitation->sent_date)) {
|
||||||
|
$invitation->load('invoice');
|
||||||
$invitation->sent_date = Carbon::now();
|
$invitation->sent_date = Carbon::now();
|
||||||
$invitation->save();
|
$invitation->save();
|
||||||
}
|
}
|
||||||
|
@ -99,6 +99,29 @@ class CreditCard
|
|||||||
|
|
||||||
$response = $this->paytrace->gatewayRequest('/v1/customer/pt_protect_create', $post_data);
|
$response = $this->paytrace->gatewayRequest('/v1/customer/pt_protect_create', $post_data);
|
||||||
|
|
||||||
|
if(!$response->success)
|
||||||
|
{
|
||||||
|
|
||||||
|
$error = 'Error creating customer in gateway';
|
||||||
|
$error_code = isset($response->response_code) ? $response->response_code : 'PT_ERR';
|
||||||
|
|
||||||
|
if(isset($response->errors))
|
||||||
|
{
|
||||||
|
foreach($response->errors as $err)
|
||||||
|
{
|
||||||
|
$error = end($err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'response' => $response,
|
||||||
|
'error' => $error,
|
||||||
|
'error_code' => $error_code,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $this->paytrace->processUnsuccessfulTransaction($data);
|
||||||
|
}
|
||||||
|
|
||||||
$cgt = [];
|
$cgt = [];
|
||||||
$cgt['token'] = $response->customer_id;
|
$cgt['token'] = $response->customer_id;
|
||||||
$cgt['payment_method_id'] = GatewayType::CREDIT_CARD;
|
$cgt['payment_method_id'] = GatewayType::CREDIT_CARD;
|
||||||
@ -124,7 +147,6 @@ class CreditCard
|
|||||||
$profile = $this->paytrace->gatewayRequest('/v1/customer/export', [
|
$profile = $this->paytrace->gatewayRequest('/v1/customer/export', [
|
||||||
'integrator_id' => $this->paytrace->company_gateway->getConfigField('integratorId'),
|
'integrator_id' => $this->paytrace->company_gateway->getConfigField('integratorId'),
|
||||||
'customer_id' => $customer_id,
|
'customer_id' => $customer_id,
|
||||||
// 'include_bin' => true,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $profile->customers[0];
|
return $profile->customers[0];
|
||||||
|
@ -173,6 +173,52 @@ class PaytracePaymentDriver extends BaseDriver
|
|||||||
$this->processUnsuccessfulTransaction($data, false);
|
$this->processUnsuccessfulTransaction($data, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getClientRequiredFields(): array
|
||||||
|
{
|
||||||
|
$fields = [];
|
||||||
|
|
||||||
|
if ($this->company_gateway->require_client_name) {
|
||||||
|
$fields[] = ['name' => 'client_name', 'label' => ctrans('texts.client_name'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->company_gateway->require_contact_name) {
|
||||||
|
$fields[] = ['name' => 'contact_first_name', 'label' => ctrans('texts.first_name'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'contact_last_name', 'label' => ctrans('texts.last_name'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->company_gateway->require_contact_email) {
|
||||||
|
$fields[] = ['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required,email:rfc'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->company_gateway->require_client_phone) {
|
||||||
|
$fields[] = ['name' => 'client_phone', 'label' => ctrans('texts.client_phone'), 'type' => 'tel', 'validation' => 'required'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->company_gateway->require_billing_address) {
|
||||||
|
$fields[] = ['name' => 'client_address_line_1', 'label' => ctrans('texts.address1'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_city', 'label' => ctrans('texts.city'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_state', 'label' => ctrans('texts.state'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_country_id', 'label' => ctrans('texts.country'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->company_gateway->require_postal_code) {
|
||||||
|
$fields[] = ['name' => 'client_postal_code', 'label' => ctrans('texts.postal_code'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->company_gateway->require_shipping_address) {
|
||||||
|
$fields[] = ['name' => 'client_shipping_address_line_1', 'label' => ctrans('texts.shipping_address1'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_shipping_city', 'label' => ctrans('texts.shipping_city'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_shipping_state', 'label' => ctrans('texts.shipping_state'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_shipping_postal_code', 'label' => ctrans('texts.shipping_postal_code'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
$fields[] = ['name' => 'client_shipping_country_id', 'label' => ctrans('texts.shipping_country'), 'type' => 'text', 'validation' => 'required'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return $fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null)
|
public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -191,7 +191,7 @@ class WePayPaymentDriver extends BaseDriver
|
|||||||
if ($objectType == 'credit_card') {
|
if ($objectType == 'credit_card') {
|
||||||
$payment_method = ClientGatewayToken::where('token', $objectId)->first();
|
$payment_method = ClientGatewayToken::where('token', $objectId)->first();
|
||||||
|
|
||||||
if (! $paymentMethod)
|
if (! $payment_method)
|
||||||
throw new \Exception('Unknown payment method');
|
throw new \Exception('Unknown payment method');
|
||||||
|
|
||||||
$source = $this->wepay->request('credit_card', array(
|
$source = $this->wepay->request('credit_card', array(
|
||||||
|
@ -70,7 +70,6 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
|
|
||||||
app()->instance(TruthSource::class, new TruthSource());
|
app()->instance(TruthSource::class, new TruthSource());
|
||||||
|
|
||||||
|
|
||||||
// Model::preventLazyLoading(
|
// Model::preventLazyLoading(
|
||||||
// !$this->app->isProduction()
|
// !$this->app->isProduction()
|
||||||
// );
|
// );
|
||||||
|
@ -110,12 +110,20 @@ class ActivityRepository extends BaseRepository
|
|||||||
private function generateHtml($entity)
|
private function generateHtml($entity)
|
||||||
{
|
{
|
||||||
$entity_design_id = '';
|
$entity_design_id = '';
|
||||||
|
$entity_type = '';
|
||||||
|
|
||||||
if ($entity instanceof Invoice || $entity instanceof RecurringInvoice) {
|
if ($entity instanceof Invoice ) {
|
||||||
|
$entity_type = 'invoice';
|
||||||
$entity_design_id = 'invoice_design_id';
|
$entity_design_id = 'invoice_design_id';
|
||||||
} elseif ($entity instanceof Quote) {
|
} elseif ($entity instanceof RecurringInvoice){
|
||||||
|
$entity_type = 'recurring_invoice';
|
||||||
|
$entity_design_id = 'invoice_design_id';
|
||||||
|
}
|
||||||
|
elseif ($entity instanceof Quote) {
|
||||||
|
$entity_type = 'quote';
|
||||||
$entity_design_id = 'quote_design_id';
|
$entity_design_id = 'quote_design_id';
|
||||||
} elseif ($entity instanceof Credit) {
|
} elseif ($entity instanceof Credit) {
|
||||||
|
$entity_type = 'credit';
|
||||||
$entity_design_id = 'credit_design_id';
|
$entity_design_id = 'credit_design_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +140,7 @@ class ActivityRepository extends BaseRepository
|
|||||||
|
|
||||||
$entity->load('client.company', 'invitations');
|
$entity->load('client.company', 'invitations');
|
||||||
|
|
||||||
$html = new HtmlEngine($entity->invitations->first());
|
$html = new HtmlEngine($entity->invitations->first()->load($entity_type, "contact"));
|
||||||
|
|
||||||
if ($design->is_custom) {
|
if ($design->is_custom) {
|
||||||
$options = [
|
$options = [
|
||||||
|
@ -242,7 +242,7 @@ class InvoiceService
|
|||||||
|
|
||||||
public function triggeredActions($request)
|
public function triggeredActions($request)
|
||||||
{
|
{
|
||||||
$this->invoice = (new TriggeredActions($this->invoice, $request))->run();
|
$this->invoice = (new TriggeredActions($this->invoice->load('invitations'), $request))->run();
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ class QuoteService
|
|||||||
|
|
||||||
public function triggeredActions($request)
|
public function triggeredActions($request)
|
||||||
{
|
{
|
||||||
$this->quote = (new TriggeredActions($this->quote, $request))->run();
|
$this->quote = (new TriggeredActions($this->quote->load('invitations'), $request))->run();
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ class HtmlEngine
|
|||||||
|
|
||||||
$this->company = $invitation->company;
|
$this->company = $invitation->company;
|
||||||
|
|
||||||
$this->contact = $invitation->contact;
|
$this->contact = $invitation->contact->load('client');
|
||||||
|
|
||||||
$this->client = $this->contact->client->load('company','country');
|
$this->client = $this->contact->client->load('company','country');
|
||||||
|
|
||||||
|
@ -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.80',
|
'app_version' => '5.3.81',
|
||||||
'app_tag' => '5.3.80',
|
'app_tag' => '5.3.81',
|
||||||
'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', ''),
|
||||||
|
273633
public/main.next.dart.js
vendored
273633
public/main.next.dart.js
vendored
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user